lapikit 0.6.3 → 0.6.4

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 (35) hide show
  1. package/dist/components/accordion/accordion.svelte +172 -42
  2. package/dist/components/accordion/accordion.types.d.ts +8 -3
  3. package/dist/components/accordion/modules/accordion-item.svelte +71 -72
  4. package/dist/components/alert/alert.svelte +201 -118
  5. package/dist/components/alert/alert.types.d.ts +8 -6
  6. package/dist/components/app/app.svelte +4 -4
  7. package/dist/components/appbar/appbar.svelte +115 -64
  8. package/dist/components/appbar/appbar.types.d.ts +4 -4
  9. package/dist/components/aspect-ratio/aspect-ratio.svelte +4 -12
  10. package/dist/components/aspect-ratio/aspect-ratio.types.d.ts +2 -1
  11. package/dist/components/avatar/avatar.svelte +108 -66
  12. package/dist/components/avatar/avatar.types.d.ts +7 -5
  13. package/dist/components/btn/btn.svelte +167 -169
  14. package/dist/components/btn/btn.types.d.ts +5 -2
  15. package/dist/components/chip/chip.svelte +162 -140
  16. package/dist/components/chip/chip.types.d.ts +7 -3
  17. package/dist/components/dialog/dialog.svelte +84 -81
  18. package/dist/components/dialog/dialog.types.d.ts +7 -5
  19. package/dist/components/dropdown/dropdown.svelte +46 -36
  20. package/dist/components/dropdown/dropdown.types.d.ts +4 -2
  21. package/dist/components/icon/icon.svelte +28 -52
  22. package/dist/components/list/modules/list-item.svelte +0 -55
  23. package/dist/components/modal/modal.svelte +104 -98
  24. package/dist/components/modal/modal.types.d.ts +7 -5
  25. package/dist/components/popover/popover.svelte +46 -34
  26. package/dist/components/popover/popover.types.d.ts +3 -1
  27. package/dist/components/separator/separator.svelte +11 -30
  28. package/dist/components/separator/separator.types.d.ts +1 -2
  29. package/dist/components/textfield/textfield.svelte +180 -157
  30. package/dist/components/textfield/textfield.types.d.ts +4 -3
  31. package/dist/components/toolbar/toolbar.svelte +126 -108
  32. package/dist/components/toolbar/toolbar.types.d.ts +6 -7
  33. package/dist/components/tooltip/tooltip.svelte +39 -45
  34. package/dist/components/tooltip/tooltip.types.d.ts +3 -3
  35. package/package.json +1 -1
@@ -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,18 +47,7 @@
49
47
  })
50
48
  );
51
49
 
52
- let mergedStyle = $derived(
53
- [
54
- 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
- : ''
60
- ]
61
- .filter(Boolean)
62
- .join('; ')
63
- );
50
+ let mergedStyle = $derived([componentStyle].filter(Boolean).join('; '));
64
51
 
65
52
  const positioner = getPositions();
66
53
 
@@ -83,7 +70,7 @@
83
70
 
84
71
  const updatePosition = () => {
85
72
  if (!contentRef || !activatorRef) return;
86
- positioner.update(activatorRef, contentRef, safePosition, false, true);
73
+ positioner.update(activatorRef, contentRef, position, false, true);
87
74
  axis = positioner.values;
88
75
  };
89
76
 
@@ -170,14 +157,20 @@
170
157
  style={`left:${axis.x}px; top:${axis.y}px; ${mergedStyle}`}
171
158
  role="menu"
172
159
  data-rounded={rounded}
173
- data-position={axis.location ?? safePosition}
160
+ data-position={axis.location ?? position}
161
+ data-density={density}
174
162
  onmouseover={() => handleMouseEvent('open', activatorRef)}
175
163
  onmouseleave={() => handleMouseEvent('close', activatorRef)}
176
164
  onclick={(event) => {
177
165
  event.stopPropagation();
178
166
  handleContentClick();
179
167
  }}
168
+ data-elevation={elevationState.base}
169
+ data-elevation-hover={elevationState.hover}
170
+ data-elevation-active={elevationState.active}
180
171
  use:clickOutside={{ exclude: [contentRef, activatorRef], onClose: handleClose }}
172
+ style:--kit-dropdown-fg={color && `var(--kit-color-${color})`}
173
+ style:--kit-dropdown-bg={background && `var(--kit-color-${background})`}
181
174
  {...restProps}
182
175
  >
183
176
  {@render children?.()}
