@sdata/web-vue 2.3.1 → 2.8.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 (119) hide show
  1. package/README.md +1 -1
  2. package/dist/sd.css +133 -187
  3. package/dist/sd.min.css +1 -1
  4. package/es/_hooks/use-responsive.d.ts +2 -2
  5. package/es/_hooks/use-theme-mode.d.ts +3 -0
  6. package/es/{calendar/hooks/use-calendar-theme.js → _hooks/use-theme-mode.js} +14 -10
  7. package/es/_utils/responsive-observe.d.ts +5 -4
  8. package/es/_utils/responsive-observe.js +2 -1
  9. package/es/alert/index.d.ts +3 -3
  10. package/es/anchor/index.d.ts +3 -3
  11. package/es/avatar/index.d.ts +20 -20
  12. package/es/border-beam/border-beam.js +5 -0
  13. package/es/border-beam/border-beam.vue.d.ts +52 -0
  14. package/es/border-beam/border-beam.vue_vue_type_script_setup_true_lang.js +623 -0
  15. package/es/border-beam/index.d.ts +106 -0
  16. package/es/border-beam/index.js +10 -0
  17. package/es/border-beam/pulseDriver.d.ts +2 -0
  18. package/es/border-beam/pulseDriver.js +74 -0
  19. package/es/border-beam/style/css.js +2 -0
  20. package/es/border-beam/style/index.css +21 -0
  21. package/es/border-beam/style/index.d.ts +2 -0
  22. package/es/border-beam/style/index.js +2 -0
  23. package/es/border-beam/style/index.scss +12 -0
  24. package/es/border-beam/style/token.scss +12 -0
  25. package/es/border-beam/styles.d.ts +42 -0
  26. package/es/border-beam/styles.js +3545 -0
  27. package/es/border-beam/types.d.ts +27 -0
  28. package/es/button/index.d.ts +24 -24
  29. package/es/calendar/components/index.vue.d.ts +1 -1
  30. package/es/calendar/components/index.vue_vue_type_script_setup_true_lang.js +3 -2
  31. package/es/calendar/index.d.ts +5 -5
  32. package/es/carousel/index.d.ts +3 -3
  33. package/es/checkbox/checkbox.d.ts +3 -3
  34. package/es/collapse/collapse-item.d.ts +5 -5
  35. package/es/collapse/index.d.ts +3 -3
  36. package/es/components.d.ts +1 -0
  37. package/es/config-provider/index.d.ts +21 -21
  38. package/es/date-picker/index.d.ts +14 -14
  39. package/es/date-picker/picker.vue.d.ts +2 -2
  40. package/es/date-picker/range-picker.vue.d.ts +2 -2
  41. package/es/descriptions/index.d.ts +24 -24
  42. package/es/drawer/index.d.ts +16 -15
  43. package/es/dropdown/index.d.ts +15 -15
  44. package/es/form/form-item.vue_vue_type_script_setup_true_lang.js +3 -3
  45. package/es/form/index.d.ts +3 -3
  46. package/es/grid/grid-col.vue_vue_type_script_setup_true_lang.js +2 -2
  47. package/es/grid/grid.vue_vue_type_script_setup_true_lang.js +10 -10
  48. package/es/icon/icon-menu/icon-menu.js +5 -0
  49. package/es/icon/icon-menu/icon-menu.vue_vue_type_script_setup_true_lang.js +52 -0
  50. package/es/icon/icon-menu/index.js +9 -0
  51. package/es/index.css +133 -187
  52. package/es/index.d.ts +4 -2
  53. package/es/index.js +3 -2
  54. package/es/index.scss +1 -0
  55. package/es/input/index.d.ts +7 -7
  56. package/es/json-form/index.d.ts +9 -9
  57. package/es/json-form/json-form-item.vue_vue_type_script_setup_true_lang.js +1 -1
  58. package/es/json-form/json-form.vue.d.ts +3 -3
  59. package/es/layout/content.vue.d.ts +2 -2
  60. package/es/layout/content.vue_vue_type_script_setup_true_lang.js +8 -3
  61. package/es/layout/context.d.ts +12 -9
  62. package/es/layout/context.js +11 -3
  63. package/es/layout/footer.vue.d.ts +2 -2
  64. package/es/layout/footer.vue_vue_type_script_setup_true_lang.js +8 -3
  65. package/es/layout/header.vue.d.ts +3 -30
  66. package/es/layout/header.vue_vue_type_script_setup_true_lang.js +9 -339
  67. package/es/layout/hooks/use-has-sider.d.ts +2 -0
  68. package/es/layout/hooks/use-has-sider.js +38 -0
  69. package/es/layout/index.d.ts +120 -371
  70. package/es/layout/index.js +2 -2
  71. package/es/layout/interface.d.ts +16 -46
  72. package/es/layout/layout.vue.d.ts +4 -2
  73. package/es/layout/layout.vue_vue_type_script_setup_true_lang.js +38 -14
  74. package/es/layout/sider.vue.d.ts +68 -178
  75. package/es/layout/sider.vue_vue_type_script_setup_true_lang.js +243 -363
  76. package/es/layout/style/index.css +128 -186
  77. package/es/layout/style/index.scss +146 -234
  78. package/es/layout/style/token.scss +46 -26
  79. package/es/link/index.d.ts +6 -6
  80. package/es/list/index.d.ts +18 -18
  81. package/es/menu/base-menu.vue.d.ts +1 -1
  82. package/es/menu/base-menu.vue_vue_type_script_setup_true_lang.js +14 -14
  83. package/es/menu/item.d.ts +1 -1
  84. package/es/menu/menu.d.ts +12 -12
  85. package/es/menu/menu.js +3 -3
  86. package/es/modal/index.d.ts +15 -15
  87. package/es/popconfirm/index.d.ts +12 -12
  88. package/es/popover/index.d.ts +12 -12
  89. package/es/progress/index.d.ts +6 -6
  90. package/es/qr-code/index.d.ts +3 -3
  91. package/es/radio/radio.d.ts +3 -3
  92. package/es/resize-box/resize-box.vue_vue_type_script_setup_true_lang.js +7 -7
  93. package/es/result/index.d.ts +3 -3
  94. package/es/scrollbar/style/index.css +1 -1
  95. package/es/scrollbar/style/index.scss +4 -1
  96. package/es/sd-vue.js +3 -1
  97. package/es/select/select.d.ts +17 -17
  98. package/es/slider/index.d.ts +3 -3
  99. package/es/split/split.vue_vue_type_script_setup_true_lang.js +6 -6
  100. package/es/steps/index.d.ts +6 -6
  101. package/es/tabs/index.d.ts +6 -6
  102. package/es/tag/index.d.ts +6 -6
  103. package/es/textarea/textarea.vue_vue_type_script_setup_true_lang.js +2 -2
  104. package/es/theme-provider/index.d.ts +9 -9
  105. package/es/time-picker/index.d.ts +6 -6
  106. package/es/timeline/index.d.ts +3 -3
  107. package/es/timeline/timeline.d.ts +1 -1
  108. package/es/tooltip/index.d.ts +3 -3
  109. package/es/tour/index.d.ts +3 -3
  110. package/es/tour/tour.vue_vue_type_script_setup_true_lang.js +6 -6
  111. package/es/tree/node-switcher.vue.d.ts +1 -1
  112. package/es/tree/tree.vue_vue_type_script_setup_true_lang.js +23 -23
  113. package/json/vetur-attributes.json +27 -153
  114. package/json/vetur-tags.json +13 -43
  115. package/json/web-types.json +43 -293
  116. package/package.json +10 -10
  117. package/es/calendar/hooks/use-calendar-theme.d.ts +0 -4
  118. package/es/layout/utils.d.ts +0 -1
  119. package/es/layout/utils.js +0 -11
