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,103 @@
.v-progress-circular {
align-items: center;
display: inline-flex;
justify-content: center;
position: relative;
vertical-align: middle;
}
.v-progress-circular > svg {
width: 100%;
height: 100%;
margin: auto;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 0;
}
.v-progress-circular__content {
align-items: center;
display: flex;
justify-content: center;
}
.v-progress-circular__underlay {
color: rgba(var(--v-border-color), var(--v-border-opacity));
stroke: currentColor;
z-index: 1;
}
.v-progress-circular__overlay {
stroke: currentColor;
transition: all 0.2s ease-in-out, stroke-width 0s;
z-index: 2;
}
.v-progress-circular--size-x-small {
height: 16px;
width: 16px;
}
.v-progress-circular--size-small {
height: 24px;
width: 24px;
}
.v-progress-circular--size-default {
height: 32px;
width: 32px;
}
.v-progress-circular--size-large {
height: 48px;
width: 48px;
}
.v-progress-circular--size-x-large {
height: 64px;
width: 64px;
}
.v-progress-circular--indeterminate > svg {
animation: progress-circular-rotate 1.4s linear infinite;
transform-origin: center center;
transition: all 0.2s ease-in-out;
}
.v-progress-circular--indeterminate .v-progress-circular__overlay {
animation: progress-circular-dash 1.4s ease-in-out infinite, progress-circular-rotate 1.4s linear infinite;
stroke-dasharray: 25, 200;
stroke-dashoffset: 0;
stroke-linecap: round;
transform-origin: center center;
transform: rotate(-90deg);
}
.v-progress-circular--disable-shrink > svg {
animation-duration: 0.7s;
}
.v-progress-circular--disable-shrink .v-progress-circular__overlay {
animation: none;
}
.v-progress-circular--indeterminate:not(.v-progress-circular--visible) > svg,
.v-progress-circular--indeterminate:not(.v-progress-circular--visible) .v-progress-circular__overlay {
animation-play-state: paused !important;
}
@keyframes progress-circular-dash {
0% {
stroke-dasharray: 1, 200;
stroke-dashoffset: 0px;
}
50% {
stroke-dasharray: 100, 200;
stroke-dashoffset: -15px;
}
100% {
stroke-dasharray: 100, 200;
stroke-dashoffset: -124px;
}
}
@keyframes progress-circular-rotate {
100% {
transform: rotate(270deg);
}
}

View File

