lapikit 0.6.3 → 0.6.5

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 (38) hide show
  1. package/dist/components/accordion/accordion.svelte +173 -35
  2. package/dist/components/accordion/accordion.types.d.ts +8 -3
  3. package/dist/components/accordion/modules/accordion-item.svelte +79 -74
  4. package/dist/components/alert/alert.svelte +204 -115
  5. package/dist/components/alert/alert.types.d.ts +8 -6
  6. package/dist/components/app/app.svelte +76 -37
  7. package/dist/components/appbar/appbar.svelte +116 -59
  8. package/dist/components/appbar/appbar.types.d.ts +5 -4
  9. package/dist/components/aspect-ratio/aspect-ratio.svelte +4 -13
  10. package/dist/components/aspect-ratio/aspect-ratio.types.d.ts +2 -1
  11. package/dist/components/avatar/avatar.svelte +117 -67
  12. package/dist/components/avatar/avatar.types.d.ts +7 -5
  13. package/dist/components/btn/btn.svelte +175 -171
  14. package/dist/components/btn/btn.types.d.ts +5 -2
  15. package/dist/components/card/card.svelte +11 -3
  16. package/dist/components/card/modules/card-actions.svelte +1 -1
  17. package/dist/components/chip/chip.svelte +172 -142
  18. package/dist/components/chip/chip.types.d.ts +7 -3
  19. package/dist/components/dialog/dialog.svelte +94 -83
  20. package/dist/components/dialog/dialog.types.d.ts +7 -5
  21. package/dist/components/dropdown/dropdown.svelte +47 -31
  22. package/dist/components/dropdown/dropdown.types.d.ts +4 -2
  23. package/dist/components/icon/icon.svelte +34 -51
  24. package/dist/components/list/list.svelte +10 -4
  25. package/dist/components/list/modules/list-item.svelte +10 -59
  26. package/dist/components/modal/modal.svelte +114 -102
  27. package/dist/components/modal/modal.types.d.ts +7 -5
  28. package/dist/components/popover/popover.svelte +54 -36
  29. package/dist/components/popover/popover.types.d.ts +4 -2
  30. package/dist/components/separator/separator.svelte +15 -23
  31. package/dist/components/separator/separator.types.d.ts +1 -2
  32. package/dist/components/textfield/textfield.svelte +181 -152
  33. package/dist/components/textfield/textfield.types.d.ts +4 -3
  34. package/dist/components/toolbar/toolbar.svelte +127 -103
  35. package/dist/components/toolbar/toolbar.types.d.ts +6 -7
  36. package/dist/components/tooltip/tooltip.svelte +40 -40
  37. package/dist/components/tooltip/tooltip.types.d.ts +3 -3
  38. package/package.json +1 -1
@@ -1,23 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { makeComponentProps } from '../../html-mapped';
3
- import { useClassName, useStyles, disabledScroll } from '../../utils';
4
- import type { DialogDensity, DialogPosition, DialogProps, DialogSize } from './dialog.types.js';
5
-
6
- function resolveSize(value: DialogSize | undefined): DialogSize {
7
- return value === 'xs' || value === 'sm' || value === 'md' || value === 'lg' || value === 'xl'
8
- ? value
9
- : 'md';
10
- }
11
-
12
- function resolvePosition(value: DialogPosition | undefined): DialogPosition {
13
- return value === 'top' || value === 'center' || value === 'bottom' ? value : 'center';
14
- }
15
-
16
- function resolveDensity(value: DialogDensity | undefined): DialogDensity {
17
- return value === 'compact' || value === 'comfortable' || value === 'default'
18
- ? value
19
- : 'default';
20
- }
3
+ import { useClassName, useStyles, disabledScroll, useElevation } from '../../utils';
4
+ import type { DialogProps } from './dialog.types.js';
21
5
 
