luna-plus 0.0.40 → 0.0.43

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 (92) hide show
  1. package/dist/Affix/Affix.svelte +1 -1
  2. package/dist/Alert/Alert.svelte +6 -6
  3. package/dist/Autocomplete/Autocomplete.svelte +9 -9
  4. package/dist/Avatar/Avatar.svelte +5 -5
  5. package/dist/Backtop/Backtop.svelte +1 -1
  6. package/dist/Badge/Badge.svelte +4 -4
  7. package/dist/Breadcrumb/Breadcrumb.svelte +7 -7
  8. package/dist/Breadcrumb/BreadcrumbItem.svelte +6 -6
  9. package/dist/Button/Button.svelte +2 -2
  10. package/dist/Calendar/Calendar.svelte +16 -16
  11. package/dist/Card/Card.svelte +4 -4
  12. package/dist/Carousel/Carousel.svelte +6 -6
  13. package/dist/Carousel/CarouselItem.svelte +1 -1
  14. package/dist/Cascader/Cascader.svelte +12 -12
  15. package/dist/Checkbox/Checkbox.svelte +5 -5
  16. package/dist/Checkbox/CheckboxGroup.svelte +1 -1
  17. package/dist/Collapse/Collapse.svelte +1 -1
  18. package/dist/Collapse/CollapseItem.svelte +6 -6
  19. package/dist/ColorPicker/ColorPicker.svelte +13 -13
  20. package/dist/Container/Aside.svelte +1 -1
  21. package/dist/Container/Container.svelte +1 -1
  22. package/dist/Container/Footer.svelte +1 -1
  23. package/dist/Container/Header.svelte +1 -1
  24. package/dist/Container/Main.svelte +1 -1
  25. package/dist/DatePicker/DatePicker.svelte +20 -20
  26. package/dist/DateTimePicker/DateTimePicker.svelte +31 -31
  27. package/dist/Descriptions/Descriptions.svelte +6 -6
  28. package/dist/Descriptions/DescriptionsItem.svelte +6 -6
  29. package/dist/Dialog/Dialog.svelte +8 -8
  30. package/dist/Divider/Divider.svelte +6 -6
  31. package/dist/Drawer/Drawer.svelte +8 -8
  32. package/dist/Dropdown/Dropdown.svelte +42 -25
  33. package/dist/Dropdown/DropdownItem.svelte +2 -2
  34. package/dist/Dropdown/DropdownMenu.svelte +1 -1
  35. package/dist/Empty/Empty.svelte +4 -4
  36. package/dist/Form/Form.svelte +1 -1
  37. package/dist/Form/FormItem.svelte +4 -4
  38. package/dist/Icon/Icon.svelte +1 -1
  39. package/dist/Image/Image.svelte +13 -13
  40. package/dist/Input/Input.svelte +7 -7
  41. package/dist/InputNumber/InputNumber.svelte +7 -7
  42. package/dist/InputTag/InputTag.svelte +4 -4
  43. package/dist/Link/Link.svelte +1 -1
  44. package/dist/Loading/Loading.svelte +6 -6
  45. package/dist/Menu/Menu.svelte +10 -10
  46. package/dist/Message/Message.svelte +4 -4
  47. package/dist/Message/MessageQueue.svelte +4 -4
  48. package/dist/Message/message.js +1 -1
  49. package/dist/MessageBox/MessageBox.svelte +6 -6
  50. package/dist/MessageBox/messageBox.js +2 -2
  51. package/dist/Notification/Notification.svelte +8 -8
  52. package/dist/Pagination/Pagination.svelte +19 -19
  53. package/dist/PinInput/PinInput.svelte +2 -2
  54. package/dist/Popconfirm/Popconfirm.svelte +8 -8
  55. package/dist/Popover/Popover.svelte +5 -5
  56. package/dist/Progress/Progress.svelte +4 -4
  57. package/dist/Radio/Radio.svelte +5 -5
  58. package/dist/Radio/RadioGroup.svelte +1 -1
  59. package/dist/Rating/Rating.svelte +7 -7
  60. package/dist/Result/Result.svelte +6 -6
  61. package/dist/Segmented/Segmented.svelte +4 -4
  62. package/dist/Select/Option.svelte +1 -1
  63. package/dist/Select/OptionGroup.svelte +3 -3
  64. package/dist/Select/Select.svelte +13 -13
  65. package/dist/Skeleton/Skeleton.svelte +2 -2
  66. package/dist/Skeleton/SkeletonItem.svelte +1 -1
  67. package/dist/Slider/Slider.svelte +12 -12
  68. package/dist/Space/Space.svelte +5 -5
  69. package/dist/Statistic/Countdown.svelte +6 -6
  70. package/dist/Statistic/Statistic.svelte +6 -6
  71. package/dist/Steps/Step.svelte +8 -8
  72. package/dist/Steps/Steps.svelte +1 -1
  73. package/dist/Switch/Switch.svelte +7 -7
  74. package/dist/Table/Table.svelte +32 -32
  75. package/dist/Tabs/TabPane.svelte +1 -1
  76. package/dist/Tabs/Tabs.svelte +14 -14
  77. package/dist/Tabs/TabsContext.js +1 -1
  78. package/dist/Tag/Tag.svelte +2 -2
  79. package/dist/Textarea/Textarea.svelte +3 -3
  80. package/dist/TimePicker/TimePicker.svelte +19 -19
  81. package/dist/Timeline/Timeline.svelte +1 -1
  82. package/dist/Timeline/TimelineItem.svelte +7 -7
  83. package/dist/Tooltip/OverflowTooltip.svelte +5 -5
  84. package/dist/Tooltip/Tooltip.svelte +3 -3
  85. package/dist/Transfer/Transfer.svelte +28 -24
  86. package/dist/Tree/Tree.svelte +1 -1
  87. package/dist/Tree/TreeNode.svelte +6 -6
  88. package/dist/TreeSelect/TreeSelect.svelte +25 -25
  89. package/dist/Upload/Upload.svelte +32 -32
  90. package/dist/Watermark/Watermark.svelte +3 -3
  91. package/package.json +1 -1
  92. package/styles/index.css +1 -1
