Compare commits
3 Commits
4c8fb0ff77
...
f80c6d5326
| Author | SHA1 | Date |
|---|---|---|
|
|
f80c6d5326 | |
|
|
a5a9086eb7 | |
|
|
f37c3e4cc9 |
|
|
@ -0,0 +1,21 @@
|
||||||
|
<template>
|
||||||
|
<HoverCardRoot :open-delay="delay">
|
||||||
|
<HoverCardTrigger class="inline-block cursor-help outline-none" asChild>
|
||||||
|
<slot></slot>
|
||||||
|
</HoverCardTrigger>
|
||||||
|
<HoverCardPortal :disabled="disabled">
|
||||||
|
<HoverCardContent :side="side" class="data-[side=bottom]:animate-slideUpAndFade data-[side=right]:animate-slideLeftAndFade data-[side=left]:animate-slideRightAndFade data-[side=top]:animate-slideDownAndFade w-[300px] bg-light-10 dark:bg-dark-10 border border-light-35 dark:border-dark-35 p-5 data-[state=open]:transition-all text-light-100 dark:text-dark-100" >
|
||||||
|
<slot name="content"></slot>
|
||||||
|
<HoverCardArrow class="fill-light-35 dark:fill-dark-35" />
|
||||||
|
</HoverCardContent>
|
||||||
|
</HoverCardPortal>
|
||||||
|
</HoverCardRoot>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
const { delay = 500, disabled = false, side = 'bottom' } = defineProps<{
|
||||||
|
delay?: number
|
||||||
|
disabled?: boolean
|
||||||
|
side?: 'top' | 'right' | 'bottom' | 'left'
|
||||||
|
}>();
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<template>
|
||||||
|
<Label class="my-2 flex">{{ label }}
|
||||||
|
<NumberFieldRoot :min="min" :max="max" v-model="model" :disabled="disabled" :step="step" class="ms-4 flex justify-center border border-light-35 dark:border-dark-35 bg-light-20 dark:bg-dark-20 data-[disabled]:border-light-20 dark:data-[disabled]:border-dark-20 data-[disabled]:bg-light-20 dark:data-[disabled]:bg-dark-20
|
||||||
|
data-[disabled]:text-light-70 dark:data-[disabled]:text-dark-70 hover:border-light-50 dark:hover:border-dark-50 has-[:focus]:shadow-raw transition-[box-shadow] has-[:focus]:shadow-light-40 dark:has-[:focus]:shadow-dark-40">
|
||||||
|
<NumberFieldDecrement class="data-[disabled]:opacity-50 px-1"><Icon icon="radix-icons:minus" :inline="true" class="w-6 text-light-100 dark:text-dark-100 opacity-100" /></NumberFieldDecrement>
|
||||||
|
<NumberFieldInput class="text-sm tabular-nums w-20 appearance-none bg-transparent px-2 py-1 outline-none caret-light-50 dark:caret-dark-50" />
|
||||||
|
<NumberFieldIncrement class="data-[disabled]:opacity-50 px-1"><Icon icon="radix-icons:plus" :inline="true" class="w-6 text-light-100 dark:text-dark-100 opacity-100" /></NumberFieldIncrement>
|
||||||
|
</NumberFieldRoot>
|
||||||
|
</Label>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { Icon } from '@iconify/vue/dist/iconify.js';
|
||||||
|
|
||||||
|
const { min = 0, max = 100, disabled = false, step = 1, label } = defineProps<{
|
||||||
|
min?: number
|
||||||
|
max?: number
|
||||||
|
disabled?: boolean
|
||||||
|
step?: number
|
||||||
|
label?: string
|
||||||
|
}>();
|
||||||
|
const model = defineModel<number>();
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
<template>
|
||||||
|
<Label class="my-2">{{ label }}
|
||||||
|
<PinInputRoot :disabled="disabled" :default-value="model?.split('')" @update:model-value="(v) => model = v.join('')" @complete="() => emit('complete')" class="flex gap-2 items-center mt-1">
|
||||||
|
<PinInputInput :type="hidden ? 'password' : undefined" v-for="(id, index) in amount" :key="id" :index="index" class="border border-light-35 dark:border-dark-35 w-10 h-10 outline-none
|
||||||
|
bg-light-20 dark:bg-dark-20 text-center text-light-100 dark:text-dark-100 placeholder:text-light-60 dark:placeholder:text-dark-60 data-[disabled]:border-light-20 dark:data-[disabled]:border-dark-20 data-[disabled]:bg-light-20 dark:data-[disabled]:bg-dark-20
|
||||||
|
data-[disabled]:text-light-70 dark:data-[disabled]:text-dark-70 focus:shadow-raw transition-[box-shadow] focus:shadow-light-40 dark:focus:shadow-dark-40 caret-light-50 dark:caret-dark-50" />
|
||||||
|
</PinInputRoot>
|
||||||
|
</Label>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
const { hidden = false, amount, label, disabled = false } = defineProps<{
|
||||||
|
hidden?: boolean
|
||||||
|
label?: string
|
||||||
|
amount: number
|
||||||
|
disabled?: boolean
|
||||||
|
}>();
|
||||||
|
const model = defineModel<string>();
|
||||||
|
const emit = defineEmits(['complete']);
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
<template>
|
||||||
|
<ProgressRoot :max="max" v-model="model" class="my-2 relative overflow-hidden bg-light-25 dark:bg-dark-25 w-48 h-3 data-[shape=thin]:h-1 data-[shape=large]:h-6" :data-shape="shape" style="transform: translateZ(0)" >
|
||||||
|
<ProgressIndicator class="bg-light-50 dark:bg-dark-50 h-full transition-[width] duration-[660ms] ease-[cubic-bezier(0.65, 0, 0.35, 1)]" :style="`width: ${((model ?? 0) / max) * 100}%`" />
|
||||||
|
</ProgressRoot>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
const { max = 100, shape = 'normal' } = defineProps<{
|
||||||
|
max?: number
|
||||||
|
shape?: 'thin' | 'normal' | 'large'
|
||||||
|
}>();
|
||||||
|
const model = defineModel<number>();
|
||||||
|
</script>
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<Label class="px-4">{{ label }}
|
<Label class="px-4 my-2">{{ label }}
|
||||||
<input :placeholder="placeholder" :disabled="disabled"
|
<input :placeholder="placeholder" :disabled="disabled"
|
||||||
class="mx-4 caret-light-50 dark:caret-dark-50 text-light-100 dark:text-dark-100 placeholder:text-light-50 dark:placeholder:text-dark-50
|
class="mx-4 caret-light-50 dark:caret-dark-50 text-light-100 dark:text-dark-100 placeholder:text-light-50 dark:placeholder:text-dark-50
|
||||||
bg-light-20 dark:bg-dark-20 appearance-none outline-none px-3 py-1 focus:shadow-raw transition-[box-shadow] focus:shadow-light-40 dark:focus:shadow-dark-40
|
bg-light-20 dark:bg-dark-20 appearance-none outline-none px-3 py-1 focus:shadow-raw transition-[box-shadow] focus:shadow-light-40 dark:focus:shadow-dark-40
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
<template>
|
||||||
|
<ProgressRoot class="my-2 relative overflow-hidden bg-light-25 dark:bg-dark-25 w-48 h-3 data-[shape=thin]:h-1 data-[shape=large]:h-6" :data-shape="shape" style="transform: translateZ(0)" >
|
||||||
|
<ProgressIndicator class="bg-light-50 dark:bg-dark-50 h-full w-0 transition-[width] ease-linear" :style="`transition-duration: ${delay}ms; width: ${progress ? 100 : 0}%`" />
|
||||||
|
</ProgressRoot>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
const { delay = 1500, decreasing = false, shape = 'normal' } = defineProps<{
|
||||||
|
delay?: number
|
||||||
|
decreasing?: boolean
|
||||||
|
shape?: 'thin' | 'normal' | 'large'
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const emit = defineEmits(['finish']);
|
||||||
|
|
||||||
|
const progress = ref(false);
|
||||||
|
nextTick(() => {
|
||||||
|
progress.value = true;
|
||||||
|
setTimeout(emit, delay, 'finish');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<TooltipRoot :delay-duration="delay">
|
<TooltipRoot :delay-duration="delay" :disabled="disabled">
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<span tabindex="0"><slot></slot></span>
|
<span tabindex="0"><slot></slot></span>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
|
|
@ -15,7 +15,8 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const { message, delay = 300, side } = defineProps<{
|
const { message, delay = 300, side } = defineProps<{
|
||||||
message: string
|
message: string
|
||||||
delay?: number
|
delay?: number,
|
||||||
|
disabled?: boolean
|
||||||
side?: 'left' | 'right' | 'top' | 'bottom'
|
side?: 'left' | 'right' | 'top' | 'bottom'
|
||||||
}>();
|
}>();
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,30 @@ export default defineNuxtConfig({
|
||||||
boxShadow: {
|
boxShadow: {
|
||||||
raw: '0 0 0 2px var(--tw-shadow-color)'
|
raw: '0 0 0 2px var(--tw-shadow-color)'
|
||||||
},
|
},
|
||||||
|
keyframes: {
|
||||||
|
slideDownAndFade: {
|
||||||
|
from: { opacity: '0', transform: 'translateY(-2px)' },
|
||||||
|
to: { opacity: '1', transform: 'translateY(0)' },
|
||||||
|
},
|
||||||
|
slideLeftAndFade: {
|
||||||
|
from: { opacity: '0', transform: 'translateX(2px)' },
|
||||||
|
to: { opacity: '1', transform: 'translateX(0)' },
|
||||||
|
},
|
||||||
|
slideUpAndFade: {
|
||||||
|
from: { opacity: '0', transform: 'translateY(2px)' },
|
||||||
|
to: { opacity: '1', transform: 'translateY(0)' },
|
||||||
|
},
|
||||||
|
slideRightAndFade: {
|
||||||
|
from: { opacity: '0', transform: 'translateX(-2px)' },
|
||||||
|
to: { opacity: '1', transform: 'translateX(0)' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
animation: {
|
||||||
|
slideDownAndFade: 'slideDownAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)',
|
||||||
|
slideLeftAndFade: 'slideLeftAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)',
|
||||||
|
slideUpAndFade: 'slideUpAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)',
|
||||||
|
slideRightAndFade: 'slideRightAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
colors: {
|
colors: {
|
||||||
transparent: 'transparent',
|
transparent: 'transparent',
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,25 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const open = ref(false), username = ref(""), price = ref(750);
|
const open = ref(false), username = ref(""), price = ref(750), disabled = ref(false);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
||||||
<Head>
|
<Head>
|
||||||
<Title>Accueil</Title>
|
<Title>Accueil</Title>
|
||||||
</Head>
|
</Head>
|
||||||
<div class="h-100 w-100 flex flex-1 flex-col justify-center items-center">
|
<div class="h-100 w-100 flex flex-1 flex-col justify-center items-center">
|
||||||
<div class="w-1/2 flex flex-1 flex-col justify-center items-center">
|
<div class="w-1/2 flex flex-1 flex-col justify-center items-center">
|
||||||
<Switch label="Test" />
|
<Switch label="Test" v-model="disabled" />
|
||||||
<SliderInput :label="`Prix: ${price.toFixed(2)}€`" :min="0" :max="1500" :step="0.25"
|
<SliderInput :disabled="disabled" :label="`Prix: ${price.toFixed(2)}€`" :min="0" :max="1500" :step="0.25"
|
||||||
v-model="price" />
|
v-model="price" />
|
||||||
<TextInput label="Saisir un pseudonyme" v-model="username" />
|
<TextInput label="Saisir un pseudonyme" :disabled="disabled" v-model="username" />
|
||||||
|
<NumberPicker label="Age" :disabled="disabled" />
|
||||||
<Separator decorative orientation="horizontal" class="h-px w-96 my-2 bg-light-30 dark:bg-dark-30" />
|
<Separator decorative orientation="horizontal" class="h-px w-96 my-2 bg-light-30 dark:bg-dark-30" />
|
||||||
<Tooltip message="Vas y, ajoute stp" side="top"><button @click="open = !!username && !open"
|
<HoverCard>
|
||||||
class="text-3xl font-extralight tracking-wide text-light-60 dark:text-dark-60">Ajouter</button>
|
<span>Texte</span>
|
||||||
</Tooltip>
|
<template v-slot:content>
|
||||||
<Toast v-model="open" :title="`Bienvenue ${username}`" content="Vous êtes maintenant connecté"
|
<div>Test de HoverCard</div>
|
||||||
:duration="5000" />
|
</template>
|
||||||
|
</HoverCard>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
Loading…
Reference in New Issue