@x33025/sveltely 0.1.1 → 0.1.3
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/Library/AnimatedNumber/AnimatedNumber.demo.svelte +1 -1
- package/dist/components/Library/AsyncButton/AsyncButton.svelte +42 -16
- package/dist/components/Library/Button/Button.demo.svelte +5 -3
- package/dist/components/Library/Button/Button.demo.svelte.d.ts +1 -0
- package/dist/components/Library/Button/Button.svelte +21 -13
- package/dist/components/Library/Calendar/Calendar.demo.svelte +2 -14
- package/dist/components/Library/Calendar/Calendar.svelte +69 -65
- package/dist/components/Library/Checkbox/Checkbox.svelte +13 -14
- package/dist/components/Library/ChipInput/ChipInput.demo.svelte +1 -1
- package/dist/components/Library/ChipInput/ChipInput.svelte +7 -4
- package/dist/components/Library/Divider/Divider.svelte +10 -0
- package/dist/components/Library/Divider/Divider.svelte.d.ts +26 -0
- package/dist/components/Library/Divider/index.d.ts +1 -0
- package/dist/components/Library/Divider/index.js +1 -0
- package/dist/components/Library/Dropdown/Action.svelte +60 -0
- package/dist/components/Library/Dropdown/Action.svelte.d.ts +11 -0
- package/dist/components/Library/Dropdown/Divider.svelte +5 -0
- package/dist/components/Library/Dropdown/Divider.svelte.d.ts +19 -0
- package/dist/components/Library/Dropdown/Dropdown.demo.svelte +182 -65
- package/dist/components/Library/Dropdown/Dropdown.demo.svelte.d.ts +2 -1
- package/dist/components/Library/Dropdown/Dropdown.svelte +95 -250
- package/dist/components/Library/Dropdown/Dropdown.svelte.d.ts +17 -16
- package/dist/components/Library/Dropdown/Item.svelte +68 -0
- package/dist/components/Library/Dropdown/Item.svelte.d.ts +31 -0
- package/dist/components/Library/Dropdown/Section.svelte +34 -0
- package/dist/components/Library/Dropdown/Section.svelte.d.ts +8 -0
- package/dist/components/Library/Dropdown/context.d.ts +34 -0
- package/dist/components/Library/Dropdown/context.js +6 -0
- package/dist/components/Library/Dropdown/index.d.ts +13 -2
- package/dist/components/Library/Dropdown/index.js +11 -1
- package/dist/components/Library/Floating/Floating.svelte +44 -7
- package/dist/components/Library/ForEach/ForEach.svelte +14 -0
- package/dist/components/Library/ForEach/ForEach.svelte.d.ts +28 -0
- package/dist/components/Library/ForEach/index.d.ts +1 -0
- package/dist/components/Library/ForEach/index.js +1 -0
- package/dist/components/Library/Grid/Grid.svelte +74 -0
- package/dist/components/Library/Grid/Grid.svelte.d.ts +13 -0
- package/dist/components/Library/Grid/index.d.ts +1 -0
- package/dist/components/Library/Grid/index.js +1 -0
- package/dist/components/Library/GridItem/GridItem.svelte +65 -0
- package/dist/components/Library/GridItem/GridItem.svelte.d.ts +14 -0
- package/dist/components/Library/GridItem/index.d.ts +1 -0
- package/dist/components/Library/GridItem/index.js +1 -0
- package/dist/components/Library/HStack/HStack.svelte +45 -0
- package/dist/components/Library/HStack/HStack.svelte.d.ts +9 -0
- package/dist/components/Library/HStack/index.d.ts +1 -0
- package/dist/components/Library/HStack/index.js +1 -0
- package/dist/components/Library/Image/Image.demo.svelte +18 -0
- package/dist/components/Library/Image/Image.demo.svelte.d.ts +23 -0
- package/dist/components/Library/Image/Image.svelte +57 -0
- package/dist/components/Library/Image/Image.svelte.d.ts +17 -0
- package/dist/components/Library/Image/ImagePlaceholder.svelte +202 -0
- package/dist/components/Library/Image/ImagePlaceholder.svelte.d.ts +7 -0
- package/dist/components/Library/Image/index.d.ts +1 -0
- package/dist/components/Library/Image/index.js +1 -0
- package/dist/components/Library/ImageMask/BrushPreview.svelte +119 -0
- package/dist/components/Library/ImageMask/BrushPreview.svelte.d.ts +11 -0
- package/dist/components/Library/ImageMask/ImageMask.demo.svelte +117 -0
- package/dist/components/Library/ImageMask/ImageMask.demo.svelte.d.ts +10 -0
- package/dist/components/Library/ImageMask/ImageMask.svelte +46 -0
- package/dist/components/Library/ImageMask/ImageMask.svelte.d.ts +20 -0
- package/dist/components/Library/ImageMask/MaskLayer.svelte +341 -0
- package/dist/components/Library/ImageMask/MaskLayer.svelte.d.ts +12 -0
- package/dist/components/Library/ImageMask/contour.d.ts +11 -0
- package/dist/components/Library/ImageMask/contour.js +152 -0
- package/dist/components/Library/ImageMask/index.d.ts +2 -0
- package/dist/components/Library/ImageMask/index.js +1 -0
- package/dist/components/Library/ImageMask/marchingAnts.d.ts +8 -0
- package/dist/components/Library/ImageMask/marchingAnts.js +29 -0
- package/dist/components/Library/ImageMask/maskSurface.d.ts +5 -0
- package/dist/components/Library/ImageMask/maskSurface.js +94 -0
- package/dist/components/Library/ImageMask/types.d.ts +23 -0
- package/dist/components/Library/Label/Label.demo.svelte +28 -0
- package/dist/components/Library/Label/Label.demo.svelte.d.ts +9 -0
- package/dist/components/Library/Label/Label.svelte +175 -0
- package/dist/components/Library/Label/Label.svelte.d.ts +18 -0
- package/dist/components/Library/Label/index.d.ts +1 -0
- package/dist/components/Library/Label/index.js +1 -0
- package/dist/components/Library/NavigationStack/NavigationStack.svelte +17 -7
- package/dist/components/Library/NavigationStack/Toolbar.svelte +7 -2
- package/dist/components/Library/NumberField/NumberField.demo.svelte +21 -0
- package/dist/components/Library/NumberField/NumberField.demo.svelte.d.ts +8 -0
- package/dist/components/Library/NumberField/NumberField.svelte +199 -0
- package/dist/components/Library/NumberField/NumberField.svelte.d.ts +21 -0
- package/dist/components/Library/NumberField/index.d.ts +1 -0
- package/dist/components/Library/NumberField/index.js +1 -0
- package/dist/components/Library/Pagination/Pagination.svelte +16 -20
- package/dist/components/Library/Popover/Popover.demo.svelte +2 -2
- package/dist/components/Library/Popover/Popover.svelte +7 -4
- package/dist/components/Library/ScrollView/ScrollView.svelte +165 -12
- package/dist/components/Library/ScrollView/ScrollView.svelte.d.ts +32 -4
- package/dist/components/Library/ScrollView/index.d.ts +1 -0
- package/dist/components/Library/{SearchInput/SearchInput.demo.svelte → SearchField/SearchField.demo.svelte} +4 -4
- package/dist/components/Library/SearchField/SearchField.demo.svelte.d.ts +8 -0
- package/dist/components/Library/{SearchInput/SearchInput.svelte → SearchField/SearchField.svelte} +26 -30
- package/dist/components/Library/{SearchInput/SearchInput.svelte.d.ts → SearchField/SearchField.svelte.d.ts} +3 -3
- package/dist/components/Library/SearchField/index.d.ts +1 -0
- package/dist/components/Library/SearchField/index.js +1 -0
- package/dist/components/Library/SegmentedPicker/SegmentedPicker.demo.svelte +1 -1
- package/dist/components/Library/SegmentedPicker/SegmentedPicker.svelte +9 -9
- package/dist/components/Library/Sheet/Sheet.demo.svelte +1 -1
- package/dist/components/Library/Sheet/Sheet.svelte +8 -5
- package/dist/components/Library/Slider/Slider.demo.svelte +1 -1
- package/dist/components/Library/Slider/Slider.svelte +11 -10
- package/dist/components/Library/Spacer/Spacer.svelte +7 -0
- package/dist/components/Library/Spacer/Spacer.svelte.d.ts +26 -0
- package/dist/components/Library/Spacer/index.d.ts +1 -0
- package/dist/components/Library/Spacer/index.js +1 -0
- package/dist/components/Library/Spinner/Spinner.demo.svelte +1 -1
- package/dist/components/Library/Switch/Switch.svelte +6 -11
- package/dist/components/Library/TextField/TextField.demo.svelte +14 -0
- package/dist/components/Library/TextField/TextField.demo.svelte.d.ts +8 -0
- package/dist/components/Library/TextField/TextField.svelte +154 -0
- package/dist/components/Library/TextField/TextField.svelte.d.ts +19 -0
- package/dist/components/Library/TextField/index.d.ts +1 -0
- package/dist/components/Library/TextField/index.js +1 -0
- package/dist/components/Library/{TokenSearchInput/TokenSearchInput.demo.svelte → TokenSearchField/TokenSearchField.demo.svelte} +4 -4
- package/dist/components/Library/TokenSearchField/TokenSearchField.demo.svelte.d.ts +9 -0
- package/dist/components/Library/{TokenSearchInput/TokenSearchInput.svelte → TokenSearchField/TokenSearchField.svelte} +70 -66
- package/dist/components/Library/{TokenSearchInput/TokenSearchInput.svelte.d.ts → TokenSearchField/TokenSearchField.svelte.d.ts} +3 -3
- package/dist/components/Library/TokenSearchField/index.d.ts +1 -0
- package/dist/components/Library/TokenSearchField/index.js +1 -0
- package/dist/components/Library/VStack/VStack.svelte +45 -0
- package/dist/components/Library/VStack/VStack.svelte.d.ts +9 -0
- package/dist/components/Library/VStack/index.d.ts +1 -0
- package/dist/components/Library/VStack/index.js +1 -0
- package/dist/components/Library/WheelPicker/WheelColumn.svelte +4 -10
- package/dist/components/Library/WheelPicker/WheelPicker.svelte +5 -9
- package/dist/components/Local/ComponentGrid.svelte +15 -31
- package/dist/components/Local/HeroCard.svelte +30 -38
- package/dist/components/Local/HeroCard.svelte.d.ts +0 -2
- package/dist/components/Local/StyleControls.svelte +58 -27
- package/dist/components/Local/StyleControls.svelte.d.ts +3 -1
- package/dist/index.d.ts +26 -2
- package/dist/index.js +19 -2
- package/dist/style/index.css +35 -20
- package/dist/style/label.d.ts +6 -0
- package/dist/style/label.js +4 -0
- package/dist/style/layout.d.ts +57 -0
- package/dist/style/layout.js +128 -0
- package/dist/style/media.d.ts +12 -0
- package/dist/style/media.js +8 -0
- package/dist/style/scroll.d.ts +7 -0
- package/dist/style/scroll.js +5 -0
- package/dist/style/text-editor.d.ts +34 -0
- package/dist/style/text-editor.js +29 -0
- package/dist/style.css +112 -58
- package/package.json +1 -1
- package/dist/components/Library/Dropdown/types.d.ts +0 -27
- package/dist/components/Library/SearchInput/SearchInput.demo.svelte.d.ts +0 -8
- package/dist/components/Library/SearchInput/index.d.ts +0 -1
- package/dist/components/Library/SearchInput/index.js +0 -1
- package/dist/components/Library/TokenSearchInput/TokenSearchInput.demo.svelte.d.ts +0 -9
- package/dist/components/Library/TokenSearchInput/index.d.ts +0 -1
- package/dist/components/Library/TokenSearchInput/index.js +0 -1
- /package/dist/components/Library/{Dropdown → ImageMask}/types.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Spacer.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Spacer.svelte';
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
gap: var(--switch-gap, var(--sveltely-gap));
|
|
75
75
|
font-size: var(--switch-font-size);
|
|
76
76
|
line-height: 1.25;
|
|
77
|
-
color: var(--switch-color, var(--
|
|
77
|
+
color: var(--switch-color, var(--sveltely-primary-color));
|
|
78
78
|
cursor: pointer;
|
|
79
79
|
user-select: none;
|
|
80
80
|
}
|
|
@@ -106,7 +106,8 @@
|
|
|
106
106
|
display: block;
|
|
107
107
|
width: 100%;
|
|
108
108
|
height: 100%;
|
|
109
|
-
border: var(--switch-border-width) solid
|
|
109
|
+
border: var(--switch-border-width) solid
|
|
110
|
+
var(--switch-border-color, var(--sveltely-border-color));
|
|
110
111
|
border-radius: var(--switch-resolved-border-radius);
|
|
111
112
|
background: var(--switch-background, var(--sveltely-inactive-color));
|
|
112
113
|
box-sizing: border-box;
|
|
@@ -142,14 +143,8 @@
|
|
|
142
143
|
}
|
|
143
144
|
|
|
144
145
|
.switch:hover .switch-control input:checked + .switch-track {
|
|
145
|
-
border-color: var(
|
|
146
|
-
|
|
147
|
-
var(--sveltely-active-hover-color)
|
|
148
|
-
);
|
|
149
|
-
background: var(
|
|
150
|
-
--switch-checked-hover-background,
|
|
151
|
-
var(--sveltely-active-hover-color)
|
|
152
|
-
);
|
|
146
|
+
border-color: var(--switch-checked-hover-border-color, var(--sveltely-active-hover-color));
|
|
147
|
+
background: var(--switch-checked-hover-background, var(--sveltely-active-hover-color));
|
|
153
148
|
}
|
|
154
149
|
|
|
155
150
|
.switch-control input:checked + .switch-track .switch-thumb {
|
|
@@ -158,7 +153,7 @@
|
|
|
158
153
|
}
|
|
159
154
|
|
|
160
155
|
.switch-control input:focus-visible + .switch-track {
|
|
161
|
-
outline: 2px solid color-mix(in oklab, var(--sveltely-
|
|
156
|
+
outline: 2px solid color-mix(in oklab, var(--sveltely-active-color) 24%, white);
|
|
162
157
|
outline-offset: 2px;
|
|
163
158
|
}
|
|
164
159
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
export const demo = {
|
|
3
|
+
name: 'TextField',
|
|
4
|
+
description: 'Token-aware text input with help and error states.'
|
|
5
|
+
};
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import TextField from './TextField.svelte';
|
|
10
|
+
|
|
11
|
+
let value = $state('Sveltely');
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<TextField bind:value placeholder="Enter name" help="Value: {value}" />
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const demo: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
};
|
|
5
|
+
import TextField from './TextField.svelte';
|
|
6
|
+
declare const TextField: import("svelte").Component<Record<string, never>, {}, "">;
|
|
7
|
+
type TextField = ReturnType<typeof TextField>;
|
|
8
|
+
export default TextField;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
3
|
+
import { tooltip } from '../../../actions/tooltip';
|
|
4
|
+
import { surfaceStyle, type StyleProps } from '../../../style/surface';
|
|
5
|
+
import {
|
|
6
|
+
textEditorStyle,
|
|
7
|
+
type TextEditorProps,
|
|
8
|
+
type TextFieldType,
|
|
9
|
+
type TextInputMode
|
|
10
|
+
} from '../../../style/text-editor';
|
|
11
|
+
|
|
12
|
+
type Props = {
|
|
13
|
+
value?: string;
|
|
14
|
+
help?: string;
|
|
15
|
+
error?: string | null;
|
|
16
|
+
type?: TextFieldType;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
placeholder?: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
autocomplete?: HTMLInputAttributes['autocomplete'];
|
|
21
|
+
required?: boolean;
|
|
22
|
+
readonly?: boolean;
|
|
23
|
+
inputmode?: TextInputMode;
|
|
24
|
+
} & StyleProps &
|
|
25
|
+
TextEditorProps;
|
|
26
|
+
|
|
27
|
+
let {
|
|
28
|
+
value = $bindable(''),
|
|
29
|
+
help,
|
|
30
|
+
error = null,
|
|
31
|
+
type = 'text',
|
|
32
|
+
disabled = false,
|
|
33
|
+
placeholder = '',
|
|
34
|
+
name,
|
|
35
|
+
autocomplete,
|
|
36
|
+
required = false,
|
|
37
|
+
readonly = false,
|
|
38
|
+
inputmode,
|
|
39
|
+
textAlign,
|
|
40
|
+
fontSize,
|
|
41
|
+
paddingX,
|
|
42
|
+
paddingY,
|
|
43
|
+
gap,
|
|
44
|
+
borderRadius,
|
|
45
|
+
inset,
|
|
46
|
+
background,
|
|
47
|
+
borderColor,
|
|
48
|
+
color
|
|
49
|
+
}: Props = $props();
|
|
50
|
+
|
|
51
|
+
const styleProps = $derived({
|
|
52
|
+
fontSize,
|
|
53
|
+
paddingX,
|
|
54
|
+
paddingY,
|
|
55
|
+
gap,
|
|
56
|
+
borderRadius,
|
|
57
|
+
inset,
|
|
58
|
+
background,
|
|
59
|
+
borderColor,
|
|
60
|
+
color
|
|
61
|
+
});
|
|
62
|
+
const textEditorProps = $derived({ textAlign });
|
|
63
|
+
const rootStyle = $derived.by(() =>
|
|
64
|
+
[surfaceStyle(styleProps, 'text-field'), textEditorStyle(textEditorProps)]
|
|
65
|
+
.filter(Boolean)
|
|
66
|
+
.join(' ')
|
|
67
|
+
);
|
|
68
|
+
const describedBy = $derived(help ? 'text-field-message' : undefined);
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<div
|
|
72
|
+
use:tooltip={{ label: error ?? '', disabled: !error }}
|
|
73
|
+
class="text-field"
|
|
74
|
+
style={rootStyle}
|
|
75
|
+
data-disabled={disabled ? 'true' : 'false'}
|
|
76
|
+
data-error={error ? 'true' : 'false'}
|
|
77
|
+
>
|
|
78
|
+
<input
|
|
79
|
+
bind:value
|
|
80
|
+
{type}
|
|
81
|
+
{disabled}
|
|
82
|
+
{name}
|
|
83
|
+
{autocomplete}
|
|
84
|
+
{required}
|
|
85
|
+
{readonly}
|
|
86
|
+
{inputmode}
|
|
87
|
+
{placeholder}
|
|
88
|
+
aria-invalid={error ? 'true' : undefined}
|
|
89
|
+
aria-describedby={describedBy}
|
|
90
|
+
class="text-field-input"
|
|
91
|
+
/>
|
|
92
|
+
|
|
93
|
+
{#if help}
|
|
94
|
+
<span id="text-field-message" class="text-field-message">{help}</span>
|
|
95
|
+
{/if}
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<style>
|
|
99
|
+
.text-field {
|
|
100
|
+
display: inline-flex;
|
|
101
|
+
width: 100%;
|
|
102
|
+
min-width: 0;
|
|
103
|
+
flex-direction: column;
|
|
104
|
+
gap: var(--text-field-gap, calc(var(--sveltely-gap) * 0.75));
|
|
105
|
+
color: var(--text-field-color, var(--sveltely-primary-color));
|
|
106
|
+
font-size: var(--text-field-font-size, calc(var(--sveltely-font-size) * 0.875));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.text-field-input {
|
|
110
|
+
width: 100%;
|
|
111
|
+
min-width: 0;
|
|
112
|
+
border: 1px solid var(--text-field-border-color, var(--sveltely-border-color));
|
|
113
|
+
border-radius: var(--text-field-border-radius, var(--sveltely-border-radius));
|
|
114
|
+
background: var(--text-field-background, var(--sveltely-background-color));
|
|
115
|
+
color: inherit;
|
|
116
|
+
line-height: 1.25rem;
|
|
117
|
+
outline: none;
|
|
118
|
+
padding: var(--text-field-padding-y, calc(var(--sveltely-padding-y) * 0.67))
|
|
119
|
+
var(--text-field-padding-x, var(--sveltely-padding-x));
|
|
120
|
+
text-align: var(--text-field-text-align, start);
|
|
121
|
+
transition:
|
|
122
|
+
color 150ms,
|
|
123
|
+
border-color 150ms,
|
|
124
|
+
background-color 150ms,
|
|
125
|
+
box-shadow 150ms;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.text-field-input:focus {
|
|
129
|
+
border-color: color-mix(in oklab, var(--sveltely-active-color) 50%, white);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.text-field-input::placeholder {
|
|
133
|
+
color: var(--sveltely-secondary-color);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.text-field-message {
|
|
137
|
+
color: var(--sveltely-secondary-color);
|
|
138
|
+
font-size: calc(var(--text-field-font-size, 0.875rem) * 0.857);
|
|
139
|
+
line-height: 1.25;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.text-field[data-error='true'] .text-field-input {
|
|
143
|
+
border-color: var(--color-red-500);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.text-field[data-error='true'] .text-field-message {
|
|
147
|
+
color: var(--color-red-600);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.text-field[data-disabled='true'] {
|
|
151
|
+
cursor: not-allowed;
|
|
152
|
+
opacity: 0.6;
|
|
153
|
+
}
|
|
154
|
+
</style>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
2
|
+
import { type StyleProps } from '../../../style/surface';
|
|
3
|
+
import { type TextEditorProps, type TextFieldType, type TextInputMode } from '../../../style/text-editor';
|
|
4
|
+
type Props = {
|
|
5
|
+
value?: string;
|
|
6
|
+
help?: string;
|
|
7
|
+
error?: string | null;
|
|
8
|
+
type?: TextFieldType;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
autocomplete?: HTMLInputAttributes['autocomplete'];
|
|
13
|
+
required?: boolean;
|
|
14
|
+
readonly?: boolean;
|
|
15
|
+
inputmode?: TextInputMode;
|
|
16
|
+
} & StyleProps & TextEditorProps;
|
|
17
|
+
declare const TextField: import("svelte").Component<Props, {}, "value">;
|
|
18
|
+
type TextField = ReturnType<typeof TextField>;
|
|
19
|
+
export default TextField;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './TextField.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './TextField.svelte';
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
export const demo = {
|
|
3
|
-
name: '
|
|
3
|
+
name: 'TokenSearchField',
|
|
4
4
|
description: 'Search field that turns comma-separated entries into removable tokens.',
|
|
5
5
|
columnSpan: 2
|
|
6
6
|
};
|
|
7
7
|
</script>
|
|
8
8
|
|
|
9
9
|
<script lang="ts">
|
|
10
|
-
import
|
|
10
|
+
import TokenSearchField from './TokenSearchField.svelte';
|
|
11
11
|
|
|
12
12
|
let tokens = $state(['svelte', 'ui']);
|
|
13
13
|
let value = $state('');
|
|
14
14
|
</script>
|
|
15
15
|
|
|
16
16
|
<div class="vstack w-full max-w-md gap-2">
|
|
17
|
-
<
|
|
18
|
-
<p class="text-xs text-
|
|
17
|
+
<TokenSearchField bind:tokens bind:value placeholder="Search keywords" />
|
|
18
|
+
<p class="text-xs text-[var(--sveltely-secondary-color)]">Tokens: {tokens.join(', ') || 'empty'}</p>
|
|
19
19
|
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const demo: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
columnSpan: number;
|
|
5
|
+
};
|
|
6
|
+
import TokenSearchField from './TokenSearchField.svelte';
|
|
7
|
+
declare const TokenSearchField: import("svelte").Component<Record<string, never>, {}, "">;
|
|
8
|
+
type TokenSearchField = ReturnType<typeof TokenSearchField>;
|
|
9
|
+
export default TokenSearchField;
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
tokenPlaceholder?: string;
|
|
12
12
|
normalizeToken?: (value: string) => string;
|
|
13
13
|
showIcon?: boolean;
|
|
14
|
-
} & StyleProps &
|
|
14
|
+
} & StyleProps &
|
|
15
|
+
Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'placeholder' | 'class' | 'style'>;
|
|
15
16
|
|
|
16
17
|
const defaultNormalizeToken = (value: string) => value.trim().replace(/\s+/g, ' ');
|
|
17
18
|
|
|
@@ -30,7 +31,7 @@
|
|
|
30
31
|
const extractedStyleProps = $derived.by(() => extractStyleProps(restProps));
|
|
31
32
|
const styleProps = $derived(extractedStyleProps.styleProps);
|
|
32
33
|
const props = $derived(extractedStyleProps.restProps);
|
|
33
|
-
const rootStyle = $derived.by(() => surfaceStyle(styleProps, 'token-search-
|
|
34
|
+
const rootStyle = $derived.by(() => surfaceStyle(styleProps, 'token-search-field'));
|
|
34
35
|
|
|
35
36
|
const addToken = (rawValue: string) => {
|
|
36
37
|
const token = normalizeToken(rawValue);
|
|
@@ -68,12 +69,10 @@
|
|
|
68
69
|
event.preventDefault();
|
|
69
70
|
|
|
70
71
|
const nextTokens = [...tokens];
|
|
71
|
-
const seen = new Set(nextTokens);
|
|
72
72
|
for (const part of pasted.split(',')) {
|
|
73
73
|
const token = normalizeToken(part);
|
|
74
|
-
if (!token ||
|
|
74
|
+
if (!token || nextTokens.includes(token)) continue;
|
|
75
75
|
nextTokens.push(token);
|
|
76
|
-
seen.add(token);
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
tokens = nextTokens;
|
|
@@ -81,28 +80,28 @@
|
|
|
81
80
|
};
|
|
82
81
|
</script>
|
|
83
82
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
<div
|
|
84
|
+
class="token-search-field hstack w-full flex-nowrap items-center overflow-x-auto overflow-y-hidden whitespace-nowrap"
|
|
85
|
+
class:token-search-field-has-tokens={tokens.length > 0}
|
|
86
|
+
style={rootStyle}
|
|
87
|
+
data-disabled={disabled ? 'true' : 'false'}
|
|
88
|
+
>
|
|
90
89
|
{#if showIcon}
|
|
91
|
-
<span class="token-search-
|
|
92
|
-
<SearchIcon class="token-search-
|
|
90
|
+
<span class="token-search-field-icon" aria-hidden="true">
|
|
91
|
+
<SearchIcon class="token-search-field-search-icon" />
|
|
93
92
|
</span>
|
|
94
93
|
{/if}
|
|
95
94
|
|
|
96
95
|
{#each tokens as token, index (`${token}-${index}`)}
|
|
97
96
|
<button
|
|
98
97
|
type="button"
|
|
99
|
-
class="token-search-
|
|
98
|
+
class="token-search-field-token"
|
|
100
99
|
onclick={() => removeToken(index)}
|
|
101
100
|
aria-label={`Remove search token ${token}`}
|
|
102
101
|
{disabled}
|
|
103
102
|
>
|
|
104
103
|
<span>{token}</span>
|
|
105
|
-
<X class="token-search-
|
|
104
|
+
<X class="token-search-field-remove-icon" aria-hidden="true" />
|
|
106
105
|
</button>
|
|
107
106
|
{/each}
|
|
108
107
|
|
|
@@ -111,7 +110,7 @@
|
|
|
111
110
|
bind:value
|
|
112
111
|
{disabled}
|
|
113
112
|
placeholder={tokens.length === 0 ? placeholder : tokenPlaceholder}
|
|
114
|
-
class="token-search-input
|
|
113
|
+
class="token-search-field-input"
|
|
115
114
|
onkeydown={onKeydown}
|
|
116
115
|
onpaste={onPaste}
|
|
117
116
|
onblur={commitValue}
|
|
@@ -119,60 +118,63 @@
|
|
|
119
118
|
/>
|
|
120
119
|
|
|
121
120
|
{#if confirmText}
|
|
122
|
-
<span class="token-search-
|
|
121
|
+
<span class="token-search-field-confirm">
|
|
123
122
|
{confirmText}
|
|
124
123
|
</span>
|
|
125
124
|
{/if}
|
|
126
125
|
</div>
|
|
127
126
|
|
|
128
127
|
<style>
|
|
129
|
-
.token-search-
|
|
130
|
-
--token-search-
|
|
131
|
-
--token-search-
|
|
132
|
-
--token-search-
|
|
133
|
-
--token-search-
|
|
134
|
-
--token-search-
|
|
135
|
-
--token-search-
|
|
136
|
-
--token-search-
|
|
137
|
-
--sveltely-nested-inset: var(--token-search-
|
|
128
|
+
.token-search-field {
|
|
129
|
+
--token-search-field-inset: var(--sveltely-inset);
|
|
130
|
+
--token-search-field-font-size: calc(var(--sveltely-font-size) * 0.875);
|
|
131
|
+
--token-search-field-scale: calc(var(--token-search-field-font-size) / 0.875rem);
|
|
132
|
+
--token-search-field-line-height: calc(var(--token-search-field-font-size) * 1.429);
|
|
133
|
+
--token-search-field-search-icon-size: calc(var(--token-search-field-font-size) * 1.143);
|
|
134
|
+
--token-search-field-remove-icon-size: calc(var(--token-search-field-font-size) * 0.857);
|
|
135
|
+
--token-search-field-confirm-font-size: calc(var(--token-search-field-font-size) * 0.857);
|
|
136
|
+
--sveltely-nested-inset: var(--token-search-field-inset);
|
|
138
137
|
min-width: 0;
|
|
139
138
|
border: 1px solid var(--sveltely-border-color);
|
|
140
139
|
border-radius: var(--sveltely-border-radius);
|
|
141
|
-
color: var(--
|
|
142
|
-
gap: var(--token-search-
|
|
143
|
-
padding:
|
|
144
|
-
calc(var(--sveltely-padding-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
line-height: var(--token-search-input-line-height);
|
|
140
|
+
color: var(--sveltely-primary-color);
|
|
141
|
+
gap: var(--token-search-field-inset);
|
|
142
|
+
padding: calc(var(--sveltely-padding-y) * 0.58 * var(--token-search-field-scale))
|
|
143
|
+
calc(var(--sveltely-padding-x) * var(--token-search-field-scale));
|
|
144
|
+
font-size: var(--token-search-field-font-size);
|
|
145
|
+
line-height: var(--token-search-field-line-height);
|
|
148
146
|
outline: none;
|
|
149
|
-
transition:
|
|
147
|
+
transition:
|
|
148
|
+
color 150ms,
|
|
149
|
+
border-color 150ms,
|
|
150
|
+
background-color 150ms,
|
|
151
|
+
box-shadow 150ms;
|
|
150
152
|
}
|
|
151
153
|
|
|
152
|
-
.token-search-
|
|
153
|
-
border-color: color-mix(in oklab, var(--sveltely-
|
|
154
|
+
.token-search-field:focus-within {
|
|
155
|
+
border-color: color-mix(in oklab, var(--sveltely-active-color) 50%, white);
|
|
154
156
|
}
|
|
155
157
|
|
|
156
|
-
.token-search-
|
|
157
|
-
padding: var(--token-search-
|
|
158
|
+
.token-search-field-has-tokens {
|
|
159
|
+
padding: var(--token-search-field-inset);
|
|
158
160
|
}
|
|
159
161
|
|
|
160
|
-
.token-search-
|
|
162
|
+
.token-search-field[data-disabled='true'] {
|
|
161
163
|
cursor: not-allowed;
|
|
162
164
|
opacity: 0.6;
|
|
163
165
|
}
|
|
164
166
|
|
|
165
|
-
.token-search-
|
|
167
|
+
.token-search-field-icon {
|
|
166
168
|
flex-shrink: 0;
|
|
167
|
-
color: var(--
|
|
169
|
+
color: var(--sveltely-secondary-color);
|
|
168
170
|
}
|
|
169
171
|
|
|
170
|
-
:global(.token-search-
|
|
171
|
-
width: var(--token-search-
|
|
172
|
-
height: var(--token-search-
|
|
172
|
+
:global(.token-search-field-search-icon) {
|
|
173
|
+
width: var(--token-search-field-search-icon-size);
|
|
174
|
+
height: var(--token-search-field-search-icon-size);
|
|
173
175
|
}
|
|
174
176
|
|
|
175
|
-
.token-search-input
|
|
177
|
+
.token-search-field-input {
|
|
176
178
|
field-sizing: content;
|
|
177
179
|
min-width: 0;
|
|
178
180
|
flex: 1 1 auto;
|
|
@@ -180,50 +182,52 @@
|
|
|
180
182
|
outline: none;
|
|
181
183
|
}
|
|
182
184
|
|
|
183
|
-
.token-search-input
|
|
185
|
+
.token-search-field-input::-webkit-search-cancel-button {
|
|
184
186
|
appearance: none;
|
|
185
187
|
}
|
|
186
188
|
|
|
187
|
-
.token-search-
|
|
189
|
+
.token-search-field-token {
|
|
188
190
|
display: inline-flex;
|
|
189
191
|
flex-shrink: 0;
|
|
190
192
|
align-items: center;
|
|
191
193
|
border: 1px solid var(--sveltely-border-color);
|
|
192
194
|
border-radius: var(--sveltely-border-radius-nested);
|
|
193
|
-
background: var(--
|
|
194
|
-
color: var(--
|
|
195
|
+
background: var(--sveltely-inactive-color);
|
|
196
|
+
color: var(--sveltely-primary-color);
|
|
195
197
|
font-size: inherit;
|
|
196
198
|
line-height: inherit;
|
|
197
|
-
gap: calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-
|
|
198
|
-
padding:
|
|
199
|
-
calc(var(--sveltely-padding-y) * 0.
|
|
200
|
-
calc(var(--sveltely-padding-y) * 0.
|
|
201
|
-
calc(var(--sveltely-padding-
|
|
202
|
-
|
|
203
|
-
|
|
199
|
+
gap: calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-field-scale));
|
|
200
|
+
padding: calc(var(--sveltely-padding-y) * 0.17 * var(--token-search-field-scale))
|
|
201
|
+
calc(var(--sveltely-padding-y) * 0.33 * var(--token-search-field-scale))
|
|
202
|
+
calc(var(--sveltely-padding-y) * 0.17 * var(--token-search-field-scale))
|
|
203
|
+
calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-field-scale));
|
|
204
|
+
transition:
|
|
205
|
+
color 150ms,
|
|
206
|
+
border-color 150ms,
|
|
207
|
+
background-color 150ms;
|
|
204
208
|
}
|
|
205
209
|
|
|
206
|
-
:global(.token-search-
|
|
207
|
-
width: var(--token-search-
|
|
208
|
-
height: var(--token-search-
|
|
210
|
+
:global(.token-search-field-remove-icon) {
|
|
211
|
+
width: var(--token-search-field-remove-icon-size);
|
|
212
|
+
height: var(--token-search-field-remove-icon-size);
|
|
209
213
|
}
|
|
210
214
|
|
|
211
|
-
.token-search-
|
|
212
|
-
border-color: var(--
|
|
215
|
+
.token-search-field-token:hover:not(:disabled) {
|
|
216
|
+
border-color: var(--sveltely-border-color);
|
|
213
217
|
background: var(--sveltely-hover-color);
|
|
214
218
|
}
|
|
215
219
|
|
|
216
|
-
.token-search-
|
|
220
|
+
.token-search-field-token:disabled {
|
|
217
221
|
cursor: not-allowed;
|
|
218
222
|
opacity: 0.6;
|
|
219
223
|
}
|
|
220
224
|
|
|
221
|
-
.token-search-
|
|
225
|
+
.token-search-field-confirm {
|
|
222
226
|
flex-shrink: 0;
|
|
223
|
-
color: var(--
|
|
224
|
-
font-size: var(--token-search-
|
|
227
|
+
color: var(--sveltely-secondary-color);
|
|
228
|
+
font-size: var(--token-search-field-confirm-font-size);
|
|
225
229
|
font-weight: 500;
|
|
226
|
-
line-height: calc(var(--token-search-
|
|
230
|
+
line-height: calc(var(--token-search-field-confirm-font-size) * 1.333);
|
|
227
231
|
letter-spacing: 0.18em;
|
|
228
232
|
text-transform: uppercase;
|
|
229
233
|
}
|
|
@@ -9,6 +9,6 @@ type Props = {
|
|
|
9
9
|
normalizeToken?: (value: string) => string;
|
|
10
10
|
showIcon?: boolean;
|
|
11
11
|
} & StyleProps & Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'placeholder' | 'class' | 'style'>;
|
|
12
|
-
declare const
|
|
13
|
-
type
|
|
14
|
-
export default
|
|
12
|
+
declare const TokenSearchField: import("svelte").Component<Props, {}, "value" | "tokens">;
|
|
13
|
+
type TokenSearchField = ReturnType<typeof TokenSearchField>;
|
|
14
|
+
export default TokenSearchField;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './TokenSearchField.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './TokenSearchField.svelte';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { extractLayoutProps, layoutStyle, type LayoutProps } from '../../../style/layout';
|
|
4
|
+
import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
} & LayoutProps &
|
|
9
|
+
StyleProps;
|
|
10
|
+
|
|
11
|
+
let { children, ...restProps }: Props = $props();
|
|
12
|
+
|
|
13
|
+
const extractedLayoutProps = $derived.by(() => extractLayoutProps(restProps));
|
|
14
|
+
const layoutProps = $derived(extractedLayoutProps.layoutProps);
|
|
15
|
+
const afterLayoutProps = $derived(extractedLayoutProps.restProps);
|
|
16
|
+
const extractedStyleProps = $derived.by(() => extractStyleProps(afterLayoutProps));
|
|
17
|
+
const styleProps = $derived(extractedStyleProps.styleProps);
|
|
18
|
+
const rootStyle = $derived.by(() =>
|
|
19
|
+
[layoutStyle(layoutProps), surfaceStyle(styleProps, 'stack')].filter(Boolean).join(' ')
|
|
20
|
+
);
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<div class="vstack" style={rootStyle}>
|
|
24
|
+
{#if children}
|
|
25
|
+
{@render children()}
|
|
26
|
+
{/if}
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<style>
|
|
30
|
+
.vstack {
|
|
31
|
+
display: flex;
|
|
32
|
+
min-width: min-content;
|
|
33
|
+
min-height: min-content;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
gap: var(--stack-gap, 0px);
|
|
36
|
+
border-radius: var(--stack-border-radius, 0px);
|
|
37
|
+
padding:
|
|
38
|
+
var(--stack-padding-y, 0px)
|
|
39
|
+
var(--stack-padding-x, 0px);
|
|
40
|
+
font-size: var(--stack-font-size, inherit);
|
|
41
|
+
--divider-width: 100%;
|
|
42
|
+
--divider-height: 1px;
|
|
43
|
+
--divider-align-self: auto;
|
|
44
|
+
}
|
|
45
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import { type LayoutProps } from '../../../style/layout';
|
|
3
|
+
import { type StyleProps } from '../../../style/surface';
|
|
4
|
+
type Props = {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
} & LayoutProps & StyleProps;
|
|
7
|
+
declare const VStack: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type VStack = ReturnType<typeof VStack>;
|
|
9
|
+
export default VStack;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './VStack.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './VStack.svelte';
|
|
@@ -20,11 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
const easeOutCubic = (t: number) => 1 - Math.pow(1 - t, 3);
|
|
22
22
|
|
|
23
|
-
const animateScrollTo = (
|
|
24
|
-
nextViewport: HTMLDivElement,
|
|
25
|
-
targetTop: number,
|
|
26
|
-
duration = 220
|
|
27
|
-
) => {
|
|
23
|
+
const animateScrollTo = (nextViewport: HTMLDivElement, targetTop: number, duration = 220) => {
|
|
28
24
|
if (scrollAnimationFrame) cancelAnimationFrame(scrollAnimationFrame);
|
|
29
25
|
|
|
30
26
|
const startTop = nextViewport.scrollTop;
|
|
@@ -264,12 +260,10 @@
|
|
|
264
260
|
display: flex;
|
|
265
261
|
align-items: center;
|
|
266
262
|
justify-content: center;
|
|
267
|
-
padding:
|
|
268
|
-
0
|
|
269
|
-
calc(var(--sveltely-padding-x) * 0.67 * var(--wheel-picker-scale));
|
|
263
|
+
padding: 0 calc(var(--sveltely-padding-x) * 0.67 * var(--wheel-picker-scale));
|
|
270
264
|
font-size: calc(var(--wheel-picker-font-size) * 0.875);
|
|
271
265
|
line-height: 1;
|
|
272
|
-
color: var(--
|
|
266
|
+
color: var(--sveltely-primary-color);
|
|
273
267
|
text-align: center;
|
|
274
268
|
appearance: none;
|
|
275
269
|
position: relative;
|
|
@@ -289,7 +283,7 @@
|
|
|
289
283
|
}
|
|
290
284
|
|
|
291
285
|
.wheel-column-option:focus-visible {
|
|
292
|
-
outline: 2px solid color-mix(in oklab, var(--sveltely-
|
|
286
|
+
outline: 2px solid color-mix(in oklab, var(--sveltely-active-color) 24%, white);
|
|
293
287
|
outline-offset: 2px;
|
|
294
288
|
}
|
|
295
289
|
|