spoko-design-system 0.7.6 → 0.7.7

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 (171) hide show
  1. package/.astro/data-store.json +1 -1
  2. package/.astro/settings.json +4 -4
  3. package/.astro/types.d.ts +1 -0
  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 +114 -114
  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 +309 -309
  19. package/index.ts +66 -66
  20. package/package.json +17 -17
  21. package/public/fonts/lg.svg +53 -53
  22. package/public/fonts/vwhead-bold-demo.html +549 -549
  23. package/public/fonts/vwhead-regular-demo.html +549 -549
  24. package/public/fonts/vwtext-bold-demo.html +549 -549
  25. package/public/fonts/vwtext-regular-demo.html +549 -549
  26. package/public/github.svg +3 -3
  27. package/public/grid_dot.svg +4 -4
  28. package/public/linkedin.svg +44 -44
  29. package/public/locales/en/translation.json +8 -8
  30. package/public/locales/pl/translation.json +8 -8
  31. package/public/make-scrollable-code-focusable.js +3 -3
  32. package/public/pagefind.yml +3 -3
  33. package/public/polo.blue.svg +29 -29
  34. package/public/spoko.space.svg +71 -71
  35. package/public/twitter.svg +46 -46
  36. package/renovate.json +6 -6
  37. package/sandbox.config.json +11 -11
  38. package/src/MyComponent.astro +8 -8
  39. package/src/components/Badge.vue +19 -19
  40. package/src/components/Badges.vue +21 -21
  41. package/src/components/Breadcrumbs.vue +107 -107
  42. package/src/components/Button.vue +101 -101
  43. package/src/components/ButtonCopy.astro +183 -183
  44. package/src/components/ButtonCopy.vue +36 -36
  45. package/src/components/Card.astro +27 -27
  46. package/src/components/Carousel.astro +26 -26
  47. package/src/components/Category/CategoriesCarousel.astro +101 -101
  48. package/src/components/Category/CategoryDetails.astro +169 -169
  49. package/src/components/Category/CategoryLink.vue +28 -28
  50. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  51. package/src/components/Category/CategoryTile.astro +37 -37
  52. package/src/components/Category/CategoryViewToggler.astro +89 -89
  53. package/src/components/Category/SubCategoryLink.vue +19 -19
  54. package/src/components/Copyright.astro +12 -12
  55. package/src/components/Date.astro +7 -7
  56. package/src/components/Faq.astro +33 -33
  57. package/src/components/FaqItem.astro +80 -80
  58. package/src/components/FeaturesList.vue +41 -41
  59. package/src/components/FuckRussia.vue +62 -62
  60. package/src/components/HandDrive.astro +29 -29
  61. package/src/components/Header/Header.astro +210 -210
  62. package/src/components/Header/SkipToContent.astro +1 -1
  63. package/src/components/Headline.vue +48 -48
  64. package/src/components/Image.astro +30 -30
  65. package/src/components/LeftSidebar.astro +53 -53
  66. package/src/components/MainColors.vue +22 -22
  67. package/src/components/MainInput.vue +15 -15
  68. package/src/components/Modal.astro +27 -27
  69. package/src/components/PageContent.astro +5 -5
  70. package/src/components/PartNumber.vue +27 -27
  71. package/src/components/Post/PostCategories.astro +41 -41
  72. package/src/components/Post/PostCategories.vue +39 -39
  73. package/src/components/PostHeader.astro +103 -103
  74. package/src/components/PrCode.vue +141 -141
  75. package/src/components/Product/ProductButton.vue +18 -18
  76. package/src/components/Product/ProductCarousel.astro +35 -35
  77. package/src/components/Product/ProductCodes.vue +174 -174
  78. package/src/components/Product/ProductEngineType.vue +42 -42
  79. package/src/components/Product/ProductImage.astro +40 -40
  80. package/src/components/Product/ProductLink.astro +101 -101
  81. package/src/components/Product/ProductLink.vue +59 -59
  82. package/src/components/Product/ProductLinkInfo.astro +37 -37
  83. package/src/components/Product/ProductNumber.astro +60 -60
  84. package/src/components/ProductCarousel.astro +38 -38
  85. package/src/components/ProductCodes.vue +39 -39
  86. package/src/components/ProductDetailName.vue +52 -52
  87. package/src/components/ProductDetailsList.vue +157 -157
  88. package/src/components/ProductTile.astro +48 -48
  89. package/src/components/Quote.vue +23 -23
  90. package/src/components/ReloadPrompt.astro +50 -50
  91. package/src/components/SlimBanner.vue +72 -72
  92. package/src/components/Table.vue +32 -32
  93. package/src/components/TableOfContents.astro +15 -15
  94. package/src/components/Translations.vue +23 -23
  95. package/src/components/flags/FlagPL.vue +3 -3
  96. package/src/components/flags/FlagUA.vue +2 -2
  97. package/src/components/layout/Container.astro +7 -7
  98. package/src/components/layout/Header.astro +80 -80
  99. package/src/config.ts +56 -56
  100. package/src/design.config.ts +98 -98
  101. package/src/env.d.ts +6 -6
  102. package/src/layouts/Layout.astro +61 -61
  103. package/src/layouts/MainLayout.astro +81 -81
  104. package/src/layouts/partials/FooterCommon.astro +4 -4
  105. package/src/layouts/partials/HeadCommon.astro +44 -44
  106. package/src/layouts/partials/HeadSEO.astro +41 -41
  107. package/src/pages/components/badges.mdx +57 -57
  108. package/src/pages/components/breadcrumbs.mdx +139 -139
  109. package/src/pages/components/buttons.mdx +360 -360
  110. package/src/pages/components/card.mdx +294 -294
  111. package/src/pages/components/carousel.mdx +62 -62
  112. package/src/pages/components/copyright.mdx +42 -42
  113. package/src/pages/components/details-list.mdx +115 -115
  114. package/src/pages/components/features-list.mdx +37 -37
  115. package/src/pages/components/flags.mdx +49 -49
  116. package/src/pages/components/fuck-russia.mdx +39 -39
  117. package/src/pages/components/hand-drive.mdx +38 -38
  118. package/src/pages/components/headline.mdx +152 -152
  119. package/src/pages/components/icons.astro +135 -135
  120. package/src/pages/components/image.mdx +513 -513
  121. package/src/pages/components/input.mdx +367 -367
  122. package/src/pages/components/jumbotron.mdx +359 -359
  123. package/src/pages/components/modal.mdx +64 -64
  124. package/src/pages/components/post-header.mdx +64 -64
  125. package/src/pages/components/pr-code.mdx +65 -65
  126. package/src/pages/components/product-number.mdx +58 -58
  127. package/src/pages/components/product-tile.mdx +51 -51
  128. package/src/pages/components/quote.mdx +33 -33
  129. package/src/pages/components/slimbanner.mdx +35 -35
  130. package/src/pages/components/table.mdx +108 -108
  131. package/src/pages/core/colors.mdx +10 -10
  132. package/src/pages/core/grid.mdx +89 -89
  133. package/src/pages/core/introduction.mdx +77 -77
  134. package/src/pages/core/shadows.astro +20 -20
  135. package/src/pages/core/typography.astro +49 -49
  136. package/src/pages/index.astro +133 -133
  137. package/src/pages/patterns/introduction.mdx +60 -60
  138. package/src/pwa.ts +12 -12
  139. package/src/styles/_variables.scss +70 -70
  140. package/src/styles/base/base.css +184 -184
  141. package/src/styles/base/grid.css +92 -92
  142. package/src/styles/base/typography.css +70 -70
  143. package/src/styles/content.css +73 -73
  144. package/src/styles/main.css +7 -7
  145. package/src/types/Product.ts +31 -31
  146. package/src/types/astro.d.ts +3 -3
  147. package/src/utils/product/getPriceFormatted.ts +15 -15
  148. package/src/utils/product/getProductChecklist.ts +17 -17
  149. package/src/utils/product/useFormatProductNumber.ts +41 -41
  150. package/src/utils/seo/getShorterDescription.ts +14 -14
  151. package/src/utils/text/formatDate.ts +5 -5
  152. package/src/utils/text/formatLocaleNumber.ts +6 -6
  153. package/src/utils/text/formatPad.ts +12 -12
  154. package/src/utils/text/getNumberFormatted.ts +33 -33
  155. package/src/utils/text/getTranslatedLink.ts +5 -5
  156. package/src/utils/text.ts +19 -19
  157. package/tailwind.config.cjs +8 -8
  158. package/tsconfig.json +28 -28
  159. package/uno-config/index.ts +249 -232
  160. package/uno-config/theme/breakpoints.ts +9 -9
  161. package/uno-config/theme/colors.ts +64 -64
  162. package/uno-config/theme/dimensions.ts +17 -17
  163. package/uno-config/theme/effects.ts +14 -14
  164. package/uno-config/theme/grid.ts +10 -10
  165. package/uno-config/theme/index.ts +28 -28
  166. package/uno-config/theme/shortcuts/buttons.ts +53 -53
  167. package/uno-config/theme/shortcuts/components.ts +92 -92
  168. package/uno-config/theme/shortcuts/index.ts +20 -20
  169. package/uno-config/theme/shortcuts/layout.ts +64 -64
  170. package/uno-config/theme/typography.ts +29 -29
  171. package/uno.config.ts +2 -2
