Tracking de l'application VApp (IHM du jeu)

This commit is contained in:
2025-05-11 18:04:12 +02:00
commit 89e9db9b62
17763 changed files with 3718499 additions and 0 deletions

View File

@ -0,0 +1,550 @@
/* region INPUT */
.v-field {
display: grid;
grid-template-areas: "prepend-inner field clear append-inner";
grid-template-columns: min-content minmax(0, 1fr) min-content min-content;
font-size: 16px;
letter-spacing: 0.009375em;
max-width: 100%;
border-radius: 4px;
contain: layout;
flex: 1 0;
grid-area: control;
position: relative;
--v-field-padding-start: 16px;
--v-field-padding-end: 16px;
--v-field-padding-top: 8px;
--v-field-padding-bottom: 4px;
--v-field-input-padding-top: calc(var(--v-field-padding-top, 8px) + var(--v-input-padding-top, 0));
--v-field-input-padding-bottom: var(--v-field-padding-bottom, 4px);
}
.v-field--disabled {
opacity: var(--v-disabled-opacity);
pointer-events: none;
}
.v-field .v-chip {
--v-chip-height: 24px;
}
/* endregion */
/* region MODIFIERS */
.v-field--prepended {
padding-inline-start: 12px;
}
.v-field--appended {
padding-inline-end: 12px;
}
.v-field--variant-solo, .v-field--variant-solo-filled {
background: rgb(var(--v-theme-surface));
border-color: transparent;
color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity));
box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12));
}
.v-field--variant-solo-inverted {
background: rgb(var(--v-theme-surface));
border-color: transparent;
color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity));
box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12));
}
.v-field--variant-solo-inverted.v-field--focused {
color: rgb(var(--v-theme-on-surface-variant));
}
.v-field--variant-filled {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.v-input--density-default .v-field--variant-solo, .v-input--density-default .v-field--variant-solo-inverted, .v-input--density-default .v-field--variant-solo-filled, .v-input--density-default .v-field--variant-filled {
--v-input-control-height: 56px;
--v-field-padding-bottom: 4px;
}
.v-input--density-comfortable .v-field--variant-solo, .v-input--density-comfortable .v-field--variant-solo-inverted, .v-input--density-comfortable .v-field--variant-solo-filled, .v-input--density-comfortable .v-field--variant-filled {
--v-input-control-height: 48px;
--v-field-padding-bottom: 0px;
}
.v-input--density-compact .v-field--variant-solo, .v-input--density-compact .v-field--variant-solo-inverted, .v-input--density-compact .v-field--variant-solo-filled, .v-input--density-compact .v-field--variant-filled {
--v-input-control-height: 40px;
--v-field-padding-bottom: 0px;
}
.v-field--variant-outlined, .v-field--single-line, .v-field--no-label {
--v-field-padding-top: 0px;
}
.v-input--density-default .v-field--variant-outlined, .v-input--density-default .v-field--single-line, .v-input--density-default .v-field--no-label {
--v-field-padding-bottom: 16px;
}
.v-input--density-comfortable .v-field--variant-outlined, .v-input--density-comfortable .v-field--single-line, .v-input--density-comfortable .v-field--no-label {
--v-field-padding-bottom: 12px;
}
.v-input--density-compact .v-field--variant-outlined, .v-input--density-compact .v-field--single-line, .v-input--density-compact .v-field--no-label {
--v-field-padding-bottom: 8px;
}
.v-field--variant-plain, .v-field--variant-underlined {
border-radius: 0;
padding: 0;
}
.v-field--variant-plain.v-field, .v-field--variant-underlined.v-field {
--v-field-padding-start: 0px;
--v-field-padding-end: 0px;
}
.v-input--density-default .v-field--variant-plain, .v-input--density-default .v-field--variant-underlined {
--v-input-control-height: 48px;
--v-field-padding-top: 4px;
--v-field-padding-bottom: 4px;
}
.v-input--density-comfortable .v-field--variant-plain, .v-input--density-comfortable .v-field--variant-underlined {
--v-input-control-height: 40px;
--v-field-padding-top: 2px;
--v-field-padding-bottom: 0px;
}
.v-input--density-compact .v-field--variant-plain, .v-input--density-compact .v-field--variant-underlined {
--v-input-control-height: 32px;
--v-field-padding-top: 0px;
--v-field-padding-bottom: 0px;
}
.v-field--flat {
box-shadow: none;
}
.v-field--rounded {
border-radius: 9999px;
}
.v-field.v-field--prepended {
--v-field-padding-start: 6px;
}
.v-field.v-field--appended {
--v-field-padding-end: 6px;
}
/* endregion */
/* region ELEMENTS */
.v-field__input {
align-items: center;
color: inherit;
column-gap: 2px;
display: flex;
flex-wrap: wrap;
letter-spacing: 0.009375em;
opacity: var(--v-high-emphasis-opacity);
min-height: max(var(--v-input-control-height, 56px), 1.5rem + var(--v-field-input-padding-top) + var(--v-field-input-padding-bottom));
min-width: 0;
padding-inline: var(--v-field-padding-start) var(--v-field-padding-end);
padding-top: var(--v-field-input-padding-top);
padding-bottom: var(--v-field-input-padding-bottom);
position: relative;
width: 100%;
}
.v-input--density-default .v-field__input {
row-gap: 8px;
}
.v-input--density-comfortable .v-field__input {
row-gap: 6px;
}
.v-input--density-compact .v-field__input {
row-gap: 4px;
}
.v-field__input input {
letter-spacing: inherit;
}
.v-field__input input::placeholder,
input.v-field__input::placeholder,
textarea.v-field__input::placeholder {
color: currentColor;
opacity: var(--v-disabled-opacity);
}
.v-field__input:focus, .v-field__input:active {
outline: none;
}
.v-field__input:invalid {
box-shadow: none;
}
.v-field__field {
flex: 1 0;
grid-area: field;
position: relative;
align-items: flex-start;
display: flex;
}
/* endregion */
/* region AFFIXES */
.v-field__prepend-inner {
grid-area: prepend-inner;
padding-inline-end: var(--v-field-padding-after);
}
.v-field__clearable {
grid-area: clear;
}
.v-field__append-inner {
grid-area: append-inner;
padding-inline-start: var(--v-field-padding-after);
}
.v-field__append-inner,
.v-field__clearable,
.v-field__prepend-inner {
display: flex;
align-items: flex-start;
padding-top: var(--v-input-padding-top, 8px);
}
.v-field--center-affix .v-field__append-inner,
.v-field--center-affix .v-field__clearable,
.v-field--center-affix .v-field__prepend-inner {
align-items: center;
padding-top: 0;
}
.v-field.v-field--variant-underlined .v-field__append-inner,
.v-field.v-field--variant-underlined .v-field__clearable,
.v-field.v-field--variant-underlined .v-field__prepend-inner,
.v-field.v-field--variant-plain .v-field__append-inner,
.v-field.v-field--variant-plain .v-field__clearable,
.v-field.v-field--variant-plain .v-field__prepend-inner {
align-items: flex-start;
padding-top: calc(var(--v-field-padding-top, 8px) + var(--v-input-padding-top, 0));
padding-bottom: var(--v-field-padding-bottom, 4px);
}
.v-field--focused .v-field__prepend-inner,
.v-field--focused .v-field__append-inner {
opacity: 1;
}
.v-field__prepend-inner > .v-icon,
.v-field__append-inner > .v-icon,
.v-field__clearable > .v-icon {
opacity: var(--v-medium-emphasis-opacity);
}
.v-field--disabled .v-field__prepend-inner > .v-icon, .v-field--error .v-field__prepend-inner > .v-icon,
.v-field--disabled .v-field__append-inner > .v-icon,
.v-field--error .v-field__append-inner > .v-icon,
.v-field--disabled .v-field__clearable > .v-icon,
.v-field--error .v-field__clearable > .v-icon {
opacity: 1;
}
.v-field--error:not(.v-field--disabled) .v-field__prepend-inner > .v-icon,
.v-field--error:not(.v-field--disabled) .v-field__append-inner > .v-icon,
.v-field--error:not(.v-field--disabled) .v-field__clearable > .v-icon {
color: rgb(var(--v-theme-error));
}
.v-field__clearable {
cursor: pointer;
opacity: 0;
overflow: hidden;
margin-inline: 4px;
transition: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
transition-property: opacity, transform, width;
}
.v-field--focused .v-field__clearable, .v-field--persistent-clear .v-field__clearable {
opacity: 1;
}
@media (hover: hover) {
.v-field:hover .v-field__clearable {
opacity: 1;
}
}
@media (hover: none) {
.v-field__clearable {
opacity: 1;
}
}
/* endregion */
/* region LABEL */
.v-label.v-field-label {
contain: layout paint;
display: block;
margin-inline-start: var(--v-field-padding-start);
margin-inline-end: var(--v-field-padding-end);
max-width: calc(100% - var(--v-field-padding-start) - var(--v-field-padding-end));
pointer-events: none;
position: absolute;
top: var(--v-input-padding-top);
transform-origin: left center;
transition: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
transition-property: opacity, transform;
z-index: 1;
}
.v-field--variant-underlined .v-label.v-field-label, .v-field--variant-plain .v-label.v-field-label {
top: calc(var(--v-input-padding-top) + var(--v-field-padding-top));
}
.v-field--center-affix .v-label.v-field-label {
top: 50%;
transform: translateY(-50%);
}
.v-field--active .v-label.v-field-label {
visibility: hidden;
}
.v-field--focused .v-label.v-field-label, .v-field--error .v-label.v-field-label {
opacity: 1;
}
.v-field--error:not(.v-field--disabled) .v-label.v-field-label {
color: rgb(var(--v-theme-error));
}
.v-label.v-field-label--floating {
--v-field-label-scale: 0.75em;
font-size: var(--v-field-label-scale);
visibility: hidden;
max-width: 100%;
}
.v-field--center-affix .v-label.v-field-label--floating {
transform: none;
}
.v-field.v-field--active .v-label.v-field-label--floating {
visibility: unset;
}
.v-input--density-default .v-field--variant-solo .v-label.v-field-label--floating, .v-input--density-default .v-field--variant-solo-inverted .v-label.v-field-label--floating, .v-input--density-default .v-field--variant-filled .v-label.v-field-label--floating, .v-input--density-default .v-field--variant-solo-filled .v-label.v-field-label--floating {
top: 7px;
}
.v-input--density-comfortable .v-field--variant-solo .v-label.v-field-label--floating, .v-input--density-comfortable .v-field--variant-solo-inverted .v-label.v-field-label--floating, .v-input--density-comfortable .v-field--variant-filled .v-label.v-field-label--floating, .v-input--density-comfortable .v-field--variant-solo-filled .v-label.v-field-label--floating {
top: 5px;
}
.v-input--density-compact .v-field--variant-solo .v-label.v-field-label--floating, .v-input--density-compact .v-field--variant-solo-inverted .v-label.v-field-label--floating, .v-input--density-compact .v-field--variant-filled .v-label.v-field-label--floating, .v-input--density-compact .v-field--variant-solo-filled .v-label.v-field-label--floating {
top: 3px;
}
.v-field--variant-plain .v-label.v-field-label--floating, .v-field--variant-underlined .v-label.v-field-label--floating {
transform: translateY(-16px);
margin: 0;
top: var(--v-input-padding-top);
}
.v-field--variant-outlined .v-label.v-field-label--floating {
transform: translateY(-50%);
transform-origin: center;
position: static;
margin: 0 4px;
}
/* endregion */
/* region OUTLINE */
.v-field__outline {
--v-field-border-width: 1px;
--v-field-border-opacity: 0.38;
align-items: stretch;
contain: layout;
display: flex;
height: 100%;
left: 0;
pointer-events: none;
position: absolute;
right: 0;
width: 100%;
}
@media (hover: hover) {
.v-field:hover .v-field__outline {
--v-field-border-opacity: var(--v-high-emphasis-opacity);
}
}
.v-field--error:not(.v-field--disabled) .v-field__outline {
color: rgb(var(--v-theme-error));
}
.v-field.v-field--focused .v-field__outline, .v-input.v-input--error .v-field__outline {
--v-field-border-opacity: 1;
}
.v-field--variant-outlined.v-field--focused .v-field__outline {
--v-field-border-width: 2px;
}
.v-field--variant-filled .v-field__outline::before, .v-field--variant-underlined .v-field__outline::before {
border-color: currentColor;
border-style: solid;
border-width: 0 0 var(--v-field-border-width);
opacity: var(--v-field-border-opacity);
transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.v-field--variant-filled .v-field__outline::after, .v-field--variant-underlined .v-field__outline::after {
border-color: currentColor;
border-style: solid;
border-width: 0 0 2px;
transform: scaleX(0);
transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.v-field--focused.v-field--variant-filled .v-field__outline::after, .v-field--focused.v-field--variant-underlined .v-field__outline::after {
transform: scaleX(1);
}
.v-field--variant-outlined .v-field__outline {
border-radius: inherit;
}
.v-field--variant-outlined .v-field__outline__start, .v-field--variant-outlined .v-field__outline__notch::before, .v-field--variant-outlined .v-field__outline__notch::after, .v-field--variant-outlined .v-field__outline__end {
border: 0 solid currentColor;
opacity: var(--v-field-border-opacity);
transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
}
.v-field--variant-outlined .v-field__outline__start {
flex: 0 0 12px;
border-top-width: var(--v-field-border-width);
border-bottom-width: var(--v-field-border-width);
border-inline-start-width: var(--v-field-border-width);
border-start-start-radius: inherit;
border-start-end-radius: 0;
border-end-end-radius: 0;
border-end-start-radius: inherit;
}
.v-field--rounded.v-field--variant-outlined .v-field__outline__start,
[class^=rounded-].v-field--variant-outlined .v-field__outline__start,
[class*=" rounded-"].v-field--variant-outlined .v-field__outline__start {
flex-basis: calc(var(--v-input-control-height) / 2 + 2px);
}
.v-field--variant-outlined .v-field__outline__notch {
flex: none;
position: relative;
max-width: calc(100% - 12px);
}
.v-field--variant-outlined .v-field__outline__notch::before, .v-field--variant-outlined .v-field__outline__notch::after {
opacity: var(--v-field-border-opacity);
transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.v-field--variant-outlined .v-field__outline__notch::before {
border-width: var(--v-field-border-width) 0 0;
}
.v-field--variant-outlined .v-field__outline__notch::after {
bottom: 0;
border-width: 0 0 var(--v-field-border-width);
}
.v-field--active.v-field--variant-outlined .v-field__outline__notch::before {
opacity: 0;
}
.v-field--variant-outlined .v-field__outline__end {
flex: 1;
border-top-width: var(--v-field-border-width);
border-bottom-width: var(--v-field-border-width);
border-inline-end-width: var(--v-field-border-width);
border-start-start-radius: 0;
border-start-end-radius: inherit;
border-end-end-radius: inherit;
border-end-start-radius: 0;
}
/* endregion */
/* region LOADER */
.v-field__loader {
top: calc(100% - 2px);
left: 0;
position: absolute;
right: 0;
width: 100%;
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit;
overflow: hidden;
}
.v-field--variant-outlined .v-field__loader {
top: calc(100% - 3px);
}
/* endregion */
/* region OVERLAY */
.v-field__overlay {
border-radius: inherit;
pointer-events: none;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.v-field--variant-filled .v-field__overlay {
background-color: currentColor;
opacity: 0.04;
transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
}
.v-field--variant-filled.v-field--has-background .v-field__overlay {
opacity: 0;
}
@media (hover: hover) {
.v-field--variant-filled:hover .v-field__overlay {
opacity: calc((0.04 + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier));
}
}
.v-field--variant-filled.v-field--focused .v-field__overlay {
opacity: calc((0.04 + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier));
}
.v-field--variant-solo-filled .v-field__overlay {
background-color: currentColor;
opacity: 0.04;
transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
}
@media (hover: hover) {
.v-field--variant-solo-filled:hover .v-field__overlay {
opacity: calc((0.04 + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier));
}
}
.v-field--variant-solo-filled.v-field--focused .v-field__overlay {
opacity: calc((0.04 + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier));
}
.v-field--variant-solo-inverted .v-field__overlay {
transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
}
.v-field--variant-solo-inverted.v-field--has-background .v-field__overlay {
opacity: 0;
}
@media (hover: hover) {
.v-field--variant-solo-inverted:hover .v-field__overlay {
opacity: calc((0.04 + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier));
}
}
.v-field--variant-solo-inverted.v-field--focused .v-field__overlay {
background-color: rgb(var(--v-theme-surface-variant));
opacity: 1;
}
/* endregion */
/* region MODIFIERS */
.v-field--reverse .v-field__field, .v-field--reverse .v-field__input {
flex-direction: row-reverse;
}
.v-field--reverse .v-field__input, .v-field--reverse input {
text-align: end;
}
.v-input--disabled .v-field--variant-filled .v-field__outline::before,
.v-input--disabled .v-field--variant-underlined .v-field__outline::before {
border-image: repeating-linear-gradient(to right, rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)) 0px, rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)) 2px, transparent 2px, transparent 4px) 1 repeat;
}
.v-field--loading .v-field__outline::after,
.v-field--loading .v-field__outline::before {
opacity: 0;
}
/* endregion */

View File

@ -0,0 +1,289 @@
import { mergeProps as _mergeProps, Fragment as _Fragment, withDirectives as _withDirectives, vShow as _vShow, resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue";
// Styles
import "./VField.css";
// Components
import { VFieldLabel } from "./VFieldLabel.mjs";
import { VExpandXTransition } from "../transitions/index.mjs";
import { useInputIcon } from "../VInput/InputIcon.mjs"; // Composables
import { useBackgroundColor, useTextColor } from "../../composables/color.mjs";
import { makeComponentProps } from "../../composables/component.mjs";
import { makeFocusProps, useFocus } from "../../composables/focus.mjs";
import { IconValue } from "../../composables/icons.mjs";
import { LoaderSlot, makeLoaderProps, useLoader } from "../../composables/loader.mjs";
import { useRtl } from "../../composables/locale.mjs";
import { makeRoundedProps, useRounded } from "../../composables/rounded.mjs";
import { makeThemeProps, provideTheme } from "../../composables/theme.mjs"; // Utilities
import { computed, ref, toRef, watch } from 'vue';
import { animate, convertToUnit, EventProp, genericComponent, getUid, isOn, nullifyTransforms, pick, propsFactory, standardEasing, useRender } from "../../util/index.mjs"; // Types
const allowedVariants = ['underlined', 'outlined', 'filled', 'solo', 'solo-inverted', 'solo-filled', 'plain'];
export const makeVFieldProps = propsFactory({
appendInnerIcon: IconValue,
bgColor: String,
clearable: Boolean,
clearIcon: {
type: IconValue,
default: '$clear'
},
active: Boolean,
centerAffix: {
type: Boolean,
default: undefined
},
color: String,
baseColor: String,
dirty: Boolean,
disabled: {
type: Boolean,
default: null
},
error: Boolean,
flat: Boolean,
label: String,
persistentClear: Boolean,
prependInnerIcon: IconValue,
reverse: Boolean,
singleLine: Boolean,
variant: {
type: String,
default: 'filled',
validator: v => allowedVariants.includes(v)
},
'onClick:clear': EventProp(),
'onClick:appendInner': EventProp(),
'onClick:prependInner': EventProp(),
...makeComponentProps(),
...makeLoaderProps(),
...makeRoundedProps(),
...makeThemeProps()
}, 'VField');
export const VField = genericComponent()({
name: 'VField',
inheritAttrs: false,
props: {
id: String,
...makeFocusProps(),
...makeVFieldProps()
},
emits: {
'update:focused': focused => true,
'update:modelValue': value => true
},
setup(props, _ref) {
let {
attrs,
emit,
slots
} = _ref;
const {
themeClasses
} = provideTheme(props);
const {
loaderClasses
} = useLoader(props);
const {
focusClasses,
isFocused,
focus,
blur
} = useFocus(props);
const {
InputIcon
} = useInputIcon(props);
const {
roundedClasses
} = useRounded(props);
const {
rtlClasses
} = useRtl();
const isActive = computed(() => props.dirty || props.active);
const hasLabel = computed(() => !props.singleLine && !!(props.label || slots.label));
const uid = getUid();
const id = computed(() => props.id || `input-${uid}`);
const messagesId = computed(() => `${id.value}-messages`);
const labelRef = ref();
const floatingLabelRef = ref();
const controlRef = ref();
const isPlainOrUnderlined = computed(() => ['plain', 'underlined'].includes(props.variant));
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(toRef(props, 'bgColor'));
const {
textColorClasses,
textColorStyles
} = useTextColor(computed(() => {
return props.error || props.disabled ? undefined : isActive.value && isFocused.value ? props.color : props.baseColor;
}));
watch(isActive, val => {
if (hasLabel.value) {
const el = labelRef.value.$el;
const targetEl = floatingLabelRef.value.$el;
requestAnimationFrame(() => {
const rect = nullifyTransforms(el);
const targetRect = targetEl.getBoundingClientRect();
const x = targetRect.x - rect.x;
const y = targetRect.y - rect.y - (rect.height / 2 - targetRect.height / 2);
const targetWidth = targetRect.width / 0.75;
const width = Math.abs(targetWidth - rect.width) > 1 ? {
maxWidth: convertToUnit(targetWidth)
} : undefined;
const style = getComputedStyle(el);
const targetStyle = getComputedStyle(targetEl);
const duration = parseFloat(style.transitionDuration) * 1000 || 150;
const scale = parseFloat(targetStyle.getPropertyValue('--v-field-label-scale'));
const color = targetStyle.getPropertyValue('color');
el.style.visibility = 'visible';
targetEl.style.visibility = 'hidden';
animate(el, {
transform: `translate(${x}px, ${y}px) scale(${scale})`,
color,
...width
}, {
duration,
easing: standardEasing,
direction: val ? 'normal' : 'reverse'
}).finished.then(() => {
el.style.removeProperty('visibility');
targetEl.style.removeProperty('visibility');
});
});
}
}, {
flush: 'post'
});
const slotProps = computed(() => ({
isActive,
isFocused,
controlRef,
blur,
focus
}));
function onClick(e) {
if (e.target !== document.activeElement) {
e.preventDefault();
}
}
useRender(() => {
const isOutlined = props.variant === 'outlined';
const hasPrepend = slots['prepend-inner'] || props.prependInnerIcon;
const hasClear = !!(props.clearable || slots.clear);
const hasAppend = !!(slots['append-inner'] || props.appendInnerIcon || hasClear);
const label = () => slots.label ? slots.label({
...slotProps.value,
label: props.label,
props: {
for: id.value
}
}) : props.label;
return _createVNode("div", _mergeProps({
"class": ['v-field', {
'v-field--active': isActive.value,
'v-field--appended': hasAppend,
'v-field--center-affix': props.centerAffix ?? !isPlainOrUnderlined.value,
'v-field--disabled': props.disabled,
'v-field--dirty': props.dirty,
'v-field--error': props.error,
'v-field--flat': props.flat,
'v-field--has-background': !!props.bgColor,
'v-field--persistent-clear': props.persistentClear,
'v-field--prepended': hasPrepend,
'v-field--reverse': props.reverse,
'v-field--single-line': props.singleLine,
'v-field--no-label': !label(),
[`v-field--variant-${props.variant}`]: true
}, themeClasses.value, backgroundColorClasses.value, focusClasses.value, loaderClasses.value, roundedClasses.value, rtlClasses.value, props.class],
"style": [backgroundColorStyles.value, props.style],
"onClick": onClick
}, attrs), [_createVNode("div", {
"class": "v-field__overlay"
}, null), _createVNode(LoaderSlot, {
"name": "v-field",
"active": !!props.loading,
"color": props.error ? 'error' : typeof props.loading === 'string' ? props.loading : props.color
}, {
default: slots.loader
}), hasPrepend && _createVNode("div", {
"key": "prepend",
"class": "v-field__prepend-inner"
}, [props.prependInnerIcon && _createVNode(InputIcon, {
"key": "prepend-icon",
"name": "prependInner"
}, null), slots['prepend-inner']?.(slotProps.value)]), _createVNode("div", {
"class": "v-field__field",
"data-no-activator": ""
}, [['filled', 'solo', 'solo-inverted', 'solo-filled'].includes(props.variant) && hasLabel.value && _createVNode(VFieldLabel, {
"key": "floating-label",
"ref": floatingLabelRef,
"class": [textColorClasses.value],
"floating": true,
"for": id.value,
"style": textColorStyles.value
}, {
default: () => [label()]
}), _createVNode(VFieldLabel, {
"ref": labelRef,
"for": id.value
}, {
default: () => [label()]
}), slots.default?.({
...slotProps.value,
props: {
id: id.value,
class: 'v-field__input',
'aria-describedby': messagesId.value
},
focus,
blur
})]), hasClear && _createVNode(VExpandXTransition, {
"key": "clear"
}, {
default: () => [_withDirectives(_createVNode("div", {
"class": "v-field__clearable",
"onMousedown": e => {
e.preventDefault();
e.stopPropagation();
}
}, [slots.clear ? slots.clear() : _createVNode(InputIcon, {
"name": "clear"
}, null)]), [[_vShow, props.dirty]])]
}), hasAppend && _createVNode("div", {
"key": "append",
"class": "v-field__append-inner"
}, [slots['append-inner']?.(slotProps.value), props.appendInnerIcon && _createVNode(InputIcon, {
"key": "append-icon",
"name": "appendInner"
}, null)]), _createVNode("div", {
"class": ['v-field__outline', textColorClasses.value],
"style": textColorStyles.value
}, [isOutlined && _createVNode(_Fragment, null, [_createVNode("div", {
"class": "v-field__outline__start"
}, null), hasLabel.value && _createVNode("div", {
"class": "v-field__outline__notch"
}, [_createVNode(VFieldLabel, {
"ref": floatingLabelRef,
"floating": true,
"for": id.value
}, {
default: () => [label()]
})]), _createVNode("div", {
"class": "v-field__outline__end"
}, null)]), isPlainOrUnderlined.value && hasLabel.value && _createVNode(VFieldLabel, {
"ref": floatingLabelRef,
"floating": true,
"for": id.value
}, {
default: () => [label()]
})])]);
});
return {
controlRef
};
}
});
// TODO: this is kinda slow, might be better to implicitly inherit props instead
export function filterFieldProps(attrs) {
const keys = Object.keys(VField.props).filter(k => !isOn(k) && k !== 'class' && k !== 'style');
return pick(attrs, keys);
}
//# sourceMappingURL=VField.mjs.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,513 @@
@use 'sass:map'
@use 'sass:math'
@use 'sass:selector'
@use '../../styles/settings'
@use '../../styles/tools'
@use './variables' as *
/* region INPUT */
.v-field
display: grid
grid-template-areas: "prepend-inner field clear append-inner"
grid-template-columns: min-content minmax(0, 1fr) min-content min-content
font-size: $field-font-size
letter-spacing: $field-letter-spacing
max-width: $field-max-width
border-radius: $field-border-radius
contain: layout
flex: 1 0
grid-area: control
position: relative
&--disabled
opacity: var(--v-disabled-opacity)
pointer-events: none
--v-field-padding-start: #{$field-control-padding-start}
--v-field-padding-end: #{$field-control-padding-end}
--v-field-padding-top: #{$field-control-padding-top}
--v-field-padding-bottom: #{$field-control-padding-bottom}
--v-field-input-padding-top: #{$field-input-padding-top}
--v-field-input-padding-bottom: #{$field-input-padding-bottom}
.v-chip
--v-chip-height: #{$field-chip-height}
/* endregion */
/* region MODIFIERS */
.v-field
&--prepended
padding-inline-start: $field-control-affixed-padding
&--appended
padding-inline-end: $field-control-affixed-padding
&--variant-solo,
&--variant-solo-filled
background: $field-control-solo-background
border-color: transparent
color: $field-control-solo-color
@include tools.elevation($field-control-solo-elevation)
&--variant-solo-inverted
background: $field-control-solo-background
border-color: transparent
color: $field-control-solo-inverted-color
@include tools.elevation($field-control-solo-elevation)
&.v-field--focused
color: $field-control-solo-inverted-focused-color
&--variant-filled
border-bottom-left-radius: 0
border-bottom-right-radius: 0
&--variant-solo,
&--variant-solo-inverted,
&--variant-solo-filled,
&--variant-filled
$root: &
@at-root
@include tools.density('v-input', $input-density) using ($modifier)
@at-root #{selector.nest(&, $root)}
--v-input-control-height: #{$field-control-height + $modifier}
--v-field-padding-bottom: #{math.max(0px, $field-control-padding-bottom + $modifier * .5)}
&--variant-outlined,
&--single-line,
&--no-label
--v-field-padding-top: 0px
$root: &
@at-root
@include tools.density('v-input', $input-density) using ($modifier)
@at-root #{selector.nest(&, $root)}
--v-field-padding-bottom: #{16px + $modifier * .5}
&--variant-plain,
&--variant-underlined
$root: &
border-radius: 0
padding: 0
&.v-field
--v-field-padding-start: 0px
--v-field-padding-end: 0px
@at-root
@include tools.density('v-input', $input-density) using ($modifier)
@at-root #{selector.nest(&, $root)}
--v-input-control-height: #{$field-control-underlined-height + $modifier}
--v-field-padding-top: #{math.max(0px, 4px + $modifier * .25)}
--v-field-padding-bottom: #{math.max(0px, $field-control-padding-bottom + $modifier * .5)}
&--flat
box-shadow: none
&--rounded
@include tools.rounded($field-rounded-border-radius)
// These are separate so they can override the default variant styles
&.v-field
&--prepended
--v-field-padding-start: #{$field-control-affixed-inner-padding}
&--appended
--v-field-padding-end: #{$field-control-affixed-inner-padding}
/* endregion */
/* region ELEMENTS */
.v-field__input
align-items: center
color: inherit
column-gap: $field-input-column-gap
display: flex
flex-wrap: wrap
letter-spacing: $field-letter-spacing
opacity: $field-input-opacity
min-height: $field-input-min-height
min-width: 0
padding-inline: var(--v-field-padding-start) var(--v-field-padding-end)
padding-top: var(--v-field-input-padding-top)
padding-bottom: var(--v-field-input-padding-bottom)
position: relative
width: 100%
$root: &
@at-root
@include tools.density('v-input', $input-density) using ($modifier)
@at-root #{selector.nest(&, $root)}
row-gap: #{$field-input-row-gap + $modifier * .25}
input
letter-spacing: inherit
@at-root
& input::placeholder,
input#{&}::placeholder,
textarea#{&}::placeholder
color: currentColor
opacity: var(--v-disabled-opacity)
&:focus,
&:active
outline: none
// Remove Firefox red outline
&:invalid
box-shadow: none
.v-field__field
flex: 1 0
grid-area: field
position: relative
align-items: flex-start
display: flex
/* endregion */
/* region AFFIXES */
.v-field__prepend-inner
grid-area: prepend-inner
padding-inline-end: var(--v-field-padding-after)
.v-field__clearable
grid-area: clear
.v-field__append-inner
grid-area: append-inner
padding-inline-start: var(--v-field-padding-after)
.v-field__append-inner,
.v-field__clearable,
.v-field__prepend-inner
display: flex
align-items: flex-start
padding-top: var(--v-input-padding-top, $field-control-padding-top)
.v-field--center-affix &
align-items: center
padding-top: 0
.v-field.v-field--variant-underlined,
.v-field.v-field--variant-plain
.v-field__append-inner,
.v-field__clearable,
.v-field__prepend-inner
align-items: flex-start
padding-top: $field-input-padding-top
padding-bottom: $field-input-padding-bottom
.v-field__prepend-inner,
.v-field__append-inner
.v-field--focused &
opacity: 1
.v-field__prepend-inner,
.v-field__append-inner,
.v-field__clearable
> .v-icon
opacity: var(--v-medium-emphasis-opacity)
.v-field--disabled &,
.v-field--error &
> .v-icon
opacity: 1
.v-field--error:not(.v-field--disabled) &
> .v-icon
color: rgb(var(--v-theme-error))
.v-field__clearable
cursor: pointer
opacity: 0
overflow: hidden
margin-inline: $field-clearable-margin
transition: $field-transition-timing
transition-property: opacity, transform, width
.v-field--focused &,
.v-field--persistent-clear &
opacity: 1
@media (hover: hover)
.v-field:hover &
opacity: 1
@media (hover: none)
opacity: 1
/* endregion */
/* region LABEL */
.v-label.v-field-label
contain: layout paint
display: block
margin-inline-start: var(--v-field-padding-start)
margin-inline-end: var(--v-field-padding-end)
max-width: calc(100% - var(--v-field-padding-start) - var(--v-field-padding-end))
pointer-events: none
position: absolute
top: var(--v-input-padding-top)
transform-origin: left center
transition: $field-transition-timing
transition-property: opacity, transform
z-index: 1
.v-field--variant-underlined &,
.v-field--variant-plain &
top: calc(var(--v-input-padding-top) + var(--v-field-padding-top))
.v-field--center-affix &
top: 50%
transform: translateY(-50%)
.v-field--active &
visibility: hidden
.v-field--focused &,
.v-field--error &
opacity: 1
.v-field--error:not(.v-field--disabled) &
color: rgb(var(--v-theme-error))
&--floating
--v-field-label-scale: #{$field-label-floating-scale}em
font-size: var(--v-field-label-scale)
visibility: hidden
max-width: 100%
.v-field--center-affix &
transform: none
.v-field.v-field--active &
visibility: unset
.v-field--variant-solo &,
.v-field--variant-solo-inverted &,
.v-field--variant-filled &,
.v-field--variant-solo-filled &
$root: &
@at-root
@include tools.density('v-input', $input-density) using ($modifier)
@at-root #{selector.nest(&, $root)}
top: 7px + $modifier * .25
.v-field--variant-plain &,
.v-field--variant-underlined &
transform: translateY(-16px)
margin: 0
top: var(--v-input-padding-top)
.v-field--variant-outlined &
transform: translateY(-50%)
transform-origin: center
position: static
margin: 0 4px
/* endregion */
/* region OUTLINE */
.v-field__outline
--v-field-border-width: #{$field-border-width}
--v-field-border-opacity: #{$field-outline-opacity}
align-items: stretch
contain: layout
display: flex
height: 100%
left: 0
pointer-events: none
position: absolute
right: 0
width: 100%
@media (hover: hover)
.v-field:hover &
--v-field-border-opacity: var(--v-high-emphasis-opacity)
.v-field--error:not(.v-field--disabled) &
color: rgb(var(--v-theme-error))
.v-field.v-field--focused &,
.v-input.v-input--error &
--v-field-border-opacity: 1
.v-field--variant-outlined.v-field--focused &
--v-field-border-width: #{$field-focused-border-width}
.v-field--variant-filled &,
.v-field--variant-underlined &
&::before
border-color: currentColor
border-style: solid
border-width: 0 0 var(--v-field-border-width)
opacity: var(--v-field-border-opacity)
transition: opacity $field-subtle-transition-timing
@include tools.absolute(true)
.v-field--variant-filled &,
.v-field--variant-underlined &
&::after
border-color: currentColor
border-style: solid
border-width: 0 0 $field-focused-border-width
transform: scaleX(0)
transition: transform $field-transition-timing
@include tools.absolute(true)
@at-root #{selector.append('.v-field--focused', &)}
transform: scaleX(1)
.v-field--variant-outlined &
border-radius: inherit
&__start,
&__notch::before,
&__notch::after,
&__end
border: 0 solid currentColor
opacity: var(--v-field-border-opacity)
transition: opacity $field-subtle-transition-timing
&__start
flex: 0 0 $field-control-affixed-padding
border-top-width: var(--v-field-border-width)
border-bottom-width: var(--v-field-border-width)
border-inline-start-width: var(--v-field-border-width)
border-start-start-radius: inherit
border-start-end-radius: 0
border-end-end-radius: 0
border-end-start-radius: inherit
@at-root
#{selector.append('.v-field--rounded', &)},
#{selector.append('[class^="rounded-"]', &)},
#{selector.append('[class*=" rounded-"]', &)}
flex-basis: calc(var(--v-input-control-height) / 2 + 2px)
&__notch
flex: none
position: relative
max-width: calc(100% - $field-control-affixed-padding)
&::before,
&::after
opacity: var(--v-field-border-opacity)
transition: opacity $field-subtle-transition-timing
@include tools.absolute(true)
&::before
border-width: var(--v-field-border-width) 0 0
&::after
bottom: 0
border-width: 0 0 var(--v-field-border-width)
@at-root #{selector.append('.v-field--active', &)}
&::before
opacity: 0
&__end
flex: 1
border-top-width: var(--v-field-border-width)
border-bottom-width: var(--v-field-border-width)
border-inline-end-width: var(--v-field-border-width)
border-start-start-radius: 0
border-start-end-radius: inherit
border-end-end-radius: inherit
border-end-start-radius: 0
/* endregion */
/* region LOADER */
.v-field__loader
top: calc(100% - 2px)
left: 0
position: absolute
right: 0
width: 100%
border-top-left-radius: 0
border-top-right-radius: 0
border-bottom-left-radius: inherit
border-bottom-right-radius: inherit
overflow: hidden
.v-field--variant-outlined &
top: calc(100% - 3px)
/* endregion */
/* region OVERLAY */
.v-field__overlay
border-radius: inherit
pointer-events: none
@include tools.absolute()
.v-field--variant-filled
.v-field__overlay
background-color: currentColor
opacity: $field-overlay-filled-opacity
transition: opacity $field-subtle-transition-timing
&.v-field--has-background .v-field__overlay
opacity: 0
@media (hover: hover)
&:hover .v-field__overlay
opacity: calc((#{$field-overlay-filled-opacity} + #{map.get(settings.$states, 'hover')}) * var(--v-theme-overlay-multiplier))
&.v-field--focused .v-field__overlay
opacity: calc((#{$field-overlay-filled-opacity} + #{map.get(settings.$states, 'focus')}) * var(--v-theme-overlay-multiplier))
.v-field--variant-solo-filled
.v-field__overlay
background-color: currentColor
opacity: $field-overlay-filled-opacity
transition: opacity $field-subtle-transition-timing
@media (hover: hover)
&:hover .v-field__overlay
opacity: calc((#{$field-overlay-filled-opacity} + #{map.get(settings.$states, 'hover')}) * var(--v-theme-overlay-multiplier))
&.v-field--focused .v-field__overlay
opacity: calc((#{$field-overlay-filled-opacity} + #{map.get(settings.$states, 'focus')}) * var(--v-theme-overlay-multiplier))
.v-field--variant-solo-inverted
.v-field__overlay
transition: opacity $field-subtle-transition-timing
&.v-field--has-background .v-field__overlay
opacity: 0
@media (hover: hover)
&:hover .v-field__overlay
opacity: calc((#{.04} + #{map.get(settings.$states, 'hover')}) * var(--v-theme-overlay-multiplier))
&.v-field--focused .v-field__overlay
background-color: $field-overlay-focused-background-color
opacity: 1
/* endregion */
/* region MODIFIERS */
.v-field--reverse
.v-field__field, .v-field__input
flex-direction: row-reverse
.v-field__input, input
text-align: end
.v-field--variant-filled,
.v-field--variant-underlined
.v-input--disabled &
.v-field__outline::before
border-image: repeating-linear-gradient(to right, $field-disabled-color 0px, $field-disabled-color 2px, transparent 2px, transparent 4px) 1 repeat
.v-field--loading
.v-field__outline::after,
.v-field__outline::before
opacity: 0
/* endregion */

View File

@ -0,0 +1,27 @@
import { createVNode as _createVNode, resolveDirective as _resolveDirective } from "vue";
// Components
import { VLabel } from "../VLabel/index.mjs"; // Composables
import { makeComponentProps } from "../../composables/component.mjs"; // Utilities
import { genericComponent, propsFactory, useRender } from "../../util/index.mjs";
export const makeVFieldLabelProps = propsFactory({
floating: Boolean,
...makeComponentProps()
}, 'VFieldLabel');
export const VFieldLabel = genericComponent()({
name: 'VFieldLabel',
props: makeVFieldLabelProps(),
setup(props, _ref) {
let {
slots
} = _ref;
useRender(() => _createVNode(VLabel, {
"class": ['v-field-label', {
'v-field-label--floating': props.floating
}, props.class],
"style": props.style,
"aria-hidden": props.floating || undefined
}, slots));
return {};
}
});
//# sourceMappingURL=VFieldLabel.mjs.map

View File

@ -0,0 +1 @@
{"version":3,"file":"VFieldLabel.mjs","names":["VLabel","makeComponentProps","genericComponent","propsFactory","useRender","makeVFieldLabelProps","floating","Boolean","VFieldLabel","name","props","setup","_ref","slots","_createVNode","class","style","undefined"],"sources":["../../../src/components/VField/VFieldLabel.tsx"],"sourcesContent":["// Components\nimport { VLabel } from '@/components/VLabel'\n\n// Composables\nimport { makeComponentProps } from '@/composables/component'\n\n// Utilities\nimport { genericComponent, propsFactory, useRender } from '@/util'\n\nexport const makeVFieldLabelProps = propsFactory({\n floating: Boolean,\n\n ...makeComponentProps(),\n}, 'VFieldLabel')\n\nexport const VFieldLabel = genericComponent()({\n name: 'VFieldLabel',\n\n props: makeVFieldLabelProps(),\n\n setup (props, { slots }) {\n useRender(() => (\n <VLabel\n class={[\n 'v-field-label',\n { 'v-field-label--floating': props.floating },\n props.class,\n ]}\n style={ props.style }\n aria-hidden={ props.floating || undefined }\n v-slots={ slots }\n />\n ))\n\n return {}\n },\n})\n\nexport type VFieldLabel = InstanceType<typeof VFieldLabel>\n"],"mappings":";AAAA;AAAA,SACSA,MAAM,+BAEf;AAAA,SACSC,kBAAkB,2CAE3B;AAAA,SACSC,gBAAgB,EAAEC,YAAY,EAAEC,SAAS;AAElD,OAAO,MAAMC,oBAAoB,GAAGF,YAAY,CAAC;EAC/CG,QAAQ,EAAEC,OAAO;EAEjB,GAAGN,kBAAkB,CAAC;AACxB,CAAC,EAAE,aAAa,CAAC;AAEjB,OAAO,MAAMO,WAAW,GAAGN,gBAAgB,CAAC,CAAC,CAAC;EAC5CO,IAAI,EAAE,aAAa;EAEnBC,KAAK,EAAEL,oBAAoB,CAAC,CAAC;EAE7BM,KAAKA,CAAED,KAAK,EAAAE,IAAA,EAAa;IAAA,IAAX;MAAEC;IAAM,CAAC,GAAAD,IAAA;IACrBR,SAAS,CAAC,MAAAU,YAAA,CAAAd,MAAA;MAAA,SAEC,CACL,eAAe,EACf;QAAE,yBAAyB,EAAEU,KAAK,CAACJ;MAAS,CAAC,EAC7CI,KAAK,CAACK,KAAK,CACZ;MAAA,SACOL,KAAK,CAACM,KAAK;MAAA,eACLN,KAAK,CAACJ,QAAQ,IAAIW;IAAS,GAC/BJ,KAAK,CAElB,CAAC;IAEF,OAAO,CAAC,CAAC;EACX;AACF,CAAC,CAAC"}

View File

@ -0,0 +1,59 @@
@forward '../VInput/variables';
@use '../../styles/settings';
@use '../VInput/variables' as *;
// INPUT
$field-border-radius: settings.$border-radius-root !default;
$field-rounded-border-radius: map-get(settings.$rounded, 'pill') !default;
$field-color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)) !default;
$field-disabled-color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)) !default;
$field-error-color: rgb(var(--v-theme-error)) !default;
$field-font-size: 16px !default;
$field-letter-spacing: .009375em !default;
$field-max-width: 100% !default;
$field-transition-timing: .15s settings.$standard-easing !default;
$field-subtle-transition-timing: 250ms settings.$standard-easing !default;
$field-underlined-margin-bottom: 4px !default;
$field-clearable-margin: 4px !default;
$field-clearable-transition: .15s opacity, .15s width settings.$standard-easing !default;
$field-chip-height: 24px !default;
// CONTROL
$field-control-solo-background: rgb(var(--v-theme-surface)) !default;
$field-control-solo-color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)) !default;
$field-control-solo-elevation: 2 !default;
$field-control-solo-inverted-color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)) !default;
$field-control-solo-inverted-focused-color: rgb(var(--v-theme-on-surface-variant)) !default;
$field-control-filled-background: rgba(var(--v-theme-on-surface), var(--v-idle-opacity)) !default;
$field-control-padding-start: 16px !default;
$field-control-padding-end: 16px !default;
$field-control-padding-top: 8px !default;
$field-control-padding-bottom: 4px !default;
$field-control-affixed-padding: 12px !default;
$field-control-affixed-inner-padding: 6px !default;
$field-control-underlined-height: 48px !default;
$field-control-underlined-padding-bottom: 2px !default;
$field-control-height: 56px !default;
// INPUT
$field-input-opacity: var(--v-high-emphasis-opacity) !default;
$field-input-min-height: #{max(
var(--v-input-control-height, $input-control-height),
calc($input-font-size * $input-line-height + var(--v-field-input-padding-top) + var(--v-field-input-padding-bottom))
)} !default;
$field-input-padding-top: calc(var(--v-field-padding-top, $field-control-padding-top) + var(--v-input-padding-top, 0)) !default;
$field-input-padding-bottom: var(--v-field-padding-bottom, $field-control-padding-bottom) !default;
$field-input-column-gap: 2px !default;
$field-input-row-gap: 8px !default;
// LABEL
$field-label-floating-scale: .75 !default;
// OUTLINE
$field-outline-opacity: .38 !default;
$field-border-width: 1px !default;
$field-focused-border-width: 2px !default;
// OVERLAY
$field-overlay-filled-opacity: 0.04 !default;
$field-overlay-focused-background-color: rgb(var(--v-theme-surface-variant)) !default;

View File

@ -0,0 +1,519 @@
import * as vue from 'vue';
import { ComponentPropsOptions, ExtractPropTypes, VNodeChild, VNode, JSXComponent, PropType, Ref } from 'vue';
type SlotsToProps<U extends RawSlots, T = MakeInternalSlots<U>> = {
$children?: (VNodeChild | (T extends {
default: infer V;
} ? V : {}) | {
[K in keyof T]?: T[K];
});
'v-slots'?: {
[K in keyof T]?: T[K] | false;
};
} & {
[K in keyof T as `v-slot:${K & string}`]?: T[K] | false;
};
type RawSlots = Record<string, unknown>;
type Slot<T> = [T] extends [never] ? () => VNodeChild : (arg: T) => VNodeChild;
type VueSlot<T> = [T] extends [never] ? () => VNode[] : (arg: T) => VNode[];
type MakeInternalSlots<T extends RawSlots> = {
[K in keyof T]: Slot<T[K]>;
};
type MakeSlots<T extends RawSlots> = {
[K in keyof T]: VueSlot<T[K]>;
};
type GenericProps<Props, Slots extends Record<string, unknown>> = {
$props: Props & SlotsToProps<Slots>;
$slots: MakeSlots<Slots>;
};
interface FilterPropsOptions<PropsOptions extends Readonly<ComponentPropsOptions>, Props = ExtractPropTypes<PropsOptions>> {
filterProps<T extends Partial<Props>, U extends Exclude<keyof Props, Exclude<keyof Props, keyof T>>>(props: T): Partial<Pick<T, U>>;
}
type IconValue = string | (string | [path: string, opacity: number])[] | JSXComponent;
declare const IconValue: PropType<IconValue>;
interface LoaderSlotProps {
color: string | undefined;
isActive: boolean;
}
interface DefaultInputSlot {
isActive: Ref<boolean>;
isFocused: Ref<boolean>;
controlRef: Ref<HTMLElement | undefined>;
focus: () => void;
blur: () => void;
}
interface VFieldSlot extends DefaultInputSlot {
props: Record<string, unknown>;
}
type VFieldSlots = {
clear: never;
'prepend-inner': DefaultInputSlot;
'append-inner': DefaultInputSlot;
label: DefaultInputSlot & {
label: string | undefined;
props: Record<string, any>;
};
loader: LoaderSlotProps;
default: VFieldSlot;
};
declare const VField: {
new (...args: any[]): vue.CreateComponentPublicInstance<{
flat: boolean;
reverse: boolean;
variant: "filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled";
error: boolean;
active: boolean;
style: vue.StyleValue;
disabled: boolean;
clearIcon: IconValue;
focused: boolean;
clearable: boolean;
dirty: boolean;
persistentClear: boolean;
singleLine: boolean;
} & {
id?: string | undefined;
color?: string | undefined;
loading?: string | boolean | undefined;
label?: string | undefined;
class?: any;
theme?: string | undefined;
rounded?: string | number | boolean | undefined;
bgColor?: string | undefined;
baseColor?: string | undefined;
appendInnerIcon?: IconValue | undefined;
prependInnerIcon?: IconValue | undefined;
'onClick:clear'?: ((args_0: MouseEvent) => void) | undefined;
'onClick:appendInner'?: ((args_0: MouseEvent) => void) | undefined;
'onClick:prependInner'?: ((args_0: MouseEvent) => void) | undefined;
'onUpdate:focused'?: ((args_0: boolean) => void) | undefined;
centerAffix?: boolean | undefined;
} & {
"onUpdate:focused"?: ((focused: boolean) => any) | undefined;
}, {
controlRef: Ref<HTMLElement | undefined>;
}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Omit<{
'update:focused': (focused: boolean) => true;
'update:modelValue': (value: any) => true;
}, "$children" | "v-slot:default" | "v-slots" | "modelValue" | "update:modelValue" | "v-slot:loader" | "v-slot:label" | "v-slot:clear" | "v-slot:prepend-inner" | "v-slot:append-inner">, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & {
flat: boolean;
reverse: boolean;
variant: "filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled";
error: boolean;
active: boolean;
style: vue.StyleValue;
disabled: boolean;
clearIcon: IconValue;
focused: boolean;
clearable: boolean;
dirty: boolean;
persistentClear: boolean;
singleLine: boolean;
} & {
id?: string | undefined;
color?: string | undefined;
loading?: string | boolean | undefined;
label?: string | undefined;
class?: any;
theme?: string | undefined;
rounded?: string | number | boolean | undefined;
bgColor?: string | undefined;
baseColor?: string | undefined;
appendInnerIcon?: IconValue | undefined;
prependInnerIcon?: IconValue | undefined;
'onClick:clear'?: ((args_0: MouseEvent) => void) | undefined;
'onClick:appendInner'?: ((args_0: MouseEvent) => void) | undefined;
'onClick:prependInner'?: ((args_0: MouseEvent) => void) | undefined;
'onUpdate:focused'?: ((args_0: boolean) => void) | undefined;
centerAffix?: boolean | undefined;
} & {
"onUpdate:focused"?: ((focused: boolean) => any) | undefined;
}, {
flat: boolean;
reverse: boolean;
variant: "filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled";
error: boolean;
active: boolean;
style: vue.StyleValue;
disabled: boolean;
rounded: string | number | boolean;
clearIcon: IconValue;
focused: boolean;
centerAffix: boolean;
clearable: boolean;
dirty: boolean;
persistentClear: boolean;
singleLine: boolean;
}, true, {}, vue.SlotsType<Partial<{
clear: () => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
'prepend-inner': (arg: DefaultInputSlot) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
'append-inner': (arg: DefaultInputSlot) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
label: (arg: DefaultInputSlot & {
label: string | undefined;
props: Record<string, any>;
}) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
loader: (arg: LoaderSlotProps) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
default: (arg: VFieldSlot) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
}>>, {
P: {};
B: {};
D: {};
C: {};
M: {};
Defaults: {};
}, {
flat: boolean;
reverse: boolean;
variant: "filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled";
error: boolean;
active: boolean;
style: vue.StyleValue;
disabled: boolean;
clearIcon: IconValue;
focused: boolean;
clearable: boolean;
dirty: boolean;
persistentClear: boolean;
singleLine: boolean;
} & {
id?: string | undefined;
color?: string | undefined;
loading?: string | boolean | undefined;
label?: string | undefined;
class?: any;
theme?: string | undefined;
rounded?: string | number | boolean | undefined;
bgColor?: string | undefined;
baseColor?: string | undefined;
appendInnerIcon?: IconValue | undefined;
prependInnerIcon?: IconValue | undefined;
'onClick:clear'?: ((args_0: MouseEvent) => void) | undefined;
'onClick:appendInner'?: ((args_0: MouseEvent) => void) | undefined;
'onClick:prependInner'?: ((args_0: MouseEvent) => void) | undefined;
'onUpdate:focused'?: ((args_0: boolean) => void) | undefined;
centerAffix?: boolean | undefined;
} & {
"onUpdate:focused"?: ((focused: boolean) => any) | undefined;
}, {
controlRef: Ref<HTMLElement | undefined>;
}, {}, {}, {}, {
flat: boolean;
reverse: boolean;
variant: "filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled";
error: boolean;
active: boolean;
style: vue.StyleValue;
disabled: boolean;
rounded: string | number | boolean;
clearIcon: IconValue;
focused: boolean;
centerAffix: boolean;
clearable: boolean;
dirty: boolean;
persistentClear: boolean;
singleLine: boolean;
}>;
__isFragment?: undefined;
__isTeleport?: undefined;
__isSuspense?: undefined;
} & vue.ComponentOptionsBase<{
flat: boolean;
reverse: boolean;
variant: "filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled";
error: boolean;
active: boolean;
style: vue.StyleValue;
disabled: boolean;
clearIcon: IconValue;
focused: boolean;
clearable: boolean;
dirty: boolean;
persistentClear: boolean;
singleLine: boolean;
} & {
id?: string | undefined;
color?: string | undefined;
loading?: string | boolean | undefined;
label?: string | undefined;
class?: any;
theme?: string | undefined;
rounded?: string | number | boolean | undefined;
bgColor?: string | undefined;
baseColor?: string | undefined;
appendInnerIcon?: IconValue | undefined;
prependInnerIcon?: IconValue | undefined;
'onClick:clear'?: ((args_0: MouseEvent) => void) | undefined;
'onClick:appendInner'?: ((args_0: MouseEvent) => void) | undefined;
'onClick:prependInner'?: ((args_0: MouseEvent) => void) | undefined;
'onUpdate:focused'?: ((args_0: boolean) => void) | undefined;
centerAffix?: boolean | undefined;
} & {
"onUpdate:focused"?: ((focused: boolean) => any) | undefined;
}, {
controlRef: Ref<HTMLElement | undefined>;
}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Omit<{
'update:focused': (focused: boolean) => true;
'update:modelValue': (value: any) => true;
}, "$children" | "v-slot:default" | "v-slots" | "modelValue" | "update:modelValue" | "v-slot:loader" | "v-slot:label" | "v-slot:clear" | "v-slot:prepend-inner" | "v-slot:append-inner">, string, {
flat: boolean;
reverse: boolean;
variant: "filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled";
error: boolean;
active: boolean;
style: vue.StyleValue;
disabled: boolean;
rounded: string | number | boolean;
clearIcon: IconValue;
focused: boolean;
centerAffix: boolean;
clearable: boolean;
dirty: boolean;
persistentClear: boolean;
singleLine: boolean;
}, {}, string, vue.SlotsType<Partial<{
clear: () => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
'prepend-inner': (arg: DefaultInputSlot) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
'append-inner': (arg: DefaultInputSlot) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
label: (arg: DefaultInputSlot & {
label: string | undefined;
props: Record<string, any>;
}) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
loader: (arg: LoaderSlotProps) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
default: (arg: VFieldSlot) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
}>>> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new <T>(props: {
modelValue?: T | undefined;
'onUpdate:modelValue'?: ((value: T) => void) | undefined;
}, slots: VFieldSlots) => GenericProps<{
modelValue?: T | undefined;
'onUpdate:modelValue'?: ((value: T) => void) | undefined;
}, VFieldSlots>) & FilterPropsOptions<{
theme: StringConstructor;
rounded: {
type: (StringConstructor | BooleanConstructor | NumberConstructor)[];
default: undefined;
};
loading: (StringConstructor | BooleanConstructor)[];
class: PropType<any>;
style: {
type: PropType<vue.StyleValue>;
default: null;
};
appendInnerIcon: PropType<IconValue>;
bgColor: StringConstructor;
clearable: BooleanConstructor;
clearIcon: {
type: PropType<IconValue>;
default: string;
};
active: BooleanConstructor;
centerAffix: {
type: BooleanConstructor;
default: undefined;
};
color: StringConstructor;
baseColor: StringConstructor;
dirty: BooleanConstructor;
disabled: {
type: BooleanConstructor;
default: null;
};
error: BooleanConstructor;
flat: BooleanConstructor;
label: StringConstructor;
persistentClear: BooleanConstructor;
prependInnerIcon: PropType<IconValue>;
reverse: BooleanConstructor;
singleLine: BooleanConstructor;
variant: {
type: PropType<"filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled">;
default: string;
validator: (v: any) => boolean;
};
'onClick:clear': PropType<(args_0: MouseEvent) => void>;
'onClick:appendInner': PropType<(args_0: MouseEvent) => void>;
'onClick:prependInner': PropType<(args_0: MouseEvent) => void>;
focused: BooleanConstructor;
'onUpdate:focused': PropType<(args_0: boolean) => void>;
id: StringConstructor;
}, vue.ExtractPropTypes<{
theme: StringConstructor;
rounded: {
type: (StringConstructor | BooleanConstructor | NumberConstructor)[];
default: undefined;
};
loading: (StringConstructor | BooleanConstructor)[];
class: PropType<any>;
style: {
type: PropType<vue.StyleValue>;
default: null;
};
appendInnerIcon: PropType<IconValue>;
bgColor: StringConstructor;
clearable: BooleanConstructor;
clearIcon: {
type: PropType<IconValue>;
default: string;
};
active: BooleanConstructor;
centerAffix: {
type: BooleanConstructor;
default: undefined;
};
color: StringConstructor;
baseColor: StringConstructor;
dirty: BooleanConstructor;
disabled: {
type: BooleanConstructor;
default: null;
};
error: BooleanConstructor;
flat: BooleanConstructor;
label: StringConstructor;
persistentClear: BooleanConstructor;
prependInnerIcon: PropType<IconValue>;
reverse: BooleanConstructor;
singleLine: BooleanConstructor;
variant: {
type: PropType<"filled" | "outlined" | "plain" | "underlined" | "solo" | "solo-inverted" | "solo-filled">;
default: string;
validator: (v: any) => boolean;
};
'onClick:clear': PropType<(args_0: MouseEvent) => void>;
'onClick:appendInner': PropType<(args_0: MouseEvent) => void>;
'onClick:prependInner': PropType<(args_0: MouseEvent) => void>;
focused: BooleanConstructor;
'onUpdate:focused': PropType<(args_0: boolean) => void>;
id: StringConstructor;
}>>;
type VField = InstanceType<typeof VField>;
declare const VFieldLabel: {
new (...args: any[]): vue.CreateComponentPublicInstance<{
style: vue.StyleValue;
floating: boolean;
} & {
class?: any;
} & {
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
default?: (() => vue.VNodeChild) | undefined;
};
'v-slots'?: {
default?: false | (() => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
}, {}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & {
style: vue.StyleValue;
floating: boolean;
} & {
class?: any;
} & {
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
default?: (() => vue.VNodeChild) | undefined;
};
'v-slots'?: {
default?: false | (() => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
}, {
style: vue.StyleValue;
floating: boolean;
}, true, {}, vue.SlotsType<Partial<{
default: () => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
}>>, {
P: {};
B: {};
D: {};
C: {};
M: {};
Defaults: {};
}, {
style: vue.StyleValue;
floating: boolean;
} & {
class?: any;
} & {
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
default?: (() => vue.VNodeChild) | undefined;
};
'v-slots'?: {
default?: false | (() => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
}, {}, {}, {}, {}, {
style: vue.StyleValue;
floating: boolean;
}>;
__isFragment?: undefined;
__isTeleport?: undefined;
__isSuspense?: undefined;
} & vue.ComponentOptionsBase<{
style: vue.StyleValue;
floating: boolean;
} & {
class?: any;
} & {
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
default?: (() => vue.VNodeChild) | undefined;
};
'v-slots'?: {
default?: false | (() => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
}, {}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, string, {
style: vue.StyleValue;
floating: boolean;
}, {}, string, vue.SlotsType<Partial<{
default: () => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
}>>> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & FilterPropsOptions<{
class: vue.PropType<any>;
style: {
type: vue.PropType<vue.StyleValue>;
default: null;
};
floating: BooleanConstructor;
}, vue.ExtractPropTypes<{
class: vue.PropType<any>;
style: {
type: vue.PropType<vue.StyleValue>;
default: null;
};
floating: BooleanConstructor;
}>>;
type VFieldLabel = InstanceType<typeof VFieldLabel>;
export { VField, VFieldLabel };

View File

@ -0,0 +1,3 @@
export { VField } from "./VField.mjs";
export { VFieldLabel } from "./VFieldLabel.mjs";
//# sourceMappingURL=index.mjs.map

View File

@ -0,0 +1 @@
{"version":3,"file":"index.mjs","names":["VField","VFieldLabel"],"sources":["../../../src/components/VField/index.ts"],"sourcesContent":["export { VField } from './VField'\nexport { VFieldLabel } from './VFieldLabel'\n"],"mappings":"SAASA,MAAM;AAAA,SACNC,WAAW"}