lapikit 0.4.10 → 0.4.12

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 (30) hide show
  1. package/dist/labs/compiler/components.js +13 -0
  2. package/dist/labs/components/appbar/appbar.svelte +196 -0
  3. package/dist/labs/components/appbar/appbar.svelte.d.ts +4 -0
  4. package/dist/labs/components/appbar/appbar.types.d.ts +16 -0
  5. package/dist/labs/components/appbar/appbar.types.js +1 -0
  6. package/dist/labs/components/dialog/dialog.svelte +262 -0
  7. package/dist/labs/components/dialog/dialog.svelte.d.ts +4 -0
  8. package/dist/labs/components/dialog/dialog.types.d.ts +16 -0
  9. package/dist/labs/components/dialog/dialog.types.js +1 -0
  10. package/dist/labs/components/index.d.ts +7 -0
  11. package/dist/labs/components/index.js +7 -0
  12. package/dist/labs/components/list/list.svelte +190 -0
  13. package/dist/labs/components/list/list.svelte.d.ts +4 -0
  14. package/dist/labs/components/list/list.types.d.ts +30 -0
  15. package/dist/labs/components/list/list.types.js +1 -0
  16. package/dist/labs/components/list/modules/list-item.svelte +195 -0
  17. package/dist/labs/components/list/modules/list-item.svelte.d.ts +4 -0
  18. package/dist/labs/components/modal/modal.svelte +317 -0
  19. package/dist/labs/components/modal/modal.svelte.d.ts +4 -0
  20. package/dist/labs/components/modal/modal.types.d.ts +18 -0
  21. package/dist/labs/components/modal/modal.types.js +1 -0
  22. package/dist/labs/components/textfield/textfield.svelte +587 -0
  23. package/dist/labs/components/textfield/textfield.svelte.d.ts +4 -0
  24. package/dist/labs/components/textfield/textfield.types.d.ts +41 -0
  25. package/dist/labs/components/textfield/textfield.types.js +1 -0
  26. package/dist/labs/components/toolbar/toolbar.svelte +262 -0
  27. package/dist/labs/components/toolbar/toolbar.svelte.d.ts +4 -0
  28. package/dist/labs/components/toolbar/toolbar.types.d.ts +21 -0
  29. package/dist/labs/components/toolbar/toolbar.types.js +1 -0
  30. package/package.json +1 -1
