@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
@@ -4,10 +4,12 @@
4
4
  -->
5
5
  <script lang="ts">
6
6
  import type { Snippet } from 'svelte';
7
-
8
- type ButtonType = 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';
9
- type ButtonTheme = 'solid' | 'borderless' | 'light' | 'outline';
10
- type ButtonSize = 'small' | 'default' | 'large';
7
+ import {
8
+ getButtonGroupContext,
9
+ type ButtonType,
10
+ type ButtonTheme,
11
+ type ButtonSize,
12
+ } from './context.js';
11
13
 
12
14
  interface Props {
13
15
  type?: ButtonType;
@@ -16,33 +18,84 @@
16
18
  block?: boolean;
17
19
  disabled?: boolean;
18
20
  loading?: boolean;
21
+ /**
22
+ * AI 多彩按钮:所有 theme 下用品牌蓝→紫渐变(对齐 Semi AI 风格)。
23
+ * type 仅 primary / tertiary 有意义(其余 type 回退为 primary)。
24
+ */
25
+ colorful?: boolean;
19
26
  htmlType?: 'button' | 'submit' | 'reset';
20
- href?: string;
21
27
  /** required for icon-only buttons */
22
28
  ariaLabel?: string;
23
29
  icon?: Snippet;
24
30
  /** 图标相对文字位置。spec §4 L27 */
25
31
  iconPosition?: 'left' | 'right';
32
+ /**
33
+ * 设置水平方向是否去掉内边距,仅在设置了 icon 时有效(对齐 Semi)。
34
+ * true 等效 ['left','right'];'left'/'right' 去单侧;数组组合去两侧。
35
+ */
36
+ noHorizontalPadding?: boolean | 'left' | 'right' | Array<'left' | 'right'>;
37
+ /** 根元素自定义类名(透传,叠加在内置 class 之后)。 */
38
+ class?: string;
39
+ /** 根元素自定义内联样式(透传)。 */
40
+ style?: string;
41
+ /** 内容区(文本 + 图标包裹)自定义类名(对齐 Semi contentClassName)。 */
42
+ contentClassName?: string;
26
43
  children?: Snippet;
27
44
  onclick?: (e: MouseEvent) => void;
45
+ onmousedown?: (e: MouseEvent) => void;
46
+ onmouseenter?: (e: MouseEvent) => void;
47
+ onmouseleave?: (e: MouseEvent) => void;
28
48
  }
29
49
 
30
50
  let {
31
- type = 'secondary',
32
- theme = 'light',
33
- size = 'default',
51
+ type: typeProp,
52
+ theme: themeProp,
53
+ size: sizeProp,
34
54
  block = false,
35
- disabled = false,
55
+ disabled: disabledProp,
36
56
  loading = false,
57
+ colorful: colorfulProp,
37
58
  htmlType = 'button',
38
- href,
39
59
  ariaLabel,
40
60
  icon,
41
61
  iconPosition = 'left',
62
+ noHorizontalPadding = false,
63
+ class: className,
64
+ style,
65
+ contentClassName,
42
66
  children,
43
67
  onclick,
68
+ onmousedown,
69
+ onmouseenter,
70
+ onmouseleave,
44
71
  }: Props = $props();
45
72
 