@@ -1,39 +1,39 @@
1
- <script lang="ts" setup>
2
- import type { PropType } from 'vue'
3
- import PrCode from './PrCode.vue';
4
-
5
- const props = defineProps({
6
- prcodes: {
7
- type: Object as PropType<string[] | null>,
8
- default: null,
9
- required: true,
10
- },
11
- isPdp: {
12
- type: Boolean,
13
- default: false,
14
- required: false,
15
- },
16
- })
17
-
18
- const codes = props.prcodes || []
19
- const decodedCodes = codes ? codes.sort() : []
20
-
21
- const settings = {
22
- prcodes: decodedCodes,
23
- }
24
- </script>
25
-
26
- <template>
27
-
28
- <span
29
- v-for="(prcode, index) in settings.prcodes"
30
- :key="index"
31
- class="not-last:mr-1"
32
- >
33
- <PrCode :prcode="prcode" v-if="!String(prcode).includes('+')" />
34
- <span v-else >
35
- <PrCode v-for="(splittedCode, index2) in String(prcode).split('+')" :key="index2" :prcode="splittedCode" />
36
- </span>
37
- </span>
38
- </template>
39
-
1
+ <script lang="ts" setup>
2
+ import type { PropType } from 'vue'
3
+ import PrCode from './PrCode.vue';
4
+
5
+ const props = defineProps({
6
+ prcodes: {
7
+ type: Object as PropType<string[] | null>,
8
+ default: null,
9
+ required: true,
10
+ },
11
+ isPdp: {
12
+ type: Boolean,
13
+ default: false,
14
+ required: false,
15
+ },
16
+ })
17
+
18
+ const codes = props.prcodes || []
19
+ const decodedCodes = codes ? codes.sort() : []
20
+
21
+ const settings = {
22
+ prcodes: decodedCodes,
23
+ }
24
+ </script>
25
+
26
+ <template>
27
+
28
+ <span
29
+ v-for="(prcode, index) in settings.prcodes"
30
+ :key="index"
31
+ class="not-last:mr-1"
32
+ >
33
+ <PrCode :prcode="prcode" v-if="!String(prcode).includes('+')" />
34
+ <span v-else >
35
+ <PrCode v-for="(splittedCode, index2) in String(prcode).split('+')" :key="index2" :prcode="splittedCode" />
36
+ </span>
37
+ </span>
38
+ </template>
39
+
@@ -1,53 +1,53 @@
1
- <script lang="ts" setup>
2
- import { PropType } from 'vue';
3
-
4
- const props = defineProps({
5
- as: {
6
- type: String as PropType< 'th'| 'td' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div' | 'span'>,
7
- default: 'div',
8
- required: true,
9
- },
10
- text: {
11
- type: String,
12
- default: '',
13
- required: true,
14
- },
15
- styles: {
16
- type: String,
17
- default: '',
18
- required: false,
19
- }
20
- })
21
- </script>
22
-
23
- <template>
24
- <component :is="props.as" class="font-bold detail-name w-full sm:w-50 flex 2xl:w-64">
25
- <span :class="styles && styles.length ? styles : 'mt-auto'">
26
- <b class="bg-white z-1 colon-after pr-1">{{ props.text }}</b>
27
- </span>
28
- </component>
29
- </template>
30
-
31
-
32
- <style>
33
- .detail-name {
34
- @apply overflow-hidden relative;
35
-
36
- span {
37
- @apply block bg-white relative z-10 pr-1.5 w-full;
38
-
39
- &:before {
40
- /* // order: 2; */
41
- @apply text-gray-300 absolute select-none border-b border-gray-200 w-full -z-1 absolute content-empty left-0;
42
- height: 1em;
43
- white-space: nowrap;
44
- font-weight: 100;
45
- bottom: 2px;
46
- flex: 1;
47
- }
48
- }
49
-
50
-
51
- }
52
-
1
+ <script lang="ts" setup>
2
+ import { PropType } from 'vue';
3
+
4
+ const props = defineProps({
5
+ as: {
6
+ type: String as PropType< 'th'| 'td' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div' | 'span'>,
7
+ default: 'div',
8
+ required: true,
9
+ },
10
+ text: {
11
+ type: String,
12
+ default: '',
13
+ required: true,
14
+ },
15
+ styles: {
16
+ type: String,
17
+ default: '',
18
+ required: false,
19
+ }
20
+ })
21
+ </script>
22
+
23
+ <template>
24
+ <component :is="props.as" class="font-bold detail-name w-full sm:w-50 flex 2xl:w-64">
25
+ <span :class="styles && styles.length ? styles : 'mt-auto'">
26
+ <b class="bg-white z-1 colon-after pr-1">{{ props.text }}</b>
27
+ </span>
28
+ </component>
29
+ </template>
30
+
31
+
32
+ <style>
33
+ .detail-name {
34
+ @apply overflow-hidden relative;
35
+
36
+ span {
37
+ @apply block bg-white relative z-10 pr-1.5 w-full;
38
+
39
+ &:before {
40
+ /* // order: 2; */
41
+ @apply text-gray-300 absolute select-none border-b border-gray-200 w-full -z-1 absolute content-empty left-0;
42
+ height: 1em;
43
+ white-space: nowrap;
44
+ font-weight: 100;
45
+ bottom: 2px;
46
+ flex: 1;
47
+ }
48
+ }
49
+
50
+
51
+ }
52
+
53
53
  </style>
