@zerodep-dev/vue-tsx-pro-ui 0.1.0 → 0.3.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 (470) hide show
  1. package/dist/base/Badge.js +3 -3
  2. package/dist/base/Badge.js.map +1 -1
  3. package/dist/base/Can.d.ts +12 -0
  4. package/dist/base/Can.js +20 -0
  5. package/dist/base/Can.js.map +1 -0
  6. package/dist/base/ClientOnly.d.ts +10 -0
  7. package/dist/base/ClientOnly.js +18 -0
  8. package/dist/base/ClientOnly.js.map +1 -0
  9. package/dist/base/CloseButton.js +3 -3
  10. package/dist/base/CloseButton.js.map +1 -1
  11. package/dist/base/CodeBlock.js +5 -5
  12. package/dist/base/CodeBlock.js.map +1 -1
  13. package/dist/base/CopyButton.js +3 -3
  14. package/dist/base/CopyButton.js.map +1 -1
  15. package/dist/base/Icon.js +3 -3
  16. package/dist/base/Icon.js.map +1 -1
  17. package/dist/base/Indicator.js +3 -3
  18. package/dist/base/Indicator.js.map +1 -1
  19. package/dist/base/StatusDot.js +3 -3
  20. package/dist/base/StatusDot.js.map +1 -1
  21. package/dist/base/Tag.js +5 -5
  22. package/dist/base/Tag.js.map +1 -1
  23. package/dist/base/button-core.js +4 -4
  24. package/dist/base/button-core.js.map +1 -1
  25. package/dist/charts/AreaChart.js +3 -3
  26. package/dist/charts/AreaChart.js.map +1 -1
  27. package/dist/charts/BarChart.js +3 -3
  28. package/dist/charts/BarChart.js.map +1 -1
  29. package/dist/charts/ChordChart.js +3 -3
  30. package/dist/charts/ChordChart.js.map +1 -1
  31. package/dist/charts/ComboChart.js +3 -3
  32. package/dist/charts/ComboChart.js.map +1 -1
  33. package/dist/charts/DonutChart.js +3 -3
  34. package/dist/charts/DonutChart.js.map +1 -1
  35. package/dist/charts/FunnelChart.js +5 -5
  36. package/dist/charts/FunnelChart.js.map +1 -1
  37. package/dist/charts/GraphChart.js +3 -3
  38. package/dist/charts/GraphChart.js.map +1 -1
  39. package/dist/charts/LineChart.js +3 -3
  40. package/dist/charts/LineChart.js.map +1 -1
  41. package/dist/charts/MapChart.js +7 -7
  42. package/dist/charts/MapChart.js.map +1 -1
  43. package/dist/charts/RadarChart.js +16 -15
  44. package/dist/charts/RadarChart.js.map +1 -1
  45. package/dist/charts/SankeyChart.js +3 -3
  46. package/dist/charts/SankeyChart.js.map +1 -1
  47. package/dist/charts/ScatterChart.js +3 -3
  48. package/dist/charts/ScatterChart.js.map +1 -1
  49. package/dist/charts/TimelineChart.js +6 -5
  50. package/dist/charts/TimelineChart.js.map +1 -1
  51. package/dist/charts/TreemapChart.js +3 -3
  52. package/dist/charts/TreemapChart.js.map +1 -1
  53. package/dist/charts/WaterfallChart.js +3 -3
  54. package/dist/charts/WaterfallChart.js.map +1 -1
  55. package/dist/charts/XYChart.js +9 -7
  56. package/dist/charts/XYChart.js.map +1 -1
  57. package/dist/charts/frame.js +10 -8
  58. package/dist/charts/frame.js.map +1 -1
  59. package/dist/charts/single.js +4 -3
  60. package/dist/charts/single.js.map +1 -1
  61. package/dist/code-editor/CodeEditor.d.ts +18 -0
  62. package/dist/code-editor/CodeEditor.js +57 -0
  63. package/dist/code-editor/CodeEditor.js.map +1 -0
  64. package/dist/code-editor/editor.d.ts +52 -0
  65. package/dist/code-editor/editor.js +225 -0
  66. package/dist/code-editor/editor.js.map +1 -0
  67. package/dist/code-editor/index.d.ts +9 -0
  68. package/dist/code-editor/index.js +3 -0
  69. package/dist/config/Provider.d.ts +3 -1
  70. package/dist/config/Provider.js +9 -4
  71. package/dist/config/Provider.js.map +1 -1
  72. package/dist/config/context.d.ts +18 -0
  73. package/dist/config/context.js +16 -1
  74. package/dist/config/context.js.map +1 -1
  75. package/dist/config/createUi.d.ts +20 -3
  76. package/dist/config/createUi.js +80 -49
  77. package/dist/config/createUi.js.map +1 -1
  78. package/dist/config/lang/en-US.js +21 -3
  79. package/dist/config/lang/en-US.js.map +1 -1
  80. package/dist/config/lang/format.d.ts +2 -1
  81. package/dist/config/lang/format.js +9 -2
  82. package/dist/config/lang/format.js.map +1 -1
  83. package/dist/config/lang/lang.d.ts +19 -6
  84. package/dist/config/lang/lang.js +11 -2
  85. package/dist/config/lang/lang.js.map +1 -1
  86. package/dist/config/lang/zh-CN.js +21 -3
  87. package/dist/config/lang/zh-CN.js.map +1 -1
  88. package/dist/config/layout/preference.d.ts +43 -0
  89. package/dist/config/layout/preference.js +108 -0
  90. package/dist/config/layout/preference.js.map +1 -0
  91. package/dist/date/Calendar.js +3 -3
  92. package/dist/date/Calendar.js.map +1 -1
  93. package/dist/date/CalendarBoard.js +9 -9
  94. package/dist/date/CalendarBoard.js.map +1 -1
  95. package/dist/date/CalendarView.js +7 -7
  96. package/dist/date/CalendarView.js.map +1 -1
  97. package/dist/date/DateField.js +3 -3
  98. package/dist/date/DateField.js.map +1 -1
  99. package/dist/date/DatePicker.js +5 -5
  100. package/dist/date/DatePicker.js.map +1 -1
  101. package/dist/date/DateRangePicker.js +5 -5
  102. package/dist/date/DateRangePicker.js.map +1 -1
  103. package/dist/date/DateSegmentGroup.js +5 -5
  104. package/dist/date/DateSegmentGroup.js.map +1 -1
  105. package/dist/date/QuarterCalendar.js +6 -6
  106. package/dist/date/QuarterCalendar.js.map +1 -1
  107. package/dist/date/RangeCalendar.js +3 -3
  108. package/dist/date/RangeCalendar.js.map +1 -1
  109. package/dist/date/SegmentedField.js +3 -3
  110. package/dist/date/SegmentedField.js.map +1 -1
  111. package/dist/date/TimeField.js +3 -3
  112. package/dist/date/TimeField.js.map +1 -1
  113. package/dist/date/TimePicker.js +4 -4
  114. package/dist/date/TimePicker.js.map +1 -1
  115. package/dist/date/date-segments.js +1 -1
  116. package/dist/date/date-segments.js.map +1 -1
  117. package/dist/date/picker-popover.js +3 -2
  118. package/dist/date/picker-popover.js.map +1 -1
  119. package/dist/diagram/Diagram.js +12 -12
  120. package/dist/diagram/Diagram.js.map +1 -1
  121. package/dist/diagram/DiagramLanes.js +3 -3
  122. package/dist/diagram/DiagramLanes.js.map +1 -1
  123. package/dist/diagram/DiagramMinimap.js +4 -4
  124. package/dist/diagram/DiagramMinimap.js.map +1 -1
  125. package/dist/diagram/index.d.ts +2 -1
  126. package/dist/diagram/index.js +2 -1
  127. package/dist/diagram/layout.d.ts +57 -0
  128. package/dist/diagram/layout.js +50 -0
  129. package/dist/diagram/layout.js.map +1 -0
  130. package/dist/display/Accordion.js +6 -6
  131. package/dist/display/Accordion.js.map +1 -1
  132. package/dist/display/AnimatedNumber.js +4 -4
  133. package/dist/display/AnimatedNumber.js.map +1 -1
  134. package/dist/display/Avatar.js +4 -4
  135. package/dist/display/Avatar.js.map +1 -1
  136. package/dist/display/Checklist.js +7 -7
  137. package/dist/display/Checklist.js.map +1 -1
  138. package/dist/display/Collapse.js +8 -5
  139. package/dist/display/Collapse.js.map +1 -1
  140. package/dist/display/Collapsible.js +3 -3
  141. package/dist/display/Collapsible.js.map +1 -1
  142. package/dist/display/Descriptions.js +5 -5
  143. package/dist/display/Descriptions.js.map +1 -1
  144. package/dist/display/Ellipsis.js +3 -3
  145. package/dist/display/Ellipsis.js.map +1 -1
  146. package/dist/display/FieldCompare.js +4 -4
  147. package/dist/display/FieldCompare.js.map +1 -1
  148. package/dist/display/Gauge.js +11 -11
  149. package/dist/display/Gauge.js.map +1 -1
  150. package/dist/display/Image.js +4 -4
  151. package/dist/display/Image.js.map +1 -1
  152. package/dist/display/Marquee.js +3 -3
  153. package/dist/display/Marquee.js.map +1 -1
  154. package/dist/display/ProportionBar.js +4 -4
  155. package/dist/display/ProportionBar.js.map +1 -1
  156. package/dist/display/Sortable.js +4 -4
  157. package/dist/display/Sortable.js.map +1 -1
  158. package/dist/display/Sparkline.js +6 -6
  159. package/dist/display/Sparkline.js.map +1 -1
  160. package/dist/display/Stat.js +3 -3
  161. package/dist/display/Stat.js.map +1 -1
  162. package/dist/display/Timeline.js +7 -7
  163. package/dist/display/Timeline.js.map +1 -1
  164. package/dist/display/Tree.js +10 -10
  165. package/dist/display/Tree.js.map +1 -1
  166. package/dist/display/VirtualList.js +7 -7
  167. package/dist/display/VirtualList.js.map +1 -1
  168. package/dist/display/Watermark.js +3 -3
  169. package/dist/display/Watermark.js.map +1 -1
  170. package/dist/docs-kit/CodeGroup.js +5 -5
  171. package/dist/docs-kit/CodeGroup.js.map +1 -1
  172. package/dist/docs-kit/CodePreview.js +6 -6
  173. package/dist/docs-kit/CodePreview.js.map +1 -1
  174. package/dist/docs-kit/PropsTable.js +4 -4
  175. package/dist/docs-kit/PropsTable.js.map +1 -1
  176. package/dist/feedback/Alert.js +5 -5
  177. package/dist/feedback/Alert.js.map +1 -1
  178. package/dist/feedback/Banner.js +5 -5
  179. package/dist/feedback/Banner.js.map +1 -1
  180. package/dist/feedback/Empty.js +4 -4
  181. package/dist/feedback/Empty.js.map +1 -1
  182. package/dist/feedback/LoadingBar.js +20 -13
  183. package/dist/feedback/LoadingBar.js.map +1 -1
  184. package/dist/feedback/LoadingOverlay.js +3 -3
  185. package/dist/feedback/LoadingOverlay.js.map +1 -1
  186. package/dist/feedback/Progress.js +14 -14
  187. package/dist/feedback/Progress.js.map +1 -1
  188. package/dist/feedback/Result.js +4 -4
  189. package/dist/feedback/Result.js.map +1 -1
  190. package/dist/feedback/SkeletonText.js +3 -3
  191. package/dist/feedback/SkeletonText.js.map +1 -1
  192. package/dist/feedback/Toast.js +6 -6
  193. package/dist/feedback/Toast.js.map +1 -1
  194. package/dist/form/Field.d.ts +7 -0
  195. package/dist/form/Field.js +20 -9
  196. package/dist/form/Field.js.map +1 -1
  197. package/dist/form/Form.js +3 -3
  198. package/dist/form/Form.js.map +1 -1
  199. package/dist/form/FormErrorSummary.js +3 -3
  200. package/dist/form/FormErrorSummary.js.map +1 -1
  201. package/dist/form/FormSection.js +6 -6
  202. package/dist/form/FormSection.js.map +1 -1
  203. package/dist/form/useForm.d.ts +4 -1
  204. package/dist/form/useForm.js +35 -13
  205. package/dist/form/useForm.js.map +1 -1
  206. package/dist/index.d.ts +18 -10
  207. package/dist/index.js +17 -9
  208. package/dist/input/Autocomplete.js +3 -3
  209. package/dist/input/Autocomplete.js.map +1 -1
  210. package/dist/input/Cascader.js +7 -7
  211. package/dist/input/Cascader.js.map +1 -1
  212. package/dist/input/CharacterCount.js +3 -3
  213. package/dist/input/CharacterCount.js.map +1 -1
  214. package/dist/input/Checkbox.js +5 -5
  215. package/dist/input/Checkbox.js.map +1 -1
  216. package/dist/input/ColorField.js +4 -4
  217. package/dist/input/ColorField.js.map +1 -1
  218. package/dist/input/Combobox.js +5 -5
  219. package/dist/input/Combobox.js.map +1 -1
  220. package/dist/input/ConditionBuilder.js +15 -14
  221. package/dist/input/ConditionBuilder.js.map +1 -1
  222. package/dist/input/FileDrop.js +3 -3
  223. package/dist/input/FileDrop.js.map +1 -1
  224. package/dist/input/Listbox.js +9 -9
  225. package/dist/input/Listbox.js.map +1 -1
  226. package/dist/input/Mentions.js +4 -4
  227. package/dist/input/Mentions.js.map +1 -1
  228. package/dist/input/NumberField.js +3 -3
  229. package/dist/input/NumberField.js.map +1 -1
  230. package/dist/input/NumberRangeField.js +5 -5
  231. package/dist/input/NumberRangeField.js.map +1 -1
  232. package/dist/input/OtpField.js +5 -5
  233. package/dist/input/OtpField.js.map +1 -1
  234. package/dist/input/PeoplePicker.js +6 -6
  235. package/dist/input/PeoplePicker.js.map +1 -1
  236. package/dist/input/PeoplePickerPanel.js +15 -15
  237. package/dist/input/PeoplePickerPanel.js.map +1 -1
  238. package/dist/input/Radio.js +4 -4
  239. package/dist/input/Radio.js.map +1 -1
  240. package/dist/input/Rating.js +5 -5
  241. package/dist/input/Rating.js.map +1 -1
  242. package/dist/input/Select.js +5 -5
  243. package/dist/input/Select.js.map +1 -1
  244. package/dist/input/SelectedTags.js +4 -4
  245. package/dist/input/SelectedTags.js.map +1 -1
  246. package/dist/input/Slider.js +6 -6
  247. package/dist/input/Slider.js.map +1 -1
  248. package/dist/input/Switch.js +3 -3
  249. package/dist/input/Switch.js.map +1 -1
  250. package/dist/input/TagsInput.js +5 -5
  251. package/dist/input/TagsInput.js.map +1 -1
  252. package/dist/input/TextField.js +5 -5
  253. package/dist/input/TextField.js.map +1 -1
  254. package/dist/input/Textarea.js +4 -4
  255. package/dist/input/Textarea.js.map +1 -1
  256. package/dist/input/ToggleGroup.js +4 -4
  257. package/dist/input/ToggleGroup.js.map +1 -1
  258. package/dist/input/Transfer.js +8 -8
  259. package/dist/input/Transfer.js.map +1 -1
  260. package/dist/input/TreeSelect.js +7 -7
  261. package/dist/input/TreeSelect.js.map +1 -1
  262. package/dist/input/Upload.js +10 -9
  263. package/dist/input/Upload.js.map +1 -1
  264. package/dist/input/condition.d.ts +1 -1
  265. package/dist/input/condition.js +32 -14
  266. package/dist/input/condition.js.map +1 -1
  267. package/dist/input/people.d.ts +15 -14
  268. package/dist/input/people.js +5 -5
  269. package/dist/input/people.js.map +1 -1
  270. package/dist/input/remote-items.d.ts +4 -2
  271. package/dist/input/remote-items.js +7 -2
  272. package/dist/input/remote-items.js.map +1 -1
  273. package/dist/layout/Affix.js +4 -4
  274. package/dist/layout/Affix.js.map +1 -1
  275. package/dist/layout/ResizeHandle.d.ts +6 -2
  276. package/dist/layout/ResizeHandle.js +32 -9
  277. package/dist/layout/ResizeHandle.js.map +1 -1
  278. package/dist/layout/ScrollArea.js +3 -3
  279. package/dist/layout/ScrollArea.js.map +1 -1
  280. package/dist/layout/Separator.js +3 -3
  281. package/dist/layout/Separator.js.map +1 -1
  282. package/dist/layout/Splitter.js +3 -3
  283. package/dist/layout/Splitter.js.map +1 -1
  284. package/dist/layout/ViewportFill.d.ts +2 -2
  285. package/dist/layout/ViewportFill.js +4 -4
  286. package/dist/layout/ViewportFill.js.map +1 -1
  287. package/dist/navigation/Breadcrumbs.js +4 -4
  288. package/dist/navigation/Breadcrumbs.js.map +1 -1
  289. package/dist/navigation/NavBar.js +6 -6
  290. package/dist/navigation/NavBar.js.map +1 -1
  291. package/dist/navigation/NavList.d.ts +1 -0
  292. package/dist/navigation/NavList.js +20 -12
  293. package/dist/navigation/NavList.js.map +1 -1
  294. package/dist/navigation/NavMenu.d.ts +27 -0
  295. package/dist/navigation/NavMenu.js +54 -0
  296. package/dist/navigation/NavMenu.js.map +1 -0
  297. package/dist/navigation/PageJump.js +3 -3
  298. package/dist/navigation/PageJump.js.map +1 -1
  299. package/dist/navigation/PageSizeSelect.js +4 -4
  300. package/dist/navigation/PageSizeSelect.js.map +1 -1
  301. package/dist/navigation/Pagination.js +6 -6
  302. package/dist/navigation/Pagination.js.map +1 -1
  303. package/dist/navigation/PaginationBar.js +5 -5
  304. package/dist/navigation/PaginationBar.js.map +1 -1
  305. package/dist/navigation/Steps.js +4 -4
  306. package/dist/navigation/Steps.js.map +1 -1
  307. package/dist/navigation/TableOfContents.js +5 -5
  308. package/dist/navigation/TableOfContents.js.map +1 -1
  309. package/dist/navigation/Tabs.js +7 -7
  310. package/dist/navigation/Tabs.js.map +1 -1
  311. package/dist/navigation/Toolbar.js +3 -3
  312. package/dist/navigation/Toolbar.js.map +1 -1
  313. package/dist/overlay/AlertDialog.js +4 -4
  314. package/dist/overlay/AlertDialog.js.map +1 -1
  315. package/dist/overlay/CommandPalette.js +4 -4
  316. package/dist/overlay/CommandPalette.js.map +1 -1
  317. package/dist/overlay/ContextMenu.js +3 -3
  318. package/dist/overlay/ContextMenu.js.map +1 -1
  319. package/dist/overlay/Dialog.js +4 -4
  320. package/dist/overlay/Dialog.js.map +1 -1
  321. package/dist/overlay/Drawer.js +5 -5
  322. package/dist/overlay/Drawer.js.map +1 -1
  323. package/dist/overlay/HoverCard.js +5 -3
  324. package/dist/overlay/HoverCard.js.map +1 -1
  325. package/dist/overlay/Lightbox.js +5 -5
  326. package/dist/overlay/Lightbox.js.map +1 -1
  327. package/dist/overlay/Menu.js +7 -7
  328. package/dist/overlay/Menu.js.map +1 -1
  329. package/dist/overlay/ModalCore.js +9 -9
  330. package/dist/overlay/ModalCore.js.map +1 -1
  331. package/dist/overlay/Popconfirm.js +6 -6
  332. package/dist/overlay/Popconfirm.js.map +1 -1
  333. package/dist/overlay/Popover.js +5 -3
  334. package/dist/overlay/Popover.js.map +1 -1
  335. package/dist/overlay/Tooltip.js +5 -3
  336. package/dist/overlay/Tooltip.js.map +1 -1
  337. package/dist/overlay/Tour.js +8 -8
  338. package/dist/overlay/Tour.js.map +1 -1
  339. package/dist/overlay/detached.d.ts +2 -0
  340. package/dist/overlay/detached.js +73 -42
  341. package/dist/overlay/detached.js.map +1 -1
  342. package/dist/patterns/ActionBar.js +3 -3
  343. package/dist/patterns/ActionBar.js.map +1 -1
  344. package/dist/patterns/AppShell.d.ts +28 -1
  345. package/dist/patterns/AppShell.js +158 -52
  346. package/dist/patterns/AppShell.js.map +1 -1
  347. package/dist/patterns/AuthLayout.d.ts +28 -0
  348. package/dist/patterns/AuthLayout.js +77 -0
  349. package/dist/patterns/AuthLayout.js.map +1 -0
  350. package/dist/patterns/CommentThread.js +9 -9
  351. package/dist/patterns/CommentThread.js.map +1 -1
  352. package/dist/patterns/DataImport.js +4 -4
  353. package/dist/patterns/DataImport.js.map +1 -1
  354. package/dist/patterns/DeadlineBadge.js +3 -3
  355. package/dist/patterns/DeadlineBadge.js.map +1 -1
  356. package/dist/patterns/FilterBar.d.ts +11 -1
  357. package/dist/patterns/FilterBar.js +39 -10
  358. package/dist/patterns/FilterBar.js.map +1 -1
  359. package/dist/patterns/FormDialog.d.ts +18 -0
  360. package/dist/patterns/FormDialog.js +46 -0
  361. package/dist/patterns/FormDialog.js.map +1 -0
  362. package/dist/patterns/KanbanBoard.js +8 -8
  363. package/dist/patterns/KanbanBoard.js.map +1 -1
  364. package/dist/patterns/LayoutSwitcher.d.ts +12 -0
  365. package/dist/patterns/LayoutSwitcher.js +79 -0
  366. package/dist/patterns/LayoutSwitcher.js.map +1 -0
  367. package/dist/patterns/NotificationCenter.js +8 -8
  368. package/dist/patterns/NotificationCenter.js.map +1 -1
  369. package/dist/patterns/PageTabs.d.ts +12 -7
  370. package/dist/patterns/PageTabs.js +41 -29
  371. package/dist/patterns/PageTabs.js.map +1 -1
  372. package/dist/patterns/QueryTable.d.ts +10 -1
  373. package/dist/patterns/QueryTable.js +128 -68
  374. package/dist/patterns/QueryTable.js.map +1 -1
  375. package/dist/patterns/SlideCaptcha.d.ts +80 -0
  376. package/dist/patterns/SlideCaptcha.js +354 -0
  377. package/dist/patterns/SlideCaptcha.js.map +1 -0
  378. package/dist/patterns/StepsForm.js +7 -7
  379. package/dist/patterns/StepsForm.js.map +1 -1
  380. package/dist/patterns/ThemeSwitcher.js +3 -3
  381. package/dist/patterns/ThemeSwitcher.js.map +1 -1
  382. package/dist/patterns/index.d.ts +7 -3
  383. package/dist/patterns/index.js +5 -1
  384. package/dist/patterns/messages.d.ts +39 -1
  385. package/dist/patterns/messages.js +40 -2
  386. package/dist/patterns/messages.js.map +1 -1
  387. package/dist/table/ColumnHeaderActions.js +3 -3
  388. package/dist/table/ColumnHeaderActions.js.map +1 -1
  389. package/dist/table/ColumnResizer.js +3 -3
  390. package/dist/table/ColumnResizer.js.map +1 -1
  391. package/dist/table/ColumnSettings.js +5 -5
  392. package/dist/table/ColumnSettings.js.map +1 -1
  393. package/dist/table/ColumnTable.js +8 -8
  394. package/dist/table/ColumnTable.js.map +1 -1
  395. package/dist/table/DataTable.js +8 -8
  396. package/dist/table/DataTable.js.map +1 -1
  397. package/dist/table/DataTableView.js +21 -21
  398. package/dist/table/DataTableView.js.map +1 -1
  399. package/dist/table/PivotTable.js +3 -3
  400. package/dist/table/PivotTable.js.map +1 -1
  401. package/dist/table/SelectionBar.js +4 -4
  402. package/dist/table/SelectionBar.js.map +1 -1
  403. package/dist/table/TreeDataTable.js +5 -5
  404. package/dist/table/TreeDataTable.js.map +1 -1
  405. package/dist/theme-customize/ThemeCustomizer.js +7 -6
  406. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  407. package/dist/theme-customize/ThemeThumbnail.js +3 -3
  408. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  409. package/dist/three/background/AuroraBackground.js +3 -3
  410. package/dist/three/background/AuroraBackground.js.map +1 -1
  411. package/dist/three/background/MeshGradient.js +3 -3
  412. package/dist/three/background/MeshGradient.js.map +1 -1
  413. package/dist/three/background/ShaderBackground.js +3 -3
  414. package/dist/three/background/ShaderBackground.js.map +1 -1
  415. package/dist/three/core/EffectSurface.js +3 -3
  416. package/dist/three/core/EffectSurface.js.map +1 -1
  417. package/dist/three/core/ThreeCanvas.js +4 -4
  418. package/dist/three/core/ThreeCanvas.js.map +1 -1
  419. package/dist/three/effects/Confetti.js +3 -3
  420. package/dist/three/effects/Confetti.js.map +1 -1
  421. package/dist/three/effects/ParticleField.js +3 -3
  422. package/dist/three/effects/ParticleField.js.map +1 -1
  423. package/dist/three/effects/WaveGrid.js +3 -3
  424. package/dist/three/effects/WaveGrid.js.map +1 -1
  425. package/dist/three/globe/Globe.js +3 -3
  426. package/dist/three/globe/Globe.js.map +1 -1
  427. package/dist/three/model/ModelViewer.js +3 -3
  428. package/dist/three/model/ModelViewer.js.map +1 -1
  429. package/dist/utils/data/clone.d.ts +8 -0
  430. package/dist/utils/data/clone.js +21 -0
  431. package/dist/utils/data/clone.js.map +1 -0
  432. package/dist/utils/data/date.d.ts +10 -0
  433. package/dist/utils/data/date.js +13 -1
  434. package/dist/utils/data/date.js.map +1 -1
  435. package/dist/utils/data/number.d.ts +5 -0
  436. package/dist/utils/data/number.js +8 -1
  437. package/dist/utils/data/number.js.map +1 -1
  438. package/dist/utils/data/numeric.d.ts +7 -0
  439. package/dist/utils/data/numeric.js +46 -1
  440. package/dist/utils/data/numeric.js.map +1 -1
  441. package/dist/utils/dom/download.d.ts +8 -1
  442. package/dist/utils/dom/download.js +19 -2
  443. package/dist/utils/dom/download.js.map +1 -1
  444. package/dist/utils/dom/element.d.ts +3 -1
  445. package/dist/utils/dom/element.js +8 -4
  446. package/dist/utils/dom/element.js.map +1 -1
  447. package/dist/utils/dom/fullscreen.d.ts +1 -1
  448. package/dist/utils/dom/fullscreen.js +12 -8
  449. package/dist/utils/dom/fullscreen.js.map +1 -1
  450. package/dist/utils/dom/mounted.d.ts +7 -0
  451. package/dist/utils/dom/mounted.js +16 -0
  452. package/dist/utils/dom/mounted.js.map +1 -0
  453. package/dist/utils/dom/overflow.js +2 -1
  454. package/dist/utils/dom/overflow.js.map +1 -1
  455. package/dist/utils/dom/pan-zoom.js +2 -1
  456. package/dist/utils/dom/pan-zoom.js.map +1 -1
  457. package/dist/utils/props.js +3 -13
  458. package/dist/utils/props.js.map +1 -1
  459. package/dist/utils/request/error-message.d.ts +17 -0
  460. package/dist/utils/request/error-message.js +50 -0
  461. package/dist/utils/request/error-message.js.map +1 -0
  462. package/dist/utils/request/http.d.ts +80 -4
  463. package/dist/utils/request/http.js +121 -24
  464. package/dist/utils/request/http.js.map +1 -1
  465. package/dist/utils/request/use-autosave.d.ts +35 -0
  466. package/dist/utils/request/use-autosave.js +69 -0
  467. package/dist/utils/request/use-autosave.js.map +1 -0
  468. package/dist/utils/request/use-request.js +4 -2
  469. package/dist/utils/request/use-request.js.map +1 -1
  470. package/package.json +57 -4
