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,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 Icon from '../icon/icon.svelte';
5
5
  import type { TextfieldProps } from './textfield.types.js';
@@ -34,7 +34,7 @@
34
34
  readonly = false,
35
35
  color,
36
36
  background,
37
- rounded,
37
+ rounded = 'md',
38
38
  class: className = '',
39
39
  style: styleAttr = '',
40
40
  's-class': sClass,
@@ -43,29 +43,16 @@
43
43
  id,
44
44
  autocomplete,
45
45
  inputmode,
46
+ elevation,
46
47
  ...rest
47
48
  }: TextfieldProps = $props();
48
49
 
49
- let safeVariant = $derived(
50
- variant === 'filled' || variant === 'outline' || variant === 'text' ? variant : 'filled'
51
- );
52
- let safeSize = $derived(
53
- size === 'default'
54
- ? 'md'
55
- : size === 'xs' || size === 'sm' || size === 'md' || size === 'lg' || size === 'xl'
56
- ? size
57
- : 'md'
58
- );
59
- let safeDensity = $derived(
60
- density === 'compact' || density === 'comfortable' || density === 'default'
61
- ? density
62
- : 'default'
63
- );
64
-
65
50
  let { classProps, styleProps, restProps } = $derived(
66
51
  makeComponentProps(rest as Record<string, unknown>)
67
52
  );
68
53
 
54
+ let elevationState = $derived(useElevation(elevation));
55
+
69
56
  let componentClass = $derived(
70
57
  useClassName({
71
58
  baseClass: 'kit-textfield',
@@ -83,18 +70,7 @@
83
70
  })
84
71
  );
85
72
 
86
- let mergedStyle = $derived(
87
- [
88
- componentStyle,
89
- background ? `--kit-textfield-bg:${background}` : '',
90
- color ? `--kit-textfield-fg:${color}` : '',
91
- typeof rounded === 'string' && rounded.includes('px')
92
- ? `--kit-textfield-radius:${rounded}`
93
- : ''
94
- ]
95
- .filter(Boolean)
96
- .join('; ')
97
- );
73
+ let mergedStyle = $derived([componentStyle].filter(Boolean).join('; '));
98
74
 
99
75
  let counterValue = $state(0);
100
76
  let displayMessage = $state(false);
@@ -148,14 +124,17 @@
148
124
  class={componentClass}
149
125
  style={mergedStyle}
150
126
  {...restProps}
151
- data-size={safeSize}
152
- data-variant={safeVariant}
153
- data-density={safeDensity}
127
+ data-size={size}
128
+ data-variant={variant}
129
+ data-density={density}
154
130
  data-disabled={disabled}
155
131
  data-readonly={readonly}
156
132
  data-error={error}
157
133
  data-hide-spin-buttons={type === 'number' && hideSpinButtons}
158
134
  data-rounded={rounded}
135
+ data-with-message={(messageValue || messagePrefix || messageSuffix || counter) && true}
136
+ style:--kit-textfield-fg={color && `var(--kit-color-${color})`}
137
+ style:--kit-textfield-bg={background && `var(--kit-color-${background})`}
159
138
  >
