@m11g/library 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist-C8cpIyO1.js +3039 -0
- package/dist/library.css +2 -0
- package/dist/library.js +4057 -0
- package/dist/library.umd.cjs +3 -0
- package/package.json +13 -1
- package/.editorconfig +0 -8
- package/.gitattributes +0 -1
- package/.oxfmtrc.json +0 -5
- package/.oxlintrc.json +0 -10
- package/.stylelintrc +0 -33
- package/.vscode/extensions.json +0 -8
- package/env.d.ts +0 -1
- package/eslint.config.ts +0 -35
- package/index.html +0 -13
- package/postcss.config.ts +0 -23
- package/src/App.vue +0 -28
- package/src/assets/css/base.css +0 -2
- package/src/assets/css/elements/_base.css +0 -5
- package/src/assets/css/elements/buttons.css +0 -23
- package/src/assets/css/elements/form.css +0 -75
- package/src/assets/css/elements/scaffolding.css +0 -62
- package/src/assets/css/elements/transition.css +0 -4
- package/src/assets/css/elements/typography.css +0 -80
- package/src/assets/css/media-queries/media-queries.css +0 -3
- package/src/assets/css/mixins/list-reset.css +0 -5
- package/src/assets/css/variables/_base.css +0 -7
- package/src/assets/css/variables/chakra.css +0 -160
- package/src/assets/css/variables/colors.css +0 -205
- package/src/assets/css/variables/grid.css +0 -6
- package/src/assets/css/variables/spacings.css +0 -10
- package/src/assets/css/variables/transitions.css +0 -10
- package/src/assets/css/variables/typography.css +0 -17
- package/src/components/AppBreadcrumb.vue +0 -63
- package/src/components/AppButton.vue +0 -105
- package/src/components/AppCarousel.vue +0 -145
- package/src/components/AppDialog.vue +0 -126
- package/src/components/AppNotification.vue +0 -68
- package/src/components/AppPagination.vue +0 -127
- package/src/components/AppPopover.vue +0 -57
- package/src/components/AppTabs.vue +0 -176
- package/src/components/CenterWrapper.vue +0 -50
- package/src/components/ClickableWrapper.vue +0 -48
- package/src/components/Forms/AppForm.vue +0 -61
- package/src/components/Forms/FormErrorMessage.vue +0 -17
- package/src/components/Forms/FormField.vue +0 -30
- package/src/components/Forms/FormFieldset.vue +0 -28
- package/src/components/Forms/RadioGroup.vue +0 -85
- package/src/components/Forms/SearchField.vue +0 -38
- package/src/components/Forms/SelectField.vue +0 -125
- package/src/components/Forms/TextField.vue +0 -41
- package/src/components/Forms/TextareaField.vue +0 -32
- package/src/components/ScrollSpy.vue +0 -111
- package/src/components/SummaryDetails.vue +0 -83
- package/src/composables/useTheme.ts +0 -20
- package/src/index.ts +0 -47
- package/src/main.ts +0 -10
- package/src/router/index.ts +0 -26
- package/src/types/Theme.ts +0 -11
- package/src/views/CarouselView.vue +0 -27
- package/src/views/FormView.vue +0 -111
- package/src/views/HomeView.vue +0 -100
- package/src/views/ScrollSpyView.vue +0 -58
- package/theme-dark +0 -117
- package/theme-light +0 -191
- package/tsconfig.app.json +0 -18
- package/tsconfig.json +0 -11
- package/tsconfig.node.json +0 -28
- package/vite.config.ts +0 -26
- /package/{public → dist}/favicon.ico +0 -0
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
--font-size-base: clamp(16px, 2.75vw, 18px);
|
|
3
|
-
--scale-base: 1rem;
|
|
4
|
-
--scale-ratio: 1.1;
|
|
5
|
-
--font-size-h1: calc(var(--scale-base) * pow(var(--scale-ratio), 4));
|
|
6
|
-
--font-size-h2: calc(var(--scale-base) * pow(var(--scale-ratio), 3));
|
|
7
|
-
--font-size-h3: calc(var(--scale-base) * pow(var(--scale-ratio), 2));
|
|
8
|
-
--font-size-h4: calc(var(--scale-base) * pow(var(--scale-ratio), 1));
|
|
9
|
-
--font-size-sm: calc(var(--scale-base) * pow(var(--scale-ratio), -1));
|
|
10
|
-
--line-height: 1.5;
|
|
11
|
-
--line-height-heading: 1.1;
|
|
12
|
-
--font-family: "Domine", arial, helvetica, sans-serif;
|
|
13
|
-
--font-family-heading: "Sora", var(--font-family);
|
|
14
|
-
--font-weight-normal: 400;
|
|
15
|
-
--font-weight-medium: 500;
|
|
16
|
-
--font-weight-bold: 700;
|
|
17
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import { RouterLink, type RouteLocationRaw } from "vue-router";
|
|
3
|
-
|
|
4
|
-
defineProps<{
|
|
5
|
-
pages: {
|
|
6
|
-
title: string;
|
|
7
|
-
to: RouteLocationRaw;
|
|
8
|
-
}[];
|
|
9
|
-
}>();
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<template>
|
|
13
|
-
<nav v-if="pages.length" aria-label="Breadcrumb" class="breadcrumb">
|
|
14
|
-
<ol>
|
|
15
|
-
<li v-for="(page, index) in pages" :key="page.title">
|
|
16
|
-
<router-link :aria-current="index === pages.length - 1 ? 'page' : undefined" :to="page.to">
|
|
17
|
-
{{ page.title }}
|
|
18
|
-
</router-link>
|
|
19
|
-
</li>
|
|
20
|
-
</ol>
|
|
21
|
-
</nav>
|
|
22
|
-
</template>
|
|
23
|
-
|
|
24
|
-
<style lang="css" scoped>
|
|
25
|
-
@scope (.breadcrumb) {
|
|
26
|
-
:scope {
|
|
27
|
-
margin-block-end: var(--spacing-4);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
ol {
|
|
31
|
-
display: flex;
|
|
32
|
-
gap: var(--spacing-2);
|
|
33
|
-
padding: 0;
|
|
34
|
-
margin: 0;
|
|
35
|
-
list-style: none outside;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
li {
|
|
39
|
-
display: flex;
|
|
40
|
-
gap: var(--spacing-2);
|
|
41
|
-
align-items: center;
|
|
42
|
-
|
|
43
|
-
&:not(:last-child)::after {
|
|
44
|
-
content: "/";
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
a {
|
|
49
|
-
&[aria-current="page"] {
|
|
50
|
-
color: var(--color-fg);
|
|
51
|
-
|
|
52
|
-
&:not(:hover) {
|
|
53
|
-
text-decoration: none;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
svg {
|
|
59
|
-
inline-size: 1.25em;
|
|
60
|
-
translate: 0 -1px;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
</style>
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import useTheme from "@/composables/useTheme";
|
|
3
|
-
import type { Theme } from "@/types/Theme";
|
|
4
|
-
import { computed, resolveComponent } from "vue";
|
|
5
|
-
import type { RouteLocationRaw } from "vue-router";
|
|
6
|
-
|
|
7
|
-
const props = withDefaults(
|
|
8
|
-
defineProps<{
|
|
9
|
-
to?: RouteLocationRaw;
|
|
10
|
-
type?: "submit" | "button";
|
|
11
|
-
variant?: "primary" | "ghost" | "secondary";
|
|
12
|
-
theme?: Theme
|
|
13
|
-
title: string;
|
|
14
|
-
disabled?: boolean;
|
|
15
|
-
}>(),
|
|
16
|
-
{
|
|
17
|
-
theme: undefined,
|
|
18
|
-
to: undefined,
|
|
19
|
-
variant: "primary",
|
|
20
|
-
type: "button",
|
|
21
|
-
disabled: false,
|
|
22
|
-
},
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
const { colors } = useTheme(props.theme);
|
|
26
|
-
|
|
27
|
-
const component = computed(() => {
|
|
28
|
-
if (props.to) {
|
|
29
|
-
return resolveComponent("RouterLink");
|
|
30
|
-
} else {
|
|
31
|
-
return "button";
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
</script>
|
|
36
|
-
|
|
37
|
-
<template>
|
|
38
|
-
<component
|
|
39
|
-
:is="component"
|
|
40
|
-
:to
|
|
41
|
-
:class="variant"
|
|
42
|
-
:type="component === 'button' ? type : undefined"
|
|
43
|
-
:disabled
|
|
44
|
-
>
|
|
45
|
-
{{ title }}
|
|
46
|
-
</component>
|
|
47
|
-
</template>
|
|
48
|
-
|
|
49
|
-
<style lang="css" scoped>
|
|
50
|
-
a,
|
|
51
|
-
button {
|
|
52
|
-
--btn-border-radius: 0.5em;
|
|
53
|
-
|
|
54
|
-
&.primary {
|
|
55
|
-
--btn-background-color: v-bind(colors.solid);
|
|
56
|
-
--btn-background-color-hover: v-bind(colors.emphasized);
|
|
57
|
-
--btn-text-color: v-bind(colors.contrast);
|
|
58
|
-
--focus-ring-color: v-bind(colors.focusRing);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
&.ghost {
|
|
62
|
-
--btn-background-color: transparant;
|
|
63
|
-
--btn-background-color-hover: v-bind(colors.subtle);
|
|
64
|
-
--btn-text-color: v-bind(colors.solid);
|
|
65
|
-
--btn-border-color: currentcolor;
|
|
66
|
-
--focus-ring-color: var(--btn-text-color);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
display: inline-block;
|
|
70
|
-
inline-size: auto;
|
|
71
|
-
padding: var(--spacing-2) var(--spacing-8);
|
|
72
|
-
font-family: var(--font-family-heading);
|
|
73
|
-
font-size: var(--font-size-base);
|
|
74
|
-
font-weight: var(--font-weight-bold);
|
|
75
|
-
line-height: var(--line-height-heading);
|
|
76
|
-
color: var(--btn-text-color);
|
|
77
|
-
text-align: center;
|
|
78
|
-
text-transform: uppercase;
|
|
79
|
-
text-decoration: none;
|
|
80
|
-
background-color: var(--btn-background-color);
|
|
81
|
-
border: 2px solid var(--btn-border-color);
|
|
82
|
-
border-radius: var(--btn-border-radius);
|
|
83
|
-
transition:
|
|
84
|
-
background-color var(--transition),
|
|
85
|
-
text-decoration var(--transition),
|
|
86
|
-
opacity var(--transition);
|
|
87
|
-
|
|
88
|
-
&:hover:not(:disabled) {
|
|
89
|
-
background-color: var(--btn-background-color-hover);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
&:active:not(:disabled) {
|
|
93
|
-
padding-block: calc(var(--spacing-2) + 1px) calc(var(--spacing-2) - 1px);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
&:focus-visible {
|
|
97
|
-
outline: var(--focus-ring-color) solid 2px;
|
|
98
|
-
outline-offset: 2px;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
button:disabled {
|
|
103
|
-
opacity: 0.5;
|
|
104
|
-
}
|
|
105
|
-
</style>
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import useTheme from "@/composables/useTheme";
|
|
3
|
-
import { computed } from "vue";
|
|
4
|
-
|
|
5
|
-
const props = defineProps<{
|
|
6
|
-
items: string[];
|
|
7
|
-
}>();
|
|
8
|
-
|
|
9
|
-
const total = computed(() => {
|
|
10
|
-
return props.items.length;
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
const { colors } = useTheme()
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<template>
|
|
17
|
-
<div class="wrapper">
|
|
18
|
-
<ul>
|
|
19
|
-
<li v-for="item in items" :key="item">
|
|
20
|
-
<slot :name="item" />
|
|
21
|
-
</li>
|
|
22
|
-
</ul>
|
|
23
|
-
</div>
|
|
24
|
-
</template>
|
|
25
|
-
|
|
26
|
-
<style lang="css" scoped>
|
|
27
|
-
.wrapper {
|
|
28
|
-
position: relative;
|
|
29
|
-
|
|
30
|
-
@supports (scroll-marker-group: after) {
|
|
31
|
-
margin-block-end: var(--spacing-12);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
ul {
|
|
36
|
-
display: grid;
|
|
37
|
-
grid-template-columns: repeat(v-bind(total), 100%);
|
|
38
|
-
gap: var(--spacing-2);
|
|
39
|
-
padding-inline-start: 0;
|
|
40
|
-
margin-block-end: var(--spacing-4);
|
|
41
|
-
list-style: none;
|
|
42
|
-
scroll-snap-type: x mandatory;
|
|
43
|
-
scrollbar-color: var(--chakra-colors-gray-400) transparent;
|
|
44
|
-
scrollbar-width: thin;
|
|
45
|
-
|
|
46
|
-
@supports (scroll-marker-group: after) {
|
|
47
|
-
margin-block-end: var(--spacing-2);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
&::scroll-button(*) {
|
|
51
|
-
position: absolute;
|
|
52
|
-
inset-block-start: 50%;
|
|
53
|
-
display: none;
|
|
54
|
-
inline-size: 1.5em;
|
|
55
|
-
aspect-ratio: 0.571;
|
|
56
|
-
margin-block-start: calc(var(--spacing-8) * -1);
|
|
57
|
-
cursor: pointer;
|
|
58
|
-
content: "";
|
|
59
|
-
background-color: var(--chakra-colors-gray-900);
|
|
60
|
-
border: 1px solid var(--chakra-colors-gray-300);
|
|
61
|
-
opacity: 0.7;
|
|
62
|
-
clip-path:
|
|
63
|
-
shape(
|
|
64
|
-
from 96.34% 44.96%,
|
|
65
|
-
curve by 0% 10.11% with 4.88% 2.79%/4.88% 7.32%,
|
|
66
|
-
line by -74.99% 42.84%,
|
|
67
|
-
curve by -17.69% 0% with -4.88% 2.79%/-12.81% 2.79%,
|
|
68
|
-
smooth by 0% -10.11% with -4.88% -7.32%,
|
|
69
|
-
line to 69.82% 50%,
|
|
70
|
-
line to 3.7% 12.2%,
|
|
71
|
-
curve by 0% -10.11% with -4.88% -2.79%/-4.88% -7.32%,
|
|
72
|
-
smooth by 17.69% 0% with 12.81% -2.79%,
|
|
73
|
-
line by 74.99% 42.84%,
|
|
74
|
-
close
|
|
75
|
-
);
|
|
76
|
-
transition: opacity var(--transition);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
&::scroll-button(*):hover,
|
|
80
|
-
&::scroll-button(*):focus {
|
|
81
|
-
opacity: 1;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
&::scroll-button(*):active {
|
|
85
|
-
translate: 0 1px;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
&::scroll-button(*):disabled {
|
|
89
|
-
opacity: 0.2;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
&::scroll-button(left) {
|
|
93
|
-
inset-inline-start: 1em;
|
|
94
|
-
rotate: 180deg;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
&::scroll-button(right) {
|
|
98
|
-
inset-inline-end: 1em;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
&:has(> li:nth-child(2)) {
|
|
102
|
-
overflow-x: scroll;
|
|
103
|
-
scroll-behavior: smooth;
|
|
104
|
-
scroll-marker-group: after;
|
|
105
|
-
|
|
106
|
-
&::scroll-button(left),
|
|
107
|
-
&::scroll-button(right) {
|
|
108
|
-
display: block;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
&::scroll-marker-group {
|
|
113
|
-
display: flex;
|
|
114
|
-
gap: var(--spacing-2);
|
|
115
|
-
place-content: center;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
li {
|
|
120
|
-
scroll-snap-align: center;
|
|
121
|
-
|
|
122
|
-
&::scroll-marker {
|
|
123
|
-
display: block;
|
|
124
|
-
inline-size: 0.5em;
|
|
125
|
-
block-size: 0.5em;
|
|
126
|
-
aspect-ratio: 1;
|
|
127
|
-
content: "";
|
|
128
|
-
background-color: var(--color-white);
|
|
129
|
-
border: 3px solid var(--color-white);
|
|
130
|
-
border-radius: 50%;
|
|
131
|
-
transition:
|
|
132
|
-
border var(--transition),
|
|
133
|
-
background var(--transition);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
&::scroll-marker:target-current,
|
|
137
|
-
&::scroll-marker:hover {
|
|
138
|
-
background-color: v-bind(colors.solid);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
&::scroll-marker:target-current {
|
|
142
|
-
border-color: v-bind(colors.solid);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
</style>
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import { Icon } from "@iconify/vue";
|
|
3
|
-
|
|
4
|
-
defineProps<{
|
|
5
|
-
id: string;
|
|
6
|
-
title: string;
|
|
7
|
-
}>();
|
|
8
|
-
</script>
|
|
9
|
-
|
|
10
|
-
<template>
|
|
11
|
-
<dialog :id="id" closedby="any">
|
|
12
|
-
<header>
|
|
13
|
-
<h2>{{ title }}</h2>
|
|
14
|
-
<button :commandfor="id" command="close" class="btn-close">
|
|
15
|
-
<icon icon="solar:close-circle-bold" />
|
|
16
|
-
</button>
|
|
17
|
-
</header>
|
|
18
|
-
<div class="content">
|
|
19
|
-
<slot />
|
|
20
|
-
</div>
|
|
21
|
-
</dialog>
|
|
22
|
-
</template>
|
|
23
|
-
|
|
24
|
-
<style lang="css">
|
|
25
|
-
dialog {
|
|
26
|
-
inline-size: calc(100vw - (var(--spacing-4) * 2));
|
|
27
|
-
max-inline-size: var(--container-size-md);
|
|
28
|
-
padding: 0;
|
|
29
|
-
overscroll-behavior: contain;
|
|
30
|
-
color: var(--color-fg);
|
|
31
|
-
background-color: var(--color-bg-panel);
|
|
32
|
-
border: 0;
|
|
33
|
-
border-radius: 0.25em;
|
|
34
|
-
box-shadow: var(--shadow);
|
|
35
|
-
transition:
|
|
36
|
-
display var(--transition) allow-discrete,
|
|
37
|
-
overlay var(--transition) allow-discrete;
|
|
38
|
-
animation: dialog-hide var(--transition);
|
|
39
|
-
|
|
40
|
-
&[open] {
|
|
41
|
-
animation: dialog-show var(--transition);
|
|
42
|
-
|
|
43
|
-
&::backdrop {
|
|
44
|
-
animation: backdrop-show var(--transition);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
::backdrop {
|
|
50
|
-
overflow: hidden;
|
|
51
|
-
overscroll-behavior: contain;
|
|
52
|
-
background-color: rgb(0 0 0 / 50%);
|
|
53
|
-
backdrop-filter: blur(0.25em);
|
|
54
|
-
animation: backdrop-hide var(--transition);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
@scope (dialog) {
|
|
58
|
-
svg {
|
|
59
|
-
font-size: 2em;
|
|
60
|
-
cursor: pointer;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
header {
|
|
64
|
-
position: sticky;
|
|
65
|
-
inset-block-start: 0;
|
|
66
|
-
display: flex;
|
|
67
|
-
gap: var(--spacing-2);
|
|
68
|
-
align-items: start;
|
|
69
|
-
justify-content: space-between;
|
|
70
|
-
padding: var(--spacing-2) var(--spacing-4) 0;
|
|
71
|
-
background-color: var(--color-panel-bg);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
.content {
|
|
75
|
-
padding: var(--spacing-4);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
@keyframes dialog-hide {
|
|
80
|
-
from {
|
|
81
|
-
opacity: 1;
|
|
82
|
-
translate: 0 0;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
to {
|
|
86
|
-
opacity: 0;
|
|
87
|
-
translate: 0 -1em;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
@keyframes dialog-show {
|
|
92
|
-
from {
|
|
93
|
-
opacity: 0;
|
|
94
|
-
translate: 0 -1em;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
to {
|
|
98
|
-
opacity: 1;
|
|
99
|
-
translate: 0 0;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
@keyframes backdrop-show {
|
|
104
|
-
from {
|
|
105
|
-
opacity: 0;
|
|
106
|
-
backdrop-filter: blur(0);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
to {
|
|
110
|
-
opacity: 1;
|
|
111
|
-
backdrop-filter: blur(0.25em);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
@keyframes backdrop-hide {
|
|
116
|
-
from {
|
|
117
|
-
opacity: 1;
|
|
118
|
-
backdrop-filter: blur(0.25em);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
to {
|
|
122
|
-
opacity: 0;
|
|
123
|
-
backdrop-filter: blur(0);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
</style>
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import { Icon } from "@iconify/vue";
|
|
3
|
-
import { computed, ref } from "vue";
|
|
4
|
-
|
|
5
|
-
const props = defineProps<{
|
|
6
|
-
title?: string;
|
|
7
|
-
variant: "error" | "info" | "success" | "warning";
|
|
8
|
-
}>();
|
|
9
|
-
|
|
10
|
-
const variantIcon = computed(() => {
|
|
11
|
-
switch (props.variant) {
|
|
12
|
-
case "error":
|
|
13
|
-
return "solar:danger-triangle-bold";
|
|
14
|
-
case "info":
|
|
15
|
-
return "solar:info-circle-bold";
|
|
16
|
-
case "warning":
|
|
17
|
-
return "solar:danger-circle-bold";
|
|
18
|
-
case "success":
|
|
19
|
-
default:
|
|
20
|
-
return "solar:check-circle-bold";
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
const colors = ref({
|
|
25
|
-
bg: `var(--color-bg-${props.variant})`,
|
|
26
|
-
fg: `var(--color-fg-${props.variant})`,
|
|
27
|
-
border: `var(--color-border-${props.variant})`,
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
</script>
|
|
31
|
-
|
|
32
|
-
<template>
|
|
33
|
-
<div class="notification" :class="variant">
|
|
34
|
-
<icon :icon="variantIcon" />
|
|
35
|
-
<div>
|
|
36
|
-
<div v-if="title" class="title">
|
|
37
|
-
{{ title }}
|
|
38
|
-
</div>
|
|
39
|
-
<slot />
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
</template>
|
|
43
|
-
|
|
44
|
-
<style lang="css" scoped>
|
|
45
|
-
.notification {
|
|
46
|
-
display: flex;
|
|
47
|
-
gap: var(--spacing-1);
|
|
48
|
-
padding: var(--spacing-2);
|
|
49
|
-
margin-block-end: var(--spacing-4);
|
|
50
|
-
color: v-bind(colors.fg);
|
|
51
|
-
background-color: v-bind(colors.bg);
|
|
52
|
-
border: 1px solid v-bind(colors.border);
|
|
53
|
-
border-inline-start-width: 0.25em;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.title {
|
|
57
|
-
font-weight: var(--font-weight-bold);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
svg {
|
|
61
|
-
--size: 1.25em;
|
|
62
|
-
|
|
63
|
-
flex: 0 0 auto;
|
|
64
|
-
inline-size: var(--size);
|
|
65
|
-
block-size: var(--size);
|
|
66
|
-
margin-block-start: 0.1em;
|
|
67
|
-
}
|
|
68
|
-
</style>
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import { computed } from "vue";
|
|
3
|
-
import { useRoute } from "vue-router";
|
|
4
|
-
|
|
5
|
-
defineProps<{
|
|
6
|
-
totalPages: number;
|
|
7
|
-
}>();
|
|
8
|
-
|
|
9
|
-
const route = useRoute();
|
|
10
|
-
|
|
11
|
-
const currentPage = computed(() => (route.query.page ? Number(route.query.page) : 1));
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<template>
|
|
15
|
-
<div v-if="totalPages > 1" class="paging">
|
|
16
|
-
<router-link
|
|
17
|
-
v-if="currentPage > 1"
|
|
18
|
-
:to="{
|
|
19
|
-
query: {
|
|
20
|
-
...route.query,
|
|
21
|
-
page: currentPage - 1,
|
|
22
|
-
},
|
|
23
|
-
}"
|
|
24
|
-
>
|
|
25
|
-
Vorige pagina
|
|
26
|
-
</router-link>
|
|
27
|
-
<span v-else>Vorige pagina</span>
|
|
28
|
-
<ul>
|
|
29
|
-
<li v-for="page in totalPages" :key="page" :class="{ current: page === currentPage }">
|
|
30
|
-
<router-link
|
|
31
|
-
:to="{
|
|
32
|
-
query: {
|
|
33
|
-
...route.query,
|
|
34
|
-
page,
|
|
35
|
-
},
|
|
36
|
-
}"
|
|
37
|
-
>
|
|
38
|
-
{{ page }}
|
|
39
|
-
</router-link>
|
|
40
|
-
</li>
|
|
41
|
-
</ul>
|
|
42
|
-
<router-link
|
|
43
|
-
v-if="currentPage < totalPages"
|
|
44
|
-
:to="{
|
|
45
|
-
query: {
|
|
46
|
-
...route.query,
|
|
47
|
-
page: currentPage + 1,
|
|
48
|
-
},
|
|
49
|
-
}"
|
|
50
|
-
>
|
|
51
|
-
Volgende pagina
|
|
52
|
-
</router-link>
|
|
53
|
-
<span v-else>Volgende pagina</span>
|
|
54
|
-
</div>
|
|
55
|
-
</template>
|
|
56
|
-
|
|
57
|
-
<style lang="css" scoped>
|
|
58
|
-
.paging {
|
|
59
|
-
display: flex;
|
|
60
|
-
flex-wrap: wrap;
|
|
61
|
-
gap: var(--spacing-2);
|
|
62
|
-
align-items: start;
|
|
63
|
-
justify-content: space-between;
|
|
64
|
-
font-family: var(--font-family-heading);
|
|
65
|
-
font-weight: var(--font-weight-medium);
|
|
66
|
-
line-height: var(--line-height-heading);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
ul {
|
|
70
|
-
@mixin list-reset;
|
|
71
|
-
|
|
72
|
-
display: flex;
|
|
73
|
-
gap: var(--spacing-2);
|
|
74
|
-
align-items: center;
|
|
75
|
-
justify-content: center;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
li {
|
|
79
|
-
display: none;
|
|
80
|
-
|
|
81
|
-
&:first-child,
|
|
82
|
-
&:last-child {
|
|
83
|
-
display: block;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
&:has(+ .current),
|
|
87
|
-
&:has(+ li + .current),
|
|
88
|
-
&.current {
|
|
89
|
-
&,
|
|
90
|
-
+ li,
|
|
91
|
-
+ li + li {
|
|
92
|
-
display: block;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
span,
|
|
98
|
-
a {
|
|
99
|
-
display: block;
|
|
100
|
-
padding: var(--spacing-1) var(--spacing-3);
|
|
101
|
-
text-decoration: none;
|
|
102
|
-
border: 1px solid currentcolor;
|
|
103
|
-
|
|
104
|
-
&:hover {
|
|
105
|
-
color: var(--color-black);
|
|
106
|
-
background-color: var(--color-white);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
span {
|
|
111
|
-
display: none;
|
|
112
|
-
visibility: hidden;
|
|
113
|
-
|
|
114
|
-
@media (--md) {
|
|
115
|
-
display: block;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
a {
|
|
120
|
-
display: block;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
.current a {
|
|
124
|
-
color: var(--color-black);
|
|
125
|
-
background-color: var(--color-white);
|
|
126
|
-
}
|
|
127
|
-
</style>
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import { computed, useId } from "vue";
|
|
3
|
-
|
|
4
|
-
const id = useId();
|
|
5
|
-
|
|
6
|
-
const anchor = computed(() => {
|
|
7
|
-
return `--${id}`;
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
defineOptions({
|
|
11
|
-
inheritAttrs: false,
|
|
12
|
-
});
|
|
13
|
-
</script>
|
|
14
|
-
|
|
15
|
-
<template>
|
|
16
|
-
<button :interestfor="id" :popovertarget="id" v-bind="$attrs"><slot name="anchor" /></button>
|
|
17
|
-
|
|
18
|
-
<div :id popover="hint"><slot /></div>
|
|
19
|
-
</template>
|
|
20
|
-
|
|
21
|
-
<style lang="css" scoped>
|
|
22
|
-
button {
|
|
23
|
-
anchor-name: v-bind(anchor);
|
|
24
|
-
interest-delay: 0s var(--transition-duration);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
[popover] {
|
|
28
|
-
position: absolute;
|
|
29
|
-
padding: var(--spacing-1) var(--spacing-2);
|
|
30
|
-
margin: var(--spacing-2);
|
|
31
|
-
position-area: top;
|
|
32
|
-
position-anchor: v-bind(anchor);
|
|
33
|
-
position-try-fallbacks: flip-block;
|
|
34
|
-
color: rgb(250 250 250);
|
|
35
|
-
zoom: 0.9;
|
|
36
|
-
background-color: rgb(17 17 17);
|
|
37
|
-
border: 1px solid rgb(39 39 42);
|
|
38
|
-
opacity: 0;
|
|
39
|
-
transition:
|
|
40
|
-
opacity var(--transition),
|
|
41
|
-
zoom var(--transition),
|
|
42
|
-
overlay allow-discrete,
|
|
43
|
-
display allow-discrete;
|
|
44
|
-
|
|
45
|
-
&:popover-open {
|
|
46
|
-
zoom: 1;
|
|
47
|
-
opacity: 1;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
@starting-style {
|
|
52
|
-
[popover]:popover-open {
|
|
53
|
-
zoom: 0.9;
|
|
54
|
-
opacity: 0;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
</style>
|