@blurrow/ui 0.1.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 (272) hide show
  1. package/README.md +60 -20
  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 +1644 -0
  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 +140 -0
  199. package/dist/registry/Alert.tsx +95 -0
  200. package/dist/registry/AuthorCard.tsx +67 -0
  201. package/dist/registry/Avatar.tsx +116 -0
  202. package/dist/registry/Badge.tsx +55 -0
  203. package/dist/registry/Banner.tsx +86 -0
  204. package/dist/registry/Breadcrumb.tsx +60 -0
  205. package/dist/registry/Button.tsx +361 -0
  206. package/dist/registry/ButtonGroup.tsx +82 -0
  207. package/dist/registry/Card.tsx +241 -0
  208. package/dist/registry/CardShell.tsx +78 -0
  209. package/dist/registry/Carousel.tsx +296 -0
  210. package/dist/registry/Checkbox.tsx +104 -0
  211. package/dist/registry/CloseButton.tsx +68 -0
  212. package/dist/registry/CodeBlock.tsx +202 -0
  213. package/dist/registry/ColorPicker.tsx +404 -0
  214. package/dist/registry/Combobox.tsx +318 -0
  215. package/dist/registry/CommandPalette.tsx +356 -0
  216. package/dist/registry/ContextMenu.tsx +241 -0
  217. package/dist/registry/DataList.tsx +49 -0
  218. package/dist/registry/DatePicker.tsx +494 -0
  219. package/dist/registry/DateRangePicker.tsx +232 -0
  220. package/dist/registry/Drawer.tsx +166 -0
  221. package/dist/registry/DropdownMenu.tsx +219 -0
  222. package/dist/registry/EmptyState.tsx +55 -0
  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 +108 -0
  228. package/dist/registry/Kbd.tsx +23 -0
  229. package/dist/registry/Modal.tsx +130 -0
  230. package/dist/registry/NumberInput.tsx +183 -0
  231. package/dist/registry/OtpInput.tsx +219 -0
  232. package/dist/registry/Pagination.tsx +160 -0
  233. package/dist/registry/Popover.tsx +116 -0
  234. package/dist/registry/Progress.tsx +66 -0
  235. package/dist/registry/QuoteCard.tsx +93 -0
  236. package/dist/registry/Radio.tsx +205 -0
  237. package/dist/registry/RadioCards.tsx +247 -0
  238. package/dist/registry/ReactionBar.tsx +101 -0
  239. package/dist/registry/ReadingProgress.tsx +51 -0
  240. package/dist/registry/ReadingTime.tsx +35 -0
  241. package/dist/registry/Select.tsx +265 -0
  242. package/dist/registry/Separator.tsx +52 -0
  243. package/dist/registry/ShareButtons.tsx +134 -0
  244. package/dist/registry/Sidebar.tsx +182 -0
  245. package/dist/registry/Skeleton.tsx +83 -0
  246. package/dist/registry/Slider.tsx +229 -0
  247. package/dist/registry/Spinner.tsx +32 -0
  248. package/dist/registry/SpotlightCard.tsx +106 -0
  249. package/dist/registry/Stat.tsx +82 -0
  250. package/dist/registry/StatCard.tsx +256 -0
  251. package/dist/registry/Steps.tsx +109 -0
  252. package/dist/registry/Table.tsx +123 -0
  253. package/dist/registry/TableOfContents.tsx +116 -0
  254. package/dist/registry/Tabs.tsx +136 -0
  255. package/dist/registry/TagInput.tsx +191 -0
  256. package/dist/registry/Textarea.tsx +84 -0
  257. package/dist/registry/TimePicker.tsx +315 -0
  258. package/dist/registry/Timeline.tsx +102 -0
  259. package/dist/registry/Toast.tsx +388 -0
  260. package/dist/registry/Toggle.tsx +96 -0
  261. package/dist/registry/Tooltip.tsx +160 -0
  262. package/dist/registry/styles.css +1207 -0
  263. package/dist/registry/useFloatingPanel.ts +112 -0
  264. package/dist/registry/useModalBehavior.ts +77 -0
  265. package/dist/styles.css +868 -62
  266. package/dist/useFloatingPanel.d.ts +24 -0
  267. package/dist/useFloatingPanel.js +89 -0
  268. package/dist/useFloatingPanel.js.map +1 -0
  269. package/dist/useModalBehavior.d.ts +15 -0
  270. package/dist/useModalBehavior.js +57 -0
  271. package/dist/useModalBehavior.js.map +1 -0
  272. package/package.json +23 -6
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/ui/Accordion.tsx","../../../components/ui/CloseButton.tsx","../../../components/ui/Alert.tsx","../../../components/ui/Avatar.tsx","../../../components/ui/Button.tsx","../../../components/ui/AuthorCard.tsx","../../../components/ui/Badge.tsx","../../../components/ui/Banner.tsx","../../../components/ui/Breadcrumb.tsx","../../../components/ui/ButtonGroup.tsx","../../../components/ui/CardShell.tsx","../../../components/ui/Card.tsx","../../../components/ui/Carousel.tsx","../../../components/ui/Checkbox.tsx","../../../components/ui/CodeBlock.tsx","../../../components/ui/CommandPalette.tsx","../../../components/ui/Kbd.tsx","../../../components/ui/useModalBehavior.ts","../../../components/ui/DataList.tsx","../../../components/ui/Drawer.tsx","../../../components/ui/DropdownMenu.tsx","../../../components/ui/EmptyState.tsx","../../../components/ui/Input.tsx","../../../components/ui/Modal.tsx","../../../components/ui/Pagination.tsx","../../../components/ui/Popover.tsx","../../../components/ui/Progress.tsx","../../../components/ui/QuoteCard.tsx","../../../components/ui/Radio.tsx","../../../components/ui/ReactionBar.tsx","../../../components/ui/ReadingProgress.tsx","../../../components/ui/ReadingTime.tsx","../../../components/ui/Select.tsx","../../../components/ui/ShareButtons.tsx","../../../components/ui/Sidebar.tsx","../../../components/ui/Skeleton.tsx","../../../components/ui/SpotlightCard.tsx","../../../components/ui/Stat.tsx","../../../components/ui/StatCard.tsx","../../../components/ui/Steps.tsx","../../../components/ui/Table.tsx","../../../components/ui/TableOfContents.tsx","../../../components/ui/Tabs.tsx","../../../components/ui/TagInput.tsx","../../../components/ui/Textarea.tsx","../../../components/ui/Timeline.tsx","../../../components/ui/Toast.tsx","../../../components/ui/Toggle.tsx","../../../components/ui/Tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useId, ReactNode } from \"react\";\n\ninterface AccordionItem {\n key: string;\n title: string;\n content: ReactNode;\n defaultOpen?: boolean;\n}\n\ninterface AccordionProps {\n items: AccordionItem[];\n allowMultiple?: boolean;\n className?: string;\n}\n\nexport function Accordion({ items, allowMultiple = false, className }: AccordionProps) {\n const [openKeys, setOpenKeys] = useState<Set<string>>(() => {\n const defaults = new Set<string>();\n for (const item of items) {\n if (item.defaultOpen) {\n defaults.add(item.key);\n }\n }\n return defaults;\n });\n\n const toggle = useCallback(\n (key: string) => {\n setOpenKeys((prev) => {\n const next = new Set(prev);\n if (next.has(key)) {\n next.delete(key);\n } else {\n if (allowMultiple) {\n next.add(key);\n } else {\n next.clear();\n next.add(key);\n }\n }\n return next;\n });\n },\n [allowMultiple]\n );\n const uid = useId();\n\n return (\n <div\n className={[\"rounded-[18px] p-1.5\", className].filter(Boolean).join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <div\n className=\"bg-white rounded-[13px] overflow-hidden p-1\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n {items.map((item, index) => {\n const isOpen = openKeys.has(item.key);\n const isLast = index === items.length - 1;\n const headerId = `${uid}-${item.key}-header`;\n const panelId = `${uid}-${item.key}-panel`;\n\n return (\n <div\n key={item.key}\n className={[\n \"relative\",\n // Hairline between rows, inset so it doesn't touch the rounded corners\n !isLast &&\n \"after:absolute after:left-3 after:right-3 after:bottom-0 after:h-px after:bg-neutral-100\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <h3>\n <button\n type=\"button\"\n id={headerId}\n aria-expanded={isOpen}\n aria-controls={panelId}\n onClick={() => toggle(item.key)}\n className={[\n \"group/acc w-full flex items-center justify-between gap-3 py-3 px-3 text-left text-[13.5px] font-medium cursor-pointer rounded-[10px]\",\n \"transition-colors duration-150\",\n isOpen ? \"text-neutral-900\" : \"text-neutral-700 hover:text-neutral-900 hover:bg-neutral-50\",\n ].join(\" \")}\n >\n <span>{item.title}</span>\n {/* Plus that turns into a minus: says \"more inside\", not \"navigate\" */}\n <span\n aria-hidden\n className=\"relative shrink-0 w-6 h-6 rounded-[7px] flex items-center justify-center text-neutral-500 group-hover/acc:text-neutral-900 transition-colors\"\n style={{ background: \"var(--face-light)\", boxShadow: \"var(--face-light-shadow)\" }}\n >\n <span className=\"absolute w-2.5 h-[1.5px] rounded-full bg-current\" />\n <span\n className=\"absolute w-2.5 h-[1.5px] rounded-full bg-current\"\n style={{\n transform: isOpen ? \"rotate(0deg)\" : \"rotate(90deg)\",\n transition: \"transform 300ms var(--ease-spring)\",\n }}\n />\n </span>\n </button>\n </h3>\n\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={headerId}\n // Closed panels are removed from the tab order and the a11y tree\n inert={!isOpen}\n style={{\n display: \"grid\",\n gridTemplateRows: isOpen ? \"1fr\" : \"0fr\",\n transition: \"grid-template-rows 320ms var(--ease-out-soft)\",\n }}\n >\n <div className=\"overflow-hidden\">\n <div\n className=\"px-3 pb-4 pt-0.5 text-[13px] text-neutral-600 leading-relaxed\"\n style={{\n opacity: isOpen ? 1 : 0,\n transform: isOpen ? \"translateY(0)\" : \"translateY(-4px)\",\n transition: \"opacity 240ms ease-out, transform 320ms var(--ease-out-soft)\",\n }}\n >\n {item.content}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\ninterface CloseButtonProps {\n onClick?: () => void;\n label?: string;\n size?: \"sm\" | \"md\";\n tone?: \"light\" | \"dark\";\n className?: string;\n}\n\nconst sizes = {\n sm: { box: \"w-6 h-6 rounded-[7px]\", icon: 9 },\n md: { box: \"w-7 h-7 rounded-[8px]\", icon: 10 },\n};\n\n/* Quiet until hovered, then it rises into a raised face like every other\n pressable thing — so it reads as a control, not decoration. */\nexport function CloseButton({\n onClick,\n label = \"Close\",\n size = \"md\",\n tone = \"light\",\n className = \"\",\n}: CloseButtonProps) {\n const dark = tone === \"dark\";\n const s = sizes[size];\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n className={[\n \"group/close relative shrink-0 flex items-center justify-center cursor-pointer\",\n \"transition-[color,background,scale] duration-150 active:scale-95\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2\",\n dark\n ? \"text-white/45 hover:text-white focus-visible:outline-white\"\n : \"text-neutral-400 hover:text-neutral-900 focus-visible:outline-neutral-900\",\n s.box,\n className,\n ].join(\" \")}\n >\n <span\n aria-hidden\n className={[\n \"absolute inset-0 rounded-[inherit] opacity-0 group-hover/close:opacity-100 transition-opacity duration-150\",\n dark\n ? \"[background:var(--tile-dark)] [box-shadow:var(--tile-dark-shadow)]\"\n : \"[background:var(--face-light)] [box-shadow:var(--face-light-shadow)]\",\n ].join(\" \")}\n />\n <svg\n className=\"relative\"\n width={s.icon}\n height={s.icon}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n );\n}\n","import React from \"react\";\nimport { CloseButton } from \"./CloseButton\";\n\ntype AlertVariant = \"default\" | \"success\" | \"warning\" | \"error\";\n\ninterface AlertProps {\n variant?: AlertVariant;\n title: string;\n description?: string;\n onDismiss?: () => void;\n className?: string;\n}\n\n/* Tiles share Toast's lit-from-above gradients, so an alert and the toast\n it came from look like the same object. */\nconst variantConfig: Record<AlertVariant, {\n tile: string;\n icon: React.ReactNode;\n}> = {\n default: {\n tile: \"var(--face-dark)\",\n icon: (\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"M12 8v4m0 4h.01\" />\n </svg>\n ),\n },\n success: {\n tile: \"linear-gradient(180deg, #10b981 0%, #059669 100%)\",\n icon: (\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ),\n },\n warning: {\n tile: \"linear-gradient(180deg, #fbbf24 0%, #f59e0b 100%)\",\n icon: (\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v4m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\n </svg>\n ),\n },\n error: {\n tile: \"linear-gradient(180deg, #f87171 0%, #dc2626 100%)\",\n icon: (\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ),\n },\n};\n\nexport function Alert({ variant = \"default\", title, description, onDismiss, className = \"\" }: AlertProps) {\n const { tile, icon } = variantConfig[variant];\n\n return (\n <div\n // Errors and warnings interrupt; everything else waits its turn\n role={variant === \"error\" || variant === \"warning\" ? \"alert\" : \"status\"}\n className={[\"rounded-[18px] p-1.5\", className].join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <div\n className=\"bg-white rounded-[13px] pl-3 pr-2 py-3 flex items-start gap-3\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n <div\n aria-hidden\n className=\"shrink-0 w-7 h-7 rounded-[8px] flex items-center justify-center text-white\"\n style={{\n background: tile,\n boxShadow:\n \"0 0 3px rgba(0,0,0,0.212), 0 1px 2px rgba(0,0,0,0.15), inset 0 2px 3px -2px rgba(255,255,255,0.188)\",\n }}\n >\n {icon}\n </div>\n\n <div className=\"flex-1 min-w-0 pt-[5px]\">\n <p className=\"text-[13px] font-semibold text-neutral-900 leading-tight tracking-[-0.01em]\">{title}</p>\n {description && (\n <p className=\"text-[12.5px] text-neutral-500 mt-1 leading-relaxed\">{description}</p>\n )}\n </div>\n\n {onDismiss && <CloseButton size=\"sm\" label=\"Dismiss\" onClick={onDismiss} />}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\ntype AvatarSize = \"sm\" | \"md\" | \"lg\";\n\ninterface AvatarProps {\n src?: string;\n alt?: string;\n name?: string;\n size?: AvatarSize;\n className?: string;\n}\n\nconst sizeStyles: Record<AvatarSize, string> = {\n sm: \"w-7 h-7 text-[10px]\",\n md: \"w-9 h-9 text-[12px]\",\n lg: \"w-12 h-12 text-[14px]\",\n};\n\nfunction getInitials(name: string): string {\n return name\n .split(\" \")\n .map((w) => w[0])\n .slice(0, 2)\n .join(\"\")\n .toLowerCase();\n}\n\nexport function Avatar({\n src,\n alt = \"\",\n name,\n size = \"md\",\n className = \"\",\n}: AvatarProps) {\n const initials = name ? getInitials(name) : \"?\";\n\n return (\n <div\n className={[\n \"relative shrink-0 rounded-full overflow-hidden flex items-center justify-center font-semibold text-neutral-600 select-none\",\n sizeStyles[size],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ background: \"var(--face-light)\" }}\n >\n {src ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={src} alt={alt || name || \"\"} loading=\"lazy\" className=\"w-full h-full object-cover\" />\n ) : (\n <span role=\"img\" aria-label={name ?? \"Unknown\"}>{initials}</span>\n )}\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-0 rounded-full\"\n style={{\n boxShadow: \"inset 0 2px 3px -2px rgba(255,255,255,0.45), inset 0 0 2px rgba(17,17,17,0.12), inset 0 -2px 3px -2px rgba(17,17,17,0.04)\",\n }}\n />\n </div>\n );\n}\n\ninterface AvatarGroupProps {\n children: React.ReactNode;\n max?: number;\n size?: AvatarSize;\n className?: string;\n}\n\nconst overlapStyles: Record<AvatarSize, string> = {\n sm: \"-ml-2\",\n md: \"-ml-2.5\",\n lg: \"-ml-3\",\n};\n\nexport function AvatarGroup({\n children,\n max = 5,\n size = \"md\",\n className = \"\",\n}: AvatarGroupProps) {\n const items = React.Children.toArray(children);\n const visible = items.slice(0, max);\n const overflow = items.length - max;\n\n return (\n <div className={[\"flex items-center\", className].join(\" \")}>\n {visible.map((child, i) => (\n <div\n key={i}\n className={[\n \"ring-2 ring-white rounded-full\",\n i > 0 ? overlapStyles[size] : \"\",\n ].join(\" \")}\n >\n {child}\n </div>\n ))}\n {overflow > 0 && (\n <div\n className={[\n \"ring-2 ring-white rounded-full flex items-center justify-center font-semibold text-neutral-600 select-none\",\n overlapStyles[size],\n sizeStyles[size],\n ].join(\" \")}\n style={{ background: \"var(--well)\", boxShadow: \"var(--well-shadow)\" }}\n aria-label={`${overflow} more`}\n >\n +{overflow}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useCallback } from \"react\";\n\ntype ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"outline\";\ntype ButtonSize = \"sm\" | \"md\" | \"lg\" | \"icon\";\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n children: React.ReactNode;\n fullWidth?: boolean;\n /** Surface the button sits on. On dark cards, secondary/outline switch to a\n dark face so they don't glare against the card. */\n tone?: \"light\" | \"dark\";\n /** Equal width and height, for icon-only layered buttons. */\n square?: boolean;\n}\n\n/* Layered buttons are a raised face seated in a machined bezel. The bezel\n never moves; the face lifts on hover and sinks flush when pressed. */\nconst shellConfig: Record<\n string,\n {\n bezel: string;\n bezelShadow: string;\n face: string;\n faceShadow: string;\n faceHoverShadow: string;\n facePressedShadow: string;\n text: string;\n textShadow: string;\n fill: string;\n }\n> = {\n primary: {\n bezel: \"var(--bezel-dark)\",\n bezelShadow: \"var(--bezel-dark-shadow)\",\n face: \"var(--face-dark)\",\n faceShadow: \"var(--face-dark-shadow)\",\n faceHoverShadow:\n \"0 0 3px rgba(0,0,0,0.35), 0 2px 3px rgba(0,0,0,0.45), 0 4px 8px -2px rgba(0,0,0,0.35), inset 0 2px 3px -2px rgba(255,255,255,0.135), inset 0 -2px 3px -2px rgba(0,0,0,0.25)\",\n facePressedShadow: \"var(--face-dark-pressed)\",\n text: \"text-white\",\n textShadow: \"0 -1px 0 rgba(0,0,0,0.45)\",\n fill: \"bg-white/[0.05]\",\n },\n secondary: {\n bezel: \"var(--bezel-light)\",\n bezelShadow: \"var(--bezel-light-shadow)\",\n face: \"var(--face-light)\",\n faceShadow: \"var(--face-light-shadow)\",\n faceHoverShadow:\n \"0 0 3px rgba(17,17,17,0.136), 0 2px 3px rgba(17,17,17,0.1), 0 4px 8px -2px rgba(17,17,17,0.08), inset 0 2px 3px -2px rgba(255,255,255,1), inset 0 -2px 3px -2px rgba(17,17,17,0.035)\",\n facePressedShadow: \"var(--face-light-pressed)\",\n text: \"text-neutral-800\",\n textShadow: \"0 1px 0 rgba(255,255,255,0.9)\",\n fill: \"bg-neutral-900/[0.025]\",\n },\n outline: {\n bezel: \"linear-gradient(180deg, rgba(255,255,255,0.5) 0%, rgba(17,17,17,0.04) 100%)\",\n bezelShadow:\n \"0 0 0 0.5px rgba(17,17,17,0.048), inset 0 2px 3px -2px rgba(255,255,255,0.45)\",\n face: \"var(--face-light)\",\n faceShadow:\n \"0 0 3px rgba(17,17,17,0.102), 0 1px 1px rgba(17,17,17,0.06), inset 0 2px 3px -2px rgba(255,255,255,1)\",\n faceHoverShadow:\n \"0 0 3px rgba(17,17,17,0.136), 0 1px 2px rgba(17,17,17,0.08), 0 3px 6px -2px rgba(17,17,17,0.06), inset 0 2px 3px -2px rgba(255,255,255,1)\",\n facePressedShadow: \"var(--face-light-pressed)\",\n text: \"text-neutral-700\",\n textShadow: \"0 1px 0 rgba(255,255,255,0.9)\",\n fill: \"bg-neutral-900/[0.025]\",\n },\n};\n\n/* Secondary on a dark surface: a raised face a few steps lighter than the\n card — present, but in the same family of tones. */\nconst darkSecondary = {\n bezel: \"linear-gradient(180deg, #2a2a2a 0%, #161616 100%)\",\n bezelShadow:\n \"0 0 0 0.5px rgba(0,0,0,0.3), 0 1px 2px rgba(0,0,0,0.35), inset 0 2px 3px -2px rgba(255,255,255,0.053)\",\n face: \"linear-gradient(180deg, #353535 0%, #2a2a2a 55%, #242424 100%)\",\n faceShadow:\n \"0 0 3px rgba(0,0,0,0.35), 0 1px 1.5px rgba(0,0,0,0.4), inset 0 2px 3px -2px rgba(255,255,255,0.09), inset 0 -2px 3px -2px rgba(0,0,0,0.2)\",\n faceHoverShadow:\n \"0 0 3px rgba(0,0,0,0.35), 0 2px 3px rgba(0,0,0,0.45), 0 4px 8px -2px rgba(0,0,0,0.35), inset 0 2px 3px -2px rgba(255,255,255,0.12), inset 0 -2px 3px -2px rgba(0,0,0,0.2)\",\n facePressedShadow: \"var(--face-dark-pressed)\",\n text: \"text-neutral-100\",\n textShadow: \"0 -1px 0 rgba(0,0,0,0.4)\",\n fill: \"bg-white/[0.04]\",\n};\n\n/* Flat buttons (ghost, icon) are a single face without a bezel. */\nconst flatConfig: Record<\n ButtonVariant,\n {\n bg: string;\n background?: string;\n fill: string;\n shadow: string;\n hoverShadow: string;\n pressedShadow: string;\n }\n> = {\n primary: {\n bg: \"text-white\",\n background: \"var(--face-dark)\",\n fill: \"bg-white/[0.08]\",\n shadow: \"var(--face-dark-shadow)\",\n hoverShadow:\n \"0 0 3px rgba(0,0,0,0.35), 0 2px 4px rgba(0,0,0,0.4), 0 6px 14px -4px rgba(0,0,0,0.35), inset 0 2px 3px -2px rgba(255,255,255,0.135)\",\n pressedShadow: \"var(--face-dark-pressed)\",\n },\n secondary: {\n bg: \"text-neutral-800\",\n background: \"var(--face-light)\",\n fill: \"bg-neutral-900/[0.035]\",\n shadow: \"var(--face-light-shadow)\",\n hoverShadow:\n \"0 0 3px rgba(17,17,17,0.136), 0 2px 4px rgba(17,17,17,0.08), 0 6px 14px -4px rgba(17,17,17,0.1), inset 0 2px 3px -2px rgba(255,255,255,1)\",\n pressedShadow: \"var(--face-light-pressed)\",\n },\n ghost: {\n bg: \"bg-transparent text-neutral-500 hover:text-neutral-800\",\n fill: \"bg-neutral-900/[0.05]\",\n shadow: \"none\",\n hoverShadow: \"inset 0 0 2px rgba(17,17,17,0.09)\",\n pressedShadow: \"inset 0 1px 2px rgba(17,17,17,0.08)\",\n },\n outline: {\n bg: \"bg-transparent text-neutral-700\",\n fill: \"bg-neutral-900/[0.035]\",\n shadow: \"inset 0 0 2px rgba(17,17,17,0.15)\",\n hoverShadow:\n \"inset 0 0 2px rgba(17,17,17,0.24), 0 1px 2px rgba(17,17,17,0.05)\",\n pressedShadow:\n \"inset 0 0 2px rgba(17,17,17,0.24), inset 0 1px 2px rgba(17,17,17,0.06)\",\n },\n};\n\n/* Bezel radius minus bezel padding = face radius, so the curves stay concentric. */\nconst shellRadius: Record<ButtonSize, string> = {\n sm: \"rounded-[12px] p-[3px]\",\n md: \"rounded-[13px] p-[3px]\",\n lg: \"rounded-[15px] p-[3.5px]\",\n icon: \"\",\n};\n\nconst faceRadius: Record<ButtonSize, string> = {\n sm: \"rounded-[9px]\",\n md: \"rounded-[10px]\",\n lg: \"rounded-[11.5px]\",\n icon: \"\",\n};\n\nconst innerPadding: Record<ButtonSize, string> = {\n sm: \"px-4 py-2 text-[13px]\",\n md: \"px-5 py-2.5 text-sm\",\n lg: \"px-7 py-3 text-[15px]\",\n icon: \"w-7 h-7 p-0 text-[13px]\",\n};\n\nconst squarePadding: Record<ButtonSize, string> = {\n sm: \"w-9 h-9 p-0 text-[13px]\",\n md: \"w-10 h-10 p-0 text-sm\",\n lg: \"w-12 h-12 p-0 text-[15px]\",\n icon: \"\",\n};\n\nconst flatSizeStyles: Record<ButtonSize, string> = {\n sm: \"px-4 py-2.5 text-[13px] rounded-[10px]\",\n md: \"px-5 py-3 text-sm rounded-[10px]\",\n lg: \"px-7 py-3.5 text-[15px] rounded-xl\",\n icon: \"w-8 h-8 p-0 rounded-[10px] text-[13px]\",\n};\n\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n fullWidth = false,\n tone = \"light\",\n square = false,\n className = \"\",\n children,\n disabled,\n onClick,\n onPointerDown,\n onPointerUp,\n onPointerLeave,\n onPointerCancel,\n onPointerEnter,\n style,\n ...rest\n}: ButtonProps) {\n const [pressed, setPressed] = useState(false);\n const [hovered, setHovered] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /* The press state is the button's own; handlers passed in run alongside\n it rather than replacing it */\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLButtonElement>) => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setPressed(true);\n onPointerDown?.(e);\n },\n [onPointerDown],\n );\n\n const handlePointerUp = useCallback(\n (e: React.PointerEvent<HTMLButtonElement>) => {\n timerRef.current = setTimeout(() => setPressed(false), 150);\n onPointerUp?.(e);\n },\n [onPointerUp],\n );\n\n const handlePointerCancel = useCallback(\n (e: React.PointerEvent<HTMLButtonElement>) => {\n timerRef.current = setTimeout(() => setPressed(false), 150);\n onPointerCancel?.(e);\n },\n [onPointerCancel],\n );\n\n const handlePointerLeave = useCallback(\n (e: React.PointerEvent<HTMLButtonElement>) => {\n setHovered(false);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setPressed(false), 150);\n onPointerLeave?.(e);\n },\n [onPointerLeave],\n );\n\n const layered = variant !== \"ghost\" && size !== \"icon\";\n\n const handlers = {\n onClick,\n onPointerDown: handlePointerDown,\n onPointerUp: handlePointerUp,\n onPointerLeave: handlePointerLeave,\n onPointerCancel: handlePointerCancel,\n onPointerEnter: (e: React.PointerEvent<HTMLButtonElement>) => {\n setHovered(true);\n onPointerEnter?.(e);\n },\n };\n\n if (layered) {\n const cfg =\n tone === \"dark\" && (variant === \"secondary\" || variant === \"outline\")\n ? darkSecondary\n : shellConfig[variant];\n const faceShadow = pressed\n ? cfg.facePressedShadow\n : hovered\n ? cfg.faceHoverShadow\n : cfg.faceShadow;\n\n return (\n <button\n data-btn\n className={[\n \"group/btn relative inline-flex cursor-pointer select-none whitespace-nowrap\",\n shellRadius[size],\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-neutral-900\",\n \"disabled:opacity-40 disabled:pointer-events-none\",\n fullWidth ? \"w-full\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n background: cfg.bezel,\n boxShadow: cfg.bezelShadow,\n ...style,\n }}\n disabled={disabled}\n {...handlers}\n {...rest}\n >\n <span\n className={[\n \"btn-face relative overflow-hidden flex items-center justify-center gap-1.5 font-medium\",\n faceRadius[size],\n cfg.text,\n square ? squarePadding[size] : [\"w-full\", innerPadding[size]].join(\" \"),\n ].join(\" \")}\n style={{\n background: cfg.face,\n boxShadow: faceShadow,\n textShadow: cfg.textShadow,\n transform: pressed\n ? \"translateY(0.5px) scale(0.985)\"\n : hovered\n ? \"translateY(-0.5px)\"\n : \"none\",\n transition:\n \"transform 240ms var(--ease-spring), box-shadow 200ms ease-out\",\n }}\n >\n <span\n aria-hidden=\"true\"\n className={[\n \"pointer-events-none absolute inset-0 origin-bottom transition-transform duration-300 ease-out\",\n pressed\n ? \"scale-y-100\"\n : \"scale-y-0 group-hover/btn:scale-y-100\",\n cfg.fill,\n ].join(\" \")}\n />\n <span className=\"btn-icon-nudge relative z-10 inline-flex items-center gap-1.5\">\n {children}\n </span>\n </span>\n </button>\n );\n }\n\n const cfg = flatConfig[variant];\n const currentShadow = pressed\n ? cfg.pressedShadow\n : hovered\n ? cfg.hoverShadow\n : cfg.shadow;\n\n return (\n <button\n data-btn\n className={[\n \"btn-face group/btn relative overflow-hidden inline-flex items-center justify-center gap-1.5 font-medium cursor-pointer select-none whitespace-nowrap\",\n \"transition-colors duration-200 ease-out\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-neutral-900\",\n \"disabled:opacity-40 disabled:pointer-events-none\",\n cfg.bg,\n flatSizeStyles[size],\n fullWidth ? \"w-full\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n background: cfg.background,\n boxShadow: currentShadow,\n transform: pressed\n ? \"translateY(0.5px) scale(0.97)\"\n : hovered && cfg.background\n ? \"translateY(-0.5px)\"\n : \"none\",\n transition:\n \"transform 240ms var(--ease-spring), box-shadow 200ms ease-out, color 200ms ease-out\",\n ...style,\n }}\n disabled={disabled}\n {...handlers}\n {...rest}\n >\n <span\n aria-hidden=\"true\"\n className={[\n \"pointer-events-none absolute inset-0 origin-bottom transition-transform duration-300 ease-out\",\n pressed ? \"scale-y-100\" : \"scale-y-0 group-hover/btn:scale-y-100\",\n cfg.fill,\n ].join(\" \")}\n />\n <span className=\"relative z-10 inline-flex items-center gap-1.5\">\n {children}\n </span>\n </button>\n );\n}\n","import React from \"react\";\nimport { Avatar } from \"./Avatar\";\nimport { Button } from \"./Button\";\n\ninterface AuthorCardProps {\n name: string;\n bio?: string;\n avatarSrc?: string;\n onFollow?: () => void;\n className?: string;\n}\n\nexport function AuthorCard({\n name,\n bio,\n avatarSrc,\n onFollow,\n className = \"\",\n}: AuthorCardProps) {\n return (\n <div\n className={[\n \"rim relative rounded-[22px] p-1.5\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--card-light-shadow)\" }}\n >\n <div className=\"relative bg-white rounded-[17px] overflow-hidden\" style={{ boxShadow: \"var(--panel-face-shadow)\" }}>\n {/* Cover: a sunken well, so the avatar visibly sits on top of it */}\n <div\n aria-hidden\n className=\"h-20 relative overflow-hidden\"\n style={{\n background:\n \"radial-gradient(130% 90% at 25% 0%, rgba(255,255,255,0.7), transparent 60%), linear-gradient(180deg, #ececeb 0%, #f4f4f3 100%)\",\n boxShadow: \"inset 0 1px 3px rgba(17,17,17,0.06), inset 0 -2px 3px -2px rgba(17,17,17,0.05)\",\n }}\n />\n <div className=\"px-6 pb-6\">\n <div className=\"-mt-8 mb-4\">\n <Avatar\n src={avatarSrc}\n name={name}\n size=\"lg\"\n className=\"ring-[3.5px] ring-white shadow-[0_3px_12px_-2px_rgba(0,0,0,0.15),0_0_0_1px_rgba(0,0,0,0.05)]\"\n />\n </div>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[15px] font-semibold text-neutral-900 leading-snug truncate tracking-[-0.01em]\">{name}</p>\n {bio && (\n <p className=\"text-[13px] text-neutral-500 leading-relaxed mt-1 line-clamp-2\">{bio}</p>\n )}\n </div>\n {onFollow && (\n <Button variant=\"primary\" size=\"sm\" onClick={onFollow} className=\"shrink-0\">\n follow\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\ntype BadgeVariant = \"default\" | \"muted\" | \"accent\";\n\ninterface BadgeProps {\n variant?: BadgeVariant;\n children: React.ReactNode;\n className?: string;\n}\n\nconst variantStyles: Record<BadgeVariant, string> = {\n default: \"text-white\",\n muted: \"text-neutral-600\",\n accent: \"text-violet-700\",\n};\n\n/* Badges are small raised faces, lit from the same top edge as buttons. */\nconst variantSurfaces: Record<BadgeVariant, React.CSSProperties> = {\n default: {\n background: \"var(--face-dark)\",\n boxShadow:\n \"0 0 3px rgba(0,0,0,0.35), 0 1px 2px rgba(0,0,0,0.2), inset 0 2px 3px -2px rgba(255,255,255,0.105)\",\n textShadow: \"0 -1px 0 rgba(0,0,0,0.4)\",\n },\n muted: {\n background: \"linear-gradient(180deg, #ffffff 0%, #f1f1f1 100%)\",\n boxShadow:\n \"0 0 3px rgba(17,17,17,0.119), 0 1px 1.5px rgba(17,17,17,0.07), inset 0 2px 3px -2px rgba(255,255,255,1)\",\n textShadow: \"0 1px 0 rgba(255,255,255,0.9)\",\n },\n accent: {\n background: \"linear-gradient(180deg, #f5f0ff 0%, #ebe1ff 100%)\",\n boxShadow:\n \"0 0 3px rgba(124,58,237,0.255), 0 1px 1.5px rgba(124,58,237,0.12), inset 0 2px 3px -2px rgba(255,255,255,0.637)\",\n textShadow: \"0 1px 0 rgba(255,255,255,0.7)\",\n },\n};\n\nexport function Badge({\n variant = \"muted\",\n children,\n className = \"\",\n}: BadgeProps) {\n return (\n <span\n className={[\n \"inline-flex items-center px-2 py-0.5 rounded-md text-[11px] font-medium tracking-wide\",\n variantStyles[variant],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={variantSurfaces[variant]}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { ReactNode } from \"react\";\nimport { CloseButton } from \"./CloseButton\";\n\ntype BannerVariant = \"default\" | \"accent\" | \"warning\";\n\n/* A banner is a dark bezel holding a dark face — the same build as the\n primary button, stretched to full width. */\nconst variantStyles: Record<\n BannerVariant,\n { bezel: string; bezelShadow: string; face: string; faceShadow: string; text: string; tone: \"light\" | \"dark\" }\n> = {\n default: {\n bezel: \"var(--bezel-dark)\",\n bezelShadow: \"var(--bezel-dark-shadow)\",\n face: \"var(--face-dark)\",\n faceShadow: \"var(--face-dark-shadow)\",\n text: \"text-white\",\n tone: \"dark\",\n },\n accent: {\n bezel: \"linear-gradient(180deg, #4c2a99 0%, #2e1065 100%)\",\n bezelShadow:\n \"0 0 0 0.5px rgba(46,16,101,0.36), 0 4px 12px -4px rgba(76,29,149,0.45), inset 0 2px 3px -2px rgba(255,255,255,0.09)\",\n face: \"linear-gradient(180deg, #7c3aed 0%, #6d28d9 100%)\",\n faceShadow:\n \"0 0 3px rgba(46,16,101,0.35), 0 1px 2px rgba(46,16,101,0.4), inset 0 2px 3px -2px rgba(255,255,255,0.165)\",\n text: \"text-white\",\n tone: \"dark\",\n },\n warning: {\n bezel: \"linear-gradient(180deg, #fde68a 0%, #f5c84b 100%)\",\n bezelShadow:\n \"0 0 0 0.5px rgba(180,83,9,0.15), 0 4px 12px -4px rgba(217,119,6,0.3), inset 0 2px 3px -2px rgba(255,255,255,0.45)\",\n face: \"linear-gradient(180deg, #fffbeb 0%, #fef3c7 100%)\",\n faceShadow:\n \"0 0 3px rgba(180,83,9,0.255), 0 1px 2px rgba(180,83,9,0.12), inset 0 2px 3px -2px rgba(255,255,255,1)\",\n text: \"text-amber-900\",\n tone: \"light\",\n },\n};\n\nexport function Banner({\n variant = \"default\",\n children,\n icon,\n dismissible = false,\n onDismiss,\n action,\n className = \"\",\n}: {\n variant?: BannerVariant;\n children: ReactNode;\n icon?: ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n action?: ReactNode;\n className?: string;\n}) {\n const s = variantStyles[variant];\n\n return (\n <div\n role=\"region\"\n aria-label=\"Announcement\"\n className={`w-full rounded-[18px] p-1 ${className}`}\n style={{ background: s.bezel, boxShadow: s.bezelShadow }}\n >\n <div\n className={`rounded-[14px] pl-4 pr-2 py-2.5 flex items-center gap-3 ${s.text}`}\n style={{ background: s.face, boxShadow: s.faceShadow }}\n >\n {icon && <span aria-hidden className=\"flex-shrink-0 opacity-80\">{icon}</span>}\n\n {/* Left-aligned so it reads in one sweep with the icon beside it */}\n <span className=\"text-[13px] font-medium flex-1 min-w-0 leading-relaxed\">\n {children}\n </span>\n\n {action && <span className=\"flex-shrink-0\">{action}</span>}\n\n {dismissible && (\n <CloseButton size=\"sm\" tone={s.tone} label=\"Dismiss announcement\" onClick={onDismiss} />\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\ninterface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\ninterface BreadcrumbProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumb({ items, className = \"\" }: BreadcrumbProps) {\n return (\n <nav aria-label=\"Breadcrumb\" className={className}>\n <ol className=\"flex items-center gap-1 flex-wrap\">\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n\n return (\n <li key={i} className=\"flex items-center gap-1 min-w-0\">\n {i > 0 && (\n <svg\n aria-hidden\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n className=\"text-neutral-300 shrink-0\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n {isLast || !item.href ? (\n <span\n aria-current={isLast ? \"page\" : undefined}\n className={[\n \"text-[12.5px] px-1.5 py-0.5 truncate\",\n isLast ? \"font-medium text-neutral-900\" : \"text-neutral-500\",\n ].join(\" \")}\n >\n {item.label}\n </span>\n ) : (\n <a\n href={item.href}\n className=\"text-[12.5px] text-neutral-500 hover:text-neutral-900 px-1.5 py-0.5 rounded-[6px] hover:bg-neutral-900/[0.05] transition-colors truncate\"\n >\n {item.label}\n </a>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import React from \"react\";\n\nexport interface ButtonGroupItem {\n label: string;\n content: React.ReactNode;\n onClick?: () => void;\n href?: string;\n /** Sized to its content; otherwise a square key for a lone icon */\n wide?: boolean;\n}\n\ninterface ButtonGroupProps {\n items: ButtonGroupItem[];\n label: string;\n className?: string;\n}\n\n/* One bezel, one face, several keys: a linked control in the same material\n as Button (sm), split by grooves rather than gaps. Each key fills from the\n bottom on hover and sinks when pressed, like a layered Button's face. */\nexport function ButtonGroup({ items, label, className = \"\" }: ButtonGroupProps) {\n return (\n <div\n role=\"group\"\n aria-label={label}\n className={[\"inline-flex w-fit rounded-[12px] p-[3px]\", className].join(\" \")}\n style={{ background: \"var(--bezel-light)\", boxShadow: \"var(--bezel-light-shadow)\" }}\n >\n <div\n className=\"flex rounded-[9px] overflow-hidden\"\n style={{ background: \"var(--face-light)\", boxShadow: \"var(--face-light-shadow)\" }}\n >\n {items.map((item, i) => {\n const keyClass = [\n \"group/key relative h-9 inline-flex items-center justify-center gap-1.5 cursor-pointer\",\n \"text-[13px] font-medium text-neutral-800 outline-none\",\n \"transition-[box-shadow,background] duration-150\",\n \"active:bg-neutral-900/[0.04] active:[box-shadow:inset_0_1px_2px_rgba(17,17,17,0.08)]\",\n \"focus-visible:[box-shadow:inset_0_0_0_2px_rgba(17,17,17,0.85)]\",\n item.wide ? \"px-4\" : \"w-10\",\n ].join(\" \");\n const inner = (\n <>\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-0 origin-bottom scale-y-0 bg-neutral-900/[0.025] transition-transform duration-300 ease-out group-hover/key:scale-y-100\"\n />\n <span className=\"relative inline-flex items-center gap-1.5\">{item.content}</span>\n </>\n );\n const common = {\n \"aria-label\": item.label,\n title: item.wide ? undefined : item.label,\n className: keyClass,\n style: { textShadow: \"0 1px 0 rgba(255,255,255,0.9)\" },\n };\n\n return (\n <React.Fragment key={item.label}>\n {i > 0 && (\n <span\n aria-hidden\n className=\"w-px self-stretch my-2 bg-neutral-900/[0.08]\"\n style={{ boxShadow: \"1px 0 0 rgba(255,255,255,0.9)\" }}\n />\n )}\n {item.href ? (\n <a href={item.href} {...common}>\n {inner}\n </a>\n ) : (\n <button type=\"button\" onClick={item.onClick} {...common}>\n {inner}\n </button>\n )}\n </React.Fragment>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\ntype Theme = \"light\" | \"dark\";\n\ninterface CardShellProps {\n theme?: Theme;\n /** Controls and context: actions, attribution, deltas. Lives on the chassis. */\n rail?: React.ReactNode;\n /** \"actions\" for buttons; \"text\" for plain context, indented to the face's text edge */\n railKind?: \"actions\" | \"text\";\n as?: \"div\" | \"figure\" | \"article\";\n className?: string;\n faceClassName?: string;\n children: React.ReactNode;\n}\n\n/* Every card is built like every other object in the kit: a chassis (bezel)\n holding a face. Content goes on the face; controls and context go on the\n rail, the strip of chassis below it. The two are nearly the same tone —\n the hairline around the face is what separates them.\n\n Geometry, measured from the card's outer edge:\n - chassis 24px radius, 6px bezel → face 18px radius (concentric)\n - rail content sits 12px in from the left and bottom, 10px below the face\n - a button's label then starts 30px in — the same edge as the face's text,\n and plain-text rails are indented to that edge too */\nexport function CardShell({\n theme = \"light\",\n rail,\n railKind = \"actions\",\n as: Tag = \"div\",\n className = \"\",\n faceClassName = \"\",\n children,\n}: CardShellProps) {\n const dark = theme === \"dark\";\n\n return (\n <Tag\n className={[\n \"rim relative m-0 rounded-[24px] p-1.5 flex flex-col h-full\",\n rail ? \"pb-0\" : \"\",\n className,\n ].join(\" \")}\n style={{\n background: dark ? \"var(--card-bezel-dark)\" : \"var(--card-bezel-light)\",\n boxShadow: dark ? \"var(--card-dark-shadow)\" : \"var(--card-light-shadow)\",\n [\"--rim\" as string]: dark ? \"rgba(255,255,255,0.1)\" : \"rgba(255,255,255,1)\",\n } as React.CSSProperties}\n >\n <div\n className={[\"relative flex-1 min-h-0 rounded-[18px] overflow-hidden flex flex-col\", faceClassName].join(\" \")}\n style={{\n background: dark ? \"var(--card-dark)\" : \"var(--card-light)\",\n boxShadow: dark ? \"var(--card-face-dark-shadow)\" : \"var(--card-face-light-shadow)\",\n }}\n >\n {children}\n </div>\n\n {rail && (\n <div className=\"relative shrink-0 px-1.5 pt-2.5 pb-3\">\n <div\n className={[\n // 40px = a small button's full height, so text rails and button\n // rails come out the same height and line up across a row\n \"min-h-10 flex items-center gap-2 text-[12.5px]\",\n railKind === \"text\" ? \"pl-[18px] pr-3 gap-2.5\" : \"\",\n dark ? \"text-neutral-400\" : \"text-neutral-500\",\n ].join(\" \")}\n >\n {rail}\n </div>\n </div>\n )}\n </Tag>\n );\n}\n","import React from \"react\";\nimport { CardShell } from \"./CardShell\";\n\ntype CardTheme = \"light\" | \"dark\";\n\ninterface SplitCardProps {\n title?: string;\n subtitle?: string;\n icon?: React.ReactNode;\n image?: React.ReactNode;\n imageSrc?: string;\n imageAlt?: string;\n actions?: React.ReactNode;\n theme?: CardTheme;\n className?: string;\n children?: React.ReactNode;\n layout?: \"split\";\n}\n\ninterface StackCardProps {\n title?: string;\n badge?: React.ReactNode;\n subtitle?: string;\n note?: string;\n image?: React.ReactNode;\n imageSrc?: string;\n imageAlt?: string;\n imageBg?: string;\n actions?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n layout: \"stack\";\n}\n\ntype CardProps = SplitCardProps | StackCardProps;\n\n/* Both layouts use CardShell: content on the face, actions on the rail.\n Media sits flush in the face — the face's own corners frame it, so there\n is no box-inside-a-box. */\n\nfunction MediaPlaceholder({ dark, bg, monogram }: { dark?: boolean; bg?: string; monogram?: string }) {\n return (\n <div\n className={[\"relative w-full h-full flex items-center justify-center\", bg ?? \"\"].join(\" \")}\n style={bg ? undefined : { background: dark ? \"var(--media-well-dark)\" : \"var(--media-well-light)\" }}\n >\n {/* A faint dot grid fading out from the centre: a slot, not a hole */}\n <div\n aria-hidden\n className=\"absolute inset-0\"\n style={{\n backgroundImage: `radial-gradient(${\n bg ? \"rgba(255,255,255,0.22)\" : dark ? \"rgba(255,255,255,0.09)\" : \"rgba(17,17,17,0.09)\"\n } 1px, transparent 1px)`,\n backgroundSize: \"12px 12px\",\n maskImage: \"radial-gradient(70% 70% at 50% 50%, #000 0%, transparent 100%)\",\n WebkitMaskImage: \"radial-gradient(70% 70% at 50% 50%, #000 0%, transparent 100%)\",\n }}\n />\n {/* The title's initial, set huge and barely there and cropped by the\n slot's edges: the empty half carries the card's type, not a glyph */}\n {monogram && (\n <span\n aria-hidden\n className={[\n \"absolute -right-3 -bottom-[0.32em] text-[220px] font-semibold leading-none tracking-[-0.06em] select-none\",\n dark ? \"text-white/[0.045]\" : \"text-neutral-900/[0.045]\",\n ].join(\" \")}\n >\n {monogram}\n </span>\n )}\n </div>\n );\n}\n\nfunction Media({\n image,\n imageSrc,\n imageAlt,\n dark,\n bg,\n monogram,\n}: {\n image?: React.ReactNode;\n imageSrc?: string;\n imageAlt: string;\n dark?: boolean;\n bg?: string;\n monogram?: string;\n}) {\n if (image) return <>{image}</>;\n if (imageSrc) {\n // eslint-disable-next-line @next/next/no-img-element\n return <img src={imageSrc} alt={imageAlt} loading=\"lazy\" className=\"w-full h-full object-cover\" />;\n }\n return <MediaPlaceholder dark={dark} bg={bg} monogram={monogram} />;\n}\n\nfunction IconTile({ dark, children }: { dark: boolean; children: React.ReactNode }) {\n return (\n <div\n aria-hidden\n className={[\n \"w-9 h-9 rounded-[11px] flex items-center justify-center shrink-0\",\n dark ? \"text-neutral-100\" : \"text-neutral-700\",\n ].join(\" \")}\n style={{\n background: dark ? \"var(--tile-dark)\" : \"var(--face-light)\",\n boxShadow: dark ? \"var(--tile-dark-shadow)\" : \"var(--tile-light-shadow)\",\n }}\n >\n {children}\n </div>\n );\n}\n\nexport function Card(props: CardProps) {\n if (props.layout === \"stack\") {\n const {\n title,\n badge,\n subtitle,\n note,\n image,\n imageSrc,\n imageAlt = \"\",\n imageBg,\n actions,\n className = \"\",\n children,\n } = props;\n\n return (\n <CardShell\n as=\"article\"\n className={className}\n rail={actions}\n >\n {/* Hairline under the media so it reads as set into the face */}\n <div className=\"relative h-52 shrink-0 overflow-hidden\" style={{ boxShadow: \"0 1px 0 rgba(17,17,17,0.07)\" }}>\n <Media image={image} imageSrc={imageSrc} imageAlt={imageAlt} bg={imageBg} />\n </div>\n\n <div className=\"flex-1 flex flex-col p-6\">\n {(title || badge) && (\n <div className=\"flex items-center gap-2\">\n {title && (\n <h3 className=\"text-[17px] font-semibold text-neutral-900 tracking-[-0.015em] leading-snug\">{title}</h3>\n )}\n {badge}\n </div>\n )}\n {subtitle && (\n // Line breaks in the copy are for centred layouts; let it flow here\n <p className=\"mt-1.5 text-[14px] text-neutral-600 leading-[1.55] text-pretty\">\n {subtitle.replace(/\\n/g, \" \")}\n </p>\n )}\n {children}\n {note && (\n <p className=\"mt-auto pt-5 text-[12px] text-neutral-500 leading-relaxed text-pretty\">{note}</p>\n )}\n </div>\n </CardShell>\n );\n }\n\n const {\n title,\n subtitle,\n icon,\n image,\n imageSrc,\n imageAlt = \"\",\n actions,\n theme = \"light\",\n className = \"\",\n children,\n } = props as SplitCardProps;\n const dark = theme === \"dark\";\n\n return (\n <CardShell\n as=\"article\"\n theme={dark ? \"dark\" : \"light\"}\n className={className}\n faceClassName=\"flex-row! min-h-[220px]\"\n rail={actions}\n >\n {/* The title is the hero: display-sized and pinned to the top. The\n subtitle answers it from the bottom edge, so the two frame the\n face between them instead of huddling in one corner. */}\n <div className=\"relative flex flex-col p-7 flex-1 min-w-0\">\n {icon && <IconTile dark={dark}>{icon}</IconTile>}\n {title && (\n <h3\n className={[\n \"text-[34px] font-medium leading-[1.02] tracking-[-0.04em] text-balance max-w-[14ch]\",\n icon ? \"mt-5\" : \"\",\n dark ? \"text-white\" : \"text-neutral-900\",\n ].join(\" \")}\n >\n {title}\n </h3>\n )}\n <div className=\"mt-auto pt-8 flex flex-col gap-2\">\n {subtitle && (\n <p className=\"text-[14px] leading-[1.45] tracking-[-0.005em] text-neutral-500\">{subtitle}</p>\n )}\n {children}\n </div>\n </div>\n <div\n className=\"relative w-[40%] shrink-0 overflow-hidden\"\n style={{ boxShadow: dark ? \"-1px 0 0 rgba(255,255,255,0.07)\" : \"-1px 0 0 rgba(17,17,17,0.07)\" }}\n >\n <Media\n image={image}\n imageSrc={imageSrc}\n imageAlt={imageAlt}\n dark={dark}\n monogram={typeof title === \"string\" ? title.trim().charAt(0).toLowerCase() : undefined}\n />\n </div>\n </CardShell>\n );\n}\n\ninterface CardGridProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function CardGrid({ children, className = \"\" }: CardGridProps) {\n return (\n <div className={[\"grid grid-cols-1 sm:grid-cols-2 gap-4\", className].join(\" \")}>\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { Button } from \"./Button\";\nimport { CardShell } from \"./CardShell\";\n\ninterface CarouselProps {\n items: React.ReactNode[];\n autoPlay?: boolean;\n interval?: number;\n className?: string;\n}\n\nconst SLIDE_MS = 680;\n\ninterface Slot {\n itemIndex: number;\n key: string;\n role: \"current\" | \"prev\";\n}\n\nexport function Carousel({\n items,\n autoPlay = false,\n interval = 4000,\n className = \"\",\n}: CarouselProps) {\n const [slots, setSlots] = useState<Slot[]>([\n { itemIndex: 0, key: \"s-0-0\", role: \"current\" },\n ]);\n const [direction, setDirection] = useState<\"left\" | \"right\">(\"right\");\n const [currentIdx, setCurrentIdx] = useState(0);\n // Autoplay never moves content out from under someone looking at it\n const [paused, setPaused] = useState(false);\n\n const currentIdxRef = useRef(0);\n const lockedRef = useRef(false);\n const tcRef = useRef(0);\n const cleanupRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const go = (nextIdx: number, dir: \"left\" | \"right\") => {\n if (lockedRef.current || nextIdx === currentIdxRef.current) return;\n\n const prevIdx = currentIdxRef.current;\n const tc = ++tcRef.current;\n\n lockedRef.current = true;\n currentIdxRef.current = nextIdx;\n\n setDirection(dir);\n setCurrentIdx(nextIdx);\n setSlots([\n { itemIndex: nextIdx, key: `c-${nextIdx}-${tc}`, role: \"current\" },\n { itemIndex: prevIdx, key: `p-${prevIdx}-${tc}`, role: \"prev\" },\n ]);\n\n if (cleanupRef.current) clearTimeout(cleanupRef.current);\n cleanupRef.current = setTimeout(() => {\n setSlots([{ itemIndex: nextIdx, key: `c-${nextIdx}-${tc}`, role: \"current\" }]);\n lockedRef.current = false;\n }, SLIDE_MS + 20);\n };\n\n const goNext = () => go((currentIdxRef.current + 1) % items.length, \"right\");\n const goPrev = () => go((currentIdxRef.current - 1 + items.length) % items.length, \"left\");\n\n const goNextRef = useRef(goNext);\n goNextRef.current = goNext;\n\n useEffect(() => {\n if (!autoPlay || paused) return;\n if (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\n const id = setInterval(() => goNextRef.current(), interval);\n return () => clearInterval(id);\n }, [autoPlay, interval, paused]);\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowRight\") { e.preventDefault(); goNextRef.current(); }\n if (e.key === \"ArrowLeft\") { e.preventDefault(); goPrev(); }\n };\n\n useEffect(() => () => { if (cleanupRef.current) clearTimeout(cleanupRef.current); }, []);\n\n // ── Swipe / pointer drag ──────────────────────────────────────────\n const dragRef = useRef<{ x: number; y: number; active: boolean }>({ x: 0, y: 0, active: false });\n const THRESHOLD = 48;\n\n const onPointerDown = (e: React.PointerEvent) => {\n dragRef.current = { x: e.clientX, y: e.clientY, active: true };\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const onPointerUp = (e: React.PointerEvent) => {\n if (!dragRef.current.active) return;\n const dx = e.clientX - dragRef.current.x;\n const dy = e.clientY - dragRef.current.y;\n dragRef.current.active = false;\n if (Math.abs(dx) > THRESHOLD && Math.abs(dx) > Math.abs(dy) * 1.5) {\n dx < 0 ? goNextRef.current() : goPrev();\n }\n };\n\n const onPointerCancel = () => { dragRef.current.active = false; };\n\n /* A plain slide: the incoming and outgoing slides travel together as\n one strip, a full width each. The curve is a strong ease-out, so the\n strip moves the instant you click and then settles — an ease-in-out\n hesitates first, which reads as lag. Driven by the Web Animations API\n on mount, so it never depends on a stylesheet. */\n const slide = (role: Slot[\"role\"]) => (el: HTMLDivElement | null) => {\n if (!el || el.dataset.animated || slots.length < 2) return;\n el.dataset.animated = \"1\";\n if (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\n const sign = direction === \"right\" ? 1 : -1;\n const frames =\n role === \"current\"\n ? [{ transform: `translateX(${sign * 100}%)` }, { transform: \"translateX(0)\" }]\n : [{ transform: \"translateX(0)\" }, { transform: `translateX(${-sign * 100}%)` }];\n el.animate(frames, { duration: SLIDE_MS, easing: \"cubic-bezier(0.22, 1, 0.36, 1)\", fill: \"both\" });\n };\n\n const controls = (\n <div className=\"w-full flex items-center justify-between\">\n <div className=\"flex items-center gap-3 pl-1.5\">\n {/* Dots sit in a well; the active one fills over the autoplay\n interval, and the fill holds while autoplay is paused */}\n <div\n className=\"flex items-center gap-1 rounded-full p-[5px]\"\n style={{ background: \"var(--well)\", boxShadow: \"var(--well-shadow)\" }}\n >\n {items.map((_, i) => {\n const active = i === currentIdx;\n return (\n <button\n key={i}\n onClick={() => go(i, i > currentIdxRef.current ? \"right\" : \"left\")}\n className={[\n \"relative h-1.5 rounded-full overflow-hidden cursor-pointer\",\n \"transition-[width,background] duration-300 ease-[var(--ease-out-soft)]\",\n \"after:absolute after:-inset-2 after:content-['']\",\n active ? \"w-6 bg-neutral-900/15\" : \"w-1.5 bg-neutral-900/20 hover:bg-neutral-900/40\",\n ].join(\" \")}\n aria-label={`Go to slide ${i + 1}`}\n aria-current={active ? \"true\" : undefined}\n >\n {active && (\n <span\n key={`${currentIdx}-${autoPlay}`}\n aria-hidden\n className={[\"absolute inset-0 rounded-full origin-left\", autoPlay ? \"carousel-progress\" : \"\"].join(\" \")}\n style={{\n background: \"var(--face-dark)\",\n animationDuration: `${interval}ms`,\n animationPlayState: paused ? \"paused\" : \"running\",\n }}\n />\n )}\n </button>\n );\n })}\n </div>\n <span className=\"text-[12px] font-medium text-neutral-600 tabular-nums\">\n {currentIdx + 1}\n <span className=\"text-neutral-400\"> / {items.length}</span>\n </span>\n </div>\n\n <div className=\"flex gap-2\">\n <Button variant=\"secondary\" size=\"sm\" square onClick={goPrev} aria-label=\"Previous slide\">\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n </Button>\n <Button variant=\"secondary\" size=\"sm\" square onClick={goNext} aria-label=\"Next slide\">\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </Button>\n </div>\n </div>\n );\n\n /* Built on the card chassis like every other surface: slides are the\n face, controls live on the rail below it. */\n return (\n <section\n aria-roledescription=\"carousel\"\n aria-label=\"Carousel\"\n onKeyDown={onKeyDown}\n onMouseEnter={() => setPaused(true)}\n onMouseLeave={() => setPaused(false)}\n onFocus={() => setPaused(true)}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) setPaused(false);\n }}\n className={className}\n >\n <CardShell rail={controls}>\n <div\n className=\"relative w-full overflow-hidden cursor-grab active:cursor-grabbing touch-pan-y\"\n style={{ minHeight: 300 }}\n aria-live={autoPlay && !paused ? \"off\" : \"polite\"}\n onPointerDown={onPointerDown}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n >\n {slots.map((slot) => (\n <div\n key={slot.key}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${slot.itemIndex + 1} of ${items.length}`}\n aria-hidden={slot.role === \"prev\"}\n ref={slide(slot.role)}\n className={[\"absolute inset-0 will-change-transform [backface-visibility:hidden]\", slot.role === \"prev\" ? \"pointer-events-none\" : \"\"].join(\" \")}\n >\n {items[slot.itemIndex]}\n </div>\n ))}\n </div>\n </CardShell>\n </section>\n );\n}\n\ntype SlideTheme = \"dark\" | \"light\" | \"tint\";\n\ninterface CarouselSlideProps {\n theme?: SlideTheme;\n /** Background for the \"tint\" theme */\n tint?: string;\n icon?: React.ReactNode;\n title: React.ReactNode;\n meta?: React.ReactNode;\n}\n\n/* A ready-made slide in the cards' vocabulary: the card's own material,\n a raised icon tile, and the same fading dot grid as empty media. */\nexport function CarouselSlide({ theme = \"dark\", tint = \"#8A8E7A\", icon, title, meta }: CarouselSlideProps) {\n const dark = theme !== \"light\";\n return (\n <div\n className=\"relative w-full h-full flex flex-col justify-end gap-6 p-8 overflow-hidden select-none\"\n style={{\n background: theme === \"dark\" ? \"var(--card-dark)\" : theme === \"light\" ? \"var(--card-light)\" : tint,\n }}\n >\n <div\n aria-hidden\n className=\"absolute inset-y-0 right-0 w-3/5\"\n style={{\n backgroundImage: `radial-gradient(${\n theme === \"tint\" ? \"rgba(255,255,255,0.22)\" : dark ? \"rgba(255,255,255,0.09)\" : \"rgba(17,17,17,0.08)\"\n } 1px, transparent 1px)`,\n backgroundSize: \"12px 12px\",\n maskImage: \"radial-gradient(60% 70% at 70% 50%, #000 0%, transparent 100%)\",\n WebkitMaskImage: \"radial-gradient(60% 70% at 70% 50%, #000 0%, transparent 100%)\",\n }}\n />\n {icon && (\n <div\n aria-hidden\n className={[\n \"relative w-9 h-9 rounded-[11px] flex items-center justify-center mb-auto\",\n dark ? \"text-neutral-100\" : \"text-neutral-700\",\n ].join(\" \")}\n style={{\n background: dark ? \"var(--tile-dark)\" : \"var(--face-light)\",\n boxShadow: dark ? \"var(--tile-dark-shadow)\" : \"var(--tile-light-shadow)\",\n }}\n >\n {icon}\n </div>\n )}\n <div className=\"relative\">\n <p\n className={[\n \"text-[22px] font-medium leading-[1.2] tracking-[-0.015em] mb-2\",\n dark ? \"text-white\" : \"text-neutral-900\",\n ].join(\" \")}\n >\n {title}\n </p>\n {meta && (\n <p className={[\"text-[13px]\", theme === \"tint\" ? \"text-white/65\" : dark ? \"text-neutral-400\" : \"text-neutral-500\"].join(\" \")}>\n {meta}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useId } from \"react\";\n\ninterface CheckboxProps {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n label?: string;\n description?: string;\n disabled?: boolean;\n indeterminate?: boolean;\n className?: string;\n}\n\nexport function Checkbox({\n checked,\n defaultChecked = false,\n onChange,\n label,\n description,\n disabled = false,\n indeterminate = false,\n className = \"\",\n}: CheckboxProps) {\n const [internal, setInternal] = useState(defaultChecked);\n const uid = useId();\n const isChecked = checked !== undefined ? checked : internal;\n\n const toggle = () => {\n if (disabled) return;\n const next = !isChecked;\n setInternal(next);\n onChange?.(next);\n };\n\n const active = isChecked || indeterminate;\n\n return (\n <div\n className={[\n \"flex items-center justify-between gap-4 select-none\",\n disabled ? \"opacity-40 pointer-events-none\" : \"cursor-pointer\",\n className,\n ].join(\" \")}\n onClick={toggle}\n >\n {(label || description) && (\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n {label && (\n <span id={`${uid}-label`} className=\"text-[13px] font-medium text-neutral-900 leading-snug\">{label}</span>\n )}\n {description && (\n <span id={`${uid}-desc`} className=\"text-[12px] text-neutral-500 leading-relaxed\">{description}</span>\n )}\n </div>\n )}\n\n {/* Clicks bubble to the row, so the control itself has no onClick */}\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={indeterminate ? \"mixed\" : isChecked}\n aria-labelledby={label ? `${uid}-label` : undefined}\n aria-describedby={description ? `${uid}-desc` : undefined}\n disabled={disabled}\n className={[\n \"shrink-0 w-[22px] h-[22px] rounded-[7px] flex items-center justify-center cursor-pointer\",\n \"transition-[box-shadow,transform,scale] duration-200 ease-out active:scale-90\",\n ].join(\" \")}\n style={{\n background: active ? \"var(--face-dark)\" : \"var(--field)\",\n boxShadow: active ? \"var(--face-dark-shadow)\" : \"var(--field-shadow)\",\n }}\n >\n {active && (\n indeterminate ? (\n <span className=\"animate-checkbox-in\">\n <svg width=\"10\" height=\"2\" viewBox=\"0 0 10 2\" fill=\"none\">\n <rect width=\"10\" height=\"2\" rx=\"1\" fill=\"white\" />\n </svg>\n </span>\n ) : (\n <svg width=\"13\" height=\"10\" viewBox=\"0 0 13 10\" fill=\"none\">\n <path\n d=\"M1.5 5l3.5 3.5L11.5 1\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"animate-draw-check\"\n />\n </svg>\n )\n )}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useCallback, useMemo, useRef } from \"react\";\n\ninterface CodeBlockProps {\n code: string;\n language?: string;\n showLineNumbers?: boolean;\n title?: string;\n className?: string;\n}\n\nconst KEYWORDS = new Set([\n \"import\", \"from\", \"export\", \"default\", \"function\", \"return\",\n \"const\", \"let\", \"var\", \"if\", \"else\", \"for\", \"while\", \"do\",\n \"class\", \"extends\", \"new\", \"typeof\", \"instanceof\",\n \"null\", \"undefined\", \"true\", \"false\",\n \"async\", \"await\", \"try\", \"catch\", \"throw\", \"finally\",\n \"interface\", \"type\", \"enum\", \"as\", \"in\", \"of\",\n \"switch\", \"case\", \"break\", \"continue\",\n \"void\", \"never\", \"any\", \"string\", \"number\", \"boolean\",\n \"public\", \"private\", \"protected\", \"static\", \"abstract\", \"readonly\",\n]);\n\nconst TOKEN_RE = /(\\/\\/.*$|\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|`(?:[^`\\\\]|\\\\.)*`|<\\/?\\s*[A-Z][a-zA-Z0-9.]*|<\\/?\\s*[a-z][a-zA-Z0-9-]*|=>|\\b\\d+(?:\\.\\d+)?\\b|\\b[a-zA-Z_$][a-zA-Z0-9_$]*\\b)/;\n\nconst TOKEN_STYLES: Record<string, string> = {\n keyword: \"text-violet-600\",\n string: \"text-emerald-700\",\n comment: \"text-neutral-400 italic\",\n tag: \"text-sky-700\",\n number: \"text-amber-700\",\n};\n\nfunction classifyToken(val: string): string {\n if (val.startsWith(\"//\")) return \"comment\";\n if (val[0] === '\"' || val[0] === \"'\" || val[0] === \"`\") return \"string\";\n if (val[0] === \"<\") return \"tag\";\n if (val === \"=>\") return \"keyword\";\n if (/^\\d/.test(val)) return \"number\";\n if (KEYWORDS.has(val)) return \"keyword\";\n return \"plain\";\n}\n\nfunction tokenizeLine(line: string): { type: string; value: string }[] {\n const tokens: { type: string; value: string }[] = [];\n const re = new RegExp(TOKEN_RE.source, \"g\");\n let lastIndex = 0;\n let match;\n\n while ((match = re.exec(line)) !== null) {\n if (match.index > lastIndex) {\n tokens.push({ type: \"plain\", value: line.slice(lastIndex, match.index) });\n }\n tokens.push({ type: classifyToken(match[0]), value: match[0] });\n lastIndex = re.lastIndex;\n }\n\n if (lastIndex < line.length) {\n tokens.push({ type: \"plain\", value: line.slice(lastIndex) });\n }\n\n return tokens;\n}\n\nconst HIGHLIGHTABLE = new Set([\"js\", \"jsx\", \"ts\", \"tsx\", \"javascript\", \"typescript\"]);\n\nexport function CodeBlock({\n code,\n language,\n showLineNumbers = false,\n title,\n className = \"\",\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(code).then(() => {\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 2000);\n });\n }, [code]);\n\n const highlight = language ? HIGHLIGHTABLE.has(language.toLowerCase()) : false;\n\n const lines = useMemo(() => code.split(\"\\n\"), [code]);\n const tokenized = useMemo(\n () => (highlight ? lines.map((line) => tokenizeLine(line)) : null),\n [lines, highlight],\n );\n\n return (\n /* The header lives in the bezel and the code sits on the raised face,\n so the filename reads as a label on the object, not part of it. */\n <figure\n className={[\"rounded-[18px] p-1.5 pt-0 m-0\", className].filter(Boolean).join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <figcaption className=\"flex items-center justify-between gap-3 pl-3 pr-0.5 h-10\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {title && (\n <span className=\"text-[12px] font-medium text-neutral-700 truncate\">{title}</span>\n )}\n {language && (\n <span\n className=\"text-[11px] font-semibold text-neutral-500 lowercase px-1.5 py-0.5 rounded-[5px]\"\n style={{ background: \"var(--well)\", boxShadow: \"var(--well-shadow)\" }}\n >\n {language}\n </span>\n )}\n </div>\n {/* Both labels share one grid cell, so the key is always as wide as\n the longer one and never jumps. Swapping rolls the old label up\n and out of a small window while the new one rolls in beneath\n it; the check draws itself as it arrives. */}\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label={copied ? \"copied to clipboard\" : \"copy code\"}\n className=\"inline-flex items-center h-7 px-2.5 rounded-[8px] text-[11.5px] font-medium cursor-pointer transition-[color,transform,scale] duration-150 active:scale-95 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-neutral-900\"\n style={{\n background: \"var(--face-light)\",\n boxShadow: \"var(--face-light-shadow)\",\n color: copied ? \"#047857\" : undefined,\n }}\n >\n <span className=\"grid overflow-hidden text-neutral-600\" style={{ color: \"inherit\" }}>\n <span\n aria-hidden\n className=\"[grid-area:1/1] inline-flex items-center justify-center gap-1.5\"\n style={{\n transform: copied ? \"translateY(-110%)\" : \"none\",\n opacity: copied ? 0 : 1,\n filter: copied ? \"blur(2px)\" : \"none\",\n transition: \"transform 320ms var(--ease-out-soft), opacity 220ms ease, filter 220ms ease\",\n }}\n >\n <svg width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n copy\n </span>\n <span\n aria-hidden\n className=\"[grid-area:1/1] inline-flex items-center justify-center gap-1.5\"\n style={{\n transform: copied ? \"none\" : \"translateY(110%)\",\n opacity: copied ? 1 : 0,\n filter: copied ? \"none\" : \"blur(2px)\",\n transition: \"transform 380ms var(--ease-spring), opacity 220ms ease, filter 220ms ease\",\n }}\n >\n <svg width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.25\" viewBox=\"0 0 24 24\">\n <path\n key={String(copied)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n pathLength={15}\n className={copied ? \"animate-draw-check\" : \"\"}\n />\n </svg>\n copied\n </span>\n </span>\n </button>\n <span aria-live=\"polite\" className=\"sr-only\">{copied ? \"copied to clipboard\" : \"\"}</span>\n </figcaption>\n <div\n className=\"bg-white rounded-[13px] overflow-x-auto scroll-thin\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n <pre className=\"py-4 px-4 text-[13px] leading-[1.7] font-mono text-neutral-800\">\n <code>\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n {showLineNumbers && (\n <span aria-hidden className=\"select-none w-8 shrink-0 text-right pr-4 text-neutral-300 tabular-nums\">\n {i + 1}\n </span>\n )}\n <span className=\"flex-1\">\n {tokenized && tokenized[i].length\n ? tokenized[i].map((tok, j) => (\n <span key={j} className={TOKEN_STYLES[tok.type] || \"\"}>\n {tok.value}\n </span>\n ))\n : (line || \"\\n\")}\n </span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n </figure>\n );\n}\n","\"use client\";\n\nimport React, {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n useMemo,\n useCallback,\n useId,\n} from \"react\";\nimport { Kbd } from \"./Kbd\";\nimport { useModalBehavior } from \"./useModalBehavior\";\n\ninterface CommandItem {\n key: string;\n label: string;\n description?: string;\n icon?: React.ReactNode;\n shortcut?: string;\n onSelect?: () => void;\n}\n\ninterface CommandSection {\n title: string;\n items: CommandItem[];\n}\n\ninterface CommandPaletteProps {\n open: boolean;\n onClose: () => void;\n sections: CommandSection[];\n placeholder?: string;\n className?: string;\n}\n\nconst CLOSE_MS = 240;\n\nexport function CommandPalette({\n open,\n onClose,\n sections,\n placeholder = \"search commands…\",\n className = \"\",\n}: CommandPaletteProps) {\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n\n const dialogRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const uid = useId();\n\n // Filter sections based on query\n const filtered = useMemo(() => {\n const q = query.toLowerCase().trim();\n if (!q) return sections;\n return sections\n .map((section) => ({\n ...section,\n items: section.items.filter(\n (item) =>\n item.label.toLowerCase().includes(q) ||\n item.description?.toLowerCase().includes(q),\n ),\n }))\n .filter((section) => section.items.length > 0);\n }, [sections, query]);\n\n // Flat list of all visible items for keyboard nav\n const flatItems = useMemo(\n () => filtered.flatMap((s) => s.items),\n [filtered],\n );\n\n // Mount / unmount lifecycle (matches Modal pattern)\n useEffect(() => {\n if (open) {\n setMounted(true);\n setQuery(\"\");\n setActiveIndex(0);\n return;\n }\n if (mounted) {\n setVisible(false);\n const t = setTimeout(() => setMounted(false), CLOSE_MS);\n return () => clearTimeout(t);\n }\n }, [open, mounted]);\n\n // Enter animation (matches Modal pattern)\n useLayoutEffect(() => {\n if (!mounted || !open || visible) return;\n\n const el = dialogRef.current;\n if (el) {\n void el.getBoundingClientRect();\n }\n\n const id = requestAnimationFrame(() => {\n setVisible(true);\n });\n return () => cancelAnimationFrame(id);\n }, [mounted, open, visible]);\n\n // Reset active index when filter changes\n useEffect(() => {\n setActiveIndex(0);\n }, [query]);\n\n // Scroll active item into view\n useEffect(() => {\n if (!listRef.current) return;\n const activeEl = listRef.current.querySelector(\n `[data-command-index=\"${activeIndex}\"]`,\n );\n if (activeEl) {\n activeEl.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeIndex]);\n\n // Handle selection\n const handleSelect = useCallback(\n (item: CommandItem) => {\n item.onSelect?.();\n onClose();\n },\n [onClose],\n );\n\n // Keyboard navigation\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setActiveIndex((i) => (i + 1 >= flatItems.length ? 0 : i + 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setActiveIndex((i) =>\n i - 1 < 0 ? Math.max(flatItems.length - 1, 0) : i - 1,\n );\n break;\n case \"Enter\":\n e.preventDefault();\n if (flatItems[activeIndex]) {\n handleSelect(flatItems[activeIndex]);\n }\n break;\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, onClose, flatItems, activeIndex, handleSelect]);\n\n // Escape, focus trap + restore, scroll lock\n useModalBehavior({ open, ready: visible, ref: dialogRef, onClose, initialFocus: inputRef });\n\n if (!mounted) return null;\n\n let itemIndex = 0;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-[min(20vh,140px)] px-4\">\n {/* Backdrop */}\n <div\n className={[\n \"absolute inset-0 backdrop-blur-[6px]\",\n \"transition-opacity ease-out\",\n visible ? \"opacity-100 duration-300\" : \"opacity-0 duration-200\",\n ].join(\" \")}\n style={{ background: \"var(--scrim)\" }}\n aria-hidden\n onClick={onClose}\n />\n\n {/* Palette panel */}\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n className={[\n \"relative z-10 w-full max-w-lg rounded-[20px] p-1.5 overflow-hidden\",\n \"transition-[opacity,transform,scale,translate] ease-[var(--ease-spring)]\",\n visible\n ? \"opacity-100 scale-100 translate-y-0 duration-300\"\n : \"opacity-0 scale-[0.94] translate-y-3 duration-200\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--modal-shadow)\" }}\n >\n <div\n className=\"bg-white rounded-[14px] overflow-hidden\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n {/* Search input */}\n <div className=\"flex items-center gap-3 px-4 py-3.5\">\n <svg\n className=\"shrink-0 text-neutral-400\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-4.35-4.35M11 19a8 8 0 100-16 8 8 0 000 16z\"\n />\n </svg>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${uid}-list`}\n aria-activedescendant={flatItems[activeIndex] ? `${uid}-item-${activeIndex}` : undefined}\n aria-autocomplete=\"list\"\n className=\"flex-1 min-w-0 text-[14.5px] font-medium text-neutral-900 placeholder:text-neutral-400 placeholder:font-normal bg-transparent border-none outline-none\"\n />\n <Kbd className=\"shrink-0\">esc</Kbd>\n </div>\n\n {/* Separator */}\n <div className=\"border-b border-neutral-100\" />\n\n {/* Results */}\n <div\n ref={listRef}\n id={`${uid}-list`}\n role=\"listbox\"\n className=\"max-h-[340px] overflow-y-auto scroll-thin py-2 px-2\"\n >\n {filtered.length === 0 ? (\n <div className=\"py-10 flex flex-col items-center gap-1 text-center\">\n <p className=\"text-[13px] font-medium text-neutral-700\">\n nothing for &ldquo;{query}&rdquo;\n </p>\n <p className=\"text-[12px] text-neutral-400\">try a shorter or different word.</p>\n </div>\n ) : (\n filtered.map((section, si) => (\n <div key={section.title} role=\"group\" aria-label={section.title} className={si > 0 ? \"mt-3\" : \"\"}>\n <div aria-hidden className=\"px-3 py-1.5 text-[11.5px] font-medium text-neutral-400 lowercase select-none\">\n {section.title}\n </div>\n <div className=\"flex flex-col gap-0.5\">\n {section.items.map((item) => {\n const currentIndex = itemIndex++;\n const isActive = currentIndex === activeIndex;\n return (\n <div\n key={item.key}\n id={`${uid}-item-${currentIndex}`}\n role=\"option\"\n aria-selected={isActive}\n data-command-index={currentIndex}\n onClick={() => handleSelect(item)}\n onMouseMove={() => setActiveIndex(currentIndex)}\n className={[\n \"group/cmd flex items-center gap-3 w-full text-left px-3 py-2 rounded-[10px] cursor-pointer\",\n \"transition-[background,box-shadow] duration-100\",\n isActive ? \"bg-neutral-50\" : \"\",\n ].join(\" \")}\n style={{ boxShadow: isActive ? \"var(--panel-face-shadow)\" : undefined }}\n >\n {item.icon && (\n <span\n className={[\n \"shrink-0 w-7 h-7 rounded-[8px] flex items-center justify-center transition-colors duration-100\",\n isActive ? \"text-neutral-900\" : \"text-neutral-500\",\n ].join(\" \")}\n style={{ background: \"var(--face-light)\", boxShadow: \"var(--face-light-shadow)\" }}\n >\n {item.icon}\n </span>\n )}\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <span className=\"text-[13px] font-medium text-neutral-900 truncate\">\n {item.label}\n </span>\n {item.description && (\n <span className=\"text-[12px] text-neutral-500 truncate\">\n {item.description}\n </span>\n )}\n </div>\n {item.shortcut && <Kbd className=\"shrink-0\">{item.shortcut}</Kbd>}\n {!item.shortcut && (\n <svg\n aria-hidden\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n className={[\n \"shrink-0 text-neutral-400 transition-all duration-150\",\n isActive ? \"opacity-100 translate-x-0\" : \"opacity-0 -translate-x-1\",\n ].join(\" \")}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </div>\n );\n })}\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* Key hints — teach the palette while it's open */}\n <div\n className=\"flex items-center gap-4 px-4 py-2.5 border-t border-neutral-100 text-[11.5px] text-neutral-500 select-none\"\n style={{ background: \"linear-gradient(180deg, #fcfcfc 0%, #f8f8f8 100%)\" }}\n >\n <span className=\"inline-flex items-center gap-1.5\">\n <Kbd>↑</Kbd>\n <Kbd>↓</Kbd>\n Navigate\n </span>\n <span className=\"inline-flex items-center gap-1.5\">\n <Kbd>↵</Kbd>\n Open\n </span>\n <span className=\"ml-auto tabular-nums text-neutral-400\">\n {flatItems.length} {flatItems.length === 1 ? \"result\" : \"results\"}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\n\nexport function Kbd({\n children,\n className = \"\",\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <kbd\n className={`inline-flex items-center justify-center min-w-[22px] h-[22px] px-1.5 rounded-md text-[11px] font-semibold text-neutral-500 ${className}`}\n style={{\n /* A keycap: lit top, solid 1.5px skirt below so it reads as pressable */\n background: \"var(--face-light)\",\n boxShadow:\n \"0 0 3px rgba(17,17,17,0.136), 0 1.5px 1px rgba(17,17,17,0.12), 0 2px 3px -1px rgba(17,17,17,0.1), inset 0 2px 3px -2px rgba(255,255,255,1)\",\n textShadow: \"0 1px 0 rgba(255,255,255,0.9)\",\n }}\n >\n {children}\n </kbd>\n );\n}\n","\"use client\";\n\nimport { RefObject, useEffect } from \"react\";\n\ninterface ModalBehaviorOptions {\n /** The dialog is logically open */\n open: boolean;\n /** The dialog is mounted and painted — focus can move into it */\n ready: boolean;\n ref: RefObject<HTMLElement | null>;\n onClose: () => void;\n /** Element to focus on open; defaults to the first focusable */\n initialFocus?: RefObject<HTMLElement | null>;\n}\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/* Everything a modal surface owes the person using it: Escape closes,\n focus is trapped inside, the page behind doesn't scroll, and focus\n returns to whatever opened it. */\nexport function useModalBehavior({ open, ready, ref, onClose, initialFocus }: ModalBehaviorOptions) {\n // Escape\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onClose();\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, onClose]);\n\n // Scroll lock\n useEffect(() => {\n if (!open) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, [open]);\n\n // Focus trap + restore\n useEffect(() => {\n if (!open || !ready) return;\n const el = ref.current;\n if (!el) return;\n\n const opener = document.activeElement as HTMLElement | null;\n const target = initialFocus?.current ?? el.querySelector<HTMLElement>(FOCUSABLE);\n target?.focus();\n\n const trap = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\") return;\n const focusable = el.querySelectorAll<HTMLElement>(FOCUSABLE);\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n };\n\n el.addEventListener(\"keydown\", trap);\n return () => {\n el.removeEventListener(\"keydown\", trap);\n opener?.focus?.();\n };\n }, [open, ready, ref, initialFocus]);\n}\n","import React from \"react\";\n\ninterface DataListItem {\n label: string;\n value: React.ReactNode;\n}\n\ninterface DataListProps {\n items: DataListItem[];\n columns?: 1 | 2;\n className?: string;\n}\n\nexport function DataList({ items, columns = 1, className = \"\" }: DataListProps) {\n return (\n <div\n className={[\"rounded-[18px] p-1.5\", className].filter(Boolean).join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <dl\n className={[\n // 1px gaps over a hairline-coloured face draw the grid lines, so\n // borders never double up whatever the item count\n \"grid gap-px bg-neutral-900/[0.05] rounded-[13px] overflow-hidden\",\n columns === 2 ? \"grid-cols-1 sm:grid-cols-2\" : \"grid-cols-1\",\n ].join(\" \")}\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n {items.map((item, i) => (\n <div\n key={i}\n className={[\n \"flex flex-col gap-1.5 px-5 py-4 bg-white\",\n // An odd last cell in two columns spans the row instead of leaving a hole\n columns === 2 && items.length % 2 === 1 && i === items.length - 1 ? \"sm:col-span-2\" : \"\",\n ].join(\" \")}\n >\n <dt className=\"text-[12px] text-neutral-500\">\n {item.label}\n </dt>\n <dd className=\"min-h-6 flex items-center text-[14px] font-medium text-neutral-900 tracking-[-0.01em] tabular-nums\">\n {item.value}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { CloseButton } from \"./CloseButton\";\nimport { useModalBehavior } from \"./useModalBehavior\";\n\ninterface DrawerProps {\n open: boolean;\n onClose: () => void;\n title?: string;\n description?: string;\n children?: React.ReactNode;\n actions?: React.ReactNode;\n side?: \"left\" | \"right\";\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nconst ENTER_MS = 380;\nconst EXIT_MS = 240;\n\nconst sizeMap = {\n sm: \"max-w-xs\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n} as const;\n\nexport function Drawer({\n open,\n onClose,\n title,\n description,\n children,\n actions,\n side = \"right\",\n size = \"md\",\n className = \"\",\n}: DrawerProps) {\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n const panelRef = useRef<HTMLDivElement>(null);\n const uid = useId();\n\n /* ── mount / unmount ────────────────────────────────── */\n useEffect(() => {\n if (open) {\n setMounted(true);\n return;\n }\n if (mounted) {\n setVisible(false);\n const t = setTimeout(() => setMounted(false), EXIT_MS);\n return () => clearTimeout(t);\n }\n }, [open, mounted]);\n\n /* ── trigger enter animation after mount ────────────── */\n useLayoutEffect(() => {\n if (!mounted || !open || visible) return;\n void panelRef.current?.getBoundingClientRect();\n const id = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(id);\n }, [mounted, open, visible]);\n\n /* ── Escape, focus trap + restore, scroll lock ─────── */\n useModalBehavior({ open, ready: visible, ref: panelRef, onClose });\n\n if (!mounted) return null;\n\n const isRight = side === \"right\";\n\n return (\n <div className=\"fixed inset-0 z-90\">\n <div\n aria-hidden\n className=\"absolute inset-0 backdrop-blur-[6px] transition-opacity ease-out\"\n style={{\n background: \"var(--scrim)\",\n opacity: visible ? 1 : 0,\n transitionDuration: `${visible ? ENTER_MS : EXIT_MS}ms`,\n }}\n onClick={onClose}\n />\n\n {/* Floats a few px off the viewport edge so it reads as a panel, not a wall */}\n <div\n className={[\n \"absolute inset-y-0 w-full p-2 flex\",\n isRight ? \"right-0 justify-end\" : \"left-0 justify-start\",\n ].join(\" \")}\n style={{ pointerEvents: \"none\" }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? `${uid}-title` : undefined}\n aria-describedby={description ? `${uid}-desc` : undefined}\n className={[\n \"relative h-full w-full rounded-[22px] p-1.5 flex flex-col pointer-events-auto\",\n sizeMap[size],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n background: \"var(--panel-bezel)\",\n boxShadow: \"var(--modal-shadow)\",\n transform: visible\n ? \"translateX(0)\"\n : isRight\n ? \"translateX(calc(100% + 16px))\"\n : \"translateX(calc(-100% - 16px))\",\n transition: `transform ${visible ? ENTER_MS : EXIT_MS}ms ${\n visible ? \"var(--ease-out-soft)\" : \"cubic-bezier(0.4,0,1,1)\"\n }`,\n }}\n >\n <div\n className=\"flex flex-col h-full bg-white rounded-[16px] overflow-hidden\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n <div className=\"pl-6 pr-4 pt-5 pb-4 flex items-start gap-4 shrink-0\">\n <div className=\"flex-1 min-w-0 flex flex-col gap-1.5 pt-1\">\n {title && (\n <h2\n id={`${uid}-title`}\n className=\"text-[16px] font-semibold text-neutral-900 tracking-[-0.015em] leading-snug\"\n >\n {title}\n </h2>\n )}\n {description && (\n <p id={`${uid}-desc`} className=\"text-[13px] text-neutral-500 leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n <CloseButton label=\"Close drawer\" onClick={onClose} />\n </div>\n\n {children && (\n <div className=\"flex-1 overflow-y-auto scroll-thin px-6 pb-5 text-[13.5px] text-neutral-600 leading-relaxed\">\n {children}\n </div>\n )}\n\n {actions && (\n <div\n className=\"mt-auto px-5 py-3.5 flex items-center justify-end gap-2 shrink-0\"\n style={{\n background: \"linear-gradient(180deg, #fafafa 0%, #f6f6f6 100%)\",\n boxShadow: \"inset 0 1px 0 rgba(17,17,17,0.06)\",\n }}\n >\n {actions}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useId, useCallback, ReactNode } from \"react\";\nimport { Kbd } from \"./Kbd\";\n\ntype DropdownMenuPosition =\n | \"bottom-start\"\n | \"bottom-end\"\n | \"top-start\"\n | \"top-end\";\n\nexport interface DropdownMenuItem {\n key: string;\n label: string;\n icon?: ReactNode;\n shortcut?: string;\n danger?: boolean;\n disabled?: boolean;\n divider?: boolean;\n}\n\ninterface DropdownMenuProps {\n trigger: ReactNode;\n items: DropdownMenuItem[];\n position?: DropdownMenuPosition;\n onSelect?: (key: string) => void;\n className?: string;\n}\n\nconst positionStyles: Record<DropdownMenuPosition, string> = {\n \"bottom-start\": \"top-full left-0 mt-2 origin-top-left\",\n \"bottom-end\": \"top-full right-0 mt-2 origin-top-right\",\n \"top-start\": \"bottom-full left-0 mb-2 origin-bottom-left\",\n \"top-end\": \"bottom-full right-0 mb-2 origin-bottom-right\",\n};\n\nconst enterFrom: Record<DropdownMenuPosition, string> = {\n \"bottom-start\": \"-translate-y-1.5\",\n \"bottom-end\": \"-translate-y-1.5\",\n \"top-start\": \"translate-y-1.5\",\n \"top-end\": \"translate-y-1.5\",\n};\n\nexport function DropdownMenu({\n trigger,\n items,\n position = \"bottom-end\",\n onSelect,\n className = \"\",\n}: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const [mounted, setMounted] = useState(false);\n // Where the menu actually opens: the requested side unless that runs off-screen\n const [placement, setPlacement] = useState(position);\n const [shift, setShift] = useState(0);\n const ref = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const uid = useId();\n\n const enabledItems = () =>\n Array.from(menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([disabled])') ?? []);\n\n const focusItem = (index: number) => {\n const list = enabledItems();\n if (list.length === 0) return;\n list[(index + list.length) % list.length].focus();\n };\n\n /* Measured as soon as the menu is attached, before it fades in.\n offsetWidth/Height ignore the enter transform, so the numbers are the\n menu's settled size. */\n const attachMenu = useCallback((menu: HTMLDivElement | null) => {\n menuRef.current = menu;\n const anchor = ref.current;\n if (!menu || !anchor) return;\n const gap = 8;\n const a = anchor.getBoundingClientRect();\n const w = menu.offsetWidth;\n const h = menu.offsetHeight;\n const vw = document.documentElement.clientWidth;\n const vh = window.innerHeight;\n\n let [v, side] = position.split(\"-\") as [\"top\" | \"bottom\", \"start\" | \"end\"];\n const fitsStart = a.left + w <= vw - gap;\n const fitsEnd = a.right - w >= gap;\n if (side === \"end\" && !fitsEnd && fitsStart) side = \"start\";\n else if (side === \"start\" && !fitsStart && fitsEnd) side = \"end\";\n\n const fitsBelow = a.bottom + gap + h <= vh - gap;\n const fitsAbove = a.top - gap - h >= gap;\n if (v === \"bottom\" && !fitsBelow && fitsAbove) v = \"top\";\n else if (v === \"top\" && !fitsAbove && fitsBelow) v = \"bottom\";\n\n // Neither side fits (narrow screens): slide it back inside the viewport\n const left = side === \"start\" ? a.left : a.right - w;\n const nudge = Math.max(gap - left, 0) - Math.max(left + w - (vw - gap), 0);\n\n setPlacement(`${v}-${side}` as DropdownMenuPosition);\n setShift(nudge);\n }, [position]);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n setVisible(true);\n // Land on the first item so arrow keys work straight away\n focusItem(0);\n })\n );\n } else {\n setVisible(false);\n const t = setTimeout(() => setMounted(false), 180);\n return () => clearTimeout(t);\n }\n }, [open]);\n\n useEffect(() => {\n function onOutside(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", onOutside);\n return () => document.removeEventListener(\"mousedown\", onOutside);\n }, []);\n\n const returnFocus = () => {\n ref.current?.querySelector<HTMLElement>(\"[data-menu-trigger] button, [data-menu-trigger] a\")?.focus();\n };\n\n const onMenuKeyDown = (e: React.KeyboardEvent) => {\n const list = enabledItems();\n const at = list.indexOf(document.activeElement as HTMLElement);\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n focusItem(at + 1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n focusItem(at - 1);\n break;\n case \"Home\":\n e.preventDefault();\n focusItem(0);\n break;\n case \"End\":\n e.preventDefault();\n focusItem(list.length - 1);\n break;\n case \"Escape\":\n e.preventDefault();\n setOpen(false);\n returnFocus();\n break;\n case \"Tab\":\n setOpen(false);\n break;\n }\n };\n\n function handleSelect(item: DropdownMenuItem) {\n if (item.disabled) return;\n onSelect?.(item.key);\n setOpen(false);\n returnFocus();\n }\n\n return (\n <div ref={ref} className={[\"relative inline-flex\", className].join(\" \")}>\n <div\n data-menu-trigger\n onClick={() => {\n if (!open) {\n // Start each opening from the requested side; attachMenu flips if needed\n setPlacement(position);\n setShift(0);\n }\n setOpen(!open);\n }}\n className=\"inline-flex cursor-pointer\"\n >\n {React.isValidElement(trigger)\n ? React.cloneElement(trigger as React.ReactElement<Record<string, unknown>>, {\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? `${uid}-menu` : undefined,\n })\n : trigger}\n </div>\n {mounted && (\n <div\n ref={attachMenu}\n id={`${uid}-menu`}\n role=\"menu\"\n onKeyDown={onMenuKeyDown}\n className={[\n \"absolute z-50 min-w-[200px] rounded-[16px] p-1.5\",\n \"transition-[opacity,transform,scale,translate] duration-200 ease-[var(--ease-spring)]\",\n visible\n ? \"opacity-100 scale-100 translate-y-0\"\n : [\"opacity-0 scale-[0.96]\", enterFrom[placement]].join(\" \"),\n positionStyles[placement],\n ].join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--overlay-shadow)\", marginLeft: shift || undefined }}\n >\n <div\n className=\"bg-white rounded-[11px] p-1 flex flex-col\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n {items.map((item) => {\n if (item.divider) {\n return <div key={item.key} role=\"separator\" className=\"h-px bg-neutral-100 my-1 mx-2\" />;\n }\n\n return (\n <button\n key={item.key}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n onClick={() => handleSelect(item)}\n onMouseEnter={(e) => e.currentTarget.focus()}\n disabled={item.disabled}\n className={[\n \"group/item w-full flex items-center gap-2.5 px-2.5 py-2 rounded-[8px] text-[13px] font-medium cursor-pointer outline-none\",\n \"transition-[background,color] duration-100\",\n \"disabled:opacity-35 disabled:pointer-events-none\",\n item.danger\n ? \"text-red-600 focus:bg-red-50\"\n : \"text-neutral-700 focus:text-neutral-900 focus:bg-neutral-100/80\",\n ].join(\" \")}\n >\n {item.icon && (\n <span\n className={[\n \"shrink-0 w-4 h-4 flex items-center justify-center transition-colors duration-100\",\n item.danger ? \"text-red-500\" : \"text-neutral-400 group-focus/item:text-neutral-700\",\n ].join(\" \")}\n >\n {item.icon}\n </span>\n )}\n <span className=\"flex-1 text-left\">{item.label}</span>\n {item.shortcut && <Kbd className=\"shrink-0\">{item.shortcut}</Kbd>}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\ninterface EmptyStateProps {\n icon?: React.ReactNode;\n title: string;\n description?: string;\n action?: React.ReactNode;\n className?: string;\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className = \"\",\n}: EmptyStateProps) {\n return (\n <div\n className={[\"rounded-[20px] p-1.5\", className].filter(Boolean).join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <div\n className=\"relative bg-white rounded-[15px] overflow-hidden flex flex-col items-center justify-center text-center py-14 px-6\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n {/* A faint dotted floor: the space is empty, not broken */}\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0\"\n style={{\n backgroundImage: \"radial-gradient(rgba(17,17,17,0.07) 1px, transparent 1px)\",\n backgroundSize: \"14px 14px\",\n maskImage: \"radial-gradient(60% 70% at 50% 40%, #000 0%, transparent 100%)\",\n WebkitMaskImage: \"radial-gradient(60% 70% at 50% 40%, #000 0%, transparent 100%)\",\n }}\n />\n {icon && (\n <div\n aria-hidden\n className=\"relative w-12 h-12 rounded-[14px] flex items-center justify-center text-neutral-500 mb-5\"\n style={{ background: \"var(--face-light)\", boxShadow: \"var(--face-light-shadow), 0 6px 16px -6px rgba(17,17,17,0.15)\" }}\n >\n {icon}\n </div>\n )}\n <p className=\"relative text-[15px] font-semibold text-neutral-900 tracking-[-0.015em]\">{title}</p>\n {description && (\n <p className=\"relative text-[13px] text-neutral-500 mt-1.5 max-w-xs leading-relaxed\">{description}</p>\n )}\n {action && <div className=\"relative mt-6\">{action}</div>}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\ninterface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n hint?: string;\n error?: string;\n fullWidth?: boolean;\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n}\n\n/* Fields are sunken wells (see --field tokens in globals.css). Raised\n means \"press me\", sunken means \"fill me\" — that is the whole system. */\n\nexport function Input({\n label,\n hint,\n error,\n fullWidth = false,\n iconLeft,\n iconRight,\n className = \"\",\n id,\n ...rest\n}: InputProps) {\n const inputId = id ?? label?.toLowerCase().replace(/\\s+/g, \"-\");\n const messageId = inputId && (error || hint) ? `${inputId}-message` : undefined;\n\n return (\n <div className={[\"group/field flex flex-col gap-1.5\", fullWidth ? \"w-full\" : \"\"].join(\" \")}>\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-[12.5px] font-medium text-neutral-700 tracking-[-0.005em] transition-colors duration-200 group-focus-within/field:text-neutral-950\"\n >\n {label}\n </label>\n )}\n <div className=\"relative group/input isolate\">\n {iconLeft && (\n <span\n className=\"absolute left-3.5 top-1/2 -translate-y-1/2 text-neutral-400 transition-all duration-300 ease-[cubic-bezier(0.34,1.4,0.64,1)] group-focus-within/input:text-neutral-800 group-focus-within/input:scale-110 pointer-events-none z-20 flex items-center justify-center\"\n >\n {iconLeft}\n </span>\n )}\n <input\n id={inputId}\n className={[\n \"field relative z-10 w-full rounded-xl py-3 text-[13.5px] text-neutral-900 caret-neutral-900\",\n \"placeholder:text-neutral-400 placeholder:transition-colors placeholder:duration-200 focus:placeholder:text-neutral-300\",\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\n iconLeft ? \"pl-10\" : \"pl-4\",\n iconRight ? \"pr-10\" : \"pr-4\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-invalid={error ? true : undefined}\n aria-describedby={messageId}\n {...rest}\n />\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-0 z-15 rounded-xl overflow-hidden\"\n >\n <span\n className=\"block absolute inset-y-0 w-[30%] -left-[30%] opacity-0 group-focus-within/input:animate-input-shimmer\"\n style={{\n background:\n \"linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.55) 50%, transparent 100%)\",\n }}\n />\n </span>\n {iconRight && (\n <span\n className=\"absolute right-3.5 top-1/2 -translate-y-1/2 text-neutral-400 transition-all duration-300 ease-[cubic-bezier(0.34,1.4,0.64,1)] group-focus-within/input:text-neutral-800 group-focus-within/input:scale-110 pointer-events-none z-20 flex items-center justify-center\"\n >\n {iconRight}\n </span>\n )}\n </div>\n {error && (\n <p id={messageId} role=\"alert\" className=\"text-[11.5px] text-red-600 font-medium flex items-center gap-1 mt-0.5\">\n <svg width=\"11\" height=\"11\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"M12 8v4m0 4h.01\" />\n </svg>\n {error}\n </p>\n )}\n {hint && !error && (\n <p id={messageId} className=\"text-[11.5px] text-neutral-500 mt-0.5\">{hint}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { CloseButton } from \"./CloseButton\";\nimport { useModalBehavior } from \"./useModalBehavior\";\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: string;\n description?: string;\n children?: React.ReactNode;\n actions?: React.ReactNode;\n className?: string;\n}\n\nconst CLOSE_MS = 240;\n\nexport function Modal({\n open,\n onClose,\n title,\n description,\n children,\n actions,\n className = \"\",\n}: ModalProps) {\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n const dialogRef = useRef<HTMLDivElement>(null);\n const uid = useId();\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n return;\n }\n if (mounted) {\n setVisible(false);\n const t = setTimeout(() => setMounted(false), CLOSE_MS);\n return () => clearTimeout(t);\n }\n }, [open, mounted]);\n\n useLayoutEffect(() => {\n if (!mounted || !open || visible) return;\n void dialogRef.current?.getBoundingClientRect();\n const id = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(id);\n }, [mounted, open, visible]);\n\n // Escape, focus trap + restore, scroll lock\n useModalBehavior({ open, ready: visible, ref: dialogRef, onClose });\n\n if (!mounted) return null;\n\n return (\n <div className=\"fixed inset-0 z-90 flex items-center justify-center p-4\">\n <div\n aria-hidden\n className={[\n \"absolute inset-0 backdrop-blur-[6px]\",\n \"transition-opacity ease-out\",\n visible ? \"opacity-100 duration-300\" : \"opacity-0 duration-200\",\n ].join(\" \")}\n style={{ background: \"var(--scrim)\" }}\n onClick={onClose}\n />\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? `${uid}-title` : undefined}\n aria-describedby={description ? `${uid}-desc` : undefined}\n className={[\n \"relative z-10 w-full max-w-lg rounded-[22px] p-1.5\",\n \"transition-[opacity,transform,scale,translate] ease-[var(--ease-spring)]\",\n visible\n ? \"opacity-100 scale-100 translate-y-0 duration-300\"\n : \"opacity-0 scale-[0.94] translate-y-3 duration-200\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--modal-shadow)\" }}\n >\n <div\n className=\"bg-white rounded-[16px] overflow-hidden\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n <div className=\"pl-6 pr-4 pt-5 pb-4 flex items-start gap-4\">\n <div className=\"flex-1 min-w-0 flex flex-col gap-1.5 pt-1\">\n {title && (\n <h2\n id={`${uid}-title`}\n className=\"text-[16px] font-semibold text-neutral-900 tracking-[-0.015em] leading-snug\"\n >\n {title}\n </h2>\n )}\n {description && (\n <p id={`${uid}-desc`} className=\"text-[13px] text-neutral-500 leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n <CloseButton label=\"Close dialog\" onClick={onClose} />\n </div>\n\n {children && <div className=\"px-6 pb-5 text-[13.5px] text-neutral-600 leading-relaxed\">{children}</div>}\n\n {/* Footer sits in the bezel tone so actions read as a separate tray */}\n {actions && (\n <div\n className=\"px-5 py-3.5 flex items-center justify-end gap-2\"\n style={{\n background: \"linear-gradient(180deg, #fafafa 0%, #f6f6f6 100%)\",\n boxShadow: \"inset 0 1px 0 rgba(17,17,17,0.06)\",\n }}\n >\n {actions}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useState, useEffect, useLayoutEffect } from \"react\";\n\ninterface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n className = \"\",\n}: PaginationProps) {\n const slots = buildSlots(currentPage, totalPages);\n const [pill, setPill] = useState({ left: 0, width: 0, ready: false });\n const containerRef = useRef<HTMLDivElement>(null);\n const btnRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n\n const measurePill = () => {\n const btn = btnRefs.current[String(currentPage)];\n const container = containerRef.current;\n if (!btn || !container) return;\n const cr = container.getBoundingClientRect();\n const br = btn.getBoundingClientRect();\n setPill({ left: br.left - cr.left, width: br.width, ready: true });\n };\n\n useLayoutEffect(() => {\n measurePill();\n }, []);\n\n /* Only the thumb moves: it glides to the new page without overshoot,\n and the numbers themselves stay still. */\n useEffect(() => {\n measurePill();\n }, [currentPage]);\n\n useEffect(() => {\n const ro = new ResizeObserver(() => measurePill());\n if (containerRef.current) ro.observe(containerRef.current);\n return () => ro.disconnect();\n }, [currentPage]);\n\n return (\n <nav\n aria-label=\"Pagination\"\n className={[\n \"inline-flex items-center gap-0.5 rounded-[13px] p-1\",\n className,\n ].join(\" \")}\n style={{ background: \"var(--well)\", boxShadow: \"var(--well-shadow)\" }}\n >\n <button\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n aria-label=\"Previous page\"\n className=\"group/nav relative overflow-hidden h-8 px-3 rounded-[9px] flex items-center gap-1.5 text-[13px] font-medium text-neutral-600 hover:text-neutral-900 transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\"\n >\n <span className=\"pointer-events-none absolute inset-0 rounded-[9px] opacity-0 group-hover/nav:opacity-100 transition-opacity duration-200 [background:var(--face-light)] [box-shadow:var(--thumb-shadow)]\" />\n <svg className=\"relative z-10\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n <span className=\"relative z-10 hidden sm:inline\">prev</span>\n </button>\n\n <div ref={containerRef} className=\"relative flex items-center\">\n {pill.ready && (\n <span\n aria-hidden\n className=\"absolute top-0 bottom-0 rounded-[9px] pointer-events-none z-0\"\n style={{\n left: pill.left,\n width: pill.width,\n background: \"var(--face-light)\",\n boxShadow: \"var(--thumb-shadow)\",\n transition: \"left 340ms var(--ease-out-soft), width 340ms var(--ease-out-soft)\",\n }}\n />\n )}\n\n {slots.map((slot, i) =>\n slot === \"...\" ? (\n <span\n key={`dot-${i}`}\n aria-hidden\n className=\"w-8 h-8 flex items-center justify-center text-[11px] text-neutral-400 select-none relative z-10\"\n >\n ···\n </span>\n ) : (\n <button\n key={`slot-${i}`}\n ref={(el) => {\n btnRefs.current[String(slot)] = el;\n }}\n onClick={() => slot !== currentPage && onPageChange(slot as number)}\n aria-label={`Page ${slot}`}\n aria-current={slot === currentPage ? \"page\" : undefined}\n className={[\n \"relative z-10 min-w-8 h-8 px-1 rounded-[9px] flex items-center justify-center text-[13px] font-medium transition-colors duration-200 cursor-pointer tabular-nums\",\n slot === currentPage\n ? \"text-neutral-900\"\n : \"text-neutral-500 hover:text-neutral-900\",\n ].join(\" \")}\n >\n {slot}\n </button>\n ),\n )}\n </div>\n\n <button\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n aria-label=\"Next page\"\n className=\"group/nav relative overflow-hidden h-8 px-3 rounded-[9px] flex items-center gap-1.5 text-[13px] font-medium text-neutral-600 hover:text-neutral-900 transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\"\n >\n <span className=\"pointer-events-none absolute inset-0 rounded-[9px] opacity-0 group-hover/nav:opacity-100 transition-opacity duration-200 [background:var(--face-light)] [box-shadow:var(--thumb-shadow)]\" />\n <span className=\"relative z-10 hidden sm:inline\">next</span>\n <svg className=\"relative z-10\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </nav>\n );\n}\n\nfunction buildSlots(current: number, total: number): (number | \"...\")[] {\n if (total <= 7) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const slots: (number | \"...\")[] = new Array(7);\n\n slots[0] = 1;\n slots[6] = total;\n\n if (current <= 3) {\n slots[1] = 2;\n slots[2] = 3;\n slots[3] = 4;\n slots[4] = 5;\n slots[5] = \"...\";\n } else if (current >= total - 2) {\n slots[1] = \"...\";\n slots[2] = total - 4;\n slots[3] = total - 3;\n slots[4] = total - 2;\n slots[5] = total - 1;\n } else {\n slots[1] = \"...\";\n slots[2] = current - 1;\n slots[3] = current;\n slots[4] = current + 1;\n slots[5] = \"...\";\n }\n\n return slots;\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useId } from \"react\";\n\ntype PopoverPosition = \"top\" | \"bottom\" | \"left\" | \"right\";\n\ninterface PopoverProps {\n trigger: React.ReactNode;\n children: React.ReactNode;\n position?: PopoverPosition;\n className?: string;\n}\n\n/* Anchored with margins on a wrapper so the panel's own transform is free\n for the enter motion, which scales out from the trigger side. */\nconst positionStyles: Record<PopoverPosition, string> = {\n top: \"bottom-full left-1/2 -translate-x-1/2 pb-2\",\n bottom: \"top-full left-1/2 -translate-x-1/2 pt-2\",\n left: \"right-full top-1/2 -translate-y-1/2 pr-2\",\n right: \"left-full top-1/2 -translate-y-1/2 pl-2\",\n};\n\nconst origin: Record<PopoverPosition, string> = {\n top: \"origin-bottom\",\n bottom: \"origin-top\",\n left: \"origin-right\",\n right: \"origin-left\",\n};\n\nconst enterFrom: Record<PopoverPosition, string> = {\n top: \"translate-y-1.5\",\n bottom: \"-translate-y-1.5\",\n left: \"translate-x-1.5\",\n right: \"-translate-x-1.5\",\n};\n\nexport function Popover({\n trigger,\n children,\n position = \"bottom\",\n className = \"\",\n}: PopoverProps) {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const [mounted, setMounted] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const uid = useId();\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n requestAnimationFrame(() => requestAnimationFrame(() => setVisible(true)));\n } else {\n setVisible(false);\n const t = setTimeout(() => setMounted(false), 180);\n return () => clearTimeout(t);\n }\n }, [open]);\n\n useEffect(() => {\n function onOutside(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", onOutside);\n return () => document.removeEventListener(\"mousedown\", onOutside);\n }, []);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setOpen(false);\n ref.current?.querySelector<HTMLElement>(\"[data-popover-trigger] button, [data-popover-trigger] a\")?.focus();\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open]);\n\n return (\n <div ref={ref} className={[\"relative inline-flex\", className].join(\" \")}>\n <div data-popover-trigger onClick={() => setOpen((v) => !v)} className=\"inline-flex cursor-pointer\">\n {React.isValidElement(trigger)\n ? React.cloneElement(trigger as React.ReactElement<Record<string, unknown>>, {\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? `${uid}-popover` : undefined,\n })\n : trigger}\n </div>\n {mounted && (\n <div className={[\"absolute z-50\", positionStyles[position]].join(\" \")}>\n <div\n ref={panelRef}\n id={`${uid}-popover`}\n role=\"dialog\"\n className={[\n \"min-w-[220px] rounded-[16px] p-1.5\",\n \"transition-[opacity,transform,scale,translate] duration-200 ease-[var(--ease-spring)]\",\n origin[position],\n visible\n ? \"opacity-100 scale-100 translate-x-0 translate-y-0\"\n : [\"opacity-0 scale-[0.96]\", enterFrom[position]].join(\" \"),\n ].join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--overlay-shadow)\" }}\n >\n <div\n className=\"bg-white rounded-[11px] p-3.5 text-[13px] text-neutral-600 leading-relaxed\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n {children}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\n\ninterface ProgressProps {\n value: number;\n max?: number;\n label?: string;\n showValue?: boolean;\n className?: string;\n}\n\nexport function Progress({\n value,\n max = 100,\n label,\n showValue = false,\n className = \"\",\n}: ProgressProps) {\n const pct = Math.min(Math.max((value / max) * 100, 0), 100);\n const [displayed, setDisplayed] = useState(0);\n const t = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n t.current = setTimeout(() => setDisplayed(pct), 80);\n return () => { if (t.current) clearTimeout(t.current); };\n }, [pct]);\n\n return (\n <div className={[\"flex flex-col gap-2\", className].join(\" \")}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between gap-4\">\n {label && (\n <span className=\"text-[13px] font-medium text-neutral-700 truncate\">{label}</span>\n )}\n {showValue && (\n <span aria-hidden className=\"text-[12px] tabular-nums text-neutral-500 shrink-0\">\n {Math.round(pct)}%\n </span>\n )}\n </div>\n )}\n <div\n className=\"w-full h-2 rounded-full p-px overflow-hidden\"\n role=\"progressbar\"\n aria-label={label}\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n style={{ background: \"var(--well)\", boxShadow: \"var(--well-shadow)\" }}\n >\n <div\n className=\"h-full rounded-full relative overflow-hidden\"\n style={{\n width: `${displayed}%`,\n /* Never collapses below a pill, so 1% still reads as started */\n minWidth: displayed > 0 ? 6 : 0,\n background: \"var(--face-dark)\",\n boxShadow: \"inset 0 2px 3px -2px rgba(255,255,255,0.135), 0 0 2px rgba(0,0,0,0.2)\",\n transition: \"width 700ms var(--ease-out-soft)\",\n }}\n />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { CardShell } from \"./CardShell\";\n\ninterface QuoteCardProps {\n quote: string;\n author: string;\n role?: string;\n avatarSrc?: string;\n theme?: \"light\" | \"dark\";\n className?: string;\n}\n\n/* Built on CardShell: the quote owns the face; who said it sits on the rail,\n so a stretched card grows the face instead of opening a gap mid-card. */\nexport function QuoteCard({\n quote,\n author,\n role,\n avatarSrc,\n theme = \"light\",\n className = \"\",\n}: QuoteCardProps) {\n const dark = theme === \"dark\";\n // Handles like \"@name\" shouldn't render an \"@\" monogram\n const initial = (author.match(/[\\p{L}\\p{N}]/u)?.[0] ?? \"?\").toLowerCase();\n\n const rail = (\n <figcaption className=\"flex items-center gap-2.5 min-w-0\">\n {avatarSrc ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={avatarSrc}\n alt=\"\"\n loading=\"lazy\"\n className=\"w-7 h-7 rounded-full object-cover shrink-0\"\n style={{ boxShadow: dark ? \"0 0 0 0.5px rgba(255,255,255,0.084)\" : \"0 0 0 0.5px rgba(17,17,17,0.048)\" }}\n />\n ) : (\n <span\n aria-hidden\n className={[\n \"w-7 h-7 rounded-full flex items-center justify-center text-[11.5px] font-semibold shrink-0\",\n dark ? \"text-white\" : \"text-neutral-700\",\n ].join(\" \")}\n style={{\n background: dark ? \"var(--tile-dark)\" : \"var(--face-light)\",\n boxShadow: dark ? \"var(--tile-dark-shadow)\" : \"var(--tile-light-shadow)\",\n }}\n >\n {initial}\n </span>\n )}\n <span className=\"min-w-0 truncate\">\n <cite\n className={[\n \"not-italic font-semibold tracking-[-0.008em]\",\n dark ? \"text-white\" : \"text-neutral-900\",\n ].join(\" \")}\n >\n {author}\n </cite>\n {role && <span> · {role}</span>}\n </span>\n </figcaption>\n );\n\n return (\n <CardShell as=\"figure\" theme={theme} className={className} rail={rail} railKind=\"text\">\n <div className=\"flex-1 flex flex-col p-8\">\n <svg\n aria-hidden\n width=\"22\"\n height=\"17\"\n viewBox=\"0 0 56 44\"\n className={[\"shrink-0 mb-auto\", dark ? \"text-white/25\" : \"text-neutral-300\"].join(\" \")}\n >\n <path\n fill=\"currentColor\"\n d=\"M0 44V27.5C0 12.6 7.4 3.4 22.2 0l2.6 6.2C16.9 8.7 13 13.7 12.6 21H24v23H0zm32 0V27.5C32 12.6 39.4 3.4 54.2 0l2.6 6.2C48.9 8.7 45 13.7 44.6 21H56v23H32z\"\n />\n </svg>\n <blockquote\n className={[\n \"m-0 pt-8 text-[19px] leading-[1.55] tracking-[-0.015em] text-pretty\",\n dark ? \"text-neutral-50\" : \"text-neutral-900\",\n ].join(\" \")}\n >\n {quote}\n </blockquote>\n </div>\n </CardShell>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\n\ninterface RadioOption {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\ninterface RadioGroupProps {\n options: RadioOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n name?: string;\n className?: string;\n}\n\n/* Every radio is a sunken field; the selection is one dark face that\n flows between them. Its leading edge leaves first and the trailing edge\n catches up on a spring, so it stretches across the gap like a drop of\n liquid and settles into the new well. One Tab stop for the group,\n arrows move between options (ARIA radio group pattern). */\ninterface Blob {\n top: number;\n bottom: number;\n left: number;\n size: number;\n dir: -1 | 0 | 1;\n}\n\nconst LEAD = \"260ms var(--ease-out-soft)\";\nconst TRAIL = \"480ms cubic-bezier(0.34, 1.25, 0.64, 1) 50ms\";\nexport function RadioGroup({\n options,\n value,\n defaultValue = \"\",\n onChange,\n name,\n className = \"\",\n}: RadioGroupProps) {\n const [internal, setInternal] = useState(defaultValue);\n const selected = value !== undefined ? value : internal;\n const uid = useId();\n const refs = useRef<(HTMLButtonElement | null)[]>([]);\n const groupRef = useRef<HTMLDivElement>(null);\n const prevIndex = useRef(-1);\n const [blob, setBlob] = useState<Blob | null>(null);\n\n const select = (val: string, disabled?: boolean) => {\n if (disabled) return;\n setInternal(val);\n onChange?.(val);\n };\n\n const enabled = options.map((o, i) => (o.disabled ? -1 : i)).filter((i) => i >= 0);\n const selectedIndex = options.findIndex((o) => o.value === selected);\n const tabStop = selectedIndex >= 0 ? selectedIndex : enabled[0];\n\n const measure = (dir: Blob[\"dir\"]) => {\n const group = groupRef.current;\n const el = refs.current[prevIndex.current];\n if (!group || !el) return setBlob(null);\n setBlob({\n top: el.offsetTop,\n bottom: group.clientHeight - el.offsetTop - el.offsetHeight,\n left: el.offsetLeft,\n size: el.offsetWidth,\n dir,\n });\n };\n\n useLayoutEffect(() => {\n const prev = prevIndex.current;\n prevIndex.current = selectedIndex;\n measure(prev < 0 || selectedIndex < 0 ? 0 : selectedIndex > prev ? 1 : selectedIndex < prev ? -1 : 0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedIndex]);\n\n // Rewrapped descriptions move the wells; follow them without animating.\n // An observer reports once on attach — that one is skipped, or it would\n // cut short a move already under way.\n useEffect(() => {\n const group = groupRef.current;\n if (!group) return;\n let attached = false;\n const ro = new ResizeObserver(() => {\n if (attached) measure(0);\n attached = true;\n });\n ro.observe(group);\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const move = (from: number, step: 1 | -1) => {\n const at = enabled.indexOf(from);\n const next = enabled[(at + step + enabled.length) % enabled.length];\n refs.current[next]?.focus();\n select(options[next].value);\n };\n\n return (\n <div\n ref={groupRef}\n role=\"radiogroup\"\n aria-label={name}\n className={[\"relative flex flex-col gap-1\", className].join(\" \")}\n >\n {options.map((opt, i) => {\n const active = selected === opt.value;\n return (\n <div\n key={opt.value}\n onClick={() => select(opt.value, opt.disabled)}\n className={[\n \"flex items-center justify-between gap-4 select-none py-1.5\",\n opt.disabled ? \"opacity-40 pointer-events-none\" : \"cursor-pointer group/radio\",\n ].join(\" \")}\n >\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span id={`${uid}-${i}-label`} className=\"text-[13px] font-medium text-neutral-900 leading-snug\">\n {opt.label}\n </span>\n {opt.description && (\n <span id={`${uid}-${i}-desc`} className=\"text-[12px] text-neutral-500 leading-relaxed\">\n {opt.description}\n </span>\n )}\n </div>\n\n {/* Clicks bubble to the row, so the control itself has no onClick */}\n <button\n ref={(el) => {\n refs.current[i] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-labelledby={`${uid}-${i}-label`}\n aria-describedby={opt.description ? `${uid}-${i}-desc` : undefined}\n disabled={opt.disabled}\n tabIndex={i === tabStop ? 0 : -1}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowRight\") {\n e.preventDefault();\n move(i, 1);\n } else if (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\") {\n e.preventDefault();\n move(i, -1);\n }\n }}\n className={[\n \"shrink-0 w-[22px] h-[22px] rounded-full cursor-pointer\",\n \"transition-[box-shadow] duration-200 ease-out\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-neutral-900\",\n active ? \"\" : \"group-hover/radio:[box-shadow:var(--field-shadow-hover)]\",\n ].join(\" \")}\n style={{ background: \"var(--field)\", boxShadow: \"var(--field-shadow)\" }}\n />\n </div>\n );\n })}\n\n {blob && (\n <>\n <span\n aria-hidden\n className=\"pointer-events-none absolute rounded-full\"\n style={{\n top: blob.top,\n bottom: blob.bottom,\n left: blob.left,\n width: blob.size,\n background: \"var(--face-dark)\",\n boxShadow: \"var(--face-dark-shadow)\",\n transition:\n blob.dir === 0\n ? \"none\"\n : blob.dir > 0\n ? `top ${TRAIL}, bottom ${LEAD}`\n : `top ${LEAD}, bottom ${TRAIL}`,\n }}\n />\n {/* The dot rides the trailing edge's spring, arriving as it settles */}\n <span\n aria-hidden\n className=\"pointer-events-none absolute w-2 h-2 rounded-full bg-white\"\n style={{\n top: blob.top + (blob.size - 8) / 2,\n left: blob.left + (blob.size - 8) / 2,\n boxShadow: \"0 1px 1px rgba(0,0,0,0.3)\",\n transition: blob.dir === 0 ? \"none\" : `top ${TRAIL}`,\n }}\n />\n </>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useCallback, useRef } from \"react\";\n\nexport interface ReactionItem {\n emoji: string;\n label: string;\n count: number;\n active?: boolean;\n}\n\ninterface ReactionBarProps {\n reactions?: ReactionItem[];\n className?: string;\n}\n\nconst defaultReactions: ReactionItem[] = [\n { emoji: \"👏\", label: \"clap\", count: 0 },\n { emoji: \"❤️\", label: \"love\", count: 0 },\n { emoji: \"🔥\", label: \"fire\", count: 0 },\n { emoji: \"💡\", label: \"insightful\", count: 0 },\n { emoji: \"🎉\", label: \"celebrate\", count: 0 },\n];\n\nexport function ReactionBar({\n reactions: initialReactions,\n className = \"\",\n}: ReactionBarProps) {\n const [reactions, setReactions] = useState<ReactionItem[]>(\n initialReactions ?? defaultReactions\n );\n const [animatingKey, setAnimatingKey] = useState<string | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleClick = useCallback(\n (index: number) => {\n setReactions((prev) =>\n prev.map((r, i) => {\n if (i !== index) return r;\n return {\n ...r,\n active: !r.active,\n count: r.active ? r.count - 1 : r.count + 1,\n };\n })\n );\n\n const key = reactions[index].label;\n setAnimatingKey(key);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => setAnimatingKey(null), 300);\n },\n [reactions]\n );\n\n return (\n <div\n className={[\"flex flex-wrap gap-2\", className].filter(Boolean).join(\" \")}\n >\n {reactions.map((reaction, index) => {\n const isAnimating = animatingKey === reaction.label;\n return (\n <button\n key={reaction.label}\n type=\"button\"\n onClick={() => handleClick(index)}\n aria-pressed={!!reaction.active}\n aria-label={`${reaction.label}, ${reaction.count}`}\n className={[\n \"inline-flex items-center gap-1.5 rounded-[11px] pl-2.5 pr-3 py-[7px] text-[13px] font-medium cursor-pointer\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-neutral-900\",\n reaction.active ? \"text-white\" : \"text-neutral-600 hover:text-neutral-900\",\n ].join(\" \")}\n style={{\n /* Off is a raised face; on is the dark face — pressed in and lit */\n background: reaction.active ? \"var(--face-dark)\" : \"var(--face-light)\",\n boxShadow: reaction.active ? \"var(--face-dark-shadow)\" : \"var(--face-light-shadow)\",\n textShadow: reaction.active ? \"0 -1px 0 rgba(0,0,0,0.4)\" : \"0 1px 0 rgba(255,255,255,0.9)\",\n transform: isAnimating ? \"scale(1.08)\" : \"scale(1)\",\n transition:\n \"transform 250ms var(--ease-spring), color 200ms ease, box-shadow 200ms ease\",\n }}\n >\n <span aria-hidden className=\"text-[15px] leading-none\">{reaction.emoji}</span>\n <span\n className=\"tabular-nums leading-none\"\n style={{\n transform: isAnimating ? \"scale(1.15)\" : \"scale(1)\",\n display: \"inline-block\",\n transition:\n \"transform 250ms cubic-bezier(0.34, 1.4, 0.64, 1)\",\n }}\n >\n {reaction.count}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\n\ninterface ReadingProgressProps {\n className?: string;\n}\n\nexport function ReadingProgress({ className = \"\" }: ReadingProgressProps) {\n const [progress, setProgress] = useState(0);\n\n useEffect(() => {\n let frame = 0;\n const measure = () => {\n frame = 0;\n const scrollTop = window.scrollY;\n const docHeight = document.documentElement.scrollHeight - window.innerHeight;\n setProgress(docHeight > 0 ? (scrollTop / docHeight) * 100 : 0);\n };\n // One measurement per frame, however fast the scroll events arrive\n const update = () => {\n if (!frame) frame = requestAnimationFrame(measure);\n };\n\n window.addEventListener(\"scroll\", update, { passive: true });\n window.addEventListener(\"resize\", update);\n measure();\n return () => {\n window.removeEventListener(\"scroll\", update);\n window.removeEventListener(\"resize\", update);\n if (frame) cancelAnimationFrame(frame);\n };\n }, []);\n\n return (\n <div\n aria-hidden\n className={[\"fixed top-0 left-0 right-0 z-[80] h-[2px] bg-transparent pointer-events-none\", className].join(\" \")}\n >\n <div\n className=\"h-full w-full origin-left\"\n style={{\n // transform instead of width: no layout on every scroll frame\n transform: `scaleX(${progress / 100})`,\n background: \"linear-gradient(90deg, #0a0a0a 0%, #262626 100%)\",\n boxShadow: \"0 0 8px rgba(17,17,17,0.3)\",\n }}\n />\n </div>\n );\n}\n","import React from \"react\";\n\ninterface ReadingTimeProps {\n minutes: number;\n className?: string;\n}\n\nexport function ReadingTime({ minutes, className = \"\" }: ReadingTimeProps) {\n return (\n <span\n className={[\n \"inline-flex items-center gap-1.5 text-[12px] font-medium text-neutral-500\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral-400\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n {minutes} min read\n </span>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useId } from \"react\";\n\ninterface SelectOption {\n value: string;\n label: string;\n}\n\ninterface SelectProps {\n options: SelectOption[];\n value?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n label?: string;\n hint?: string;\n disabled?: boolean;\n fullWidth?: boolean;\n className?: string;\n}\n\n/* The closed select is a sunken field like Input; the open list is a\n floating panel like DropdownMenu. Keyboard follows the ARIA listbox\n pattern: arrows move, Enter picks, Escape backs out. */\nexport function Select({\n options,\n value,\n onChange,\n placeholder = \"select…\",\n label,\n hint,\n disabled = false,\n fullWidth = false,\n className = \"\",\n}: SelectProps) {\n const [open, setOpen] = useState(false);\n // The list stays mounted while it folds away, and only unfolds once painted\n const [mounted, setMounted] = useState(false);\n const [entered, setEntered] = useState(false);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [active, setActive] = useState(0);\n const ref = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const uid = useId();\n\n const selectedIndex = options.findIndex((o) => o.value === value);\n const selected = options[selectedIndex];\n\n const close = () => {\n setOpen(false);\n setEntered(false);\n if (closeTimer.current) clearTimeout(closeTimer.current);\n closeTimer.current = setTimeout(() => setMounted(false), 200);\n };\n\n useEffect(() => () => {\n if (closeTimer.current) clearTimeout(closeTimer.current);\n }, []);\n\n useEffect(() => {\n function onOutside(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n close();\n }\n }\n document.addEventListener(\"mousedown\", onOutside);\n return () => document.removeEventListener(\"mousedown\", onOutside);\n }, []);\n\n useEffect(() => {\n if (!open) return;\n listRef.current\n ?.querySelector(`[data-index=\"${active}\"]`)\n ?.scrollIntoView({ block: \"nearest\" });\n }, [open, active]);\n\n const openList = () => {\n setActive(selectedIndex >= 0 ? selectedIndex : 0);\n if (closeTimer.current) clearTimeout(closeTimer.current);\n setOpen(true);\n setMounted(true);\n requestAnimationFrame(() => requestAnimationFrame(() => setEntered(true)));\n };\n\n const pick = (index: number) => {\n const opt = options[index];\n if (!opt) return;\n onChange?.(opt.value);\n close();\n buttonRef.current?.focus();\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!open) {\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \" \"].includes(e.key)) {\n e.preventDefault();\n openList();\n }\n return;\n }\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setActive((i) => Math.min(i + 1, options.length - 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setActive((i) => Math.max(i - 1, 0));\n break;\n case \"Home\":\n e.preventDefault();\n setActive(0);\n break;\n case \"End\":\n e.preventDefault();\n setActive(options.length - 1);\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n pick(active);\n break;\n case \"Escape\":\n e.preventDefault();\n close();\n break;\n case \"Tab\":\n close();\n break;\n default:\n // Type-ahead: jump to the first option starting with the key\n if (e.key.length === 1) {\n const k = e.key.toLowerCase();\n const hit = options.findIndex((o) => o.label.toLowerCase().startsWith(k));\n if (hit >= 0) setActive(hit);\n }\n }\n };\n\n return (\n <div className={[\"flex flex-col gap-1.5\", fullWidth ? \"w-full\" : \"\"].join(\" \")}>\n {label && (\n <span\n id={`${uid}-label`}\n className=\"text-[12.5px] font-medium text-neutral-700 tracking-[-0.005em]\"\n >\n {label}\n </span>\n )}\n\n <div\n ref={ref}\n className={[\"relative\", fullWidth ? \"w-full\" : \"inline-block\", className].join(\" \")}\n >\n <button\n ref={buttonRef}\n type=\"button\"\n disabled={disabled}\n onClick={() => (open ? close() : openList())}\n onKeyDown={onKeyDown}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? `${uid}-list` : undefined}\n aria-labelledby={label ? `${uid}-label ${uid}-value` : undefined}\n aria-activedescendant={open ? `${uid}-opt-${active}` : undefined}\n className={[\n \"group/select relative isolate inline-flex items-center justify-between gap-3 w-full\",\n \"rounded-xl px-4 py-3 text-[13.5px] font-medium text-neutral-900\",\n \"field cursor-pointer select-none\",\n \"focus:outline-none disabled:opacity-40 disabled:pointer-events-none\",\n ].join(\" \")}\n data-open={open || undefined}\n >\n <span\n id={`${uid}-value`}\n className={[\n \"relative z-10 truncate\",\n selected ? \"text-neutral-900\" : \"text-neutral-400 font-normal\",\n ].join(\" \")}\n >\n {selected ? selected.label : placeholder}\n </span>\n <svg\n aria-hidden\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n className={[\n \"relative z-10 shrink-0 transition-[transform,color] duration-300 ease-[var(--ease-spring)]\",\n open ? \"rotate-180 text-neutral-900\" : \"text-neutral-400 group-hover/select:text-neutral-700\",\n ].join(\" \")}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n\n {open && (\n <span aria-hidden className=\"pointer-events-none absolute inset-0 z-5 rounded-xl overflow-hidden\">\n <span\n className=\"block absolute inset-y-0 w-[30%] -left-[30%] animate-input-shimmer\"\n style={{\n background:\n \"linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.55) 50%, transparent 100%)\",\n }}\n />\n </span>\n )}\n </button>\n\n {mounted && (\n <div\n className=\"absolute left-0 z-50 mt-2 p-1.5 rounded-[16px] origin-top\"\n style={{\n minWidth: \"100%\",\n maxWidth: \"min(420px, calc(100vw - 2rem))\",\n width: \"max-content\",\n background: \"var(--panel-bezel)\",\n boxShadow: \"var(--overlay-shadow)\",\n /* Unfolds downward out of the field: a clip reveals it top to\n bottom while it fades and settles. The clip's sides reach\n past the panel so its shadow is never cut off. */\n opacity: entered ? 1 : 0,\n transform: entered ? \"none\" : \"translateY(-4px) scale(0.98)\",\n clipPath: entered ? \"inset(-48px -48px -48px -48px)\" : \"inset(-48px -48px 55% -48px)\",\n transition: entered\n ? \"opacity 180ms ease-out, transform 360ms var(--ease-out-soft), clip-path 360ms var(--ease-out-soft)\"\n : \"opacity 160ms ease-in, transform 200ms ease-in, clip-path 200ms ease-in\",\n }}\n >\n <div\n ref={listRef}\n id={`${uid}-list`}\n role=\"listbox\"\n aria-labelledby={label ? `${uid}-label` : undefined}\n className=\"bg-white rounded-[11px] p-1 flex flex-col gap-0.5 max-h-72 overflow-y-auto scroll-thin\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n {options.map((opt, i) => {\n const isSelected = opt.value === value;\n const isActive = i === active;\n return (\n <div\n key={opt.value}\n id={`${uid}-opt-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={isSelected}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => pick(i)}\n onMouseMove={() => setActive(i)}\n className={[\n \"flex items-center justify-between gap-3 w-full px-2.5 py-2 text-[13px] rounded-[8px] cursor-pointer\",\n \"transition-colors duration-100\",\n isSelected ? \"font-medium text-neutral-900\" : \"text-neutral-600\",\n isActive ? \"bg-neutral-100/80 text-neutral-900\" : \"\",\n ].join(\" \")}\n style={{\n animation: `select-option-in 300ms var(--ease-out-soft) ${40 + i * 22}ms both`,\n }}\n >\n <span className=\"whitespace-nowrap\">{opt.label}</span>\n {isSelected && (\n <svg\n aria-hidden\n className=\"shrink-0 text-neutral-900\"\n width=\"13\"\n height=\"13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n\n {hint && <p className=\"text-[11.5px] text-neutral-500 mt-0.5\">{hint}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { ButtonGroup } from \"./ButtonGroup\";\n\ninterface ShareButtonsProps {\n url?: string;\n title?: string;\n className?: string;\n}\n\n\nfunction LinkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg width=\"13\" height=\"13\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n );\n}\n\nfunction LinkedInIcon() {\n return (\n <svg width=\"13\" height=\"13\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.063 2.063 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n );\n}\n\nexport function ShareButtons({\n url,\n title,\n className = \"\",\n}: ShareButtonsProps) {\n const [copied, setCopied] = useState(false);\n\n const shareUrl = url ?? (typeof window !== \"undefined\" ? window.location.href : \"\");\n const shareTitle = title ?? \"\";\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback silently\n }\n }, [shareUrl]);\n\n const handleTwitter = useCallback(() => {\n const params = new URLSearchParams({\n text: shareTitle,\n url: shareUrl,\n });\n window.open(\n `https://x.com/intent/tweet?${params.toString()}`,\n \"_blank\",\n \"noopener,noreferrer\"\n );\n }, [shareUrl, shareTitle]);\n\n const handleLinkedIn = useCallback(() => {\n const params = new URLSearchParams({\n url: shareUrl,\n });\n window.open(\n `https://www.linkedin.com/sharing/share-offsite/?${params.toString()}`,\n \"_blank\",\n \"noopener,noreferrer\"\n );\n }, [shareUrl]);\n\n const keys = [\n {\n label: copied ? \"Link copied\" : \"Copy link\",\n onClick: handleCopy as () => void,\n content: (\n <>\n <span key={String(copied)} className={[\"animate-checkbox-in\", copied ? \"text-emerald-600\" : \"\"].join(\" \")}>\n {copied ? <CheckIcon /> : <LinkIcon />}\n </span>\n <span className=\"w-[62px] text-left\">{copied ? \"copied\" : \"copy link\"}</span>\n </>\n ),\n wide: true,\n },\n { label: \"Share on X\", onClick: handleTwitter, content: <XIcon />, wide: false },\n { label: \"Share on LinkedIn\", onClick: handleLinkedIn, content: <LinkedInIcon />, wide: false },\n ];\n\n return (\n <div className={className}>\n <p className=\"text-[12px] font-medium text-neutral-500 lowercase mb-3\">\n Share\n </p>\n <ButtonGroup label=\"Share\" items={keys} />\n <span aria-live=\"polite\" className=\"sr-only\">{copied ? \"Link copied to clipboard\" : \"\"}</span>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useLayoutEffect } from \"react\";\n\ninterface SidebarItem {\n key: string;\n label: string;\n icon?: React.ReactNode;\n badge?: string | number;\n disabled?: boolean;\n}\n\ninterface SidebarSection {\n title?: string;\n items: SidebarItem[];\n}\n\ninterface SidebarHeader {\n logo?: React.ReactNode;\n title: string;\n subtitle?: string;\n}\n\ninterface SidebarProps {\n sections: SidebarSection[];\n header?: SidebarHeader;\n defaultActive?: string;\n active?: string;\n onSelect?: (key: string) => void;\n className?: string;\n}\n\nexport function Sidebar({\n sections,\n header,\n defaultActive = \"\",\n active,\n onSelect,\n className = \"\",\n}: SidebarProps) {\n const [internal, setInternal] = useState(defaultActive);\n const current = active !== undefined ? active : internal;\n const [pill, setPill] = useState({ top: 0, height: 0, ready: false });\n const navRef = useRef<HTMLElement>(null);\n const btnRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n\n const measurePill = (key: string) => {\n const btn = btnRefs.current[key];\n const nav = navRef.current;\n if (!btn || !nav) return;\n const nr = nav.getBoundingClientRect();\n const br = btn.getBoundingClientRect();\n setPill({ top: br.top - nr.top, height: br.height, ready: true });\n };\n\n useLayoutEffect(() => { measurePill(current); }, []);\n useEffect(() => { measurePill(current); }, [current]);\n\n useEffect(() => {\n const ro = new ResizeObserver(() => measurePill(current));\n if (navRef.current) ro.observe(navRef.current);\n return () => ro.disconnect();\n }, [current]);\n\n const handleSelect = (key: string, disabled?: boolean) => {\n if (disabled) return;\n setInternal(key);\n onSelect?.(key);\n };\n\n return (\n <div\n className={[\"rounded-[20px] p-1.5\", className].join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <div className=\"bg-white rounded-[15px] overflow-hidden\" style={{ boxShadow: \"var(--panel-face-shadow)\" }}>\n {header && (\n <div className=\"px-3 py-3 border-b border-neutral-100 flex items-center gap-2.5\">\n {header.logo && (\n <div\n className=\"w-7 h-7 rounded-[8px] flex items-center justify-center shrink-0 text-white\"\n style={{ background: \"var(--face-dark)\", boxShadow: \"var(--face-dark-shadow)\" }}\n >\n {header.logo}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[13px] font-semibold text-neutral-900 leading-none truncate\">{header.title}</p>\n {header.subtitle && (\n <p className=\"text-[11px] text-neutral-400 mt-0.5 leading-none truncate\">{header.subtitle}</p>\n )}\n </div>\n <button\n type=\"button\"\n aria-label=\"Switch workspace\"\n className=\"shrink-0 w-6 h-6 flex items-center justify-center text-neutral-400 hover:text-neutral-900 transition-colors cursor-pointer rounded-[7px] hover:bg-neutral-100\"\n >\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 9l4-4 4 4M8 15l4 4 4-4\" />\n </svg>\n </button>\n </div>\n )}\n\n <nav ref={navRef} aria-label={header?.title ?? \"Sidebar\"} className=\"relative p-2 flex flex-col gap-4\">\n {pill.ready && (\n <span\n aria-hidden\n className=\"absolute left-2 right-2 rounded-[11px] pointer-events-none z-0\"\n style={{\n top: pill.top,\n height: pill.height,\n background: \"var(--face-dark)\",\n boxShadow: \"var(--face-dark-shadow)\",\n transition: \"top 300ms var(--ease-spring), height 300ms var(--ease-spring)\",\n }}\n />\n )}\n\n {sections.map((section, si) => (\n <div key={si} className=\"flex flex-col gap-0.5\">\n {section.title && (\n <p className=\"relative z-10 px-2.5 pt-1 pb-1.5 text-[11.5px] font-medium text-neutral-400 lowercase\">\n {section.title}\n </p>\n )}\n {section.items.map((item) => {\n const isActive = current === item.key;\n return (\n <button\n key={item.key}\n ref={(el) => { btnRefs.current[item.key] = el; }}\n type=\"button\"\n onClick={() => handleSelect(item.key, item.disabled)}\n disabled={item.disabled}\n aria-current={isActive ? \"page\" : undefined}\n className={[\n \"relative z-10 w-full flex items-center gap-2.5 px-2.5 py-2 rounded-[11px] text-[13px] font-medium text-left\",\n \"transition-colors duration-200 cursor-pointer\",\n \"disabled:opacity-35 disabled:pointer-events-none\",\n isActive\n ? \"text-white\"\n : \"text-neutral-600 hover:text-neutral-900 hover:bg-neutral-100/80\",\n ].join(\" \")}\n >\n {item.icon && (\n <span\n className={[\n \"shrink-0 w-[22px] h-[22px] rounded-md flex items-center justify-center transition-colors duration-200\",\n isActive\n ? \"bg-white/12 shadow-[inset_0_1px_0_rgba(255,255,255,0.12)]\"\n : \"text-neutral-500 [background:var(--face-light)] [box-shadow:var(--face-light-shadow)]\",\n ].join(\" \")}\n >\n {item.icon}\n </span>\n )}\n\n <span className=\"flex-1 truncate\">{item.label}</span>\n\n {item.badge !== undefined && (\n <span\n className={[\n \"shrink-0 text-[11px] font-medium px-1.5 py-0.5 rounded-md tabular-nums leading-none transition-colors duration-200\",\n isActive\n ? \"bg-white/20 text-white/80\"\n : \"bg-neutral-100 text-neutral-500\",\n ].join(\" \")}\n >\n {item.badge}\n </span>\n )}\n </button>\n );\n })}\n </div>\n ))}\n </nav>\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\ntype SkeletonVariant = \"text\" | \"circle\" | \"rect\" | \"card\";\n\ninterface SkeletonProps {\n variant?: SkeletonVariant;\n width?: string | number;\n height?: string | number;\n lines?: number;\n className?: string;\n /** What is loading, for screen readers */\n label?: string;\n}\n\n/* Placeholders are empty sunken wells — the shape of what will fill them —\n with a light sweep travelling across, rather than a blink. */\nconst base = \"skeleton-sheen relative overflow-hidden rounded-[8px]\";\nconst well: React.CSSProperties = { background: \"var(--well)\", boxShadow: \"var(--well-shadow)\" };\n\nexport function Skeleton({\n variant = \"text\",\n width,\n height,\n lines = 1,\n className = \"\",\n label = \"Loading\",\n}: SkeletonProps) {\n const a11y = { role: \"status\", \"aria-busy\": true, \"aria-label\": label } as const;\n\n if (variant === \"circle\") {\n return (\n <div\n {...a11y}\n className={[base, \"rounded-full\", className].join(\" \")}\n style={{ ...well, width: width ?? 40, height: height ?? 40 }}\n />\n );\n }\n\n if (variant === \"card\") {\n return (\n <div\n {...a11y}\n className={[\"rounded-[20px] p-1.5\", className].join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <div className=\"bg-white rounded-[15px] p-1.5\" style={{ boxShadow: \"var(--panel-face-shadow)\" }}>\n <div className={[base, \"w-full rounded-[11px]\"].join(\" \")} style={{ ...well, height: height ?? 160 }} />\n <div className=\"px-3.5 pt-4 pb-3.5 flex flex-col gap-2.5\">\n <div className={[base, \"h-3.5 w-3/5\"].join(\" \")} style={well} />\n <div className={[base, \"h-2.5 w-full\"].join(\" \")} style={well} />\n <div className={[base, \"h-2.5 w-4/5\"].join(\" \")} style={well} />\n </div>\n </div>\n </div>\n );\n }\n\n if (variant === \"rect\") {\n return (\n <div\n {...a11y}\n className={[base, \"rounded-[12px]\", className].join(\" \")}\n style={{ ...well, width: width ?? \"100%\", height: height ?? 80 }}\n />\n );\n }\n\n return (\n <div {...a11y} className={[\"flex flex-col gap-2\", className].join(\" \")}>\n {Array.from({ length: lines }).map((_, i) => (\n <div\n key={i}\n className={[base, \"h-2.5 rounded-full\"].join(\" \")}\n style={{\n ...well,\n width: width ?? (i === lines - 1 && lines > 1 ? \"60%\" : \"100%\"),\n }}\n />\n ))}\n </div>\n );\n}\n","import React from \"react\";\nimport { CardShell } from \"./CardShell\";\n\ninterface SpotlightCardProps {\n title: string;\n subtitle?: string;\n eyebrow?: string;\n icon?: React.ReactNode;\n actions?: React.ReactNode;\n children?: React.ReactNode;\n theme?: \"light\" | \"dark\";\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nconst paddingBySize: Record<NonNullable<SpotlightCardProps[\"size\"]>, string> = {\n // Feature cards pad 32px whatever their size; only the type scales\n sm: \"p-6\",\n md: \"p-8\",\n lg: \"p-8\",\n};\n\nconst titleSizeBySize: Record<\n NonNullable<SpotlightCardProps[\"size\"]>,\n string\n> = {\n sm: \"text-[20px]\",\n md: \"text-[26px]\",\n lg: \"text-[34px]\",\n};\n\nexport function SpotlightCard({\n title,\n subtitle,\n eyebrow,\n icon,\n actions,\n children,\n theme = \"dark\",\n size = \"md\",\n className = \"\",\n}: SpotlightCardProps) {\n const dark = theme === \"dark\";\n\n return (\n /* Built on CardShell: icon at the top of the face, words and actions\n settled at the bottom — the same rhythm as Card and QuoteCard. */\n <CardShell as=\"article\" theme={theme} className={className}>\n {/* Headline sits low on the face, so tall cards breathe above it, not below */}\n <div className={[\"relative flex-1 flex flex-col gap-3\", paddingBySize[size]].join(\" \")}>\n {icon && (\n <div\n className={[\n \"w-9 h-9 rounded-[11px] flex items-center justify-center mb-auto\",\n dark ? \"text-white\" : \"text-neutral-800\",\n ].join(\" \")}\n style={{\n background: dark ? \"var(--tile-dark)\" : \"var(--face-light)\",\n boxShadow: dark ? \"var(--tile-dark-shadow)\" : \"var(--tile-light-shadow)\",\n }}\n >\n {icon}\n </div>\n )}\n\n {eyebrow && (\n <p\n className={[\n // Without an icon above to push it down, the copy still sits low\n icon ? \"pt-8\" : \"mt-auto\",\n \"text-[14px] font-medium tracking-[-0.01em]\",\n dark ? \"text-neutral-400\" : \"text-neutral-500\",\n ].join(\" \")}\n >\n {eyebrow}\n </p>\n )}\n\n <h3\n className={[\n titleSizeBySize[size],\n !icon && !eyebrow ? \"mt-auto\" : \"\",\n \"font-medium leading-[1.12] tracking-[-0.03em] text-balance\",\n dark ? \"text-white\" : \"text-neutral-900\",\n ].join(\" \")}\n >\n {title}\n </h3>\n\n {subtitle && (\n <p\n className={[\n \"text-[15px] leading-[1.6] max-w-lg text-pretty\",\n dark ? \"text-neutral-400\" : \"text-neutral-600\",\n ].join(\" \")}\n >\n {subtitle}\n </p>\n )}\n\n {children}\n {actions && <div className=\"pt-4 flex items-center gap-2\">{actions}</div>}\n </div>\n </CardShell>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\n\ninterface StatProps {\n value: number | string;\n label: string;\n prefix?: string;\n suffix?: string;\n trend?: string;\n className?: string;\n}\n\nfunction useCountUp(target: number, duration = 800) {\n const [count, setCount] = useState(0);\n const raf = useRef<number | null>(null);\n\n useEffect(() => {\n if (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n raf.current = requestAnimationFrame(() => setCount(target));\n return () => { if (raf.current) cancelAnimationFrame(raf.current); };\n }\n let start: number | null = null;\n const step = (now: number) => {\n if (!start) start = now;\n const p = Math.min((now - start) / duration, 1);\n setCount(Math.round((1 - Math.pow(1 - p, 3)) * target));\n if (p < 1) raf.current = requestAnimationFrame(step);\n };\n raf.current = requestAnimationFrame(step);\n return () => { if (raf.current) cancelAnimationFrame(raf.current); };\n }, [target, duration]);\n\n return count;\n}\n\nexport function Stat({ value, label, prefix = \"\", suffix = \"\", trend, className = \"\" }: StatProps) {\n const isNum = typeof value === \"number\";\n const counted = useCountUp(isNum ? (value as number) : 0);\n const displayed = isNum ? counted : value;\n\n return (\n <div className={[\"flex flex-col gap-0.5\", className].join(\" \")}>\n <div className=\"flex items-baseline gap-1.5\">\n <span\n className=\"text-[32px] font-semibold text-neutral-900 leading-none tabular-nums\"\n style={{ letterSpacing: \"-0.03em\" }}\n >\n {prefix}{displayed}{suffix}\n </span>\n {trend && (\n <span className=\"text-[12px] text-neutral-500 font-medium\">{trend}</span>\n )}\n </div>\n <span className=\"text-[12px] text-neutral-500\">{label}</span>\n </div>\n );\n}\n\ninterface StatRowProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function StatRow({ children, className = \"\" }: StatRowProps) {\n const arr = React.Children.toArray(children);\n return (\n <div className={[\"grid grid-cols-2 gap-6 sm:flex sm:divide-x sm:divide-neutral-200 sm:gap-0\", className].join(\" \")}>\n {arr.map((child, i) => (\n <div\n key={i}\n className={[\n \"min-w-0\",\n i === 0 ? \"sm:pr-6\" : i === arr.length - 1 ? \"sm:pl-6\" : \"sm:px-6\",\n ].join(\" \")}\n >\n {child}\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useId, useRef, useState } from \"react\";\nimport { CardShell } from \"./CardShell\";\n\ntype StatTheme = \"light\" | \"dark\";\ntype DeltaDirection = \"up\" | \"down\" | \"neutral\";\n\ninterface StatCardProps {\n label: string;\n value: number;\n prefix?: string;\n suffix?: string;\n decimals?: number;\n delta?: { value: string; direction: DeltaDirection };\n hint?: string;\n sparkline?: number[];\n icon?: React.ReactNode;\n theme?: StatTheme;\n className?: string;\n}\n\nfunction useAnimatedNumber(target: number, duration: number) {\n const [v, setV] = useState(0);\n const prevRef = useRef(0);\n\n useEffect(() => {\n const from = prevRef.current;\n const delta = target - from;\n if (delta === 0) return;\n // Reduced motion: show the number, skip the count\n if (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n prevRef.current = target;\n const id = requestAnimationFrame(() => setV(target));\n return () => cancelAnimationFrame(id);\n }\n const start = performance.now();\n let raf = 0;\n const tick = (now: number) => {\n const t = Math.min(1, (now - start) / duration);\n const eased = 1 - Math.pow(1 - t, 3);\n setV(from + delta * eased);\n if (t < 1) {\n raf = requestAnimationFrame(tick);\n } else {\n prevRef.current = target;\n }\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [target, duration]);\n\n return v;\n}\n\nfunction Sparkline({ data, dark }: { data: number[]; dark?: boolean }) {\n const uid = useId();\n if (data.length < 2) return null;\n const W = 120;\n const H = 44;\n const P = 6;\n const max = Math.max(...data);\n const min = Math.min(...data);\n const range = max - min || 1;\n const step = (W - P * 2) / (data.length - 1);\n\n const pts = data.map((d, i) => {\n const x = P + i * step;\n const y = H - P - ((d - min) / range) * (H - P * 2);\n return [x, y] as const;\n });\n\n const line = pts\n .map(([x, y], i) => `${i === 0 ? \"M\" : \"L\"}${x.toFixed(1)},${y.toFixed(1)}`)\n .join(\" \");\n // The fill runs off both edges of the face so it reads as part of the surface\n const area = `M0,${pts[0][1].toFixed(1)} ${line.replace(/^M/, \"L\")} L${W},${pts[pts.length - 1][1].toFixed(1)} L${W},${H} L0,${H} Z`;\n\n const stroke = dark ? \"#ffffff\" : \"#171717\";\n const gradId = `spark-fade-${uid.replace(/:/g, \"\")}`;\n const [lx, ly] = pts[pts.length - 1];\n\n return (\n <div\n aria-hidden\n className=\"relative h-14\"\n // Fades in from the left so the line arrives rather than starts at a hard edge\n style={{\n maskImage: \"linear-gradient(90deg, transparent 0%, #000 18%)\",\n WebkitMaskImage: \"linear-gradient(90deg, transparent 0%, #000 18%)\",\n }}\n >\n <svg viewBox={`0 0 ${W} ${H}`} preserveAspectRatio=\"none\" className=\"absolute inset-0 w-full h-full overflow-visible\">\n <defs>\n <linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={dark ? 0.2 : 0.08} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <path d={area} fill={`url(#${gradId})`} />\n <path\n d={line}\n fill=\"none\"\n stroke={stroke}\n strokeOpacity={dark ? 0.85 : 0.9}\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n {/* The latest value, as a dot — drawn in HTML so it stays round when the SVG stretches */}\n <span\n className=\"absolute w-[7px] h-[7px] rounded-full -translate-x-1/2 -translate-y-1/2\"\n style={{\n left: `${(lx / W) * 100}%`,\n top: `${(ly / H) * 100}%`,\n background: stroke,\n boxShadow: dark ? \"0 0 0 3px rgba(255,255,255,0.14)\" : \"0 0 0 3px rgba(17,17,17,0.08)\",\n }}\n />\n </div>\n );\n}\n\nconst deltaTone: Record<DeltaDirection, { light: string; dark: string; label: string }> = {\n up: { light: \"text-emerald-700\", dark: \"text-emerald-400\", label: \"up\" },\n down: { light: \"text-red-600\", dark: \"text-red-400\", label: \"down\" },\n neutral: { light: \"text-neutral-600\", dark: \"text-neutral-300\", label: \"unchanged\" },\n};\n\nfunction DeltaArrow({ direction }: { direction: DeltaDirection }) {\n const d =\n direction === \"up\" ? \"M12 19V5m0 0l-6 6m6-6l6 6\" : direction === \"down\" ? \"M12 5v14m0 0l-6-6m6 6l6-6\" : \"M5 12h14m0 0l-6-6m6 6l-6 6\";\n return (\n <svg aria-hidden width=\"10\" height=\"10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={d} />\n </svg>\n );\n}\n\n/* Built on CardShell; the trend line bleeds off the bottom of the face\n like a chart on a screen. */\nexport function StatCard({\n label,\n value,\n prefix = \"\",\n suffix = \"\",\n decimals = 0,\n delta,\n hint,\n sparkline,\n icon,\n theme = \"light\",\n className = \"\",\n}: StatCardProps) {\n const animated = useAnimatedNumber(value, 900);\n const dark = theme === \"dark\";\n\n const formatter = new Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n const finalText = `${prefix}${formatter.format(value)}${suffix}`;\n\n const badge = delta && (\n <span\n aria-label={`${deltaTone[delta.direction].label} ${delta.value}`}\n className={[\n \"inline-flex items-center gap-1 h-6 px-2 rounded-[7px] text-[12px] font-medium tabular-nums shrink-0\",\n dark ? deltaTone[delta.direction].dark : deltaTone[delta.direction].light,\n ].join(\" \")}\n style={{\n background: dark ? \"var(--tile-dark)\" : \"var(--face-light)\",\n boxShadow: dark ? \"var(--tile-dark-shadow)\" : \"var(--tile-light-shadow)\",\n }}\n >\n <DeltaArrow direction={delta.direction} />\n {delta.value}\n </span>\n );\n\n /* Label and change share the top line — what it is, and which way it's\n going. The number carries the card; the hint qualifies it in a\n quieter voice right underneath. */\n return (\n <CardShell theme={theme} className={className}>\n <div className=\"px-6 pt-5 flex items-center justify-between gap-3 min-h-11\">\n <div className=\"flex items-center gap-2.5 min-w-0\">\n {icon && (\n <div\n aria-hidden\n className={[\n \"w-7 h-7 rounded-[9px] flex items-center justify-center shrink-0\",\n dark ? \"text-neutral-100\" : \"text-neutral-600\",\n ].join(\" \")}\n style={{\n background: dark ? \"var(--tile-dark)\" : \"var(--face-light)\",\n boxShadow: dark ? \"var(--tile-dark-shadow)\" : \"var(--tile-light-shadow)\",\n }}\n >\n {icon}\n </div>\n )}\n <p\n className={[\n \"text-[14px] font-medium tracking-[-0.01em] truncate\",\n dark ? \"text-neutral-300\" : \"text-neutral-700\",\n ].join(\" \")}\n >\n {label}\n </p>\n </div>\n {badge}\n </div>\n\n {/* Screen readers get the final value once, not every frame of the count */}\n <p className=\"sr-only\">{finalText}</p>\n <p\n aria-hidden\n className={[\n \"px-6 mt-5 text-[44px] font-semibold tabular-nums tracking-[-0.045em] leading-none\",\n dark ? \"text-white\" : \"text-neutral-900\",\n ].join(\" \")}\n >\n {prefix}\n {formatter.format(animated)}\n {/* Units are context, not the headline — set them smaller and quieter */}\n {suffix && (\n <span\n className={[\n \"ml-1 text-[17px] font-medium tracking-[-0.01em]\",\n dark ? \"text-neutral-500\" : \"text-neutral-400\",\n ].join(\" \")}\n >\n {suffix.trim()}\n </span>\n )}\n </p>\n {hint && (\n <p className={[\"px-6 mt-2.5 text-[13px] truncate\", dark ? \"text-neutral-500\" : \"text-neutral-500\"].join(\" \")}>\n {hint}\n </p>\n )}\n\n {/* The trend line bleeds to the face's edges, like a chart on a screen */}\n {sparkline && sparkline.length > 1 ? (\n <div className=\"mt-auto pt-6\">\n <Sparkline data={sparkline} dark={dark} />\n </div>\n ) : (\n <div className=\"pb-6\" />\n )}\n </CardShell>\n );\n}\n","import React from \"react\";\n\ninterface StepItem {\n label: string;\n description?: string;\n}\n\ninterface StepsProps {\n steps: StepItem[];\n current: number;\n className?: string;\n}\n\nfunction CheckIcon() {\n return (\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/* Upcoming steps are sunken (not yet filled in), done and current steps\n are dark raised faces; the current one also wears a soft halo. Each step owns an equal column, so labels get\n real width instead of being squeezed under a 32px circle. */\nexport function Steps({ steps, current, className = \"\" }: StepsProps) {\n return (\n <ol className={[\"flex items-start\", className].filter(Boolean).join(\" \")}>\n {steps.map((step, i) => {\n const isCompleted = i < current;\n const isCurrent = i === current;\n const reached = isCompleted || isCurrent;\n const isLast = i === steps.length - 1;\n\n return (\n <li\n key={i}\n aria-current={isCurrent ? \"step\" : undefined}\n className=\"relative flex-1 min-w-0 flex flex-col items-center text-center\"\n >\n {/* One groove per gap, running between the two circles' edges\n (columns are equal, so the next centre is exactly 100% away) */}\n {!isLast && (\n <span\n aria-hidden\n className=\"absolute top-[15px] h-1 -translate-y-1/2 rounded-full overflow-hidden\"\n style={{\n left: \"calc(50% + 25px)\",\n width: \"calc(100% - 50px)\",\n background: \"var(--well)\",\n boxShadow: \"var(--well-shadow)\",\n }}\n >\n <span\n className=\"block h-full rounded-full origin-left transition-transform duration-500 ease-[var(--ease-out-soft)]\"\n style={{\n background: \"var(--face-dark)\",\n transform: isCompleted ? \"scaleX(1)\" : \"scaleX(0)\",\n }}\n />\n </span>\n )}\n\n <span\n className={[\n \"relative w-[30px] h-[30px] rounded-full flex items-center justify-center text-[12.5px] font-semibold tabular-nums shrink-0\",\n \"transition-[box-shadow,color] duration-300\",\n reached ? \"text-white\" : \"text-neutral-400\",\n ].join(\" \")}\n style={{\n background: reached ? \"var(--face-dark)\" : \"var(--field)\",\n boxShadow: isCurrent\n ? \"var(--face-dark-shadow), 0 0 0 4px rgba(17,17,17,0.06), 0 0 0 5px rgba(17,17,17,0.03)\"\n : reached\n ? \"var(--face-dark-shadow)\"\n : \"var(--field-shadow)\",\n }}\n >\n {isCompleted ? <CheckIcon /> : i + 1}\n <span className=\"sr-only\">{isCompleted ? \" (completed)\" : \"\"}</span>\n </span>\n\n <span className=\"mt-3 px-1.5 flex flex-col gap-0.5\">\n <span\n className={[\n \"text-[13px] font-medium leading-tight transition-colors duration-200\",\n reached ? \"text-neutral-900\" : \"text-neutral-500\",\n ].join(\" \")}\n >\n {step.label}\n </span>\n {step.description && (\n <span className=\"text-[12px] text-neutral-400 leading-snug\">{step.description}</span>\n )}\n </span>\n </li>\n );\n })}\n </ol>\n );\n}\n","import React from \"react\";\n\ninterface Column<T> {\n key: keyof T | string;\n label: string;\n align?: \"left\" | \"right\" | \"center\";\n render?: (value: unknown, row: T) => React.ReactNode;\n width?: string;\n}\n\ninterface TableProps<T extends Record<string, unknown>> {\n columns: Column<T>[];\n rows: T[];\n title?: string;\n description?: string;\n className?: string;\n onRowClick?: (row: T) => void;\n}\n\nconst alignClass = (align?: \"left\" | \"right\" | \"center\") =>\n align === \"right\" ? \"text-right\" : align === \"center\" ? \"text-center\" : \"text-left\";\n\n/* Title and column headers live in the bezel; rows sit on the raised face. */\nexport function Table<T extends Record<string, unknown>>({\n columns,\n rows,\n title,\n description,\n className = \"\",\n onRowClick,\n}: TableProps<T>) {\n return (\n <div\n className={[\"w-full rounded-[18px] p-1.5\", title || description ? \"pt-0\" : \"\", className].join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n {(title || description) && (\n <div className=\"px-3.5 pt-3.5 pb-3\">\n {title && <p className=\"text-[13px] font-semibold text-neutral-900 tracking-[-0.01em]\">{title}</p>}\n {description && <p className=\"text-[12px] text-neutral-500 mt-0.5\">{description}</p>}\n </div>\n )}\n\n <div\n className=\"bg-white rounded-[13px] overflow-x-auto scroll-thin\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n <table className=\"w-full text-left border-collapse\">\n {title && <caption className=\"sr-only\">{title}</caption>}\n <thead>\n <tr className=\"border-b border-neutral-100\">\n {columns.map((col) => (\n <th\n key={String(col.key)}\n scope=\"col\"\n style={col.width ? { width: col.width } : undefined}\n className={[\n \"px-4 pt-3 pb-2.5 text-[12px] font-medium text-neutral-500 lowercase whitespace-nowrap\",\n alignClass(col.align),\n ].join(\" \")}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, ri) => (\n <tr\n key={ri}\n onClick={() => onRowClick?.(row)}\n // Clickable rows are reachable and operable from the keyboard too\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={\n onRowClick\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onRowClick(row);\n }\n }\n : undefined\n }\n className={[\n \"border-b border-neutral-100 last:border-0 transition-colors duration-100\",\n onRowClick\n ? \"cursor-pointer hover:bg-neutral-50 focus-visible:bg-neutral-50 outline-none focus-visible:shadow-[inset_2px_0_0_#171717]\"\n : \"\",\n ].join(\" \")}\n >\n {columns.map((col, ci) => {\n const val = row[col.key as keyof T] as unknown;\n return (\n <td\n key={String(col.key)}\n className={[\n \"px-4 py-3 text-[13px]\",\n ci === 0 ? \"font-medium text-neutral-900\" : \"text-neutral-600 tabular-nums\",\n alignClass(col.align),\n ].join(\" \")}\n >\n {col.render ? col.render(val, row) : String(val ?? \"\")}\n </td>\n );\n })}\n </tr>\n ))}\n {rows.length === 0 && (\n <tr>\n <td colSpan={columns.length} className=\"px-5 py-12 text-center\">\n <p className=\"text-[13px] font-medium text-neutral-700\">nothing here yet</p>\n <p className=\"text-[12px] text-neutral-500 mt-0.5\">rows will show up here once there are some.</p>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nexport interface TocItem {\n key: string;\n label: string;\n level: 1 | 2 | 3;\n}\n\ninterface TableOfContentsProps {\n items: TocItem[];\n activeKey?: string;\n defaultActiveKey?: string;\n onSelect?: (key: string) => void;\n className?: string;\n}\n\nconst indent: Record<1 | 2 | 3, number> = { 1: 16, 2: 28, 3: 40 };\n\n/* A hairline track runs down the left edge; a slim dark marker glides\n along it to the active heading. Nothing else moves — the active label\n just darkens. */\nexport function TableOfContents({\n items,\n activeKey,\n defaultActiveKey,\n onSelect,\n className = \"\",\n}: TableOfContentsProps) {\n const [internal, setInternal] = useState(defaultActiveKey ?? items[0]?.key ?? \"\");\n const current = activeKey !== undefined ? activeKey : internal;\n const refs = useRef<Record<string, HTMLButtonElement | null>>({});\n const [marker, setMarker] = useState<{ top: number; height: number } | null>(null);\n const [ready, setReady] = useState(false);\n\n const measure = () => {\n const el = refs.current[current];\n setMarker(el ? { top: el.offsetTop, height: el.offsetHeight } : null);\n };\n\n useLayoutEffect(() => {\n measure();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [current]);\n\n useEffect(() => {\n // Only animate moves after the first placement\n const id = requestAnimationFrame(() => setReady(true));\n return () => cancelAnimationFrame(id);\n }, []);\n\n const handleSelect = (key: string) => {\n setInternal(key);\n onSelect?.(key);\n };\n\n const slide = ready ? \"top 360ms var(--ease-out-soft), height 360ms var(--ease-out-soft)\" : \"none\";\n\n return (\n <nav\n aria-label=\"On this page\"\n className={[\"rounded-[18px] p-1.5\", className].filter(Boolean).join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <div\n className=\"bg-white rounded-[13px] px-5 pt-4 pb-4\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n <p aria-hidden className=\"text-[12px] font-medium text-neutral-400 mb-3\">\n on this page\n </p>\n\n <div className=\"relative\">\n <span aria-hidden className=\"absolute left-0 top-0 bottom-0 w-px bg-neutral-900/[0.08]\" />\n {marker && (\n <span\n aria-hidden\n className=\"absolute -left-[0.5px] w-[2px] rounded-full bg-neutral-900\"\n style={{ top: marker.top + 6, height: marker.height - 12, transition: slide }}\n />\n )}\n\n {items.map((item) => {\n const isActive = current === item.key;\n return (\n <button\n key={item.key}\n ref={(el) => {\n refs.current[item.key] = el;\n }}\n type=\"button\"\n onClick={() => handleSelect(item.key)}\n aria-current={isActive ? \"location\" : undefined}\n className={[\n // Weight stays fixed so the active item doesn't reflow its line\n \"relative block w-full text-left py-1.5 text-[13px] leading-5 rounded-[6px] cursor-pointer\",\n \"transition-colors duration-200 outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-neutral-900\",\n isActive\n ? \"text-neutral-900 font-medium\"\n : item.level === 1\n ? \"text-neutral-600 hover:text-neutral-900\"\n : \"text-neutral-400 hover:text-neutral-700\",\n ].join(\" \")}\n style={{ paddingLeft: indent[item.level] }}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n </div>\n </nav>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useLayoutEffect, useId } from \"react\";\n\ninterface Tab {\n key: string;\n label: string;\n content?: React.ReactNode;\n}\n\ninterface TabsProps {\n tabs: Tab[];\n defaultTab?: string;\n onChange?: (key: string) => void;\n className?: string;\n}\n\n/* A sunken well holding a raised thumb — the same segmented control as\n Pagination. One Tab stop; arrows move between tabs and select them. */\nexport function Tabs({ tabs, defaultTab, onChange, className = \"\" }: TabsProps) {\n const [active, setActive] = useState(defaultTab ?? tabs[0]?.key ?? \"\");\n const [direction, setDirection] = useState<\"left\" | \"right\">(\"right\");\n const [pill, setPill] = useState({ left: 0, width: 0, ready: false });\n const listRef = useRef<HTMLDivElement>(null);\n const btnRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n const uid = useId();\n\n const measurePill = (key: string) => {\n const btn = btnRefs.current[key];\n const list = listRef.current;\n if (!btn || !list) return;\n const lr = list.getBoundingClientRect();\n const br = btn.getBoundingClientRect();\n setPill({ left: br.left - lr.left, width: br.width, ready: true });\n };\n\n useLayoutEffect(() => { measurePill(active); }, []);\n useEffect(() => { measurePill(active); }, [active]);\n\n useEffect(() => {\n const ro = new ResizeObserver(() => measurePill(active));\n if (listRef.current) ro.observe(listRef.current);\n return () => ro.disconnect();\n }, [active]);\n\n const handleSelect = (key: string) => {\n const prevIndex = tabs.findIndex((t) => t.key === active);\n const nextIndex = tabs.findIndex((t) => t.key === key);\n setDirection(nextIndex > prevIndex ? \"right\" : \"left\");\n setActive(key);\n onChange?.(key);\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n const i = tabs.findIndex((t) => t.key === active);\n let next = -1;\n if (e.key === \"ArrowRight\") next = (i + 1) % tabs.length;\n if (e.key === \"ArrowLeft\") next = (i - 1 + tabs.length) % tabs.length;\n if (e.key === \"Home\") next = 0;\n if (e.key === \"End\") next = tabs.length - 1;\n if (next < 0) return;\n e.preventDefault();\n const key = tabs[next].key;\n handleSelect(key);\n btnRefs.current[key]?.focus();\n };\n\n const activeTab = tabs.find((t) => t.key === active);\n\n return (\n <div className={[\"flex flex-col gap-4\", className].join(\" \")}>\n <div\n ref={listRef}\n role=\"tablist\"\n onKeyDown={onKeyDown}\n className=\"relative flex w-full sm:inline-flex sm:w-auto sm:self-start items-center rounded-[13px] p-1\"\n style={{ background: \"var(--well)\", boxShadow: \"var(--well-shadow)\" }}\n >\n {pill.ready && (\n <span\n aria-hidden\n className=\"absolute top-1 bottom-1 rounded-[9px] pointer-events-none\"\n style={{\n left: pill.left,\n width: pill.width,\n background: \"var(--face-light)\",\n boxShadow: \"var(--thumb-shadow)\",\n transition: \"left 300ms var(--ease-spring), width 300ms var(--ease-spring)\",\n }}\n />\n )}\n\n {tabs.map((tab) => {\n const isActive = active === tab.key;\n return (\n <button\n key={tab.key}\n ref={(el) => { btnRefs.current[tab.key] = el; }}\n id={`${uid}-tab-${tab.key}`}\n role=\"tab\"\n type=\"button\"\n aria-selected={isActive}\n aria-controls={tab.content ? `${uid}-panel-${tab.key}` : undefined}\n tabIndex={isActive ? 0 : -1}\n onClick={() => handleSelect(tab.key)}\n className={[\n \"relative z-10 flex-1 sm:flex-none px-3.5 py-2 rounded-[9px] text-[13px] font-medium text-center whitespace-nowrap cursor-pointer\",\n \"transition-colors duration-150\",\n \"focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-neutral-900\",\n isActive ? \"text-neutral-900\" : \"text-neutral-500 hover:text-neutral-800\",\n ].join(\" \")}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n\n {activeTab?.content && (\n <div\n key={active}\n id={`${uid}-panel-${active}`}\n role=\"tabpanel\"\n aria-labelledby={`${uid}-tab-${active}`}\n tabIndex={0}\n className={[\n \"text-[13px] text-neutral-600 leading-relaxed rounded-lg focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-neutral-900\",\n direction === \"right\" ? \"animate-tab-slide-right\" : \"animate-tab-slide-left\",\n ].join(\" \")}\n >\n {activeTab.content}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useId } from \"react\";\n\ninterface TagInputProps {\n value?: string[];\n defaultValue?: string[];\n onChange?: (tags: string[]) => void;\n placeholder?: string;\n label?: string;\n hint?: string;\n maxTags?: number;\n fullWidth?: boolean;\n className?: string;\n}\n\ninterface AnimatedTag {\n text: string;\n state: \"entering\" | \"visible\" | \"exiting\";\n}\n\nexport function TagInput({\n value,\n defaultValue = [],\n onChange,\n placeholder = \"add a tag…\",\n label,\n hint,\n maxTags,\n fullWidth = false,\n className = \"\",\n}: TagInputProps) {\n const [internal, setInternal] = useState<string[]>(defaultValue);\n const [input, setInput] = useState(\"\");\n const [animTags, setAnimTags] = useState<AnimatedTag[]>(() =>\n (value ?? defaultValue).map((t) => ({ text: t, state: \"visible\" as const }))\n );\n const inputRef = useRef<HTMLInputElement>(null);\n const uid = useId();\n const prevValueRef = useRef<string[]>(value ?? defaultValue);\n\n const tags = value !== undefined ? value : internal;\n\n useEffect(() => {\n const prev = prevValueRef.current;\n const next = tags;\n\n const added = next.filter((t) => !prev.includes(t));\n const removed = prev.filter((t) => !next.includes(t));\n\n if (added.length === 0 && removed.length === 0) return;\n\n setAnimTags((current) => {\n const updated = current.map((at) =>\n removed.includes(at.text) ? { ...at, state: \"exiting\" as const } : at\n );\n added.forEach((t) => {\n if (!updated.find((at) => at.text === t)) {\n updated.push({ text: t, state: \"entering\" });\n }\n });\n return updated;\n });\n\n if (added.length > 0) {\n requestAnimationFrame(() => {\n setAnimTags((current) =>\n current.map((at) =>\n at.state === \"entering\" ? { ...at, state: \"visible\" } : at\n )\n );\n });\n }\n\n if (removed.length > 0) {\n setTimeout(() => {\n setAnimTags((current) => current.filter((at) => at.state !== \"exiting\"));\n }, 180);\n }\n\n prevValueRef.current = next;\n }, [tags]);\n\n const update = (next: string[]) => {\n setInternal(next);\n onChange?.(next);\n };\n\n const addTag = (raw: string) => {\n const tag = raw.trim();\n if (!tag || tags.includes(tag)) return;\n if (maxTags && tags.length >= maxTags) return;\n update([...tags, tag]);\n setInput(\"\");\n };\n\n const removeTag = (index: number) => {\n const tagText = tags[index];\n if (!tagText) return;\n setAnimTags((current) =>\n current.map((at) =>\n at.text === tagText ? { ...at, state: \"exiting\" as const } : at\n )\n );\n setTimeout(() => {\n update(tags.filter((_, i) => i !== index));\n }, 180);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" || e.key === \",\") {\n e.preventDefault();\n addTag(input);\n }\n if (e.key === \"Backspace\" && !input && tags.length > 0) {\n removeTag(tags.length - 1);\n }\n };\n\n return (\n <div className={[\"flex flex-col gap-1.5\", fullWidth ? \"w-full\" : \"\"].join(\" \")}>\n {label && (\n <label htmlFor={`${uid}-input`} className=\"text-[12.5px] font-medium text-neutral-700 tracking-[-0.005em]\">\n {label}\n </label>\n )}\n <div\n onClick={() => inputRef.current?.focus()}\n className={[\n \"flex flex-wrap items-center gap-1.5 rounded-xl px-3 py-2.5\",\n \"transition-[box-shadow,background] duration-200 ease-out cursor-text\",\n \"[background:var(--field)] [box-shadow:var(--field-shadow)]\",\n \"hover:[background:var(--field-hover)] hover:[box-shadow:var(--field-shadow-hover)]\",\n \"focus-within:[background:#ffffff] focus-within:[box-shadow:var(--field-shadow-focus)]\",\n fullWidth ? \"w-full\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {animTags.map((at, i) => (\n <span\n key={at.text}\n className={[\n \"inline-flex items-center gap-1 pl-2 pr-1 py-0.5 rounded-[7px] text-[11.5px] font-medium text-neutral-700 select-none\",\n \"transition-all duration-180 ease-[cubic-bezier(0.34,1.4,0.64,1)]\",\n at.state === \"entering\" ? \"opacity-0 scale-75\" : \"\",\n at.state === \"visible\" ? \"opacity-100 scale-100\" : \"\",\n at.state === \"exiting\" ? \"opacity-0 scale-75\" : \"\",\n ].join(\" \")}\n style={{\n /* Tags are small raised faces sitting in the sunken field */\n background: \"var(--face-light)\",\n boxShadow: \"var(--face-light-shadow)\",\n }}\n >\n {at.text}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n const idx = tags.indexOf(at.text);\n if (idx !== -1) removeTag(idx);\n }}\n aria-label={`Remove ${at.text}`}\n className=\"w-4 h-4 inline-flex items-center justify-center rounded-[5px] text-neutral-400 hover:text-neutral-900 hover:bg-neutral-900/[0.06] cursor-pointer transition-colors\"\n >\n <svg width=\"8\" height=\"8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n id={`${uid}-input`}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => { if (input) addTag(input); }}\n placeholder={tags.length === 0 ? placeholder : \"\"}\n aria-label={label ? undefined : placeholder}\n aria-describedby={hint ? `${uid}-hint` : undefined}\n className=\"flex-1 min-w-[80px] bg-transparent text-[13.5px] text-neutral-900 placeholder:text-neutral-400 outline-none py-0.5\"\n />\n </div>\n {hint && <p id={`${uid}-hint`} className=\"text-[11.5px] text-neutral-500 mt-0.5\">{hint}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useCallback, useEffect } from \"react\";\n\ninterface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n hint?: string;\n error?: string;\n fullWidth?: boolean;\n autoResize?: boolean;\n}\n\nexport function Textarea({\n label,\n hint,\n error,\n fullWidth = false,\n autoResize = false,\n className = \"\",\n id,\n rows = 3,\n onChange,\n ...rest\n}: TextareaProps) {\n const textareaId = id ?? label?.toLowerCase().replace(/\\s+/g, \"-\");\n const messageId = textareaId && (error || hint) ? `${textareaId}-message` : undefined;\n const ref = useRef<HTMLTextAreaElement>(null);\n\n const resize = useCallback(() => {\n if (!autoResize || !ref.current) return;\n ref.current.style.height = \"auto\";\n ref.current.style.height = ref.current.scrollHeight + \"px\";\n }, [autoResize]);\n\n useEffect(() => { resize(); }, [resize]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n resize();\n onChange?.(e);\n };\n\n return (\n <div className={[\"group/field flex flex-col gap-1.5\", fullWidth ? \"w-full\" : \"\"].join(\" \")}>\n {label && (\n <label\n htmlFor={textareaId}\n className=\"text-[12.5px] font-medium text-neutral-700 tracking-[-0.005em] transition-colors duration-200 group-focus-within/field:text-neutral-950\"\n >\n {label}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n rows={rows}\n onChange={handleChange}\n className={[\n \"field rounded-xl px-4 py-3 text-[13.5px] text-neutral-900 resize-none scroll-thin\",\n \"placeholder:text-neutral-400 placeholder:transition-colors placeholder:duration-200 focus:placeholder:text-neutral-300\",\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\n fullWidth ? \"w-full\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-invalid={error ? true : undefined}\n aria-describedby={messageId}\n {...rest}\n />\n {error && (\n <p id={messageId} role=\"alert\" className=\"text-[11.5px] text-red-600 font-medium flex items-center gap-1 mt-0.5\">\n <svg width=\"11\" height=\"11\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"M12 8v4m0 4h.01\" />\n </svg>\n {error}\n </p>\n )}\n {hint && !error && (\n <p id={messageId} className=\"text-[11.5px] text-neutral-500 mt-0.5\">{hint}</p>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\ntype TimelineVariant = \"default\" | \"success\" | \"warning\" | \"accent\";\n\ninterface TimelineItem {\n key: string;\n title: string;\n description?: string;\n date?: string;\n icon?: React.ReactNode;\n variant?: TimelineVariant;\n}\n\ninterface TimelineProps {\n items: TimelineItem[];\n className?: string;\n}\n\n/* Each event is a small raised node with a lit dot, like an indicator\n lamp; the variant only changes the lamp's colour. Nodes are joined by\n one continuous groove, and titles sit on the node's centre line. */\nconst lamp: Record<TimelineVariant, string> = {\n default: \"#262626\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n accent: \"#8b5cf6\",\n};\n\nconst iconText: Record<TimelineVariant, string> = {\n default: \"text-neutral-600\",\n success: \"text-emerald-600\",\n warning: \"text-amber-600\",\n accent: \"text-violet-600\",\n};\n\nexport function Timeline({ items, className = \"\" }: TimelineProps) {\n return (\n <div\n className={[\"rounded-[18px] p-1.5\", className].filter(Boolean).join(\" \")}\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--panel-shadow)\" }}\n >\n <ol\n className=\"bg-white rounded-[13px] px-5 py-5 flex flex-col\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n {items.map((item, index) => {\n const variant = item.variant ?? \"default\";\n const isLast = index === items.length - 1;\n\n return (\n <li key={item.key} className={[\"relative flex gap-4\", isLast ? \"\" : \"pb-6\"].join(\" \")}>\n {!isLast && (\n <span\n aria-hidden\n className=\"absolute left-[11px] top-[30px] bottom-[6px] w-[2px] rounded-full\"\n style={{ background: \"var(--well)\", boxShadow: \"var(--well-shadow)\" }}\n />\n )}\n\n <span\n aria-hidden\n className={[\n \"relative w-6 h-6 rounded-full flex items-center justify-center shrink-0\",\n iconText[variant],\n ].join(\" \")}\n style={{ background: \"var(--face-light)\", boxShadow: \"var(--tile-light-shadow)\" }}\n >\n {item.icon ?? (\n <span\n className=\"w-2 h-2 rounded-full\"\n style={{\n background: lamp[variant],\n boxShadow: `0 0 6px ${lamp[variant]}66, inset 0 1px 1px rgba(255,255,255,0.35)`,\n }}\n />\n )}\n </span>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <p className=\"text-[13.5px] font-medium text-neutral-900 leading-6 tracking-[-0.005em]\">\n {item.title}\n </p>\n {item.date && (\n <time className=\"text-[12px] text-neutral-400 tabular-nums shrink-0\">\n {item.date}\n </time>\n )}\n </div>\n {item.description && (\n <p className=\"text-[13px] text-neutral-500 leading-relaxed mt-0.5\">\n {item.description}\n </p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n </div>\n );\n}\n","\"use client\";\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n createContext,\n useContext,\n useRef,\n useLayoutEffect,\n} from \"react\";\nimport { CloseButton } from \"./CloseButton\";\n\ntype ToastVariant = \"default\" | \"success\" | \"warning\" | \"error\";\n\ninterface ToastItem {\n id: string;\n title: string;\n description?: string;\n variant: ToastVariant;\n duration: number;\n}\n\ninterface ToastContextValue {\n toast: (opts: {\n title: string;\n description?: string;\n variant?: ToastVariant;\n duration?: number;\n }) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue>({ toast: () => {} });\n\nexport function useToast() {\n return useContext(ToastContext);\n}\n\nconst variantConfig: Record<\n ToastVariant,\n { tile: string; icon: React.ReactNode }\n> = {\n default: {\n tile: \"var(--face-dark)\",\n icon: (\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"M12 8v4m0 4h.01\" />\n </svg>\n ),\n },\n success: {\n tile: \"linear-gradient(180deg, #10b981 0%, #059669 100%)\",\n icon: (\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ),\n },\n warning: {\n tile: \"linear-gradient(180deg, #fbbf24 0%, #f59e0b 100%)\",\n icon: (\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v4m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\n </svg>\n ),\n },\n error: {\n tile: \"linear-gradient(180deg, #f87171 0%, #dc2626 100%)\",\n icon: (\n <svg width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ),\n },\n};\n\nconst TOAST_WIDTH = \"min(360px, calc(100vw - 24px))\";\nconst VISIBLE_STACK = 3;\nconst STACK_OFFSET = 10;\nconst STACK_SCALE_STEP = 0.05;\nconst GAP = 10;\nconst ENTER_MS = 320;\nconst EXIT_MS = 220;\nconst SHIFT_MS = 420;\n\ninterface ToastCardProps {\n item: ToastItem;\n index: number;\n total: number;\n expanded: boolean;\n expandedOffset: number;\n exiting: boolean;\n entering: boolean;\n paused: boolean;\n onDismiss: (id: string) => void;\n onMeasure: (id: string, height: number) => void;\n}\n\nfunction ToastCard({\n item,\n index,\n total,\n expanded,\n expandedOffset,\n exiting,\n entering,\n paused,\n onDismiss,\n onMeasure,\n}: ToastCardProps) {\n const ref = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const remainingRef = useRef(item.duration);\n const startRef = useRef<number | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useLayoutEffect(() => {\n if (!innerRef.current) return;\n const ro = new ResizeObserver(() => {\n if (innerRef.current) onMeasure(item.id, innerRef.current.offsetHeight);\n });\n ro.observe(innerRef.current);\n onMeasure(item.id, innerRef.current.offsetHeight);\n return () => ro.disconnect();\n }, [item.id, onMeasure]);\n\n useEffect(() => {\n if (exiting) {\n if (timerRef.current) clearTimeout(timerRef.current);\n return;\n }\n if (paused) {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n if (startRef.current !== null) {\n remainingRef.current = Math.max(\n 0,\n remainingRef.current - (Date.now() - startRef.current),\n );\n }\n }\n return;\n }\n startRef.current = Date.now();\n timerRef.current = setTimeout(() => {\n onDismiss(item.id);\n }, remainingRef.current);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [paused, exiting, item.id, onDismiss]);\n\n const { tile, icon } = variantConfig[item.variant];\n\n const hidden = !expanded && index >= VISIBLE_STACK;\n\n const collapsedTransform = `translateX(-50%) translateY(${\n index * STACK_OFFSET\n }px) scale(${1 - index * STACK_SCALE_STEP})`;\n\n const expandedTransform = `translateX(-50%) translateY(${expandedOffset}px) scale(1)`;\n\n let transform = expanded ? expandedTransform : collapsedTransform;\n let opacity = hidden ? 0 : 1;\n\n if (entering) {\n transform = `translateX(-50%) translateY(-14px) scale(0.96)`;\n opacity = 0;\n }\n if (exiting) {\n transform = expanded\n ? `translateX(-50%) translateY(${expandedOffset - 12}px) scale(0.96)`\n : `translateX(-50%) translateY(${\n index * STACK_OFFSET - 12\n }px) scale(${1 - index * STACK_SCALE_STEP - 0.02})`;\n opacity = 0;\n }\n\n return (\n <div\n ref={ref}\n className=\"absolute top-0 left-1/2 pointer-events-auto\"\n style={{\n width: TOAST_WIDTH,\n transform,\n opacity,\n zIndex: total - index,\n transformOrigin: \"top center\",\n transition: `transform ${SHIFT_MS}ms cubic-bezier(0.32,0.72,0,1), opacity ${\n exiting ? EXIT_MS : ENTER_MS\n }ms ease`,\n }}\n >\n <div\n ref={innerRef}\n className=\"rounded-[18px] p-1.5\"\n style={{ background: \"var(--panel-bezel)\", boxShadow: \"var(--overlay-shadow)\" }}\n >\n <div\n className=\"bg-white rounded-[13px] pl-3 pr-2 py-3 flex items-start gap-3\"\n style={{ boxShadow: \"var(--panel-face-shadow)\" }}\n >\n <div\n aria-hidden\n className=\"shrink-0 w-7 h-7 rounded-[8px] flex items-center justify-center text-white\"\n style={{\n background: tile,\n boxShadow:\n \"0 0 3px rgba(0,0,0,0.212), 0 1px 2px rgba(0,0,0,0.15), inset 0 2px 3px -2px rgba(255,255,255,0.188)\",\n }}\n >\n {icon}\n </div>\n <div className=\"flex-1 min-w-0 pt-[5px]\">\n <p className=\"text-[13px] font-semibold text-neutral-900 leading-tight tracking-[-0.01em]\">\n {item.title}\n </p>\n {item.description && (\n <p className=\"text-[12.5px] text-neutral-500 mt-1 leading-relaxed\">\n {item.description}\n </p>\n )}\n </div>\n <CloseButton size=\"sm\" label=\"Dismiss notification\" onClick={() => onDismiss(item.id)} />\n </div>\n </div>\n </div>\n );\n}\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const [expanded, setExpanded] = useState(false);\n const [heights, setHeights] = useState<Record<string, number>>({});\n const [exiting, setExiting] = useState<Set<string>>(new Set());\n const [entering, setEntering] = useState<Set<string>>(new Set());\n const counter = useRef(0);\n\n const reportHeight = useCallback((id: string, h: number) => {\n setHeights((prev) => (prev[id] === h ? prev : { ...prev, [id]: h }));\n }, []);\n\n const dismiss = useCallback((id: string) => {\n setExiting((prev) => {\n if (prev.has(id)) return prev;\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n setExiting((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n setHeights((prev) => {\n const next = { ...prev };\n delete next[id];\n return next;\n });\n }, EXIT_MS);\n }, []);\n\n const toast = useCallback(\n (opts: {\n title: string;\n description?: string;\n variant?: ToastVariant;\n duration?: number;\n }) => {\n const id = `toast-${++counter.current}`;\n const item: ToastItem = {\n id,\n title: opts.title,\n description: opts.description,\n variant: opts.variant ?? \"default\",\n duration: opts.duration ?? 4000,\n };\n setToasts((prev) => [...prev, item]);\n setEntering((prev) => {\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setEntering((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n });\n });\n },\n [],\n );\n\n const list = [...toasts].reverse();\n\n const expandedOffsets: number[] = [];\n let cum = 0;\n for (let i = 0; i < list.length; i++) {\n expandedOffsets.push(cum);\n cum += (heights[list[i].id] ?? 72) + GAP;\n }\n const expandedHeight = Math.max(0, cum - GAP);\n\n const topH = heights[list[0]?.id] ?? 72;\n const visibleCount = Math.min(list.length, VISIBLE_STACK);\n const collapsedHeight =\n list.length === 0\n ? 0\n : topH + Math.max(0, visibleCount - 1) * STACK_OFFSET;\n\n const containerHeight = expanded ? expandedHeight : collapsedHeight;\n\n const showCount = list.length - VISIBLE_STACK;\n\n return (\n <ToastContext.Provider value={{ toast }}>\n {children}\n {/* Hover or keyboard focus fans the stack out and pauses the timers */}\n <section\n aria-label=\"Notifications\"\n aria-live=\"polite\"\n className=\"fixed top-[72px] left-1/2 z-[95] pointer-events-none\"\n style={{\n width: TOAST_WIDTH,\n transform: \"translateX(-50%)\",\n }}\n onMouseEnter={() => setExpanded(true)}\n onMouseLeave={() => setExpanded(false)}\n onFocus={() => setExpanded(true)}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) setExpanded(false);\n }}\n >\n <div\n className={list.length > 0 ? \"relative pointer-events-auto\" : \"relative\"}\n style={{\n width: TOAST_WIDTH,\n height: containerHeight,\n transition: `height ${SHIFT_MS}ms cubic-bezier(0.32,0.72,0,1)`,\n }}\n >\n {list.map((t, i) => (\n <ToastCard\n key={t.id}\n item={t}\n index={i}\n total={list.length}\n expanded={expanded}\n expandedOffset={expandedOffsets[i]}\n exiting={exiting.has(t.id)}\n entering={entering.has(t.id)}\n paused={expanded}\n onDismiss={dismiss}\n onMeasure={reportHeight}\n />\n ))}\n\n {!expanded && showCount > 0 && (\n <div\n className=\"absolute left-1/2 -translate-x-1/2 pointer-events-none\"\n style={{\n top: collapsedHeight + 6,\n transition: `opacity ${ENTER_MS}ms ease`,\n }}\n >\n <span\n className=\"text-[10.5px] font-medium text-neutral-500 px-2 py-0.5 rounded-full\"\n style={{ background: \"var(--face-light)\", boxShadow: \"var(--face-light-shadow)\" }}\n >\n +{showCount} more\n </span>\n </div>\n )}\n </div>\n </section>\n </ToastContext.Provider>\n );\n}\n","\"use client\";\n\nimport React, { useId, useState } from \"react\";\n\ninterface ToggleProps {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n label?: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport function Toggle({\n checked,\n defaultChecked = false,\n onChange,\n label,\n description,\n disabled = false,\n}: ToggleProps) {\n const [internal, setInternal] = useState(defaultChecked);\n const [pressed, setPressed] = useState(false);\n const uid = useId();\n const isOn = checked !== undefined ? checked : internal;\n\n const toggle = () => {\n if (disabled) return;\n const next = !isOn;\n setInternal(next);\n onChange?.(next);\n };\n\n return (\n <div\n className={[\n \"flex items-center justify-between gap-4 select-none\",\n disabled ? \"opacity-35 pointer-events-none\" : \"cursor-pointer\",\n ].join(\" \")}\n onClick={toggle}\n >\n {(label || description) && (\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n {label && (\n <span id={`${uid}-label`} className=\"text-[13px] font-medium text-neutral-900 leading-snug\">\n {label}\n </span>\n )}\n {description && (\n <span id={`${uid}-desc`} className=\"text-[12px] text-neutral-500 leading-relaxed\">\n {description}\n </span>\n )}\n </div>\n )}\n\n {/* Clicks bubble to the row, so the switch itself has no onClick */}\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n aria-labelledby={label ? `${uid}-label` : undefined}\n aria-describedby={description ? `${uid}-desc` : undefined}\n disabled={disabled}\n onPointerDown={() => setPressed(true)}\n onPointerUp={() => setPressed(false)}\n onPointerLeave={() => setPressed(false)}\n className={[\n \"relative shrink-0 w-[46px] h-[26px] rounded-[13px] cursor-pointer\",\n \"transition-[background-color,box-shadow] duration-200 ease-out\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-neutral-900\",\n isOn ? \"bg-neutral-900\" : \"bg-neutral-200/70\",\n ].join(\" \")}\n style={{\n /* The track is a recessed channel; the knob is a raised face inside it */\n boxShadow: isOn\n ? \"inset 0 1px 3px rgba(0,0,0,0.5), inset 0 0 2px rgba(0,0,0,0.3), 0 1px 2px -1px rgba(255,255,255,0.48)\"\n : \"inset 0 1px 2px rgba(17,17,17,0.12), inset 0 0 2px rgba(17,17,17,0.12), 0 1px 2px -1px rgba(255,255,255,0.64)\",\n }}\n >\n <span\n aria-hidden\n className=\"absolute top-1/2 h-5 rounded-[10px]\"\n style={{\n left: 3,\n /* The knob stretches while held, like a finger dragging it */\n width: pressed ? 24 : 20,\n background: \"var(--face-light)\",\n boxShadow:\n \"0 0 3px rgba(17,17,17,0.119), 0 1px 2px rgba(0,0,0,0.14), 0 3px 6px -1px rgba(0,0,0,0.12), inset 0 2px 3px -2px rgba(255,255,255,1), inset 0 -2px 3px -2px rgba(0,0,0,0.04)\",\n transform: `translateX(${isOn ? (pressed ? 16 : 20) : 0}px) translateY(-50%)`,\n transition:\n \"transform 260ms var(--ease-spring), width 200ms var(--ease-out-soft)\",\n }}\n />\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useCallback, useEffect, useId } from \"react\";\n\ntype TooltipPosition = \"top\" | \"bottom\" | \"left\" | \"right\";\n\ninterface TooltipProps {\n content: string;\n position?: TooltipPosition;\n children: React.ReactNode;\n className?: string;\n}\n\nconst origin: Record<TooltipPosition, string> = {\n top: \"origin-bottom\",\n bottom: \"origin-top\",\n left: \"origin-right\",\n right: \"origin-left\",\n};\n\nconst enterTranslate: Record<TooltipPosition, string> = {\n top: \"translate-y-1\",\n bottom: \"-translate-y-1\",\n left: \"translate-x-1\",\n right: \"-translate-x-1\",\n};\n\nexport function Tooltip({\n content,\n position = \"top\",\n children,\n className = \"\",\n}: TooltipProps) {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const [mounted, setMounted] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const enterTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const exitTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const autoHideTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const touchActiveRef = useRef(false);\n const uid = useId();\n\n const hide = useCallback(() => {\n if (enterTimer.current) clearTimeout(enterTimer.current);\n if (autoHideTimer.current) clearTimeout(autoHideTimer.current);\n setVisible(false);\n exitTimer.current = setTimeout(() => {\n setMounted(false);\n setOpen(false);\n }, 150);\n }, []);\n\n const show = useCallback((fromTouch = false) => {\n if (exitTimer.current) clearTimeout(exitTimer.current);\n if (autoHideTimer.current) clearTimeout(autoHideTimer.current);\n enterTimer.current = setTimeout(() => setOpen(true), fromTouch ? 0 : 80);\n if (fromTouch) {\n autoHideTimer.current = setTimeout(() => {\n touchActiveRef.current = false;\n hide();\n }, 2400);\n }\n }, [hide]);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n requestAnimationFrame(() => requestAnimationFrame(() => setVisible(true)));\n }\n }, [open]);\n\n const measure = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current) return;\n const tr = triggerRef.current.getBoundingClientRect();\n const tp = tooltipRef.current.getBoundingClientRect();\n const gap = 7;\n\n let top = 0;\n let left = 0;\n\n switch (position) {\n case \"top\":\n top = -(tp.height + gap);\n left = (tr.width - tp.width) / 2;\n break;\n case \"bottom\":\n top = tr.height + gap;\n left = (tr.width - tp.width) / 2;\n break;\n case \"left\":\n top = (tr.height - tp.height) / 2;\n left = -(tp.width + gap);\n break;\n case \"right\":\n top = (tr.height - tp.height) / 2;\n left = tr.width + gap;\n break;\n }\n\n const viewportPadding = 8;\n const absLeft = triggerRef.current.getBoundingClientRect().left + left;\n const overflowRight = absLeft + tp.width - (window.innerWidth - viewportPadding);\n const overflowLeft = viewportPadding - absLeft;\n if (overflowRight > 0) left -= overflowRight;\n if (overflowLeft > 0) left += overflowLeft;\n\n setCoords({ top, left });\n }, [position]);\n\n useEffect(() => {\n if (mounted) measure();\n }, [mounted, measure]);\n\n useEffect(() => {\n if (!open) return;\n const onDocPointer = (e: PointerEvent) => {\n if (!triggerRef.current?.contains(e.target as Node)) {\n touchActiveRef.current = false;\n hide();\n }\n };\n document.addEventListener(\"pointerdown\", onDocPointer);\n return () => document.removeEventListener(\"pointerdown\", onDocPointer);\n }, [open, hide]);\n\n // Escape dismisses without moving focus (WCAG 1.4.13)\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") hide();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, hide]);\n\n useEffect(() => {\n return () => {\n if (enterTimer.current) clearTimeout(enterTimer.current);\n if (exitTimer.current) clearTimeout(exitTimer.current);\n if (autoHideTimer.current) clearTimeout(autoHideTimer.current);\n };\n }, []);\n\n const handlePointerEnter = (e: React.PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n show(false);\n };\n\n const handlePointerLeave = (e: React.PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n if (touchActiveRef.current) return;\n hide();\n };\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (e.pointerType !== \"touch\") return;\n touchActiveRef.current = true;\n if (open) {\n hide();\n } else {\n show(true);\n }\n };\n\n return (\n <div\n ref={triggerRef}\n className={[\"relative inline-flex\", className].join(\" \")}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n onPointerDown={handlePointerDown}\n onFocus={() => show(false)}\n onBlur={() => {\n if (!touchActiveRef.current) hide();\n }}\n >\n {React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement<Record<string, unknown>>, {\n \"aria-describedby\": mounted ? `${uid}-tip` : undefined,\n })\n : children}\n {mounted && (\n <div\n ref={tooltipRef}\n id={`${uid}-tip`}\n role=\"tooltip\"\n className={[\n \"absolute z-50 px-2.5 py-1.5 rounded-[9px] text-white text-[11.5px] font-medium whitespace-nowrap pointer-events-none\",\n \"transition-[opacity,transform,scale,translate] duration-150 ease-[var(--ease-spring)]\",\n origin[position],\n visible\n ? \"opacity-100 scale-100 translate-x-0 translate-y-0\"\n : [\"opacity-0 scale-95\", enterTranslate[position]].join(\" \"),\n ].join(\" \")}\n style={{\n top: coords.top,\n left: coords.left,\n background: \"var(--face-dark)\",\n boxShadow:\n \"0 0 3px rgba(0,0,0,0.35), 0 2px 6px rgba(0,0,0,0.22), 0 8px 24px -4px rgba(0,0,0,0.3), inset 0 2px 3px -2px rgba(255,255,255,0.105)\",\n textShadow: \"0 -1px 0 rgba(0,0,0,0.4)\",\n }}\n >\n {content}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useCallback","jsx","jsxs","cfg","jsx","jsxs","jsx","jsx","jsxs","variantStyles","jsx","jsxs","React","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","title","subtitle","image","imageSrc","imageAlt","actions","className","children","useState","useRef","jsx","jsxs","useState","useRef","useState","useId","jsx","jsxs","useState","useCallback","useRef","jsx","jsxs","useEffect","useRef","useState","useMemo","useCallback","useId","jsx","useEffect","jsx","jsxs","useState","useRef","useId","useMemo","useEffect","useCallback","jsx","jsxs","useEffect","useId","useLayoutEffect","useRef","useState","jsx","jsxs","useState","useRef","useId","useEffect","useLayoutEffect","React","useState","useRef","useEffect","useId","useCallback","jsx","jsxs","useState","useRef","useId","useCallback","useEffect","React","jsx","jsxs","jsx","jsxs","useEffect","useId","useLayoutEffect","useRef","useState","jsx","jsxs","CLOSE_MS","useState","useRef","useId","useEffect","useLayoutEffect","useRef","useState","useEffect","useLayoutEffect","jsx","jsxs","React","useState","useRef","useEffect","useId","jsx","jsxs","positionStyles","enterFrom","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","useEffect","useId","useLayoutEffect","useRef","useState","Fragment","jsx","jsxs","useState","useCallback","useRef","jsx","jsxs","useState","useEffect","jsx","jsx","jsxs","useState","useRef","useEffect","useId","jsx","jsxs","useState","useCallback","Fragment","jsx","jsxs","useState","useCallback","useState","useRef","useEffect","useLayoutEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","useEffect","useRef","useState","jsx","jsxs","useEffect","useId","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useId","jsx","jsxs","CheckIcon","jsx","jsxs","useEffect","useLayoutEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useLayoutEffect","useId","jsx","jsxs","useState","useRef","useEffect","useId","jsx","jsxs","useRef","useCallback","useEffect","jsx","jsxs","jsx","jsxs","useState","useEffect","useCallback","useRef","useLayoutEffect","jsx","jsxs","variantConfig","ENTER_MS","EXIT_MS","useRef","useLayoutEffect","useEffect","useState","useCallback","useId","useState","jsx","jsxs","React","useState","useRef","useCallback","useEffect","useId","jsx","jsxs","origin"]}
1
+ {"version":3,"sources":["../../../components/ui/index.ts"],"sourcesContent":["/* The package entry: every component, hook and public type. Generated\n from the files in this folder; keep one line per file. */\n\nexport * from \"./Accordion\";\nexport * from \"./Alert\";\nexport * from \"./AuthorCard\";\nexport * from \"./Avatar\";\nexport * from \"./Badge\";\nexport * from \"./Banner\";\nexport * from \"./Breadcrumb\";\nexport * from \"./Button\";\nexport * from \"./ButtonGroup\";\nexport * from \"./Card\";\nexport * from \"./CardShell\";\nexport * from \"./Carousel\";\nexport * from \"./Checkbox\";\nexport * from \"./CloseButton\";\nexport * from \"./CodeBlock\";\nexport * from \"./ColorPicker\";\nexport * from \"./Combobox\";\nexport * from \"./CommandPalette\";\nexport * from \"./ContextMenu\";\nexport * from \"./DataList\";\nexport * from \"./DatePicker\";\nexport * from \"./DateRangePicker\";\nexport * from \"./Drawer\";\nexport * from \"./DropdownMenu\";\nexport * from \"./EmptyState\";\nexport * from \"./FieldMessage\";\nexport * from \"./FileUpload\";\nexport * from \"./Floating\";\nexport * from \"./HoverCard\";\nexport * from \"./Input\";\nexport * from \"./Kbd\";\nexport * from \"./Modal\";\nexport * from \"./NumberInput\";\nexport * from \"./OtpInput\";\nexport * from \"./Pagination\";\nexport * from \"./Popover\";\nexport * from \"./Progress\";\nexport * from \"./QuoteCard\";\nexport * from \"./Radio\";\nexport * from \"./RadioCards\";\nexport * from \"./ReactionBar\";\nexport * from \"./ReadingProgress\";\nexport * from \"./ReadingTime\";\nexport * from \"./Select\";\nexport * from \"./Separator\";\nexport * from \"./ShareButtons\";\nexport * from \"./Sidebar\";\nexport * from \"./Skeleton\";\nexport * from \"./Slider\";\nexport * from \"./Spinner\";\nexport * from \"./SpotlightCard\";\nexport * from \"./Stat\";\nexport * from \"./StatCard\";\nexport * from \"./Steps\";\nexport * from \"./Table\";\nexport * from \"./TableOfContents\";\nexport * from \"./Tabs\";\nexport * from \"./TagInput\";\nexport * from \"./Textarea\";\nexport * from \"./Timeline\";\nexport * from \"./TimePicker\";\nexport * from \"./Toast\";\nexport * from \"./Toggle\";\nexport * from \"./Tooltip\";\nexport * from \"./useFloatingPanel\";\nexport * from \"./useModalBehavior\";\n"],"mappings":";AAGA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}