@@ -17,10 +17,10 @@ import { NavCompactContext } from "../navigation/NavList.js";
17
17
  import { SkipLink } from "../navigation/SkipLink.js";
18
18
  import { useMessages } from "../config/lang/messages.js";
19
19
  import { patternsMessages } from "./messages.js";
20
- import { createVNode, mergeProps, shallowRef, unref, useId, watch } from "vue";
21
- import { _component, bindable, childrenProp, createContext, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
20
+ import { createVNode, shallowRef, unref, useId, watch } from "vue";
21
+ import { _component, bindable, childrenProp, createContext, mergeJsxProps, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
22
22
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
23
- import { Menu, PanelLeftClose, PanelLeftOpen } from "@lucide/icons";
23
+ import { Menu, PanelBottomClose, PanelBottomOpen, PanelLeftClose, PanelLeftOpen, PanelRightClose, PanelRightOpen, PanelTopClose, PanelTopOpen } from "@lucide/icons";
24
24
  //#region src/patterns/AppShell.tsx
25
25
  /**
26
26
  * 应用外壳:粘性顶栏、左侧栏(导航)、正文、右侧栏(本页目录),文档站与后台的整页骨架。
@@ -49,6 +49,11 @@ import { Menu, PanelLeftClose, PanelLeftOpen } from "@lucide/icons";
49
49
  * 抽屉结束边可以拖动调整宽度(ResizeHandle,也能聚焦后用 ← / →,双击回到初始宽度),父级写 _sidebarWidth={x} 记住;
50
50
  * 顶栏的品牌格按初始宽度,拖动时不变。焦点在抽屉里时按 Esc 收起、焦点回到“菜单”;窄屏时点了链接也收起。
51
51
  * 拖到比 160px 窄时侧栏变紧凑:里面的 NavList 只显示图标(名称在提示里),小节标题只剩图标(NavCompactContext)。
52
+ * sidebarSide 选抽屉从哪一边滑出:start(默认)、end、top、bottom。start / end 是左右两侧抽屉(随排版方向,从右到左时互换),
53
+ * end 时“菜单”在顶栏结束边;top / bottom 是盖满宽度的上下抽屉,导航的小节排成多列,拖动贴着正文的那条边调整高度
54
+ * (_sidebarHeight 记住)。上下抽屉盖住的正文范围大,点了链接就收起(左右抽屉在宽屏时不收)。
55
+ * 想让用户自己选,用 layout:createLayoutPreference 的结果,侧栏的形式、方向、开关与尺寸都从它读、写回它并存盘,
56
+ * 配合顶栏里的 LayoutSwitcher;写了 layout 时 sidebarMode、sidebarSide、_sidebarOpen 等不再起作用。
52
57
  *
53
58
  * 品牌格里一般放 AppShellBrand:品牌色的标志与产品名,点了回首页;自己的标志图写在它的 logo 里。
54
59
  *
@@ -70,9 +75,13 @@ var RAIL_WIDTH = "3.5rem";
70
75
  var OVERLAY_WIDTH = 256;
71
76
  var OVERLAY_MIN_WIDTH = 16;
72
77
  var OVERLAY_MAX_WIDTH = 480;
78
+ var OVERLAY_HEIGHT = 320;
79
+ var OVERLAY_MIN_HEIGHT = 96;
80
+ var OVERLAY_MAX_HEIGHT = 640;
73
81
  var OVERLAY_COMPACT_WIDTH = 160;
74
82
  var WIDE_QUERY = breakpoints.lg.replace("@media ", "");
75
83
  /** 左侧栏的形式 */
84
+ /** 抽屉式侧栏从哪一边滑出(sidebarMode="overlay") */
76
85
  /** 未声明的属性落到外层 div 上 */
77
86
  /** AppShell 交给里面的部件的状态:侧栏收起时品牌只剩标志 */
78
87
  /** AppShell 的上下文:AppShellBrand 据此在侧栏收起时只显示标志;不在 AppShell 里时为 null */
@@ -220,26 +229,61 @@ var appShellStyles = css.create({
220
229
  },
221
230
  overlay: {
222
231
  position: "fixed",
223
- top: HEADER_HEIGHT,
224
- bottom: 0,
225
- insetInlineStart: 0,
226
232
  zIndex: 9,
227
233
  boxSizing: "border-box",
228
234
  display: "flex",
229
235
  flexDirection: "column",
230
- maxWidth: "calc(100vw - 3rem)",
231
236
  overflow: "hidden",
232
237
  backgroundColor: "_surface",
238
+ boxShadow: "_lg",
239
+ visibility: "hidden",
240
+ transition: `translate ${t.durations.md} ${t.easings.exit}, visibility 0s linear ${t.durations.md}`
241
+ },
242
+ overlayStart: {
243
+ top: HEADER_HEIGHT,
244
+ bottom: 0,
245
+ insetInlineStart: 0,
246
+ maxWidth: "calc(100vw - 3rem)",
233
247
  borderInlineEndWidth: "_xs",
234
248
  borderInlineEndStyle: "solid",
235
249
  borderInlineEndColor: "_border",
236
- boxShadow: "_lg",
237
- visibility: "hidden",
238
250
  translate: {
239
251
  default: "-100% 0",
240
252
  ":dir(rtl)": "100% 0"
241
- },
242
- transition: `translate ${t.durations.md} ${t.easings.exit}, visibility 0s linear ${t.durations.md}`
253
+ }
254
+ },
255
+ overlayEnd: {
256
+ top: HEADER_HEIGHT,
257
+ bottom: 0,
258
+ insetInlineEnd: 0,
259
+ maxWidth: "calc(100vw - 3rem)",
260
+ borderInlineStartWidth: "_xs",
261
+ borderInlineStartStyle: "solid",
262
+ borderInlineStartColor: "_border",
263
+ translate: {
264
+ default: "100% 0",
265
+ ":dir(rtl)": "-100% 0"
266
+ }
267
+ },
268
+ overlayTop: {
269
+ top: HEADER_HEIGHT,
270
+ insetInlineStart: 0,
271
+ insetInlineEnd: 0,
272
+ maxHeight: `calc(100dvh - ${HEADER_HEIGHT} - 3rem)`,
273
+ borderBlockEndWidth: "_xs",
274
+ borderBlockEndStyle: "solid",
275
+ borderBlockEndColor: "_border",
276
+ translate: "0 -100%"
277
+ },
278
+ overlayBottom: {
279
+ bottom: 0,
280
+ insetInlineStart: 0,
281
+ insetInlineEnd: 0,
282
+ maxHeight: `calc(100dvh - ${HEADER_HEIGHT} - 3rem)`,
283
+ borderBlockStartWidth: "_xs",
284
+ borderBlockStartStyle: "solid",
285
+ borderBlockStartColor: "_border",
286
+ translate: "0 100%"
243
287
  },
244
288
  overlayOpen: {
245
289
  visibility: "visible",
@@ -250,6 +294,10 @@ var appShellStyles = css.create({
250
294
  flexGrow: 1,
251
295
  minHeight: 0
252
296
  },
297
+ sidebarContentColumns: {
298
+ columnWidth: "14rem",
299
+ columnGap: "_xl"
300
+ },
253
301
  brandOverlay: {
254
302
  alignSelf: {
255
303
  default: null,
@@ -355,9 +403,10 @@ var appShellStyles = css.create({
355
403
  fontSize: "_sm"
356
404
  }
357
405
  });
358
- /** AppShell 的动态样式:抽屉的宽度、宽屏时品牌格的宽度(px) */
406
+ /** AppShell 的动态样式:抽屉的宽度与高度、宽屏时品牌格的宽度(px) */
359
407
  var appShellDynamicStyles = css.create({
360
408
  width: (px) => ({ width: px }),
409
+ height: (px) => ({ height: px }),
361
410
  brandWidth: (px) => ({ width: {
362
411
  default: null,
363
412
  [breakpoints.lg]: px
@@ -365,7 +414,6 @@ var appShellDynamicStyles = css.create({
365
414
  });
366
415
  /** 应用外壳:粘性顶栏、左侧栏、正文、右侧栏;窄屏时左侧栏收进抽屉 */
367
416
  var AppShell = /*#__PURE__*/ _component((_props, _ctx) => {
368
- const _cache = [];
369
417
  const brand = readonlyProp(_props, "brand");
370
418
  const header = readonlyProp(_props, "header");
371
419
  const sidebar = readonlyProp(_props, "sidebar");
@@ -374,8 +422,11 @@ var AppShell = /*#__PURE__*/ _component((_props, _ctx) => {
374
422
  const tabs = readonlyProp(_props, "tabs");
375
423
  const footer = readonlyProp(_props, "footer");
376
424
  const sidebarMode = readonlyProp(_props, "sidebarMode", "docked");
425
+ const sidebarSide = readonlyProp(_props, "sidebarSide", "start");
426
+ const layout = readonlyProp(_props, "layout");
377
427
  const sidebarOpen = bindable(_props, "_sidebarOpen", () => false, _ctx.emit);
378
428
  const sidebarWidth = bindable(_props, "_sidebarWidth", () => OVERLAY_WIDTH, _ctx.emit);
429
+ const sidebarHeight = bindable(_props, "_sidebarHeight", () => OVERLAY_HEIGHT, _ctx.emit);
379
430
  const sidebarCollapsible = readonlyProp(_props, "sidebarCollapsible", false);
380
431
  const sidebarCollapsed = bindable(_props, "_sidebarCollapsed", () => false, _ctx.emit);
381
432
  const skipLink = readonlyProp(_props, "skipLink", true);
@@ -403,42 +454,75 @@ var AppShell = /*#__PURE__*/ _component((_props, _ctx) => {
403
454
  const id = useId();
404
455
  const mainId = `${id}-main`;
405
456
  const sidebarId = `${id}-sidebar`;
406
- const overlay = () => sidebarMode.value === "overlay";
457
+ const mode = () => layout.value ? layout.value.mode : sidebarMode.value;
458
+ const side = () => layout.value ? layout.value.side : sidebarSide.value;
459
+ const isOpen = () => layout.value ? layout.value.open : sidebarOpen.value;
460
+ const setOpen = (value) => {
461
+ if (layout.value) layout.value.open = value;
462
+ else sidebarOpen.value = value;
463
+ };
464
+ const widthOf = () => layout.value ? layout.value.width : sidebarWidth.value;
465
+ const setWidth = (px) => {
466
+ if (layout.value) layout.value.width = px;
467
+ else sidebarWidth.value = px;
468
+ };
469
+ const heightOf = () => layout.value ? layout.value.height : sidebarHeight.value;
470
+ const setHeight = (px) => {
471
+ if (layout.value) layout.value.height = px;
472
+ else sidebarHeight.value = px;
473
+ };
474
+ const isCollapsed = () => layout.value ? layout.value.collapsed : sidebarCollapsed.value;
475
+ const setCollapsed = (value) => {
476
+ if (layout.value) layout.value.collapsed = value;
477
+ else sidebarCollapsed.value = value;
478
+ };
479
+ const overlay = () => mode() === "overlay";
407
480
  const docked = () => hasContent(sidebar.value) && !overlay();
481
+ const lateral = () => side() === "start" || side() === "end";
408
482
  const wide = useMediaQuery(WIDE_QUERY);
409
- const collapsed = () => docked() && sidebarCollapsible.value && sidebarCollapsed.value && wide.value;
410
- const compact = () => overlay() && sidebarWidth.value < OVERLAY_COMPACT_WIDTH || collapsed();
483
+ const collapsed = () => docked() && sidebarCollapsible.value && isCollapsed() && wide.value;
484
+ const compact = () => overlay() && lateral() && widthOf() < OVERLAY_COMPACT_WIDTH || collapsed();
411
485
  NavCompactContext.provide(compact);
412
486
  AppShellContext.provide({ collapsed });
413
487
  watch(wide, (isWide) => {
414
- if (isWide && !overlay()) sidebarOpen.value = false;
488
+ if (isWide && !overlay()) setOpen(false);
415
489
  });
416
490
  function closeOnNavigate(event) {
417
- if (overlay() && wide.value) return;
418
- if (event.target instanceof Element && event.target.closest("a[href]")) sidebarOpen.value = false;
491
+ if (overlay() && lateral() && wide.value) return;
492
+ if (event.target instanceof Element && event.target.closest("a[href]")) setOpen(false);
419
493
  }
420
- const remembered = untrack(() => sidebarWidth.value);
494
+ const remembered = untrack(() => widthOf());
421
495
  const initialWidth = remembered < OVERLAY_COMPACT_WIDTH ? OVERLAY_WIDTH : remembered;
422
496
  let toggleButton = shallowRef(null);
423
497
  function onOverlayKeydown(event) {
424
498
  if (event.key !== "Escape" || event.defaultPrevented) return;
425
499
  event.preventDefault();
426
- sidebarOpen.value = false;
500
+ setOpen(false);
427
501
  toggleButton.value?.focus();
428
502
  }
429
- /** overlay 的“菜单”:开关抽屉,图标随开关切换 */
430
- const sidebarToggle = () => createVNode(Button, mergePartProps({
503
+ const toggleAtEnd = () => overlay() && side() === "end";
504
+ const toggleIcon = () => {
505
+ const open = isOpen();
506
+ switch (side()) {
507
+ case "end": return open ? PanelRightClose : PanelRightOpen;
508
+ case "top": return open ? PanelTopClose : PanelTopOpen;
509
+ case "bottom": return open ? PanelBottomClose : PanelBottomOpen;
510
+ default: return open ? PanelLeftClose : PanelLeftOpen;
511
+ }
512
+ };
513
+ /** overlay 的“菜单”:开关抽屉,图标随开关和方向切换 */
514
+ const sidebarToggle = () => createVNode(Button, mergeJsxProps(mergePartProps({
431
515
  variant: "ghost",
432
516
  tone: "neutral",
433
517
  size: "sm",
434
- icon: sidebarOpen.value ? PanelLeftClose : PanelLeftOpen,
518
+ icon: toggleIcon(),
435
519
  sx: appShellStyles.toggle
436
520
  }, propsSidebarToggle.value, {
437
521
  ref: (element) => toggleButton.value = toElement(element),
438
- "aria-expanded": sidebarOpen.value,
522
+ "aria-expanded": isOpen(),
439
523
  "aria-controls": sidebarId,
440
- onClick: () => sidebarOpen.value = !sidebarOpen.value
441
- }), {
524
+ onClick: () => setOpen(!isOpen())
525
+ }), { "key": "__site0" }), {
442
526
  default: () => [messages.navigationMenu],
443
527
  $stable: true
444
528
  });
@@ -451,33 +535,34 @@ var AppShell = /*#__PURE__*/ _component((_props, _ctx) => {
451
535
  icon: Menu,
452
536
  "aria-label": messages.navigationOpen
453
537
  }, propsMenuButton.value, {
454
- "aria-expanded": sidebarOpen.value,
455
- onClick: () => sidebarOpen.value = true
538
+ "aria-expanded": isOpen(),
539
+ onClick: () => setOpen(true)
456
540
  }), null),
457
- hasContent(brand.value) && createVNode("div", mergeAttrs({ sx: [appShellStyles.brand, hasContent(sidebar.value) && (overlay() ? [appShellStyles.brandOverlay, css.bind(appShellDynamicStyles.brandWidth, () => [initialWidth], true)] : [appShellStyles.brandRail, collapsed() && appShellStyles.brandRailCollapsed])] }, propsBrand.value), [brand.value, hasContent(sidebar.value) && overlay() && sidebarToggle()]),
458
- !hasContent(brand.value) && hasContent(sidebar.value) && overlay() && sidebarToggle(),
541
+ hasContent(brand.value) && createVNode("div", mergeAttrs({ sx: [appShellStyles.brand, hasContent(sidebar.value) && (overlay() ? side() === "start" && [appShellStyles.brandOverlay, css.bind(appShellDynamicStyles.brandWidth, () => [initialWidth], true)] : [appShellStyles.brandRail, collapsed() && appShellStyles.brandRailCollapsed])] }, propsBrand.value), [brand.value, hasContent(sidebar.value) && overlay() && !toggleAtEnd() && sidebarToggle()]),
542
+ !hasContent(brand.value) && hasContent(sidebar.value) && overlay() && !toggleAtEnd() && sidebarToggle(),
459
543
  hasContent(nav.value) && createVNode("div", mergeAttrs({ sx: appShellStyles.nav }, propsNav.value), [nav.value]),
460
- createVNode("div", mergeAttrs({ sx: [appShellStyles.headerContent, hasContent(nav.value) && appShellStyles.headerContentAfterNav] }, propsHeaderContent.value), [header.value])
544
+ createVNode("div", mergeAttrs({ sx: [appShellStyles.headerContent, hasContent(nav.value) && appShellStyles.headerContentAfterNav] }, propsHeaderContent.value), [header.value]),
545
+ hasContent(sidebar.value) && toggleAtEnd() && sidebarToggle()
461
546
  ]),
462
547
  createVNode("div", mergeAttrs({ sx: [appShellStyles.body, docked() && hasContent(aside.value) ? collapsed() ? appShellStyles.withBothCollapsed : appShellStyles.withBoth : docked() ? collapsed() ? appShellStyles.withSidebarCollapsed : appShellStyles.withSidebar : hasContent(aside.value) && appShellStyles.withAside] }, propsBody.value), [
463
548
  docked() && createVNode("div", mergeAttrs({ sx: [
464
549
  appShellStyles.rail,
465
550
  appShellStyles.sidebar,
466
551
  sidebarCollapsible.value && appShellStyles.sidebarColumn
467
- ] }, propsSidebar.value), [createVNode(ScrollArea, mergeProps(mergePartProps({
552
+ ] }, propsSidebar.value), [createVNode(ScrollArea, mergeJsxProps(mergePartProps({
468
553
  sx: [appShellStyles.railScroll, sidebarCollapsible.value && appShellStyles.sidebarScroll],
469
554
  propsViewport: { sx: appShellStyles.railViewport },
470
555
  propsContent: { sx: [appShellStyles.sidebarContent, css.select(() => collapsed() && appShellStyles.sidebarContentCompact, true)] }
471
- }, propsSidebarScroll.value), { "key": "__site0" }), {
556
+ }, propsSidebarScroll.value), { "key": "__site1" }), {
472
557
  default: () => [unref(sidebar)],
473
558
  $stable: true
474
559
  }), sidebarCollapsible.value && createVNode("div", css.attrs(appShellStyles.collapseBar, css.select(() => collapsed() && appShellStyles.collapseBarCollapsed, true)), [createVNode(IconButton, mergePartProps({
475
- icon: sidebarCollapsed.value ? PanelLeftOpen : PanelLeftClose,
560
+ icon: isCollapsed() ? PanelLeftOpen : PanelLeftClose,
476
561
  size: "sm",
477
562
  variant: "ghost",
478
563
  propsIcon: { flipInRtl: true },
479
- "aria-label": sidebarCollapsed.value ? messages.sidebarExpand : messages.sidebarCollapse
480
- }, propsCollapse.value, { onClick: () => sidebarCollapsed.value = !sidebarCollapsed.value }), null)])]),
564
+ "aria-label": isCollapsed() ? messages.sidebarExpand : messages.sidebarCollapse
565
+ }, propsCollapse.value, { onClick: () => setCollapsed(!isCollapsed()) }), null)])]),
481
566
  createVNode("div", css.attrs(appShellStyles.column), [
482
567
  hasContent(tabs.value) && createVNode("div", mergeAttrs({ sx: appShellStyles.tabs }, propsTabs.value), [tabs.value]),
483
568
  createVNode("main", mergeAttrs({ sx: [appShellStyles.main, appShellStyles.mainGrow] }, propsMain.value, {
@@ -486,45 +571,62 @@ var AppShell = /*#__PURE__*/ _component((_props, _ctx) => {
486
571
  }), [children.value]),
487
572
  hasContent(footer.value) && createVNode("footer", mergeAttrs({ sx: appShellStyles.footer }, propsFooter.value), [footer.value])
488
573
  ]),
489
- hasContent(aside.value) && createVNode("aside", mergeAttrs({ sx: [appShellStyles.rail, appShellStyles.aside] }, propsAside.value), [createVNode(ScrollArea, mergeProps(mergePartProps({
574
+ hasContent(aside.value) && createVNode("aside", mergeAttrs({ sx: [appShellStyles.rail, appShellStyles.aside] }, propsAside.value), [createVNode(ScrollArea, mergeJsxProps(mergePartProps({
490
575
  sx: appShellStyles.railScroll,
491
576
  propsViewport: { sx: appShellStyles.railViewport },
492
577
  propsContent: { sx: appShellStyles.asideContent }
493
- }, propsAsideScroll.value), { "key": "__site1" }), {
578
+ }, propsAsideScroll.value), { "key": "__site2" }), {
494
579
  default: () => [unref(aside)],
495
580
  $stable: true
496
581
  })])
497
582
  ]),
498
583
  hasContent(sidebar.value) && overlay() && createVNode("div", mergeAttrs({ sx: [
499
584
  appShellStyles.overlay,
500
- sidebarOpen.value && appShellStyles.overlayOpen,
501
- css.bind(appShellDynamicStyles.width, () => [sidebarWidth.value], true)
585
+ side() === "start" && appShellStyles.overlayStart,
586
+ side() === "end" && appShellStyles.overlayEnd,
587
+ side() === "top" && appShellStyles.overlayTop,
588
+ side() === "bottom" && appShellStyles.overlayBottom,
589
+ isOpen() && appShellStyles.overlayOpen,
590
+ lateral() ? css.bind(appShellDynamicStyles.width, () => [widthOf()], true) : css.bind(appShellDynamicStyles.height, () => [heightOf()], true)
502
591
  ] }, propsSidebar.value, {
503
592
  id: sidebarId,
504
- inert: !sidebarOpen.value,
593
+ inert: !isOpen(),
505
594
  onKeydown: onOverlayKeydown,
506
595
  onClick: closeOnNavigate
507
- }), [createVNode(ScrollArea, mergeProps(mergePartProps({
596
+ }), [createVNode(ScrollArea, mergeJsxProps(mergePartProps({
508
597
  sx: appShellStyles.overlayScroll,
509
598
  propsViewport: { sx: appShellStyles.railViewport },
510
- propsContent: { sx: [appShellStyles.sidebarContent, css.select(() => compact() && appShellStyles.sidebarContentCompact, true)] }
511
- }, propsSidebarScroll.value), { "key": "__site2" }), {
599
+ propsContent: { sx: [
600
+ appShellStyles.sidebarContent,
601
+ css.select(() => compact() && appShellStyles.sidebarContentCompact, true),
602
+ !lateral() && appShellStyles.sidebarContentColumns
603
+ ] }
604
+ }, propsSidebarScroll.value), { "key": "__site3" }), {
512
605
  default: () => [unref(sidebar)],
513
606
  $stable: true
514
- }), createVNode(ResizeHandle, mergeProps({ "aria-label": messages.navigationResize }, propsResizeHandle.value, {
515
- "width": sidebarWidth.value,
607
+ }), lateral() ? createVNode(ResizeHandle, mergeJsxProps({ "aria-label": messages.navigationResize }, propsResizeHandle.value, {
608
+ "edge": side() === "end" ? "start" : "end",
609
+ "width": widthOf(),
516
610
  "minWidth": OVERLAY_MIN_WIDTH,
517
611
  "maxWidth": OVERLAY_MAX_WIDTH,
518
612
  "defaultWidth": initialWidth,
519
- "onWidthChange": _cache[0] || (_cache[0] = (px) => sidebarWidth.value = px)
613
+ "onWidthChange": setWidth
614
+ }), null) : createVNode(ResizeHandle, mergeJsxProps({ "aria-label": messages.navigationResizeHeight }, propsResizeHandle.value, {
615
+ "orientation": "horizontal",
616
+ "edge": side() === "top" ? "end" : "start",
617
+ "width": heightOf(),
618
+ "minWidth": OVERLAY_MIN_HEIGHT,
619
+ "maxWidth": OVERLAY_MAX_HEIGHT,
620
+ "defaultWidth": OVERLAY_HEIGHT,
621
+ "onWidthChange": setHeight
520
622
  }), null)]),
521
- docked() && createVNode(Drawer, mergeProps(mergePartProps({
623
+ docked() && createVNode(Drawer, mergeJsxProps(mergePartProps({
522
624
  title: messages.navigation,
523
625
  side: "start"
524
626
  }, propsDrawer.value, { onClick: closeOnNavigate }), {
525
- "_open": sidebarOpen.value,
526
- "onUpdate:_open": _cache[1] || (_cache[1] = ($event) => sidebarOpen.value = $event),
527
- "key": "__site3"
627
+ "_open": isOpen(),
628
+ "onUpdate:_open": setOpen,
629
+ "key": "__site4"
528
630
  }), {
529
631
  default: () => [unref(sidebar)],
530
632
  $stable: true
@@ -541,10 +643,14 @@ var AppShell = /*#__PURE__*/ _component((_props, _ctx) => {
541
643
  "tabs",
542
644
  "footer",
543
645
  "sidebarMode",
646
+ "sidebarSide",
647
+ "layout",
544
648
  "_sidebarOpen",
545
649
  "onUpdate:_sidebarOpen",
546
650
  "_sidebarWidth",
547
651
  "onUpdate:_sidebarWidth",
652
+ "_sidebarHeight",
653
+ "onUpdate:_sidebarHeight",
548
654
  "sidebarCollapsible",
549
655
  "_sidebarCollapsed",
550
656
  "onUpdate:_sidebarCollapsed",
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_childrenProp","_vtp_restProps","_vtp_untrack","_vue_shallowRef","_createVNode","MenuIcon","_mergeProps","_vue_unref"],"sources":["../../src/patterns/AppShell.tsx"],"sourcesContent":["/**\n * 应用外壳:粘性顶栏、左侧栏(导航)、正文、右侧栏(本页目录),文档站与后台的整页骨架。\n *\n * <AppShell\n * brand={<AppShellBrand href=\"/\" icon={Boxes}>采购管理平台</AppShellBrand>}\n * header={<><CommandPalette … /><ThemeSwitcher preference={preference} /></>}\n * sidebar={<NavList aria-label=\"文档\">…</NavList>}\n * aside={<TableOfContents items={headings} />}\n * >\n * <Prose>…</Prose>\n * </AppShell>\n *\n * 响应式(宽度按容器档位 sizes.lg / sizes.xl):\n * - 64rem 以上显示左侧栏;更窄时收进从起始边滑出的 Drawer,顶栏最前面出现打开它的按钮。\n * 抽屉里点了链接(换页)、或窗口变宽时自动关闭。\n * - 80rem 以上显示右侧栏;更窄时不显示(目录这类辅助内容)。\n * 两侧栏粘在顶栏下面,内容多时各自滚动(ScrollArea)。顶栏半透明,滚动的正文从下面透出(backdrop-filter)。\n * 整页与两侧栏都是浮层滚动条(PageScrollbar、ScrollArea):不占宽度,滚动时出现。\n *\n * 写了 brand 时,侧栏常驻的宽度下品牌这一格与侧栏同宽,侧栏的竖线一直延伸到顶栏顶端,\n * header 的内容从竖线之后开始、与正文的起始边对齐(本页的页签放在这里)。\n *\n * sidebarMode=\"overlay\":侧栏改为盖在页面上面的抽屉,开不开都不占正文的位置(正文总是整宽,布局不随侧栏变化)。\n * “菜单”按钮固定在顶栏品牌格的结束边,开关都是它(aria-expanded);抽屉从顶栏下面弹出、盖在正文上。\n * 抽屉结束边可以拖动调整宽度(ResizeHandle,也能聚焦后用 ← / →,双击回到初始宽度),父级写 _sidebarWidth={x} 记住;\n * 顶栏的品牌格按初始宽度,拖动时不变。焦点在抽屉里时按 Esc 收起、焦点回到“菜单”;窄屏时点了链接也收起。\n * 拖到比 160px 窄时侧栏变紧凑:里面的 NavList 只显示图标(名称在提示里),小节标题只剩图标(NavCompactContext)。\n *\n * 品牌格里一般放 AppShellBrand:品牌色的标志与产品名,点了回首页;自己的标志图写在它的 logo 里。\n *\n * 几种布局与区域:\n * - nav:顶栏里品牌后面的导航(NavBar)。只有 nav 时是顶部导航布局,和 sidebar 一起时是混合布局(顶栏一级、侧栏二级)。\n * - tabs:正文上面的页签区(PageTabs,和路由同步用 useRouteTabs);footer:正文下面的页脚,内容少时也贴着底部。\n * - sidebarCollapsible:docked 侧栏底部有“收起侧栏”,收起后只剩图标栏(宽屏时;导航变紧凑、分组悬停弹出,\n * 品牌格只剩标志),父级写 _sidebarCollapsed={x} 记住。\n *\n * 自带 SkipLink(跳到正文);顶栏的高度经 layoutVars.stickyOffset 交给里面的标题,锚点跳转后不被顶栏挡住。\n */\nimport { Menu as MenuIcon, PanelLeftClose, PanelLeftOpen } from '@lucide/icons';\nimport { createContext, _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, watch, type VNodeChild } from 'vue';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { useMessages } from '../config/lang/messages';\nimport { patternsMessages } from './messages';\nimport { Icon, type IconData, type IconProps } from '../base/Icon';\nimport { visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { NavCompactContext } from '../navigation/NavList';\nimport { SkipLink } from '../navigation/SkipLink';\nimport { PageScrollbar } from '../layout/PageScrollbar';\nimport { ResizeHandle, type ResizeHandleProps } from '../layout/ResizeHandle';\nimport { ScrollArea, type ScrollAreaProps } from '../layout/ScrollArea';\nimport { Drawer, type DrawerProps } from '../overlay/Drawer';\nimport { useMediaQuery } from '../utils/dom/media-query';\nimport { toElement } from '../utils/dom/element';\nimport { useRouterLink } from '../utils/dom/link';\nimport { hasContent, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { breakpoints, t } from '../config/theme/tokens';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { layoutVars } from '../utils/style/vars';\n\n/** 顶栏高度:也是两侧栏粘住的位置、标题跳转时让开的距离 */\nconst HEADER_HEIGHT = '3rem';\n/** 左侧栏的宽度:顶栏的品牌格与它同宽 */\nconst SIDEBAR_WIDTH = '16rem';\n/** 侧栏收起成图标栏时的宽度 */\nconst RAIL_WIDTH = '3.5rem';\n/** 抽屉式侧栏的默认宽度与可以拖动的范围(px) */\nconst OVERLAY_WIDTH = 256;\n// 最窄可以收到只剩滚动条那么宽\nconst OVERLAY_MIN_WIDTH = 16;\nconst OVERLAY_MAX_WIDTH = 480;\n// 比它窄时侧栏只放得下图标:导航变紧凑\nconst OVERLAY_COMPACT_WIDTH = 160;\n// 运行时判断侧栏是否常驻(useMediaQuery 要的是不带 @media 的查询)\nconst WIDE_QUERY = breakpoints.lg.replace('@media ', '');\n\n/** 左侧栏的形式 */\nexport interface AppShellSidebarModes {\n /** 宽屏时占一列、窄屏时收进抽屉(默认) */\n docked: unknown;\n /** 各宽度都是盖在页面上面的抽屉,不占正文的位置,可以收起、拖动宽度 */\n overlay: unknown;\n}\n\n/** 未声明的属性落到外层 div 上 */\nexport interface AppShellProps extends PartProps<'div'> {\n /** 顶栏起始边的品牌(标志与产品名):有侧栏时这一格与侧栏同宽,侧栏的竖线延伸到顶 */\n brand?: VNodeChild;\n /** 顶栏的内容:搜索、本页的页签、主题切换…(没写 brand 时标志也放这里) */\n header?: VNodeChild;\n /** 左侧栏:站点导航;窄屏时收进抽屉 */\n sidebar?: VNodeChild;\n /** 右侧栏:本页目录等辅助内容;较窄时不显示 */\n aside?: VNodeChild;\n /** 顶栏里品牌后面的导航(NavBar):只有它时是顶部导航布局,和 sidebar 一起时是混合布局(顶栏一级、侧栏二级) */\n nav?: VNodeChild;\n /** 正文上面的页签区(PageTabs:打开过的页面) */\n tabs?: VNodeChild;\n /** 正文下面的页脚(版权、备案号、版本) */\n footer?: VNodeChild;\n /** docked 侧栏底部有“收起侧栏”按钮:收起后只剩图标栏(导航变紧凑,分组的子项悬停弹出) */\n sidebarCollapsible?: boolean;\n /** docked 侧栏收起了:父级可以写 _sidebarCollapsed={x} 记住 */\n _sidebarCollapsed?: boolean;\n /** 左侧栏的形式,默认 docked */\n sidebarMode?: keyof AppShellSidebarModes;\n /** 侧栏抽屉是否打开(docked 时只在窄屏有抽屉):父级可以写 _sidebarOpen={x} */\n _sidebarOpen?: boolean;\n /**\n * overlay 抽屉的宽度(px),默认 256,范围 16–480(窄到几乎只剩滚动条;比 160 窄时导航只显示图标):\n * 父级写 _sidebarWidth={x} 记住拖动后的宽度\n */\n _sidebarWidth?: number;\n /** 页面最前面的“跳到正文”链接,默认 true */\n skipLink?: boolean;\n /** 整页用浮层滚动条(PageScrollbar:不占宽度,滚动时出现),默认 true */\n pageScrollbar?: boolean;\n /** 顶栏(header)的部件属性 */\n propsHeader?: PartProps<'header'>;\n /** 品牌格(div)的部件属性 */\n propsBrand?: PartProps<'div'>;\n /** 顶栏里 header 内容那一格(div)的部件属性 */\n propsHeaderContent?: PartProps<'div'>;\n /** 顶栏下面的主体(侧栏、正文、右栏的栅格)的部件属性 */\n propsBody?: PartProps<'div'>;\n /** 左侧栏(div)的部件属性 */\n propsSidebar?: PartProps<'div'>;\n /** 左侧栏里的滚动区域的部件属性(docked 的侧栏与 overlay 的抽屉共用) */\n propsSidebarScroll?: Partial<ScrollAreaProps>;\n /** 正文(main)的部件属性 */\n propsMain?: PartProps<'main'>;\n /** 顶栏里导航那一格的部件属性 */\n propsNav?: PartProps<'div'>;\n /** 页签区的部件属性 */\n propsTabs?: PartProps<'div'>;\n /** 页脚(footer)的部件属性 */\n propsFooter?: PartProps<'footer'>;\n /** “收起侧栏”按钮的部件属性 */\n propsCollapse?: Partial<IconButtonProps>;\n /** 右侧栏(aside)的部件属性 */\n propsAside?: PartProps<'aside'>;\n /** 右侧栏里的滚动区域的部件属性 */\n propsAsideScroll?: Partial<ScrollAreaProps>;\n /** docked 时窄屏打开侧栏的按钮的部件属性 */\n propsMenuButton?: Partial<IconButtonProps>;\n /** overlay 时品牌格里开关抽屉的“菜单”按钮的部件属性 */\n propsSidebarToggle?: Partial<ButtonProps>;\n /** overlay 抽屉宽度调整手柄的部件属性 */\n propsResizeHandle?: Partial<ResizeHandleProps>;\n /** 窄屏时的侧栏抽屉的部件属性 */\n propsDrawer?: Partial<DrawerProps>;\n /** 正文 */\n children?: VNodeChild;\n}\n\n/** AppShell 交给里面的部件的状态:侧栏收起时品牌只剩标志 */\nexport interface AppShellState {\n /** docked 侧栏收起成了图标栏(宽屏时) */\n collapsed: () => boolean;\n}\n\n/** AppShell 的上下文:AppShellBrand 据此在侧栏收起时只显示标志;不在 AppShell 里时为 null */\nexport const AppShellContext = createContext<AppShellState | null>('AppShell');\n\n/** 外壳把顶栏高度交给里面的标题与粘性侧栏 */\nexport const appShellOffset = css.createTheme(layoutVars, { stickyOffset: HEADER_HEIGHT });\n\n/** AppShell 的样式:root、header、menuButton、body、sidebar、main、aside 等 */\nexport const appShellStyles = css.create({\n // 整页的界面基准文字(同 Provider):没有 Provider 时页面是浏览器默认的 16px,与组件的 md 档位对不上\n root: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: '100dvh',\n color: '_text',\n fontSize: '_md',\n lineHeight: '_normal',\n },\n header: {\n position: 'sticky',\n top: 0,\n // 盖住滚动的正文与粘性侧栏;低于浮层(顶层渲染)与 SkipLink\n zIndex: 10,\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n gap: '_md',\n height: HEADER_HEIGHT,\n flexShrink: 0,\n paddingInline: '_lg',\n borderBlockEndWidth: '_xs',\n borderBlockEndStyle: 'solid',\n borderBlockEndColor: '_border',\n backgroundColor: '_surfaceTranslucent',\n backdropFilter: 'blur(12px) saturate(1.5)',\n },\n menuButton: { display: { default: 'inline-flex', [breakpoints.lg]: 'none' }, flexShrink: 0 },\n // 有品牌格与侧栏:宽屏时品牌格贴着起始边;品牌格与内容之间隔开正文的内边距,内容与正文的起始边对齐\n headerWithBrand: {\n paddingInlineStart: { default: null, [breakpoints.lg]: 0 },\n columnGap: { default: null, [breakpoints.lg]: '_xl' },\n },\n brand: { display: 'flex', alignItems: 'center', gap: '_sm', flexShrink: 0, minWidth: 0 },\n // 宽屏时与侧栏同宽,结束边的竖线与侧栏的竖线接上\n brandRail: {\n alignSelf: { default: null, [breakpoints.lg]: 'stretch' },\n boxSizing: 'border-box',\n width: { default: null, [breakpoints.lg]: SIDEBAR_WIDTH },\n paddingInline: { default: null, [breakpoints.lg]: '_lg' },\n borderInlineEndWidth: { default: null, [breakpoints.lg]: '_xs' },\n borderInlineEndStyle: { default: null, [breakpoints.lg]: 'solid' },\n borderInlineEndColor: { default: null, [breakpoints.lg]: '_border' },\n },\n headerContent: { display: 'flex', alignItems: 'center', gap: '_md', flexGrow: 1, minWidth: 0 },\n body: { display: 'grid', flexGrow: 1, gridTemplateColumns: 'minmax(0, 1fr)' },\n withSidebar: {\n gridTemplateColumns: { default: null, [breakpoints.lg]: `${SIDEBAR_WIDTH} minmax(0, 1fr)` },\n },\n withAside: { gridTemplateColumns: { default: null, [breakpoints.xl]: 'minmax(0, 1fr) 14rem' } },\n // 一个属性上两个断点:窄的一档用 lgOnly,不和 xl 重叠(见 breakpoints 的说明)\n withBoth: {\n gridTemplateColumns: {\n default: null,\n [breakpoints.lgOnly]: `${SIDEBAR_WIDTH} minmax(0, 1fr)`,\n [breakpoints.xl]: `${SIDEBAR_WIDTH} minmax(0, 1fr) 14rem`,\n },\n },\n // 两侧栏:粘在顶栏下面、占满剩下的视口高度,内容多时各自滚动,滚到头不带动页面\n rail: {\n position: 'sticky',\n top: layoutVars.stickyOffset,\n boxSizing: 'border-box',\n height: `calc(100dvh - ${layoutVars.stickyOffset})`,\n },\n // 侧栏里的滚动区域:浮层滚动条,滚到头不带动页面;内边距放在内容层上,滚动条贴着侧栏边缘\n railScroll: { height: '_full' },\n railViewport: { overscrollBehavior: 'contain' },\n sidebar: {\n display: { default: 'none', [breakpoints.lg]: 'block' },\n borderInlineEndWidth: '_xs',\n borderInlineEndStyle: 'solid',\n borderInlineEndColor: '_border',\n },\n sidebarContent: { paddingBlock: '_xl', paddingInline: '_md' },\n // 紧凑的侧栏:两边只留一点,图标居中\n sidebarContentCompact: { paddingInline: '_xs' },\n aside: { display: { default: 'none', [breakpoints.xl]: 'block' } },\n asideContent: { paddingBlock: '_xl', paddingInline: '_lg' },\n // 正文由 SkipLink 聚焦(tabindex=-1):不显示焦点框\n main: { minWidth: 0, paddingBlock: '_xl', paddingInline: '_xl', outlineStyle: 'none' },\n // overlay:从顶栏下面弹出、盖在正文上(低于顶栏与顶层渲染的浮层);从起始边滑入,收起后不显示(inert,不能聚焦)。\n // 打开时 translate 是 none:否则抽屉会成为里面 fixed 元素的包含块(同 Drawer)\n overlay: {\n position: 'fixed',\n top: HEADER_HEIGHT,\n bottom: 0,\n insetInlineStart: 0,\n zIndex: 9,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n maxWidth: 'calc(100vw - 3rem)',\n // 拖得很窄时内容裁在抽屉里,不溢出到正文上\n overflow: 'hidden',\n backgroundColor: '_surface',\n borderInlineEndWidth: '_xs',\n borderInlineEndStyle: 'solid',\n borderInlineEndColor: '_border',\n boxShadow: '_lg',\n // 收起:滑出去之后再隐藏(visibility 延迟到滑完)\n visibility: 'hidden',\n translate: { default: '-100% 0', ':dir(rtl)': '100% 0' },\n transition: `translate ${t.durations.md} ${t.easings.exit}, visibility 0s linear ${t.durations.md}`,\n },\n // 打开:立刻可见,再滑进来\n overlayOpen: {\n visibility: 'visible',\n translate: 'none',\n transition: `translate ${t.durations.lg} ${t.easings.enter}, visibility 0s`,\n },\n overlayScroll: { flexGrow: 1, minHeight: 0 },\n // overlay 时顶栏的品牌格:宽屏时按抽屉的初始宽度,“菜单”在它的结束边\n brandOverlay: {\n alignSelf: { default: null, [breakpoints.lg]: 'stretch' },\n justifyContent: 'space-between',\n boxSizing: 'border-box',\n paddingInlineStart: { default: null, [breakpoints.lg]: '_lg' },\n paddingInlineEnd: { default: null, [breakpoints.lg]: '_sm' },\n borderInlineEndWidth: { default: null, [breakpoints.lg]: '_xs' },\n borderInlineEndStyle: { default: null, [breakpoints.lg]: 'solid' },\n borderInlineEndColor: { default: null, [breakpoints.lg]: '_border' },\n },\n toggle: { flexShrink: 0 },\n // 侧栏收起成图标栏:栅格的第一列、品牌格都变窄,品牌只剩标志\n withSidebarCollapsed: {\n gridTemplateColumns: { default: null, [breakpoints.lg]: `${RAIL_WIDTH} minmax(0, 1fr)` },\n },\n withBothCollapsed: {\n gridTemplateColumns: {\n default: null,\n [breakpoints.lgOnly]: `${RAIL_WIDTH} minmax(0, 1fr)`,\n [breakpoints.xl]: `${RAIL_WIDTH} minmax(0, 1fr) 14rem`,\n },\n },\n brandRailCollapsed: {\n width: { default: null, [breakpoints.lg]: RAIL_WIDTH },\n justifyContent: { default: null, [breakpoints.lg]: 'center' },\n paddingInline: { default: null, [breakpoints.lg]: '_xs' },\n },\n // 有收起按钮的侧栏:滚动区域占满剩下的高度,按钮在最下面\n sidebarColumn: {\n display: { default: 'none', [breakpoints.lg]: 'flex' },\n flexDirection: 'column',\n },\n sidebarScroll: { flexGrow: 1, minHeight: 0, height: 'auto' },\n collapseBar: {\n display: 'flex',\n justifyContent: 'flex-end',\n flexShrink: 0,\n padding: '_sm',\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_borderMuted',\n },\n collapseBarCollapsed: { justifyContent: 'center' },\n // 顶栏的导航:占品牌与右边工具之间的位置;有导航时右边的工具按内容宽、靠结束边\n nav: { display: 'flex', alignItems: 'center', alignSelf: 'stretch', flexGrow: 1, minWidth: 0 },\n headerContentAfterNav: { flexGrow: 0, justifyContent: 'flex-end' },\n // 正文那一列:页签区、正文、页脚上下排,页脚在内容少时也贴着底部\n column: { display: 'flex', flexDirection: 'column', minWidth: 0 },\n mainGrow: { flexGrow: 1 },\n tabs: { paddingBlockStart: '_sm', paddingInline: '_xl' },\n footer: {\n paddingBlock: '_lg',\n paddingInline: '_xl',\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_borderMuted',\n color: '_textMuted',\n fontSize: '_sm',\n },\n});\n\n/** AppShell 的动态样式:抽屉的宽度、宽屏时品牌格的宽度(px) */\nexport const appShellDynamicStyles = css.create({\n width: (px: number) => ({ width: px }),\n brandWidth: (px: number) => ({ width: { default: null, [breakpoints.lg]: px } }),\n});\n\n/** 应用外壳:粘性顶栏、左侧栏、正文、右侧栏;窄屏时左侧栏收进抽屉 */\nexport const AppShell = _component(\n ({\n brand,\n header,\n sidebar,\n aside,\n nav,\n tabs,\n footer,\n sidebarMode = 'docked',\n _sidebarOpen: sidebarOpen = _bindable(false),\n _sidebarWidth: sidebarWidth = _bindable(OVERLAY_WIDTH),\n sidebarCollapsible = false,\n _sidebarCollapsed: sidebarCollapsed = _bindable(false),\n skipLink = true,\n pageScrollbar = true,\n propsHeader,\n propsBrand,\n propsSidebar,\n propsMain,\n propsAside,\n propsMenuButton,\n propsSidebarToggle,\n propsResizeHandle,\n propsDrawer,\n propsHeaderContent,\n propsBody,\n propsSidebarScroll,\n propsAsideScroll,\n propsNav,\n propsTabs,\n propsFooter,\n propsCollapse,\n children,\n ...rest\n }: AppShellProps) => {\n const messages = useMessages('patterns', patternsMessages);\n const id = useId();\n const mainId = `${id}-main`;\n const sidebarId = `${id}-sidebar`;\n const overlay = () => sidebarMode === 'overlay';\n const docked = () => hasContent(sidebar) && !overlay();\n const wide = useMediaQuery(WIDE_QUERY);\n // docked 的侧栏收起成图标栏:只在宽屏(窄屏时侧栏在抽屉里,抽屉总是完整的)\n const collapsed = () => docked() && sidebarCollapsible && sidebarCollapsed && wide.value;\n const compact = () => (overlay() && sidebarWidth < OVERLAY_COMPACT_WIDTH) || collapsed();\n NavCompactContext.provide(compact);\n AppShellContext.provide({ collapsed });\n // docked:变宽后侧栏已经显示出来,抽屉没必要再开着\n watch(wide, (isWide) => {\n if (isWide && !overlay()) sidebarOpen = false;\n });\n // 抽屉里点了链接(通常是换页):关闭抽屉;overlay 在宽屏时不关(挡不住正文的主要部分,常要连着换几页)\n function closeOnNavigate(event: MouseEvent) {\n if (overlay() && wide.value) return;\n if (event.target instanceof Element && event.target.closest('a[href]')) sidebarOpen = false;\n }\n\n // overlay:品牌格按初始宽度,拖动抽屉时不变;双击手柄回到它\n // 记住的宽度是拖窄后的紧凑宽度时,品牌格与双击回到的宽度按默认宽度(品牌格太窄会和顶栏的内容叠在一起)\n const remembered = _untrack(sidebarWidth);\n const initialWidth = remembered < OVERLAY_COMPACT_WIDTH ? OVERLAY_WIDTH : remembered;\n // Esc 收起:焦点在抽屉里,收起后它不能聚焦了,回到“菜单”\n let toggleButton = _state.raw<HTMLElement | null>(null);\n function onOverlayKeydown(event: KeyboardEvent) {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n event.preventDefault();\n sidebarOpen = false;\n toggleButton?.focus();\n }\n\n /** overlay 的“菜单”:开关抽屉,图标随开关切换 */\n const sidebarToggle = () => (\n <Button\n {...mergePartProps<ButtonProps>(\n {\n variant: 'ghost',\n tone: 'neutral',\n size: 'sm',\n icon: sidebarOpen ? PanelLeftClose : PanelLeftOpen,\n sx: appShellStyles.toggle,\n },\n propsSidebarToggle,\n {\n ref: (element: unknown) => (toggleButton = toElement(element)),\n 'aria-expanded': sidebarOpen,\n 'aria-controls': sidebarId,\n onClick: () => (sidebarOpen = !sidebarOpen),\n },\n )}\n >\n {messages.navigationMenu}\n </Button>\n );\n\n return () => (\n <div {...mergeAttrs<'div'>({ sx: [appShellStyles.root, appShellOffset] }, rest)}>\n {skipLink && <SkipLink href={`#${mainId}`} />}\n {pageScrollbar && <PageScrollbar />}\n <header\n {...mergeAttrs<'header'>(\n {\n sx: [\n appShellStyles.header,\n hasContent(brand) && hasContent(sidebar) && appShellStyles.headerWithBrand,\n ],\n },\n propsHeader,\n )}\n >\n {hasContent(sidebar) && !overlay() && (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n sx: appShellStyles.menuButton,\n icon: MenuIcon,\n 'aria-label': messages.navigationOpen,\n },\n propsMenuButton,\n { 'aria-expanded': sidebarOpen, onClick: () => (sidebarOpen = true) },\n )}\n />\n )}\n {hasContent(brand) && (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.brand,\n hasContent(sidebar) &&\n (overlay()\n ? [\n appShellStyles.brandOverlay,\n appShellDynamicStyles.brandWidth(initialWidth),\n ]\n : [\n appShellStyles.brandRail,\n collapsed() && appShellStyles.brandRailCollapsed,\n ]),\n ],\n },\n propsBrand,\n )}\n >\n {brand}\n {hasContent(sidebar) && overlay() && sidebarToggle()}\n </div>\n )}\n {!hasContent(brand) && hasContent(sidebar) && overlay() && sidebarToggle()}\n {hasContent(nav) && (\n <div {...mergeAttrs<'div'>({ sx: appShellStyles.nav }, propsNav)}>{nav}</div>\n )}\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.headerContent,\n hasContent(nav) && appShellStyles.headerContentAfterNav,\n ],\n },\n propsHeaderContent,\n )}\n >\n {header}\n </div>\n </header>\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.body,\n docked() && hasContent(aside)\n ? collapsed()\n ? appShellStyles.withBothCollapsed\n : appShellStyles.withBoth\n : docked()\n ? collapsed()\n ? appShellStyles.withSidebarCollapsed\n : appShellStyles.withSidebar\n : hasContent(aside) && appShellStyles.withAside,\n ],\n },\n propsBody,\n )}\n >\n {docked() && (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.rail,\n appShellStyles.sidebar,\n sidebarCollapsible && appShellStyles.sidebarColumn,\n ],\n },\n propsSidebar,\n )}\n >\n <ScrollArea\n {...mergePartProps<ScrollAreaProps>(\n {\n sx: [\n appShellStyles.railScroll,\n sidebarCollapsible && appShellStyles.sidebarScroll,\n ],\n propsViewport: { sx: appShellStyles.railViewport },\n propsContent: {\n sx: [\n appShellStyles.sidebarContent,\n collapsed() && appShellStyles.sidebarContentCompact,\n ],\n },\n },\n propsSidebarScroll,\n )}\n >\n {sidebar}\n </ScrollArea>\n {sidebarCollapsible && (\n <div\n {...css.attrs(\n appShellStyles.collapseBar,\n collapsed() && appShellStyles.collapseBarCollapsed,\n )}\n >\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: sidebarCollapsed ? PanelLeftOpen : PanelLeftClose,\n size: 'sm',\n variant: 'ghost',\n propsIcon: { flipInRtl: true },\n 'aria-label': sidebarCollapsed\n ? messages.sidebarExpand\n : messages.sidebarCollapse,\n },\n propsCollapse,\n { onClick: () => (sidebarCollapsed = !sidebarCollapsed) },\n )}\n />\n </div>\n )}\n </div>\n )}\n <div {...css.attrs(appShellStyles.column)}>\n {hasContent(tabs) && (\n <div {...mergeAttrs<'div'>({ sx: appShellStyles.tabs }, propsTabs)}>{tabs}</div>\n )}\n <main\n {...mergeAttrs<'main'>(\n { sx: [appShellStyles.main, appShellStyles.mainGrow] },\n propsMain,\n {\n id: mainId,\n tabindex: -1,\n },\n )}\n >\n {children}\n </main>\n {hasContent(footer) && (\n <footer {...mergeAttrs<'footer'>({ sx: appShellStyles.footer }, propsFooter)}>\n {footer}\n </footer>\n )}\n </div>\n {hasContent(aside) && (\n <aside\n {...mergeAttrs<'aside'>(\n { sx: [appShellStyles.rail, appShellStyles.aside] },\n propsAside,\n )}\n >\n <ScrollArea\n {...mergePartProps<ScrollAreaProps>(\n {\n sx: appShellStyles.railScroll,\n propsViewport: { sx: appShellStyles.railViewport },\n propsContent: { sx: appShellStyles.asideContent },\n },\n propsAsideScroll,\n )}\n >\n {aside}\n </ScrollArea>\n </aside>\n )}\n </div>\n {hasContent(sidebar) && overlay() && (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.overlay,\n sidebarOpen && appShellStyles.overlayOpen,\n appShellDynamicStyles.width(sidebarWidth),\n ],\n },\n propsSidebar,\n {\n id: sidebarId,\n inert: !sidebarOpen,\n onKeydown: onOverlayKeydown,\n onClick: closeOnNavigate,\n },\n )}\n >\n <ScrollArea\n {...mergePartProps<ScrollAreaProps>(\n {\n sx: appShellStyles.overlayScroll,\n propsViewport: { sx: appShellStyles.railViewport },\n propsContent: {\n sx: [\n appShellStyles.sidebarContent,\n compact() && appShellStyles.sidebarContentCompact,\n ],\n },\n },\n propsSidebarScroll,\n )}\n >\n {sidebar}\n </ScrollArea>\n <ResizeHandle\n aria-label={messages.navigationResize}\n {...propsResizeHandle}\n width={sidebarWidth}\n minWidth={OVERLAY_MIN_WIDTH}\n maxWidth={OVERLAY_MAX_WIDTH}\n defaultWidth={initialWidth}\n onWidthChange={(px: number) => (sidebarWidth = px)}\n />\n </div>\n )}\n {docked() && (\n <Drawer\n {...mergePartProps<DrawerProps>(\n { title: messages.navigation, side: 'start' },\n propsDrawer,\n {\n onClick: closeOnNavigate,\n },\n )}\n _open={sidebarOpen}\n >\n {sidebar}\n </Drawer>\n )}\n </div>\n );\n },\n);\n\n/** 未声明的属性落到链接(a)上 */\nexport interface AppShellBrandProps extends PartProps<'a', 'href'> {\n /** 点了去哪儿,一般是首页 */\n href: string;\n /** 标志的图标(品牌色) */\n icon?: IconData;\n /** 标志的图片等,写了时不画 icon */\n logo?: VNodeChild;\n /** 图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n /** 产品名 */\n children?: VNodeChild;\n}\n\n/** AppShellBrand 的样式:root、mark */\nexport const appShellBrandStyles = css.create({\n root: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '_sm',\n flexShrink: 0,\n color: '_text',\n textDecoration: 'none',\n fontWeight: '_semibold',\n fontSize: '_lg',\n borderRadius: '_sm',\n },\n mark: { color: '_accentText' },\n});\n\n/**\n * 外壳顶栏的品牌:品牌色的标志(装饰,对读屏隐藏)与产品名,名字就是链接的名称,点了回首页(走路由适配)。\n * 放在 AppShell 的 brand 里\n */\nexport const AppShellBrand = _component(\n ({ href, icon, logo, propsIcon, children, ...rest }: AppShellBrandProps) => {\n const router = useRouterLink();\n const shell = AppShellContext.inject(null);\n return () => (\n <a\n {...mergeAttrs<'a'>({ sx: [appShellBrandStyles.root, focusRingStyles.visible] }, rest, {\n href: router.href(href),\n onClick: (event: MouseEvent) => router.onClick(event, href),\n })}\n >\n {logo ??\n (icon && (\n <Icon\n {...mergePartProps<IconProps>({ icon, sx: appShellBrandStyles.mark }, propsIcon)}\n />\n ))}\n {/* 侧栏收起成图标栏时品牌格只放得下标志:产品名留给读屏(仍是链接的名称) */}\n <span {...css.attrs(shell?.collapsed() && visuallyHiddenStyles.hidden)}>{children}</span>\n </a>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"AppShell.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_childrenProp","_vtp_restProps","_vtp_untrack","_vue_shallowRef","_createVNode","_mergeProps","MenuIcon","_vue_unref"],"sources":["../../src/patterns/AppShell.tsx"],"sourcesContent":["/**\n * 应用外壳:粘性顶栏、左侧栏(导航)、正文、右侧栏(本页目录),文档站与后台的整页骨架。\n *\n * <AppShell\n * brand={<AppShellBrand href=\"/\" icon={Boxes}>采购管理平台</AppShellBrand>}\n * header={<><CommandPalette … /><ThemeSwitcher preference={preference} /></>}\n * sidebar={<NavList aria-label=\"文档\">…</NavList>}\n * aside={<TableOfContents items={headings} />}\n * >\n * <Prose>…</Prose>\n * </AppShell>\n *\n * 响应式(宽度按容器档位 sizes.lg / sizes.xl):\n * - 64rem 以上显示左侧栏;更窄时收进从起始边滑出的 Drawer,顶栏最前面出现打开它的按钮。\n * 抽屉里点了链接(换页)、或窗口变宽时自动关闭。\n * - 80rem 以上显示右侧栏;更窄时不显示(目录这类辅助内容)。\n * 两侧栏粘在顶栏下面,内容多时各自滚动(ScrollArea)。顶栏半透明,滚动的正文从下面透出(backdrop-filter)。\n * 整页与两侧栏都是浮层滚动条(PageScrollbar、ScrollArea):不占宽度,滚动时出现。\n *\n * 写了 brand 时,侧栏常驻的宽度下品牌这一格与侧栏同宽,侧栏的竖线一直延伸到顶栏顶端,\n * header 的内容从竖线之后开始、与正文的起始边对齐(本页的页签放在这里)。\n *\n * sidebarMode=\"overlay\":侧栏改为盖在页面上面的抽屉,开不开都不占正文的位置(正文总是整宽,布局不随侧栏变化)。\n * “菜单”按钮固定在顶栏品牌格的结束边,开关都是它(aria-expanded);抽屉从顶栏下面弹出、盖在正文上。\n * 抽屉结束边可以拖动调整宽度(ResizeHandle,也能聚焦后用 ← / →,双击回到初始宽度),父级写 _sidebarWidth={x} 记住;\n * 顶栏的品牌格按初始宽度,拖动时不变。焦点在抽屉里时按 Esc 收起、焦点回到“菜单”;窄屏时点了链接也收起。\n * 拖到比 160px 窄时侧栏变紧凑:里面的 NavList 只显示图标(名称在提示里),小节标题只剩图标(NavCompactContext)。\n * sidebarSide 选抽屉从哪一边滑出:start(默认)、end、top、bottom。start / end 是左右两侧抽屉(随排版方向,从右到左时互换),\n * end 时“菜单”在顶栏结束边;top / bottom 是盖满宽度的上下抽屉,导航的小节排成多列,拖动贴着正文的那条边调整高度\n * (_sidebarHeight 记住)。上下抽屉盖住的正文范围大,点了链接就收起(左右抽屉在宽屏时不收)。\n * 想让用户自己选,用 layout:createLayoutPreference 的结果,侧栏的形式、方向、开关与尺寸都从它读、写回它并存盘,\n * 配合顶栏里的 LayoutSwitcher;写了 layout 时 sidebarMode、sidebarSide、_sidebarOpen 等不再起作用。\n *\n * 品牌格里一般放 AppShellBrand:品牌色的标志与产品名,点了回首页;自己的标志图写在它的 logo 里。\n *\n * 几种布局与区域:\n * - nav:顶栏里品牌后面的导航(NavBar)。只有 nav 时是顶部导航布局,和 sidebar 一起时是混合布局(顶栏一级、侧栏二级)。\n * - tabs:正文上面的页签区(PageTabs,和路由同步用 useRouteTabs);footer:正文下面的页脚,内容少时也贴着底部。\n * - sidebarCollapsible:docked 侧栏底部有“收起侧栏”,收起后只剩图标栏(宽屏时;导航变紧凑、分组悬停弹出,\n * 品牌格只剩标志),父级写 _sidebarCollapsed={x} 记住。\n *\n * 自带 SkipLink(跳到正文);顶栏的高度经 layoutVars.stickyOffset 交给里面的标题,锚点跳转后不被顶栏挡住。\n */\nimport {\n Menu as MenuIcon,\n PanelBottomClose,\n PanelBottomOpen,\n PanelLeftClose,\n PanelLeftOpen,\n PanelRightClose,\n PanelRightOpen,\n PanelTopClose,\n PanelTopOpen,\n} from '@lucide/icons';\nimport { createContext, _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, watch, type VNodeChild } from 'vue';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { useMessages } from '../config/lang/messages';\nimport { patternsMessages } from './messages';\nimport { Icon, type IconData, type IconProps } from '../base/Icon';\nimport { visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { NavCompactContext } from '../navigation/NavList';\nimport { SkipLink } from '../navigation/SkipLink';\nimport { PageScrollbar } from '../layout/PageScrollbar';\nimport { ResizeHandle, type ResizeHandleProps } from '../layout/ResizeHandle';\nimport { ScrollArea, type ScrollAreaProps } from '../layout/ScrollArea';\nimport { Drawer, type DrawerProps } from '../overlay/Drawer';\nimport { useMediaQuery } from '../utils/dom/media-query';\nimport { toElement } from '../utils/dom/element';\nimport { useRouterLink } from '../utils/dom/link';\nimport { hasContent, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport type { LayoutPreference } from '../config/layout/preference';\nimport { breakpoints, t } from '../config/theme/tokens';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { layoutVars } from '../utils/style/vars';\n\n/** 顶栏高度:也是两侧栏粘住的位置、标题跳转时让开的距离 */\nconst HEADER_HEIGHT = '3rem';\n/** 左侧栏的宽度:顶栏的品牌格与它同宽 */\nconst SIDEBAR_WIDTH = '16rem';\n/** 侧栏收起成图标栏时的宽度 */\nconst RAIL_WIDTH = '3.5rem';\n/** 抽屉式侧栏的默认宽度与可以拖动的范围(px) */\nconst OVERLAY_WIDTH = 256;\n// 最窄可以收到只剩滚动条那么宽\nconst OVERLAY_MIN_WIDTH = 16;\nconst OVERLAY_MAX_WIDTH = 480;\n// 上下两侧抽屉的默认高度与可以拖动的范围(px)\nconst OVERLAY_HEIGHT = 320;\nconst OVERLAY_MIN_HEIGHT = 96;\nconst OVERLAY_MAX_HEIGHT = 640;\n// 比它窄时侧栏只放得下图标:导航变紧凑\nconst OVERLAY_COMPACT_WIDTH = 160;\n// 运行时判断侧栏是否常驻(useMediaQuery 要的是不带 @media 的查询)\nconst WIDE_QUERY = breakpoints.lg.replace('@media ', '');\n\n/** 左侧栏的形式 */\nexport interface AppShellSidebarModes {\n /** 宽屏时占一列、窄屏时收进抽屉(默认) */\n docked: unknown;\n /** 各宽度都是盖在页面上面的抽屉,不占正文的位置,可以收起、拖动宽度 */\n overlay: unknown;\n}\n\n/** 抽屉式侧栏从哪一边滑出(sidebarMode=\"overlay\") */\nexport interface AppShellSidebarSides {\n /** 起始边(左,从右到左排版时是右):默认 */\n start: unknown;\n /** 结束边(右,从右到左排版时是左):“菜单”在顶栏结束边 */\n end: unknown;\n /** 顶栏下面,盖满宽度,导航的小节排成多列 */\n top: unknown;\n /** 窗口底部,盖满宽度,导航的小节排成多列 */\n bottom: unknown;\n}\n\n/** 未声明的属性落到外层 div 上 */\nexport interface AppShellProps extends PartProps<'div'> {\n /** 顶栏起始边的品牌(标志与产品名):有侧栏时这一格与侧栏同宽,侧栏的竖线延伸到顶 */\n brand?: VNodeChild;\n /** 顶栏的内容:搜索、本页的页签、主题切换…(没写 brand 时标志也放这里) */\n header?: VNodeChild;\n /** 左侧栏:站点导航;窄屏时收进抽屉 */\n sidebar?: VNodeChild;\n /** 右侧栏:本页目录等辅助内容;较窄时不显示 */\n aside?: VNodeChild;\n /** 顶栏里品牌后面的导航(NavBar):只有它时是顶部导航布局,和 sidebar 一起时是混合布局(顶栏一级、侧栏二级) */\n nav?: VNodeChild;\n /** 正文上面的页签区(PageTabs:打开过的页面) */\n tabs?: VNodeChild;\n /** 正文下面的页脚(版权、备案号、版本) */\n footer?: VNodeChild;\n /** docked 侧栏底部有“收起侧栏”按钮:收起后只剩图标栏(导航变紧凑,分组的子项悬停弹出) */\n sidebarCollapsible?: boolean;\n /** docked 侧栏收起了:父级可以写 _sidebarCollapsed={x} 记住 */\n _sidebarCollapsed?: boolean;\n /** 左侧栏的形式,默认 docked */\n sidebarMode?: keyof AppShellSidebarModes;\n /** 抽屉式侧栏从哪一边滑出,默认 start;只在 overlay 时有效 */\n sidebarSide?: keyof AppShellSidebarSides;\n /**\n * 用户选的布局(createLayoutPreference 的结果):侧栏的形式、方向、开关与尺寸从它读、写回它并存盘,\n * 写了它,sidebarMode、sidebarSide、_sidebarOpen、_sidebarWidth、_sidebarHeight、_sidebarCollapsed 就不再起作用\n */\n layout?: LayoutPreference;\n /** 侧栏抽屉是否打开(docked 时只在窄屏有抽屉):父级可以写 _sidebarOpen={x} */\n _sidebarOpen?: boolean;\n /**\n * overlay 抽屉的宽度(px),默认 256,范围 16–480(窄到几乎只剩滚动条;比 160 窄时导航只显示图标):\n * 父级写 _sidebarWidth={x} 记住拖动后的宽度\n */\n _sidebarWidth?: number;\n /** 上下两侧抽屉的高度(px),默认 320,范围 96–640:父级写 _sidebarHeight={x} 记住拖动后的高度 */\n _sidebarHeight?: number;\n /** 页面最前面的“跳到正文”链接,默认 true */\n skipLink?: boolean;\n /** 整页用浮层滚动条(PageScrollbar:不占宽度,滚动时出现),默认 true */\n pageScrollbar?: boolean;\n /** 顶栏(header)的部件属性 */\n propsHeader?: PartProps<'header'>;\n /** 品牌格(div)的部件属性 */\n propsBrand?: PartProps<'div'>;\n /** 顶栏里 header 内容那一格(div)的部件属性 */\n propsHeaderContent?: PartProps<'div'>;\n /** 顶栏下面的主体(侧栏、正文、右栏的栅格)的部件属性 */\n propsBody?: PartProps<'div'>;\n /** 左侧栏(div)的部件属性 */\n propsSidebar?: PartProps<'div'>;\n /** 左侧栏里的滚动区域的部件属性(docked 的侧栏与 overlay 的抽屉共用) */\n propsSidebarScroll?: Partial<ScrollAreaProps>;\n /** 正文(main)的部件属性 */\n propsMain?: PartProps<'main'>;\n /** 顶栏里导航那一格的部件属性 */\n propsNav?: PartProps<'div'>;\n /** 页签区的部件属性 */\n propsTabs?: PartProps<'div'>;\n /** 页脚(footer)的部件属性 */\n propsFooter?: PartProps<'footer'>;\n /** “收起侧栏”按钮的部件属性 */\n propsCollapse?: Partial<IconButtonProps>;\n /** 右侧栏(aside)的部件属性 */\n propsAside?: PartProps<'aside'>;\n /** 右侧栏里的滚动区域的部件属性 */\n propsAsideScroll?: Partial<ScrollAreaProps>;\n /** docked 时窄屏打开侧栏的按钮的部件属性 */\n propsMenuButton?: Partial<IconButtonProps>;\n /** overlay 时品牌格里开关抽屉的“菜单”按钮的部件属性 */\n propsSidebarToggle?: Partial<ButtonProps>;\n /** overlay 抽屉宽度调整手柄的部件属性 */\n propsResizeHandle?: Partial<ResizeHandleProps>;\n /** 窄屏时的侧栏抽屉的部件属性 */\n propsDrawer?: Partial<DrawerProps>;\n /** 正文 */\n children?: VNodeChild;\n}\n\n/** AppShell 交给里面的部件的状态:侧栏收起时品牌只剩标志 */\nexport interface AppShellState {\n /** docked 侧栏收起成了图标栏(宽屏时) */\n collapsed: () => boolean;\n}\n\n/** AppShell 的上下文:AppShellBrand 据此在侧栏收起时只显示标志;不在 AppShell 里时为 null */\nexport const AppShellContext = createContext<AppShellState | null>('AppShell');\n\n/** 外壳把顶栏高度交给里面的标题与粘性侧栏 */\nexport const appShellOffset = css.createTheme(layoutVars, { stickyOffset: HEADER_HEIGHT });\n\n/** AppShell 的样式:root、header、menuButton、body、sidebar、main、aside 等 */\nexport const appShellStyles = css.create({\n // 整页的界面基准文字(同 Provider):没有 Provider 时页面是浏览器默认的 16px,与组件的 md 档位对不上\n root: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: '100dvh',\n color: '_text',\n fontSize: '_md',\n lineHeight: '_normal',\n },\n header: {\n position: 'sticky',\n top: 0,\n // 盖住滚动的正文与粘性侧栏;低于浮层(顶层渲染)与 SkipLink\n zIndex: 10,\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n gap: '_md',\n height: HEADER_HEIGHT,\n flexShrink: 0,\n paddingInline: '_lg',\n borderBlockEndWidth: '_xs',\n borderBlockEndStyle: 'solid',\n borderBlockEndColor: '_border',\n backgroundColor: '_surfaceTranslucent',\n backdropFilter: 'blur(12px) saturate(1.5)',\n },\n menuButton: { display: { default: 'inline-flex', [breakpoints.lg]: 'none' }, flexShrink: 0 },\n // 有品牌格与侧栏:宽屏时品牌格贴着起始边;品牌格与内容之间隔开正文的内边距,内容与正文的起始边对齐\n headerWithBrand: {\n paddingInlineStart: { default: null, [breakpoints.lg]: 0 },\n columnGap: { default: null, [breakpoints.lg]: '_xl' },\n },\n brand: { display: 'flex', alignItems: 'center', gap: '_sm', flexShrink: 0, minWidth: 0 },\n // 宽屏时与侧栏同宽,结束边的竖线与侧栏的竖线接上\n brandRail: {\n alignSelf: { default: null, [breakpoints.lg]: 'stretch' },\n boxSizing: 'border-box',\n width: { default: null, [breakpoints.lg]: SIDEBAR_WIDTH },\n paddingInline: { default: null, [breakpoints.lg]: '_lg' },\n borderInlineEndWidth: { default: null, [breakpoints.lg]: '_xs' },\n borderInlineEndStyle: { default: null, [breakpoints.lg]: 'solid' },\n borderInlineEndColor: { default: null, [breakpoints.lg]: '_border' },\n },\n headerContent: { display: 'flex', alignItems: 'center', gap: '_md', flexGrow: 1, minWidth: 0 },\n body: { display: 'grid', flexGrow: 1, gridTemplateColumns: 'minmax(0, 1fr)' },\n withSidebar: {\n gridTemplateColumns: { default: null, [breakpoints.lg]: `${SIDEBAR_WIDTH} minmax(0, 1fr)` },\n },\n withAside: { gridTemplateColumns: { default: null, [breakpoints.xl]: 'minmax(0, 1fr) 14rem' } },\n // 一个属性上两个断点:窄的一档用 lgOnly,不和 xl 重叠(见 breakpoints 的说明)\n withBoth: {\n gridTemplateColumns: {\n default: null,\n [breakpoints.lgOnly]: `${SIDEBAR_WIDTH} minmax(0, 1fr)`,\n [breakpoints.xl]: `${SIDEBAR_WIDTH} minmax(0, 1fr) 14rem`,\n },\n },\n // 两侧栏:粘在顶栏下面、占满剩下的视口高度,内容多时各自滚动,滚到头不带动页面\n rail: {\n position: 'sticky',\n top: layoutVars.stickyOffset,\n boxSizing: 'border-box',\n height: `calc(100dvh - ${layoutVars.stickyOffset})`,\n },\n // 侧栏里的滚动区域:浮层滚动条,滚到头不带动页面;内边距放在内容层上,滚动条贴着侧栏边缘\n railScroll: { height: '_full' },\n railViewport: { overscrollBehavior: 'contain' },\n sidebar: {\n display: { default: 'none', [breakpoints.lg]: 'block' },\n borderInlineEndWidth: '_xs',\n borderInlineEndStyle: 'solid',\n borderInlineEndColor: '_border',\n },\n sidebarContent: { paddingBlock: '_xl', paddingInline: '_md' },\n // 紧凑的侧栏:两边只留一点,图标居中\n sidebarContentCompact: { paddingInline: '_xs' },\n aside: { display: { default: 'none', [breakpoints.xl]: 'block' } },\n asideContent: { paddingBlock: '_xl', paddingInline: '_lg' },\n // 正文由 SkipLink 聚焦(tabindex=-1):不显示焦点框\n main: { minWidth: 0, paddingBlock: '_xl', paddingInline: '_xl', outlineStyle: 'none' },\n // overlay:从顶栏下面弹出、盖在正文上(低于顶栏与顶层渲染的浮层);各方向的位置见 overlayStart 等,收起后不显示(inert,不能聚焦)。\n // 打开时 translate 是 none:否则抽屉会成为里面 fixed 元素的包含块(同 Drawer)\n overlay: {\n position: 'fixed',\n zIndex: 9,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n // 拖得很窄时内容裁在抽屉里,不溢出到正文上\n overflow: 'hidden',\n backgroundColor: '_surface',\n boxShadow: '_lg',\n // 收起:滑出去之后再隐藏(visibility 延迟到滑完)\n visibility: 'hidden',\n transition: `translate ${t.durations.md} ${t.easings.exit}, visibility 0s linear ${t.durations.md}`,\n },\n // 左右两侧:顶栏下面到窗口底部;位置用逻辑属性,translate 是物理方向,用 :dir() 区分\n overlayStart: {\n top: HEADER_HEIGHT,\n bottom: 0,\n insetInlineStart: 0,\n maxWidth: 'calc(100vw - 3rem)',\n borderInlineEndWidth: '_xs',\n borderInlineEndStyle: 'solid',\n borderInlineEndColor: '_border',\n translate: { default: '-100% 0', ':dir(rtl)': '100% 0' },\n },\n overlayEnd: {\n top: HEADER_HEIGHT,\n bottom: 0,\n insetInlineEnd: 0,\n maxWidth: 'calc(100vw - 3rem)',\n borderInlineStartWidth: '_xs',\n borderInlineStartStyle: 'solid',\n borderInlineStartColor: '_border',\n translate: { default: '100% 0', ':dir(rtl)': '-100% 0' },\n },\n // 上下两侧:盖满宽度,高度由 _sidebarHeight 定,最高留出一截正文\n overlayTop: {\n top: HEADER_HEIGHT,\n insetInlineStart: 0,\n insetInlineEnd: 0,\n maxHeight: `calc(100dvh - ${HEADER_HEIGHT} - 3rem)`,\n borderBlockEndWidth: '_xs',\n borderBlockEndStyle: 'solid',\n borderBlockEndColor: '_border',\n translate: '0 -100%',\n },\n overlayBottom: {\n bottom: 0,\n insetInlineStart: 0,\n insetInlineEnd: 0,\n maxHeight: `calc(100dvh - ${HEADER_HEIGHT} - 3rem)`,\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_border',\n translate: '0 100%',\n },\n // 打开:立刻可见,再滑进来\n overlayOpen: {\n visibility: 'visible',\n translate: 'none',\n transition: `translate ${t.durations.lg} ${t.easings.enter}, visibility 0s`,\n },\n overlayScroll: { flexGrow: 1, minHeight: 0 },\n // 上下抽屉:导航的小节排成多列(CSS 多栏,每个小节不被拆开,见 NavSection)\n sidebarContentColumns: { columnWidth: '14rem', columnGap: '_xl' },\n // overlay 时顶栏的品牌格:宽屏时按抽屉的初始宽度,“菜单”在它的结束边(只有抽屉在起始边时;其他方向品牌格不变)\n brandOverlay: {\n alignSelf: { default: null, [breakpoints.lg]: 'stretch' },\n justifyContent: 'space-between',\n boxSizing: 'border-box',\n paddingInlineStart: { default: null, [breakpoints.lg]: '_lg' },\n paddingInlineEnd: { default: null, [breakpoints.lg]: '_sm' },\n borderInlineEndWidth: { default: null, [breakpoints.lg]: '_xs' },\n borderInlineEndStyle: { default: null, [breakpoints.lg]: 'solid' },\n borderInlineEndColor: { default: null, [breakpoints.lg]: '_border' },\n },\n toggle: { flexShrink: 0 },\n // 侧栏收起成图标栏:栅格的第一列、品牌格都变窄,品牌只剩标志\n withSidebarCollapsed: {\n gridTemplateColumns: { default: null, [breakpoints.lg]: `${RAIL_WIDTH} minmax(0, 1fr)` },\n },\n withBothCollapsed: {\n gridTemplateColumns: {\n default: null,\n [breakpoints.lgOnly]: `${RAIL_WIDTH} minmax(0, 1fr)`,\n [breakpoints.xl]: `${RAIL_WIDTH} minmax(0, 1fr) 14rem`,\n },\n },\n brandRailCollapsed: {\n width: { default: null, [breakpoints.lg]: RAIL_WIDTH },\n justifyContent: { default: null, [breakpoints.lg]: 'center' },\n paddingInline: { default: null, [breakpoints.lg]: '_xs' },\n },\n // 有收起按钮的侧栏:滚动区域占满剩下的高度,按钮在最下面\n sidebarColumn: {\n display: { default: 'none', [breakpoints.lg]: 'flex' },\n flexDirection: 'column',\n },\n sidebarScroll: { flexGrow: 1, minHeight: 0, height: 'auto' },\n collapseBar: {\n display: 'flex',\n justifyContent: 'flex-end',\n flexShrink: 0,\n padding: '_sm',\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_borderMuted',\n },\n collapseBarCollapsed: { justifyContent: 'center' },\n // 顶栏的导航:占品牌与右边工具之间的位置;有导航时右边的工具按内容宽、靠结束边\n nav: { display: 'flex', alignItems: 'center', alignSelf: 'stretch', flexGrow: 1, minWidth: 0 },\n headerContentAfterNav: { flexGrow: 0, justifyContent: 'flex-end' },\n // 正文那一列:页签区、正文、页脚上下排,页脚在内容少时也贴着底部\n column: { display: 'flex', flexDirection: 'column', minWidth: 0 },\n mainGrow: { flexGrow: 1 },\n tabs: { paddingBlockStart: '_sm', paddingInline: '_xl' },\n footer: {\n paddingBlock: '_lg',\n paddingInline: '_xl',\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_borderMuted',\n color: '_textMuted',\n fontSize: '_sm',\n },\n});\n\n/** AppShell 的动态样式:抽屉的宽度与高度、宽屏时品牌格的宽度(px) */\nexport const appShellDynamicStyles = css.create({\n width: (px: number) => ({ width: px }),\n height: (px: number) => ({ height: px }),\n brandWidth: (px: number) => ({ width: { default: null, [breakpoints.lg]: px } }),\n});\n\n/** 应用外壳:粘性顶栏、左侧栏、正文、右侧栏;窄屏时左侧栏收进抽屉 */\nexport const AppShell = _component(\n ({\n brand,\n header,\n sidebar,\n aside,\n nav,\n tabs,\n footer,\n sidebarMode = 'docked',\n sidebarSide = 'start',\n layout,\n _sidebarOpen: sidebarOpen = _bindable(false),\n _sidebarWidth: sidebarWidth = _bindable(OVERLAY_WIDTH),\n _sidebarHeight: sidebarHeight = _bindable(OVERLAY_HEIGHT),\n sidebarCollapsible = false,\n _sidebarCollapsed: sidebarCollapsed = _bindable(false),\n skipLink = true,\n pageScrollbar = true,\n propsHeader,\n propsBrand,\n propsSidebar,\n propsMain,\n propsAside,\n propsMenuButton,\n propsSidebarToggle,\n propsResizeHandle,\n propsDrawer,\n propsHeaderContent,\n propsBody,\n propsSidebarScroll,\n propsAsideScroll,\n propsNav,\n propsTabs,\n propsFooter,\n propsCollapse,\n children,\n ...rest\n }: AppShellProps) => {\n const messages = useMessages('patterns', patternsMessages);\n const id = useId();\n const mainId = `${id}-main`;\n const sidebarId = `${id}-sidebar`;\n // 写了 layout 时各项从它读、写回它;没写时读、写自己的绑定\n const mode = () => (layout ? layout.mode : sidebarMode);\n const side = () => (layout ? layout.side : sidebarSide);\n const isOpen = () => (layout ? layout.open : sidebarOpen);\n const setOpen = (value: boolean) => {\n if (layout) layout.open = value;\n else sidebarOpen = value;\n };\n const widthOf = () => (layout ? layout.width : sidebarWidth);\n const setWidth = (px: number) => {\n if (layout) layout.width = px;\n else sidebarWidth = px;\n };\n const heightOf = () => (layout ? layout.height : sidebarHeight);\n const setHeight = (px: number) => {\n if (layout) layout.height = px;\n else sidebarHeight = px;\n };\n const isCollapsed = () => (layout ? layout.collapsed : sidebarCollapsed);\n const setCollapsed = (value: boolean) => {\n if (layout) layout.collapsed = value;\n else sidebarCollapsed = value;\n };\n\n const overlay = () => mode() === 'overlay';\n const docked = () => hasContent(sidebar) && !overlay();\n // 左右两侧的抽屉调宽度,上下两侧的调高度\n const lateral = () => side() === 'start' || side() === 'end';\n const wide = useMediaQuery(WIDE_QUERY);\n // docked 的侧栏收起成图标栏:只在宽屏(窄屏时侧栏在抽屉里,抽屉总是完整的)\n const collapsed = () => docked() && sidebarCollapsible && isCollapsed() && wide.value;\n const compact = () =>\n (overlay() && lateral() && widthOf() < OVERLAY_COMPACT_WIDTH) || collapsed();\n NavCompactContext.provide(compact);\n AppShellContext.provide({ collapsed });\n // docked:变宽后侧栏已经显示出来,抽屉没必要再开着\n watch(wide, (isWide) => {\n if (isWide && !overlay()) setOpen(false);\n });\n // 抽屉里点了链接(通常是换页):关闭抽屉;左右抽屉在宽屏时不关(挡不住正文的主要部分,常要连着换几页),上下抽屉盖住的多,总是关\n function closeOnNavigate(event: MouseEvent) {\n if (overlay() && lateral() && wide.value) return;\n if (event.target instanceof Element && event.target.closest('a[href]')) setOpen(false);\n }\n\n // overlay:品牌格按初始宽度,拖动抽屉时不变;双击手柄回到它\n // 记住的宽度是拖窄后的紧凑宽度时,品牌格与双击回到的宽度按默认宽度(品牌格太窄会和顶栏的内容叠在一起)\n const remembered = _untrack(widthOf());\n const initialWidth = remembered < OVERLAY_COMPACT_WIDTH ? OVERLAY_WIDTH : remembered;\n // Esc 收起:焦点在抽屉里,收起后它不能聚焦了,回到“菜单”\n let toggleButton = _state.raw<HTMLElement | null>(null);\n function onOverlayKeydown(event: KeyboardEvent) {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n event.preventDefault();\n setOpen(false);\n toggleButton?.focus();\n }\n\n // 抽屉在结束边时,“菜单”放在顶栏的结束边;其他方向在品牌格里\n const toggleAtEnd = () => overlay() && side() === 'end';\n const toggleIcon = () => {\n const open = isOpen();\n switch (side()) {\n case 'end':\n return open ? PanelRightClose : PanelRightOpen;\n case 'top':\n return open ? PanelTopClose : PanelTopOpen;\n case 'bottom':\n return open ? PanelBottomClose : PanelBottomOpen;\n default:\n return open ? PanelLeftClose : PanelLeftOpen;\n }\n };\n\n /** overlay 的“菜单”:开关抽屉,图标随开关和方向切换 */\n const sidebarToggle = () => (\n <Button\n {...mergePartProps<ButtonProps>(\n {\n variant: 'ghost',\n tone: 'neutral',\n size: 'sm',\n icon: toggleIcon(),\n sx: appShellStyles.toggle,\n },\n propsSidebarToggle,\n {\n ref: (element: unknown) => (toggleButton = toElement(element)),\n 'aria-expanded': isOpen(),\n 'aria-controls': sidebarId,\n onClick: () => setOpen(!isOpen()),\n },\n )}\n >\n {messages.navigationMenu}\n </Button>\n );\n\n return () => (\n <div {...mergeAttrs<'div'>({ sx: [appShellStyles.root, appShellOffset] }, rest)}>\n {skipLink && <SkipLink href={`#${mainId}`} />}\n {pageScrollbar && <PageScrollbar />}\n <header\n {...mergeAttrs<'header'>(\n {\n sx: [\n appShellStyles.header,\n hasContent(brand) && hasContent(sidebar) && appShellStyles.headerWithBrand,\n ],\n },\n propsHeader,\n )}\n >\n {hasContent(sidebar) && !overlay() && (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n sx: appShellStyles.menuButton,\n icon: MenuIcon,\n 'aria-label': messages.navigationOpen,\n },\n propsMenuButton,\n { 'aria-expanded': isOpen(), onClick: () => setOpen(true) },\n )}\n />\n )}\n {hasContent(brand) && (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.brand,\n hasContent(sidebar) &&\n (overlay()\n ? side() === 'start' && [\n appShellStyles.brandOverlay,\n appShellDynamicStyles.brandWidth(initialWidth),\n ]\n : [\n appShellStyles.brandRail,\n collapsed() && appShellStyles.brandRailCollapsed,\n ]),\n ],\n },\n propsBrand,\n )}\n >\n {brand}\n {hasContent(sidebar) && overlay() && !toggleAtEnd() && sidebarToggle()}\n </div>\n )}\n {!hasContent(brand) &&\n hasContent(sidebar) &&\n overlay() &&\n !toggleAtEnd() &&\n sidebarToggle()}\n {hasContent(nav) && (\n <div {...mergeAttrs<'div'>({ sx: appShellStyles.nav }, propsNav)}>{nav}</div>\n )}\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.headerContent,\n hasContent(nav) && appShellStyles.headerContentAfterNav,\n ],\n },\n propsHeaderContent,\n )}\n >\n {header}\n </div>\n {hasContent(sidebar) && toggleAtEnd() && sidebarToggle()}\n </header>\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.body,\n docked() && hasContent(aside)\n ? collapsed()\n ? appShellStyles.withBothCollapsed\n : appShellStyles.withBoth\n : docked()\n ? collapsed()\n ? appShellStyles.withSidebarCollapsed\n : appShellStyles.withSidebar\n : hasContent(aside) && appShellStyles.withAside,\n ],\n },\n propsBody,\n )}\n >\n {docked() && (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.rail,\n appShellStyles.sidebar,\n sidebarCollapsible && appShellStyles.sidebarColumn,\n ],\n },\n propsSidebar,\n )}\n >\n <ScrollArea\n {...mergePartProps<ScrollAreaProps>(\n {\n sx: [\n appShellStyles.railScroll,\n sidebarCollapsible && appShellStyles.sidebarScroll,\n ],\n propsViewport: { sx: appShellStyles.railViewport },\n propsContent: {\n sx: [\n appShellStyles.sidebarContent,\n collapsed() && appShellStyles.sidebarContentCompact,\n ],\n },\n },\n propsSidebarScroll,\n )}\n >\n {sidebar}\n </ScrollArea>\n {sidebarCollapsible && (\n <div\n {...css.attrs(\n appShellStyles.collapseBar,\n collapsed() && appShellStyles.collapseBarCollapsed,\n )}\n >\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: isCollapsed() ? PanelLeftOpen : PanelLeftClose,\n size: 'sm',\n variant: 'ghost',\n propsIcon: { flipInRtl: true },\n 'aria-label': isCollapsed()\n ? messages.sidebarExpand\n : messages.sidebarCollapse,\n },\n propsCollapse,\n { onClick: () => setCollapsed(!isCollapsed()) },\n )}\n />\n </div>\n )}\n </div>\n )}\n <div {...css.attrs(appShellStyles.column)}>\n {hasContent(tabs) && (\n <div {...mergeAttrs<'div'>({ sx: appShellStyles.tabs }, propsTabs)}>{tabs}</div>\n )}\n <main\n {...mergeAttrs<'main'>(\n { sx: [appShellStyles.main, appShellStyles.mainGrow] },\n propsMain,\n {\n id: mainId,\n tabindex: -1,\n },\n )}\n >\n {children}\n </main>\n {hasContent(footer) && (\n <footer {...mergeAttrs<'footer'>({ sx: appShellStyles.footer }, propsFooter)}>\n {footer}\n </footer>\n )}\n </div>\n {hasContent(aside) && (\n <aside\n {...mergeAttrs<'aside'>(\n { sx: [appShellStyles.rail, appShellStyles.aside] },\n propsAside,\n )}\n >\n <ScrollArea\n {...mergePartProps<ScrollAreaProps>(\n {\n sx: appShellStyles.railScroll,\n propsViewport: { sx: appShellStyles.railViewport },\n propsContent: { sx: appShellStyles.asideContent },\n },\n propsAsideScroll,\n )}\n >\n {aside}\n </ScrollArea>\n </aside>\n )}\n </div>\n {hasContent(sidebar) && overlay() && (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n appShellStyles.overlay,\n side() === 'start' && appShellStyles.overlayStart,\n side() === 'end' && appShellStyles.overlayEnd,\n side() === 'top' && appShellStyles.overlayTop,\n side() === 'bottom' && appShellStyles.overlayBottom,\n isOpen() && appShellStyles.overlayOpen,\n lateral()\n ? appShellDynamicStyles.width(widthOf())\n : appShellDynamicStyles.height(heightOf()),\n ],\n },\n propsSidebar,\n {\n id: sidebarId,\n inert: !isOpen(),\n onKeydown: onOverlayKeydown,\n onClick: closeOnNavigate,\n },\n )}\n >\n <ScrollArea\n {...mergePartProps<ScrollAreaProps>(\n {\n sx: appShellStyles.overlayScroll,\n propsViewport: { sx: appShellStyles.railViewport },\n propsContent: {\n sx: [\n appShellStyles.sidebarContent,\n compact() && appShellStyles.sidebarContentCompact,\n !lateral() && appShellStyles.sidebarContentColumns,\n ],\n },\n },\n propsSidebarScroll,\n )}\n >\n {sidebar}\n </ScrollArea>\n {lateral() ? (\n <ResizeHandle\n aria-label={messages.navigationResize}\n {...propsResizeHandle}\n edge={side() === 'end' ? 'start' : 'end'}\n width={widthOf()}\n minWidth={OVERLAY_MIN_WIDTH}\n maxWidth={OVERLAY_MAX_WIDTH}\n defaultWidth={initialWidth}\n onWidthChange={setWidth}\n />\n ) : (\n <ResizeHandle\n aria-label={messages.navigationResizeHeight}\n {...propsResizeHandle}\n orientation=\"horizontal\"\n edge={side() === 'top' ? 'end' : 'start'}\n width={heightOf()}\n minWidth={OVERLAY_MIN_HEIGHT}\n maxWidth={OVERLAY_MAX_HEIGHT}\n defaultWidth={OVERLAY_HEIGHT}\n onWidthChange={setHeight}\n />\n )}\n </div>\n )}\n {docked() && (\n <Drawer\n {...mergePartProps<DrawerProps>(\n { title: messages.navigation, side: 'start' },\n propsDrawer,\n {\n onClick: closeOnNavigate,\n },\n )}\n _open={isOpen()}\n onUpdate:_open={setOpen}\n >\n {sidebar}\n </Drawer>\n )}\n </div>\n );\n },\n);\n\n/** 未声明的属性落到链接(a)上 */\nexport interface AppShellBrandProps extends PartProps<'a', 'href'> {\n /** 点了去哪儿,一般是首页 */\n href: string;\n /** 标志的图标(品牌色) */\n icon?: IconData;\n /** 标志的图片等,写了时不画 icon */\n logo?: VNodeChild;\n /** 图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n /** 产品名 */\n children?: VNodeChild;\n}\n\n/** AppShellBrand 的样式:root、mark */\nexport const appShellBrandStyles = css.create({\n root: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '_sm',\n flexShrink: 0,\n color: '_text',\n textDecoration: 'none',\n fontWeight: '_semibold',\n fontSize: '_lg',\n borderRadius: '_sm',\n },\n mark: { color: '_accentText' },\n});\n\n/**\n * 外壳顶栏的品牌:品牌色的标志(装饰,对读屏隐藏)与产品名,名字就是链接的名称,点了回首页(走路由适配)。\n * 放在 AppShell 的 brand 里\n */\nexport const AppShellBrand = _component(\n ({ href, icon, logo, propsIcon, children, ...rest }: AppShellBrandProps) => {\n const router = useRouterLink();\n const shell = AppShellContext.inject(null);\n return () => (\n <a\n {...mergeAttrs<'a'>({ sx: [appShellBrandStyles.root, focusRingStyles.visible] }, rest, {\n href: router.href(href),\n onClick: (event: MouseEvent) => router.onClick(event, href),\n })}\n >\n {logo ??\n (icon && (\n <Icon\n {...mergePartProps<IconProps>({ icon, sx: appShellBrandStyles.mark }, propsIcon)}\n />\n ))}\n {/* 侧栏收起成图标栏时品牌格只放得下标志:产品名留给读屏(仍是链接的名称) */}\n <span {...css.attrs(shell?.collapsed() && visuallyHiddenStyles.hidden)}>{children}</span>\n </a>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EA,IAAM,gBAAgB;;AAEtB,IAAM,gBAAgB;;AAEtB,IAAM,aAAa;;AAEnB,IAAM,gBAAgB;AAEtB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAE1B,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAE3B,IAAM,wBAAwB;AAE9B,IAAM,aAAa,YAAY,GAAG,QAAQ,WAAW,EAAE;;;;;;AA6GvD,IAAa,kBAAkB,cAAoC,UAAU;;AAG7E,IAAa,iBAAiB,IAAI,YAAY,YAAY,EAAE,cAAc,cAAc,CAAC;;AAGzF,IAAa,iBAAiB,IAAI,OAAO;CAEvC,MAAM;EACJ,SAAS;EACT,eAAe;EACf,WAAW;EACX,OAAO;EACP,UAAU;EACV,YAAY;CACd;CACA,QAAQ;EACN,UAAU;EACV,KAAK;EAEL,QAAQ;EACR,WAAW;EACX,SAAS;EACT,YAAY;EACZ,KAAK;EACL,QAAQ;EACR,YAAY;EACZ,eAAe;EACf,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,iBAAiB;EACjB,gBAAgB;CAClB;CACA,YAAY;EAAE,SAAS;GAAE,SAAS;IAAgB,YAAY,KAAK;EAAO;EAAG,YAAY;CAAE;CAE3F,iBAAiB;EACf,oBAAoB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAE;EACzD,WAAW;GAAE,SAAS;IAAO,YAAY,KAAK;EAAM;CACtD;CACA,OAAO;EAAE,SAAS;EAAQ,YAAY;EAAU,KAAK;EAAO,YAAY;EAAG,UAAU;CAAE;CAEvF,WAAW;EACT,WAAW;GAAE,SAAS;IAAO,YAAY,KAAK;EAAU;EACxD,WAAW;EACX,OAAO;GAAE,SAAS;IAAO,YAAY,KAAK;EAAc;EACxD,eAAe;GAAE,SAAS;IAAO,YAAY,KAAK;EAAM;EACxD,sBAAsB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAM;EAC/D,sBAAsB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAQ;EACjE,sBAAsB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAU;CACrE;CACA,eAAe;EAAE,SAAS;EAAQ,YAAY;EAAU,KAAK;EAAO,UAAU;EAAG,UAAU;CAAE;CAC7F,MAAM;EAAE,SAAS;EAAQ,UAAU;EAAG,qBAAqB;CAAiB;CAC5E,aAAa,EACX,qBAAqB;EAAE,SAAS;GAAO,YAAY,KAAK,GAAG,cAAa;CAAkB,EAC5F;CACA,WAAW,EAAE,qBAAqB;EAAE,SAAS;GAAO,YAAY,KAAK;CAAuB,EAAE;CAE9F,UAAU,EACR,qBAAqB;EACnB,SAAS;GACR,YAAY,SAAS,GAAG,cAAa;GACrC,YAAY,KAAK,GAAG,cAAa;CACpC,EACF;CAEA,MAAM;EACJ,UAAU;EACV,KAAK,WAAW;EAChB,WAAW;EACX,QAAQ,iBAAiB,WAAW,aAAY;CAClD;CAEA,YAAY,EAAE,QAAQ,QAAQ;CAC9B,cAAc,EAAE,oBAAoB,UAAU;CAC9C,SAAS;EACP,SAAS;GAAE,SAAS;IAAS,YAAY,KAAK;EAAQ;EACtD,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;CACxB;CACA,gBAAgB;EAAE,cAAc;EAAO,eAAe;CAAM;CAE5D,uBAAuB,EAAE,eAAe,MAAM;CAC9C,OAAO,EAAE,SAAS;EAAE,SAAS;GAAS,YAAY,KAAK;CAAQ,EAAE;CACjE,cAAc;EAAE,cAAc;EAAO,eAAe;CAAM;CAE1D,MAAM;EAAE,UAAU;EAAG,cAAc;EAAO,eAAe;EAAO,cAAc;CAAO;CAGrF,SAAS;EACP,UAAU;EACV,QAAQ;EACR,WAAW;EACX,SAAS;EACT,eAAe;EAEf,UAAU;EACV,iBAAiB;EACjB,WAAW;EAEX,YAAY;EACZ,YAAY,aAAa,EAAE,UAAU,GAAE,GAAI,EAAE,QAAQ,KAAI,yBAA0B,EAAE,UAAU;CACjG;CAEA,cAAc;EACZ,KAAK;EACL,QAAQ;EACR,kBAAkB;EAClB,UAAU;EACV,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,WAAW;GAAE,SAAS;GAAW,aAAa;EAAS;CACzD;CACA,YAAY;EACV,KAAK;EACL,QAAQ;EACR,gBAAgB;EAChB,UAAU;EACV,wBAAwB;EACxB,wBAAwB;EACxB,wBAAwB;EACxB,WAAW;GAAE,SAAS;GAAU,aAAa;EAAU;CACzD;CAEA,YAAY;EACV,KAAK;EACL,kBAAkB;EAClB,gBAAgB;EAChB,WAAW,iBAAiB,cAAa;EACzC,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,WAAW;CACb;CACA,eAAe;EACb,QAAQ;EACR,kBAAkB;EAClB,gBAAgB;EAChB,WAAW,iBAAiB,cAAa;EACzC,uBAAuB;EACvB,uBAAuB;EACvB,uBAAuB;EACvB,WAAW;CACb;CAEA,aAAa;EACX,YAAY;EACZ,WAAW;EACX,YAAY,aAAa,EAAE,UAAU,GAAE,GAAI,EAAE,QAAQ,MAAK;CAC5D;CACA,eAAe;EAAE,UAAU;EAAG,WAAW;CAAE;CAE3C,uBAAuB;EAAE,aAAa;EAAS,WAAW;CAAM;CAEhE,cAAc;EACZ,WAAW;GAAE,SAAS;IAAO,YAAY,KAAK;EAAU;EACxD,gBAAgB;EAChB,WAAW;EACX,oBAAoB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAM;EAC7D,kBAAkB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAM;EAC3D,sBAAsB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAM;EAC/D,sBAAsB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAQ;EACjE,sBAAsB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAU;CACrE;CACA,QAAQ,EAAE,YAAY,EAAE;CAExB,sBAAsB,EACpB,qBAAqB;EAAE,SAAS;GAAO,YAAY,KAAK,GAAG,WAAU;CAAkB,EACzF;CACA,mBAAmB,EACjB,qBAAqB;EACnB,SAAS;GACR,YAAY,SAAS,GAAG,WAAU;GAClC,YAAY,KAAK,GAAG,WAAU;CACjC,EACF;CACA,oBAAoB;EAClB,OAAO;GAAE,SAAS;IAAO,YAAY,KAAK;EAAW;EACrD,gBAAgB;GAAE,SAAS;IAAO,YAAY,KAAK;EAAS;EAC5D,eAAe;GAAE,SAAS;IAAO,YAAY,KAAK;EAAM;CAC1D;CAEA,eAAe;EACb,SAAS;GAAE,SAAS;IAAS,YAAY,KAAK;EAAO;EACrD,eAAe;CACjB;CACA,eAAe;EAAE,UAAU;EAAG,WAAW;EAAG,QAAQ;CAAO;CAC3D,aAAa;EACX,SAAS;EACT,gBAAgB;EAChB,YAAY;EACZ,SAAS;EACT,uBAAuB;EACvB,uBAAuB;EACvB,uBAAuB;CACzB;CACA,sBAAsB,EAAE,gBAAgB,SAAS;CAEjD,KAAK;EAAE,SAAS;EAAQ,YAAY;EAAU,WAAW;EAAW,UAAU;EAAG,UAAU;CAAE;CAC7F,uBAAuB;EAAE,UAAU;EAAG,gBAAgB;CAAW;CAEjE,QAAQ;EAAE,SAAS;EAAQ,eAAe;EAAU,UAAU;CAAE;CAChE,UAAU,EAAE,UAAU,EAAE;CACxB,MAAM;EAAE,mBAAmB;EAAO,eAAe;CAAM;CACvD,QAAQ;EACN,cAAc;EACd,eAAe;EACf,uBAAuB;EACvB,uBAAuB;EACvB,uBAAuB;EACvB,OAAO;EACP,UAAU;CACZ;AACF,CAAC;;AAGD,IAAa,wBAAwB,IAAI,OAAO;CAC9C,QAAQ,QAAgB,EAAE,OAAO,GAAG;CACpC,SAAS,QAAgB,EAAE,QAAQ,GAAG;CACtC,aAAa,QAAgB,EAAE,OAAO;EAAE,SAAS;GAAO,YAAY,KAAK;CAAG,EAAE;AAChF,CAAC;;AAGD,IAAa,WAAW,0BACtB,QAAA,SAqCqB;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,UAAAA,aAAA,QAAA,SAAA;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,MAAAA,aAAA,QAAA,KAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,eA7BL,QAAQ;CAAA,MAAA,cAAAA,aAAA,QAAA,eACR,OAAO;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,cAAAC,SAAA,QAAA,sBAEiB,OAAK,KAAA,IAAA;CAAA,MAAA,eAAAA,SAAA,QAAA,uBACH,eAAa,KAAA,IAAA;CAAA,MAAA,gBAAAA,SAAA,QAAA,wBACX,gBAAc,KAAA,IAAA;CAAA,MAAA,qBAAAD,aAAA,QAAA,sBACnC,KAAK;CAAA,MAAA,mBAAAC,SAAA,QAAA,2BACsB,OAAK,KAAA,IAAA;CAAA,MAAA,WAAAD,aAAA,QAAA,YAC1C,IAAI;CAAA,MAAA,gBAAAA,aAAA,QAAA,iBACC,IAAI;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,kBAAAA,aAAA,QAAA,iBAAA;CAAA,MAAA,qBAAAA,aAAA,QAAA,oBAAA;CAAA,MAAA,oBAAAA,aAAA,QAAA,mBAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,qBAAAA,aAAA,QAAA,oBAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,qBAAAA,aAAA,QAAA,oBAAA;CAAA,MAAA,mBAAAA,aAAA,QAAA,kBAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,gBAAAA,aAAA,QAAA,eAAA;CAAA,MAAA,WAAAE,aAAA,MAAA;CAAA,MAmBjB,OAAIC,UAAA,QAAA,MAAA,KAAA;CAEP,MAAM,WAAW,YAAY,YAAY,gBAAgB;CACzD,MAAM,KAAK,MAAM;CACjB,MAAM,SAAS,GAAG,GAAE;CACpB,MAAM,YAAY,GAAG,GAAE;CAEvB,MAAM,aAAc,OAAA,QAAS,OAAA,MAAO,OAAI,YAAA;CACxC,MAAM,aAAc,OAAA,QAAS,OAAA,MAAO,OAAI,YAAA;CACxC,MAAM,eAAgB,OAAA,QAAS,OAAA,MAAO,OAAI,YAAA;CAC1C,MAAM,WAAW,UAAmB;EAClC,IAAA,OAAA,OAAY,OAAA,MAAO,OAAO;OACrB,YAAA,QAAc;CACrB;CACA,MAAM,gBAAiB,OAAA,QAAS,OAAA,MAAO,QAAK,aAAA;CAC5C,MAAM,YAAY,OAAe;EAC/B,IAAA,OAAA,OAAY,OAAA,MAAO,QAAQ;OACtB,aAAA,QAAe;CACtB;CACA,MAAM,iBAAkB,OAAA,QAAS,OAAA,MAAO,SAAM,cAAA;CAC9C,MAAM,aAAa,OAAe;EAChC,IAAA,OAAA,OAAY,OAAA,MAAO,SAAS;OACvB,cAAA,QAAgB;CACvB;CACA,MAAM,oBAAqB,OAAA,QAAS,OAAA,MAAO,YAAS,iBAAA;CACpD,MAAM,gBAAgB,UAAmB;EACvC,IAAA,OAAA,OAAY,OAAA,MAAO,YAAY;OAC1B,iBAAA,QAAmB;CAC1B;CAEA,MAAM,gBAAgB,KAAK,MAAM;CACjC,MAAM,eAAe,WAAU,QAAA,KAAQ,KAAK,CAAC,QAAQ;CAErD,MAAM,gBAAgB,KAAK,MAAM,WAAW,KAAK,MAAM;CACvD,MAAM,OAAO,cAAc,UAAU;CAErC,MAAM,kBAAkB,OAAO,KAAC,mBAAA,SAA0B,YAAY,KAAK,KAAK;CAChF,MAAM,gBACH,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,yBAA0B,UAAU;CAC7E,kBAAkB,QAAQ,OAAO;CACjC,gBAAgB,QAAQ,EAAE,UAAU,CAAC;CAErC,MAAM,OAAO,WAAW;EACtB,IAAI,UAAU,CAAC,QAAQ,GAAG,QAAQ,KAAK;CACzC,CAAC;CAED,SAAS,gBAAgB,OAAmB;EAC1C,IAAI,QAAQ,KAAK,QAAQ,KAAK,KAAK,OAAO;EAC1C,IAAI,MAAM,kBAAkB,WAAW,MAAM,OAAO,QAAQ,SAAS,GAAG,QAAQ,KAAK;CACvF;CAIA,MAAM,aAAUC,cAAY,QAAQ,CAAC;CACrC,MAAM,eAAe,aAAa,wBAAwB,gBAAgB;CAE1E,IAAI,eAAYC,WAAkC,IAAI;CACtD,SAAS,iBAAiB,OAAsB;EAC9C,IAAI,MAAM,QAAQ,YAAY,MAAM,kBAAkB;EACtD,MAAM,eAAe;EACrB,QAAQ,KAAK;EACb,aAAA,OAAc,MAAM;CACtB;CAGA,MAAM,oBAAoB,QAAQ,KAAK,KAAK,MAAM;CAClD,MAAM,mBAAmB;EACvB,MAAM,OAAO,OAAO;EACpB,QAAQ,KAAK,GAAb;GACE,KAAK,OACH,OAAO,OAAO,kBAAkB;GAClC,KAAK,OACH,OAAO,OAAO,gBAAgB;GAChC,KAAK,UACH,OAAO,OAAO,mBAAmB;GACnC,SACE,OAAO,OAAO,iBAAiB;EACnC;CACF;;CAGA,MAAM,sBAAgBC,YAAA,QAAAC,cAEd,eACF;EACE,SAAS;EACT,MAAM;EACN,MAAM;EACN,MAAM,WAAW;EACjB,IAAI,eAAe;CACrB,GAAC,mBAAA,OAED;EACE,MAAM,YAAsB,aAAA,QAAe,UAAU,OAAO;EAC5D,iBAAiB,OAAO;EACxB,iBAAiB;EACjB,eAAe,QAAQ,CAAC,OAAO,CAAC;CAClC,CACF,GAAC,EAAA,OAAA,UAAA,CAAA,GAAA;EAAA,eAAA,CAEA,SAAS,cAAc;EAAA,SAAA;CAAA,CAAA;CAI5B,aAAOD,YAAA,OACI,WAAkB,EAAE,IAAI,CAAC,eAAe,MAAM,cAAc,EAAE,GAAG,IAAI,GAAC;EAC5E,SAAA,SAAAA,YAAA,UAAA,EAAA,QAA4B,IAAI,SAAQ,GAAA,IAAA;EACxC,cAAA,SAAAA,YAAA,eAAA,MAAA,IAAA;EAAkCA,YAAA,UAE7B,WACF,EACE,IAAI,CACF,eAAe,QACf,WAAU,MAAA,KAAM,KAAK,WAAU,QAAA,KAAQ,KAAK,eAAe,eAAe,EAE9E,GAAC,YAAA,KAEH,GAAC;GAEA,WAAU,QAAA,KAAQ,KAAK,CAAC,QAAQ,KAACA,YAAA,YAE1B,eACF;IACE,IAAI,eAAe;IACnB,MAAME;IACN,cAAc,SAAS;GACzB,GAAC,gBAAA,OAED;IAAE,iBAAiB,OAAO;IAAG,eAAe,QAAQ,IAAI;GAAE,CAC5D,GAAC,IAAA;GAGJ,WAAU,MAAA,KAAM,KAACF,YAAA,OAEV,WACF,EACE,IAAI,CACF,eAAe,OACf,WAAU,QAAA,KAAQ,MACf,QAAQ,IACL,KAAK,MAAM,WAAW,CACpB,eAAe,cAAY,IAAA,KAC3B,sBAAsB,kBAAU,CAAC,YAAY,GAAA,IAAA,CAAA,IAE/C,CACE,eAAe,WACf,UAAU,KAAK,eAAe,kBAAkB,EAChD,EAEZ,GAAC,WAAA,KAEH,GAAC,CAAA,MAAA,OAGA,WAAU,QAAA,KAAQ,KAAK,QAAQ,KAAK,CAAC,YAAY,KAAK,cAAc,CAAC,CAAA;GAGzE,CAAC,WAAU,MAAA,KAAM,KAChB,WAAU,QAAA,KAAQ,KAClB,QAAQ,KACR,CAAC,YAAY,KACb,cAAc;GACf,WAAU,IAAA,KAAI,KAACA,YAAA,OACL,WAAkB,EAAE,IAAI,eAAe,IAAI,GAAC,SAAA,KAAU,GAAC,CAAA,IAAA,KAAA,CAAA;GACjEA,YAAA,OAEK,WACF,EACE,IAAI,CACF,eAAe,eACf,WAAU,IAAA,KAAI,KAAK,eAAe,qBAAqB,EAE3D,GAAC,mBAAA,KAEH,GAAC,CAAA,OAAA,KAAA,CAAA;GAIF,WAAU,QAAA,KAAQ,KAAK,YAAY,KAAK,cAAc;EAAC,CAAA;EAAAA,YAAA,OAGpD,WACF,EACE,IAAI,CACF,eAAe,MACf,OAAO,KAAK,WAAU,MAAA,KAAM,IACxB,UAAU,IACR,eAAe,oBACf,eAAe,WACjB,OAAO,IACL,UAAU,IACR,eAAe,uBACf,eAAe,cACjB,WAAU,MAAA,KAAM,KAAK,eAAe,SAAS,EAEvD,GAAC,UAAA,KAEH,GAAC;GAEA,OAAO,KAACA,YAAA,OAED,WACF,EACE,IAAI;IACF,eAAe;IACf,eAAe;IACf,mBAAA,SAAsB,eAAe;GAAa,EAEtD,GAAC,aAAA,KAEH,GAAC,CAAAA,YAAA,YAAAC,cAGK,eACF;IACE,IAAI,CACF,eAAe,YACf,mBAAA,SAAsB,eAAe,aAAa;IAEpD,eAAe,EAAE,IAAI,eAAe,aAAa;IACjD,cAAc,EACZ,IAAI,CACF,eAAe,gBAAc,IAAA,aAC7B,UAAU,KAAK,eAAe,uBAAqB,IAAA,CAAA,EAEvD;GACF,GAAC,mBAAA,KAEH,GAAC,EAAA,OAAA,UAAA,CAAA,GAAA;IAAA,eAAA,CAAAE,MAAA,OAAA,CAAA;IAAA,SAAA;GAAA,CAAA,GAIF,mBAAA,SAAAH,YAAA,OAEO,IAAI,MACN,eAAe,aAAW,IAAA,aAC1B,UAAU,KAAK,eAAe,sBAAoB,IAAA,CACpD,GAAC,CAAAA,YAAA,YAGK,eACF;IACE,MAAM,YAAY,IAAI,gBAAgB;IACtC,MAAM;IACN,SAAS;IACT,WAAW,EAAE,WAAW,KAAK;IAC7B,cAAc,YAAY,IACtB,SAAS,gBACT,SAAS;GACf,GAAC,cAAA,OAED,EAAE,eAAe,aAAa,CAAC,YAAY,CAAC,EAAE,CAChD,GAAC,IAAA,CAAA,CAAA,CAGN,CAAA;GAEJA,YAAA,OACQ,IAAI,MAAM,eAAe,MAAM,GAAC;IACtC,WAAU,KAAA,KAAK,KAACA,YAAA,OACN,WAAkB,EAAE,IAAI,eAAe,KAAK,GAAC,UAAA,KAAW,GAAC,CAAA,KAAA,KAAA,CAAA;IACnEA,YAAA,QAEK,WACF,EAAE,IAAI,CAAC,eAAe,MAAM,eAAe,QAAQ,EAAE,GAAC,UAAA,OAEtD;KACE,IAAI;KACJ,UAAU;IACZ,CACF,GAAC,CAAA,SAAA,KAAA,CAAA;IAIF,WAAU,OAAA,KAAO,KAACA,YAAA,UACL,WAAqB,EAAE,IAAI,eAAe,OAAO,GAAC,YAAA,KAAa,GAAC,CAAA,OAAA,KAAA,CAAA;GAG7E,CAAA;GAEF,WAAU,MAAA,KAAM,KAACA,YAAA,SAEV,WACF,EAAE,IAAI,CAAC,eAAe,MAAM,eAAe,KAAK,EAAE,GAAC,WAAA,KAErD,GAAC,CAAAA,YAAA,YAAAC,cAGK,eACF;IACE,IAAI,eAAe;IACnB,eAAe,EAAE,IAAI,eAAe,aAAa;IACjD,cAAc,EAAE,IAAI,eAAe,aAAa;GAClD,GAAC,iBAAA,KAEH,GAAC,EAAA,OAAA,UAAA,CAAA,GAAA;IAAA,eAAA,CAAAE,MAAA,KAAA,CAAA;IAAA,SAAA;GAAA,CAAA,CAAA,CAAA;EAKN,CAAA;EAEF,WAAU,QAAA,KAAQ,KAAK,QAAQ,KAACH,YAAA,OAEzB,WACF,EACE,IAAI;GACF,eAAe;GACf,KAAK,MAAM,WAAW,eAAe;GACrC,KAAK,MAAM,SAAS,eAAe;GACnC,KAAK,MAAM,SAAS,eAAe;GACnC,KAAK,MAAM,YAAY,eAAe;GACtC,OAAO,KAAK,eAAe;GAC3B,QAAQ,IAAC,IAAA,KACL,sBAAsB,aAAK,CAAC,QAAQ,CAAC,GAAA,IAAA,IAAA,IAAA,KACrC,sBAAsB,cAAM,CAAC,SAAS,CAAC,GAAA,IAAA;EAAC,EAEhD,GAAC,aAAA,OAED;GACE,IAAI;GACJ,OAAO,CAAC,OAAO;GACf,WAAW;GACX,SAAS;EACX,CACF,GAAC,CAAAA,YAAA,YAAAC,cAGK,eACF;GACE,IAAI,eAAe;GACnB,eAAe,EAAE,IAAI,eAAe,aAAa;GACjD,cAAc,EACZ,IAAI;IACF,eAAe;IAAc,IAAA,aAC7B,QAAQ,KAAK,eAAe,uBAAqB,IAAA;IACjD,CAAC,QAAQ,KAAK,eAAe;GAAqB,EAEtD;EACF,GAAC,mBAAA,KAEH,GAAC,EAAA,OAAA,UAAA,CAAA,GAAA;GAAA,eAAA,CAAAE,MAAA,OAAA,CAAA;GAAA,SAAA;EAAA,CAAA,GAIF,QAAQ,IAACH,YAAA,cAAAC,cAAA,EAAA,cAEM,SAAS,iBAAgB,GAAA,kBAAA,OAAA;GAAA,QAE/B,KAAK,MAAM,QAAQ,UAAU;GAAK,SACjC,QAAQ;GAAC,YACN;GAAiB,YACjB;GAAiB,gBACb;GAAY,iBACX;EAAQ,CAAA,GAAA,IAAA,IAAAD,YAAA,cAAAC,cAAA,EAAA,cAIX,SAAS,uBAAsB,GAAA,kBAAA,OAAA;GAAA,eAAA;GAAA,QAGrC,KAAK,MAAM,QAAQ,QAAQ;GAAO,SACjC,SAAS;GAAC,YACP;GAAkB,YAClB;GAAkB,gBACd;GAAc,iBACb;EAAS,CAAA,GAAA,IAAA,CAE3B,CAAA;EAGJ,OAAO,KAACD,YAAA,QAAAC,cAED,eACF;GAAE,OAAO,SAAS;GAAY,MAAM;EAAQ,GAAC,YAAA,OAE7C,EACE,SAAS,gBACX,CACF,GAAC;GAAA,SACM,OAAO;GAAC,kBACC;GAAO,OAAA;EAAA,CAAA,GAAA;GAAA,eAAA,CAAAE,MAAA,OAAA,CAAA;GAAA,SAAA;EAAA,CAAA;CAI1B,CAAA;AAGP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH;;;AAiBA,IAAa,sBAAsB,IAAI,OAAO;CAC5C,MAAM;EACJ,SAAS;EACT,YAAY;EACZ,KAAK;EACL,YAAY;EACZ,OAAO;EACP,gBAAgB;EAChB,YAAY;EACZ,UAAU;EACV,cAAc;CAChB;CACA,MAAM,EAAE,OAAO,cAAc;AAC/B,CAAC;;;;;AAMD,IAAa,gBAAgB,0BAC3B,SAAA,UAA4E;CAAA,MAAA,OAAAT,aAAA,SAAA,MAAA;CAAA,MAAA,OAAAA,aAAA,SAAA,MAAA;CAAA,MAAA,OAAAA,aAAA,SAAA,MAAA;CAAA,MAAA,YAAAA,aAAA,SAAA,WAAA;CAAA,MAAA,WAAAE,aAAA,OAAA;CAAA,MAA/B,OAAIC,UAAA,SAAA,OAAA,KAAA;CAC/C,MAAM,SAAS,cAAc;CAC7B,MAAM,QAAQ,gBAAgB,OAAO,IAAI;CACzC,aAAOG,YAAA,KAEC,WAAgB,EAAE,IAAI,CAAC,oBAAoB,MAAM,gBAAgB,OAAO,EAAE,GAAG,MAAM;EACrF,MAAM,OAAO,KAAI,KAAA,KAAK;EACtB,UAAU,UAAsB,OAAO,QAAQ,OAAK,KAAA,KAAM;CAC5D,CAAC,GAAC,CAED,KAAA,UACE,KAAA,SAAAA,YAAA,MAEO,eAA0B;EAAE,MAAI,KAAA;EAAE,IAAI,oBAAoB;CAAK,GAAC,UAAA,KAAW,GAAC,IAAA,IAElFA,YAAA,QAEM,IAAI,MAAM,OAAO,UAAU,KAAK,qBAAqB,MAAM,GAAC,CAAA,SAAA,KAAA,CAAA,CAAA,CAAA;AAG5E,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}