@spatika/react 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/README.md +72 -0
  2. package/dist/composites/ActionBar.d.ts +7 -0
  3. package/dist/composites/ActionBar.d.ts.map +1 -0
  4. package/dist/composites/ActionBar.js +5 -0
  5. package/dist/composites/AmountInput.d.ts +10 -0
  6. package/dist/composites/AmountInput.d.ts.map +1 -0
  7. package/dist/composites/AmountInput.js +7 -0
  8. package/dist/composites/AppHeader.d.ts +25 -0
  9. package/dist/composites/AppHeader.d.ts.map +1 -0
  10. package/dist/composites/AppHeader.js +13 -0
  11. package/dist/composites/AppSidebar.d.ts +30 -0
  12. package/dist/composites/AppSidebar.d.ts.map +1 -0
  13. package/dist/composites/AppSidebar.js +15 -0
  14. package/dist/composites/BottomSheet.d.ts +36 -0
  15. package/dist/composites/BottomSheet.d.ts.map +1 -0
  16. package/dist/composites/BottomSheet.js +37 -0
  17. package/dist/composites/Breadcrumb.d.ts +10 -0
  18. package/dist/composites/Breadcrumb.d.ts.map +1 -0
  19. package/dist/composites/Breadcrumb.js +10 -0
  20. package/dist/composites/Callout.d.ts +8 -0
  21. package/dist/composites/Callout.d.ts.map +1 -0
  22. package/dist/composites/Callout.js +5 -0
  23. package/dist/composites/Card.d.ts +31 -0
  24. package/dist/composites/Card.d.ts.map +1 -0
  25. package/dist/composites/Card.js +33 -0
  26. package/dist/composites/Chip.d.ts +13 -0
  27. package/dist/composites/Chip.d.ts.map +1 -0
  28. package/dist/composites/Chip.js +59 -0
  29. package/dist/composites/ChipGroup.d.ts +23 -0
  30. package/dist/composites/ChipGroup.d.ts.map +1 -0
  31. package/dist/composites/ChipGroup.js +27 -0
  32. package/dist/composites/CommandSearchField.d.ts +27 -0
  33. package/dist/composites/CommandSearchField.d.ts.map +1 -0
  34. package/dist/composites/CommandSearchField.js +17 -0
  35. package/dist/composites/CoverHero.d.ts +51 -0
  36. package/dist/composites/CoverHero.d.ts.map +1 -0
  37. package/dist/composites/CoverHero.js +71 -0
  38. package/dist/composites/CoverPattern.d.ts +12 -0
  39. package/dist/composites/CoverPattern.d.ts.map +1 -0
  40. package/dist/composites/CoverPattern.js +14 -0
  41. package/dist/composites/DataTableToolbar.d.ts +13 -0
  42. package/dist/composites/DataTableToolbar.d.ts.map +1 -0
  43. package/dist/composites/DataTableToolbar.js +7 -0
  44. package/dist/composites/DividerLabel.d.ts +5 -0
  45. package/dist/composites/DividerLabel.d.ts.map +1 -0
  46. package/dist/composites/DividerLabel.js +5 -0
  47. package/dist/composites/EmptyState.d.ts +16 -0
  48. package/dist/composites/EmptyState.d.ts.map +1 -0
  49. package/dist/composites/EmptyState.js +10 -0
  50. package/dist/composites/EntityCard.d.ts +31 -0
  51. package/dist/composites/EntityCard.d.ts.map +1 -0
  52. package/dist/composites/EntityCard.js +21 -0
  53. package/dist/composites/EntityMediaCard.d.ts +25 -0
  54. package/dist/composites/EntityMediaCard.d.ts.map +1 -0
  55. package/dist/composites/EntityMediaCard.js +17 -0
  56. package/dist/composites/FilterSheet.d.ts +34 -0
  57. package/dist/composites/FilterSheet.d.ts.map +1 -0
  58. package/dist/composites/FilterSheet.js +36 -0
  59. package/dist/composites/FloatingPageChrome.d.ts +90 -0
  60. package/dist/composites/FloatingPageChrome.d.ts.map +1 -0
  61. package/dist/composites/FloatingPageChrome.js +67 -0
  62. package/dist/composites/FormField.d.ts +15 -0
  63. package/dist/composites/FormField.d.ts.map +1 -0
  64. package/dist/composites/FormField.js +9 -0
  65. package/dist/composites/GlassCard.d.ts +13 -0
  66. package/dist/composites/GlassCard.d.ts.map +1 -0
  67. package/dist/composites/GlassCard.js +32 -0
  68. package/dist/composites/HeaderIconButton.d.ts +13 -0
  69. package/dist/composites/HeaderIconButton.d.ts.map +1 -0
  70. package/dist/composites/HeaderIconButton.js +12 -0
  71. package/dist/composites/ListRow.d.ts +9 -0
  72. package/dist/composites/ListRow.d.ts.map +1 -0
  73. package/dist/composites/ListRow.js +6 -0
  74. package/dist/composites/MediaEntryCard.d.ts +25 -0
  75. package/dist/composites/MediaEntryCard.d.ts.map +1 -0
  76. package/dist/composites/MediaEntryCard.js +10 -0
  77. package/dist/composites/MobileTabBar.d.ts +33 -0
  78. package/dist/composites/MobileTabBar.d.ts.map +1 -0
  79. package/dist/composites/MobileTabBar.js +19 -0
  80. package/dist/composites/NotificationBell.d.ts +28 -0
  81. package/dist/composites/NotificationBell.d.ts.map +1 -0
  82. package/dist/composites/NotificationBell.js +25 -0
  83. package/dist/composites/PageHeader.d.ts +11 -0
  84. package/dist/composites/PageHeader.d.ts.map +1 -0
  85. package/dist/composites/PageHeader.js +6 -0
  86. package/dist/composites/PageShell.d.ts +12 -0
  87. package/dist/composites/PageShell.d.ts.map +1 -0
  88. package/dist/composites/PageShell.js +8 -0
  89. package/dist/composites/PageStickyHeader.d.ts +33 -0
  90. package/dist/composites/PageStickyHeader.d.ts.map +1 -0
  91. package/dist/composites/PageStickyHeader.js +19 -0
  92. package/dist/composites/Pagination.d.ts +7 -0
  93. package/dist/composites/Pagination.d.ts.map +1 -0
  94. package/dist/composites/Pagination.js +6 -0
  95. package/dist/composites/PhotoViewer.d.ts +18 -0
  96. package/dist/composites/PhotoViewer.d.ts.map +1 -0
  97. package/dist/composites/PhotoViewer.js +37 -0
  98. package/dist/composites/PinPad.d.ts +29 -0
  99. package/dist/composites/PinPad.d.ts.map +1 -0
  100. package/dist/composites/PinPad.js +58 -0
  101. package/dist/composites/ProfileHero.d.ts +34 -0
  102. package/dist/composites/ProfileHero.d.ts.map +1 -0
  103. package/dist/composites/ProfileHero.js +21 -0
  104. package/dist/composites/QuickFilterRail.d.ts +25 -0
  105. package/dist/composites/QuickFilterRail.d.ts.map +1 -0
  106. package/dist/composites/QuickFilterRail.js +18 -0
  107. package/dist/composites/QuickSettings.d.ts +27 -0
  108. package/dist/composites/QuickSettings.d.ts.map +1 -0
  109. package/dist/composites/QuickSettings.js +18 -0
  110. package/dist/composites/RichTextEditor.d.ts +13 -0
  111. package/dist/composites/RichTextEditor.d.ts.map +1 -0
  112. package/dist/composites/RichTextEditor.js +23 -0
  113. package/dist/composites/SearchField.d.ts +8 -0
  114. package/dist/composites/SearchField.d.ts.map +1 -0
  115. package/dist/composites/SearchField.js +8 -0
  116. package/dist/composites/SectionPanel.d.ts +16 -0
  117. package/dist/composites/SectionPanel.d.ts.map +1 -0
  118. package/dist/composites/SectionPanel.js +8 -0
  119. package/dist/composites/SegmentedControl.d.ts +17 -0
  120. package/dist/composites/SegmentedControl.d.ts.map +1 -0
  121. package/dist/composites/SegmentedControl.js +11 -0
  122. package/dist/composites/StatCard.d.ts +11 -0
  123. package/dist/composites/StatCard.d.ts.map +1 -0
  124. package/dist/composites/StatCard.js +6 -0
  125. package/dist/composites/StatusDot.d.ts +11 -0
  126. package/dist/composites/StatusDot.d.ts.map +1 -0
  127. package/dist/composites/StatusDot.js +23 -0
  128. package/dist/composites/SurfaceCard.d.ts +12 -0
  129. package/dist/composites/SurfaceCard.d.ts.map +1 -0
  130. package/dist/composites/SurfaceCard.js +24 -0
  131. package/dist/composites/Timeline.d.ts +19 -0
  132. package/dist/composites/Timeline.d.ts.map +1 -0
  133. package/dist/composites/Timeline.js +12 -0
  134. package/dist/composites/Toast.d.ts +26 -0
  135. package/dist/composites/Toast.d.ts.map +1 -0
  136. package/dist/composites/Toast.js +49 -0
  137. package/dist/composites/Toolbar.d.ts +6 -0
  138. package/dist/composites/Toolbar.d.ts.map +1 -0
  139. package/dist/composites/Toolbar.js +5 -0
  140. package/dist/composites/ViewFiltersPanel.d.ts +21 -0
  141. package/dist/composites/ViewFiltersPanel.d.ts.map +1 -0
  142. package/dist/composites/ViewFiltersPanel.js +11 -0
  143. package/dist/index.d.ts +96 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +95 -0
  146. package/dist/lib/animations.d.ts +62 -0
  147. package/dist/lib/animations.d.ts.map +1 -0
  148. package/dist/lib/animations.js +37 -0
  149. package/dist/lib/avatar-utils.d.ts +10 -0
  150. package/dist/lib/avatar-utils.d.ts.map +1 -0
  151. package/dist/lib/avatar-utils.js +49 -0
  152. package/dist/lib/chips.d.ts +10 -0
  153. package/dist/lib/chips.d.ts.map +1 -0
  154. package/dist/lib/chips.js +30 -0
  155. package/dist/lib/cn.d.ts +4 -0
  156. package/dist/lib/cn.d.ts.map +1 -0
  157. package/dist/lib/cn.js +6 -0
  158. package/dist/lib/compose-refs.d.ts +6 -0
  159. package/dist/lib/compose-refs.d.ts.map +1 -0
  160. package/dist/lib/compose-refs.js +17 -0
  161. package/dist/lib/cover-chrome.d.ts +9 -0
  162. package/dist/lib/cover-chrome.d.ts.map +1 -0
  163. package/dist/lib/cover-chrome.js +23 -0
  164. package/dist/lib/cover-pattern.d.ts +75 -0
  165. package/dist/lib/cover-pattern.d.ts.map +1 -0
  166. package/dist/lib/cover-pattern.js +135 -0
  167. package/dist/lib/overlay-stack.d.ts +23 -0
  168. package/dist/lib/overlay-stack.d.ts.map +1 -0
  169. package/dist/lib/overlay-stack.js +37 -0
  170. package/dist/lib/portal.d.ts +12 -0
  171. package/dist/lib/portal.d.ts.map +1 -0
  172. package/dist/lib/portal.js +12 -0
  173. package/dist/lib/slot.d.ts +12 -0
  174. package/dist/lib/slot.d.ts.map +1 -0
  175. package/dist/lib/slot.js +55 -0
  176. package/dist/lib/surfaces.d.ts +14 -0
  177. package/dist/lib/surfaces.d.ts.map +1 -0
  178. package/dist/lib/surfaces.js +18 -0
  179. package/dist/lib/themes.d.ts +16 -0
  180. package/dist/lib/themes.d.ts.map +1 -0
  181. package/dist/lib/themes.js +53 -0
  182. package/dist/lib/typography.d.ts +17 -0
  183. package/dist/lib/typography.d.ts.map +1 -0
  184. package/dist/lib/typography.js +16 -0
  185. package/dist/lib/use-controllable-state.d.ts +12 -0
  186. package/dist/lib/use-controllable-state.d.ts.map +1 -0
  187. package/dist/lib/use-controllable-state.js +20 -0
  188. package/dist/lib/use-cover-chrome-bleed.d.ts +9 -0
  189. package/dist/lib/use-cover-chrome-bleed.d.ts.map +1 -0
  190. package/dist/lib/use-cover-chrome-bleed.js +28 -0
  191. package/dist/lib/use-dismissable.d.ts +13 -0
  192. package/dist/lib/use-dismissable.d.ts.map +1 -0
  193. package/dist/lib/use-dismissable.js +33 -0
  194. package/dist/lib/use-floating-position.d.ts +27 -0
  195. package/dist/lib/use-floating-position.d.ts.map +1 -0
  196. package/dist/lib/use-floating-position.js +115 -0
  197. package/dist/lib/use-focus-trap.d.ts +7 -0
  198. package/dist/lib/use-focus-trap.d.ts.map +1 -0
  199. package/dist/lib/use-focus-trap.js +61 -0
  200. package/dist/lib/use-media-query.d.ts +5 -0
  201. package/dist/lib/use-media-query.d.ts.map +1 -0
  202. package/dist/lib/use-media-query.js +19 -0
  203. package/dist/primitives/Accordion.d.ts +24 -0
  204. package/dist/primitives/Accordion.d.ts.map +1 -0
  205. package/dist/primitives/Accordion.js +37 -0
  206. package/dist/primitives/Alert.d.ts +10 -0
  207. package/dist/primitives/Alert.d.ts.map +1 -0
  208. package/dist/primitives/Alert.js +25 -0
  209. package/dist/primitives/AlertDialog.d.ts +33 -0
  210. package/dist/primitives/AlertDialog.d.ts.map +1 -0
  211. package/dist/primitives/AlertDialog.js +96 -0
  212. package/dist/primitives/Avatar.d.ts +15 -0
  213. package/dist/primitives/Avatar.d.ts.map +1 -0
  214. package/dist/primitives/Avatar.js +52 -0
  215. package/dist/primitives/Badge.d.ts +12 -0
  216. package/dist/primitives/Badge.d.ts.map +1 -0
  217. package/dist/primitives/Badge.js +27 -0
  218. package/dist/primitives/Button.d.ts +14 -0
  219. package/dist/primitives/Button.d.ts.map +1 -0
  220. package/dist/primitives/Button.js +37 -0
  221. package/dist/primitives/Checkbox.d.ts +9 -0
  222. package/dist/primitives/Checkbox.d.ts.map +1 -0
  223. package/dist/primitives/Checkbox.js +22 -0
  224. package/dist/primitives/Command.d.ts +17 -0
  225. package/dist/primitives/Command.d.ts.map +1 -0
  226. package/dist/primitives/Command.js +33 -0
  227. package/dist/primitives/Dialog.d.ts +34 -0
  228. package/dist/primitives/Dialog.d.ts.map +1 -0
  229. package/dist/primitives/Dialog.js +96 -0
  230. package/dist/primitives/DropdownMenu.d.ts +65 -0
  231. package/dist/primitives/DropdownMenu.d.ts.map +1 -0
  232. package/dist/primitives/DropdownMenu.js +196 -0
  233. package/dist/primitives/Input.d.ts +4 -0
  234. package/dist/primitives/Input.d.ts.map +1 -0
  235. package/dist/primitives/Input.js +6 -0
  236. package/dist/primitives/Kbd.d.ts +4 -0
  237. package/dist/primitives/Kbd.d.ts.map +1 -0
  238. package/dist/primitives/Kbd.js +6 -0
  239. package/dist/primitives/Label.d.ts +4 -0
  240. package/dist/primitives/Label.d.ts.map +1 -0
  241. package/dist/primitives/Label.js +6 -0
  242. package/dist/primitives/NativeSelect.d.ts +7 -0
  243. package/dist/primitives/NativeSelect.d.ts.map +1 -0
  244. package/dist/primitives/NativeSelect.js +10 -0
  245. package/dist/primitives/Popover.d.ts +29 -0
  246. package/dist/primitives/Popover.d.ts.map +1 -0
  247. package/dist/primitives/Popover.js +95 -0
  248. package/dist/primitives/Progress.d.ts +8 -0
  249. package/dist/primitives/Progress.d.ts.map +1 -0
  250. package/dist/primitives/Progress.js +7 -0
  251. package/dist/primitives/RadioGroup.d.ts +13 -0
  252. package/dist/primitives/RadioGroup.d.ts.map +1 -0
  253. package/dist/primitives/RadioGroup.js +33 -0
  254. package/dist/primitives/Select.d.ts +33 -0
  255. package/dist/primitives/Select.d.ts.map +1 -0
  256. package/dist/primitives/Select.js +178 -0
  257. package/dist/primitives/Separator.d.ts +7 -0
  258. package/dist/primitives/Separator.d.ts.map +1 -0
  259. package/dist/primitives/Separator.js +6 -0
  260. package/dist/primitives/Sheet.d.ts +28 -0
  261. package/dist/primitives/Sheet.d.ts.map +1 -0
  262. package/dist/primitives/Sheet.js +96 -0
  263. package/dist/primitives/Skeleton.d.ts +4 -0
  264. package/dist/primitives/Skeleton.d.ts.map +1 -0
  265. package/dist/primitives/Skeleton.js +6 -0
  266. package/dist/primitives/Slider.d.ts +12 -0
  267. package/dist/primitives/Slider.d.ts.map +1 -0
  268. package/dist/primitives/Slider.js +23 -0
  269. package/dist/primitives/Spinner.d.ts +6 -0
  270. package/dist/primitives/Spinner.d.ts.map +1 -0
  271. package/dist/primitives/Spinner.js +7 -0
  272. package/dist/primitives/StarRating.d.ts +10 -0
  273. package/dist/primitives/StarRating.d.ts.map +1 -0
  274. package/dist/primitives/StarRating.js +11 -0
  275. package/dist/primitives/Switch.d.ts +8 -0
  276. package/dist/primitives/Switch.d.ts.map +1 -0
  277. package/dist/primitives/Switch.js +20 -0
  278. package/dist/primitives/Table.d.ts +13 -0
  279. package/dist/primitives/Table.d.ts.map +1 -0
  280. package/dist/primitives/Table.js +20 -0
  281. package/dist/primitives/Tabs.d.ts +17 -0
  282. package/dist/primitives/Tabs.d.ts.map +1 -0
  283. package/dist/primitives/Tabs.js +30 -0
  284. package/dist/primitives/Textarea.d.ts +4 -0
  285. package/dist/primitives/Textarea.d.ts.map +1 -0
  286. package/dist/primitives/Textarea.js +6 -0
  287. package/dist/primitives/Tooltip.d.ts +31 -0
  288. package/dist/primitives/Tooltip.d.ts.map +1 -0
  289. package/dist/primitives/Tooltip.js +94 -0
  290. package/dist/theme/OriginThemeProvider.d.ts +31 -0
  291. package/dist/theme/OriginThemeProvider.d.ts.map +1 -0
  292. package/dist/theme/OriginThemeProvider.js +37 -0
  293. package/dist/theme/SpatikaThemeProvider.d.ts +36 -0
  294. package/dist/theme/SpatikaThemeProvider.d.ts.map +1 -0
  295. package/dist/theme/SpatikaThemeProvider.js +38 -0
  296. package/package.json +58 -0
  297. package/src/composites/ActionBar.tsx +25 -0
  298. package/src/composites/AmountInput.tsx +40 -0
  299. package/src/composites/AppHeader.tsx +88 -0
  300. package/src/composites/AppSidebar.tsx +120 -0
  301. package/src/composites/BottomSheet.tsx +179 -0
  302. package/src/composites/Breadcrumb.tsx +42 -0
  303. package/src/composites/Callout.tsx +22 -0
  304. package/src/composites/Card.tsx +119 -0
  305. package/src/composites/Chip.tsx +87 -0
  306. package/src/composites/ChipGroup.component.test.tsx +31 -0
  307. package/src/composites/ChipGroup.test.ts +16 -0
  308. package/src/composites/ChipGroup.tsx +86 -0
  309. package/src/composites/CommandSearchField.tsx +124 -0
  310. package/src/composites/CoverHero.tsx +359 -0
  311. package/src/composites/CoverPattern.tsx +90 -0
  312. package/src/composites/DataTableToolbar.tsx +48 -0
  313. package/src/composites/DividerLabel.tsx +22 -0
  314. package/src/composites/EmptyState.tsx +55 -0
  315. package/src/composites/EntityCard.tsx +100 -0
  316. package/src/composites/EntityMediaCard.tsx +118 -0
  317. package/src/composites/FilterSheet.tsx +178 -0
  318. package/src/composites/FloatingPageChrome.tsx +294 -0
  319. package/src/composites/FormField.tsx +44 -0
  320. package/src/composites/GlassCard.tsx +47 -0
  321. package/src/composites/HeaderIconButton.tsx +49 -0
  322. package/src/composites/ListRow.tsx +29 -0
  323. package/src/composites/MediaEntryCard.tsx +95 -0
  324. package/src/composites/MobileTabBar.tsx +130 -0
  325. package/src/composites/NotificationBell.tsx +164 -0
  326. package/src/composites/PageHeader.tsx +27 -0
  327. package/src/composites/PageShell.tsx +20 -0
  328. package/src/composites/PageStickyHeader.tsx +157 -0
  329. package/src/composites/Pagination.tsx +41 -0
  330. package/src/composites/PhotoViewer.tsx +142 -0
  331. package/src/composites/PinPad.tsx +163 -0
  332. package/src/composites/ProfileHero.tsx +163 -0
  333. package/src/composites/QuickFilterRail.tsx +92 -0
  334. package/src/composites/QuickSettings.tsx +120 -0
  335. package/src/composites/RichTextEditor.tsx +103 -0
  336. package/src/composites/SearchField.tsx +38 -0
  337. package/src/composites/SectionPanel.tsx +59 -0
  338. package/src/composites/SegmentedControl.tsx +62 -0
  339. package/src/composites/StatCard.tsx +26 -0
  340. package/src/composites/StatusDot.tsx +40 -0
  341. package/src/composites/SurfaceCard.tsx +44 -0
  342. package/src/composites/Timeline.tsx +70 -0
  343. package/src/composites/Toast.tsx +135 -0
  344. package/src/composites/Toolbar.tsx +19 -0
  345. package/src/composites/ViewFiltersPanel.tsx +82 -0
  346. package/src/composites/chrome.test.tsx +170 -0
  347. package/src/composites/smoke.test.tsx +49 -0
  348. package/src/index.ts +355 -0
  349. package/src/lib/animations.ts +47 -0
  350. package/src/lib/avatar-utils.ts +52 -0
  351. package/src/lib/chips.ts +58 -0
  352. package/src/lib/cn.test.ts +16 -0
  353. package/src/lib/cn.ts +7 -0
  354. package/src/lib/compose-refs.ts +21 -0
  355. package/src/lib/cover-chrome.ts +31 -0
  356. package/src/lib/cover-pattern.ts +242 -0
  357. package/src/lib/overlay-stack.ts +44 -0
  358. package/src/lib/portal.tsx +21 -0
  359. package/src/lib/slot.tsx +69 -0
  360. package/src/lib/surfaces.ts +57 -0
  361. package/src/lib/themes.test.ts +73 -0
  362. package/src/lib/themes.ts +59 -0
  363. package/src/lib/tokens.test.ts +52 -0
  364. package/src/lib/typography.ts +27 -0
  365. package/src/lib/use-controllable-state.ts +38 -0
  366. package/src/lib/use-cover-chrome-bleed.ts +33 -0
  367. package/src/lib/use-dismissable.ts +49 -0
  368. package/src/lib/use-floating-position.ts +168 -0
  369. package/src/lib/use-focus-trap.ts +73 -0
  370. package/src/lib/use-media-query.ts +22 -0
  371. package/src/primitives/Accordion.tsx +114 -0
  372. package/src/primitives/Alert.tsx +57 -0
  373. package/src/primitives/AlertDialog.tsx +270 -0
  374. package/src/primitives/Avatar.tsx +140 -0
  375. package/src/primitives/Badge.test.tsx +15 -0
  376. package/src/primitives/Badge.tsx +43 -0
  377. package/src/primitives/Button.test.tsx +37 -0
  378. package/src/primitives/Button.tsx +58 -0
  379. package/src/primitives/Checkbox.tsx +75 -0
  380. package/src/primitives/Command.tsx +175 -0
  381. package/src/primitives/Dialog.tsx +241 -0
  382. package/src/primitives/DropdownMenu.tsx +552 -0
  383. package/src/primitives/Input.test.tsx +22 -0
  384. package/src/primitives/Input.tsx +22 -0
  385. package/src/primitives/Kbd.tsx +17 -0
  386. package/src/primitives/Label.tsx +20 -0
  387. package/src/primitives/NativeSelect.tsx +22 -0
  388. package/src/primitives/Popover.tsx +209 -0
  389. package/src/primitives/Progress.tsx +31 -0
  390. package/src/primitives/RadioGroup.tsx +116 -0
  391. package/src/primitives/Select.tsx +409 -0
  392. package/src/primitives/Separator.tsx +30 -0
  393. package/src/primitives/Sheet.tsx +265 -0
  394. package/src/primitives/Skeleton.tsx +16 -0
  395. package/src/primitives/Slider.tsx +97 -0
  396. package/src/primitives/Spinner.tsx +21 -0
  397. package/src/primitives/StarRating.tsx +53 -0
  398. package/src/primitives/Switch.tsx +68 -0
  399. package/src/primitives/Table.tsx +134 -0
  400. package/src/primitives/Tabs.tsx +97 -0
  401. package/src/primitives/Textarea.tsx +20 -0
  402. package/src/primitives/Tooltip.tsx +193 -0
  403. package/src/primitives/smoke.test.tsx +34 -0
  404. package/src/test/setup.ts +1 -0
  405. package/src/theme/SpatikaThemeProvider.test.tsx +82 -0
  406. package/src/theme/SpatikaThemeProvider.tsx +112 -0