22
6
  let {
23
7
  ref = $bindable(),
@@ -33,8 +17,10 @@
33
17
  density = 'default',
34
18
  rounded = 'md',
35
19
  classContent = '',
36
- color = undefined,
37
- background = undefined,
20
+ color,
21
+ background,
22
+ elevation = '2',
23
+ space,
38
24
  ...rest
39
25
  }: DialogProps = $props();
40
26
 
@@ -42,6 +28,8 @@
42
28
  makeComponentProps(rest as Record<string, unknown>)
43
29
  );
44
30
 
31
+ let elevationState = $derived(useElevation(elevation));
32
+
45
33
  let componentClass = $derived(
46
34
  useClassName({
47
35
  baseClass: 'kit-dialog',
@@ -65,19 +53,6 @@
65
53
  : `${classContent ?? ''}`.trim()
66
54
  );
67
55
 
68
- let safeSize = $derived(resolveSize(size));
69
- let safePosition = $derived(resolvePosition(position));
70
- let safeDensity = $derived(resolveDensity(density));
71
- let mergedStyle = $derived(
72
- [
73
- componentStyle,
74
- color ? `--kit-dialog-fg:${color}` : '',
75
- background ? `--kit-dialog-bg:${background}` : ''
76
- ]
77
- .filter(Boolean)
78
- .join('; ')
79
- );
80
-
81
56
  $effect(() => {
82
57
  if (!ref) return;
83
58
 
@@ -120,14 +95,24 @@
120
95
  if (event.target !== ref || persistent) return;
121
96
  open = false;
122
97
  }
98
+
99
+ let resolvedStyle = $derived(
100
+ [
101
+ componentStyle,
102
+ color ? `--kit-dialog-fg:${color && `var(--kit-color-${color})`}` : '',
103
+ background ? `--kit-dialog-bg:${background && `var(--kit-color-${background})`}` : ''
104
+ ]
105
+ .filter(Boolean)
106
+ .join('; ')
107
+ );
123
108
  </script>
124
109
 
125
110
  <dialog
126
111
  bind:this={ref}
127
112
  class={componentClass}
128
- style={mergedStyle}
129
- data-size={safeSize}
130
- data-position={safePosition}
113
+ style={resolvedStyle}
114
+ data-size={size}
115
+ data-position={position}
131
116
  data-persistent={persistent}
132
117
  onclose={handleClose}
133
118
  oncancel={handleCancel}
@@ -136,9 +121,15 @@
136
121
  <div
137
122
  {...restProps}
138
123
  class={['kit-dialog__content', contentClass]}
139
- data-density={safeDensity}
124
+ data-density={density}
140
125
  data-rounded={rounded}
126
+ data-elevation={elevationState.base}
127
+ data-elevation-hover={elevationState.hover}
128
+ data-elevation-active={elevationState.active}
141
129
  onclick={(event: MouseEvent) => event.stopPropagation()}
130
+ style:--kit-dialog-fg={color && `var(--kit-color-${color})`}
131
+ style:--kit-dialog-bg={background && `var(--kit-color-${background})`}
132
+ style:--kit-dialog-space={space}
142
133
  >
143
134
  {@render children?.()}
144
135
  </div>
@@ -146,14 +137,6 @@
146
137
 
147
138
  <style>
148
139
  .kit-dialog {
149
- --kit-dialog-bg: var(--kit-surface-1);
150
- --kit-dialog-fg: var(--kit-fg);
151
- --kit-dialog-bd: var(--kit-border);
152
- --kit-dialog-radius: 12px;
153
- --kit-dialog-px: 1rem;
154
- --kit-dialog-py: 1rem;
155
- --kit-dialog-max: min(32rem, calc(100vw - 2rem));
156
-
157
140
  border: 0;
158
141
  padding: 0;
159
142
  margin: auto;
@@ -165,97 +148,125 @@
165
148
  }
166
149
 
167
150
  .kit-dialog::backdrop {
168
- background: rgb(15 23 42 / 0.42);
151
+ background: color-mix(in oklab, var(--kit-color-shadow), transparent 70%);
169
152
  backdrop-filter: blur(2px);
170
153
  }
171
154
 
172
- .kit-dialog[data-position='top'] {
173
- margin-top: 1rem;
155
+ /**
156
+ * position
157
+ * @link nothing...
158
+ */
159
+ .kit-dialog[data-position='top'],
160
+ .kit-dialog[data-position='top-left'],
161
+ .kit-dialog[data-position='top-right'] {
162
+ margin-top: var(--kit-dialog-space, 1rem);
174
163
  margin-bottom: auto;
175
164
  }
176
-
177
- .kit-dialog[data-position='center'] {
165
+ .kit-dialog[data-position='center'],
166
+ .kit-dialog[data-position='center-left'],
167
+ .kit-dialog[data-position='center-right'] {
178
168
  margin-top: auto;
179
169
  margin-bottom: auto;
180
170
  }
181
-
182
- .kit-dialog[data-position='bottom'] {
171
+ .kit-dialog[data-position='bottom'],
172
+ .kit-dialog[data-position='bottom-left'],
173
+ .kit-dialog[data-position='bottom-right'] {
183
174
  margin-top: auto;
184
- margin-bottom: 1rem;
175
+ margin-bottom: var(--kit-dialog-space, 1rem);
176
+ }
177
+ .kit-dialog[data-position='top-left'] .kit-dialog__content,
178
+ .kit-dialog[data-position='center-left'] .kit-dialog__content,
179
+ .kit-dialog[data-position='bottom-left'] .kit-dialog__content {
180
+ margin-left: var(--kit-dialog-space, 1rem);
181
+ }
182
+ .kit-dialog[data-position='top-right'] .kit-dialog__content,
183
+ .kit-dialog[data-position='center-right'] .kit-dialog__content,
184
+ .kit-dialog[data-position='bottom-right'] .kit-dialog__content {
185
+ margin-right: var(--kit-dialog-space, 1rem);
185
186
  }
186
187
 
188
+ /**
189
+ * size
190
+ * @link nothing...
191
+ */
187
192
  .kit-dialog[data-size='xs'] {
188
- --kit-dialog-max: min(20rem, calc(100vw - 2rem));
193
+ --kit-dialog-max: 20rem;
194
+ --kit-dialog-px: 10px;
189
195
  }
190
196
 
191
197
  .kit-dialog[data-size='sm'] {
192
- --kit-dialog-max: min(24rem, calc(100vw - 2rem));
198
+ --kit-dialog-max: 24rem;
199
+ --kit-dialog-px: 12px;
193
200
  }
194
201
 
195
202
  .kit-dialog[data-size='md'] {
196
- --kit-dialog-max: min(32rem, calc(100vw - 2rem));
203
+ --kit-dialog-max: 32rem;
204
+ --kit-dialog-px: 16px;
197
205
  }
198
206
 
199
207
  .kit-dialog[data-size='lg'] {
200
- --kit-dialog-max: min(42rem, calc(100vw - 2rem));
208
+ --kit-dialog-max: 42rem;
209
+ --kit-dialog-px: 20px;
201
210
  }
202
211
 
203
212
  .kit-dialog[data-size='xl'] {
204
- --kit-dialog-max: min(56rem, calc(100vw - 2rem));
213
+ --kit-dialog-max: 56rem;
214
+ --kit-dialog-px: 24px;
205
215
  }
206
216
 
207
217
  .kit-dialog__content {
218
+ --kit-dialog-fg: var(--kit-color-text);
219
+ --kit-dialog-bg: var(--kit-color-surface-1);
220
+
208
221
  box-sizing: border-box;
209
- width: min(100%, var(--kit-dialog-max));
222
+ width: min(100%, min(var(--kit-dialog-max), calc(100vw - 2rem)));
210
223
  max-height: calc(100dvh - 2rem);
211
224
  overflow: auto;
212
- padding: var(--kit-dialog-py) var(--kit-dialog-px);
213
- border: 1px solid var(--kit-dialog-bd);
225
+ padding: calc(var(--kit-dialog-px) * var(--kit-dialog-density-scale));
226
+ border: 0;
214
227
  border-radius: var(--kit-dialog-radius);
215
228
  background: var(--kit-dialog-bg);
216
229
  color: var(--kit-dialog-fg);
217
230
  margin: 0 auto;
218
- box-shadow:
219
- 0 20px 50px rgb(15 23 42 / 0.18),
220
- 0 4px 16px rgb(15 23 42 / 0.1);
221
231
  }
222
232
 
233
+ /**
234
+ * density
235
+ * @link no links
236
+ */
237
+ .kit-dialog__content[data-density='none'] {
238
+ --kit-dialog-density-scale: 0;
239
+ }
223
240
  .kit-dialog__content[data-density='compact'] {
224
- --kit-dialog-px: 0.75rem;
225
- --kit-dialog-py: 0.75rem;
241
+ --kit-dialog-density-scale: 0.9;
226
242
  }
227
-
228
243
  .kit-dialog__content[data-density='default'] {
229
- --kit-dialog-px: 1rem;
230
- --kit-dialog-py: 1rem;
244
+ --kit-dialog-density-scale: 1;
231
245
  }
232
-
233
246
  .kit-dialog__content[data-density='comfortable'] {
234
- --kit-dialog-px: 1.25rem;
235
- --kit-dialog-py: 1.25rem;
247
+ --kit-dialog-density-scale: 1.1;
236
248
  }
237
249
 
250
+ /**
251
+ * rounded
252
+ * @link ...
253
+ */
238
254
  .kit-dialog__content[data-rounded='0'] {
239
- --kit-dialog-radius: 0;
255
+ --kit-dialog-radius: var(--kit-shape-none);
240
256
  }
241
-
242
257
  .kit-dialog__content[data-rounded='xs'] {
243
- --kit-dialog-radius: 2px;
258
+ --kit-dialog-radius: var(--kit-shape-xs);
244
259
  }
245
-
246
260
  .kit-dialog__content[data-rounded='sm'] {
247
- --kit-dialog-radius: 6px;
261
+ --kit-dialog-radius: var(--kit-shape-sm);
248
262
  }
249
-
250
263
  .kit-dialog__content[data-rounded='md'] {
251
- --kit-dialog-radius: 12px;
264
+ --kit-dialog-radius: var(--kit-shape-md);
252
265
  }
253
-
254
266
  .kit-dialog__content[data-rounded='lg'] {
255
- --kit-dialog-radius: 18px;
267
+ --kit-dialog-radius: var(--kit-shape-lg);
256
268
  }
257
-
258
269
  .kit-dialog__content[data-rounded='xl'] {
259
- --kit-dialog-radius: 9999px;
270
+ --kit-dialog-radius: var(--kit-shape-xl);
260
271
  }
261
272
  </style>
@@ -1,16 +1,18 @@
1
- import type { Component, RoundedType } from '../../@types';
2
- export type DialogSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
3
- export type DialogPosition = 'top' | 'center' | 'bottom';
4
- export type DialogDensity = 'compact' | 'comfortable' | 'default';
1
+ import type { Component, DensityType, ElevationProps, RoundedType } from '../../@types';
2
+ type DialogSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
3
+ type DialogPosition = 'top' | 'center' | 'bottom' | 'top-left' | 'top-right' | 'center-left' | 'center-right' | 'bottom-left' | 'bottom-right';
5
4
  export interface DialogProps extends Component {
6
5
  ref?: HTMLDialogElement | null;
7
6
  open?: boolean;
8
7
  persistent?: boolean;
9
8
  size?: DialogSize;
10
9
  position?: DialogPosition;
11
- density?: DialogDensity;
10
+ density?: DensityType;
12
11
  rounded?: RoundedType;
13
12
  classContent?: string | string[] | undefined;
14
13
  color?: string;
15
14
  background?: string;
15
+ elevation?: ElevationProps;
16
+ space?: string;
16
17
  }
18
+ export {};
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { onDestroy } from 'svelte';
3
- import { useClassName, useStyles, clickOutside } from '../../utils';
3
+ import { useClassName, useStyles, clickOutside, useElevation } from '../../utils';
4
4
  import { makeComponentProps } from '../../html-mapped';
5
5
  import { getPositions } from './dropdown.svelte.js';
6
6
  import type { DropdownProps, ModelDropdownProps } from './dropdown.types.js';
@@ -9,29 +9,27 @@
9
9
  ref = $bindable(),
10
10
  children,
11
11
  activator,
12
- rounded,
12
+ rounded = 'md',
13
13
  position = 'bottom',
14
14
  closeOnClick = false,
15
15
  openOnHover = false,
16
16
  color,
17
17
  background,
18
+ density = 'default',
18
19
  class: className = '',
19
20
  style: styleAttr = '',
20
21
  's-class': sClass,
21
22
  's-style': sStyle,
23
+ elevation,
22
24
  ...rest
23
25
  }: DropdownProps = $props();
24
26
 
25
- let safePosition = $derived(
26
- position === 'top' || position === 'bottom' || position === 'left' || position === 'right'
27
- ? position
28
- : 'bottom'
29
- );
30
-
31
27
  let { classProps, styleProps, restProps } = $derived(
32
28
  makeComponentProps(rest as Record<string, unknown>)
33
29
  );
34
30
 
31
+ let elevationState = $derived(useElevation(elevation));
32
+
35
33
  let componentClass = $derived(
36
34
  useClassName({
37
35
  baseClass: 'kit-dropdown-content',
@@ -49,14 +47,11 @@
49
47
  })
50
48
  );
51
49
 
52
- let mergedStyle = $derived(
50
+ let resolvedStyle = $derived(
53
51
  [
54
52
  componentStyle,
55
- background ? `--kit-dropdown-bg:${background}` : '',
56
- color ? `--kit-dropdown-fg:${color}` : '',
57
- typeof rounded === 'string' && rounded.includes('px')
58
- ? `--kit-dropdown-radius:${rounded}`
59
- : ''
53
+ color ? `--kit-dropdown-fg:${color && `var(--kit-color-${color})`}` : '',
54
+ background ? `--kit-dropdown-bg:${background && `var(--kit-color-${background})`}` : ''
60
55
  ]
61
56
  .filter(Boolean)
62
57
  .join('; ')
@@ -83,7 +78,7 @@
83
78
 
84
79
  const updatePosition = () => {
85
80
  if (!contentRef || !activatorRef) return;
86
- positioner.update(activatorRef, contentRef, safePosition, false, true);
81
+ positioner.update(activatorRef, contentRef, position, false, true);
87
82
  axis = positioner.values;
88
83
  };
89
84
 
@@ -167,16 +162,20 @@
167
162
  <div
168
163
  bind:this={contentRef}
169
164
  class={componentClass}
170
- style={`left:${axis.x}px; top:${axis.y}px; ${mergedStyle}`}
165
+ style={`left:${axis.x}px; top:${axis.y}px; ${resolvedStyle}`}
171
166
  role="menu"
172
167
  data-rounded={rounded}
173
- data-position={axis.location ?? safePosition}
168
+ data-position={axis.location ?? position}
169
+ data-density={density}
174
170
  onmouseover={() => handleMouseEvent('open', activatorRef)}
175
171
  onmouseleave={() => handleMouseEvent('close', activatorRef)}
176
172
  onclick={(event) => {
177
173
  event.stopPropagation();
178
174
  handleContentClick();
179
175
  }}
176
+ data-elevation={elevationState.base}
177
+ data-elevation-hover={elevationState.hover}
178
+ data-elevation-active={elevationState.active}
180
179
  use:clickOutside={{ exclude: [contentRef, activatorRef], onClose: handleClose }}
181
180
  {...restProps}
182
181
  >
@@ -186,43 +185,60 @@
186
185
 
187
186
  <style>
188
187
  .kit-dropdown-content {
189
- --kit-dropdown-bg: var(--kit-surface-1);
190
- --kit-dropdown-fg: var(--kit-fg);
191
- --kit-dropdown-radius: 12px;
192
- --kit-dropdown-bd: color-mix(in oklab, var(--kit-fg), transparent 88%);
193
- --kit-dropdown-shadow: 0 18px 40px -18px color-mix(in oklab, black 24%, transparent);
188
+ --kit-dropdown-bg: var(--kit-color-surface-3);
189
+ --kit-dropdown-fg: var(--kit-color-text);
194
190
 
195
191
  position: fixed;
196
192
  z-index: 1800;
197
193
  min-width: 12rem;
198
194
  max-width: min(22rem, calc(100vw - 1rem));
199
- padding: 0.375rem;
200
- border: 1px solid var(--kit-dropdown-bd);
195
+ padding: 0.375rem calc(0.375rem * var(--kit-dropdown-density-scale));
196
+ border: 0;
201
197
  border-radius: var(--kit-dropdown-radius);
202
198
  background: var(--kit-dropdown-bg);
203
199
  color: var(--kit-dropdown-fg);
204
- box-shadow: var(--kit-dropdown-shadow);
205
200
  transform-origin: top left;
206
201
  animation: kit-dropdown-enter 140ms ease;
207
202
  }
208
203
 
204
+ /**
205
+ * rounded
206
+ * @link ...
207
+ */
209
208
  .kit-dropdown-content[data-rounded='0'] {
210
- --kit-dropdown-radius: 0;
209
+ --kit-dropdown-radius: var(--kit-shape-none);
211
210
  }
212
211
  .kit-dropdown-content[data-rounded='xs'] {
213
- --kit-dropdown-radius: 2px;
212
+ --kit-dropdown-radius: var(--kit-shape-xs);
214
213
  }
215
214
  .kit-dropdown-content[data-rounded='sm'] {
216
- --kit-dropdown-radius: 4px;
215
+ --kit-dropdown-radius: var(--kit-shape-sm);
217
216
  }
218
217
  .kit-dropdown-content[data-rounded='md'] {
219
- --kit-dropdown-radius: 8px;
218
+ --kit-dropdown-radius: var(--kit-shape-md);
220
219
  }
221
220
  .kit-dropdown-content[data-rounded='lg'] {
222
- --kit-dropdown-radius: 16px;
221
+ --kit-dropdown-radius: var(--kit-shape-lg);
223
222
  }
224
223
  .kit-dropdown-content[data-rounded='xl'] {
225
- --kit-dropdown-radius: 99999px;
224
+ --kit-dropdown-radius: var(--kit-shape-xl);
225
+ }
226
+
227
+ /**
228
+ * density
229
+ * @link no url
230
+ */
231
+ .kit-dropdown-content[data-density='none'] {
232
+ --kit-dropdown-density-scale: 0;
233
+ }
234
+ .kit-dropdown-content[data-density='compact'] {
235
+ --kit-dropdown-density-scale: 0.8;
236
+ }
237
+ .kit-dropdown-content[data-density='default'] {
238
+ --kit-dropdown-density-scale: 1;
239
+ }
240
+ .kit-dropdown-content[data-density='comfortable'] {
241
+ --kit-dropdown-density-scale: 1.15;
226
242
  }
227
243
 
228
244
  @keyframes kit-dropdown-enter {
@@ -1,4 +1,4 @@
1
- import type { Component, PropValue, RoundedType } from '../../@types/index';
1
+ import type { Component, DensityType, ElevationProps, PropValue, RoundedType } from '../../@types/index';
2
2
  import type { Snippet } from 'svelte';
3
3
  export type PositionElement = {
4
4
  x: number;
@@ -13,15 +13,17 @@ export type ModelDropdownProps = {
13
13
  export type ModelDropdownHandleProps = (state: 'open' | 'close', element: HTMLElement | PointerEvent | null) => void;
14
14
  export interface DropdownProps extends Component {
15
15
  ref?: HTMLElement | null;
16
- rounded?: RoundedType | string;
16
+ rounded?: RoundedType;
17
17
  position?: 'top' | 'bottom' | 'left' | 'right';
18
18
  openOnHover?: boolean;
19
19
  closeOnClick?: boolean;
20
20
  color?: string;
21
21
  background?: string;
22
+ density?: DensityType;
22
23
  activator?: Snippet<[
23
24
  ModelDropdownProps,
24
25
  (state: 'open' | 'close', element: HTMLElement | PointerEvent | null) => void
25
26
  ]>;
26
27
  [key: string]: PropValue | Record<string, PropValue> | unknown;
28
+ elevation?: ElevationProps;
27
29
  }
@@ -47,12 +47,14 @@
47
47
  })
48
48
  );
49
49
 
50
- let safeSize = $derived(
51
- size === 'default' || size === undefined
52
- ? undefined
53
- : size === 'xs' || size === 'sm' || size === 'md' || size === 'lg' || size === 'xl'
54
- ? size
55
- : 'md'
50
+ let resolvedStyle = $derived(
51
+ [
52
+ componentStyle,
53
+ color ? `--kit-icon-color:${color && `var(--kit-color-${color})`}` : '',
54
+ color ? `color:${color && `var(--kit-color-${color})`}` : ''
55
+ ]
56
+ .filter(Boolean)
57
+ .join('; ')
56
58
  );
57
59
 
58
60
  let resolvedSrc = $derived(src ?? (icon?.includes('/') ? icon : undefined));
@@ -65,32 +67,16 @@
65
67
  : componentClass
66
68
  );
67
69
 
68
- let safeLoading = $derived(loading === 'lazy' || loading === 'eager' ? loading : 'eager');
69
- let safeDecoding = $derived(
70
- decoding === 'async' || decoding === 'sync' || decoding === 'auto' ? decoding : 'async'
71
- );
72
- let safeColorMode = $derived(
73
- colorMode === 'auto' || colorMode === 'none' || colorMode === 'mask' || colorMode === 'filter'
74
- ? colorMode
75
- : 'auto'
76
- );
77
-
78
70
  let iconRole = $derived(!decorative && (label || alt) ? 'img' : undefined);
79
71
  let iconAriaLabel = $derived(!decorative ? label || alt || undefined : undefined);
80
72
  let iconAriaHidden = $derived(decorative ? true : undefined);
81
73
  let imgAlt = $derived(decorative ? '' : alt || label || '');
82
74
  let isSvgSrc = $derived(!!resolvedSrc && /\.svg($|\?)/i.test(resolvedSrc));
83
75
  let useMaskMode = $derived(
84
- !!resolvedSrc &&
85
- (color ? safeColorMode === 'mask' || (safeColorMode === 'auto' && isSvgSrc) : false)
76
+ !!resolvedSrc && (color ? colorMode === 'mask' || (colorMode === 'auto' && isSvgSrc) : false)
86
77
  );
87
78
  let useFilterMode = $derived(
88
- !!resolvedSrc && !!imgFilter && (safeColorMode === 'filter' || safeColorMode === 'auto')
89
- );
90
- let mergedStyle = $derived(
91
- [componentStyle, color ? `color:${color}` : '', color ? `--kit-icon-color:${color}` : '']
92
- .filter(Boolean)
93
- .join('; ')
79
+ !!resolvedSrc && !!imgFilter && (colorMode === 'filter' || colorMode === 'auto')
94
80
  );
95
81
  </script>
96
82
 
@@ -99,8 +85,8 @@
99
85
  this={is}
100
86
  bind:this={ref}
101
87
  class={classWithIconName}
102
- style={mergedStyle}
103
- data-size={safeSize}
88
+ style={resolvedStyle}
89
+ data-size={size}
104
90
  role={iconRole}
105
91
  aria-label={iconAriaLabel}
106
92
  aria-hidden={iconAriaHidden}
@@ -119,8 +105,8 @@
119
105
  <img
120
106
  src={resolvedSrc}
121
107
  alt={imgAlt}
122
- loading={safeLoading}
123
- decoding={safeDecoding}
108
+ {loading}
109
+ {decoding}
124
110
  style={useFilterMode ? `filter:${imgFilter}` : undefined}
125
111
  />
126
112
  {/if}
@@ -130,13 +116,6 @@
130
116
 
131
117
  <style>
132
118
  .kit-icon {
133
- --kit-icon-size-xs: 0.875rem;
134
- --kit-icon-size-sm: 1rem;
135
- --kit-icon-size-md: 1.125rem;
136
- --kit-icon-size-lg: 1.25rem;
137
- --kit-icon-size-xl: 1.375rem;
138
- --kit-icon-current-size: var(--kit-icon-size-md);
139
-
140
119
  display: inline-flex;
141
120
  align-items: center;
142
121
  justify-content: center;
@@ -146,22 +125,6 @@
146
125
  vertical-align: middle;
147
126
  }
148
127
 
149
- .kit-icon[data-size='xs'] {
150
- --kit-icon-current-size: var(--kit-icon-size-xs);
151
- }
152
- .kit-icon[data-size='sm'] {
153
- --kit-icon-current-size: var(--kit-icon-size-sm);
154
- }
155
- .kit-icon[data-size='md'] {
156
- --kit-icon-current-size: var(--kit-icon-size-md);
157
- }
158
- .kit-icon[data-size='lg'] {
159
- --kit-icon-current-size: var(--kit-icon-size-lg);
160
- }
161
- .kit-icon[data-size='xl'] {
162
- --kit-icon-current-size: var(--kit-icon-size-xl);
163
- }
164
-
165
128
  .kit-icon :global(svg),
166
129
  .kit-icon img,
167
130
  .kit-icon .kit-icon__mask {
@@ -183,4 +146,24 @@
183
146
  -webkit-mask-size: contain;
184
147
  -webkit-mask-position: center;
185
148
  }
149
+
150
+ /**
151
+ * size
152
+ * @link https://lapikit.dev/docs/components/icon#size
153
+ */
154
+ .kit-icon[data-size='xs'] {
155
+ --kit-icon-current-size: 0.875rem;
156
+ }
157
+ .kit-icon[data-size='sm'] {
158
+ --kit-icon-current-size: 1rem;
159
+ }
160
+ .kit-icon[data-size='md'] {
161
+ --kit-icon-current-size: 1.125rem;
162
+ }
163
+ .kit-icon[data-size='lg'] {
164
+ --kit-icon-current-size: 1.25rem;
165
+ }
166
+ .kit-icon[data-size='xl'] {
167
+ --kit-icon-current-size: 1.375rem;
168
+ }
186
169
  </style>
@@ -42,22 +42,28 @@
42
42
  })
43
43
  );
44
44
 
45
- let mergedStyle = $derived([componentStyle].filter(Boolean).join('; '));
45
+ let resolvedStyle = $derived(
46
+ [
47
+ componentStyle,
48
+ color ? `--kit-list-item-fg:${color && `var(--kit-color-${color})`}` : '',
49
+ background ? `--kit-list-item-bg:${background && `var(--kit-color-${background})`}` : ''
50
+ ]
51
+ .filter(Boolean)
52
+ .join('; ')
53
+ );
46
54
  </script>
47
55
 
48
56
  <svelte:element
49
57
  this={is}
50
58
  bind:this={ref}
51
59
  class={componentClass}
52
- style={mergedStyle}
60
+ style={resolvedStyle}
53
61
  data-size={size}
54
62
  data-variant={variant}
55
63
  data-density={density}
56
64
  data-rounded={rounded}
57
65
  data-nav={nav}
58
66
  role={nav ? 'navigation' : is === 'ul' ? undefined : 'list'}
59
- style:--kit-list-item-fg={color && `var(--kit-color-${color})`}
60
- style:--kit-list-item-bg={background && `var(--kit-color-${background})`}
61
67
  {...restProps}
62
68
  >
63
69
  {@render children?.()}