@webamoki/web-svelte 0.5.33 → 0.5.34
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.
- package/dist/components/form/fields/MessageField.svelte +57 -0
- package/dist/components/form/fields/MessageField.svelte.d.ts +33 -0
- package/dist/components/form/fields/PasswordField.svelte +2 -2
- package/dist/components/form/fields/SelectField.svelte +1 -1
- package/dist/components/form/fields/SelectMultiField.svelte +2 -2
- package/dist/components/form/index.d.ts +2 -1
- package/dist/components/form/index.js +2 -1
- package/dist/shadcn/components/ui/textarea/index.d.ts +2 -0
- package/dist/shadcn/components/ui/textarea/index.js +4 -0
- package/dist/shadcn/components/ui/textarea/textarea.svelte +27 -0
- package/dist/shadcn/components/ui/textarea/textarea.svelte.d.ts +5 -0
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends Record<string, unknown>, U extends FormPath<T>, M">
|
|
2
|
+
import type { FormPath } from 'sveltekit-superforms';
|
|
3
|
+
import FieldWrapper, { type FieldWrapperProps } from '../FieldWrapper.svelte';
|
|
4
|
+
import { Textarea } from '../../../shadcn/components/ui/textarea/index.js';
|
|
5
|
+
import { Lock, LockOpen } from '@lucide/svelte';
|
|
6
|
+
|
|
7
|
+
interface Props extends FieldWrapperProps<T, U, M> {
|
|
8
|
+
value?: string;
|
|
9
|
+
class?: string;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
defaultHeight?: number;
|
|
12
|
+
showLock?: boolean;
|
|
13
|
+
defaultLocked?: boolean;
|
|
14
|
+
}
|
|
15
|
+
let {
|
|
16
|
+
value = $bindable(),
|
|
17
|
+
class: className,
|
|
18
|
+
placeholder,
|
|
19
|
+
defaultHeight = 100,
|
|
20
|
+
showLock = true,
|
|
21
|
+
defaultLocked = false,
|
|
22
|
+
...fieldProps
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
let locked = $state(defaultLocked);
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<FieldWrapper {...fieldProps}>
|
|
29
|
+
{#snippet formElem(props)}
|
|
30
|
+
<div class="flex w-full items-start gap-2">
|
|
31
|
+
<!-- Textarea itself -->
|
|
32
|
+
<Textarea
|
|
33
|
+
bind:value
|
|
34
|
+
class={`${className || ''} ${locked ? 'resize-none' : 'resize-y'}`}
|
|
35
|
+
{placeholder}
|
|
36
|
+
style={defaultHeight ? `height: ${defaultHeight}px` : undefined}
|
|
37
|
+
{...props}
|
|
38
|
+
/>
|
|
39
|
+
|
|
40
|
+
<!-- Lock/unlock button -->
|
|
41
|
+
{#if showLock}
|
|
42
|
+
<button
|
|
43
|
+
type="button"
|
|
44
|
+
class="flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-gray-300 px-4 py-3 text-gray-500 transition-all hover:bg-gray-50 focus:border-transparent focus:ring-2 focus:ring-primary focus:outline-none"
|
|
45
|
+
onclick={() => (locked = !locked)}
|
|
46
|
+
aria-label={locked ? 'Unlock height' : 'Lock height'}
|
|
47
|
+
>
|
|
48
|
+
{#if locked}
|
|
49
|
+
<Lock class="size-5" />
|
|
50
|
+
{:else}
|
|
51
|
+
<LockOpen class="size-5" />
|
|
52
|
+
{/if}
|
|
53
|
+
</button>
|
|
54
|
+
{/if}
|
|
55
|
+
</div>
|
|
56
|
+
{/snippet}
|
|
57
|
+
</FieldWrapper>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { FormPath } from 'sveltekit-superforms';
|
|
2
|
+
import { type FieldWrapperProps } from '../FieldWrapper.svelte';
|
|
3
|
+
declare function $$render<T extends Record<string, unknown>, U extends FormPath<T>, M>(): {
|
|
4
|
+
props: FieldWrapperProps<T, U, M> & {
|
|
5
|
+
value?: string;
|
|
6
|
+
class?: string;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
defaultHeight?: number;
|
|
9
|
+
showLock?: boolean;
|
|
10
|
+
defaultLocked?: boolean;
|
|
11
|
+
};
|
|
12
|
+
exports: {};
|
|
13
|
+
bindings: "value";
|
|
14
|
+
slots: {};
|
|
15
|
+
events: {};
|
|
16
|
+
};
|
|
17
|
+
declare class __sveltets_Render<T extends Record<string, unknown>, U extends FormPath<T>, M> {
|
|
18
|
+
props(): ReturnType<typeof $$render<T, U, M>>['props'];
|
|
19
|
+
events(): ReturnType<typeof $$render<T, U, M>>['events'];
|
|
20
|
+
slots(): ReturnType<typeof $$render<T, U, M>>['slots'];
|
|
21
|
+
bindings(): "value";
|
|
22
|
+
exports(): {};
|
|
23
|
+
}
|
|
24
|
+
interface $$IsomorphicComponent {
|
|
25
|
+
new <T extends Record<string, unknown>, U extends FormPath<T>, M>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T, U, M>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T, U, M>['props']>, ReturnType<__sveltets_Render<T, U, M>['events']>, ReturnType<__sveltets_Render<T, U, M>['slots']>> & {
|
|
26
|
+
$$bindings?: ReturnType<__sveltets_Render<T, U, M>['bindings']>;
|
|
27
|
+
} & ReturnType<__sveltets_Render<T, U, M>['exports']>;
|
|
28
|
+
<T extends Record<string, unknown>, U extends FormPath<T>, M>(internal: unknown, props: ReturnType<__sveltets_Render<T, U, M>['props']> & {}): ReturnType<__sveltets_Render<T, U, M>['exports']>;
|
|
29
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
|
|
30
|
+
}
|
|
31
|
+
declare const MessageField: $$IsomorphicComponent;
|
|
32
|
+
type MessageField<T extends Record<string, unknown>, U extends FormPath<T>, M> = InstanceType<typeof MessageField<T, U, M>>;
|
|
33
|
+
export default MessageField;
|
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
|
|
16
16
|
<FieldWrapper {...fieldProps}>
|
|
17
17
|
{#snippet formElem(props)}
|
|
18
|
-
<div class="flex w-full items-
|
|
18
|
+
<div class="flex w-full items-stretch gap-2">
|
|
19
19
|
<!-- Input itself -->
|
|
20
20
|
<Input type={inputType} bind:value {...props} />
|
|
21
21
|
|
|
22
22
|
<!-- Show/hide button outside input -->
|
|
23
23
|
<button
|
|
24
24
|
type="button"
|
|
25
|
-
class="flex cursor-pointer items-center justify-center rounded-
|
|
25
|
+
class="flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-gray-300 px-4 text-gray-500 transition-all hover:bg-gray-50 focus:border-transparent focus:ring-2 focus:ring-primary focus:outline-none"
|
|
26
26
|
onclick={() => (show = !show)}
|
|
27
27
|
aria-label={show ? 'Hide password' : 'Show password'}
|
|
28
28
|
>
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
let valueToItem: Map<V, I> = new Map(items.map((item) => [getValue(item), item] as const));
|
|
39
39
|
let keyToItem: Map<string, I> = new Map(items.map((item) => [getKey(item), item] as const));
|
|
40
40
|
|
|
41
|
-
// Enforce string key
|
|
41
|
+
// Enforce string key function
|
|
42
42
|
function getKey(item: I) {
|
|
43
43
|
const key = _getKey(item);
|
|
44
44
|
return key.toString();
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
let valueToItem: Map<V, I> = new Map(items.map((item) => [getValue(item), item] as const));
|
|
39
39
|
let keyToItem: Map<string, I> = new Map(items.map((item) => [getKey(item), item] as const));
|
|
40
40
|
|
|
41
|
-
// Enforce string key
|
|
41
|
+
// Enforce string key function
|
|
42
42
|
function getKey(item: I) {
|
|
43
43
|
const key = _getKey(item);
|
|
44
44
|
return key.toString();
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
<FieldWrapper {...fieldProps}>
|
|
71
71
|
{#snippet formElem(props)}
|
|
72
72
|
<Select type="multiple" {...props} bind:value={getKeyFromValue, setValueFromKey}>
|
|
73
|
-
<SelectTrigger class={cn('w-
|
|
73
|
+
<SelectTrigger class={cn('w-full cursor-pointer truncate', className)}>
|
|
74
74
|
<span class="block truncate">
|
|
75
75
|
{getPreview()}
|
|
76
76
|
</span>
|
|
@@ -9,8 +9,9 @@ import SelectField from './fields/SelectField.svelte';
|
|
|
9
9
|
import SelectMultiField from './fields/SelectMultiField.svelte';
|
|
10
10
|
import TextField from './fields/TextField.svelte';
|
|
11
11
|
import TextFieldNullable from './fields/TextFieldNullable.svelte';
|
|
12
|
+
import MessageField from './fields/MessageField.svelte';
|
|
12
13
|
import TimeField from './fields/TimeField.svelte';
|
|
13
14
|
import WeekdayChoiceField from './fields/WeekdayChoiceField.svelte';
|
|
14
15
|
import WeekdayChoiceMultiField from './fields/WeekdayChoiceMultiField.svelte';
|
|
15
16
|
import Form from './Form.svelte';
|
|
16
|
-
export { Button, ChoiceField, ChoiceMultiField, DateField, Form, HexColorField, NumberField, PasswordField, SelectField, SelectMultiField, TextField, TextFieldNullable, TimeField, WeekdayChoiceField, WeekdayChoiceMultiField };
|
|
17
|
+
export { Button, ChoiceField, ChoiceMultiField, DateField, Form, HexColorField, NumberField, PasswordField, SelectField, SelectMultiField, TextField, TextFieldNullable, MessageField, TimeField, WeekdayChoiceField, WeekdayChoiceMultiField };
|
|
@@ -9,8 +9,9 @@ import SelectField from './fields/SelectField.svelte';
|
|
|
9
9
|
import SelectMultiField from './fields/SelectMultiField.svelte';
|
|
10
10
|
import TextField from './fields/TextField.svelte';
|
|
11
11
|
import TextFieldNullable from './fields/TextFieldNullable.svelte';
|
|
12
|
+
import MessageField from './fields/MessageField.svelte';
|
|
12
13
|
import TimeField from './fields/TimeField.svelte';
|
|
13
14
|
import WeekdayChoiceField from './fields/WeekdayChoiceField.svelte';
|
|
14
15
|
import WeekdayChoiceMultiField from './fields/WeekdayChoiceMultiField.svelte';
|
|
15
16
|
import Form from './Form.svelte';
|
|
16
|
-
export { Button, ChoiceField, ChoiceMultiField, DateField, Form, HexColorField, NumberField, PasswordField, SelectField, SelectMultiField, TextField, TextFieldNullable, TimeField, WeekdayChoiceField, WeekdayChoiceMultiField };
|
|
17
|
+
export { Button, ChoiceField, ChoiceMultiField, DateField, Form, HexColorField, NumberField, PasswordField, SelectField, SelectMultiField, TextField, TextFieldNullable, MessageField, TimeField, WeekdayChoiceField, WeekdayChoiceMultiField };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn, type WithElementRef, type WithoutChildren } from '../../../utils.js';
|
|
3
|
+
import type { HTMLTextareaAttributes } from 'svelte/elements';
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
ref = $bindable(null),
|
|
7
|
+
value = $bindable(),
|
|
8
|
+
class: className,
|
|
9
|
+
'data-slot': dataSlot = 'textarea',
|
|
10
|
+
...restProps
|
|
11
|
+
}: WithoutChildren<WithElementRef<HTMLTextareaAttributes>> = $props();
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<textarea
|
|
15
|
+
bind:this={ref}
|
|
16
|
+
data-slot={dataSlot}
|
|
17
|
+
class={cn(
|
|
18
|
+
'w-full resize-y rounded-lg border border-gray-300 px-4 py-3 outline-none',
|
|
19
|
+
'transition-[border-color,box-shadow,opacity]',
|
|
20
|
+
'focus:border-transparent focus:ring-2 focus:ring-primary',
|
|
21
|
+
'disabled:cursor-not-allowed disabled:opacity-50',
|
|
22
|
+
'aria-invalid:border-red-500 aria-invalid:focus:ring-red-300',
|
|
23
|
+
className
|
|
24
|
+
)}
|
|
25
|
+
bind:value
|
|
26
|
+
{...restProps}
|
|
27
|
+
></textarea>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type WithElementRef } from '../../../utils.js';
|
|
2
|
+
import type { HTMLTextareaAttributes } from 'svelte/elements';
|
|
3
|
+
declare const Textarea: import("svelte").Component<Omit<WithElementRef<HTMLTextareaAttributes>, "children">, {}, "ref" | "value">;
|
|
4
|
+
type Textarea = ReturnType<typeof Textarea>;
|
|
5
|
+
export default Textarea;
|