@asevenid/ui 0.1.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 (314) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/dist/components/primitives/accordion.d.ts +10 -0
  4. package/dist/components/primitives/accordion.d.ts.map +1 -0
  5. package/dist/components/primitives/accordion.js +37 -0
  6. package/dist/components/primitives/accordion.js.map +1 -0
  7. package/dist/components/primitives/alert-dialog.d.ts +9 -0
  8. package/dist/components/primitives/alert-dialog.d.ts.map +1 -0
  9. package/dist/components/primitives/alert-dialog.js +58 -0
  10. package/dist/components/primitives/alert-dialog.js.map +1 -0
  11. package/dist/components/primitives/alert.d.ts +12 -0
  12. package/dist/components/primitives/alert.d.ts.map +1 -0
  13. package/dist/components/primitives/alert.js +32 -0
  14. package/dist/components/primitives/alert.js.map +1 -0
  15. package/dist/components/primitives/avatar.d.ts +20 -0
  16. package/dist/components/primitives/avatar.d.ts.map +1 -0
  17. package/dist/components/primitives/avatar.js +55 -0
  18. package/dist/components/primitives/avatar.js.map +1 -0
  19. package/dist/components/primitives/badge.d.ts +14 -0
  20. package/dist/components/primitives/badge.d.ts.map +1 -0
  21. package/dist/components/primitives/badge.js +42 -0
  22. package/dist/components/primitives/badge.js.map +1 -0
  23. package/dist/components/primitives/button.d.ts +7 -0
  24. package/dist/components/primitives/button.d.ts.map +1 -0
  25. package/dist/components/primitives/button.js +52 -0
  26. package/dist/components/primitives/button.js.map +1 -0
  27. package/dist/components/primitives/calendar.d.ts +7 -0
  28. package/dist/components/primitives/calendar.d.ts.map +1 -0
  29. package/dist/components/primitives/calendar.js +32 -0
  30. package/dist/components/primitives/calendar.js.map +1 -0
  31. package/dist/components/primitives/card.d.ts +14 -0
  32. package/dist/components/primitives/card.d.ts.map +1 -0
  33. package/dist/components/primitives/card.js +29 -0
  34. package/dist/components/primitives/card.js.map +1 -0
  35. package/dist/components/primitives/checkbox.d.ts +7 -0
  36. package/dist/components/primitives/checkbox.d.ts.map +1 -0
  37. package/dist/components/primitives/checkbox.js +51 -0
  38. package/dist/components/primitives/checkbox.js.map +1 -0
  39. package/dist/components/primitives/color-picker.d.ts +23 -0
  40. package/dist/components/primitives/color-picker.d.ts.map +1 -0
  41. package/dist/components/primitives/color-picker.js +128 -0
  42. package/dist/components/primitives/color-picker.js.map +1 -0
  43. package/dist/components/primitives/combobox.d.ts +17 -0
  44. package/dist/components/primitives/combobox.d.ts.map +1 -0
  45. package/dist/components/primitives/combobox.js +106 -0
  46. package/dist/components/primitives/combobox.js.map +1 -0
  47. package/dist/components/primitives/date-picker.d.ts +21 -0
  48. package/dist/components/primitives/date-picker.d.ts.map +1 -0
  49. package/dist/components/primitives/date-picker.js +81 -0
  50. package/dist/components/primitives/date-picker.js.map +1 -0
  51. package/dist/components/primitives/date-range-picker.d.ts +16 -0
  52. package/dist/components/primitives/date-range-picker.d.ts.map +1 -0
  53. package/dist/components/primitives/date-range-picker.js +51 -0
  54. package/dist/components/primitives/date-range-picker.js.map +1 -0
  55. package/dist/components/primitives/dialog.d.ts +8 -0
  56. package/dist/components/primitives/dialog.d.ts.map +1 -0
  57. package/dist/components/primitives/dialog.js +46 -0
  58. package/dist/components/primitives/dialog.js.map +1 -0
  59. package/dist/components/primitives/drawer.d.ts +2 -0
  60. package/dist/components/primitives/drawer.d.ts.map +1 -0
  61. package/dist/components/primitives/field.d.ts +19 -0
  62. package/dist/components/primitives/field.d.ts.map +1 -0
  63. package/dist/components/primitives/field.js +55 -0
  64. package/dist/components/primitives/field.js.map +1 -0
  65. package/dist/components/primitives/input-group.d.ts +11 -0
  66. package/dist/components/primitives/input-group.d.ts.map +1 -0
  67. package/dist/components/primitives/input-group.js +32 -0
  68. package/dist/components/primitives/input-group.js.map +1 -0
  69. package/dist/components/primitives/input.d.ts +7 -0
  70. package/dist/components/primitives/input.d.ts.map +1 -0
  71. package/dist/components/primitives/input.js +18 -0
  72. package/dist/components/primitives/input.js.map +1 -0
  73. package/dist/components/primitives/kbd.d.ts +13 -0
  74. package/dist/components/primitives/kbd.d.ts.map +1 -0
  75. package/dist/components/primitives/kbd.js +18 -0
  76. package/dist/components/primitives/kbd.js.map +1 -0
  77. package/dist/components/primitives/label.d.ts +7 -0
  78. package/dist/components/primitives/label.d.ts.map +1 -0
  79. package/dist/components/primitives/label.js +21 -0
  80. package/dist/components/primitives/label.js.map +1 -0
  81. package/dist/components/primitives/pagination.d.ts +12 -0
  82. package/dist/components/primitives/pagination.d.ts.map +1 -0
  83. package/dist/components/primitives/pagination.js +92 -0
  84. package/dist/components/primitives/pagination.js.map +1 -0
  85. package/dist/components/primitives/radio-group.d.ts +9 -0
  86. package/dist/components/primitives/radio-group.d.ts.map +1 -0
  87. package/dist/components/primitives/radio-group.js +36 -0
  88. package/dist/components/primitives/radio-group.js.map +1 -0
  89. package/dist/components/primitives/select.d.ts +7 -0
  90. package/dist/components/primitives/select.d.ts.map +1 -0
  91. package/dist/components/primitives/select.js +31 -0
  92. package/dist/components/primitives/select.js.map +1 -0
  93. package/dist/components/primitives/sheet.d.ts +2 -0
  94. package/dist/components/primitives/sheet.d.ts.map +1 -0
  95. package/dist/components/primitives/skeleton.d.ts +5 -0
  96. package/dist/components/primitives/skeleton.d.ts.map +1 -0
  97. package/dist/components/primitives/skeleton.js +15 -0
  98. package/dist/components/primitives/skeleton.js.map +1 -0
  99. package/dist/components/primitives/slider.d.ts +10 -0
  100. package/dist/components/primitives/slider.d.ts.map +1 -0
  101. package/dist/components/primitives/slider.js +91 -0
  102. package/dist/components/primitives/slider.js.map +1 -0
  103. package/dist/components/primitives/sonner.d.ts +5 -0
  104. package/dist/components/primitives/sonner.d.ts.map +1 -0
  105. package/dist/components/primitives/sonner.js +50 -0
  106. package/dist/components/primitives/sonner.js.map +1 -0
  107. package/dist/components/primitives/switch.d.ts +7 -0
  108. package/dist/components/primitives/switch.d.ts.map +1 -0
  109. package/dist/components/primitives/switch.js +22 -0
  110. package/dist/components/primitives/switch.js.map +1 -0
  111. package/dist/components/primitives/table.d.ts +10 -0
  112. package/dist/components/primitives/table.d.ts.map +1 -0
  113. package/dist/components/primitives/table.js +74 -0
  114. package/dist/components/primitives/table.js.map +1 -0
  115. package/dist/components/primitives/tabs.d.ts +6 -0
  116. package/dist/components/primitives/tabs.d.ts.map +1 -0
  117. package/dist/components/primitives/tabs.js +146 -0
  118. package/dist/components/primitives/tabs.js.map +1 -0
  119. package/dist/components/primitives/tag.d.ts +17 -0
  120. package/dist/components/primitives/tag.d.ts.map +1 -0
  121. package/dist/components/primitives/tag.js +71 -0
  122. package/dist/components/primitives/tag.js.map +1 -0
  123. package/dist/components/primitives/textarea.d.ts +7 -0
  124. package/dist/components/primitives/textarea.d.ts.map +1 -0
  125. package/dist/components/primitives/textarea.js +18 -0
  126. package/dist/components/primitives/textarea.js.map +1 -0
  127. package/dist/components/primitives/toggle-group.d.ts +9 -0
  128. package/dist/components/primitives/toggle-group.d.ts.map +1 -0
  129. package/dist/components/primitives/toggle-group.js +61 -0
  130. package/dist/components/primitives/toggle-group.js.map +1 -0
  131. package/dist/components/primitives/toggle.d.ts +7 -0
  132. package/dist/components/primitives/toggle.d.ts.map +1 -0
  133. package/dist/components/primitives/toggle.js +36 -0
  134. package/dist/components/primitives/toggle.js.map +1 -0
  135. package/dist/components/ui/accordion.d.ts +8 -0
  136. package/dist/components/ui/accordion.d.ts.map +1 -0
  137. package/dist/components/ui/accordion.js +67 -0
  138. package/dist/components/ui/accordion.js.map +1 -0
  139. package/dist/components/ui/alert-dialog.d.ts +19 -0
  140. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  141. package/dist/components/ui/alert-dialog.js +147 -0
  142. package/dist/components/ui/alert-dialog.js.map +1 -0
  143. package/dist/components/ui/alert.d.ts +10 -0
  144. package/dist/components/ui/alert.d.ts.map +1 -0
  145. package/dist/components/ui/alert.js +69 -0
  146. package/dist/components/ui/alert.js.map +1 -0
  147. package/dist/components/ui/avatar.d.ts +12 -0
  148. package/dist/components/ui/avatar.d.ts.map +1 -0
  149. package/dist/components/ui/avatar.js +106 -0
  150. package/dist/components/ui/avatar.js.map +1 -0
  151. package/dist/components/ui/badge.d.ts +10 -0
  152. package/dist/components/ui/badge.d.ts.map +1 -0
  153. package/dist/components/ui/badge.js +46 -0
  154. package/dist/components/ui/badge.js.map +1 -0
  155. package/dist/components/ui/breadcrumb.d.ts +12 -0
  156. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  157. package/dist/components/ui/breadcrumb.js +106 -0
  158. package/dist/components/ui/breadcrumb.js.map +1 -0
  159. package/dist/components/ui/button-group.d.ts +12 -0
  160. package/dist/components/ui/button-group.d.ts.map +1 -0
  161. package/dist/components/ui/button-group.js +78 -0
  162. package/dist/components/ui/button-group.js.map +1 -0
  163. package/dist/components/ui/button.d.ts +11 -0
  164. package/dist/components/ui/button.d.ts.map +1 -0
  165. package/dist/components/ui/button.js +59 -0
  166. package/dist/components/ui/button.js.map +1 -0
  167. package/dist/components/ui/calendar.d.ts +9 -0
  168. package/dist/components/ui/calendar.d.ts.map +1 -0
  169. package/dist/components/ui/calendar.js +175 -0
  170. package/dist/components/ui/calendar.js.map +1 -0
  171. package/dist/components/ui/card.d.ts +10 -0
  172. package/dist/components/ui/card.d.ts.map +1 -0
  173. package/dist/components/ui/card.js +93 -0
  174. package/dist/components/ui/card.js.map +1 -0
  175. package/dist/components/ui/checkbox.d.ts +5 -0
  176. package/dist/components/ui/checkbox.d.ts.map +1 -0
  177. package/dist/components/ui/combobox.d.ts +25 -0
  178. package/dist/components/ui/combobox.d.ts.map +1 -0
  179. package/dist/components/ui/combobox.js +246 -0
  180. package/dist/components/ui/combobox.js.map +1 -0
  181. package/dist/components/ui/dialog.d.ts +18 -0
  182. package/dist/components/ui/dialog.d.ts.map +1 -0
  183. package/dist/components/ui/dialog.js +125 -0
  184. package/dist/components/ui/dialog.js.map +1 -0
  185. package/dist/components/ui/drawer.d.ts +14 -0
  186. package/dist/components/ui/drawer.d.ts.map +1 -0
  187. package/dist/components/ui/drawer.js +131 -0
  188. package/dist/components/ui/drawer.js.map +1 -0
  189. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  190. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  191. package/dist/components/ui/dropdown-menu.js +234 -0
  192. package/dist/components/ui/dropdown-menu.js.map +1 -0
  193. package/dist/components/ui/field.d.ts +25 -0
  194. package/dist/components/ui/field.d.ts.map +1 -0
  195. package/dist/components/ui/field.js +223 -0
  196. package/dist/components/ui/field.js.map +1 -0
  197. package/dist/components/ui/input-group.d.ts +17 -0
  198. package/dist/components/ui/input-group.d.ts.map +1 -0
  199. package/dist/components/ui/input-group.js +136 -0
  200. package/dist/components/ui/input-group.js.map +1 -0
  201. package/dist/components/ui/input.d.ts +4 -0
  202. package/dist/components/ui/input.d.ts.map +1 -0
  203. package/dist/components/ui/input.js +24 -0
  204. package/dist/components/ui/input.js.map +1 -0
  205. package/dist/components/ui/kbd.d.ts +4 -0
  206. package/dist/components/ui/kbd.d.ts.map +1 -0
  207. package/dist/components/ui/kbd.js +33 -0
  208. package/dist/components/ui/kbd.js.map +1 -0
  209. package/dist/components/ui/label.d.ts +5 -0
  210. package/dist/components/ui/label.d.ts.map +1 -0
  211. package/dist/components/ui/label.js +25 -0
  212. package/dist/components/ui/label.js.map +1 -0
  213. package/dist/components/ui/pagination.d.ts +14 -0
  214. package/dist/components/ui/pagination.d.ts.map +1 -0
  215. package/dist/components/ui/pagination.js +39 -0
  216. package/dist/components/ui/pagination.js.map +1 -0
  217. package/dist/components/ui/popover.d.ts +11 -0
  218. package/dist/components/ui/popover.d.ts.map +1 -0
  219. package/dist/components/ui/popover.js +83 -0
  220. package/dist/components/ui/popover.js.map +1 -0
  221. package/dist/components/ui/radio-group.d.ts +6 -0
  222. package/dist/components/ui/radio-group.d.ts.map +1 -0
  223. package/dist/components/ui/radio-group.js +48 -0
  224. package/dist/components/ui/radio-group.js.map +1 -0
  225. package/dist/components/ui/select.d.ts +16 -0
  226. package/dist/components/ui/select.d.ts.map +1 -0
  227. package/dist/components/ui/select.js +181 -0
  228. package/dist/components/ui/select.js.map +1 -0
  229. package/dist/components/ui/separator.d.ts +5 -0
  230. package/dist/components/ui/separator.d.ts.map +1 -0
  231. package/dist/components/ui/separator.js +29 -0
  232. package/dist/components/ui/separator.js.map +1 -0
  233. package/dist/components/ui/sheet.d.ts +15 -0
  234. package/dist/components/ui/sheet.d.ts.map +1 -0
  235. package/dist/components/ui/sheet.js +130 -0
  236. package/dist/components/ui/sheet.js.map +1 -0
  237. package/dist/components/ui/sidebar.d.ts +70 -0
  238. package/dist/components/ui/sidebar.d.ts.map +1 -0
  239. package/dist/components/ui/sidebar.js +599 -0
  240. package/dist/components/ui/sidebar.js.map +1 -0
  241. package/dist/components/ui/skeleton.d.ts +3 -0
  242. package/dist/components/ui/skeleton.d.ts.map +1 -0
  243. package/dist/components/ui/skeleton.js +17 -0
  244. package/dist/components/ui/skeleton.js.map +1 -0
  245. package/dist/components/ui/slider.d.ts +5 -0
  246. package/dist/components/ui/slider.d.ts.map +1 -0
  247. package/dist/components/ui/slider.js +65 -0
  248. package/dist/components/ui/slider.js.map +1 -0
  249. package/dist/components/ui/sonner.d.ts +4 -0
  250. package/dist/components/ui/sonner.d.ts.map +1 -0
  251. package/dist/components/ui/sonner.js +33 -0
  252. package/dist/components/ui/sonner.js.map +1 -0
  253. package/dist/components/ui/spinner.d.ts +3 -0
  254. package/dist/components/ui/spinner.d.ts.map +1 -0
  255. package/dist/components/ui/spinner.js +19 -0
  256. package/dist/components/ui/spinner.js.map +1 -0
  257. package/dist/components/ui/switch.d.ts +7 -0
  258. package/dist/components/ui/switch.d.ts.map +1 -0
  259. package/dist/components/ui/switch.js +36 -0
  260. package/dist/components/ui/switch.js.map +1 -0
  261. package/dist/components/ui/table.d.ts +11 -0
  262. package/dist/components/ui/table.d.ts.map +1 -0
  263. package/dist/components/ui/table.js +117 -0
  264. package/dist/components/ui/table.js.map +1 -0
  265. package/dist/components/ui/tabs.d.ts +12 -0
  266. package/dist/components/ui/tabs.d.ts.map +1 -0
  267. package/dist/components/ui/tabs.js +94 -0
  268. package/dist/components/ui/tabs.js.map +1 -0
  269. package/dist/components/ui/textarea.d.ts +4 -0
  270. package/dist/components/ui/textarea.d.ts.map +1 -0
  271. package/dist/components/ui/textarea.js +21 -0
  272. package/dist/components/ui/textarea.js.map +1 -0
  273. package/dist/components/ui/toggle-group.d.ts +10 -0
  274. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  275. package/dist/components/ui/toggle-group.js +71 -0
  276. package/dist/components/ui/toggle-group.js.map +1 -0
  277. package/dist/components/ui/toggle.d.ts +10 -0
  278. package/dist/components/ui/toggle.d.ts.map +1 -0
  279. package/dist/components/ui/toggle.js +46 -0
  280. package/dist/components/ui/toggle.js.map +1 -0
  281. package/dist/components/ui/tooltip.d.ts +8 -0
  282. package/dist/components/ui/tooltip.d.ts.map +1 -0
  283. package/dist/components/ui/tooltip.js +58 -0
  284. package/dist/components/ui/tooltip.js.map +1 -0
  285. package/dist/design-system/modes/options.d.ts +26 -0
  286. package/dist/design-system/modes/options.d.ts.map +1 -0
  287. package/dist/design-system/modes/options.js +61 -0
  288. package/dist/design-system/modes/options.js.map +1 -0
  289. package/dist/design-system/modes/runtime.d.ts +34 -0
  290. package/dist/design-system/modes/runtime.d.ts.map +1 -0
  291. package/dist/design-system/modes/runtime.js +195 -0
  292. package/dist/design-system/modes/runtime.js.map +1 -0
  293. package/dist/hooks/use-mobile.d.ts +2 -0
  294. package/dist/hooks/use-mobile.d.ts.map +1 -0
  295. package/dist/hooks/use-mobile.js +16 -0
  296. package/dist/hooks/use-mobile.js.map +1 -0
  297. package/dist/index.d.ts +51 -0
  298. package/dist/index.d.ts.map +1 -0
  299. package/dist/index.js +306 -0
  300. package/dist/index.js.map +1 -0
  301. package/dist/lib/constants.d.ts +2 -0
  302. package/dist/lib/constants.d.ts.map +1 -0
  303. package/dist/lib/cva.d.ts +2 -0
  304. package/dist/lib/cva.d.ts.map +1 -0
  305. package/dist/lib/generate-shades.d.ts +39 -0
  306. package/dist/lib/generate-shades.d.ts.map +1 -0
  307. package/dist/lib/generate-shades.js +220 -0
  308. package/dist/lib/generate-shades.js.map +1 -0
  309. package/dist/lib/utils.d.ts +3 -0
  310. package/dist/lib/utils.d.ts.map +1 -0
  311. package/dist/lib/utils.js +10 -0
  312. package/dist/lib/utils.js.map +1 -0
  313. package/dist/styles.css +2 -0
  314. package/package.json +106 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-shades.js","sources":["../../src/lib/generate-shades.ts"],"sourcesContent":["import { formatCss, oklch, parse } from \"culori\"\n\nexport const SHADE_STEPS = [\n \"50\",\n \"100\",\n \"200\",\n \"300\",\n \"400\",\n \"500\",\n \"600\",\n \"700\",\n \"800\",\n \"900\",\n \"950\",\n] as const\n\nexport type ShadeStep = (typeof SHADE_STEPS)[number]\n\n// Lightness curve calibrated against Tailwind v4 blue OKLCH palette\n// so generated ramps sit visually alongside the bundled presets.\nexport const STEP_L: Record<ShadeStep, number> = {\n \"50\": 0.971,\n \"100\": 0.932,\n \"200\": 0.882,\n \"300\": 0.809,\n \"400\": 0.707,\n \"500\": 0.623,\n \"600\": 0.546,\n \"700\": 0.488,\n \"800\": 0.424,\n \"900\": 0.379,\n \"950\": 0.282,\n}\n\n// Chroma multipliers applied to the input color's chroma. Peaks at 500/600\n// then tapers toward both ends so 50 and 950 don't gamut-clip.\nconst STEP_C_SCALE: Record<ShadeStep, number> = {\n \"50\": 0.18,\n \"100\": 0.32,\n \"200\": 0.55,\n \"300\": 0.75,\n \"400\": 0.92,\n \"500\": 1.0,\n \"600\": 1.0,\n \"700\": 0.92,\n \"800\": 0.78,\n \"900\": 0.62,\n \"950\": 0.42,\n}\n\n// Hue rotation magnitudes per step (warm-to-cool direction). Cool-to-warm\n// flips the sign. Same trick Tailwind/Material/Radix all use to make ramps\n// feel less mechanical.\nconst HUE_SHIFT: Record<ShadeStep, number> = {\n \"50\": -10,\n \"100\": -8,\n \"200\": -5,\n \"300\": -3,\n \"400\": -1,\n \"500\": 0,\n \"600\": 0,\n \"700\": 2,\n \"800\": 4,\n \"900\": 6,\n \"950\": 8,\n}\n\n// Material 3 tonal palette: tones (T0–T100). Mapped step → tone, divided by\n// 100 to get OKLCH lightness.\nconst MATERIAL_TONE: Record<ShadeStep, number> = {\n \"50\": 99,\n \"100\": 95,\n \"200\": 90,\n \"300\": 80,\n \"400\": 70,\n \"500\": 60,\n \"600\": 50,\n \"700\": 40,\n \"800\": 30,\n \"900\": 20,\n \"950\": 10,\n}\n\n// Harmony (Evil Martians, APCA × OKLCH): fixed L and C per step, derived\n// from sampling the Yellow column in their Figma file. Yellow has the most\n// chroma-conservative ramp, so these values stay gamut-safe across all hues.\nconst HARMONY_L: Record<ShadeStep, number> = {\n \"50\": 0.99,\n \"100\": 0.96,\n \"200\": 0.91,\n \"300\": 0.84,\n \"400\": 0.78,\n \"500\": 0.72,\n \"600\": 0.59,\n \"700\": 0.5,\n \"800\": 0.37,\n \"900\": 0.25,\n \"950\": 0.13,\n}\n\nconst HARMONY_C: Record<ShadeStep, number> = {\n \"50\": 0.005,\n \"100\": 0.018,\n \"200\": 0.045,\n \"300\": 0.075,\n \"400\": 0.1,\n \"500\": 0.135,\n \"600\": 0.115,\n \"700\": 0.095,\n \"800\": 0.07,\n \"900\": 0.045,\n \"950\": 0.022,\n}\n\n// Per-L chroma cap for Material Tonal so saturated picks don't gamut-clip\n// at the very light or very dark ends.\nconst MATERIAL_C_CAP: Record<ShadeStep, number> = {\n \"50\": 0.05,\n \"100\": 0.1,\n \"200\": 0.15,\n \"300\": 0.2,\n \"400\": 0.25,\n \"500\": 0.3,\n \"600\": 0.3,\n \"700\": 0.25,\n \"800\": 0.2,\n \"900\": 0.15,\n \"950\": 0.1,\n}\n\n// Vivid P3: Tailwind v4's STEP_L lifted ~0.05 across the board so the whole\n// ramp reads luminous, and chroma targets pushed into the Display-P3 gamut\n// (peak 0.25 — above the sRGB-safe ~0.18). On P3 displays this looks ~30%\n// punchier than Tailwind v4; sRGB browsers clip gracefully.\nconst VIVID_L: Record<ShadeStep, number> = {\n \"50\": 0.98,\n \"100\": 0.95,\n \"200\": 0.9,\n \"300\": 0.84,\n \"400\": 0.76,\n \"500\": 0.68,\n \"600\": 0.6,\n \"700\": 0.53,\n \"800\": 0.46,\n \"900\": 0.4,\n \"950\": 0.32,\n}\n\nconst VIVID_C_TARGET: Record<ShadeStep, number> = {\n \"50\": 0.04,\n \"100\": 0.07,\n \"200\": 0.13,\n \"300\": 0.18,\n \"400\": 0.22,\n \"500\": 0.25,\n \"600\": 0.24,\n \"700\": 0.2,\n \"800\": 0.16,\n \"900\": 0.1,\n \"950\": 0.06,\n}\n\nexport const HUE_SHIFT_MODES = [\"off\", \"warm-to-cool\", \"cool-to-warm\"] as const\nexport type HueShiftMode = (typeof HUE_SHIFT_MODES)[number]\n\ntype FormulaOptions = { hueShift: HueShiftMode }\ntype FormulaFn = (\n hex: string,\n options: FormulaOptions\n) => Record<ShadeStep, string>\n\ntype ParsedInput = {\n l: number\n c: number\n h: number\n}\n\nfunction parseInput(hex: string): ParsedInput {\n const parsed = parse(hex)\n if (!parsed) {\n throw new Error(`Invalid color: ${hex}`)\n }\n const inOklch = oklch(parsed)\n if (!inOklch) {\n throw new Error(`Could not convert to OKLCH: ${hex}`)\n }\n const rawHue = inOklch.h\n const safeHue =\n typeof rawHue === \"number\" && Number.isFinite(rawHue) ? rawHue : 0\n return { l: inOklch.l, c: inOklch.c ?? 0, h: safeHue }\n}\n\nfunction withHue(\n baseHue: number,\n step: ShadeStep,\n hueShift: HueShiftMode\n): number {\n if (hueShift === \"off\") return baseHue\n const sign = hueShift === \"warm-to-cool\" ? 1 : -1\n return (((baseHue + sign * HUE_SHIFT[step]) % 360) + 360) % 360\n}\n\nfunction emit(l: number, c: number, h: number): string {\n return formatCss({ mode: \"oklch\", l, c: Math.max(0, c), h })\n}\n\nfunction tailwindV4(hex: string, { hueShift }: FormulaOptions) {\n const input = parseInput(hex)\n const result = {} as Record<ShadeStep, string>\n for (const step of SHADE_STEPS) {\n const l = STEP_L[step]\n const c = input.c * STEP_C_SCALE[step]\n const h = withHue(input.h, step, hueShift)\n result[step] = emit(l, c, h)\n }\n return result\n}\n\nfunction materialTonal(hex: string, { hueShift }: FormulaOptions) {\n const input = parseInput(hex)\n const result = {} as Record<ShadeStep, string>\n for (const step of SHADE_STEPS) {\n const l = MATERIAL_TONE[step] / 100\n const c = Math.min(input.c, MATERIAL_C_CAP[step])\n const h = withHue(input.h, step, hueShift)\n result[step] = emit(l, c, h)\n }\n return result\n}\n\nfunction harmony(hex: string, { hueShift }: FormulaOptions) {\n const input = parseInput(hex)\n const result = {} as Record<ShadeStep, string>\n for (const step of SHADE_STEPS) {\n const l = HARMONY_L[step]\n const c = HARMONY_C[step]\n const h = withHue(input.h, step, hueShift)\n result[step] = emit(l, c, h)\n }\n return result\n}\n\nfunction vividP3(hex: string, { hueShift }: FormulaOptions) {\n const input = parseInput(hex)\n const result = {} as Record<ShadeStep, string>\n for (const step of SHADE_STEPS) {\n const l = VIVID_L[step]\n const c = Math.max(input.c, VIVID_C_TARGET[step])\n const h = withHue(input.h, step, hueShift)\n result[step] = emit(l, c, h)\n }\n return result\n}\n\nexport const SHADE_FORMULAS = {\n \"tailwind-v4\": {\n label: \"Tailwind v4\",\n description: \"Fixed lightness curve, chroma scaled by input.\",\n fn: tailwindV4 as FormulaFn,\n },\n \"material-tonal\": {\n label: \"Material Tonal\",\n description:\n \"Material 3 tones; constant input chroma (capped per L) for vivid 50/950 ends.\",\n fn: materialTonal as FormulaFn,\n },\n harmony: {\n label: \"Harmony\",\n description:\n \"Evil Martians' APCA palette: fixed L and C per step, gamut-safe across all hues. Input contributes hue only.\",\n fn: harmony as FormulaFn,\n },\n \"vivid-p3\": {\n label: \"Vivid P3\",\n description:\n \"Lifted lightness + Display-P3 chroma targets. Uses input chroma when it exceeds the target so vivid picks stay vivid.\",\n fn: vividP3 as FormulaFn,\n },\n} as const\n\nexport type ShadeFormulaId = keyof typeof SHADE_FORMULAS\nexport const SHADE_FORMULA_IDS = Object.keys(SHADE_FORMULAS) as ShadeFormulaId[]\nexport const DEFAULT_FORMULA: ShadeFormulaId = \"tailwind-v4\"\n\nexport function generateShadesWith(\n hex: string,\n formula: ShadeFormulaId,\n options: FormulaOptions\n): Record<ShadeStep, string> {\n return SHADE_FORMULAS[formula].fn(hex, options)\n}\n\n// Back-compat: callers that don't care about formula get the Tailwind v4 ramp.\nexport function generateShades(hex: string): Record<ShadeStep, string> {\n return generateShadesWith(hex, DEFAULT_FORMULA, { hueShift: \"off\" })\n}\n\n// Effective lightness used by a formula at each step — drives the active-step\n// dot indicator in the UI. Mirrors what `fn` produces internally.\nexport function getEffectiveLightness(\n formula: ShadeFormulaId\n): Record<ShadeStep, number> {\n if (formula === \"material-tonal\") {\n const result = {} as Record<ShadeStep, number>\n for (const step of SHADE_STEPS) {\n result[step] = MATERIAL_TONE[step] / 100\n }\n return result\n }\n\n if (formula === \"harmony\") {\n return { ...HARMONY_L }\n }\n\n if (formula === \"vivid-p3\") {\n return { ...VIVID_L }\n }\n\n return { ...STEP_L }\n}\n"],"names":["SHADE_STEPS","STEP_L","STEP_C_SCALE","HUE_SHIFT","MATERIAL_TONE","HARMONY_L","HARMONY_C","MATERIAL_C_CAP","VIVID_L","VIVID_C_TARGET","HUE_SHIFT_MODES","parseInput","hex","parsed","parse","inOklch","oklch","rawHue","safeHue","withHue","baseHue","step","hueShift","emit","l","c","h","formatCss","tailwindV4","input","result","materialTonal","harmony","vividP3","SHADE_FORMULAS","SHADE_FORMULA_IDS","DEFAULT_FORMULA","generateShadesWith","formula","options","generateShades","getEffectiveLightness"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ClassValue } from 'clsx';
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAG5C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ import { clsx as t } from "clsx";
3
+ import { twMerge as e } from "tailwind-merge";
4
+ function c(...r) {
5
+ return e(t(r));
6
+ }
7
+ export {
8
+ c as cn
9
+ };
10
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../src/lib/utils.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"names":["cn","inputs","twMerge","clsx"],"mappings":";;;AAGO,SAASA,KAAMC,GAAsB;AAC1C,SAAOC,EAAQC,EAAKF,CAAM,CAAC;AAC7B;"}