@endfield-ui/react 1.1.0 → 1.2.1

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 (496) hide show
  1. package/NOTICE.md +4 -3
  2. package/README.md +32 -5
  3. package/dist/components/accordion/Accordion.d.ts +46 -0
  4. package/dist/components/accordion/Accordion.js +2 -0
  5. package/dist/components/accordion/index.d.ts +3 -0
  6. package/dist/components/alert/Alert.d.ts +28 -0
  7. package/dist/components/alert/Alert.js +2 -0
  8. package/dist/components/alert/index.d.ts +3 -0
  9. package/dist/components/avatar/Avatar.d.ts +24 -0
  10. package/dist/components/avatar/Avatar.js +2 -0
  11. package/dist/components/avatar/AvatarSwitcher.d.ts +46 -0
  12. package/dist/components/avatar/AvatarSwitcher.js +2 -0
  13. package/dist/components/avatar/index.d.ts +4 -0
  14. package/dist/components/back-to-top/BackToTop.d.ts +21 -0
  15. package/dist/components/back-to-top/BackToTop.js +2 -0
  16. package/dist/components/back-to-top/index.d.ts +3 -0
  17. package/dist/components/badge/Badge.d.ts +20 -0
  18. package/dist/components/badge/Badge.js +2 -0
  19. package/dist/components/badge/index.d.ts +3 -0
  20. package/dist/components/bracket-title/BracketTitle.d.ts +17 -0
  21. package/dist/components/bracket-title/BracketTitle.js +2 -0
  22. package/dist/components/bracket-title/index.d.ts +3 -0
  23. package/dist/components/breadcrumb/Breadcrumb.d.ts +26 -0
  24. package/dist/components/breadcrumb/Breadcrumb.js +2 -0
  25. package/dist/components/breadcrumb/index.d.ts +3 -0
  26. package/dist/components/button/Button.d.ts +50 -0
  27. package/dist/components/button/Button.js +2 -0
  28. package/dist/components/button/ButtonGroup.d.ts +21 -0
  29. package/dist/components/button/ButtonGroup.js +2 -0
  30. package/dist/components/button/index.d.ts +4 -0
  31. package/dist/components/calendar/Calendar.d.ts +57 -0
  32. package/dist/components/calendar/Calendar.js +2 -0
  33. package/dist/components/calendar/index.d.ts +3 -0
  34. package/dist/components/carousel/Carousel.d.ts +38 -0
  35. package/dist/components/carousel/Carousel.js +2 -0
  36. package/dist/components/carousel/index.d.ts +3 -0
  37. package/dist/components/carousel/snap-track.js +2 -0
  38. package/dist/components/checkbox/Checkbox.d.ts +18 -0
  39. package/dist/components/checkbox/Checkbox.js +2 -0
  40. package/dist/components/checkbox/choice-style.js +2 -0
  41. package/dist/components/checkbox/index.d.ts +3 -0
  42. package/dist/components/chip/FilterChip.d.ts +18 -0
  43. package/dist/components/chip/FilterChip.js +2 -0
  44. package/dist/components/chip/ResourceChip.d.ts +16 -0
  45. package/dist/components/chip/ResourceChip.js +2 -0
  46. package/dist/components/chip/capsule-style.d.ts +4 -0
  47. package/dist/components/chip/capsule-style.js +2 -0
  48. package/dist/components/chip/index.d.ts +4 -0
  49. package/dist/components/combobox/Combobox.d.ts +105 -0
  50. package/dist/components/combobox/Combobox.js +2 -0
  51. package/dist/components/combobox/index.d.ts +3 -0
  52. package/dist/components/completion-banner/CompletionBanner.d.ts +26 -0
  53. package/dist/components/completion-banner/CompletionBanner.js +2 -0
  54. package/dist/components/completion-banner/index.d.ts +3 -0
  55. package/dist/components/context-menu/ContextMenu.d.ts +30 -0
  56. package/dist/components/context-menu/ContextMenu.js +2 -0
  57. package/dist/components/context-menu/index.d.ts +3 -0
  58. package/dist/components/corner-brackets/CornerBrackets.d.ts +20 -0
  59. package/dist/components/corner-brackets/CornerBrackets.js +2 -0
  60. package/dist/components/corner-brackets/index.d.ts +3 -0
  61. package/dist/components/countdown/Countdown.d.ts +26 -0
  62. package/dist/components/countdown/Countdown.js +2 -0
  63. package/dist/components/countdown/index.d.ts +3 -0
  64. package/dist/components/dash-indicator/DashIndicator.d.ts +15 -0
  65. package/dist/components/dash-indicator/DashIndicator.js +2 -0
  66. package/dist/components/dash-indicator/index.d.ts +3 -0
  67. package/dist/components/data-row/DataRow.d.ts +58 -0
  68. package/dist/components/data-row/DataRow.js +2 -0
  69. package/dist/components/data-row/index.d.ts +3 -0
  70. package/dist/components/date-picker/DateField.js +2 -0
  71. package/dist/components/date-picker/DatePicker.d.ts +56 -0
  72. package/dist/components/date-picker/DatePicker.js +2 -0
  73. package/dist/components/date-picker/DateRangePicker.d.ts +57 -0
  74. package/dist/components/date-picker/DateRangePicker.js +2 -0
  75. package/dist/components/date-picker/index.d.ts +4 -0
  76. package/dist/components/dialog/Dialog.d.ts +55 -0
  77. package/dist/components/dialog/Dialog.js +2 -0
  78. package/dist/components/dialog/index.d.ts +3 -0
  79. package/dist/components/dialog/initial-focus.js +2 -0
  80. package/dist/components/dialog/overlay-style.js +2 -0
  81. package/dist/components/drawer/Drawer.d.ts +48 -0
  82. package/dist/components/drawer/Drawer.js +2 -0
  83. package/dist/components/drawer/index.d.ts +3 -0
  84. package/dist/components/dropdown-menu/DropdownMenu.d.ts +115 -0
  85. package/dist/components/dropdown-menu/DropdownMenu.js +2 -0
  86. package/dist/components/dropdown-menu/MenuCheck.js +2 -0
  87. package/dist/components/dropdown-menu/index.d.ts +3 -0
  88. package/dist/components/dropdown-menu/menu-style.d.ts +4 -0
  89. package/dist/components/dropdown-menu/menu-style.js +2 -0
  90. package/dist/components/empty-state/EmptyState.d.ts +22 -0
  91. package/dist/components/empty-state/EmptyState.js +2 -0
  92. package/dist/components/empty-state/index.d.ts +3 -0
  93. package/dist/components/field/Field.d.ts +58 -0
  94. package/dist/components/field/Field.js +2 -0
  95. package/dist/components/field/index.d.ts +3 -0
  96. package/dist/components/file-upload/FileItem.d.ts +50 -0
  97. package/dist/components/file-upload/FileItem.js +2 -0
  98. package/dist/components/file-upload/FileUpload.d.ts +82 -0
  99. package/dist/components/file-upload/FileUpload.js +2 -0
  100. package/dist/components/file-upload/index.d.ts +4 -0
  101. package/dist/components/flyout-bar/FlyoutBar.d.ts +46 -0
  102. package/dist/components/flyout-bar/FlyoutBar.js +2 -0
  103. package/dist/components/flyout-bar/index.d.ts +3 -0
  104. package/dist/components/ghost-text/GhostText.d.ts +21 -0
  105. package/dist/components/ghost-text/GhostText.js +2 -0
  106. package/dist/components/ghost-text/index.d.ts +3 -0
  107. package/dist/components/hatch/Hatch.d.ts +18 -0
  108. package/dist/components/hatch/Hatch.js +2 -0
  109. package/dist/components/hatch/index.d.ts +3 -0
  110. package/dist/components/hazard-stripe/HazardStripe.d.ts +15 -0
  111. package/dist/components/hazard-stripe/HazardStripe.js +2 -0
  112. package/dist/components/hazard-stripe/index.d.ts +3 -0
  113. package/dist/components/hover-card/HoverCard.d.ts +35 -0
  114. package/dist/components/hover-card/HoverCard.js +2 -0
  115. package/dist/components/hover-card/index.d.ts +3 -0
  116. package/dist/components/icon-button/IconButton.d.ts +21 -0
  117. package/dist/components/icon-button/IconButton.js +2 -0
  118. package/dist/components/icon-button/index.d.ts +3 -0
  119. package/dist/components/image-viewer/ImageViewer.d.ts +48 -0
  120. package/dist/components/image-viewer/ImageViewer.js +2 -0
  121. package/dist/components/image-viewer/index.d.ts +3 -0
  122. package/dist/components/input/Input.d.ts +27 -0
  123. package/dist/components/input/Input.js +2 -0
  124. package/dist/components/input/control-box.d.ts +5 -0
  125. package/dist/components/input/control-box.js +2 -0
  126. package/dist/components/input/index.d.ts +3 -0
  127. package/dist/components/input/value-chip.js +2 -0
  128. package/dist/components/item-slot/ItemGrid.d.ts +12 -0
  129. package/dist/components/item-slot/ItemGrid.js +2 -0
  130. package/dist/components/item-slot/ItemSlot.d.ts +54 -0
  131. package/dist/components/item-slot/ItemSlot.js +2 -0
  132. package/dist/components/item-slot/index.d.ts +4 -0
  133. package/dist/components/kbd/Kbd.d.ts +15 -0
  134. package/dist/components/kbd/Kbd.js +2 -0
  135. package/dist/components/kbd/index.d.ts +3 -0
  136. package/dist/components/link-element/LinkElement.d.ts +6 -0
  137. package/dist/components/link-element/LinkElement.js +2 -0
  138. package/dist/components/list/List.d.ts +46 -0
  139. package/dist/components/list/List.js +2 -0
  140. package/dist/components/list/band-style.js +2 -0
  141. package/dist/components/list/index.d.ts +3 -0
  142. package/dist/components/loader/Loader.d.ts +23 -0
  143. package/dist/components/loader/Loader.js +2 -0
  144. package/dist/components/loader/index.d.ts +3 -0
  145. package/dist/components/marquee/Marquee.d.ts +22 -0
  146. package/dist/components/marquee/Marquee.js +2 -0
  147. package/dist/components/marquee/index.d.ts +3 -0
  148. package/dist/components/media-card/MediaCard.d.ts +36 -0
  149. package/dist/components/media-card/MediaCard.js +2 -0
  150. package/dist/components/media-card/index.d.ts +3 -0
  151. package/dist/components/nav-action/NavAction.d.ts +34 -0
  152. package/dist/components/nav-action/NavAction.js +2 -0
  153. package/dist/components/nav-action/index.d.ts +3 -0
  154. package/dist/components/nav-menu/NavMenu.d.ts +57 -0
  155. package/dist/components/nav-menu/NavMenu.js +2 -0
  156. package/dist/components/nav-menu/index.d.ts +3 -0
  157. package/dist/components/navigator/Navigator.d.ts +27 -0
  158. package/dist/components/navigator/Navigator.js +2 -0
  159. package/dist/components/navigator/index.d.ts +3 -0
  160. package/dist/components/otp-input/OtpInput.d.ts +52 -0
  161. package/dist/components/otp-input/OtpInput.js +2 -0
  162. package/dist/components/otp-input/index.d.ts +3 -0
  163. package/dist/components/page-header/PageHeader.d.ts +56 -0
  164. package/dist/components/page-header/PageHeader.js +2 -0
  165. package/dist/components/page-header/index.d.ts +3 -0
  166. package/dist/components/pagination/Pagination.d.ts +29 -0
  167. package/dist/components/pagination/Pagination.js +2 -0
  168. package/dist/components/pagination/index.d.ts +3 -0
  169. package/dist/components/panel/Panel.d.ts +36 -0
  170. package/dist/components/panel/Panel.js +2 -0
  171. package/dist/components/panel/index.d.ts +3 -0
  172. package/dist/components/play-button/PlayButton.d.ts +20 -0
  173. package/dist/components/play-button/PlayButton.js +2 -0
  174. package/dist/components/play-button/index.d.ts +3 -0
  175. package/dist/components/popover/Popover.d.ts +36 -0
  176. package/dist/components/popover/Popover.js +2 -0
  177. package/dist/components/popover/index.d.ts +3 -0
  178. package/dist/components/popover/panel-style.js +2 -0
  179. package/dist/components/progress/Progress.d.ts +27 -0
  180. package/dist/components/progress/Progress.js +2 -0
  181. package/dist/components/progress/ProgressRing.d.ts +23 -0
  182. package/dist/components/progress/ProgressRing.js +2 -0
  183. package/dist/components/progress/index.d.ts +4 -0
  184. package/dist/components/radio/Radio.d.ts +33 -0
  185. package/dist/components/radio/Radio.js +2 -0
  186. package/dist/components/radio/index.d.ts +3 -0
  187. package/dist/components/rec-indicator/RecIndicator.d.ts +16 -0
  188. package/dist/components/rec-indicator/RecIndicator.js +2 -0
  189. package/dist/components/rec-indicator/index.d.ts +3 -0
  190. package/dist/components/registration-strip/RegistrationStrip.d.ts +16 -0
  191. package/dist/components/registration-strip/RegistrationStrip.js +2 -0
  192. package/dist/components/registration-strip/index.d.ts +3 -0
  193. package/dist/components/rolling-number/RollingNumber.d.ts +25 -0
  194. package/dist/components/rolling-number/RollingNumber.js +2 -0
  195. package/dist/components/rolling-number/index.d.ts +3 -0
  196. package/dist/components/schedule/Schedule.d.ts +78 -0
  197. package/dist/components/schedule/Schedule.js +2 -0
  198. package/dist/components/schedule/index.d.ts +3 -0
  199. package/dist/components/scroll-area/ScrollArea.d.ts +26 -0
  200. package/dist/components/scroll-area/ScrollArea.js +2 -0
  201. package/dist/components/scroll-area/index.d.ts +3 -0
  202. package/dist/components/scroll-hint/ScrollHint.d.ts +23 -0
  203. package/dist/components/scroll-hint/ScrollHint.js +2 -0
  204. package/dist/components/scroll-hint/index.d.ts +3 -0
  205. package/dist/components/section-title/SectionTitle.d.ts +33 -0
  206. package/dist/components/section-title/SectionTitle.js +2 -0
  207. package/dist/components/section-title/index.d.ts +3 -0
  208. package/dist/components/segmented-control/SegmentedControl.d.ts +49 -0
  209. package/dist/components/segmented-control/SegmentedControl.js +2 -0
  210. package/dist/components/segmented-control/index.d.ts +3 -0
  211. package/dist/components/select/Select.d.ts +95 -0
  212. package/dist/components/select/Select.js +2 -0
  213. package/dist/components/select/index.d.ts +3 -0
  214. package/dist/components/side-rail/SideRail.d.ts +62 -0
  215. package/dist/components/side-rail/SideRail.js +2 -0
  216. package/dist/components/side-rail/SideRailSub.d.ts +47 -0
  217. package/dist/components/side-rail/SideRailSub.js +2 -0
  218. package/dist/components/side-rail/index.d.ts +4 -0
  219. package/dist/components/skeleton/Skeleton.d.ts +22 -0
  220. package/dist/components/skeleton/Skeleton.js +2 -0
  221. package/dist/components/skeleton/index.d.ts +3 -0
  222. package/dist/components/slider/Slider.d.ts +63 -0
  223. package/dist/components/slider/Slider.js +2 -0
  224. package/dist/components/slider/index.d.ts +3 -0
  225. package/dist/components/sparkline/Sparkline.d.ts +32 -0
  226. package/dist/components/sparkline/Sparkline.js +2 -0
  227. package/dist/components/sparkline/index.d.ts +3 -0
  228. package/dist/components/spinner/Spinner.d.ts +19 -0
  229. package/dist/components/spinner/Spinner.js +2 -0
  230. package/dist/components/spinner/index.d.ts +3 -0
  231. package/dist/components/splash-screen/SplashScreen.d.ts +43 -0
  232. package/dist/components/splash-screen/SplashScreen.js +2 -0
  233. package/dist/components/splash-screen/index.d.ts +3 -0
  234. package/dist/components/stat/Stat.d.ts +22 -0
  235. package/dist/components/stat/Stat.js +2 -0
  236. package/dist/components/stat/index.d.ts +3 -0
  237. package/dist/components/stepper/Stepper.d.ts +29 -0
  238. package/dist/components/stepper/Stepper.js +2 -0
  239. package/dist/components/stepper/index.d.ts +3 -0
  240. package/dist/components/steps/Steps.d.ts +55 -0
  241. package/dist/components/steps/Steps.js +2 -0
  242. package/dist/components/steps/index.d.ts +3 -0
  243. package/dist/components/switch/Switch.d.ts +28 -0
  244. package/dist/components/switch/Switch.js +2 -0
  245. package/dist/components/switch/index.d.ts +3 -0
  246. package/dist/components/table/Table.d.ts +96 -0
  247. package/dist/components/table/Table.js +2 -0
  248. package/dist/components/table/index.d.ts +3 -0
  249. package/dist/components/tabs/Tabs.d.ts +39 -0
  250. package/dist/components/tabs/Tabs.js +2 -0
  251. package/dist/components/tabs/index.d.ts +3 -0
  252. package/dist/components/tag/Tag.d.ts +25 -0
  253. package/dist/components/tag/Tag.js +2 -0
  254. package/dist/components/tag/TagPair.d.ts +16 -0
  255. package/dist/components/tag/TagPair.js +2 -0
  256. package/dist/components/tag/index.d.ts +4 -0
  257. package/dist/components/tag-input/TagInput.d.ts +66 -0
  258. package/dist/components/tag-input/TagInput.js +3 -0
  259. package/dist/components/tag-input/index.d.ts +3 -0
  260. package/dist/components/term/Term.d.ts +19 -0
  261. package/dist/components/term/Term.js +2 -0
  262. package/dist/components/term/index.d.ts +3 -0
  263. package/dist/components/textarea/Textarea.d.ts +17 -0
  264. package/dist/components/textarea/Textarea.js +2 -0
  265. package/dist/components/textarea/index.d.ts +3 -0
  266. package/dist/components/texture/Texture.d.ts +19 -0
  267. package/dist/components/texture/Texture.js +2 -0
  268. package/dist/components/texture/index.d.ts +3 -0
  269. package/dist/components/tick-ring/TickRing.d.ts +22 -0
  270. package/dist/components/tick-ring/TickRing.js +2 -0
  271. package/dist/components/tick-ring/index.d.ts +3 -0
  272. package/dist/components/timeline/Timeline.d.ts +22 -0
  273. package/dist/components/timeline/Timeline.js +2 -0
  274. package/dist/components/timeline/index.d.ts +3 -0
  275. package/dist/components/toast/Toast.d.ts +45 -0
  276. package/dist/components/toast/Toast.js +2 -0
  277. package/dist/components/toast/index.d.ts +3 -0
  278. package/dist/components/toc/Toc.d.ts +46 -0
  279. package/dist/components/toc/Toc.js +2 -0
  280. package/dist/components/toc/index.d.ts +3 -0
  281. package/dist/components/toolbar/Toolbar.d.ts +97 -0
  282. package/dist/components/toolbar/Toolbar.js +2 -0
  283. package/dist/components/toolbar/index.d.ts +3 -0
  284. package/dist/components/tooltip/Tooltip.d.ts +47 -0
  285. package/dist/components/tooltip/Tooltip.js +2 -0
  286. package/dist/components/tooltip/index.d.ts +3 -0
  287. package/dist/components/top-bar/TopBar.d.ts +21 -0
  288. package/dist/components/top-bar/TopBar.js +2 -0
  289. package/dist/components/top-bar/index.d.ts +3 -0
  290. package/dist/components/viewfinder/Viewfinder.d.ts +35 -0
  291. package/dist/components/viewfinder/Viewfinder.js +2 -0
  292. package/dist/components/viewfinder/index.d.ts +3 -0
  293. package/dist/game/animated-dialog/AnimatedDialog.d.ts +53 -0
  294. package/dist/game/animated-dialog/AnimatedDialog.js +2 -0
  295. package/dist/game/animated-dialog/index.d.ts +3 -0
  296. package/dist/game/assets/splash_bg.jpg +0 -0
  297. package/dist/game/assets/splash_bg_portrait.jpg +0 -0
  298. package/dist/game/assets/splash_deco.svg +4 -0
  299. package/dist/game/assets/splash_logo.svg +1 -0
  300. package/dist/game/assets/splash_triangles.svg +4 -0
  301. package/dist/game/banner-alert/AlertIcons.js +2 -0
  302. package/dist/game/banner-alert/AlertModal.js +2 -0
  303. package/dist/game/banner-alert/BannerAlert.d.ts +6 -0
  304. package/dist/game/banner-alert/BannerAlert.js +2 -0
  305. package/dist/game/banner-alert/index.d.ts +3 -0
  306. package/dist/game/banner-alert/types.d.ts +48 -0
  307. package/dist/game/banner-alert/types.js +2 -0
  308. package/dist/game/banner-alert/useAlertActions.js +2 -0
  309. package/dist/game/banner-alert/useAlertGlitch.js +2 -0
  310. package/dist/game/full-width-alert/FullWidthAlert.d.ts +7 -0
  311. package/dist/game/full-width-alert/FullWidthAlert.js +2 -0
  312. package/dist/game/full-width-alert/index.d.ts +3 -0
  313. package/dist/game/item-card/ItemCard.d.ts +48 -0
  314. package/dist/game/item-card/ItemCard.js +2 -0
  315. package/dist/game/item-card/index.d.ts +3 -0
  316. package/dist/game/item-hover-card/ItemHoverCard.d.ts +31 -0
  317. package/dist/game/item-hover-card/ItemHoverCard.js +2 -0
  318. package/dist/game/item-hover-card/events.js +2 -0
  319. package/dist/game/item-hover-card/index.d.ts +3 -0
  320. package/dist/game/item-icon/ItemIcon.d.ts +5 -0
  321. package/dist/game/item-icon/ItemIcon.js +2 -0
  322. package/dist/game/item-icon/helpers.d.ts +22 -0
  323. package/dist/game/item-icon/helpers.js +2 -0
  324. package/dist/game/item-icon/index.d.ts +5 -0
  325. package/dist/game/item-icon/types.d.ts +32 -0
  326. package/dist/game/item-tooltip-card/ItemTooltipCard.d.ts +6 -0
  327. package/dist/game/item-tooltip-card/ItemTooltipCard.js +2 -0
  328. package/dist/game/item-tooltip-card/icons.js +2 -0
  329. package/dist/game/item-tooltip-card/index.d.ts +4 -0
  330. package/dist/game/item-tooltip-card/types.d.ts +40 -0
  331. package/dist/game/lib/core.d.ts +8 -0
  332. package/dist/game/lib/first-focusable.js +2 -0
  333. package/dist/game/resource-provenance.json +70 -1
  334. package/dist/game/rounded-button/RoundedButton.d.ts +22 -0
  335. package/dist/game/rounded-button/RoundedButton.js +2 -0
  336. package/dist/game/rounded-button/RoundedIconButton.d.ts +10 -0
  337. package/dist/game/rounded-button/RoundedIconButton.js +2 -0
  338. package/dist/game/rounded-button/index.d.ts +4 -0
  339. package/dist/game/rounded-select/RoundedSelect.d.ts +43 -0
  340. package/dist/game/rounded-select/RoundedSelect.js +2 -0
  341. package/dist/game/rounded-select/index.d.ts +3 -0
  342. package/dist/game/rounded-switch/RoundedSwitch.d.ts +16 -0
  343. package/dist/game/rounded-switch/RoundedSwitch.js +2 -0
  344. package/dist/game/rounded-switch/index.d.ts +3 -0
  345. package/dist/game/rounded-toggle/RoundedToggle.d.ts +23 -0
  346. package/dist/game/rounded-toggle/RoundedToggle.js +2 -0
  347. package/dist/game/rounded-toggle/index.d.ts +3 -0
  348. package/dist/game/rounded-toggle/keyboard.js +2 -0
  349. package/dist/game/rounded-toggle/spring-highlight.js +2 -0
  350. package/dist/game/splash-screen/EndfieldSplashScreen.d.ts +14 -0
  351. package/dist/game/splash-screen/EndfieldSplashScreen.js +2 -0
  352. package/dist/game/splash-screen/index.d.ts +3 -0
  353. package/dist/game/styles.css +1 -1
  354. package/dist/game.d.ts +29 -371
  355. package/dist/game.js +1 -2041
  356. package/dist/hooks/index.d.ts +7 -0
  357. package/dist/hooks/useAddedKeys.js +2 -0
  358. package/dist/hooks/useControllableState.d.ts +12 -0
  359. package/dist/hooks/useControllableState.js +2 -0
  360. package/dist/hooks/useFlip.js +2 -0
  361. package/dist/hooks/useInView.d.ts +15 -0
  362. package/dist/hooks/useInView.js +2 -0
  363. package/dist/hooks/useIndicator.js +2 -0
  364. package/dist/hooks/useLingering.js +2 -0
  365. package/dist/hooks/useOverflowing.js +2 -0
  366. package/dist/hooks/usePortalScope.d.ts +26 -0
  367. package/dist/hooks/usePortalScope.js +2 -0
  368. package/dist/hooks/usePresence.js +2 -0
  369. package/dist/hooks/useReducedMotion.d.ts +10 -0
  370. package/dist/hooks/useReducedMotion.js +2 -0
  371. package/dist/hooks/useScrollPosition.js +2 -0
  372. package/dist/hooks/useTheme.d.ts +21 -0
  373. package/dist/hooks/useTheme.js +2 -0
  374. package/dist/icons/ArrowCorner.d.ts +9 -0
  375. package/dist/icons/ArrowCorner.js +2 -0
  376. package/dist/icons/ArrowLeft.d.ts +8 -0
  377. package/dist/icons/ArrowLeft.js +2 -0
  378. package/dist/icons/ArrowRight.d.ts +8 -0
  379. package/dist/icons/ArrowRight.js +2 -0
  380. package/dist/icons/CalendarIcon.d.ts +12 -0
  381. package/dist/icons/CalendarIcon.js +2 -0
  382. package/dist/icons/Check.d.ts +9 -0
  383. package/dist/icons/Check.js +2 -0
  384. package/dist/icons/ChevronDown.d.ts +8 -0
  385. package/dist/icons/ChevronDown.js +2 -0
  386. package/dist/icons/ChevronLeft.d.ts +8 -0
  387. package/dist/icons/ChevronLeft.js +2 -0
  388. package/dist/icons/ChevronRight.d.ts +8 -0
  389. package/dist/icons/ChevronRight.js +2 -0
  390. package/dist/icons/Close.d.ts +8 -0
  391. package/dist/icons/Close.js +2 -0
  392. package/dist/icons/Crosshair.d.ts +9 -0
  393. package/dist/icons/Crosshair.js +2 -0
  394. package/dist/icons/Lock.d.ts +8 -0
  395. package/dist/icons/Lock.js +2 -0
  396. package/dist/icons/Menu.d.ts +9 -0
  397. package/dist/icons/Menu.js +2 -0
  398. package/dist/icons/Minus.d.ts +9 -0
  399. package/dist/icons/Minus.js +2 -0
  400. package/dist/icons/Plus.d.ts +8 -0
  401. package/dist/icons/Plus.js +2 -0
  402. package/dist/icons/StatusDanger.d.ts +9 -0
  403. package/dist/icons/StatusDanger.js +2 -0
  404. package/dist/icons/StatusInfo.d.ts +9 -0
  405. package/dist/icons/StatusInfo.js +2 -0
  406. package/dist/icons/StatusSuccess.d.ts +9 -0
  407. package/dist/icons/StatusSuccess.js +2 -0
  408. package/dist/icons/StatusWarning.d.ts +9 -0
  409. package/dist/icons/StatusWarning.js +2 -0
  410. package/dist/icons/TriangleRight.d.ts +9 -0
  411. package/dist/icons/TriangleRight.js +2 -0
  412. package/dist/icons/Upload.d.ts +9 -0
  413. package/dist/icons/Upload.js +2 -0
  414. package/dist/icons/createIcon.d.ts +16 -0
  415. package/dist/icons/createIcon.js +2 -0
  416. package/dist/icons/index.d.ts +23 -0
  417. package/dist/index.d.ts +209 -3505
  418. package/dist/index.js +1 -9625
  419. package/dist/lib/cn.d.ts +5 -0
  420. package/dist/lib/cn.js +2 -0
  421. package/dist/lib/create-lazy-context.js +2 -0
  422. package/dist/lib/date.js +2 -0
  423. package/dist/lib/decor.js +2 -0
  424. package/dist/lib/defined.js +2 -0
  425. package/dist/lib/file.js +2 -0
  426. package/dist/lib/focus-ring.js +2 -0
  427. package/dist/lib/inline-style.js +2 -0
  428. package/dist/lib/merge-refs.js +2 -0
  429. package/dist/lib/motion.js +2 -0
  430. package/dist/styles.css +1 -1
  431. package/package.json +17 -11
  432. package/src/components/accordion/Accordion.tsx +13 -5
  433. package/src/components/alert/Alert.tsx +1 -1
  434. package/src/components/avatar/AvatarSwitcher.tsx +7 -5
  435. package/src/components/carousel/Carousel.tsx +6 -5
  436. package/src/components/context-menu/ContextMenu.tsx +5 -2
  437. package/src/components/data-row/DataRow.tsx +10 -4
  438. package/src/components/date-picker/DateField.tsx +1 -3
  439. package/src/components/dropdown-menu/DropdownMenu.tsx +7 -4
  440. package/src/components/dropdown-menu/menu-style.ts +9 -3
  441. package/src/components/field/Field.tsx +10 -6
  442. package/src/components/file-upload/FileUpload.tsx +5 -2
  443. package/src/components/flyout-bar/FlyoutBar.tsx +1 -1
  444. package/src/components/image-viewer/ImageViewer.tsx +6 -5
  445. package/src/components/input/control-box.ts +30 -10
  446. package/src/components/list/List.tsx +7 -5
  447. package/src/components/nav-action/NavAction.tsx +4 -3
  448. package/src/components/nav-menu/NavMenu.tsx +13 -7
  449. package/src/components/otp-input/OtpInput.tsx +35 -43
  450. package/src/components/radio/Radio.tsx +7 -5
  451. package/src/components/schedule/Schedule.tsx +7 -5
  452. package/src/components/segmented-control/SegmentedControl.tsx +9 -7
  453. package/src/components/select/Select.tsx +11 -11
  454. package/src/components/side-rail/SideRail.tsx +15 -9
  455. package/src/components/side-rail/SideRailSub.tsx +12 -7
  456. package/src/components/splash-screen/SplashScreen.tsx +340 -0
  457. package/src/components/splash-screen/index.ts +1 -0
  458. package/src/components/steps/Steps.tsx +7 -5
  459. package/src/components/table/Table.tsx +23 -17
  460. package/src/components/tabs/Tabs.tsx +7 -5
  461. package/src/components/tag-input/TagInput.tsx +5 -2
  462. package/src/components/toast/Toast.tsx +12 -8
  463. package/src/components/toc/Toc.tsx +5 -4
  464. package/src/components/toolbar/Toolbar.tsx +7 -6
  465. package/src/components/tooltip/Tooltip.tsx +7 -4
  466. package/src/components/top-bar/TopBar.tsx +7 -2
  467. package/src/icons/ArrowCorner.tsx +1 -1
  468. package/src/icons/ArrowLeft.tsx +1 -1
  469. package/src/icons/ArrowRight.tsx +1 -1
  470. package/src/icons/CalendarIcon.tsx +1 -1
  471. package/src/icons/Check.tsx +4 -1
  472. package/src/icons/ChevronDown.tsx +4 -1
  473. package/src/icons/ChevronLeft.tsx +1 -1
  474. package/src/icons/ChevronRight.tsx +1 -1
  475. package/src/icons/Close.tsx +4 -1
  476. package/src/icons/Crosshair.tsx +1 -1
  477. package/src/icons/Lock.tsx +1 -1
  478. package/src/icons/Menu.tsx +4 -1
  479. package/src/icons/Minus.tsx +1 -1
  480. package/src/icons/Plus.tsx +4 -1
  481. package/src/icons/StatusDanger.tsx +1 -1
  482. package/src/icons/StatusInfo.tsx +1 -1
  483. package/src/icons/StatusSuccess.tsx +1 -1
  484. package/src/icons/StatusWarning.tsx +1 -1
  485. package/src/icons/TriangleRight.tsx +1 -1
  486. package/src/icons/Upload.tsx +1 -1
  487. package/src/index.ts +1 -0
  488. package/src/lib/cn.ts +1 -1
  489. package/src/lib/create-lazy-context.ts +6 -0
  490. package/src/styles/theme.css +33 -0
  491. package/src/styles/utilities.css +8 -0
  492. package/src/components/README.md +0 -190
  493. package/src/hooks/README.md +0 -20
  494. package/src/icons/README.md +0 -31
  495. package/src/lib/README.md +0 -19
  496. package/src/styles/README.md +0 -74
