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,72 @@
.v-badge {
display: inline-block;
line-height: 1;
}
.v-badge__badge {
align-items: center;
display: inline-flex;
border-radius: 10px;
font-size: 0.75rem;
font-weight: 500;
height: 1.25rem;
justify-content: center;
min-width: 20px;
padding: 4px 6px;
pointer-events: auto;
position: absolute;
text-align: center;
text-indent: 0;
transition: 0.225s cubic-bezier(0.4, 0, 0.2, 1);
white-space: nowrap;
background: rgb(var(--v-theme-surface-variant));
color: rgba(var(--v-theme-on-surface-variant), var(--v-high-emphasis-opacity));
}
.v-badge--bordered .v-badge__badge::after {
border-radius: inherit;
border-style: solid;
border-width: 2px;
bottom: 0;
color: rgb(var(--v-theme-background));
content: "";
left: 0;
position: absolute;
right: 0;
top: 0;
transform: scale(1.05);
}
.v-badge--dot .v-badge__badge {
border-radius: 4.5px;
height: 9px;
min-width: 0;
padding: 0;
width: 9px;
}
.v-badge--dot .v-badge__badge::after {
border-width: 1.5px;
}
.v-badge--inline .v-badge__badge {
position: relative;
vertical-align: middle;
}
.v-badge__badge .v-icon {
color: inherit;
font-size: 0.75rem;
margin: 0 -2px;
}
.v-badge__badge img,
.v-badge__badge .v-img {
height: 100%;
width: 100%;
}
.v-badge__wrapper {
display: flex;
position: relative;
}
.v-badge--inline .v-badge__wrapper {
align-items: center;
display: inline-flex;
justify-content: center;
margin: 0 4px;
}

View File

