@nori-ui/core 0.0.5 → 1.0.2

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 (387) hide show
  1. package/dist/animation/animated-view.cjs +13 -0
  2. package/dist/animation/animated-view.cjs.map +1 -0
  3. package/dist/animation/animated-view.d.cts +6 -0
  4. package/dist/animation/animated-view.d.ts +6 -0
  5. package/dist/animation/animated-view.js +4 -0
  6. package/dist/animation/animated-view.js.map +1 -0
  7. package/dist/animation/animated-view.web.cjs +9 -0
  8. package/dist/animation/animated-view.web.cjs.map +1 -0
  9. package/dist/animation/animated-view.web.d.cts +5 -0
  10. package/dist/animation/animated-view.web.d.ts +5 -0
  11. package/dist/animation/animated-view.web.js +8 -0
  12. package/dist/animation/animated-view.web.js.map +1 -0
  13. package/dist/animation/use-animated-number.cjs +80 -0
  14. package/dist/animation/use-animated-number.cjs.map +1 -0
  15. package/dist/animation/use-animated-number.d.cts +8 -0
  16. package/dist/animation/use-animated-number.d.ts +8 -0
  17. package/dist/animation/use-animated-number.js +4 -0
  18. package/dist/animation/use-animated-number.js.map +1 -0
  19. package/dist/animation/use-animated-number.web.cjs +28 -0
  20. package/dist/animation/use-animated-number.web.cjs.map +1 -0
  21. package/dist/animation/use-animated-number.web.d.cts +8 -0
  22. package/dist/animation/use-animated-number.web.d.ts +8 -0
  23. package/dist/animation/use-animated-number.web.js +25 -0
  24. package/dist/animation/use-animated-number.web.js.map +1 -0
  25. package/dist/{chunk-RX7UULY3.js → chunk-33S7ADWM.js} +3 -3
  26. package/dist/{chunk-RX7UULY3.js.map → chunk-33S7ADWM.js.map} +1 -1
  27. package/dist/chunk-3BDDPFCI.js +108 -0
  28. package/dist/chunk-3BDDPFCI.js.map +1 -0
  29. package/dist/chunk-3F4TXKDY.js +314 -0
  30. package/dist/chunk-3F4TXKDY.js.map +1 -0
  31. package/dist/chunk-5A2QOOVN.js +15 -0
  32. package/dist/chunk-5A2QOOVN.js.map +1 -0
  33. package/dist/chunk-5XEGZFG5.js +208 -0
  34. package/dist/chunk-5XEGZFG5.js.map +1 -0
  35. package/dist/chunk-6AD6KCVB.js +178 -0
  36. package/dist/chunk-6AD6KCVB.js.map +1 -0
  37. package/dist/chunk-7GPDNQSX.js +967 -0
  38. package/dist/chunk-7GPDNQSX.js.map +1 -0
  39. package/dist/chunk-7UKRN73P.js +42 -0
  40. package/dist/chunk-7UKRN73P.js.map +1 -0
  41. package/dist/chunk-7Z4NMNX6.js +64 -0
  42. package/dist/chunk-7Z4NMNX6.js.map +1 -0
  43. package/dist/chunk-ACLHDHX3.js +29 -0
  44. package/dist/chunk-ACLHDHX3.js.map +1 -0
  45. package/dist/chunk-BZLT6R62.js +80 -0
  46. package/dist/chunk-BZLT6R62.js.map +1 -0
  47. package/dist/chunk-CCUXO2HN.js +450 -0
  48. package/dist/chunk-CCUXO2HN.js.map +1 -0
  49. package/dist/chunk-CHXHRJNZ.js +43 -0
  50. package/dist/chunk-CHXHRJNZ.js.map +1 -0
  51. package/dist/chunk-DDGMLLS3.js +188 -0
  52. package/dist/chunk-DDGMLLS3.js.map +1 -0
  53. package/dist/chunk-EWWQQ5DB.js +654 -0
  54. package/dist/chunk-EWWQQ5DB.js.map +1 -0
  55. package/dist/chunk-FEPTH5RV.js +169 -0
  56. package/dist/chunk-FEPTH5RV.js.map +1 -0
  57. package/dist/{chunk-SSTXLK5I.js → chunk-FT2XBBQJ.js} +42 -6
  58. package/dist/chunk-FT2XBBQJ.js.map +1 -0
  59. package/dist/chunk-IKLA2CVQ.js +260 -0
  60. package/dist/chunk-IKLA2CVQ.js.map +1 -0
  61. package/dist/chunk-JQQ3FBN7.js +18 -0
  62. package/dist/chunk-JQQ3FBN7.js.map +1 -0
  63. package/dist/chunk-JSAG5YO7.js +69 -0
  64. package/dist/chunk-JSAG5YO7.js.map +1 -0
  65. package/dist/chunk-JZ774T7U.js +76 -0
  66. package/dist/chunk-JZ774T7U.js.map +1 -0
  67. package/dist/chunk-KWRDJPP3.js +10 -0
  68. package/dist/chunk-KWRDJPP3.js.map +1 -0
  69. package/dist/chunk-LVWNMQGR.js +1106 -0
  70. package/dist/chunk-LVWNMQGR.js.map +1 -0
  71. package/dist/chunk-LWLK6HSW.js +143 -0
  72. package/dist/chunk-LWLK6HSW.js.map +1 -0
  73. package/dist/chunk-MDOZGILD.js +134 -0
  74. package/dist/chunk-MDOZGILD.js.map +1 -0
  75. package/dist/chunk-MKSDYRWQ.js +446 -0
  76. package/dist/chunk-MKSDYRWQ.js.map +1 -0
  77. package/dist/chunk-MRJWPRCX.js +80 -0
  78. package/dist/chunk-MRJWPRCX.js.map +1 -0
  79. package/dist/chunk-NRYWNOG5.js +410 -0
  80. package/dist/chunk-NRYWNOG5.js.map +1 -0
  81. package/dist/chunk-OMU4R4Y5.js +144 -0
  82. package/dist/chunk-OMU4R4Y5.js.map +1 -0
  83. package/dist/chunk-PNP7L4TA.js +103 -0
  84. package/dist/chunk-PNP7L4TA.js.map +1 -0
  85. package/dist/chunk-QI6646JZ.js +3 -0
  86. package/dist/{chunk-UAKFCMWK.js.map → chunk-QI6646JZ.js.map} +1 -1
  87. package/dist/chunk-QJNV7YQP.js +138 -0
  88. package/dist/chunk-QJNV7YQP.js.map +1 -0
  89. package/dist/chunk-R5JMDDCB.js +292 -0
  90. package/dist/chunk-R5JMDDCB.js.map +1 -0
  91. package/dist/chunk-RB3YBWQ4.js +77 -0
  92. package/dist/chunk-RB3YBWQ4.js.map +1 -0
  93. package/dist/chunk-RFW5SRZA.js +23 -0
  94. package/dist/chunk-RFW5SRZA.js.map +1 -0
  95. package/dist/chunk-RGJ3NBKE.js +8 -0
  96. package/dist/chunk-RGJ3NBKE.js.map +1 -0
  97. package/dist/chunk-SFNDR6DI.js +485 -0
  98. package/dist/chunk-SFNDR6DI.js.map +1 -0
  99. package/dist/chunk-SWC5CNKE.js +13 -0
  100. package/dist/chunk-SWC5CNKE.js.map +1 -0
  101. package/dist/chunk-TLS54G6Y.js +15 -0
  102. package/dist/chunk-TLS54G6Y.js.map +1 -0
  103. package/dist/chunk-WCQVDF3K.js +12 -0
  104. package/dist/{chunk-7QVYU63E.js.map → chunk-WCQVDF3K.js.map} +1 -1
  105. package/dist/chunk-WGT345SV.js +427 -0
  106. package/dist/chunk-WGT345SV.js.map +1 -0
  107. package/dist/chunk-X7APG7G2.js +1566 -0
  108. package/dist/chunk-X7APG7G2.js.map +1 -0
  109. package/dist/chunk-XALU6LOT.js +306 -0
  110. package/dist/chunk-XALU6LOT.js.map +1 -0
  111. package/dist/chunk-YNKKEO2A.js +336 -0
  112. package/dist/chunk-YNKKEO2A.js.map +1 -0
  113. package/dist/chunk-ZBW3BA5R.js +148 -0
  114. package/dist/chunk-ZBW3BA5R.js.map +1 -0
  115. package/dist/{chunk-FXKIWONG.js → chunk-ZIBNLXIV.js} +12 -6
  116. package/dist/chunk-ZIBNLXIV.js.map +1 -0
  117. package/dist/chunk-ZMSIYLSI.js +563 -0
  118. package/dist/chunk-ZMSIYLSI.js.map +1 -0
  119. package/dist/chunk-ZQMNGPLE.js +981 -0
  120. package/dist/chunk-ZQMNGPLE.js.map +1 -0
  121. package/dist/chunk-ZRD4FQBT.js +153 -0
  122. package/dist/chunk-ZRD4FQBT.js.map +1 -0
  123. package/dist/client.cjs +11289 -439
  124. package/dist/client.cjs.map +1 -1
  125. package/dist/client.d.cts +68 -117
  126. package/dist/client.d.ts +68 -117
  127. package/dist/client.js +58 -40
  128. package/dist/client.js.map +1 -1
  129. package/dist/components/Accordion/index.cjs +900 -0
  130. package/dist/components/Accordion/index.cjs.map +1 -0
  131. package/dist/components/Accordion/index.d.cts +72 -0
  132. package/dist/components/Accordion/index.d.ts +72 -0
  133. package/dist/components/Accordion/index.js +10 -0
  134. package/dist/components/Accordion/index.js.map +1 -0
  135. package/dist/components/Alert/index.cjs +567 -0
  136. package/dist/components/Alert/index.cjs.map +1 -0
  137. package/dist/components/Alert/index.d.cts +41 -0
  138. package/dist/components/Alert/index.d.ts +41 -0
  139. package/dist/components/Alert/index.js +8 -0
  140. package/dist/components/Alert/index.js.map +1 -0
  141. package/dist/components/AlertDialog/index.cjs +892 -0
  142. package/dist/components/AlertDialog/index.cjs.map +1 -0
  143. package/dist/components/AlertDialog/index.d.cts +68 -0
  144. package/dist/components/AlertDialog/index.d.ts +68 -0
  145. package/dist/components/AlertDialog/index.js +9 -0
  146. package/dist/components/AlertDialog/index.js.map +1 -0
  147. package/dist/components/Avatar/index.cjs +427 -0
  148. package/dist/components/Avatar/index.cjs.map +1 -0
  149. package/dist/components/Avatar/index.d.cts +40 -0
  150. package/dist/components/Avatar/index.d.ts +40 -0
  151. package/dist/components/Avatar/index.js +7 -0
  152. package/dist/components/Avatar/index.js.map +1 -0
  153. package/dist/components/Badge/index.cjs +433 -0
  154. package/dist/components/Badge/index.cjs.map +1 -0
  155. package/dist/components/Badge/index.d.cts +35 -0
  156. package/dist/components/Badge/index.d.ts +35 -0
  157. package/dist/components/Badge/index.js +7 -0
  158. package/dist/components/Badge/index.js.map +1 -0
  159. package/dist/components/Box/index.cjs +415 -0
  160. package/dist/components/Box/index.cjs.map +1 -0
  161. package/dist/components/Box/index.d.cts +24 -0
  162. package/dist/components/Box/index.d.ts +24 -0
  163. package/dist/components/Box/index.js +9 -0
  164. package/dist/components/Box/index.js.map +1 -0
  165. package/dist/components/Breadcrumb/index.cjs +1939 -0
  166. package/dist/components/Breadcrumb/index.cjs.map +1 -0
  167. package/dist/components/Breadcrumb/index.d.cts +186 -0
  168. package/dist/components/Breadcrumb/index.d.ts +186 -0
  169. package/dist/components/Breadcrumb/index.js +11 -0
  170. package/dist/components/Breadcrumb/index.js.map +1 -0
  171. package/dist/components/Button/index.cjs +631 -0
  172. package/dist/components/Button/index.cjs.map +1 -0
  173. package/dist/components/Button/index.d.cts +27 -0
  174. package/dist/components/Button/index.d.ts +27 -0
  175. package/dist/components/Button/index.js +9 -0
  176. package/dist/components/Button/index.js.map +1 -0
  177. package/dist/components/Calendar/index.cjs +3017 -0
  178. package/dist/components/Calendar/index.cjs.map +1 -0
  179. package/dist/components/Calendar/index.d.cts +169 -0
  180. package/dist/components/Calendar/index.d.ts +169 -0
  181. package/dist/components/Calendar/index.js +11 -0
  182. package/dist/components/Calendar/index.js.map +1 -0
  183. package/dist/components/Card/index.cjs +469 -0
  184. package/dist/components/Card/index.cjs.map +1 -0
  185. package/dist/components/Card/index.d.cts +33 -0
  186. package/dist/components/Card/index.d.ts +33 -0
  187. package/dist/components/Card/index.js +7 -0
  188. package/dist/components/Card/index.js.map +1 -0
  189. package/dist/components/Checkbox/index.cjs +590 -0
  190. package/dist/components/Checkbox/index.cjs.map +1 -0
  191. package/dist/components/Checkbox/index.d.cts +22 -0
  192. package/dist/components/Checkbox/index.d.ts +22 -0
  193. package/dist/components/Checkbox/index.js +9 -0
  194. package/dist/components/Checkbox/index.js.map +1 -0
  195. package/dist/components/Dialog/index.cjs +888 -0
  196. package/dist/components/Dialog/index.cjs.map +1 -0
  197. package/dist/components/Dialog/index.d.cts +56 -0
  198. package/dist/components/Dialog/index.d.ts +56 -0
  199. package/dist/components/Dialog/index.js +10 -0
  200. package/dist/components/Dialog/index.js.map +1 -0
  201. package/dist/components/FloatButton/index.cjs +1254 -0
  202. package/dist/components/FloatButton/index.cjs.map +1 -0
  203. package/dist/components/FloatButton/index.d.cts +133 -0
  204. package/dist/components/FloatButton/index.d.ts +133 -0
  205. package/dist/components/FloatButton/index.js +11 -0
  206. package/dist/components/FloatButton/index.js.map +1 -0
  207. package/dist/components/HStack/index.cjs +480 -0
  208. package/dist/components/HStack/index.cjs.map +1 -0
  209. package/dist/components/HStack/index.d.cts +24 -0
  210. package/dist/components/HStack/index.d.ts +24 -0
  211. package/dist/components/HStack/index.js +9 -0
  212. package/dist/components/HStack/index.js.map +1 -0
  213. package/dist/components/InputGroup/index.cjs +638 -0
  214. package/dist/components/InputGroup/index.cjs.map +1 -0
  215. package/dist/components/InputGroup/index.d.cts +33 -0
  216. package/dist/components/InputGroup/index.d.ts +33 -0
  217. package/dist/components/InputGroup/index.js +7 -0
  218. package/dist/components/InputGroup/index.js.map +1 -0
  219. package/dist/components/Pagination/index.cjs +2501 -0
  220. package/dist/components/Pagination/index.cjs.map +1 -0
  221. package/dist/components/Pagination/index.d.cts +164 -0
  222. package/dist/components/Pagination/index.d.ts +164 -0
  223. package/dist/components/Pagination/index.js +12 -0
  224. package/dist/components/Pagination/index.js.map +1 -0
  225. package/dist/components/Popover/index.cjs +739 -0
  226. package/dist/components/Popover/index.cjs.map +1 -0
  227. package/dist/components/Popover/index.d.cts +44 -0
  228. package/dist/components/Popover/index.d.ts +44 -0
  229. package/dist/components/Popover/index.js +8 -0
  230. package/dist/components/Popover/index.js.map +1 -0
  231. package/dist/components/Progress/index.cjs +493 -0
  232. package/dist/components/Progress/index.cjs.map +1 -0
  233. package/dist/components/Progress/index.d.cts +63 -0
  234. package/dist/components/Progress/index.d.ts +63 -0
  235. package/dist/components/Progress/index.js +7 -0
  236. package/dist/components/Progress/index.js.map +1 -0
  237. package/dist/components/Radio/index.cjs +584 -0
  238. package/dist/components/Radio/index.cjs.map +1 -0
  239. package/dist/components/Radio/index.d.cts +51 -0
  240. package/dist/components/Radio/index.d.ts +51 -0
  241. package/dist/components/Radio/index.js +7 -0
  242. package/dist/components/Radio/index.js.map +1 -0
  243. package/dist/components/SegmentedControl/index.cjs +502 -0
  244. package/dist/components/SegmentedControl/index.cjs.map +1 -0
  245. package/dist/components/SegmentedControl/index.d.cts +45 -0
  246. package/dist/components/SegmentedControl/index.d.ts +45 -0
  247. package/dist/components/SegmentedControl/index.js +7 -0
  248. package/dist/components/SegmentedControl/index.js.map +1 -0
  249. package/dist/components/Select/index.cjs +1359 -0
  250. package/dist/components/Select/index.cjs.map +1 -0
  251. package/dist/components/Select/index.d.cts +140 -0
  252. package/dist/components/Select/index.d.ts +140 -0
  253. package/dist/components/Select/index.js +8 -0
  254. package/dist/components/Select/index.js.map +1 -0
  255. package/dist/components/Separator/index.cjs +358 -0
  256. package/dist/components/Separator/index.cjs.map +1 -0
  257. package/dist/components/Separator/index.d.cts +28 -0
  258. package/dist/components/Separator/index.d.ts +28 -0
  259. package/dist/components/Separator/index.js +6 -0
  260. package/dist/components/Separator/index.js.map +1 -0
  261. package/dist/components/Skeleton/index.cjs +384 -0
  262. package/dist/components/Skeleton/index.cjs.map +1 -0
  263. package/dist/components/Skeleton/index.d.cts +30 -0
  264. package/dist/components/Skeleton/index.d.ts +30 -0
  265. package/dist/components/Skeleton/index.js +6 -0
  266. package/dist/components/Skeleton/index.js.map +1 -0
  267. package/dist/components/Slider/index.cjs +880 -0
  268. package/dist/components/Slider/index.cjs.map +1 -0
  269. package/dist/components/Slider/index.d.cts +84 -0
  270. package/dist/components/Slider/index.d.ts +84 -0
  271. package/dist/components/Slider/index.js +6 -0
  272. package/dist/components/Slider/index.js.map +1 -0
  273. package/dist/components/Spinner/index.cjs +32 -0
  274. package/dist/components/Spinner/index.cjs.map +1 -0
  275. package/dist/components/Spinner/index.d.cts +25 -0
  276. package/dist/components/Spinner/index.d.ts +25 -0
  277. package/dist/components/Spinner/index.js +4 -0
  278. package/dist/components/Spinner/index.js.map +1 -0
  279. package/dist/components/Switch/index.cjs +623 -0
  280. package/dist/components/Switch/index.cjs.map +1 -0
  281. package/dist/components/Switch/index.d.cts +22 -0
  282. package/dist/components/Switch/index.d.ts +22 -0
  283. package/dist/components/Switch/index.js +10 -0
  284. package/dist/components/Switch/index.js.map +1 -0
  285. package/dist/components/Tabs/index.cjs +630 -0
  286. package/dist/components/Tabs/index.cjs.map +1 -0
  287. package/dist/components/Tabs/index.d.cts +63 -0
  288. package/dist/components/Tabs/index.d.ts +63 -0
  289. package/dist/components/Tabs/index.js +7 -0
  290. package/dist/components/Tabs/index.js.map +1 -0
  291. package/dist/components/Text/index.cjs +401 -0
  292. package/dist/components/Text/index.cjs.map +1 -0
  293. package/dist/components/Text/index.d.cts +24 -0
  294. package/dist/components/Text/index.d.ts +24 -0
  295. package/dist/components/Text/index.js +7 -0
  296. package/dist/components/Text/index.js.map +1 -0
  297. package/dist/components/TextArea/index.cjs +482 -0
  298. package/dist/components/TextArea/index.cjs.map +1 -0
  299. package/dist/components/TextArea/index.d.cts +25 -0
  300. package/dist/components/TextArea/index.d.ts +25 -0
  301. package/dist/components/TextArea/index.js +8 -0
  302. package/dist/components/TextArea/index.js.map +1 -0
  303. package/dist/components/TextInput/index.cjs +477 -0
  304. package/dist/components/TextInput/index.cjs.map +1 -0
  305. package/dist/components/TextInput/index.d.cts +33 -0
  306. package/dist/components/TextInput/index.d.ts +33 -0
  307. package/dist/components/TextInput/index.js +7 -0
  308. package/dist/components/TextInput/index.js.map +1 -0
  309. package/dist/components/Toast/index.cjs +167 -0
  310. package/dist/components/Toast/index.cjs.map +1 -0
  311. package/dist/components/Toast/index.d.cts +143 -0
  312. package/dist/components/Toast/index.d.ts +143 -0
  313. package/dist/components/Toast/index.js +4 -0
  314. package/dist/components/Toast/index.js.map +1 -0
  315. package/dist/components/Toggle/index.cjs +770 -0
  316. package/dist/components/Toggle/index.cjs.map +1 -0
  317. package/dist/components/Toggle/index.d.cts +83 -0
  318. package/dist/components/Toggle/index.d.ts +83 -0
  319. package/dist/components/Toggle/index.js +7 -0
  320. package/dist/components/Toggle/index.js.map +1 -0
  321. package/dist/components/Tooltip/index.cjs +813 -0
  322. package/dist/components/Tooltip/index.cjs.map +1 -0
  323. package/dist/components/Tooltip/index.d.cts +55 -0
  324. package/dist/components/Tooltip/index.d.ts +55 -0
  325. package/dist/components/Tooltip/index.js +8 -0
  326. package/dist/components/Tooltip/index.js.map +1 -0
  327. package/dist/components/VStack/index.cjs +480 -0
  328. package/dist/components/VStack/index.cjs.map +1 -0
  329. package/dist/components/VStack/index.d.cts +19 -0
  330. package/dist/components/VStack/index.d.ts +19 -0
  331. package/dist/components/VStack/index.js +9 -0
  332. package/dist/components/VStack/index.js.map +1 -0
  333. package/dist/i18n/index.cjs +39 -3
  334. package/dist/i18n/index.cjs.map +1 -1
  335. package/dist/i18n/index.d.cts +4 -60
  336. package/dist/i18n/index.d.ts +4 -60
  337. package/dist/i18n/index.js +3 -2
  338. package/dist/icons/index.cjs +326 -26
  339. package/dist/icons/index.cjs.map +1 -1
  340. package/dist/icons/index.js +4 -3
  341. package/dist/index-D3_M3G6U.d.ts +19 -0
  342. package/dist/index-uXPK_Rg8.d.cts +19 -0
  343. package/dist/index.cjs +11176 -463
  344. package/dist/index.cjs.map +1 -1
  345. package/dist/index.d.cts +39 -183
  346. package/dist/index.d.ts +39 -183
  347. package/dist/index.js +49 -9
  348. package/dist/resolve-D-GOaxZy.d.cts +60 -0
  349. package/dist/resolve-D-GOaxZy.d.ts +60 -0
  350. package/dist/slot/index.cjs +9 -3
  351. package/dist/slot/index.cjs.map +1 -1
  352. package/dist/slot/index.js +2 -2
  353. package/dist/stories/index.cjs +108 -0
  354. package/dist/stories/index.cjs.map +1 -0
  355. package/dist/stories/index.d.cts +46 -0
  356. package/dist/stories/index.d.ts +46 -0
  357. package/dist/stories/index.js +94 -0
  358. package/dist/stories/index.js.map +1 -0
  359. package/dist/theme/index.cjs +259 -26
  360. package/dist/theme/index.cjs.map +1 -1
  361. package/dist/theme/index.d.cts +26 -0
  362. package/dist/theme/index.d.ts +26 -0
  363. package/dist/theme/index.js +4 -3
  364. package/dist/use-theme-CoqfnvRs.d.cts +112 -0
  365. package/dist/use-theme-CoqfnvRs.d.ts +112 -0
  366. package/dist/utils/cn.cjs +18 -6
  367. package/dist/utils/cn.cjs.map +1 -1
  368. package/dist/utils/cn.js +2 -2
  369. package/package.json +41 -10
  370. package/dist/chunk-6OABNXBY.js +0 -213
  371. package/dist/chunk-6OABNXBY.js.map +0 -1
  372. package/dist/chunk-7QVYU63E.js +0 -6
  373. package/dist/chunk-FXKIWONG.js.map +0 -1
  374. package/dist/chunk-NDEDMCHT.js +0 -40
  375. package/dist/chunk-NDEDMCHT.js.map +0 -1
  376. package/dist/chunk-SSTXLK5I.js.map +0 -1
  377. package/dist/chunk-UAKFCMWK.js +0 -3
  378. package/dist/chunk-X3AJNNF6.js +0 -539
  379. package/dist/chunk-X3AJNNF6.js.map +0 -1
  380. package/dist/chunk-XGM2K4TT.js +0 -31
  381. package/dist/chunk-XGM2K4TT.js.map +0 -1
  382. package/dist/stories/story-registry.cjs +0 -776
  383. package/dist/stories/story-registry.cjs.map +0 -1
  384. package/dist/stories/story-registry.d.cts +0 -13
  385. package/dist/stories/story-registry.d.ts +0 -13
  386. package/dist/stories/story-registry.js +0 -106
  387. package/dist/stories/story-registry.js.map +0 -1