@@ -0,0 +1,317 @@
1
+ <script lang="ts">
2
+ import { onDestroy } from 'svelte';
3
+ import { get } from 'svelte/store';
4
+ import { makeComponentProps } from '../../compiler/mapped-code.js';
5
+ import { useClassName, useStyles } from '../../utils/index.js';
6
+ import { modalOpen, modalStack, popModal, pushModal, setOpenModal } from '../../../stores/index.js';
7
+ import type { ModalDensity, ModalPosition, ModalProps, ModalSize } from './modal.types.js';
8
+
9
+ function resolveSize(value: ModalSize | undefined): ModalSize {
10
+ return value === 'xs' ||
11
+ value === 'sm' ||
12
+ value === 'md' ||
13
+ value === 'lg' ||
14
+ value === 'xl' ||
15
+ value === 'full'
16
+ ? value
17
+ : 'md';
18
+ }
19
+
20
+ function resolvePosition(value: ModalPosition | undefined): ModalPosition {
21
+ return value === 'top' || value === 'center' || value === 'bottom' ? value : 'center';
22
+ }
23
+
24
+ function resolveDensity(value: ModalDensity | undefined): ModalDensity {
25
+ return value === 'compact' || value === 'comfortable' || value === 'default'
26
+ ? value
27
+ : 'default';
28
+ }
29
+
30
+ const modalId = crypto.randomUUID();
31
+ let wasPushed = $state(false);
32
+
33
+ let {
34
+ ref = $bindable(),
35
+ children = undefined,
36
+ class: className = '',
37
+ style: styleAttr = '',
38
+ 's-class': sClass,
39
+ 's-style': sStyle,
40
+ open = $bindable(false),
41
+ contain = false,
42
+ size = 'md',
43
+ persistent = false,
44
+ position = 'center',
45
+ rounded = 'md',
46
+ density = 'default',
47
+ classContent = '',
48
+ color = undefined,
49
+ background = undefined,
50
+ closeWithEsc = true,
51
+ ...rest
52
+ }: ModalProps = $props();
53
+
54
+ let { classProps, styleProps, restProps } = $derived(
55
+ makeComponentProps(rest as Record<string, unknown>)
56
+ );
57
+
58
+ let componentClass = $derived(
59
+ useClassName({
60
+ baseClass: 'kit-modal',
61
+ className: `${className ?? ''}`.trim(),
62
+ sClass,
63
+ classProps
64
+ })
65
+ );
66
+
67
+ let componentStyle = $derived(
68
+ useStyles({
69
+ styleAttr,
70
+ sStyle,
71
+ styleProps
72
+ })
73
+ );
74
+
75
+ let contentClass = $derived(
76
+ Array.isArray(classContent)
77
+ ? classContent.filter(Boolean).join(' ')
78
+ : `${classContent ?? ''}`.trim()
79
+ );
80
+
81
+ let safeSize = $derived(resolveSize(size));
82
+ let safePosition = $derived(resolvePosition(position));
83
+ let safeDensity = $derived(resolveDensity(density));
84
+ let mergedStyle = $derived(
85
+ [
86
+ componentStyle,
87
+ color ? `--kit-modal-fg:${color}` : '',
88
+ background ? `--kit-modal-bg:${background}` : ''
89
+ ]
90
+ .filter(Boolean)
91
+ .join('; ')
92
+ );
93
+
94
+ $effect(() => {
95
+ if (open && !wasPushed) {
96
+ pushModal(modalId);
97
+ wasPushed = true;
98
+ } else if (!open && wasPushed) {
99
+ popModal(modalId);
100
+ wasPushed = false;
101
+ }
102
+ });
103
+
104
+ $effect(() => {
105
+ if (open !== undefined && !contain) {
106
+ setOpenModal(open ? (persistent ? 'persistent' : true) : false);
107
+ }
108
+ });
109
+
110
+ $effect(() => {
111
+ if ($modalOpen === false && !contain) {
112
+ open = false;
113
+ }
114
+ });
115
+
116
+ $effect(() => {
117
+ if (!open || !closeWithEsc || persistent) return;
118
+
119
+ const onKeyDown = (event: KeyboardEvent) => {
120
+ const stack = get(modalStack);
121
+ const isTop = stack[stack.length - 1] === modalId;
122
+
123
+ if (event.key === 'Escape' && isTop) {
124
+ event.preventDefault();
125
+ open = false;
126
+ }
127
+ };
128
+
129
+ document.addEventListener('keydown', onKeyDown);
130
+ return () => {
131
+ document.removeEventListener('keydown', onKeyDown);
132
+ };
133
+ });
134
+
135
+ onDestroy(() => {
136
+ if (wasPushed) popModal(modalId);
137
+ });
138
+
139
+ function handleClose() {
140
+ if (!persistent) open = false;
141
+ }
142
+ </script>
143
+
144
+ {#if open}
145
+ <div
146
+ bind:this={ref}
147
+ class={componentClass}
148
+ style={mergedStyle}
149
+ role="dialog"
150
+ aria-modal={!contain}
151
+ data-contain={contain}
152
+ >
153
+ {#if contain}
154
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
155
+ <div class="kit-modal__overlay" onclick={handleClose}></div>
156
+ {/if}
157
+
158
+ <div
159
+ {...restProps}
160
+ class={['kit-modal__content', contentClass]}
161
+ data-size={safeSize}
162
+ data-position={safePosition}
163
+ data-density={safeDensity}
164
+ data-rounded={rounded}
165
+ onclick={(event: MouseEvent) => event.stopPropagation()}
166
+ >
167
+ {@render children?.()}
168
+ </div>
169
+ </div>
170
+ {/if}
171
+
172
+ <style>
173
+ .kit-modal {
174
+ --kit-modal-bg: var(--kit-surface-1);
175
+ --kit-modal-fg: var(--kit-fg);
176
+ --kit-modal-bd: var(--kit-border);
177
+ --kit-modal-radius: 12px;
178
+ --kit-modal-px: 1rem;
179
+ --kit-modal-py: 1rem;
180
+ --kit-modal-max: min(32rem, calc(100vw - 2rem));
181
+ --kit-modal-top: 50%;
182
+ --kit-modal-bottom: auto;
183
+ --kit-modal-translate-y: -50%;
184
+
185
+ position: fixed;
186
+ inset: 0;
187
+ z-index: 9100;
188
+ pointer-events: none;
189
+ }
190
+
191
+ .kit-modal[data-contain='true'] {
192
+ position: absolute;
193
+ }
194
+
195
+ .kit-modal__overlay {
196
+ position: absolute;
197
+ inset: 0;
198
+ background: rgb(15 23 42 / 0.42);
199
+ backdrop-filter: blur(2px);
200
+ pointer-events: auto;
201
+ }
202
+
203
+ .kit-modal__content {
204
+ position: fixed;
205
+ left: 50%;
206
+ top: var(--kit-modal-top);
207
+ bottom: var(--kit-modal-bottom);
208
+ translate: -50% var(--kit-modal-translate-y);
209
+ box-sizing: border-box;
210
+ width: min(calc(100vw - 2rem), var(--kit-modal-max));
211
+ max-height: calc(100dvh - 2rem);
212
+ overflow: auto;
213
+ padding: var(--kit-modal-py) var(--kit-modal-px);
214
+ border: 1px solid var(--kit-modal-bd);
215
+ border-radius: var(--kit-modal-radius);
216
+ background: var(--kit-modal-bg);
217
+ color: var(--kit-modal-fg);
218
+ box-shadow:
219
+ 0 20px 50px rgb(15 23 42 / 0.18),
220
+ 0 4px 16px rgb(15 23 42 / 0.1);
221
+ pointer-events: auto;
222
+ }
223
+
224
+ .kit-modal[data-contain='true'] .kit-modal__content {
225
+ position: absolute;
226
+ }
227
+
228
+ .kit-modal__content[data-size='xs'] {
229
+ --kit-modal-max: min(20rem, calc(100vw - 2rem));
230
+ }
231
+
232
+ .kit-modal__content[data-size='sm'] {
233
+ --kit-modal-max: min(24rem, calc(100vw - 2rem));
234
+ }
235
+
236
+ .kit-modal__content[data-size='md'] {
237
+ --kit-modal-max: min(32rem, calc(100vw - 2rem));
238
+ }
239
+
240
+ .kit-modal__content[data-size='lg'] {
241
+ --kit-modal-max: min(42rem, calc(100vw - 2rem));
242
+ }
243
+
244
+ .kit-modal__content[data-size='xl'] {
245
+ --kit-modal-max: min(56rem, calc(100vw - 2rem));
246
+ }
247
+
248
+ .kit-modal__content[data-size='full'] {
249
+ top: auto;
250
+ bottom: 0;
251
+ left: 0;
252
+ translate: 0 0;
253
+ width: 100%;
254
+ max-width: 100%;
255
+ max-height: 100dvh;
256
+ height: min(100dvh, 100%);
257
+ border-bottom-left-radius: 0;
258
+ border-bottom-right-radius: 0;
259
+ }
260
+
261
+ .kit-modal__content[data-position='top'] {
262
+ --kit-modal-top: 1rem;
263
+ --kit-modal-bottom: auto;
264
+ --kit-modal-translate-y: 0;
265
+ }
266
+
267
+ .kit-modal__content[data-position='center'] {
268
+ --kit-modal-top: 50%;
269
+ --kit-modal-bottom: auto;
270
+ --kit-modal-translate-y: -50%;
271
+ }
272
+
273
+ .kit-modal__content[data-position='bottom'] {
274
+ --kit-modal-top: auto;
275
+ --kit-modal-bottom: 1rem;
276
+ --kit-modal-translate-y: 0;
277
+ }
278
+
279
+ .kit-modal__content[data-density='compact'] {
280
+ --kit-modal-px: 0.75rem;
281
+ --kit-modal-py: 0.75rem;
282
+ }
283
+
284
+ .kit-modal__content[data-density='default'] {
285
+ --kit-modal-px: 1rem;
286
+ --kit-modal-py: 1rem;
287
+ }
288
+
289
+ .kit-modal__content[data-density='comfortable'] {
290
+ --kit-modal-px: 1.25rem;
291
+ --kit-modal-py: 1.25rem;
292
+ }
293
+
294
+ .kit-modal__content[data-rounded='0'] {
295
+ --kit-modal-radius: 0;
296
+ }
297
+
298
+ .kit-modal__content[data-rounded='xs'] {
299
+ --kit-modal-radius: 2px;
300
+ }
301
+
302
+ .kit-modal__content[data-rounded='sm'] {
303
+ --kit-modal-radius: 6px;
304
+ }
305
+
306
+ .kit-modal__content[data-rounded='md'] {
307
+ --kit-modal-radius: 12px;
308
+ }
309
+
310
+ .kit-modal__content[data-rounded='lg'] {
311
+ --kit-modal-radius: 18px;
312
+ }
313
+
314
+ .kit-modal__content[data-rounded='xl'] {
315
+ --kit-modal-radius: 9999px;
316
+ }
317
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { ModalProps } from './modal.types.ts';
2
+ declare const Modal: import("svelte").Component<ModalProps, {}, "ref" | "open">;
3
+ type Modal = ReturnType<typeof Modal>;
4
+ export default Modal;
@@ -0,0 +1,18 @@
1
+ import type { Component, RoundedType } from '../../utils/types/index.js';
2
+ export type ModalSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
3
+ export type ModalPosition = 'top' | 'center' | 'bottom';
4
+ export type ModalDensity = 'compact' | 'comfortable' | 'default';
5
+ export interface ModalProps extends Component {
6
+ ref?: HTMLDivElement | null;
7
+ open?: boolean;
8
+ contain?: boolean;
9
+ size?: ModalSize;
10
+ persistent?: boolean;
11
+ position?: ModalPosition;
12
+ rounded?: RoundedType;
13
+ density?: ModalDensity;
14
+ classContent?: string | string[] | undefined;
15
+ color?: string;
16
+ background?: string;
17
+ closeWithEsc?: boolean;
18
+ }
@@ -0,0 +1 @@
1
+ export {};