@@ -186,43 +179,60 @@
186
179
 
187
180
  <style>
188
181
  .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);
182
+ --kit-dropdown-bg: var(--kit-color-surface-3);
183
+ --kit-dropdown-fg: var(--kit-color-text);
194
184
 
195
185
  position: fixed;
196
186
  z-index: 1800;
197
187
  min-width: 12rem;
198
188
  max-width: min(22rem, calc(100vw - 1rem));
199
- padding: 0.375rem;
200
- border: 1px solid var(--kit-dropdown-bd);
189
+ padding: 0.375rem calc(0.375rem * var(--kit-dropdown-density-scale));
190
+ border: 0;
201
191
  border-radius: var(--kit-dropdown-radius);
202
192
  background: var(--kit-dropdown-bg);
203
193
  color: var(--kit-dropdown-fg);
204
- box-shadow: var(--kit-dropdown-shadow);
205
194
  transform-origin: top left;
206
195
  animation: kit-dropdown-enter 140ms ease;
207
196
  }
208
197
 
198
+ /**
199
+ * rounded
200
+ * @link ...
201
+ */
209
202
  .kit-dropdown-content[data-rounded='0'] {
210
- --kit-dropdown-radius: 0;
203
+ --kit-dropdown-radius: var(--kit-shape-none);
211
204
  }
212
205
  .kit-dropdown-content[data-rounded='xs'] {
213
- --kit-dropdown-radius: 2px;
206
+ --kit-dropdown-radius: var(--kit-shape-xs);
214
207
  }
215
208
  .kit-dropdown-content[data-rounded='sm'] {
216
- --kit-dropdown-radius: 4px;
209
+ --kit-dropdown-radius: var(--kit-shape-sm);
217
210
  }
218
211
  .kit-dropdown-content[data-rounded='md'] {
219
- --kit-dropdown-radius: 8px;
212
+ --kit-dropdown-radius: var(--kit-shape-md);
220
213
  }
221
214
  .kit-dropdown-content[data-rounded='lg'] {
222
- --kit-dropdown-radius: 16px;
215
+ --kit-dropdown-radius: var(--kit-shape-lg);
223
216
  }
224
217
  .kit-dropdown-content[data-rounded='xl'] {
225
- --kit-dropdown-radius: 99999px;
218
+ --kit-dropdown-radius: var(--kit-shape-xl);
219
+ }
220
+
221
+ /**
222
+ * density
223
+ * @link no url
224
+ */
225
+ .kit-dropdown-content[data-density='none'] {
226
+ --kit-dropdown-density-scale: 0;
227
+ }
228
+ .kit-dropdown-content[data-density='compact'] {
229
+ --kit-dropdown-density-scale: 0.8;
230
+ }
231
+ .kit-dropdown-content[data-density='default'] {
232
+ --kit-dropdown-density-scale: 1;
233
+ }
234
+ .kit-dropdown-content[data-density='comfortable'] {
235
+ --kit-dropdown-density-scale: 1.15;
226
236
  }
227
237
 
228
238
  @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,14 +47,6 @@
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'
56
- );
57
-
58
50
  let resolvedSrc = $derived(src ?? (icon?.includes('/') ? icon : undefined));
59
51
  let resolvedName = $derived(name ?? (!icon?.includes('/') ? icon : undefined));
60
52
  let hasChildren = $derived(!!children);
@@ -65,33 +57,18 @@
65
57
  : componentClass
66
58
  );
67
59
 
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
60
  let iconRole = $derived(!decorative && (label || alt) ? 'img' : undefined);
79
61
  let iconAriaLabel = $derived(!decorative ? label || alt || undefined : undefined);
80
62
  let iconAriaHidden = $derived(decorative ? true : undefined);
81
63
  let imgAlt = $derived(decorative ? '' : alt || label || '');
82
64
  let isSvgSrc = $derived(!!resolvedSrc && /\.svg($|\?)/i.test(resolvedSrc));
83
65
  let useMaskMode = $derived(
84
- !!resolvedSrc &&
85
- (color ? safeColorMode === 'mask' || (safeColorMode === 'auto' && isSvgSrc) : false)
66
+ !!resolvedSrc && (color ? colorMode === 'mask' || (colorMode === 'auto' && isSvgSrc) : false)
86
67
  );
87
68
  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('; ')
69
+ !!resolvedSrc && !!imgFilter && (colorMode === 'filter' || colorMode === 'auto')
94
70
  );
