@neut/ui 0.0.12 → 0.0.14

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 (368) hide show
  1. package/dist/components/calendar/Calendar/Calendar.d.ts +10 -0
  2. package/dist/components/calendar/Calendar/Calendar.js +306 -0
  3. package/dist/components/calendar/Calendar/Calendar.js.map +1 -0
  4. package/dist/components/calendar/Calendar/Calendar.types.d.ts +62 -0
  5. package/dist/components/calendar/Calendar/Calendar.utils.d.ts +21 -0
  6. package/dist/components/calendar/Calendar/Calendar.utils.js +68 -0
  7. package/dist/components/calendar/Calendar/Calendar.utils.js.map +1 -0
  8. package/dist/components/calendar/Calendar/index.d.ts +2 -0
  9. package/dist/components/calendar/index.d.ts +2 -0
  10. package/dist/components/calendar/index.js +2 -0
  11. package/dist/components/combobox/Combobox/Combobox.context.d.ts +3 -0
  12. package/dist/components/combobox/Combobox/Combobox.context.js +12 -0
  13. package/dist/components/combobox/Combobox/Combobox.context.js.map +1 -0
  14. package/dist/components/combobox/Combobox/Combobox.d.ts +3 -0
  15. package/dist/components/combobox/Combobox/Combobox.js +60 -0
  16. package/dist/components/combobox/Combobox/Combobox.js.map +1 -0
  17. package/dist/components/combobox/Combobox/Combobox.types.d.ts +40 -0
  18. package/dist/components/combobox/Combobox/index.d.ts +2 -0
  19. package/dist/components/combobox/ComboboxChip/ComboboxChip.d.ts +7 -0
  20. package/dist/components/combobox/ComboboxChip/ComboboxChip.js +35 -0
  21. package/dist/components/combobox/ComboboxChip/ComboboxChip.js.map +1 -0
  22. package/dist/components/combobox/ComboboxChip/index.d.ts +1 -0
  23. package/dist/components/combobox/ComboboxChips/ComboboxChips.d.ts +5 -0
  24. package/dist/components/combobox/ComboboxChips/ComboboxChips.js +16 -0
  25. package/dist/components/combobox/ComboboxChips/ComboboxChips.js.map +1 -0
  26. package/dist/components/combobox/ComboboxChips/index.d.ts +1 -0
  27. package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.d.ts +4 -0
  28. package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js +27 -0
  29. package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js.map +1 -0
  30. package/dist/components/combobox/ComboboxChipsInput/index.d.ts +1 -0
  31. package/dist/components/combobox/ComboboxClear/ComboboxClear.d.ts +4 -0
  32. package/dist/components/combobox/ComboboxClear/ComboboxClear.js +30 -0
  33. package/dist/components/combobox/ComboboxClear/ComboboxClear.js.map +1 -0
  34. package/dist/components/combobox/ComboboxClear/index.d.ts +1 -0
  35. package/dist/components/combobox/ComboboxCollection/ComboboxCollection.d.ts +5 -0
  36. package/dist/components/combobox/ComboboxCollection/ComboboxCollection.js +20 -0
  37. package/dist/components/combobox/ComboboxCollection/ComboboxCollection.js.map +1 -0
  38. package/dist/components/combobox/ComboboxCollection/index.d.ts +1 -0
  39. package/dist/components/combobox/ComboboxContent/ComboboxContent.d.ts +2 -0
  40. package/dist/components/combobox/ComboboxContent/ComboboxContent.js +49 -0
  41. package/dist/components/combobox/ComboboxContent/ComboboxContent.js.map +1 -0
  42. package/dist/components/combobox/ComboboxContent/ComboboxContent.types.d.ts +12 -0
  43. package/dist/components/combobox/ComboboxContent/ComboboxContent.utils.d.ts +2 -0
  44. package/dist/components/combobox/ComboboxContent/ComboboxContent.utils.js +6 -0
  45. package/dist/components/combobox/ComboboxContent/ComboboxContent.utils.js.map +1 -0
  46. package/dist/components/combobox/ComboboxContent/index.d.ts +1 -0
  47. package/dist/components/combobox/ComboboxContent/useComboboxContent.d.ts +13 -0
  48. package/dist/components/combobox/ComboboxContent/useComboboxContent.js +48 -0
  49. package/dist/components/combobox/ComboboxContent/useComboboxContent.js.map +1 -0
  50. package/dist/components/combobox/ComboboxEmpty/ComboboxEmpty.d.ts +5 -0
  51. package/dist/components/combobox/ComboboxEmpty/ComboboxEmpty.js +14 -0
  52. package/dist/components/combobox/ComboboxEmpty/ComboboxEmpty.js.map +1 -0
  53. package/dist/components/combobox/ComboboxEmpty/index.d.ts +1 -0
  54. package/dist/components/combobox/ComboboxGroup/ComboboxGroup.d.ts +5 -0
  55. package/dist/components/combobox/ComboboxGroup/ComboboxGroup.js +13 -0
  56. package/dist/components/combobox/ComboboxGroup/ComboboxGroup.js.map +1 -0
  57. package/dist/components/combobox/ComboboxGroup/index.d.ts +1 -0
  58. package/dist/components/combobox/ComboboxInput/ComboboxInput.d.ts +9 -0
  59. package/dist/components/combobox/ComboboxInput/ComboboxInput.js +85 -0
  60. package/dist/components/combobox/ComboboxInput/ComboboxInput.js.map +1 -0
  61. package/dist/components/combobox/ComboboxInput/index.d.ts +1 -0
  62. package/dist/components/combobox/ComboboxItem/ComboboxItem.d.ts +7 -0
  63. package/dist/components/combobox/ComboboxItem/ComboboxItem.js +40 -0
  64. package/dist/components/combobox/ComboboxItem/ComboboxItem.js.map +1 -0
  65. package/dist/components/combobox/ComboboxItem/index.d.ts +1 -0
  66. package/dist/components/combobox/ComboboxLabel/ComboboxLabel.d.ts +5 -0
  67. package/dist/components/combobox/ComboboxLabel/ComboboxLabel.js +14 -0
  68. package/dist/components/combobox/ComboboxLabel/ComboboxLabel.js.map +1 -0
  69. package/dist/components/combobox/ComboboxLabel/index.d.ts +1 -0
  70. package/dist/components/combobox/ComboboxList/ComboboxList.d.ts +5 -0
  71. package/dist/components/combobox/ComboboxList/ComboboxList.js +22 -0
  72. package/dist/components/combobox/ComboboxList/ComboboxList.js.map +1 -0
  73. package/dist/components/combobox/ComboboxList/index.d.ts +1 -0
  74. package/dist/components/combobox/ComboboxSeparator/ComboboxSeparator.d.ts +3 -0
  75. package/dist/components/combobox/ComboboxSeparator/ComboboxSeparator.js +14 -0
  76. package/dist/components/combobox/ComboboxSeparator/ComboboxSeparator.js.map +1 -0
  77. package/dist/components/combobox/ComboboxSeparator/index.d.ts +1 -0
  78. package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.d.ts +6 -0
  79. package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js +34 -0
  80. package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js.map +1 -0
  81. package/dist/components/combobox/ComboboxTrigger/index.d.ts +1 -0
  82. package/dist/components/combobox/ComboboxValue/ComboboxValue.d.ts +5 -0
  83. package/dist/components/combobox/ComboboxValue/ComboboxValue.js +15 -0
  84. package/dist/components/combobox/ComboboxValue/ComboboxValue.js.map +1 -0
  85. package/dist/components/combobox/ComboboxValue/index.d.ts +1 -0
  86. package/dist/components/combobox/index.d.ts +18 -0
  87. package/dist/components/combobox/index.js +18 -0
  88. package/dist/components/combobox/useComboboxAnchor/index.d.ts +1 -0
  89. package/dist/components/combobox/useComboboxAnchor/useComboboxAnchor.d.ts +1 -0
  90. package/dist/components/combobox/useComboboxAnchor/useComboboxAnchor.js +9 -0
  91. package/dist/components/combobox/useComboboxAnchor/useComboboxAnchor.js.map +1 -0
  92. package/dist/components/date-picker/DatePicker/DatePicker.d.ts +11 -0
  93. package/dist/components/date-picker/DatePicker/DatePicker.js +136 -0
  94. package/dist/components/date-picker/DatePicker/DatePicker.js.map +1 -0
  95. package/dist/components/date-picker/DatePicker/DatePicker.types.d.ts +32 -0
  96. package/dist/components/date-picker/DatePicker/index.d.ts +2 -0
  97. package/dist/components/date-picker/index.d.ts +2 -0
  98. package/dist/components/date-picker/index.js +2 -0
  99. package/dist/components/dialog/Dialog/Dialog.context.d.ts +2 -1
  100. package/dist/components/dialog/Dialog/Dialog.context.js.map +1 -1
  101. package/dist/components/dialog/Dialog/Dialog.js +21 -12
  102. package/dist/components/dialog/Dialog/Dialog.js.map +1 -1
  103. package/dist/components/dialog/Dialog/Dialog.types.d.ts +13 -1
  104. package/dist/components/dialog/Dialog/index.d.ts +1 -0
  105. package/dist/components/dialog/DialogTrigger/DialogTrigger.d.ts +4 -2
  106. package/dist/components/dialog/DialogTrigger/DialogTrigger.js +27 -6
  107. package/dist/components/dialog/DialogTrigger/DialogTrigger.js.map +1 -1
  108. package/dist/components/dialog/DialogTrigger/DialogTrigger.types.d.ts +3 -0
  109. package/dist/components/dialog/DialogTrigger/index.d.ts +3 -0
  110. package/dist/components/dialog/DialogTrigger/useDialogTrigger.d.ts +13 -2
  111. package/dist/components/dialog/DialogTrigger/useDialogTrigger.js +15 -19
  112. package/dist/components/dialog/DialogTrigger/useDialogTrigger.js.map +1 -1
  113. package/dist/components/dialog/index.js +3 -2
  114. package/dist/components/empty/Empty/Empty.d.ts +2 -0
  115. package/dist/components/empty/Empty/Empty.js +18 -0
  116. package/dist/components/empty/Empty/Empty.js.map +1 -0
  117. package/dist/components/empty/Empty/index.d.ts +1 -0
  118. package/dist/components/empty/EmptyContent/EmptyContent.d.ts +2 -0
  119. package/dist/components/empty/EmptyContent/EmptyContent.js +18 -0
  120. package/dist/components/empty/EmptyContent/EmptyContent.js.map +1 -0
  121. package/dist/components/empty/EmptyContent/index.d.ts +1 -0
  122. package/dist/components/empty/EmptyDescription/EmptyDescription.d.ts +2 -0
  123. package/dist/components/empty/EmptyDescription/EmptyDescription.js +18 -0
  124. package/dist/components/empty/EmptyDescription/EmptyDescription.js.map +1 -0
  125. package/dist/components/empty/EmptyDescription/index.d.ts +1 -0
  126. package/dist/components/empty/EmptyHeader/EmptyHeader.d.ts +2 -0
  127. package/dist/components/empty/EmptyHeader/EmptyHeader.js +18 -0
  128. package/dist/components/empty/EmptyHeader/EmptyHeader.js.map +1 -0
  129. package/dist/components/empty/EmptyHeader/index.d.ts +1 -0
  130. package/dist/components/empty/EmptyMedia/EmptyMedia.d.ts +4 -0
  131. package/dist/components/empty/EmptyMedia/EmptyMedia.js +27 -0
  132. package/dist/components/empty/EmptyMedia/EmptyMedia.js.map +1 -0
  133. package/dist/components/empty/EmptyMedia/EmptyMedia.styles.d.ts +3 -0
  134. package/dist/components/empty/EmptyMedia/EmptyMedia.styles.js +13 -0
  135. package/dist/components/empty/EmptyMedia/EmptyMedia.styles.js.map +1 -0
  136. package/dist/components/empty/EmptyMedia/EmptyMedia.types.d.ts +3 -0
  137. package/dist/components/empty/EmptyMedia/index.d.ts +2 -0
  138. package/dist/components/empty/EmptyTitle/EmptyTitle.d.ts +2 -0
  139. package/dist/components/empty/EmptyTitle/EmptyTitle.js +18 -0
  140. package/dist/components/empty/EmptyTitle/EmptyTitle.js.map +1 -0
  141. package/dist/components/empty/EmptyTitle/index.d.ts +1 -0
  142. package/dist/components/empty/index.d.ts +7 -0
  143. package/dist/components/empty/index.js +7 -0
  144. package/dist/components/image/Image.utils.js.map +1 -1
  145. package/dist/components/popover/Popover/Popover.context.d.ts +3 -0
  146. package/dist/components/popover/Popover/Popover.context.js +12 -0
  147. package/dist/components/popover/Popover/Popover.context.js.map +1 -0
  148. package/dist/components/popover/Popover/Popover.d.ts +18 -0
  149. package/dist/components/popover/Popover/Popover.js +37 -0
  150. package/dist/components/popover/Popover/Popover.js.map +1 -0
  151. package/dist/components/popover/Popover/Popover.types.d.ts +24 -0
  152. package/dist/components/popover/Popover/index.d.ts +3 -0
  153. package/dist/components/popover/PopoverContent/PopoverContent.d.ts +6 -0
  154. package/dist/components/popover/PopoverContent/PopoverContent.js +72 -0
  155. package/dist/components/popover/PopoverContent/PopoverContent.js.map +1 -0
  156. package/dist/components/popover/PopoverContent/PopoverContent.types.d.ts +16 -0
  157. package/dist/components/popover/PopoverContent/PopoverContent.utils.d.ts +20 -0
  158. package/dist/components/popover/PopoverContent/PopoverContent.utils.js +36 -0
  159. package/dist/components/popover/PopoverContent/PopoverContent.utils.js.map +1 -0
  160. package/dist/components/popover/PopoverContent/index.d.ts +6 -0
  161. package/dist/components/popover/PopoverContent/usePopoverContent.d.ts +11 -0
  162. package/dist/components/popover/PopoverContent/usePopoverContent.js +42 -0
  163. package/dist/components/popover/PopoverContent/usePopoverContent.js.map +1 -0
  164. package/dist/components/popover/PopoverDescription/PopoverDescription.d.ts +2 -0
  165. package/dist/components/popover/PopoverDescription/PopoverDescription.js +18 -0
  166. package/dist/components/popover/PopoverDescription/PopoverDescription.js.map +1 -0
  167. package/dist/components/popover/PopoverDescription/index.d.ts +1 -0
  168. package/dist/components/popover/PopoverHeader/PopoverHeader.d.ts +2 -0
  169. package/dist/components/popover/PopoverHeader/PopoverHeader.js +18 -0
  170. package/dist/components/popover/PopoverHeader/PopoverHeader.js.map +1 -0
  171. package/dist/components/popover/PopoverHeader/index.d.ts +1 -0
  172. package/dist/components/popover/PopoverTitle/PopoverTitle.d.ts +2 -0
  173. package/dist/components/popover/PopoverTitle/PopoverTitle.js +18 -0
  174. package/dist/components/popover/PopoverTitle/PopoverTitle.js.map +1 -0
  175. package/dist/components/popover/PopoverTitle/index.d.ts +1 -0
  176. package/dist/components/popover/PopoverTrigger/PopoverTrigger.d.ts +4 -0
  177. package/dist/components/popover/PopoverTrigger/PopoverTrigger.js +35 -0
  178. package/dist/components/popover/PopoverTrigger/PopoverTrigger.js.map +1 -0
  179. package/dist/components/popover/PopoverTrigger/PopoverTrigger.types.d.ts +3 -0
  180. package/dist/components/popover/PopoverTrigger/index.d.ts +4 -0
  181. package/dist/components/popover/PopoverTrigger/usePopoverTrigger.d.ts +14 -0
  182. package/dist/components/popover/PopoverTrigger/usePopoverTrigger.js +35 -0
  183. package/dist/components/popover/PopoverTrigger/usePopoverTrigger.js.map +1 -0
  184. package/dist/components/popover/index.d.ts +9 -0
  185. package/dist/components/popover/index.js +7 -0
  186. package/dist/components/radio-group/RadioGroup/RadioGroup.context.d.ts +3 -0
  187. package/dist/components/radio-group/RadioGroup/RadioGroup.context.js +12 -0
  188. package/dist/components/radio-group/RadioGroup/RadioGroup.context.js.map +1 -0
  189. package/dist/components/radio-group/RadioGroup/RadioGroup.d.ts +15 -0
  190. package/dist/components/radio-group/RadioGroup/RadioGroup.js +56 -0
  191. package/dist/components/radio-group/RadioGroup/RadioGroup.js.map +1 -0
  192. package/dist/components/radio-group/RadioGroup/RadioGroup.types.d.ts +22 -0
  193. package/dist/components/radio-group/RadioGroup/index.d.ts +3 -0
  194. package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.d.ts +6 -0
  195. package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js +80 -0
  196. package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js.map +1 -0
  197. package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.types.d.ts +9 -0
  198. package/dist/components/radio-group/RadioGroupItem/index.d.ts +2 -0
  199. package/dist/components/radio-group/index.d.ts +4 -0
  200. package/dist/components/radio-group/index.js +3 -0
  201. package/dist/components/select/Select/Select.context.d.ts +3 -3
  202. package/dist/components/select/Select/Select.context.js.map +1 -1
  203. package/dist/components/select/Select/Select.d.ts +5 -2
  204. package/dist/components/select/Select/Select.js +1 -1
  205. package/dist/components/select/Select/Select.js.map +1 -1
  206. package/dist/components/select/Select/Select.types.d.ts +19 -15
  207. package/dist/components/select/Select/index.d.ts +1 -1
  208. package/dist/components/select/SelectContent/SelectContent.js +2 -2
  209. package/dist/components/select/SelectContent/SelectContent.js.map +1 -1
  210. package/dist/components/select/SelectContent/SelectContent.utils.d.ts +2 -1
  211. package/dist/components/select/SelectContent/SelectContent.utils.js +2 -2
  212. package/dist/components/select/SelectContent/SelectContent.utils.js.map +1 -1
  213. package/dist/components/select/SelectContent/useSelectContent.js +6 -2
  214. package/dist/components/select/SelectContent/useSelectContent.js.map +1 -1
  215. package/dist/components/select/SelectItem/SelectItem.js +1 -1
  216. package/dist/components/select/SelectItem/SelectItem.js.map +1 -1
  217. package/dist/components/select/SelectItem/SelectItem.types.d.ts +3 -2
  218. package/dist/components/select/SelectItem/useSelectItem.d.ts +2 -1
  219. package/dist/components/select/SelectItem/useSelectItem.js +1 -1
  220. package/dist/components/select/SelectItem/useSelectItem.js.map +1 -1
  221. package/dist/components/select/SelectValue/SelectValue.js +1 -1
  222. package/dist/components/select/SelectValue/SelectValue.js.map +1 -1
  223. package/dist/components/toast/Toast/Toast.d.ts +3 -0
  224. package/dist/components/toast/Toast/Toast.js +181 -0
  225. package/dist/components/toast/Toast/Toast.js.map +1 -0
  226. package/dist/components/toast/Toast/Toast.styles.d.ts +6 -0
  227. package/dist/components/toast/Toast/Toast.styles.js +27 -0
  228. package/dist/components/toast/Toast/Toast.styles.js.map +1 -0
  229. package/dist/components/toast/Toast/Toast.types.d.ts +90 -0
  230. package/dist/components/toast/Toast/Toast.types.js +6 -0
  231. package/dist/components/toast/Toast/Toast.types.js.map +1 -0
  232. package/dist/components/toast/Toast/index.d.ts +2 -0
  233. package/dist/components/toast/{components → Toaster}/Toaster.d.ts +1 -1
  234. package/dist/components/toast/Toaster/Toaster.js +102 -0
  235. package/dist/components/toast/Toaster/Toaster.js.map +1 -0
  236. package/dist/components/toast/Toaster/Toaster.styles.d.ts +1 -0
  237. package/dist/components/toast/Toaster/Toaster.styles.js +6 -0
  238. package/dist/components/toast/Toaster/Toaster.styles.js.map +1 -0
  239. package/dist/components/toast/Toaster/Toaster.types.d.ts +44 -0
  240. package/dist/components/toast/Toaster/Toaster.utils.d.ts +7 -0
  241. package/dist/components/toast/Toaster/Toaster.utils.js +33 -0
  242. package/dist/components/toast/Toaster/Toaster.utils.js.map +1 -0
  243. package/dist/components/toast/Toaster/index.d.ts +3 -0
  244. package/dist/components/toast/index.d.ts +5 -10
  245. package/dist/components/toast/index.js +4 -5
  246. package/dist/components/toast/state/index.d.ts +1 -0
  247. package/dist/components/toast/state/toast.d.ts +24 -0
  248. package/dist/components/toast/state/toast.js +116 -0
  249. package/dist/components/toast/state/toast.js.map +1 -0
  250. package/dist/components/toggle/Toggle/Toggle.d.ts +3 -0
  251. package/dist/components/toggle/Toggle/Toggle.js +49 -0
  252. package/dist/components/toggle/Toggle/Toggle.js.map +1 -0
  253. package/dist/components/toggle/Toggle/Toggle.styles.d.ts +4 -0
  254. package/dist/components/toggle/Toggle/Toggle.styles.js +23 -0
  255. package/dist/components/toggle/Toggle/Toggle.styles.js.map +1 -0
  256. package/dist/components/toggle/Toggle/Toggle.types.d.ts +12 -0
  257. package/dist/components/toggle/Toggle/index.d.ts +3 -0
  258. package/dist/components/toggle/index.d.ts +2 -0
  259. package/dist/components/toggle/index.js +3 -0
  260. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.d.ts +36 -0
  261. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js +40 -0
  262. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js.map +1 -0
  263. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.d.ts +18 -0
  264. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +94 -0
  265. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -0
  266. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.d.ts +8 -0
  267. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.js +7 -0
  268. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.js.map +1 -0
  269. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.types.d.ts +104 -0
  270. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.d.ts +8 -0
  271. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js +25 -0
  272. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js.map +1 -0
  273. package/dist/components/toggle-group/ToggleGroup/index.d.ts +3 -0
  274. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.d.ts +17 -0
  275. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js +47 -0
  276. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js.map +1 -0
  277. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.d.ts +11 -0
  278. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js +88 -0
  279. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js.map +1 -0
  280. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.d.ts +12 -0
  281. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.js +7 -0
  282. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.js.map +1 -0
  283. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.types.d.ts +20 -0
  284. package/dist/components/toggle-group/ToggleGroupItem/index.d.ts +2 -0
  285. package/dist/components/toggle-group/call-event-handler.d.ts +5 -0
  286. package/dist/components/toggle-group/call-event-handler.js +9 -0
  287. package/dist/components/toggle-group/call-event-handler.js.map +1 -0
  288. package/dist/components/toggle-group/index.d.ts +4 -0
  289. package/dist/components/toggle-group/index.js +3 -0
  290. package/dist/components/tooltip/Tooltip/Tooltip.js +51 -50
  291. package/dist/components/tooltip/Tooltip/Tooltip.js.map +1 -1
  292. package/dist/components/tooltip/TooltipArrow/TooltipArrow.d.ts +3 -28
  293. package/dist/components/tooltip/TooltipArrow/TooltipArrow.js +13 -45
  294. package/dist/components/tooltip/TooltipArrow/TooltipArrow.js.map +1 -1
  295. package/dist/components/tooltip/TooltipContent/TooltipContent.context.d.ts +2 -0
  296. package/dist/components/tooltip/TooltipContent/TooltipContent.context.js.map +1 -1
  297. package/dist/components/tooltip/TooltipContent/TooltipContent.js +2 -1
  298. package/dist/components/tooltip/TooltipContent/TooltipContent.js.map +1 -1
  299. package/dist/components/tooltip/TooltipContent/TooltipContent.types.d.ts +3 -2
  300. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.d.ts +2 -1
  301. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js +8 -4
  302. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js.map +1 -1
  303. package/dist/components/tooltip/TooltipContent/useTooltipContent.js +20 -19
  304. package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
  305. package/dist/components/tooltip/TooltipProvider/TooltipProvider.context.d.ts +3 -0
  306. package/dist/components/tooltip/TooltipProvider/TooltipProvider.context.js +10 -0
  307. package/dist/components/tooltip/TooltipProvider/TooltipProvider.context.js.map +1 -0
  308. package/dist/components/tooltip/TooltipProvider/TooltipProvider.d.ts +3 -0
  309. package/dist/components/tooltip/TooltipProvider/TooltipProvider.js +20 -0
  310. package/dist/components/tooltip/TooltipProvider/TooltipProvider.js.map +1 -0
  311. package/dist/components/tooltip/TooltipProvider/TooltipProvider.types.d.ts +11 -0
  312. package/dist/components/tooltip/TooltipProvider/index.d.ts +3 -0
  313. package/dist/components/tooltip/index.d.ts +2 -0
  314. package/dist/components/tooltip/index.js +7 -6
  315. package/dist/index.d.ts +8 -0
  316. package/dist/index.js +153 -115
  317. package/dist/ui.css +1 -1
  318. package/package.json +7 -6
  319. package/dist/components/toast/components/Assets.d.ts +0 -9
  320. package/dist/components/toast/components/Assets.js +0 -32
  321. package/dist/components/toast/components/Assets.js.map +0 -1
  322. package/dist/components/toast/components/Toast.d.ts +0 -3
  323. package/dist/components/toast/components/Toast.js +0 -152
  324. package/dist/components/toast/components/Toast.js.map +0 -1
  325. package/dist/components/toast/components/ToastActions.d.ts +0 -12
  326. package/dist/components/toast/components/ToastActions.js +0 -62
  327. package/dist/components/toast/components/ToastActions.js.map +0 -1
  328. package/dist/components/toast/components/ToastContent.d.ts +0 -9
  329. package/dist/components/toast/components/ToastContent.js +0 -36
  330. package/dist/components/toast/components/ToastContent.js.map +0 -1
  331. package/dist/components/toast/components/ToastIcon.d.ts +0 -9
  332. package/dist/components/toast/components/ToastIcon.js +0 -59
  333. package/dist/components/toast/components/ToastIcon.js.map +0 -1
  334. package/dist/components/toast/components/Toaster.js +0 -163
  335. package/dist/components/toast/components/Toaster.js.map +0 -1
  336. package/dist/components/toast/constants.d.ts +0 -16
  337. package/dist/components/toast/constants.js +0 -6
  338. package/dist/components/toast/constants.js.map +0 -1
  339. package/dist/components/toast/hooks/useSwipe.d.ts +0 -23
  340. package/dist/components/toast/hooks/useSwipe.js +0 -59
  341. package/dist/components/toast/hooks/useSwipe.js.map +0 -1
  342. package/dist/components/toast/hooks/useTheme.d.ts +0 -2
  343. package/dist/components/toast/hooks/useTheme.js +0 -22
  344. package/dist/components/toast/hooks/useTheme.js.map +0 -1
  345. package/dist/components/toast/hooks/useToastHeight.d.ts +0 -11
  346. package/dist/components/toast/hooks/useToastHeight.js +0 -35
  347. package/dist/components/toast/hooks/useToastHeight.js.map +0 -1
  348. package/dist/components/toast/hooks/useToastSubscription.d.ts +0 -5
  349. package/dist/components/toast/hooks/useToastSubscription.js +0 -38
  350. package/dist/components/toast/hooks/useToastSubscription.js.map +0 -1
  351. package/dist/components/toast/hooks/useToastTimer.d.ts +0 -11
  352. package/dist/components/toast/hooks/useToastTimer.js +0 -22
  353. package/dist/components/toast/hooks/useToastTimer.js.map +0 -1
  354. package/dist/components/toast/hooks/useToasterKeyboard.d.ts +0 -7
  355. package/dist/components/toast/hooks/useToasterKeyboard.js +0 -14
  356. package/dist/components/toast/hooks/useToasterKeyboard.js.map +0 -1
  357. package/dist/components/toast/hooks.d.ts +0 -13
  358. package/dist/components/toast/hooks.js +0 -37
  359. package/dist/components/toast/hooks.js.map +0 -1
  360. package/dist/components/toast/state.d.ts +0 -52
  361. package/dist/components/toast/state.js +0 -170
  362. package/dist/components/toast/state.js.map +0 -1
  363. package/dist/components/toast/types.d.ts +0 -168
  364. package/dist/components/toast/types.js +0 -6
  365. package/dist/components/toast/types.js.map +0 -1
  366. package/dist/components/toast/utils.d.ts +0 -10
  367. package/dist/components/toast/utils.js +0 -39
  368. package/dist/components/toast/utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SelectContent.js","names":["onCleanup","splitProps","createMemo","createEffect","Portal","useSelectContent","SelectContentProps","clsx","SelectContent","props","ctx","pos","maxHeight","isVisible","animationState","contentElement","setContentElement","local","rest","enabledItems","items","filter","it","disabled","moveActive","dir","list","length","currentIndex","findIndex","value","activeValue","nextIndex","setActiveValue","onKeyDown","e","KeyboardEvent","key","preventDefault","undefined","selectValue","close","setOpen","open","onPointerDown","PointerEvent","target","Node","reference","contains","floating","stopPropagation","document","addEventListener","capture","removeEventListener","active","el","querySelector","HTMLElement","CSS","escape","scrollIntoView","block","_$createComponent","children","_el$","_tmpl$","_el$2","firstChild","_$use","setFloating","_$spread","_$mergeProps","data-state","style","position","width","middlewareData","matchWidth","overflow","class","_$insert","_$effect","_$p","_$style","floatingStyles","opacity","isPositioned","visibility"],"sources":["../../../../src/components/select/SelectContent/SelectContent.tsx"],"sourcesContent":["import { onCleanup, splitProps, createMemo, createEffect } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { useSelectContent } from \"./useSelectContent\";\nimport type { SelectContentProps } from \"./SelectContent.types\";\nimport { clsx } from \"~/utils\";\n\nexport function SelectContent(props: SelectContentProps) {\n const {\n ctx,\n pos,\n maxHeight,\n isVisible,\n animationState,\n contentElement,\n setContentElement,\n } = useSelectContent(() => props);\n\n const [local, rest] = splitProps(props, [\n \"placement\",\n \"collisionPadding\",\n \"class\",\n \"style\",\n \"children\",\n ]);\n\n const enabledItems = createMemo(() => ctx.items.filter((it) => !it.disabled));\n\n const moveActive = (dir: 1 | -1) => {\n const list = enabledItems();\n if (list.length === 0) return;\n const currentIndex = list.findIndex((it) => it.value === ctx.activeValue());\n const nextIndex = (currentIndex + dir + list.length) % list.length;\n ctx.setActiveValue(list[nextIndex].value);\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n moveActive(1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n moveActive(-1);\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n if (ctx.activeValue() !== undefined)\n ctx.selectValue(ctx.activeValue()!);\n break;\n case \"Escape\":\n e.preventDefault();\n ctx.close();\n break;\n case \"Tab\":\n ctx.setOpen(false);\n break;\n }\n };\n\n // 点击外部关闭:捕获阶段监听 + stopPropagation,在事件还没下沉到真正的目标\n // 元素之前就拦截掉,避免点击穿透到浮层下面被盖住的元素(细节见\n // production-tooltip 那边点击穿透问题的排查记录,这里直接复用同一个模式)。\n createEffect(() => {\n if (!ctx.open()) return;\n const onPointerDown = (e: PointerEvent) => {\n const target = e.target as Node;\n if (\n !ctx.reference()?.contains(target) &&\n !ctx.floating()?.contains(target)\n ) {\n ctx.setOpen(false);\n e.stopPropagation();\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown, { capture: true });\n onCleanup(() =>\n document.removeEventListener(\"pointerdown\", onPointerDown, {\n capture: true,\n }),\n );\n });\n\n // 打开时把键盘事件绑到 document,这样不需要抢 focus 也能用方向键\n createEffect(() => {\n if (!ctx.open()) return;\n document.addEventListener(\"keydown\", onKeyDown);\n onCleanup(() => document.removeEventListener(\"keydown\", onKeyDown));\n });\n\n // 高亮项变化时自动滚动到可见区域\n createEffect(() => {\n const active = ctx.activeValue();\n const el = contentElement();\n if (!active || !el) return;\n el.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(active)}\"]`,\n )?.scrollIntoView({ block: \"nearest\" });\n });\n\n return (\n <Portal>\n {/*\n 外层:只负责定位(position:fixed 来自 floatingStyles),不参与动画。\n 它的 transform 专门用来做 translate(x,y) 定位——如果内层的 zoom-in-95\n 动画也放在这一层,两者会互相冲突(细节见 SelectContent.utils.ts 顶部\n 的注释)。\n\n 关闭时不再卸载整个 Portal,而是用 visibility/pointer-events 隐藏:\n SelectItem 通过 onMount 向 ctx 注册 item 元数据,如果关闭时把子节点\n 卸载掉,ctx.items 会被清空,SelectValue 就无法再用 item.label 渲染\n 已选值。让子节点持续挂载,items 的注册生命周期才和 SelectContent\n 本身一致;隐藏只是视觉/交互上的关闭,不影响数据。\n */}\n <div\n ref={(el) => {\n ctx.setFloating(el);\n // 元素卸载时清空 ctx.floating(),避免后续读到已从 DOM 摘除的\n // 僵尸节点(Solid 的 ref 回调只在创建时触发一次,不会自动在\n // 卸载时传 undefined)。\n onCleanup(() => ctx.setFloating(undefined));\n }}\n style={{\n ...pos.floatingStyles(),\n \"z-index\": 1000,\n opacity: isVisible() && pos.isPositioned() ? 1 : 0,\n \"pointer-events\": isVisible() ? \"auto\" : \"none\",\n visibility: isVisible() ? \"visible\" : \"hidden\",\n }}\n >\n {/*\n 内层:真正的视觉样式 + overflow:auto 滚动 + 进出场动画。\n position: relative 是为了让它成为内部所有选项的 offsetParent——\n \"选中项对齐\"这套定位策略要用 offsetTop 算选项在列表里的位置,\n 这个值必须相对\"真正会滚动的这个元素\"才准确,不能让它被外层\n (不滚动)抢走 offsetParent 的身份。\n */}\n <div\n ref={setContentElement}\n role=\"listbox\"\n data-state={animationState()}\n style={{\n position: \"relative\",\n width: pos.middlewareData().matchWidth?.width\n ? `${pos.middlewareData().matchWidth.width}px`\n : undefined,\n \"max-height\": maxHeight() ? `${maxHeight()}px` : undefined,\n overflow: \"auto\",\n ...(typeof local.style === \"object\" ? local.style : undefined),\n }}\n class={clsx(\n \"min-w-36\",\n \"rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100\",\n // 只保留入场动画,没有退场动画:关闭瞬间外层直接 visibility:hidden,\n // data-state 也立即切回 closed,没有退场动画阶段,自然不会出现\n // 选中项变更时\"面板先跳一下再消失\"的问题。duration-100(100ms)\n // 比默认的 150ms 更短——下拉菜单这种高频交互的组件,动画应该比\n // tooltip 更快、更利落。\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n local.class,\n )}\n {...rest}\n >\n {local.children}\n </div>\n </div>\n </Portal>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SelectContent.js","names":["onCleanup","splitProps","createMemo","createEffect","Portal","useSelectContent","SelectContentProps","clsx","SelectContent","props","ctx","pos","maxHeight","isVisible","animationState","contentElement","setContentElement","local","rest","enabledItems","items","filter","it","disabled","moveActive","dir","list","length","currentIndex","findIndex","value","activeValue","nextIndex","setActiveValue","onKeyDown","e","KeyboardEvent","key","preventDefault","undefined","selectValue","close","setOpen","open","onPointerDown","PointerEvent","target","Node","reference","contains","floating","stopPropagation","document","addEventListener","capture","removeEventListener","active","el","querySelector","HTMLElement","CSS","escape","String","scrollIntoView","block","_$createComponent","children","_el$","_tmpl$","_el$2","firstChild","_$use","setFloating","_$spread","_$mergeProps","data-state","style","position","width","middlewareData","matchWidth","overflow","class","_$insert","_$effect","_$p","_$style","floatingStyles","opacity","isPositioned","visibility"],"sources":["../../../../src/components/select/SelectContent/SelectContent.tsx"],"sourcesContent":["import { onCleanup, splitProps, createMemo, createEffect } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { useSelectContent } from \"./useSelectContent\";\nimport type { SelectContentProps } from \"./SelectContent.types\";\nimport { clsx } from \"~/utils\";\n\nexport function SelectContent(props: SelectContentProps) {\n const {\n ctx,\n pos,\n maxHeight,\n isVisible,\n animationState,\n contentElement,\n setContentElement,\n } = useSelectContent(() => props);\n\n const [local, rest] = splitProps(props, [\n \"placement\",\n \"collisionPadding\",\n \"class\",\n \"style\",\n \"children\",\n ]);\n\n const enabledItems = createMemo(() => ctx.items.filter((it) => !it.disabled));\n\n const moveActive = (dir: 1 | -1) => {\n const list = enabledItems();\n if (list.length === 0) return;\n const currentIndex = list.findIndex((it) => it.value === ctx.activeValue());\n const nextIndex = (currentIndex + dir + list.length) % list.length;\n ctx.setActiveValue(list[nextIndex].value);\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n moveActive(1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n moveActive(-1);\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n if (ctx.activeValue() !== undefined)\n ctx.selectValue(ctx.activeValue()!);\n break;\n case \"Escape\":\n e.preventDefault();\n ctx.close();\n break;\n case \"Tab\":\n ctx.setOpen(false);\n break;\n }\n };\n\n // 点击外部关闭:捕获阶段监听 + stopPropagation,在事件还没下沉到真正的目标\n // 元素之前就拦截掉,避免点击穿透到浮层下面被盖住的元素(细节见\n // production-tooltip 那边点击穿透问题的排查记录,这里直接复用同一个模式)。\n createEffect(() => {\n if (!ctx.open()) return;\n const onPointerDown = (e: PointerEvent) => {\n const target = e.target as Node;\n if (\n !ctx.reference()?.contains(target) &&\n !ctx.floating()?.contains(target)\n ) {\n ctx.setOpen(false);\n e.stopPropagation();\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown, { capture: true });\n onCleanup(() =>\n document.removeEventListener(\"pointerdown\", onPointerDown, {\n capture: true,\n }),\n );\n });\n\n // 打开时把键盘事件绑到 document,这样不需要抢 focus 也能用方向键\n createEffect(() => {\n if (!ctx.open()) return;\n document.addEventListener(\"keydown\", onKeyDown);\n onCleanup(() => document.removeEventListener(\"keydown\", onKeyDown));\n });\n\n // 高亮项变化时自动滚动到可见区域\n createEffect(() => {\n const active = ctx.activeValue();\n const el = contentElement();\n if (!active || !el) return;\n el.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(String(active))}\"]`,\n )?.scrollIntoView({ block: \"nearest\" });\n });\n\n return (\n <Portal>\n {/*\n 外层:只负责定位(position:fixed 来自 floatingStyles),不参与动画。\n 它的 transform 专门用来做 translate(x,y) 定位——如果内层的 zoom-in-95\n 动画也放在这一层,两者会互相冲突(细节见 SelectContent.utils.ts 顶部\n 的注释)。\n\n 关闭时不再卸载整个 Portal,而是用 visibility/pointer-events 隐藏:\n SelectItem 通过 onMount 向 ctx 注册 item 元数据,如果关闭时把子节点\n 卸载掉,ctx.items 会被清空,SelectValue 就无法再用 item.label 渲染\n 已选值。让子节点持续挂载,items 的注册生命周期才和 SelectContent\n 本身一致;隐藏只是视觉/交互上的关闭,不影响数据。\n */}\n <div\n data-slot=\"select-content\"\n ref={(el) => {\n ctx.setFloating(el);\n // 元素卸载时清空 ctx.floating(),避免后续读到已从 DOM 摘除的\n // 僵尸节点(Solid 的 ref 回调只在创建时触发一次,不会自动在\n // 卸载时传 undefined)。\n onCleanup(() => ctx.setFloating(undefined));\n }}\n style={{\n ...pos.floatingStyles(),\n \"z-index\": 1000,\n opacity: isVisible() && pos.isPositioned() ? 1 : 0,\n \"pointer-events\": isVisible() ? \"auto\" : \"none\",\n visibility: isVisible() ? \"visible\" : \"hidden\",\n }}\n >\n {/*\n 内层:真正的视觉样式 + overflow:auto 滚动 + 进出场动画。\n position: relative 是为了让它成为内部所有选项的 offsetParent——\n \"选中项对齐\"这套定位策略要用 offsetTop 算选项在列表里的位置,\n 这个值必须相对\"真正会滚动的这个元素\"才准确,不能让它被外层\n (不滚动)抢走 offsetParent 的身份。\n */}\n <div\n ref={setContentElement}\n role=\"listbox\"\n data-state={animationState()}\n style={{\n position: \"relative\",\n width: pos.middlewareData().matchWidth?.width\n ? `${pos.middlewareData().matchWidth.width}px`\n : undefined,\n \"max-height\": maxHeight() ? `${maxHeight()}px` : undefined,\n overflow: \"auto\",\n ...(typeof local.style === \"object\" ? local.style : undefined),\n }}\n class={clsx(\n \"min-w-36\",\n \"rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100\",\n // 只保留入场动画,没有退场动画:关闭瞬间外层直接 visibility:hidden,\n // data-state 也立即切回 closed,没有退场动画阶段,自然不会出现\n // 选中项变更时\"面板先跳一下再消失\"的问题。duration-100(100ms)\n // 比默认的 150ms 更短——下拉菜单这种高频交互的组件,动画应该比\n // tooltip 更快、更利落。\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n local.class,\n )}\n {...rest}\n >\n {local.children}\n </div>\n </div>\n </Portal>\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { Middleware, Placement } from '../../../lib';
2
+ import { SelectOptionValue } from '../Select/Select.types';
2
3
  export interface BuildSelectMiddlewareOptions {
3
4
  /** 当前是否已经有选中值——决定走"选中项对齐"还是普通的贴边下拉 */
4
5
  hasValue: boolean;
5
- selectedValue: () => string | undefined;
6
+ selectedValue: () => SelectOptionValue | null | undefined;
6
7
  /** 真正会滚动、承载选项列表的那个元素(内层),不是外层的定位容器 */
7
8
  scrollElement: () => HTMLElement | undefined;
8
9
  placement: Placement;
@@ -19,8 +19,8 @@ function c(t, n) {
19
19
  name: "itemAlign",
20
20
  fn(r) {
21
21
  let i = t(), a = n();
22
- if (i === void 0 || !a) return {};
23
- let o = a.querySelector(`[data-value="${CSS.escape(i)}"]`);
22
+ if (i == null || !a) return {};
23
+ let o = a.querySelector(`[data-value="${CSS.escape(String(i))}"]`);
24
24
  if (!o) return {};
25
25
  let { rects: s, strategy: c } = r, l = e(c, 8), u = o.offsetTop, d = o.offsetHeight, f = a.scrollHeight, p = s.reference.y + s.reference.height / 2 - d / 2, m = u, h = f - u - d, g = p - l.y, _ = l.y + l.height - (p + d), v = Math.max(0, Math.min(m, g)), y = Math.max(0, Math.min(h, _)), b = p - v, x = getComputedStyle(a), S = Number.parseFloat(x.borderTopWidth) || 0, C = Number.parseFloat(x.borderBottomWidth) || 0, w = v + d + y + S + C;
26
26
  return a.scrollTop = m - v, {
@@ -1 +1 @@
1
- {"version":3,"file":"SelectContent.utils.js","names":[],"sources":["../../../../src/components/select/SelectContent/SelectContent.utils.ts"],"sourcesContent":["import {\n offset,\n flip,\n shift,\n size,\n hide,\n containingBlockOffset,\n type Middleware,\n type Placement,\n} from \"~/lib\";\nimport { getViewportBoundary } from \"~/lib/positioner/utils/dom\";\n\n/** 让浮层宽度和 trigger 对齐——不改坐标,只把 reference 宽度透传给上层当 style.width 用 */\nfunction matchReferenceWidth(): Middleware {\n return {\n name: \"matchWidth\",\n fn(state) {\n return { data: { width: state.rects.reference.width } };\n },\n };\n}\n\n/**\n * \"选中项对齐\":让已选中的那一项精确覆盖在 trigger 上方,这是原生 <select>/\n * shadcn Select 重新打开时的经典效果,和 offset+flip+shift 是完全不同的定位\n * 策略,所以单独写一个 middleware,而不是复用 shift/flip。\n *\n * 核心思路是把\"面板高度、面板位置、列表滚动量\"三者一起算,而不是先假设一个\n * 面板高度、算完位置再回头夹 scrollTop——后者试过两版都有遗留问题(面板和\n * trigger 之间留一截空隙、或者选中项因为 scrollTop 静默越界被推到面板边缘)。\n *\n * 具体算法:选中项\"理应\"贴着 trigger 垂直居中。以这个位置为基准,\n * 分别看\"上方\"和\"下方\"能展开多少:\n * - 上方能展开的量 = min(选中项上方还有多少内容, 视口上方还剩多少空间)\n * - 下方能展开的量 = min(选中项下方还有多少内容, 视口下方还剩多少空间)\n * 面板高度就是\"上方展开量 + 选中项自身高度 + 下方展开量\",面板顶部位置和\n * 滚动量都由这两个\"展开量\"直接算出来,不需要再额外夹取——因为:\n * - 展开量永远不会超过\"内容还剩多少\",所以 scrollTop 永远落在合法范围内;\n * - 展开量永远不会超过\"视口还剩多少空间\",所以面板永远不会超出视口;\n * - 选中项贴 trigger 是这个算法的出发点,天然成立,不需要单独判断\"要不要\n * 贴 trigger\"。\n * 对列表两端的项(第一项/最后一项)会自动退化成正确的行为:比如选中第一项,\n * \"上方还有多少内容\"是 0,上方展开量恒为 0,面板顶部直接落在选中项该在的\n * 位置,不会凭空往上多留空间。\n */\nfunction alignSelectedItem(\n getValue: () => string | undefined,\n getScrollElement: () => HTMLElement | undefined,\n): Middleware {\n return {\n name: \"itemAlign\",\n fn(state) {\n const value = getValue();\n const scrollEl = getScrollElement();\n if (value === undefined || !scrollEl) return {};\n\n const itemEl = scrollEl.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(value)}\"]`,\n );\n if (!itemEl) return {};\n\n const { rects, strategy } = state;\n const boundary = getViewportBoundary(strategy, 8);\n\n const itemOffsetTop = itemEl.offsetTop;\n const itemHeight = itemEl.offsetHeight;\n const scrollHeight = scrollEl.scrollHeight;\n\n // 选中项理想情况下应该落在的位置:和 trigger 垂直居中对齐\n const idealItemTop =\n rects.reference.y + rects.reference.height / 2 - itemHeight / 2;\n\n const contentAbove = itemOffsetTop; // 选中项上方还有多少内容(px)\n const contentBelow = scrollHeight - itemOffsetTop - itemHeight; // 下方还有多少内容\n const spaceAbove = idealItemTop - boundary.y; // 从理想位置到视口顶部的可用空间\n const spaceBelow =\n boundary.y + boundary.height - (idealItemTop + itemHeight); // 到视口底部的可用空间\n\n const expandAbove = Math.max(0, Math.min(contentAbove, spaceAbove));\n const expandBelow = Math.max(0, Math.min(contentBelow, spaceBelow));\n\n const panelTop = idealItemTop - expandAbove;\n // panelHeight 最终会作为 CSS max-height 写到 scrollEl 上。scrollEl\n // 有 border(类名里带 border),而 Tailwind preflight 会把 box-sizing\n // 设为 border-box,此时 max-height 约束的是 border-box 高度;但\n // scrollHeight 只包含内容 + padding、不包含 border。直接拿\n // scrollHeight 当 max-height 会让 clientHeight 比 scrollHeight 少\n // 一个上下 border 的宽度,列表本来刚好能放下时也会多出 1~2px 的\n // overflow,从而被 overflow:auto 画出一条纵向滚动条。这里把 border\n // 宽度补回去,保证 border-box 的 max-height 能完整容纳所有内容。\n const scrollStyle = getComputedStyle(scrollEl);\n const borderTop = Number.parseFloat(scrollStyle.borderTopWidth) || 0;\n const borderBottom =\n Number.parseFloat(scrollStyle.borderBottomWidth) || 0;\n const panelHeight =\n expandAbove + itemHeight + expandBelow + borderTop + borderBottom;\n const scrollTop = contentAbove - expandAbove;\n\n // scrollTop 是纯 DOM 副作用,不影响坐标计算本身,这里直接设置是安全的。\n scrollEl.scrollTop = scrollTop;\n\n return {\n x: rects.reference.x,\n y: panelTop,\n data: { aligned: true, panelHeight },\n };\n },\n };\n}\n\nexport interface BuildSelectMiddlewareOptions {\n /** 当前是否已经有选中值——决定走\"选中项对齐\"还是普通的贴边下拉 */\n hasValue: boolean;\n selectedValue: () => string | undefined;\n /** 真正会滚动、承载选项列表的那个元素(内层),不是外层的定位容器 */\n scrollElement: () => HTMLElement | undefined;\n placement: Placement;\n collisionPadding: number;\n onAvailableHeightChange: (availableHeight: number) => void;\n}\n\n/**\n * Select 面板的定位管线,按\"有没有选中值\"分两套配方:\n *\n * - **有选中值**:matchWidth → size(算可用高度,配合 overflow:auto 做滚动——\n * 和 Tooltip 不同,下拉列表内容天然可能很长,滚动是合理需求,不是过度设计)\n * → itemAlign(核心:选中项盖在 trigger 上)→ shift(只处理横向,纵向已经被\n * itemAlign 自己夹过了)→ containingBlockOffset。\n * - **没有选中值**(占位符状态):offset → flip → shift → matchWidth → size\n * → containingBlockOffset,这是标准的\"贴边下拉\"策略,和 Dropdown 用的是\n * 同一套思路。\n *\n * 顺序不能随便换:size 必须在 shift/itemAlign 之后(要用最终坐标反推可用高度),\n * containingBlockOffset 必须在所有其他 middleware 之后。\n *\n * SelectContent.tsx 里把面板拆成了两层:外层(position:fixed,负责 translate(x,y)\n * 定位)和内层(真正的样式、overflow:auto 滚动、data-state 驱动的进出场动画)。\n * 这不是为了美观随手拆的——同一个元素如果既承担定位用的 transform:translate(),\n * 又承担 zoom-in-95 这类靠 transform:scale() 做的动画,CSS 的 transform 一个\n * 元素只能有一份,动画播放期间会完全接管这个属性,把定位用的 translate(x,y)\n * 整个顶掉,表现为\"入场从视口左上角飞入、退场飞向左上角消失\"这种明显错误的\n * 观感(这正是这个组件早期实现踩过的一个真实 bug)。scrollElement 传的是\n * 内层(真正会滚动的那个),不是 state.elements.floating(外层,它自己不滚动)。\n */\nexport function createSelectMiddleware(\n options: BuildSelectMiddlewareOptions,\n): Middleware[] {\n if (options.hasValue) {\n return [\n matchReferenceWidth(),\n // 注意这里没有 size 中间件:alignSelectedItem 自己已经把面板高度、\n // 位置、滚动量一起算好了(见它的注释),面板高度是通过\n // middlewareData.itemAlign.panelHeight 传出去的,不需要 size 再用\n // \"只看视口空间、不看内容长度\"那套算法独立算一遍——两边算出来的值\n // 一旦不一致,CSS max-height 和定位计算假设的面板高度就会对不上,\n // 重新引入\"选中项没对齐\"这类问题(这正是这次要修的 bug 的根源)。\n alignSelectedItem(options.selectedValue, options.scrollElement),\n shift({\n padding: options.collisionPadding,\n mainAxis: false,\n crossAxis: true,\n }),\n hide(),\n containingBlockOffset(),\n ];\n }\n\n return [\n offset(4),\n flip(),\n shift({ padding: options.collisionPadding }),\n matchReferenceWidth(),\n size({\n padding: options.collisionPadding,\n apply({ availableHeight }) {\n options.onAvailableHeightChange(availableHeight);\n },\n }),\n hide(),\n containingBlockOffset(),\n ];\n}\n"],"mappings":";;;;;;;;AAaA,SAAS,IAAkC;CACzC,OAAO;EACL,MAAM;EACN,GAAG,GAAO;GACR,OAAO,EAAE,MAAM,EAAE,OAAO,EAAM,MAAM,UAAU,MAAM,EAAE;EACxD;CACF;AACF;AAyBA,SAAS,EACP,GACA,GACY;CACZ,OAAO;EACL,MAAM;EACN,GAAG,GAAO;GACR,IAAM,IAAQ,EAAS,GACjB,IAAW,EAAiB;GAClC,IAAI,MAAU,KAAA,KAAa,CAAC,GAAU,OAAO,CAAC;GAE9C,IAAM,IAAS,EAAS,cACtB,gBAAgB,IAAI,OAAO,CAAK,EAAE,GACpC;GACA,IAAI,CAAC,GAAQ,OAAO,CAAC;GAErB,IAAM,EAAE,UAAO,gBAAa,GACtB,IAAW,EAAoB,GAAU,CAAC,GAE1C,IAAgB,EAAO,WACvB,IAAa,EAAO,cACpB,IAAe,EAAS,cAGxB,IACJ,EAAM,UAAU,IAAI,EAAM,UAAU,SAAS,IAAI,IAAa,GAE1D,IAAe,GACf,IAAe,IAAe,IAAgB,GAC9C,IAAa,IAAe,EAAS,GACrC,IACJ,EAAS,IAAI,EAAS,UAAU,IAAe,IAE3C,IAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAc,CAAU,CAAC,GAC5D,IAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAc,CAAU,CAAC,GAE5D,IAAW,IAAe,GAS1B,IAAc,iBAAiB,CAAQ,GACvC,IAAY,OAAO,WAAW,EAAY,cAAc,KAAK,GAC7D,IACJ,OAAO,WAAW,EAAY,iBAAiB,KAAK,GAChD,IACJ,IAAc,IAAa,IAAc,IAAY;GAMvD,OAFA,EAAS,YAHS,IAAe,GAK1B;IACL,GAAG,EAAM,UAAU;IACnB,GAAG;IACH,MAAM;KAAE,SAAS;KAAM;IAAY;GACrC;EACF;CACF;AACF;AAoCA,SAAgB,EACd,GACc;CAqBd,OApBI,EAAQ,WACH;EACL,EAAoB;EAOpB,EAAkB,EAAQ,eAAe,EAAQ,aAAa;EAC9D,EAAM;GACJ,SAAS,EAAQ;GACjB,UAAU;GACV,WAAW;EACb,CAAC;EACD,EAAK;EACL,EAAsB;CACxB,IAGK;EACL,EAAO,CAAC;EACR,EAAK;EACL,EAAM,EAAE,SAAS,EAAQ,iBAAiB,CAAC;EAC3C,EAAoB;EACpB,EAAK;GACH,SAAS,EAAQ;GACjB,MAAM,EAAE,sBAAmB;IACzB,EAAQ,wBAAwB,CAAe;GACjD;EACF,CAAC;EACD,EAAK;EACL,EAAsB;CACxB;AACF"}
1
+ {"version":3,"file":"SelectContent.utils.js","names":[],"sources":["../../../../src/components/select/SelectContent/SelectContent.utils.ts"],"sourcesContent":["import {\n offset,\n flip,\n shift,\n size,\n hide,\n containingBlockOffset,\n type Middleware,\n type Placement,\n} from \"~/lib\";\nimport { getViewportBoundary } from \"~/lib/positioner/utils/dom\";\nimport type { SelectOptionValue } from \"../Select/Select.types\";\n\n/** 让浮层宽度和 trigger 对齐——不改坐标,只把 reference 宽度透传给上层当 style.width 用 */\nfunction matchReferenceWidth(): Middleware {\n return {\n name: \"matchWidth\",\n fn(state) {\n return { data: { width: state.rects.reference.width } };\n },\n };\n}\n\n/**\n * \"选中项对齐\":让已选中的那一项精确覆盖在 trigger 上方,这是原生 <select>/\n * shadcn Select 重新打开时的经典效果,和 offset+flip+shift 是完全不同的定位\n * 策略,所以单独写一个 middleware,而不是复用 shift/flip。\n *\n * 核心思路是把\"面板高度、面板位置、列表滚动量\"三者一起算,而不是先假设一个\n * 面板高度、算完位置再回头夹 scrollTop——后者试过两版都有遗留问题(面板和\n * trigger 之间留一截空隙、或者选中项因为 scrollTop 静默越界被推到面板边缘)。\n *\n * 具体算法:选中项\"理应\"贴着 trigger 垂直居中。以这个位置为基准,\n * 分别看\"上方\"和\"下方\"能展开多少:\n * - 上方能展开的量 = min(选中项上方还有多少内容, 视口上方还剩多少空间)\n * - 下方能展开的量 = min(选中项下方还有多少内容, 视口下方还剩多少空间)\n * 面板高度就是\"上方展开量 + 选中项自身高度 + 下方展开量\",面板顶部位置和\n * 滚动量都由这两个\"展开量\"直接算出来,不需要再额外夹取——因为:\n * - 展开量永远不会超过\"内容还剩多少\",所以 scrollTop 永远落在合法范围内;\n * - 展开量永远不会超过\"视口还剩多少空间\",所以面板永远不会超出视口;\n * - 选中项贴 trigger 是这个算法的出发点,天然成立,不需要单独判断\"要不要\n * 贴 trigger\"。\n * 对列表两端的项(第一项/最后一项)会自动退化成正确的行为:比如选中第一项,\n * \"上方还有多少内容\"是 0,上方展开量恒为 0,面板顶部直接落在选中项该在的\n * 位置,不会凭空往上多留空间。\n */\nfunction alignSelectedItem(\n getValue: () => SelectOptionValue | null | undefined,\n getScrollElement: () => HTMLElement | undefined,\n): Middleware {\n return {\n name: \"itemAlign\",\n fn(state) {\n const value = getValue();\n const scrollEl = getScrollElement();\n if (value == null || !scrollEl) return {};\n\n const itemEl = scrollEl.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(String(value))}\"]`,\n );\n if (!itemEl) return {};\n\n const { rects, strategy } = state;\n const boundary = getViewportBoundary(strategy, 8);\n\n const itemOffsetTop = itemEl.offsetTop;\n const itemHeight = itemEl.offsetHeight;\n const scrollHeight = scrollEl.scrollHeight;\n\n // 选中项理想情况下应该落在的位置:和 trigger 垂直居中对齐\n const idealItemTop =\n rects.reference.y + rects.reference.height / 2 - itemHeight / 2;\n\n const contentAbove = itemOffsetTop; // 选中项上方还有多少内容(px)\n const contentBelow = scrollHeight - itemOffsetTop - itemHeight; // 下方还有多少内容\n const spaceAbove = idealItemTop - boundary.y; // 从理想位置到视口顶部的可用空间\n const spaceBelow =\n boundary.y + boundary.height - (idealItemTop + itemHeight); // 到视口底部的可用空间\n\n const expandAbove = Math.max(0, Math.min(contentAbove, spaceAbove));\n const expandBelow = Math.max(0, Math.min(contentBelow, spaceBelow));\n\n const panelTop = idealItemTop - expandAbove;\n // panelHeight 最终会作为 CSS max-height 写到 scrollEl 上。scrollEl\n // 有 border(类名里带 border),而 Tailwind preflight 会把 box-sizing\n // 设为 border-box,此时 max-height 约束的是 border-box 高度;但\n // scrollHeight 只包含内容 + padding、不包含 border。直接拿\n // scrollHeight 当 max-height 会让 clientHeight 比 scrollHeight 少\n // 一个上下 border 的宽度,列表本来刚好能放下时也会多出 1~2px 的\n // overflow,从而被 overflow:auto 画出一条纵向滚动条。这里把 border\n // 宽度补回去,保证 border-box 的 max-height 能完整容纳所有内容。\n const scrollStyle = getComputedStyle(scrollEl);\n const borderTop = Number.parseFloat(scrollStyle.borderTopWidth) || 0;\n const borderBottom =\n Number.parseFloat(scrollStyle.borderBottomWidth) || 0;\n const panelHeight =\n expandAbove + itemHeight + expandBelow + borderTop + borderBottom;\n const scrollTop = contentAbove - expandAbove;\n\n // scrollTop 是纯 DOM 副作用,不影响坐标计算本身,这里直接设置是安全的。\n scrollEl.scrollTop = scrollTop;\n\n return {\n x: rects.reference.x,\n y: panelTop,\n data: { aligned: true, panelHeight },\n };\n },\n };\n}\n\nexport interface BuildSelectMiddlewareOptions {\n /** 当前是否已经有选中值——决定走\"选中项对齐\"还是普通的贴边下拉 */\n hasValue: boolean;\n selectedValue: () => SelectOptionValue | null | undefined;\n /** 真正会滚动、承载选项列表的那个元素(内层),不是外层的定位容器 */\n scrollElement: () => HTMLElement | undefined;\n placement: Placement;\n collisionPadding: number;\n onAvailableHeightChange: (availableHeight: number) => void;\n}\n\n/**\n * Select 面板的定位管线,按\"有没有选中值\"分两套配方:\n *\n * - **有选中值**:matchWidth → size(算可用高度,配合 overflow:auto 做滚动——\n * 和 Tooltip 不同,下拉列表内容天然可能很长,滚动是合理需求,不是过度设计)\n * → itemAlign(核心:选中项盖在 trigger 上)→ shift(只处理横向,纵向已经被\n * itemAlign 自己夹过了)→ containingBlockOffset。\n * - **没有选中值**(占位符状态):offset → flip → shift → matchWidth → size\n * → containingBlockOffset,这是标准的\"贴边下拉\"策略,和 Dropdown 用的是\n * 同一套思路。\n *\n * 顺序不能随便换:size 必须在 shift/itemAlign 之后(要用最终坐标反推可用高度),\n * containingBlockOffset 必须在所有其他 middleware 之后。\n *\n * SelectContent.tsx 里把面板拆成了两层:外层(position:fixed,负责 translate(x,y)\n * 定位)和内层(真正的样式、overflow:auto 滚动、data-state 驱动的进出场动画)。\n * 这不是为了美观随手拆的——同一个元素如果既承担定位用的 transform:translate(),\n * 又承担 zoom-in-95 这类靠 transform:scale() 做的动画,CSS 的 transform 一个\n * 元素只能有一份,动画播放期间会完全接管这个属性,把定位用的 translate(x,y)\n * 整个顶掉,表现为\"入场从视口左上角飞入、退场飞向左上角消失\"这种明显错误的\n * 观感(这正是这个组件早期实现踩过的一个真实 bug)。scrollElement 传的是\n * 内层(真正会滚动的那个),不是 state.elements.floating(外层,它自己不滚动)。\n */\nexport function createSelectMiddleware(\n options: BuildSelectMiddlewareOptions,\n): Middleware[] {\n if (options.hasValue) {\n return [\n matchReferenceWidth(),\n // 注意这里没有 size 中间件:alignSelectedItem 自己已经把面板高度、\n // 位置、滚动量一起算好了(见它的注释),面板高度是通过\n // middlewareData.itemAlign.panelHeight 传出去的,不需要 size 再用\n // \"只看视口空间、不看内容长度\"那套算法独立算一遍——两边算出来的值\n // 一旦不一致,CSS max-height 和定位计算假设的面板高度就会对不上,\n // 重新引入\"选中项没对齐\"这类问题(这正是这次要修的 bug 的根源)。\n alignSelectedItem(options.selectedValue, options.scrollElement),\n shift({\n padding: options.collisionPadding,\n mainAxis: false,\n crossAxis: true,\n }),\n hide(),\n containingBlockOffset(),\n ];\n }\n\n return [\n offset(4),\n flip(),\n shift({ padding: options.collisionPadding }),\n matchReferenceWidth(),\n size({\n padding: options.collisionPadding,\n apply({ availableHeight }) {\n options.onAvailableHeightChange(availableHeight);\n },\n }),\n hide(),\n containingBlockOffset(),\n ];\n}\n"],"mappings":";;;;;;;;AAcA,SAAS,IAAkC;CACzC,OAAO;EACL,MAAM;EACN,GAAG,GAAO;GACR,OAAO,EAAE,MAAM,EAAE,OAAO,EAAM,MAAM,UAAU,MAAM,EAAE;EACxD;CACF;AACF;AAyBA,SAAS,EACP,GACA,GACY;CACZ,OAAO;EACL,MAAM;EACN,GAAG,GAAO;GACR,IAAM,IAAQ,EAAS,GACjB,IAAW,EAAiB;GAClC,IAAI,KAAS,QAAQ,CAAC,GAAU,OAAO,CAAC;GAExC,IAAM,IAAS,EAAS,cACtB,gBAAgB,IAAI,OAAO,OAAO,CAAK,CAAC,EAAE,GAC5C;GACA,IAAI,CAAC,GAAQ,OAAO,CAAC;GAErB,IAAM,EAAE,UAAO,gBAAa,GACtB,IAAW,EAAoB,GAAU,CAAC,GAE1C,IAAgB,EAAO,WACvB,IAAa,EAAO,cACpB,IAAe,EAAS,cAGxB,IACJ,EAAM,UAAU,IAAI,EAAM,UAAU,SAAS,IAAI,IAAa,GAE1D,IAAe,GACf,IAAe,IAAe,IAAgB,GAC9C,IAAa,IAAe,EAAS,GACrC,IACJ,EAAS,IAAI,EAAS,UAAU,IAAe,IAE3C,IAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAc,CAAU,CAAC,GAC5D,IAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAc,CAAU,CAAC,GAE5D,IAAW,IAAe,GAS1B,IAAc,iBAAiB,CAAQ,GACvC,IAAY,OAAO,WAAW,EAAY,cAAc,KAAK,GAC7D,IACJ,OAAO,WAAW,EAAY,iBAAiB,KAAK,GAChD,IACJ,IAAc,IAAa,IAAc,IAAY;GAMvD,OAFA,EAAS,YAHS,IAAe,GAK1B;IACL,GAAG,EAAM,UAAU;IACnB,GAAG;IACH,MAAM;KAAE,SAAS;KAAM;IAAY;GACrC;EACF;CACF;AACF;AAoCA,SAAgB,EACd,GACc;CAqBd,OApBI,EAAQ,WACH;EACL,EAAoB;EAOpB,EAAkB,EAAQ,eAAe,EAAQ,aAAa;EAC9D,EAAM;GACJ,SAAS,EAAQ;GACjB,UAAU;GACV,WAAW;EACb,CAAC;EACD,EAAK;EACL,EAAsB;CACxB,IAGK;EACL,EAAO,CAAC;EACR,EAAK;EACL,EAAM,EAAE,SAAS,EAAQ,iBAAiB,CAAC;EAC3C,EAAoB;EACpB,EAAK;GACH,SAAS,EAAQ;GACjB,MAAM,EAAE,sBAAmB;IACzB,EAAQ,wBAAwB,CAAe;GACjD;EACF,CAAC;EACD,EAAK;EACL,EAAsB;CACxB;AACF"}
@@ -4,7 +4,7 @@ import { createSelectMiddleware as n } from "./SelectContent.utils.js";
4
4
  import { createEffect as r, createMemo as i, createSignal as a, onCleanup as o } from "solid-js";
5
5
  //#region src/components/select/SelectContent/useSelectContent.ts
6
6
  function s(s) {
7
- let c = e("SelectContent"), [l, u] = a(), [d, f] = a(), p = i(() => c.value() !== void 0), m = t(c.reference, c.floating, {
7
+ let c = e("SelectContent"), [l, u] = a(), [d, f] = a(), p = i(() => c.value() != null), m = t(c.reference, c.floating, {
8
8
  placement: () => s().placement ?? "bottom-start",
9
9
  strategy: "fixed",
10
10
  middleware: () => n({
@@ -23,7 +23,11 @@ function s(s) {
23
23
  return e === void 0 ? void 0 : Math.max(e, 120);
24
24
  }
25
25
  return d();
26
- }), g = i(() => c.open() && !m.middlewareData().hide?.referenceHidden), [_, v] = a("closed");
26
+ }), g = i(() => c.open() && !m.middlewareData().hide?.referenceHidden);
27
+ r(() => {
28
+ c.open() && m.update();
29
+ });
30
+ let [_, v] = a("closed");
27
31
  return r(() => {
28
32
  if (g()) {
29
33
  let e = requestAnimationFrame(() => v("open"));
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectContent.js","names":[],"sources":["../../../../src/components/select/SelectContent/useSelectContent.ts"],"sourcesContent":["import { createSignal, createMemo, createEffect, onCleanup } from \"solid-js\";\nimport { createPositioner, type Positioner } from \"~/lib\";\nimport { useSelectContext } from \"../Select/Select.context\";\nimport { createSelectMiddleware } from \"./SelectContent.utils\";\nimport type { SelectContentProps } from \"./SelectContent.types\";\n\nexport interface UseSelectContentResult {\n ctx: ReturnType<typeof useSelectContext>;\n pos: Positioner;\n /**\n * 面板应该用的最大高度:有选中值时,直接读 alignSelectedItem 自己算好的\n * panelHeight(不经过 size 中间件);没有选中值(占位符状态、走贴边下拉)\n * 时,用 size 中间件算出来的可用空间。两种场景用的是不同的高度来源,\n * 统一在这里合并成一个对外的值,展示层不需要关心具体走的是哪一个。\n */\n maxHeight: () => number | undefined;\n /** 综合了 open 状态 + hide 中间件的 referenceHidden 判断 */\n isVisible: () => boolean;\n /**\n * 兼容字段:SelectContent 现在关闭时不再卸载 Portal(为了保住 ctx.items 的\n * 注册信息),因此 mounted 已不再被展示层用来控制 <Show>。该值目前等价于\n * isVisible,保留只是为了不破坏已导出的 useSelectContent 返回类型。\n */\n mounted: () => boolean;\n /** 驱动 data-state 的状态,打开时比 isVisible 晚一帧,给\"选中项对齐\"这类\n * 需要先读到子元素(选项)才能算准位置的定位策略留出时间。 */\n animationState: () => \"open\" | \"closed\";\n contentElement: () => HTMLElement | undefined;\n setContentElement: (el: HTMLElement) => void;\n}\n\nexport function useSelectContent(\n props: () => SelectContentProps,\n): UseSelectContentResult {\n const ctx = useSelectContext(\"SelectContent\");\n const [contentElement, setContentElement] = createSignal<HTMLElement>();\n const [fallbackMaxHeight, setFallbackMaxHeight] = createSignal<number>();\n\n const hasValue = createMemo(() => ctx.value() !== undefined);\n\n const pos = createPositioner(ctx.reference, ctx.floating, {\n placement: () => props().placement ?? \"bottom-start\",\n strategy: \"fixed\",\n middleware: () =>\n createSelectMiddleware({\n hasValue: hasValue(),\n selectedValue: ctx.value,\n scrollElement: contentElement,\n placement: props().placement ?? \"bottom-start\",\n collisionPadding: props().collisionPadding ?? 8,\n onAvailableHeightChange: (availableHeight) => {\n setFallbackMaxHeight(Math.max(availableHeight, 120));\n },\n }),\n });\n\n const maxHeight = createMemo(() => {\n if (hasValue()) {\n const panelHeight = pos.middlewareData().itemAlign?.panelHeight as\n | number\n | undefined;\n return panelHeight !== undefined ? Math.max(panelHeight, 120) : undefined;\n }\n return fallbackMaxHeight();\n });\n\n const isVisible = createMemo(\n () => ctx.open() && !pos.middlewareData().hide?.referenceHidden,\n );\n\n // --- 打开时延迟一帧再触发动画 class ---\n // \"选中项对齐\"策略要读子元素(SelectItem 渲染出来的 <li data-value>)才能\n // 算出正确的位置,如果动画在这次定位算完之前就开始播放,面板会在动画播到\n // 一半时才\"跳\"到正确位置——等一帧,给这次定位计算留出时间(细节和\n // production-tooltip 里箭头位置的处理是同一个道理)。\n const [animationState, setAnimationState] = createSignal<\"open\" | \"closed\">(\n \"closed\",\n );\n\n createEffect(() => {\n if (isVisible()) {\n const raf = requestAnimationFrame(() => setAnimationState(\"open\"));\n onCleanup(() => cancelAnimationFrame(raf));\n } else {\n setAnimationState(\"closed\");\n }\n });\n\n // SelectContent 关闭时不再卸载子节点(否则 ctx.items 会被清空,SelectValue\n // 读不到 label),因此 mounted 已经没有\"延迟卸载/立即卸载\"的语义,直接跟\n // isVisible 保持一致即可。保留该字段只是为了兼容已导出的 useSelectContent\n // 返回类型;新的展示层逻辑一律使用 isVisible。\n const mounted = isVisible;\n\n return {\n ctx,\n pos,\n maxHeight,\n isVisible,\n mounted,\n animationState,\n contentElement,\n setContentElement,\n };\n}\n"],"mappings":";;;;;AA+BA,SAAgB,EACd,GACwB;CACxB,IAAM,IAAM,EAAiB,eAAe,GACtC,CAAC,GAAgB,KAAqB,EAA0B,GAChE,CAAC,GAAmB,KAAwB,EAAqB,GAEjE,IAAW,QAAiB,EAAI,MAAM,MAAM,KAAA,CAAS,GAErD,IAAM,EAAiB,EAAI,WAAW,EAAI,UAAU;EACxD,iBAAiB,EAAM,CAAC,CAAC,aAAa;EACtC,UAAU;EACV,kBACE,EAAuB;GACrB,UAAU,EAAS;GACnB,eAAe,EAAI;GACnB,eAAe;GACf,WAAW,EAAM,CAAC,CAAC,aAAa;GAChC,kBAAkB,EAAM,CAAC,CAAC,oBAAoB;GAC9C,0BAA0B,MAAoB;IAC5C,EAAqB,KAAK,IAAI,GAAiB,GAAG,CAAC;GACrD;EACF,CAAC;CACL,CAAC,GAEK,IAAY,QAAiB;EACjC,IAAI,EAAS,GAAG;GACd,IAAM,IAAc,EAAI,eAAe,CAAC,CAAC,WAAW;GAGpD,OAAO,MAAgB,KAAA,IAAyC,KAAA,IAA7B,KAAK,IAAI,GAAa,GAAG;EAC9D;EACA,OAAO,EAAkB;CAC3B,CAAC,GAEK,IAAY,QACV,EAAI,KAAK,KAAK,CAAC,EAAI,eAAe,CAAC,CAAC,MAAM,eAClD,GAOM,CAAC,GAAgB,KAAqB,EAC1C,QACF;CAiBA,OAfA,QAAmB;EACjB,IAAI,EAAU,GAAG;GACf,IAAM,IAAM,4BAA4B,EAAkB,MAAM,CAAC;GACjE,QAAgB,qBAAqB,CAAG,CAAC;EAC3C,OACE,EAAkB,QAAQ;CAE9B,CAAC,GAQM;EACL;EACA;EACA;EACA;EACA,SAAA;EACA;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"useSelectContent.js","names":[],"sources":["../../../../src/components/select/SelectContent/useSelectContent.ts"],"sourcesContent":["import { createSignal, createMemo, createEffect, onCleanup } from \"solid-js\";\nimport { createPositioner, type Positioner } from \"~/lib\";\nimport { useSelectContext } from \"../Select/Select.context\";\nimport { createSelectMiddleware } from \"./SelectContent.utils\";\nimport type { SelectContentProps } from \"./SelectContent.types\";\n\nexport interface UseSelectContentResult {\n ctx: ReturnType<typeof useSelectContext>;\n pos: Positioner;\n /**\n * 面板应该用的最大高度:有选中值时,直接读 alignSelectedItem 自己算好的\n * panelHeight(不经过 size 中间件);没有选中值(占位符状态、走贴边下拉)\n * 时,用 size 中间件算出来的可用空间。两种场景用的是不同的高度来源,\n * 统一在这里合并成一个对外的值,展示层不需要关心具体走的是哪一个。\n */\n maxHeight: () => number | undefined;\n /** 综合了 open 状态 + hide 中间件的 referenceHidden 判断 */\n isVisible: () => boolean;\n /**\n * 兼容字段:SelectContent 现在关闭时不再卸载 Portal(为了保住 ctx.items 的\n * 注册信息),因此 mounted 已不再被展示层用来控制 <Show>。该值目前等价于\n * isVisible,保留只是为了不破坏已导出的 useSelectContent 返回类型。\n */\n mounted: () => boolean;\n /** 驱动 data-state 的状态,打开时比 isVisible 晚一帧,给\"选中项对齐\"这类\n * 需要先读到子元素(选项)才能算准位置的定位策略留出时间。 */\n animationState: () => \"open\" | \"closed\";\n contentElement: () => HTMLElement | undefined;\n setContentElement: (el: HTMLElement) => void;\n}\n\nexport function useSelectContent(\n props: () => SelectContentProps,\n): UseSelectContentResult {\n const ctx = useSelectContext(\"SelectContent\");\n const [contentElement, setContentElement] = createSignal<HTMLElement>();\n const [fallbackMaxHeight, setFallbackMaxHeight] = createSignal<number>();\n\n const hasValue = createMemo(() => ctx.value() != null);\n\n const pos = createPositioner(ctx.reference, ctx.floating, {\n placement: () => props().placement ?? \"bottom-start\",\n strategy: \"fixed\",\n middleware: () =>\n createSelectMiddleware({\n hasValue: hasValue(),\n selectedValue: ctx.value,\n scrollElement: contentElement,\n placement: props().placement ?? \"bottom-start\",\n collisionPadding: props().collisionPadding ?? 8,\n onAvailableHeightChange: (availableHeight) => {\n setFallbackMaxHeight(Math.max(availableHeight, 120));\n },\n }),\n });\n\n const maxHeight = createMemo(() => {\n if (hasValue()) {\n const panelHeight = pos.middlewareData().itemAlign?.panelHeight as\n | number\n | undefined;\n return panelHeight !== undefined ? Math.max(panelHeight, 120) : undefined;\n }\n return fallbackMaxHeight();\n });\n\n const isVisible = createMemo(\n () => ctx.open() && !pos.middlewareData().hide?.referenceHidden,\n );\n\n // SelectContent 关闭时也不会卸载(为了保住 ctx.items 的注册信息),因此\n // createPositioner 不会像 Tooltip/Popover 那样在每次打开时重新创建并自动\n // 算一次位置。这里在每次打开时显式重新计算一次,修复“触发器第一次打开后\n // 因外部布局变化移动了位置,第二次打开时面板还停留在旧坐标”的问题。\n createEffect(() => {\n if (ctx.open()) {\n pos.update();\n }\n });\n\n // --- 打开时延迟一帧再触发动画 class ---\n // \"选中项对齐\"策略要读子元素(SelectItem 渲染出来的 <li data-value>)才能\n // 算出正确的位置,如果动画在这次定位算完之前就开始播放,面板会在动画播到\n // 一半时才\"跳\"到正确位置——等一帧,给这次定位计算留出时间(细节和\n // production-tooltip 里箭头位置的处理是同一个道理)。\n const [animationState, setAnimationState] = createSignal<\"open\" | \"closed\">(\n \"closed\",\n );\n\n createEffect(() => {\n if (isVisible()) {\n const raf = requestAnimationFrame(() => setAnimationState(\"open\"));\n onCleanup(() => cancelAnimationFrame(raf));\n } else {\n setAnimationState(\"closed\");\n }\n });\n\n // SelectContent 关闭时不再卸载子节点(否则 ctx.items 会被清空,SelectValue\n // 读不到 label),因此 mounted 已经没有\"延迟卸载/立即卸载\"的语义,直接跟\n // isVisible 保持一致即可。保留该字段只是为了兼容已导出的 useSelectContent\n // 返回类型;新的展示层逻辑一律使用 isVisible。\n const mounted = isVisible;\n\n return {\n ctx,\n pos,\n maxHeight,\n isVisible,\n mounted,\n animationState,\n contentElement,\n setContentElement,\n };\n}\n"],"mappings":";;;;;AA+BA,SAAgB,EACd,GACwB;CACxB,IAAM,IAAM,EAAiB,eAAe,GACtC,CAAC,GAAgB,KAAqB,EAA0B,GAChE,CAAC,GAAmB,KAAwB,EAAqB,GAEjE,IAAW,QAAiB,EAAI,MAAM,KAAK,IAAI,GAE/C,IAAM,EAAiB,EAAI,WAAW,EAAI,UAAU;EACxD,iBAAiB,EAAM,CAAC,CAAC,aAAa;EACtC,UAAU;EACV,kBACE,EAAuB;GACrB,UAAU,EAAS;GACnB,eAAe,EAAI;GACnB,eAAe;GACf,WAAW,EAAM,CAAC,CAAC,aAAa;GAChC,kBAAkB,EAAM,CAAC,CAAC,oBAAoB;GAC9C,0BAA0B,MAAoB;IAC5C,EAAqB,KAAK,IAAI,GAAiB,GAAG,CAAC;GACrD;EACF,CAAC;CACL,CAAC,GAEK,IAAY,QAAiB;EACjC,IAAI,EAAS,GAAG;GACd,IAAM,IAAc,EAAI,eAAe,CAAC,CAAC,WAAW;GAGpD,OAAO,MAAgB,KAAA,IAAyC,KAAA,IAA7B,KAAK,IAAI,GAAa,GAAG;EAC9D;EACA,OAAO,EAAkB;CAC3B,CAAC,GAEK,IAAY,QACV,EAAI,KAAK,KAAK,CAAC,EAAI,eAAe,CAAC,CAAC,MAAM,eAClD;CAMA,QAAmB;EACjB,AAAI,EAAI,KAAK,KACX,EAAI,OAAO;CAEf,CAAC;CAOD,IAAM,CAAC,GAAgB,KAAqB,EAC1C,QACF;CAiBA,OAfA,QAAmB;EACjB,IAAI,EAAU,GAAG;GACf,IAAM,IAAM,4BAA4B,EAAkB,MAAM,CAAC;GACjE,QAAgB,qBAAqB,CAAG,CAAC;EAC3C,OACE,EAAkB,QAAQ;CAE9B,CAAC,GAQM;EACL;EACA;EACA;EACA;EACA,SAAA;EACA;EACA;EACA;CACF;AACF"}
@@ -25,7 +25,7 @@ function p(o) {
25
25
  return p() ? 0 : -1;
26
26
  },
27
27
  get "data-value"() {
28
- return _.value;
28
+ return String(_.value);
29
29
  },
30
30
  get "aria-selected"() {
31
31
  return p();
@@ -1 +1 @@
1
- {"version":3,"file":"SelectItem.js","names":["Show","splitProps","onCleanup","useSelectItem","SelectItemProps","clsx","Check","SelectItem","props","isSelected","isActive","select","onMouseEnter","local","rest","attachListeners","el","HTMLDivElement","handleClick","handleMouseEnter","addEventListener","removeEventListener","_el$","_tmpl$","_el$2","firstChild","_$use","_$spread","_$mergeProps","tabIndex","data-value","value","aria-selected","aria-disabled","disabled","class","_$insert","children","label","_$createComponent","when","size"],"sources":["../../../../src/components/select/SelectItem/SelectItem.tsx"],"sourcesContent":["import { Show, splitProps, onCleanup } from \"solid-js\";\nimport { useSelectItem } from \"./useSelectItem\";\nimport type { SelectItemProps } from \"./SelectItem.types\";\nimport { clsx } from \"~/utils\";\nimport { Check } from \"lucide-solid\";\n\nexport function SelectItem(props: SelectItemProps) {\n const { isSelected, isActive, select, onMouseEnter } = useSelectItem(\n () => props,\n );\n\n const [local, rest] = splitProps(props, [\n \"value\",\n \"label\",\n \"disabled\",\n \"class\",\n \"children\",\n ]);\n\n // click/mouseenter 走 addEventListener(不是 JSX onClick),和 SelectTrigger\n // 是同一套约定,不占用 onXxx prop 名,调用方自己传的 onClick 不会被覆盖。\n const attachListeners = (el: HTMLDivElement) => {\n const handleClick = () => select();\n const handleMouseEnter = () => onMouseEnter();\n el.addEventListener(\"click\", handleClick);\n el.addEventListener(\"mouseenter\", handleMouseEnter);\n onCleanup(() => {\n el.removeEventListener(\"click\", handleClick);\n el.removeEventListener(\"mouseenter\", handleMouseEnter);\n });\n };\n\n return (\n <div\n ref={attachListeners}\n role=\"option\"\n tabIndex={isSelected() ? 0 : -1}\n data-value={local.value}\n aria-selected={isSelected()}\n aria-disabled={local.disabled}\n class={clsx(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-2 pr-6 text-sm outline-none\",\n isActive() && \"bg-neutral-100 dark:bg-neutral-800\",\n local.disabled && \"pointer-events-none opacity-50\",\n local.class,\n )}\n {...rest}\n >\n {local.children ?? local.label ?? local.value}\n <span class=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <Show when={isSelected()}>\n <Check size={14} />\n </Show>\n </span>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAMA,SAAgBO,EAAWC,GAAwB;CACjD,IAAM,EAAEC,eAAYC,aAAUC,WAAQC,oBAAiBT,QAC/CK,CACR,GAEM,CAACK,GAAOC,KAAQb,EAAWO,GAAO;EACtC;EACA;EACA;EACA;EACA;CAAU,CACX,GAIKO,KAAmBC,MAAuB;EAC9C,IAAME,UAAoBP,EAAO,GAC3BQ,UAAyBP,EAAa;EAG5CV,AAFAc,EAAGI,iBAAiB,SAASF,CAAW,GACxCF,EAAGI,iBAAiB,cAAcD,CAAgB,GAClDjB,QAAgB;GAEdc,AADAA,EAAGK,oBAAoB,SAASH,CAAW,GAC3CF,EAAGK,oBAAoB,cAAcF,CAAgB;EACvD,CAAC;CACH;CAEA,cAAA;EAAA,IAAAG,IAAAC,EAAA,GAAAC,IAAAF,EAAAG;EAmBuB,OAnBvBC,EAESX,GAAeO,CAAA,GAAAK,EAAAL,GAAAM,EAAA;GAAA,IAEpBC,WAAQ;IAAA,OAAEpB,EAAW,IAAI,IAAI;GAAE;GAAA,IAAA,eAAA;IAAA,OACnBI,EAAMkB;GAAK;GAAA,IAAA,kBAAA;IAAA,OACRtB,EAAW;GAAC;GAAA,IAAA,kBAAA;IAAA,OACZI,EAAMqB;GAAQ;GAAA,IAAA,QAAA;IAAA,OACtB7B,EACL,0GACAK,EAAS,KAAK,sCACdG,EAAMqB,YAAY,kCAClBrB,EAAMsB,KACR;GAAC;EAAA,GACGrB,CAAI,GAAA,IAAA,EAAA,GAAAsB,EAAAd,SAEPT,EAAMwB,YAAYxB,EAAMyB,SAASzB,EAAMkB,OAAKP,CAAA,GAAAY,EAAAZ,GAAAe,EAE1CvC,GAAI;GAAA,IAACwC,OAAI;IAAA,OAAE/B,EAAW;GAAC;GAAA,IAAA4B,WAAA;IAAA,OAAAE,EACrBjC,GAAK,EAACmC,MAAM,GAAE,CAAA;GAAA;EAAA,CAAA,CAAA,GAAAnB;CAAA,EAAA,CAAA;AAKzB"}
1
+ {"version":3,"file":"SelectItem.js","names":["Show","splitProps","onCleanup","useSelectItem","SelectItemProps","clsx","Check","SelectItem","props","isSelected","isActive","select","onMouseEnter","local","rest","attachListeners","el","HTMLDivElement","handleClick","handleMouseEnter","addEventListener","removeEventListener","_el$","_tmpl$","_el$2","firstChild","_$use","_$spread","_$mergeProps","tabIndex","data-value","String","value","aria-selected","aria-disabled","disabled","class","_$insert","children","label","_$createComponent","when","size"],"sources":["../../../../src/components/select/SelectItem/SelectItem.tsx"],"sourcesContent":["import { Show, splitProps, onCleanup } from \"solid-js\";\nimport { useSelectItem } from \"./useSelectItem\";\nimport type { SelectItemProps } from \"./SelectItem.types\";\nimport { clsx } from \"~/utils\";\nimport { Check } from \"lucide-solid\";\n\nexport function SelectItem(props: SelectItemProps) {\n const { isSelected, isActive, select, onMouseEnter } = useSelectItem(\n () => props,\n );\n\n const [local, rest] = splitProps(props, [\n \"value\",\n \"label\",\n \"disabled\",\n \"class\",\n \"children\",\n ]);\n\n // click/mouseenter 走 addEventListener(不是 JSX onClick),和 SelectTrigger\n // 是同一套约定,不占用 onXxx prop 名,调用方自己传的 onClick 不会被覆盖。\n const attachListeners = (el: HTMLDivElement) => {\n const handleClick = () => select();\n const handleMouseEnter = () => onMouseEnter();\n el.addEventListener(\"click\", handleClick);\n el.addEventListener(\"mouseenter\", handleMouseEnter);\n onCleanup(() => {\n el.removeEventListener(\"click\", handleClick);\n el.removeEventListener(\"mouseenter\", handleMouseEnter);\n });\n };\n\n return (\n <div\n ref={attachListeners}\n role=\"option\"\n tabIndex={isSelected() ? 0 : -1}\n data-value={String(local.value)}\n aria-selected={isSelected()}\n aria-disabled={local.disabled}\n class={clsx(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-2 pr-6 text-sm outline-none\",\n isActive() && \"bg-neutral-100 dark:bg-neutral-800\",\n local.disabled && \"pointer-events-none opacity-50\",\n local.class,\n )}\n {...rest}\n >\n {local.children ?? local.label ?? local.value}\n <span class=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <Show when={isSelected()}>\n <Check size={14} />\n </Show>\n </span>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAMA,SAAgBO,EAAWC,GAAwB;CACjD,IAAM,EAAEC,eAAYC,aAAUC,WAAQC,oBAAiBT,QAC/CK,CACR,GAEM,CAACK,GAAOC,KAAQb,EAAWO,GAAO;EACtC;EACA;EACA;EACA;EACA;CAAU,CACX,GAIKO,KAAmBC,MAAuB;EAC9C,IAAME,UAAoBP,EAAO,GAC3BQ,UAAyBP,EAAa;EAG5CV,AAFAc,EAAGI,iBAAiB,SAASF,CAAW,GACxCF,EAAGI,iBAAiB,cAAcD,CAAgB,GAClDjB,QAAgB;GAEdc,AADAA,EAAGK,oBAAoB,SAASH,CAAW,GAC3CF,EAAGK,oBAAoB,cAAcF,CAAgB;EACvD,CAAC;CACH;CAEA,cAAA;EAAA,IAAAG,IAAAC,EAAA,GAAAC,IAAAF,EAAAG;EAmBuB,OAnBvBC,EAESX,GAAeO,CAAA,GAAAK,EAAAL,GAAAM,EAAA;GAAA,IAEpBC,WAAQ;IAAA,OAAEpB,EAAW,IAAI,IAAI;GAAE;GAAA,IAAA,eAAA;IAAA,OACnBsB,OAAOlB,EAAMmB,KAAK;GAAC;GAAA,IAAA,kBAAA;IAAA,OAChBvB,EAAW;GAAC;GAAA,IAAA,kBAAA;IAAA,OACZI,EAAMsB;GAAQ;GAAA,IAAA,QAAA;IAAA,OACtB9B,EACL,0GACAK,EAAS,KAAK,sCACdG,EAAMsB,YAAY,kCAClBtB,EAAMuB,KACR;GAAC;EAAA,GACGtB,CAAI,GAAA,IAAA,EAAA,GAAAuB,EAAAf,SAEPT,EAAMyB,YAAYzB,EAAM0B,SAAS1B,EAAMmB,OAAKR,CAAA,GAAAa,EAAAb,GAAAgB,EAE1CxC,GAAI;GAAA,IAACyC,OAAI;IAAA,OAAEhC,EAAW;GAAC;GAAA,IAAA6B,WAAA;IAAA,OAAAE,EACrBlC,GAAK,EAACoC,MAAM,GAAE,CAAA;GAAA;EAAA,CAAA,CAAA,GAAApB;CAAA,EAAA,CAAA;AAKzB"}
@@ -1,6 +1,7 @@
1
1
  import { ParentProps } from 'solid-js';
2
- export interface SelectItemProps extends ParentProps {
3
- value: string;
2
+ import { SelectOptionValue } from '../Select/Select.types';
3
+ export interface SelectItemProps<T extends SelectOptionValue = SelectOptionValue> extends ParentProps {
4
+ value: T;
4
5
  /** 不传的话,会尝试用 children 是字符串时的内容当 label,否则用 value 本身 */
5
6
  label?: string;
6
7
  disabled?: boolean;
@@ -1,5 +1,6 @@
1
1
  import { useSelectContext } from '../Select/Select.context';
2
2
  import { SelectItemProps } from './SelectItem.types';
3
+ import { SelectOptionValue } from '../Select/Select.types';
3
4
  export interface UseSelectItemResult {
4
5
  ctx: ReturnType<typeof useSelectContext>;
5
6
  label: () => string;
@@ -8,4 +9,4 @@ export interface UseSelectItemResult {
8
9
  select: () => void;
9
10
  onMouseEnter: () => void;
10
11
  }
11
- export declare function useSelectItem(props: () => SelectItemProps): UseSelectItemResult;
12
+ export declare function useSelectItem<T extends SelectOptionValue = SelectOptionValue>(props: () => SelectItemProps<T>): UseSelectItemResult;
@@ -4,7 +4,7 @@ import { createMemo as t, onCleanup as n, onMount as r } from "solid-js";
4
4
  function i(i) {
5
5
  let a = e("SelectItem"), o = () => {
6
6
  let e = i();
7
- return e.label ? e.label : typeof e.children == "string" ? e.children : e.value;
7
+ return e.label ? e.label : typeof e.children == "string" ? e.children : String(e.value);
8
8
  };
9
9
  return r(() => {
10
10
  let e = i(), t = a.registerItem({
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectItem.js","names":[],"sources":["../../../../src/components/select/SelectItem/useSelectItem.ts"],"sourcesContent":["import { onMount, onCleanup, createMemo } from \"solid-js\";\nimport { useSelectContext } from \"../Select/Select.context\";\nimport type { SelectItemProps } from \"./SelectItem.types\";\n\nexport interface UseSelectItemResult {\n ctx: ReturnType<typeof useSelectContext>;\n label: () => string;\n isSelected: () => boolean;\n isActive: () => boolean;\n select: () => void;\n onMouseEnter: () => void;\n}\n\nexport function useSelectItem(\n props: () => SelectItemProps,\n): UseSelectItemResult {\n const ctx = useSelectContext(\"SelectItem\");\n\n const label = () => {\n const p = props();\n if (p.label) return p.label;\n return typeof p.children === \"string\" ? p.children : p.value;\n };\n\n onMount(() => {\n const p = props();\n const unregister = ctx.registerItem({\n value: p.value,\n label: label(),\n disabled: p.disabled,\n });\n onCleanup(unregister);\n });\n\n const isSelected = createMemo(() => ctx.value() === props().value);\n const isActive = createMemo(() => ctx.activeValue() === props().value);\n\n const select = () => {\n if (props().disabled) return;\n ctx.selectValue(props().value);\n };\n\n const onMouseEnter = () => {\n if (!props().disabled) ctx.setActiveValue(props().value);\n };\n\n return { ctx, label, isSelected, isActive, select, onMouseEnter };\n}\n"],"mappings":";;;AAaA,SAAgB,EACd,GACqB;CACrB,IAAM,IAAM,EAAiB,YAAY,GAEnC,UAAc;EAClB,IAAM,IAAI,EAAM;EAEhB,OADI,EAAE,QAAc,EAAE,QACf,OAAO,EAAE,YAAa,WAAW,EAAE,WAAW,EAAE;CACzD;CAwBA,OAtBA,QAAc;EACZ,IAAM,IAAI,EAAM,GACV,IAAa,EAAI,aAAa;GAClC,OAAO,EAAE;GACT,OAAO,EAAM;GACb,UAAU,EAAE;EACd,CAAC;EACD,EAAU,CAAU;CACtB,CAAC,GAcM;EAAE;EAAK;EAAO,YAZF,QAAiB,EAAI,MAAM,MAAM,EAAM,CAAC,CAAC,KAYvC;EAAY,UAXhB,QAAiB,EAAI,YAAY,MAAM,EAAM,CAAC,CAAC,KAW/B;EAAU,cATtB;GACf,EAAM,CAAC,CAAC,YACZ,EAAI,YAAY,EAAM,CAAC,CAAC,KAAK;EAC/B;EAMmD,oBAJxB;GACzB,AAAK,EAAM,CAAC,CAAC,YAAU,EAAI,eAAe,EAAM,CAAC,CAAC,KAAK;EACzD;CAEgE;AAClE"}
1
+ {"version":3,"file":"useSelectItem.js","names":[],"sources":["../../../../src/components/select/SelectItem/useSelectItem.ts"],"sourcesContent":["import { onMount, onCleanup, createMemo } from \"solid-js\";\nimport { useSelectContext } from \"../Select/Select.context\";\nimport type { SelectItemProps } from \"./SelectItem.types\";\nimport type { SelectOptionValue } from \"../Select/Select.types\";\n\nexport interface UseSelectItemResult {\n ctx: ReturnType<typeof useSelectContext>;\n label: () => string;\n isSelected: () => boolean;\n isActive: () => boolean;\n select: () => void;\n onMouseEnter: () => void;\n}\n\nexport function useSelectItem<T extends SelectOptionValue = SelectOptionValue>(\n props: () => SelectItemProps<T>,\n): UseSelectItemResult {\n const ctx = useSelectContext(\"SelectItem\");\n\n const label = () => {\n const p = props();\n if (p.label) return p.label;\n return typeof p.children === \"string\" ? p.children : String(p.value);\n };\n\n onMount(() => {\n const p = props();\n const unregister = ctx.registerItem({\n value: p.value,\n label: label(),\n disabled: p.disabled,\n });\n onCleanup(unregister);\n });\n\n const isSelected = createMemo(() => ctx.value() === props().value);\n const isActive = createMemo(() => ctx.activeValue() === props().value);\n\n const select = () => {\n if (props().disabled) return;\n ctx.selectValue(props().value);\n };\n\n const onMouseEnter = () => {\n if (!props().disabled) ctx.setActiveValue(props().value);\n };\n\n return { ctx, label, isSelected, isActive, select, onMouseEnter };\n}\n"],"mappings":";;;AAcA,SAAgB,EACd,GACqB;CACrB,IAAM,IAAM,EAAiB,YAAY,GAEnC,UAAc;EAClB,IAAM,IAAI,EAAM;EAEhB,OADI,EAAE,QAAc,EAAE,QACf,OAAO,EAAE,YAAa,WAAW,EAAE,WAAW,OAAO,EAAE,KAAK;CACrE;CAwBA,OAtBA,QAAc;EACZ,IAAM,IAAI,EAAM,GACV,IAAa,EAAI,aAAa;GAClC,OAAO,EAAE;GACT,OAAO,EAAM;GACb,UAAU,EAAE;EACd,CAAC;EACD,EAAU,CAAU;CACtB,CAAC,GAcM;EAAE;EAAK;EAAO,YAZF,QAAiB,EAAI,MAAM,MAAM,EAAM,CAAC,CAAC,KAYvC;EAAY,UAXhB,QAAiB,EAAI,YAAY,MAAM,EAAM,CAAC,CAAC,KAW/B;EAAU,cATtB;GACf,EAAM,CAAC,CAAC,YACZ,EAAI,YAAY,EAAM,CAAC,CAAC,KAAK;EAC/B;EAMmD,oBAJxB;GACzB,AAAK,EAAM,CAAC,CAAC,YAAU,EAAI,eAAe,EAAM,CAAC,CAAC,KAAK;EACzD;CAEgE;AAClE"}
@@ -7,7 +7,7 @@ var s = /*#__PURE__*/ a("<span>");
7
7
  function c(a) {
8
8
  let c = t("SelectValue"), l = o(() => {
9
9
  let e = c.value();
10
- if (e !== void 0) return c.items.find((t) => t.value === e)?.label ?? e;
10
+ if (e != null) return c.items.find((t) => t.value === e)?.label ?? e;
11
11
  });
12
12
  return (() => {
13
13
  var t = s();
@@ -1 +1 @@
1
- {"version":3,"file":"SelectValue.js","names":["createMemo","useSelectContext","SelectValueProps","clsx","SelectValue","props","ctx","label","v","value","undefined","items","find","it","_el$","_tmpl$","_$insert","placeholder","_$effect","_$className","class"],"sources":["../../../../src/components/select/SelectValue/SelectValue.tsx"],"sourcesContent":["import { createMemo } from \"solid-js\";\nimport { useSelectContext } from \"../Select/Select.context\";\nimport type { SelectValueProps } from \"./SelectValue.types\";\nimport { clsx } from \"~/utils\";\n\nexport function SelectValue(props: SelectValueProps) {\n const ctx = useSelectContext(\"SelectValue\");\n\n const label = createMemo(() => {\n const v = ctx.value();\n if (v === undefined) return undefined;\n return ctx.items.find((it) => it.value === v)?.label ?? v;\n });\n\n return (\n <span class={clsx(!label() && \"text-neutral-500\", props.class)}>\n {label() ?? props.placeholder ?? \"\"}\n </span>\n );\n}\n"],"mappings":";;;;;;AAKA,SAAgBI,EAAYC,GAAyB;CACnD,IAAMC,IAAML,EAAiB,aAAa,GAEpCM,IAAQP,QAAiB;EAC7B,IAAMQ,IAAIF,EAAIG,MAAM;EAChBD,UAAME,KAAAA,GACV,OAAOJ,EAAIK,MAAMC,MAAMC,MAAOA,EAAGJ,UAAUD,CAAC,CAAC,EAAED,SAASC;CAC1D,CAAC;CAED,cAAA;EAAA,IAAAM,IAAAC,EAAA;EACgE,OADhEC,EAAAF,SAEKP,EAAM,KAAKF,EAAMY,eAAe,EAAE,GAAAC,QAAAC,EAAAL,GADxBX,EAAK,CAACI,EAAM,KAAK,oBAAoBF,EAAMe,KAAK,CAAC,CAAA,GAAAN;CAAA,EAAA,CAAA;AAIlE"}
1
+ {"version":3,"file":"SelectValue.js","names":["createMemo","useSelectContext","SelectValueProps","clsx","SelectValue","props","ctx","label","v","value","undefined","items","find","it","_el$","_tmpl$","_$insert","placeholder","_$effect","_$className","class"],"sources":["../../../../src/components/select/SelectValue/SelectValue.tsx"],"sourcesContent":["import { createMemo } from \"solid-js\";\nimport { useSelectContext } from \"../Select/Select.context\";\nimport type { SelectValueProps } from \"./SelectValue.types\";\nimport { clsx } from \"~/utils\";\n\nexport function SelectValue(props: SelectValueProps) {\n const ctx = useSelectContext(\"SelectValue\");\n\n const label = createMemo(() => {\n const v = ctx.value();\n if (v === undefined || v === null) return undefined;\n return ctx.items.find((it) => it.value === v)?.label ?? v;\n });\n\n return (\n <span class={clsx(!label() && \"text-neutral-500\", props.class)}>\n {label() ?? props.placeholder ?? \"\"}\n </span>\n );\n}\n"],"mappings":";;;;;;AAKA,SAAgBI,EAAYC,GAAyB;CACnD,IAAMC,IAAML,EAAiB,aAAa,GAEpCM,IAAQP,QAAiB;EAC7B,IAAMQ,IAAIF,EAAIG,MAAM;EAChBD,SAAyB,MAC7B,OAAOF,EAAIK,MAAMC,MAAMC,MAAOA,EAAGJ,UAAUD,CAAC,CAAC,EAAED,SAASC;CAC1D,CAAC;CAED,cAAA;EAAA,IAAAM,IAAAC,EAAA;EACgE,OADhEC,EAAAF,SAEKP,EAAM,KAAKF,EAAMY,eAAe,EAAE,GAAAC,QAAAC,EAAAL,GADxBX,EAAK,CAACI,EAAM,KAAK,oBAAoBF,EAAMe,KAAK,CAAC,CAAA,GAAAN;CAAA,EAAA,CAAA;AAIlE"}
@@ -0,0 +1,3 @@
1
+ import { JSX } from 'solid-js';
2
+ import { ToastProps } from './Toast.types';
3
+ export declare function Toast(props: ToastProps): JSX.Element;
@@ -0,0 +1,181 @@
1
+ import { clsx as e } from "../../../utils/clsx.js";
2
+ import { toastIconVariants as t, toastVariants as n } from "./Toast.styles.js";
3
+ import { isAction as r } from "./Toast.types.js";
4
+ import { className as i, createComponent as a, delegateEvents as o, effect as s, insert as c, memo as l, setAttribute as u, style as d, template as f } from "solid-js/web";
5
+ import { Show as p, createEffect as m, createMemo as h, createSignal as g, onCleanup as _, onMount as v, splitProps as y } from "solid-js";
6
+ import { CircleCheck as b, CircleX as x, Info as S, LoaderCircle as C, TriangleAlert as w, X as T } from "lucide-solid";
7
+ //#region src/components/toast/Toast/Toast.tsx
8
+ var E = /*#__PURE__*/ f("<li data-slot=toast>"), D = /*#__PURE__*/ f("<div data-slot=toast-icon>"), O = /*#__PURE__*/ f("<div data-slot=toast-description>"), k = /*#__PURE__*/ f("<div data-slot=toast-content><div data-slot=toast-title>"), A = /*#__PURE__*/ f("<button type=button data-slot=toast-action>"), j = /*#__PURE__*/ f("<button type=button data-slot=toast-cancel>"), M = /*#__PURE__*/ f("<button type=button data-slot=toast-close>"), N = 4e3, P = 200;
9
+ function F(e) {
10
+ switch (e) {
11
+ case "success": return a(b, {});
12
+ case "info": return a(S, {});
13
+ case "warning": return a(w, {});
14
+ case "error": return a(x, {});
15
+ case "loading": return a(C, { class: "animate-spin" });
16
+ default: return;
17
+ }
18
+ }
19
+ function I(e) {
20
+ return typeof e == "function" ? e() : e;
21
+ }
22
+ function L(o) {
23
+ let [f] = y(o, [
24
+ "toast",
25
+ "closeButton",
26
+ "duration",
27
+ "class",
28
+ "icons",
29
+ "closeButtonAriaLabel",
30
+ "defaultRichColors",
31
+ "onRemove",
32
+ "index",
33
+ "total",
34
+ "expanded",
35
+ "position",
36
+ "gap"
37
+ ]), [b, x] = g("closed"), S = () => f.toast, C = h(() => S().type ?? "default"), w = h(() => S().richColors ?? f.defaultRichColors ?? !1), L = h(() => S().dismissible !== !1), R = h(() => C() === "loading");
38
+ v(() => {
39
+ let e = requestAnimationFrame(() => x("open"));
40
+ _(() => cancelAnimationFrame(e));
41
+ });
42
+ let z = () => {
43
+ b() === "open" && (x("closed"), S().onDismiss?.(S()), setTimeout(() => f.onRemove(S().id), P));
44
+ };
45
+ m(() => {
46
+ S().delete && b() === "open" && z();
47
+ }), m(() => {
48
+ let e = S();
49
+ if (e.delete || e.type === "loading" || e.duration === Infinity || e.duration === 0) return;
50
+ let t = e.duration ?? f.duration ?? N, n = setTimeout(() => {
51
+ e.onAutoClose?.(e), z();
52
+ }, t);
53
+ _(() => clearTimeout(n));
54
+ });
55
+ let B = () => S().icon === void 0 ? f.icons?.[C()] ?? F(C()) : S().icon, V = () => f.index === 0, H = () => f.position.startsWith("top") ? "top" : "bottom", U = () => {
56
+ if (V()) return;
57
+ let e = H() === "bottom" ? -1 : 1, t = Math.max(.8, 1 - f.index * .05);
58
+ return `translateY(calc(${e * f.gap * f.index}px)) scale(${t})`;
59
+ }, W = () => ({
60
+ ...S().style,
61
+ "z-index": f.total - f.index,
62
+ ...f.expanded ? {} : {
63
+ "grid-area": "1 / 1",
64
+ "align-self": H() === "bottom" ? "end" : "start",
65
+ transform: U(),
66
+ "pointer-events": V() ? "auto" : "none"
67
+ }
68
+ }), G = () => H() === "bottom" ? "data-[state=open]:slide-in-from-bottom-2" : "data-[state=open]:slide-in-from-top-2", K = () => H() === "bottom" ? "data-[state=closed]:slide-out-to-bottom" : "data-[state=closed]:slide-out-to-top", q = () => V() || f.expanded ? `${G()} ${K()} data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:fill-mode-both data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:fill-mode-both` : "";
69
+ return (() => {
70
+ var o = E();
71
+ return c(o, a(p, {
72
+ get when() {
73
+ return S().jsx;
74
+ },
75
+ get fallback() {
76
+ return [
77
+ a(p, {
78
+ get when() {
79
+ return B();
80
+ },
81
+ get children() {
82
+ var n = D();
83
+ return c(n, B), s(() => i(n, e(t({ type: C() }), S().classes?.icon))), n;
84
+ }
85
+ }),
86
+ (() => {
87
+ var t = k(), n = t.firstChild;
88
+ return c(n, () => I(S().title)), c(t, a(p, {
89
+ get when() {
90
+ return S().description;
91
+ },
92
+ get children() {
93
+ var t = O();
94
+ return c(t, () => I(S().description)), s(() => i(t, e("text-sm leading-relaxed text-muted-foreground", S().descriptionClass, S().classes?.description))), t;
95
+ }
96
+ }), null), s((r) => {
97
+ var a = e("flex min-w-0 flex-1 flex-col gap-0.5", S().classes?.content), o = e("text-sm font-medium leading-snug", S().classes?.title);
98
+ return a !== r.e && i(t, r.e = a), o !== r.t && i(n, r.t = o), r;
99
+ }, {
100
+ e: void 0,
101
+ t: void 0
102
+ }), t;
103
+ })(),
104
+ a(p, {
105
+ get when() {
106
+ return l(() => !!S().action)() && r(S().action);
107
+ },
108
+ get children() {
109
+ var t = A();
110
+ return t.$$click = (e) => {
111
+ let t = S().action;
112
+ r(t) && (t.onClick?.(e), e.defaultPrevented || z());
113
+ }, c(t, () => S().action.label), s(() => i(t, e("shrink-0 rounded-md bg-foreground px-2.5 py-1 text-xs font-medium text-background outline-none transition-colors hover:bg-foreground/80", S().classes?.actionButton))), t;
114
+ }
115
+ }),
116
+ a(p, {
117
+ get when() {
118
+ return l(() => !!S().cancel)() && r(S().cancel);
119
+ },
120
+ get children() {
121
+ var t = j();
122
+ return t.$$click = (e) => {
123
+ let t = S().cancel;
124
+ r(t) && (t.onClick?.(e), e.defaultPrevented || z());
125
+ }, c(t, () => S().cancel.label), s(() => i(t, e("shrink-0 rounded-md bg-foreground/10 px-2.5 py-1 text-xs font-medium text-foreground outline-none transition-colors hover:bg-foreground/15", S().classes?.cancelButton))), t;
126
+ }
127
+ }),
128
+ a(p, {
129
+ get when() {
130
+ return l(() => !!S().action)() && !r(S().action);
131
+ },
132
+ get children() {
133
+ return S().action;
134
+ }
135
+ }),
136
+ a(p, {
137
+ get when() {
138
+ return l(() => !!S().cancel)() && !r(S().cancel);
139
+ },
140
+ get children() {
141
+ return S().cancel;
142
+ }
143
+ }),
144
+ a(p, {
145
+ get when() {
146
+ return l(() => !!(f.closeButton && L()))() && !R();
147
+ },
148
+ get children() {
149
+ var t = M();
150
+ return t.$$click = z, c(t, a(T, { class: "size-3.5" })), s((n) => {
151
+ var r = f.closeButtonAriaLabel ?? "Close toast", a = e("absolute top-2.5 right-2.5 flex size-5 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:text-foreground", S().classes?.closeButton);
152
+ return r !== n.e && u(t, "aria-label", n.e = r), a !== n.t && i(t, n.t = a), n;
153
+ }, {
154
+ e: void 0,
155
+ t: void 0
156
+ }), t;
157
+ }
158
+ })
159
+ ];
160
+ },
161
+ get children() {
162
+ return S().jsx;
163
+ }
164
+ })), s((t) => {
165
+ var r = C(), a = b(), s = w(), c = S().testId, l = e(n({ type: C() }), f.closeButton && "pr-8", q(), f.class, S().class, S().classes?.toast, S().classes?.[C()]), p = W();
166
+ return r !== t.e && u(o, "data-type", t.e = r), a !== t.t && u(o, "data-state", t.t = a), s !== t.a && u(o, "data-rich-colors", t.a = s), c !== t.o && u(o, "data-testid", t.o = c), l !== t.i && i(o, t.i = l), t.n = d(o, p, t.n), t;
167
+ }, {
168
+ e: void 0,
169
+ t: void 0,
170
+ a: void 0,
171
+ o: void 0,
172
+ i: void 0,
173
+ n: void 0
174
+ }), o;
175
+ })();
176
+ }
177
+ o(["click"]);
178
+ //#endregion
179
+ export { L as Toast };
180
+
181
+ //# sourceMappingURL=Toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.js","names":["Show","JSX","createEffect","createMemo","createSignal","onCleanup","onMount","splitProps","CircleCheck","CircleX","Info","LoaderCircle","TriangleAlert","X","clsx","toastIconVariants","toastVariants","isAction","ToastIcons","ToastProps","ToastT","ToastTypes","TOAST_LIFETIME","EXIT_ANIMATION_MS","getDefaultIcon","type","_$createComponent","undefined","resolveContent","value","Toast","props","local","animationState","setAnimationState","toast","toastType","richColors","defaultRichColors","dismissible","isBusy","raf","requestAnimationFrame","cancelAnimationFrame","close","onDismiss","setTimeout","onRemove","id","delete","current","duration","Infinity","delay","timer","onAutoClose","clearTimeout","icon","icons","isFront","index","yPosition","position","startsWith","collapsedTransform","lift","scale","Math","max","gap","toastStyle","style","total","expanded","transform","CSSProperties","slideInClass","slideOutClass","animationClasses","_el$","_tmpl$","_$insert","when","jsx","fallback","children","_el$2","_tmpl$2","_$effect","_$className","classes","_el$3","_tmpl$4","_el$4","firstChild","title","description","_el$5","_tmpl$3","descriptionClass","_p$","_v$7","content","_v$8","e","t","_$memo","action","_el$6","_tmpl$5","$$click","onClick","defaultPrevented","Extract","label","actionButton","cancel","_el$7","_tmpl$6","cancelButton","Element","closeButton","_el$8","_tmpl$7","_v$9","closeButtonAriaLabel","_v$0","_$setAttribute","_v$","_v$2","_v$3","_v$4","testId","_v$5","class","_v$6","a","o","i","n","_$style","_$delegateEvents"],"sources":["../../../../src/components/toast/Toast/Toast.tsx"],"sourcesContent":["import {\n Show,\n type JSX,\n createEffect,\n createMemo,\n createSignal,\n onCleanup,\n onMount,\n splitProps,\n} from \"solid-js\";\nimport {\n CircleCheck,\n CircleX,\n Info,\n LoaderCircle,\n TriangleAlert,\n X,\n} from \"lucide-solid\";\nimport { clsx } from \"~/utils\";\nimport { toastIconVariants, toastVariants } from \"./Toast.styles\";\nimport {\n isAction,\n type ToastIcons,\n type ToastProps,\n type ToastT,\n type ToastTypes,\n} from \"./Toast.types\";\n\nconst TOAST_LIFETIME = 4000;\nconst EXIT_ANIMATION_MS = 200;\n\nfunction getDefaultIcon(type: ToastTypes) {\n switch (type) {\n case \"success\":\n return <CircleCheck />;\n case \"info\":\n return <Info />;\n case \"warning\":\n return <TriangleAlert />;\n case \"error\":\n return <CircleX />;\n case \"loading\":\n return <LoaderCircle class=\"animate-spin\" />;\n default:\n return undefined;\n }\n}\n\nfunction resolveContent(value: ToastT[\"title\"]) {\n return typeof value === \"function\" ? value() : value;\n}\n\nexport function Toast(props: ToastProps) {\n const [local] = splitProps(props, [\n \"toast\",\n \"closeButton\",\n \"duration\",\n \"class\",\n \"icons\",\n \"closeButtonAriaLabel\",\n \"defaultRichColors\",\n \"onRemove\",\n \"index\",\n \"total\",\n \"expanded\",\n \"position\",\n \"gap\",\n ]);\n\n const [animationState, setAnimationState] = createSignal<\"open\" | \"closed\">(\n \"closed\",\n );\n\n const toast = () => local.toast;\n const toastType = createMemo(() => toast().type ?? \"default\");\n const richColors = createMemo(\n () => toast().richColors ?? local.defaultRichColors ?? false,\n );\n const dismissible = createMemo(() => toast().dismissible !== false);\n const isBusy = createMemo(() => toastType() === \"loading\");\n\n onMount(() => {\n const raf = requestAnimationFrame(() => setAnimationState(\"open\"));\n onCleanup(() => cancelAnimationFrame(raf));\n });\n\n const close = () => {\n if (animationState() !== \"open\") return;\n setAnimationState(\"closed\");\n toast().onDismiss?.(toast());\n setTimeout(() => local.onRemove(toast().id), EXIT_ANIMATION_MS);\n };\n\n // 外部 dismiss:把 delete 标记转换成退场动画\n createEffect(() => {\n if (toast().delete && animationState() === \"open\") {\n close();\n }\n });\n\n // 自动关闭计时器\n createEffect(() => {\n const current = toast();\n if (\n current.delete ||\n current.type === \"loading\" ||\n current.duration === Infinity ||\n current.duration === 0\n ) {\n return;\n }\n\n const delay = current.duration ?? local.duration ?? TOAST_LIFETIME;\n const timer = setTimeout(() => {\n current.onAutoClose?.(current);\n close();\n }, delay);\n\n onCleanup(() => clearTimeout(timer));\n });\n\n const icon = () => {\n if (toast().icon !== undefined) return toast().icon;\n return (\n local.icons?.[toastType() as keyof ToastIcons] ??\n getDefaultIcon(toastType())\n );\n };\n\n const isFront = () => local.index === 0;\n const yPosition = () => (local.position.startsWith(\"top\") ? \"top\" : \"bottom\");\n\n const collapsedTransform = () => {\n if (isFront()) return undefined;\n const lift = yPosition() === \"bottom\" ? -1 : 1;\n const scale = Math.max(0.8, 1 - local.index * 0.05);\n return `translateY(calc(${lift * local.gap * local.index}px)) scale(${scale})`;\n };\n\n const toastStyle = () =>\n ({\n ...toast().style,\n \"z-index\": local.total - local.index,\n ...(local.expanded\n ? {}\n : {\n \"grid-area\": \"1 / 1\",\n \"align-self\": yPosition() === \"bottom\" ? \"end\" : \"start\",\n transform: collapsedTransform(),\n \"pointer-events\": isFront() ? \"auto\" : \"none\",\n }),\n }) as JSX.CSSProperties;\n\n const slideInClass = () =>\n yPosition() === \"bottom\"\n ? \"data-[state=open]:slide-in-from-bottom-2\"\n : \"data-[state=open]:slide-in-from-top-2\";\n\n const slideOutClass = () =>\n yPosition() === \"bottom\"\n ? \"data-[state=closed]:slide-out-to-bottom\"\n : \"data-[state=closed]:slide-out-to-top\";\n\n const animationClasses = () =>\n isFront() || local.expanded\n ? `${slideInClass()} ${slideOutClass()} data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:fill-mode-both data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:fill-mode-both`\n : \"\";\n\n return (\n <li\n data-slot=\"toast\"\n data-type={toastType()}\n data-state={animationState()}\n data-rich-colors={richColors()}\n data-testid={toast().testId}\n class={clsx(\n toastVariants({ type: toastType() }),\n local.closeButton && \"pr-8\",\n animationClasses(),\n local.class,\n toast().class,\n toast().classes?.toast,\n toast().classes?.[toastType()],\n )}\n style={toastStyle()}\n >\n <Show\n when={toast().jsx}\n fallback={\n <>\n <Show when={icon()}>\n <div\n data-slot=\"toast-icon\"\n class={clsx(\n toastIconVariants({ type: toastType() }),\n toast().classes?.icon,\n )}\n >\n {icon()}\n </div>\n </Show>\n\n <div\n data-slot=\"toast-content\"\n class={clsx(\n \"flex min-w-0 flex-1 flex-col gap-0.5\",\n toast().classes?.content,\n )}\n >\n <div\n data-slot=\"toast-title\"\n class={clsx(\n \"text-sm font-medium leading-snug\",\n toast().classes?.title,\n )}\n >\n {resolveContent(toast().title)}\n </div>\n <Show when={toast().description}>\n <div\n data-slot=\"toast-description\"\n class={clsx(\n \"text-sm leading-relaxed text-muted-foreground\",\n toast().descriptionClass,\n toast().classes?.description,\n )}\n >\n {resolveContent(toast().description)}\n </div>\n </Show>\n </div>\n\n <Show when={toast().action && isAction(toast().action)}>\n <button\n type=\"button\"\n data-slot=\"toast-action\"\n class={clsx(\n \"shrink-0 rounded-md bg-foreground px-2.5 py-1 text-xs font-medium text-background outline-none transition-colors hover:bg-foreground/80\",\n toast().classes?.actionButton,\n )}\n onClick={(e) => {\n const action = toast().action;\n if (!isAction(action)) return;\n action.onClick?.(e);\n if (!e.defaultPrevented) close();\n }}\n >\n {\n (\n toast().action as Extract<\n ToastT[\"action\"],\n { label: unknown }\n >\n ).label\n }\n </button>\n </Show>\n\n <Show when={toast().cancel && isAction(toast().cancel)}>\n <button\n type=\"button\"\n data-slot=\"toast-cancel\"\n class={clsx(\n \"shrink-0 rounded-md bg-foreground/10 px-2.5 py-1 text-xs font-medium text-foreground outline-none transition-colors hover:bg-foreground/15\",\n toast().classes?.cancelButton,\n )}\n onClick={(e) => {\n const cancel = toast().cancel;\n if (!isAction(cancel)) return;\n cancel.onClick?.(e);\n if (!e.defaultPrevented) close();\n }}\n >\n {\n (\n toast().cancel as Extract<\n ToastT[\"action\"],\n { label: unknown }\n >\n ).label\n }\n </button>\n </Show>\n\n <Show when={toast().action && !isAction(toast().action)}>\n {toast().action as JSX.Element}\n </Show>\n <Show when={toast().cancel && !isAction(toast().cancel)}>\n {toast().cancel as JSX.Element}\n </Show>\n\n <Show when={local.closeButton && dismissible() && !isBusy()}>\n <button\n type=\"button\"\n data-slot=\"toast-close\"\n aria-label={local.closeButtonAriaLabel ?? \"Close toast\"}\n class={clsx(\n \"absolute top-2.5 right-2.5 flex size-5 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:text-foreground\",\n toast().classes?.closeButton,\n )}\n onClick={close}\n >\n <X class=\"size-3.5\" />\n </button>\n </Show>\n </>\n }\n >\n {toast().jsx}\n </Show>\n </li>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const toastVariants: (props?: ({
2
+ type?: "info" | "error" | "default" | "loading" | "success" | "warning" | null | undefined;
3
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
4
+ export declare const toastIconVariants: (props?: ({
5
+ type?: "info" | "error" | "default" | "loading" | "success" | "warning" | null | undefined;
6
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
@@ -0,0 +1,27 @@
1
+ import { cva as e } from "class-variance-authority";
2
+ //#region src/components/toast/Toast/Toast.styles.ts
3
+ var t = e("pointer-events-auto relative flex w-full items-center gap-2.5 rounded-lg border bg-popover p-4 text-sm text-popover-foreground shadow-md outline-none", {
4
+ variants: { type: {
5
+ default: "border-border",
6
+ success: "border-emerald-500/60",
7
+ info: "border-blue-500/60",
8
+ warning: "border-amber-500/60",
9
+ error: "border-red-500/60",
10
+ loading: "border-border"
11
+ } },
12
+ defaultVariants: { type: "default" }
13
+ }), n = e("flex size-5 shrink-0 items-center justify-center", {
14
+ variants: { type: {
15
+ default: "text-muted-foreground",
16
+ success: "text-emerald-500",
17
+ info: "text-blue-500",
18
+ warning: "text-amber-500",
19
+ error: "text-red-500",
20
+ loading: "text-muted-foreground"
21
+ } },
22
+ defaultVariants: { type: "default" }
23
+ });
24
+ //#endregion
25
+ export { n as toastIconVariants, t as toastVariants };
26
+
27
+ //# sourceMappingURL=Toast.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.styles.js","names":[],"sources":["../../../../src/components/toast/Toast/Toast.styles.ts"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const toastVariants = cva(\n \"pointer-events-auto relative flex w-full items-center gap-2.5 rounded-lg border bg-popover p-4 text-sm text-popover-foreground shadow-md outline-none\",\n {\n variants: {\n type: {\n default: \"border-border\",\n success: \"border-emerald-500/60\",\n info: \"border-blue-500/60\",\n warning: \"border-amber-500/60\",\n error: \"border-red-500/60\",\n loading: \"border-border\",\n },\n },\n defaultVariants: {\n type: \"default\",\n },\n },\n);\n\nexport const toastIconVariants = cva(\n \"flex size-5 shrink-0 items-center justify-center\",\n {\n variants: {\n type: {\n default: \"text-muted-foreground\",\n success: \"text-emerald-500\",\n info: \"text-blue-500\",\n warning: \"text-amber-500\",\n error: \"text-red-500\",\n loading: \"text-muted-foreground\",\n },\n },\n defaultVariants: {\n type: \"default\",\n },\n },\n);\n"],"mappings":";;AAEA,IAAa,IAAgB,EAC3B,yJACA;CACE,UAAU,EACR,MAAM;EACJ,SAAS;EACT,SAAS;EACT,MAAM;EACN,SAAS;EACT,OAAO;EACP,SAAS;CACX,EACF;CACA,iBAAiB,EACf,MAAM,UACR;AACF,CACF,GAEa,IAAoB,EAC/B,oDACA;CACE,UAAU,EACR,MAAM;EACJ,SAAS;EACT,SAAS;EACT,MAAM;EACN,SAAS;EACT,OAAO;EACP,SAAS;CACX,EACF;CACA,iBAAiB,EACf,MAAM,UACR;AACF,CACF"}