@@ -1,158 +1,158 @@
1
- <script setup lang="ts">
2
- import { PropType, computed } from "vue";
3
- import ProductDetailName from "./ProductDetailName.vue";
4
-
5
- interface TableItem {
6
- id: string;
7
- name: string;
8
- value: unknown;
9
- translated?: boolean;
10
- icon?: boolean;
11
- }
12
-
13
- interface GroupedLink {
14
- id: string;
15
- links: {
16
- name: string;
17
- value: string;
18
- }[];
19
- }
20
-
21
- const props = defineProps({
22
- items: { type: Array as PropType<TableItem[]>, default: () => [] },
23
- caption: { type: String, default: null }
24
- });
25
-
26
- // Function for checking whether a value is a link
27
- const isLink = (id: string) => {
28
- return ['blog', 'youtube', 'vimeo'].includes(id);
29
- };
30
-
31
- // Function for specifying header text
32
- const getHeaderText = (row: TableItem | GroupedLink) => {
33
- // For the blog, we use id instead of name
34
- if (row.id === 'blog') {
35
- return row.id.charAt(0).toUpperCase() + row.id.slice(1); // "Blog" z dużej litery
36
- }
37
-
38
- // For other types, we use name (if it is GroupedLink, there is no name)
39
- return 'name' in row ? row.name : row.id.charAt(0).toUpperCase() + row.id.slice(1);
40
- };
41
-
42
- // Function to determine the icon class for a link type
43
- const getLinkIconClass = (linkId: string) => {
44
- switch (linkId) {
45
- case 'blog':
46
- return 'i-lucide-book-text';
47
- case 'youtube':
48
- return 'i-simple-icons-youtube';
49
- case 'vimeo':
50
- return 'i-simple-icons-vimeo';
51
- default:
52
- return 'i-lucide-link';
53
- }
54
- };
55
-
56
- // Grouping of elements by id
57
- const groupedItems = computed(() => {
58
- const result: (TableItem | GroupedLink)[] = [];
59
- const linkGroups = new Map<string, GroupedLink>();
60
-
61
- // We process all elements
62
- props.items.forEach(item => {
63
- // If it's a link (blog, youtube, vimeo)
64
- if (isLink(item.id)) {
65
- // Add a link to the relevant group
66
- if (!linkGroups.has(item.id)) {
67
- linkGroups.set(item.id, {
68
- id: item.id,
69
- links: []
70
- });
71
- }
72
-
73
- // Dodajemy link do odpowiedniej grupy
74
- linkGroups.get(item.id)?.links.push({
75
- name: item.name,
76
- value: item.value as string
77
- });
78
- } else {
79
- // If it is not a link, we add it normally to the results
80
- result.push(item);
81
- }
82
- });
83
-
84
- // Add all link groups at the end
85
- linkGroups.forEach(group => {
86
- result.push(group);
87
- });
88
-
89
- return result;
90
- });
91
- </script>
92
-
93
- <template>
94
- <table class="details table-auto text-left bg-white">
95
- <caption v-if="!!$slots.caption || caption">
96
- <slot name="caption">{{ caption }}</slot>
97
- </caption>
98
- <colgroup>
99
- <col>
100
- <col>
101
- </colgroup>
102
- <tbody>
103
- <tr v-for="row, index in groupedItems" :key="index">
104
- <!-- We use the getHeaderText function to specify the header text -->
105
- <ProductDetailName as="th" :text="getHeaderText(row)" />
106
-
107
- <!-- Handling link groups -->
108
- <td v-if="'links' in row" class="link-cell">
109
- <ul class="list-none p-0 m-0">
110
- <li v-for="(link, linkIndex) in row.links" :key="linkIndex" class="mb-2 last:mb-0 flex items-center">
111
- <span :class="[getLinkIconClass(row.id), 'leading-none inline-block mr-2 w-4 min-w-4 h-4 text-gray-400']" />
112
- <a :href="link.value" target="_blank" rel="noopener noreferrer" class="link-primary">
113
- {{ link.name }}
114
- </a>
115
- </li>
116
- </ul>
117
- </td>
118
-
119
- <!-- Support for standard types -->
120
- <slot v-else-if="'id' in row" :name="row.id">
121
- <td>{{ row.value }}</td>
122
- </slot>
123
- </tr>
124
- </tbody>
125
- </table>
126
- </template>
127
-
128
- <style scoped>
129
- .details {
130
- @apply border-none shadow-none w-full md:w-auto;
131
- box-shadow: none;
132
-
133
- col {
134
- @apply w-1/2 md:w-auto;
135
- }
136
-
137
- tr {
138
- @apply border-none;
139
- }
140
-
141
- tr,
142
- th {
143
- @apply leading-none text-3.5 py-2 border-none xl:(py-4) 3xl:(text-4);
144
- }
145
-
146
- th {
147
- @apply px-0;
148
- }
149
-
150
- td {
151
- @apply relative;
152
- }
153
- }
154
-
155
- .link-primary {
156
- @apply leading-none text-brand-primary hover:text-accent-light hover:underline;
157
- }
1
+ <script setup lang="ts">
2
+ import { PropType, computed } from "vue";
3
+ import ProductDetailName from "./ProductDetailName.vue";
4
+
5
+ interface TableItem {
6
+ id: string;
7
+ name: string;
8
+ value: unknown;
9
+ translated?: boolean;
10
+ icon?: boolean;
11
+ }
12
+
13
+ interface GroupedLink {
14
+ id: string;
15
+ links: {
16
+ name: string;
17
+ value: string;
18
+ }[];
19
+ }
20
+
21
+ const props = defineProps({
22
+ items: { type: Array as PropType<TableItem[]>, default: () => [] },
23
+ caption: { type: String, default: null }
24
+ });
25
+
26
+ // Function for checking whether a value is a link
27
+ const isLink = (id: string) => {
28
+ return ['blog', 'youtube', 'vimeo'].includes(id);
29
+ };
30
+
31
+ // Function for specifying header text
32
+ const getHeaderText = (row: TableItem | GroupedLink) => {
33
+ // For the blog, we use id instead of name
34
+ if (row.id === 'blog') {
35
+ return row.id.charAt(0).toUpperCase() + row.id.slice(1); // "Blog" z dużej litery
36
+ }
37
+
38
+ // For other types, we use name (if it is GroupedLink, there is no name)
39
+ return 'name' in row ? row.name : row.id.charAt(0).toUpperCase() + row.id.slice(1);
40
+ };
41
+
42
+ // Function to determine the icon class for a link type
43
+ const getLinkIconClass = (linkId: string) => {
44
+ switch (linkId) {
45
+ case 'blog':
46
+ return 'i-lucide-book-text';
47
+ case 'youtube':
48
+ return 'i-simple-icons-youtube';
49
+ case 'vimeo':
50
+ return 'i-simple-icons-vimeo';
51
+ default:
52
+ return 'i-lucide-link';
53
+ }
54
+ };
55
+
56
+ // Grouping of elements by id
57
+ const groupedItems = computed(() => {
58
+ const result: (TableItem | GroupedLink)[] = [];
59
+ const linkGroups = new Map<string, GroupedLink>();
60
+
61
+ // We process all elements
62
+ props.items.forEach(item => {
63
+ // If it's a link (blog, youtube, vimeo)
64
+ if (isLink(item.id)) {
65
+ // Add a link to the relevant group
66
+ if (!linkGroups.has(item.id)) {
67
+ linkGroups.set(item.id, {
68
+ id: item.id,
69
+ links: []
70
+ });
71
+ }
72
+
73
+ // Dodajemy link do odpowiedniej grupy
74
+ linkGroups.get(item.id)?.links.push({
75
+ name: item.name,
76
+ value: item.value as string
77
+ });
78
+ } else {
79
+ // If it is not a link, we add it normally to the results
80
+ result.push(item);
81
+ }
82
+ });
83
+
84
+ // Add all link groups at the end
85
+ linkGroups.forEach(group => {
86
+ result.push(group);
87
+ });
88
+
89
+ return result;
90
+ });
91
+ </script>
92
+
93
+ <template>
94
+ <table class="details table-auto text-left bg-white">
95
+ <caption v-if="!!$slots.caption || caption">
96
+ <slot name="caption">{{ caption }}</slot>
97
+ </caption>
98
+ <colgroup>
99
+ <col>
100
+ <col>
101
+ </colgroup>
102
+ <tbody>
103
+ <tr v-for="row, index in groupedItems" :key="index">
104
+ <!-- We use the getHeaderText function to specify the header text -->
105
+ <ProductDetailName as="th" :text="getHeaderText(row)" />
106
+
107
+ <!-- Handling link groups -->
108
+ <td v-if="'links' in row" class="link-cell">
109
+ <ul class="list-none p-0 m-0">
110
+ <li v-for="(link, linkIndex) in row.links" :key="linkIndex" class="mb-2 last:mb-0 flex items-center">
111
+ <span :class="[getLinkIconClass(row.id), 'leading-none inline-block mr-2 w-4 min-w-4 h-4 text-gray-400']" />
112
+ <a :href="link.value" target="_blank" rel="noopener noreferrer" class="link-primary">
113
+ {{ link.name }}
114
+ </a>
115
+ </li>
116
+ </ul>
117
+ </td>
118
+
119
+ <!-- Support for standard types -->
120
+ <slot v-else-if="'id' in row" :name="row.id">
121
+ <td>{{ row.value }}</td>
122
+ </slot>
123
+ </tr>
124
+ </tbody>
125
+ </table>
126
+ </template>
127
+
128
+ <style scoped>
129
+ .details {
130
+ @apply border-none shadow-none w-full md:w-auto;
131
+ box-shadow: none;
132
+
133
+ col {
134
+ @apply w-1/2 md:w-auto;
135
+ }
136
+
137
+ tr {
138
+ @apply border-none;
139
+ }
140
+
141
+ tr,
142
+ th {
143
+ @apply leading-none text-3.5 py-2 border-none xl:(py-4) 3xl:(text-4);
144
+ }
145
+
146
+ th {
147
+ @apply px-0;
148
+ }
149
+
150
+ td {
151
+ @apply relative;
152
+ }
153
+ }
154
+
155
+ .link-primary {
156
+ @apply leading-none text-brand-primary hover:text-accent-light hover:underline;
157
+ }
158
158
  </style>