@@ -1,447 +1,327 @@
1
+ import { configProviderInjectionKey } from "../config-provider/context.js";
1
2
  import { _objectSpread2 } from "../_virtual/_@oxc-project_runtime@0.133.0/helpers/esm/objectSpread2.js";
2
3
  import { getPrefixCls } from "../_utils/global-config.js";
3
- import { isNumber } from "../_utils/is.js";
4
- import { off, on } from "../_utils/dom.js";
5
- import useMergeState from "../_hooks/use-merge-state.js";
6
- import { KEYBOARD_KEY } from "../_utils/keyboard.js";
7
- import usePopupManager from "../_hooks/use-popup-manager.js";
4
+ import { useScrollbar } from "../_hooks/use-scrollbar.js";
5
+ import Scrollbar from "../scrollbar/index.js";
8
6
  import IconRight from "../icon/icon-right/index.js";
7
+ import { useThemeMode } from "../_hooks/use-theme-mode.js";
9
8
  import IconLeft from "../icon/icon-left/index.js";
10
- import { LayoutSiderInjectionKey, SiderInjectionKey } from "./context.js";
11
- import { useResponsive } from "../_hooks/use-responsive.js";
12
- import ResizeBox from "../resize-box/index.js";
13
- import { SIDER_LOCATIONS } from "./utils.js";
14
- import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, inject, mergeProps, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, reactive, renderSlot, resolveDynamicComponent, toRefs, unref, watch, withCtx } from "vue";
9
+ import Drawer from "../drawer/index.js";
10
+ import { LayoutContextInjectionKey, SiderContextInjectionKey } from "./context.js";
11
+ import IconMenu from "../icon/icon-menu/index.js";
12
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, inject, mergeProps, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, reactive, ref, renderSlot, resolveDynamicComponent, toRef, unref, watch, withCtx } from "vue";
15
13
  //#region components/layout/sider.vue?vue&type=script&setup=true&lang.ts