73
+ // ButtonGroup 上下文:仅在未显式设置对应 prop 时作为默认回退(显式 prop 始终优先)。
74
+ const group = getButtonGroupContext();
75
+ const typeRaw = $derived<ButtonType>(typeProp ?? group?.type ?? 'secondary');
76
+ const theme = $derived<ButtonTheme>(themeProp ?? group?.theme ?? 'light');
77
+ const size = $derived<ButtonSize>(sizeProp ?? group?.size ?? 'default');
78
+ const disabled = $derived<boolean>(disabledProp ?? group?.disabled ?? false);
79
+ const colorful = $derived<boolean>(colorfulProp ?? group?.colorful ?? false);
80
+
81
+ // colorful 仅支持 primary / tertiary;其余 type 回退为 primary。
82
+ const type = $derived<ButtonType>(
83
+ colorful && typeRaw !== 'primary' && typeRaw !== 'tertiary' ? 'primary' : typeRaw,
84
+ );
85
+
86
+ // 无 children(仅 icon 或 loading 旋转图标)时为纯图标按钮,收成方形。
87
+ const iconOnly = $derived(!children && (!!icon || loading));
88
+
89
+ // noHorizontalPadding 规整为 {left,right},仅在有 icon 时生效(对齐 Semi)。
90
+ const noPad = $derived.by(() => {
91
+ if (!icon || !noHorizontalPadding) return { left: false, right: false };
92
+ if (noHorizontalPadding === true) return { left: true, right: true };
93
+ const arr = Array.isArray(noHorizontalPadding)
94
+ ? noHorizontalPadding
95
+ : [noHorizontalPadding];
96
+ return { left: arr.includes('left'), right: arr.includes('right') };
97
+ });
98
+
46
99
  const cls = $derived(
47
100
  [
48
101
  'cd-button',
@@ -51,7 +104,12 @@
51
104
  `cd-button--${size}`,
52
105
  block && 'cd-button--block',
53
106
  loading && 'cd-button--loading',
107
+ colorful && 'cd-button--colorful',
108
+ iconOnly && 'cd-button--icon-only',
54
109
  icon && iconPosition === 'right' && 'cd-button--icon-right',
110
+ noPad.left && 'cd-button--no-pad-left',
111
+ noPad.right && 'cd-button--no-pad-right',
112
+ className,
55
113
  ]
56
114
  .filter(Boolean)
57
115
  .join(' '),
@@ -66,104 +124,276 @@
66
124
  }
67
125
  </script>
68
126
 
