@namroodinc/liquid-editorial 0.0.0-stage → 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 (354) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -2
  3. package/dist/chunks/Icon-CGY1FNXT.js +77 -0
  4. package/dist/chunks/Icon-CGY1FNXT.js.map +1 -0
  5. package/dist/chunks/Icon-CWsA1W83.cjs +2 -0
  6. package/dist/chunks/Icon-CWsA1W83.cjs.map +1 -0
  7. package/dist/components/AssetGrid/index.cjs +2 -0
  8. package/dist/components/AssetGrid/index.cjs.map +1 -0
  9. package/dist/components/AssetGrid/index.d.cts +54 -0
  10. package/dist/components/AssetGrid/index.d.cts.map +1 -0
  11. package/dist/components/AssetGrid/index.d.ts +54 -0
  12. package/dist/components/AssetGrid/index.d.ts.map +1 -0
  13. package/dist/components/AssetGrid/index.js +137 -0
  14. package/dist/components/AssetGrid/index.js.map +1 -0
  15. package/dist/components/AssetGrid/style.css +196 -0
  16. package/dist/components/Avatar/index.cjs +2 -0
  17. package/dist/components/Avatar/index.cjs.map +1 -0
  18. package/dist/components/Avatar/index.d.cts +24 -0
  19. package/dist/components/Avatar/index.d.cts.map +1 -0
  20. package/dist/components/Avatar/index.d.ts +24 -0
  21. package/dist/components/Avatar/index.d.ts.map +1 -0
  22. package/dist/components/Avatar/index.js +43 -0
  23. package/dist/components/Avatar/index.js.map +1 -0
  24. package/dist/components/Avatar/style.css +70 -0
  25. package/dist/components/Badge/index.cjs +2 -0
  26. package/dist/components/Badge/index.cjs.map +1 -0
  27. package/dist/components/Badge/index.d.cts +25 -0
  28. package/dist/components/Badge/index.d.cts.map +1 -0
  29. package/dist/components/Badge/index.d.ts +25 -0
  30. package/dist/components/Badge/index.d.ts.map +1 -0
  31. package/dist/components/Badge/index.js +28 -0
  32. package/dist/components/Badge/index.js.map +1 -0
  33. package/dist/components/Badge/style.css +103 -0
  34. package/dist/components/Board/index.cjs +2 -0
  35. package/dist/components/Board/index.cjs.map +1 -0
  36. package/dist/components/Board/index.d.cts +62 -0
  37. package/dist/components/Board/index.d.cts.map +1 -0
  38. package/dist/components/Board/index.d.ts +62 -0
  39. package/dist/components/Board/index.d.ts.map +1 -0
  40. package/dist/components/Board/index.js +227 -0
  41. package/dist/components/Board/index.js.map +1 -0
  42. package/dist/components/Board/style.css +145 -0
  43. package/dist/components/Button/index.cjs +2 -0
  44. package/dist/components/Button/index.cjs.map +1 -0
  45. package/dist/components/Button/index.d.cts +22 -0
  46. package/dist/components/Button/index.d.cts.map +1 -0
  47. package/dist/components/Button/index.d.ts +22 -0
  48. package/dist/components/Button/index.d.ts.map +1 -0
  49. package/dist/components/Button/index.js +37 -0
  50. package/dist/components/Button/index.js.map +1 -0
  51. package/dist/components/Button/style.css +139 -0
  52. package/dist/components/ButtonGroup/index.cjs +2 -0
  53. package/dist/components/ButtonGroup/index.cjs.map +1 -0
  54. package/dist/components/ButtonGroup/index.d.cts +17 -0
  55. package/dist/components/ButtonGroup/index.d.cts.map +1 -0
  56. package/dist/components/ButtonGroup/index.d.ts +17 -0
  57. package/dist/components/ButtonGroup/index.d.ts.map +1 -0
  58. package/dist/components/ButtonGroup/index.js +18 -0
  59. package/dist/components/ButtonGroup/index.js.map +1 -0
  60. package/dist/components/ButtonGroup/style.css +66 -0
  61. package/dist/components/Choice/index.cjs +2 -0
  62. package/dist/components/Choice/index.cjs.map +1 -0
  63. package/dist/components/Choice/index.d.cts +25 -0
  64. package/dist/components/Choice/index.d.cts.map +1 -0
  65. package/dist/components/Choice/index.d.ts +25 -0
  66. package/dist/components/Choice/index.d.ts.map +1 -0
  67. package/dist/components/Choice/index.js +58 -0
  68. package/dist/components/Choice/index.js.map +1 -0
  69. package/dist/components/Choice/style.css +96 -0
  70. package/dist/components/Container/index.cjs +2 -0
  71. package/dist/components/Container/index.cjs.map +1 -0
  72. package/dist/components/Container/index.d.cts +19 -0
  73. package/dist/components/Container/index.d.cts.map +1 -0
  74. package/dist/components/Container/index.d.ts +19 -0
  75. package/dist/components/Container/index.d.ts.map +1 -0
  76. package/dist/components/Container/index.js +20 -0
  77. package/dist/components/Container/index.js.map +1 -0
  78. package/dist/components/Container/style.css +41 -0
  79. package/dist/components/DatePicker/index.cjs +2 -0
  80. package/dist/components/DatePicker/index.cjs.map +1 -0
  81. package/dist/components/DatePicker/index.d.cts +57 -0
  82. package/dist/components/DatePicker/index.d.cts.map +1 -0
  83. package/dist/components/DatePicker/index.d.ts +57 -0
  84. package/dist/components/DatePicker/index.d.ts.map +1 -0
  85. package/dist/components/DatePicker/index.js +248 -0
  86. package/dist/components/DatePicker/index.js.map +1 -0
  87. package/dist/components/DatePicker/style.css +149 -0
  88. package/dist/components/Drawer/index.cjs +2 -0
  89. package/dist/components/Drawer/index.cjs.map +1 -0
  90. package/dist/components/Drawer/index.d.cts +23 -0
  91. package/dist/components/Drawer/index.d.cts.map +1 -0
  92. package/dist/components/Drawer/index.d.ts +23 -0
  93. package/dist/components/Drawer/index.d.ts.map +1 -0
  94. package/dist/components/Drawer/index.js +85 -0
  95. package/dist/components/Drawer/index.js.map +1 -0
  96. package/dist/components/Drawer/style.css +147 -0
  97. package/dist/components/EntryPicker/index.cjs +2 -0
  98. package/dist/components/EntryPicker/index.cjs.map +1 -0
  99. package/dist/components/EntryPicker/index.d.cts +36 -0
  100. package/dist/components/EntryPicker/index.d.cts.map +1 -0
  101. package/dist/components/EntryPicker/index.d.ts +36 -0
  102. package/dist/components/EntryPicker/index.d.ts.map +1 -0
  103. package/dist/components/EntryPicker/index.js +178 -0
  104. package/dist/components/EntryPicker/index.js.map +1 -0
  105. package/dist/components/EntryPicker/style.css +162 -0
  106. package/dist/components/Field/index.cjs +2 -0
  107. package/dist/components/Field/index.cjs.map +1 -0
  108. package/dist/components/Field/index.d.cts +19 -0
  109. package/dist/components/Field/index.d.cts.map +1 -0
  110. package/dist/components/Field/index.d.ts +19 -0
  111. package/dist/components/Field/index.d.ts.map +1 -0
  112. package/dist/components/Field/index.js +41 -0
  113. package/dist/components/Field/index.js.map +1 -0
  114. package/dist/components/Field/style.css +100 -0
  115. package/dist/components/FieldAffix/index.cjs +2 -0
  116. package/dist/components/FieldAffix/index.cjs.map +1 -0
  117. package/dist/components/FieldAffix/index.d.cts +19 -0
  118. package/dist/components/FieldAffix/index.d.cts.map +1 -0
  119. package/dist/components/FieldAffix/index.d.ts +19 -0
  120. package/dist/components/FieldAffix/index.d.ts.map +1 -0
  121. package/dist/components/FieldAffix/index.js +45 -0
  122. package/dist/components/FieldAffix/index.js.map +1 -0
  123. package/dist/components/FieldAffix/style.css +54 -0
  124. package/dist/components/Grid/index.cjs +2 -0
  125. package/dist/components/Grid/index.cjs.map +1 -0
  126. package/dist/components/Grid/index.d.cts +44 -0
  127. package/dist/components/Grid/index.d.cts.map +1 -0
  128. package/dist/components/Grid/index.d.ts +44 -0
  129. package/dist/components/Grid/index.d.ts.map +1 -0
  130. package/dist/components/Grid/index.js +49 -0
  131. package/dist/components/Grid/index.js.map +1 -0
  132. package/dist/components/Grid/style.css +226 -0
  133. package/dist/components/Icon/icons.d.cts +64 -0
  134. package/dist/components/Icon/icons.d.cts.map +1 -0
  135. package/dist/components/Icon/icons.d.ts +64 -0
  136. package/dist/components/Icon/icons.d.ts.map +1 -0
  137. package/dist/components/Icon/index.cjs +1 -0
  138. package/dist/components/Icon/index.d.cts +15 -0
  139. package/dist/components/Icon/index.d.cts.map +1 -0
  140. package/dist/components/Icon/index.d.ts +15 -0
  141. package/dist/components/Icon/index.d.ts.map +1 -0
  142. package/dist/components/Icon/index.js +1 -0
  143. package/dist/components/Icon/style.css +10 -0
  144. package/dist/components/ImageCropper/index.cjs +2 -0
  145. package/dist/components/ImageCropper/index.cjs.map +1 -0
  146. package/dist/components/ImageCropper/index.d.cts +66 -0
  147. package/dist/components/ImageCropper/index.d.cts.map +1 -0
  148. package/dist/components/ImageCropper/index.d.ts +66 -0
  149. package/dist/components/ImageCropper/index.d.ts.map +1 -0
  150. package/dist/components/ImageCropper/index.js +263 -0
  151. package/dist/components/ImageCropper/index.js.map +1 -0
  152. package/dist/components/ImageCropper/style.css +160 -0
  153. package/dist/components/Menu/index.cjs +2 -0
  154. package/dist/components/Menu/index.cjs.map +1 -0
  155. package/dist/components/Menu/index.d.cts +35 -0
  156. package/dist/components/Menu/index.d.cts.map +1 -0
  157. package/dist/components/Menu/index.d.ts +35 -0
  158. package/dist/components/Menu/index.d.ts.map +1 -0
  159. package/dist/components/Menu/index.js +110 -0
  160. package/dist/components/Menu/index.js.map +1 -0
  161. package/dist/components/Menu/style.css +87 -0
  162. package/dist/components/Modal/index.cjs +2 -0
  163. package/dist/components/Modal/index.cjs.map +1 -0
  164. package/dist/components/Modal/index.d.cts +19 -0
  165. package/dist/components/Modal/index.d.cts.map +1 -0
  166. package/dist/components/Modal/index.d.ts +19 -0
  167. package/dist/components/Modal/index.d.ts.map +1 -0
  168. package/dist/components/Modal/index.js +84 -0
  169. package/dist/components/Modal/index.js.map +1 -0
  170. package/dist/components/Modal/style.css +106 -0
  171. package/dist/components/NumberField/index.cjs +2 -0
  172. package/dist/components/NumberField/index.cjs.map +1 -0
  173. package/dist/components/NumberField/index.d.cts +50 -0
  174. package/dist/components/NumberField/index.d.cts.map +1 -0
  175. package/dist/components/NumberField/index.d.ts +50 -0
  176. package/dist/components/NumberField/index.d.ts.map +1 -0
  177. package/dist/components/NumberField/index.js +124 -0
  178. package/dist/components/NumberField/index.js.map +1 -0
  179. package/dist/components/NumberField/style.css +85 -0
  180. package/dist/components/Popover/index.cjs +2 -0
  181. package/dist/components/Popover/index.cjs.map +1 -0
  182. package/dist/components/Popover/index.d.cts +28 -0
  183. package/dist/components/Popover/index.d.cts.map +1 -0
  184. package/dist/components/Popover/index.d.ts +28 -0
  185. package/dist/components/Popover/index.d.ts.map +1 -0
  186. package/dist/components/Popover/index.js +52 -0
  187. package/dist/components/Popover/index.js.map +1 -0
  188. package/dist/components/Popover/style.css +23 -0
  189. package/dist/components/RichTextEditor/index.cjs +2 -0
  190. package/dist/components/RichTextEditor/index.cjs.map +1 -0
  191. package/dist/components/RichTextEditor/index.d.cts +23 -0
  192. package/dist/components/RichTextEditor/index.d.cts.map +1 -0
  193. package/dist/components/RichTextEditor/index.d.ts +23 -0
  194. package/dist/components/RichTextEditor/index.d.ts.map +1 -0
  195. package/dist/components/RichTextEditor/index.js +175 -0
  196. package/dist/components/RichTextEditor/index.js.map +1 -0
  197. package/dist/components/RichTextEditor/style.css +136 -0
  198. package/dist/components/SearchField/index.cjs +2 -0
  199. package/dist/components/SearchField/index.cjs.map +1 -0
  200. package/dist/components/SearchField/index.d.cts +11 -0
  201. package/dist/components/SearchField/index.d.cts.map +1 -0
  202. package/dist/components/SearchField/index.d.ts +11 -0
  203. package/dist/components/SearchField/index.d.ts.map +1 -0
  204. package/dist/components/SearchField/index.js +49 -0
  205. package/dist/components/SearchField/index.js.map +1 -0
  206. package/dist/components/SearchField/style.css +27 -0
  207. package/dist/components/Select/index.cjs +2 -0
  208. package/dist/components/Select/index.cjs.map +1 -0
  209. package/dist/components/Select/index.d.cts +26 -0
  210. package/dist/components/Select/index.d.cts.map +1 -0
  211. package/dist/components/Select/index.d.ts +26 -0
  212. package/dist/components/Select/index.d.ts.map +1 -0
  213. package/dist/components/Select/index.js +129 -0
  214. package/dist/components/Select/index.js.map +1 -0
  215. package/dist/components/Select/style.css +88 -0
  216. package/dist/components/SelectionCard/index.cjs +2 -0
  217. package/dist/components/SelectionCard/index.cjs.map +1 -0
  218. package/dist/components/SelectionCard/index.d.cts +32 -0
  219. package/dist/components/SelectionCard/index.d.cts.map +1 -0
  220. package/dist/components/SelectionCard/index.d.ts +32 -0
  221. package/dist/components/SelectionCard/index.d.ts.map +1 -0
  222. package/dist/components/SelectionCard/index.js +71 -0
  223. package/dist/components/SelectionCard/index.js.map +1 -0
  224. package/dist/components/SelectionCard/style.css +133 -0
  225. package/dist/components/SideNav/index.cjs +2 -0
  226. package/dist/components/SideNav/index.cjs.map +1 -0
  227. package/dist/components/SideNav/index.d.cts +58 -0
  228. package/dist/components/SideNav/index.d.cts.map +1 -0
  229. package/dist/components/SideNav/index.d.ts +58 -0
  230. package/dist/components/SideNav/index.d.ts.map +1 -0
  231. package/dist/components/SideNav/index.js +113 -0
  232. package/dist/components/SideNav/index.js.map +1 -0
  233. package/dist/components/SideNav/style.css +184 -0
  234. package/dist/components/Skeleton/index.cjs +2 -0
  235. package/dist/components/Skeleton/index.cjs.map +1 -0
  236. package/dist/components/Skeleton/index.d.cts +21 -0
  237. package/dist/components/Skeleton/index.d.cts.map +1 -0
  238. package/dist/components/Skeleton/index.d.ts +21 -0
  239. package/dist/components/Skeleton/index.d.ts.map +1 -0
  240. package/dist/components/Skeleton/index.js +31 -0
  241. package/dist/components/Skeleton/index.js.map +1 -0
  242. package/dist/components/Skeleton/style.css +55 -0
  243. package/dist/components/Slider/index.cjs +2 -0
  244. package/dist/components/Slider/index.cjs.map +1 -0
  245. package/dist/components/Slider/index.d.cts +40 -0
  246. package/dist/components/Slider/index.d.cts.map +1 -0
  247. package/dist/components/Slider/index.d.ts +40 -0
  248. package/dist/components/Slider/index.d.ts.map +1 -0
  249. package/dist/components/Slider/index.js +117 -0
  250. package/dist/components/Slider/index.js.map +1 -0
  251. package/dist/components/Slider/style.css +156 -0
  252. package/dist/components/SortableList/index.cjs +2 -0
  253. package/dist/components/SortableList/index.cjs.map +1 -0
  254. package/dist/components/SortableList/index.d.cts +27 -0
  255. package/dist/components/SortableList/index.d.cts.map +1 -0
  256. package/dist/components/SortableList/index.d.ts +27 -0
  257. package/dist/components/SortableList/index.d.ts.map +1 -0
  258. package/dist/components/SortableList/index.js +85 -0
  259. package/dist/components/SortableList/index.js.map +1 -0
  260. package/dist/components/SortableList/style.css +71 -0
  261. package/dist/components/Stepper/index.cjs +2 -0
  262. package/dist/components/Stepper/index.cjs.map +1 -0
  263. package/dist/components/Stepper/index.d.cts +32 -0
  264. package/dist/components/Stepper/index.d.cts.map +1 -0
  265. package/dist/components/Stepper/index.d.ts +32 -0
  266. package/dist/components/Stepper/index.d.ts.map +1 -0
  267. package/dist/components/Stepper/index.js +69 -0
  268. package/dist/components/Stepper/index.js.map +1 -0
  269. package/dist/components/Stepper/style.css +154 -0
  270. package/dist/components/SubNav/index.cjs +2 -0
  271. package/dist/components/SubNav/index.cjs.map +1 -0
  272. package/dist/components/SubNav/index.d.cts +31 -0
  273. package/dist/components/SubNav/index.d.cts.map +1 -0
  274. package/dist/components/SubNav/index.d.ts +31 -0
  275. package/dist/components/SubNav/index.d.ts.map +1 -0
  276. package/dist/components/SubNav/index.js +62 -0
  277. package/dist/components/SubNav/index.js.map +1 -0
  278. package/dist/components/SubNav/style.css +86 -0
  279. package/dist/components/Switch/index.cjs +2 -0
  280. package/dist/components/Switch/index.cjs.map +1 -0
  281. package/dist/components/Switch/index.d.cts +12 -0
  282. package/dist/components/Switch/index.d.cts.map +1 -0
  283. package/dist/components/Switch/index.d.ts +12 -0
  284. package/dist/components/Switch/index.d.ts.map +1 -0
  285. package/dist/components/Switch/index.js +37 -0
  286. package/dist/components/Switch/index.js.map +1 -0
  287. package/dist/components/Switch/style.css +65 -0
  288. package/dist/components/Table/index.cjs +2 -0
  289. package/dist/components/Table/index.cjs.map +1 -0
  290. package/dist/components/Table/index.d.cts +54 -0
  291. package/dist/components/Table/index.d.cts.map +1 -0
  292. package/dist/components/Table/index.d.ts +54 -0
  293. package/dist/components/Table/index.d.ts.map +1 -0
  294. package/dist/components/Table/index.js +102 -0
  295. package/dist/components/Table/index.js.map +1 -0
  296. package/dist/components/Table/style.css +122 -0
  297. package/dist/components/TagsInput/index.cjs +2 -0
  298. package/dist/components/TagsInput/index.cjs.map +1 -0
  299. package/dist/components/TagsInput/index.d.cts +22 -0
  300. package/dist/components/TagsInput/index.d.cts.map +1 -0
  301. package/dist/components/TagsInput/index.d.ts +22 -0
  302. package/dist/components/TagsInput/index.d.ts.map +1 -0
  303. package/dist/components/TagsInput/index.js +60 -0
  304. package/dist/components/TagsInput/index.js.map +1 -0
  305. package/dist/components/TagsInput/style.css +83 -0
  306. package/dist/components/TextField/index.cjs +2 -0
  307. package/dist/components/TextField/index.cjs.map +1 -0
  308. package/dist/components/TextField/index.d.cts +11 -0
  309. package/dist/components/TextField/index.d.cts.map +1 -0
  310. package/dist/components/TextField/index.d.ts +11 -0
  311. package/dist/components/TextField/index.d.ts.map +1 -0
  312. package/dist/components/TextField/index.js +29 -0
  313. package/dist/components/TextField/index.js.map +1 -0
  314. package/dist/components/TextField/style.css +1 -0
  315. package/dist/components/Time/index.cjs +2 -0
  316. package/dist/components/Time/index.cjs.map +1 -0
  317. package/dist/components/Time/index.d.cts +35 -0
  318. package/dist/components/Time/index.d.cts.map +1 -0
  319. package/dist/components/Time/index.d.ts +35 -0
  320. package/dist/components/Time/index.d.ts.map +1 -0
  321. package/dist/components/Time/index.js +98 -0
  322. package/dist/components/Time/index.js.map +1 -0
  323. package/dist/components/Time/style.css +30 -0
  324. package/dist/components/Toast/index.cjs +2 -0
  325. package/dist/components/Toast/index.cjs.map +1 -0
  326. package/dist/components/Toast/index.d.cts +30 -0
  327. package/dist/components/Toast/index.d.cts.map +1 -0
  328. package/dist/components/Toast/index.d.ts +30 -0
  329. package/dist/components/Toast/index.d.ts.map +1 -0
  330. package/dist/components/Toast/index.js +96 -0
  331. package/dist/components/Toast/index.js.map +1 -0
  332. package/dist/components/Toast/style.css +80 -0
  333. package/dist/components/TopNav/index.cjs +2 -0
  334. package/dist/components/TopNav/index.cjs.map +1 -0
  335. package/dist/components/TopNav/index.d.cts +28 -0
  336. package/dist/components/TopNav/index.d.cts.map +1 -0
  337. package/dist/components/TopNav/index.d.ts +28 -0
  338. package/dist/components/TopNav/index.d.ts.map +1 -0
  339. package/dist/components/TopNav/index.js +45 -0
  340. package/dist/components/TopNav/index.js.map +1 -0
  341. package/dist/components/TopNav/style.css +80 -0
  342. package/dist/index.cjs +1 -0
  343. package/dist/index.d.cts +77 -0
  344. package/dist/index.d.cts.map +1 -0
  345. package/dist/index.d.ts +77 -0
  346. package/dist/index.d.ts.map +1 -0
  347. package/dist/index.js +38 -0
  348. package/dist/reset.css +15 -0
  349. package/dist/reset.css.d.ts +2 -0
  350. package/dist/styles.css +39 -0
  351. package/dist/styles.css.d.ts +2 -0
  352. package/dist/tokens.css +457 -0
  353. package/dist/tokens.css.d.ts +2 -0
  354. package/package.json +130 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["forwardRef","useState","useRef","useId","useCallback","Icon","Popover","require_Icon","require_components_Popover_index","react","react_jsx_runtime","cx","parts","Select","rest","internal","setInternal","defaultValue","current","value","isOpen","setOpen","activeIndex","setActiveIndex","rootRef","triggerRef","listRef","listId","effectiveDisabled","isDisabled","disabled","isVisible","selected","options","option","enabled","commit","next","onValueChange","index","onPointerDown","target","event","step","order","o","delta","handleKeyDown","pick","node","ref","isInvalid","size","className","onClick","open","onKeyDown","placeholder"],"sources":["../../../src/components/Select/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n} from \"react\";\nimport { Icon } from \"../Icon\";\nimport { Popover } from \"../Popover\";\nimport type { FieldSize } from \"../Field\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface SelectOption {\n value: string;\n label: string;\n /** Secondary line under the label. */\n description?: string;\n isDisabled?: boolean;\n}\n\nexport interface SelectProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"value\" | \"defaultValue\" | \"onChange\"> {\n options: SelectOption[];\n /** Controlled value. Leave undefined to let the select hold its own. */\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n placeholder?: string;\n size?: FieldSize;\n isDisabled?: boolean;\n isInvalid?: boolean;\n}\n\n/**\n * One value out of a known list. Wears the field skin, opens a listbox: arrows\n * walk the options, Enter commits, Escape closes without changing anything.\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder = \"Select an option\",\n size = \"md\",\n isDisabled = false,\n isInvalid = false,\n className,\n disabled,\n onClick,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const [internal, setInternal] = useState(defaultValue ?? \"\");\n const current = value ?? internal;\n const [isOpen, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const listRef = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n const effectiveDisabled = isDisabled || disabled;\n const isVisible = isOpen && !effectiveDisabled;\n\n const selected = options.find((option) => option.value === current);\n const enabled = options.filter((option) => !option.isDisabled);\n\n const commit = useCallback(\n (next: string) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n setOpen(false);\n },\n [onValueChange, value],\n );\n\n useEffect(() => {\n if (!isVisible) return;\n const index = options.findIndex((option) => option.value === current && !option.isDisabled);\n setActiveIndex(index < 0 ? options.indexOf(enabled[0]!) : index);\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (!rootRef.current?.contains(target) && !listRef.current?.contains(target)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", onPointerDown);\n return () => document.removeEventListener(\"mousedown\", onPointerDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isVisible]);\n\n useEffect(() => {\n if (!isVisible) return;\n const activeOption = listRef.current?.querySelectorAll<HTMLElement>(\"[role='option']\")[activeIndex];\n activeOption?.scrollIntoView({ block: \"nearest\" });\n }, [activeIndex, isVisible]);\n\n const step = (delta: number) => {\n const order = options.map((option, index) => ({ option, index })).filter((o) => !o.option.isDisabled);\n if (order.length === 0) return;\n const at = order.findIndex((o) => o.index === activeIndex);\n const next = order[(at + delta + order.length) % order.length]!;\n setActiveIndex(next.index);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (effectiveDisabled) return;\n if (event.key === \"Escape\") {\n setOpen(false);\n triggerRef.current?.focus();\n return;\n }\n if (!isVisible && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\" || event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n setOpen(true);\n return;\n }\n if (!isVisible) return;\n if (event.key === \"Tab\") {\n setOpen(false);\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n step(event.key === \"ArrowDown\" ? 1 : -1);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const pick = event.key === \"Home\" ? enabled[0] : enabled[enabled.length - 1];\n if (pick) setActiveIndex(options.indexOf(pick));\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n const option = options[activeIndex];\n if (option && !option.isDisabled) commit(option.value);\n }\n };\n\n return (\n <div className=\"ds-select-root\" ref={rootRef}>\n <button\n ref={(node) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isVisible}\n aria-controls={isVisible ? listId : undefined}\n aria-activedescendant={isVisible && options[activeIndex] && !options[activeIndex].isDisabled ? `${listId}-option-${activeIndex}` : undefined}\n aria-invalid={isInvalid || undefined}\n disabled={effectiveDisabled}\n data-size={size}\n data-placeholder={selected ? undefined : \"\"}\n className={cx(\"ds-field-skin\", \"ds-select\", className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) setOpen((open) => !open);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) handleKeyDown(event);\n }}\n {...rest}\n >\n <span className=\"ds-select__value\">{selected ? selected.label : placeholder}</span>\n <Icon name=\"chevron-down\" size={16} className=\"ds-select__chevron\" />\n </button>\n <Popover\n anchorRef={triggerRef}\n isOpen={isVisible}\n matchAnchorWidth\n panelRef={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={rest[\"aria-label\"] ?? placeholder}\n className=\"ds-surface-raised ds-select__menu\"\n >\n <div onKeyDown={handleKeyDown}>\n {options.map((option, index) => (\n <div\n key={option.value}\n id={`${listId}-option-${index}`}\n role=\"option\"\n aria-selected={option.value === current}\n aria-disabled={option.isDisabled || undefined}\n data-active={index === activeIndex || undefined}\n className=\"ds-select__option\"\n onMouseEnter={() => !option.isDisabled && setActiveIndex(index)}\n onClick={() => {\n if (!option.isDisabled) {\n commit(option.value);\n triggerRef.current?.focus();\n }\n }}\n >\n <span className=\"ds-select__option-body\">\n <span className=\"ds-select__option-label\">{option.label}</span>\n {option.description && (\n <span className=\"ds-select__option-description\">{option.description}</span>\n )}\n </span>\n {option.value === current && <Icon name=\"check\" size={16} />}\n </div>\n ))}\n </div>\n </Popover>\n </div>\n );\n});\n"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type ButtonHTMLAttributes } from "react";