71
+ let mergedStyle = $derived([componentStyle].filter(Boolean).join('; '));
95
72
  </script>
96
73
 
97
74
  {#if hasContent}
@@ -100,10 +77,12 @@
100
77
  bind:this={ref}
101
78
  class={classWithIconName}
102
79
  style={mergedStyle}
103
- data-size={safeSize}
80
+ data-size={size}
104
81
  role={iconRole}
105
82
  aria-label={iconAriaLabel}
106
83
  aria-hidden={iconAriaHidden}
84
+ style:--kit-icon-color={color && `var(--kit-color-${color})`}
85
+ style:color={color && `var(--kit-color-${color})`}
107
86
  {...restProps}
108
87
  >
109
88
  {#if hasChildren}
@@ -119,8 +98,8 @@
119
98
  <img
120
99
  src={resolvedSrc}
121
100
  alt={imgAlt}
122
- loading={safeLoading}
123
- decoding={safeDecoding}
101
+ {loading}
102
+ {decoding}
124
103
  style={useFilterMode ? `filter:${imgFilter}` : undefined}
125
104
  />
126
105
  {/if}
@@ -130,13 +109,6 @@
130
109
 
131
110
  <style>
132
111
  .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
112
  display: inline-flex;
141
113
  align-items: center;
142
114
  justify-content: center;
@@ -146,22 +118,6 @@
146
118
  vertical-align: middle;
147
119
  }
148
120
 
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
121
  .kit-icon :global(svg),
166
122
  .kit-icon img,
167
123
  .kit-icon .kit-icon__mask {
@@ -183,4 +139,24 @@
183
139
  -webkit-mask-size: contain;
184
140
  -webkit-mask-position: center;
185
141
  }
142
+
143
+ /**
144
+ * size
145
+ * @link https://lapikit.dev/docs/components/icon#size
146
+ */
147
+ .kit-icon[data-size='xs'] {
148
+ --kit-icon-current-size: 0.875rem;
149
+ }
150
+ .kit-icon[data-size='sm'] {
151
+ --kit-icon-current-size: 1rem;
152
+ }
153
+ .kit-icon[data-size='md'] {
154
+ --kit-icon-current-size: 1.125rem;
155
+ }
156
+ .kit-icon[data-size='lg'] {
157
+ --kit-icon-current-size: 1.25rem;
158
+ }
159
+ .kit-icon[data-size='xl'] {
160
+ --kit-icon-current-size: 1.375rem;
161
+ }
186
162
  </style>
@@ -214,59 +214,4 @@
214
214
  .kit-list-item[data-rounded='full'] {
215
215
  --kit-list-item-radius: var(--kit-shape-full);
216
216
  }
217
-
218
- /* :global(.kit-list[data-variant='filled']) .kit-list-item {
219
- background: var(--kit-list-item-bg, transparent);
220
- }
221
-
222
- :global(.kit-list[data-variant='filled']) .kit-list-item[data-active='true'] {
223
- background: color-mix(in oklab, currentColor 12%, transparent);
224
- } */
225
-
226
- /* :global(.kit-list[data-variant='outline']) .kit-list-item::before {
227
- content: '';
228
- position: absolute;
229
- inset: 0;
230
- border: 1px solid color-mix(in oklab, currentColor 16%, transparent);
231
- border-radius: inherit;
232
- pointer-events: none;
233
- } */
234
-
235
- /* .kit-list-item[data-active='true'] {
236
- background: color-mix(in oklab, currentColor 12%, transparent);
237
- }
238
-
239
- .kit-list-item[data-disabled='true'] {
240
- opacity: 0.45;
241
- pointer-events: none;
242
- }
243
-
244
- .kit-list-item:is(button, a) {
245
- cursor: pointer;
246
- }
247
-
248
- .kit-list-item__prepend,
249
- .kit-list-item__append,
250
- .kit-list-item__content {
251
- display: inline-flex;
252
- align-items: center;
253
- min-width: 0;
254
- }
255
-
256
- .kit-list-item__content {
257
- overflow: hidden;
258
- text-overflow: ellipsis;
259
- white-space: nowrap;
260
- }
261
-
262
- .kit-list-item:is(button, a):hover::after,
263
- .kit-list-item:is(button, a):focus-visible::after {
264
- content: '';
265
- position: absolute;
266
- inset: 0;
267
- border-radius: inherit;
268
- background: currentColor;
269
- opacity: 0.06;
270
- pointer-events: none;
271
- } */
272
217
  </style>