@svadmin/ui 0.74.0 → 0.76.0

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 (65) hide show
  1. package/dist/app.css +14 -0
  2. package/dist/app.theme.css +14 -0
  3. package/dist/components/AdminApp.svelte +5 -5
  4. package/dist/components/AppFooter.svelte +137 -0
  5. package/dist/components/AppFooter.svelte.d.ts +25 -0
  6. package/dist/components/CodeEditor.svelte +145 -0
  7. package/dist/components/CodeEditor.svelte.d.ts +26 -0
  8. package/dist/components/DatePicker.svelte +2 -2
  9. package/dist/components/DatePicker.svelte.d.ts +1 -1
  10. package/dist/components/DateRangePicker.svelte +2 -2
  11. package/dist/components/DateRangePicker.svelte.d.ts +1 -1
  12. package/dist/components/DateTimeInput.svelte +18 -18
  13. package/dist/components/DateTimeInput.svelte.d.ts +18 -18
  14. package/dist/components/DateTimePicker.svelte +2 -2
  15. package/dist/components/DateTimePicker.svelte.d.ts +1 -1
  16. package/dist/components/FieldRenderer.svelte +1 -1
  17. package/dist/components/HighlightText.svelte +46 -0
  18. package/dist/components/HighlightText.svelte.d.ts +13 -0
  19. package/dist/components/JsonEditor.svelte +182 -0
  20. package/dist/components/JsonEditor.svelte.d.ts +22 -0
  21. package/dist/components/LazyPage.svelte +3 -3
  22. package/dist/components/LazyPage.svelte.d.ts +2 -2
  23. package/dist/components/Marquee.svelte +104 -0
  24. package/dist/components/Marquee.svelte.d.ts +20 -0
  25. package/dist/components/MediaPlayer.svelte +104 -0
  26. package/dist/components/MediaPlayer.svelte.d.ts +21 -0
  27. package/dist/components/PasswordInput.svelte +3 -3
  28. package/dist/components/PasswordInput.svelte.d.ts +2 -1
  29. package/dist/components/PhoneInput.svelte +157 -0
  30. package/dist/components/PhoneInput.svelte.d.ts +26 -0
  31. package/dist/components/QRCode.svelte +88 -0
  32. package/dist/components/QRCode.svelte.d.ts +22 -0
  33. package/dist/components/ResizableGrid.svelte +252 -0
  34. package/dist/components/ResizableGrid.svelte.d.ts +34 -0
  35. package/dist/components/ResourceOperationsPage.svelte +5 -1
  36. package/dist/components/TimePicker.svelte +2 -2
  37. package/dist/components/TimePicker.svelte.d.ts +1 -1
  38. package/dist/components/TooltipButton.svelte +3 -4
  39. package/dist/components/TopProgressBar.svelte +90 -0
  40. package/dist/components/TopProgressBar.svelte.d.ts +15 -0
  41. package/dist/components/browser.svelte.d.ts +65 -0
  42. package/dist/components/browser.svelte.js +228 -0
  43. package/dist/components/charts/AreaChart.svelte +78 -0
  44. package/dist/components/charts/AreaChart.svelte.d.ts +17 -0
  45. package/dist/components/charts/ScatterChart.svelte +82 -0
  46. package/dist/components/charts/ScatterChart.svelte.d.ts +17 -0
  47. package/dist/components/charts/index.d.ts +2 -0
  48. package/dist/components/charts/index.js +2 -0
  49. package/dist/components/code-editor-presets.d.ts +14 -0
  50. package/dist/components/code-editor-presets.js +14 -0
  51. package/dist/components/fields/MarkdownField.svelte +14 -5
  52. package/dist/components/highlight.d.ts +16 -0
  53. package/dist/components/highlight.js +68 -0
  54. package/dist/components/media.svelte.d.ts +27 -0
  55. package/dist/components/media.svelte.js +60 -0
  56. package/dist/components/phone-dial-codes.d.ts +19 -0
  57. package/dist/components/phone-dial-codes.js +112 -0
  58. package/dist/components/ui/DesignSystemShowcase.svelte +1 -1
  59. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +1 -2
  60. package/dist/editor-config.svelte.d.ts +4 -2
  61. package/dist/index.d.ts +19 -1
  62. package/dist/index.js +14 -1
  63. package/dist/styles/recipes.css +1262 -0
  64. package/dist/types.d.ts +4 -4
  65. package/package.json +64 -4
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ text: string;
3
+ /** One term or a list of terms to highlight. */
4
+ query?: string | readonly string[];
5
+ caseSensitive?: boolean;
6
+ wholeWord?: boolean;
7
+ class?: string;
8
+ /** Overrides the `<mark>` styling without leaving the semantic token system. */
9
+ highlightClass?: string;
10
+ }
11
+ declare const HighlightText: import("svelte").Component<Props, {}, "">;
12
+ type HighlightText = ReturnType<typeof HighlightText>;
13
+ export default HighlightText;
@@ -0,0 +1,182 @@
1
+ <script lang="ts">
2
+ import type { Component } from 'svelte';
3
+ import { onMount } from 'svelte';
4
+ import { cn } from '../utils.js';
5
+
6
+ /**
7
+ * Thin adapter over the Svelte ecosystem `svelte-jsoneditor` package. The
8
+ * dependency is optional: if it cannot be loaded, a validating `<textarea>`
9
+ * fallback keeps the field usable.
10
+ */
11
+ type JsonMode = 'tree' | 'text' | 'table';
12
+
13
+ interface Props {
14
+ /** Parsed JSON value. */
15
+ value?: unknown;
16
+ mode?: JsonMode;
17
+ readonly?: boolean;
18
+ /** Height of the editor surface (CSS length). */
19
+ height?: string;
20
+ ariaLabel?: string;
21
+ class?: string;
22
+ onchange?: (value: unknown) => void;
23
+ onerror?: (message: string) => void;
24
+ }
25
+
26
+ let {
27
+ value = $bindable(undefined),
28
+ mode = 'tree',
29
+ readonly = false,
30
+ height = '22rem',
31
+ ariaLabel = 'JSON editor',
32
+ class: className = '',
33
+ onchange,
34
+ onerror,
35
+ }: Props = $props();
36
+
37
+ const generatedId = $props.id();
38
+ const errorId = `${generatedId}-error`;
39
+
40
+ let Editor = $state<Component<Record<string, unknown>> | null>(null);
41
+ let unavailable = $state(false);
42
+ let error = $state('');
43
+
44
+ function format(input: unknown): string {
45
+ if (input === undefined) return '';
46
+ try {
47
+ return JSON.stringify(input, null, 2) ?? '';
48
+ } catch {
49
+ return '';
50
+ }
51
+ }
52
+
53
+ let text = $state(format(value));
54
+
55
+ onMount(() => {
56
+ let active = true;
57
+ import('svelte-jsoneditor')
58
+ .then((module) => {
59
+ if (active) Editor = module.JSONEditor as unknown as Component<Record<string, unknown>>;
60
+ })
61
+ .catch(() => {
62
+ if (active) unavailable = true;
63
+ });
64
+ return () => {
65
+ active = false;
66
+ };
67
+ });
68
+
69
+ function handleEditorChange(updated: { content?: { json?: unknown; text?: string } }): void {
70
+ const content = updated?.content ?? {};
71
+ const next = 'json' in content ? content.json : content.text;
72
+ value = next;
73
+ error = '';
74
+ onchange?.(next);
75
+ }
76
+
77
+ function handleFallbackInput(next: string): void {
78
+ text = next;
79
+ if (next.trim() === '') {
80
+ error = '';
81
+ value = undefined;
82
+ onchange?.(undefined);
83
+ return;
84
+ }
85
+ try {
86
+ const parsed: unknown = JSON.parse(next);
87
+ error = '';
88
+ value = parsed;
89
+ onchange?.(parsed);
90
+ } catch (cause) {
91
+ const message = cause instanceof Error ? cause.message : 'Invalid JSON';
92
+ error = message;
93
+ onerror?.(message);
94
+ }
95
+ }
96
+
97
+ const editorProps = $derived({
98
+ content: { json: value },
99
+ mode,
100
+ readOnly: readonly,
101
+ ariaLabel,
102
+ mainMenuBar: !readonly,
103
+ navigationBar: !readonly,
104
+ statusBar: true,
105
+ onChange: handleEditorChange,
106
+ });
107
+
108
+ const editorState = $derived(Editor ? 'ready' : unavailable ? 'unavailable' : 'loading');
109
+ </script>
110
+
111
+ <div
112
+ class={cn('svadmin-json-editor', className)}
113
+ data-slot="json-editor"
114
+ data-state={editorState}
115
+ >
116
+ {#if Editor}
117
+ <div class="svadmin-json-editor__surface" style={`height: ${height};`}>
118
+ <Editor {...editorProps} />
119
+ </div>
120
+ {:else}
121
+ <textarea
122
+ class="svadmin-json-editor__fallback"
123
+ style={`min-height: ${height};`}
124
+ bind:value={text}
125
+ {readonly}
126
+ aria-label={ariaLabel}
127
+ spellcheck="false"
128
+ autocapitalize="off"
129
+ autocomplete="off"
130
+ aria-invalid={error ? 'true' : undefined}
131
+ aria-describedby={error ? errorId : undefined}
132
+ oninput={(event) => handleFallbackInput((event.currentTarget as HTMLTextAreaElement).value)}
133
+ ></textarea>
134
+ {#if error}<p id={errorId} class="svadmin-json-editor__error" role="alert">{error}</p>{/if}
135
+ {#if unavailable}
136
+ <p class="svadmin-json-editor__hint" role="status">
137
+ Install <code>svelte-jsoneditor</code> to enable the structured editor.
138
+ </p>
139
+ {/if}
140
+ {/if}
141
+ </div>
142
+
143
+ <style>
144
+ .svadmin-json-editor {
145
+ overflow: hidden;
146
+ border: 1px solid var(--border, currentColor);
147
+ border-radius: min(var(--radius, 0.5rem), 0.5rem);
148
+ background: var(--card, var(--background, transparent));
149
+ color: var(--card-foreground, var(--foreground, currentColor));
150
+ }
151
+
152
+ .svadmin-json-editor:focus-within { outline: 2px solid var(--ring, currentColor); outline-offset: 1px; }
153
+ .svadmin-json-editor__surface { width: 100%; }
154
+ .svadmin-json-editor__fallback {
155
+ display: block;
156
+ width: 100%;
157
+ border: 0;
158
+ padding: 0.75rem;
159
+ background: transparent;
160
+ color: inherit;
161
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
162
+ font-size: 0.8125rem;
163
+ line-height: 1.6;
164
+ resize: vertical;
165
+ }
166
+ .svadmin-json-editor__fallback:focus { outline: none; }
167
+ .svadmin-json-editor__error {
168
+ margin: 0;
169
+ border-top: 1px solid var(--destructive, currentColor);
170
+ padding: 0.5rem 0.75rem;
171
+ color: var(--destructive, currentColor);
172
+ font-size: 0.75rem;
173
+ }
174
+ .svadmin-json-editor__hint {
175
+ margin: 0;
176
+ border-top: 1px solid var(--border, currentColor);
177
+ padding: 0.5rem 0.75rem;
178
+ color: var(--muted-foreground, currentColor);
179
+ font-size: 0.75rem;
180
+ }
181
+ .svadmin-json-editor__hint code { color: var(--foreground, currentColor); }
182
+ </style>
@@ -0,0 +1,22 @@
1
+ import type { Component } from 'svelte';
2
+ /**
3
+ * Thin adapter over the Svelte ecosystem `svelte-jsoneditor` package. The
4
+ * dependency is optional: if it cannot be loaded, a validating `<textarea>`
5
+ * fallback keeps the field usable.
6
+ */
7
+ type JsonMode = 'tree' | 'text' | 'table';
8
+ interface Props {
9
+ /** Parsed JSON value. */
10
+ value?: unknown;
11
+ mode?: JsonMode;
12
+ readonly?: boolean;
13
+ /** Height of the editor surface (CSS length). */
14
+ height?: string;
15
+ ariaLabel?: string;
16
+ class?: string;
17
+ onchange?: (value: unknown) => void;
18
+ onerror?: (message: string) => void;
19
+ }
20
+ declare const JsonEditor: Component<Props, {}, "value">;
21
+ type JsonEditor = ReturnType<typeof JsonEditor>;
22
+ export default JsonEditor;
@@ -1,11 +1,11 @@
1
1
  <script module lang="ts">
2
2
  import type { Component } from 'svelte';
3
3
 
4
+ export type LazyPageRenderable = Component<never>;
4
5
  export type LazyPageModule = {
5
- default: Component<never>;
6
+ default: LazyPageRenderable;
6
7
  };
7
8
 
8
- export type LazyPageRenderable = Component<Record<string, unknown>>;
9
9
  export type LazyPageLoader = () => Promise<LazyPageModule>;
10
10
 
11
11
  const pagePromises = new WeakMap<object, Promise<unknown>>();
@@ -38,7 +38,7 @@
38
38
  <span class="svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">Loading...</span>
39
39
  </div>
40
40
  {:then pageModule}
41
- {@const Page = pageModule.default as unknown as LazyPageRenderable}
41
+ {@const Page = pageModule.default as unknown as Component<Record<string, unknown>>}
42
42
  <Page {...props} />
43
43
  {:catch}
44
44
  <div class="svadmin-u-60fbb7713999 svadmin-u-8a7a926578c8 svadmin-u-3960ffc248d9 svadmin-u-86843cf1e227" role="alert">
@@ -1,8 +1,8 @@
1
1
  import type { Component } from 'svelte';
2
+ export type LazyPageRenderable = Component<never>;
2
3
  export type LazyPageModule = {
3
- default: Component<never>;
4
+ default: LazyPageRenderable;
4
5
  };
5
- export type LazyPageRenderable = Component<Record<string, unknown>>;
6
6
  export type LazyPageLoader = () => Promise<LazyPageModule>;
7
7
  export declare function loadLazyPage(loader: LazyPageLoader): Promise<LazyPageModule>;
8
8
  type $$ComponentProps = {
@@ -0,0 +1,104 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { cn } from '../utils.js';
4
+
5
+ interface Props {
6
+ /** Plain text shortcut; ignored when `children` is provided. */
7
+ text?: string;
8
+ children?: Snippet;
9
+ /** Seconds for one full loop. */
10
+ duration?: number;
11
+ direction?: 'left' | 'right';
12
+ vertical?: boolean;
13
+ /** Copies of the content used to build a seamless loop. */
14
+ repeat?: number;
15
+ pauseOnHover?: boolean;
16
+ /** Fades the leading and trailing edges. */
17
+ fade?: boolean;
18
+ ariaLabel?: string;
19
+ class?: string;
20
+ }
21
+
22
+ let {
23
+ text,
24
+ children,
25
+ duration = 14,
26
+ direction = 'left',
27
+ vertical = false,
28
+ repeat = 2,
29
+ pauseOnHover = true,
30
+ fade = true,
31
+ ariaLabel,
32
+ class: className = '',
33
+ }: Props = $props();
34
+
35
+ const copies = $derived(Math.max(2, Math.round(repeat)));
36
+ const safeDuration = $derived(duration > 0 ? duration : 14);
37
+ </script>
38
+
39
+ <div
40
+ class={cn('svadmin-marquee', className)}
41
+ data-slot="marquee"
42
+ data-direction={direction}
43
+ data-vertical={vertical ? 'true' : 'false'}
44
+ data-pause={pauseOnHover ? 'true' : 'false'}
45
+ data-fade={fade ? 'true' : 'false'}
46
+ role="marquee"
47
+ aria-label={ariaLabel}
48
+ >
49
+ <div
50
+ class="svadmin-marquee__track"
51
+ style={`--svadmin-marquee-duration: ${safeDuration}s; --svadmin-marquee-repeat: ${copies};`}
52
+ >
53
+ {#each Array.from({ length: copies }) as _, index (index)}
54
+ <div class="svadmin-marquee__item" aria-hidden={index > 0 ? 'true' : undefined}>
55
+ {#if children}{@render children()}{:else}{text}{/if}
56
+ </div>
57
+ {/each}
58
+ </div>
59
+ </div>
60
+
61
+ <style>
62
+ .svadmin-marquee {
63
+ position: relative;
64
+ overflow: hidden;
65
+ color: inherit;
66
+ }
67
+
68
+ .svadmin-marquee[data-fade='true'] {
69
+ mask-image: linear-gradient(to right, transparent, currentColor 8%, currentColor 92%, transparent);
70
+ }
71
+
72
+ .svadmin-marquee__track {
73
+ display: flex;
74
+ width: max-content;
75
+ animation: svadmin-marquee-scroll var(--svadmin-marquee-duration, 14s) linear infinite;
76
+ will-change: transform;
77
+ }
78
+
79
+ .svadmin-marquee[data-direction='right'] .svadmin-marquee__track { animation-direction: reverse; }
80
+ .svadmin-marquee[data-vertical='true'] .svadmin-marquee__track { flex-direction: column; }
81
+ .svadmin-marquee[data-pause='true']:hover .svadmin-marquee__track,
82
+ .svadmin-marquee[data-pause='true']:focus-within .svadmin-marquee__track { animation-play-state: paused; }
83
+
84
+ .svadmin-marquee__item {
85
+ display: flex;
86
+ flex: none;
87
+ align-items: center;
88
+ padding-inline-end: 2rem;
89
+ }
90
+
91
+ .svadmin-marquee[data-vertical='true'] .svadmin-marquee__item {
92
+ padding-inline-end: 0;
93
+ padding-block-end: 1rem;
94
+ }
95
+
96
+ @keyframes svadmin-marquee-scroll {
97
+ from { transform: translate(0, 0); }
98
+ to { transform: translate(calc(-100% / var(--svadmin-marquee-repeat, 2)), 0); }
99
+ }
100
+
101
+ @media (prefers-reduced-motion: reduce) {
102
+ .svadmin-marquee__track { animation: none; }
103
+ }
104
+ </style>
@@ -0,0 +1,20 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Plain text shortcut; ignored when `children` is provided. */
4
+ text?: string;
5
+ children?: Snippet;
6
+ /** Seconds for one full loop. */
7
+ duration?: number;
8
+ direction?: 'left' | 'right';
9
+ vertical?: boolean;
10
+ /** Copies of the content used to build a seamless loop. */
11
+ repeat?: number;
12
+ pauseOnHover?: boolean;
13
+ /** Fades the leading and trailing edges. */
14
+ fade?: boolean;
15
+ ariaLabel?: string;
16
+ class?: string;
17
+ }
18
+ declare const Marquee: import("svelte").Component<Props, {}, "">;
19
+ type Marquee = ReturnType<typeof Marquee>;
20
+ export default Marquee;
@@ -0,0 +1,104 @@
1
+ <script lang="ts">
2
+ import { cn } from '../utils.js';
3
+
4
+ interface Props {
5
+ src: string;
6
+ media?: 'video' | 'audio';
7
+ poster?: string;
8
+ title?: string;
9
+ description?: string;
10
+ controls?: boolean;
11
+ autoplay?: boolean;
12
+ loop?: boolean;
13
+ muted?: boolean;
14
+ playsinline?: boolean;
15
+ preload?: 'none' | 'metadata' | 'auto';
16
+ /** CSS aspect ratio for video, e.g. `16 / 9`. */
17
+ aspectRatio?: string;
18
+ class?: string;
19
+ ontimeupdate?: (event: Event) => void;
20
+ onended?: (event: Event) => void;
21
+ }
22
+
23
+ let {
24
+ src,
25
+ media = 'video',
26
+ poster,
27
+ title,
28
+ description,
29
+ controls = true,
30
+ autoplay = false,
31
+ loop = false,
32
+ muted = false,
33
+ playsinline = true,
34
+ preload = 'metadata',
35
+ aspectRatio = '16 / 9',
36
+ class: className = '',
37
+ ontimeupdate,
38
+ onended,
39
+ }: Props = $props();
40
+ </script>
41
+
42
+ <figure class={cn('svadmin-media-player', className)} data-slot="media-player" data-media={media}>
43
+ {#if media === 'video'}
44
+ <div class="svadmin-media-player__stage" style={`aspect-ratio: ${aspectRatio};`}>
45
+ <video
46
+ class="svadmin-media-player__video"
47
+ {src}
48
+ {poster}
49
+ {controls}
50
+ autoplay={autoplay}
51
+ {loop}
52
+ {muted}
53
+ {playsinline}
54
+ {preload}
55
+ aria-label={title}
56
+ ontimeupdate={ontimeupdate}
57
+ onended={onended}
58
+ ></video>
59
+ </div>
60
+ {:else}
61
+ <div class="svadmin-media-player__audio-stage">
62
+ <audio
63
+ class="svadmin-media-player__audio"
64
+ {src}
65
+ {controls}
66
+ autoplay={autoplay}
67
+ {loop}
68
+ {muted}
69
+ {preload}
70
+ aria-label={title}
71
+ ontimeupdate={ontimeupdate}
72
+ onended={onended}
73
+ ></audio>
74
+ </div>
75
+ {/if}
76
+
77
+ {#if title || description}
78
+ <figcaption class="svadmin-media-player__caption">
79
+ {#if title}<span class="svadmin-media-player__title">{title}</span>{/if}
80
+ {#if description}<span class="svadmin-media-player__description">{description}</span>{/if}
81
+ </figcaption>
82
+ {/if}
83
+ </figure>
84
+
85
+ <style>
86
+ .svadmin-media-player {
87
+ display: grid;
88
+ gap: 0.5rem;
89
+ margin: 0;
90
+ border: 1px solid var(--border, currentColor);
91
+ border-radius: min(var(--radius, 0.5rem), 0.75rem);
92
+ padding: 0.5rem;
93
+ background: var(--card, transparent);
94
+ color: var(--card-foreground, var(--foreground, currentColor));
95
+ }
96
+
97
+ .svadmin-media-player__stage { overflow: hidden; border-radius: min(var(--radius, 0.5rem), 0.5rem); background: var(--muted, transparent); }
98
+ .svadmin-media-player__video { display: block; width: 100%; height: 100%; object-fit: contain; }
99
+ .svadmin-media-player__audio-stage { padding: 0.25rem; }
100
+ .svadmin-media-player__audio { width: 100%; }
101
+ .svadmin-media-player__caption { display: grid; gap: 0.125rem; padding-inline: 0.25rem; }
102
+ .svadmin-media-player__title { font-size: 0.875rem; font-weight: 600; }
103
+ .svadmin-media-player__description { color: var(--muted-foreground, currentColor); font-size: 0.8125rem; }
104
+ </style>
@@ -0,0 +1,21 @@
1
+ interface Props {
2
+ src: string;
3
+ media?: 'video' | 'audio';
4
+ poster?: string;
5
+ title?: string;
6
+ description?: string;
7
+ controls?: boolean;
8
+ autoplay?: boolean;
9
+ loop?: boolean;
10
+ muted?: boolean;
11
+ playsinline?: boolean;
12
+ preload?: 'none' | 'metadata' | 'auto';
13
+ /** CSS aspect ratio for video, e.g. `16 / 9`. */
14
+ aspectRatio?: string;
15
+ class?: string;
16
+ ontimeupdate?: (event: Event) => void;
17
+ onended?: (event: Event) => void;
18
+ }
19
+ declare const MediaPlayer: import("svelte").Component<Props, {}, "">;
20
+ type MediaPlayer = ReturnType<typeof MediaPlayer>;
21
+ export default MediaPlayer;
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
2
  import { Input } from './ui/input/index.js';
4
3
  import TooltipButton from './TooltipButton.svelte';
5
4
  import { Label } from './ui/label/index.js';
6
5
  import { Lock, Eye, EyeOff } from '@lucide/svelte';
7
6
  import { useTranslation } from '@svadmin/core/i18n';
7
+ import type { FullAutoFill } from 'svelte/elements';
8
8
 
9
9
  const i18n = useTranslation();
10
10
 
@@ -13,7 +13,7 @@
13
13
  label: string;
14
14
  value: string;
15
15
  placeholder?: string;
16
- autocomplete?: string;
16
+ autocomplete?: FullAutoFill;
17
17
  showStrength?: boolean;
18
18
  disabled?: boolean;
19
19
  class?: string;
@@ -67,7 +67,7 @@
67
67
  {placeholder}
68
68
  bind:value
69
69
  class="svadmin-u-9e83b2412bc9 svadmin-u-1b1df78e4d0a"
70
- autocomplete={autocomplete as any}
70
+ {autocomplete}
71
71
  {disabled}
72
72
  />
73
73
  <TooltipButton
@@ -1,9 +1,10 @@
1
+ import type { FullAutoFill } from 'svelte/elements';
1
2
  interface Props {
2
3
  id: string;
3
4
  label: string;
4
5
  value: string;
5
6
  placeholder?: string;
6
- autocomplete?: string;
7
+ autocomplete?: FullAutoFill;
7
8
  showStrength?: boolean;
8
9
  disabled?: boolean;
9
10
  class?: string;