package/src/index.ts ADDED
@@ -0,0 +1,355 @@
1
+ /**
2
+ * @spatika/react — Spatika React package
3
+ *
4
+ * Import tokens separately:
5
+ * import "@spatika/tokens/styles.css";
6
+ */
7
+
8
+ export { cn } from "./lib/cn";
9
+ export {
10
+ OVERLAY_Z_INDEX,
11
+ fixedLayerStyle,
12
+ createSelectEvent,
13
+ } from "./lib/overlay-stack";
14
+ export {
15
+ typographyEyebrow,
16
+ typographyBandEyebrow,
17
+ typographySectionLabel,
18
+ typographyPageTitle,
19
+ typographyPageSubtitle,
20
+ typographyBodyDense,
21
+ } from "./lib/typography";
22
+ export {
23
+ surfaceRadiusCard,
24
+ surfaceRadiusControl,
25
+ surfaceRadiusPill,
26
+ surfaceRadiusProfile,
27
+ surfacePrimaryClass,
28
+ surfaceSecondaryClass,
29
+ surfaceDetailClass,
30
+ surfaceTertiaryClass,
31
+ } from "./lib/surfaces";
32
+ export {
33
+ filterChipClass,
34
+ preferenceChipClass,
35
+ layoutToggleClass,
36
+ listRowToggleClass,
37
+ nativeSelectClass,
38
+ } from "./lib/chips";
39
+ export {
40
+ duration,
41
+ transition,
42
+ motionCardHover,
43
+ motionCardHoverEmphasis,
44
+ motionPress,
45
+ pageEnter,
46
+ cardEnter,
47
+ } from "./lib/animations";
48
+ export {
49
+ THEME_IDS,
50
+ THEME_LABELS,
51
+ DEFAULT_THEME,
52
+ SPATIKA_THEME_STORAGE_KEY,
53
+ applyTheme,
54
+ isDarkTheme,
55
+ isThemeId,
56
+ type ThemeId,
57
+ } from "./lib/themes";
58
+ export { getAvatarColor, getAvatarFallbackHue, getInitials } from "./lib/avatar-utils";
59
+ export {
60
+ COVER_PATTERN_KINDS,
61
+ getCoverPattern,
62
+ getCoverPatternKind,
63
+ getCoverPatternStyle,
64
+ isCoverPatternKind,
65
+ type CoverHeaderInk,
66
+ type CoverPatternInput,
67
+ type CoverPatternKind,
68
+ type CoverScene,
69
+ } from "./lib/cover-pattern";
70
+ export {
71
+ coverFloatingIconClass,
72
+ coverFloatingShellClass,
73
+ coverMutedClass,
74
+ coverPlateClass,
75
+ coverTitleClass,
76
+ } from "./lib/cover-chrome";
77
+ export { useCoverChromeBleed, type CoverChromeInk } from "./lib/use-cover-chrome-bleed";
78
+ export { useIsMobile, useMediaQuery } from "./lib/use-media-query";
79
+ export {
80
+ SpatikaThemeProvider,
81
+ useSpatikaTheme,
82
+ type SpatikaThemeContextValue,
83
+ type SpatikaThemeProviderProps,
84
+ } from "./theme/SpatikaThemeProvider";
85
+
86
+ export { Button, buttonVariants } from "./primitives/Button";
87
+ export { Badge, badgeVariants } from "./primitives/Badge";
88
+ export { Input } from "./primitives/Input";
89
+ export { Textarea } from "./primitives/Textarea";
90
+ export { Label } from "./primitives/Label";
91
+ export { Separator } from "./primitives/Separator";
92
+ export { Skeleton } from "./primitives/Skeleton";
93
+ export { Checkbox } from "./primitives/Checkbox";
94
+ export { Switch } from "./primitives/Switch";
95
+ export { RadioGroup, RadioGroupItem } from "./primitives/RadioGroup";
96
+ export { Progress } from "./primitives/Progress";
97
+ export { Slider } from "./primitives/Slider";
98
+ export { Avatar, AvatarImage, AvatarFallback, InitialsAvatar } from "./primitives/Avatar";
99
+ export {
100
+ Select,
101
+ SelectContent,
102
+ SelectGroup,
103
+ SelectItem,
104
+ SelectLabel,
105
+ SelectScrollDownButton,
106
+ SelectScrollUpButton,
107
+ SelectSeparator,
108
+ SelectTrigger,
109
+ SelectValue,
110
+ } from "./primitives/Select";
111
+ export { NativeSelect } from "./primitives/NativeSelect";
112
+ export { Spinner } from "./primitives/Spinner";
113
+ export { Alert, AlertTitle, AlertDescription, alertVariants } from "./primitives/Alert";
114
+ export { Kbd } from "./primitives/Kbd";
115
+ export { Tabs, TabsList, TabsTrigger, TabsContent } from "./primitives/Tabs";
116
+ export { Table, TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell, TableCaption } from "./primitives/Table";
117
+ export {
118
+ Dialog,
119
+ DialogTrigger,
120
+ DialogPortal,
121
+ DialogClose,
122
+ DialogOverlay,
123
+ DialogContent,
124
+ DialogHeader,
125
+ DialogFooter,
126
+ DialogTitle,
127
+ DialogDescription,
128
+ } from "./primitives/Dialog";
129
+ export {
130
+ AlertDialog,
131
+ AlertDialogPortal,
132
+ AlertDialogOverlay,
133
+ AlertDialogTrigger,
134
+ AlertDialogContent,
135
+ AlertDialogHeader,
136
+ AlertDialogFooter,
137
+ AlertDialogTitle,
138
+ AlertDialogDescription,
139
+ AlertDialogAction,
140
+ AlertDialogCancel,
141
+ } from "./primitives/AlertDialog";
142
+ export {
143
+ Sheet,
144
+ SheetTrigger,
145
+ SheetClose,
146
+ SheetContent,
147
+ SheetHeader,
148
+ SheetFooter,
149
+ SheetTitle,
150
+ SheetDescription,
151
+ } from "./primitives/Sheet";
152
+ export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor } from "./primitives/Popover";
153
+ export {
154
+ DropdownMenu,
155
+ DropdownMenuPortal,
156
+ DropdownMenuTrigger,
157
+ DropdownMenuContent,
158
+ DropdownMenuGroup,
159
+ DropdownMenuLabel,
160
+ DropdownMenuItem,
161
+ DropdownMenuCheckboxItem,
162
+ DropdownMenuRadioGroup,
163
+ DropdownMenuRadioItem,
164
+ DropdownMenuSeparator,
165
+ DropdownMenuShortcut,
166
+ DropdownMenuSub,
167
+ DropdownMenuSubTrigger,
168
+ DropdownMenuSubContent,
169
+ } from "./primitives/DropdownMenu";
170
+ export {
171
+ Command,
172
+ CommandDialog,
173
+ CommandInput,
174
+ CommandList,
175
+ CommandEmpty,
176
+ CommandGroup,
177
+ CommandItem,
178
+ CommandShortcut,
179
+ CommandSeparator,
180
+ } from "./primitives/Command";
181
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from "./primitives/Tooltip";
182
+ export {
183
+ Accordion,
184
+ AccordionItem,
185
+ AccordionTrigger,
186
+ AccordionContent,
187
+ } from "./primitives/Accordion";
188
+ export { StarRating } from "./primitives/StarRating";
189
+
190
+ export { GlassCard, glassCardVariants, type GlassCardProps } from "./composites/GlassCard";
191
+ export { SurfaceCard, surfaceCardVariants, type SurfaceCardProps } from "./composites/SurfaceCard";
192
+ export { PageStickyHeader, PageHeaderBadge, type PageStickyHeaderProps } from "./composites/PageStickyHeader";
193
+ export { PageShell, type PageShellProps } from "./composites/PageShell";
194
+ export { SectionPanel, type SectionPanelProps } from "./composites/SectionPanel";
195
+ export { Chip, chipVariants, type ChipProps } from "./composites/Chip";
196
+ export {
197
+ ChipGroup,
198
+ isOptionSelected,
199
+ toggleOptionValue,
200
+ type ChipGroupProps,
201
+ type ChipOption,
202
+ } from "./composites/ChipGroup";
203
+ export { EmptyState, type EmptyStateProps } from "./composites/EmptyState";
204
+ export { FormField, type FormFieldProps } from "./composites/FormField";
205
+ export { PageHeader, type PageHeaderProps } from "./composites/PageHeader";
206
+ export { StatCard, type StatCardProps } from "./composites/StatCard";
207
+ export { SearchField, type SearchFieldProps } from "./composites/SearchField";
208
+ export { Toolbar } from "./composites/Toolbar";
209
+ export { StatusDot, statusDotVariants } from "./composites/StatusDot";
210
+ export { ListRow } from "./composites/ListRow";
211
+ export { Breadcrumb, type BreadcrumbItem } from "./composites/Breadcrumb";
212
+ export { Pagination } from "./composites/Pagination";
213
+ export { Callout } from "./composites/Callout";
214
+ export { ActionBar } from "./composites/ActionBar";
215
+ export { DividerLabel } from "./composites/DividerLabel";
216
+ export {
217
+ Card,
218
+ CardHeader,
219
+ CardTitle,
220
+ CardDescription,
221
+ CardContent,
222
+ CardFooter,
223
+ type CardProps,
224
+ } from "./composites/Card";
225
+ export { AppHeader, type AppHeaderProps } from "./composites/AppHeader";
226
+ export {
227
+ ChromeAttachedCaret,
228
+ FloatingPageChromeBar,
229
+ FloatingPageChromeIdentity,
230
+ FloatingPageChromeSearchField,
231
+ FloatingPageChromeShell,
232
+ FLOATING_PAGE_CHROME_HEIGHT_CLASS,
233
+ FLOATING_PAGE_CHROME_POPOVER_OFFSET,
234
+ appChromeActionClusterClass,
235
+ appChromeClusterButtonClass,
236
+ floatingPageChromeAttachedPopoverClass,
237
+ floatingPageChromeClusterClass,
238
+ floatingPageChromeIconPillClass,
239
+ floatingPageChromeIdentityClass,
240
+ floatingPageChromePillClass,
241
+ floatingPageChromePrimaryClass,
242
+ floatingPageChromeSearchInputClass,
243
+ floatingPageChromeSearchWrapClass,
244
+ floatingPageChromeShellClass,
245
+ floatingPageChromeTrayClass,
246
+ type FloatingPageChromeBarProps,
247
+ type FloatingPageChromeIdentityProps,
248
+ type FloatingPageChromeSearchFieldProps,
249
+ } from "./composites/FloatingPageChrome";
250
+ export { CoverPattern, ProfileCoverPattern, type CoverPatternProps } from "./composites/CoverPattern";
251
+ export {
252
+ CoverHero,
253
+ type CoverHeroAvatar,
254
+ type CoverHeroFact,
255
+ type CoverHeroProps,
256
+ } from "./composites/CoverHero";
257
+ export {
258
+ AppSidebar,
259
+ type AppSidebarProps,
260
+ type SidebarNavItem,
261
+ type SidebarNavSection,
262
+ } from "./composites/AppSidebar";
263
+ export {
264
+ QuickSettings,
265
+ QuickSettingsGroup,
266
+ QuickSettingsRow,
267
+ type QuickSettingsProps,
268
+ } from "./composites/QuickSettings";
269
+ export {
270
+ PhotoViewer,
271
+ type PhotoViewerProps,
272
+ type PhotoViewerItem,
273
+ } from "./composites/PhotoViewer";
274
+ export { RichTextEditor, type RichTextEditorProps } from "./composites/RichTextEditor";
275
+ export { HeaderIconButton, type HeaderIconButtonProps } from "./composites/HeaderIconButton";
276
+ export {
277
+ QuickFilterRail,
278
+ type QuickFilterRailProps,
279
+ type QuickFilterGroup,
280
+ type QuickFilterItem,
281
+ } from "./composites/QuickFilterRail";
282
+ export {
283
+ BottomSheet,
284
+ Drawer,
285
+ DrawerTrigger,
286
+ DrawerClose,
287
+ DrawerPortal,
288
+ DrawerOverlay,
289
+ DrawerContent,
290
+ DrawerHeader,
291
+ DrawerFooter,
292
+ DrawerTitle,
293
+ DrawerDescription,
294
+ type BottomSheetProps,
295
+ } from "./composites/BottomSheet";
296
+ export { ViewFiltersPanel, type ViewFiltersPanelProps } from "./composites/ViewFiltersPanel";
297
+ export { FilterSheet, type FilterSheetProps } from "./composites/FilterSheet";
298
+ export {
299
+ NotificationBell,
300
+ type NotificationBellProps,
301
+ type NotificationItem,
302
+ } from "./composites/NotificationBell";
303
+ export {
304
+ CommandSearchField,
305
+ type CommandSearchFieldProps,
306
+ type CommandSearchResult,
307
+ } from "./composites/CommandSearchField";
308
+ export {
309
+ PinPad,
310
+ LockOverlay,
311
+ type PinPadProps,
312
+ type LockOverlayProps,
313
+ } from "./composites/PinPad";
314
+ export { MediaEntryCard, type MediaEntryCardProps } from "./composites/MediaEntryCard";
315
+ export { EntityMediaCard, type EntityMediaCardProps } from "./composites/EntityMediaCard";
316
+ export {
317
+ EntityCard,
318
+ EntityCardTitle,
319
+ EntityCardMeta,
320
+ EntityCardChip,
321
+ type EntityCardProps,
322
+ type EntityCardTitleProps,
323
+ type EntityCardMetaProps,
324
+ } from "./composites/EntityCard";
325
+ export {
326
+ MobileTabBar,
327
+ APP_TABBAR_CLEARANCE_CLASS,
328
+ type MobileTabBarProps,
329
+ type MobileTabItem,
330
+ } from "./composites/MobileTabBar";
331
+ export { ProfileHero, type ProfileHeroProps } from "./composites/ProfileHero";
332
+
333
+ export { AmountInput, type AmountInputProps } from "./composites/AmountInput";
334
+ export {
335
+ SegmentedControl,
336
+ type SegmentedControlProps,
337
+ type SegmentedControlOption,
338
+ } from "./composites/SegmentedControl";
339
+ export {
340
+ Toaster,
341
+ useToast,
342
+ type ToasterProps,
343
+ type ToastItem,
344
+ type ToastTone,
345
+ } from "./composites/Toast";
346
+ export {
347
+ Timeline,
348
+ TimelineItem,
349
+ type TimelineProps,
350
+ type TimelineItemProps,
351
+ } from "./composites/Timeline";
352
+ export {
353
+ DataTableToolbar,
354
+ type DataTableToolbarProps,
355
+ } from "./composites/DataTableToolbar";
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Animation language for Spatika.
3
+ *
4
+ * Micro — hover/focus/active (CSS only, ≤150ms)
5
+ * Meso — element entrances (200–300ms)
6
+ * Macro — page transitions / overlays (300–400ms)
7
+ *
8
+ * Never use transition-all on glass / backdrop-blur surfaces.
9
+ */
10
+
11
+ const easeOut: [number, number, number, number] = [0, 0, 0.2, 1];
12
+
13
+ export const duration = {
14
+ instant: 0.15,
15
+ fast: 0.2,
16
+ normal: 0.3,
17
+ slow: 0.4,
18
+ } as const;
19
+
20
+ export const transition = {
21
+ fast: { duration: duration.fast, ease: easeOut },
22
+ normal: { duration: duration.normal, ease: easeOut },
23
+ slow: { duration: duration.slow, ease: easeOut },
24
+ } as const;
25
+
26
+ /** Standard card hover — transform + shadow only. */
27
+ export const motionCardHover =
28
+ "transition-[transform,box-shadow,border-color] duration-200 ease-out hover:-translate-y-0.5 hover:shadow-lg hover:border-primary/20";
29
+
30
+ /** Emphasized card hover for hero / ranked cards. */
31
+ export const motionCardHoverEmphasis =
32
+ "transition-[transform,box-shadow,border-color] duration-200 ease-out hover:-translate-y-1 hover:shadow-xl hover:border-primary/30";
33
+
34
+ /** Interactive press feedback. */
35
+ export const motionPress = "active:scale-[0.98]";
36
+
37
+ export const pageEnter = {
38
+ initial: { opacity: 0 },
39
+ animate: { opacity: 1 },
40
+ transition: transition.normal,
41
+ };
42
+
43
+ export const cardEnter = {
44
+ initial: { opacity: 0, y: 8 },
45
+ animate: { opacity: 1, y: 0 },
46
+ transition: transition.normal,
47
+ };
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Stable avatar color class derived from a name hash.
3
+ * Used by InitialsAvatar for consistent tinting across renders.
4
+ */
5
+ export function getAvatarColor(name: string): string {
6
+ const colors = [
7
+ "bg-rose-500",
8
+ "bg-pink-500",
9
+ "bg-fuchsia-500",
10
+ "bg-purple-500",
11
+ "bg-violet-500",
12
+ "bg-indigo-500",
13
+ "bg-blue-500",
14
+ "bg-sky-500",
15
+ "bg-cyan-500",
16
+ "bg-teal-500",
17
+ "bg-emerald-500",
18
+ "bg-green-500",
19
+ "bg-orange-500",
20
+ "bg-amber-500",
21
+ ];
22
+
23
+ let hash = 0;
24
+ const safeName = name || "User";
25
+ for (let i = 0; i < safeName.length; i++) {
26
+ hash = safeName.charCodeAt(i) + ((hash << 5) - hash);
27
+ }
28
+
29
+ const index = Math.abs(hash) % colors.length;
30
+ return colors[index];
31
+ }
32
+
33
+ /** Stable 0–359 hue from a display name — used to tint generated covers. */
34
+ export function getAvatarFallbackHue(name: string): number {
35
+ let hash = 0;
36
+ const safeName = name || "User";
37
+ for (let i = 0; i < safeName.length; i++) {
38
+ hash = safeName.charCodeAt(i) + ((hash << 5) - hash);
39
+ }
40
+ return Math.abs(hash) % 360;
41
+ }
42
+
43
+ /** First two initials from a display name (uppercase). */
44
+ export function getInitials(name: string): string {
45
+ if (!name) return "";
46
+ return name
47
+ .split(" ")
48
+ .map((n) => n[0])
49
+ .join("")
50
+ .substring(0, 2)
51
+ .toUpperCase();
52
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Chip / toggle class recipes shared by filters and preference groups.
3
+ */
4
+ import { cn } from "./cn";
5
+
6
+ const filterChipBase =
7
+ "inline-flex min-h-7 max-w-full items-center justify-center rounded-full border px-2 py-0.5 text-left text-[10px] font-bold leading-snug shadow-sm transition-colors active:scale-[0.98] sm:min-h-8 sm:px-2.5 sm:py-1 sm:text-xs";
8
+
9
+ /** Soft filter pill (directory / history filters). */
10
+ export function filterChipClass(active: boolean, className?: string) {
11
+ return cn(
12
+ filterChipBase,
13
+ active
14
+ ? "border-primary/50 bg-primary/15 text-primary"
15
+ : "border-border/60 bg-background/80 text-foreground hover:bg-muted/40",
16
+ className,
17
+ );
18
+ }
19
+
20
+ /** Uppercase preference toggle chip (admin / settings). */
21
+ export function preferenceChipClass(active: boolean, className?: string) {
22
+ return cn(
23
+ "touch-manipulation rounded-xl border px-3 py-2 text-[10px] font-black uppercase tracking-widest shadow-sm transition-all active:scale-95",
24
+ active
25
+ ? "scale-[1.02] border-primary bg-primary text-primary-foreground shadow-primary/20"
26
+ : "border-border/50 bg-background/40 text-muted-foreground hover:border-primary/30 hover:text-primary",
27
+ className,
28
+ );
29
+ }
30
+
31
+ /** Layout mode toggle (grid / list / kanban). */
32
+ export function layoutToggleClass(active: boolean, className?: string) {
33
+ return cn(
34
+ "flex min-h-11 items-center justify-center gap-2 rounded-xl border px-3 text-sm font-bold shadow-sm transition-colors active:scale-[0.98]",
35
+ active
36
+ ? "border-primary/50 bg-primary/15 text-primary"
37
+ : "border-border/60 bg-background/80 text-foreground hover:bg-muted/40",
38
+ className,
39
+ );
40
+ }
41
+
42
+ /** Full-width selectable list row. */
43
+ export function listRowToggleClass(active: boolean, className?: string) {
44
+ return cn(
45
+ "flex min-h-11 w-full items-center justify-between gap-3 rounded-xl border px-3 py-2.5 text-left text-sm font-semibold shadow-sm transition-colors active:scale-[0.99]",
46
+ active
47
+ ? "border-primary/50 bg-primary/15 text-primary"
48
+ : "border-border/60 bg-background/80 text-foreground hover:bg-muted/40",
49
+ className,
50
+ );
51
+ }
52
+
53
+ export const nativeSelectClass = cn(
54
+ "mt-1 w-full min-h-11 px-3 rounded-xl border border-border/60 bg-background/80 text-sm font-semibold shadow-sm",
55
+ "text-foreground transition-colors",
56
+ "focus:outline-none focus:border-primary/40 focus:ring-2 focus:ring-primary/20",
57
+ "disabled:cursor-not-allowed disabled:opacity-50",
58
+ );
@@ -0,0 +1,16 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { cn } from "./cn";
3
+
4
+ describe("cn", () => {
5
+ it("merges class names", () => {
6
+ expect(cn("px-2", "py-1")).toBe("px-2 py-1");
7
+ });
8
+
9
+ it("resolves Tailwind conflicts via twMerge", () => {
10
+ expect(cn("px-2", "px-4")).toBe("px-4");
11
+ });
12
+
13
+ it("ignores falsy values", () => {
14
+ expect(cn("base", false && "hidden", undefined, null, "ok")).toBe("base ok");
15
+ });
16
+ });
package/src/lib/cn.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { clsx, type ClassValue } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ /** Merge Tailwind class names without conflicts. */
5
+ export function cn(...inputs: ClassValue[]) {
6
+ return twMerge(clsx(inputs));
7
+ }
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+
3
+ type PossibleRef<T> = React.Ref<T> | undefined;
4
+
5
+ /** Assigns a value to a React ref (callback or object ref). */
6
+ function setRef<T>(ref: PossibleRef<T>, value: T) {
7
+ if (typeof ref === "function") {
8
+ ref(value);
9
+ } else if (ref != null) {
10
+ (ref as React.MutableRefObject<T>).current = value;
11
+ }
12
+ }
13
+
14
+ /** Merges multiple refs into a single callback ref. */
15
+ export function composeRefs<T>(...refs: PossibleRef<T>[]) {
16
+ return (node: T) => {
17
+ for (const ref of refs) {
18
+ setRef(ref, node);
19
+ }
20
+ };
21
+ }
@@ -0,0 +1,31 @@
1
+ import { cn } from "./cn";
2
+ import type { CoverHeaderInk } from "./cover-pattern";
3
+
4
+ /** Floating glass pill sitting on a generated / photo cover. */
5
+ export function coverFloatingShellClass(_ink: CoverHeaderInk, className?: string): string {
6
+ return cn("cover-floating-shell", className);
7
+ }
8
+
9
+ export function coverFloatingIconClass(ink: CoverHeaderInk): string {
10
+ return ink === "light"
11
+ ? "text-white/90 hover:bg-white/20 hover:text-white"
12
+ : "text-zinc-800 hover:bg-zinc-950/[0.08] hover:text-zinc-950";
13
+ }
14
+
15
+ export function coverPlateClass(ink: CoverHeaderInk): string {
16
+ return ink === "light"
17
+ ? "border border-white/18 bg-black/40 backdrop-blur-[24px] backdrop-saturate-150 shadow-[0_8px_36px_rgba(0,0,0,0.45),inset_0_1px_0_rgba(255,255,255,0.18)]"
18
+ : "border border-white/60 bg-white/55 backdrop-blur-[20px] backdrop-saturate-150 shadow-[0_8px_32px_rgba(0,0,0,0.08),inset_0_1px_0_rgba(255,255,255,0.8)]";
19
+ }
20
+
21
+ export function coverTitleClass(ink: CoverHeaderInk): string {
22
+ return ink === "light"
23
+ ? "text-white [text-shadow:0_1px_10px_rgba(0,0,0,0.4)]"
24
+ : "text-zinc-950";
25
+ }
26
+
27
+ export function coverMutedClass(ink: CoverHeaderInk): string {
28
+ return ink === "light" ? "text-white/70" : "text-zinc-600";
29
+ }
30
+
31
+ export type { CoverHeaderInk };