@dvcol/neo-svelte 0.1.2 → 0.1.4

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 (152) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +25 -26
  3. package/dist/buttons/NeoButton.svelte +140 -128
  4. package/dist/buttons/NeoButtonGroup.svelte +99 -108
  5. package/dist/buttons/neo-button-group.model.d.ts +18 -19
  6. package/dist/buttons/neo-button.model.d.ts +6 -10
  7. package/dist/cards/NeoCard.svelte +176 -73
  8. package/dist/cards/NeoCard.svelte.d.ts +1 -1
  9. package/dist/cards/neo-card.model.d.ts +29 -1
  10. package/dist/containers/NeoTransitionContainer.svelte +13 -2
  11. package/dist/containers/neo-transition-container.model.d.ts +9 -1
  12. package/dist/divider/NeoDivider.svelte +11 -11
  13. package/dist/icons/IconAccount.svelte +10 -2
  14. package/dist/icons/IconAdd.svelte +10 -2
  15. package/dist/icons/IconAlert.svelte +2 -2
  16. package/dist/icons/IconCalendar.svelte +23 -0
  17. package/dist/icons/IconCalendar.svelte.d.ts +26 -0
  18. package/dist/icons/IconCheckbox.svelte +87 -0
  19. package/dist/icons/IconCheckbox.svelte.d.ts +55 -0
  20. package/dist/icons/IconCircleLoading.svelte +2 -2
  21. package/dist/icons/IconClear.svelte +10 -2
  22. package/dist/icons/IconClose.svelte +2 -2
  23. package/dist/icons/IconConfirm.svelte +2 -2
  24. package/dist/icons/IconDownload.svelte +17 -0
  25. package/dist/icons/IconDownload.svelte.d.ts +26 -0
  26. package/dist/icons/IconEmpty.svelte +2 -2
  27. package/dist/icons/IconFileUpload.svelte +2 -2
  28. package/dist/icons/IconGithub.svelte +2 -2
  29. package/dist/icons/IconImage.svelte +2 -2
  30. package/dist/icons/IconMinus.svelte +2 -2
  31. package/dist/icons/IconMoon.svelte +2 -2
  32. package/dist/icons/IconPaint.svelte +19 -0
  33. package/dist/icons/{IconSunrise.svelte.d.ts → IconPaint.svelte.d.ts} +3 -3
  34. package/dist/icons/IconPencil.svelte +13 -0
  35. package/dist/icons/IconPencil.svelte.d.ts +26 -0
  36. package/dist/icons/IconRadio.svelte +14 -0
  37. package/dist/icons/IconRadio.svelte.d.ts +22 -0
  38. package/dist/icons/IconSave.svelte +1 -1
  39. package/dist/icons/IconSave.svelte.d.ts +3 -3
  40. package/dist/icons/IconSaveOff.svelte +1 -1
  41. package/dist/icons/IconSaveOff.svelte.d.ts +3 -3
  42. package/dist/icons/IconSearch.svelte +2 -2
  43. package/dist/icons/IconSun.svelte +3 -3
  44. package/dist/icons/{IconSunrise.svelte → IconSunFull.svelte} +5 -4
  45. package/dist/icons/IconSunFull.svelte.d.ts +26 -0
  46. package/dist/icons/IconVideo.svelte +2 -2
  47. package/dist/icons/IconWatch.svelte +2 -2
  48. package/dist/icons/IconWatchOff.svelte +2 -2
  49. package/dist/inputs/NeoCheckbox.svelte +316 -0
  50. package/dist/inputs/NeoCheckbox.svelte.d.ts +19 -0
  51. package/dist/inputs/NeoColorPicker.svelte +140 -0
  52. package/dist/inputs/NeoColorPicker.svelte.d.ts +19 -0
  53. package/dist/inputs/NeoDateTime.svelte +96 -0
  54. package/dist/inputs/NeoDateTime.svelte.d.ts +19 -0
  55. package/dist/inputs/NeoFilePicker.svelte +528 -0
  56. package/dist/inputs/NeoFilePicker.svelte.d.ts +19 -0
  57. package/dist/inputs/NeoFilePickerCard.svelte +314 -0
  58. package/dist/inputs/NeoFilePickerCard.svelte.d.ts +19 -0
  59. package/dist/inputs/NeoNumberStep.svelte +174 -0
  60. package/dist/inputs/NeoNumberStep.svelte.d.ts +19 -0
  61. package/dist/inputs/NeoPassword.svelte +86 -17
  62. package/dist/inputs/NeoPassword.svelte.d.ts +19 -16
  63. package/dist/inputs/NeoPin.svelte +589 -0
  64. package/dist/inputs/NeoPin.svelte.d.ts +19 -0
  65. package/dist/inputs/NeoRadio.svelte +254 -0
  66. package/dist/inputs/NeoRadio.svelte.d.ts +19 -0
  67. package/dist/inputs/NeoRange.svelte +518 -0
  68. package/dist/inputs/NeoRange.svelte.d.ts +18 -0
  69. package/dist/inputs/NeoSwitch.svelte +373 -0
  70. package/dist/inputs/NeoSwitch.svelte.d.ts +19 -0
  71. package/dist/inputs/NeoTextarea.svelte +335 -301
  72. package/dist/inputs/NeoTextarea.svelte.d.ts +5 -2
  73. package/dist/inputs/common/NeoAffix.svelte +166 -0
  74. package/dist/inputs/common/NeoAffix.svelte.d.ts +19 -0
  75. package/dist/inputs/common/NeoBaseInput.svelte +338 -0
  76. package/dist/inputs/common/NeoBaseInput.svelte.d.ts +30 -0
  77. package/dist/inputs/common/NeoInput.svelte +684 -0
  78. package/dist/inputs/{NeoInput.svelte.d.ts → common/NeoInput.svelte.d.ts} +2 -10
  79. package/dist/inputs/common/NeoInputValidation.svelte +45 -0
  80. package/dist/inputs/common/NeoInputValidation.svelte.d.ts +22 -0
  81. package/dist/inputs/common/NeoLabel.svelte +93 -0
  82. package/dist/inputs/common/NeoLabel.svelte.d.ts +19 -0
  83. package/dist/inputs/{NeoValidation.svelte → common/NeoValidation.svelte} +9 -16
  84. package/dist/inputs/common/NeoValidation.svelte.d.ts +22 -0
  85. package/dist/inputs/common/neo-affix.model.d.ts +32 -0
  86. package/dist/inputs/common/neo-input-validation.model.d.ts +20 -0
  87. package/dist/inputs/common/neo-input-validation.model.js +1 -0
  88. package/dist/inputs/{neo-input.model.d.ts → common/neo-input.model.d.ts} +148 -68
  89. package/dist/inputs/common/neo-label.model.d.ts +36 -0
  90. package/dist/inputs/common/neo-label.model.js +1 -0
  91. package/dist/inputs/common/neo-validation.model.d.ts +70 -0
  92. package/dist/inputs/common/neo-validation.model.js +1 -0
  93. package/dist/inputs/index.d.ts +2 -2
  94. package/dist/inputs/index.js +1 -1
  95. package/dist/inputs/neo-checkbox.model.d.ts +9 -0
  96. package/dist/inputs/neo-checkbox.model.js +1 -0
  97. package/dist/inputs/neo-color-picker.model.d.ts +17 -0
  98. package/dist/inputs/neo-color-picker.model.js +1 -0
  99. package/dist/inputs/neo-date-time.model.d.ts +8 -0
  100. package/dist/inputs/neo-date-time.model.js +1 -0
  101. package/dist/inputs/neo-file-picker.model.d.ts +138 -0
  102. package/dist/inputs/neo-file-picker.model.js +1 -0
  103. package/dist/inputs/neo-number-step.model.d.ts +24 -0
  104. package/dist/inputs/neo-number-step.model.js +1 -0
  105. package/dist/inputs/neo-password.model.d.ts +13 -0
  106. package/dist/inputs/neo-password.model.js +1 -0
  107. package/dist/inputs/neo-pin.model.d.ts +47 -0
  108. package/dist/inputs/neo-pin.model.js +1 -0
  109. package/dist/inputs/neo-radio.model.d.ts +3 -0
  110. package/dist/inputs/neo-radio.model.js +1 -0
  111. package/dist/inputs/neo-switch.model.d.ts +9 -0
  112. package/dist/inputs/neo-switch.model.js +1 -0
  113. package/dist/nav/NeoTab.svelte +29 -25
  114. package/dist/nav/NeoTabPanel.svelte +1 -1
  115. package/dist/nav/NeoTabs.svelte +51 -44
  116. package/dist/nav/NeoTabsCard.svelte +8 -10
  117. package/dist/nav/neo-tabs-context.svelte.d.ts +2 -11
  118. package/dist/nav/neo-tabs-context.svelte.js +1 -41
  119. package/dist/nav/neo-tabs.model.d.ts +6 -0
  120. package/dist/providers/NeoThemeProvider.svelte +417 -305
  121. package/dist/providers/NeoThemeSelector.svelte +10 -10
  122. package/dist/providers/neo-theme-provider-context.svelte.js +16 -15
  123. package/dist/providers/neo-theme-provider.model.d.ts +6 -6
  124. package/dist/providers/neo-theme-provider.model.js +17 -12
  125. package/dist/providers/neo-theme-selector.model.d.ts +2 -2
  126. package/dist/skeletons/NeoSkeletonMedia.svelte +4 -4
  127. package/dist/skeletons/NeoSkeletonText.svelte +12 -12
  128. package/dist/styles/common/colors.scss +85 -97
  129. package/dist/styles/common/filters.scss +17 -0
  130. package/dist/styles/common/shadows.scss +531 -293
  131. package/dist/styles/common/spacing.scss +7 -3
  132. package/dist/styles/common/typography.scss +1 -1
  133. package/dist/styles/common/utils.scss +1 -1
  134. package/dist/styles/common/z-index.scss +1 -1
  135. package/dist/styles/mixin.scss +80 -27
  136. package/dist/styles/reset.scss +8 -1
  137. package/dist/styles/theme.scss +39 -16
  138. package/dist/utils/html-element.utils.d.ts +3 -0
  139. package/dist/utils/regex.utils.d.ts +3 -0
  140. package/dist/utils/regex.utils.js +3 -0
  141. package/dist/utils/shadow.utils.d.ts +30 -3
  142. package/dist/utils/shadow.utils.js +41 -14
  143. package/dist/utils/transition.utils.d.ts +4 -0
  144. package/dist/utils/transition.utils.js +10 -1
  145. package/dist/utils/utils.svelte.d.ts +6 -0
  146. package/dist/utils/utils.svelte.js +13 -0
  147. package/package.json +13 -12
  148. package/dist/inputs/NeoInput.svelte +0 -750
  149. package/dist/inputs/NeoValidation.svelte.d.ts +0 -22
  150. package/dist/inputs/neo-validation.model.d.ts +0 -40
  151. /package/dist/inputs/{neo-validation.model.js → common/neo-affix.model.js} +0 -0
  152. /package/dist/inputs/{neo-input.model.js → common/neo-input.model.js} +0 -0
