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,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { useClassName, useStyles } from '../../utils';
2
+ import { useClassName, useElevation, useStyles } from '../../utils';
3
3
  import { makeComponentProps } from '../../html-mapped';
4
4
  import { ripple } from '../../animations';
5
5
  import type { ButtonProps } from './btn.types.js';
@@ -16,8 +16,8 @@
16
16
  density = 'default',
17
17
  loading,
18
18
  active = false,
19
- size = 'default',
20
- rounded,
19
+ size = 'md',
20
+ rounded = 'sm',
21
21
  disabled = false,
22
22
  block,
23
23
  href,
@@ -32,31 +32,18 @@
32
32
  append,
33
33
  prepend,
34
34
  icon,
35
+ elevation,
36
+ color,
37
+ background,
35
38
  ...rest
36
39
  }: ButtonProps = $props();
37
40
 
38
- let safeVariant = $derived(
39
- variant === 'filled' || variant === 'outline' || variant === 'text' || variant === 'link'
40
- ? variant
41
- : 'filled'
42
- );
43
- let safeSize = $derived(
44
- size === 'default'
45
- ? 'md'
46
- : size === 'xs' || size === 'sm' || size === 'md' || size === 'lg' || size === 'xl'
47
- ? size
48
- : 'md'
49
- );
50
- let safeDensity = $derived(
51
- density === 'compact' || density === 'comfortable' || density === 'default'
52
- ? density
53
- : 'default'
54
- );
55
-
56
41
  let { classProps, styleProps, restProps } = $derived(
57
42
  makeComponentProps(rest as Record<string, unknown>)
58
43
  );
59
44
 
