spoko-design-system 0.9.3 → 0.9.4

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.
Files changed (172) hide show
  1. package/.astro/settings.json +4 -4
  2. package/.astro/types.d.ts +1 -1
  3. package/.claude/settings.local.json +2 -1
  4. package/.github/dependabot.yml +11 -11
  5. package/.github/todo.yml +3 -3
  6. package/.github/workflows/deploy.yml +39 -39
  7. package/.stackblitzrc +5 -5
  8. package/.vscode/extensions.json +5 -5
  9. package/.vscode/launch.json +11 -11
  10. package/.vscode/settings.json +5 -5
  11. package/LICENSE +21 -21
  12. package/README.md +116 -116
  13. package/astro-i18next.config.mjs +17 -17
  14. package/astro-i18next.config.ts +10 -10
  15. package/astro.config.mjs +86 -86
  16. package/dev-dist/sw.js +91 -91
  17. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  18. package/icon.config.ts +310 -310
  19. package/index.ts +70 -70
  20. package/package.json +124 -124
  21. package/public/arrow-bottom.svg +7 -7
  22. package/public/fonts/lg.svg +53 -53
  23. package/public/fonts/vwhead-bold-demo.html +549 -549
  24. package/public/fonts/vwhead-regular-demo.html +549 -549
  25. package/public/fonts/vwtext-bold-demo.html +549 -549
  26. package/public/fonts/vwtext-regular-demo.html +549 -549
  27. package/public/github.svg +3 -3
  28. package/public/grid_dot.svg +4 -4
  29. package/public/linkedin.svg +44 -44
  30. package/public/locales/en/translation.json +12 -12
  31. package/public/locales/pl/translation.json +12 -12
  32. package/public/make-scrollable-code-focusable.js +3 -3
  33. package/public/pagefind.yml +3 -3
  34. package/public/polo.blue.svg +29 -29
  35. package/public/spoko.space.svg +71 -71
  36. package/public/twitter.svg +46 -46
  37. package/renovate.json +6 -6
  38. package/sandbox.config.json +11 -11
  39. package/src/MyComponent.astro +8 -8
  40. package/src/components/Badge.vue +19 -19
  41. package/src/components/Badges.vue +21 -21
  42. package/src/components/Breadcrumbs.vue +94 -94
  43. package/src/components/Button.vue +101 -101
  44. package/src/components/ButtonCopy.astro +183 -183
  45. package/src/components/ButtonCopy.vue +36 -36
  46. package/src/components/Card.astro +27 -27
  47. package/src/components/Carousel.astro +26 -26
  48. package/src/components/Category/CategoriesCarousel.astro +101 -101
  49. package/src/components/Category/CategoryDetails.astro +169 -169
  50. package/src/components/Category/CategoryLink.vue +28 -28
  51. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  52. package/src/components/Category/CategoryTile.astro +37 -37
  53. package/src/components/Category/CategoryViewToggler.astro +89 -89
  54. package/src/components/Category/SubCategoryLink.vue +19 -19
  55. package/src/components/Copyright.astro +12 -12
  56. package/src/components/Date.astro +7 -7
  57. package/src/components/Faq.astro +33 -33
  58. package/src/components/FaqItem.astro +80 -80
  59. package/src/components/FeaturesList.vue +37 -37
  60. package/src/components/FuckRussia.vue +62 -62
  61. package/src/components/HandDrive.astro +29 -29
  62. package/src/components/Header/Header.astro +210 -210
  63. package/src/components/Header/SkipToContent.astro +1 -1
  64. package/src/components/Headline.vue +87 -87
  65. package/src/components/Image.astro +30 -30
  66. package/src/components/{layout → Layout}/CallToAction.astro +52 -52
  67. package/src/components/{layout → Layout}/Container.astro +7 -7
  68. package/src/components/{layout → Layout}/Header.astro +80 -80
  69. package/src/components/LeftSidebar.astro +53 -53
  70. package/src/components/MainColors.vue +22 -22
  71. package/src/components/MainInput.vue +15 -15
  72. package/src/components/Modal.astro +27 -27
  73. package/src/components/PageContent.astro +5 -5
  74. package/src/components/PartNumber.vue +27 -27
  75. package/src/components/Post/PostCategories.astro +41 -41
  76. package/src/components/Post/PostCategories.vue +30 -30
  77. package/src/components/PostHeader.astro +103 -103
  78. package/src/components/PrCode.vue +141 -141
  79. package/src/components/Product/ProductButton.vue +18 -18
  80. package/src/components/Product/ProductCarousel.astro +35 -35
  81. package/src/components/Product/ProductEngineType.vue +42 -42
  82. package/src/components/Product/ProductImage.astro +40 -40
  83. package/src/components/Product/ProductLink.astro +101 -101
  84. package/src/components/Product/ProductLink.vue +59 -59
  85. package/src/components/Product/ProductLinkInfo.astro +37 -37
  86. package/src/components/Product/ProductNumber.astro +60 -60
  87. package/src/components/ProductCarousel.astro +38 -38
  88. package/src/components/ProductCodes.vue +39 -39
  89. package/src/components/ProductDetailName.vue +52 -52
  90. package/src/components/ProductDetailsList.vue +216 -216
  91. package/src/components/ProductTile.astro +48 -48
  92. package/src/components/Quote.vue +23 -23
  93. package/src/components/ReloadPrompt.astro +50 -50
  94. package/src/components/SlimBanner.vue +72 -72
  95. package/src/components/Table.vue +32 -32
  96. package/src/components/TableOfContents.astro +15 -15
  97. package/src/components/Translations.vue +23 -23
  98. package/src/components/flags/FlagPL.vue +3 -3
  99. package/src/components/flags/FlagUA.vue +2 -2
  100. package/src/config.ts +56 -56
  101. package/src/design.config.ts +98 -98
  102. package/src/env.d.ts +6 -6
  103. package/src/layouts/Layout.astro +61 -61
  104. package/src/layouts/MainLayout.astro +81 -81
  105. package/src/layouts/partials/FooterCommon.astro +4 -4
  106. package/src/layouts/partials/HeadCommon.astro +44 -44
  107. package/src/layouts/partials/HeadSEO.astro +41 -41
  108. package/src/pages/components/badges.mdx +57 -57
  109. package/src/pages/components/breadcrumbs.mdx +139 -139
  110. package/src/pages/components/buttons.mdx +360 -360
  111. package/src/pages/components/card.mdx +294 -294
  112. package/src/pages/components/carousel.mdx +62 -62
  113. package/src/pages/components/copyright.mdx +42 -42
  114. package/src/pages/components/details-list.mdx +115 -115
  115. package/src/pages/components/features-list.mdx +37 -37
  116. package/src/pages/components/flags.mdx +49 -49
  117. package/src/pages/components/fuck-russia.mdx +39 -39
  118. package/src/pages/components/hand-drive.mdx +38 -38
  119. package/src/pages/components/headline.mdx +137 -137
  120. package/src/pages/components/icons.astro +135 -135
  121. package/src/pages/components/image.mdx +513 -513
  122. package/src/pages/components/input.mdx +367 -367
  123. package/src/pages/components/jumbotron.mdx +359 -359
  124. package/src/pages/components/modal.mdx +64 -64
  125. package/src/pages/components/post-header.mdx +64 -64
  126. package/src/pages/components/pr-code.mdx +65 -65
  127. package/src/pages/components/product-number.mdx +58 -58
  128. package/src/pages/components/product-tile.mdx +51 -51
  129. package/src/pages/components/quote.mdx +33 -33
  130. package/src/pages/components/slimbanner.mdx +35 -35
  131. package/src/pages/components/table.mdx +108 -108
  132. package/src/pages/core/colors.mdx +10 -10
  133. package/src/pages/core/grid.mdx +89 -89
  134. package/src/pages/core/introduction.mdx +77 -77
  135. package/src/pages/core/shadows.astro +20 -20
  136. package/src/pages/core/typography.astro +49 -49
  137. package/src/pages/index.astro +133 -133
  138. package/src/pages/patterns/introduction.mdx +60 -60
  139. package/src/pwa.ts +12 -12
  140. package/src/styles/_variables.scss +70 -70
  141. package/src/styles/base/base.css +184 -184
  142. package/src/styles/base/grid.css +92 -92
  143. package/src/styles/base/typography.css +70 -70
  144. package/src/styles/content.css +73 -73
  145. package/src/styles/main.css +7 -7
  146. package/src/types/Product.ts +31 -31
  147. package/src/types/astro.d.ts +3 -3
  148. package/src/utils/product/getPriceFormatted.ts +15 -15
  149. package/src/utils/product/getProductChecklist.ts +17 -17
  150. package/src/utils/product/useFormatProductNumber.ts +41 -41
  151. package/src/utils/seo/getShorterDescription.ts +14 -14
  152. package/src/utils/text/formatDate.ts +5 -5
  153. package/src/utils/text/formatLocaleNumber.ts +6 -6
  154. package/src/utils/text/formatPad.ts +12 -12
  155. package/src/utils/text/getNumberFormatted.ts +33 -33
  156. package/src/utils/text/getTranslatedLink.ts +5 -5
  157. package/src/utils/text.ts +19 -19
  158. package/tailwind.config.cjs +8 -8
  159. package/tsconfig.json +28 -28
  160. package/uno-config/index.ts +268 -268
  161. package/uno-config/theme/breakpoints.ts +9 -9
  162. package/uno-config/theme/colors.ts +64 -64
  163. package/uno-config/theme/dimensions.ts +17 -17
  164. package/uno-config/theme/effects.ts +14 -14
  165. package/uno-config/theme/grid.ts +10 -10
  166. package/uno-config/theme/index.ts +28 -28
  167. package/uno-config/theme/shortcuts/buttons.ts +53 -53
  168. package/uno-config/theme/shortcuts/components.ts +123 -123
  169. package/uno-config/theme/shortcuts/index.ts +20 -20
  170. package/uno-config/theme/shortcuts/layout.ts +74 -74
  171. package/uno-config/theme/typography.ts +29 -29
  172. package/uno.config.ts +2 -2
