@chenzy-design/svelte 0.2.1 → 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 (241) hide show
  1. package/dist/anchor/Anchor.svelte +1 -1
  2. package/dist/anchor/meta.d.ts +1 -1
  3. package/dist/anchor/meta.js +1 -1
  4. package/dist/autocomplete/AutoComplete.svelte +10 -10
  5. package/dist/avatar/Avatar.svelte +12 -7
  6. package/dist/avatar/AvatarGroup.svelte +2 -2
  7. package/dist/avatar/context.d.ts +1 -1
  8. package/dist/avatar/context.d.ts.map +1 -1
  9. package/dist/avatar/meta.d.ts +2 -2
  10. package/dist/avatar/meta.d.ts.map +1 -1
  11. package/dist/avatar/meta.js +3 -1
  12. package/dist/badge/Badge.svelte +5 -5
  13. package/dist/banner/Banner.svelte +1 -1
  14. package/dist/breadcrumb/Breadcrumb.svelte +9 -8
  15. package/dist/breadcrumb/meta.d.ts +1 -1
  16. package/dist/breadcrumb/meta.js +1 -1
  17. package/dist/button/Button.svelte +289 -55
  18. package/dist/button/Button.svelte.d.ts +20 -4
  19. package/dist/button/Button.svelte.d.ts.map +1 -1
  20. package/dist/button/ButtonGroup.svelte +107 -0
  21. package/dist/button/ButtonGroup.svelte.d.ts +21 -0
  22. package/dist/button/ButtonGroup.svelte.d.ts.map +1 -0
  23. package/dist/button/SplitButtonGroup.svelte +127 -0
  24. package/dist/button/SplitButtonGroup.svelte.d.ts +35 -0
  25. package/dist/button/SplitButtonGroup.svelte.d.ts.map +1 -0
  26. package/dist/button/context.d.ts +14 -0
  27. package/dist/button/context.d.ts.map +1 -0
  28. package/dist/button/context.js +14 -0
  29. package/dist/button/index.d.ts +3 -0
  30. package/dist/button/index.d.ts.map +1 -1
  31. package/dist/button/index.js +3 -0
  32. package/dist/button/meta.d.ts +173 -4
  33. package/dist/button/meta.d.ts.map +1 -1
  34. package/dist/button/meta.js +58 -9
  35. package/dist/calendar/Calendar.svelte +16 -16
  36. package/dist/card/Card.svelte +10 -10
  37. package/dist/card/Card.svelte.d.ts +1 -1
  38. package/dist/card/Card.svelte.d.ts.map +1 -1
  39. package/dist/card/CardMeta.svelte +6 -6
  40. package/dist/card/CardMeta.svelte.d.ts +1 -1
  41. package/dist/card/CardMeta.svelte.d.ts.map +1 -1
  42. package/dist/card/index.d.ts +8 -0
  43. package/dist/card/index.d.ts.map +1 -0
  44. package/dist/card/meta.d.ts +1 -1
  45. package/dist/card/meta.d.ts.map +1 -1
  46. package/dist/card/meta.js +4 -0
  47. package/dist/carousel/Carousel.svelte +14 -14
  48. package/dist/carousel/meta.d.ts +1 -1
  49. package/dist/carousel/meta.js +2 -2
  50. package/dist/cascader/Cascader.svelte +18 -10
  51. package/dist/checkbox/Checkbox.svelte +19 -5
  52. package/dist/checkbox/Checkbox.svelte.d.ts +3 -0
  53. package/dist/checkbox/Checkbox.svelte.d.ts.map +1 -1
  54. package/dist/checkbox/CheckboxGroup.svelte +1 -1
  55. package/dist/checkbox/meta.d.ts +15 -0
  56. package/dist/checkbox/meta.d.ts.map +1 -1
  57. package/dist/checkbox/meta.js +3 -0
  58. package/dist/collapse/Collapse.svelte +6 -2
  59. package/dist/collapse/meta.d.ts +1 -1
  60. package/dist/collapse/meta.js +2 -2
  61. package/dist/color-picker/ColorPicker.svelte +69 -33
  62. package/dist/color-picker/ColorPicker.svelte.d.ts +13 -0
  63. package/dist/color-picker/ColorPicker.svelte.d.ts.map +1 -1
  64. package/dist/color-picker/meta.d.ts +30 -0
  65. package/dist/color-picker/meta.d.ts.map +1 -1
  66. package/dist/color-picker/meta.js +6 -0
  67. package/dist/components.d.ts +25 -9
  68. package/dist/components.json +986 -76
  69. package/dist/date-picker/DatePicker.svelte +43 -42
  70. package/dist/date-picker/RangePicker.svelte +10 -10
  71. package/dist/descriptions/Descriptions.svelte +7 -3
  72. package/dist/divider/Divider.svelte +1 -1
  73. package/dist/drawer/Drawer.svelte +1 -1
  74. package/dist/dropdown/Dropdown.svelte +6 -5
  75. package/dist/dropdown/DropdownDivider.svelte +1 -1
  76. package/dist/dropdown/DropdownItem.svelte +1 -1
  77. package/dist/dropdown/DropdownItemNode.svelte +4 -4
  78. package/dist/dropdown/DropdownSubMenu.svelte +2 -2
  79. package/dist/dropdown/DropdownTitle.svelte +1 -1
  80. package/dist/dropdown/meta.d.ts +1 -1
  81. package/dist/dropdown/meta.js +1 -1
  82. package/dist/empty/Empty.svelte +1 -0
  83. package/dist/form/Field.svelte +14 -14
  84. package/dist/form/Form.svelte +2 -2
  85. package/dist/form/FormCascader.svelte +6 -6
  86. package/dist/form/FormCheckbox.svelte +6 -6
  87. package/dist/form/FormDatePicker.svelte +5 -5
  88. package/dist/form/FormLabel.svelte +2 -2
  89. package/dist/form/FormRadio.svelte +5 -5
  90. package/dist/form/FormRating.svelte +7 -7
  91. package/dist/form/FormSection.svelte +2 -2
  92. package/dist/form/FormSelect.svelte +12 -12
  93. package/dist/form/FormSlider.svelte +10 -10
  94. package/dist/form/FormSwitch.svelte +5 -5
  95. package/dist/form/FormTagInput.svelte +5 -5
  96. package/dist/form/FormTreeSelect.svelte +7 -7
  97. package/dist/form/FormUpload.svelte +10 -10
  98. package/dist/highlight/Highlight.svelte +2 -2
  99. package/dist/highlight/meta.d.ts +1 -1
  100. package/dist/highlight/meta.d.ts.map +1 -1
  101. package/dist/highlight/meta.js +6 -1
  102. package/dist/image/ImagePreview.svelte +7 -7
  103. package/dist/image/meta.d.ts +1 -1
  104. package/dist/image/meta.js +1 -1
  105. package/dist/index.d.ts +2 -1
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +2 -1
  108. package/dist/input/Input.svelte +14 -7
  109. package/dist/input-number/InputNumber.svelte +25 -19
  110. package/dist/layout/Content.svelte +17 -3
  111. package/dist/layout/Content.svelte.d.ts +6 -0
  112. package/dist/layout/Content.svelte.d.ts.map +1 -1
  113. package/dist/layout/Footer.svelte +22 -5
  114. package/dist/layout/Footer.svelte.d.ts +6 -0
  115. package/dist/layout/Footer.svelte.d.ts.map +1 -1
  116. package/dist/layout/Header.svelte +20 -3
  117. package/dist/layout/Header.svelte.d.ts +6 -0
  118. package/dist/layout/Header.svelte.d.ts.map +1 -1
  119. package/dist/layout/Layout.svelte +15 -2
  120. package/dist/layout/Layout.svelte.d.ts +6 -0
  121. package/dist/layout/Layout.svelte.d.ts.map +1 -1
  122. package/dist/layout/Sider.svelte +29 -4
  123. package/dist/layout/Sider.svelte.d.ts +8 -0
  124. package/dist/layout/Sider.svelte.d.ts.map +1 -1
  125. package/dist/layout/meta.d.ts +88 -0
  126. package/dist/layout/meta.d.ts.map +1 -1
  127. package/dist/layout/meta.js +22 -5
  128. package/dist/list/List.svelte +3 -3
  129. package/dist/list/ListItem.svelte +5 -5
  130. package/dist/list/ListMeta.svelte +1 -1
  131. package/dist/list/meta.d.ts +1 -1
  132. package/dist/list/meta.js +2 -2
  133. package/dist/menu/Menu.svelte +119 -38
  134. package/dist/menu/Menu.svelte.d.ts +16 -1
  135. package/dist/menu/Menu.svelte.d.ts.map +1 -1
  136. package/dist/menu/MenuPopupNode.svelte +37 -37
  137. package/dist/menu/MenuPopupNode.svelte.d.ts +1 -1
  138. package/dist/menu/MenuPopupNode.svelte.d.ts.map +1 -1
  139. package/dist/menu/meta.d.ts +21 -1
  140. package/dist/menu/meta.d.ts.map +1 -1
  141. package/dist/menu/meta.js +6 -1
  142. package/dist/menu/types.d.ts +6 -0
  143. package/dist/menu/types.d.ts.map +1 -1
  144. package/dist/modal/ConfirmModal.svelte +1 -1
  145. package/dist/modal/Modal.svelte +1 -1
  146. package/dist/nav/Nav.svelte +293 -0
  147. package/dist/nav/Nav.svelte.d.ts +75 -0
  148. package/dist/nav/Nav.svelte.d.ts.map +1 -0
  149. package/dist/nav/NavFooter.svelte +82 -0
  150. package/dist/nav/NavFooter.svelte.d.ts +14 -0
  151. package/dist/nav/NavFooter.svelte.d.ts.map +1 -0
  152. package/dist/nav/NavHeader.svelte +66 -0
  153. package/dist/nav/NavHeader.svelte.d.ts +18 -0
  154. package/dist/nav/NavHeader.svelte.d.ts.map +1 -0
  155. package/dist/nav/NavItem.svelte +68 -0
  156. package/dist/nav/NavItem.svelte.d.ts +28 -0
  157. package/dist/nav/NavItem.svelte.d.ts.map +1 -0
  158. package/dist/nav/NavSub.svelte +57 -0
  159. package/dist/nav/NavSub.svelte.d.ts +18 -0
  160. package/dist/nav/NavSub.svelte.d.ts.map +1 -0
  161. package/dist/nav/context.d.ts +31 -0
  162. package/dist/nav/context.d.ts.map +1 -0
  163. package/dist/nav/context.js +15 -0
  164. package/dist/nav/index.d.ts +20 -0
  165. package/dist/nav/index.d.ts.map +1 -0
  166. package/dist/nav/index.js +18 -0
  167. package/dist/nav/meta.d.ts +296 -0
  168. package/dist/nav/meta.d.ts.map +1 -0
  169. package/dist/nav/meta.js +119 -0
  170. package/dist/nav/types.d.ts +52 -0
  171. package/dist/nav/types.d.ts.map +1 -0
  172. package/dist/nav/types.js +31 -0
  173. package/dist/notification/NotificationItem.svelte +5 -5
  174. package/dist/notification/meta.d.ts +1 -1
  175. package/dist/notification/meta.d.ts.map +1 -1
  176. package/dist/notification/meta.js +1 -0
  177. package/dist/overflow-list/OverflowList.svelte +4 -4
  178. package/dist/pagination/Pagination.svelte +5 -5
  179. package/dist/popconfirm/Popconfirm.svelte +10 -14
  180. package/dist/popconfirm/Popconfirm.svelte.d.ts.map +1 -1
  181. package/dist/popconfirm/meta.d.ts +1 -1
  182. package/dist/popconfirm/meta.d.ts.map +1 -1
  183. package/dist/popconfirm/meta.js +1 -0
  184. package/dist/popover/Popover.svelte +13 -13
  185. package/dist/progress/Progress.svelte +1 -1
  186. package/dist/radio/Radio.svelte +58 -11
  187. package/dist/radio/Radio.svelte.d.ts +11 -0
  188. package/dist/radio/Radio.svelte.d.ts.map +1 -1
  189. package/dist/radio/RadioGroup.svelte +1 -1
  190. package/dist/radio/meta.d.ts +54 -1
  191. package/dist/radio/meta.d.ts.map +1 -1
  192. package/dist/radio/meta.js +12 -1
  193. package/dist/rating/Rating.svelte +20 -4
  194. package/dist/rating/Rating.svelte.d.ts +5 -0
  195. package/dist/rating/Rating.svelte.d.ts.map +1 -1
  196. package/dist/rating/meta.d.ts +25 -0
  197. package/dist/rating/meta.d.ts.map +1 -1
  198. package/dist/rating/meta.js +5 -0
  199. package/dist/scroll-list/ScrollColumn.svelte +1 -1
  200. package/dist/select/Select.svelte +26 -18
  201. package/dist/side-sheet/SideSheet.svelte +4 -4
  202. package/dist/slider/Slider.svelte +93 -17
  203. package/dist/slider/Slider.svelte.d.ts +20 -0
  204. package/dist/slider/Slider.svelte.d.ts.map +1 -1
  205. package/dist/slider/meta.d.ts +36 -1
  206. package/dist/slider/meta.d.ts.map +1 -1
  207. package/dist/slider/meta.js +8 -1
  208. package/dist/steps/Steps.svelte +7 -7
  209. package/dist/steps/meta.d.ts +1 -1
  210. package/dist/steps/meta.js +1 -1
  211. package/dist/switch/Switch.svelte +6 -6
  212. package/dist/switch/meta.d.ts +1 -1
  213. package/dist/switch/meta.js +1 -1
  214. package/dist/table/Table.svelte +17 -17
  215. package/dist/tabs/Tabs.svelte +12 -12
  216. package/dist/tabs/meta.d.ts +1 -1
  217. package/dist/tabs/meta.js +1 -1
  218. package/dist/tag/Tag.svelte +4 -2
  219. package/dist/tag/meta.d.ts +1 -1
  220. package/dist/tag/meta.d.ts.map +1 -1
  221. package/dist/tag/meta.js +2 -0
  222. package/dist/tag-input/TagInput.svelte +25 -14
  223. package/dist/textarea/TextArea.svelte +8 -8
  224. package/dist/time-picker/TimePicker.svelte +16 -16
  225. package/dist/timeline/Timeline.svelte +3 -3
  226. package/dist/timeline/meta.d.ts +1 -1
  227. package/dist/timeline/meta.js +1 -1
  228. package/dist/toast/ToastItem.svelte +2 -1
  229. package/dist/toast/meta.d.ts +1 -1
  230. package/dist/toast/meta.d.ts.map +1 -1
  231. package/dist/toast/meta.js +1 -0
  232. package/dist/tooltip/Tooltip.svelte +1 -1
  233. package/dist/transfer/Transfer.svelte +19 -19
  234. package/dist/tree/Tree.svelte +7 -6
  235. package/dist/tree-select/TreeSelect.svelte +20 -11
  236. package/dist/typography/TypographyBase.svelte +21 -12
  237. package/dist/typography/meta.d.ts +1 -1
  238. package/dist/typography/meta.d.ts.map +1 -1
  239. package/dist/typography/meta.js +3 -1
  240. package/dist/upload/Upload.svelte +44 -41
  241. package/package.json +3 -3