2
+ import type { FieldSize } from "../Field/index.cjs";
3
+ export interface SelectOption {
4
+ value: string;
5
+ label: string;
6
+ /** Secondary line under the label. */
7
+ description?: string;
8
+ isDisabled?: boolean;
9
+ }
10
+ export interface SelectProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "value" | "defaultValue" | "onChange"> {
11
+ options: SelectOption[];
12
+ /** Controlled value. Leave undefined to let the select hold its own. */
13
+ value?: string;
14
+ defaultValue?: string;
15
+ onValueChange?: (value: string) => void;
16
+ placeholder?: string;
17
+ size?: FieldSize;
18
+ isDisabled?: boolean;
19
+ isInvalid?: boolean;
20
+ }
21
+ /**
22
+ * One value out of a known list. Wears the field skin, opens a listbox: arrows
23
+ * walk the options, Enter commits, Escape closes without changing anything.
24
+ */
25
+ export declare const Select: import("react").ForwardRefExoticComponent<SelectProps & import("react").RefAttributes<HTMLButtonElement>>;
26
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/Select/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,oBAAoB,EAC1B,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAMrB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU,CAAC;IAC5F,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,2GA4KjB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type ButtonHTMLAttributes } from "react";
2
+ import type { FieldSize } from "../Field/index.js";
3
+ export interface SelectOption {
4
+ value: string;
5
+ label: string;
6
+ /** Secondary line under the label. */
7
+ description?: string;
8
+ isDisabled?: boolean;
9
+ }
10
+ export interface SelectProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "value" | "defaultValue" | "onChange"> {
11
+ options: SelectOption[];
12
+ /** Controlled value. Leave undefined to let the select hold its own. */
13
+ value?: string;
14
+ defaultValue?: string;
15
+ onValueChange?: (value: string) => void;
16
+ placeholder?: string;
17
+ size?: FieldSize;
18
+ isDisabled?: boolean;
19
+ isInvalid?: boolean;
20
+ }
21
+ /**
22
+ * One value out of a known list. Wears the field skin, opens a listbox: arrows
23
+ * walk the options, Enter commits, Escape closes without changing anything.
24
+ */
25
+ export declare const Select: import("react").ForwardRefExoticComponent<SelectProps & import("react").RefAttributes<HTMLButtonElement>>;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Select/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,oBAAoB,EAC1B,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAMrB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU,CAAC;IAC5F,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,2GA4KjB,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { t as e } from "../../chunks/Icon-CGY1FNXT.js";
2
+ /* empty css */
3
+ import { Popover as t } from "../Popover/index.js";
4
+ import { forwardRef as n, useCallback as r, useEffect as i, useId as a, useRef as o, useState as s } from "react";
5
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
+ //#region src/components/Select/index.tsx
7
+ function u(...e) {
8
+ return e.filter(Boolean).join(" ");
9
+ }
10
+ var d = n(function({ options: n, value: d, defaultValue: f, onValueChange: p, placeholder: m = "Select an option", size: h = "md", isDisabled: g = !1, isInvalid: _ = !1, className: v, disabled: y, onClick: b, onKeyDown: x, ...S }, C) {
11
+ let [w, T] = s(f ?? ""), E = d ?? w, [D, O] = s(!1), [k, A] = s(0), j = o(null), M = o(null), N = o(null), P = a(), F = g || y, I = D && !F, L = n.find((e) => e.value === E), R = n.filter((e) => !e.isDisabled), z = r((e) => {
12
+ d === void 0 && T(e), p?.(e), O(!1);
13
+ }, [p, d]);
14
+ i(() => {
15
+ if (!I) return;
16
+ let e = n.findIndex((e) => e.value === E && !e.isDisabled);
17
+ A(e < 0 ? n.indexOf(R[0]) : e);
18
+ let t = (e) => {
19
+ let t = e.target;
20
+ !j.current?.contains(t) && !N.current?.contains(t) && O(!1);
21
+ };
22
+ return document.addEventListener("mousedown", t), () => document.removeEventListener("mousedown", t);
23
+ }, [I]), i(() => {
24
+ I && (N.current?.querySelectorAll("[role='option']")[k])?.scrollIntoView({ block: "nearest" });
25
+ }, [k, I]);
26
+ let B = (e) => {
27
+ let t = n.map((e, t) => ({
28
+ option: e,
29
+ index: t
30
+ })).filter((e) => !e.option.isDisabled);
31
+ if (t.length === 0) return;
32
+ let r = t[(t.findIndex((e) => e.index === k) + e + t.length) % t.length];
33
+ A(r.index);
34
+ }, V = (e) => {
35
+ if (!F) {
36
+ if (e.key === "Escape") O(!1), M.current?.focus();
37
+ else if (!I && (e.key === "ArrowDown" || e.key === "ArrowUp" || e.key === "Enter" || e.key === " ")) e.preventDefault(), O(!0);
38
+ else if (I) {
39
+ if (e.key === "Tab") O(!1);
40
+ else if (e.key === "ArrowDown" || e.key === "ArrowUp") e.preventDefault(), B(e.key === "ArrowDown" ? 1 : -1);
41
+ else if (e.key === "Home" || e.key === "End") {
42
+ e.preventDefault();
43
+ let t = e.key === "Home" ? R[0] : R[R.length - 1];
44
+ t && A(n.indexOf(t));
45
+ } else if (e.key === "Enter" || e.key === " ") {
46
+ e.preventDefault();
47
+ let t = n[k];
48
+ t && !t.isDisabled && z(t.value);
49
+ }
50
+ }
51
+ }
52
+ };
53
+ return /* @__PURE__ */ l("div", {
54
+ className: "ds-select-root",
55
+ ref: j,
56
+ children: [/* @__PURE__ */ l("button", {
57
+ ref: (e) => {
58
+ M.current = e, typeof C == "function" ? C(e) : C && (C.current = e);
59
+ },
60
+ type: "button",
61
+ role: "combobox",
62
+ "aria-haspopup": "listbox",
63
+ "aria-expanded": I,
64
+ "aria-controls": I ? P : void 0,
65
+ "aria-activedescendant": I && n[k] && !n[k].isDisabled ? `${P}-option-${k}` : void 0,
66
+ "aria-invalid": _ || void 0,
67
+ disabled: F,
68
+ "data-size": h,
69
+ "data-placeholder": L ? void 0 : "",
70
+ className: u("ds-field-skin", "ds-select", v),
71
+ onClick: (e) => {
72
+ b?.(e), e.defaultPrevented || O((e) => !e);
73
+ },
74
+ onKeyDown: (e) => {
75
+ x?.(e), e.defaultPrevented || V(e);
76
+ },
77
+ ...S,
78
+ children: [/* @__PURE__ */ c("span", {
79
+ className: "ds-select__value",
80
+ children: L ? L.label : m
81
+ }), /* @__PURE__ */ c(e, {
82
+ name: "chevron-down",
83
+ size: 16,
84
+ className: "ds-select__chevron"
85
+ })]
86
+ }), /* @__PURE__ */ c(t, {
87
+ anchorRef: M,
88
+ isOpen: I,
89
+ matchAnchorWidth: !0,
90
+ panelRef: N,
91
+ id: P,
92
+ role: "listbox",
93
+ "aria-label": S["aria-label"] ?? m,
94
+ className: "ds-surface-raised ds-select__menu",
95
+ children: /* @__PURE__ */ c("div", {
96
+ onKeyDown: V,
97
+ children: n.map((t, n) => /* @__PURE__ */ l("div", {
98
+ id: `${P}-option-${n}`,
99
+ role: "option",
100
+ "aria-selected": t.value === E,
101
+ "aria-disabled": t.isDisabled || void 0,
102
+ "data-active": n === k || void 0,
103
+ className: "ds-select__option",
104
+ onMouseEnter: () => !t.isDisabled && A(n),
105
+ onClick: () => {
106
+ t.isDisabled || (z(t.value), M.current?.focus());
107
+ },
108
+ children: [/* @__PURE__ */ l("span", {
109
+ className: "ds-select__option-body",
110
+ children: [/* @__PURE__ */ c("span", {
111
+ className: "ds-select__option-label",
112
+ children: t.label
113
+ }), t.description && /* @__PURE__ */ c("span", {
114
+ className: "ds-select__option-description",
115
+ children: t.description
116
+ })]
117
+ }), t.value === E && /* @__PURE__ */ c(e, {
118
+ name: "check",
119
+ size: 16
120
+ })]
121
+ }, t.value))
122
+ })
123
+ })]
124
+ });
125
+ });
126
+ //#endregion
127
+ export { d as Select };
128
+
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["Icon","cx","parts","Select","forwardRef","rest","internal","setInternal","useState","defaultValue","current","value","isOpen","setOpen","activeIndex","setActiveIndex","rootRef","useRef","triggerRef","listRef","listId","useId","effectiveDisabled","isDisabled","disabled","isVisible","selected","options","option","enabled","commit","useCallback","next","onValueChange","useEffect","index","onPointerDown","target","event","step","order","o","delta","handleKeyDown","pick","node","ref","isInvalid","size","className","onClick","open","onKeyDown","placeholder","Popover"],"sources":["../../../src/components/Select/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n} from \"react\";\nimport { Icon } from \"../Icon\";\nimport { Popover } from \"../Popover\";\nimport type { FieldSize } from \"../Field\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface SelectOption {\n value: string;\n label: string;\n /** Secondary line under the label. */\n description?: string;\n isDisabled?: boolean;\n}\n\nexport interface SelectProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"value\" | \"defaultValue\" | \"onChange\"> {\n options: SelectOption[];\n /** Controlled value. Leave undefined to let the select hold its own. */\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n placeholder?: string;\n size?: FieldSize;\n isDisabled?: boolean;\n isInvalid?: boolean;\n}\n\n/**\n * One value out of a known list. Wears the field skin, opens a listbox: arrows\n * walk the options, Enter commits, Escape closes without changing anything.\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder = \"Select an option\",\n size = \"md\",\n isDisabled = false,\n isInvalid = false,\n className,\n disabled,\n onClick,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const [internal, setInternal] = useState(defaultValue ?? \"\");\n const current = value ?? internal;\n const [isOpen, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const listRef = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n const effectiveDisabled = isDisabled || disabled;\n const isVisible = isOpen && !effectiveDisabled;\n\n const selected = options.find((option) => option.value === current);\n const enabled = options.filter((option) => !option.isDisabled);\n\n const commit = useCallback(\n (next: string) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n setOpen(false);\n },\n [onValueChange, value],\n );\n\n useEffect(() => {\n if (!isVisible) return;\n const index = options.findIndex((option) => option.value === current && !option.isDisabled);\n setActiveIndex(index < 0 ? options.indexOf(enabled[0]!) : index);\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (!rootRef.current?.contains(target) && !listRef.current?.contains(target)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", onPointerDown);\n return () => document.removeEventListener(\"mousedown\", onPointerDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isVisible]);\n\n useEffect(() => {\n if (!isVisible) return;\n const activeOption = listRef.current?.querySelectorAll<HTMLElement>(\"[role='option']\")[activeIndex];\n activeOption?.scrollIntoView({ block: \"nearest\" });\n }, [activeIndex, isVisible]);\n\n const step = (delta: number) => {\n const order = options.map((option, index) => ({ option, index })).filter((o) => !o.option.isDisabled);\n if (order.length === 0) return;\n const at = order.findIndex((o) => o.index === activeIndex);\n const next = order[(at + delta + order.length) % order.length]!;\n setActiveIndex(next.index);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (effectiveDisabled) return;\n if (event.key === \"Escape\") {\n setOpen(false);\n triggerRef.current?.focus();\n return;\n }\n if (!isVisible && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\" || event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n setOpen(true);\n return;\n }\n if (!isVisible) return;\n if (event.key === \"Tab\") {\n setOpen(false);\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n step(event.key === \"ArrowDown\" ? 1 : -1);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const pick = event.key === \"Home\" ? enabled[0] : enabled[enabled.length - 1];\n if (pick) setActiveIndex(options.indexOf(pick));\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n const option = options[activeIndex];\n if (option && !option.isDisabled) commit(option.value);\n }\n };\n\n return (\n <div className=\"ds-select-root\" ref={rootRef}>\n <button\n ref={(node) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isVisible}\n aria-controls={isVisible ? listId : undefined}\n aria-activedescendant={isVisible && options[activeIndex] && !options[activeIndex].isDisabled ? `${listId}-option-${activeIndex}` : undefined}\n aria-invalid={isInvalid || undefined}\n disabled={effectiveDisabled}\n data-size={size}\n data-placeholder={selected ? undefined : \"\"}\n className={cx(\"ds-field-skin\", \"ds-select\", className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) setOpen((open) => !open);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) handleKeyDown(event);\n }}\n {...rest}\n >\n <span className=\"ds-select__value\">{selected ? selected.label : placeholder}</span>\n <Icon name=\"chevron-down\" size={16} className=\"ds-select__chevron\" />\n </button>\n <Popover\n anchorRef={triggerRef}\n isOpen={isVisible}\n matchAnchorWidth\n panelRef={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={rest[\"aria-label\"] ?? placeholder}\n className=\"ds-surface-raised ds-select__menu\"\n >\n <div onKeyDown={handleKeyDown}>\n {options.map((option, index) => (\n <div\n key={option.value}\n id={`${listId}-option-${index}`}\n role=\"option\"\n aria-selected={option.value === current}\n aria-disabled={option.isDisabled || undefined}\n data-active={index === activeIndex || undefined}\n className=\"ds-select__option\"\n onMouseEnter={() => !option.isDisabled && setActiveIndex(index)}\n onClick={() => {\n if (!option.isDisabled) {\n commit(option.value);\n triggerRef.current?.focus();\n }\n }}\n >\n <span className=\"ds-select__option-body\">\n <span className=\"ds-select__option-label\">{option.label}</span>\n {option.description && (\n <span className=\"ds-select__option-description\">{option.description}</span>\n )}\n </span>\n {option.value === current && <Icon name=\"check\" size={16} />}\n </div>\n ))}\n </div>\n </Popover>\n </div>\n );\n});\n"],"mappings":";;;;;;AAeA,SAASC,EAAG,GAAGC,GAAuC;CACpD,OAAOA,EAAM,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACvC;AA2BA,IAAaC,IAASC,EAA2C,SAC/D,EACE,YACA,UACA,iBACA,kBACA,iBAAc,oBACd,UAAO,MACP,gBAAa,IACb,eAAY,IACZ,cACA,aACA,YACA,cACA,GAAGC,KAEL,GACA;CACA,IAAM,CAACC,GAAUC,KAAeC,EAASC,KAAgB,EAAE,GACrDC,IAAUC,KAASL,GACnB,CAACM,GAAQC,KAAWL,EAAS,EAAK,GAClC,CAACM,GAAaC,KAAkBP,EAAS,CAAC,GAC1CQ,IAAUC,EAA8B,IAAI,GAC5CC,IAAaD,EAAiC,IAAI,GAClDE,IAAUF,EAA8B,IAAI,GAC5CG,IAASC,EAAM,GACfC,IAAoBC,KAAcC,GAClCC,IAAYb,KAAU,CAACU,GAEvBI,IAAWC,EAAQ,MAAM,MAAWC,EAAO,UAAUlB,CAAO,GAC5DmB,IAAUF,EAAQ,QAAQ,MAAW,CAACC,EAAO,UAAU,GAEvDE,IAASC,GACZ,MAAiB;EAGhB,AAFIpB,MAAU,KAAA,KAAWJ,EAAYyB,CAAI,GACzCC,IAAgBD,CAAI,GACpBnB,EAAQ,EAAK;CACf,GACA,CAACoB,GAAetB,CAAK,CACvB;CAeA,AAbAuB,QAAgB;EACd,IAAI,CAACT,GAAW;EAChB,IAAMU,IAAQR,EAAQ,WAAW,MAAWC,EAAO,UAAUlB,KAAW,CAACkB,EAAO,UAAU;EAC1F,EAAeO,IAAQ,IAAIR,EAAQ,QAAQE,EAAQ,EAAG,IAAIM,CAAK;EAC/D,IAAMC,KAAiB,MAAsB;GAC3C,IAAMC,IAASC,EAAM;GACrB,AAAI,CAACtB,EAAQ,SAAS,SAASqB,CAAM,KAAK,CAAClB,EAAQ,SAAS,SAASkB,CAAM,KAAGxB,EAAQ,EAAK;EAC7F;EAEA,OADA,SAAS,iBAAiB,aAAauB,CAAa,SACvC,SAAS,oBAAoB,aAAaA,CAAa;CAEtE,GAAG,CAACX,CAAS,CAAC,GAEdS,QAAgB;EACd,AAAKT,MACgBN,EAAQ,SAAS,iBAA8B,iBAAiB,CAAC,CAACL,GAAA,EACzE,eAAe,EAAE,OAAO,UAAU,CAAC;CACnD,GAAG,CAACA,GAAaW,CAAS,CAAC;CAE3B,IAAMc,KAAQ,MAAkB;EAC9B,IAAMC,IAAQb,EAAQ,KAAK,GAAQ,OAAW;GAAE;GAAQ;EAAM,EAAE,CAAC,CAAC,QAAQ,MAAM,CAACc,EAAE,OAAO,UAAU;EACpG,IAAID,EAAM,WAAW,GAAG;EAExB,IAAMR,IAAOQ,GADFA,EAAM,WAAW,MAAMC,EAAE,UAAU3B,CAC1B,IAAK4B,IAAQF,EAAM,UAAUA,EAAM;EACvD,EAAeR,EAAK,KAAK;CAC3B,GAEMW,KAAiB,MAA+B;EACpD,IAAI,IACJ;OAAIL,EAAM,QAAQ,UAEhB,AADAzB,EAAQ,EAAK,GACbK,EAAW,SAAS,MAAM;QAG5B,IAAI,CAACO,MAAca,EAAM,QAAQ,eAAeA,EAAM,QAAQ,aAAaA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,MAEhH,AADAA,EAAM,eAAe,GACrBzB,EAAQ,EAAI;QAGd,IAAKY,GACL;QAAIa,EAAM,QAAQ,OAChB,EAAQ,EAAK;SAGf,IAAIA,EAAM,QAAQ,eAAeA,EAAM,QAAQ,WAE7C,AADAA,EAAM,eAAe,GACrBC,EAAKD,EAAM,QAAQ,cAAc,IAAI,EAAE;SAClC,IAAIA,EAAM,QAAQ,UAAUA,EAAM,QAAQ,OAAO;KACtD,EAAM,eAAe;KACrB,IAAMM,IAAON,EAAM,QAAQ,SAAST,EAAQ,KAAKA,EAAQA,EAAQ,SAAS;KAC1E,AAAIe,KAAM7B,EAAeY,EAAQ,QAAQiB,CAAI,CAAC;IAChD,OAAO,IAAIN,EAAM,QAAQ,WAAWA,EAAM,QAAQ,KAAK;KACrD,EAAM,eAAe;KACrB,IAAMV,IAASD,EAAQb;KACvB,AAAIc,KAAU,CAACA,EAAO,cAAYE,EAAOF,EAAO,KAAK;IACvD;GAZA;EAVA;CAuBF;CAEA,OACE,kBAAC,OAAD;EAAK,WAAU;EAAiB,KAAKZ;EAArC,UAAA,CACE,kBAAC,UAAD;GACE,MAAM,MAAS;IAEb,AADA,EAAW,UAAU6B,GACjB,OAAOC,KAAQ,aAAYA,EAAID,CAAI,IAC9BC,MAAK,EAAI,UAAUD;GAC9B;GACA,MAAK;GACL,MAAK;GACL,iBAAc;GACd,iBAAepB;GACf,iBAAeA,IAAYL,IAAS,KAAA;GACpC,yBAAuBK,KAAaE,EAAQb,MAAgB,CAACa,EAAQb,EAAY,CAAC,aAAa,GAAGM,EAAO,UAAUN,MAAgB,KAAA;GACnI,gBAAciC,KAAa,KAAA;GAC3B,UAAUzB;GACV,aAAW0B;GACX,oBAAkBtB,IAAW,KAAA,IAAY;GACzC,WAAWzB,EAAG,iBAAiB,aAAagD,CAAS;GACrD,UAAU,MAAU;IAElB,AADAC,IAAUZ,CAAK,GACVA,EAAM,oBAAkBzB,GAAS,MAAS,CAACsC,CAAI;GACtD;GACA,YAAY,MAAU;IAEpB,AADAC,IAAYd,CAAK,GACZA,EAAM,oBAAkBK,EAAcL,CAAK;GAClD;GACA,GAAIjC;GAzBN,UAAA,CA2BE,kBAAC,QAAD;IAAM,WAAU;IAAoB,UAAAqB,IAAWA,EAAS,QAAQ2B;GAAkB,CAAA,GAClF,kBAACrD,GAAD;IAAM,MAAK;IAAe,MAAM;IAAI,WAAU;GAAsB,CAAA,CAC9D;EACR,CAAA,GAAA,kBAACsD,GAAD;GACE,WAAWpC;GACX,QAAQO;GACR,kBAAA;GACA,UAAUN;GACV,IAAIC;GACJ,MAAK;GACL,cAAYf,EAAK,iBAAiBgD;GAClC,WAAU;GAEV,UAAA,kBAAC,OAAD;IAAK,WAAWV;IACb,UAAAhB,EAAQ,KAAK,GAAQ,MACpB,kBAAC,OAAD;KAEE,IAAI,GAAGP,EAAO,UAAUe;KACxB,MAAK;KACL,iBAAeP,EAAO,UAAUlB;KAChC,iBAAekB,EAAO,cAAc,KAAA;KACpC,eAAaO,MAAUrB,KAAe,KAAA;KACtC,WAAU;KACV,oBAAoB,CAACc,EAAO,cAAcb,EAAeoB,CAAK;KAC9D,eAAe;MACb,AAAKP,EAAO,eACVE,EAAOF,EAAO,KAAK,GACnBV,EAAW,SAAS,MAAM;KAE9B;KAdF,UAAA,CAgBE,kBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACE,kBAAC,QAAD;OAAM,WAAU;OAA2B,UAAAU,EAAO;MAAY,CAAA,GAC7DA,EAAO,eACN,kBAAC,QAAD;OAAM,WAAU;OAAiC,UAAAA,EAAO;MAAkB,CAAA,CAExE;KACL,CAAA,GAAAA,EAAO,UAAUlB,KAAW,kBAACV,GAAD;MAAM,MAAK;MAAQ,MAAM;KAAK,CAAA,CACxD;IAtBE,GAAA4B,EAAO,KAsBT,CACN;GACE,CAAA;EACE,CAAA,CACN;;AAET,CAAC"}
@@ -0,0 +1,88 @@
1
+ @layer components {
2
+ .ds-select-root {
3
+ position: relative;
4
+ inline-size: 100%;
5
+ }
6
+
7
+ .ds-select {
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: space-between;
11
+ gap: var(--space-2);
12
+ padding: 0 10px;
13
+ text-align: start;
14
+ cursor: pointer;
15
+ }
16
+
17
+ .ds-select[data-size="sm"] {
18
+ block-size: var(--field-height-sm);
19
+ font-size: var(--field-font-size-sm);
20
+ }
21
+
22
+ .ds-select[data-size="md"] {
23
+ block-size: var(--field-height-md);
24
+ font-size: var(--field-font-size-md);
25
+ }
26
+
27
+ .ds-select[data-size="lg"] {
28
+ block-size: var(--field-height-lg);
29
+ font-size: var(--field-font-size-md);
30
+ }
31
+
32
+ .ds-select[data-placeholder] .ds-select__value {
33
+ color: var(--color-text-muted);
34
+ }
35
+
36
+ .ds-select__value {
37
+ overflow: hidden;
38
+ text-overflow: ellipsis;
39
+ white-space: nowrap;
40
+ }
41
+
42
+ .ds-select__chevron {
43
+ flex: none;
44
+ color: var(--color-text-muted);
45
+ }
46
+
47
+ .ds-select__menu {
48
+ max-block-size: min(var(--menu-max-height), var(--popover-max-block-size, 100vh));
49
+ padding: var(--space-1);
50
+ }
51
+
52
+ .ds-select__option {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: var(--space-2);
56
+ padding: var(--space-2) var(--space-3);
57
+ border-radius: var(--radius-sm);
58
+ color: var(--color-text);
59
+ font-size: var(--font-size-sm);
60
+ cursor: pointer;
61
+ }
62
+
63
+ .ds-select__option[data-active] {
64
+ background: var(--field-hover);
65
+ }
66
+
67
+ .ds-select__option[aria-selected="true"] {
68
+ font-weight: var(--font-weight-semibold);
69
+ }
70
+
71
+ .ds-select__option[aria-disabled="true"] {
72
+ opacity: 45%;
73
+ cursor: not-allowed;
74
+ }
75
+
76
+ .ds-select__option-body {
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: 2px;
80
+ min-inline-size: 0;
81
+ flex: 1;
82
+ }
83
+
84
+ .ds-select__option-description {
85
+ color: var(--color-text-muted);
86
+ font-size: var(--font-size-xs);
87
+ }
88
+ }
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../Grid/index.cjs");let t=require("react"),n=require("react/jsx-runtime");function r({kind:e,title:t,description:r,children:i,className:a,inputProps:o,inputRef:s}){return(0,n.jsxs)(`label`,{className:[`ds-selection-card`,a].filter(Boolean).join(` `),children:[(0,n.jsx)(`input`,{ref:s,type:e,"data-kind":e,className:`ds-selection-card__control`,...o}),(0,n.jsxs)(`span`,{className:`ds-selection-card__text`,children:[(0,n.jsx)(`span`,{className:`ds-selection-card__title`,children:t}),r&&(0,n.jsx)(`span`,{className:`ds-selection-card__description`,children:r}),i&&(0,n.jsx)(`span`,{className:`ds-selection-card__extra`,children:i})]})]})}var i=(0,t.forwardRef)(function({title:e,description:t,children:i,className:a,...o},s){return(0,n.jsx)(r,{kind:`checkbox`,title:e,description:t,className:a,inputProps:o,inputRef:s,children:i})}),a=(0,t.forwardRef)(function({title:e,description:t,children:i,className:a,...o},s){return(0,n.jsx)(r,{kind:`radio`,title:e,description:t,className:a,inputProps:o,inputRef:s,children:i})});function o({label:t,columns:r=2,children:i}){return(0,n.jsxs)(`fieldset`,{className:`ds-selection-card-group`,children:[(0,n.jsx)(`legend`,{className:`ds-selection-card-group__label`,children:t}),(0,n.jsx)(e.Grid,{columns:r,gap:`sm`,className:`ds-selection-card-group__grid`,children:i})]})}exports.CheckboxCard=i,exports.RadioCard=a,exports.SelectionCardGroup=o;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["forwardRef","Grid","require_components_Grid_index","react","react_jsx_runtime","CardBody","className","inputRef","kind","inputProps","title","description","children","CheckboxCard","rest","ref","RadioCard","SelectionCardGroup","label"],"sources":["../../../src/components/SelectionCard/index.tsx"],"sourcesContent":["import { forwardRef, type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { Grid } from \"../Grid\";\nimport \"./style.css\";\n\ninterface SelectionCardBase {\n /** The commitment, in the user's words. */\n title: ReactNode;\n /** One line on what picking this means. Takes nodes, so a chip or a link can sit inline. */\n description?: ReactNode;\n /** Extra content under the description — a price, a sample, a badge. */\n children?: ReactNode;\n}\n\ntype NativeInput = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"children\" | \"title\"\n>;\n\nfunction CardBody({\n kind,\n title,\n description,\n children,\n className,\n inputProps,\n inputRef,\n}: SelectionCardBase & {\n kind: \"checkbox\" | \"radio\";\n className?: string;\n inputProps: NativeInput;\n inputRef: React.Ref<HTMLInputElement>;\n}) {\n return (\n <label className={[\"ds-selection-card\", className].filter(Boolean).join(\" \")}>\n <input\n ref={inputRef}\n type={kind}\n data-kind={kind}\n className=\"ds-selection-card__control\"\n {...inputProps}\n />\n <span className=\"ds-selection-card__text\">\n <span className=\"ds-selection-card__title\">{title}</span>\n {description && <span className=\"ds-selection-card__description\">{description}</span>}\n {children && <span className=\"ds-selection-card__extra\">{children}</span>}\n </span>\n </label>\n );\n}\n\nexport interface CheckboxCardProps extends SelectionCardBase, NativeInput {}\n\n/**\n * A checkbox with room to explain itself. Same 20px box as the bare control —\n * the card is a bigger target, not a different decision.\n */\nexport const CheckboxCard = forwardRef<HTMLInputElement, CheckboxCardProps>(\n function CheckboxCard({ title, description, children, className, ...rest }, ref) {\n return (\n <CardBody\n kind=\"checkbox\"\n title={title}\n description={description}\n className={className}\n inputProps={rest}\n inputRef={ref}\n >\n {children}\n </CardBody>\n );\n },\n);\n\nexport interface RadioCardProps extends SelectionCardBase, NativeInput {}\n\n/** One of a set of mutually exclusive options, each with its own explanation. */\nexport const RadioCard = forwardRef<HTMLInputElement, RadioCardProps>(function RadioCard(\n { title, description, children, className, ...rest },\n ref,\n) {\n return (\n <CardBody\n kind=\"radio\"\n title={title}\n description={description}\n className={className}\n inputProps={rest}\n inputRef={ref}\n >\n {children}\n </CardBody>\n );\n});\n\nexport interface SelectionCardGroupProps {\n /** Group label — the question the cards answer. */\n label: string;\n /** Cards per row at full width. Steps down inside a narrow container. */\n columns?: 1 | 2 | 3;\n children: ReactNode;\n}\n\n/** A grid of selection cards under one legend, spaced by the shared Grid. */\nexport function SelectionCardGroup({ label, columns = 2, children }: SelectionCardGroupProps) {\n return (\n <fieldset className=\"ds-selection-card-group\">\n <legend className=\"ds-selection-card-group__label\">{label}</legend>\n <Grid columns={columns} gap=\"sm\" className=\"ds-selection-card-group__grid\">\n {children}\n </Grid>\n </fieldset>\n );\n}\n"],"mappings":"A,8JAkBA,SAASK,EAAS,CAChB,OACA,QACA,cACA,WACA,YACA,aACA,YAMC,CACD,OACE,EAAAD,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,CAAC,oBAAqBE,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,EAA3E,SAAA,EACE,EAAAF,EAAA,IAAA,CAAC,QAAD,CACE,IAAKG,EACL,KAAMC,EACN,YAAWA,EACX,UAAU,6BACV,GAAIC,CACL,CAAA,GACD,EAAAL,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,0BAAhB,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2BAA4B,SAAAM,CAAY,CAAA,EACvDC,IAAe,EAAAP,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,iCAAkC,SAAAO,CAAkB,CAAA,EACnFC,IAAY,EAAAR,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2BAA4B,UAAe,CAAA,CACpE,CACD,CAAA,CAAA,C,EAEX,CAQA,IAAaS,GAAA,EAAeb,EAAAA,WAAAA,CAC1B,SAAsB,CAAE,QAAO,cAAa,WAAU,YAAW,GAAGc,GAAQ,EAAK,CAC/E,OACE,EAAAV,EAAA,IAAA,CAACC,EAAD,CACE,KAAK,WACE,QACM,cACF,YACX,WAAYS,EACZ,SAAUC,EAET,UACO,CAAA,CAEd,CACF,EAKaC,GAAA,EAAYhB,EAAAA,WAAAA,CAA6C,SACpE,CAAE,QAAO,cAAa,WAAU,YAAW,GAAGc,GAC9C,EACA,CACA,OACE,EAAAV,EAAA,IAAA,CAACC,EAAD,CACE,KAAK,QACE,QACM,cACF,YACX,WAAYS,EACZ,SAAUC,EAET,UACO,CAAA,CAEd,CAAC,EAWD,SAAgBE,EAAmB,CAAE,QAAO,UAAU,EAAG,YAAqC,CAC5F,OACE,EAAAb,EAAA,KAAA,CAAC,WAAD,CAAU,UAAU,0BAApB,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,iCAAkC,SAAAc,CAAc,CAAA,GAClE,EAAAd,EAAA,IAAA,CAACH,EAAAA,KAAD,CAAe,UAAS,IAAI,KAAK,UAAU,gCACxC,UACG,CAAA,CACE,C,EAEd,C"}
@@ -0,0 +1,32 @@
1
+ import { type InputHTMLAttributes, type ReactNode } from "react";
2
+ interface SelectionCardBase {
3
+ /** The commitment, in the user's words. */
4
+ title: ReactNode;
5
+ /** One line on what picking this means. Takes nodes, so a chip or a link can sit inline. */
6
+ description?: ReactNode;
7
+ /** Extra content under the description — a price, a sample, a badge. */
8
+ children?: ReactNode;
9
+ }
10
+ type NativeInput = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "size" | "children" | "title">;
11
+ export interface CheckboxCardProps extends SelectionCardBase, NativeInput {
12
+ }
13
+ /**
14
+ * A checkbox with room to explain itself. Same 20px box as the bare control —
15
+ * the card is a bigger target, not a different decision.
16
+ */
17
+ export declare const CheckboxCard: import("react").ForwardRefExoticComponent<CheckboxCardProps & import("react").RefAttributes<HTMLInputElement>>;
18
+ export interface RadioCardProps extends SelectionCardBase, NativeInput {
19
+ }
20
+ /** One of a set of mutually exclusive options, each with its own explanation. */
21
+ export declare const RadioCard: import("react").ForwardRefExoticComponent<RadioCardProps & import("react").RefAttributes<HTMLInputElement>>;
22
+ export interface SelectionCardGroupProps {
23
+ /** Group label — the question the cards answer. */
24
+ label: string;
25
+ /** Cards per row at full width. Steps down inside a narrow container. */
26
+ columns?: 1 | 2 | 3;
27
+ children: ReactNode;
28
+ }
29
+ /** A grid of selection cards under one legend, spaced by the shared Grid. */
30
+ export declare function SelectionCardGroup({ label, columns, children }: SelectionCardGroupProps): import("react").JSX.Element;
31
+ export {};
32
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/SelectionCard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,aAAa,CAAC;AAErB,UAAU,iBAAiB;IACzB,2CAA2C;IAC3C,KAAK,EAAE,SAAS,CAAC;IACjB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,KAAK,WAAW,GAAG,IAAI,CACrB,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CACvC,CAAC;AAkCF,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB,EAAE,WAAW;CAAG;AAE5E;;;GAGG;AACH,eAAO,MAAM,YAAY,gHAexB,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,iBAAiB,EAAE,WAAW;CAAG;AAEzE,iFAAiF;AACjF,eAAO,MAAM,SAAS,6GAgBpB,CAAC;AAEH,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,OAAW,EAAE,QAAQ,EAAE,EAAE,uBAAuB,+BAS3F"}
@@ -0,0 +1,32 @@
1
+ import { type InputHTMLAttributes, type ReactNode } from "react";
2
+ interface SelectionCardBase {
3
+ /** The commitment, in the user's words. */
4
+ title: ReactNode;
5
+ /** One line on what picking this means. Takes nodes, so a chip or a link can sit inline. */
6
+ description?: ReactNode;
7
+ /** Extra content under the description — a price, a sample, a badge. */
8
+ children?: ReactNode;
9
+ }
10
+ type NativeInput = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "size" | "children" | "title">;
11
+ export interface CheckboxCardProps extends SelectionCardBase, NativeInput {
12
+ }
13
+ /**
14
+ * A checkbox with room to explain itself. Same 20px box as the bare control —
15
+ * the card is a bigger target, not a different decision.
16
+ */
17
+ export declare const CheckboxCard: import("react").ForwardRefExoticComponent<CheckboxCardProps & import("react").RefAttributes<HTMLInputElement>>;
18
+ export interface RadioCardProps extends SelectionCardBase, NativeInput {
19
+ }
20
+ /** One of a set of mutually exclusive options, each with its own explanation. */
21
+ export declare const RadioCard: import("react").ForwardRefExoticComponent<RadioCardProps & import("react").RefAttributes<HTMLInputElement>>;
22
+ export interface SelectionCardGroupProps {
23
+ /** Group label — the question the cards answer. */
24
+ label: string;
25
+ /** Cards per row at full width. Steps down inside a narrow container. */
26
+ columns?: 1 | 2 | 3;
27
+ children: ReactNode;
28
+ }
29
+ /** A grid of selection cards under one legend, spaced by the shared Grid. */
30
+ export declare function SelectionCardGroup({ label, columns, children }: SelectionCardGroupProps): import("react").JSX.Element;
31
+ export {};
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SelectionCard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,aAAa,CAAC;AAErB,UAAU,iBAAiB;IACzB,2CAA2C;IAC3C,KAAK,EAAE,SAAS,CAAC;IACjB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,KAAK,WAAW,GAAG,IAAI,CACrB,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CACvC,CAAC;AAkCF,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB,EAAE,WAAW;CAAG;AAE5E;;;GAGG;AACH,eAAO,MAAM,YAAY,gHAexB,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,iBAAiB,EAAE,WAAW;CAAG;AAEzE,iFAAiF;AACjF,eAAO,MAAM,SAAS,6GAgBpB,CAAC;AAEH,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,OAAW,EAAE,QAAQ,EAAE,EAAE,uBAAuB,+BAS3F"}
@@ -0,0 +1,71 @@
1
+ import { Grid as e } from "../Grid/index.js";
2
+ import { forwardRef as t } from "react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/components/SelectionCard/index.tsx
5
+ function i({ kind: e, title: t, description: i, children: a, className: o, inputProps: s, inputRef: c }) {
6
+ return /* @__PURE__ */ r("label", {
7
+ className: ["ds-selection-card", o].filter(Boolean).join(" "),
8
+ children: [/* @__PURE__ */ n("input", {
9
+ ref: c,
10
+ type: e,
11
+ "data-kind": e,
12
+ className: "ds-selection-card__control",
13
+ ...s
14
+ }), /* @__PURE__ */ r("span", {
15
+ className: "ds-selection-card__text",
16
+ children: [
17
+ /* @__PURE__ */ n("span", {
18
+ className: "ds-selection-card__title",
19
+ children: t
20
+ }),
21
+ i && /* @__PURE__ */ n("span", {
22
+ className: "ds-selection-card__description",
23
+ children: i
24
+ }),
25
+ a && /* @__PURE__ */ n("span", {
26
+ className: "ds-selection-card__extra",
27
+ children: a
28
+ })
29
+ ]
30
+ })]
31
+ });
32
+ }
33
+ var a = t(function({ title: e, description: t, children: r, className: a, ...o }, s) {
34
+ return /* @__PURE__ */ n(i, {
35
+ kind: "checkbox",
36
+ title: e,
37
+ description: t,
38
+ className: a,
39
+ inputProps: o,
40
+ inputRef: s,
41
+ children: r
42
+ });
43
+ }), o = t(function({ title: e, description: t, children: r, className: a, ...o }, s) {
44
+ return /* @__PURE__ */ n(i, {
45
+ kind: "radio",
46
+ title: e,
47
+ description: t,
48
+ className: a,
49
+ inputProps: o,
50
+ inputRef: s,
51
+ children: r
52
+ });
53
+ });
54
+ function s({ label: t, columns: i = 2, children: a }) {
55
+ return /* @__PURE__ */ r("fieldset", {
56
+ className: "ds-selection-card-group",
57
+ children: [/* @__PURE__ */ n("legend", {
58
+ className: "ds-selection-card-group__label",
59
+ children: t
60
+ }), /* @__PURE__ */ n(e, {
61
+ columns: i,
62
+ gap: "sm",
63
+ className: "ds-selection-card-group__grid",
64
+ children: a
65
+ })]
66
+ });
67
+ }
68
+ //#endregion
69
+ export { a as CheckboxCard, o as RadioCard, s as SelectionCardGroup };
70
+
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["CardBody","className","inputRef","kind","inputProps","title","description","children","CheckboxCard","forwardRef","rest","ref","RadioCard","SelectionCardGroup","label","Grid"],"sources":["../../../src/components/SelectionCard/index.tsx"],"sourcesContent":["import { forwardRef, type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { Grid } from \"../Grid\";\nimport \"./style.css\";\n\ninterface SelectionCardBase {\n /** The commitment, in the user's words. */\n title: ReactNode;\n /** One line on what picking this means. Takes nodes, so a chip or a link can sit inline. */\n description?: ReactNode;\n /** Extra content under the description — a price, a sample, a badge. */\n children?: ReactNode;\n}\n\ntype NativeInput = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"children\" | \"title\"\n>;\n\nfunction CardBody({\n kind,\n title,\n description,\n children,\n className,\n inputProps,\n inputRef,\n}: SelectionCardBase & {\n kind: \"checkbox\" | \"radio\";\n className?: string;\n inputProps: NativeInput;\n inputRef: React.Ref<HTMLInputElement>;\n}) {\n return (\n <label className={[\"ds-selection-card\", className].filter(Boolean).join(\" \")}>\n <input\n ref={inputRef}\n type={kind}\n data-kind={kind}\n className=\"ds-selection-card__control\"\n {...inputProps}\n />\n <span className=\"ds-selection-card__text\">\n <span className=\"ds-selection-card__title\">{title}</span>\n {description && <span className=\"ds-selection-card__description\">{description}</span>}\n {children && <span className=\"ds-selection-card__extra\">{children}</span>}\n </span>\n </label>\n );\n}\n\nexport interface CheckboxCardProps extends SelectionCardBase, NativeInput {}\n\n/**\n * A checkbox with room to explain itself. Same 20px box as the bare control —\n * the card is a bigger target, not a different decision.\n */\nexport const CheckboxCard = forwardRef<HTMLInputElement, CheckboxCardProps>(\n function CheckboxCard({ title, description, children, className, ...rest }, ref) {\n return (\n <CardBody\n kind=\"checkbox\"\n title={title}\n description={description}\n className={className}\n inputProps={rest}\n inputRef={ref}\n >\n {children}\n </CardBody>\n );\n },\n);\n\nexport interface RadioCardProps extends SelectionCardBase, NativeInput {}\n\n/** One of a set of mutually exclusive options, each with its own explanation. */\nexport const RadioCard = forwardRef<HTMLInputElement, RadioCardProps>(function RadioCard(\n { title, description, children, className, ...rest },\n ref,\n) {\n return (\n <CardBody\n kind=\"radio\"\n title={title}\n description={description}\n className={className}\n inputProps={rest}\n inputRef={ref}\n >\n {children}\n </CardBody>\n );\n});\n\nexport interface SelectionCardGroupProps {\n /** Group label — the question the cards answer. */\n label: string;\n /** Cards per row at full width. Steps down inside a narrow container. */\n columns?: 1 | 2 | 3;\n children: ReactNode;\n}\n\n/** A grid of selection cards under one legend, spaced by the shared Grid. */\nexport function SelectionCardGroup({ label, columns = 2, children }: SelectionCardGroupProps) {\n return (\n <fieldset className=\"ds-selection-card-group\">\n <legend className=\"ds-selection-card-group__label\">{label}</legend>\n <Grid columns={columns} gap=\"sm\" className=\"ds-selection-card-group__grid\">\n {children}\n </Grid>\n </fieldset>\n );\n}\n"],"mappings":";;;;AAkBA,SAASA,EAAS,EAChB,SACA,UACA,gBACA,aACA,cACA,eACA,eAMC;CACD,OACE,kBAAC,SAAD;EAAO,WAAW,CAAC,qBAAqBC,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAA3E,UAAA,CACE,kBAAC,SAAD;GACE,KAAKC;GACL,MAAMC;GACN,aAAWA;GACX,WAAU;GACV,GAAIC;EACL,CAAA,GACD,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA;IACE,kBAAC,QAAD;KAAM,WAAU;KAA4B,UAAAC;IAAY,CAAA;IACvDC,KAAe,kBAAC,QAAD;KAAM,WAAU;KAAkC,UAAAA;IAAkB,CAAA;IACnFC,KAAY,kBAAC,QAAD;KAAM,WAAU;KAA4B;IAAe,CAAA;GACpE;EACD,CAAA,CAAA;;AAEX;AAQA,IAAaC,IAAeC,EAC1B,SAAsB,EAAE,UAAO,gBAAa,aAAU,cAAW,GAAGC,KAAQ,GAAK;CAC/E,OACE,kBAACV,GAAD;EACE,MAAK;EACE;EACM;EACF;EACX,YAAYU;EACZ,UAAUC;EAET;CACO,CAAA;AAEd,CACF,GAKaC,IAAYH,EAA6C,SACpE,EAAE,UAAO,gBAAa,aAAU,cAAW,GAAGC,KAC9C,GACA;CACA,OACE,kBAACV,GAAD;EACE,MAAK;EACE;EACM;EACF;EACX,YAAYU;EACZ,UAAUC;EAET;CACO,CAAA;AAEd,CAAC;AAWD,SAAgBE,EAAmB,EAAE,UAAO,aAAU,GAAG,eAAqC;CAC5F,OACE,kBAAC,YAAD;EAAU,WAAU;EAApB,UAAA,CACE,kBAAC,UAAD;GAAQ,WAAU;GAAkC,UAAAC;EAAc,CAAA,GAClE,kBAACC,GAAD;GAAe;GAAS,KAAI;GAAK,WAAU;GACxC;EACG,CAAA,CACE;;AAEd"}