160
139
  {#if prepend}
161
140
  <div class="kit-textfield__prepend">
@@ -164,11 +143,16 @@
164
143
  {/if}
165
144
 
166
145
  <div class="kit-textfield__control">
167
- <div class="kit-textfield__field">
168
- {#if safeVariant === 'outline' || safeVariant === 'filled'}
146
+ <div
147
+ class="kit-textfield__field"
148
+ data-elevation={elevationState.base}
149
+ data-elevation-hover={elevationState.hover}
150
+ data-elevation-active={elevationState.active}
151
+ >
152
+ {#if variant === 'outline' || variant === 'filled'}
169
153
  <span class="outline"></span>
170
154
  {/if}
171
- {#if safeVariant === 'text'}
155
+ {#if variant === 'text'}
172
156
  <span class="line"></span>
173
157
  {/if}
174
158
 
@@ -234,29 +218,31 @@
234
218
  </div>
235
219
  {/if}
236
220
 
237
- <div class="kit-textfield__message" data-visible={displayMessage}>
238
- <div
239
- class="kit-textfield__message-inner"
240
- data-error={error || undefined}
241
- id={messageValue ? `${id ?? name ?? 'textfield'}-message` : undefined}
242
- >
243
- {#if messagePrefix}
244
- <div class="kit-textfield__message-prefix">{messagePrefix}</div>
245
- {/if}
246
- {#if messageValue}
247
- <div class="kit-textfield__message-text">{messageValue}</div>
248
- {/if}
249
- {#if counter || messageSuffix}
250
- <div class="kit-textfield__message-suffix">
251
- {#if counter}
252
- {counterValue}{max ? `/${max}` : ''}
253
- {:else if messageSuffix}
254
- {messageSuffix}
255
- {/if}
256
- </div>
257
- {/if}
221
+ {#if messageValue || messagePrefix || messageSuffix || counter}
222
+ <div class="kit-textfield__message" data-visible={displayMessage}>
223
+ <div
224
+ class="kit-textfield__message-inner"
225
+ data-error={error || undefined}
226
+ id={messageValue ? `${id ?? name ?? 'textfield'}-message` : undefined}
227
+ >
228
+ {#if messagePrefix}
229
+ <div class="kit-textfield__message-prefix">{messagePrefix}</div>
230
+ {/if}
231
+ {#if messageValue}
232
+ <div class="kit-textfield__message-text">{messageValue}</div>
233
+ {/if}
234
+ {#if counter || messageSuffix}
235
+ <div class="kit-textfield__message-suffix">
236
+ {#if counter}
237
+ {counterValue}{max ? `/${max}` : ''}
238
+ {:else if messageSuffix}
239
+ {messageSuffix}
240
+ {/if}
241
+ </div>
242
+ {/if}
243
+ </div>
258
244
  </div>
259
- </div>
245
+ {/if}
260
246
  </div>
261
247
 
262
248
  <style>
@@ -284,151 +270,181 @@
284
270
  }
285
271
 
286
272
  .kit-textfield {
287
- --kit-textfield-bg: var(--kit-surface-2);
288
- --kit-textfield-fg: var(--kit-fg);
289
- --kit-textfield-bd: color-mix(in oklab, var(--kit-textfield-fg), transparent 84%);
290
- --kit-textfield-radius: 8px;
291
- --kit-textfield-font-size: 14px;
292
- --kit-textfield-gap-base: 8px;
293
- --kit-textfield-px-base: 14px;
294
- --kit-textfield-py-base: 12px;
295
- --kit-textfield-message-offset-base: 8px;
296
- --kit-textfield-density-gap-adjust: 0px;
297
- --kit-textfield-density-px-adjust: 0px;
298
- --kit-textfield-density-py-adjust: 0px;
299
- --kit-textfield-density-message-adjust: 0px;
300
- --kit-textfield-gap: calc(
301
- var(--kit-textfield-gap-base) + var(--kit-textfield-density-gap-adjust)
302
- );
303
- --kit-textfield-px: calc(var(--kit-textfield-px-base) + var(--kit-textfield-density-px-adjust));
304
- --kit-textfield-py: calc(var(--kit-textfield-py-base) + var(--kit-textfield-density-py-adjust));
305
- --kit-textfield-message-offset: calc(
306
- var(--kit-textfield-message-offset-base) + var(--kit-textfield-density-message-adjust)
307
- );
308
-
309
273
  display: grid;
274
+ grid-template-columns: auto minmax(0, 1fr) auto;
275
+ align-items: start;
276
+ column-gap: var(--kit-textfield-gap);
277
+ width: 100%;
278
+ font-size: var(--kit-textfield-font);
279
+ }
280
+
281
+ .kit-textfield:not([data-with-message='true']) {
282
+ grid-template-areas: 'prepend control append';
283
+ grid-template-rows: auto;
284
+ }
285
+ .kit-textfield[data-with-message='true'] {
310
286
  grid-template-areas:
311
287
  'prepend control append'
312
288
  '. message .';
313
- grid-template-columns: auto minmax(0, 1fr) auto;
314
289
  grid-template-rows: auto auto;
315
- align-items: start;
316
- column-gap: 16px;
317
- width: 100%;
318
- font-size: var(--kit-textfield-font-size);
319
290
  }
320
291
 
321
- .kit-textfield[data-size='xs'] {
322
- --kit-textfield-font-size: 12px;
323
- --kit-textfield-gap-base: 6px;
324
- --kit-textfield-px-base: 10px;
325
- --kit-textfield-py-base: 8px;
292
+ .kit-textfield[data-disabled='true'] {
293
+ opacity: 0.55;
294
+ pointer-events: none;
326
295
  }
327
296
 
297
+ .kit-textfield[data-readonly='true'] input {
298
+ cursor: default;
299
+ }
300
+
301
+ .kit-textfield[data-hide-spin-buttons='true'] input[type='number'] {
302
+ appearance: textfield;
303
+ -moz-appearance: textfield;
304
+ }
305
+
306
+ .kit-textfield[data-hide-spin-buttons='true'] input[type='number']::-webkit-inner-spin-button,
307
+ .kit-textfield[data-hide-spin-buttons='true'] input[type='number']::-webkit-outer-spin-button {
308
+ appearance: none;
309
+ -webkit-appearance: none;
310
+ margin: 0;
311
+ }
312
+
313
+ /**
314
+ * size
315
+ * @link nothing...
316
+ */
317
+ .kit-textfield[data-size='xs'] {
318
+ --kit-textfield-h: 28px;
319
+ --kit-textfield-px: 6px;
320
+ --kit-textfield-py: 10px;
321
+ --kit-textfield-gap: 8px;
322
+ --kit-textfield-font: 12px;
323
+ }
324
+ .kit-textfield[data-size='xs'] :global(.kit-icon[data-size='default']) {
325
+ --kit-icon-current-size: 0.875rem;
326
+ }
328
327
  .kit-textfield[data-size='sm'] {
329
- --kit-textfield-font-size: 13px;
330
- --kit-textfield-gap-base: 6px;
331
- --kit-textfield-px-base: 12px;
332
- --kit-textfield-py-base: 10px;
328
+ --kit-textfield-h: 32px;
329
+ --kit-textfield-px: 14px;
330
+ --kit-textfield-py: 12px;
331
+ --kit-textfield-gap: 6px;
332
+ --kit-textfield-font: 13px;
333
+ }
334
+ .kit-textfield[data-size='sm'] :global(.kit-icon[data-size='default']) {
335
+ --kit-icon-current-size: 1rem;
333
336
  }
334
337
 
335
338
  .kit-textfield[data-size='md'] {
336
- --kit-textfield-font-size: 14px;
337
- --kit-textfield-gap-base: 8px;
338
- --kit-textfield-px-base: 14px;
339
- --kit-textfield-py-base: 12px;
339
+ --kit-textfield-h: 40px;
340
+ --kit-textfield-px: 14px;
341
+ --kit-textfield-py: 12px;
342
+ --kit-textfield-gap: 8px;
343
+ --kit-textfield-font: 14px;
344
+ }
345
+ .kit-textfield[data-size='md'] :global(.kit-icon[data-size='default']) {
346
+ --kit-icon-current-size: 1.125rem;
340
347
  }
341
348
 
342
349
  .kit-textfield[data-size='lg'] {
343
- --kit-textfield-font-size: 15px;
344
- --kit-textfield-gap-base: 10px;
345
- --kit-textfield-px-base: 16px;
346
- --kit-textfield-py-base: 14px;
350
+ --kit-textfield-h: 48px;
351
+ --kit-textfield-px: 16px;
352
+ --kit-textfield-py: 14px;
353
+ --kit-textfield-gap: 10px;
354
+ --kit-textfield-font: 15px;
355
+ }
356
+ .kit-textfield[data-size='lg'] :global(.kit-icon[data-size='default']) {
357
+ --kit-icon-current-size: 1.25rem;
347
358
  }
348
359
 
349
360
  .kit-textfield[data-size='xl'] {
350
- --kit-textfield-font-size: 16px;
351
- --kit-textfield-gap-base: 12px;
352
- --kit-textfield-px-base: 18px;
353
- --kit-textfield-py-base: 16px;
361
+ --kit-textfield-h: 56px;
362
+ --kit-textfield-px: 18px;
363
+ --kit-textfield-py: 16px;
364
+ --kit-textfield-gap: 12px;
365
+ --kit-textfield-font: 16px;
354
366
  }
355
-
356
- .kit-textfield[data-density='compact'] {
357
- --kit-textfield-density-gap-adjust: -1px;
358
- --kit-textfield-density-px-adjust: -2px;
359
- --kit-textfield-density-py-adjust: -2px;
360
- --kit-textfield-density-message-adjust: -2px;
367
+ .kit-textfield[data-size='xl'] :global(.kit-icon[data-size='default']) {
368
+ --kit-icon-current-size: 1.375rem;
361
369
  }
362
370
 
363
- .kit-textfield[data-density='comfortable'] {
364
- --kit-textfield-density-gap-adjust: 1px;
365
- --kit-textfield-density-px-adjust: 2px;
366
- --kit-textfield-density-py-adjust: 2px;
367
- --kit-textfield-density-message-adjust: 2px;
368
- }
371
+ /**
372
+ * variant
373
+ * @link no link
374
+ */
375
+ .kit-textfield[data-variant='filled'] {
376
+ --kit-textfield-bg: var(--kit-color-surface-2);
377
+ --kit-textfield-fg: var(--kit-color-text);
369
378
 
370
- .kit-textfield[data-variant='filled'] .kit-textfield__field {
371
- background: var(--kit-textfield-bg);
379
+ --kit-textfield-hover-bg: color-mix(in oklab, var(---kit-textfield-bg), black 10%);
380
+ --kit-textfield-active-bg: color-mix(in oklab, var(--kit-textfield-bg), black 16%);
372
381
  }
382
+ .kit-textfield[data-variant='outline'] {
383
+ --kit-textfield-bg: transparent;
384
+ --kit-textfield-fg: var(--kit-color-text);
385
+ --kit-textfield-bd: var(--kit-textfield-fg);
373
386
 
374
- .kit-textfield[data-variant='outline'] .kit-textfield__field {
375
- background: color-mix(in oklab, var(--kit-textfield-bg), transparent 90%);
387
+ --kit-textfield-hover-bg: color-mix(in oklab, var(--kit-textfield-fg), transparent 80%);
388
+ --kit-textfield-active-bg: color-mix(in oklab, var(--kit-textfield-fg), transparent 92%);
376
389
  }
390
+ .kit-textfield[data-variant='text'] {
391
+ --kit-textfield-bg: transparent;
392
+ --kit-textfield-fg: var(--kit-color-text);
393
+ --kit-textfield-bd: var(--kit-textfield-fg);
377
394
 
378
- .kit-textfield[data-variant='text'] .kit-textfield__field {
379
- background: transparent;
380
- border-radius: 0;
395
+ --kit-textfield-hover-bg: color-mix(in oklab, var(--kit-textfield-fg), transparent 80%);
396
+ --kit-textfield-active-bg: color-mix(in oklab, var(--kit-textfield-fg), transparent 92%);
381
397
  }
382
398
 
383
- .kit-textfield[data-disabled='true'] {
384
- opacity: var(--kit-disabled-opacity, 0.55);
385
- pointer-events: none;
399
+ /**
400
+ * density
401
+ * @link ...
402
+ */
403
+ .kit-textfield[data-density='none'] {
404
+ --kit-textfield-density-scale: 0;
405
+ --kit-textfield-density-h-scale: 0;
386
406
  }
387
-
388
- .kit-textfield[data-readonly='true'] input {
389
- cursor: default;
407
+ .kit-textfield[data-density='compact'] {
408
+ --kit-textfield-density-scale: 0.9;
409
+ --kit-textfield-density-h-scale: 0.92;
390
410
  }
391
-
392
- .kit-textfield[data-hide-spin-buttons='true'] input[type='number'] {
393
- appearance: textfield;
394
- -moz-appearance: textfield;
411
+ .kit-textfield[data-density='default'] {
412
+ --kit-textfield-density-scale: 1;
413
+ --kit-textfield-density-h-scale: 1;
395
414
  }
396
-
397
- .kit-textfield[data-hide-spin-buttons='true'] input[type='number']::-webkit-inner-spin-button,
398
- .kit-textfield[data-hide-spin-buttons='true'] input[type='number']::-webkit-outer-spin-button {
399
- appearance: none;
400
- -webkit-appearance: none;
401
- margin: 0;
415
+ .kit-textfield[data-density='comfortable'] {
416
+ --kit-textfield-density-scale: 1.1;
417
+ --kit-textfield-density-h-scale: 1.15;
402
418
  }
403
419
 
420
+ /**
421
+ * rounded
422
+ * @link ...
423
+ */
404
424
  .kit-textfield[data-rounded='0'] {
405
- --kit-textfield-radius: 0;
425
+ --kit-textfield-radius: var(--kit-shape-none);
406
426
  }
407
-
408
427
  .kit-textfield[data-rounded='xs'] {
409
- --kit-textfield-radius: 2px;
428
+ --kit-textfield-radius: var(--kit-shape-xs);
410
429
  }
411
-
412
430
  .kit-textfield[data-rounded='sm'] {
413
- --kit-textfield-radius: 4px;
431
+ --kit-textfield-radius: var(--kit-shape-sm);
414
432
  }
415
-
416
433
  .kit-textfield[data-rounded='md'] {
417
- --kit-textfield-radius: 8px;
434
+ --kit-textfield-radius: var(--kit-shape-md);
418
435
  }
419
-
420
436
  .kit-textfield[data-rounded='lg'] {
421
- --kit-textfield-radius: 16px;
437
+ --kit-textfield-radius: var(--kit-shape-lg);
422
438
  }
423
-
424
439
  .kit-textfield[data-rounded='xl'] {
425
- --kit-textfield-radius: 99999px;
440
+ --kit-textfield-radius: var(--kit-shape-xl);
426
441
  }
427
442
 
428
443
  .kit-textfield__prepend,
429
444
  .kit-textfield__append {
430
445
  display: flex;
431
446
  align-items: center;
447
+ height: 100%;
432
448
  }
433
449
 
434
450
  .kit-textfield__prepend {
@@ -452,9 +468,12 @@
452
468
  gap: var(--kit-textfield-gap);
453
469
  width: 100%;
454
470
  min-width: 0;
455
- padding: var(--kit-textfield-py) var(--kit-textfield-px);
471
+ min-height: calc(var(--kit-textfield-h) * var(--kit-textfield-density-h-scale));
472
+ padding: 0 calc(var(--kit-textfield-px) * var(--kit-textfield-density-scale));
456
473
  border-radius: var(--kit-textfield-radius);
474
+ background: var(--kit-textfield-bg);
457
475
  color: var(--kit-textfield-fg);
476
+ font-size: var(--kit-textfield-font);
458
477
  }
459
478
 
460
479
  .kit-textfield__prepend-inner,
@@ -529,16 +548,15 @@
529
548
  }
530
549
 
531
550
  .kit-textfield[data-error='true'] .outline {
532
- --outline-color: var(--kit-danger, hsl(5 80% 55%));
551
+ --outline-color: var(--kit-color-error);
533
552
  }
534
553
 
535
554
  .kit-textfield[data-error='true'] .line {
536
- background: var(--kit-danger, hsl(5 80% 55%));
555
+ --kit-textfield-bd: var(--kit-color-error);
537
556
  }
538
557
 
539
558
  .kit-textfield__message {
540
559
  grid-area: message;
541
- padding-top: var(--kit-textfield-message-offset);
542
560
  padding-inline: var(--kit-textfield-px);
543
561
  font-size: 12px;
544
562
  opacity: 0;
@@ -557,7 +575,7 @@
557
575
  }
558
576
 
559
577
  .kit-textfield__message-inner[data-error='true'] {
560
- color: var(--kit-danger, hsl(5 80% 55%));
578
+ color: var(--kit-color-error);
561
579
  }
562
580
 
563
581
  .kit-textfield__message-prefix,
@@ -565,6 +583,11 @@
565
583
  line-height: 1.2;
566
584
  }
567
585
 
586
+ .kit-textfield__message-suffix {
587
+ align-items: end;
588
+ text-align: end;
589
+ }
590
+
568
591
  .kit-textfield__message-text {
569
592
  line-height: 1.2;
570
593
  word-break: break-word;
@@ -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
  import type { HTMLInputAttributes } from 'svelte/elements';
4
4
  export interface TextfieldProps extends Component {
@@ -10,14 +10,14 @@ export interface TextfieldProps extends Component {
10
10
  min?: number;
11
11
  max?: number;
12
12
  variant?: 'outline' | 'text' | 'filled';
13
- density?: 'compact' | 'comfortable' | 'default';
13
+ density?: DensityType;
14
14
  error?: boolean;
15
15
  errorMessage?: string;
16
16
  disabled?: boolean;
17
17
  color?: string;
18
18
  background?: string;
19
19
  size?: SizeType;
20
- rounded?: RoundedType | string;
20
+ rounded?: RoundedType;
21
21
  readonly?: boolean;
22
22
  hideSpinButtons?: boolean;
23
23
  persistentMessage?: boolean;
@@ -36,4 +36,5 @@ export interface TextfieldProps extends Component {
36
36
  id?: string;
37
37
  autocomplete?: HTMLInputAttributes['autocomplete'];
38
38
  inputmode?: HTMLInputAttributes['inputmode'];
39
+ elevation?: ElevationProps;
39
40
  }