spoko-design-system 0.5.8 → 0.5.9
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/.astro/settings.json +4 -4
- package/.github/dependabot.yml +11 -11
- package/.github/todo.yml +3 -3
- package/.github/workflows/deploy.yml +39 -39
- package/.stackblitzrc +5 -5
- package/.vscode/extensions.json +5 -5
- package/.vscode/launch.json +11 -11
- package/.vscode/settings.json +5 -5
- package/LICENSE +21 -21
- package/README.md +114 -114
- package/astro-i18next.config.mjs +17 -17
- package/astro-i18next.config.ts +10 -10
- package/astro.config.mjs +86 -86
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/icon.config.ts +278 -278
- package/index.ts +65 -65
- package/package.json +124 -124
- package/public/fonts/lg.svg +53 -53
- package/public/fonts/vwhead-bold-demo.html +549 -549
- package/public/fonts/vwhead-regular-demo.html +549 -549
- package/public/fonts/vwtext-bold-demo.html +549 -549
- package/public/fonts/vwtext-regular-demo.html +549 -549
- package/public/github.svg +3 -3
- package/public/grid_dot.svg +4 -4
- package/public/linkedin.svg +44 -44
- package/public/locales/en/translation.json +8 -8
- package/public/locales/pl/translation.json +8 -8
- package/public/make-scrollable-code-focusable.js +3 -3
- package/public/pagefind.yml +3 -3
- package/public/polo.blue.svg +29 -29
- package/public/spoko.space.svg +71 -71
- package/public/twitter.svg +46 -46
- package/renovate.json +6 -6
- package/sandbox.config.json +11 -11
- package/src/MyComponent.astro +8 -8
- package/src/components/Badge.vue +19 -19
- package/src/components/Badges.vue +21 -21
- package/src/components/Breadcrumbs.vue +107 -107
- package/src/components/Button.vue +101 -101
- package/src/components/ButtonCopy.astro +183 -183
- package/src/components/ButtonCopy.vue +36 -36
- package/src/components/Card.astro +27 -27
- package/src/components/Carousel.astro +26 -26
- package/src/components/Category/CategoriesCarousel.astro +101 -101
- package/src/components/Category/CategoryDetails.astro +169 -169
- package/src/components/Category/CategorySidebarToggler.vue +9 -9
- package/src/components/Category/CategoryTile.astro +38 -38
- package/src/components/Category/CategoryViewToggler.astro +89 -89
- package/src/components/Category/SubCategoryLink.vue +19 -19
- package/src/components/Copyright.astro +12 -12
- package/src/components/Date.astro +7 -7
- package/src/components/Faq.astro +33 -33
- package/src/components/FaqItem.astro +80 -80
- package/src/components/FeaturesList.vue +41 -41
- package/src/components/FuckRussia.vue +62 -62
- package/src/components/HandDrive.astro +29 -29
- package/src/components/Header/Header.astro +210 -210
- package/src/components/Header/SkipToContent.astro +1 -1
- package/src/components/Headline.vue +48 -48
- package/src/components/Image.astro +30 -30
- package/src/components/Input.vue +34 -52
- package/src/components/LeftSidebar.astro +53 -53
- package/src/components/MainColors.vue +22 -22
- package/src/components/MainInput.vue +15 -15
- package/src/components/Modal.astro +27 -27
- package/src/components/PageContent.astro +5 -5
- package/src/components/PartNumber.vue +27 -27
- package/src/components/Post/PostCategories.astro +37 -37
- package/src/components/Post/PostCategories.vue +38 -38
- package/src/components/PostHeader.astro +103 -103
- package/src/components/PrCode.vue +141 -141
- package/src/components/Product/ProductButton.vue +18 -18
- package/src/components/Product/ProductCarousel.astro +35 -35
- package/src/components/Product/ProductCodes.vue +174 -174
- package/src/components/Product/ProductEngineType.vue +42 -42
- package/src/components/Product/ProductImage.astro +40 -40
- package/src/components/Product/ProductLink.astro +101 -101
- package/src/components/Product/ProductLink.vue +59 -59
- package/src/components/Product/ProductLinkInfo.astro +37 -37
- package/src/components/Product/ProductNumber.astro +60 -60
- package/src/components/ProductCarousel.astro +38 -38
- package/src/components/ProductCodes.vue +39 -39
- package/src/components/ProductDetailName.vue +52 -52
- package/src/components/ProductDetailsList.vue +65 -65
- package/src/components/ProductTile.astro +48 -48
- package/src/components/Quote.vue +23 -23
- package/src/components/ReloadPrompt.astro +50 -50
- package/src/components/SlimBanner.vue +72 -72
- package/src/components/Table.vue +32 -32
- package/src/components/TableOfContents.astro +15 -15
- package/src/components/Translations.vue +23 -23
- package/src/components/flags/FlagPL.vue +3 -3
- package/src/components/flags/FlagUA.vue +2 -2
- package/src/components/layout/Container.astro +7 -7
- package/src/components/layout/Header.astro +80 -80
- package/src/config.ts +56 -56
- package/src/design.config.ts +98 -98
- package/src/env.d.ts +6 -6
- package/src/layouts/Layout.astro +61 -61
- package/src/layouts/MainLayout.astro +81 -81
- package/src/layouts/partials/FooterCommon.astro +4 -4
- package/src/layouts/partials/HeadCommon.astro +44 -44
- package/src/layouts/partials/HeadSEO.astro +41 -41
- package/src/pages/components/badges.mdx +57 -57
- package/src/pages/components/breadcrumbs.mdx +139 -139
- package/src/pages/components/buttons.mdx +360 -360
- package/src/pages/components/card.mdx +294 -294
- package/src/pages/components/carousel.mdx +62 -62
- package/src/pages/components/copyright.mdx +42 -42
- package/src/pages/components/details-list.mdx +115 -115
- package/src/pages/components/features-list.mdx +37 -37
- package/src/pages/components/flags.mdx +49 -49
- package/src/pages/components/fuck-russia.mdx +39 -39
- package/src/pages/components/hand-drive.mdx +38 -38
- package/src/pages/components/headline.mdx +152 -152
- package/src/pages/components/icons.astro +135 -135
- package/src/pages/components/image.mdx +513 -513
- package/src/pages/components/input.mdx +368 -85
- package/src/pages/components/jumbotron.mdx +359 -359
- package/src/pages/components/modal.mdx +64 -64
- package/src/pages/components/post-header.mdx +60 -60
- package/src/pages/components/pr-code.mdx +65 -65
- package/src/pages/components/product-number.mdx +58 -58
- package/src/pages/components/product-tile.mdx +51 -51
- package/src/pages/components/quote.mdx +33 -33
- package/src/pages/components/slimbanner.mdx +35 -35
- package/src/pages/components/table.mdx +108 -108
- package/src/pages/core/colors.mdx +10 -10
- package/src/pages/core/grid.mdx +89 -89
- package/src/pages/core/introduction.mdx +77 -77
- package/src/pages/core/shadows.astro +20 -20
- package/src/pages/core/typography.astro +49 -49
- package/src/pages/index.astro +130 -130
- package/src/pages/patterns/introduction.mdx +60 -60
- package/src/pwa.ts +12 -12
- package/src/styles/_variables.scss +70 -70
- package/src/styles/base/base.css +184 -184
- package/src/styles/base/grid.css +92 -92
- package/src/styles/base/typography.css +70 -70
- package/src/styles/content.css +73 -73
- package/src/styles/main.css +7 -7
- package/src/types/Product.ts +31 -31
- package/src/types/astro.d.ts +3 -3
- package/src/utils/product/getPriceFormatted.ts +15 -15
- package/src/utils/product/getProductChecklist.ts +17 -17
- package/src/utils/product/useFormatProductNumber.ts +41 -41
- package/src/utils/seo/getShorterDescription.ts +14 -14
- package/src/utils/text/formatDate.ts +5 -5
- package/src/utils/text/formatLocaleNumber.ts +6 -6
- package/src/utils/text/formatPad.ts +12 -12
- package/src/utils/text/getNumberFormatted.ts +33 -33
- package/src/utils/text/getTranslatedLink.ts +5 -5
- package/src/utils/text.ts +19 -19
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +28 -28
- package/uno-config/index.ts +232 -114
- package/uno-config/theme/breakpoints.ts +9 -9
- package/uno-config/theme/colors.ts +64 -64
- package/uno-config/theme/dimensions.ts +17 -17
- package/uno-config/theme/effects.ts +14 -14
- package/uno-config/theme/grid.ts +10 -10
- package/uno-config/theme/index.ts +28 -28
- package/uno-config/theme/shortcuts/buttons.ts +53 -53
- package/uno-config/theme/shortcuts/components.ts +92 -92
- package/uno-config/theme/shortcuts/index.ts +20 -20
- package/uno-config/theme/shortcuts/inputs.ts +37 -17
- package/uno-config/theme/shortcuts/layout.ts +64 -64
- package/uno-config/theme/typography.ts +29 -29
- package/uno.config.ts +2 -2
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import type { PropType } from 'vue'
|
|
3
|
-
|
|
4
|
-
const props = defineProps({
|
|
5
|
-
as: {
|
|
6
|
-
type: String as PropType<'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div' | 'span'>,
|
|
7
|
-
default: 'span',
|
|
8
|
-
required: true,
|
|
9
|
-
},
|
|
10
|
-
textSize: {
|
|
11
|
-
type: String as PropType<'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | '8xl' | '9xl'>,
|
|
12
|
-
required: false,
|
|
13
|
-
default: null
|
|
14
|
-
},
|
|
15
|
-
underline: {
|
|
16
|
-
type: Boolean,
|
|
17
|
-
required: false,
|
|
18
|
-
default: false
|
|
19
|
-
}
|
|
20
|
-
})
|
|
21
|
-
</script>
|
|
22
|
-
|
|
23
|
-
<template>
|
|
24
|
-
<component :is="props.as" class="mb-2.5 flex sm:block md:flex items-center leading-none"
|
|
25
|
-
:class="`headline ${props.textSize ? `text-${props.textSize}` : 'text-xl'} ${props.underline ? 'headline--underline' : ''}`">
|
|
26
|
-
<slot />
|
|
27
|
-
</component>
|
|
28
|
-
</template>
|
|
29
|
-
|
|
30
|
-
<style>
|
|
31
|
-
.headline--underline {
|
|
32
|
-
@apply relative pb-4;
|
|
33
|
-
|
|
34
|
-
&:after {
|
|
35
|
-
@apply content-empty absolute left-0 bottom-0;
|
|
36
|
-
height: 3px;
|
|
37
|
-
width: 55px;
|
|
38
|
-
background-color: var(--clr-primary-400);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
&:before {
|
|
42
|
-
@apply content-empty absolute left-0 bottom-px h-px;
|
|
43
|
-
width: 95%;
|
|
44
|
-
max-width: 255px;
|
|
45
|
-
background-color: #64748b
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
</style>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { PropType } from 'vue'
|
|
3
|
+
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
as: {
|
|
6
|
+
type: String as PropType<'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div' | 'span'>,
|
|
7
|
+
default: 'span',
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
textSize: {
|
|
11
|
+
type: String as PropType<'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | '8xl' | '9xl'>,
|
|
12
|
+
required: false,
|
|
13
|
+
default: null
|
|
14
|
+
},
|
|
15
|
+
underline: {
|
|
16
|
+
type: Boolean,
|
|
17
|
+
required: false,
|
|
18
|
+
default: false
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<template>
|
|
24
|
+
<component :is="props.as" class="mb-2.5 flex sm:block md:flex items-center leading-none"
|
|
25
|
+
:class="`headline ${props.textSize ? `text-${props.textSize}` : 'text-xl'} ${props.underline ? 'headline--underline' : ''}`">
|
|
26
|
+
<slot />
|
|
27
|
+
</component>
|
|
28
|
+
</template>
|
|
29
|
+
|
|
30
|
+
<style>
|
|
31
|
+
.headline--underline {
|
|
32
|
+
@apply relative pb-4;
|
|
33
|
+
|
|
34
|
+
&:after {
|
|
35
|
+
@apply content-empty absolute left-0 bottom-0;
|
|
36
|
+
height: 3px;
|
|
37
|
+
width: 55px;
|
|
38
|
+
background-color: var(--clr-primary-400);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
&:before {
|
|
42
|
+
@apply content-empty absolute left-0 bottom-px h-px;
|
|
43
|
+
width: 95%;
|
|
44
|
+
max-width: 255px;
|
|
45
|
+
background-color: #64748b
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
</style>
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { Image } from "astro:assets";
|
|
3
|
-
|
|
4
|
-
const { imageObject } = Astro.props;
|
|
5
|
-
let inputProps = {};
|
|
6
|
-
|
|
7
|
-
if (imageObject.index && imageObject.index === 1) {
|
|
8
|
-
inputProps["data-pagefind-meta"] = "image[src], image_alt[alt]";
|
|
9
|
-
inputProps["loading"] = "eager";
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
if (imageObject.srcset && imageObject.srcset.length) {
|
|
13
|
-
inputProps["widths"] = imageObject.srcset;
|
|
14
|
-
}
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
<Image
|
|
18
|
-
src={imageObject.src}
|
|
19
|
-
alt={imageObject.alt}
|
|
20
|
-
height={imageObject.height}
|
|
21
|
-
width={imageObject.width}
|
|
22
|
-
itemprop="image"
|
|
23
|
-
format="avif"
|
|
24
|
-
data-pagefind-index-attrs="alt"
|
|
25
|
-
onerror="this.style.display='none';"
|
|
26
|
-
class={`h-full w-full select-none pointer-none ${
|
|
27
|
-
imageObject.class || "object-cover"
|
|
28
|
-
}`}
|
|
29
|
-
{...inputProps}
|
|
30
|
-
/>
|
|
1
|
+
---
|
|
2
|
+
import { Image } from "astro:assets";
|
|
3
|
+
|
|
4
|
+
const { imageObject } = Astro.props;
|
|
5
|
+
let inputProps = {};
|
|
6
|
+
|
|
7
|
+
if (imageObject.index && imageObject.index === 1) {
|
|
8
|
+
inputProps["data-pagefind-meta"] = "image[src], image_alt[alt]";
|
|
9
|
+
inputProps["loading"] = "eager";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (imageObject.srcset && imageObject.srcset.length) {
|
|
13
|
+
inputProps["widths"] = imageObject.srcset;
|
|
14
|
+
}
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
<Image
|
|
18
|
+
src={imageObject.src}
|
|
19
|
+
alt={imageObject.alt}
|
|
20
|
+
height={imageObject.height}
|
|
21
|
+
width={imageObject.width}
|
|
22
|
+
itemprop="image"
|
|
23
|
+
format="avif"
|
|
24
|
+
data-pagefind-index-attrs="alt"
|
|
25
|
+
onerror="this.style.display='none';"
|
|
26
|
+
class={`h-full w-full select-none pointer-none ${
|
|
27
|
+
imageObject.class || "object-cover"
|
|
28
|
+
}`}
|
|
29
|
+
{...inputProps}
|
|
30
|
+
/>
|
package/src/components/Input.vue
CHANGED
|
@@ -6,16 +6,16 @@ interface InputProps {
|
|
|
6
6
|
name?: string;
|
|
7
7
|
label: string;
|
|
8
8
|
variant?: 'filled' | 'standard';
|
|
9
|
-
type?: string;
|
|
10
|
-
modelValue?: string | number;
|
|
9
|
+
type?: string;
|
|
10
|
+
modelValue?: string | number;
|
|
11
11
|
required?: boolean;
|
|
12
|
-
rows?: number;
|
|
12
|
+
rows?: number;
|
|
13
13
|
placeholder?: string;
|
|
14
14
|
error?: string | boolean;
|
|
15
15
|
success?: string | boolean;
|
|
16
|
-
size?: 'sm' | 'md' | 'lg';
|
|
17
|
-
class?: string;
|
|
18
|
-
[key: string]: any;
|
|
16
|
+
size?: 'sm' | 'md' | 'lg';
|
|
17
|
+
class?: string;
|
|
18
|
+
[key: string]: any;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
const props = withDefaults(defineProps<InputProps>(), {
|
|
@@ -26,7 +26,7 @@ const props = withDefaults(defineProps<InputProps>(), {
|
|
|
26
26
|
modelValue: '',
|
|
27
27
|
required: false,
|
|
28
28
|
rows: 3,
|
|
29
|
-
placeholder: ' ', // space
|
|
29
|
+
placeholder: ' ', // space for "floating label"
|
|
30
30
|
error: false,
|
|
31
31
|
success: false,
|
|
32
32
|
size: 'md',
|
|
@@ -38,86 +38,72 @@ const emit = defineEmits(['update:modelValue', 'input', 'focus', 'blur']);
|
|
|
38
38
|
// Handle external attrs
|
|
39
39
|
const attrs = useAttrs();
|
|
40
40
|
|
|
41
|
-
// Compute wrapper class
|
|
41
|
+
// Compute wrapper class - uses existing shortcut
|
|
42
42
|
const wrapperClass = computed(() => `input-wrapper-${props.variant}`);
|
|
43
43
|
|
|
44
|
-
// Compute input classes
|
|
44
|
+
// Compute input classes - uses shortcuts
|
|
45
45
|
const inputClass = computed(() => {
|
|
46
|
-
|
|
47
|
-
const classes = ['input-base', `input-${props.variant}`];
|
|
46
|
+
const classes = ['input-base', 'input-placeholder', `input-${props.variant}`];
|
|
48
47
|
|
|
49
|
-
//
|
|
50
|
-
classes.push('[&:focus~label]:text-blue-light');
|
|
51
|
-
classes.push('[&:focus~label]:dark:text-blue-lightest');
|
|
52
|
-
classes.push('[&:focus~label]:scale-75');
|
|
53
|
-
classes.push('[&:placeholder-shown~label]:scale-100');
|
|
54
|
-
classes.push('[&:placeholder-shown~label]:translate-y-0');
|
|
55
|
-
classes.push('[&:not(:placeholder-shown)~label]:scale-75');
|
|
56
|
-
|
|
57
|
-
// Variant-specific behaviors
|
|
58
|
-
if (props.variant === 'standard') {
|
|
59
|
-
classes.push('[&:focus~label]:-translate-y-6');
|
|
60
|
-
classes.push('[&:focus~label]:start-0');
|
|
61
|
-
classes.push('[&:not(:placeholder-shown)~label]:-translate-y-6');
|
|
62
|
-
} else if (props.variant === 'filled') {
|
|
63
|
-
classes.push('[&:focus~label]:-translate-y-4');
|
|
64
|
-
classes.push('[&:not(:placeholder-shown)~label]:-translate-y-4');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Additional classes
|
|
48
|
+
// Add size class
|
|
68
49
|
if (props.size) classes.push(`input-${props.size}`);
|
|
50
|
+
|
|
51
|
+
// Add textarea class if needed
|
|
69
52
|
if (props.type === 'textarea') classes.push('input-textarea');
|
|
53
|
+
|
|
54
|
+
// Add status classes
|
|
70
55
|
if (props.error) classes.push('input-error');
|
|
71
56
|
else if (props.success) classes.push('input-success');
|
|
57
|
+
|
|
58
|
+
// Add custom classes
|
|
72
59
|
if (props.class) classes.push(props.class);
|
|
73
60
|
|
|
74
61
|
return classes.join(' ');
|
|
75
62
|
});
|
|
76
63
|
|
|
77
|
-
// Compute label classes -
|
|
64
|
+
// Compute label classes - using optimized shortcuts
|
|
78
65
|
const labelClass = computed(() => {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
66
|
+
const classes = [
|
|
67
|
+
// Base label style
|
|
68
|
+
'input-label-base',
|
|
69
|
+
|
|
70
|
+
// Position styling
|
|
71
|
+
`input-label-${props.variant}`,
|
|
72
|
+
|
|
73
|
+
// State styling - contains all transformations for the specific variant
|
|
74
|
+
`input-label-${props.variant}-state`
|
|
75
|
+
];
|
|
90
76
|
|
|
91
|
-
//
|
|
77
|
+
// Add size class
|
|
92
78
|
if (props.size) classes.push(`input-label-${props.size}`);
|
|
79
|
+
|
|
80
|
+
// Add status classes
|
|
93
81
|
if (props.error) classes.push('input-label-error');
|
|
94
82
|
else if (props.success) classes.push('input-label-success');
|
|
95
83
|
|
|
96
84
|
return classes.join(' ');
|
|
97
85
|
});
|
|
98
86
|
|
|
99
|
-
//
|
|
87
|
+
// Event handlers
|
|
100
88
|
const handleInput = (event: Event) => {
|
|
101
89
|
const target = event.target as HTMLInputElement | HTMLTextAreaElement;
|
|
102
90
|
emit('update:modelValue', target.value);
|
|
103
91
|
emit('input', event);
|
|
104
92
|
};
|
|
105
93
|
|
|
106
|
-
// Forward focus and blur events
|
|
107
94
|
const handleFocus = (event: FocusEvent) => emit('focus', event);
|
|
108
95
|
const handleBlur = (event: FocusEvent) => emit('blur', event);
|
|
109
96
|
</script>
|
|
110
97
|
|
|
111
98
|
<template>
|
|
112
99
|
<div :class="wrapperClass">
|
|
113
|
-
<!-- Textarea field -->
|
|
114
100
|
<textarea
|
|
115
101
|
v-if="type === 'textarea'"
|
|
116
102
|
:id="id"
|
|
117
103
|
:name="name || id"
|
|
118
104
|
:rows="rows"
|
|
119
105
|
:required="required"
|
|
120
|
-
:class="inputClass"
|
|
106
|
+
:class="inputClass + ' peer'"
|
|
121
107
|
:placeholder="placeholder"
|
|
122
108
|
:value="modelValue"
|
|
123
109
|
@input="handleInput"
|
|
@@ -126,14 +112,13 @@ const handleBlur = (event: FocusEvent) => emit('blur', event);
|
|
|
126
112
|
v-bind="attrs"
|
|
127
113
|
></textarea>
|
|
128
114
|
|
|
129
|
-
<!-- Input field -->
|
|
130
115
|
<input
|
|
131
116
|
v-else
|
|
132
117
|
:type="type"
|
|
133
118
|
:id="id"
|
|
134
119
|
:name="name || id"
|
|
135
120
|
:required="required"
|
|
136
|
-
:class="inputClass"
|
|
121
|
+
:class="inputClass + ' peer'"
|
|
137
122
|
:placeholder="placeholder"
|
|
138
123
|
:value="modelValue"
|
|
139
124
|
@input="handleInput"
|
|
@@ -142,7 +127,6 @@ const handleBlur = (event: FocusEvent) => emit('blur', event);
|
|
|
142
127
|
v-bind="attrs"
|
|
143
128
|
/>
|
|
144
129
|
|
|
145
|
-
<!-- Label with guaranteed correct transform origin -->
|
|
146
130
|
<label
|
|
147
131
|
:for="id"
|
|
148
132
|
:class="labelClass"
|
|
@@ -152,7 +136,6 @@ const handleBlur = (event: FocusEvent) => emit('blur', event);
|
|
|
152
136
|
<span v-if="required" class="text-red-500 ml-1">*</span>
|
|
153
137
|
</label>
|
|
154
138
|
|
|
155
|
-
<!-- Error message -->
|
|
156
139
|
<div
|
|
157
140
|
v-if="error && typeof error === 'string'"
|
|
158
141
|
class="input-error-message"
|
|
@@ -160,7 +143,6 @@ const handleBlur = (event: FocusEvent) => emit('blur', event);
|
|
|
160
143
|
{{ error }}
|
|
161
144
|
</div>
|
|
162
145
|
|
|
163
|
-
<!-- Success message -->
|
|
164
146
|
<div
|
|
165
147
|
v-if="success && typeof success === 'string'"
|
|
166
148
|
class="input-success-message"
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { SIDEBAR } from "../config";
|
|
3
|
-
import { Astronav, MenuItems } from "astro-navbar";
|
|
4
|
-
const { currentPage } = Astro.props;
|
|
5
|
-
const currentPageMatch = currentPage.slice(1);
|
|
6
|
-
|
|
7
|
-
const isCurrentPage = (item) => {
|
|
8
|
-
if (item.link) {
|
|
9
|
-
return item.link.includes(currentPageMatch);
|
|
10
|
-
}
|
|
11
|
-
return false;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const getLinkClasses = (link) => {
|
|
15
|
-
const baseClasses =
|
|
16
|
-
"block py-1.5 px-6 my-1 transition-colors border-l hover:border-slate-400 text-slate-500 hover:text-slate-900";
|
|
17
|
-
|
|
18
|
-
if (isCurrentPage(link)) {
|
|
19
|
-
return baseClasses + " border-slate-500 text-slate-900";
|
|
20
|
-
} else {
|
|
21
|
-
return baseClasses;
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
<Astronav>
|
|
27
|
-
<MenuItems
|
|
28
|
-
class="hidden z-20 bg-blue-gray-100 w-64 h-full overflow-y-auto px-4 border-r pb-3 absolute lg:(relative bg-blue-lightest bg-opacity-5 flex)"
|
|
29
|
-
>
|
|
30
|
-
<ul class="mt-0 mb-auto">
|
|
31
|
-
{
|
|
32
|
-
SIDEBAR.map((item) =>
|
|
33
|
-
item.header ? (
|
|
34
|
-
<h2 class="mt-4 font-semibold text-slate-700">{item.text}</h2>
|
|
35
|
-
) : (
|
|
36
|
-
<li class={getLinkClasses(item)}>
|
|
37
|
-
<a href={item.link}>{item.text}</a>
|
|
38
|
-
</li>
|
|
39
|
-
),
|
|
40
|
-
)
|
|
41
|
-
}
|
|
42
|
-
</ul>
|
|
43
|
-
</MenuItems>
|
|
44
|
-
</Astronav>
|
|
45
|
-
|
|
46
|
-
<script is:inline>
|
|
47
|
-
window.addEventListener("DOMContentLoaded", (event) => {
|
|
48
|
-
var target = document.querySelector('[aria-current="page"]');
|
|
49
|
-
if (target && target.offsetTop > window.innerHeight - 100) {
|
|
50
|
-
document.querySelector(".nav-groups").scrollTop = target.offsetTop;
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
</script>
|
|
1
|
+
---
|
|
2
|
+
import { SIDEBAR } from "../config";
|
|
3
|
+
import { Astronav, MenuItems } from "astro-navbar";
|
|
4
|
+
const { currentPage } = Astro.props;
|
|
5
|
+
const currentPageMatch = currentPage.slice(1);
|
|
6
|
+
|
|
7
|
+
const isCurrentPage = (item) => {
|
|
8
|
+
if (item.link) {
|
|
9
|
+
return item.link.includes(currentPageMatch);
|
|
10
|
+
}
|
|
11
|
+
return false;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const getLinkClasses = (link) => {
|
|
15
|
+
const baseClasses =
|
|
16
|
+
"block py-1.5 px-6 my-1 transition-colors border-l hover:border-slate-400 text-slate-500 hover:text-slate-900";
|
|
17
|
+
|
|
18
|
+
if (isCurrentPage(link)) {
|
|
19
|
+
return baseClasses + " border-slate-500 text-slate-900";
|
|
20
|
+
} else {
|
|
21
|
+
return baseClasses;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
<Astronav>
|
|
27
|
+
<MenuItems
|
|
28
|
+
class="hidden z-20 bg-blue-gray-100 w-64 h-full overflow-y-auto px-4 border-r pb-3 absolute lg:(relative bg-blue-lightest bg-opacity-5 flex)"
|
|
29
|
+
>
|
|
30
|
+
<ul class="mt-0 mb-auto">
|
|
31
|
+
{
|
|
32
|
+
SIDEBAR.map((item) =>
|
|
33
|
+
item.header ? (
|
|
34
|
+
<h2 class="mt-4 font-semibold text-slate-700">{item.text}</h2>
|
|
35
|
+
) : (
|
|
36
|
+
<li class={getLinkClasses(item)}>
|
|
37
|
+
<a href={item.link}>{item.text}</a>
|
|
38
|
+
</li>
|
|
39
|
+
),
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
</ul>
|
|
43
|
+
</MenuItems>
|
|
44
|
+
</Astronav>
|
|
45
|
+
|
|
46
|
+
<script is:inline>
|
|
47
|
+
window.addEventListener("DOMContentLoaded", (event) => {
|
|
48
|
+
var target = document.querySelector('[aria-current="page"]');
|
|
49
|
+
if (target && target.offsetTop > window.innerHeight - 100) {
|
|
50
|
+
document.querySelector(".nav-groups").scrollTop = target.offsetTop;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
</script>
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { colors } from "./../../uno-config/theme/colors";
|
|
3
|
-
|
|
4
|
-
// Get color categories
|
|
5
|
-
const colorCategories = Object.entries(colors);
|
|
6
|
-
</script>
|
|
7
|
-
|
|
8
|
-
<template>
|
|
9
|
-
<div class="flex flex-col space-y-12">
|
|
10
|
-
<div v-for="[category, shades] in colorCategories" :key="category">
|
|
11
|
-
<h3 class="capitalize">{{ category }}</h3>
|
|
12
|
-
<div class="grid grid-cols-3 md:grid-cols-9">
|
|
13
|
-
<div v-for="(value, name) in shades" :key="name" class="mb-6">
|
|
14
|
-
<div class="h-12 transition-all" :style="`background: ${value}`"></div>
|
|
15
|
-
<div class="text-sm flex flex-col text-center font-mono text-slate-500">
|
|
16
|
-
<span>{{ name }}</span>
|
|
17
|
-
<span class="uppercase text-xs">{{ value }}</span>
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
</div>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { colors } from "./../../uno-config/theme/colors";
|
|
3
|
+
|
|
4
|
+
// Get color categories
|
|
5
|
+
const colorCategories = Object.entries(colors);
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<div class="flex flex-col space-y-12">
|
|
10
|
+
<div v-for="[category, shades] in colorCategories" :key="category">
|
|
11
|
+
<h3 class="capitalize">{{ category }}</h3>
|
|
12
|
+
<div class="grid grid-cols-3 md:grid-cols-9">
|
|
13
|
+
<div v-for="(value, name) in shades" :key="name" class="mb-6">
|
|
14
|
+
<div class="h-12 transition-all" :style="`background: ${value}`"></div>
|
|
15
|
+
<div class="text-sm flex flex-col text-center font-mono text-slate-500">
|
|
16
|
+
<span>{{ name }}</span>
|
|
17
|
+
<span class="uppercase text-xs">{{ value }}</span>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
23
|
</template>
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
const props = defineProps<{
|
|
3
|
-
label: string;
|
|
4
|
-
}>();
|
|
5
|
-
</script>
|
|
6
|
-
|
|
7
|
-
<template>
|
|
8
|
-
<label class="group text-left w-full max-w-xs flex flex-col">
|
|
9
|
-
<span class="group-hover:text-blue-medium ml-2 text-slate-600 text-sm group-focus-within:text-blue-medium">{{ label
|
|
10
|
-
}}</span>
|
|
11
|
-
<input
|
|
12
|
-
class="group-hover:border-blue-lightest border px-4 py-2 transition-colors rounded-md w-full focus:ring focus:outline-none focus:border-blue-medium"
|
|
13
|
-
type="text" />
|
|
14
|
-
</label>
|
|
15
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps<{
|
|
3
|
+
label: string;
|
|
4
|
+
}>();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<template>
|
|
8
|
+
<label class="group text-left w-full max-w-xs flex flex-col">
|
|
9
|
+
<span class="group-hover:text-blue-medium ml-2 text-slate-600 text-sm group-focus-within:text-blue-medium">{{ label
|
|
10
|
+
}}</span>
|
|
11
|
+
<input
|
|
12
|
+
class="group-hover:border-blue-lightest border px-4 py-2 transition-colors rounded-md w-full focus:ring focus:outline-none focus:border-blue-medium"
|
|
13
|
+
type="text" />
|
|
14
|
+
</label>
|
|
15
|
+
</template>
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { id, open } = Astro.props;
|
|
3
|
-
import Button from "../components/Button.vue";
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
<style >
|
|
7
|
-
dialog {
|
|
8
|
-
@apply fixed top-0 left-0 right-0 bottom-0;
|
|
9
|
-
|
|
10
|
-
&::backdrop {
|
|
11
|
-
@apply bg-slate-medium/50 fixed;
|
|
12
|
-
top: 0px;
|
|
13
|
-
right: 0px;
|
|
14
|
-
bottom: 0px;
|
|
15
|
-
left: 0px;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
</style>
|
|
19
|
-
|
|
20
|
-
<Button primary onclick={`window.${id}.showModal()`}>{open}</Button>
|
|
21
|
-
|
|
22
|
-
<dialog id={id} class="p-6">
|
|
23
|
-
<slot name="main" />
|
|
24
|
-
<form method="dialog">
|
|
25
|
-
<slot name="close" />
|
|
26
|
-
</form>
|
|
27
|
-
</dialog>
|
|
1
|
+
---
|
|
2
|
+
const { id, open } = Astro.props;
|
|
3
|
+
import Button from "../components/Button.vue";
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<style >
|
|
7
|
+
dialog {
|
|
8
|
+
@apply fixed top-0 left-0 right-0 bottom-0;
|
|
9
|
+
|
|
10
|
+
&::backdrop {
|
|
11
|
+
@apply bg-slate-medium/50 fixed;
|
|
12
|
+
top: 0px;
|
|
13
|
+
right: 0px;
|
|
14
|
+
bottom: 0px;
|
|
15
|
+
left: 0px;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
</style>
|
|
19
|
+
|
|
20
|
+
<Button primary onclick={`window.${id}.showModal()`}>{open}</Button>
|
|
21
|
+
|
|
22
|
+
<dialog id={id} class="p-6">
|
|
23
|
+
<slot name="main" />
|
|
24
|
+
<form method="dialog">
|
|
25
|
+
<slot name="close" />
|
|
26
|
+
</form>
|
|
27
|
+
</dialog>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<article id="article" class="content">
|
|
2
|
-
<section class="main-section">
|
|
3
|
-
<slot />
|
|
4
|
-
</section>
|
|
5
|
-
</article>
|
|
1
|
+
<article id="article" class="content">
|
|
2
|
+
<section class="main-section">
|
|
3
|
+
<slot />
|
|
4
|
+
</section>
|
|
5
|
+
</article>
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import { PropType } from 'vue';
|
|
3
|
-
|
|
4
|
-
const props = defineProps({
|
|
5
|
-
as: {
|
|
6
|
-
type: String as PropType<'div' | 'td' | 'span' | 'h1' | 'h2' | 'h3'>,
|
|
7
|
-
default: 'div',
|
|
8
|
-
required: true,
|
|
9
|
-
},
|
|
10
|
-
number: {
|
|
11
|
-
type: String,
|
|
12
|
-
default: '',
|
|
13
|
-
required: true,
|
|
14
|
-
},
|
|
15
|
-
class: {
|
|
16
|
-
type: String,
|
|
17
|
-
default: '',
|
|
18
|
-
required: false,
|
|
19
|
-
},
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
</script>
|
|
23
|
-
|
|
24
|
-
<template>
|
|
25
|
-
<component :is="props.as" :class="props.class">
|
|
26
|
-
{{ props.number }}
|
|
27
|
-
</component>
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import { PropType } from 'vue';
|
|
3
|
+
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
as: {
|
|
6
|
+
type: String as PropType<'div' | 'td' | 'span' | 'h1' | 'h2' | 'h3'>,
|
|
7
|
+
default: 'div',
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
number: {
|
|
11
|
+
type: String,
|
|
12
|
+
default: '',
|
|
13
|
+
required: true,
|
|
14
|
+
},
|
|
15
|
+
class: {
|
|
16
|
+
type: String,
|
|
17
|
+
default: '',
|
|
18
|
+
required: false,
|
|
19
|
+
},
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<template>
|
|
25
|
+
<component :is="props.as" :class="props.class">
|
|
26
|
+
{{ props.number }}
|
|
27
|
+
</component>
|
|
28
28
|
</template>
|