@@ -1,184 +1,184 @@
1
- ---
2
- interface Props {
3
- productNumber: string;
4
- tooltipClasses?: string;
5
- texts: {
6
- copy: string;
7
- copied: string;
8
- };
9
- }
10
-
11
- const {
12
- productNumber,
13
- tooltipClasses = '',
14
- texts
15
- } = Astro.props;
16
-
17
- // SVG icon as data URL for mask
18
- const COPY_ICON = `url("data:image/svg+xml;utf8,${encodeURIComponent(
19
- `<svg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'><path fill='currentColor' d='M184 66H40a6 6 0 0 0-6 6v144a6 6 0 0 0 6 6h144a6 6 0 0 0 6-6V72a6 6 0 0 0-6-6m-6 144H46V78h132Zm44-170v144a6 6 0 0 1-12 0V46H72a6 6 0 0 1 0-12h144a6 6 0 0 1 6 6'/></svg>`
20
- )}")`;
21
- ---
22
-
23
- <button
24
- aria-label={texts.copy}
25
- class="btn-copy has-tooltip"
26
- data-copy-text={productNumber}
27
- data-category={Astro.url.pathname.split('/')[1] || ''}
28
- >
29
- <span
30
- class:list={["tooltip rounded-full btn-copy-text", tooltipClasses]}
31
- data-text={texts.copy}
32
- data-copied-text={texts.copied}
33
- />
34
- <span class="copy-icon" role="img" aria-hidden="true" />
35
- </button>
36
-
37
- <script>
38
- class ClipboardButton {
39
- private static readonly COPY_TIMEOUT = 2000;
40
- private static readonly ANALYTICS_EVENT = 'product_code_copy';
41
-
42
- constructor(private button: HTMLButtonElement) {
43
- this.init();
44
- }
45
-
46
- private init(): void {
47
- this.button.addEventListener('click', () => this.handleCopy());
48
- }
49
-
50
- private get tooltip(): HTMLSpanElement {
51
- return this.button.querySelector('.tooltip') as HTMLSpanElement;
52
- }
53
-
54
- private get copyText(): string {
55
- return this.button.dataset.copyText || '';
56
- }
57
-
58
- private get category(): string {
59
- return this.button.dataset.category || '';
60
- }
61
-
62
- private get originalText(): string {
63
- return this.tooltip.dataset.text || 'Copy';
64
- }
65
-
66
- private get copiedText(): string {
67
- return this.tooltip.dataset.copiedText || 'Copied';
68
- }
69
-
70
- private async handleCopy(): Promise<void> {
71
- try {
72
- await this.copyToClipboard();
73
- this.updateTooltip();
74
- this.trackCopy();
75
- } catch (err) {
76
- console.error('Failed to copy text:', err);
77
- }
78
- }
79
-
80
- private trackCopy(): void {
81
- if (!window.dataLayer) return;
82
-
83
- window.dataLayer.push({
84
- event: ClipboardButton.ANALYTICS_EVENT,
85
- productCode: this.copyText,
86
- category: this.category,
87
- pageUrl: window.location.pathname,
88
- timestamp: new Date().toISOString()
89
- });
90
- }
91
-
92
- private async copyToClipboard(): Promise<void> {
93
- if (navigator.clipboard && window.isSecureContext) {
94
- await navigator.clipboard.writeText(this.copyText);
95
- } else {
96
- this.fallbackCopy();
97
- }
98
- }
99
-
100
- private updateTooltip(): void {
101
- this.tooltip.dataset.text = this.copiedText;
102
- setTimeout(() => {
103
- this.tooltip.dataset.text = this.originalText;
104
- }, ClipboardButton.COPY_TIMEOUT);
105
- }
106
-
107
- private fallbackCopy(): void {
108
- const textArea = document.createElement('textarea');
109
- textArea.value = this.copyText;
110
- textArea.style.position = 'fixed';
111
- textArea.style.opacity = '0';
112
-
113
- document.body.appendChild(textArea);
114
- textArea.select();
115
-
116
- try {
117
- document.execCommand('copy');
118
- } catch (err) {
119
- console.error('Fallback copy failed:', err);
120
- } finally {
121
- document.body.removeChild(textArea);
122
- }
123
- }
124
- }
125
-
126
- // Initialize copy buttons on page load
127
- document.addEventListener('astro:page-load', () => {
128
- document.querySelectorAll('.btn-copy').forEach(button => {
129
- if (button instanceof HTMLButtonElement) {
130
- new ClipboardButton(button);
131
- }
132
- });
133
- });
134
- </script>
135
-
136
- <style define:vars={{ iconUrl: COPY_ICON }}>
137
- .btn-copy {
138
- position: absolute;
139
- right: -1.75rem;
140
- margin-left: auto;
141
- width: 1.5rem;
142
- height: 1.5rem;
143
- line-height: 1;
144
- opacity: 0.1;
145
- display: inline-flex;
146
- align-items: center;
147
- justify-content: center;
148
- transition: opacity 0.2s ease-in-out;
149
- }
150
-
151
- .btn-copy:hover {
152
- opacity: 1;
153
- }
154
-
155
- @media (min-width: 640px) {
156
- .btn-copy {
157
- right: -1.25rem;
158
- }
159
- }
160
-
161
- .tooltip {
162
- @apply invisible absolute -top-8 left-1/2 -translate-x-1/2 bg-neutral px-2 py-1 text-xs text-white opacity-0 transition-opacity;
163
- }
164
-
165
- .tooltip::before {
166
- content: attr(data-text);
167
- }
168
-
169
- .has-tooltip:hover .tooltip {
170
- @apply visible opacity-100;
171
- }
172
-
173
- .copy-icon {
174
- width: 1.2em;
175
- height: 1.2em;
176
- display: inline-block;
177
- vertical-align: middle;
178
- background-color: currentColor;
179
- -webkit-mask: var(--iconUrl) no-repeat;
180
- mask: var(--iconUrl) no-repeat;
181
- -webkit-mask-size: 100% 100%;
182
- mask-size: 100% 100%;
183
- }
1
+ ---
2
+ interface Props {
3
+ productNumber: string;
4
+ tooltipClasses?: string;
5
+ texts: {
6
+ copy: string;
7
+ copied: string;
8
+ };
9
+ }
10
+
11
+ const {
12
+ productNumber,
13
+ tooltipClasses = '',
14
+ texts
15
+ } = Astro.props;
16
+
17
+ // SVG icon as data URL for mask
18
+ const COPY_ICON = `url("data:image/svg+xml;utf8,${encodeURIComponent(
19
+ `<svg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'><path fill='currentColor' d='M184 66H40a6 6 0 0 0-6 6v144a6 6 0 0 0 6 6h144a6 6 0 0 0 6-6V72a6 6 0 0 0-6-6m-6 144H46V78h132Zm44-170v144a6 6 0 0 1-12 0V46H72a6 6 0 0 1 0-12h144a6 6 0 0 1 6 6'/></svg>`
20
+ )}")`;
21
+ ---
22
+
23
+ <button
24
+ aria-label={texts.copy}
25
+ class="btn-copy has-tooltip"
26
+ data-copy-text={productNumber}
27
+ data-category={Astro.url.pathname.split('/')[1] || ''}
28
+ >
29
+ <span
30
+ class:list={["tooltip rounded-full btn-copy-text", tooltipClasses]}
31
+ data-text={texts.copy}
32
+ data-copied-text={texts.copied}
33
+ />
34
+ <span class="copy-icon" role="img" aria-hidden="true" />
35
+ </button>
36
+
37
+ <script>
38
+ class ClipboardButton {
39
+ private static readonly COPY_TIMEOUT = 2000;
40
+ private static readonly ANALYTICS_EVENT = 'product_code_copy';
41
+
42
+ constructor(private button: HTMLButtonElement) {
43
+ this.init();
44
+ }
45
+
46
+ private init(): void {
47
+ this.button.addEventListener('click', () => this.handleCopy());
48
+ }
49
+
50
+ private get tooltip(): HTMLSpanElement {
51
+ return this.button.querySelector('.tooltip') as HTMLSpanElement;
52
+ }
53
+
54
+ private get copyText(): string {
55
+ return this.button.dataset.copyText || '';
56
+ }
57
+
58
+ private get category(): string {
59
+ return this.button.dataset.category || '';
60
+ }
61
+
62
+ private get originalText(): string {
63
+ return this.tooltip.dataset.text || 'Copy';
64
+ }
65
+
66
+ private get copiedText(): string {
67
+ return this.tooltip.dataset.copiedText || 'Copied';
68
+ }
69
+
70
+ private async handleCopy(): Promise<void> {
71
+ try {
72
+ await this.copyToClipboard();
73
+ this.updateTooltip();
74
+ this.trackCopy();
75
+ } catch (err) {
76
+ console.error('Failed to copy text:', err);
77
+ }
78
+ }
79
+
80
+ private trackCopy(): void {
81
+ if (!window.dataLayer) return;
82
+
83
+ window.dataLayer.push({
84
+ event: ClipboardButton.ANALYTICS_EVENT,
85
+ productCode: this.copyText,
86
+ category: this.category,
87
+ pageUrl: window.location.pathname,
88
+ timestamp: new Date().toISOString()
89
+ });
90
+ }
91
+
92
+ private async copyToClipboard(): Promise<void> {
93
+ if (navigator.clipboard && window.isSecureContext) {
94
+ await navigator.clipboard.writeText(this.copyText);
95
+ } else {
96
+ this.fallbackCopy();
97
+ }
98
+ }
99
+
100
+ private updateTooltip(): void {
101
+ this.tooltip.dataset.text = this.copiedText;
102
+ setTimeout(() => {
103
+ this.tooltip.dataset.text = this.originalText;
104
+ }, ClipboardButton.COPY_TIMEOUT);
105
+ }
106
+
107
+ private fallbackCopy(): void {
108
+ const textArea = document.createElement('textarea');
109
+ textArea.value = this.copyText;
110
+ textArea.style.position = 'fixed';
111
+ textArea.style.opacity = '0';
112
+
113
+ document.body.appendChild(textArea);
114
+ textArea.select();
115
+
116
+ try {
117
+ document.execCommand('copy');
118
+ } catch (err) {
119
+ console.error('Fallback copy failed:', err);
120
+ } finally {
121
+ document.body.removeChild(textArea);
122
+ }
123
+ }
124
+ }
125
+
126
+ // Initialize copy buttons on page load
127
+ document.addEventListener('astro:page-load', () => {
128
+ document.querySelectorAll('.btn-copy').forEach(button => {
129
+ if (button instanceof HTMLButtonElement) {
130
+ new ClipboardButton(button);
131
+ }
132
+ });
133
+ });
134
+ </script>
135
+
136
+ <style define:vars={{ iconUrl: COPY_ICON }}>
137
+ .btn-copy {
138
+ position: absolute;
139
+ right: -1.75rem;
140
+ margin-left: auto;
141
+ width: 1.5rem;
142
+ height: 1.5rem;
143
+ line-height: 1;
144
+ opacity: 0.1;
145
+ display: inline-flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ transition: opacity 0.2s ease-in-out;
149
+ }
150
+
151
+ .btn-copy:hover {
152
+ opacity: 1;
153
+ }
154
+
155
+ @media (min-width: 640px) {
156
+ .btn-copy {
157
+ right: -1.25rem;
158
+ }
159
+ }
160
+
161
+ .tooltip {
162
+ @apply invisible absolute -top-8 left-1/2 -translate-x-1/2 bg-neutral px-2 py-1 text-xs text-white opacity-0 transition-opacity;
163
+ }
164
+
165
+ .tooltip::before {
166
+ content: attr(data-text);
167
+ }
168
+
169
+ .has-tooltip:hover .tooltip {
170
+ @apply visible opacity-100;
171
+ }
172
+
173
+ .copy-icon {
174
+ width: 1.2em;
175
+ height: 1.2em;
176
+ display: inline-block;
177
+ vertical-align: middle;
178
+ background-color: currentColor;
179
+ -webkit-mask: var(--iconUrl) no-repeat;
180
+ mask: var(--iconUrl) no-repeat;
181
+ -webkit-mask-size: 100% 100%;
182
+ mask-size: 100% 100%;
183
+ }
184
184
  </style>
