@greypan/web-ui 11.2.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (667) hide show
  1. package/README.CN.md +79 -68
  2. package/README.md +81 -72
  3. package/dist/_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js +8 -0
  4. package/dist/assets/menu-portal.js +3 -4
  5. package/dist/assets/menu-portal.js.map +1 -1
  6. package/dist/assets/modal-surface.js +3 -4
  7. package/dist/assets/modal-surface.js.map +1 -1
  8. package/dist/assets/overlay-motion.js +3 -4
  9. package/dist/assets/overlay-motion.js.map +1 -1
  10. package/dist/assets/scrollbar.js +5 -0
  11. package/dist/assets/scrollbar.js.map +1 -0
  12. package/dist/assets/selection-control.js +3 -4
  13. package/dist/assets/selection-control.js.map +1 -1
  14. package/dist/assets/toast-containers.js +3 -4
  15. package/dist/assets/toast-containers.js.map +1 -1
  16. package/dist/classes/glass.js +3 -4
  17. package/dist/classes/glass.js.map +1 -1
  18. package/dist/classes/glow.js +3 -4
  19. package/dist/classes/glow.js.map +1 -1
  20. package/dist/components/autocomplete/index.d.ts +485 -483
  21. package/dist/components/autocomplete/index.d.ts.map +1 -0
  22. package/dist/components/autocomplete/index.js +475 -267
  23. package/dist/components/autocomplete/index.js.map +1 -1
  24. package/dist/components/autocomplete/style.js +3 -4
  25. package/dist/components/autocomplete/style.js.map +1 -1
  26. package/dist/components/avatar/index.d.ts +26 -24
  27. package/dist/components/avatar/index.d.ts.map +1 -0
  28. package/dist/components/avatar/index.js +72 -52
  29. package/dist/components/avatar/index.js.map +1 -1
  30. package/dist/components/avatar/style.js +3 -4
  31. package/dist/components/avatar/style.js.map +1 -1
  32. package/dist/components/back-top/index.d.ts +30 -27
  33. package/dist/components/back-top/index.d.ts.map +1 -0
  34. package/dist/components/back-top/index.js +96 -62
  35. package/dist/components/back-top/index.js.map +1 -1
  36. package/dist/components/back-top/style.js +3 -4
  37. package/dist/components/back-top/style.js.map +1 -1
  38. package/dist/components/badge/index.d.ts +32 -26
  39. package/dist/components/badge/index.d.ts.map +1 -0
  40. package/dist/components/badge/index.js +116 -74
  41. package/dist/components/badge/index.js.map +1 -1
  42. package/dist/components/badge/style.js +3 -4
  43. package/dist/components/badge/style.js.map +1 -1
  44. package/dist/components/button/index.d.ts +392 -390
  45. package/dist/components/button/index.d.ts.map +1 -0
  46. package/dist/components/button/index.js +108 -74
  47. package/dist/components/button/index.js.map +1 -1
  48. package/dist/components/button/style.js +3 -4
  49. package/dist/components/button/style.js.map +1 -1
  50. package/dist/components/button-group/index.d.ts +14 -13
  51. package/dist/components/button-group/index.d.ts.map +1 -0
  52. package/dist/components/button-group/index.js +43 -33
  53. package/dist/components/button-group/index.js.map +1 -1
  54. package/dist/components/button-group/style.js +3 -4
  55. package/dist/components/button-group/style.js.map +1 -1
  56. package/dist/components/checkbox/index.d.ts +399 -397
  57. package/dist/components/checkbox/index.d.ts.map +1 -0
  58. package/dist/components/checkbox/index.js +103 -74
  59. package/dist/components/checkbox/index.js.map +1 -1
  60. package/dist/components/checkbox/style.js +3 -4
  61. package/dist/components/checkbox/style.js.map +1 -1
  62. package/dist/components/checkbox-group/index.d.ts +397 -396
  63. package/dist/components/checkbox-group/index.d.ts.map +1 -0
  64. package/dist/components/checkbox-group/index.js +92 -70
  65. package/dist/components/checkbox-group/index.js.map +1 -1
  66. package/dist/components/checkbox-group/style.js +3 -4
  67. package/dist/components/checkbox-group/style.js.map +1 -1
  68. package/dist/components/collapse/index.d.ts +72 -71
  69. package/dist/components/collapse/index.d.ts.map +1 -0
  70. package/dist/components/collapse/index.js +225 -130
  71. package/dist/components/collapse/index.js.map +1 -1
  72. package/dist/components/collapse/style.js +3 -4
  73. package/dist/components/collapse/style.js.map +1 -1
  74. package/dist/components/context-menu/index.d.ts +307 -310
  75. package/dist/components/context-menu/index.d.ts.map +1 -0
  76. package/dist/components/context-menu/index.js +685 -270
  77. package/dist/components/context-menu/index.js.map +1 -1
  78. package/dist/components/context-menu/scrim.js +3 -4
  79. package/dist/components/context-menu/scrim.js.map +1 -1
  80. package/dist/components/context-menu/style.js +3 -4
  81. package/dist/components/context-menu/style.js.map +1 -1
  82. package/dist/components/dialog/index.d.ts +87 -78
  83. package/dist/components/dialog/index.d.ts.map +1 -0
  84. package/dist/components/dialog/index.js +183 -88
  85. package/dist/components/dialog/index.js.map +1 -1
  86. package/dist/components/dialog/style.js +3 -4
  87. package/dist/components/dialog/style.js.map +1 -1
  88. package/dist/components/drawer/index.d.ts +159 -150
  89. package/dist/components/drawer/index.d.ts.map +1 -0
  90. package/dist/components/drawer/index.js +503 -242
  91. package/dist/components/drawer/index.js.map +1 -1
  92. package/dist/components/drawer/style.js +3 -4
  93. package/dist/components/drawer/style.js.map +1 -1
  94. package/dist/components/dropdown/index.d.ts +125 -124
  95. package/dist/components/dropdown/index.d.ts.map +1 -0
  96. package/dist/components/dropdown/index.js +556 -328
  97. package/dist/components/dropdown/index.js.map +1 -1
  98. package/dist/components/dropdown/style.js +3 -4
  99. package/dist/components/dropdown/style.js.map +1 -1
  100. package/dist/components/dropdown-divider/index.d.ts +7 -6
  101. package/dist/components/dropdown-divider/index.d.ts.map +1 -0
  102. package/dist/components/dropdown-divider/index.js +10 -11
  103. package/dist/components/dropdown-divider/index.js.map +1 -1
  104. package/dist/components/dropdown-divider/style.js +3 -4
  105. package/dist/components/dropdown-divider/style.js.map +1 -1
  106. package/dist/components/dropdown-header/index.d.ts +7 -6
  107. package/dist/components/dropdown-header/index.d.ts.map +1 -0
  108. package/dist/components/dropdown-header/index.js +10 -11
  109. package/dist/components/dropdown-header/index.js.map +1 -1
  110. package/dist/components/dropdown-header/style.js +3 -4
  111. package/dist/components/dropdown-header/style.js.map +1 -1
  112. package/dist/components/dropdown-item/index.d.ts +13 -11
  113. package/dist/components/dropdown-item/index.d.ts.map +1 -0
  114. package/dist/components/dropdown-item/index.js +32 -25
  115. package/dist/components/dropdown-item/index.js.map +1 -1
  116. package/dist/components/dropdown-item/style.js +3 -4
  117. package/dist/components/dropdown-item/style.js.map +1 -1
  118. package/dist/components/editable-text/index.d.ts +506 -505
  119. package/dist/components/editable-text/index.d.ts.map +1 -0
  120. package/dist/components/editable-text/index.js +281 -127
  121. package/dist/components/editable-text/index.js.map +1 -1
  122. package/dist/components/editable-text/style.js +3 -4
  123. package/dist/components/editable-text/style.js.map +1 -1
  124. package/dist/components/empty/index.d.ts +17 -15
  125. package/dist/components/empty/index.d.ts.map +1 -0
  126. package/dist/components/empty/index.js +66 -37
  127. package/dist/components/empty/index.js.map +1 -1
  128. package/dist/components/empty/style.js +3 -4
  129. package/dist/components/empty/style.js.map +1 -1
  130. package/dist/components/icon/index.d.ts +12 -11
  131. package/dist/components/icon/index.d.ts.map +1 -0
  132. package/dist/components/icon/index.js +34 -27
  133. package/dist/components/icon/index.js.map +1 -1
  134. package/dist/components/icon/style.js +3 -4
  135. package/dist/components/icon/style.js.map +1 -1
  136. package/dist/components/image-preview/index.d.ts +58 -44
  137. package/dist/components/image-preview/index.d.ts.map +1 -0
  138. package/dist/components/image-preview/index.js +536 -265
  139. package/dist/components/image-preview/index.js.map +1 -1
  140. package/dist/components/image-preview/style.js +3 -4
  141. package/dist/components/image-preview/style.js.map +1 -1
  142. package/dist/components/index.d.ts +46 -43
  143. package/dist/components/index.d.ts.map +1 -0
  144. package/dist/components/index.js +41 -41
  145. package/dist/components/input/index.d.ts +418 -413
  146. package/dist/components/input/index.d.ts.map +1 -0
  147. package/dist/components/input/index.js +148 -84
  148. package/dist/components/input/index.js.map +1 -1
  149. package/dist/components/input/style.js +3 -4
  150. package/dist/components/input/style.js.map +1 -1
  151. package/dist/components/input-number/index.d.ts +453 -447
  152. package/dist/components/input-number/index.d.ts.map +1 -0
  153. package/dist/components/input-number/index.js +484 -292
  154. package/dist/components/input-number/index.js.map +1 -1
  155. package/dist/components/input-number/style.js +3 -4
  156. package/dist/components/input-number/style.js.map +1 -1
  157. package/dist/components/layout/index.d.ts +110 -87
  158. package/dist/components/layout/index.d.ts.map +1 -0
  159. package/dist/components/layout/index.js +238 -144
  160. package/dist/components/layout/index.js.map +1 -1
  161. package/dist/components/layout/style.js +3 -4
  162. package/dist/components/layout/style.js.map +1 -1
  163. package/dist/components/middle-ellipsis/index.d.ts +93 -92
  164. package/dist/components/middle-ellipsis/index.d.ts.map +1 -0
  165. package/dist/components/middle-ellipsis/index.js +261 -107
  166. package/dist/components/middle-ellipsis/index.js.map +1 -1
  167. package/dist/components/middle-ellipsis/style.js +3 -4
  168. package/dist/components/middle-ellipsis/style.js.map +1 -1
  169. package/dist/components/middle-ellipsis/truncate.js +60 -30
  170. package/dist/components/middle-ellipsis/truncate.js.map +1 -1
  171. package/dist/components/option/index.d.ts +20 -18
  172. package/dist/components/option/index.d.ts.map +1 -0
  173. package/dist/components/option/index.js +53 -40
  174. package/dist/components/option/index.js.map +1 -1
  175. package/dist/components/option/style.js +3 -4
  176. package/dist/components/option/style.js.map +1 -1
  177. package/dist/components/popover/index.d.ts +69 -68
  178. package/dist/components/popover/index.d.ts.map +1 -0
  179. package/dist/components/popover/index.js +221 -104
  180. package/dist/components/popover/index.js.map +1 -1
  181. package/dist/components/popover/style.js +3 -4
  182. package/dist/components/popover/style.js.map +1 -1
  183. package/dist/components/radio/index.d.ts +396 -395
  184. package/dist/components/radio/index.d.ts.map +1 -0
  185. package/dist/components/radio/index.js +91 -62
  186. package/dist/components/radio/index.js.map +1 -1
  187. package/dist/components/radio/interaction.js +10 -11
  188. package/dist/components/radio/interaction.js.map +1 -1
  189. package/dist/components/radio/style.js +3 -4
  190. package/dist/components/radio/style.js.map +1 -1
  191. package/dist/components/radio-group/index.d.ts +417 -416
  192. package/dist/components/radio-group/index.d.ts.map +1 -0
  193. package/dist/components/radio-group/index.js +307 -207
  194. package/dist/components/radio-group/index.js.map +1 -1
  195. package/dist/components/radio-group/style.js +3 -4
  196. package/dist/components/radio-group/style.js.map +1 -1
  197. package/dist/components/segmented/index.d.ts +408 -402
  198. package/dist/components/segmented/index.d.ts.map +1 -0
  199. package/dist/components/segmented/index.js +267 -158
  200. package/dist/components/segmented/index.js.map +1 -1
  201. package/dist/components/segmented/style.js +3 -4
  202. package/dist/components/segmented/style.js.map +1 -1
  203. package/dist/components/segmented-trigger/index.d.ts +18 -17
  204. package/dist/components/segmented-trigger/index.d.ts.map +1 -0
  205. package/dist/components/segmented-trigger/index.js +45 -36
  206. package/dist/components/segmented-trigger/index.js.map +1 -1
  207. package/dist/components/segmented-trigger/style.js +3 -4
  208. package/dist/components/segmented-trigger/style.js.map +1 -1
  209. package/dist/components/select/index.d.ts +450 -448
  210. package/dist/components/select/index.d.ts.map +1 -0
  211. package/dist/components/select/index.js +342 -188
  212. package/dist/components/select/index.js.map +1 -1
  213. package/dist/components/select/style.js +3 -4
  214. package/dist/components/select/style.js.map +1 -1
  215. package/dist/components/slider/index.d.ts +428 -427
  216. package/dist/components/slider/index.d.ts.map +1 -0
  217. package/dist/components/slider/index.js +308 -216
  218. package/dist/components/slider/index.js.map +1 -1
  219. package/dist/components/slider/style.js +3 -4
  220. package/dist/components/slider/style.js.map +1 -1
  221. package/dist/components/spinner/index.d.ts +39 -38
  222. package/dist/components/spinner/index.d.ts.map +1 -0
  223. package/dist/components/spinner/index.js +118 -65
  224. package/dist/components/spinner/index.js.map +1 -1
  225. package/dist/components/spinner/style.js +3 -4
  226. package/dist/components/spinner/style.js.map +1 -1
  227. package/dist/components/svg-draw-lines/index.d.ts +40 -39
  228. package/dist/components/svg-draw-lines/index.d.ts.map +1 -0
  229. package/dist/components/svg-draw-lines/index.js +189 -106
  230. package/dist/components/svg-draw-lines/index.js.map +1 -1
  231. package/dist/components/svg-draw-lines/style.js +3 -4
  232. package/dist/components/svg-draw-lines/style.js.map +1 -1
  233. package/dist/components/switch/index.d.ts +411 -409
  234. package/dist/components/switch/index.d.ts.map +1 -0
  235. package/dist/components/switch/index.js +193 -106
  236. package/dist/components/switch/index.js.map +1 -1
  237. package/dist/components/switch/style.js +3 -4
  238. package/dist/components/switch/style.js.map +1 -1
  239. package/dist/components/textarea/index.d.ts +430 -425
  240. package/dist/components/textarea/index.d.ts.map +1 -0
  241. package/dist/components/textarea/index.js +187 -100
  242. package/dist/components/textarea/index.js.map +1 -1
  243. package/dist/components/textarea/style.js +3 -4
  244. package/dist/components/textarea/style.js.map +1 -1
  245. package/dist/components/theme/index.d.ts +45 -44
  246. package/dist/components/theme/index.d.ts.map +1 -0
  247. package/dist/components/theme/index.js +268 -161
  248. package/dist/components/theme/index.js.map +1 -1
  249. package/dist/components/theme/style.js +3 -4
  250. package/dist/components/theme/style.js.map +1 -1
  251. package/dist/components/toast/index.d.ts +4 -3
  252. package/dist/components/toast/index.js +3 -3
  253. package/dist/components/toast/manager.d.ts +9 -8
  254. package/dist/components/toast/manager.d.ts.map +1 -0
  255. package/dist/components/toast/manager.js +215 -119
  256. package/dist/components/toast/manager.js.map +1 -1
  257. package/dist/components/toast/style.js +3 -4
  258. package/dist/components/toast/style.js.map +1 -1
  259. package/dist/components/toast/toast.d.ts +75 -71
  260. package/dist/components/toast/toast.d.ts.map +1 -0
  261. package/dist/components/toast/toast.js +203 -96
  262. package/dist/components/toast/toast.js.map +1 -1
  263. package/dist/components/toast/types.d.ts +10 -9
  264. package/dist/components/toast/types.d.ts.map +1 -0
  265. package/dist/components/tooltip/index.d.ts +72 -62
  266. package/dist/components/tooltip/index.d.ts.map +1 -0
  267. package/dist/components/tooltip/index.js +251 -93
  268. package/dist/components/tooltip/index.js.map +1 -1
  269. package/dist/components/tooltip/style.js +3 -4
  270. package/dist/components/tooltip/style.js.map +1 -1
  271. package/dist/icons/generated/akar-icons-check.d.ts +5 -4
  272. package/dist/icons/generated/akar-icons-check.d.ts.map +1 -0
  273. package/dist/icons/generated/akar-icons-check.js +3 -4
  274. package/dist/icons/generated/akar-icons-check.js.map +1 -1
  275. package/dist/icons/generated/akar-icons-circle-check.d.ts +5 -4
  276. package/dist/icons/generated/akar-icons-circle-check.d.ts.map +1 -0
  277. package/dist/icons/generated/akar-icons-circle-check.js +3 -4
  278. package/dist/icons/generated/akar-icons-circle-check.js.map +1 -1
  279. package/dist/icons/generated/andrsrxn-inbox.d.ts +5 -4
  280. package/dist/icons/generated/andrsrxn-inbox.d.ts.map +1 -0
  281. package/dist/icons/generated/andrsrxn-inbox.js +3 -4
  282. package/dist/icons/generated/andrsrxn-inbox.js.map +1 -1
  283. package/dist/icons/generated/bi-check-lg.d.ts +5 -4
  284. package/dist/icons/generated/bi-check-lg.d.ts.map +1 -0
  285. package/dist/icons/generated/bi-check-lg.js +3 -4
  286. package/dist/icons/generated/bi-check-lg.js.map +1 -1
  287. package/dist/icons/generated/bi-check.d.ts +5 -4
  288. package/dist/icons/generated/bi-check.d.ts.map +1 -0
  289. package/dist/icons/generated/bi-check.js +3 -4
  290. package/dist/icons/generated/bi-check.js.map +1 -1
  291. package/dist/icons/generated/fluent-tag-search-24-regular.d.ts +5 -4
  292. package/dist/icons/generated/fluent-tag-search-24-regular.d.ts.map +1 -0
  293. package/dist/icons/generated/fluent-tag-search-24-regular.js +3 -4
  294. package/dist/icons/generated/fluent-tag-search-24-regular.js.map +1 -1
  295. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts +5 -4
  296. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts.map +1 -0
  297. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js +3 -4
  298. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js.map +1 -1
  299. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts +5 -4
  300. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts.map +1 -0
  301. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js +3 -4
  302. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js.map +1 -1
  303. package/dist/icons/generated/heroicons-check-16-solid.d.ts +5 -4
  304. package/dist/icons/generated/heroicons-check-16-solid.d.ts.map +1 -0
  305. package/dist/icons/generated/heroicons-check-16-solid.js +3 -4
  306. package/dist/icons/generated/heroicons-check-16-solid.js.map +1 -1
  307. package/dist/icons/generated/heroicons-x-mark-16-solid.d.ts +5 -4
  308. package/dist/icons/generated/heroicons-x-mark-16-solid.d.ts.map +1 -0
  309. package/dist/icons/generated/heroicons-x-mark-16-solid.js +3 -4
  310. package/dist/icons/generated/heroicons-x-mark-16-solid.js.map +1 -1
  311. package/dist/icons/generated/jam-close-circle-f.d.ts +7 -6
  312. package/dist/icons/generated/jam-close-circle-f.d.ts.map +1 -0
  313. package/dist/icons/generated/jam-close-circle-f.js +3 -4
  314. package/dist/icons/generated/jam-close-circle-f.js.map +1 -1
  315. package/dist/icons/generated/lucide-arrow-down-to-line.d.ts +5 -4
  316. package/dist/icons/generated/lucide-arrow-down-to-line.d.ts.map +1 -0
  317. package/dist/icons/generated/lucide-arrow-down-to-line.js +3 -4
  318. package/dist/icons/generated/lucide-arrow-down-to-line.js.map +1 -1
  319. package/dist/icons/generated/lucide-arrow-up-to-line.d.ts +5 -4
  320. package/dist/icons/generated/lucide-arrow-up-to-line.d.ts.map +1 -0
  321. package/dist/icons/generated/lucide-arrow-up-to-line.js +3 -4
  322. package/dist/icons/generated/lucide-arrow-up-to-line.js.map +1 -1
  323. package/dist/icons/generated/lucide-bell.d.ts +5 -4
  324. package/dist/icons/generated/lucide-bell.d.ts.map +1 -0
  325. package/dist/icons/generated/lucide-bell.js +3 -4
  326. package/dist/icons/generated/lucide-bell.js.map +1 -1
  327. package/dist/icons/generated/lucide-check.d.ts +5 -4
  328. package/dist/icons/generated/lucide-check.d.ts.map +1 -0
  329. package/dist/icons/generated/lucide-check.js +3 -4
  330. package/dist/icons/generated/lucide-check.js.map +1 -1
  331. package/dist/icons/generated/lucide-chevron-down.d.ts +5 -4
  332. package/dist/icons/generated/lucide-chevron-down.d.ts.map +1 -0
  333. package/dist/icons/generated/lucide-chevron-down.js +3 -4
  334. package/dist/icons/generated/lucide-chevron-down.js.map +1 -1
  335. package/dist/icons/generated/lucide-chevron-left.d.ts +5 -4
  336. package/dist/icons/generated/lucide-chevron-left.d.ts.map +1 -0
  337. package/dist/icons/generated/lucide-chevron-left.js +3 -4
  338. package/dist/icons/generated/lucide-chevron-left.js.map +1 -1
  339. package/dist/icons/generated/lucide-chevron-right.d.ts +5 -4
  340. package/dist/icons/generated/lucide-chevron-right.d.ts.map +1 -0
  341. package/dist/icons/generated/lucide-chevron-right.js +3 -4
  342. package/dist/icons/generated/lucide-chevron-right.js.map +1 -1
  343. package/dist/icons/generated/lucide-chevron-up.d.ts +5 -4
  344. package/dist/icons/generated/lucide-chevron-up.d.ts.map +1 -0
  345. package/dist/icons/generated/lucide-chevron-up.js +3 -4
  346. package/dist/icons/generated/lucide-chevron-up.js.map +1 -1
  347. package/dist/icons/generated/lucide-circle-alert.d.ts +5 -4
  348. package/dist/icons/generated/lucide-circle-alert.d.ts.map +1 -0
  349. package/dist/icons/generated/lucide-circle-alert.js +3 -4
  350. package/dist/icons/generated/lucide-circle-alert.js.map +1 -1
  351. package/dist/icons/generated/lucide-clapperboard.d.ts +5 -4
  352. package/dist/icons/generated/lucide-clapperboard.d.ts.map +1 -0
  353. package/dist/icons/generated/lucide-clapperboard.js +3 -4
  354. package/dist/icons/generated/lucide-clapperboard.js.map +1 -1
  355. package/dist/icons/generated/lucide-clipboard-paste.d.ts +5 -4
  356. package/dist/icons/generated/lucide-clipboard-paste.d.ts.map +1 -0
  357. package/dist/icons/generated/lucide-clipboard-paste.js +3 -4
  358. package/dist/icons/generated/lucide-clipboard-paste.js.map +1 -1
  359. package/dist/icons/generated/lucide-code.d.ts +5 -4
  360. package/dist/icons/generated/lucide-code.d.ts.map +1 -0
  361. package/dist/icons/generated/lucide-code.js +3 -4
  362. package/dist/icons/generated/lucide-code.js.map +1 -1
  363. package/dist/icons/generated/lucide-copy.d.ts +5 -4
  364. package/dist/icons/generated/lucide-copy.d.ts.map +1 -0
  365. package/dist/icons/generated/lucide-copy.js +3 -4
  366. package/dist/icons/generated/lucide-copy.js.map +1 -1
  367. package/dist/icons/generated/lucide-download.d.ts +5 -4
  368. package/dist/icons/generated/lucide-download.d.ts.map +1 -0
  369. package/dist/icons/generated/lucide-download.js +3 -4
  370. package/dist/icons/generated/lucide-download.js.map +1 -1
  371. package/dist/icons/generated/lucide-ellipsis-vertical.d.ts +5 -4
  372. package/dist/icons/generated/lucide-ellipsis-vertical.d.ts.map +1 -0
  373. package/dist/icons/generated/lucide-ellipsis-vertical.js +3 -4
  374. package/dist/icons/generated/lucide-ellipsis-vertical.js.map +1 -1
  375. package/dist/icons/generated/lucide-external-link.d.ts +5 -4
  376. package/dist/icons/generated/lucide-external-link.d.ts.map +1 -0
  377. package/dist/icons/generated/lucide-external-link.js +3 -4
  378. package/dist/icons/generated/lucide-external-link.js.map +1 -1
  379. package/dist/icons/generated/lucide-eye.d.ts +5 -4
  380. package/dist/icons/generated/lucide-eye.d.ts.map +1 -0
  381. package/dist/icons/generated/lucide-eye.js +3 -4
  382. package/dist/icons/generated/lucide-eye.js.map +1 -1
  383. package/dist/icons/generated/lucide-file-text.d.ts +5 -4
  384. package/dist/icons/generated/lucide-file-text.d.ts.map +1 -0
  385. package/dist/icons/generated/lucide-file-text.js +3 -4
  386. package/dist/icons/generated/lucide-file-text.js.map +1 -1
  387. package/dist/icons/generated/lucide-file.d.ts +5 -4
  388. package/dist/icons/generated/lucide-file.d.ts.map +1 -0
  389. package/dist/icons/generated/lucide-file.js +3 -4
  390. package/dist/icons/generated/lucide-file.js.map +1 -1
  391. package/dist/icons/generated/lucide-film.d.ts +5 -4
  392. package/dist/icons/generated/lucide-film.d.ts.map +1 -0
  393. package/dist/icons/generated/lucide-film.js +3 -4
  394. package/dist/icons/generated/lucide-film.js.map +1 -1
  395. package/dist/icons/generated/lucide-folder-open.d.ts +5 -4
  396. package/dist/icons/generated/lucide-folder-open.d.ts.map +1 -0
  397. package/dist/icons/generated/lucide-folder-open.js +3 -4
  398. package/dist/icons/generated/lucide-folder-open.js.map +1 -1
  399. package/dist/icons/generated/lucide-folder.d.ts +5 -4
  400. package/dist/icons/generated/lucide-folder.d.ts.map +1 -0
  401. package/dist/icons/generated/lucide-folder.js +3 -4
  402. package/dist/icons/generated/lucide-folder.js.map +1 -1
  403. package/dist/icons/generated/lucide-globe.d.ts +5 -4
  404. package/dist/icons/generated/lucide-globe.d.ts.map +1 -0
  405. package/dist/icons/generated/lucide-globe.js +3 -4
  406. package/dist/icons/generated/lucide-globe.js.map +1 -1
  407. package/dist/icons/generated/lucide-headphones.d.ts +5 -4
  408. package/dist/icons/generated/lucide-headphones.d.ts.map +1 -0
  409. package/dist/icons/generated/lucide-headphones.js +3 -4
  410. package/dist/icons/generated/lucide-headphones.js.map +1 -1
  411. package/dist/icons/generated/lucide-heart.d.ts +5 -4
  412. package/dist/icons/generated/lucide-heart.d.ts.map +1 -0
  413. package/dist/icons/generated/lucide-heart.js +3 -4
  414. package/dist/icons/generated/lucide-heart.js.map +1 -1
  415. package/dist/icons/generated/lucide-image.d.ts +5 -4
  416. package/dist/icons/generated/lucide-image.d.ts.map +1 -0
  417. package/dist/icons/generated/lucide-image.js +3 -4
  418. package/dist/icons/generated/lucide-image.js.map +1 -1
  419. package/dist/icons/generated/lucide-inbox.d.ts +5 -4
  420. package/dist/icons/generated/lucide-inbox.d.ts.map +1 -0
  421. package/dist/icons/generated/lucide-inbox.js +3 -4
  422. package/dist/icons/generated/lucide-inbox.js.map +1 -1
  423. package/dist/icons/generated/lucide-info.d.ts +5 -4
  424. package/dist/icons/generated/lucide-info.d.ts.map +1 -0
  425. package/dist/icons/generated/lucide-info.js +3 -4
  426. package/dist/icons/generated/lucide-info.js.map +1 -1
  427. package/dist/icons/generated/lucide-layout-grid.d.ts +5 -4
  428. package/dist/icons/generated/lucide-layout-grid.d.ts.map +1 -0
  429. package/dist/icons/generated/lucide-layout-grid.js +3 -4
  430. package/dist/icons/generated/lucide-layout-grid.js.map +1 -1
  431. package/dist/icons/generated/lucide-link.d.ts +5 -4
  432. package/dist/icons/generated/lucide-link.d.ts.map +1 -0
  433. package/dist/icons/generated/lucide-link.js +3 -4
  434. package/dist/icons/generated/lucide-link.js.map +1 -1
  435. package/dist/icons/generated/lucide-list-filter.d.ts +5 -4
  436. package/dist/icons/generated/lucide-list-filter.d.ts.map +1 -0
  437. package/dist/icons/generated/lucide-list-filter.js +3 -4
  438. package/dist/icons/generated/lucide-list-filter.js.map +1 -1
  439. package/dist/icons/generated/lucide-list-restart.d.ts +5 -4
  440. package/dist/icons/generated/lucide-list-restart.d.ts.map +1 -0
  441. package/dist/icons/generated/lucide-list-restart.js +3 -4
  442. package/dist/icons/generated/lucide-list-restart.js.map +1 -1
  443. package/dist/icons/generated/lucide-loader-circle.d.ts +5 -4
  444. package/dist/icons/generated/lucide-loader-circle.d.ts.map +1 -0
  445. package/dist/icons/generated/lucide-loader-circle.js +3 -4
  446. package/dist/icons/generated/lucide-loader-circle.js.map +1 -1
  447. package/dist/icons/generated/lucide-mail.d.ts +5 -4
  448. package/dist/icons/generated/lucide-mail.d.ts.map +1 -0
  449. package/dist/icons/generated/lucide-mail.js +3 -4
  450. package/dist/icons/generated/lucide-mail.js.map +1 -1
  451. package/dist/icons/generated/lucide-minus.d.ts +5 -4
  452. package/dist/icons/generated/lucide-minus.d.ts.map +1 -0
  453. package/dist/icons/generated/lucide-minus.js +3 -4
  454. package/dist/icons/generated/lucide-minus.js.map +1 -1
  455. package/dist/icons/generated/lucide-music.d.ts +5 -4
  456. package/dist/icons/generated/lucide-music.d.ts.map +1 -0
  457. package/dist/icons/generated/lucide-music.js +3 -4
  458. package/dist/icons/generated/lucide-music.js.map +1 -1
  459. package/dist/icons/generated/lucide-package.d.ts +5 -4
  460. package/dist/icons/generated/lucide-package.d.ts.map +1 -0
  461. package/dist/icons/generated/lucide-package.js +3 -4
  462. package/dist/icons/generated/lucide-package.js.map +1 -1
  463. package/dist/icons/generated/lucide-pen-line.d.ts +5 -4
  464. package/dist/icons/generated/lucide-pen-line.d.ts.map +1 -0
  465. package/dist/icons/generated/lucide-pen-line.js +3 -4
  466. package/dist/icons/generated/lucide-pen-line.js.map +1 -1
  467. package/dist/icons/generated/lucide-pencil.d.ts +5 -4
  468. package/dist/icons/generated/lucide-pencil.d.ts.map +1 -0
  469. package/dist/icons/generated/lucide-pencil.js +3 -4
  470. package/dist/icons/generated/lucide-pencil.js.map +1 -1
  471. package/dist/icons/generated/lucide-play.d.ts +5 -4
  472. package/dist/icons/generated/lucide-play.d.ts.map +1 -0
  473. package/dist/icons/generated/lucide-play.js +3 -4
  474. package/dist/icons/generated/lucide-play.js.map +1 -1
  475. package/dist/icons/generated/lucide-plus.d.ts +5 -4
  476. package/dist/icons/generated/lucide-plus.d.ts.map +1 -0
  477. package/dist/icons/generated/lucide-plus.js +3 -4
  478. package/dist/icons/generated/lucide-plus.js.map +1 -1
  479. package/dist/icons/generated/lucide-printer.d.ts +5 -4
  480. package/dist/icons/generated/lucide-printer.d.ts.map +1 -0
  481. package/dist/icons/generated/lucide-printer.js +3 -4
  482. package/dist/icons/generated/lucide-printer.js.map +1 -1
  483. package/dist/icons/generated/lucide-redo-2.d.ts +5 -4
  484. package/dist/icons/generated/lucide-redo-2.d.ts.map +1 -0
  485. package/dist/icons/generated/lucide-redo-2.js +3 -4
  486. package/dist/icons/generated/lucide-redo-2.js.map +1 -1
  487. package/dist/icons/generated/lucide-refresh-cw.d.ts +5 -4
  488. package/dist/icons/generated/lucide-refresh-cw.d.ts.map +1 -0
  489. package/dist/icons/generated/lucide-refresh-cw.js +3 -4
  490. package/dist/icons/generated/lucide-refresh-cw.js.map +1 -1
  491. package/dist/icons/generated/lucide-scissors.d.ts +5 -4
  492. package/dist/icons/generated/lucide-scissors.d.ts.map +1 -0
  493. package/dist/icons/generated/lucide-scissors.js +3 -4
  494. package/dist/icons/generated/lucide-scissors.js.map +1 -1
  495. package/dist/icons/generated/lucide-search.d.ts +5 -4
  496. package/dist/icons/generated/lucide-search.d.ts.map +1 -0
  497. package/dist/icons/generated/lucide-search.js +3 -4
  498. package/dist/icons/generated/lucide-search.js.map +1 -1
  499. package/dist/icons/generated/lucide-settings.d.ts +5 -4
  500. package/dist/icons/generated/lucide-settings.d.ts.map +1 -0
  501. package/dist/icons/generated/lucide-settings.js +3 -4
  502. package/dist/icons/generated/lucide-settings.js.map +1 -1
  503. package/dist/icons/generated/lucide-sliders-horizontal.d.ts +5 -4
  504. package/dist/icons/generated/lucide-sliders-horizontal.d.ts.map +1 -0
  505. package/dist/icons/generated/lucide-sliders-horizontal.js +3 -4
  506. package/dist/icons/generated/lucide-sliders-horizontal.js.map +1 -1
  507. package/dist/icons/generated/lucide-star.d.ts +5 -4
  508. package/dist/icons/generated/lucide-star.d.ts.map +1 -0
  509. package/dist/icons/generated/lucide-star.js +3 -4
  510. package/dist/icons/generated/lucide-star.js.map +1 -1
  511. package/dist/icons/generated/lucide-tag.d.ts +5 -4
  512. package/dist/icons/generated/lucide-tag.d.ts.map +1 -0
  513. package/dist/icons/generated/lucide-tag.js +3 -4
  514. package/dist/icons/generated/lucide-tag.js.map +1 -1
  515. package/dist/icons/generated/lucide-tags.d.ts +5 -4
  516. package/dist/icons/generated/lucide-tags.d.ts.map +1 -0
  517. package/dist/icons/generated/lucide-tags.js +3 -4
  518. package/dist/icons/generated/lucide-tags.js.map +1 -1
  519. package/dist/icons/generated/lucide-trash-2.d.ts +5 -4
  520. package/dist/icons/generated/lucide-trash-2.d.ts.map +1 -0
  521. package/dist/icons/generated/lucide-trash-2.js +3 -4
  522. package/dist/icons/generated/lucide-trash-2.js.map +1 -1
  523. package/dist/icons/generated/lucide-triangle-alert.d.ts +5 -4
  524. package/dist/icons/generated/lucide-triangle-alert.d.ts.map +1 -0
  525. package/dist/icons/generated/lucide-triangle-alert.js +3 -4
  526. package/dist/icons/generated/lucide-triangle-alert.js.map +1 -1
  527. package/dist/icons/generated/lucide-undo-2.d.ts +5 -4
  528. package/dist/icons/generated/lucide-undo-2.d.ts.map +1 -0
  529. package/dist/icons/generated/lucide-undo-2.js +3 -4
  530. package/dist/icons/generated/lucide-undo-2.js.map +1 -1
  531. package/dist/icons/generated/lucide-upload.d.ts +5 -4
  532. package/dist/icons/generated/lucide-upload.d.ts.map +1 -0
  533. package/dist/icons/generated/lucide-upload.js +3 -4
  534. package/dist/icons/generated/lucide-upload.js.map +1 -1
  535. package/dist/icons/generated/lucide-user.d.ts +5 -4
  536. package/dist/icons/generated/lucide-user.d.ts.map +1 -0
  537. package/dist/icons/generated/lucide-user.js +3 -4
  538. package/dist/icons/generated/lucide-user.js.map +1 -1
  539. package/dist/icons/generated/lucide-wrench.d.ts +5 -4
  540. package/dist/icons/generated/lucide-wrench.d.ts.map +1 -0
  541. package/dist/icons/generated/lucide-wrench.js +3 -4
  542. package/dist/icons/generated/lucide-wrench.js.map +1 -1
  543. package/dist/icons/generated/lucide-x.d.ts +5 -4
  544. package/dist/icons/generated/lucide-x.d.ts.map +1 -0
  545. package/dist/icons/generated/lucide-x.js +3 -4
  546. package/dist/icons/generated/lucide-x.js.map +1 -1
  547. package/dist/icons/generated/mdi-tag-search-outline.d.ts +5 -4
  548. package/dist/icons/generated/mdi-tag-search-outline.d.ts.map +1 -0
  549. package/dist/icons/generated/mdi-tag-search-outline.js +3 -4
  550. package/dist/icons/generated/mdi-tag-search-outline.js.map +1 -1
  551. package/dist/icons/generated/ooui-close.d.ts +5 -4
  552. package/dist/icons/generated/ooui-close.d.ts.map +1 -0
  553. package/dist/icons/generated/ooui-close.js +3 -4
  554. package/dist/icons/generated/ooui-close.js.map +1 -1
  555. package/dist/icons/generated/radix-icons-panel-left-minimized.d.ts +5 -4
  556. package/dist/icons/generated/radix-icons-panel-left-minimized.d.ts.map +1 -0
  557. package/dist/icons/generated/radix-icons-panel-left-minimized.js +3 -4
  558. package/dist/icons/generated/radix-icons-panel-left-minimized.js.map +1 -1
  559. package/dist/icons/generated/radix-icons-reset.d.ts +5 -4
  560. package/dist/icons/generated/radix-icons-reset.d.ts.map +1 -0
  561. package/dist/icons/generated/radix-icons-reset.js +3 -4
  562. package/dist/icons/generated/radix-icons-reset.js.map +1 -1
  563. package/dist/icons/generated/tabler-sort-ascending-letters.d.ts +5 -4
  564. package/dist/icons/generated/tabler-sort-ascending-letters.d.ts.map +1 -0
  565. package/dist/icons/generated/tabler-sort-ascending-letters.js +3 -4
  566. package/dist/icons/generated/tabler-sort-ascending-letters.js.map +1 -1
  567. package/dist/icons/index.d.ts +75 -74
  568. package/dist/icons/index.js +75 -75
  569. package/dist/shared/element-height/index.js +51 -25
  570. package/dist/shared/element-height/index.js.map +1 -1
  571. package/dist/shared/element-width/index.js +39 -24
  572. package/dist/shared/element-width/index.js.map +1 -1
  573. package/dist/shared/events/user-change.js +14 -8
  574. package/dist/shared/events/user-change.js.map +1 -1
  575. package/dist/shared/focus/pointer-focus.js +56 -30
  576. package/dist/shared/focus/pointer-focus.js.map +1 -1
  577. package/dist/shared/focus/tabbable.js +96 -0
  578. package/dist/shared/focus/tabbable.js.map +1 -0
  579. package/dist/shared/form-association/field-id.js +13 -6
  580. package/dist/shared/form-association/field-id.js.map +1 -1
  581. package/dist/shared/form-association/index.js +75 -42
  582. package/dist/shared/form-association/index.js.map +1 -1
  583. package/dist/shared/gesture/drag-gesture.js +239 -99
  584. package/dist/shared/gesture/drag-gesture.js.map +1 -1
  585. package/dist/shared/gesture/physics.js +49 -16
  586. package/dist/shared/gesture/physics.js.map +1 -1
  587. package/dist/shared/gesture/pinch-gesture.js +111 -60
  588. package/dist/shared/gesture/pinch-gesture.js.map +1 -1
  589. package/dist/shared/group-management/index.js +181 -84
  590. package/dist/shared/group-management/index.js.map +1 -1
  591. package/dist/shared/label-emptiness/index.js +45 -26
  592. package/dist/shared/label-emptiness/index.js.map +1 -1
  593. package/dist/shared/locale/builtin-labels.js +38 -0
  594. package/dist/shared/locale/builtin-labels.js.map +1 -0
  595. package/dist/shared/menu-behavior/index.js +113 -60
  596. package/dist/shared/menu-behavior/index.js.map +1 -1
  597. package/dist/shared/menu-portal/menu-portal.js +47 -26
  598. package/dist/shared/menu-portal/menu-portal.js.map +1 -1
  599. package/dist/shared/menu-portal/menu-tree.js +132 -75
  600. package/dist/shared/menu-portal/menu-tree.js.map +1 -1
  601. package/dist/shared/normalize/index.js +16 -7
  602. package/dist/shared/normalize/index.js.map +1 -1
  603. package/dist/shared/open-state/index.js +7 -8
  604. package/dist/shared/open-state/index.js.map +1 -1
  605. package/dist/shared/option-portal/combobox-shell.js +121 -56
  606. package/dist/shared/option-portal/combobox-shell.js.map +1 -1
  607. package/dist/shared/option-portal/index.js +65 -44
  608. package/dist/shared/option-portal/index.js.map +1 -1
  609. package/dist/shared/overlay/anchored-panel.js +75 -40
  610. package/dist/shared/overlay/anchored-panel.js.map +1 -1
  611. package/dist/shared/overlay/native-dialog-presence.js +116 -52
  612. package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
  613. package/dist/shared/overlay/nested-drawer-layers.js +76 -46
  614. package/dist/shared/overlay/nested-drawer-layers.js.map +1 -1
  615. package/dist/shared/overlay/open-overlay.js +240 -136
  616. package/dist/shared/overlay/open-overlay.js.map +1 -1
  617. package/dist/shared/overlay/overlay-root.js +33 -24
  618. package/dist/shared/overlay/overlay-root.js.map +1 -1
  619. package/dist/shared/overlay/overlay.js +109 -66
  620. package/dist/shared/overlay/overlay.js.map +1 -1
  621. package/dist/shared/overlay/placement-props.js +9 -4
  622. package/dist/shared/overlay/placement-props.js.map +1 -1
  623. package/dist/shared/overlay/portal.d.ts +2 -0
  624. package/dist/shared/overlay/portal.d.ts.map +1 -0
  625. package/dist/shared/overlay/portal.js +202 -117
  626. package/dist/shared/overlay/portal.js.map +1 -1
  627. package/dist/shared/overlay/positioning-generation.js +9 -10
  628. package/dist/shared/overlay/positioning-generation.js.map +1 -1
  629. package/dist/shared/overlay/presence.js +43 -21
  630. package/dist/shared/overlay/presence.js.map +1 -1
  631. package/dist/shared/overlay/theme-overlay-scope.js +22 -19
  632. package/dist/shared/overlay/theme-overlay-scope.js.map +1 -1
  633. package/dist/shared/scroll-lock/scroll-lock.js +49 -15
  634. package/dist/shared/scroll-lock/scroll-lock.js.map +1 -1
  635. package/dist/shared/theme/duration.js +13 -6
  636. package/dist/shared/theme/duration.js.map +1 -1
  637. package/dist/shared/theme/reduced-motion.js +14 -9
  638. package/dist/shared/theme/reduced-motion.js.map +1 -1
  639. package/dist/shared/theme/root-sync.js +85 -32
  640. package/dist/shared/theme/root-sync.js.map +1 -1
  641. package/dist/shared/visible-area/index.js +81 -37
  642. package/dist/shared/visible-area/index.js.map +1 -1
  643. package/dist/types/iconify.d.ts +1 -1
  644. package/dist/types/iconify.js +0 -0
  645. package/dist/types/react.d.ts +8 -10
  646. package/dist/types/react.d.ts.map +1 -0
  647. package/dist/types/react.js +0 -0
  648. package/dist/types/utils.d.ts +8 -13
  649. package/dist/types/utils.d.ts.map +1 -0
  650. package/dist/types/utils.js +0 -0
  651. package/dist/types/vue.d.ts +9 -13
  652. package/dist/types/vue.d.ts.map +1 -0
  653. package/dist/types/vue.js +0 -0
  654. package/dist/vite/index.d.ts +1 -0
  655. package/dist/vite/index.d.ts.map +1 -0
  656. package/dist/vite/index.js +30 -4
  657. package/dist/vite/index.js.map +1 -1
  658. package/package.json +10 -23
  659. package/dist/_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js +0 -9
  660. package/dist/components/middle-ellipsis/truncate.d.ts +0 -62
  661. package/dist/components/radio/interaction.d.ts +0 -4
  662. package/dist/scrollbars/index.d.ts +0 -33
  663. package/dist/scrollbars/index.js +0 -18
  664. package/dist/scrollbars/index.js.map +0 -1
  665. package/dist/scrollbars/internal.js +0 -6
  666. package/dist/scrollbars/internal.js.map +0 -1
  667. package/dist/scrollbars/style.css +0 -10
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/segmented/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport glass from '@/classes/glass.css?inline'\nimport { installPointerFocusSuppression } from '@/shared/focus/pointer-focus'\nimport { FormAssociated, defineFormAssociation, FormAssociationController } from '@/shared/form-association'\nimport { attachDragGesture, type DragGestureHandle } from '@/shared/gesture/drag-gesture'\nimport { clamp, snapToNearest } from '@/shared/gesture/physics'\nimport { defineGroupCoordinator, GroupController } from '@/shared/group-management'\nimport { normalizeLiteral } from '@/shared/normalize'\nimport { parseDuration } from '@/shared/theme/duration'\n\nimport type { WebUiSegmentedTrigger } from '../segmented-trigger'\n\nimport style from './style.css?inline'\n\ninstallPointerFocusSuppression()\n\nconst ALLOWED_VARIANTS = ['inset', 'raised'] as const\n\n/*\n * indicator 移动时长取 `--wui-duration-trigger`,与 CSS 里 left / width 那两条 transition 同一个值。\n * 读不到 token 或格式不符时兜底 160(CSS 的 fallback 同值),负值钳到 0。\n *\n * reduced-motion 下不需要额外分支:theme 已把该 token 归零,settle 窗口随之变成 0,\n * 落定门自动退化成「每一步都直接落定」,而那本来就是 0ms 过渡的观感。\n */\nfunction triggerDuration(el: HTMLElement): number {\n const parsed = parseDuration(getComputedStyle(el).getPropertyValue('--wui-duration-trigger'))\n return parsed === null ? 160 : Math.max(0, parsed)\n}\n\nfunction findSelectedTriggerByValue(\n triggers: Iterable<WebUiSegmentedTrigger>,\n value: string\n): WebUiSegmentedTrigger | undefined {\n if (!value) return undefined\n\n let selected: WebUiSegmentedTrigger | undefined\n for (const trigger of triggers) {\n if (trigger.value !== value) continue\n if (!selected) selected = trigger\n if (trigger.checked) return trigger\n }\n return selected\n}\n\n@customElement('web-ui-segmented')\nexport class WebUiSegmented extends FormAssociated(LitElement) {\n // track 是不透明实体面:底色取 surface(浅色即 page,深色即 surface-raised 档)、无\n // backdrop blur,描边环与投影仍由\n // .wui-glass 提供且全状态同值;indicator 恒挂同一配方,静止态由 surface-segmented 实色\n // 盖住玻璃输出,按压与拖拽态才透出玻璃。\n // variant=\"raised\" 切回经典形态:flat 灰 track(surface-segmented-track、无环无投影)+\n // 实体 indicator(surface-selected + 柔投影;两档下这枚都与 page 同色,深色靠 track 沉到 page 之下),\n // 按压/拖拽态两变体同为透明玻璃;\n // 视觉差异全部由 :host([variant=...]) 规则承载,见 style.css。\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n @property({ type: String, reflect: true }) name = ''\n\n @property({ type: String, reflect: true })\n get variant(): 'inset' | 'raised' {\n return this._variant\n }\n set variant(v: string) {\n const old = this._variant\n this._variant = normalizeLiteral(v, ALLOWED_VARIANTS, 'inset')\n this.requestUpdate('variant', old)\n }\n private _variant: 'inset' | 'raised' = 'inset'\n\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true }) required = false\n\n @state() private _value = ''\n @state() private _indicatorReady = false\n @state() private _settling = false\n @state() private _pressed = false\n @state() private _isDragging = false\n\n private _dragGestureHandle: DragGestureHandle | null = null\n /*\n * 飞行令牌 + 世代号(与 web-ui-theme 的 View Transition 飞行门同构)。\n *\n * 缺陷形态:indicator 的 left / width 带着 160ms 过渡,而快速连点会连着改 value。若每次改值\n * 都照常起一段过渡,第二段过渡要从**第一段的插值中途**重新起步——indicator 于是永远慢半拍,\n * 连点结束时还要再等一整轮才停到终值,与「已经选到第几项」对不上。\n *\n * 门的作用:上一段移动还在飞行时到达的新值**直接落定**——不排队、不重启插值。\n * 落定这一趟自己也要占一段飞行窗口,否则第三次连点又会在落定途中起一段新过渡。\n * 世代号用来丢弃过期回调:窗口到期时若已经有更新的飞行在跑(快速连点会连开窗口),\n * 旧定时器只能提前退出,否则它会把新一轮的落定状态一并清掉、门形同虚设。\n */\n private _settleFlight: object | null = null\n private _settleRequest = 0\n private _settleTimer: number | undefined\n\n override connectedCallback() {\n super.connectedCallback()\n // HTML 解析可先连接 group、后 upgrade trigger;等子项定义完成后再核对一次选中态。\n void customElements.whenDefined('web-ui-segmented-trigger').then(async () => {\n if (!this.isConnected) return\n const triggers = [...this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')]\n // 等待 upgrade 时触发的首轮 Lit 更新完成,再修正连接期间写入的旧值。\n await Promise.all(triggers.map(trigger => trigger.updateComplete))\n if (this.isConnected) this._groupController.sync()\n })\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this._dragGestureHandle?.destroy()\n this._dragGestureHandle = null\n clearTimeout(this._settleTimer)\n this._settleTimer = undefined\n }\n\n private readonly _groupController = new GroupController(\n this,\n defineGroupCoordinator<WebUiSegmentedTrigger, string>({\n host: this,\n getItems: () => [...this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')],\n getValue: () => this._value,\n setValue: value => {\n this.value = value\n },\n getDisabled: () => this._isDisabled,\n isItem: (target): target is WebUiSegmentedTrigger =>\n target instanceof HTMLElement && target.matches('web-ui-segmented-trigger'),\n isItemSelected: (trigger, value) =>\n trigger ===\n findSelectedTriggerByValue(this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger'), value),\n isItemTabStop: (trigger, triggers) => {\n const enabled = triggers.filter(item => !item.disabled)\n const selected = findSelectedTriggerByValue(triggers, this._value)\n const tabStop = selected && !selected.disabled ? selected : enabled[0]\n return trigger === tabStop\n },\n getItemSelected: trigger => trigger.checked,\n getNextValue: (trigger, value) => (trigger.checked ? trigger.value : value),\n valuesEqual: (a, b) => a === b,\n copyValue: value => value,\n setItemSelected: (trigger, selected) => {\n trigger.checked = selected\n },\n resyncOnUnchangedValue: selected => {\n for (const trigger of this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')) {\n trigger.checked = trigger === selected\n }\n this._groupController.sync()\n requestAnimationFrame(() => void this._updateIndicator())\n },\n dispatchValueChange: () => {\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n }).make(),\n {\n observeAttributes: ['disabled'],\n afterSync: () => requestAnimationFrame(() => void this._updateIndicator())\n }\n )\n\n get value(): string {\n return this._value\n }\n\n set value(v: string) {\n const old = this._value\n this._value = v\n this._formAssociation.sync()\n this.requestUpdate('value', old)\n }\n\n private get _isDisabled(): boolean {\n return this.disabled || this._formAssociation.isFormDisabled()\n }\n\n private async _updateIndicator() {\n const triggers = this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')\n let left = 0\n let width = 0\n const selectedTrigger = findSelectedTriggerByValue(triggers, this._value)\n if (selectedTrigger) {\n const triggerRect = selectedTrigger.getBoundingClientRect()\n const groupRect = this.getBoundingClientRect()\n left = triggerRect.left - groupRect.left\n width = triggerRect.width\n }\n\n // 上一段移动还在飞行 → 这次直接落定(_settling 关掉 left / width 过渡,见 style.css)。\n // 落定这一趟自己也要占飞行窗口,所以放在写定位**之前**开窗:窗口一开,第三次连点\n // 落到的仍是本趟的终值,而不是一个刚起步的插值。\n //\n // 首帧定位不开窗:那是初始化而不是一次「移动」,没有前一段飞行可言。开了窗反而会让\n // 「挂载后 160ms 内的第一次点击」直接落定——那次点击本该是用户看到的第一段动画。\n const landing = this._indicatorReady ? this._openSettleFlight() : false\n\n /*\n * 落定这一趟必须等 `.is-settling` 真的进了 DOM 再写定位。\n *\n * `_settling` 是 Lit 的 reactive state:`classMap` 要等一次异步更新才落到元素上,而\n * `--indicator-left` 是同步写的内联样式。顺序反了的话就是「先改位置、过渡仍开着、\n * 下一帧才补上关过渡的 class」——浏览器已经按插值起跑,异步补上的 class 只是把一段\n * 插值中途掐掉,落定表现为一次跳变而不是直接落定,且掐在哪一帧取决于调度。\n */\n if (landing) await this.updateComplete\n\n this.style.setProperty('--indicator-left', `${left}px`)\n this.style.setProperty('--indicator-width', `${width}px`)\n\n // 首帧只完成定位:先把当前定位以「未启用 left/width transition」状态提交为 before 值,\n // 再打开移动动画。若同一趟里 set 定位与启用 transition,浏览器会把 0→option 当作一次过渡。\n if (!this._indicatorReady) {\n const indicator = this.renderRoot.querySelector<HTMLElement>('.wui-segmented-indicator')\n void indicator?.offsetWidth\n this._indicatorReady = true\n }\n }\n\n /*\n * 开一段飞行窗口:窗口内到达的改值一律落定,窗口到期才恢复插值过渡。\n *\n * 返回本次是否**落定**(飞行中到达的新值)。\n *\n * 时长取 `--wui-duration-trigger`(与 CSS 里 left / width 那两条过渡同一个值),所以\n * reduced-motion 下它就是 0ms——窗口立即到期,落定门自动退化成「每步都落定」,\n * 那正是 0ms 过渡本来的观感,不需要额外分支。\n *\n * 窗口每次改值都从零重开一整段时长(清掉旧定时器、世代号前进),而不是接着算剩余时长:\n * 剩余时长会让连续落定的窗口越缩越短,最后一次连点反倒拿到一段完整过渡——正是这个门\n * 要消除的那种观感。\n */\n private _openSettleFlight(): boolean {\n const wasFlying = this._settleTimer !== undefined\n const flight = {}\n this._settleFlight = flight\n const request = ++this._settleRequest\n clearTimeout(this._settleTimer)\n\n const duration = triggerDuration(this)\n if (duration === 0) {\n // 没有飞行就没有门可守:直接清掉落定态,让后续改值照常走 CSS 的过渡判定\n //(此时该过渡本身就是 0ms)。\n this._settleTimer = undefined\n this._settleFlight = null\n this._settling = false\n return false\n }\n\n // 已经在飞行中 → 这一趟是落定,保持落定态;否则是正常起一段过渡,先退出落定态。\n this._settling = wasFlying\n this._settleTimer = setTimeout(() => {\n this._settleTimer = undefined\n // 世代号校验:窗口被后续改值重开过,旧回调不得清掉新一轮的落定态。\n if (this._settleRequest !== request || this._settleFlight !== flight) return\n this._settleFlight = null\n this._settling = false\n }, duration)\n return wasFlying\n }\n\n private handlePointerDown(e: PointerEvent) {\n if (this._isDisabled) return\n const triggers = [...this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')]\n const enabledTriggers = triggers.filter(t => !t.disabled)\n if (enabledTriggers.length === 0) return\n\n const activeTrigger = findSelectedTriggerByValue(triggers, this._value)\n if (!activeTrigger || activeTrigger.disabled) return\n\n const activeTriggerRect = activeTrigger.getBoundingClientRect()\n const isPressedOnActive =\n e.clientX >= activeTriggerRect.left &&\n e.clientX <= activeTriggerRect.right &&\n e.clientY >= activeTriggerRect.top &&\n e.clientY <= activeTriggerRect.bottom\n\n if (!isPressedOnActive) return\n\n this._pressed = true\n\n const groupRect = this.getBoundingClientRect()\n const initialTriggerRect = activeTrigger.getBoundingClientRect()\n const initialLeft = initialTriggerRect.left - groupRect.left\n const initialWidth = initialTriggerRect.width\n // indicator 中心跟手:left 与宽度分开写(宽度取 hover 项的),中心才是稳定的那个量——\n // 宽度一变,center = left + width/2 就会漂,用它去选吸附目标会跟着抖。\n const initialCenter = initialLeft + initialWidth / 2\n\n const firstTriggerRect = triggers[0].getBoundingClientRect()\n const lastTriggerRect = triggers[triggers.length - 1].getBoundingClientRect()\n const minLeft = firstTriggerRect.left - groupRect.left\n const trackRight = lastTriggerRect.right - groupRect.left\n\n const enabledSlots = enabledTriggers.map(t => {\n const r = t.getBoundingClientRect()\n return { center: r.left - groupRect.left + r.width / 2, width: r.width }\n })\n const enabledCenters = enabledSlots.map(slot => slot.center)\n\n /*\n * 某一帧的 indicator 几何。\n *\n * 宽度跟随当前 hover 的可用项(#222):trigger 宽度不等是常态(interweave 设置\n * dialog 顶部即此形),宽度恒等于按下那一项会让 indicator 与它滑过的那项始终对不齐。\n * 取「离 indicator 中心最近的可用项」而不是「离指针最近的项」:松手吸附用的是同一个判据,\n * 于是拖拽中预览到的宽度就是松手会落到的那一项,不会在松手时二次变形。\n *\n * 宽度变了之后 maxLeft 必须跟着换算(`trackRight − width`),否则更宽的 indicator 会被\n * 钳在按初始宽度算出的位置上,从 track 右端探出去。\n *\n * 等宽时 width 恒为 initialWidth,`initialCenter + deltaX − initialWidth/2` 恒等于\n * `initialLeft + deltaX`,这一整套与改动前的逐字行为一致。\n */\n const frameAt = (deltaX: number) => {\n const center = initialCenter + deltaX\n const nearest = snapToNearest(center, enabledCenters)\n const width = nearest === -1 ? initialWidth : (enabledSlots[nearest]?.width ?? initialWidth)\n const left = clamp(center - width / 2, minLeft, trackRight - width)\n return { left, width, center: left + width / 2 }\n }\n\n this._dragGestureHandle?.destroy()\n this._dragGestureHandle = attachDragGesture(e, {\n axis: 'x',\n threshold: 6,\n onMove: info => {\n this._isDragging = true\n const { left, width } = frameAt(info.deltaX)\n this.style.setProperty('--indicator-left', `${left}px`)\n this.style.setProperty('--indicator-width', `${width}px`)\n },\n onEnd: info => {\n const wasDragging = this._isDragging\n this._isDragging = false\n this._pressed = false\n\n if (wasDragging) {\n const currentCenter = frameAt(info.deltaX).center\n\n let targetTrigger = activeTrigger\n if (info.velocityX > 300) {\n const currentIdx = enabledTriggers.indexOf(activeTrigger)\n if (currentIdx !== -1 && currentIdx < enabledTriggers.length - 1) {\n targetTrigger = enabledTriggers[currentIdx + 1]\n } else {\n targetTrigger = enabledTriggers[enabledTriggers.length - 1]\n }\n } else if (info.velocityX < -300) {\n const currentIdx = enabledTriggers.indexOf(activeTrigger)\n if (currentIdx > 0) {\n targetTrigger = enabledTriggers[currentIdx - 1]\n } else {\n targetTrigger = enabledTriggers[0]\n }\n } else {\n const nearestIdx = snapToNearest(currentCenter, enabledCenters)\n if (nearestIdx !== -1 && enabledTriggers[nearestIdx]) {\n targetTrigger = enabledTriggers[nearestIdx]\n }\n }\n\n if (targetTrigger.value !== this._value) {\n this.value = targetTrigger.value\n this._groupController.sync()\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n } else if (targetTrigger !== activeTrigger) {\n targetTrigger.shadowRoot?.querySelector<HTMLElement>('[role=\"option\"]')?.click()\n } else {\n void this._updateIndicator()\n }\n }\n this.requestUpdate()\n },\n onCancel: () => {\n this._isDragging = false\n this._pressed = false\n void this._updateIndicator()\n this.requestUpdate()\n }\n })\n }\n\n private handlePointerUp() {\n this._pressed = false\n }\n\n private handlePointerLeave() {\n if (!this._dragGestureHandle?.isDragging()) {\n this._pressed = false\n }\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n if (this._isDisabled || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return\n\n const current = event\n .composedPath()\n .find(\n (target): target is WebUiSegmentedTrigger =>\n target instanceof HTMLElement && target.matches('web-ui-segmented-trigger')\n )\n if (!current) return\n\n const triggers = [...this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')]\n const enabled = triggers.filter(trigger => !trigger.disabled)\n const currentIndex = triggers.indexOf(current)\n if (currentIndex === -1 || enabled.length === 0) return\n const direction = getComputedStyle(this).direction === 'rtl' ? -1 : 1\n\n const nextEnabled = (direction: -1 | 1): WebUiSegmentedTrigger => {\n for (let offset = 1; offset <= triggers.length; offset += 1) {\n const index = (currentIndex + direction * offset + triggers.length) % triggers.length\n const candidate = triggers[index]\n if (candidate && !candidate.disabled) return candidate\n }\n return current\n }\n\n let next: WebUiSegmentedTrigger\n switch (event.key) {\n case 'ArrowRight':\n next = nextEnabled(direction)\n break\n case 'ArrowLeft':\n next = nextEnabled(direction === 1 ? -1 : 1)\n break\n case 'Home':\n next = enabled[0]\n break\n case 'End':\n next = enabled[enabled.length - 1]\n break\n default:\n return\n }\n\n const option = next.shadowRoot?.querySelector<HTMLElement>('[role=\"option\"]')\n if (!option) return\n\n event.preventDefault()\n option.focus()\n if (next !== current || !next.checked) option.click()\n }\n\n private readonly _formAssociation = defineFormAssociation<string>({\n host: this,\n initialize: () => {\n const attrValue = this.getAttribute('value')\n if (attrValue !== null && this._value === '') this._value = attrValue\n },\n getState: () => this._value,\n setState: value => {\n this.value = value\n },\n getFormValue: () => (this.name && this._value ? this._value : null),\n getFormState: () => this._value,\n restoreState: state => {\n if (typeof state === 'string') this.value = state\n }\n }).make()\n\n private readonly _formAssociationController = new FormAssociationController(this, this._formAssociation)\n\n override formDisabledCallback(disabled: boolean) {\n this._formAssociation.setDisabled(disabled)\n this._groupController.sync()\n }\n\n override render() {\n return html`\n <div\n class=${classMap({\n 'wui-glass': true,\n 'wui-segmented': true,\n 'is-disabled': this._isDisabled,\n 'is-pressed': this._pressed,\n 'is-dragging': this._isDragging,\n 'is-indicator-ready': this._indicatorReady,\n 'is-settling': this._settling\n })}\n role=\"listbox\"\n aria-orientation=\"horizontal\"\n @keydown=${this.handleKeyDown}\n @pointerdown=${this.handlePointerDown}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerUp}\n @pointerleave=${this.handlePointerLeave}\n >\n <span class=\"wui-glass wui-segmented-indicator\"></span>\n <slot></slot>\n </div>\n `\n }\n\n declare readonly $events: {\n input: Event\n change: Event\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-segmented': WebUiSegmented\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["glass","style"],"sources":["../../../src/components/segmented/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport glass from '@/classes/glass.css?inline'\nimport { installPointerFocusSuppression } from '@/shared/focus/pointer-focus'\nimport { FormAssociated, defineFormAssociation, FormAssociationController } from '@/shared/form-association'\nimport { attachDragGesture, type DragGestureHandle } from '@/shared/gesture/drag-gesture'\nimport { clamp, snapToNearest } from '@/shared/gesture/physics'\nimport { defineGroupCoordinator, GroupController } from '@/shared/group-management'\nimport { normalizeLiteral } from '@/shared/normalize'\nimport { parseDuration } from '@/shared/theme/duration'\n\nimport type { WebUiSegmentedTrigger } from '../segmented-trigger'\n\nimport style from './style.css?inline'\n\ninstallPointerFocusSuppression()\n\nconst ALLOWED_VARIANTS = ['inset', 'raised'] as const\n\n/*\n * indicator 移动时长取 `--wui-duration-trigger`,与 CSS 里 left / width 那两条 transition 同一个值。\n * 读不到 token 或格式不符时兜底 160(CSS 的 fallback 同值),负值钳到 0。\n *\n * reduced-motion 下不需要额外分支:theme 已把该 token 归零,settle 窗口随之变成 0,\n * 落定门自动退化成「每一步都直接落定」,而那本来就是 0ms 过渡的观感。\n */\nfunction triggerDuration(el: HTMLElement): number {\n const parsed = parseDuration(getComputedStyle(el).getPropertyValue('--wui-duration-trigger'))\n return parsed === null ? 160 : Math.max(0, parsed)\n}\n\nfunction findSelectedTriggerByValue(\n triggers: Iterable<WebUiSegmentedTrigger>,\n value: string\n): WebUiSegmentedTrigger | undefined {\n if (!value) return undefined\n\n let selected: WebUiSegmentedTrigger | undefined\n for (const trigger of triggers) {\n if (trigger.value !== value) continue\n if (!selected) selected = trigger\n if (trigger.checked) return trigger\n }\n return selected\n}\n\n@customElement('web-ui-segmented')\nexport class WebUiSegmented extends FormAssociated(LitElement) {\n // track 是不透明实体面:底色取 surface(浅色即 page,深色即 surface-raised 档)、无\n // backdrop blur,描边环与投影仍由\n // .wui-glass 提供且全状态同值;indicator 恒挂同一配方,静止态由 surface-segmented 实色\n // 盖住玻璃输出,按压与拖拽态才透出玻璃。\n // variant=\"raised\" 切回经典形态:flat 灰 track(surface-segmented-track、无环无投影)+\n // 实体 indicator(surface-selected + 柔投影;两档下这枚都与 page 同色,深色靠 track 沉到 page 之下),\n // 按压/拖拽态两变体同为透明玻璃;\n // 视觉差异全部由 :host([variant=...]) 规则承载,见 style.css。\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n @property({ type: String, reflect: true }) name = ''\n\n @property({ type: String, reflect: true })\n get variant(): 'inset' | 'raised' {\n return this._variant\n }\n set variant(v: string) {\n const old = this._variant\n this._variant = normalizeLiteral(v, ALLOWED_VARIANTS, 'inset')\n this.requestUpdate('variant', old)\n }\n private _variant: 'inset' | 'raised' = 'inset'\n\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true }) required = false\n\n /**\n * 内部 `role=\"listbox\"` 的可访问名称。分组语义的宿主在 light DOM,而 listbox 在 shadow DOM\n * 内部,宿主上的 `aria-label` 不会自动继承,必须显式转发。\n */\n @property({ type: String, attribute: 'aria-label' }) override ariaLabel: string | null = null\n\n @state() private _value = ''\n @state() private _indicatorReady = false\n @state() private _settling = false\n @state() private _pressed = false\n @state() private _isDragging = false\n\n private _dragGestureHandle: DragGestureHandle | null = null\n /*\n * 飞行令牌 + 世代号(与 web-ui-theme 的 View Transition 飞行门同构)。\n *\n * 缺陷形态:indicator 的 left / width 带着 160ms 过渡,而快速连点会连着改 value。若每次改值\n * 都照常起一段过渡,第二段过渡要从**第一段的插值中途**重新起步——indicator 于是永远慢半拍,\n * 连点结束时还要再等一整轮才停到终值,与「已经选到第几项」对不上。\n *\n * 门的作用:上一段移动还在飞行时到达的新值**直接落定**——不排队、不重启插值。\n * 落定这一趟自己也要占一段飞行窗口,否则第三次连点又会在落定途中起一段新过渡。\n * 世代号用来丢弃过期回调:窗口到期时若已经有更新的飞行在跑(快速连点会连开窗口),\n * 旧定时器只能提前退出,否则它会把新一轮的落定状态一并清掉、门形同虚设。\n */\n private _settleFlight: object | null = null\n private _settleRequest = 0\n private _settleTimer: number | undefined\n\n override connectedCallback() {\n super.connectedCallback()\n // HTML 解析可先连接 group、后 upgrade trigger;等子项定义完成后再核对一次选中态。\n void customElements.whenDefined('web-ui-segmented-trigger').then(async () => {\n if (!this.isConnected) return\n const triggers = [...this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')]\n // 等待 upgrade 时触发的首轮 Lit 更新完成,再修正连接期间写入的旧值。\n await Promise.all(triggers.map(trigger => trigger.updateComplete))\n if (this.isConnected) this._groupController.sync()\n })\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this._dragGestureHandle?.destroy()\n this._dragGestureHandle = null\n clearTimeout(this._settleTimer)\n this._settleTimer = undefined\n }\n\n private readonly _groupController = new GroupController(\n this,\n defineGroupCoordinator<WebUiSegmentedTrigger, string>({\n host: this,\n getItems: () => [...this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')],\n getValue: () => this._value,\n setValue: value => {\n this.value = value\n },\n getDisabled: () => this._isDisabled,\n isItem: (target): target is WebUiSegmentedTrigger =>\n target instanceof HTMLElement && target.matches('web-ui-segmented-trigger'),\n isItemSelected: (trigger, value) =>\n trigger ===\n findSelectedTriggerByValue(this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger'), value),\n isItemTabStop: (trigger, triggers) => {\n const enabled = triggers.filter(item => !item.disabled)\n const selected = findSelectedTriggerByValue(triggers, this._value)\n const tabStop = selected && !selected.disabled ? selected : enabled[0]\n return trigger === tabStop\n },\n getItemSelected: trigger => trigger.checked,\n getNextValue: (trigger, value) => (trigger.checked ? trigger.value : value),\n valuesEqual: (a, b) => a === b,\n copyValue: value => value,\n setItemSelected: (trigger, selected) => {\n trigger.checked = selected\n },\n resyncOnUnchangedValue: selected => {\n for (const trigger of this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')) {\n trigger.checked = trigger === selected\n }\n this._groupController.sync()\n requestAnimationFrame(() => void this._updateIndicator())\n },\n dispatchValueChange: () => {\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n }).make(),\n {\n observeAttributes: ['disabled'],\n afterSync: () => requestAnimationFrame(() => void this._updateIndicator())\n }\n )\n\n get value(): string {\n return this._value\n }\n\n set value(v: string) {\n const old = this._value\n this._value = v\n this._formAssociation.sync()\n this.requestUpdate('value', old)\n }\n\n private get _isDisabled(): boolean {\n return this.disabled || this._formAssociation.isFormDisabled()\n }\n\n private async _updateIndicator() {\n const triggers = this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')\n let left = 0\n let width = 0\n const selectedTrigger = findSelectedTriggerByValue(triggers, this._value)\n if (selectedTrigger) {\n const triggerRect = selectedTrigger.getBoundingClientRect()\n const groupRect = this.getBoundingClientRect()\n left = triggerRect.left - groupRect.left\n width = triggerRect.width\n }\n\n // 上一段移动还在飞行 → 这次直接落定(_settling 关掉 left / width 过渡,见 style.css)。\n // 落定这一趟自己也要占飞行窗口,所以放在写定位**之前**开窗:窗口一开,第三次连点\n // 落到的仍是本趟的终值,而不是一个刚起步的插值。\n //\n // 首帧定位不开窗:那是初始化而不是一次「移动」,没有前一段飞行可言。开了窗反而会让\n // 「挂载后 160ms 内的第一次点击」直接落定——那次点击本该是用户看到的第一段动画。\n const landing = this._indicatorReady ? this._openSettleFlight() : false\n\n /*\n * 落定这一趟必须等 `.is-settling` 真的进了 DOM 再写定位。\n *\n * `_settling` 是 Lit 的 reactive state:`classMap` 要等一次异步更新才落到元素上,而\n * `--indicator-left` 是同步写的内联样式。顺序反了的话就是「先改位置、过渡仍开着、\n * 下一帧才补上关过渡的 class」——浏览器已经按插值起跑,异步补上的 class 只是把一段\n * 插值中途掐掉,落定表现为一次跳变而不是直接落定,且掐在哪一帧取决于调度。\n */\n if (landing) await this.updateComplete\n\n this.style.setProperty('--indicator-left', `${left}px`)\n this.style.setProperty('--indicator-width', `${width}px`)\n\n // 首帧只完成定位:先把当前定位以「未启用 left/width transition」状态提交为 before 值,\n // 再打开移动动画。若同一趟里 set 定位与启用 transition,浏览器会把 0→option 当作一次过渡。\n if (!this._indicatorReady) {\n const indicator = this.renderRoot.querySelector<HTMLElement>('.wui-segmented-indicator')\n void indicator?.offsetWidth\n this._indicatorReady = true\n }\n }\n\n /*\n * 开一段飞行窗口:窗口内到达的改值一律落定,窗口到期才恢复插值过渡。\n *\n * 返回本次是否**落定**(飞行中到达的新值)。\n *\n * 时长取 `--wui-duration-trigger`(与 CSS 里 left / width 那两条过渡同一个值),所以\n * reduced-motion 下它就是 0ms——窗口立即到期,落定门自动退化成「每步都落定」,\n * 那正是 0ms 过渡本来的观感,不需要额外分支。\n *\n * 窗口每次改值都从零重开一整段时长(清掉旧定时器、世代号前进),而不是接着算剩余时长:\n * 剩余时长会让连续落定的窗口越缩越短,最后一次连点反倒拿到一段完整过渡——正是这个门\n * 要消除的那种观感。\n */\n private _openSettleFlight(): boolean {\n const wasFlying = this._settleTimer !== undefined\n const flight = {}\n this._settleFlight = flight\n const request = ++this._settleRequest\n clearTimeout(this._settleTimer)\n\n const duration = triggerDuration(this)\n if (duration === 0) {\n // 没有飞行就没有门可守:直接清掉落定态,让后续改值照常走 CSS 的过渡判定\n //(此时该过渡本身就是 0ms)。\n this._settleTimer = undefined\n this._settleFlight = null\n this._settling = false\n return false\n }\n\n // 已经在飞行中 → 这一趟是落定,保持落定态;否则是正常起一段过渡,先退出落定态。\n this._settling = wasFlying\n this._settleTimer = setTimeout(() => {\n this._settleTimer = undefined\n // 世代号校验:窗口被后续改值重开过,旧回调不得清掉新一轮的落定态。\n if (this._settleRequest !== request || this._settleFlight !== flight) return\n this._settleFlight = null\n this._settling = false\n }, duration)\n return wasFlying\n }\n\n private handlePointerDown(e: PointerEvent) {\n if (this._isDisabled) return\n const triggers = [...this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')]\n const enabledTriggers = triggers.filter(t => !t.disabled)\n if (enabledTriggers.length === 0) return\n\n const activeTrigger = findSelectedTriggerByValue(triggers, this._value)\n if (!activeTrigger || activeTrigger.disabled) return\n\n const activeTriggerRect = activeTrigger.getBoundingClientRect()\n const isPressedOnActive =\n e.clientX >= activeTriggerRect.left &&\n e.clientX <= activeTriggerRect.right &&\n e.clientY >= activeTriggerRect.top &&\n e.clientY <= activeTriggerRect.bottom\n\n if (!isPressedOnActive) return\n\n this._pressed = true\n\n const groupRect = this.getBoundingClientRect()\n const initialTriggerRect = activeTrigger.getBoundingClientRect()\n const initialLeft = initialTriggerRect.left - groupRect.left\n const initialWidth = initialTriggerRect.width\n // indicator 中心跟手:left 与宽度分开写(宽度取 hover 项的),中心才是稳定的那个量——\n // 宽度一变,center = left + width/2 就会漂,用它去选吸附目标会跟着抖。\n const initialCenter = initialLeft + initialWidth / 2\n\n const firstTriggerRect = triggers[0].getBoundingClientRect()\n const lastTriggerRect = triggers[triggers.length - 1].getBoundingClientRect()\n const minLeft = firstTriggerRect.left - groupRect.left\n const trackRight = lastTriggerRect.right - groupRect.left\n\n const enabledSlots = enabledTriggers.map(t => {\n const r = t.getBoundingClientRect()\n return { center: r.left - groupRect.left + r.width / 2, width: r.width }\n })\n const enabledCenters = enabledSlots.map(slot => slot.center)\n\n /*\n * 某一帧的 indicator 几何。\n *\n * 宽度跟随当前 hover 的可用项(#222):trigger 宽度不等是常态(interweave 设置\n * dialog 顶部即此形),宽度恒等于按下那一项会让 indicator 与它滑过的那项始终对不齐。\n * 取「离 indicator 中心最近的可用项」而不是「离指针最近的项」:松手吸附用的是同一个判据,\n * 于是拖拽中预览到的宽度就是松手会落到的那一项,不会在松手时二次变形。\n *\n * 宽度变了之后 maxLeft 必须跟着换算(`trackRight − width`),否则更宽的 indicator 会被\n * 钳在按初始宽度算出的位置上,从 track 右端探出去。\n *\n * 等宽时 width 恒为 initialWidth,`initialCenter + deltaX − initialWidth/2` 恒等于\n * `initialLeft + deltaX`,这一整套与改动前的逐字行为一致。\n */\n const frameAt = (deltaX: number) => {\n const center = initialCenter + deltaX\n const nearest = snapToNearest(center, enabledCenters)\n const width = nearest === -1 ? initialWidth : (enabledSlots[nearest]?.width ?? initialWidth)\n const left = clamp(center - width / 2, minLeft, trackRight - width)\n return { left, width, center: left + width / 2 }\n }\n\n this._dragGestureHandle?.destroy()\n this._dragGestureHandle = attachDragGesture(e, {\n axis: 'x',\n threshold: 6,\n onMove: info => {\n this._isDragging = true\n const { left, width } = frameAt(info.deltaX)\n this.style.setProperty('--indicator-left', `${left}px`)\n this.style.setProperty('--indicator-width', `${width}px`)\n },\n onEnd: info => {\n const wasDragging = this._isDragging\n this._isDragging = false\n this._pressed = false\n\n if (wasDragging) {\n const currentCenter = frameAt(info.deltaX).center\n\n let targetTrigger = activeTrigger\n if (info.velocityX > 300) {\n const currentIdx = enabledTriggers.indexOf(activeTrigger)\n if (currentIdx !== -1 && currentIdx < enabledTriggers.length - 1) {\n targetTrigger = enabledTriggers[currentIdx + 1]\n } else {\n targetTrigger = enabledTriggers[enabledTriggers.length - 1]\n }\n } else if (info.velocityX < -300) {\n const currentIdx = enabledTriggers.indexOf(activeTrigger)\n if (currentIdx > 0) {\n targetTrigger = enabledTriggers[currentIdx - 1]\n } else {\n targetTrigger = enabledTriggers[0]\n }\n } else {\n const nearestIdx = snapToNearest(currentCenter, enabledCenters)\n if (nearestIdx !== -1 && enabledTriggers[nearestIdx]) {\n targetTrigger = enabledTriggers[nearestIdx]\n }\n }\n\n if (targetTrigger.value !== this._value) {\n this.value = targetTrigger.value\n this._groupController.sync()\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n } else if (targetTrigger !== activeTrigger) {\n targetTrigger.shadowRoot?.querySelector<HTMLElement>('[role=\"option\"]')?.click()\n } else {\n void this._updateIndicator()\n }\n }\n this.requestUpdate()\n },\n onCancel: () => {\n this._isDragging = false\n this._pressed = false\n void this._updateIndicator()\n this.requestUpdate()\n }\n })\n }\n\n private handlePointerUp() {\n this._pressed = false\n }\n\n private handlePointerLeave() {\n if (!this._dragGestureHandle?.isDragging()) {\n this._pressed = false\n }\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n if (this._isDisabled || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return\n\n const current = event\n .composedPath()\n .find(\n (target): target is WebUiSegmentedTrigger =>\n target instanceof HTMLElement && target.matches('web-ui-segmented-trigger')\n )\n if (!current) return\n\n const triggers = [...this.querySelectorAll<WebUiSegmentedTrigger>('web-ui-segmented-trigger')]\n const enabled = triggers.filter(trigger => !trigger.disabled)\n const currentIndex = triggers.indexOf(current)\n if (currentIndex === -1 || enabled.length === 0) return\n const direction = getComputedStyle(this).direction === 'rtl' ? -1 : 1\n\n const nextEnabled = (direction: -1 | 1): WebUiSegmentedTrigger => {\n for (let offset = 1; offset <= triggers.length; offset += 1) {\n const index = (currentIndex + direction * offset + triggers.length) % triggers.length\n const candidate = triggers[index]\n if (candidate && !candidate.disabled) return candidate\n }\n return current\n }\n\n let next: WebUiSegmentedTrigger\n switch (event.key) {\n case 'ArrowRight':\n next = nextEnabled(direction)\n break\n case 'ArrowLeft':\n next = nextEnabled(direction === 1 ? -1 : 1)\n break\n case 'Home':\n next = enabled[0]\n break\n case 'End':\n next = enabled[enabled.length - 1]\n break\n default:\n return\n }\n\n const option = next.shadowRoot?.querySelector<HTMLElement>('[role=\"option\"]')\n if (!option) return\n\n event.preventDefault()\n option.focus()\n if (next !== current || !next.checked) option.click()\n }\n\n private readonly _formAssociation = defineFormAssociation<string>({\n host: this,\n initialize: () => {\n const attrValue = this.getAttribute('value')\n if (attrValue !== null && this._value === '') this._value = attrValue\n },\n getState: () => this._value,\n setState: value => {\n this.value = value\n },\n getFormValue: () => (this.name && this._value ? this._value : null),\n getFormState: () => this._value,\n restoreState: state => {\n if (typeof state === 'string') this.value = state\n }\n }).make()\n\n private readonly _formAssociationController = new FormAssociationController(this, this._formAssociation)\n\n override formDisabledCallback(disabled: boolean) {\n this._formAssociation.setDisabled(disabled)\n this._groupController.sync()\n }\n\n override render() {\n return html`\n <div\n class=${classMap({\n 'wui-glass': true,\n 'wui-segmented': true,\n 'is-disabled': this._isDisabled,\n 'is-pressed': this._pressed,\n 'is-dragging': this._isDragging,\n 'is-indicator-ready': this._indicatorReady,\n 'is-settling': this._settling\n })}\n role=\"listbox\"\n aria-orientation=\"horizontal\"\n aria-label=${ifDefined(this.ariaLabel)}\n @keydown=${this.handleKeyDown}\n @pointerdown=${this.handlePointerDown}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerUp}\n @pointerleave=${this.handlePointerLeave}\n >\n <span class=\"wui-glass wui-segmented-indicator\"></span>\n <slot></slot>\n </div>\n `\n }\n\n declare readonly $events: {\n input: Event\n change: Event\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-segmented': WebUiSegmented\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- //#region src/components/segmented/style.css?inline
2
- var e = "*,:before,:after{box-sizing:border-box}:host{touch-action:none;-webkit-user-select:none;user-select:none;display:inline-block}.wui-segmented{--wui-glass-corner-radius:calc(var(--wui-control-size,36px) / 2);touch-action:none;cursor:default;padding:var(--wui-space-1,4px);border-radius:var(--wui-radius-control,calc(infinity * 1px));background-color:var(--wui-color-surface,#fff);-webkit-backdrop-filter:none;backdrop-filter:none;align-items:stretch;display:inline-flex;position:relative}.wui-segmented.is-disabled{cursor:not-allowed;opacity:.4}.wui-segmented.is-disabled .wui-segmented-trigger.is-disabled{opacity:1}:host([variant=raised]) .wui-segmented{background-color:var(--wui-color-surface-segmented-track,#e5e5ea);box-shadow:none}:host([variant=raised]) .wui-segmented:before{opacity:0}.wui-segmented-indicator{--wui-glass-corner-radius:calc(var(--wui-control-size,36px) / 2);z-index:0;top:4px;bottom:4px;left:var(--indicator-left,0);transform-origin:50%;width:var(--indicator-width,0);border-radius:var(--wui-radius-control,calc(infinity * 1px));background-color:var(--wui-color-surface-segmented,#dfdfdf);-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none;transition:transform var(--wui-duration-press,80ms) cubic-bezier(.4, 0, .2, 1), background-color var(--wui-duration-press,80ms) ease, box-shadow var(--wui-duration-press,80ms) ease;display:block;position:absolute;transform:scale(1)}.is-indicator-ready:not(.is-dragging) .wui-segmented-indicator{transition:left var(--wui-duration-trigger,.16s) var(--wui-ease-slide,cubic-bezier(.77, 0, .175, 1)), width var(--wui-duration-trigger,.16s) var(--wui-ease-slide,cubic-bezier(.77, 0, .175, 1)), transform var(--wui-duration-press,80ms) cubic-bezier(.4, 0, .2, 1), background-color var(--wui-duration-press,80ms) ease, box-shadow var(--wui-duration-press,80ms) ease}.is-indicator-ready.is-settling .wui-segmented-indicator{transition:transform var(--wui-duration-press,80ms) cubic-bezier(.4, 0, .2, 1), background-color var(--wui-duration-press,80ms) ease, box-shadow var(--wui-duration-press,80ms) ease}:host([variant=raised]) .wui-segmented-indicator{background-color:var(--wui-color-surface-selected,#fff);box-shadow:0 1px 3px #0000001f,0 1px 2px #00000014}.wui-segmented-indicator:before{opacity:0;transition:opacity var(--wui-duration-press,80ms) ease}.wui-segmented.is-pressed .wui-segmented-indicator,.wui-segmented.is-dragging .wui-segmented-indicator{--wui-color-glass-ring:transparent;-webkit-backdrop-filter:blur(var(--wui-glass-blur,4px)) saturate(var(--wui-glass-saturation,160%)) brightness(var(--wui-glass-brightness,1.06));backdrop-filter:blur(var(--wui-glass-blur,4px)) saturate(var(--wui-glass-saturation,160%)) brightness(var(--wui-glass-brightness,1.06));box-shadow:inset 0 0 0 .5px color-mix(in srgb, var(--wui-color-glass-highlight,#ffffffe6) 38%, transparent), inset 0 1px .5px color-mix(in srgb, var(--wui-color-glass-highlight,#ffffffe6) 52%, transparent), inset 0 -.5px 1px #00000008, 0 2px 20px #0003;transition:transform var(--wui-duration-press,80ms) cubic-bezier(.4, 0, .2, 1), box-shadow var(--wui-duration-press,80ms) ease;background-color:#0000;transform:scale(1.5)}.wui-segmented.is-pressed .wui-segmented-indicator:before,.wui-segmented.is-dragging .wui-segmented-indicator:before{opacity:1}.wui-segmented.is-dragging:not(.is-disabled){--wui-internal-segmented-trigger-cursor:grabbing;cursor:grabbing}";
3
- //#endregion
4
- export { e as default };
1
+ // src/components/segmented/style.css?inline
2
+ var style_default = "*,:before,:after{box-sizing:border-box}:host{touch-action:none;-webkit-user-select:none;user-select:none;display:inline-block}.wui-segmented{--wui-glass-corner-radius:calc(var(--wui-control-size,36px) / 2);touch-action:none;cursor:default;padding:var(--wui-space-1,4px);border-radius:var(--wui-radius-control,calc(infinity * 1px));background-color:var(--wui-color-surface,#fff);-webkit-backdrop-filter:none;backdrop-filter:none;align-items:stretch;display:inline-flex;position:relative}.wui-segmented.is-disabled{cursor:not-allowed;opacity:.4}.wui-segmented.is-disabled .wui-segmented-trigger.is-disabled{opacity:1}:host([variant=raised]) .wui-segmented{background-color:var(--wui-color-surface-segmented-track,#e5e5ea);box-shadow:none}:host([variant=raised]) .wui-segmented:before{opacity:0}.wui-segmented-indicator{--wui-glass-corner-radius:calc(var(--wui-control-size,36px) / 2);z-index:0;top:4px;bottom:4px;left:var(--indicator-left,0);transform-origin:50%;width:var(--indicator-width,0);border-radius:var(--wui-radius-control,calc(infinity * 1px));background-color:var(--wui-color-surface-segmented,#dfdfdf);-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none;transition:transform var(--wui-duration-press,80ms) cubic-bezier(.4, 0, .2, 1), background-color var(--wui-duration-press,80ms) ease, box-shadow var(--wui-duration-press,80ms) ease;display:block;position:absolute;transform:scale(1)}.is-indicator-ready:not(.is-dragging) .wui-segmented-indicator{transition:left var(--wui-duration-trigger,.16s) var(--wui-ease-slide,cubic-bezier(.77, 0, .175, 1)), width var(--wui-duration-trigger,.16s) var(--wui-ease-slide,cubic-bezier(.77, 0, .175, 1)), transform var(--wui-duration-press,80ms) cubic-bezier(.4, 0, .2, 1), background-color var(--wui-duration-press,80ms) ease, box-shadow var(--wui-duration-press,80ms) ease}.is-indicator-ready.is-settling .wui-segmented-indicator{transition:transform var(--wui-duration-press,80ms) cubic-bezier(.4, 0, .2, 1), background-color var(--wui-duration-press,80ms) ease, box-shadow var(--wui-duration-press,80ms) ease}:host([variant=raised]) .wui-segmented-indicator{background-color:var(--wui-color-surface-selected,#fff);box-shadow:0 1px 3px #0000001f,0 1px 2px #00000014}.wui-segmented-indicator:before{opacity:0;transition:opacity var(--wui-duration-press,80ms) ease}.wui-segmented.is-pressed .wui-segmented-indicator,.wui-segmented.is-dragging .wui-segmented-indicator{--wui-color-glass-ring:transparent;-webkit-backdrop-filter:blur(var(--wui-glass-blur,4px)) saturate(var(--wui-glass-saturation,160%)) brightness(var(--wui-glass-brightness,1.06));backdrop-filter:blur(var(--wui-glass-blur,4px)) saturate(var(--wui-glass-saturation,160%)) brightness(var(--wui-glass-brightness,1.06));box-shadow:inset 0 0 0 .5px color-mix(in srgb, var(--wui-color-glass-highlight,#ffffffe6) 38%, transparent), inset 0 1px .5px color-mix(in srgb, var(--wui-color-glass-highlight,#ffffffe6) 52%, transparent), inset 0 -.5px 1px #00000008, 0 2px 20px #0003;transition:transform var(--wui-duration-press,80ms) cubic-bezier(.4, 0, .2, 1), box-shadow var(--wui-duration-press,80ms) ease;background-color:#0000;transform:scale(1.5)}.wui-segmented.is-pressed .wui-segmented-indicator:before,.wui-segmented.is-dragging .wui-segmented-indicator:before{opacity:1}.wui-segmented.is-dragging:not(.is-disabled){--wui-internal-segmented-trigger-cursor:grabbing;cursor:grabbing}\n";
3
+ export { style_default as default };
5
4
 
6
5
  //# sourceMappingURL=style.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/segmented/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n touch-action: none;\n user-select: none;\n display: inline-block;\n}\n\n.wui-segmented {\n /* 玻璃描边的角点半径与控件圆角同源:胶囊取短边一半(button-group 同法)。 */\n --wui-glass-corner-radius: calc(var(--wui-control-size, 36px) / 2);\n\n touch-action: none;\n cursor: default;\n\n position: relative;\n\n display: inline-flex;\n align-items: stretch;\n\n padding: var(--wui-space-1, 4px);\n border-radius: var(--wui-radius-control, calc(infinity * 1px));\n\n /* inset 变体(默认,「凹」):track 是不透明实体面——底色取 --wui-color-surface、\n backdrop-filter 移除,描边环(::before)与投影由 .wui-glass 提供且静止/按压/拖拽\n 全状态同值。\n 为什么不是 surface-raised:#169 追加验收要求浅色下 track 与页面同色——surface-raised\n 的 #f2f2f7 在纯白页面上像一颗浅灰药丸凸出来,凹感不足。浅色 surface 与 page 同为\n #fff,track 因此与页面同色,深度只由常驻的 1px 描边环与投影承担;深色 surface 与\n surface-raised 同为 #2c2c2e,「比页面高一档」的 elevation 原样保留(theme 里这两个\n token 在深色下同值,选 surface 不改变深色观感)。\n 实体化的取证依据:indicator 的 backdrop 采样面整个落在 track 之内(slider thumb 探出\n track 外、能采到页面背景,segmented 没有这个条件),玻璃 track 会把背后的条纹/色斑\n 连同自身边缘一起模糊进采样图——均匀深底上全透明 indicator 与相邻 track 仅差 +0.5 阶\n (42.8 vs 42.3)、本体不可感知,条纹底实测 indicator 内部灰度 std 1.89(背景渗透)。\n track 改实色后同一采样 std 归零,弧线与两条横线随磨砂边界一同消失,look3/4/5 为\n 压制这些采样痕迹引入的按压态特判(inset 高光淡出、环半隐、6% tint)全部移除。 */\n background-color: var(--wui-color-surface, #fff);\n backdrop-filter: none;\n\n &.is-disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n\n &.is-disabled .wui-segmented-trigger.is-disabled {\n opacity: 1;\n }\n}\n\n/* raised 变体(「凸」):经典形态的 flat 灰 track——surface-segmented-track 实色,无描边环、无投影\n (.wui-glass 的 box-shadow 与 ::before 环整体关掉),三种状态下保持同值。浅色它是 page(#fff)之下\n 的 #e5e5ea,深色让 track 沉到 page 之下(#17191a),两种都是给 indicator 留出「与 page 同色」那一档。 */\n:host([variant='raised']) .wui-segmented {\n background-color: var(--wui-color-surface-segmented-track, #e5e5ea);\n box-shadow: none;\n}\n\n:host([variant='raised']) .wui-segmented::before {\n opacity: 0;\n}\n\n.wui-segmented-indicator {\n /* 玻璃描边的角点半径与控件圆角同源:胶囊取短边一半(switch thumb 同法)。 */\n --wui-glass-corner-radius: calc(var(--wui-control-size, 36px) / 2);\n\n position: absolute;\n\n /* 栈序契约:indicator 恒在 track 之上、文字之下。track 的 ::before 描边环按树序先画,\n trigger 的 z-index: 1 又压在 indicator 之上,所以 indicator 既不盖字也不被 track 盖住。 */\n z-index: 0;\n top: 4px;\n bottom: 4px;\n left: var(--indicator-left, 0);\n transform-origin: center center;\n transform: scale(1);\n\n display: block;\n\n width: var(--indicator-width, 0);\n border-radius: var(--wui-radius-control, calc(infinity * 1px));\n\n /* inset 变体(默认)静止态是纯灰底:.wui-glass 恒挂只为复用按压态配方,这里把它的\n glass-only 输出逐条关掉——backdrop blur、::before 描边环、inset 高光与投影,\n 只留 surface-segmented 实色(该 token 浅色与深色的默认值都等于 surface-control,也就是 secondary\n button 的面;这条等式由 segmented-contrast 用例守着,两枚 token 在 theme 里各自是字面量定义)。 */\n background-color: var(--wui-color-surface-segmented, #dfdfdf);\n backdrop-filter: none;\n box-shadow: none;\n\n transition:\n transform var(--wui-duration-press, 80ms) cubic-bezier(0.4, 0, 0.2, 1),\n background-color var(--wui-duration-press, 80ms) ease,\n box-shadow var(--wui-duration-press, 80ms) ease;\n\n /* transition 只在首帧定位后且非拖拽状态启用,避免组件进入视口时触发初始化动画或拖拽跟手产生延迟;\n 其中的 background-color 只服务松开方向——按下态自己不含该属性,见下方按压/拖拽规则。\n backdrop-filter 不进任何过渡列表:静止态必须是 none(验收要求),而 none ↔ blur() 不可插值\n (dialog 的生硬跳变根因),离散过渡只会在 50% 处翻转,按下后前 40ms 会留下「已变色但无 blur」\n 的空洞帧;改为瞬时切换后,按下第一帧就是完整的按压态玻璃。 */\n .is-indicator-ready:not(.is-dragging) & {\n transition:\n left var(--wui-duration-trigger, 160ms) var(--wui-ease-slide, cubic-bezier(0.77, 0, 0.175, 1)),\n width var(--wui-duration-trigger, 160ms) var(--wui-ease-slide, cubic-bezier(0.77, 0, 0.175, 1)),\n transform var(--wui-duration-press, 80ms) cubic-bezier(0.4, 0, 0.2, 1),\n background-color var(--wui-duration-press, 80ms) ease,\n box-shadow var(--wui-duration-press, 80ms) ease;\n }\n}\n\n/*\n * 落定门:上一段 indicator 移动还在飞行时到达的新值直接落到终值,不排队也不重启插值。\n * 做法是把 left / width 从过渡列表里摘掉——位置一变即刻生效,其余过渡(按压玻璃那几条)\n * 原样保留,所以这个门只关位置动画,不会把按压反馈一起关掉。\n *\n * 单独成规则而**不是**给上面那条加 `:not(.is-settling)`:那样特异性从 (0,3,0) 升到 (0,4,0),\n * 于是下方同为 (0,3,0) 的按压态规则(`.is-pressed` / `.is-dragging`)与 raised 变体\n * (`:host([variant='raised'])`)都改不动它了。按压态正是靠同特异性的后置顺序才赢过 ready 规则,\n * 被反超后 background-color 会从「瞬时切到透明」\n * 变回有插值(ready 规则把该属性列进了过渡),玻璃按压反馈整个变形。stylelint 的\n * no-descending-specificity 同样直接把这三条判成「应排在它之前」,是这条推理的机器旁证。\n * 放在 ready 之后、press 之前:同特异性下后置者赢,于是 ready 被压掉、press 仍压得住本条。\n */\n.is-indicator-ready.is-settling .wui-segmented-indicator {\n transition:\n transform var(--wui-duration-press, 80ms) cubic-bezier(0.4, 0, 0.2, 1),\n background-color var(--wui-duration-press, 80ms) ease,\n box-shadow var(--wui-duration-press, 80ms) ease;\n}\n\n/* raised 变体静止态:实体 indicator + 柔投影(经典形态;两档下 surface-selected 都与该主题的 page\n 同色——浅色 #fff、深色 #242628,深色靠 track 沉到 page 之下保住凸起方向)。仅换底与投影,\n 几何与过渡和 inset 变体同源。\n 注意源顺序:本规则与下方按压/拖拽规则特异性相同((0,3,0)),按压态必须排在更后面,\n 才能把实体底/柔投影覆盖成透明玻璃配方。 */\n:host([variant='raised']) .wui-segmented-indicator {\n background-color: var(--wui-color-surface-selected, #fff);\n box-shadow:\n 0 1px 3px rgb(0 0 0 / 0.12),\n 0 1px 2px rgb(0 0 0 / 0.08);\n}\n\n/* 静止态不绘制玻璃描边环:.wui-glass::before 是角点环 + 对角光泽层,纯灰底不需要它。\n 用 opacity 而不是 display:none,按压态才能让环随过渡淡入,而不是整层跳出。 */\n.wui-segmented-indicator::before {\n opacity: 0;\n transition: opacity var(--wui-duration-press, 80ms) ease;\n}\n\n/* 按压/拖拽时 indicator 转为玻璃态:静止态关掉的玻璃输出在这一态全部打开——backdrop blur、\n ::before 描边环、inset 高光,投影叠加更实一档并放大 1.5x。\n 底色全透明:track 实体化后 indicator 的采样面拿到的是均匀实色(条纹底实测内部 std 归零),\n 本体可感知性由实色 track 与 1.5x 放大/环/投影共同承担,不再需要 tint 打底,也不需要\n 为采样痕迹去压制 track 的边缘装饰——那些按压态特判已全部移除,track 装饰全状态恒定。\n transition 不含 background-color:按下即落到全透明,不产生灰→透明的插值中间帧;\n 松开回到静止态规则,由那里的 background-color 过渡把透明平滑淡回实体底。\n backdrop-filter 直接写死值(与 drawer/dialog/toast 的玻璃态同法):静止态是 none,\n glass 配方由这一态自己声明,不随 .wui-glass 类是否挂载而变;该属性同样不进 transition,\n 理由见静止态规则上方的说明。\n box-shadow 直接写死值(不经 --wui-internal-glass-shadow 中转):iOS Safari 对 var\n 离散切换驱动的 box-shadow 不触发过渡且可能整体不生效(slider thumb 同法),直接写值\n 后是普通属性变化,transition 正常插值;三条 inset 高光复制自 .wui-glass,避免整段\n 覆盖后按压态丢失玻璃描边。 */\n.wui-segmented.is-pressed .wui-segmented-indicator,\n.wui-segmented.is-dragging .wui-segmented-indicator {\n /* 环底色随按压/拖拽态转 transparent(理由见 menu-portal.css)。 */\n --wui-color-glass-ring: transparent;\n transform: scale(1.5);\n\n background-color: transparent;\n backdrop-filter: blur(var(--wui-glass-blur, 4px)) saturate(var(--wui-glass-saturation, 160%))\n brightness(var(--wui-glass-brightness, 1.06));\n box-shadow:\n inset 0 0 0 0.5px color-mix(in srgb, var(--wui-color-glass-highlight, rgb(255 255 255 / 0.9)) 38%, transparent),\n inset 0 1px 0.5px color-mix(in srgb, var(--wui-color-glass-highlight, rgb(255 255 255 / 0.9)) 52%, transparent),\n inset 0 -0.5px 1px rgb(0 0 0 / 0.03),\n 0 2px 20px rgb(0 0 0 / 0.2);\n\n transition:\n transform var(--wui-duration-press, 80ms) cubic-bezier(0.4, 0, 0.2, 1),\n box-shadow var(--wui-duration-press, 80ms) ease;\n}\n\n.wui-segmented.is-pressed .wui-segmented-indicator::before,\n.wui-segmented.is-dragging .wui-segmented-indicator::before {\n opacity: 1;\n}\n\n.wui-segmented.is-dragging:not(.is-disabled) {\n --wui-internal-segmented-trigger-cursor: grabbing;\n cursor: grabbing;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/segmented/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n touch-action: none;\n user-select: none;\n display: inline-block;\n}\n\n.wui-segmented {\n /* 玻璃描边的角点半径与控件圆角同源:胶囊取短边一半(button-group 同法)。 */\n --wui-glass-corner-radius: calc(var(--wui-control-size, 36px) / 2);\n\n touch-action: none;\n cursor: default;\n\n position: relative;\n\n display: inline-flex;\n align-items: stretch;\n\n padding: var(--wui-space-1, 4px);\n border-radius: var(--wui-radius-control, calc(infinity * 1px));\n\n /* inset 变体(默认,「凹」):track 是不透明实体面——底色取 --wui-color-surface、\n backdrop-filter 移除,描边环(::before)与投影由 .wui-glass 提供且静止/按压/拖拽\n 全状态同值。\n 为什么不是 surface-raised:#169 追加验收要求浅色下 track 与页面同色——surface-raised\n 的 #f2f2f7 在纯白页面上像一颗浅灰药丸凸出来,凹感不足。浅色 surface 与 page 同为\n #fff,track 因此与页面同色,深度只由常驻的 1px 描边环与投影承担;深色 surface 与\n surface-raised 同为 #2c2c2e,「比页面高一档」的 elevation 原样保留(theme 里这两个\n token 在深色下同值,选 surface 不改变深色观感)。\n 实体化的取证依据:indicator 的 backdrop 采样面整个落在 track 之内(slider thumb 探出\n track 外、能采到页面背景,segmented 没有这个条件),玻璃 track 会把背后的条纹/色斑\n 连同自身边缘一起模糊进采样图——均匀深底上全透明 indicator 与相邻 track 仅差 +0.5 阶\n (42.8 vs 42.3)、本体不可感知,条纹底实测 indicator 内部灰度 std 1.89(背景渗透)。\n track 改实色后同一采样 std 归零,弧线与两条横线随磨砂边界一同消失,look3/4/5 为\n 压制这些采样痕迹引入的按压态特判(inset 高光淡出、环半隐、6% tint)全部移除。 */\n background-color: var(--wui-color-surface, #fff);\n backdrop-filter: none;\n\n &.is-disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n\n &.is-disabled .wui-segmented-trigger.is-disabled {\n opacity: 1;\n }\n}\n\n/* raised 变体(「凸」):经典形态的 flat 灰 track——surface-segmented-track 实色,无描边环、无投影\n (.wui-glass 的 box-shadow 与 ::before 环整体关掉),三种状态下保持同值。浅色它是 page(#fff)之下\n 的 #e5e5ea,深色让 track 沉到 page 之下(#17191a),两种都是给 indicator 留出「与 page 同色」那一档。 */\n:host([variant='raised']) .wui-segmented {\n background-color: var(--wui-color-surface-segmented-track, #e5e5ea);\n box-shadow: none;\n}\n\n:host([variant='raised']) .wui-segmented::before {\n opacity: 0;\n}\n\n.wui-segmented-indicator {\n /* 玻璃描边的角点半径与控件圆角同源:胶囊取短边一半(switch thumb 同法)。 */\n --wui-glass-corner-radius: calc(var(--wui-control-size, 36px) / 2);\n\n position: absolute;\n\n /* 栈序契约:indicator 恒在 track 之上、文字之下。track 的 ::before 描边环按树序先画,\n trigger 的 z-index: 1 又压在 indicator 之上,所以 indicator 既不盖字也不被 track 盖住。 */\n z-index: 0;\n top: 4px;\n bottom: 4px;\n left: var(--indicator-left, 0);\n transform-origin: center center;\n transform: scale(1);\n\n display: block;\n\n width: var(--indicator-width, 0);\n border-radius: var(--wui-radius-control, calc(infinity * 1px));\n\n /* inset 变体(默认)静止态是纯灰底:.wui-glass 恒挂只为复用按压态配方,这里把它的\n glass-only 输出逐条关掉——backdrop blur、::before 描边环、inset 高光与投影,\n 只留 surface-segmented 实色(该 token 浅色与深色的默认值都等于 surface-control,也就是 secondary\n button 的面;这条等式由 segmented-contrast 用例守着,两枚 token 在 theme 里各自是字面量定义)。 */\n background-color: var(--wui-color-surface-segmented, #dfdfdf);\n backdrop-filter: none;\n box-shadow: none;\n\n transition:\n transform var(--wui-duration-press, 80ms) cubic-bezier(0.4, 0, 0.2, 1),\n background-color var(--wui-duration-press, 80ms) ease,\n box-shadow var(--wui-duration-press, 80ms) ease;\n\n /* transition 只在首帧定位后且非拖拽状态启用,避免组件进入视口时触发初始化动画或拖拽跟手产生延迟;\n 其中的 background-color 只服务松开方向——按下态自己不含该属性,见下方按压/拖拽规则。\n backdrop-filter 不进任何过渡列表:静止态必须是 none(验收要求),而 none ↔ blur() 不可插值\n (dialog 的生硬跳变根因),离散过渡只会在 50% 处翻转,按下后前 40ms 会留下「已变色但无 blur」\n 的空洞帧;改为瞬时切换后,按下第一帧就是完整的按压态玻璃。 */\n .is-indicator-ready:not(.is-dragging) & {\n transition:\n left var(--wui-duration-trigger, 160ms) var(--wui-ease-slide, cubic-bezier(0.77, 0, 0.175, 1)),\n width var(--wui-duration-trigger, 160ms) var(--wui-ease-slide, cubic-bezier(0.77, 0, 0.175, 1)),\n transform var(--wui-duration-press, 80ms) cubic-bezier(0.4, 0, 0.2, 1),\n background-color var(--wui-duration-press, 80ms) ease,\n box-shadow var(--wui-duration-press, 80ms) ease;\n }\n}\n\n/*\n * 落定门:上一段 indicator 移动还在飞行时到达的新值直接落到终值,不排队也不重启插值。\n * 做法是把 left / width 从过渡列表里摘掉——位置一变即刻生效,其余过渡(按压玻璃那几条)\n * 原样保留,所以这个门只关位置动画,不会把按压反馈一起关掉。\n *\n * 单独成规则而**不是**给上面那条加 `:not(.is-settling)`:那样特异性从 (0,3,0) 升到 (0,4,0),\n * 于是下方同为 (0,3,0) 的按压态规则(`.is-pressed` / `.is-dragging`)与 raised 变体\n * (`:host([variant='raised'])`)都改不动它了。按压态正是靠同特异性的后置顺序才赢过 ready 规则,\n * 被反超后 background-color 会从「瞬时切到透明」\n * 变回有插值(ready 规则把该属性列进了过渡),玻璃按压反馈整个变形。stylelint 的\n * no-descending-specificity 同样直接把这三条判成「应排在它之前」,是这条推理的机器旁证。\n * 放在 ready 之后、press 之前:同特异性下后置者赢,于是 ready 被压掉、press 仍压得住本条。\n */\n.is-indicator-ready.is-settling .wui-segmented-indicator {\n transition:\n transform var(--wui-duration-press, 80ms) cubic-bezier(0.4, 0, 0.2, 1),\n background-color var(--wui-duration-press, 80ms) ease,\n box-shadow var(--wui-duration-press, 80ms) ease;\n}\n\n/* raised 变体静止态:实体 indicator + 柔投影(经典形态;两档下 surface-selected 都与该主题的 page\n 同色——浅色 #fff、深色 #242628,深色靠 track 沉到 page 之下保住凸起方向)。仅换底与投影,\n 几何与过渡和 inset 变体同源。\n 注意源顺序:本规则与下方按压/拖拽规则特异性相同((0,3,0)),按压态必须排在更后面,\n 才能把实体底/柔投影覆盖成透明玻璃配方。 */\n:host([variant='raised']) .wui-segmented-indicator {\n background-color: var(--wui-color-surface-selected, #fff);\n box-shadow:\n 0 1px 3px rgb(0 0 0 / 0.12),\n 0 1px 2px rgb(0 0 0 / 0.08);\n}\n\n/* 静止态不绘制玻璃描边环:.wui-glass::before 是角点环 + 对角光泽层,纯灰底不需要它。\n 用 opacity 而不是 display:none,按压态才能让环随过渡淡入,而不是整层跳出。 */\n.wui-segmented-indicator::before {\n opacity: 0;\n transition: opacity var(--wui-duration-press, 80ms) ease;\n}\n\n/* 按压/拖拽时 indicator 转为玻璃态:静止态关掉的玻璃输出在这一态全部打开——backdrop blur、\n ::before 描边环、inset 高光,投影叠加更实一档并放大 1.5x。\n 底色全透明:track 实体化后 indicator 的采样面拿到的是均匀实色(条纹底实测内部 std 归零),\n 本体可感知性由实色 track 与 1.5x 放大/环/投影共同承担,不需要 tint 打底,也不需要\n 为采样痕迹去压制 track 的边缘装饰——track 装饰全状态恒定。\n transition 不含 background-color:按下即落到全透明,不产生灰→透明的插值中间帧;\n 松开回到静止态规则,由那里的 background-color 过渡把透明平滑淡回实体底。\n backdrop-filter 直接写死值(与 drawer/dialog/toast 的玻璃态同法):静止态是 none,\n glass 配方由这一态自己声明,不随 .wui-glass 类是否挂载而变;该属性同样不进 transition,\n 理由见静止态规则上方的说明。\n box-shadow 直接写死值(不经 --wui-internal-glass-shadow 中转):iOS Safari 对 var\n 离散切换驱动的 box-shadow 不触发过渡且可能整体不生效(slider thumb 同法),直接写值\n 后是普通属性变化,transition 正常插值;三条 inset 高光复制自 .wui-glass,避免整段\n 覆盖后按压态丢失玻璃描边。 */\n.wui-segmented.is-pressed .wui-segmented-indicator,\n.wui-segmented.is-dragging .wui-segmented-indicator {\n /* 环底色随按压/拖拽态转 transparent(理由见 menu-portal.css)。 */\n --wui-color-glass-ring: transparent;\n transform: scale(1.5);\n\n background-color: transparent;\n backdrop-filter: blur(var(--wui-glass-blur, 4px)) saturate(var(--wui-glass-saturation, 160%))\n brightness(var(--wui-glass-brightness, 1.06));\n box-shadow:\n inset 0 0 0 0.5px color-mix(in srgb, var(--wui-color-glass-highlight, rgb(255 255 255 / 0.9)) 38%, transparent),\n inset 0 1px 0.5px color-mix(in srgb, var(--wui-color-glass-highlight, rgb(255 255 255 / 0.9)) 52%, transparent),\n inset 0 -0.5px 1px rgb(0 0 0 / 0.03),\n 0 2px 20px rgb(0 0 0 / 0.2);\n\n transition:\n transform var(--wui-duration-press, 80ms) cubic-bezier(0.4, 0, 0.2, 1),\n box-shadow var(--wui-duration-press, 80ms) ease;\n}\n\n.wui-segmented.is-pressed .wui-segmented-indicator::before,\n.wui-segmented.is-dragging .wui-segmented-indicator::before {\n opacity: 1;\n}\n\n.wui-segmented.is-dragging:not(.is-disabled) {\n --wui-internal-segmented-trigger-cursor: grabbing;\n cursor: grabbing;\n}\n"],"mappings":";AAAA,IAAA,gBAAA"}
@@ -1,21 +1,22 @@
1
- import { LitElement } from 'lit';
1
+ import { LitElement } from "lit";
2
2
  export declare class WebUiSegmentedTrigger extends LitElement {
3
- static styles: import('lit').CSSResult;
4
- value: string;
5
- checked: boolean;
6
- disabled: boolean;
7
- private readonly _groupManagement;
8
- private get _isDisabled();
9
- private get _isManagedByGroup();
10
- private handleClick;
11
- private handleKeyDown;
12
- render(): import('lit').TemplateResult<1>;
13
- readonly $events: {
14
- change: Event;
15
- };
3
+ static styles: import("lit").CSSResult;
4
+ value: string;
5
+ checked: boolean;
6
+ disabled: boolean;
7
+ private readonly _groupManagement;
8
+ private get _isDisabled();
9
+ private get _isManagedByGroup();
10
+ private handleClick;
11
+ private handleKeyDown;
12
+ render(): import("lit").TemplateResult<1>;
13
+ readonly $events: {
14
+ change: Event;
15
+ };
16
16
  }
17
17
  declare global {
18
- interface HTMLElementTagNameMap {
19
- 'web-ui-segmented-trigger': WebUiSegmentedTrigger;
20
- }
18
+ interface HTMLElementTagNameMap {
19
+ 'web-ui-segmented-trigger': WebUiSegmentedTrigger;
20
+ }
21
21
  }
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/segmented-trigger/index.ts"],"mappings":";qBAYa,8BAA8B;SACzB,sBAAM;EAEM;EACgB;EACA;mBAE3B;cAML;cAIA;UAIJ;UAUA;EAOC,wBAAM;WAsBE;IACf,QAAQ;;;QAIJ;YACI;IACR,4BAA4B"}
@@ -1,54 +1,61 @@
1
- import e from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
2
- import { installPointerFocusSuppression as t } from "../../shared/focus/pointer-focus.js";
3
- import { defineGroupManaged as n, selectionGroupContextKey as r } from "../../shared/group-management/index.js";
4
- import i from "./style.js";
5
- import { LitElement as a, html as o, unsafeCSS as s } from "lit";
6
- import { customElement as c, property as l } from "lit/decorators.js";
7
- import { classMap as u } from "lit/directives/class-map.js";
8
- //#region src/components/segmented-trigger/index.ts
9
- t();
10
- var d = class extends a {
11
- constructor(...e) {
12
- super(...e), this.value = "", this.checked = !1, this.disabled = !1, this._groupManagement = n(this, {
13
- context: r,
1
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
2
+ import { installPointerFocusSuppression } from "../../shared/focus/pointer-focus.js";
3
+ import { defineGroupManaged, selectionGroupContextKey } from "../../shared/group-management/index.js";
4
+ import style_default from "./style.js";
5
+ import { LitElement, html, unsafeCSS } from "lit";
6
+ import { customElement, property } from "lit/decorators.js";
7
+ import { classMap } from "lit/directives/class-map.js";
8
+ // src/components/segmented-trigger/index.ts
9
+ installPointerFocusSuppression();
10
+ let WebUiSegmentedTrigger = class WebUiSegmentedTrigger extends LitElement {
11
+ constructor(..._args) {
12
+ super(..._args);
13
+ this.value = "";
14
+ this.checked = false;
15
+ this.disabled = false;
16
+ this._groupManagement = defineGroupManaged(this, {
17
+ context: selectionGroupContextKey,
14
18
  requestUpdate: () => this.requestUpdate(),
15
- equals: (e, t) => e?.disabled === t?.disabled && e?.tabStop === t?.tabStop
19
+ equals: (a, b) => a?.disabled === b?.disabled && a?.tabStop === b?.tabStop
16
20
  }).make();
17
21
  }
18
22
  static {
19
- this.styles = s(i);
23
+ this.styles = unsafeCSS(style_default);
20
24
  }
21
25
  get _isDisabled() {
22
- return this.disabled || this._groupManagement.getContext()?.disabled === !0;
26
+ return this.disabled || this._groupManagement.getContext()?.disabled === true;
23
27
  }
24
28
  get _isManagedByGroup() {
25
29
  return this._groupManagement.getContext() !== void 0;
26
30
  }
27
31
  handleClick() {
28
32
  if (this._isDisabled || this.checked) return;
29
- this.checked = !0;
30
- let e = this._isManagedByGroup ? {
31
- bubbles: !1,
32
- composed: !1
33
+ this.checked = true;
34
+ const opts = this._isManagedByGroup ? {
35
+ bubbles: false,
36
+ composed: false
33
37
  } : {
34
- bubbles: !0,
35
- composed: !0
38
+ bubbles: true,
39
+ composed: true
36
40
  };
37
- this.dispatchEvent(new Event("change", e));
41
+ this.dispatchEvent(new Event("change", opts));
38
42
  }
39
43
  handleKeyDown(e) {
40
- (e.key === "Enter" || e.key === " ") && (e.preventDefault(), this.handleClick());
44
+ if (e.key === "Enter" || e.key === " ") {
45
+ e.preventDefault();
46
+ this.handleClick();
47
+ }
41
48
  }
42
49
  render() {
43
- let e = {
44
- "wui-segmented-trigger": !0,
50
+ const cls = {
51
+ "wui-segmented-trigger": true,
45
52
  "is-checked": this.checked,
46
53
  "is-disabled": this._isDisabled
47
54
  };
48
- return o`
55
+ return html`
49
56
  <div
50
- class=${u(e)}
51
- tabindex=${this._isDisabled || this._groupManagement.getContext()?.tabStop === !1 ? "-1" : "0"}
57
+ class=${classMap(cls)}
58
+ tabindex=${this._isDisabled || this._groupManagement.getContext()?.tabStop === false ? "-1" : "0"}
52
59
  role="option"
53
60
  aria-selected=${String(this.checked)}
54
61
  aria-disabled=${String(this._isDisabled)}
@@ -60,14 +67,16 @@ var d = class extends a {
60
67
  `;
61
68
  }
62
69
  };
63
- e([l({ type: String })], d.prototype, "value", void 0), e([l({
70
+ __decorate([property({ type: String })], WebUiSegmentedTrigger.prototype, "value", void 0);
71
+ __decorate([property({
64
72
  type: Boolean,
65
- reflect: !0
66
- })], d.prototype, "checked", void 0), e([l({
73
+ reflect: true
74
+ })], WebUiSegmentedTrigger.prototype, "checked", void 0);
75
+ __decorate([property({
67
76
  type: Boolean,
68
- reflect: !0
69
- })], d.prototype, "disabled", void 0), d = e([c("web-ui-segmented-trigger")], d);
70
- //#endregion
71
- export { d as WebUiSegmentedTrigger };
77
+ reflect: true
78
+ })], WebUiSegmentedTrigger.prototype, "disabled", void 0);
79
+ WebUiSegmentedTrigger = __decorate([customElement("web-ui-segmented-trigger")], WebUiSegmentedTrigger);
80
+ export { WebUiSegmentedTrigger };
72
81
 
73
82
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/segmented-trigger/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport { installPointerFocusSuppression } from '@/shared/focus/pointer-focus'\nimport { defineGroupManaged, selectionGroupContextKey, type SelectionGroupContext } from '@/shared/group-management'\n\nimport style from './style.css?inline'\n\ninstallPointerFocusSuppression()\n\n@customElement('web-ui-segmented-trigger')\nexport class WebUiSegmentedTrigger extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: String }) value = ''\n @property({ type: Boolean, reflect: true }) checked = false\n @property({ type: Boolean, reflect: true }) disabled = false\n\n private readonly _groupManagement = defineGroupManaged<SelectionGroupContext>(this, {\n context: selectionGroupContextKey,\n requestUpdate: () => this.requestUpdate(),\n equals: (a, b) => a?.disabled === b?.disabled && a?.tabStop === b?.tabStop\n }).make()\n\n private get _isDisabled(): boolean {\n return this.disabled || this._groupManagement.getContext()?.disabled === true\n }\n\n private get _isManagedByGroup(): boolean {\n return this._groupManagement.getContext() !== undefined\n }\n\n private handleClick() {\n if (this._isDisabled || this.checked) return\n this.checked = true\n // group-managed 时事件不冒泡/不组合,由 segmented 统一派发一次 host 事件\n const opts: EventInit = this._isManagedByGroup\n ? { bubbles: false, composed: false }\n : { bubbles: true, composed: true }\n this.dispatchEvent(new Event('change', opts))\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n this.handleClick()\n }\n }\n\n override render() {\n const cls = {\n 'wui-segmented-trigger': true,\n 'is-checked': this.checked,\n 'is-disabled': this._isDisabled\n }\n\n return html`\n <div\n class=${classMap(cls)}\n tabindex=${this._isDisabled || this._groupManagement.getContext()?.tabStop === false ? '-1' : '0'}\n role=\"option\"\n aria-selected=${String(this.checked)}\n aria-disabled=${String(this._isDisabled)}\n @click=${this.handleClick}\n @keydown=${this.handleKeyDown}\n >\n <slot></slot>\n </div>\n `\n }\n\n declare readonly $events: {\n change: Event\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-segmented-trigger': WebUiSegmentedTrigger\n }\n}\n"],"mappings":";;;;;;;;AASA,EAA+B;AAGxB,IAAM,IAAN,cAAoC,EAAW;;EAOhB,aAJA,KAAA,QAAA,IACkB,KAAA,UAAA,IACC,KAAA,WAAA,IAEnB,KAAA,mBAAA,EAA0C,MAAM;GAClF,SAAS;GACT,qBAAqB,KAAK,cAAc;GACxC,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG;EACrE,CAAC,CAAC,CAAC,KAAK;;;EAViB,KAAA,SAAA,EAAU,CAAK;;CAYxC,IAAY,cAAuB;EACjC,OAAO,KAAK,YAAY,KAAK,iBAAiB,WAAW,CAAC,EAAE,aAAa;CAC3E;CAEA,IAAY,oBAA6B;EACvC,OAAO,KAAK,iBAAiB,WAAW,MAAM,KAAA;CAChD;CAEA,cAAsB;EACpB,IAAI,KAAK,eAAe,KAAK,SAAS;EACtC,KAAK,UAAU;EAEf,IAAM,IAAkB,KAAK,oBACzB;GAAE,SAAS;GAAO,UAAU;EAAM,IAClC;GAAE,SAAS;GAAM,UAAU;EAAK;EACpC,KAAK,cAAc,IAAI,MAAM,UAAU,CAAI,CAAC;CAC9C;CAEA,cAAsB,GAAkB;EACtC,CAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,eAAe,GACjB,KAAK,YAAY;CAErB;CAEA,SAAkB;EAChB,IAAM,IAAM;GACV,yBAAyB;GACzB,cAAc,KAAK;GACnB,eAAe,KAAK;EACtB;EAEA,OAAO,CAAI;;gBAEC,EAAS,CAAG,EAAE;mBACX,KAAK,eAAe,KAAK,iBAAiB,WAAW,CAAC,EAAE,YAAY,KAAQ,OAAO,IAAI;;wBAElF,OAAO,KAAK,OAAO,EAAE;wBACrB,OAAO,KAAK,WAAW,EAAE;iBAChC,KAAK,YAAY;mBACf,KAAK,cAAc;;;;;CAKpC;AAKF;AA5DG,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,KAAA,CAAA,GACzB,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,WAAA,KAAA,CAAA,GACzC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,GAN3C,IAAA,EAAA,CAAA,EAAc,0BAA0B,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"index.js","names":["style"],"sources":["../../../src/components/segmented-trigger/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport { installPointerFocusSuppression } from '@/shared/focus/pointer-focus'\nimport { defineGroupManaged, selectionGroupContextKey, type SelectionGroupContext } from '@/shared/group-management'\n\nimport style from './style.css?inline'\n\ninstallPointerFocusSuppression()\n\n@customElement('web-ui-segmented-trigger')\nexport class WebUiSegmentedTrigger extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: String }) value = ''\n @property({ type: Boolean, reflect: true }) checked = false\n @property({ type: Boolean, reflect: true }) disabled = false\n\n private readonly _groupManagement = defineGroupManaged<SelectionGroupContext>(this, {\n context: selectionGroupContextKey,\n requestUpdate: () => this.requestUpdate(),\n equals: (a, b) => a?.disabled === b?.disabled && a?.tabStop === b?.tabStop\n }).make()\n\n private get _isDisabled(): boolean {\n return this.disabled || this._groupManagement.getContext()?.disabled === true\n }\n\n private get _isManagedByGroup(): boolean {\n return this._groupManagement.getContext() !== undefined\n }\n\n private handleClick() {\n if (this._isDisabled || this.checked) return\n this.checked = true\n // group-managed 时事件不冒泡/不组合,由 segmented 统一派发一次 host 事件\n const opts: EventInit = this._isManagedByGroup\n ? { bubbles: false, composed: false }\n : { bubbles: true, composed: true }\n this.dispatchEvent(new Event('change', opts))\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n this.handleClick()\n }\n }\n\n override render() {\n const cls = {\n 'wui-segmented-trigger': true,\n 'is-checked': this.checked,\n 'is-disabled': this._isDisabled\n }\n\n return html`\n <div\n class=${classMap(cls)}\n tabindex=${this._isDisabled || this._groupManagement.getContext()?.tabStop === false ? '-1' : '0'}\n role=\"option\"\n aria-selected=${String(this.checked)}\n aria-disabled=${String(this._isDisabled)}\n @click=${this.handleClick}\n @keydown=${this.handleKeyDown}\n >\n <slot></slot>\n </div>\n `\n }\n\n declare readonly $events: {\n change: Event\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-segmented-trigger': WebUiSegmentedTrigger\n }\n}\n"],"mappings":";;;;;;;;AASA,+BAA+B;AAGxB,IAAM,wBAAN,MAAM,8BAA8B,WAAW;;;EAGhB,KAAA,QAAA;EACkB,KAAA,UAAA;EACC,KAAA,WAAA;EAEnB,KAAA,mBAAA,mBAA0C,MAAM;GAClF,SAAS;GACT,qBAAqB,KAAK,cAAc;GACxC,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG;EACrE,CAAC,CAAC,CAAC,KAAK;;;EAViB,KAAA,SAAA,UAAUA,aAAK;;CAYxC,IAAY,cAAuB;EACjC,OAAO,KAAK,YAAY,KAAK,iBAAiB,WAAW,CAAC,EAAE,aAAa;CAC3E;CAEA,IAAY,oBAA6B;EACvC,OAAO,KAAK,iBAAiB,WAAW,MAAM,KAAA;CAChD;CAEA,cAAsB;EACpB,IAAI,KAAK,eAAe,KAAK,SAAS;EACtC,KAAK,UAAU;EAEf,MAAM,OAAkB,KAAK,oBACzB;GAAE,SAAS;GAAO,UAAU;EAAM,IAClC;GAAE,SAAS;GAAM,UAAU;EAAK;EACpC,KAAK,cAAc,IAAI,MAAM,UAAU,IAAI,CAAC;CAC9C;CAEA,cAAsB,GAAkB;EACtC,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;GACtC,EAAE,eAAe;GACjB,KAAK,YAAY;EACnB;CACF;CAEA,SAAkB;EAChB,MAAM,MAAM;GACV,yBAAyB;GACzB,cAAc,KAAK;GACnB,eAAe,KAAK;EACtB;EAEA,OAAO,IAAI;;gBAEC,SAAS,GAAG,EAAE;mBACX,KAAK,eAAe,KAAK,iBAAiB,WAAW,CAAC,EAAE,YAAY,QAAQ,OAAO,IAAI;;wBAElF,OAAO,KAAK,OAAO,EAAE;wBACrB,OAAO,KAAK,WAAW,EAAE;iBAChC,KAAK,YAAY;mBACf,KAAK,cAAc;;;;;CAKpC;AAKF;AA5DG,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,sBAAA,WAAA,SAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,sBAAA,WAAA,WAAA,KAAA,CAAA;AACzC,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,sBAAA,WAAA,YAAA,KAAA,CAAA;AAN3C,wBAAA,WAAA,CAAA,cAAc,0BAA0B,CAAA,GAAA,qBAAA"}
@@ -1,6 +1,5 @@
1
- //#region src/components/segmented-trigger/style.css?inline
2
- var e = "*,:before,:after{box-sizing:border-box}:host{--wui-segmented-trigger-bg-hover:var(--wui-color-state-layer-hover,color-mix(in srgb, var(--wui-color-text,#1b1b1b) 6%, transparent));--wui-segmented-trigger-bg-active:var(--wui-color-state-layer-active,color-mix(in srgb, var(--wui-color-text,#1b1b1b) 15%, transparent));touch-action:none;display:inline-block}:host([disabled]){cursor:not-allowed}.wui-segmented-trigger{cursor:var(--wui-internal-segmented-trigger-cursor,default);-webkit-user-select:none;user-select:none;z-index:1;height:calc(var(--wui-control-size,36px) - 8px);padding:0 var(--wui-segmented-trigger-px,var(--wui-space-3,12px));border-radius:var(--wui-radius-control,calc(infinity * 1px));font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);white-space:nowrap;transition:color var(--wui-duration-focus,.2s) ease;background-color:#0000;justify-content:center;align-items:center;line-height:1;display:inline-flex;position:relative}.wui-segmented-trigger:focus-visible{outline:var(--wui-focus-ring-width,3px) solid var(--wui-color-focus-ring,color-mix(in srgb, var(--wui-color-accent,#0071e3) 40%, transparent));outline-offset:2px}@media (hover:hover) and (pointer:fine){.wui-segmented-trigger:hover:not(.is-checked,.is-disabled){background-color:var(--wui-segmented-trigger-bg-hover)}}.wui-segmented-trigger:active:not(.is-checked,.is-disabled){background-color:var(--wui-segmented-trigger-bg-active)}.wui-segmented-trigger.is-disabled{cursor:not-allowed;opacity:.4}:host([data-wui-pointer-focus]) .wui-segmented-trigger:focus-visible{outline-color:#0000}";
3
- //#endregion
4
- export { e as default };
1
+ // src/components/segmented-trigger/style.css?inline
2
+ var style_default = "*,:before,:after{box-sizing:border-box}:host{--wui-segmented-trigger-bg-hover:var(--wui-color-state-layer-hover,color-mix(in srgb, var(--wui-color-text,#1b1b1b) 6%, transparent));--wui-segmented-trigger-bg-active:var(--wui-color-state-layer-active,color-mix(in srgb, var(--wui-color-text,#1b1b1b) 15%, transparent));touch-action:none;display:inline-block}:host([disabled]){cursor:not-allowed}.wui-segmented-trigger{cursor:var(--wui-internal-segmented-trigger-cursor,default);-webkit-user-select:none;user-select:none;z-index:1;height:calc(var(--wui-control-size,36px) - 8px);padding:0 var(--wui-segmented-trigger-px,var(--wui-space-3,12px));border-radius:var(--wui-radius-control,calc(infinity * 1px));font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);white-space:nowrap;transition:color var(--wui-duration-focus,.2s) ease;background-color:#0000;justify-content:center;align-items:center;line-height:1;display:inline-flex;position:relative}.wui-segmented-trigger:focus-visible{outline:var(--wui-focus-ring-width,3px) solid var(--wui-color-focus-ring,color-mix(in srgb, var(--wui-color-accent,#0071e3) 40%, transparent));outline-offset:2px}@media (hover:hover) and (pointer:fine){.wui-segmented-trigger:hover:not(.is-checked,.is-disabled){background-color:var(--wui-segmented-trigger-bg-hover)}}.wui-segmented-trigger:active:not(.is-checked,.is-disabled){background-color:var(--wui-segmented-trigger-bg-active)}.wui-segmented-trigger.is-disabled{cursor:not-allowed;opacity:.4}:host([data-wui-pointer-focus]) .wui-segmented-trigger:focus-visible{outline-color:#0000}\n";
3
+ export { style_default as default };
5
4
 
6
5
  //# sourceMappingURL=style.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/segmented-trigger/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n --wui-segmented-trigger-bg-hover: var(\n --wui-color-state-layer-hover,\n color-mix(in srgb, var(--wui-color-text, #1b1b1b) 6%, transparent)\n );\n --wui-segmented-trigger-bg-active: var(\n --wui-color-state-layer-active,\n color-mix(in srgb, var(--wui-color-text, #1b1b1b) 15%, transparent)\n );\n touch-action: none;\n display: inline-block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n}\n\n.wui-segmented-trigger {\n cursor: var(--wui-internal-segmented-trigger-cursor, default);\n user-select: none;\n\n position: relative;\n z-index: 1;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n height: calc(var(--wui-control-size, 36px) - 8px);\n padding: 0 var(--wui-segmented-trigger-px, var(--wui-space-3, 12px));\n border-radius: var(--wui-radius-control, calc(infinity * 1px));\n\n font-size: var(--wui-font-size, 14px);\n line-height: 1;\n\n /* 所有 label 同用主文本色,确保 indicator 上的文字满足正文对比度;选择状态仍由 indicator 承担。 */\n color: var(--wui-color-text, #1b1b1b);\n white-space: nowrap;\n\n background-color: transparent;\n\n transition: color var(--wui-duration-focus, 200ms) ease;\n\n &:focus-visible {\n outline: var(--wui-focus-ring-width, 3px) solid\n var(--wui-color-focus-ring, color-mix(in srgb, var(--wui-color-accent, #0071e3) 40%, transparent));\n outline-offset: 2px;\n }\n}\n\n@media (hover: hover) and (pointer: fine) {\n /* state layer 只服务未选中项:选中项的按压/悬停反馈由玻璃 indicator(indicator)承载,\n 已选中项再叠一层 6%/15% 灰底会盖在透明玻璃 indicator 之上(trigger z-index: 1 >\n indicator z-index: 0),按住已 option 到拖拽结束前 :active 一直不撤,整段手势都是\n 「灰底蒙在玻璃上」——即 #150「灰底在 indicator 层」要消除的残留。 */\n .wui-segmented-trigger:hover:not(.is-checked, .is-disabled) {\n background-color: var(--wui-segmented-trigger-bg-hover);\n }\n}\n\n.wui-segmented-trigger:active:not(.is-checked, .is-disabled) {\n background-color: var(--wui-segmented-trigger-bg-active);\n}\n\n.wui-segmented-trigger.is-disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n:host([data-wui-pointer-focus]) .wui-segmented-trigger:focus-visible {\n outline-color: transparent;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/segmented-trigger/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n --wui-segmented-trigger-bg-hover: var(\n --wui-color-state-layer-hover,\n color-mix(in srgb, var(--wui-color-text, #1b1b1b) 6%, transparent)\n );\n --wui-segmented-trigger-bg-active: var(\n --wui-color-state-layer-active,\n color-mix(in srgb, var(--wui-color-text, #1b1b1b) 15%, transparent)\n );\n touch-action: none;\n display: inline-block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n}\n\n.wui-segmented-trigger {\n cursor: var(--wui-internal-segmented-trigger-cursor, default);\n user-select: none;\n\n position: relative;\n z-index: 1;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n height: calc(var(--wui-control-size, 36px) - 8px);\n padding: 0 var(--wui-segmented-trigger-px, var(--wui-space-3, 12px));\n border-radius: var(--wui-radius-control, calc(infinity * 1px));\n\n font-size: var(--wui-font-size, 14px);\n line-height: 1;\n\n /* 所有 label 同用主文本色,确保 indicator 上的文字满足正文对比度;选择状态仍由 indicator 承担。 */\n color: var(--wui-color-text, #1b1b1b);\n white-space: nowrap;\n\n background-color: transparent;\n\n transition: color var(--wui-duration-focus, 200ms) ease;\n\n &:focus-visible {\n outline: var(--wui-focus-ring-width, 3px) solid\n var(--wui-color-focus-ring, color-mix(in srgb, var(--wui-color-accent, #0071e3) 40%, transparent));\n outline-offset: 2px;\n }\n}\n\n@media (hover: hover) and (pointer: fine) {\n /* state layer 只服务未选中项:选中项的按压/悬停反馈由玻璃 indicator(indicator)承载,\n 已选中项再叠一层 6%/15% 灰底会盖在透明玻璃 indicator 之上(trigger z-index: 1 >\n indicator z-index: 0),按住已 option 到拖拽结束前 :active 一直不撤,整段手势都是\n 「灰底蒙在玻璃上」——即 #150「灰底在 indicator 层」要消除的残留。 */\n .wui-segmented-trigger:hover:not(.is-checked, .is-disabled) {\n background-color: var(--wui-segmented-trigger-bg-hover);\n }\n}\n\n.wui-segmented-trigger:active:not(.is-checked, .is-disabled) {\n background-color: var(--wui-segmented-trigger-bg-active);\n}\n\n.wui-segmented-trigger.is-disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n:host([data-wui-pointer-focus]) .wui-segmented-trigger:focus-visible {\n outline-color: transparent;\n}\n"],"mappings":";AAAA,IAAA,gBAAA"}