@@ -29,10 +29,12 @@
29
29
  let rootEl = $state<HTMLElement | null>(null);
30
30
  let popperEl = $state<HTMLElement | null>(null);
31
31
  let adjustedPlacement = $state<DropdownPlacement | null>(null);
32
+ let horizontalOffset = $state<number | null>(null);
33
+ let arrowOffset = $state<number | null>(null);
32
34
  let showTimer: ReturnType<typeof setTimeout> | null = null;
33
35
  let hideTimer: ReturnType<typeof setTimeout> | null = null;
34
36
 
35
- const dropdownId = `lm-dropdown-${Math.random().toString(36).slice(2, 9)}`;
37
+ const dropdownId = `ln-dropdown-${Math.random().toString(36).slice(2, 9)}`;
36
38
 
37
39
  const clearTimers = (): void => {
38
40
  if (showTimer) {
@@ -195,28 +197,41 @@
195
197
  }
196
198
  }
197
199
 
198
- // 2) Horizontal alignment switch (start/end/center)
200
+ // 2) Calculate horizontal offset to keep popper within viewport
199
201
  const popperWidth = popperRect.width;
200
202
  const triggerLeft = triggerRect.left;
201
203
  const triggerRight = triggerRect.right;
202
- const triggerCenter = triggerRect.left + triggerRect.width / 2;
203
-
204
- const desiredLeft =
205
- align === "start"
206
- ? triggerLeft
207
- : align === "end"
208
- ? triggerRight - popperWidth
209
- : triggerCenter - popperWidth / 2;
210
-
211
- const overflowLeft = desiredLeft < padding;
212
- const overflowRight = desiredLeft + popperWidth > viewportWidth - padding;
213
-
214
- if (overflowLeft && !overflowRight) {
215
- align = "start";
216
- } else if (overflowRight && !overflowLeft) {
217
- align = "end";
204
+ const triggerWidth = triggerRect.width;
205
+
206
+ // Calculate where the popper would be positioned based on alignment
207
+ let desiredLeft: number;
208
+ if (align === "start") {
209
+ desiredLeft = triggerLeft;
210
+ } else if (align === "end") {
211
+ desiredLeft = triggerRight - popperWidth;
212
+ } else {
213
+ // center
214
+ desiredLeft = triggerLeft + (triggerWidth - popperWidth) / 2;
215
+ }
216
+
217
+ // Check overflow and calculate offset
218
+ let newHorizontalOffset = 0;
219
+ const rightEdge = desiredLeft + popperWidth;
220
+ const leftEdge = desiredLeft;
221
+
222
+ if (rightEdge > viewportWidth - padding) {
223
+ // Overflows right - shift left
224
+ newHorizontalOffset = viewportWidth - padding - rightEdge;
225
+ } else if (leftEdge < padding) {
226
+ // Overflows left - shift right
227
+ newHorizontalOffset = padding - leftEdge;
218
228
  }
219
229
 
230
+ // Update horizontal offset
231
+ horizontalOffset = newHorizontalOffset !== 0 ? newHorizontalOffset : null;
232
+ // Arrow offset is the inverse to point back to trigger center
233
+ arrowOffset = newHorizontalOffset !== 0 ? -newHorizontalOffset : null;
234
+
220
235
  const nextPlacement = formatPlacement(side, align);
221
236
  return nextPlacement === placement ? null : nextPlacement;
222
237
  };
