spoko-design-system 0.5.7 → 0.5.8
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 +10 -10
- 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 +171 -0
- 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 +84 -84
- 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 +114 -61
- 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 -18
- package/uno-config/theme/shortcuts/inputs.ts +44 -0
- package/uno-config/theme/shortcuts/layout.ts +64 -64
- package/uno-config/theme/typography.ts +29 -29
- package/uno.config.ts +2 -2
- package/src/components/Input.astro +0 -86
|
@@ -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
|
+
/>
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, useAttrs } from 'vue';
|
|
3
|
+
|
|
4
|
+
interface InputProps {
|
|
5
|
+
id?: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
label: string;
|
|
8
|
+
variant?: 'filled' | 'standard';
|
|
9
|
+
type?: string; // HTMLInputElement['type'] | 'textarea'
|
|
10
|
+
modelValue?: string | number; // For v-model compatibility
|
|
11
|
+
required?: boolean;
|
|
12
|
+
rows?: number; // rows for textarea
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
error?: string | boolean;
|
|
15
|
+
success?: string | boolean;
|
|
16
|
+
size?: 'sm' | 'md' | 'lg'; // Size prop
|
|
17
|
+
class?: string; // additional classes
|
|
18
|
+
[key: string]: any; // To allow additional props
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const props = withDefaults(defineProps<InputProps>(), {
|
|
22
|
+
id: () => `input-${Math.random().toString(36).substring(2, 9)}`,
|
|
23
|
+
name: undefined,
|
|
24
|
+
variant: 'standard',
|
|
25
|
+
type: 'text',
|
|
26
|
+
modelValue: '',
|
|
27
|
+
required: false,
|
|
28
|
+
rows: 3,
|
|
29
|
+
placeholder: ' ', // space is important for "floating label"
|
|
30
|
+
error: false,
|
|
31
|
+
success: false,
|
|
32
|
+
size: 'md',
|
|
33
|
+
class: ''
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const emit = defineEmits(['update:modelValue', 'input', 'focus', 'blur']);
|
|
37
|
+
|
|
38
|
+
// Handle external attrs
|
|
39
|
+
const attrs = useAttrs();
|
|
40
|
+
|
|
41
|
+
// Compute wrapper class
|
|
42
|
+
const wrapperClass = computed(() => `input-wrapper-${props.variant}`);
|
|
43
|
+
|
|
44
|
+
// Compute input classes going back to direct arbitrary selectors
|
|
45
|
+
const inputClass = computed(() => {
|
|
46
|
+
// Base classes
|
|
47
|
+
const classes = ['input-base', `input-${props.variant}`];
|
|
48
|
+
|
|
49
|
+
// Focus and placeholder behavior - using direct arbitrary selectors
|
|
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
|
|
68
|
+
if (props.size) classes.push(`input-${props.size}`);
|
|
69
|
+
if (props.type === 'textarea') classes.push('input-textarea');
|
|
70
|
+
if (props.error) classes.push('input-error');
|
|
71
|
+
else if (props.success) classes.push('input-success');
|
|
72
|
+
if (props.class) classes.push(props.class);
|
|
73
|
+
|
|
74
|
+
return classes.join(' ');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Compute label classes - important: add -translate-y for initial state explicitly
|
|
78
|
+
const labelClass = computed(() => {
|
|
79
|
+
// Base classes
|
|
80
|
+
const classes = ['input-label-base', `input-label-${props.variant}`];
|
|
81
|
+
|
|
82
|
+
// Explicitly add transform for initial state to ensure consistency
|
|
83
|
+
if (props.variant === 'standard') {
|
|
84
|
+
// Start in position and let focus/content move it
|
|
85
|
+
classes.push('translate-y-0');
|
|
86
|
+
} else if (props.variant === 'filled') {
|
|
87
|
+
// Start in position and let focus/content move it
|
|
88
|
+
classes.push('translate-y-0');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Additional classes
|
|
92
|
+
if (props.size) classes.push(`input-label-${props.size}`);
|
|
93
|
+
if (props.error) classes.push('input-label-error');
|
|
94
|
+
else if (props.success) classes.push('input-label-success');
|
|
95
|
+
|
|
96
|
+
return classes.join(' ');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Emit modelValue on input change
|
|
100
|
+
const handleInput = (event: Event) => {
|
|
101
|
+
const target = event.target as HTMLInputElement | HTMLTextAreaElement;
|
|
102
|
+
emit('update:modelValue', target.value);
|
|
103
|
+
emit('input', event);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// Forward focus and blur events
|
|
107
|
+
const handleFocus = (event: FocusEvent) => emit('focus', event);
|
|
108
|
+
const handleBlur = (event: FocusEvent) => emit('blur', event);
|
|
109
|
+
</script>
|
|
110
|
+
|
|
111
|
+
<template>
|
|
112
|
+
<div :class="wrapperClass">
|
|
113
|
+
<!-- Textarea field -->
|
|
114
|
+
<textarea
|
|
115
|
+
v-if="type === 'textarea'"
|
|
116
|
+
:id="id"
|
|
117
|
+
:name="name || id"
|
|
118
|
+
:rows="rows"
|
|
119
|
+
:required="required"
|
|
120
|
+
:class="inputClass"
|
|
121
|
+
:placeholder="placeholder"
|
|
122
|
+
:value="modelValue"
|
|
123
|
+
@input="handleInput"
|
|
124
|
+
@focus="handleFocus"
|
|
125
|
+
@blur="handleBlur"
|
|
126
|
+
v-bind="attrs"
|
|
127
|
+
></textarea>
|
|
128
|
+
|
|
129
|
+
<!-- Input field -->
|
|
130
|
+
<input
|
|
131
|
+
v-else
|
|
132
|
+
:type="type"
|
|
133
|
+
:id="id"
|
|
134
|
+
:name="name || id"
|
|
135
|
+
:required="required"
|
|
136
|
+
:class="inputClass"
|
|
137
|
+
:placeholder="placeholder"
|
|
138
|
+
:value="modelValue"
|
|
139
|
+
@input="handleInput"
|
|
140
|
+
@focus="handleFocus"
|
|
141
|
+
@blur="handleBlur"
|
|
142
|
+
v-bind="attrs"
|
|
143
|
+
/>
|
|
144
|
+
|
|
145
|
+
<!-- Label with guaranteed correct transform origin -->
|
|
146
|
+
<label
|
|
147
|
+
:for="id"
|
|
148
|
+
:class="labelClass"
|
|
149
|
+
style="transform-origin: top left;"
|
|
150
|
+
>
|
|
151
|
+
{{ label }}
|
|
152
|
+
<span v-if="required" class="text-red-500 ml-1">*</span>
|
|
153
|
+
</label>
|
|
154
|
+
|
|
155
|
+
<!-- Error message -->
|
|
156
|
+
<div
|
|
157
|
+
v-if="error && typeof error === 'string'"
|
|
158
|
+
class="input-error-message"
|
|
159
|
+
>
|
|
160
|
+
{{ error }}
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<!-- Success message -->
|
|
164
|
+
<div
|
|
165
|
+
v-if="success && typeof success === 'string'"
|
|
166
|
+
class="input-success-message"
|
|
167
|
+
>
|
|
168
|
+
{{ success }}
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</template>
|
|
@@ -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>
|