@@ -0,0 +1,336 @@
1
+ import { Slot } from './chunk-ZIBNLXIV.js';
2
+ import { px } from './chunk-5A2QOOVN.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
+ import { useThemeColors } from './chunk-R5JMDDCB.js';
5
+ import { __name } from './chunk-WCQVDF3K.js';
6
+ import { createContext, useState, useCallback, useId, useRef, useEffect, isValidElement, useContext } from 'react';
7
+ import { Text, Platform, Dimensions, View, Modal, Pressable } from 'react-native';
8
+ import { jsx } from 'nativewind/jsx-runtime';
9
+
10
+ var PopoverContext = createContext(null);
11
+ var usePopoverContext = /* @__PURE__ */ __name((label) => {
12
+ const ctx = useContext(PopoverContext);
13
+ if (!ctx) {
14
+ throw new Error(`<${label}> must be rendered inside a <Popover>.`);
15
+ }
16
+ return ctx;
17
+ }, "usePopoverContext");
18
+ var PopoverRoot = /* @__PURE__ */ __name(({ open, defaultOpen = false, onOpenChange, children }) => {
19
+ const [inner, setInner] = useState(defaultOpen);
20
+ const isControlled = open !== void 0;
21
+ const current = isControlled ? open : inner;
22
+ const setOpen = useCallback(
23
+ (next) => {
24
+ if (!isControlled) {
25
+ setInner(next);
26
+ }
27
+ onOpenChange?.(next);
28
+ },
29
+ [isControlled, onOpenChange]
30
+ );
31
+ const baseId = useId();
32
+ const triggerRef = useRef(null);
33
+ const contentRef = useRef(null);
34
+ const [triggerRect, setTriggerRect] = useState(null);
35
+ const measureTrigger = useCallback(() => {
36
+ const node = triggerRef.current;
37
+ if (!node || typeof node.getBoundingClientRect !== "function") {
38
+ return;
39
+ }
40
+ const rect = node.getBoundingClientRect();
41
+ setTriggerRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });
42
+ }, []);
43
+ const ctxValue = {
44
+ open: current,
45
+ setOpen,
46
+ contentId: `${baseId}-content`,
47
+ triggerRef,
48
+ contentRef,
49
+ triggerRect,
50
+ measureTrigger
51
+ };
52
+ return /* @__PURE__ */ jsx(PopoverContext.Provider, { value: ctxValue, children });
53
+ }, "PopoverRoot");
54
+ var PopoverTrigger = /* @__PURE__ */ __name(({ asChild = true, children, className, testID }) => {
55
+ const ctx = usePopoverContext("PopoverTrigger");
56
+ const onPress = useCallback(() => {
57
+ ctx.measureTrigger();
58
+ ctx.setOpen(!ctx.open);
59
+ }, [ctx]);
60
+ if (asChild && isValidElement(children)) {
61
+ const child = children;
62
+ const fire = /* @__PURE__ */ __name((existing) => (event) => {
63
+ existing?.(event);
64
+ ctx.measureTrigger();
65
+ ctx.setOpen(!ctx.open);
66
+ }, "fire");
67
+ return /* @__PURE__ */ jsx(
68
+ Slot,
69
+ {
70
+ ref: (node) => {
71
+ ctx.triggerRef.current = node;
72
+ },
73
+ onClick: fire(child.props.onClick),
74
+ onPress: fire(child.props.onPress),
75
+ "aria-haspopup": "dialog",
76
+ "aria-expanded": ctx.open,
77
+ "aria-controls": ctx.contentId,
78
+ ...testID !== void 0 ? { "data-testid": testID } : {},
79
+ ...className !== void 0 ? { className } : {},
80
+ children: child
81
+ }
82
+ );
83
+ }
84
+ return /* @__PURE__ */ jsx(
85
+ Pressable,
86
+ {
87
+ ref: (node) => {
88
+ ctx.triggerRef.current = node;
89
+ },
90
+ onPress,
91
+ ...{
92
+ "aria-haspopup": "dialog",
93
+ "aria-expanded": ctx.open,
94
+ "aria-controls": ctx.contentId
95
+ },
96
+ ...testID !== void 0 ? { testID } : {},
97
+ ...className !== void 0 ? { className } : {},
98
+ children: wrapStringChildren(children)
99
+ }
100
+ );
101
+ }, "PopoverTrigger");
102
+ function wrapStringChildren(children) {
103
+ if (typeof children === "string" || typeof children === "number") {
104
+ return /* @__PURE__ */ jsx(Text, { children });
105
+ }
106
+ return children;
107
+ }
108
+ __name(wrapStringChildren, "wrapStringChildren");
109
+ var GAP = 4;
110
+ var MIN_WIDTH = 200;
111
+ var VIEWPORT_MARGIN = 8;
112
+ function computePosition(rect, side, align, contentSize) {
113
+ const cw = contentSize?.width ?? MIN_WIDTH;
114
+ const ch = contentSize?.height ?? 0;
115
+ let top = 0;
116
+ let left = 0;
117
+ switch (side) {
118
+ case "top":
119
+ top = rect.top - GAP - ch;
120
+ break;
121
+ case "bottom":
122
+ top = rect.top + rect.height + GAP;
123
+ break;
124
+ case "left":
125
+ left = rect.left - GAP - cw;
126
+ break;
127
+ case "right":
128
+ left = rect.left + rect.width + GAP;
129
+ break;
130
+ }
131
+ if (side === "top" || side === "bottom") {
132
+ switch (align) {
133
+ case "start":
134
+ left = rect.left;
135
+ break;
136
+ case "center":
137
+ left = rect.left + rect.width / 2 - cw / 2;
138
+ break;
139
+ case "end":
140
+ left = rect.left + rect.width - cw;
141
+ break;
142
+ }
143
+ } else {
144
+ switch (align) {
145
+ case "start":
146
+ top = rect.top;
147
+ break;
148
+ case "center":
149
+ top = rect.top + rect.height / 2 - ch / 2;
150
+ break;
151
+ case "end":
152
+ top = rect.top + rect.height - ch;
153
+ break;
154
+ }
155
+ }
156
+ return { top, left };
157
+ }
158
+ __name(computePosition, "computePosition");
159
+ var PopoverContent = /* @__PURE__ */ __name(({
160
+ side = "bottom",
161
+ align = "center",
162
+ children,
163
+ className,
164
+ testID,
165
+ ...rest
166
+ }) => {
167
+ const ctx = usePopoverContext("PopoverContent");
168
+ const colors = useThemeColors();
169
+ const ariaLabel = rest["aria-label"];
170
+ const [contentSize, setContentSize] = useState(null);
171
+ useEffect(() => {
172
+ if (!ctx.open) {
173
+ return;
174
+ }
175
+ if (Platform.OS !== "web") {
176
+ return;
177
+ }
178
+ if (typeof document === "undefined") {
179
+ return;
180
+ }
181
+ ctx.measureTrigger();
182
+ const onDocMouseDown = /* @__PURE__ */ __name((event) => {
183
+ const target = event.target;
184
+ const trigger = ctx.triggerRef.current;
185
+ const content2 = ctx.contentRef.current;
186
+ if (trigger?.contains(target)) {
187
+ return;
188
+ }
189
+ if (content2?.contains(target)) {
190
+ return;
191
+ }
192
+ ctx.setOpen(false);
193
+ }, "onDocMouseDown");
194
+ const onKeyDown = /* @__PURE__ */ __name((event) => {
195
+ if (event.key === "Escape") {
196
+ event.preventDefault();
197
+ ctx.setOpen(false);
198
+ }
199
+ }, "onKeyDown");
200
+ const onResize = /* @__PURE__ */ __name(() => ctx.measureTrigger(), "onResize");
201
+ const onScroll = /* @__PURE__ */ __name(() => ctx.measureTrigger(), "onScroll");
202
+ document.addEventListener("mousedown", onDocMouseDown);
203
+ document.addEventListener("keydown", onKeyDown);
204
+ window.addEventListener("resize", onResize);
205
+ window.addEventListener("scroll", onScroll, true);
206
+ return () => {
207
+ document.removeEventListener("mousedown", onDocMouseDown);
208
+ document.removeEventListener("keydown", onKeyDown);
209
+ window.removeEventListener("resize", onResize);
210
+ window.removeEventListener("scroll", onScroll, true);
211
+ };
212
+ }, [ctx.open, ctx.measureTrigger, ctx.setOpen, ctx.triggerRef, ctx.contentRef]);
213
+ useEffect(() => {
214
+ if (!ctx.open) {
215
+ setContentSize(null);
216
+ }
217
+ }, [ctx.open]);
218
+ if (!ctx.open) {
219
+ return null;
220
+ }
221
+ const position = ctx.triggerRect ? computePosition(ctx.triggerRect, side, align, contentSize) : null;
222
+ const viewportWidth = Dimensions.get("window").width;
223
+ const maxContentWidth = Math.max(MIN_WIDTH, viewportWidth - VIEWPORT_MARGIN * 2);
224
+ const contentBaseStyle = {
225
+ minWidth: MIN_WIDTH,
226
+ maxWidth: maxContentWidth,
227
+ borderRadius: px(colors.radius.lg),
228
+ borderWidth: 1,
229
+ borderColor: colors.semantic.border.default,
230
+ backgroundColor: colors.semantic.background.elevated,
231
+ padding: px(colors.spacing["4"]),
232
+ ...Platform.OS === "web" ? {
233
+ boxShadow: "0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)",
234
+ // Subtle scale-in. Skipped on native (do nothing fancy there).
235
+ transition: "opacity 120ms ease-out, transform 120ms ease-out",
236
+ transform: "scale(1)",
237
+ opacity: 1
238
+ } : { elevation: 8 }
239
+ };
240
+ const measuredWidth = contentSize?.width ?? maxContentWidth;
241
+ const clampedLeft = position ? Math.min(
242
+ Math.max(VIEWPORT_MARGIN, position.left),
243
+ Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)
244
+ ) : 0;
245
+ const positionedStyle = Platform.OS === "web" ? position ? {
246
+ position: "fixed",
247
+ top: position.top,
248
+ left: clampedLeft,
249
+ zIndex: 50
250
+ } : {
251
+ // Trigger not yet measured — render off-screen for a
252
+ // frame to avoid a flash at (0,0).
253
+ position: "fixed",
254
+ top: -9999,
255
+ left: -9999,
256
+ zIndex: 50
257
+ } : {};
258
+ const content = /* @__PURE__ */ jsx(
259
+ View,
260
+ {
261
+ ref: (node) => {
262
+ ctx.contentRef.current = node;
263
+ if (Platform.OS !== "web") {
264
+ return;
265
+ }
266
+ if (!node) {
267
+ return;
268
+ }
269
+ if (typeof node.getBoundingClientRect !== "function") {
270
+ return;
271
+ }
272
+ const rect = node.getBoundingClientRect();
273
+ if (!contentSize || contentSize.width !== rect.width || contentSize.height !== rect.height) {
274
+ setContentSize({ width: rect.width, height: rect.height });
275
+ }
276
+ },
277
+ ...{
278
+ role: "dialog",
279
+ id: ctx.contentId,
280
+ ...ariaLabel !== void 0 ? { "aria-label": ariaLabel, accessibilityLabel: ariaLabel } : {}
281
+ },
282
+ ...testID !== void 0 ? { testID } : {},
283
+ className: cn(
284
+ "rounded-lg border border-semantic-border-default bg-semantic-background-elevated",
285
+ className
286
+ ),
287
+ style: [contentBaseStyle, positionedStyle],
288
+ children
289
+ }
290
+ );
291
+ if (Platform.OS === "web") {
292
+ return content;
293
+ }
294
+ return /* @__PURE__ */ jsx(Modal, { visible: ctx.open, transparent: true, animationType: "fade", onRequestClose: () => ctx.setOpen(false), children: /* @__PURE__ */ jsx(
295
+ Pressable,
296
+ {
297
+ accessibilityRole: "none",
298
+ "aria-hidden": true,
299
+ onPress: () => ctx.setOpen(false),
300
+ style: {
301
+ position: "absolute",
302
+ top: 0,
303
+ left: 0,
304
+ right: 0,
305
+ bottom: 0,
306
+ backgroundColor: "transparent"
307
+ },
308
+ children: /* @__PURE__ */ jsx(
309
+ Pressable,
310
+ {
311
+ onPress: (event) => event.stopPropagation?.(),
312
+ style: {
313
+ position: "absolute",
314
+ top: ctx.triggerRect ? side === "top" ? Math.max(VIEWPORT_MARGIN, ctx.triggerRect.top - GAP - 80) : ctx.triggerRect.top + ctx.triggerRect.height + GAP : 80,
315
+ // Clamp horizontally so a wide popover near the
316
+ // right edge can still grow leftward without
317
+ // overflowing the screen.
318
+ left: ctx.triggerRect ? Math.min(
319
+ Math.max(VIEWPORT_MARGIN, ctx.triggerRect.left),
320
+ Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)
321
+ ) : VIEWPORT_MARGIN * 2
322
+ },
323
+ children: content
324
+ }
325
+ )
326
+ }
327
+ ) });
328
+ }, "PopoverContent");
329
+ var Popover = Object.assign(PopoverRoot, {
330
+ Trigger: PopoverTrigger,
331
+ Content: PopoverContent
332
+ });
333
+
334
+ export { Popover };
335
+ //# sourceMappingURL=chunk-YNKKEO2A.js.map
336
+ //# sourceMappingURL=chunk-YNKKEO2A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Popover/Popover.tsx"],"names":["RNText","content"],"mappings":"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","file":"chunk-YNKKEO2A.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Dimensions, Modal, Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type PopoverSide = 'top' | 'right' | 'bottom' | 'left';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\ntype TriggerRect = { top: number; left: number; width: number; height: number };\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n contentId: string;\n triggerRef: { current: HTMLElement | null };\n contentRef: { current: HTMLDivElement | null };\n triggerRect: TriggerRect | null;\n measureTrigger: () => void;\n};\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null);\n\nconst usePopoverContext = (label: string): PopoverContextValue => {\n const ctx = useContext(PopoverContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Popover>.`);\n }\n return ctx;\n};\n\nexport type PopoverProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\n/**\n * Non-modal floating panel anchored to a trigger element. Use for help\n * tooltips with rich content, color pickers, or profile previews.\n *\n * Composition: `Popover` (root, owns open state), `PopoverTrigger`\n * (forwards events to its child via Slot when `asChild`), `PopoverContent`\n * (the floating surface).\n *\n * Differences from `Dialog`: non-modal — does NOT trap focus or lock\n * scroll. Tab moves outside as normal. Differences from `Tooltip`: can\n * contain interactive content (buttons, inputs, links) and dismisses on\n * outside-click + Escape rather than mouse-leave.\n *\n * Behavior:\n * - Trigger click toggles open/close.\n * - Click outside the content (and outside the trigger) closes.\n * - Escape closes.\n *\n * Cross-platform: uses RN `<Modal>` as the visibility/portal primitive on\n * native (transparent backdrop, tap-outside-to-close). On web, the content\n * uses `position: fixed` + a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`.\n */\nconst PopoverRoot = ({ open, defaultOpen = false, onOpenChange, children }: PopoverProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const baseId = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Measure the trigger so the content can render with `position: fixed` +\n // computed coords. position:fixed escapes any ancestor's overflow:hidden\n // (e.g. fumadocs Tabs panes, our Preview frame), which is the single\n // biggest source of \"the popup got cut off\" bugs.\n const [triggerRect, setTriggerRect] = useState<TriggerRect | null>(null);\n const measureTrigger = useCallback(() => {\n const node = triggerRef.current;\n if (!node || typeof node.getBoundingClientRect !== 'function') {\n return;\n }\n const rect = node.getBoundingClientRect();\n setTriggerRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });\n }, []);\n\n const ctxValue: PopoverContextValue = {\n open: current,\n setOpen,\n contentId: `${baseId}-content`,\n triggerRef,\n contentRef,\n triggerRect,\n measureTrigger,\n };\n\n return <PopoverContext.Provider value={ctxValue}>{children}</PopoverContext.Provider>;\n};\n\nexport type PopoverTriggerProps = {\n /** Render the child as the trigger (Slot pattern). Default true — pass `false` for an inline pressable. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that toggles the popover. Uses `asChild` by default so any\n * element (Button, Link, custom Pressable) becomes the trigger.\n *\n * The trigger element gets `aria-haspopup=\"dialog\"` and `aria-expanded`\n * so assistive tech announces the relationship.\n */\nexport const PopoverTrigger = ({ asChild = true, children, className, testID }: PopoverTriggerProps) => {\n const ctx = usePopoverContext('PopoverTrigger');\n const onPress = useCallback(() => {\n ctx.measureTrigger();\n ctx.setOpen(!ctx.open);\n }, [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Pass both onClick (web HTML buttons) AND onPress (RN Pressable /\n // our own Button) so the trigger fires regardless of which event\n // model the wrapped child speaks. The child's existing handler\n // runs first, then we toggle.\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n ctx.measureTrigger();\n ctx.setOpen(!ctx.open);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n aria-haspopup=\"dialog\"\n aria-expanded={ctx.open}\n aria-controls={ctx.contentId}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n ctx.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={onPress}\n {...({\n 'aria-haspopup': 'dialog',\n 'aria-expanded': ctx.open,\n 'aria-controls': ctx.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\n// On native, raw strings rendered as children of a non-Text component\n// throw \"Text strings must be rendered within a <Text> component\". On\n// web, react-native-web silently tolerates it. Wrap any string/number\n// children in an RNText so the same JSX renders cleanly on both\n// platforms. Non-string children are passed through unchanged.\nfunction wrapStringChildren(children: ReactNode): ReactNode {\n if (typeof children === 'string' || typeof children === 'number') {\n return <RNText>{children}</RNText>;\n }\n return children;\n}\n\nconst GAP = 4; // visual gap between trigger and content\nconst MIN_WIDTH = 200;\n// Margin reserved on each side so the popover never butts against the\n// viewport edge. Matches the 8px safe-area we use for native modal pads.\nconst VIEWPORT_MARGIN = 8;\n\nfunction computePosition(\n rect: TriggerRect,\n side: PopoverSide,\n align: PopoverAlign,\n contentSize: { width: number; height: number } | null\n): { top: number; left: number } {\n const cw = contentSize?.width ?? MIN_WIDTH;\n const ch = contentSize?.height ?? 0;\n\n let top = 0;\n let left = 0;\n\n switch (side) {\n case 'top':\n top = rect.top - GAP - ch;\n break;\n case 'bottom':\n top = rect.top + rect.height + GAP;\n break;\n case 'left':\n left = rect.left - GAP - cw;\n break;\n case 'right':\n left = rect.left + rect.width + GAP;\n break;\n }\n\n if (side === 'top' || side === 'bottom') {\n switch (align) {\n case 'start':\n left = rect.left;\n break;\n case 'center':\n left = rect.left + rect.width / 2 - cw / 2;\n break;\n case 'end':\n left = rect.left + rect.width - cw;\n break;\n }\n } else {\n switch (align) {\n case 'start':\n top = rect.top;\n break;\n case 'center':\n top = rect.top + rect.height / 2 - ch / 2;\n break;\n case 'end':\n top = rect.top + rect.height - ch;\n break;\n }\n }\n\n return { top, left };\n}\n\nexport type PopoverContentProps = {\n /** Side of the trigger to anchor on. @defaultValue 'bottom' */\n side?: PopoverSide;\n /** Alignment along the trigger edge. @defaultValue 'center' */\n align?: PopoverAlign;\n children?: ReactNode;\n className?: string;\n testID?: string;\n /** Accessible label when no visible heading is present. */\n 'aria-label'?: string;\n};\n\n/**\n * The floating popover surface. Renders only while open. On web uses\n * `position: fixed` with a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`. Non-modal: focus is NOT trapped inside —\n * the user can tab back out as normal.\n *\n * ARIA: `role=\"dialog\"` (without `aria-modal`) so assistive tech\n * announces it as a grouping but doesn't suppress the rest of the page.\n */\nexport const PopoverContent = ({\n side = 'bottom',\n align = 'center',\n children,\n className,\n testID,\n ...rest\n}: PopoverContentProps) => {\n const ctx = usePopoverContext('PopoverContent');\n const colors = useThemeColors();\n const ariaLabel = rest['aria-label'];\n\n // Measure content size after first paint so we can anchor `top`-style\n // popups (which need to know content height to render above the trigger).\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n\n // Web-only side effects: outside-click close, Escape close, re-measure\n // on resize. RN Modal handles its own dismissal on native (tap-outside\n // is the transparent overlay's onPress).\n useEffect(() => {\n if (!ctx.open) {\n return;\n }\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n ctx.measureTrigger();\n\n const onDocMouseDown = (event: MouseEvent) => {\n const target = event.target as Node;\n const trigger = ctx.triggerRef.current;\n const content = ctx.contentRef.current;\n if (trigger?.contains(target)) {\n return;\n }\n if (content?.contains(target)) {\n return;\n }\n ctx.setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n ctx.setOpen(false);\n }\n };\n const onResize = () => ctx.measureTrigger();\n const onScroll = () => ctx.measureTrigger();\n\n document.addEventListener('mousedown', onDocMouseDown);\n document.addEventListener('keydown', onKeyDown);\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('mousedown', onDocMouseDown);\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('scroll', onScroll, true);\n };\n // ctx is the provider's stable identity; we only care about open transitions.\n }, [ctx.open, ctx.measureTrigger, ctx.setOpen, ctx.triggerRef, ctx.contentRef]);\n\n // Reset measured size when popover closes so reopening re-measures fresh.\n useEffect(() => {\n if (!ctx.open) {\n setContentSize(null);\n }\n }, [ctx.open]);\n\n if (!ctx.open) {\n return null;\n }\n\n const position = ctx.triggerRect ? computePosition(ctx.triggerRect, side, align, contentSize) : null;\n\n // Viewport-aware max width. Web uses Dimensions.get('window') which\n // react-native-web maps to window.innerWidth; native uses the same API\n // for the device window. Subtract margin on both sides so content\n // doesn't kiss the screen edge.\n const viewportWidth = Dimensions.get('window').width;\n const maxContentWidth = Math.max(MIN_WIDTH, viewportWidth - VIEWPORT_MARGIN * 2);\n\n const contentBaseStyle: ViewStyle = {\n minWidth: MIN_WIDTH,\n maxWidth: maxContentWidth,\n borderRadius: px(colors.radius.lg),\n borderWidth: 1,\n borderColor: colors.semantic.border.default,\n backgroundColor: colors.semantic.background.elevated,\n padding: px(colors.spacing['4']),\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)',\n // Subtle scale-in. Skipped on native (do nothing fancy there).\n transition: 'opacity 120ms ease-out, transform 120ms ease-out',\n transform: 'scale(1)',\n opacity: 1,\n } as ViewStyle)\n : { elevation: 8 }),\n };\n\n // Clamp `left` so the popover stays within the viewport even when the\n // trigger sits near the right edge. First-paint fallback uses\n // `maxContentWidth` (the cap we apply via maxWidth above) — content\n // is allowed to grow up to that size, so assuming worst-case avoids\n // a one-frame overflow before measurement settles.\n const measuredWidth = contentSize?.width ?? maxContentWidth;\n const clampedLeft = position\n ? Math.min(\n Math.max(VIEWPORT_MARGIN, position.left),\n Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)\n )\n : 0;\n\n const positionedStyle: ViewStyle =\n Platform.OS === 'web'\n ? position\n ? ({\n position: 'fixed' as unknown as 'absolute',\n top: position.top,\n left: clampedLeft,\n zIndex: 50,\n } as ViewStyle)\n : ({\n // Trigger not yet measured — render off-screen for a\n // frame to avoid a flash at (0,0).\n position: 'fixed' as unknown as 'absolute',\n top: -9999,\n left: -9999,\n zIndex: 50,\n } as ViewStyle)\n : {};\n\n const content = (\n <View\n ref={(node) => {\n ctx.contentRef.current = node as unknown as HTMLDivElement | null;\n if (Platform.OS !== 'web') {\n return;\n }\n if (!node) {\n return;\n }\n if (typeof (node as unknown as HTMLDivElement).getBoundingClientRect !== 'function') {\n return;\n }\n const rect = (node as unknown as HTMLDivElement).getBoundingClientRect();\n if (!contentSize || contentSize.width !== rect.width || contentSize.height !== rect.height) {\n setContentSize({ width: rect.width, height: rect.height });\n }\n }}\n {...({\n role: 'dialog',\n id: ctx.contentId,\n ...(ariaLabel !== undefined ? { 'aria-label': ariaLabel, accessibilityLabel: ariaLabel } : {}),\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn(\n 'rounded-lg border border-semantic-border-default bg-semantic-background-elevated',\n className\n )}\n style={[contentBaseStyle, positionedStyle]}\n >\n {children}\n </View>\n );\n\n if (Platform.OS === 'web') {\n return content;\n }\n\n // Native: use Modal as the floating layer with a transparent backdrop.\n // Tap on the backdrop closes the popover.\n return (\n <Modal visible={ctx.open} transparent animationType=\"fade\" onRequestClose={() => ctx.setOpen(false)}>\n <Pressable\n accessibilityRole=\"none\"\n aria-hidden={true}\n onPress={() => ctx.setOpen(false)}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'transparent',\n }}\n >\n <Pressable\n onPress={(event) => event.stopPropagation?.()}\n style={{\n position: 'absolute',\n top: ctx.triggerRect\n ? side === 'top'\n ? Math.max(VIEWPORT_MARGIN, ctx.triggerRect.top - GAP - 80)\n : ctx.triggerRect.top + ctx.triggerRect.height + GAP\n : 80,\n // Clamp horizontally so a wide popover near the\n // right edge can still grow leftward without\n // overflowing the screen.\n left: ctx.triggerRect\n ? Math.min(\n Math.max(VIEWPORT_MARGIN, ctx.triggerRect.left),\n Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)\n )\n : VIEWPORT_MARGIN * 2,\n }}\n >\n {content}\n </Pressable>\n </Pressable>\n </Modal>\n );\n};\n\n/**\n * Public `Popover` value — the root function plus its `.Trigger` and `.Content`\n * static members. `Object.assign` produces a value whose inferred type carries\n * the static properties, so `.d.ts` consumers can write `<Popover.Trigger>`\n * without a separate import.\n */\nexport const Popover = Object.assign(PopoverRoot, {\n Trigger: PopoverTrigger,\n Content: PopoverContent,\n});\n"]}
@@ -0,0 +1,148 @@
1
+ import { useAnimatedNumber } from './chunk-RB3YBWQ4.js';
2
+ import { AnimatedView } from './chunk-RGJ3NBKE.js';
3
+ import { Slot } from './chunk-ZIBNLXIV.js';
4
+ import { px } from './chunk-5A2QOOVN.js';
5
+ import { cn } from './chunk-CHXHRJNZ.js';
6
+ import { useThemeColors } from './chunk-R5JMDDCB.js';
7
+ import { __name } from './chunk-WCQVDF3K.js';
8
+ import { useState, useCallback } from 'react';
9
+ import { Pressable, View, Text } from 'react-native';
10
+ import { jsx, jsxs } from 'nativewind/jsx-runtime';
11
+
12
+ var ROW_LAYOUT_BASE = { flexDirection: "row", alignItems: "center" };
13
+ var TRACK_BASE = {
14
+ width: 40,
15
+ height: 24,
16
+ borderRadius: 12,
17
+ // Relative so the absolutely-positioned thumb anchors against the
18
+ // track (not the page). The thumb's `left` value transitions between
19
+ // 2 (off) and 18 (on) — see thumb style below.
20
+ position: "relative"
21
+ };
22
+ var THUMB_BASE_STYLE = {
23
+ width: 20,
24
+ height: 20,
25
+ borderRadius: 10,
26
+ // Web: boxShadow (the modern CSS-style replacement for the legacy RN
27
+ // `shadow*` props that react-native-web has deprecated).
28
+ // Native: elevation (Android) — RN ignores boxShadow there.
29
+ ...{ boxShadow: "0 1px 2px rgba(0, 0, 0, 0.15)" },
30
+ elevation: 2
31
+ };
32
+ var Switch = /* @__PURE__ */ __name(({
33
+ checked,
34
+ defaultChecked = false,
35
+ disabled,
36
+ onChange,
37
+ label,
38
+ className,
39
+ testID,
40
+ asChild,
41
+ children
42
+ }) => {
43
+ const colors = useThemeColors();
44
+ const [inner, setInner] = useState(defaultChecked);
45
+ const isControlled = checked !== void 0;
46
+ const value = isControlled ? Boolean(checked) : inner;
47
+ const slide = useAnimatedNumber("left", value ? 18 : 2);
48
+ const toggle = useCallback(() => {
49
+ if (disabled) {
50
+ return;
51
+ }
52
+ const next = !value;
53
+ if (!isControlled) {
54
+ setInner(next);
55
+ }
56
+ onChange?.(next);
57
+ }, [disabled, value, isControlled, onChange]);
58
+ const ariaChecked = value ? "true" : "false";
59
+ const commonProps = {
60
+ role: "switch",
61
+ "aria-checked": ariaChecked,
62
+ accessibilityRole: "switch",
63
+ accessibilityState: { checked: value, disabled: Boolean(disabled) },
64
+ testID
65
+ };
66
+ if (disabled) {
67
+ commonProps["aria-disabled"] = true;
68
+ }
69
+ if (label !== void 0) {
70
+ commonProps["aria-label"] = label;
71
+ commonProps.accessibilityLabel = label;
72
+ }
73
+ if (asChild) {
74
+ const slotProps = {
75
+ role: "switch",
76
+ "aria-checked": ariaChecked,
77
+ onClick: toggle
78
+ };
79
+ if (disabled) {
80
+ slotProps["aria-disabled"] = true;
81
+ }
82
+ if (label !== void 0) {
83
+ slotProps["aria-label"] = label;
84
+ }
85
+ if (testID !== void 0) {
86
+ slotProps["data-testid"] = testID;
87
+ }
88
+ if (className !== void 0) {
89
+ slotProps.className = className;
90
+ }
91
+ return /* @__PURE__ */ jsx(Slot, { ...slotProps, children });
92
+ }
93
+ const trackClasses = cn(
94
+ "w-10 h-6 rounded-full justify-center px-0.5 transition-colors",
95
+ value ? "bg-semantic-interactive-primary" : "bg-neutral-300 dark:bg-neutral-700",
96
+ disabled ? "opacity-60" : void 0
97
+ );
98
+ const thumbClasses = cn("w-5 h-5 rounded-full bg-white dark:bg-neutral-100 shadow-sm");
99
+ const trackStyle = [
100
+ TRACK_BASE,
101
+ {
102
+ backgroundColor: value ? colors.semantic.interactive.primary : colors.color.neutral["600"],
103
+ // Subtle 180ms color transition between off → on. Web only;
104
+ // native has no equivalent for the track tint in v1.
105
+ ...{ transitionProperty: "background-color", transitionDuration: "180ms" }
106
+ },
107
+ disabled ? { opacity: 0.6 } : null
108
+ ];
109
+ const thumbStyle = [
110
+ THUMB_BASE_STYLE,
111
+ {
112
+ backgroundColor: colors.color.neutral["50"],
113
+ position: "absolute",
114
+ top: 2
115
+ },
116
+ slide
117
+ ];
118
+ const rowStyle = { ...ROW_LAYOUT_BASE, gap: px(colors.spacing["2"]) };
119
+ return /* @__PURE__ */ jsxs(
120
+ Pressable,
121
+ {
122
+ onPress: toggle,
123
+ ...commonProps,
124
+ className: cn("flex-row items-center gap-2", className),
125
+ style: rowStyle,
126
+ children: [
127
+ /* @__PURE__ */ jsx(View, { className: trackClasses, style: trackStyle, children: /* @__PURE__ */ jsx(AnimatedView, { className: thumbClasses, style: thumbStyle }) }),
128
+ label ? /* @__PURE__ */ jsx(
129
+ Text,
130
+ {
131
+ className: "text-md text-semantic-text-default",
132
+ style: {
133
+ color: colors.semantic.text.default,
134
+ fontFamily: colors.fontFamily.body,
135
+ fontSize: px(colors.fontSize.md)
136
+ },
137
+ children: label
138
+ }
139
+ ) : null,
140
+ children
141
+ ]
142
+ }
143
+ );
144
+ }, "Switch");
145
+
146
+ export { Switch };
147
+ //# sourceMappingURL=chunk-ZBW3BA5R.js.map
148
+ //# sourceMappingURL=chunk-ZBW3BA5R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Switch/Switch.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-ZBW3BA5R.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useCallback, useState } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { AnimatedView } from '../../animation/animated-view';\nimport { useAnimatedNumber } from '../../animation/use-animated-number';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type SwitchProps = {\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n onChange?: (next: boolean) => void;\n label?: string;\n className?: string;\n testID?: string;\n asChild?: boolean;\n children?: ReactNode;\n};\n\n// Layout-only base; row gap is theme-driven inside the component.\nconst ROW_LAYOUT_BASE: ViewStyle = { flexDirection: 'row', alignItems: 'center' };\n// Switch track + thumb are tightly coupled — width 40, height 24, thumb\n// 20×20, travel 18px. Component-density literals — not from theme.\nconst TRACK_BASE: ViewStyle = {\n width: 40,\n height: 24,\n borderRadius: 12,\n // Relative so the absolutely-positioned thumb anchors against the\n // track (not the page). The thumb's `left` value transitions between\n // 2 (off) and 18 (on) — see thumb style below.\n position: 'relative',\n};\nconst THUMB_BASE_STYLE: ViewStyle = {\n width: 20,\n height: 20,\n borderRadius: 10,\n // Web: boxShadow (the modern CSS-style replacement for the legacy RN\n // `shadow*` props that react-native-web has deprecated).\n // Native: elevation (Android) — RN ignores boxShadow there.\n ...({ boxShadow: '0 1px 2px rgba(0, 0, 0, 0.15)' } as ViewStyle),\n elevation: 2,\n};\n\n/**\n * Switch — a toggle control with role=\"switch\". Supports controlled + uncontrolled,\n * disabled state, asChild (via Slot), and a visible label that doubles as the\n * accessibility label.\n */\nexport const Switch = ({\n checked,\n defaultChecked = false,\n disabled,\n onChange,\n label,\n className,\n testID,\n asChild,\n children,\n}: SwitchProps) => {\n const colors = useThemeColors();\n const [inner, setInner] = useState<boolean>(defaultChecked);\n const isControlled = checked !== undefined;\n const value = isControlled ? Boolean(checked) : inner;\n // Pulled up here (above the asChild early-return) so the hook is\n // called on every render path, not conditionally. The slide isn't\n // used in the asChild branch, but the wasted work is tiny.\n const slide = useAnimatedNumber('left', value ? 18 : 2);\n\n const toggle = useCallback(() => {\n if (disabled) {\n return;\n }\n const next = !value;\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n }, [disabled, value, isControlled, onChange]);\n\n const ariaChecked: 'true' | 'false' = value ? 'true' : 'false';\n\n const commonProps: Record<string, unknown> = {\n role: 'switch',\n 'aria-checked': ariaChecked,\n accessibilityRole: 'switch' as const,\n accessibilityState: { checked: value, disabled: Boolean(disabled) },\n testID,\n };\n if (disabled) {\n commonProps['aria-disabled'] = true;\n }\n if (label !== undefined) {\n commonProps['aria-label'] = label;\n commonProps.accessibilityLabel = label;\n }\n\n if (asChild) {\n const slotProps: Record<string, unknown> = {\n role: 'switch',\n 'aria-checked': ariaChecked,\n onClick: toggle,\n };\n if (disabled) {\n slotProps['aria-disabled'] = true;\n }\n if (label !== undefined) {\n slotProps['aria-label'] = label;\n }\n if (testID !== undefined) {\n slotProps['data-testid'] = testID;\n }\n if (className !== undefined) {\n slotProps.className = className;\n }\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n const trackClasses = cn(\n 'w-10 h-6 rounded-full justify-center px-0.5 transition-colors',\n value ? 'bg-semantic-interactive-primary' : 'bg-neutral-300 dark:bg-neutral-700',\n disabled ? 'opacity-60' : undefined\n );\n // Position is set inline below (absolute + animated `left`), so no\n // self-start/self-end classes here — they'd fight the inline position.\n const thumbClasses = cn('w-5 h-5 rounded-full bg-white dark:bg-neutral-100 shadow-sm');\n\n const trackStyle = [\n TRACK_BASE,\n {\n backgroundColor: value ? colors.semantic.interactive.primary : colors.color.neutral['600'],\n // Subtle 180ms color transition between off → on. Web only;\n // native has no equivalent for the track tint in v1.\n ...({ transitionProperty: 'background-color', transitionDuration: '180ms' } as ViewStyle),\n },\n disabled ? { opacity: 0.6 } : null,\n ];\n // Thumb stays a near-white disc — we deliberately don't go to a dark\n // grey on dark mode because the thumb needs to read as the \"moveable\n // puck\" against the track in both schemes.\n //\n // Animation: thumb slides between left:2 (off) and left:18 (on) —\n // track width 40 - padding 2 - thumb 20 = 18 px travel. The\n // useAnimatedNumber hook picks the right engine per platform (web\n // CSS transition / reanimated spring / RN Animated). The hook is\n // called once at the top of the function — see the `slide` above.\n const thumbStyle = [\n THUMB_BASE_STYLE,\n {\n backgroundColor: colors.color.neutral['50'],\n position: 'absolute' as const,\n top: 2,\n } as ViewStyle,\n slide as ViewStyle,\n ];\n\n // Whole-row Pressable so clicking the label toggles the switch. The\n // visible track is a non-interactive View — one role=\"switch\" per\n // logical control, not two competing hit-areas.\n const rowStyle: ViewStyle = { ...ROW_LAYOUT_BASE, gap: px(colors.spacing['2']) };\n\n return (\n <Pressable\n onPress={toggle}\n {...commonProps}\n className={cn('flex-row items-center gap-2', className)}\n style={rowStyle}\n >\n <View className={trackClasses} style={trackStyle}>\n {/*\n * Animated.View — the slide style fragment from\n * `useAnimatedNumber` contains an `Animated.Value` on\n * native; a plain `View` would render the value as 0\n * (no animation). On web, the same fragment is plain\n * CSS and `Animated.View` falls through to a regular\n * div via react-native-web.\n */}\n <AnimatedView className={thumbClasses} style={thumbStyle} />\n </View>\n {label ? (\n <RNText\n className=\"text-md text-semantic-text-default\"\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n }}\n >\n {label}\n </RNText>\n ) : null}\n {children}\n </Pressable>\n );\n};\n"]}
@@ -1,11 +1,13 @@
1
- import { __name } from './chunk-7QVYU63E.js';
1
+ import { __name } from './chunk-WCQVDF3K.js';
2
2
  import { forwardRef, isValidElement, Children, cloneElement } from 'react';