@@ -260,11 +275,11 @@
260
275
  });
261
276
 
262
277
  const rootClasses = $derived(
263
- `lm-dropdown lm-dropdown--${size}${visible ? " is-open" : ""}${disabled ? " is-disabled" : ""}${cls ? ` ${cls}` : ""}`,
278
+ `ln-dropdown ln-dropdown--${size}${visible ? " is-open" : ""}${disabled ? " is-disabled" : ""}${cls ? ` ${cls}` : ""}`,
264
279
  );
265
280
 
266
281
  const dropdownClasses = $derived(
267
- `lm-dropdown__popper is-${actualPlacement}${popperClass ? ` ${popperClass}` : ""}`,
282
+ `ln-dropdown__popper is-${actualPlacement}${popperClass ? ` ${popperClass}` : ""}`,
268
283
  );
269
284
 
270
285
  const maxHeightStyle = $derived(
@@ -279,14 +294,14 @@
279
294
  <div
280
295
  class={rootClasses}
281
296
  bind:this={rootEl}
282
- style="--lm-dropdown-offset: {offset}px;"
297
+ style="--ln-dropdown-offset: {offset}px;"
283
298
  role="group"
284
299
  tabindex="-1"
285
300
  onpointerover={handleHoverEnter}
286
301
  onpointerout={handleHoverLeave}
287
302
  >
288
303
  <div
289
- class="lm-dropdown__trigger"
304
+ class="ln-dropdown__trigger"
290
305
  role="button"
291
306
  tabindex={disabled ? -1 : 0}
292
307
  aria-haspopup="menu"
@@ -308,15 +323,17 @@
308
323
  class={dropdownClasses}
309
324
  role="menu"
310
325
  tabindex="-1"
311
- style:--lm-dropdown-max-height={maxHeightStyle}
326
+ style:--ln-dropdown-max-height={maxHeightStyle}
327
+ style:--ln-dropdown-h-offset={horizontalOffset ? `${horizontalOffset}px` : undefined}
328
+ style:--ln-dropdown-arrow-offset={arrowOffset ? `${arrowOffset}px` : undefined}
312
329
  in:fly={flyParams}
313
330
  out:fly={flyParams}
314
331
  bind:this={popperEl}
315
332
  >
316
333
  {#if showArrow}
317
- <div class="lm-dropdown__arrow" aria-hidden="true"></div>
334
+ <div class="ln-dropdown__arrow" aria-hidden="true"></div>
318
335
  {/if}
319
- <div class="lm-dropdown__content">
336
+ <div class="ln-dropdown__content">
320
337
  {#if dropdown}
321
338
  {@render dropdown()}
322
339
  {/if}
@@ -28,7 +28,7 @@
28
28
  };
29
29
 
30
30
  const classes = $derived(
31
- `lm-dropdown-item${disabled ? " is-disabled" : ""}${divided ? " is-divided" : ""}${danger ? " is-danger" : ""}${cls ? ` ${cls}` : ""}`,
31
+ `ln-dropdown-item${disabled ? " is-disabled" : ""}${divided ? " is-divided" : ""}${danger ? " is-danger" : ""}${cls ? ` ${cls}` : ""}`,
32
32
  );
33
33
  </script>
34
34
 
@@ -41,7 +41,7 @@
41
41
  onkeydown={handleKeyDown}
42
42
  >
43
43
  {#if icon}
44
- <span class="lm-dropdown-item__icon">
44
+ <span class="ln-dropdown-item__icon">
45
45
  {@render icon()}
46
46
  </span>
47
47
  {/if}
@@ -3,7 +3,7 @@
3
3
 
4
4
  let { children, class: cls = "" }: DropdownMenuProps = $props();
5
5
 
6
- const classes = $derived(`lm-dropdown-menu${cls ? ` ${cls}` : ""}`);
6
+ const classes = $derived(`ln-dropdown-menu${cls ? ` ${cls}` : ""}`);
7
7
  </script>
8
8
 
9
9
  <ul class={classes} role="menu">
@@ -11,11 +11,11 @@
11
11
 
12
12
  let { description = '暂无数据', image, children, actions, class: cls = '', ...attrs }: EmptyProps = $props()
13
13
 
14
- const classes = $derived(cls ? `lm-empty ${cls}` : 'lm-empty')
14
+ const classes = $derived(cls ? `ln-empty ${cls}` : 'ln-empty')
15
15
  </script>
16
16
 
17
17
  <div {...attrs} class={classes} aria-live="polite">
18
- <div class="lm-empty__image" aria-hidden="true">
18
+ <div class="ln-empty__image" aria-hidden="true">
19
19
  {#if image}
20
20
  {@render image()}
21
21
  {:else}
@@ -27,7 +27,7 @@
27
27
  </svg>
28
28
  {/if}
29
29
  </div>
30
- <div class="lm-empty__description">
30
+ <div class="ln-empty__description">
31
31
  {#if children}
32
32
  {@render children()}
33
33
  {:else}
@@ -35,6 +35,6 @@
35
35
  {/if}
36
36
  </div>
37
37
  {#if actions}
38
- <div class="lm-empty__actions">{@render actions()}</div>
38
+ <div class="ln-empty__actions">{@render actions()}</div>
39
39
  {/if}
40
40
  </div>
@@ -59,7 +59,7 @@
59
59
 
60
60
  setContext(FORM_CONTEXT_KEY, formContext)
61
61
 
62
- const classes = $derived(`lm-form lm-form--${size}${inline ? ' lm-form--inline' : ''}${disabled ? ' is-disabled' : ''}${cls ? ` ${cls}` : ''}`)
62
+ const classes = $derived(`ln-form ln-form--${size}${inline ? ' ln-form--inline' : ''}${disabled ? ' is-disabled' : ''}${cls ? ` ${cls}` : ''}`)
63
63
 
64
64
  const clearValidate = (props?: string[]) => clearValidation(props)
65
65
 
@@ -139,7 +139,7 @@
139
139
  })
140
140
 
141
141
  const classes = $derived(
142
- `lm-form-item lm-form-item--${effectiveSize}${messageType ? ` is-${messageType}` : ''}${validating ? ' is-validating' : ''}${inlineMessage ? ' is-inline-message' : ''}${form?.disabled ? ' is-disabled' : ''}${cls ? ` ${cls}` : ''}`
142
+ `ln-form-item ln-form-item--${effectiveSize}${messageType ? ` is-${messageType}` : ''}${validating ? ' is-validating' : ''}${inlineMessage ? ' is-inline-message' : ''}${form?.disabled ? ' is-disabled' : ''}${cls ? ` ${cls}` : ''}`
143
143
  )
144
144
 
145
145
  const labelStyle = $derived(form?.labelWidth ? `width: ${form.labelWidth}` : undefined)
@@ -166,19 +166,19 @@
166
166
  {...attrs}
167
167
  >
168
168
  {#if label}
169
- <div class="lm-form-item__label" style={labelStyle}>
169
+ <div class="ln-form-item__label" style={labelStyle}>
170
170
  {label}
171
171
  </div>
172
172
  {/if}
173
173
 
174
- <div class="lm-form-item__content">
174
+ <div class="ln-form-item__content">
175
175
  {#if children}
176
176
  {@render children()}
177
177
  {/if}
178
178
 
179
179
  {#if showMessage && (message || validating)}
180
180
  <div
181
- class="lm-form-item__message"
181
+ class="ln-form-item__message"
182
182
  class:is-inline={inlineMessage}
183
183
  class:is-error={messageType === 'error'}
184
184
  class:is-success={messageType === 'success'}
@@ -20,7 +20,7 @@
20
20
 
21
21
  const sizeValue = $derived(typeof size === "number" ? `${size}px` : size);
22
22
 
23
- const classes = $derived(cls ? `lm-icon ${cls}` : "lm-icon");
23
+ const classes = $derived(cls ? `ln-icon ${cls}` : "ln-icon");
24
24
 
25
25
  // lucide 0.563.0+ 图标格式为 [[tag, attrs], [tag, attrs], ...]
26
26
  type IconTuple = [string, Record<string, any>];
@@ -83,26 +83,26 @@
83
83
  if (src) status = 'loading'
84
84
  })
85
85
 
86
- const classes = $derived(`lm-image${hasPreview ? ' is-preview' : ''}${cls ? ` ${cls}` : ''}`)
86
+ const classes = $derived(`ln-image${hasPreview ? ' is-preview' : ''}${cls ? ` ${cls}` : ''}`)
87
87
  </script>
88
88
 
89
89
  <div class={classes} {...attrs}>
90
90
  {#if status === 'loading' && placeholder}
91
- <div class="lm-image__placeholder">
91
+ <div class="ln-image__placeholder">
92
92
  {@render placeholder()}
93
93
  </div>
94
94
  {/if}
95
95
 
96
96
  {#if status === 'error' && error}
97
- <div class="lm-image__error">
97
+ <div class="ln-image__error">
98
98
  {@render error()}
99
99
  </div>
100
100
  {:else if hasPreview}
101
- <button type="button" class="lm-image__wrapper" onclick={openPreview}>
102
- <img {src} {alt} class="lm-image__inner" style="object-fit: {fit}" loading={lazy ? 'lazy' : undefined} onload={handleLoad} onerror={handleError} />
101
+ <button type="button" class="ln-image__wrapper" onclick={openPreview}>
102
+ <img {src} {alt} class="ln-image__inner" style="object-fit: {fit}" loading={lazy ? 'lazy' : undefined} onload={handleLoad} onerror={handleError} />
103
103
  </button>
104
104
  {:else}
105
- <img {src} {alt} class="lm-image__inner" style="object-fit: {fit}" loading={lazy ? 'lazy' : undefined} onload={handleLoad} onerror={handleError} />
105
+ <img {src} {alt} class="ln-image__inner" style="object-fit: {fit}" loading={lazy ? 'lazy' : undefined} onload={handleLoad} onerror={handleError} />
106
106
  {/if}
107
107
 
108
108
  {#if children}
@@ -111,24 +111,24 @@
111
111
  </div>
112
112
 
113
113
  {#if showPreview}
114
- <div class="lm-image-viewer" role="dialog" aria-modal="true" tabindex="-1" onkeydown={handleKeydown} onclick={hideOnClickModal ? closePreview : undefined}>
115
- <div class="lm-image-viewer__mask"></div>
114
+ <div class="ln-image-viewer" role="dialog" aria-modal="true" tabindex="-1" onkeydown={handleKeydown} onclick={hideOnClickModal ? closePreview : undefined}>
115
+ <div class="ln-image-viewer__mask"></div>
116
116
 
117
- <button type="button" class="lm-image-viewer__close" onclick={closePreview} aria-label="Close">
117
+ <button type="button" class="ln-image-viewer__close" onclick={closePreview} aria-label="Close">
118
118
  <Icon icon={X} size={24} color="#fff" />
119
119
  </button>
120
120
 
121
121
  {#if previewSrcList.length > 1}
122
- <button type="button" class="lm-image-viewer__prev" onclick={prevImage} aria-label="Previous">
122
+ <button type="button" class="ln-image-viewer__prev" onclick={prevImage} aria-label="Previous">
123
123
  <Icon icon={ChevronLeft} size={24} color="#fff" />
124
124
  </button>
125
- <button type="button" class="lm-image-viewer__next" onclick={nextImage} aria-label="Next">
125
+ <button type="button" class="ln-image-viewer__next" onclick={nextImage} aria-label="Next">
126
126
  <Icon icon={ChevronRight} size={24} color="#fff" />
127
127
  </button>
128
128
  {/if}
129
129
 
130
- <div class="lm-image-viewer__canvas">
131
- <img src={currentPreviewSrc} alt="" class="lm-image-viewer__img" />
130
+ <div class="ln-image-viewer__canvas">
131
+ <img src={currentPreviewSrc} alt="" class="ln-image-viewer__img" />
132
132
  </div>
133
133
  </div>
134
134
  {/if}
@@ -41,7 +41,7 @@
41
41
  const suffixCount = $derived((suffix ? 1 : 0) + (showClear ? 1 : 0) + (showPwdToggle ? 1 : 0))
42
42
 
43
43
  const classes = $derived(
44
- `lm-input lm-input--${size}${disabled ? ' is-disabled' : ''}${focused ? ' is-focused' : ''}${prefix ? ' has-prefix' : ''}${suffixCount >= 1 ? ' has-suffix' : ''}${suffixCount >= 2 ? ' has-suffix-2' : ''}${suffixCount >= 3 ? ' has-suffix-3' : ''}${cls ? ` ${cls}` : ''}`
44
+ `ln-input ln-input--${size}${disabled ? ' is-disabled' : ''}${focused ? ' is-focused' : ''}${prefix ? ' has-prefix' : ''}${suffixCount >= 1 ? ' has-suffix' : ''}${suffixCount >= 2 ? ' has-suffix-2' : ''}${suffixCount >= 3 ? ' has-suffix-3' : ''}${cls ? ` ${cls}` : ''}`
45
45
  )
46
46
 
47
47
  const handleInput = (e: Event & { currentTarget: HTMLInputElement }): void => {
@@ -60,7 +60,7 @@
60
60
  }
61
61
 
62
62
  const handleAnimationStart = (e: AnimationEvent & { currentTarget: HTMLInputElement }): void => {
63
- if (e.animationName === 'lm-input-autofill') {
63
+ if (e.animationName === 'ln-input-autofill') {
64
64
  updateAutofillFromNode(e.currentTarget)
65
65
  }
66
66
  }
@@ -109,7 +109,7 @@
109
109
 
110
110
  <div class={classes}>
111
111
  {#if prefix}
112
- <span class="lm-input__prefix">
112
+ <span class="ln-input__prefix">
113
113
  {@render prefix()}
114
114
  </span>
115
115
  {/if}
@@ -122,7 +122,7 @@
122
122
  name={name}
123
123
  autocomplete={autocomplete as any}
124
124
  type={resolvedType}
125
- class="lm-input__inner"
125
+ class="ln-input__inner"
126
126
  {placeholder}
127
127
  {disabled}
128
128
  {readonly}
@@ -138,11 +138,11 @@
138
138
  />
139
139
 
140
140
  {#if suffix || showClear || showPwdToggle}
141
- <span class="lm-input__suffix">
141
+ <span class="ln-input__suffix">
142
142
  {#if showPwdToggle}
143
143
  <button
144
144
  type="button"
145
- class="lm-input__password"
145
+ class="ln-input__password"
146
146
  onmousedown={(e: MouseEvent) => {
147
147
  e.preventDefault()
148
148
  handleTogglePassword()
@@ -157,7 +157,7 @@
157
157
  {#if showClear}
158
158
  <button
159
159
  type="button"
160
- class="lm-input__clear"
160
+ class="ln-input__clear"
161
161
  onmousedown={(e: MouseEvent) => {
162
162
  e.preventDefault()
163
163
  handleClear()
@@ -78,31 +78,31 @@
78
78
  const isMaxDisabled = $derived((modelValue ?? 0) >= max)
79
79
 
80
80
  const classes = $derived(
81
- `lm-input-number lm-input-number--${size}${controls ? ' is-controls' : ''}${controlsPosition === 'right' ? ' is-controls-right' : ''}${disabled ? ' is-disabled' : ''}${isFocused ? ' is-focus' : ''}${cls ? ` ${cls}` : ''}`
81
+ `ln-input-number ln-input-number--${size}${controls ? ' is-controls' : ''}${controlsPosition === 'right' ? ' is-controls-right' : ''}${disabled ? ' is-disabled' : ''}${isFocused ? ' is-focus' : ''}${cls ? ` ${cls}` : ''}`
82
82
  )
83
83
  </script>
84
84
 
85
85
  <div class={classes} {...attrs}>
86
86
  {#if controls && controlsPosition !== 'right'}
87
- <button type="button" class="lm-input-number__decrease" disabled={disabled || isMinDisabled} onclick={decrease} tabindex="-1">
87
+ <button type="button" class="ln-input-number__decrease" disabled={disabled || isMinDisabled} onclick={decrease} tabindex="-1">
88
88
  <Icon icon={Minus} size={14} />
89
89
  </button>
90
90
  {/if}
91
91
 
92
- <input type="number" class="lm-input-number__input" value={modelValue} {min} {max} {step} {disabled} {readonly} {placeholder} oninput={handleInput} onfocus={() => isFocused = true} onblur={handleBlur} />
92
+ <input type="number" class="ln-input-number__input" value={modelValue} {min} {max} {step} {disabled} {readonly} {placeholder} oninput={handleInput} onfocus={() => isFocused = true} onblur={handleBlur} />
93
93
 
94
94
  {#if controls && controlsPosition !== 'right'}
95
- <button type="button" class="lm-input-number__increase" disabled={disabled || isMaxDisabled} onclick={increase} tabindex="-1">
95
+ <button type="button" class="ln-input-number__increase" disabled={disabled || isMaxDisabled} onclick={increase} tabindex="-1">
96
96
  <Icon icon={Plus} size={14} />
97
97
  </button>
98
98
  {/if}
99
99
 
100
100
  {#if controls && controlsPosition === 'right'}
101
- <div class="lm-input-number__controls">
102
- <button type="button" class="lm-input-number__increase" disabled={disabled || isMaxDisabled} onclick={increase} tabindex="-1">
101
+ <div class="ln-input-number__controls">
102
+ <button type="button" class="ln-input-number__increase" disabled={disabled || isMaxDisabled} onclick={increase} tabindex="-1">
103
103
  <Icon icon={ChevronUp} size={12} />
104
104
  </button>
105
- <button type="button" class="lm-input-number__decrease" disabled={disabled || isMinDisabled} onclick={decrease} tabindex="-1">
105
+ <button type="button" class="ln-input-number__decrease" disabled={disabled || isMinDisabled} onclick={decrease} tabindex="-1">
106
106
  <Icon icon={ChevronDown} size={12} />
107
107
  </button>
108
108
  </div>
@@ -39,8 +39,8 @@
39
39
 
40
40
  const classes = $derived(
41
41
  [
42
- 'lm-input-tag',
43
- `lm-input-tag--${size}`,
42
+ 'ln-input-tag',
43
+ `ln-input-tag--${size}`,
44
44
  disabled && 'is-disabled',
45
45
  readonly && 'is-readonly',
46
46
  focused && 'is-focused',
@@ -136,7 +136,7 @@
136
136
  </script>
137
137
 
138
138
  <div class={classes} onclick={focusInput} {...attrs}>
139
- <div class="lm-input-tag__inner">
139
+ <div class="ln-input-tag__inner">
140
140
  {#each modelValue as tag, i (allowDuplicates ? i : tag)}
141
141
  <Tag type={tagType} size={tagSize} closable={!disabled && !readonly} onclose={() => removeAt(i)}>
142
142
  {tag}
@@ -145,7 +145,7 @@
145
145
 
146
146
  <input
147
147
  bind:this={inputRef}
148
- class="lm-input-tag__input"
148
+ class="ln-input-tag__input"
149
149
  type="text"
150
150
  value={inputValue}
151
151
  placeholder={modelValue.length === 0 ? placeholder : ''}
@@ -15,7 +15,7 @@
15
15
 
16
16
  let { href, type = 'default', underline = true, disabled = false, children, onclick, target, rel, class: cls = '', ...attrs }: LinkProps = $props()
17
17
 
18
- const classes = $derived(`lm-link lm-link--${type}${underline ? ' is-underline' : ''}${disabled ? ' is-disabled' : ''}${cls ? ` ${cls}` : ''}`)
18
+ const classes = $derived(`ln-link ln-link--${type}${underline ? ' is-underline' : ''}${disabled ? ' is-disabled' : ''}${cls ? ` ${cls}` : ''}`)
19
19
 
20
20
  const handleClick = (e: MouseEvent): void => {
21
21
  if (disabled) {
@@ -24,11 +24,11 @@
24
24
  }
25
25
  })
26
26
 
27
- const classes = $derived(`lm-loading${fullscreen ? ' is-fullscreen' : ''}${cls ? ` ${cls}` : ''}`)
27
+ const classes = $derived(`ln-loading${fullscreen ? ' is-fullscreen' : ''}${cls ? ` ${cls}` : ''}`)
28
28
  const maskStyle = $derived.by(() => {
29
29
  if (!background) return undefined
30
30
  // 用 CSS 变量覆写默认遮罩背景(theme-chalk 会在 dark 下自动切换变量)
31
- return `--lm-loading-mask-bg: ${background}`
31
+ return `--ln-loading-mask-bg: ${background}`
32
32
  })
33
33
  </script>
34
34
 
@@ -38,17 +38,17 @@
38
38
  {/if}
39
39
 
40
40
  {#if visible}
41
- <div class="lm-loading__mask" style={maskStyle} role="status" aria-label="Loading">
42
- <div class="lm-loading__spinner">
41
+ <div class="ln-loading__mask" style={maskStyle} role="status" aria-label="Loading">
42
+ <div class="ln-loading__spinner">
43
43
  {#if spinner}
44
44
  {@render spinner()}
45
45
  {:else}
46
- <div class="lm-loading__icon">
46
+ <div class="ln-loading__icon">
47
47
  <Icon icon={Loader2} size={42} />
48
48
  </div>
49
49
  {/if}
50
50
  {#if text}
51
- <p class="lm-loading__text">{text}</p>
51
+ <p class="ln-loading__text">{text}</p>
52
52
  {/if}
53
53
  </div>
54
54
  </div>
@@ -209,7 +209,7 @@
209
209
 
210
210
  // CSS 类
211
211
  const classes = $derived(
212
- `lm-menu lm-menu--${mode}${collapsed ? " is-collapsed" : ""}${cls ? ` ${cls}` : ""}`,
212
+ `ln-menu ln-menu--${mode}${collapsed ? " is-collapsed" : ""}${cls ? ` ${cls}` : ""}`,
213
213
  );
214
214
 
215
215
  // 箭头图标
@@ -223,7 +223,7 @@
223
223
  {@const showSubmenu = shouldShowSubmenu(item)}
224
224
  {@const iconSize = depth === 0 ? 18 : 16}
225
225
  <li
226
- class="lm-menu__item"
226
+ class="ln-menu__item"
227
227
  class:is-active={isActive(item)}
228
228
  class:has-active-child={hasActiveChild(item)}
229
229
  class:is-disabled={item.disabled}
@@ -233,7 +233,7 @@
233
233
  onmouseleave={() => handleMouseLeave(item)}
234
234
  >
235
235
  <div
236
- class="lm-menu__item-content"
236
+ class="ln-menu__item-content"
237
237
  role="menuitem"
238
238
  tabindex={item.disabled ? -1 : 0}
239
239
  aria-haspopup={hasChildren ? "true" : undefined}
@@ -242,15 +242,15 @@
242
242
  onkeydown={(e: KeyboardEvent) => handleKeydown(item, e)}
243
243
  >
244
244
  {#if item.icon}
245
- <span class="lm-menu__item-icon">
245
+ <span class="ln-menu__item-icon">
246
246
  <Icon icon={item.icon} size={iconSize} />
247
247
  </span>
248
248
  {/if}
249
- <span class="lm-menu__item-label">{item.label}</span>
249
+ <span class="ln-menu__item-label">{item.label}</span>
250
250
  {#if hasChildren}
251
251
  <button
252
252
  type="button"
253
- class="lm-menu__item-arrow"
253
+ class="ln-menu__item-arrow"
254
254
  class:is-open={showSubmenu}
255
255
  tabindex={mode === "vertical" && !collapsed ? 0 : -1}
256
256
  aria-label="Toggle submenu"
@@ -264,7 +264,7 @@
264
264
  {#if hasChildren && showSubmenu}
265
265
  {#if mode === "horizontal" || collapsed}
266
266
  <ul
267
- class="lm-menu__popup{depth > 0 ? ' lm-menu__popup--nested' : ''}"
267
+ class="ln-menu__popup{depth > 0 ? ' ln-menu__popup--nested' : ''}"
268
268
  role="menu"
269
269
  transition:scale|global={{ duration: 150, start: 0.95, opacity: 0 }}
270
270
  >
@@ -274,7 +274,7 @@
274
274
  </ul>
275
275
  {:else}
276
276
  <ul
277
- class="lm-menu__submenu"
277
+ class="ln-menu__submenu"
278
278
  role="menu"
279
279
  transition:slide|global={{ duration: 200 }}
280
280
  >
@@ -288,10 +288,10 @@
288
288
  {/snippet}
289
289
 
290
290
  <nav bind:this={menuRef} class={classes} role="menu" {...attrs}>
291
- <ul class="lm-menu__list" role="menubar">
291
+ <ul class="ln-menu__list" role="menubar">
292
292
  {#each items as item (getItemId(item))}
293
293
  {#if item.group && (items.indexOf(item) === 0 || items[items.indexOf(item) - 1]?.group !== item.group)}
294
- <li class="lm-menu__group" role="presentation">
294
+ <li class="ln-menu__group" role="presentation">
295
295
  {#if !collapsed}{item.group}{/if}
296
296
  </li>
297
297
  {/if}
@@ -34,7 +34,7 @@
34
34
 
35
35
  const icon = $derived(icons[type]);
36
36
  const classes = $derived(
37
- `lm-message lm-message--${type}${center ? " is-center" : ""}${cls ? ` ${cls}` : ""}`,
37
+ `ln-message ln-message--${type}${center ? " is-center" : ""}${cls ? ` ${cls}` : ""}`,
38
38
  );
39
39
  </script>
40
40
 
@@ -45,12 +45,12 @@
45
45
  transition:fly={{ y: -20, duration: 250, opacity: 0 }}
46
46
  {...attrs}
47
47
  >
48
- <Icon {icon} class="lm-message__icon" />
49
- <span class="lm-message__content">{message}</span>
48
+ <Icon {icon} class="ln-message__icon" />
49
+ <span class="ln-message__content">{message}</span>
50
50
  {#if showClose}
51
51
  <button
52
52
  type="button"
53
- class="lm-message__close"
53
+ class="ln-message__close"
54
54
  onclick={onclose}
55
55
  aria-label="关闭"
56
56
  >
@@ -40,20 +40,20 @@
40
40
  {#each messages as message, index (message.id)}
41
41
  {#if message.visible}
42
42
  <div
43
- class="lm-message lm-message--{message.type}"
43
+ class="ln-message ln-message--{message.type}"
44
44
  class:is-center={message.center}
45
45
  class:is-closable={message.showClose}
46
46
  style="top: {getOffset(index)}px;"
47
47
  transition:fly={{ y: -20, duration: 250, opacity: 0 }}
48
48
  >
49
- <Icon icon={getIcon(message.type)} size={16} class="lm-message__icon" />
50
- <div class="lm-message__content">
49
+ <Icon icon={getIcon(message.type)} size={16} class="ln-message__icon" />
50
+ <div class="ln-message__content">
51
51
  {message.message}
52
52
  </div>
53
53
  {#if message.showClose}
54
54
  <button
55
55
  type="button"
56
- class="lm-message__close"
56
+ class="ln-message__close"
57
57
  onclick={() => onClose(message.id)}
58
58
  aria-label="Close"
59
59
  >
@@ -13,7 +13,7 @@ const ensureMounted = () => {
13
13
  return;
14
14
  if (!host) {
15
15
  host = document.createElement('div');
16
- host.className = 'lm-message-container';
16
+ host.className = 'ln-message-container';
17
17
  document.body.appendChild(host);
18
18
  }
19
19
  if (!instance) {