@@ -0,0 +1,340 @@
1
+ import {
2
+ useCallback,
3
+ useEffect,
4
+ useLayoutEffect,
5
+ useRef,
6
+ useState,
7
+ type ComponentProps,
8
+ type CSSProperties,
9
+ type KeyboardEvent,
10
+ type ReactNode,
11
+ } from "react";
12
+ import { usePresence } from "../../hooks/usePresence";
13
+ import { cn } from "../../lib/cn";
14
+ import { decor as decorLayer } from "../../lib/decor";
15
+ import { mergeRefs } from "../../lib/merge-refs";
16
+
17
+ export type SplashScreenProps = Omit<ComponentProps<"div">, "children"> & {
18
+ /** 真实进度,0 – 100。不知道就不传:显示不确定进度,不显示数字 */
19
+ value?: number;
20
+ /** 标志:自己的图或 SVG。放在画面偏右的一个盒子里,竖排时居中 */
21
+ logo?: ReactNode;
22
+ /** 标志下面的一行标语 */
23
+ tagline?: ReactNode;
24
+ /** 标语上方那组微标里的微文字。纯氛围,对读屏隐藏 */
25
+ caption?: ReactNode;
26
+ /**
27
+ * 换掉标语上方的整组微标。不传是代码画的一组(小方框、`caption`、方点阵,旁边一枚三角标),
28
+ * 传 `null` 是不要
29
+ */
30
+ decor?: ReactNode;
31
+ /** 读数下面的状态字。默认 `LOADING` */
32
+ status?: ReactNode;
33
+ /** 底图:铺满整块,随进度从模糊变清晰 */
34
+ backdrop?: ReactNode;
35
+ /** 置为 `false` 开始退场:走满、铺满、淡出,结束后卸载。默认 `true` */
36
+ open?: boolean;
37
+ /** 铺满视口并锁住页面(默认);关掉则铺满所在的定位容器 */
38
+ fullscreen?: boolean;
39
+ /** 进度条的可访问名称 */
40
+ label?: string;
41
+ /** 开始淡出、页面露出来的那一刻触发:页面自己的入场从这里起 */
42
+ onReveal?: () => void;
43
+ /** 淡出结束、已经卸载之后触发 */
44
+ onExited?: () => void;
45
+ };
46
+
47
+ /*
48
+ * 进度的补间 0.5s(官网实测)。两个变量一起走:位置用小数的那个,读数用整数的那个。
49
+ * 退场时再加上整层的淡出:等 1.4s(走满 0.5s、铺满 0.6s、停一下)之后淡 1s。
50
+ */
51
+ const progressTransition =
52
+ "[transition:--ef-splash-progress_500ms_var(--ease-exit),--ef-splash-percent_500ms_var(--ease-exit)]";
53
+ const leavingTransition =
54
+ "[transition:--ef-splash-progress_500ms_var(--ease-exit),--ef-splash-percent_500ms_var(--ease-exit),opacity_1s_var(--ease-standard)_1.4s]";
55
+
56
+ /** 三角标:三个朝下的小三角拼成一个倒三角 */
57
+ function Mark() {
58
+ return (
59
+ <svg
60
+ viewBox="0 0 24 21"
61
+ aria-hidden="true"
62
+ className={cn(
63
+ decorLayer,
64
+ "absolute -top-[calc(var(--ef-splash-unit)*2.5)] -left-[calc(var(--ef-splash-unit)*3.375)] h-[calc(var(--ef-splash-unit)*1.3125)] w-[calc(var(--ef-splash-unit)*1.4375)] fill-action cq-portrait:hidden",
65
+ )}
66
+ >
67
+ <path d="M0 0h11.6L5.8 10zM12.4 0H24l-5.8 10zM6.2 11h11.6L12 21z" />
68
+ </svg>
69
+ );
70
+ }
71
+
72
+ /**
73
+ * 代码画的那组微标:带框的加号、微文字、两排方点。至少占官网那张图的高度(4 个单位);
74
+ * 微文字有字号的下限,多出来的往上长。竖排时上面紧挨着进度条的读数,放不下微文字
75
+ */
76
+ function DefaultDecor({ caption }: { caption: ReactNode }) {
77
+ return (
78
+ <div className="flex min-h-[calc(var(--ef-splash-unit)*4)] flex-col items-start justify-between gap-[calc(var(--ef-splash-unit)*0.5)] text-neutral-600">
79
+ <svg
80
+ viewBox="0 0 12 12"
81
+ fill="none"
82
+ stroke="currentColor"
83
+ className="size-[calc(var(--ef-splash-unit)*1.125)]"
84
+ >
85
+ <path d="M.5.5h11v11H.5zM6 3v6M3 6h6" />
86
+ </svg>
87
+ {caption !== undefined && (
88
+ <p className="font-latin text-[length:max(calc(var(--ef-splash-unit)*0.75),var(--text-micro))] leading-[1.2] font-medium tracking-label whitespace-pre-line text-ink-tertiary uppercase cq-portrait:hidden">
89
+ {caption}
90
+ </p>
91
+ )}
92
+ {/* 画成一张图:方点只有半个单位大,一个个排成元素的话,小尺寸下间隔会忽宽忽窄 */}
93
+ <svg
94
+ viewBox="0 0 62 18"
95
+ fill="currentColor"
96
+ className="h-[calc(var(--ef-splash-unit)*1.125)] w-[calc(var(--ef-splash-unit)*3.875)]"
97
+ >
98
+ {[0, 11].flatMap((y) =>
99
+ [0, 11, 22, 33, 44, 55].map((x) => (
100
+ <rect key={`${x}-${y}`} x={x} y={y} width="7" height="7" />
101
+ )),
102
+ )}
103
+ </svg>
104
+ </div>
105
+ );
106
+ }
107
+
108
+ /**
109
+ * 开屏页:照官网首次载入的那一页排的。近黑底,一根贴边的黄色进度条,读数跟着条的末端走;
110
+ * 画面偏右是标志,下面一组微标、一条分隔线和一行标语。就绪后黄色铺满整屏,再整层淡出。
111
+ *
112
+ * 标志和底图是插槽,库里不带任何图。横竖看它所在的那一块自己的宽高比,不看视口;
113
+ * 尺寸跟着那一块的宽度等比缩放,插槽里的东西可以用 `--ef-splash-unit` 跟着缩。
114
+ *
115
+ * 只要一块盖住整页的等待、不要这些排场,用 `Loader`。
116
+ */
117
+ export function SplashScreen({
118
+ value,
119
+ logo,
120
+ tagline,
121
+ caption,
122
+ decor,
123
+ status = "LOADING",
124
+ backdrop,
125
+ open = true,
126
+ fullscreen = true,
127
+ label = "加载中",
128
+ onReveal,
129
+ onExited,
130
+ onKeyDown,
131
+ className,
132
+ style,
133
+ ref,
134
+ ...props
135
+ }: SplashScreenProps) {
136
+ // 页面露出来了没有:开始淡出的那一刻。在那之前这一层一直盖着、锁着
137
+ const [revealed, setRevealed] = useState(false);
138
+ if (open && revealed) setRevealed(false);
139
+
140
+ const handlers = useRef({ onReveal });
141
+ const fired = useRef(false);
142
+ useLayoutEffect(() => {
143
+ handlers.current = { onReveal };
144
+ if (open) fired.current = false;
145
+ });
146
+ const reveal = useCallback(() => {
147
+ if (fired.current) return;
148
+ fired.current = true;
149
+ setRevealed(true);
150
+ handlers.current.onReveal?.();
151
+ }, []);
152
+
153
+ // 退出:淡出的过渡走完后卸载;重新打开立刻挂回来
154
+ const { ref: rootRef, mounted } = usePresence<HTMLDivElement>(open, {
155
+ onExited: () => {
156
+ // 没有过渡可等的环境里等不到"开始淡出":卸载之前补上
157
+ reveal();
158
+ onExited?.();
159
+ },
160
+ });
161
+ const leaving = mounted && !open;
162
+
163
+ // 淡出排在铺满之后,等的是它真的开始的那一刻(延迟走完),不是退场的开头
164
+ useLayoutEffect(() => {
165
+ const node = rootRef.current;
166
+ if (!leaving || !node) return;
167
+ const onStart = (event: TransitionEvent) => {
168
+ if (event.target === node && event.propertyName === "opacity") reveal();
169
+ };
170
+ node.addEventListener("transitionstart", onStart);
171
+ return () => node.removeEventListener("transitionstart", onStart);
172
+ }, [leaving, rootRef, reveal]);
173
+
174
+ /*
175
+ * 整页模式:锁住页面滚动,把焦点收进来。和 Loader 不一样,开始退场时不放开——
176
+ * 黄色铺满的那一段页面还完全被盖着,放开了只会点到看不见的东西。到开始淡出才放
177
+ */
178
+ const blocking = mounted && (open || !revealed);
179
+ useEffect(() => {
180
+ if (!fullscreen || !blocking) return;
181
+ const page = document.documentElement;
182
+ const previousOverflow = page.style.overflow;
183
+ const previousFocus = document.activeElement;
184
+ page.style.overflow = "hidden";
185
+ rootRef.current?.focus({ preventScroll: true });
186
+ return () => {
187
+ page.style.overflow = previousOverflow;
188
+ if (previousFocus instanceof HTMLElement && previousFocus.isConnected) {
189
+ previousFocus.focus({ preventScroll: true });
190
+ }
191
+ };
192
+ }, [fullscreen, blocking, rootRef]);
193
+
194
+ if (!mounted) return null;
195
+
196
+ const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {
197
+ onKeyDown?.(event);
198
+ // 焦点留在开屏页上,不让 Tab 走到被盖住的内容里
199
+ if (fullscreen && blocking && event.key === "Tab") event.preventDefault();
200
+ };
201
+
202
+ const indeterminate = value === undefined;
203
+ const current = indeterminate ? 0 : Math.min(Math.max(value, 0), 100);
204
+ // 退场先把条走满:就绪就是百分之百,铺满前的那半秒留给它
205
+ const shown = open ? current : 100;
206
+ const travelling = indeterminate && open;
207
+
208
+ return (
209
+ <div
210
+ tabIndex={-1}
211
+ {...props}
212
+ ref={mergeRefs(rootRef, ref)}
213
+ // 固定的近黑底,不随页面的主题变:做成局部的暗色主题,插槽里照常用语义令牌
214
+ data-theme="dark"
215
+ data-state={open ? "open" : "closing"}
216
+ onKeyDown={handleKeyDown}
217
+ style={
218
+ {
219
+ ...style,
220
+ "--ef-splash-progress": shown,
221
+ "--ef-splash-percent": Math.round(shown),
222
+ } as CSSProperties
223
+ }
224
+ className={cn(
225
+ "overflow-hidden bg-surface text-ink outline-none [container-type:size]",
226
+ fullscreen ? "fixed inset-0 z-(--z-loader)" : "absolute inset-0",
227
+ leaving ? leavingTransition : progressTransition,
228
+ leaving && "opacity-0",
229
+ !blocking && "pointer-events-none",
230
+ className,
231
+ )}
232
+ >
233
+ {/*
234
+ * 一个单位是官网的 1rem:横排是宽度的 1/160,竖排是 1/67.5。
235
+ * 状态字和标语有字号的下限(官网在小屏上会缩到看不清),收成两个变量:
236
+ * 竖排时下面那一摞是从底边往上排的,条要按它们多占的高度往上让
237
+ */}
238
+ <div className="absolute inset-0 [--_status:max(var(--ef-splash-unit),var(--text-xs))] [--_tagline:max(calc(var(--ef-splash-unit)*1.5),var(--text-xs))] [--ef-splash-unit:0.625cqw] cq-portrait:[--ef-splash-unit:1.4815cqw]">
239
+ {backdrop !== undefined && (
240
+ <div
241
+ aria-hidden="true"
242
+ className={cn(
243
+ decorLayer,
244
+ "absolute inset-0 blur-[calc((100_-_var(--ef-splash-progress))*0.08px)] *:size-full [&>img]:object-cover",
245
+ )}
246
+ >
247
+ {backdrop}
248
+ </div>
249
+ )}
250
+
251
+ {/*
252
+ * 纵向位置和官网一样按宽度定(标志在上 27.625 个单位,微标组的分隔线在 63.375),
253
+ * 所以 16:9 以外的比例下这一列不在正中。官网在超宽的屏上会掉出底边:这里放不下时
254
+ * 往上收,标语的底边至少离底 4 个单位。竖排的标志同理,不低于高度的 41.667%
255
+ */}
256
+ {logo !== undefined && (
257
+ <div className="absolute top-[min(calc(var(--ef-splash-unit)*27.625),calc(100%_-_var(--ef-splash-unit)*44.25))] left-[64.4531%] flex h-[calc(var(--ef-splash-unit)*16.75)] w-[calc(var(--ef-splash-unit)*16.5)] items-center justify-center cq-portrait:top-[min(calc(var(--ef-splash-unit)*50),41.667%)] cq-portrait:left-1/2 cq-portrait:h-[calc(var(--ef-splash-unit)*20.9375)] cq-portrait:w-[calc(var(--ef-splash-unit)*19.3125)] cq-portrait:-translate-1/2 [&>:is(img,svg)]:size-full [&>img]:object-contain">
258
+ {logo}
259
+ </div>
260
+ )}
261
+
262
+ <div className="absolute top-[min(calc(var(--ef-splash-unit)*63.375),calc(100%_-_var(--ef-splash-unit)*8.5))] right-[calc(var(--ef-splash-unit)*2)] left-[64.4531%] cq-portrait:top-auto cq-portrait:right-[calc(var(--ef-splash-unit)*4.625)] cq-portrait:bottom-[calc(var(--ef-splash-unit)*5.75)] cq-portrait:left-[calc(var(--ef-splash-unit)*4.625)]">
263
+ {decor === undefined && <Mark />}
264
+ {decor !== null && (
265
+ <div
266
+ aria-hidden="true"
267
+ className={cn(decorLayer, "absolute bottom-full left-0")}
268
+ >
269
+ {decor === undefined ? <DefaultDecor caption={caption} /> : decor}
270
+ </div>
271
+ )}
272
+ <span
273
+ aria-hidden="true"
274
+ className={cn(
275
+ decorLayer,
276
+ "mt-[calc(var(--ef-splash-unit)*1.25)] mb-[calc(var(--ef-splash-unit))] -ml-[calc(var(--ef-splash-unit)*21.625)] block h-0.5 w-[calc(var(--ef-splash-unit)*70)] bg-linear-to-r from-transparent via-neutral-0/10 to-transparent",
277
+ )}
278
+ />
279
+ {tagline !== undefined && (
280
+ <p className="text-[length:var(--_tagline)] leading-[1.35] wrap-anywhere">
281
+ {tagline}
282
+ </p>
283
+ )}
284
+ </div>
285
+
286
+ <div
287
+ role="progressbar"
288
+ aria-label={label}
289
+ aria-valuemin={0}
290
+ aria-valuemax={100}
291
+ aria-valuenow={travelling ? undefined : shown}
292
+ // 高对比模式下底色都被系统换掉:轨道剩一圈线,填充用系统的"选中"色(同 Progress)
293
+ className="absolute top-0 left-0 h-full w-[calc(var(--ef-splash-unit)*1.25)] forced-colors:outline forced-colors:-outline-offset-1 forced-colors:outline-[CanvasText] cq-portrait:top-auto cq-portrait:bottom-[calc(var(--ef-splash-unit)*17.75_+_(var(--_status)_-_var(--ef-splash-unit))*1.25_+_(var(--_tagline)_-_var(--ef-splash-unit)*1.5)*1.35)] cq-portrait:h-[calc(var(--ef-splash-unit)*2.5)] cq-portrait:w-[82.4074%]"
294
+ >
295
+ {travelling ? (
296
+ <span className="absolute inset-0 overflow-hidden">
297
+ <span className="absolute inset-x-0 top-0 h-2/5 animate-indeterminate-y bg-action motion-reduce:translate-y-3/4 forced-colors:bg-[Highlight] cq-portrait:inset-x-auto cq-portrait:inset-y-0 cq-portrait:left-0 cq-portrait:h-auto cq-portrait:w-2/5 cq-portrait:animate-indeterminate cq-portrait:motion-reduce:translate-x-3/4 cq-portrait:motion-reduce:translate-y-0" />
298
+ </span>
299
+ ) : (
300
+ <span className="absolute top-0 left-0 h-[calc(var(--ef-splash-progress)*1%)] w-full bg-action forced-colors:bg-[Highlight] cq-portrait:h-full cq-portrait:w-[calc(var(--ef-splash-progress)*1%)]" />
301
+ )}
302
+
303
+ {/* 读数骑在条的末端上:一条没有高度的基线,数字在线上面,状态字在线下面 */}
304
+ <div
305
+ aria-hidden="true"
306
+ className={cn(
307
+ "absolute top-[calc(var(--ef-splash-progress)*1%)] left-[calc(var(--ef-splash-unit)*3.125)] h-0 whitespace-nowrap cq-portrait:top-auto cq-portrait:-bottom-[calc(var(--ef-splash-unit)*1.75)] cq-portrait:left-[calc(var(--ef-splash-progress)*1%)] cq-portrait:ml-[calc(var(--ef-splash-unit)*0.75)]",
308
+ // 没有数字的时候条的末端不在哪:状态字往下让一点,别贴着上沿
309
+ travelling &&
310
+ "translate-y-[calc(var(--ef-splash-unit)*3)] cq-portrait:translate-y-0",
311
+ )}
312
+ >
313
+ {!indeterminate && (
314
+ <p className="absolute bottom-[calc(var(--ef-splash-unit)*1.625)] left-0 leading-none text-action">
315
+ <span className="mb-[calc(var(--ef-splash-unit)*0.25)] block h-[calc(var(--ef-splash-unit)*1.875)] w-[calc(var(--ef-splash-unit)*0.5)] rounded-[calc(var(--ef-splash-unit)*0.25)] bg-action" />
316
+ {/* 数字是计数器画的:它跟着那个整数变量补间,脚本不用一帧一帧去写 */}
317
+ <span className="text-[length:calc(var(--ef-splash-unit)*4.375)] font-medium tabular-nums [counter-reset:ef-splash_var(--ef-splash-percent)] before:content-[counter(ef-splash)]" />
318
+ <span className="text-[length:calc(var(--ef-splash-unit)*3.25)]">
319
+ %
320
+ </span>
321
+ </p>
322
+ )}
323
+ <p className="absolute -top-[calc(var(--ef-splash-unit)*0.5)] left-0 text-[length:var(--_status)] leading-[1.25] text-ink-tertiary">
324
+ <span className="block h-[calc(var(--ef-splash-unit)*0.5)] w-[calc(var(--ef-splash-unit)*1.25)] border-x-[length:calc(var(--ef-splash-unit)*0.5)] border-current" />
325
+ {status}
326
+ </p>
327
+ </div>
328
+ </div>
329
+ </div>
330
+
331
+ {/* 铺满:等条走满(0.5s)再从左往右盖过去,0.6s,先慢后快(官网实测) */}
332
+ {leaving && (
333
+ <span
334
+ aria-hidden="true"
335
+ className="absolute inset-0 origin-left animate-fill bg-action [animation-delay:500ms] [animation-timing-function:cubic-bezier(1,0,0.7,1)] motion-reduce:hidden forced-colors:bg-[Highlight]"
336
+ />
337
+ )}
338
+ </div>
339
+ );
340
+ }
@@ -0,0 +1 @@
1
+ export { SplashScreen, type SplashScreenProps } from "./SplashScreen";
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  Children,
3
- createContext,
4
3
  useContext,