45
+ let elevationState = $derived(useElevation(elevation));
46
+
60
47
  let componentClass = $derived(
61
48
  useClassName({
62
49
  baseClass: 'kit-btn',
@@ -85,6 +72,16 @@
85
72
  if (tag !== 'button') return type;
86
73
  return type ?? 'button';
87
74
  });
75
+
76
+ let resolvedStyle = $derived(
77
+ [
78
+ componentStyle,
79
+ color ? `--kit-btn-fg:${color && `var(--kit-color-${color})`}` : '',
80
+ background ? `--kit-btn-bg:${background && `var(--kit-color-${background})`}` : ''
81
+ ]
82
+ .filter(Boolean)
83
+ .join('; ')
84
+ );
88
85
  </script>
89
86
 
90
87
  {#if isInput}
@@ -92,25 +89,28 @@
92
89
  this={inputWrapperTag}
93
90
  bind:this={ref}
94
91
  class={componentClass}
95
- style={componentStyle}
96
- data-size={safeSize}
97
- data-variant={safeVariant}
92
+ style={resolvedStyle}
93
+ data-size={size}
94
+ data-variant={variant}
98
95
  data-loading={loading}
99
96
  data-active={active}
100
97
  data-disabled={isDisabled}
101
- data-density={safeDensity}
98
+ data-density={density}
102
99
  data-rounded={rounded}
103
100
  aria-busy={disabled}
104
101
  aria-disabled={isDisabled || undefined}
105
102
  data-block={block}
106
103
  data-wide={wide}
107
104
  data-icon={icon}
105
+ data-elevation={elevationState.base}
106
+ data-elevation-hover={elevationState.hover}
107
+ data-elevation-active={elevationState.active}
108
108
  use:ripple={{
109
109
  component: 'btn',
110
110
  disabled: noRipple || disabled
111
111
  }}
112
112
  >
113
- {#if safeVariant === 'outline'}
113
+ {#if variant === 'outline'}
114
114
  <span class="outline"></span>
115
115
  {/if}
116
116
  <input
@@ -130,16 +130,15 @@
130
130
  this={tag}
131
131
  bind:this={ref}
132
132
  class={componentClass}
133
- style={componentStyle}
134
- {...restProps}
133
+ style={resolvedStyle}
135
134
  type={resolvedType()}
136
135
  href={resolvedHref}
137
- data-size={safeSize}
138
- data-variant={safeVariant}
136
+ data-size={size}
137
+ data-variant={variant}
139
138
  data-loading={loading}
140
139
  data-active={active}
141
140
  data-disabled={isDisabled}
142
- data-density={safeDensity}
141
+ data-density={density}
143
142
  data-rounded={rounded}
144
143
  disabled={resolvedDisabled}
145
144
  aria-busy={disabled}
@@ -147,12 +146,16 @@
147
146
  data-block={block}
148
147
  data-wide={wide}
149
148
  data-icon={icon}
149
+ data-elevation={elevationState.base}
150
+ data-elevation-hover={elevationState.hover}
151
+ data-elevation-active={elevationState.active}
150
152
  use:ripple={{
151
153
  component: 'btn',
152
154
  disabled: noRipple || disabled
153
155
  }}
156
+ {...restProps}
154
157
  >
155
- {#if safeVariant === 'outline'}
158
+ {#if variant === 'outline'}
156
159
  <span class="outline"></span>
157
160
  {/if}
158
161
 
@@ -209,26 +212,6 @@
209
212
  }
210
213
 
211
214
  .kit-btn {
212
- --kit-btn-bg: var(--kit-surface-2);
213
- --kit-btn-fg: var(--kit-fg);
214
- --kit-btn-bd: var(--kit-border);
215
- --kit-btn-hover-bg: color-mix(in oklab, var(--kit-btn-bg), var(--kit-btn-fg) 6%);
216
- --kit-btn-active-bg: color-mix(in oklab, var(--kit-btn-bg), var(--kit-btn-fg) 10%);
217
- --kit-btn-h-xs: 28px;
218
- --kit-btn-h-sm: 32px;
219
- --kit-btn-h-md: 40px;
220
- --kit-btn-h-lg: 48px;
221
- --kit-btn-h-xl: 56px;
222
- --kit-btn-px-xs: 10px;
223
- --kit-btn-px-sm: 12px;
224
- --kit-btn-px-md: 16px;
225
- --kit-btn-px-lg: 20px;
226
- --kit-btn-px-xl: 24px;
227
- --kit-btn-density-scale: 1;
228
- --kit-btn-density-h-scale: 1;
229
- --kit-btn-radius: 8px;
230
- --kit-btn-gap: 0.45em;
231
-
232
215
  position: relative;
233
216
  display: inline-flex;
234
217
  box-sizing: border-box;
@@ -237,7 +220,7 @@
237
220
  font-family: var(--kit-font);
238
221
  background: var(--kit-btn-bg);
239
222
  color: var(--kit-btn-fg);
240
- height: max(28px, calc(var(--kit-btn-h) * var(--kit-btn-density-h-scale)));
223
+ height: calc(var(--kit-btn-h) * var(--kit-btn-density-h-scale));
241
224
  padding-inline: calc(var(--kit-btn-px) * var(--kit-btn-density-scale));
242
225
  border-radius: var(--kit-btn-radius);
243
226
  text-decoration: none;
@@ -303,124 +286,6 @@
303
286
  cursor: pointer;
304
287
  }
305
288
 
306
- /* variant */
307
- .kit-btn[data-variant='filled'] {
308
- --kit-btn-bg: var(--kit-accent);
309
- --kit-btn-fg: white;
310
- --kit-btn-hover-bg: color-mix(in oklab, var(--kit-btn-bg), black 10%);
311
- --kit-btn-active-bg: color-mix(in oklab, var(--kit-btn-bg), black 16%);
312
- }
313
-
314
- .kit-btn[data-variant='outline'] {
315
- --outline-color: var(--kit-accent);
316
- --kit-btn-bg: transparent;
317
- --kit-btn-fg: var(--kit-accent);
318
- --kit-btn-hover-bg: color-mix(in oklab, var(--kit-btn-fg), transparent 80%);
319
- --kit-btn-active-bg: color-mix(in oklab, var(--kit-btn-fg), transparent 92%);
320
- }
321
-
322
- .kit-btn[data-variant='text'] {
323
- --kit-btn-bg: transparent;
324
- --kit-btn-fg: var(--kit-accent);
325
- --kit-btn-hover-bg: color-mix(in oklab, var(--kit-btn-fg), transparent 80%);
326
- --kit-btn-active-bg: color-mix(in oklab, var(--kit-btn-fg), transparent 92%);
327
- }
328
-
329
- .kit-btn[data-variant='link'] {
330
- --kit-btn-bg: transparent;
331
- --kit-btn-fg: var(--kit-accent);
332
- --kit-btn-decoration: underline;
333
- height: inherit;
334
- padding: 0;
335
- }
336
-
337
- /* size */
338
- .kit-btn[data-size='xs'] {
339
- --kit-btn-h: var(--kit-btn-h-xs);
340
- --kit-btn-px: var(--kit-btn-px-xs);
341
- font-size: 12px;
342
- }
343
- .kit-btn[data-size='xs'] :global(.kit-icon:not([data-size])) {
344
- --kit-icon-current-size: var(--kit-icon-size-xs);
345
- }
346
-
347
- .kit-btn[data-size='sm'] {
348
- --kit-btn-h: var(--kit-btn-h-sm);
349
- --kit-btn-px: var(--kit-btn-px-sm);
350
- font-size: 13px;
351
- }
352
- .kit-btn[data-size='sm'] :global(.kit-icon:not([data-size])) {
353
- --kit-icon-current-size: var(--kit-icon-size-sm);
354
- }
355
-
356
- .kit-btn[data-size='md'] {
357
- --kit-btn-h: var(--kit-btn-h-md);
358
- --kit-btn-px: var(--kit-btn-px-md);
359
- font-size: 14px;
360
- }
361
- .kit-btn[data-size='md'] :global(.kit-icon:not([data-size])) {
362
- --kit-icon-current-size: var(--kit-icon-size-md);
363
- }
364
-
365
- .kit-btn[data-size='lg'] {
366
- --kit-btn-h: var(--kit-btn-h-lg);
367
- --kit-btn-px: var(--kit-btn-px-lg);
368
- font-size: 15px;
369
- }
370
- .kit-btn[data-size='lg'] :global(.kit-icon:not([data-size])) {
371
- --kit-icon-current-size: var(--kit-icon-size-lg);
372
- }
373
-
374
- .kit-btn[data-size='xl'] {
375
- --kit-btn-h: var(--kit-btn-h-xl);
376
- --kit-btn-px: var(--kit-btn-px-xl);
377
- font-size: 16px;
378
- }
379
- .kit-btn[data-size='xl'] :global(.kit-icon:not([data-size])) {
380
- --kit-icon-current-size: var(--kit-icon-size-xl);
381
- }
382
-
383
- /* density */
384
- .kit-btn[data-density='default'] {
385
- --kit-btn-density-scale: 1;
386
- --kit-btn-density-h-scale: 1;
387
- }
388
-
389
- .kit-btn[data-density='compact'] {
390
- --kit-btn-density-scale: 0.9;
391
- --kit-btn-density-h-scale: 0.92;
392
- }
393
-
394
- .kit-btn[data-density='comfortable'] {
395
- --kit-btn-density-scale: 1.1;
396
- --kit-btn-density-h-scale: 1.08;
397
- }
398
-
399
- /* rounded */
400
- .kit-btn[data-rounded='0'] {
401
- --kit-btn-radius: 0;
402
- }
403
-
404
- .kit-btn[data-rounded='xs'] {
405
- --kit-btn-radius: 2px;
406
- }
407
-
408
- .kit-btn[data-rounded='sm'] {
409
- --kit-btn-radius: 4px;
410
- }
411
-
412
- .kit-btn[data-rounded='md'] {
413
- --kit-btn-radius: 8px;
414
- }
415
-
416
- .kit-btn[data-rounded='lg'] {
417
- --kit-btn-radius: 16px;
418
- }
419
-
420
- .kit-btn[data-rounded='xl'] {
421
- --kit-btn-radius: 99999px;
422
- }
423
-
424
289
  .kit-btn[data-wide='true'] {
425
290
  width: 100%;
426
291
  max-width: 16rem;
@@ -517,4 +382,143 @@
517
382
  .kit-btn[data-disabled='true'] > input {
518
383
  cursor: not-allowed;
519
384
  }
385
+
386
+ /**
387
+ * size
388
+ * @link nothing...
389
+ */
390
+ .kit-btn[data-size='xs'] {
391
+ --kit-btn-h: 28px;
392
+ --kit-btn-px: 10px;
393
+ --kit-btn-gap: 4px;
394
+ --kit-btn-font: 0.75rem;
395
+ }
396
+ .kit-btn[data-size='xs'] :global(.kit-icon:not([data-size])) {
397
+ --kit-icon-current-size: var(--kit-icon-size-xs);
398
+ }
399
+ .kit-btn[data-size='sm'] {
400
+ --kit-btn-h: 32px;
401
+ --kit-btn-px: 12px;
402
+ --kit-btn-gap: 6px;
403
+ --kit-btn-font: 0.875rem;
404
+ }
405
+ .kit-btn[data-size='sm'] :global(.kit-icon:not([data-size])) {
406
+ --kit-icon-current-size: var(--kit-icon-size-sm);
407
+ }
408
+
409
+ .kit-btn[data-size='md'] {
410
+ --kit-btn-h: 40px;
411
+ --kit-btn-px: 16px;
412
+ --kit-btn-gap: 8px;
413
+ --kit-btn-font: 1rem;
414
+ }
415
+ .kit-btn[data-size='md'] :global(.kit-icon:not([data-size])) {
416
+ --kit-icon-current-size: var(--kit-icon-size-md);
417
+ }
418
+
419
+ .kit-btn[data-size='lg'] {
420
+ --kit-btn-h: 48px;
421
+ --kit-btn-px: 20px;
422
+ --kit-btn-gap: 10px;
423
+ --kit-btn-font: 1.125rem;
424
+ }
425
+ .kit-btn[data-size='lg'] :global(.kit-icon:not([data-size])) {
426
+ --kit-icon-current-size: var(--kit-icon-size-lg);
427
+ }
428
+
429
+ .kit-btn[data-size='xl'] {
430
+ --kit-btn-h: 56px;
431
+ --kit-btn-px: 24px;
432
+ --kit-btn-gap: 12px;
433
+ --kit-btn-font: 1.25rem;
434
+ }
435
+ .kit-btn[data-size='xl'] :global(.kit-icon:not([data-size])) {
436
+ --kit-icon-current-size: var(--kit-icon-size-xl);
437
+ }
438
+
439
+ /**
440
+ * density
441
+ * @link no links
442
+ */
443
+ .kit-btn[data-density='none'] {
444
+ --kit-btn-density-scale: 0;
445
+ --kit-btn-density-h-scale: 0;
446
+ }
447
+ .kit-btn[data-density='compact'] {
448
+ --kit-btn-density-scale: 0.9;
449
+ --kit-btn-density-h-scale: 0.92;
450
+ }
451
+ .kit-btn[data-density='default'] {
452
+ --kit-btn-density-scale: 1;
453
+ --kit-btn-density-h-scale: 1;
454
+ }
455
+ .kit-btn[data-density='comfortable'] {
456
+ --kit-btn-density-scale: 1.1;
457
+ --kit-btn-density-h-scale: 1.15;
458
+ }
459
+
460
+ /**
461
+ * rounded
462
+ * @link ...
463
+ */
464
+ .kit-btn[data-rounded='0'] {
465
+ --kit-btn-radius: var(--kit-shape-none);
466
+ }
467
+ .kit-btn[data-rounded='xs'] {
468
+ --kit-btn-radius: var(--kit-shape-xs);
469
+ }
470
+ .kit-btn[data-rounded='sm'] {
471
+ --kit-btn-radius: var(--kit-shape-sm);
472
+ }
473
+ .kit-btn[data-rounded='md'] {
474
+ --kit-btn-radius: var(--kit-shape-md);
475
+ }
476
+ .kit-btn[data-rounded='lg'] {
477
+ --kit-btn-radius: var(--kit-shape-lg);
478
+ }
479
+ .kit-btn[data-rounded='xl'] {
480
+ --kit-btn-radius: var(--kit-shape-xl);
481
+ }
482
+ .kit-btn[data-rounded='full'] {
483
+ --kit-btn-radius: var(--kit-shape-full);
484
+ }
485
+
486
+ /**
487
+ * variant
488
+ * @link no links...
489
+ */
490
+ .kit-btn[data-variant='filled'] {
491
+ --kit-btn-bg: var(--kit-color-surface-2);
492
+ --kit-btn-fg: var(--kit-color-text);
493
+
494
+ --kit-btn-hover-bg: color-mix(in oklab, var(--kit-btn-bg), black 10%);
495
+ --kit-btn-active-bg: color-mix(in oklab, var(--kit-btn-bg), black 16%);
496
+ }
497
+ .kit-btn[data-variant='outline'] {
498
+ --kit-btn-bg: transparent;
499
+ --kit-btn-fg: var(--kit-color-text);
500
+ --kit-btn-bd: var(--kit-btn-fg);
501
+
502
+ --kit-btn-hover-bg: color-mix(in oklab, var(--kit-btn-fg), transparent 80%);
503
+ --kit-btn-active-bg: color-mix(in oklab, var(--kit-btn-fg), transparent 92%);
504
+ }
505
+ .kit-btn[data-variant='text'] {
506
+ --kit-btn-bg: transparent;
507
+ --kit-btn-fg: var(--kit-color-text);
508
+
509
+ --kit-btn-hover-bg: color-mix(in oklab, var(--kit-btn-fg), transparent 80%);
510
+ --kit-btn-active-bg: color-mix(in oklab, var(--kit-btn-fg), transparent 92%);
511
+ }
512
+ .kit-btn[data-variant='link'] {
513
+ --kit-btn-bg: transparent;
514
+ --kit-btn-fg: var(--kit-color-text);
515
+ --kit-btn-decoration: underline;
516
+
517
+ height: inherit;
518
+ padding: 0;
519
+ }
520
+
521
+ .kit-btn .outline {
522
+ --outline-color: var(--kit-btn-bd);
523
+ }
520
524
  </style>
@@ -1,4 +1,4 @@
1
- import type { Component, RoundedType, SizeType } from '../../@types';
1
+ import type { Component, DensityType, ElevationProps, RoundedType, SizeType } from '../../@types';
2
2
  import type { Snippet } from 'svelte';
3
3
  export interface ButtonProps extends Component {
4
4
  ref?: HTMLElement | null;
@@ -6,7 +6,7 @@ export interface ButtonProps extends Component {
6
6
  input?: boolean;
7
7
  href?: string;
8
8
  variant?: 'outline' | 'text' | 'filled' | 'link';
9
- density?: 'compact' | 'comfortable' | 'default';
9
+ density?: DensityType;
10
10
  active?: boolean;
11
11
  loading?: boolean;
12
12
  disabled?: boolean;
@@ -23,4 +23,7 @@ export interface ButtonProps extends Component {
23
23
  load?: Snippet;
24
24
  append?: Snippet;
25
25
  prepend?: Snippet;
26
+ elevation?: ElevationProps;
27
+ color?: string;
28
+ background?: string;
26
29
  }
@@ -55,13 +55,23 @@
55
55
  styleProps
56
56
  })
57
57
  );
58
+
59
+ let resolvedStyle = $derived(
60
+ [
61
+ componentStyle,
62
+ color ? `--kit-card-fg:${color && `var(--kit-color-${color})`}` : '',
63
+ background ? `--kit-card-bg:${background && `var(--kit-color-${background})`}` : ''
64
+ ]
65
+ .filter(Boolean)
66
+ .join('; ')
67
+ );
58
68
  </script>
59
69
 
60
70
  <svelte:element
61
71
  this={tag}
62
72
  bind:this={ref}
63
73
  class={componentClass}
64
- style={componentStyle}
74
+ style={resolvedStyle}
65
75
  href={resolvedHref}
66
76
  type={resolvedType}
67
77
  disabled={resolvedDisabled}
@@ -80,8 +90,6 @@
80
90
  component: 'card',
81
91
  disabled: noRipple || disabled || !isInteractive
82
92
  }}
83
- style:--kit-card-fg={color && `var(--kit-color-${color})`}
84
- style:--kit-card-bg={background && `var(--kit-color-${background})`}
85
93
  {...restProps}
86
94
  >
87
95
  {#if variant === 'outline'}
@@ -48,6 +48,6 @@
48
48
  .kit-card-actions {
49
49
  display: inline-flex;
50
50
  align-items: center;
51
- gap: var(--kit-space-1);
51
+ gap: var(--kit-space-compact);
52
52
  }
53
53
  </style>