@@ -1,48 +1,48 @@
1
- ---
2
- const { productObject, locale, index } = Astro.props;
3
- import Image from "./Image.astro"
4
- import ProductNumber from "./Product/ProductNumber.astro"
5
- import { t } from "i18next";
6
- ---
7
-
8
- { productObject &&
9
- (
10
-
11
- <!-- product image -->
12
- <div class="img--4/3 img--small">
13
- { productObject.photo !== null ?
14
- <Image
15
- imageObject={
16
- {
17
- src: 'https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337',
18
- alt: 'Image Alt',
19
- height: '180',
20
- width: '240',
21
- class: 'img--overlay object-cover'
22
- }
23
- }
24
- />
25
- :
26
- <img src="/1x1.png" class="bg-gray-100/70" alt={productObject.name} />
27
- }
28
- </div>
29
-
30
- <!-- product deails -->
31
- <div class="sm:pl-4 flex flex-col" >
32
- <a class="font-light leading-none mb-2 pr-4 line-clamp-2 h-[2em] before:(content-empty absolute left-0 right-4 h-full top-0)"
33
- href={productObject.url} itemprop="url"
34
- title={productObject.number}
35
- >
36
- { productObject.name }
37
- </a>
38
-
39
- <ProductNumber productNumber={productObject.number} copyDisabled={false} buttonTexts={{ copy: t('copy'), copied: t('copied') }} />
40
-
41
- { index !== null &&
42
- ( <meta itemprop="position" content={String(index)} />
43
- <meta itemprop="name" content={productObject.name} /> )
44
- }
45
- </div>
46
-
47
- )}
48
-
1
+ ---
2
+ const { productObject, locale, index } = Astro.props;
3
+ import Image from "./Image.astro"
4
+ import ProductNumber from "./Product/ProductNumber.astro"
5
+ import { t } from "i18next";
6
+ ---
7
+
8
+ { productObject &&
9
+ (
10
+
11
+ <!-- product image -->
12
+ <div class="img--4/3 img--small">
13
+ { productObject.photo !== null ?
14
+ <Image
15
+ imageObject={
16
+ {
17
+ src: 'https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337',
18
+ alt: 'Image Alt',
19
+ height: '180',
20
+ width: '240',
21
+ class: 'img--overlay object-cover'
22
+ }
23
+ }
24
+ />
25
+ :
26
+ <img src="/1x1.png" class="bg-gray-100/70" alt={productObject.name} />
27
+ }
28
+ </div>
29
+
30
+ <!-- product deails -->
31
+ <div class="sm:pl-4 flex flex-col" >
32
+ <a class="font-light leading-none mb-2 pr-4 line-clamp-2 h-[2em] before:(content-empty absolute left-0 right-4 h-full top-0)"
33
+ href={productObject.url} itemprop="url"
34
+ title={productObject.number}
35
+ >
36
+ { productObject.name }
37
+ </a>
38
+
39
+ <ProductNumber productNumber={productObject.number} copyDisabled={false} buttonTexts={{ copy: t('copy'), copied: t('copied') }} />
40
+
41
+ { index !== null &&
42
+ ( <meta itemprop="position" content={String(index)} />
43
+ <meta itemprop="name" content={productObject.name} /> )
44
+ }
45
+ </div>
46
+
47
+ )}
48
+
@@ -1,23 +1,23 @@
1
- <script setup lang="ts">
2
- import { 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: 'div',
8
- required: false,
9
- },
10
- text: {
11
- type: String,
12
- default: '',
13
- required: false,
14
- }
15
- })
16
- </script>
17
-
18
- <template>
19
- <component :is="props.as"
20
- class="px-8 sm:px-8 mx-4 sm:mx-6 lg:max-w-4xl drop-shadow-primary text-2xl md:text-4xl lg:text-4.5xl relative font-light after:left-0 after:content-empty after:rounded-3xl after:top-0 after:absolute after:h-full after:border-solid after:border-[var(--primary)] after:border-l-3 after:z-0">
21
- <slot>{{ props.text }}</slot>
22
- </component>
23
- </template>
1
+ <script setup lang="ts">
2
+ import { 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: 'div',
8
+ required: false,
9
+ },
10
+ text: {
11
+ type: String,
12
+ default: '',
13
+ required: false,
14
+ }
15
+ })
16
+ </script>
17
+
18
+ <template>
19
+ <component :is="props.as"
20
+ class="px-8 sm:px-8 mx-4 sm:mx-6 lg:max-w-4xl drop-shadow-primary text-2xl md:text-4xl lg:text-4.5xl relative font-light after:left-0 after:content-empty after:rounded-3xl after:top-0 after:absolute after:h-full after:border-solid after:border-[var(--primary)] after:border-l-3 after:z-0">
21
+ <slot>{{ props.text }}</slot>
22
+ </component>
23
+ </template>