@@ -0,0 +1,684 @@
1
+ <script lang="ts">
2
+ import { wait } from '@dvcol/common-utils/common/promise';
3
+
4
+ import type { MouseEventHandler } from 'svelte/elements';
5
+
6
+ import type { NeoInputContext, NeoInputHTMLElement, NeoInputProps } from './neo-input.model.js';
7
+
8
+ import NeoAffix from './NeoAffix.svelte';
9
+ import NeoBaseInput from './NeoBaseInput.svelte';
10
+ import NeoInputValidation from './NeoInputValidation.svelte';
11
+ import NeoLabel from './NeoLabel.svelte';
12
+ import { NeoInputLabelPosition } from './neo-input.model.js';
13
+
14
+ import { toTransition, toTransitionProps } from '../../utils/action.utils.js';
15
+ import {
16
+ computeGlassFilter,
17
+ computeHoverShadowElevation,
18
+ computeShadowElevation,
19
+ getDefaultElevation,
20
+ getDefaultHoverElevation,
21
+ isShadowFlat,
22
+ } from '../../utils/shadow.utils.js';
23
+
24
+ /* eslint-disable prefer-const -- necessary for binding checked */
25
+ let {
26
+ // Snippets
27
+ label,
28
+ before,
29
+ after,
30
+ message,
31
+ error,
32
+ children,
33
+
34
+ // States
35
+ id = label ? `neo-input-${crypto.randomUUID()}` : undefined,
36
+ ref = $bindable(),
37
+ files = $bindable(), // type="file"
38
+ value = $bindable(),
39
+ group = $bindable(), // type="radio"
40
+ checked = $bindable(), // type="checkbox"
41
+ indeterminate = $bindable(), // type="checkbox"
42
+ valid = $bindable(),
43
+ dirty = $bindable(false),
44
+ touched = $bindable(false),
45
+ hovered = $bindable(false),
46
+ focused = $bindable(false),
47
+ disabled,
48
+ readonly,
49
+
50
+ loading,
51
+ clearable,
52
+
53
+ position = NeoInputLabelPosition.Inside,
54
+
55
+ // Styles
56
+ borderless,
57
+ pressed,
58
+ rounded,
59
+ glass,
60
+ start,
61
+ floating = true,
62
+ skeleton,
63
+ validation,
64
+ elevation = getDefaultElevation(pressed),
65
+ hover = getDefaultHoverElevation(pressed),
66
+
67
+ // Transition
68
+ in: inAction,
69
+ out: outAction,
70
+ transition: transitionAction,
71
+
72
+ // Other props
73
+ labelRef = $bindable(),
74
+ labelProps,
75
+ afterRef = $bindable(),
76
+ afterProps,
77
+ afterTag = afterProps?.onclick ? 'button' : 'span',
78
+ beforeRef = $bindable(),
79
+ beforeProps,
80
+ beforeTag = beforeProps?.onclick ? 'button' : 'span',
81
+ containerProps,
82
+ containerTag = 'div',
83
+ wrapperProps,
84
+ wrapperTag = 'div',
85
+ messageProps,
86
+ messageTag = 'div',
87
+ ...rest
88
+ }: NeoInputProps = $props();
89
+ /* eslint-enable prefer-const */
90
+
91
+ const getValue = () => {
92
+ if (rest?.type === 'file') return files;
93
+ if (rest?.type === 'checkbox' || rest?.type === 'radio') return checked;
94
+ return value;
95
+ };
96
+
97
+ let initial = $state(getValue());
98
+ let validationMessage = $state<string>(ref?.validationMessage ?? '');
99
+
100
+ const filter = $derived(computeGlassFilter(elevation, glass));
101
+ const boxShadow = $derived(computeShadowElevation(elevation, { glass, pressed }));
102
+ const hoverShadow = $derived(computeHoverShadowElevation(elevation, hover, { glass, pressed }) ?? boxShadow);
103
+
104
+ const hoverFlat = $derived(isShadowFlat(boxShadow) && !isShadowFlat(hoverShadow));
105
+ const flatHover = $derived(isShadowFlat(hoverShadow) && !isShadowFlat(boxShadow));
106
+
107
+ const onMouseEnter: MouseEventHandler<HTMLDivElement> = e => {
108
+ hovered = true;
109
+ containerProps?.onmouseenter?.(e);
110
+ };
111
+
112
+ const onMouseLeave: MouseEventHandler<HTMLDivElement> = e => {
113
+ hovered = false;
114
+ containerProps?.onmouseleave?.(e);
115
+ };
116
+
117
+ const typedValue = $derived(getValue());
118
+ const hasValue = $derived.by(() => {
119
+ if (rest?.type === 'file') return !!files?.length;
120
+ if (rest?.type === 'checkbox' || rest?.type === 'radio') return checked !== undefined;
121
+ if (typeof value === 'string') return !!value.length;
122
+ return value !== undefined && value !== null;
123
+ });
124
+
125
+ const affix = $derived(clearable || loading !== undefined || validation);
126
+ const close = $derived(clearable && (focused || hovered) && hasValue && !disabled && !readonly);
127
+ const isFloating = $derived(floating && !focused && !hasValue && !disabled && !readonly);
128
+ const inside = $derived(position === NeoInputLabelPosition.Inside && label);
129
+
130
+ const onClear = () => {
131
+ if (disabled || readonly) return;
132
+ ref?.clear?.();
133
+ };
134
+ const onFocus = () => {
135
+ if (focused || disabled || readonly) return;
136
+ ref?.focus();
137
+ };
138
+
139
+ let first = $state(true);
140
+ // Skip enter transition on first render for floating label
141
+ const waitForTick = async () => {
142
+ if (!first) return;
143
+ await wait();
144
+ first = false;
145
+ };
146
+
147
+ let affixRef = $state<HTMLElement>();
148
+ let affixWidth = $state<string>();
149
+ let afterWidth = $state<string>();
150
+ let beforeWidth = $state<string>();
151
+ let labelWidth = $state<string>();
152
+ let labelHeight = $state<string>();
153
+
154
+ const updateRefs = () => {
155
+ labelHeight = `${labelRef?.clientHeight ?? 0}px`;
156
+ labelWidth = `${labelRef?.clientWidth ?? 0}px`;
157
+ beforeWidth = `${beforeRef?.clientWidth ?? 0}px`;
158
+ afterWidth = `${afterRef?.clientWidth ?? 0}px`;
159
+ affixWidth = `${affixRef?.clientWidth ?? 0}px`;
160
+ };
161
+
162
+ $effect(() => {
163
+ if (first) waitForTick();
164
+ updateRefs();
165
+ });
166
+
167
+ let visible = $state(false);
168
+ let messageId = $state(`neo-textarea-message-${crypto.randomUUID()}`);
169
+
170
+ const context = $derived<NeoInputContext<NeoInputHTMLElement>>({
171
+ // Ref
172
+ ref,
173
+
174
+ // Methods
175
+ mark: ref?.mark,
176
+ clear: ref?.clear,
177
+ change: ref?.change,
178
+ validate: ref?.validate,
179
+
180
+ // State
181
+ initial,
182
+ value: typedValue,
183
+ touched,
184
+ dirty,
185
+ valid,
186
+ readonly,
187
+ disabled,
188
+
189
+ // Styles
190
+ elevation,
191
+ hover,
192
+ pressed,
193
+ borderless,
194
+ rounded,
195
+ glass,
196
+ start,
197
+ skeleton,
198
+ });
199
+
200
+ const inFn = $derived(toTransition(inAction ?? transitionAction));
201
+ const inProps = $derived(toTransitionProps(inAction ?? transitionAction));
202
+ const outFn = $derived(toTransition(outAction ?? transitionAction));
203
+ const outProps = $derived(toTransitionProps(outAction ?? transitionAction));
204
+ </script>
205
+
206
+ {#snippet prefix()}
207
+ {#if before}
208
+ <svelte:element
209
+ this={beforeTag}
210
+ bind:this={beforeRef}
211
+ class:neo-input-before={true}
212
+ class:neo-inside={inside}
213
+ class:neo-pressed={pressed}
214
+ class:neo-inset={elevation < 0}
215
+ class:neo-deep={elevation < -3}
216
+ {disabled}
217
+ {readonly}
218
+ {...beforeProps}
219
+ >
220
+ {@render before(context)}
221
+ </svelte:element>
222
+ {/if}
223
+ {/snippet}
224
+
225
+ {#snippet suffix()}
226
+ <!-- Affix (loafing, clear, placeholder) -->
227
+ {#if affix}
228
+ <NeoAffix
229
+ bind:ref={affixRef}
230
+ class={after ? 'neo-after' : undefined}
231
+ {loading}
232
+ {close}
233
+ {disabled}
234
+ {skeleton}
235
+ valid={validation ? valid : undefined}
236
+ closeProps={{ onclick: onClear }}
237
+ onclick={onFocus}
238
+ />
239
+ {/if}
240
+ <!-- Suffix -->
241
+ {#if after}
242
+ <svelte:element
243
+ this={afterTag}
244
+ bind:this={afterRef}
245
+ class:neo-input-after={true}
246
+ class:neo-inside={inside}
247
+ class:neo-pressed={pressed}
248
+ class:neo-inset={elevation < 0}
249
+ class:neo-deep={elevation < -3}
250
+ {disabled}
251
+ {readonly}
252
+ {...afterProps}
253
+ >
254
+ {@render after(context)}
255
+ </svelte:element>
256
+ {/if}
257
+ {/snippet}
258
+
259
+ {#snippet input()}
260
+ <NeoBaseInput
261
+ aria-invalid={valid === undefined ? undefined : !valid}
262
+ aria-describedby={visible ? messageId : undefined}
263
+ bind:ref
264
+ bind:files
265
+ bind:initial
266
+ bind:value
267
+ bind:group
268
+ bind:checked
269
+ bind:indeterminate
270
+ bind:valid
271
+ bind:dirty
272
+ bind:touched
273
+ bind:focused
274
+ bind:validationMessage
275
+ {id}
276
+ {disabled}
277
+ {readonly}
278
+ after={!!(after || affix)}
279
+ before={!!before}
280
+ {...rest}
281
+ />
282
+ {/snippet}
283
+
284
+ {#snippet labelGroup()}
285
+ {#if typeof label === 'string'}
286
+ {label}
287
+ {:else if label}
288
+ {@render label(context)}
289
+ {/if}
290
+ {/snippet}
291
+
292
+ {#snippet inputGroup()}
293
+ <svelte:element
294
+ this={containerTag}
295
+ role="none"
296
+ data-position={position}
297
+ data-touched={touched}
298
+ data-dirty={dirty}
299
+ data-valid={valid}
300
+ class:neo-input-group={true}
301
+ class:neo-readonly={readonly}
302
+ class:neo-pressed={pressed}
303
+ class:neo-borderless={borderless}
304
+ class:neo-rounded={rounded}
305
+ class:neo-glass={glass}
306
+ class:neo-hover={hover}
307
+ class:neo-hovered={hovered}
308
+ class:neo-floating={floating}
309
+ class:neo-start={start}
310
+ class:neo-skeleton={skeleton}
311
+ class:neo-validation={validation}
312
+ class:neo-disabled={disabled}
313
+ class:neo-raised={elevation > 3 || elevation + hover > 3}
314
+ class:neo-inset={elevation < -3 || elevation + hover < -3}
315
+ class:neo-flat={!elevation}
316
+ class:neo-hover-flat={hoverFlat}
317
+ class:neo-flat-hover={flatHover}
318
+ style:--neo-input-glass-blur={filter}
319
+ style:--neo-input-box-shadow={boxShadow}
320
+ style:--neo-input-hover-shadow={hoverShadow}
321
+ style:--neo-input-label-height={labelHeight}
322
+ style:--neo-input-label-width={labelWidth}
323
+ style:--neo-input-before-width={beforeWidth}
324
+ style:--neo-input-after-width={afterWidth}
325
+ style:--neo-input-affix-width={affixWidth}
326
+ out:outFn={outProps}
327
+ in:inFn={inProps}
328
+ {...containerProps}
329
+ onmouseenter={onMouseEnter}
330
+ onmouseleave={onMouseLeave}
331
+ >
332
+ {@render prefix()}
333
+ {#if label}
334
+ <NeoLabel
335
+ for={id}
336
+ bind:ref={labelRef}
337
+ containerProps={{
338
+ class: [
339
+ first ? 'neo-first' : undefined,
340
+ before ? 'neo-before' : undefined,
341
+ after ? 'neo-after' : undefined,
342
+ rounded ? 'neo-rounded' : undefined,
343
+ isFloating ? 'neo-floating' : undefined,
344
+ ]
345
+ .filter(Boolean)
346
+ .join(' '),
347
+ onclick: onFocus,
348
+ }}
349
+ label={labelGroup}
350
+ required={rest.required}
351
+ {disabled}
352
+ {...labelProps}
353
+ >
354
+ {@render input()}
355
+ </NeoLabel>
356
+ {:else}
357
+ {@render input()}
358
+ {/if}
359
+ {@render suffix()}
360
+ {@render children?.(context)}
361
+ </svelte:element>
362
+ {/snippet}
363
+
364
+ <NeoInputValidation
365
+ tag={wrapperTag}
366
+ bind:visible
367
+ bind:messageId
368
+ {valid}
369
+ {validation}
370
+ {validationMessage}
371
+ {error}
372
+ {rounded}
373
+ {context}
374
+ {message}
375
+ {messageTag}
376
+ {messageProps}
377
+ in={inAction}
378
+ out={outAction}
379
+ transition={transitionAction}
380
+ {...wrapperProps}
381
+ >
382
+ {@render inputGroup()}
383
+ </NeoInputValidation>
384
+
385
+ <style>.neo-input-group,
386
+ .neo-input-before,
387
+ .neo-input-after {
388
+ display: inline-flex;
389
+ box-sizing: border-box;
390
+ min-width: min-content;
391
+ font: inherit;
392
+ text-decoration: none;
393
+ outline: none;
394
+ transition: opacity 0.3s ease, color 0.3s ease, margin 0.3s ease, padding 0.3s ease, background-color 0.3s ease, backdrop-filter 0.3s ease, border-color 0.3s ease, border-radius 0.3s ease, box-shadow 0.3s ease-out;
395
+ }
396
+
397
+ .neo-input-before {
398
+ color: var(--neo-input-before-color, inherit);
399
+ background-color: var(--neo-input-before-bg-color, transparent);
400
+ border: none;
401
+ border-right: var(--neo-border-width, 1px) var(--neo-input-before-border-color, transparent) solid;
402
+ border-radius: var(--neo-input-border-radius, var(--neo-border-radius)) 0 0 var(--neo-input-border-radius, var(--neo-border-radius));
403
+ }
404
+ .neo-input-after {
405
+ color: var(--neo-input-after-color, inherit);
406
+ background-color: var(--neo-input-after-bg-color, transparent);
407
+ border: none;
408
+ border-left: var(--neo-border-width, 1px) var(--neo-input-after-border-color, transparent) solid;
409
+ border-radius: 0 var(--neo-input-border-radius, var(--neo-border-radius)) var(--neo-input-border-radius, var(--neo-border-radius)) 0;
410
+ }
411
+ .neo-input-before, .neo-input-after {
412
+ align-items: center;
413
+ min-width: max-content;
414
+ padding: 0.75rem;
415
+ }
416
+ .neo-input-before:is(button, a), .neo-input-after:is(button, a) {
417
+ cursor: pointer;
418
+ }
419
+ .neo-input-before:is(button, a):focus-visible, .neo-input-after:is(button, a):focus-visible {
420
+ color: var(--neo-input-focus-color, var(--neo-text-color-focused));
421
+ }
422
+ .neo-input-before:is(button, a):hover, .neo-input-after:is(button, a):hover {
423
+ color: var(--neo-input-hover-color, var(--neo-text-color-hover));
424
+ }
425
+ .neo-input-before:is(button, a):active, .neo-input-after:is(button, a):active {
426
+ color: var(--neo-input-active-color, var(--neo-text-color-hover-active));
427
+ scale: 0.9;
428
+ }
429
+ .neo-input-before:is(button, a):disabled, .neo-input-after:is(button, a):disabled {
430
+ color: var(--neo-text-color-disabled);
431
+ cursor: not-allowed;
432
+ scale: 1;
433
+ }
434
+ .neo-input-before:has(:global(.neo-button:only-child)):not(.neo-inside), .neo-input-after:has(:global(.neo-button:only-child)):not(.neo-inside) {
435
+ padding: 0 0.125rem;
436
+ }
437
+ .neo-input-before :global(.neo-button), .neo-input-after :global(.neo-button) {
438
+ --neo-btn-padding: 0.5rem 0.75rem;
439
+ --neo-btn-margin: auto;
440
+ --neo-btn-min-width: 2.375rem;
441
+ --neo-btn-box-shadow-active-flat-toggle: var(--neo-box-shadow-inset-2);
442
+ --neo-btn-bg-color: transparent;
443
+ --neo-btn-backdrop-filter: none;
444
+ }
445
+ .neo-input-before.neo-inset :global(.neo-button), .neo-input-after.neo-inset :global(.neo-button) {
446
+ --neo-btn-margin: auto 0;
447
+ --neo-btn-padding-empty: 0.375rem;
448
+ }
449
+ .neo-input-before.neo-inset.neo-pressed :global(.neo-button), .neo-input-after.neo-inset.neo-pressed :global(.neo-button) {
450
+ --neo-input-icon-scale: 1;
451
+ }
452
+ .neo-input-before.neo-deep :global(.neo-button), .neo-input-after.neo-deep :global(.neo-button) {
453
+ --neo-btn-margin: auto 0.25rem;
454
+ }
455
+ .neo-input-group {
456
+ position: relative;
457
+ margin: var(--neo-shadow-margin, 0.625rem);
458
+ padding: 0 0.1875rem;
459
+ color: var(--neo-input-text-color, inherit);
460
+ background-color: var(--neo-input-bg-color, inherit);
461
+ border: var(--neo-input-border-width, var(--neo-border-width, 1px)) var(--neo-input-border-color, transparent) solid;
462
+ border-radius: var(--neo-input-border-radius, var(--neo-border-radius));
463
+ box-shadow: var(--neo-input-box-shadow, var(--neo-box-shadow-flat));
464
+ cursor: var(--neo-input-cursor, text);
465
+ }
466
+ .neo-input-group.neo-readonly {
467
+ cursor: inherit;
468
+ }
469
+ .neo-input-group.neo-borderless {
470
+ border-color: transparent !important;
471
+ }
472
+ .neo-input-group.neo-inset.neo-pressed, .neo-input-group.neo-raised {
473
+ margin: var(--neo-shadow-margin-lg, 1.125rem);
474
+ }
475
+ .neo-input-group.neo-inset {
476
+ padding: 0.25rem;
477
+ }
478
+ .neo-input-group.neo-hover.neo-flat-hover.neo-hovered, .neo-input-group.neo-hover.neo-flat-hover:hover, .neo-input-group.neo-hover.neo-flat-hover:focus-within, .neo-input-group.neo-flat:not(.neo-borderless, .neo-hover-flat:hover, .neo-hover-flat.neo-hovered, .neo-hover-flat:focus-within) {
479
+ border-color: var(--neo-input-border-color, var(--neo-border-color));
480
+ }
481
+ .neo-input-group:focus-within, .neo-input-group.neo-hover:hover, .neo-input-group.neo-hover.neo-hovered {
482
+ box-shadow: var(--neo-input-hover-shadow, var(--neo-box-shadow-flat));
483
+ }
484
+ .neo-input-group :global(.neo-label-container) {
485
+ width: 100%;
486
+ transition: opacity 0.3s ease, padding 0.3s ease, margin 0.3s ease;
487
+ }
488
+ .neo-input-group :global(.neo-label-container) :global(.neo-label) {
489
+ --neo-label-padding: 0 0.75rem;
490
+ --neo-label-margin: 0;
491
+ --neo-label-color: var(--neo-input-label-color, inherit);
492
+ min-height: var(--neo-input-label-height);
493
+ transition: opacity 0.3s ease, padding 0.3s ease, color 0.3s ease, font-size 0.3s ease, line-height 0.3s ease, top 0.3s ease, left 0.3s ease, right 0.3s ease, translate 0.3s ease;
494
+ }
495
+ .neo-input-group :global(.neo-label-container.neo-rounded:not(.neo-before)) {
496
+ padding-left: 0.25rem;
497
+ }
498
+ .neo-input-group :global(.neo-label-container.neo-first .neo-label) {
499
+ transition: none;
500
+ }
501
+ .neo-input-group :global(.neo-label-container.neo-before .neo-label) {
502
+ padding-left: 0;
503
+ }
504
+ .neo-input-group :global(.neo-label-container.neo-after .neo-label) {
505
+ padding-right: 0;
506
+ }
507
+ .neo-input-group :global(.neo-label-container.neo-floating) :global(.neo-label) {
508
+ --neo-label-color: var(--neo-input-floating-label-color, var(--neo-text-color-disabled));
509
+ --neo-label-required-color: var(--neo-input-required-color, var(--neo-color-error-50));
510
+ }
511
+ .neo-input-group :global(.neo-label-container.neo-floating) :global(.neo-input) {
512
+ color: var(--neo-input-floating-text-color, transparent);
513
+ }
514
+ .neo-input-group :global(.neo-label-container.neo-floating) :global(::placeholder) {
515
+ opacity: 0;
516
+ }
517
+ .neo-input-group.neo-disabled {
518
+ box-shadow: var(--neo-box-shadow-flat) !important;
519
+ opacity: var(--neo-input-opacity-disabled, var(--neo-opacity-disabled));
520
+ }
521
+ .neo-input-group.neo-disabled:not(.neo-borderless) {
522
+ border-color: var(--neo-input-border-color-disabled, var(--neo-border-color-disabled)) !important;
523
+ }
524
+ .neo-input-group :global(.neo-affix-container.neo-after) {
525
+ min-width: 1.75rem;
526
+ padding-right: 0;
527
+ padding-left: 0.5rem;
528
+ }
529
+ .neo-input-group.neo-rounded {
530
+ border-radius: var(--neo-input-border-radius-lg, var(--neo-border-radius-lg));
531
+ }
532
+ .neo-input-group.neo-rounded :global(.neo-affix-container:not(.neo-after)) {
533
+ margin-right: 0.25rem;
534
+ }
535
+ .neo-input-group.neo-rounded :global(.neo-label-container .neo-label) {
536
+ padding: 0 1rem;
537
+ }
538
+ .neo-input-group.neo-rounded :global(.neo-label-container.neo-before .neo-label) {
539
+ padding-left: 0;
540
+ }
541
+ .neo-input-group.neo-rounded :global(.neo-label-container.neo-after .neo-label) {
542
+ padding-right: 0;
543
+ }
544
+ .neo-input-group[data-position=left] {
545
+ --neo-input-margin-left: calc(var(--neo-shadow-margin, 0.625rem) * 2 + var(--neo-input-label-width, auto));
546
+ margin-left: var(--neo-input-margin-left);
547
+ }
548
+ .neo-input-group[data-position=left] :global(.neo-label-container .neo-label) {
549
+ position: absolute;
550
+ top: calc(50% - var(--neo-input-label-height) / 2);
551
+ left: calc(0% - var(--neo-input-margin-left));
552
+ }
553
+ .neo-input-group[data-position=left] :global(.neo-label-container.neo-before .neo-label) {
554
+ left: calc(0% - var(--neo-input-margin-left));
555
+ }
556
+ .neo-input-group[data-position=left] :global(.neo-label-container.neo-floating .neo-label) {
557
+ left: calc(0.25rem + var(--neo-input-before-width));
558
+ }
559
+ .neo-input-group[data-position=right] {
560
+ --neo-input-margin-right: calc(var(--neo-shadow-margin, 0.625rem) * 2 + var(--neo-input-label-width, auto));
561
+ margin-right: var(--neo-input-margin-right);
562
+ }
563
+ .neo-input-group[data-position=right] :global(.neo-label-container .neo-label) {
564
+ position: absolute;
565
+ top: calc(50% - var(--neo-input-label-height) / 2);
566
+ right: calc(0% - var(--neo-input-margin-right));
567
+ }
568
+ .neo-input-group[data-position=right] :global(.neo-label-container.neo-before .neo-label) {
569
+ right: calc(0% - var(--neo-input-margin-right));
570
+ }
571
+ .neo-input-group[data-position=right] :global(.neo-label-container.neo-floating .neo-label) {
572
+ right: calc(100% - var(--neo-input-label-width) - 0.25rem - var(--neo-input-before-width));
573
+ }
574
+ .neo-input-group[data-position=right] :global(.neo-label-container.neo-floating.neo-rounded:not(.neo-before) .neo-label) {
575
+ right: calc(100% - var(--neo-input-label-width) - 0.75rem - var(--neo-input-before-width));
576
+ }
577
+ .neo-input-group[data-position=inside] :global(.neo-label-container .neo-input) {
578
+ padding: 0 1rem 0.5rem;
579
+ }
580
+ .neo-input-group[data-position=inside] :global(.neo-label-container.neo-before .neo-input) {
581
+ padding-left: 0;
582
+ }
583
+ .neo-input-group[data-position=inside] :global(.neo-label-container.neo-after .neo-input) {
584
+ padding-right: 0;
585
+ }
586
+ .neo-input-group[data-position=inside] :global(.neo-label-container .neo-label) {
587
+ padding: 0.75rem 1rem 0.1875rem;
588
+ line-height: var(--neo-line-height-xs, 1rem);
589
+ }
590
+ .neo-input-group[data-position=inside] :global(.neo-label-container.neo-before .neo-label) {
591
+ padding-left: 0;
592
+ }
593
+ .neo-input-group[data-position=inside] :global(.neo-label-container.neo-floating .neo-label) {
594
+ translate: 0 calc(50% - 0.28125rem);
595
+ }
596
+ .neo-input-group[data-position=inside] :global(.neo-label-container:not(.neo-floating) .neo-label) {
597
+ font-size: var(--neo-font-size-sm, 0.875rem);
598
+ }
599
+ .neo-input-group[data-position=top][data-position=top] {
600
+ --neo-input-margin-top: calc(var(--neo-shadow-margin, 0.625rem) + var(--neo-input-label-height, var(--neo-line-height)));
601
+ margin-top: var(--neo-input-margin-top);
602
+ }
603
+ .neo-input-group[data-position=top][data-position=top] :global(.neo-label-container .neo-label) {
604
+ position: absolute;
605
+ top: calc(0% - var(--neo-input-margin-top));
606
+ }
607
+ .neo-input-group[data-position=top][data-position=top]:not(.neo-floating) :global(.neo-label-container .neo-label) {
608
+ left: 0;
609
+ padding: var(--neo-label-padding, 0 1rem);
610
+ }
611
+ .neo-input-group[data-position=top] :global(.neo-label-container.neo-floating .neo-label), .neo-input-group[data-position=left] :global(.neo-label-container.neo-floating .neo-label), .neo-input-group[data-position=right] :global(.neo-label-container.neo-floating .neo-label) {
612
+ top: calc(50% - var(--neo-input-label-height) / 2);
613
+ }
614
+ .neo-input-group[data-position=top].neo-floating, .neo-input-group[data-position=left].neo-floating, .neo-input-group[data-position=right].neo-floating {
615
+ --neo-input-min-width: var(--neo-input-label-width);
616
+ --neo-input-min-height: var(--neo-input-label-height);
617
+ --neo-label-max-width: calc(100% - var(--neo-input-after-width) - var(--neo-input-before-width) - var(--neo-input-affix-width));
618
+ }
619
+ .neo-input-group.neo-glass {
620
+ --neo-skeleton-color: var(--neo-glass-skeleton-color);
621
+ --neo-border-color: var(--neo-glass-border-color);
622
+ background-color: var(--neo-input-bg-color, var(--neo-glass-background-color));
623
+ border-color: var(--neo-input-border-color, var(--neo-glass-top-border-color) var(--neo-glass-right-border-color) var(--neo-glass-bottom-border-color) var(--neo-glass-left-border-color));
624
+ backdrop-filter: var(--neo-input-glass-blur, var(--neo-blur-3) var(--neo-saturate-2));
625
+ }
626
+ .neo-input-group.neo-validation[data-valid=false] {
627
+ --neo-input-label-color: var(--neo-input-label-color-error, var(--neo-color-error));
628
+ --neo-input-floating-label-color: var(--neo-input-floating-label-color-error, var(--neo-color-error-50));
629
+ --neo-label-disabled-color: var(--neo-input-floating-label-color-error, var(--neo-color-error-50));
630
+ }
631
+ .neo-input-group.neo-validation[data-valid=true] {
632
+ --neo-input-label-color: var(--neo-input-label-color-success, var(--neo-color-success));
633
+ --neo-input-floating-label-color: var(--neo-input-floating-label-color-success, var(--neo-color-success-50));
634
+ --neo-label-disabled-color: var(--neo-input-floating-label-color-success, var(--neo-color-success-50));
635
+ }
636
+ @starting-style {
637
+ .neo-input-group.neo-start {
638
+ box-shadow: var(--neo-box-shadow-flat);
639
+ }
640
+ .neo-input-group.neo-start:not(.neo-borderless) {
641
+ border-color: var(--neo-input-border-color, var(--neo-border-color));
642
+ }
643
+ }
644
+ .neo-input-group.neo-skeleton {
645
+ box-shadow: var(--neo-box-shadow-flat);
646
+ pointer-events: none;
647
+ --neo-skeleton-color-start: var(--neo-skeleton-color);
648
+ --neo-skeleton-color-end: oklch(from var(--neo-skeleton-color) calc(l - var(--neo-skeleton-color-step, 0.05)) c h);
649
+ color: var(--neo-skeleton-color-start);
650
+ background-color: var(--neo-skeleton-color-start);
651
+ border-color: var(--neo-skeleton-color-start);
652
+ transition: background-color 1s ease, color 1s ease, border-color 1s ease;
653
+ animation: skeleton 3s var(--neo-transition-skeleton) infinite;
654
+ animation-delay: 1s;
655
+ }
656
+ .neo-input-group.neo-skeleton::before, .neo-input-group.neo-skeleton::after,
657
+ .neo-input-group.neo-skeleton :global(> *::before),
658
+ .neo-input-group.neo-skeleton :global(> *::after),
659
+ .neo-input-group.neo-skeleton :global(> *) {
660
+ visibility: hidden;
661
+ pointer-events: none;
662
+ }
663
+ @keyframes skeleton {
664
+ 0% {
665
+ color: var(--neo-skeleton-color-start);
666
+ background-color: var(--neo-skeleton-color-start);
667
+ border-color: var(--neo-skeleton-color-start);
668
+ }
669
+ 40% {
670
+ color: var(--neo-skeleton-color-end);
671
+ background-color: var(--neo-skeleton-color-end);
672
+ border-color: var(--neo-skeleton-color-end);
673
+ }
674
+ 80% {
675
+ color: var(--neo-skeleton-color-start);
676
+ background-color: var(--neo-skeleton-color-start);
677
+ border-color: var(--neo-skeleton-color-start);
678
+ }
679
+ 100% {
680
+ color: var(--neo-skeleton-color-start);
681
+ background-color: var(--neo-skeleton-color-start);
682
+ border-color: var(--neo-skeleton-color-start);
683
+ }
684
+ }</style>
@@ -1,4 +1,4 @@
1
- import { type NeoInputMethods, type NeoInputProps } from './neo-input.model.js';
1
+ import type { NeoInputProps } from './neo-input.model.js';
2
2
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
3
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
4
  $$bindings?: Bindings;
@@ -14,14 +14,6 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
14
14
  }
15
15
  declare const NeoInput: $$__sveltets_2_IsomorphicComponent<NeoInputProps, {
16
16
  [evt: string]: CustomEvent<any>;
17
- }, {}, {
18
- /**
19
- * Change the state of the input
20
- * @param state
21
- */ mark: NeoInputMethods<HTMLInputElement>["mark"];
22
- /**
23
- * Clear the input state
24
- */ clear: NeoInputMethods<HTMLInputElement>["clear"];
25
- }, "value" | "ref" | "valid" | "dirty" | "touched" | "labelRef">;
17
+ }, {}, {}, "value" | "group" | "ref" | "checked" | "hovered" | "focused" | "files" | "indeterminate" | "touched" | "dirty" | "valid" | "labelRef" | "afterRef" | "beforeRef">;
26
18
  type NeoInput = InstanceType<typeof NeoInput>;
27
19
  export default NeoInput;