@@ -1,36 +1,36 @@
1
- <script lang="ts" setup>
2
- import { useClipboard } from "@vueuse/core";
3
- // import { Icon } from "@iconify/vue";
4
-
5
- const props = defineProps({
6
- productNumber: {
7
- type: String,
8
- default: null,
9
- required: true,
10
- },
11
- tooltipClasses: {
12
- type: String,
13
- required: false,
14
- default: '',
15
- },
16
- texts: {
17
- type: Object as PropType<{ copy: String, copied: String }>,
18
- required: true,
19
- default: {
20
- copy: 'copy',
21
- copied: 'copied',
22
- }
23
- }
24
- })
25
- const source = props.productNumber;
26
- const { copy, copied, isSupported } = useClipboard({ source, legacy: true });
27
-
28
- </script>
29
-
30
- <template>
31
- <button :aria-label="texts.copy" class="btn-copy has-tooltip" @click="copy()">
32
- <span :class="`tooltip rounded-full btn-copy-text ${tooltipClasses}`"
33
- :data-text="!copied ? texts.copy : texts.copied" />
34
- <span i-ph-copy-simple-light class="leading-none w-full h-full" />
35
- </button>
36
- </template>
1
+ <script lang="ts" setup>
2
+ import { useClipboard } from "@vueuse/core";
3
+ // import { Icon } from "@iconify/vue";
4
+
5
+ const props = defineProps({
6
+ productNumber: {
7
+ type: String,
8
+ default: null,
9
+ required: true,
10
+ },
11
+ tooltipClasses: {
12
+ type: String,
13
+ required: false,
14
+ default: '',
15
+ },
16
+ texts: {
17
+ type: Object as PropType<{ copy: String, copied: String }>,
18
+ required: true,
19
+ default: {
20
+ copy: 'copy',
21
+ copied: 'copied',
22
+ }
23
+ }
24
+ })
25
+ const source = props.productNumber;
26
+ const { copy, copied, isSupported } = useClipboard({ source, legacy: true });
27
+
28
+ </script>
29
+
30
+ <template>
31
+ <button :aria-label="texts.copy" class="btn-copy has-tooltip" @click="copy()">
32
+ <span :class="`tooltip rounded-full btn-copy-text ${tooltipClasses}`"
33
+ :data-text="!copied ? texts.copy : texts.copied" />
34
+ <span i-ph-copy-simple-light class="leading-none w-full h-full" />
35
+ </button>
36
+ </template>
@@ -1,27 +1,27 @@
1
- ---
2
- const { class: className, imgSrc, imgAlt, href } = Astro.props;
3
-
4
- import Image from "../components/Image.astro";
5
- ---
6
-
7
- <div
8
- class="bg-white border border-gray-200 rounded-lg shadow overflow-hidden"
9
- >
10
- <a href={href} class="aspect-ratio-video block relative">
11
- {
12
- imgSrc && (
13
- <Image
14
- imageObject={{
15
- src: imgSrc,
16
- alt: imgAlt,
17
- height: "405",
18
- width: "720",
19
- }}
20
- />
21
- )
22
- }
23
- </a>
24
- <div class="p-5">
25
- <slot />
26
- </div>
27
- </div>
1
+ ---
2
+ const { class: className, imgSrc, imgAlt, href } = Astro.props;
3
+
4
+ import Image from "../components/Image.astro";
5
+ ---
6
+
7
+ <div
8
+ class="bg-white border border-gray-200 rounded-lg shadow overflow-hidden"
9
+ >
10
+ <a href={href} class="aspect-ratio-video block relative">
11
+ {
12
+ imgSrc && (
13
+ <Image
14
+ imageObject={{
15
+ src: imgSrc,
16
+ alt: imgAlt,
17
+ height: "405",
18
+ width: "720",
19
+ }}
20
+ />
21
+ )
22
+ }
23
+ </a>
24
+ <div class="p-5">
25
+ <slot />
26
+ </div>
27
+ </div>
@@ -1,26 +1,26 @@
1
- ---
2
- export const productObject = {
3
- name: "Combi-instrument MFA+",
4
- url: "https://google.com",
5
- number: "6R0920870F",
6
- photo:
7
- "https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337",
8
- };
9
- ---
10
-
11
- <swiper-container
12
- class="max-w-full w-full flex overflow-hidden"
13
- grid-rows="1"
14
- mousewheel-force-to-axis="true"
15
- navigation="true"
16
- pagination-type="fraction"
17
- scrollbar="false"
18
- slides-per-view="auto"
19
- space-between="0"
20
- >
21
- <swiper-slide class="bg-blue-50 p-12 border-1 min-w-full">A</swiper-slide>
22
- <swiper-slide class="bg-blue-100 p-12 border-1 min-w-full">B</swiper-slide>
23
- <swiper-slide class="bg-blue-200 p-12 border-1 min-w-full">C</swiper-slide>
24
- <swiper-slide class="bg-blue-300 p-12 border-1 min-w-full">D</swiper-slide>
25
- <swiper-slide class="bg-blue-400 p-12 border-1 min-w-full">A</swiper-slide>
26
- </swiper-container>
1
+ ---
2
+ export const productObject = {
3
+ name: "Combi-instrument MFA+",
4
+ url: "https://google.com",
5
+ number: "6R0920870F",
6
+ photo:
7
+ "https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337",
8
+ };
9
+ ---
10
+
11
+ <swiper-container
12
+ class="max-w-full w-full flex overflow-hidden"
13
+ grid-rows="1"
14
+ mousewheel-force-to-axis="true"
15
+ navigation="true"
16
+ pagination-type="fraction"
17
+ scrollbar="false"
18
+ slides-per-view="auto"
19
+ space-between="0"
20
+ >
21
+ <swiper-slide class="bg-blue-50 p-12 border-1 min-w-full">A</swiper-slide>
22
+ <swiper-slide class="bg-blue-100 p-12 border-1 min-w-full">B</swiper-slide>
23
+ <swiper-slide class="bg-blue-200 p-12 border-1 min-w-full">C</swiper-slide>
24
+ <swiper-slide class="bg-blue-300 p-12 border-1 min-w-full">D</swiper-slide>
25
+ <swiper-slide class="bg-blue-400 p-12 border-1 min-w-full">A</swiper-slide>
26
+ </swiper-container>