@ -0,0 +1,112 @@
import { withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow, createVNode as _createVNode } from "vue";
// Styles
import "./VBadge.css";
// Components
import { VIcon } from "../VIcon/index.mjs"; // Composables
import { useBackgroundColor, useTextColor } from "../../composables/color.mjs";
import { makeComponentProps } from "../../composables/component.mjs";
import { IconValue } from "../../composables/icons.mjs";
import { useLocale } from "../../composables/locale.mjs";
import { makeLocationProps, useLocation } from "../../composables/location.mjs";
import { makeRoundedProps, useRounded } from "../../composables/rounded.mjs";
import { makeTagProps } from "../../composables/tag.mjs";
import { makeThemeProps, useTheme } from "../../composables/theme.mjs";
import { makeTransitionProps, MaybeTransition } from "../../composables/transition.mjs"; // Utilities
import { toRef } from 'vue';
import { genericComponent, pickWithRest, propsFactory, useRender } from "../../util/index.mjs";
export const makeVBadgeProps = propsFactory({
bordered: Boolean,
color: String,
content: [Number, String],
dot: Boolean,
floating: Boolean,
icon: IconValue,
inline: Boolean,
label: {
type: String,
default: '$vuetify.badge'
},
max: [Number, String],
modelValue: {
type: Boolean,
default: true
},
offsetX: [Number, String],
offsetY: [Number, String],
textColor: String,
...makeComponentProps(),
...makeLocationProps({
location: 'top end'
}),
...makeRoundedProps(),
...makeTagProps(),
...makeThemeProps(),
...makeTransitionProps({
transition: 'scale-rotate-transition'
})
}, 'VBadge');
export const VBadge = genericComponent()({
name: 'VBadge',
inheritAttrs: false,
props: makeVBadgeProps(),
setup(props, ctx) {
const {
backgroundColorClasses,
backgroundColorStyles
} = useBackgroundColor(toRef(props, 'color'));
const {
roundedClasses
} = useRounded(props);
const {
t
} = useLocale();
const {
textColorClasses,
textColorStyles
} = useTextColor(toRef(props, 'textColor'));
const {
themeClasses
} = useTheme();
const {
locationStyles
} = useLocation(props, true, side => {
const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
return base + (['top', 'bottom'].includes(side) ? +(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? +(props.offsetX ?? 0) : 0);
});
useRender(() => {
const value = Number(props.content);
const content = !props.max || isNaN(value) ? props.content : value <= +props.max ? value : `${props.max}+`;
const [badgeAttrs, attrs] = pickWithRest(ctx.attrs, ['aria-atomic', 'aria-label', 'aria-live', 'role', 'title']);
return _createVNode(props.tag, _mergeProps({
"class": ['v-badge', {
'v-badge--bordered': props.bordered,
'v-badge--dot': props.dot,
'v-badge--floating': props.floating,
'v-badge--inline': props.inline
}, props.class]
}, attrs, {
"style": props.style
}), {
default: () => [_createVNode("div", {
"class": "v-badge__wrapper"
}, [ctx.slots.default?.(), _createVNode(MaybeTransition, {
"transition": props.transition
}, {
default: () => [_withDirectives(_createVNode("span", _mergeProps({
"class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
"style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
"aria-atomic": "true",
"aria-label": t(props.label, value),
"aria-live": "polite",
"role": "status"
}, badgeAttrs), [props.dot ? undefined : ctx.slots.badge ? ctx.slots.badge?.() : props.icon ? _createVNode(VIcon, {
"icon": props.icon
}, null) : content]), [[_vShow, props.modelValue]])]
})])]
});
});
return {};
}
});
//# sourceMappingURL=VBadge.mjs.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,73 @@
@use '../../styles/tools'
@use './variables' as *
.v-badge
display: inline-block
line-height: $badge-line-height
.v-badge__badge
align-items: center
display: inline-flex
border-radius: $badge-border-radius
font-size: $badge-font-size
font-weight: $badge-font-weight
height: $badge-height
justify-content: center
min-width: $badge-min-width
padding: $badge-padding
pointer-events: auto
position: absolute
text-align: center
text-indent: 0
transition: $badge-transition
white-space: nowrap
@include tools.theme($badge-theme...)
.v-badge--bordered &
&::after
border-radius: inherit
border-style: $badge-border-style
border-width: $badge-border-width
bottom: 0
color: $badge-border-color
content: ''
left: 0
position: absolute
right: 0
top: 0
transform: $badge-border-transform
.v-badge--dot &
border-radius: $badge-dot-border-radius
height: $badge-dot-height
min-width: 0
padding: 0
width: $badge-dot-width
&::after
border-width: $badge-dot-border-width
.v-badge--inline &
position: relative
vertical-align: $badge-inline-vertical-align
.v-icon
color: inherit
font-size: $badge-font-size
margin: $badge-icon-margin
img,
.v-img
height: 100%
width: 100%
.v-badge__wrapper
display: flex
position: relative
.v-badge--inline &
align-items: center
display: inline-flex
justify-content: center
margin: $badge-wrapper-margin

View File

@ -0,0 +1,32 @@
@use '../../styles/settings';
// VBadge
$badge-background: rgb(var(--v-theme-surface-variant)) !default;
$badge-color: rgba(var(--v-theme-on-surface-variant), var(--v-high-emphasis-opacity)) !default;
$badge-border-color: rgb(var(--v-theme-background)) !default;
$badge-border-radius: 10px !default;
$badge-border-style: solid !default;
$badge-border-transform: scale(1.05) !default;
$badge-border-width: 2px !default;
$badge-dot-border-radius: 4.5px !default;
$badge-dot-border-width: 1.5px !default;
$badge-dot-height: 9px !default;
$badge-dot-width: 9px !default;
$badge-font-family: settings.$body-font-family !default;
$badge-font-size: .75rem !default;
$badge-font-weight: 500 !default;
$badge-height: 1.25rem !default;
$badge-icon-margin: 0 -2px !default;
$badge-icon-padding: 4px 6px !default;
$badge-inline-vertical-align: middle !default;
$badge-line-height: 1 !default;
$badge-min-width: 20px !default;
$badge-padding: 4px 6px !default;
$badge-transition: .225s settings.$standard-easing !default;
$badge-wrapper-margin: 0 4px !default;
// Lists
$badge-theme: (
$badge-background,
$badge-color
) !default;

View File

@ -0,0 +1,336 @@
import * as vue from 'vue';
import { ComponentPropsOptions, ExtractPropTypes, JSXComponent, PropType } from 'vue';
declare const block: readonly ["top", "bottom"];
declare const inline: readonly ["start", "end", "left", "right"];
type Tblock = typeof block[number];
type Tinline = typeof inline[number];
type Anchor = Tblock | Tinline | 'center' | 'center center' | `${Tblock} ${Tinline | 'center'}` | `${Tinline} ${Tblock | 'center'}`;
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>;
declare const VBadge: {
new (...args: any[]): vue.CreateComponentPublicInstance<{
inline: boolean;
location: NonNullable<Anchor>;
transition: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
label: string;
style: vue.StyleValue;
tag: string;
dot: boolean;
floating: boolean;
modelValue: boolean;
bordered: boolean;
} & {
max?: string | number | undefined;
color?: string | undefined;
content?: string | number | undefined;
class?: any;
icon?: IconValue | undefined;
theme?: string | undefined;
rounded?: string | number | boolean | undefined;
offsetX?: string | number | undefined;
offsetY?: string | number | undefined;
textColor?: string | undefined;
} & {
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
default?: (() => vue.VNodeChild) | undefined;
badge?: (() => vue.VNodeChild) | undefined;
};
'v-slots'?: {
default?: false | (() => vue.VNodeChild) | undefined;
badge?: false | (() => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
"v-slot:badge"?: false | (() => vue.VNodeChild) | undefined;
}, {}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & {
inline: boolean;
location: NonNullable<Anchor>;
transition: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
label: string;
style: vue.StyleValue;
tag: string;
dot: boolean;
floating: boolean;
modelValue: boolean;
bordered: boolean;
} & {
max?: string | number | undefined;
color?: string | undefined;
content?: string | number | undefined;
class?: any;
icon?: IconValue | undefined;
theme?: string | undefined;
rounded?: string | number | boolean | undefined;
offsetX?: string | number | undefined;
offsetY?: string | number | undefined;
textColor?: string | undefined;
} & {
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
default?: (() => vue.VNodeChild) | undefined;
badge?: (() => vue.VNodeChild) | undefined;
};
'v-slots'?: {
default?: false | (() => vue.VNodeChild) | undefined;
badge?: false | (() => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
"v-slot:badge"?: false | (() => vue.VNodeChild) | undefined;
}, {
inline: boolean;
location: NonNullable<Anchor>;
transition: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
label: string;
style: vue.StyleValue;
tag: string;
dot: boolean;
rounded: string | number | boolean;
floating: boolean;
modelValue: boolean;
bordered: boolean;
}, true, {}, vue.SlotsType<Partial<{
default: () => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
badge: () => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
}>>, {
P: {};
B: {};
D: {};
C: {};
M: {};
Defaults: {};
}, {
inline: boolean;
location: NonNullable<Anchor>;
transition: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
label: string;
style: vue.StyleValue;
tag: string;
dot: boolean;
floating: boolean;
modelValue: boolean;
bordered: boolean;
} & {
max?: string | number | undefined;
color?: string | undefined;
content?: string | number | undefined;
class?: any;
icon?: IconValue | undefined;
theme?: string | undefined;
rounded?: string | number | boolean | undefined;
offsetX?: string | number | undefined;
offsetY?: string | number | undefined;
textColor?: string | undefined;
} & {
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
default?: (() => vue.VNodeChild) | undefined;
badge?: (() => vue.VNodeChild) | undefined;
};
'v-slots'?: {
default?: false | (() => vue.VNodeChild) | undefined;
badge?: false | (() => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
"v-slot:badge"?: false | (() => vue.VNodeChild) | undefined;
}, {}, {}, {}, {}, {
inline: boolean;
location: NonNullable<Anchor>;
transition: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
label: string;
style: vue.StyleValue;
tag: string;
dot: boolean;
rounded: string | number | boolean;
floating: boolean;
modelValue: boolean;
bordered: boolean;
}>;
__isFragment?: undefined;
__isTeleport?: undefined;
__isSuspense?: undefined;
} & vue.ComponentOptionsBase<{
inline: boolean;
location: NonNullable<Anchor>;
transition: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
label: string;
style: vue.StyleValue;
tag: string;
dot: boolean;
floating: boolean;
modelValue: boolean;
bordered: boolean;
} & {
max?: string | number | undefined;
color?: string | undefined;
content?: string | number | undefined;
class?: any;
icon?: IconValue | undefined;
theme?: string | undefined;
rounded?: string | number | boolean | undefined;
offsetX?: string | number | undefined;
offsetY?: string | number | undefined;
textColor?: string | undefined;
} & {
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
default?: (() => vue.VNodeChild) | undefined;
badge?: (() => vue.VNodeChild) | undefined;
};
'v-slots'?: {
default?: false | (() => vue.VNodeChild) | undefined;
badge?: false | (() => vue.VNodeChild) | undefined;
} | undefined;
} & {
"v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
"v-slot:badge"?: false | (() => vue.VNodeChild) | undefined;
}, {}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, string, {
inline: boolean;
location: NonNullable<Anchor>;
transition: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
label: string;
style: vue.StyleValue;
tag: string;
dot: boolean;
rounded: string | number | boolean;
floating: boolean;
modelValue: boolean;
bordered: boolean;
}, {}, string, vue.SlotsType<Partial<{
default: () => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
badge: () => vue.VNode<vue.RendererNode, vue.RendererElement, {
[key: string]: any;
}>[];
}>>> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & FilterPropsOptions<{
transition: Omit<{
type: vue.PropType<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
default: string;
validator: (val: unknown) => boolean;
}, "type" | "default"> & {
type: vue.PropType<NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>>;
default: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
};
theme: StringConstructor;
tag: {
type: StringConstructor;
default: string;
};
rounded: {
type: (StringConstructor | BooleanConstructor | NumberConstructor)[];
default: undefined;
};
location: {
type: vue.PropType<NonNullable<Anchor>>;
default: NonNullable<Anchor>;
};
class: vue.PropType<any>;
style: {
type: vue.PropType<vue.StyleValue>;
default: null;
};
bordered: BooleanConstructor;
color: StringConstructor;
content: (StringConstructor | NumberConstructor)[];
dot: BooleanConstructor;
floating: BooleanConstructor;
icon: vue.PropType<IconValue>;
inline: BooleanConstructor;
label: {
type: StringConstructor;
default: string;
};
max: (StringConstructor | NumberConstructor)[];
modelValue: {
type: BooleanConstructor;
default: boolean;
};
offsetX: (StringConstructor | NumberConstructor)[];
offsetY: (StringConstructor | NumberConstructor)[];
textColor: StringConstructor;
}, vue.ExtractPropTypes<{
transition: Omit<{
type: vue.PropType<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
default: string;
validator: (val: unknown) => boolean;
}, "type" | "default"> & {
type: vue.PropType<NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>>;
default: NonNullable<string | boolean | (vue.TransitionProps & {
component?: vue.Component | undefined;
})>;
};
theme: StringConstructor;
tag: {
type: StringConstructor;
default: string;
};
rounded: {
type: (StringConstructor | BooleanConstructor | NumberConstructor)[];
default: undefined;
};
location: {
type: vue.PropType<NonNullable<Anchor>>;
default: NonNullable<Anchor>;
};
class: vue.PropType<any>;
style: {
type: vue.PropType<vue.StyleValue>;
default: null;
};
bordered: BooleanConstructor;
color: StringConstructor;
content: (StringConstructor | NumberConstructor)[];
dot: BooleanConstructor;
floating: BooleanConstructor;
icon: vue.PropType<IconValue>;
inline: BooleanConstructor;
label: {
type: StringConstructor;
default: string;
};
max: (StringConstructor | NumberConstructor)[];
modelValue: {
type: BooleanConstructor;
default: boolean;
};
offsetX: (StringConstructor | NumberConstructor)[];
offsetY: (StringConstructor | NumberConstructor)[];
textColor: StringConstructor;
}>>;
type VBadge = InstanceType<typeof VBadge>;
export { VBadge };

View File

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

View File

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