@@ -447,7 +447,7 @@
447
447
  margin: 0;
448
448
  color: var(--cd-modal-title-color);
449
449
  font-size: var(--cd-modal-title-size);
450
- font-weight: 600;
450
+ font-weight: var(--cd-modal-title-weight);
451
451
  line-height: 1.4;
452
452
  }
453
453
  .cd-modal__close {
@@ -0,0 +1,293 @@
1
+ <!--
2
+ Nav — 站点导航(对齐 Semi Navigation)。独立组件、对外字段对齐 Semi
3
+ (itemKey/text/icon/items),内部委托我们自己的 Menu 渲染导航体(purpose=navigation),
4
+ 复用 Menu 的选中/展开/折叠/键盘/a11y 逻辑,仅新增 Header(logo+text)/Footer(collapseButton)
5
+ 容器与折叠联动。
6
+
7
+ mode 映射:horizontal → Menu mode=horizontal;vertical 展开 → Menu mode=inline;
8
+ vertical 折叠 → Menu mode=inline + inlineCollapsed(图标轨 + hover 浮层)。
9
+
10
+ 范围(MVP):mode(vertical/horizontal)、items、header/footer、selected/open/collapsed
11
+ 受控与非受控 + 回调。TODO(暂未实现,留待后续):limitIndent / toggleIconPosition /
12
+ subNavMotion / tooltip 延迟 / renderWrapper / Nav.Item 声明式写法。
13
+ -->
14
+ <script lang="ts" module>
15
+ export { NAV_CONTEXT_KEY } from './context.js';
16
+ </script>
17
+
18
+ <script lang="ts">
19
+ import type { Snippet } from 'svelte';
20
+ import { setContext, untrack } from 'svelte';
21
+ import Menu from '../menu/Menu.svelte';
22
+ import type { MenuKey, MenuItemNode } from '../menu/types.js';
23
+ import {
24
+ navItemsToMenuItems,
25
+ type NavItemDef,
26
+ type NavKey,
27
+ type NavMode,
28
+ type NavHeaderConfig,
29
+ type NavFooterConfig,
30
+ } from './types.js';
31
+ import {
32
+ NAV_CONTEXT_KEY,
33
+ NAV_COLLECTOR_KEY,
34
+ type NavContext,
35
+ type NavCollector,
36
+ } from './context.js';
37
+ import NavHeader from './NavHeader.svelte';
38
+ import NavFooter from './NavFooter.svelte';
39
+
40
+ interface Props {
41
+ /** 导航项列表(字段对齐 Semi:itemKey/text/icon/items)。 */
42
+ items?: NavItemDef[];
43
+ /** 导航方向:vertical(侧边,默认)/ horizontal(顶部)。 */
44
+ mode?: NavMode;
45
+ /** 受控选中项 key 数组。 */
46
+ selectedKeys?: NavKey[];
47
+ /** 默认选中项 key 数组(非受控)。 */
48
+ defaultSelectedKeys?: NavKey[];
49
+ /** 受控展开的子导航 key 数组(仅 vertical 且未折叠有效)。 */
50
+ openKeys?: NavKey[];
51
+ /** 默认展开的子导航 key 数组(非受控)。 */
52
+ defaultOpenKeys?: NavKey[];
53
+ /** 受控折叠态(仅 vertical 有效)。 */
54
+ isCollapsed?: boolean;
55
+ /** 默认折叠态(非受控,仅 vertical 有效)。 */
56
+ defaultIsCollapsed?: boolean;
57
+ /** 头部区域配置对象({logo, text})。与 header snippet 二选一。 */
58
+ header?: NavHeaderConfig;
59
+ /** 底部区域配置对象({collapseButton})。与 footer snippet 二选一。 */
60
+ footer?: NavFooterConfig;
61
+ /** 整体禁用。 */
62
+ disabled?: boolean;
63
+ /** 子级缩进像素(透传 Menu inlineIndent)。 */
64
+ inlineIndent?: number;
65
+ /** 缩进限制:仅一级缩进(默认 true);false 时逐级缩进(透传 Menu limitIndent)。 */
66
+ limitIndent?: boolean;
67
+ /** 含子导航项的展开箭头位置(透传 Menu toggleIconPosition)。 */
68
+ toggleIconPosition?: 'left' | 'right';
69
+ /** 自定义展开箭头图标(透传 Menu expandIcon)。 */
70
+ expandIcon?: Snippet;
71
+ /** 子导航展开动画开关(默认 true,透传 Menu motion)。对齐 Semi subNavMotion。 */
72
+ subNavMotion?: boolean;
73
+ /** 浮层子导航展开延迟 ms(透传 Menu subMenuOpenDelay)。对齐 Semi subNavOpenDelay。 */
74
+ subNavOpenDelay?: number;
75
+ /** 浮层子导航关闭延迟 ms(透传 Menu subMenuCloseDelay)。对齐 Semi subNavCloseDelay。 */
76
+ subNavCloseDelay?: number;
77
+ /** 浮层挂载容器(透传 Menu getPopupContainer)。 */
78
+ getPopupContainer?: () => HTMLElement | null | undefined;
79
+ /** 自定义导航项外层包裹(透传 Menu renderWrapper)。 */
80
+ renderWrapper?: Snippet<[{ item: MenuItemNode; children: Snippet }]>;
81
+ /** 根元素自定义类名(透传)。 */
82
+ class?: string;
83
+ /** 根元素自定义内联样式(透传)。 */
84
+ style?: string;
85
+ /** 导航项列表容器自定义样式(对齐 Semi bodyStyle)。 */
86
+ bodyStyle?: string;
87
+ /** 可访问性标签。 */
88
+ ariaLabel?: string;
89
+ /** 选中导航项回调。 */
90
+ onSelect?: (key: NavKey) => void;
91
+ /** 点击任意导航项回调(对齐 Semi onClick,在 onSelect 之外亦对已选项触发)。 */
92
+ onClick?: (key: NavKey) => void;
93
+ /** 展开/收起子导航回调。 */
94
+ onOpenChange?: (keys: NavKey[]) => void;
95
+ /** 折叠态变化回调。 */
96
+ onCollapseChange?: (isCollapsed: boolean) => void;
97
+ /** 自定义头部(覆盖 header 配置对象)。 */
98
+ headerSlot?: Snippet;
99
+ /** 自定义底部(覆盖 footer 配置对象)。 */
100
+ footerSlot?: Snippet;
101
+ /** 声明式子项(<Nav.Item>/<Nav.Sub>)。与 items 二选一,items 优先。 */
102
+ children?: Snippet;
103
+ }
104
+
105
+ let {
106
+ items = [],
107
+ mode = 'vertical',
108
+ selectedKeys,
109
+ defaultSelectedKeys,
110
+ openKeys,
111
+ defaultOpenKeys,
112
+ isCollapsed,
113
+ defaultIsCollapsed = false,
114
+ header,
115
+ footer,
116
+ disabled = false,
117
+ inlineIndent,
118
+ limitIndent,
119
+ toggleIconPosition,
120
+ expandIcon,
121
+ subNavMotion,
122
+ subNavOpenDelay,
123
+ subNavCloseDelay,
124
+ getPopupContainer,
125
+ renderWrapper,
126
+ class: className = '',
127
+ style,
128
+ bodyStyle,
129
+ ariaLabel,
130
+ onSelect,
131
+ onClick,
132
+ onOpenChange,
133
+ onCollapseChange,
134
+ headerSlot,
135
+ footerSlot,
136
+ children,
137
+ }: Props = $props();
138
+
139
+ // --- 受控/非受控折叠态(仅 vertical 有意义);受控 prop 优先,变化走回调不回写 ---
140
+ const isCollapsedControlled = $derived(isCollapsed !== undefined);
141
+ let innerCollapsed = $state(untrack(() => defaultIsCollapsed));
142
+ const collapsedState = $derived(
143
+ mode === 'vertical' && (isCollapsedControlled ? !!isCollapsed : innerCollapsed),
144
+ );
145
+
146
+ function toggleCollapsed(): void {
147
+ const next = !collapsedState;
148
+ if (!isCollapsedControlled) innerCollapsed = next;
149
+ onCollapseChange?.(next);
150
+ }
151
+
152
+ // Footer 的 collapseButton 经 context 联动折叠态。
153
+ setContext<NavContext>(NAV_CONTEXT_KEY, {
154
+ get collapsed() {
155
+ return collapsedState;
156
+ },
157
+ get mode() {
158
+ return mode;
159
+ },
160
+ toggleCollapsed,
161
+ });
162
+
163
+ // --- 声明式子项收集(<Nav.Item>/<Nav.Sub>)---
164
+ // 普通数组承接注册(非 $state,避免子项 init push 触发反应自循环)。
165
+ let declared: NavItemDef[] = [];
166
+ // 唯一反应量:子项挂载后异步 bump,触发一次 items 重建。
167
+ let revision = $state(0);
168
+ let bumpScheduled = false;
169
+
170
+ setContext<NavCollector>(NAV_COLLECTOR_KEY, {
171
+ add: (item: NavItemDef) => {
172
+ declared.push(item);
173
+ return item;
174
+ },
175
+ bump: () => {
176
+ // 合并同一帧的多次 bump 为一次;异步脱离挂载 effect 同步栈。
177
+ if (bumpScheduled) return;
178
+ bumpScheduled = true;
179
+ queueMicrotask(() => {
180
+ bumpScheduled = false;
181
+ revision += 1;
182
+ });
183
+ },
184
+ });
185
+
186
+ // items prop 优先;否则用声明式收集结果。
187
+ // 必须真正使用 revision 的值(裸读语句会被编译器优化掉、断开依赖);
188
+ // 返回浅拷贝确保 Menu 每次收到新数组引用而重渲染。
189
+ const resolvedItems = $derived.by(() => {
190
+ if (items.length) return items;
191
+ const r = revision;
192
+ return r >= 0 ? declared.slice() : [];
193
+ });
194
+
195
+ // --- items(Semi 形)→ Menu items ---
196
+ const menuItems = $derived(navItemsToMenuItems(resolvedItems));
197
+
198
+ // --- mode 映射到 Menu ---
199
+ const menuMode = $derived<'inline' | 'horizontal'>(
200
+ mode === 'horizontal' ? 'horizontal' : 'inline',
201
+ );
202
+ const menuInlineCollapsed = $derived(mode === 'vertical' && collapsedState);
203
+
204
+ const cls = $derived(
205
+ ['cd-nav', `cd-nav--${mode}`, collapsedState && 'cd-nav--collapsed', className]
206
+ .filter(Boolean)
207
+ .join(' '),
208
+ );
209
+
210
+ // 头部/底部是否渲染。
211
+ const hasHeader = $derived(!!headerSlot || !!header);
212
+ const hasFooter = $derived(!!footerSlot || (!!footer && footer.collapseButton));
213
+ </script>
214
+
215
+ <div class={cls} {style} aria-label={ariaLabel}>
216
+ {#if hasHeader}
217
+ {#if headerSlot}
218
+ {@render headerSlot()}
219
+ {:else if header}
220
+ <NavHeader
221
+ {...header.logo !== undefined ? { logo: header.logo } : {}}
222
+ {...header.text !== undefined ? { text: header.text } : {}}
223
+ {collapsedState}
224
+ />
225
+ {/if}
226
+ {/if}
227
+
228
+ <div class="cd-nav__body" style={bodyStyle}>
229
+ <Menu
230
+ items={menuItems}
231
+ mode={menuMode}
232
+ inlineCollapsed={menuInlineCollapsed}
233
+ purpose="navigation"
234
+ {disabled}
235
+ {...selectedKeys !== undefined ? { selectedKeys } : {}}
236
+ {...defaultSelectedKeys !== undefined ? { defaultSelectedKeys } : {}}
237
+ {...openKeys !== undefined ? { openKeys } : {}}
238
+ {...defaultOpenKeys !== undefined ? { defaultOpenKeys } : {}}
239
+ {...inlineIndent !== undefined ? { inlineIndent } : {}}
240
+ {...limitIndent !== undefined ? { limitIndent } : {}}
241
+ {...toggleIconPosition !== undefined ? { toggleIconPosition } : {}}
242
+ {...expandIcon !== undefined ? { expandIcon } : {}}
243
+ {...subNavMotion !== undefined ? { motion: subNavMotion } : {}}
244
+ {...subNavOpenDelay !== undefined ? { subMenuOpenDelay: subNavOpenDelay } : {}}
245
+ {...subNavCloseDelay !== undefined ? { subMenuCloseDelay: subNavCloseDelay } : {}}
246
+ {...getPopupContainer !== undefined ? { getPopupContainer } : {}}
247
+ {...renderWrapper !== undefined ? { renderWrapper } : {}}
248
+ onSelect={(key: MenuKey) => {
249
+ onSelect?.(key);
250
+ onClick?.(key);
251
+ }}
252
+ onOpenChange={(keys: MenuKey[]) => onOpenChange?.(keys)}
253
+ />
254
+ </div>
255
+
256
+ <!-- 声明式子项注册宿主:仅当未传 items 且有 children 时挂载。
257
+ Nav.Item/Nav.Sub 渲染无可见 DOM,只在此注册描述符;display:none 不占位。 -->
258
+ {#if !items.length && children}
259
+ <div hidden style="display:none">{@render children()}</div>
260
+ {/if}
261
+
262
+ {#if hasFooter}
263
+ {#if footerSlot}
264
+ {@render footerSlot()}
265
+ {:else if footer}
266
+ <NavFooter collapseButton={footer.collapseButton ?? false} />
267
+ {/if}
268
+ {/if}
269
+ </div>
270
+
271
+ <style>
272
+ .cd-nav {
273
+ display: flex;
274
+ flex-direction: column;
275
+ background: var(--cd-nav-bg);
276
+ color: var(--cd-nav-color);
277
+ }
278
+ .cd-nav--horizontal {
279
+ flex-direction: row;
280
+ align-items: center;
281
+ height: var(--cd-nav-horizontal-height);
282
+ }
283
+ /* 导航体占据中间,header/footer 固定 */
284
+ .cd-nav__body {
285
+ flex: 1 1 auto;
286
+ min-height: 0;
287
+ overflow: auto;
288
+ }
289
+ .cd-nav--horizontal .cd-nav__body {
290
+ flex: 1 1 auto;
291
+ overflow: visible;
292
+ }
293
+ </style>
@@ -0,0 +1,75 @@
1
+ export { NAV_CONTEXT_KEY } from './context.js';
2
+ import type { Snippet } from 'svelte';
3
+ import type { MenuItemNode } from '../menu/types.js';
4
+ import { type NavItemDef, type NavKey, type NavMode, type NavHeaderConfig, type NavFooterConfig } from './types.js';
5
+ interface Props {
6
+ /** 导航项列表(字段对齐 Semi:itemKey/text/icon/items)。 */
7
+ items?: NavItemDef[];
8
+ /** 导航方向:vertical(侧边,默认)/ horizontal(顶部)。 */
9
+ mode?: NavMode;
10
+ /** 受控选中项 key 数组。 */
11
+ selectedKeys?: NavKey[];
12
+ /** 默认选中项 key 数组(非受控)。 */
13
+ defaultSelectedKeys?: NavKey[];
14
+ /** 受控展开的子导航 key 数组(仅 vertical 且未折叠有效)。 */
15
+ openKeys?: NavKey[];
16
+ /** 默认展开的子导航 key 数组(非受控)。 */
17
+ defaultOpenKeys?: NavKey[];
18
+ /** 受控折叠态(仅 vertical 有效)。 */
19
+ isCollapsed?: boolean;
20
+ /** 默认折叠态(非受控,仅 vertical 有效)。 */
21
+ defaultIsCollapsed?: boolean;
22
+ /** 头部区域配置对象({logo, text})。与 header snippet 二选一。 */
23
+ header?: NavHeaderConfig;
24
+ /** 底部区域配置对象({collapseButton})。与 footer snippet 二选一。 */
25
+ footer?: NavFooterConfig;
26
+ /** 整体禁用。 */
27
+ disabled?: boolean;
28
+ /** 子级缩进像素(透传 Menu inlineIndent)。 */
29
+ inlineIndent?: number;
30
+ /** 缩进限制:仅一级缩进(默认 true);false 时逐级缩进(透传 Menu limitIndent)。 */
31
+ limitIndent?: boolean;
32
+ /** 含子导航项的展开箭头位置(透传 Menu toggleIconPosition)。 */
33
+ toggleIconPosition?: 'left' | 'right';
34
+ /** 自定义展开箭头图标(透传 Menu expandIcon)。 */
35
+ expandIcon?: Snippet;
36
+ /** 子导航展开动画开关(默认 true,透传 Menu motion)。对齐 Semi subNavMotion。 */
37
+ subNavMotion?: boolean;
38
+ /** 浮层子导航展开延迟 ms(透传 Menu subMenuOpenDelay)。对齐 Semi subNavOpenDelay。 */
39
+ subNavOpenDelay?: number;
40
+ /** 浮层子导航关闭延迟 ms(透传 Menu subMenuCloseDelay)。对齐 Semi subNavCloseDelay。 */
41
+ subNavCloseDelay?: number;
42
+ /** 浮层挂载容器(透传 Menu getPopupContainer)。 */
43
+ getPopupContainer?: () => HTMLElement | null | undefined;
44
+ /** 自定义导航项外层包裹(透传 Menu renderWrapper)。 */
45
+ renderWrapper?: Snippet<[{
46
+ item: MenuItemNode;
47
+ children: Snippet;
48
+ }]>;
49
+ /** 根元素自定义类名(透传)。 */
50
+ class?: string;
51
+ /** 根元素自定义内联样式(透传)。 */
52
+ style?: string;
53
+ /** 导航项列表容器自定义样式(对齐 Semi bodyStyle)。 */
54
+ bodyStyle?: string;
55
+ /** 可访问性标签。 */
56
+ ariaLabel?: string;
57
+ /** 选中导航项回调。 */
58
+ onSelect?: (key: NavKey) => void;
59
+ /** 点击任意导航项回调(对齐 Semi onClick,在 onSelect 之外亦对已选项触发)。 */
60
+ onClick?: (key: NavKey) => void;
61
+ /** 展开/收起子导航回调。 */
62
+ onOpenChange?: (keys: NavKey[]) => void;
63
+ /** 折叠态变化回调。 */
64
+ onCollapseChange?: (isCollapsed: boolean) => void;
65
+ /** 自定义头部(覆盖 header 配置对象)。 */
66
+ headerSlot?: Snippet;
67
+ /** 自定义底部(覆盖 footer 配置对象)。 */
68
+ footerSlot?: Snippet;
69
+ /** 声明式子项(<Nav.Item>/<Nav.Sub>)。与 items 二选一,items 优先。 */
70
+ children?: Snippet;
71
+ }
72
+ declare const Nav: import("svelte").Component<Props, {}, "">;
73
+ type Nav = ReturnType<typeof Nav>;
74
+ export default Nav;
75
+ //# sourceMappingURL=Nav.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Nav.svelte.d.ts","sourceRoot":"","sources":["../../src/nav/Nav.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAEH,KAAK,UAAU,EACf,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAWpB,UAAU,KAAK;IACb,gDAAgD;IAChD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,yBAAyB;IACzB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4BAA4B;IAC5B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mDAAmD;IACnD,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,uDAAuD;IACvD,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;IACzD,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IACrE,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,uDAAuD;IACvD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,kBAAkB;IAClB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,eAAe;IACf,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+JH,QAAA,MAAM,GAAG,2CAAwC,CAAC;AAClD,KAAK,GAAG,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;AAClC,eAAe,GAAG,CAAC"}
@@ -0,0 +1,82 @@
1
+ <!--
2
+ Nav.Footer — 导航底部(对齐 Semi footer={{collapseButton}})。
3
+ collapseButton 仅 mode='vertical' 生效,点击经 Nav context toggle 折叠态。
4
+ aria-label 文案复用 locale 包 Sider.expand/collapse。
5
+ -->
6
+ <script lang="ts">
7
+ import type { Snippet } from 'svelte';
8
+ import { useLocale } from '../locale-provider/index.js';
9
+ import { getNavContext } from './context.js';
10
+
11
+ interface Props {
12
+ /** 是否展示收起按钮(仅 vertical 生效)。 */
13
+ collapseButton?: boolean;
14
+ /** 自定义类名。 */
15
+ class?: string;
16
+ /** 自定义内联样式。 */
17
+ style?: string;
18
+ children?: Snippet;
19
+ }
20
+
21
+ let { collapseButton = false, class: className = '', style, children }: Props = $props();
22
+
23
+ const loc = useLocale();
24
+ const nav = getNavContext();
25
+
26
+ const showCollapseButton = $derived(
27
+ collapseButton && !children && nav?.mode === 'vertical',
28
+ );
29
+ const collapsed = $derived(nav?.collapsed ?? false);
30
+ // 折叠时箭头指向「展开」方向,反之指向「收起」。
31
+ const arrow = $derived(collapsed ? '›' : '‹');
32
+ </script>
33
+
34
+ <div class={['cd-nav__footer', className].filter(Boolean).join(' ')} {style}>
35
+ {#if children}
36
+ {@render children()}
37
+ {:else if showCollapseButton}
38
+ <button
39
+ type="button"
40
+ class="cd-nav__collapse-btn"
41
+ aria-expanded={!collapsed}
42
+ aria-label={collapsed ? loc().t('Sider.expand') : loc().t('Sider.collapse')}
43
+ onclick={() => nav?.toggleCollapsed()}
44
+ >
45
+ <span class="cd-nav__collapse-arrow" aria-hidden="true">{arrow}</span>
46
+ </button>
47
+ {/if}
48
+ </div>
49
+
50
+ <style>
51
+ .cd-nav__footer {
52
+ display: flex;
53
+ align-items: center;
54
+ flex: 0 0 auto;
55
+ padding: var(--cd-nav-footer-padding);
56
+ border-block-start: 1px solid var(--cd-nav-footer-border);
57
+ }
58
+ .cd-nav__collapse-btn {
59
+ display: inline-flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ width: 100%;
63
+ height: var(--cd-nav-collapse-btn-height);
64
+ border: none;
65
+ background: transparent;
66
+ color: var(--cd-nav-collapse-btn-color);
67
+ cursor: pointer;
68
+ border-radius: var(--cd-border-radius-small);
69
+ transition: background-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
70
+ }
71
+ .cd-nav__collapse-btn:hover {
72
+ background: var(--cd-nav-collapse-btn-hover-bg);
73
+ }
74
+ .cd-nav__collapse-btn:focus-visible {
75
+ outline: none;
76
+ box-shadow: var(--cd-focus-ring);
77
+ }
78
+ .cd-nav__collapse-arrow {
79
+ font-size: 18px;
80
+ line-height: 1;
81
+ }
82
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** 是否展示收起按钮(仅 vertical 生效)。 */
4
+ collapseButton?: boolean;
5
+ /** 自定义类名。 */
6
+ class?: string;
7
+ /** 自定义内联样式。 */
8
+ style?: string;
9
+ children?: Snippet;
10
+ }
11
+ declare const NavFooter: import("svelte").Component<Props, {}, "">;
12
+ type NavFooter = ReturnType<typeof NavFooter>;
13
+ export default NavFooter;
14
+ //# sourceMappingURL=NavFooter.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavFooter.svelte.d.ts","sourceRoot":"","sources":["../../src/nav/NavFooter.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAKpC,UAAU,KAAK;IACb,+BAA+B;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAmCH,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -0,0 +1,66 @@
1
+ <!--
2
+ Nav.Header — 导航头部:logo 槽 + 文案(对齐 Semi header={{logo,text}})。
3
+ 折叠态隐藏文案仅留 logo。
4
+ -->
5
+ <script lang="ts">
6
+ import type { Snippet } from 'svelte';
7
+
8
+ interface Props {
9
+ /** Logo 节点。 */
10
+ logo?: Snippet;
11
+ /** Logo 文案。 */
12
+ text?: string;
13
+ /** 折叠态(由 Nav 透传;折叠时隐藏文案)。 */
14
+ collapsedState?: boolean;
15
+ /** 自定义类名。 */
16
+ class?: string;
17
+ /** 自定义内联样式。 */
18
+ style?: string;
19
+ children?: Snippet;
20
+ }
21
+
22
+ let {
23
+ logo,
24
+ text,
25
+ collapsedState = false,
26
+ class: className = '',
27
+ style,
28
+ children,
29
+ }: Props = $props();
30
+ </script>
31
+
32
+ <div class={['cd-nav__header', className].filter(Boolean).join(' ')} {style}>
33
+ {#if children}
34
+ {@render children()}
35
+ {:else}
36
+ {#if logo}
37
+ <span class="cd-nav__logo">{@render logo()}</span>
38
+ {/if}
39
+ {#if text && !collapsedState}
40
+ <span class="cd-nav__header-text">{text}</span>
41
+ {/if}
42
+ {/if}
43
+ </div>
44
+
45
+ <style>
46
+ .cd-nav__header {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: var(--cd-nav-header-gap);
50
+ height: var(--cd-nav-header-height);
51
+ padding-inline: var(--cd-nav-header-padding-x);
52
+ flex: 0 0 auto;
53
+ overflow: hidden;
54
+ }
55
+ .cd-nav__logo {
56
+ display: inline-flex;
57
+ align-items: center;
58
+ flex: 0 0 auto;
59
+ }
60
+ .cd-nav__header-text {
61
+ font-size: var(--cd-nav-header-text-size);
62
+ font-weight: var(--cd-font-weight-bold);
63
+ white-space: nowrap;
64
+ color: var(--cd-nav-header-text-color);
65
+ }
66
+ </style>
@@ -0,0 +1,18 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Logo 节点。 */
4
+ logo?: Snippet;
5
+ /** Logo 文案。 */
6
+ text?: string;
7
+ /** 折叠态(由 Nav 透传;折叠时隐藏文案)。 */
8
+ collapsedState?: boolean;
9
+ /** 自定义类名。 */
10
+ class?: string;
11
+ /** 自定义内联样式。 */
12
+ style?: string;
13
+ children?: Snippet;
14
+ }
15
+ declare const NavHeader: import("svelte").Component<Props, {}, "">;
16
+ type NavHeader = ReturnType<typeof NavHeader>;
17
+ export default NavHeader;
18
+ //# sourceMappingURL=NavHeader.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavHeader.svelte.d.ts","sourceRoot":"","sources":["../../src/nav/NavHeader.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,UAAU,KAAK;IACb,eAAe;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiCH,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -0,0 +1,68 @@
1
+ <!--
2
+ Nav.Item — 声明式叶子导航项(对齐 Semi Nav.Item)。
3
+ 仅注册描述符到父级收集器,不直接渲染 DOM(渲染由 Nav 委托的 Menu 统一负责)。
4
+ 安全:init 同步注册进【普通数组】,挂载后【异步】bump 触发一次 Nav 重建。
5
+ -->
6
+ <script lang="ts">
7
+ import type { Snippet } from 'svelte';
8
+ import { onMount } from 'svelte';
9
+ import { getNavCollector } from './context.js';
10
+ import type { NavKey } from './types.js';
11
+
12
+ interface Props {
13
+ /** 导航项唯一标识。 */
14
+ itemKey: NavKey;
15
+ /** 导航项文案。 */
16
+ text: string;
17
+ /** 项前置图标。 */
18
+ icon?: Snippet;
19
+ /** 是否禁用。 */
20
+ disabled?: boolean;
21
+ /** 链接地址(叶子项渲染为原生 <a>)。 */
22
+ link?: string;
23
+ /** 链接 target。 */
24
+ target?: string;
25
+ /** 链接 rel。 */
26
+ rel?: string;
27
+ /** 项级点击回调。 */
28
+ onClick?: (e: MouseEvent) => void;
29
+ /** 项级鼠标移入回调。 */
30
+ onMouseEnter?: (e: MouseEvent) => void;
31
+ /** 项级鼠标移出回调。 */
32
+ onMouseLeave?: (e: MouseEvent) => void;
33
+ }
34
+
35
+ let {
36
+ itemKey,
37
+ text,
38
+ icon,
39
+ disabled,
40
+ link,
41
+ target,
42
+ rel,
43
+ onClick,
44
+ onMouseEnter,
45
+ onMouseLeave,
46
+ }: Props = $props();
47
+
48
+ const collector = getNavCollector();
49
+ // 声明式项为「声明时读取一次」语义(对齐 Semi Nav.Item,不支持运行时改 prop)。
50
+ // 故此处刻意静态读取 props 注册,state_referenced_locally 警告预期且无害。
51
+ // svelte-ignore state_referenced_locally
52
+ if (collector) {
53
+ collector.add({
54
+ itemKey,
55
+ text,
56
+ ...(icon !== undefined ? { icon } : {}),
57
+ ...(disabled !== undefined ? { disabled } : {}),
58
+ ...(link !== undefined ? { link } : {}),
59
+ ...(target !== undefined ? { target } : {}),
60
+ ...(rel !== undefined ? { rel } : {}),
61
+ ...(onClick !== undefined ? { onClick } : {}),
62
+ ...(onMouseEnter !== undefined ? { onMouseEnter } : {}),
63
+ ...(onMouseLeave !== undefined ? { onMouseLeave } : {}),
64
+ });
65
+ }
66
+ // 挂载后异步 bump,脱离挂载 effect 同步栈。
67
+ onMount(() => collector?.bump());
68
+ </script>
@@ -0,0 +1,28 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { NavKey } from './types.js';
3
+ interface Props {
4
+ /** 导航项唯一标识。 */
5
+ itemKey: NavKey;
6
+ /** 导航项文案。 */
7
+ text: string;
8
+ /** 项前置图标。 */
9
+ icon?: Snippet;
10
+ /** 是否禁用。 */
11
+ disabled?: boolean;
12
+ /** 链接地址(叶子项渲染为原生 <a>)。 */
13
+ link?: string;
14
+ /** 链接 target。 */
15
+ target?: string;
16
+ /** 链接 rel。 */
17
+ rel?: string;
18
+ /** 项级点击回调。 */
19
+ onClick?: (e: MouseEvent) => void;
20
+ /** 项级鼠标移入回调。 */
21
+ onMouseEnter?: (e: MouseEvent) => void;
22
+ /** 项级鼠标移出回调。 */
23
+ onMouseLeave?: (e: MouseEvent) => void;
24
+ }
25
+ declare const NavItem: import("svelte").Component<Props, {}, "">;
26
+ type NavItem = ReturnType<typeof NavItem>;
27
+ export default NavItem;
28
+ //# sourceMappingURL=NavItem.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavItem.svelte.d.ts","sourceRoot":"","sources":["../../src/nav/NavItem.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGvC,UAAU,KAAK;IACb,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc;IACd,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,gBAAgB;IAChB,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,gBAAgB;IAChB,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AA8CH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}