@ -0,0 +1,131 @@
import { createVNode as _createVNode } from "vue";
// Styles
import "./VProgressCircular.css";
// Composables
import { useTextColor } from "../../composables/color.mjs";
import { makeComponentProps } from "../../composables/component.mjs";
import { useIntersectionObserver } from "../../composables/intersectionObserver.mjs";
import { useResizeObserver } from "../../composables/resizeObserver.mjs";
import { makeSizeProps, useSize } from "../../composables/size.mjs";
import { makeTagProps } from "../../composables/tag.mjs";
import { makeThemeProps, provideTheme } from "../../composables/theme.mjs"; // Utilities
import { computed, ref, toRef, watchEffect } from 'vue';
import { convertToUnit, genericComponent, propsFactory, useRender } from "../../util/index.mjs"; // Types
export const makeVProgressCircularProps = propsFactory({
bgColor: String,
color: String,
indeterminate: [Boolean, String],
modelValue: {
type: [Number, String],
default: 0
},
rotate: {
type: [Number, String],
default: 0
},
width: {
type: [Number, String],
default: 4
},
...makeComponentProps(),
...makeSizeProps(),
...makeTagProps({
tag: 'div'
}),
...makeThemeProps()
}, 'VProgressCircular');
export const VProgressCircular = genericComponent()({
name: 'VProgressCircular',
props: makeVProgressCircularProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const MAGIC_RADIUS_CONSTANT = 20;
const CIRCUMFERENCE = 2 * Math.PI * MAGIC_RADIUS_CONSTANT;
const root = ref();
const {
themeClasses
} = provideTheme(props);
const {
sizeClasses,
sizeStyles
} = useSize(props);
const {
textColorClasses,
textColorStyles
} = useTextColor(toRef(props, 'color'));
const {
textColorClasses: underlayColorClasses,
textColorStyles: underlayColorStyles
} = useTextColor(toRef(props, 'bgColor'));
const {
intersectionRef,
isIntersecting
} = useIntersectionObserver();
const {
resizeRef,
contentRect
} = useResizeObserver();
const normalizedValue = computed(() => Math.max(0, Math.min(100, parseFloat(props.modelValue))));
const width = computed(() => Number(props.width));
const size = computed(() => {
// Get size from element if size prop value is small, large etc
return sizeStyles.value ? Number(props.size) : contentRect.value ? contentRect.value.width : Math.max(width.value, 32);
});
const diameter = computed(() => MAGIC_RADIUS_CONSTANT / (1 - width.value / size.value) * 2);
const strokeWidth = computed(() => width.value / size.value * diameter.value);
const strokeDashOffset = computed(() => convertToUnit((100 - normalizedValue.value) / 100 * CIRCUMFERENCE));
watchEffect(() => {
intersectionRef.value = root.value;
resizeRef.value = root.value;
});
useRender(() => _createVNode(props.tag, {
"ref": root,
"class": ['v-progress-circular', {
'v-progress-circular--indeterminate': !!props.indeterminate,
'v-progress-circular--visible': isIntersecting.value,
'v-progress-circular--disable-shrink': props.indeterminate === 'disable-shrink'
}, themeClasses.value, sizeClasses.value, textColorClasses.value, props.class],
"style": [sizeStyles.value, textColorStyles.value, props.style],
"role": "progressbar",
"aria-valuemin": "0",
"aria-valuemax": "100",
"aria-valuenow": props.indeterminate ? undefined : normalizedValue.value
}, {
default: () => [_createVNode("svg", {
"style": {
transform: `rotate(calc(-90deg + ${Number(props.rotate)}deg))`
},
"xmlns": "http://www.w3.org/2000/svg",
"viewBox": `0 0 ${diameter.value} ${diameter.value}`
}, [_createVNode("circle", {
"class": ['v-progress-circular__underlay', underlayColorClasses.value],
"style": underlayColorStyles.value,
"fill": "transparent",
"cx": "50%",
"cy": "50%",
"r": MAGIC_RADIUS_CONSTANT,
"stroke-width": strokeWidth.value,
"stroke-dasharray": CIRCUMFERENCE,
"stroke-dashoffset": 0
}, null), _createVNode("circle", {
"class": "v-progress-circular__overlay",
"fill": "transparent",
"cx": "50%",
"cy": "50%",
"r": MAGIC_RADIUS_CONSTANT,
"stroke-width": strokeWidth.value,
"stroke-dasharray": CIRCUMFERENCE,
"stroke-dashoffset": strokeDashOffset.value
}, null)]), slots.default && _createVNode("div", {
"class": "v-progress-circular__content"
}, [slots.default({
value: normalizedValue.value
})])]
}));
return {};
}
});
//# sourceMappingURL=VProgressCircular.mjs.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,89 @@
@use 'sass:list'
@use '../../styles/settings'
@use './variables' as *
// Elements
.v-progress-circular
align-items: center
display: inline-flex
justify-content: center
position: relative
vertical-align: middle
> svg
width: 100%
height: 100%
margin: auto
position: absolute
top: 0
bottom: 0
left: 0
right: 0
z-index: 0
.v-progress-circular__content
align-items: center
display: flex
justify-content: center
.v-progress-circular__underlay
color: $progress-circular-underlay-color
stroke: currentColor
z-index: 1
.v-progress-circular__overlay
stroke: currentColor
transition: $progress-circular-overlay-transition
z-index: 2
// Modifiers
.v-progress-circular
@each $name, $multiplier in $progress-circular-sizes
$size: $progress-circular-size + (settings.$size-scale * $multiplier)
&--size-#{$name}
height: $size
width: $size
.v-progress-circular--indeterminate
> svg
animation: $progress-circular-rotate-animation
transform-origin: center center
transition: $progress-circular-intermediate-svg-transition
.v-progress-circular__overlay
animation: $progress-circular-rotate-dash, $progress-circular-rotate-animation
stroke-dasharray: 25, 200
stroke-dashoffset: 0
stroke-linecap: round
transform-origin: center center
transform: $progress-circular-overlay-transform
.v-progress-circular--disable-shrink
> svg
animation-duration: list.nth($progress-circular-rotate-animation, 2) * .5
.v-progress-circular__overlay
animation: none
.v-progress-circular--indeterminate:not(.v-progress-circular--visible)
> svg,
.v-progress-circular__overlay
animation-play-state: paused !important
@keyframes progress-circular-dash
0%
stroke-dasharray: 1, 200
stroke-dashoffset: 0px
50%
stroke-dasharray: 100, 200
stroke-dashoffset: -15px
100%
stroke-dasharray: 100, 200
stroke-dashoffset: -124px
@keyframes progress-circular-rotate
100%
transform: rotate(270deg)

View File

@ -0,0 +1,17 @@
// VProgressCircular
$progress-circular-intermediate-svg-transition: all 0.2s ease-in-out !default;
$progress-circular-overlay-transition: all 0.2s ease-in-out, stroke-width 0s !default;
$progress-circular-overlay-transform: rotate(calc(-90deg)) !default;
$progress-circular-rotate-animation: progress-circular-rotate 1.4s linear infinite !default;
$progress-circular-rotate-dash: progress-circular-dash 1.4s ease-in-out infinite !default;
$progress-circular-size: 32px !default;
$progress-circular-underlay-color: rgba(var(--v-border-color), var(--v-border-opacity)) !default;
// Lists
$progress-circular-sizes: (
'x-small': -2,
'small': -1,
'default': 0,
'large': 2,
'x-large': 4
) !default;

View File