16
- var _hoisted_1 = { key: 0 };
17
- var _hoisted_2 = { key: 1 };
18
14
  var sider_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent(_objectSpread2(_objectSpread2({}, { name: "LayoutSider" }), {}, {
19
15
  __name: "sider",
20
16
  props: {
21
17
  /**
22
- * @zh 主题颜色
23
- * @en Theme
18
+ * @zh 是否可折叠
19
+ * @en Whether can be collapsed
24
20
  */
25
- theme: {
26
- type: String,
27
- default: "light"
28
- },
29
- /**
30
- * @zh 抽屉是否可见
31
- * @en Whether navigation drawer is visible
32
- */
33
- modelValue: {
34
- type: Boolean,
35
- default: void 0
36
- },
37
- /**
38
- * @zh 默认是否显示抽屉
39
- * @en Whether navigation drawer is visible by default
40
- */
41
- defaultVisible: {
21
+ collapsible: {
42
22
  type: Boolean,
43
23
  default: false
44
24
  },
45
25
  /**
46
- * @zh 当前收起状态
47
- * @en Current collapsed state
26
+ * @zh 当前折叠状态(受控)
27
+ * @en Current collapsed state (controlled)
48
28
  */
49
29
  collapsed: {
50
30
  type: Boolean,
51
31
  default: void 0
52
32
  },
53
33
  /**
54
- * @zh 默认的收起状态
55
- * @en The default collapsed state
34
+ * @zh 默认折叠状态(非受控)
35
+ * @en Default collapsed state (uncontrolled)
56
36
  */
57
37
  defaultCollapsed: {
58
38
  type: Boolean,
59
39
  default: false
60
40
  },
61
41
  /**
62
- * @zh 是否可收起
63
- * @en Whether is collapsible
42
+ * @zh 折叠时是否反转箭头方向
43
+ * @en Whether to reverse the arrow direction when collapsed
64
44
  */
65
- collapsible: { type: Boolean },
45
+ reverseArrow: {
46
+ type: Boolean,
47
+ default: false
48
+ },
66
49
  /**
67
- * @zh 是否启用 rail 模式
68
- * @en Whether to enable rail mode
50
+ * @zh collapsedWidth 0 时零宽触发器的自定义样式
51
+ * @en Custom style of zero-width trigger when collapsedWidth is 0
69
52
  */
70
- rail: {
71
- type: Boolean,
53
+ zeroWidthTriggerStyle: {
54
+ type: Object,
72
55
  default: void 0
73
56
  },
74
57
  /**
75
- * @zh 默认是否启用 rail 模式
76
- * @en Whether to enable rail mode by default
58
+ * @zh 是否隐藏内置折叠触发器,配合受控的 collapsed 自行控制折叠
59
+ * @en Whether to hide the built-in collapse trigger, control collapse via collapsed
77
60
  */
78
- defaultRail: {
61
+ hideTrigger: {
79
62
  type: Boolean,
80
63
  default: false
81
64
  },
82
65
  /**
83
- * @zh rail 模式下的宽度
84
- * @en Width in rail mode
85
- */
86
- railWidth: {
87
- type: [Number, String],
88
- default: 56
89
- },
90
- /**
91
- * @zh 是否在 hover 时临时展开 rail
92
- * @en Whether to expand rail on hover
93
- */
94
- expandOnHover: { type: Boolean },
95
- /**
96
- * @zh 是否禁用响应式宽度监听
97
- * @en Whether to disable resize watcher
98
- */
99
- disableResizeWatcher: { type: Boolean },
100
- /**
101
- * @zh 是否禁用路由切换时自动关闭临时抽屉
102
- * @en Whether to disable route watcher
103
- */
104
- disableRouteWatcher: { type: Boolean },
105
- /**
106
- * @zh 宽度
107
- * @en Width
66
+ * @zh 展开时的宽度
67
+ * @en Width when expanded
108
68
  */
109
69
  width: {
110
70
  type: [Number, String],
111
71
  default: 200
112
72
  },
113
73
  /**
114
- * @zh 顶部或底部抽屉的高度
115
- * @en Height of top or bottom drawer
116
- */
117
- height: {
118
- type: [Number, String],
119
- default: void 0
120
- },
121
- /**
122
- * @zh 收缩宽度
123
- * @en Collapsed width
74
+ * @zh 折叠时的宽度
75
+ * @en Width when collapsed
124
76
  */
125
77
  collapsedWidth: {
126
- type: Number,
78
+ type: [Number, String],
127
79
  default: 48
128
80
  },
129
81
  /**
130
- * @zh 是否为临时抽屉模式
131
- * @en Whether to use temporary drawer mode
132
- */
133
- temporary: { type: Boolean },
134
- /**
135
- * @zh 是否始终显示抽屉
136
- * @en Whether to always keep the drawer active
82
+ * @zh 响应式断点,命中断点时自动折叠
83
+ * @en Responsive breakpoint, auto collapse when matched
137
84
  */
138
- permanent: { type: Boolean },
139
- /**
140
- * @zh 临时抽屉模式下点击遮罩后是否保持显示
141
- * @en Whether temporary drawer should stay open after scrim click
142
- */
143
- persistent: { type: Boolean },
144
- /**
145
- * @zh 是否显示遮罩层
146
- * @en Whether to show the temporary drawer mask
147
- */
148
- mask: {
149
- type: Boolean,
150
- default: true
85
+ breakpoint: {
86
+ type: String,
87
+ default: void 0
151
88
  },
152
89
  /**
153
- * @zh 点击遮罩层是否可以关闭抽屉
154
- * @en Whether the drawer can be closed by clicking the mask
90
+ * @zh 主题颜色,未设置时跟随 ConfigProvider 的 themeMode
91
+ * @en Theme color, follows ConfigProvider's themeMode when not set
155
92
  */
156
- maskClosable: {
157
- type: Boolean,
158
- default: true
93
+ theme: {
94
+ type: String,
95
+ default: void 0
159
96
  },
160
97
  /**
161
- * @zh 是否支持通过 ESC 键关闭临时抽屉
162
- * @en Whether temporary drawer can be closed with ESC
98
+ * @zh 滚动配置,默认使用组件库 Scrollbar;设为 false 使用原生 overflow:auto,传对象可配置 Scrollbar
99
+ * @en Scroll config, use the component Scrollbar by default; set to false for native overflow:auto, pass an object to configure Scrollbar
163
100
  */
164
- escToClose: {
165
- type: Boolean,
166
- default: true
101
+ scrollbar: {
102
+ type: [Object, Boolean],
103
+ default: void 0
167
104
  },
168
105
  /**
169
- * @zh 抽屉停靠位置
170
- * @en Navigation drawer location
106
+ * @zh 临时模式:使用 Drawer 渲染悬浮菜单,由 collapsed 控制开合(collapsed=true 关闭,false 展开)
107
+ * @en Temporary mode: render as a floating Drawer, opened/closed via collapsed (collapsed=true closes, false opens)
171
108
  */
172
- location: {
173
- type: String,
174
- default: "start",
175
- validator: (value) => SIDER_LOCATIONS.includes(value)
109
+ temporary: {
110
+ type: Boolean,
111
+ default: false
176
112
  },
177
113
  /**
178
- * @zh 是否启用浮动模式
179
- * @en Whether to enable floating mode
180
- */
181
- floating: { type: Boolean },
182
- /**
183
- * @zh 是否启用粘性定位
184
- * @en Whether to enable sticky mode
185
- */
186
- sticky: { type: Boolean },
187
- /**
188
- * @zh 翻转折叠提示箭头的方向,当 Sider 在右边时可以使用
189
- * @en Flip and fold the direction of the hint arrow, which can be used when Sider is on the right
114
+ * @zh temporary 模式下透传给 Drawer 的配置(仅 temporary=true 时生效)
115
+ * @en Drawer passthrough config (only effective when temporary=true)
190
116
  */
191
- reverseArrow: { type: Boolean },
192
- /**
193
- * @zh 触发响应式布局的断点, 详见[响应式栅格](/vue/component/grid)
194
- * @en Trigger breakpoints for responsive layout, see [Responsive Grid](/vue/component/grid) for details
195
- */
196
- breakpoint: { type: String },
197
- /**
198
- * @zh 可以用 ResizeBox 替换原生的 `aside` 标签,这个参数即 ResizeBox的 `directions` 参数。详情请看 [ResizeBox](/vue/component/resize-box)。
199
- * @en Can replace the native `aside` tag with ResizeBox. This is the `directions` parameter of ResizeBox. For details, please see [ResizeBox](/vue/component/resize-box)
200
- */
201
- resizeDirections: {
202
- type: Array,
117
+ drawerProps: {
118
+ type: Object,
203
119
  default: void 0
204
- },
205
- /**
206
- * @zh 隐藏底部折叠触发器
207
- * @en Whether to hide the bottom fold trigger
208
- */
209
- hideTrigger: { type: Boolean }
120
+ }
210
121
  },
211
- emits: [
212
- "update:modelValue",
213
- "update:rail",
214
- "collapse",
215
- "update:collapsed",
216
- "breakpoint"
217
- ],
122
+ emits: ["collapse", "breakpoint"],
218
123
  setup(__props, { emit: __emit }) {
219
- const generateId = (() => {
220
- let i = 0;
221
- return (prefix = "") => {
222
- i += 1;
223
- return `${prefix}${i}`;
224
- };
225
- })();
124
+ var _props$collapsed;
125
+ let siderUuid = 0;
126
+ const generateId = (prefix = "") => {
127
+ siderUuid += 1;
128
+ return `${prefix}${siderUuid}`;
129
+ };
226
130
  const props = __props;
227
131
  const emit = __emit;
228
- /**
229
- * @zh 自定义底部折叠触发器
230
- * @en Custom bottom folding trigger
231
- * @slot trigger
232
- * @binding {boolean} collapsed
233
- */
234
- const { theme, modelValue, defaultVisible, collapsed, defaultCollapsed, collapsible, rail, defaultRail, expandOnHover, disableResizeWatcher, disableRouteWatcher, hideTrigger, breakpoint, height, collapsedWidth, mask, maskClosable, escToClose, location, floating, permanent, persistent, sticky, temporary, resizeDirections } = toRefs(props);
235
132
  const prefixCls = getPrefixCls("layout-sider");
236
- const [localCollapsed, setLocalCollapsed] = useMergeState(defaultCollapsed.value, reactive({ value: collapsed }));
237
- const [drawerVisible, setDrawerVisible] = useMergeState(defaultVisible.value, reactive({ value: modelValue }));
238
- const [railCollapsed, setRailCollapsed] = useMergeState(defaultRail.value, reactive({ value: rail }));
239
- const physicalLocation = computed(() => {
240
- if (location.value === "start") return "left";
241
- if (location.value === "end") return "right";
242
- return location.value;
133
+ const dimensionMaxMap = {
134
+ xs: "479.98px",
135
+ sm: "575.98px",
136
+ md: "767.98px",
137
+ lg: "991.98px",
138
+ xl: "1199.98px",
139
+ xxl: "1599.98px",
140
+ xxxl: "1839.98px"
141
+ };
142
+ const isNumeric = (val) => !Number.isNaN(Number.parseFloat(val)) && Number.isFinite(Number(val));
143
+ const toSiderWidth = (val) => isNumeric(val) ? `${val}px` : String(val);
144
+ const isControlled = computed(() => props.collapsed !== void 0);
145
+ const collapsedState = ref((_props$collapsed = props.collapsed) !== null && _props$collapsed !== void 0 ? _props$collapsed : props.defaultCollapsed);
146
+ watch(() => props.collapsed, (val) => {
147
+ if (val !== void 0) collapsedState.value = val;
148
+ });
149
+ const mergedCollapsed = computed(() => isControlled.value ? props.collapsed : collapsedState.value);
150
+ const handleSetCollapsed = (value, type) => {
151
+ if (!isControlled.value) collapsedState.value = value;
152
+ emit("collapse", value, type);
153
+ };
154
+ const toggle = () => {
155
+ handleSetCollapsed(!mergedCollapsed.value, "clickTrigger");
156
+ };
157
+ const below = ref(false);
158
+ const setupResponsive = () => {
159
+ const { breakpoint } = props;
160
+ if (typeof window === "undefined" || !window.matchMedia || !breakpoint) return;
161
+ const max = dimensionMaxMap[breakpoint];
162
+ if (!max) return;
163
+ const mql = window.matchMedia(`screen and (max-width: ${max})`);
164
+ const handler = (m) => {
165
+ below.value = m.matches;
166
+ emit("breakpoint", m.matches);
167
+ if (mergedCollapsed.value !== m.matches) handleSetCollapsed(m.matches, "responsive");
168
+ };
169
+ if (typeof mql.addEventListener === "function") mql.addEventListener("change", handler);
170
+ else if (typeof mql.addListener === "function") mql.addListener(handler);
171
+ handler(mql);
172
+ return () => {
173
+ if (typeof mql.removeEventListener === "function") mql.removeEventListener("change", handler);
174
+ else if (typeof mql.removeListener === "function") mql.removeListener(handler);
175
+ };
176
+ };
177
+ let cleanupResponsive;
178
+ onMounted(() => {
179
+ cleanupResponsive = setupResponsive();
243
180
  });
244
- const isHorizontal = computed(() => ["left", "right"].includes(physicalLocation.value));
245
- const isTemporary = computed(() => !permanent.value && !!temporary.value);
246
- const isDrawerActive = computed(() => !!permanent.value || drawerVisible.value);
247
- const temporaryVisible = computed(() => isTemporary.value && isDrawerActive.value);
248
- const railModeEnabled = computed(() => {
249
- var _rail$value;
250
- return ((_rail$value = rail === null || rail === void 0 ? void 0 : rail.value) !== null && _rail$value !== void 0 ? _rail$value : defaultRail.value) || railCollapsed.value;
181
+ watch(() => props.breakpoint, () => {
182
+ cleanupResponsive === null || cleanupResponsive === void 0 || cleanupResponsive();
183
+ cleanupResponsive = setupResponsive();
251
184
  });
252
- const { zIndex } = usePopupManager("dialog", { visible: temporaryVisible });
253
- const componentTag = computed(() => (resizeDirections === null || resizeDirections === void 0 ? void 0 : resizeDirections.value) && !isTemporary.value && isHorizontal.value ? ResizeBox : "div");
254
- const resizeDirectionsProps = computed(() => componentTag.value === ResizeBox && (resizeDirections === null || resizeDirections === void 0 ? void 0 : resizeDirections.value) ? { directions: resizeDirections.value } : {});
255
- const showTrigger = computed(() => collapsible.value && !hideTrigger.value && !isTemporary.value && isHorizontal.value);
256
- const siderSize = computed(() => {
257
- let rawSize = props.width;
258
- if (localCollapsed.value) rawSize = props.collapsedWidth;
259
- else if (railCollapsed.value) rawSize = props.railWidth;
260
- return isNumber(rawSize) ? `${rawSize}px` : String(rawSize);
185
+ onUnmounted(() => {
186
+ cleanupResponsive === null || cleanupResponsive === void 0 || cleanupResponsive();
261
187
  });
262
- const crossAxisSize = computed(() => {
263
- var _height$value;
264
- const rawSize = (_height$value = height === null || height === void 0 ? void 0 : height.value) !== null && _height$value !== void 0 ? _height$value : props.width;
265
- return isNumber(rawSize) ? `${rawSize}px` : String(rawSize);
188
+ const { siderHook } = inject(LayoutContextInjectionKey, { siderHook: {
189
+ addSider: () => {},
190
+ removeSider: () => {}
191
+ } });
192
+ let siderId = "";
193
+ onMounted(() => {
194
+ siderId = generateId("sd-sider-");
195
+ siderHook.addSider(siderId);
266
196
  });
267
- const siderStyles = computed(() => {
268
- const style = isHorizontal.value ? { width: siderSize.value } : { height: crossAxisSize.value };
269
- if (!isTemporary.value) {
270
- if (sticky.value && isHorizontal.value) return _objectSpread2(_objectSpread2({}, style), {}, {
271
- position: "sticky",
272
- top: "0",
273
- alignSelf: "flex-start",
274
- maxHeight: "100vh"
275
- });
276
- return style;
277
- }
278
- return _objectSpread2(_objectSpread2({}, style), {}, {
279
- [physicalLocation.value]: 0,
280
- zIndex: zIndex.value || void 0
281
- });
197
+ onUnmounted(() => {
198
+ siderHook.removeSider(siderId);
282
199
  });
283
- const triggerStyles = computed(() => ({ width: siderSize.value }));
284
- const showMask = computed(() => isTemporary.value && isDrawerActive.value && mask.value);
285
- const maskStyles = computed(() => {
286
- const baseStyle = { zIndex: zIndex.value ? zIndex.value - 1 : void 0 };
287
- if (!showMask.value) return baseStyle;
288
- if (physicalLocation.value === "left") return _objectSpread2(_objectSpread2({}, baseStyle), {}, {
289
- top: 0,
290
- right: 0,
291
- bottom: 0,
292
- left: siderSize.value
293
- });
294
- if (physicalLocation.value === "right") return _objectSpread2(_objectSpread2({}, baseStyle), {}, {
295
- top: 0,
296
- right: siderSize.value,
297
- bottom: 0,
298
- left: 0
299
- });
300
- if (physicalLocation.value === "top") return _objectSpread2(_objectSpread2({}, baseStyle), {}, {
301
- top: crossAxisSize.value,
302
- right: 0,
303
- bottom: 0,
304
- left: 0
305
- });
306
- return _objectSpread2(_objectSpread2({}, baseStyle), {}, {
307
- top: 0,
308
- right: 0,
309
- bottom: crossAxisSize.value,
310
- left: 0
311
- });
200
+ const configProvider = inject(configProviderInjectionKey, void 0);
201
+ const rtl = computed(() => {
202
+ var _configProvider$rtl;
203
+ return (_configProvider$rtl = configProvider === null || configProvider === void 0 ? void 0 : configProvider.rtl) !== null && _configProvider$rtl !== void 0 ? _configProvider$rtl : false;
312
204
  });
313
- const classNames = computed(() => [prefixCls, {
314
- [`${prefixCls}-light`]: theme.value === "light",
315
- [`${prefixCls}-has-trigger`]: showTrigger.value,
316
- [`${prefixCls}-collapsed`]: localCollapsed.value,
317
- [`${prefixCls}-temporary`]: isTemporary.value,
318
- [`${prefixCls}-persistent`]: persistent.value,
319
- [`${prefixCls}-active`]: isDrawerActive.value,
320
- [`${prefixCls}-rail`]: railCollapsed.value,
321
- [`${prefixCls}-expand-on-hover`]: expandOnHover.value,
322
- [`${prefixCls}-floating`]: floating.value,
323
- [`${prefixCls}-sticky`]: sticky.value,
324
- [`${prefixCls}-${physicalLocation.value}`]: true
325
- }]);
326
- const triggerClassNames = computed(() => [`${prefixCls}-trigger`, { [`${prefixCls}-trigger-light`]: theme.value === "light" }]);
327
- const setVisibleState = (nextVisible) => {
328
- setDrawerVisible(nextVisible);
329
- emit("update:modelValue", nextVisible);
330
- };
331
- const setRailState = (nextRail) => {
332
- setRailCollapsed(nextRail);
333
- emit("update:rail", nextRail);
334
- };
335
- const toggleTrigger = () => {
336
- const nextCollapsed = !localCollapsed.value;
337
- setLocalCollapsed(nextCollapsed);
338
- emit("update:collapsed", nextCollapsed);
339
- emit("collapse", nextCollapsed, "clickTrigger");
340
- };
341
- const handleMaskClick = () => {
342
- if (!maskClosable.value || persistent.value) return;
343
- setVisibleState(false);
344
- };
345
- const handleGlobalKeyDown = (event) => {
346
- if (event.key === KEYBOARD_KEY.ESC && escToClose.value && isTemporary.value && !persistent.value) setVisibleState(false);
347
- };
348
- const handleRouteChange = () => {
349
- if (isTemporary.value && isDrawerActive.value && !disableRouteWatcher.value) setVisibleState(false);
350
- };
351
- const handleMouseEnter = () => {
352
- if (expandOnHover.value && railModeEnabled.value && railCollapsed.value) setRailState(false);
353
- };
354
- const handleMouseLeave = () => {
355
- if (expandOnHover.value && railModeEnabled.value && !railCollapsed.value) setRailState(true);
356
- };
357
- useResponsive(breakpoint, (checked) => {
358
- if (disableResizeWatcher.value) return;
359
- const nextCollapsed = !checked;
360
- if (nextCollapsed !== localCollapsed.value) {
361
- setLocalCollapsed(nextCollapsed);
362
- emit("update:collapsed", nextCollapsed);
363
- emit("collapse", nextCollapsed, "responsive");
364
- emit("breakpoint", nextCollapsed);
365
- }
205
+ const rootEl = ref(null);
206
+ const detectedThemeMode = useThemeMode(rootEl);
207
+ const mergedTheme = computed(() => {
208
+ var _props$theme;
209
+ return (_props$theme = props.theme) !== null && _props$theme !== void 0 ? _props$theme : detectedThemeMode.value;
366
210
  });
367
- watch(() => props.permanent, (nextPermanent) => {
368
- if (nextPermanent) setVisibleState(true);
211
+ const reverseIcon = computed(() => rtl.value === !props.reverseArrow);
212
+ const defaultTriggerComponent = computed(() => {
213
+ if (props.temporary) return IconMenu;
214
+ const expandedIcon = reverseIcon.value ? IconRight : IconLeft;
215
+ const collapsedIcon = reverseIcon.value ? IconLeft : IconRight;
216
+ return mergedCollapsed.value ? collapsedIcon : expandedIcon;
369
217
  });
370
- watch([
371
- isTemporary,
372
- isDrawerActive,
373
- escToClose
374
- ], ([nextTemporary, nextActive, nextEsc]) => {
375
- off(document.documentElement, "keydown", handleGlobalKeyDown);
376
- if (nextTemporary && nextActive && nextEsc) on(document.documentElement, "keydown", handleGlobalKeyDown);
377
- }, { immediate: true });
378
- watch([
379
- isTemporary,
380
- isDrawerActive,
381
- disableRouteWatcher
382
- ], ([nextTemporary, nextActive, nextDisableRouteWatcher]) => {
383
- off(window, "popstate", handleRouteChange);
384
- off(window, "hashchange", handleRouteChange);
385
- if (nextTemporary && nextActive && !nextDisableRouteWatcher) {
386
- on(window, "popstate", handleRouteChange);
387
- on(window, "hashchange", handleRouteChange);
218
+ const rawWidth = computed(() => mergedCollapsed.value ? props.collapsedWidth : props.width);
219
+ const siderWidth = computed(() => toSiderWidth(rawWidth.value));
220
+ const hasZeroWidth = computed(() => Number.parseFloat(String(props.collapsedWidth || 0)) === 0);
221
+ const renderTrigger = computed(() => {
222
+ if (props.temporary) return !props.hideTrigger;
223
+ return (props.collapsible || below.value && hasZeroWidth.value) && !props.hideTrigger;
224
+ });
225
+ const { scrollbarProps } = useScrollbar(toRef(props, "scrollbar"));
226
+ const useNativeScrollbar = computed(() => props.scrollbar === false);
227
+ const divStyle = computed(() => {
228
+ if (props.temporary) return {
229
+ flex: "0 0 auto",
230
+ width: "auto"
231
+ };
232
+ return {
233
+ flex: `0 0 ${siderWidth.value}`,
234
+ maxWidth: siderWidth.value,
235
+ minWidth: siderWidth.value,
236
+ width: siderWidth.value
237
+ };
238
+ });
239
+ const siderCls = computed(() => [
240
+ prefixCls,
241
+ `${prefixCls}-${mergedTheme.value}`,
242
+ {
243
+ [`${prefixCls}-collapsed`]: mergedCollapsed.value,
244
+ [`${prefixCls}-has-trigger`]: props.collapsible && !props.hideTrigger && !hasZeroWidth.value,
245
+ [`${prefixCls}-below`]: below.value,
246
+ [`${prefixCls}-zero-width`]: Number.parseFloat(siderWidth.value) === 0,
247
+ [`${prefixCls}-temporary`]: props.temporary
388
248
  }
389
- }, { immediate: true });
390
- const uniqueId = generateId("__arco_layout_sider");
391
- const siderHook = inject(LayoutSiderInjectionKey, void 0);
392
- onMounted(() => {
393
- var _siderHook$onSiderMou;
394
- siderHook === null || siderHook === void 0 || (_siderHook$onSiderMou = siderHook.onSiderMount) === null || _siderHook$onSiderMou === void 0 || _siderHook$onSiderMou.call(siderHook, uniqueId);
249
+ ]);
250
+ const mergedDrawerProps = computed(() => _objectSpread2({
251
+ placement: "left",
252
+ width: siderWidth.value,
253
+ header: false,
254
+ footer: false
255
+ }, props.drawerProps));
256
+ const onDrawerVisibleChange = (visible) => {
257
+ if (visible !== !mergedCollapsed.value) handleSetCollapsed(!visible, "clickTrigger");
258
+ };
259
+ const siderContext = reactive({
260
+ siderCollapsed: mergedCollapsed.value,
261
+ theme: mergedTheme.value
395
262
  });
396
- onUnmounted(() => {
397
- var _siderHook$onSiderUnM;
398
- off(document.documentElement, "keydown", handleGlobalKeyDown);
399
- off(window, "popstate", handleRouteChange);
400
- off(window, "hashchange", handleRouteChange);
401
- siderHook === null || siderHook === void 0 || (_siderHook$onSiderUnM = siderHook.onSiderUnMount) === null || _siderHook$onSiderUnM === void 0 || _siderHook$onSiderUnM.call(siderHook, uniqueId);
263
+ watch(mergedCollapsed, (val) => {
264
+ siderContext.siderCollapsed = val;
265
+ });
266
+ watch(mergedTheme, (val) => {
267
+ siderContext.theme = val;
402
268
  });
403
- provide(SiderInjectionKey, reactive({
404
- theme,
405
- collapsed: computed(() => localCollapsed.value || railCollapsed.value),
406
- collapsedWidth
407
- }));
269
+ provide(SiderContextInjectionKey, siderContext);
408
270
  return (_ctx, _cache) => {
409
- return openBlock(), createBlock(resolveDynamicComponent(componentTag.value), mergeProps({
410
- class: classNames.value,
411
- style: siderStyles.value
412
- }, resizeDirectionsProps.value, {
413
- onMouseenter: handleMouseEnter,
414
- onMouseleave: handleMouseLeave
271
+ return openBlock(), createElementBlock("aside", {
272
+ ref_key: "rootEl",
273
+ ref: rootEl,
274
+ class: normalizeClass(siderCls.value),
275
+ style: normalizeStyle(divStyle.value)
276
+ }, [__props.temporary ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createVNode(unref(Drawer), mergeProps(mergedDrawerProps.value, {
277
+ visible: !mergedCollapsed.value,
278
+ "onUpdate:visible": onDrawerVisibleChange
415
279
  }), {
416
- default: withCtx(() => [
417
- showMask.value ? (openBlock(), createElementBlock("div", {
418
- key: 0,
419
- class: normalizeClass(`${unref(prefixCls)}-mask`),
420
- style: normalizeStyle(maskStyles.value),
421
- onClick: handleMaskClick
422
- }, null, 6)) : createCommentVNode("", true),
423
- _ctx.$slots.image ? (openBlock(), createElementBlock("div", {
424
- key: 1,
425
- class: normalizeClass(`${unref(prefixCls)}-image`)
426
- }, [renderSlot(_ctx.$slots, "image")], 2)) : createCommentVNode("", true),
427
- _ctx.$slots.prepend ? (openBlock(), createElementBlock("div", {
428
- key: 2,
429
- class: normalizeClass(`${unref(prefixCls)}-prepend`)
430
- }, [renderSlot(_ctx.$slots, "prepend")], 2)) : createCommentVNode("", true),
431
- createElementVNode("div", { class: normalizeClass(`${unref(prefixCls)}-children`) }, [renderSlot(_ctx.$slots, "default")], 2),
432
- _ctx.$slots.append ? (openBlock(), createElementBlock("div", {
433
- key: 3,
434
- class: normalizeClass(`${unref(prefixCls)}-append`)
435
- }, [renderSlot(_ctx.$slots, "append")], 2)) : createCommentVNode("", true),
436
- showTrigger.value ? (openBlock(), createElementBlock("div", {
437
- key: 4,
438
- class: normalizeClass(triggerClassNames.value),
439
- style: normalizeStyle(triggerStyles.value),
440
- onClick: toggleTrigger
441
- }, [renderSlot(_ctx.$slots, "trigger", { collapsed: unref(localCollapsed) }, () => [!__props.reverseArrow ? (openBlock(), createElementBlock("div", _hoisted_1, [!unref(localCollapsed) ? (openBlock(), createBlock(unref(IconLeft), { key: 0 })) : (openBlock(), createBlock(unref(IconRight), { key: 1 }))])) : (openBlock(), createElementBlock("div", _hoisted_2, [unref(localCollapsed) ? (openBlock(), createBlock(unref(IconLeft), { key: 0 })) : (openBlock(), createBlock(unref(IconRight), { key: 1 }))]))])], 6)) : createCommentVNode("", true)
442
- ]),
280
+ default: withCtx(() => [_ctx.$slots.header ? (openBlock(), createElementBlock("div", {
281
+ key: 0,
282
+ class: normalizeClass(`${unref(prefixCls)}-header`)
283
+ }, [renderSlot(_ctx.$slots, "header")], 2)) : createCommentVNode("", true), useNativeScrollbar.value ? (openBlock(), createElementBlock("div", {
284
+ key: 1,
285
+ class: normalizeClass([`${unref(prefixCls)}-children`, `${unref(prefixCls)}-children-scroll`])
286
+ }, [renderSlot(_ctx.$slots, "default")], 2)) : (openBlock(), createBlock(unref(Scrollbar), mergeProps({
287
+ key: 2,
288
+ "outer-class": `${unref(prefixCls)}-children`
289
+ }, unref(scrollbarProps)), {
290
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
291
+ _: 3
292
+ }, 16, ["outer-class"]))]),
443
293
  _: 3
444
- }, 16, ["class", "style"]);
294
+ }, 16, ["visible"]), renderTrigger.value ? (openBlock(), createElementBlock("span", {
295
+ key: 0,
296
+ class: normalizeClass(`${unref(prefixCls)}-temporary-trigger`),
297
+ onClick: toggle
298
+ }, [renderSlot(_ctx.$slots, "trigger", {}, () => [createVNode(unref(IconMenu))])], 2)) : createCommentVNode("", true)], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
299
+ _ctx.$slots.header ? (openBlock(), createElementBlock("div", {
300
+ key: 0,
301
+ class: normalizeClass(`${unref(prefixCls)}-header`)
302
+ }, [renderSlot(_ctx.$slots, "header")], 2)) : createCommentVNode("", true),
303
+ useNativeScrollbar.value ? (openBlock(), createElementBlock("div", {
304
+ key: 1,
305
+ class: normalizeClass([`${unref(prefixCls)}-children`, `${unref(prefixCls)}-children-scroll`])
306
+ }, [renderSlot(_ctx.$slots, "default")], 2)) : (openBlock(), createBlock(unref(Scrollbar), mergeProps({
307
+ key: 2,
308
+ "outer-class": `${unref(prefixCls)}-children`
309
+ }, unref(scrollbarProps)), {
310
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
311
+ _: 3
312
+ }, 16, ["outer-class"])),
313
+ renderTrigger.value ? (openBlock(), createElementBlock(Fragment, { key: 3 }, [hasZeroWidth.value ? (openBlock(), createElementBlock("span", {
314
+ key: 0,
315
+ class: normalizeClass([`${unref(prefixCls)}-zero-width-trigger`, `${unref(prefixCls)}-zero-width-trigger-${__props.reverseArrow ? "right" : "left"}`]),
316
+ style: normalizeStyle(__props.zeroWidthTriggerStyle),
317
+ onClick: toggle
318
+ }, [renderSlot(_ctx.$slots, "trigger", {}, () => [createVNode(unref(IconMenu))])], 6)) : (openBlock(), createElementBlock("div", {
319
+ key: 1,
320
+ class: normalizeClass(`${unref(prefixCls)}-trigger`),
321
+ style: normalizeStyle({ width: siderWidth.value }),
322
+ onClick: toggle
323
+ }, [renderSlot(_ctx.$slots, "trigger", {}, () => [(openBlock(), createBlock(resolveDynamicComponent(defaultTriggerComponent.value)))])], 6))], 64)) : createCommentVNode("", true)
324
+ ], 64))], 6);
445
325
  };
446
326
  }
447
327
  }));