5
4
  type ComponentProps,
6
5
  type MouseEventHandler,
@@ -11,6 +10,7 @@ import { StatusDanger } from "../../icons/StatusDanger";
11
10
  import { cn } from "../../lib/cn";
12
11
  import { focusRingWithin } from "../../lib/focus-ring";
13
12
  import { LinkElement, type LinkRender } from "../link-element/LinkElement";
13
+ import { createLazyContext } from "../../lib/create-lazy-context";
14
14
 
15
15
  export type StepsOrientation = "horizontal" | "vertical";
16
16
  export type StepsSize = "sm" | "md";
@@ -37,7 +37,8 @@ type StepContextValue = {
37
37
  labels: StepStatusLabels;
38
38
  };
39
39
 
40
- const StepContext = createContext<StepContextValue | null>(null);
40
+ const getStepContext =
41
+ /* @__PURE__ */ createLazyContext<StepContextValue | null>(null);
41
42
 
42
43
  export type StepsProps = Omit<ComponentProps<"ol">, "aria-label"> & {
43
44
  /** 这是哪件事的步骤,比如"建站流程" */
@@ -107,6 +108,7 @@ export function Steps({
107
108
  children,
108
109
  ...props
109
110
  }: StepsProps) {
111
+ const StepContext = getStepContext();
110
112
  const labels = { ...defaultLabels, ...statusLabels };
111
113
  const steps = Children.toArray(children);
112
114
 
@@ -118,7 +120,7 @@ export function Steps({
118
120
  >
119
121
  <ol {...props} className={cn("flex", listLayout[orientation])}>
120
122
  {steps.map((step, index) => (
121
- <StepContext
123
+ <StepContext.Provider
122
124
  // 步骤是按位置认的:序号、状态都从位置来
123
125
  key={index}
124
126
  value={{
@@ -135,7 +137,7 @@ export function Steps({
135
137
  }}
136
138
  >
137
139
  {step}
138
- </StepContext>
140
+ </StepContext.Provider>
139
141
  ))}
140
142
  </ol>
141
143
  </div>
@@ -203,7 +205,7 @@ export function Step({
203
205
  className,
204
206
  ...props
205
207
  }: StepProps) {
206
- const context = useContext(StepContext);
208
+ const context = useContext(getStepContext());
207
209
  if (!context) {
208
210
  throw new Error("<Step> 必须放在 <Steps> 里");
209
211
  }
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  Children,
3
- createContext,
4
3
  isValidElement,
5
4
  useContext,
6
5
  useEffect,
@@ -22,6 +21,7 @@ import { cn } from "../../lib/cn";
22
21
  import { focusRing, focusRingInset } from "../../lib/focus-ring";
23
22
  import { mergeRefs } from "../../lib/merge-refs";
24
23
  import { collapse, collapseEnter, collapseInner } from "../../lib/motion";
24
+ import { createLazyContext } from "../../lib/create-lazy-context";
25
25
 
26
26
  export type TableHeaderVariant = "band" | "muted";
27
27
  export type TableSize = "sm" | "md";
@@ -36,7 +36,7 @@ type TableContextValue = {
36
36
  ruled: boolean;
37
37
  };
38
38
 
39
- const TableContext = createContext<TableContextValue>({
39
+ const getTableContext = /* @__PURE__ */ createLazyContext<TableContextValue>({
40
40
  headerVariant: "band",
41
41
  size: "md",
42
42
  sticky: false,
@@ -45,10 +45,12 @@ const TableContext = createContext<TableContextValue>({
45
45
  });
46
46
 
47
47
  /** 单元格要知道自己在表头里还是表身里 */
48
- const SectionContext = createContext<"head" | "body">("body");
48
+ const getSectionContext = /* @__PURE__ */ createLazyContext<"head" | "body">(
49
+ "body",
50
+ );
49
51
 
50
52
  /** 能展开的行交给里面的展开钮 */
51
- const RowContext = createContext<{
53
+ const getRowContext = /* @__PURE__ */ createLazyContext<{
52
54
  expanded: boolean;
53
55
  toggle: () => void;
54
56
  detailId: string;
@@ -97,6 +99,7 @@ export function Table({
97
99
  className,
98
100
  ...props
99
101
  }: TableProps) {
102
+ const TableContext = getTableContext();
100
103
  const [scrollerRef, overflowing] = useOverflowing();
101
104
  const scrollable = overflowing.x || overflowing.y;
102
105
 
@@ -123,7 +126,7 @@ export function Table({
123
126
  );
124
127
 
125
128
  return (
126
- <TableContext value={context}>
129
+ <TableContext.Provider value={context}>
127
130
  <div
128
131
  ref={scrollerRef}
129
132
  // 冻结列右缘的那条线只看横向
@@ -151,23 +154,24 @@ export function Table({
151
154
  className="w-full border-separate border-spacing-0 text-left text-sm text-ink"
152
155
  />
153
156
  </div>
154
- </TableContext>
157
+ </TableContext.Provider>
155
158
  );
156
159
  }
157
160
 
158
161
  export type TableHeadProps = ComponentProps<"thead">;
159
162
 
160
163
  export function TableHead(props: TableHeadProps) {
161
- const { headerVariant } = useContext(TableContext);
164
+ const SectionContext = getSectionContext();
165
+ const { headerVariant } = useContext(getTableContext());
162
166
  return (
163
- <SectionContext value="head">
167
+ <SectionContext.Provider value="head">
164
168
  <thead
165
169
  // 反转的标题带整个换成反转主题:列头的焦点环、排序的三角、
166
170
  // 放在里面的复选框都按这条带子的底色取值
167
171
  data-theme={headerVariant === "band" ? "inverse" : undefined}
168
172
  {...props}
169
173
  />
170
- </SectionContext>
174
+ </SectionContext.Provider>
171
175
  );
172
176
  }
173
177
 
@@ -184,11 +188,12 @@ const ruledLines = [
184
188
  ].join(" ");
185
189
 
186
190
  export function TableBody({ className, ...props }: TableBodyProps) {
187
- const { ruled } = useContext(TableContext);
191
+ const SectionContext = getSectionContext();
192
+ const { ruled } = useContext(getTableContext());
188
193
  return (
189
- <SectionContext value="body">
194
+ <SectionContext.Provider value="body">
190
195
  <tbody {...props} className={cn(ruled && ruledLines, className)} />
191
- </SectionContext>
196
+ </SectionContext.Provider>
192
197
  );
193
198
  }
194
199
 
@@ -233,7 +238,8 @@ export function TableRow({
233
238
  children,
234
239
  ...props
235
240
  }: TableRowProps) {
236
- const section = useContext(SectionContext);
241
+ const RowContext = getRowContext();
242
+ const section = useContext(getSectionContext());
237
243
  const rowRef = useRef<HTMLTableRowElement>(null);
238
244
  const detailId = useId();
239
245
  const [expanded, setExpanded] = useControllableState({
@@ -279,7 +285,7 @@ export function TableRow({
279
285
  className,
280
286
  )}
281
287
  >
282
- <RowContext value={context}>{children}</RowContext>
288
+ <RowContext.Provider value={context}>{children}</RowContext.Provider>
283
289
  </tr>
284
290
  {detailPresence.mounted && (
285
291
  <DetailRow
@@ -377,7 +383,7 @@ export function TableExpander({
377
383
  onClick,
378
384
  ...props
379
385
  }: TableExpanderProps) {
380
- const row = useContext(RowContext);
386
+ const row = useContext(getRowContext());
381
387
  if (!row) return null;
382
388
 
383
389
  return (
@@ -460,7 +466,7 @@ export function TableHeaderCell({
460
466
  children,
461
467
  ...props
462
468
  }: TableHeaderCellProps) {
463
- const { headerVariant, sticky, stickyHeader } = useContext(TableContext);
469
+ const { headerVariant, sticky, stickyHeader } = useContext(getTableContext());
464
470
 
465
471
  return (
466
472
  <th
@@ -542,7 +548,7 @@ export function TableCell({
542
548
  children,
543
549
  ...props
544
550
  }: TableCellProps) {
545
- const { size, sticky } = useContext(TableContext);
551
+ const { size, sticky } = useContext(getTableContext());
546
552
  const Cell = rowHeader ? "th" : "td";
547
553
 
548
554
  return (
@@ -1,5 +1,4 @@
1
1
  import {
2
- createContext,
3
2
  useContext,
4
3
  useId,
5
4
  useMemo,
@@ -16,6 +15,7 @@ import { focusRing, focusRingInset } from "../../lib/focus-ring";
16
15
  import { mergeRefs } from "../../lib/merge-refs";
17
16
  import { fadeInFast, indicator, indicatorBox } from "../../lib/motion";
18
17
  import { capsuleBase, capsuleSize, capsuleState } from "../chip/capsule-style";
18
+ import { createLazyContext } from "../../lib/create-lazy-context";
19
19
 
20
20
  export type TabsVariant = "block" | "capsule" | "wedge";
21
21
  export type TabsSize = "sm" | "md";
@@ -30,10 +30,11 @@ type TabsContextValue = {
30
30
  switched: boolean;
31
31
  };
32
32
 
33
- const TabsContext = createContext<TabsContextValue | null>(null);
33
+ const getTabsContext =
34
+ /* @__PURE__ */ createLazyContext<TabsContextValue | null>(null);
34
35
 
35
36
  function useTabsContext(component: string): TabsContextValue {
36
- const context = useContext(TabsContext);
37
+ const context = useContext(getTabsContext());
37
38
  if (!context) {
38
39
  throw new Error(`<${component}> 必须放在 <Tabs> 里`);
39
40
  }
@@ -70,6 +71,7 @@ export function Tabs({
70
71
  size = "md",
71
72
  ...props
72
73
  }: TabsProps) {
74
+ const TabsContext = getTabsContext();
73
75
  const baseId = useId();
74
76
  const [current, select] = useControllableState({
75
77
  value,
@@ -87,9 +89,9 @@ export function Tabs({
87
89
  );
88
90
 
89
91
  return (
90
- <TabsContext value={context}>
92
+ <TabsContext.Provider value={context}>
91
93
  <div {...props} data-variant={variant} />
92
- </TabsContext>
94
+ </TabsContext.Provider>
93
95
  );
94
96
  }
95
97
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  useEffect,
3
3
  useId,
4
+ useLayoutEffect,
4
5
  useMemo,
5
6
  useRef,
6
7
  useState,
@@ -203,9 +204,11 @@ export function TagInput({
203
204
  return () => clearTimeout(timer);
204
205
  }, [flash]);
205
206
 
206
- // 删掉一个之后焦点落到哪:等这一次渲染完,旁边那个小块才是"旁边那个"
207
+ // 删掉一个之后焦点落到哪:等这一次渲染落到页面上,旁边那个小块才是"旁边那个",当场交出去。
208
+ // 不用 useEffect:它晚一拍,上一次渲染留下的那一份可能在这次删除之后才补跑——
209
+ // 看到的还是删之前的那一排,焦点留在马上要走的那一块上,随后掉到 body
207
210
  const pendingFocus = useRef<number | "input" | null>(null);
208
- useEffect(() => {
211
+ useLayoutEffect(() => {
209
212
  const target = pendingFocus.current;
210
213
  if (target === null) return;
211
214
  pendingFocus.current = null;