3
3
 
4
4
  // src/slot/compose-refs.ts
5
5
  function composeRefs(...refs) {
6
6
  return (node) => {
7
7
  for (const ref of refs) {
8
- if (ref == null) continue;
8
+ if (ref == null) {
9
+ continue;
10
+ }
9
11
  if (typeof ref === "function") {
10
12
  ref(node);
11
13
  } else {
@@ -62,8 +64,12 @@ function joinClass(outer, inner) {
62
64
  }
63
65
  __name(joinClass, "joinClass");
64
66
  function isEventHandler(key, outer, inner) {
65
- if (!key.startsWith("on") || key.length < 3) return false;
66
- if (key[2] !== key[2]?.toUpperCase()) return false;
67
+ if (!key.startsWith("on") || key.length < 3) {
68
+ return false;
69
+ }
70
+ if (key[2] !== key[2]?.toUpperCase()) {
71
+ return false;
72
+ }
67
73
  return typeof outer === "function" && typeof inner === "function";
68
74
  }
69
75
  __name(isEventHandler, "isEventHandler");
@@ -76,5 +82,5 @@ function composeHandlers(outer, inner) {
76
82
  __name(composeHandlers, "composeHandlers");
77
83
 
78
84
  export { Slot, composeRefs };
79
- //# sourceMappingURL=chunk-FXKIWONG.js.map
80
- //# sourceMappingURL=chunk-FXKIWONG.js.map
85
+ //# sourceMappingURL=chunk-ZIBNLXIV.js.map
86
+ //# sourceMappingURL=chunk-ZIBNLXIV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/slot/compose-refs.ts","../src/slot/slot.tsx"],"names":["Slot"],"mappings":"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","file":"chunk-ZIBNLXIV.js","sourcesContent":["// composeRefs — merges multiple React refs (callback or object) into a single callback.\n// Derived from Radix UI's approach; reimplemented here so we don't take a Radix dependency.\n\nimport type { MutableRefObject, Ref, RefCallback } from 'react';\n\ntype PossibleRef<T> = Ref<T> | undefined;\n\nexport function composeRefs<T>(...refs: Array<PossibleRef<T>>): RefCallback<T> {\n return (node: T | null) => {\n for (const ref of refs) {\n if (ref == null) {\n continue;\n }\n if (typeof ref === 'function') {\n ref(node);\n } else {\n // React's MutableRefObject typing — we assign .current directly.\n (ref as MutableRefObject<T | null>).current = node;\n }\n }\n };\n}\n","import type { CSSProperties, ReactElement, Ref } from 'react';\nimport { Children, cloneElement, forwardRef, isValidElement } from 'react';\nimport { composeRefs } from './compose-refs';\n\ntype AnyProps = Record<string, unknown>;\n\nexport type SlotProps = {\n children?: React.ReactNode;\n} & AnyProps;\n\nexport const Slot = forwardRef<unknown, SlotProps>(function Slot(props, forwardedRef) {\n const { children, ...slotProps } = props;\n\n if (!isValidElement(children)) {\n return null;\n }\n\n // Assert that children is a single React element with props — we've narrowed above.\n const child = Children.only(children) as ReactElement<AnyProps> & { ref?: Ref<unknown> };\n const merged = mergeProps(slotProps, child.props);\n\n // Merge refs: Slot's forwarded ref + the child's own ref (if any).\n const childRef = (child as unknown as { ref?: Ref<unknown> }).ref;\n if (forwardedRef || childRef) {\n (merged as AnyProps).ref = composeRefs(forwardedRef, childRef);\n }\n\n return cloneElement(child, merged);\n});\nSlot.displayName = 'Slot';\n\nfunction mergeProps(outer: AnyProps, inner: AnyProps): AnyProps {\n // Inner (child) wins for everything except: className (concatenated), style (merged), and\n // event handlers (composed — outer runs first, then inner).\n const merged: AnyProps = { ...outer };\n\n for (const key of Object.keys(inner)) {\n const outerValue = outer[key];\n const innerValue = inner[key];\n\n if (key === 'className' || key === 'class') {\n merged[key] = joinClass(outerValue, innerValue);\n continue;\n }\n\n if (key === 'style') {\n merged[key] = {\n ...(outerValue as CSSProperties | undefined),\n ...(innerValue as CSSProperties | undefined),\n };\n continue;\n }\n\n if (isEventHandler(key, outerValue, innerValue)) {\n merged[key] = composeHandlers(outerValue as Fn, innerValue as Fn);\n continue;\n }\n\n merged[key] = innerValue;\n }\n\n return merged;\n}\n\nfunction joinClass(outer: unknown, inner: unknown): string | undefined {\n const a = typeof outer === 'string' ? outer : '';\n const b = typeof inner === 'string' ? inner : '';\n const joined = [a, b].filter(Boolean).join(' ');\n return joined.length > 0 ? joined : undefined;\n}\n\ntype Fn = (...args: unknown[]) => unknown;\n\nfunction isEventHandler(key: string, outer: unknown, inner: unknown): boolean {\n if (!key.startsWith('on') || key.length < 3) {\n return false;\n }\n if (key[2] !== key[2]?.toUpperCase()) {\n return false;\n }\n return typeof outer === 'function' && typeof inner === 'function';\n}\n\nfunction composeHandlers(outer: Fn, inner: Fn): Fn {\n return (...args: unknown[]) => {\n outer(...args);\n inner(...args);\n };\n}\n"]}