69
- {#if href}
70
- <a
71
- class={cls}
72
- href={disabled ? undefined : href}
73
- role="button"
74
- aria-disabled={disabled || undefined}
75
- aria-busy={loading || undefined}
76
- aria-label={ariaLabel}
77
- onclick={handleClick}
78
- >
79
- {#if icon}<span class="cd-button__icon">{@render icon()}</span>{/if}
80
- {@render children?.()}
81
- </a>
82
- {:else}
83
- <button
84
- class={cls}
85
- type={htmlType}
86
- {disabled}
87
- aria-busy={loading || undefined}
88
- aria-label={ariaLabel}
89
- onclick={handleClick}
90
- >
91
- {#if icon}<span class="cd-button__icon">{@render icon()}</span>{/if}
127
+ <!-- loading 时显示旋转加载图标(优先于用户 icon);否则渲染用户 icon -->
128
+ {#snippet leadingIcon()}
129
+ {#if loading}
130
+ <span class="cd-button__icon cd-button__icon--spin" aria-hidden="true">
131
+ <svg viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round">
132
+ <path d="M12 3a9 9 0 1 0 9 9" />
133
+ </svg>
134
+ </span>
135
+ {:else if icon}
136
+ <span class="cd-button__icon">{@render icon()}</span>
137
+ {/if}
138
+ {/snippet}
139
+
140
+ <button
141
+ class={cls}
142
+ {style}
143
+ type={htmlType}
144
+ {disabled}
145
+ aria-busy={loading || undefined}
146
+ aria-label={ariaLabel}
147
+ onclick={handleClick}
148
+ {onmousedown}
149
+ {onmouseenter}
150
+ {onmouseleave}
151
+ >
152
+ {#if contentClassName}
153
+ <span class={contentClassName} style="display: contents;">
154
+ {@render leadingIcon()}
155
+ {@render children?.()}
156
+ </span>
157
+ {:else}
158
+ {@render leadingIcon()}
92
159
  {@render children?.()}
93
- </button>
94
- {/if}
160
+ {/if}
161
+ </button>
95
162
 
96
163
  <style>
97
164
  .cd-button {
98
165
  display: inline-flex;
99
166
  align-items: center;
100
167
  justify-content: center;
101
- gap: var(--cd-spacing-2);
168
+ gap: var(--cd-spacing-tight);
102
169
  height: var(--cd-button-height-default);
103
170
  padding-inline: var(--cd-button-padding-x);
104
171
  border: 1px solid transparent;
105
172
  border-radius: var(--cd-button-radius);
106
173
  font-size: var(--cd-button-font-size);
107
- font-weight: var(--cd-font-weight-medium);
174
+ font-weight: var(--cd-font-weight-bold);
108
175
  line-height: 1;
109
176
  cursor: pointer;
110
177
  transition:
111
178
  background-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
112
- border-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
179
+ border-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
180
+ color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
113
181
  }
114
182
  .cd-button:focus-visible {
115
183
  outline: none;
116
184
  box-shadow: var(--cd-focus-ring);
117
185
  }
186
+ /* Semi:全尺寸字号统一 regular(14),仅高度/内边距随尺寸变化 */
118
187
  .cd-button--small {
119
188
  height: var(--cd-button-height-small);
120
- font-size: var(--cd-font-size-1);
121
189
  }
122
190
  .cd-button--large {
123
191
  height: var(--cd-button-height-large);
124
- font-size: var(--cd-font-size-3);
192
+ padding-inline: var(--cd-button-padding-x-large);
125
193
  }
126
194
  .cd-button--block {
127
195
  width: 100%;
128
196
  }
197
+ /* 纯图标(无文字):收成正方形,宽=高,去除水平内距 */
198
+ .cd-button--icon-only {
199
+ width: var(--cd-button-height-default);
200
+ padding-inline: 0;
201
+ gap: 0;
202
+ }
203
+ .cd-button--icon-only.cd-button--small {
204
+ width: var(--cd-button-height-small);
205
+ }
206
+ .cd-button--icon-only.cd-button--large {
207
+ width: var(--cd-button-height-large);
208
+ }
209
+ /* noHorizontalPadding:仅 icon 按钮去单/双侧水平内距(对齐 Semi) */
210
+ .cd-button--no-pad-left {
211
+ padding-inline-start: 0;
212
+ }
213
+ .cd-button--no-pad-right {
214
+ padding-inline-end: 0;
215
+ }
129
216
  .cd-button--loading {
130
217
  cursor: default;
131
218
  opacity: 0.75;
132
219
  }
133
- .cd-button:disabled,
134
- .cd-button[aria-disabled='true'] {
220
+ .cd-button:disabled {
135
221
  cursor: not-allowed;
136
222
  opacity: 0.5;
137
223
  }
138
- /* primary / solid */
224
+ /*
225
+ type 决定「色相」(--btn-hue 系列变量),theme 决定「填充方式」,两者正交组合。
226
+ - --btn-hue: 该 type 的语义主色 (solid 背景 / light·borderless·outline 文字与边框)
227
+ - --btn-hue-hover: solid 背景 hover 加深一档
228
+ - --btn-hue-text: solid 文字色 (语义色用白字,中性色用反相文字)
229
+ light/borderless/outline 的浅色背景统一用 color-mix 由 --btn-hue 派生,
230
+ 避免依赖尚未定义的 *-light-* token。
231
+ */
139
232
  .cd-button--primary {
140
- background: var(--cd-button-color-bg-primary);
141
- color: var(--cd-button-color-text-primary);
233
+ --btn-hue: var(--cd-color-primary);
234
+ --btn-hue-hover: var(--cd-color-primary-hover);
235
+ --btn-hue-text: var(--cd-color-text-inverse);
142
236
  }
143
237
  .cd-button--secondary {
144
- background: var(--cd-color-fill-0);
145
- color: var(--cd-color-text-0);
238
+ /* 中性 type:solid=深灰底白字 */
239
+ --btn-hue: var(--cd-color-text-0);
240
+ --btn-hue-hover: var(--cd-color-text-1);
241
+ --btn-hue-text: var(--cd-color-text-inverse);
146
242
  }
147
243
  .cd-button--tertiary {
148
- background: transparent;
149
- color: var(--cd-color-text-1);
244
+ /* 中性更弱:solid=中灰底白字、light/borderless 用次级文字色 */
245
+ --btn-hue: var(--cd-color-text-2);
246
+ --btn-hue-hover: var(--cd-color-text-1);
247
+ --btn-hue-text: var(--cd-color-text-inverse);
150
248
  }
151
249
  .cd-button--warning {
152
- background: var(--cd-color-warning);
153
- color: var(--cd-color-text-inverse);
250
+ --btn-hue: var(--cd-color-warning);
251
+ --btn-hue-hover: color-mix(in srgb, var(--cd-color-warning) 88%, #000);
252
+ --btn-hue-text: var(--cd-color-text-inverse);
154
253
  }
155
254
  .cd-button--danger {
156
- background: var(--cd-color-danger);
157
- color: var(--cd-color-text-inverse);
255
+ --btn-hue: var(--cd-color-danger);
256
+ --btn-hue-hover: color-mix(in srgb, var(--cd-color-danger) 88%, #000);
257
+ --btn-hue-text: var(--cd-color-text-inverse);
258
+ }
259
+
260
+ /* theme: solid — type 色相实心背景 + 反相/白字 */
261
+ .cd-button--solid {
262
+ background: var(--btn-hue);
263
+ color: var(--btn-hue-text);
264
+ }
265
+ .cd-button--solid:hover:not(:disabled):not([aria-disabled='true']) {
266
+ background: var(--btn-hue-hover);
158
267
  }
268
+ .cd-button--solid:active:not(:disabled):not([aria-disabled='true']) {
269
+ background: color-mix(in srgb, var(--btn-hue) 82%, #000);
270
+ }
271
+
272
+ /* theme: light — type 色相浅色背景 + 色相文字 */
273
+ .cd-button--light {
274
+ background: color-mix(in srgb, var(--btn-hue) 12%, transparent);
275
+ color: var(--btn-hue);
276
+ }
277
+ .cd-button--light:hover:not(:disabled):not([aria-disabled='true']) {
278
+ background: color-mix(in srgb, var(--btn-hue) 20%, transparent);
279
+ }
280
+ .cd-button--light:active:not(:disabled):not([aria-disabled='true']) {
281
+ background: color-mix(in srgb, var(--btn-hue) 28%, transparent);
282
+ }
283
+
284
+ /* theme: borderless — 透明背景 + 色相文字,无边框 */
285
+ .cd-button--borderless {
286
+ background: transparent;
287
+ color: var(--btn-hue);
288
+ }
289
+ .cd-button--borderless:hover:not(:disabled):not([aria-disabled='true']) {
290
+ background: color-mix(in srgb, var(--btn-hue) 12%, transparent);
291
+ }
292
+ .cd-button--borderless:active:not(:disabled):not([aria-disabled='true']) {
293
+ background: color-mix(in srgb, var(--btn-hue) 20%, transparent);
294
+ }
295
+
296
+ /* theme: outline — 透明背景 + 色相边框 + 色相文字 */
159
297
  .cd-button--outline {
160
298
  background: transparent;
161
- border-color: var(--cd-color-border);
162
- color: var(--cd-color-text-0);
299
+ border-color: var(--btn-hue);
300
+ color: var(--btn-hue);
301
+ }
302
+ .cd-button--outline:hover:not(:disabled):not([aria-disabled='true']) {
303
+ background: color-mix(in srgb, var(--btn-hue) 8%, transparent);
304
+ border-color: var(--btn-hue-hover);
305
+ color: var(--btn-hue-hover);
306
+ }
307
+ .cd-button--outline:active:not(:disabled):not([aria-disabled='true']) {
308
+ background: color-mix(in srgb, var(--btn-hue) 14%, transparent);
309
+ }
310
+ /*
311
+ colorful (AI 多彩):蓝 → 紫 双色渐变(对齐 Semi AI 风格,冷色调)。
312
+ - 支持所有 theme;type 仅 primary/tertiary(脚本里已收窄回退)。
313
+ - 局部变量 --cf / --cf-hover / --cf-text 复用同一渐变,各 theme 按填充方式取用。
314
+ - solid: 多彩实心 + 白字;light: 浅多彩底 + 紫字;
315
+ outline: 透明 + 渐变边框(border-image)+ 紫字;borderless: 透明 + 紫字。
316
+ */
317
+ .cd-button--colorful {
318
+ /* 实心渐变 + hover 加深版(向蓝/紫各深一档),各 theme 复用 */
319
+ --cf: linear-gradient(
320
+ 120deg,
321
+ var(--cd-button-colorful-from) 0%,
322
+ var(--cd-button-colorful-via) 52%,
323
+ var(--cd-button-colorful-to) 100%
324
+ );
325
+ --cf-hover: linear-gradient(
326
+ 120deg,
327
+ color-mix(in srgb, var(--cd-button-colorful-from) 85%, #000) 0%,
328
+ color-mix(in srgb, var(--cd-button-colorful-via) 85%, #000) 52%,
329
+ color-mix(in srgb, var(--cd-button-colorful-to) 85%, #000) 100%
330
+ );
331
+ --cf-text: var(--cd-button-colorful-via);
332
+ }
333
+ .cd-button--colorful.cd-button--solid {
334
+ background: var(--cf);
335
+ color: var(--cd-color-text-inverse);
336
+ border-color: transparent;
337
+ }
338
+ .cd-button--colorful.cd-button--solid:hover:not(:disabled):not([aria-disabled='true']) {
339
+ background: var(--cf-hover);
340
+ box-shadow: 0 4px 12px color-mix(in srgb, var(--cd-button-colorful-via) 35%, transparent);
341
+ }
342
+ .cd-button--colorful.cd-button--light {
343
+ background: linear-gradient(
344
+ 120deg,
345
+ color-mix(in srgb, var(--cd-button-colorful-from) 16%, transparent) 0%,
346
+ color-mix(in srgb, var(--cd-button-colorful-via) 16%, transparent) 52%,
347
+ color-mix(in srgb, var(--cd-button-colorful-to) 16%, transparent) 100%
348
+ );
349
+ color: var(--cf-text);
350
+ border-color: transparent;
351
+ }
352
+ .cd-button--colorful.cd-button--light:hover:not(:disabled):not([aria-disabled='true']) {
353
+ background: linear-gradient(
354
+ 120deg,
355
+ color-mix(in srgb, var(--cd-button-colorful-from) 28%, transparent) 0%,
356
+ color-mix(in srgb, var(--cd-button-colorful-via) 28%, transparent) 52%,
357
+ color-mix(in srgb, var(--cd-button-colorful-to) 28%, transparent) 100%
358
+ );
359
+ }
360
+ .cd-button--colorful.cd-button--borderless {
361
+ background: transparent;
362
+ color: var(--cf-text);
363
+ }
364
+ .cd-button--colorful.cd-button--borderless:hover:not(:disabled):not([aria-disabled='true']) {
365
+ background: linear-gradient(
366
+ 120deg,
367
+ color-mix(in srgb, var(--cd-button-colorful-from) 16%, transparent) 0%,
368
+ color-mix(in srgb, var(--cd-button-colorful-to) 16%, transparent) 100%
369
+ );
370
+ }
371
+ /* outline: 渐变边框 + 渐变文字色 */
372
+ .cd-button--colorful.cd-button--outline {
373
+ background: transparent;
374
+ border: 1px solid transparent;
375
+ border-image: var(--cf) 1;
376
+ color: var(--cf-text);
377
+ }
378
+ .cd-button--colorful.cd-button--outline:hover:not(:disabled):not([aria-disabled='true']) {
379
+ background: linear-gradient(
380
+ 120deg,
381
+ color-mix(in srgb, var(--cd-button-colorful-from) 12%, transparent) 0%,
382
+ color-mix(in srgb, var(--cd-button-colorful-to) 12%, transparent) 100%
383
+ );
163
384
  }
164
385
  .cd-button__icon {
165
386
  display: inline-flex;
166
387
  }
388
+ /* loading 旋转图标 */
389
+ .cd-button__icon--spin {
390
+ animation: cd-button-spin 0.7s linear infinite;
391
+ }
392
+ @keyframes cd-button-spin {
393
+ to {
394
+ transform: rotate(360deg);
395
+ }
396
+ }
167
397
  /* iconPosition=right: 纯 CSS flex order, DOM 顺序不变 (spec §4 L27) */
168
398
  .cd-button--icon-right .cd-button__icon {
169
399
  order: 1;
@@ -172,5 +402,9 @@
172
402
  .cd-button {
173
403
  transition: none;
174
404
  }
405
+ /* 降级:不旋转,避免眩晕 */
406
+ .cd-button__icon--spin {
407
+ animation: none;
408
+ }
175
409
  }
176
410
  </style>
@@ -1,7 +1,5 @@
1
1
  import type { Snippet } from 'svelte';
2
- type ButtonType = 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';
3
- type ButtonTheme = 'solid' | 'borderless' | 'light' | 'outline';
4
- type ButtonSize = 'small' | 'default' | 'large';
2
+ import { type ButtonType, type ButtonTheme, type ButtonSize } from './context.js';
5
3
  interface Props {
6
4
  type?: ButtonType;
7
5
  theme?: ButtonTheme;
@@ -9,15 +7,33 @@ interface Props {
9
7
  block?: boolean;
10
8
  disabled?: boolean;
11
9
  loading?: boolean;
10
+ /**
11
+ * AI 多彩按钮:所有 theme 下用品牌蓝→紫渐变(对齐 Semi AI 风格)。
12
+ * type 仅 primary / tertiary 有意义(其余 type 回退为 primary)。
13
+ */
14
+ colorful?: boolean;
12
15
  htmlType?: 'button' | 'submit' | 'reset';
13
- href?: string;
14
16
  /** required for icon-only buttons */
15
17
  ariaLabel?: string;
16
18
  icon?: Snippet;
17
19
  /** 图标相对文字位置。spec §4 L27 */
18
20
  iconPosition?: 'left' | 'right';
21
+ /**
22
+ * 设置水平方向是否去掉内边距,仅在设置了 icon 时有效(对齐 Semi)。
23
+ * true 等效 ['left','right'];'left'/'right' 去单侧;数组组合去两侧。
24
+ */
25
+ noHorizontalPadding?: boolean | 'left' | 'right' | Array<'left' | 'right'>;
26
+ /** 根元素自定义类名(透传,叠加在内置 class 之后)。 */
27
+ class?: string;
28
+ /** 根元素自定义内联样式(透传)。 */
29
+ style?: string;
30
+ /** 内容区(文本 + 图标包裹)自定义类名(对齐 Semi contentClassName)。 */
31
+ contentClassName?: string;
19
32
  children?: Snippet;
20
33
  onclick?: (e: MouseEvent) => void;
34
+ onmousedown?: (e: MouseEvent) => void;
35
+ onmouseenter?: (e: MouseEvent) => void;
36
+ onmouseleave?: (e: MouseEvent) => void;
21
37
  }
22
38
  declare const Button: import("svelte").Component<Props, {}, "">;
23
39
  type Button = ReturnType<typeof Button>;
@@ -1 +1 @@
1
- {"version":3,"file":"Button.svelte.d.ts","sourceRoot":"","sources":["../../src/button/Button.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,KAAK,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC9E,KAAK,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAChE,KAAK,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAEhD,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACnC;AAgEH,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Button.svelte.d.ts","sourceRoot":"","sources":["../../src/button/Button.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAEH,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAGtB,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACzC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAC3E,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AAiHH,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,107 @@
1
+ <!--
2
+ ButtonGroup — 把多个 Button 横向拼接:相邻按钮共享边框、圆角只在两端。
3
+ 组级默认(size/type/theme/disabled)经 setContext 透传给组内 Button,
4
+ 仅作为「未显式设置」的回退(Button 显式 prop 始终优先),不破坏 Button API。
5
+ -->
6
+ <script lang="ts">
7
+ import { setContext, type Snippet } from 'svelte';
8
+ import {
9
+ BUTTON_GROUP_CTX,
10
+ type ButtonGroupContext,
11
+ type ButtonType,
12
+ type ButtonTheme,
13
+ type ButtonSize,
14
+ } from './context.js';
15
+
16
+ interface Props {
17
+ size?: ButtonSize;
18
+ type?: ButtonType;
19
+ theme?: ButtonTheme;
20
+ disabled?: boolean;
21
+ /** 组级多彩开关,透传给组内 Button(对齐 Semi)。 */
22
+ colorful?: boolean;
23
+ /** 按钮组语义标签(aria-label)。 */
24
+ ariaLabel?: string;
25
+ /** 根元素自定义类名(透传)。 */
26
+ class?: string;
27
+ /** 根元素自定义内联样式(透传)。 */
28
+ style?: string;
29
+ children?: Snippet;
30
+ }
31
+
32
+ let {
33
+ size,
34
+ type,
35
+ theme,
36
+ disabled,
37
+ colorful,
38
+ ariaLabel,
39
+ class: className,
40
+ style,
41
+ children,
42
+ }: Props = $props();
43
+
44
+ // 透传组级默认给组内 Button(getButtonGroupContext 读取)。
45
+ // 用 getter 暴露 live 值,使组内 Button 始终读到最新的组级默认(context 本身不可重赋值)。
46
+ const ctx: ButtonGroupContext = {
47
+ get size() {
48
+ return size;
49
+ },
50
+ get type() {
51
+ return type;
52
+ },
53
+ get theme() {
54
+ return theme;
55
+ },
56
+ get disabled() {
57
+ return disabled;
58
+ },
59
+ get colorful() {
60
+ return colorful;
61
+ },
62
+ };
63
+ setContext(BUTTON_GROUP_CTX, ctx);
64
+ </script>
65
+
66
+ <div class={['cd-button-group', className].filter(Boolean).join(' ')} {style} role="group" aria-label={ariaLabel}>
67
+ {@render children?.()}
68
+ </div>
69
+
70
+ <style>
71
+ .cd-button-group {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ }
75
+ /* 相邻按钮共享边框:除首个外左移 1px 叠边,圆角只保留两端。 */
76
+ .cd-button-group :global(.cd-button) {
77
+ border-radius: 0;
78
+ position: relative;
79
+ }
80
+ .cd-button-group :global(.cd-button:not(:first-child)) {
81
+ margin-inline-start: -1px;
82
+ }
83
+ .cd-button-group :global(.cd-button:first-child) {
84
+ border-start-start-radius: var(--cd-button-radius);
85
+ border-end-start-radius: var(--cd-button-radius);
86
+ }
87
+ .cd-button-group :global(.cd-button:last-child) {
88
+ border-start-end-radius: var(--cd-button-radius);
89
+ border-end-end-radius: var(--cd-button-radius);
90
+ }
91
+ /* hover/focus 的按钮浮到相邻按钮之上,保证边框/聚焦环完整可见。 */
92
+ .cd-button-group :global(.cd-button:hover),
93
+ .cd-button-group :global(.cd-button:focus-visible) {
94
+ z-index: 1;
95
+ }
96
+ /* 无边框主题(solid/light)下,用细分隔线区隔相邻按钮。 */
97
+ .cd-button-group :global(.cd-button:not(:first-child))::before {
98
+ content: '';
99
+ position: absolute;
100
+ inset-block: 0;
101
+ inset-inline-start: 0;
102
+ width: 1px;
103
+ background: var(--cd-button-group-divider);
104
+ opacity: 0.5;
105
+ pointer-events: none;
106
+ }
107
+ </style>
@@ -0,0 +1,21 @@
1
+ import { type Snippet } from 'svelte';
2
+ import { type ButtonType, type ButtonTheme, type ButtonSize } from './context.js';
3
+ interface Props {
4
+ size?: ButtonSize;
5
+ type?: ButtonType;
6
+ theme?: ButtonTheme;
7
+ disabled?: boolean;
8
+ /** 组级多彩开关,透传给组内 Button(对齐 Semi)。 */
9
+ colorful?: boolean;
10
+ /** 按钮组语义标签(aria-label)。 */
11
+ ariaLabel?: string;
12
+ /** 根元素自定义类名(透传)。 */
13
+ class?: string;
14
+ /** 根元素自定义内联样式(透传)。 */
15
+ style?: string;
16
+ children?: Snippet;
17
+ }
18
+ declare const ButtonGroup: import("svelte").Component<Props, {}, "">;
19
+ type ButtonGroup = ReturnType<typeof ButtonGroup>;
20
+ export default ButtonGroup;
21
+ //# sourceMappingURL=ButtonGroup.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonGroup.svelte.d.ts","sourceRoot":"","sources":["../../src/button/ButtonGroup.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAGH,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAGtB,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiDH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}