lapikit 0.4.4 → 0.4.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.
@@ -1,2 +1,2 @@
1
- const lapikitComponents = ['sheet', 'app', 'btn', 'icon'];
1
+ const lapikitComponents = ['sheet', 'app', 'btn', 'icon', 'avatar'];
2
2
  export default lapikitComponents;
@@ -0,0 +1,145 @@
1
+ <script lang="ts">
2
+ import { useClassName, useStyles } from '../../utils/index.js';
3
+ import { makeComponentProps } from '../../compiler/mapped-code.js';
4
+ import type { AvatarProps } from './avatar.types.js';
5
+
6
+ let {
7
+ ref = $bindable(),
8
+ children = undefined,
9
+ class: className = '',
10
+ style: styleAttr = '',
11
+ 's-class': sClass,
12
+ 's-style': sStyle,
13
+ label = undefined,
14
+ size = 'md',
15
+ density = 'default',
16
+ ...rest
17
+ }: AvatarProps = $props();
18
+
19
+ let { classProps, styleProps, restProps } = $derived(
20
+ makeComponentProps(rest as Record<string, unknown>)
21
+ );
22
+
23
+ let componentClass = $derived(
24
+ useClassName({
25
+ baseClass: 'kit-avatar',
26
+ className: `${className ?? ''}`.trim(),
27
+ sClass,
28
+ classProps
29
+ })
30
+ );
31
+
32
+ let componentStyle = $derived(
33
+ useStyles({
34
+ styleAttr,
35
+ sStyle,
36
+ styleProps
37
+ })
38
+ );
39
+
40
+ let safeSize = $derived(
41
+ size === 'default'
42
+ ? 'md'
43
+ : size === 'xs' || size === 'sm' || size === 'md' || size === 'lg' || size === 'xl'
44
+ ? size
45
+ : 'md'
46
+ );
47
+
48
+ let safeDensity = $derived(
49
+ density === 'compact' || density === 'comfortable' || density === 'default'
50
+ ? density
51
+ : 'default'
52
+ );
53
+
54
+ let contentType = $derived(label && label.trim().length > 0 ? 'label' : children);
55
+ let displayLabel = $derived(label?.trim() ?? '');
56
+ </script>
57
+
58
+ <svelte:element
59
+ this={'div'}
60
+ bind:this={ref}
61
+ class={componentClass}
62
+ style={componentStyle}
63
+ {...restProps}
64
+ data-type={contentType}
65
+ data-size={contentType === 'label' ? safeSize : undefined}
66
+ data-density={contentType === 'label' ? safeDensity : undefined}
67
+ >
68
+ {#if contentType === 'label'}
69
+ <span class="kit-avatar__label">{displayLabel}</span>
70
+ {:else}
71
+ {@render children?.()}
72
+ {/if}
73
+ </svelte:element>
74
+
75
+ <style>
76
+ .kit-avatar {
77
+ --kit-avatar-size: 2.25rem;
78
+ --kit-avatar-font-size: 0.875rem;
79
+ --kit-avatar-density-scale: 1;
80
+
81
+ display: inline-flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ width: calc(var(--kit-avatar-size) * var(--kit-avatar-density-scale));
85
+ height: calc(var(--kit-avatar-size) * var(--kit-avatar-density-scale));
86
+ border-radius: 9999px;
87
+ overflow: hidden;
88
+ background: var(--kit-surface-2);
89
+ color: var(--kit-fg);
90
+ font-weight: 600;
91
+ line-height: 1;
92
+ user-select: none;
93
+ }
94
+
95
+ .kit-avatar[data-type='label'] {
96
+ font-size: var(--kit-avatar-font-size);
97
+ text-transform: uppercase;
98
+ }
99
+
100
+ .kit-avatar[data-size='xs'] {
101
+ --kit-avatar-size: 1.75rem;
102
+ --kit-avatar-font-size: 0.75rem;
103
+ }
104
+ .kit-avatar[data-size='sm'] {
105
+ --kit-avatar-size: 2rem;
106
+ --kit-avatar-font-size: 0.8125rem;
107
+ }
108
+ .kit-avatar[data-size='md'] {
109
+ --kit-avatar-size: 2.25rem;
110
+ --kit-avatar-font-size: 0.875rem;
111
+ }
112
+ .kit-avatar[data-size='lg'] {
113
+ --kit-avatar-size: 2.5rem;
114
+ --kit-avatar-font-size: 1rem;
115
+ }
116
+ .kit-avatar[data-size='xl'] {
117
+ --kit-avatar-size: 2.75rem;
118
+ --kit-avatar-font-size: 1.125rem;
119
+ }
120
+
121
+ .kit-avatar[data-density='compact'] {
122
+ --kit-avatar-density-scale: 0.9;
123
+ }
124
+ .kit-avatar[data-density='default'] {
125
+ --kit-avatar-density-scale: 1;
126
+ }
127
+ .kit-avatar[data-density='comfortable'] {
128
+ --kit-avatar-density-scale: 1.1;
129
+ }
130
+
131
+ .kit-avatar__label {
132
+ display: inline-flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ max-width: 100%;
136
+ padding-inline: 0.25rem;
137
+ }
138
+
139
+ .kit-avatar :global(img) {
140
+ display: block;
141
+ width: 100%;
142
+ height: 100%;
143
+ object-fit: cover;
144
+ }
145
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { AvatarProps } from './avatar.types.ts';
2
+ declare const Avatar: import("svelte").Component<AvatarProps, {}, "ref">;
3
+ type Avatar = ReturnType<typeof Avatar>;
4
+ export default Avatar;
@@ -0,0 +1,9 @@
1
+ import type { Component } from '../../utils/types/index.js';
2
+ export type AvatarSize = 'default' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
3
+ export type AvatarDensity = 'compact' | 'comfortable' | 'default';
4
+ export interface AvatarProps extends Component {
5
+ ref?: HTMLElement | null;
6
+ label?: string;
7
+ size?: AvatarSize;
8
+ density?: AvatarDensity;
9
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -2,3 +2,4 @@ export { default as KitSheet } from './sheet/sheet.svelte';
2
2
  export { default as KitApp } from './app/app.svelte';
3
3
  export { default as KitBtn } from './btn/btn.svelte';
4
4
  export { default as KitIcon } from './icon/icon.svelte';
5
+ export { default as KitAvatar } from './avatar/avatar.svelte';
@@ -3,3 +3,4 @@ export { default as KitSheet } from './sheet/sheet.svelte';
3
3
  export { default as KitApp } from './app/app.svelte';
4
4
  export { default as KitBtn } from './btn/btn.svelte';
5
5
  export { default as KitIcon } from './icon/icon.svelte';
6
+ export { default as KitAvatar } from './avatar/avatar.svelte';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lapikit",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public"