@ -0,0 +1,242 @@
import * as vue from 'vue';
import { ComponentPropsOptions, ExtractPropTypes, PropType } from 'vue';
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>>;
}
declare const VProgressCircular: {
new (...args: any[]): vue.CreateComponentPublicInstance<{
width: string | number;
rotate: string | number;
style: vue.StyleValue;
size: string | number;
tag: string;
modelValue: string | number;
} & {
color?: string | undefined;
class?: any;
indeterminate?: boolean | "disable-shrink" | undefined;
theme?: string | undefined;
bgColor?: string | undefined;
} & {
$children?: vue.VNodeChild | {
default?: ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
} | ((arg: {
value: number;
}) => vue.VNodeChild);
'v-slots'?: {
default?: false | ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
}, {}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & {
width: string | number;
rotate: string | number;
style: vue.StyleValue;
size: string | number;
tag: string;
modelValue: string | number;
} & {
color?: string | undefined;
class?: any;
indeterminate?: boolean | "disable-shrink" | undefined;
theme?: string | undefined;
bgColor?: string | undefined;
} & {
$children?: vue.VNodeChild | {
default?: ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
} | ((arg: {
value: number;
}) => vue.VNodeChild);
'v-slots'?: {
default?: false | ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
}, {
width: string | number;
rotate: string | number;
style: vue.StyleValue;
size: string | number;
tag: string;
modelValue: string | number;
}, true, {}, vue.SlotsType<Partial<{
default: (arg: {
value: number;
}) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
}>>, {
P: {};
B: {};
D: {};
C: {};
M: {};
Defaults: {};
}, {
width: string | number;
rotate: string | number;
style: vue.StyleValue;
size: string | number;
tag: string;
modelValue: string | number;
} & {
color?: string | undefined;
class?: any;
indeterminate?: boolean | "disable-shrink" | undefined;
theme?: string | undefined;
bgColor?: string | undefined;
} & {
$children?: vue.VNodeChild | {
default?: ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
} | ((arg: {
value: number;
}) => vue.VNodeChild);
'v-slots'?: {
default?: false | ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
}, {}, {}, {}, {}, {
width: string | number;
rotate: string | number;
style: vue.StyleValue;
size: string | number;
tag: string;
modelValue: string | number;
}>;
__isFragment?: undefined;
__isTeleport?: undefined;
__isSuspense?: undefined;
} & vue.ComponentOptionsBase<{
width: string | number;
rotate: string | number;
style: vue.StyleValue;
size: string | number;
tag: string;
modelValue: string | number;
} & {
color?: string | undefined;
class?: any;
indeterminate?: boolean | "disable-shrink" | undefined;
theme?: string | undefined;
bgColor?: string | undefined;
} & {
$children?: vue.VNodeChild | {
default?: ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
} | ((arg: {
value: number;
}) => vue.VNodeChild);
'v-slots'?: {
default?: false | ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | ((arg: {
value: number;
}) => vue.VNodeChild) | undefined;
}, {}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, string, {
width: string | number;
rotate: string | number;
style: vue.StyleValue;
size: string | number;
tag: string;
modelValue: string | number;
}, {}, string, vue.SlotsType<Partial<{
default: (arg: {
value: number;
}) => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
}>>> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & FilterPropsOptions<{
theme: StringConstructor;
tag: Omit<{
type: StringConstructor;
default: string;
}, "type" | "default"> & {
type: PropType<string>;
default: string;
};
size: {
type: (StringConstructor | NumberConstructor)[];
default: string;
};
class: PropType<any>;
style: {
type: PropType<vue.StyleValue>;
default: null;
};
bgColor: StringConstructor;
color: StringConstructor;
indeterminate: PropType<boolean | "disable-shrink">;
modelValue: {
type: (StringConstructor | NumberConstructor)[];
default: number;
};
rotate: {
type: (StringConstructor | NumberConstructor)[];
default: number;
};
width: {
type: (StringConstructor | NumberConstructor)[];
default: number;
};
}, vue.ExtractPropTypes<{
theme: StringConstructor;
tag: Omit<{
type: StringConstructor;
default: string;
}, "type" | "default"> & {
type: PropType<string>;
default: string;
};
size: {
type: (StringConstructor | NumberConstructor)[];
default: string;
};
class: PropType<any>;
style: {
type: PropType<vue.StyleValue>;
default: null;
};
bgColor: StringConstructor;
color: StringConstructor;
indeterminate: PropType<boolean | "disable-shrink">;
modelValue: {
type: (StringConstructor | NumberConstructor)[];
default: number;
};
rotate: {
type: (StringConstructor | NumberConstructor)[];
default: number;
};
width: {
type: (StringConstructor | NumberConstructor)[];
default: number;
};
}>>;
type VProgressCircular = InstanceType<typeof VProgressCircular>;
export { VProgressCircular };

View File

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

View File

@ -0,0 +1 @@
{"version":3,"file":"index.mjs","names":["VProgressCircular"],"sources":["../../../src/components/VProgressCircular/index.ts"],"sourcesContent":["export { VProgressCircular } from './VProgressCircular'\n"],"mappings":"SAASA,iBAAiB"}