@geckou/ui-vue 0.3.0

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +253 -0
  3. package/dist/assets/scss/functions.scss +6 -0
  4. package/dist/assets/scss/mixin.scss +33 -0
  5. package/dist/components/ArticleList/Card/Artistic.vue +310 -0
  6. package/dist/components/ArticleList/Card/Entertainment.vue +244 -0
  7. package/dist/components/ArticleList/Card/Gallery.vue +254 -0
  8. package/dist/components/ArticleList/Card/Grid.vue +247 -0
  9. package/dist/components/ArticleList/Card/News.vue +150 -0
  10. package/dist/components/ArticleList/Card/Rounded.vue +154 -0
  11. package/dist/components/ArticleList/Card/Row.vue +167 -0
  12. package/dist/components/ArticleList/Card/Simple.vue +232 -0
  13. package/dist/components/ArticleList/Card/Standard.vue +187 -0
  14. package/dist/components/ArticleList/Card/Tile.vue +171 -0
  15. package/dist/components/ArticleList/GenericArticleList.vue +143 -0
  16. package/dist/components/ArticleList/List/Artistic.vue +24 -0
  17. package/dist/components/ArticleList/List/Entertainment.vue +24 -0
  18. package/dist/components/ArticleList/List/Gallery.vue +24 -0
  19. package/dist/components/ArticleList/List/Grid.vue +216 -0
  20. package/dist/components/ArticleList/List/News.vue +24 -0
  21. package/dist/components/ArticleList/List/Rounded.vue +24 -0
  22. package/dist/components/ArticleList/List/Row.vue +24 -0
  23. package/dist/components/ArticleList/List/Simple.vue +24 -0
  24. package/dist/components/ArticleList/List/Standard.vue +24 -0
  25. package/dist/components/ArticleList/List/Tile.vue +24 -0
  26. package/dist/components/ArticleList/Parts/AuthorInfo.vue +100 -0
  27. package/dist/components/ArticleList/Parts/CardContainer.vue +23 -0
  28. package/dist/components/ArticleList/Parts/CardHeading.vue +43 -0
  29. package/dist/components/ArticleList/Parts/CategoryList.vue +41 -0
  30. package/dist/components/ArticleList/Parts/ExcerptText.vue +43 -0
  31. package/dist/components/ArticleList/Parts/MetadataList.vue +120 -0
  32. package/dist/components/ArticleList/Parts/NoImage.vue +36 -0
  33. package/dist/components/ArticleList/Parts/PostedDate.vue +41 -0
  34. package/dist/components/ArticleList/Parts/TagList.vue +41 -0
  35. package/dist/components/ArticleList/Parts/ThumbnailImage.vue +85 -0
  36. package/dist/components/BasicButton.vue +143 -0
  37. package/dist/components/CheckBox.vue +140 -0
  38. package/dist/components/CheckBoxes.vue +100 -0
  39. package/dist/components/CheckButton.vue +127 -0
  40. package/dist/components/DatePicker.vue +234 -0
  41. package/dist/components/DateRangePicker.vue +85 -0
  42. package/dist/components/DateSelector.vue +273 -0
  43. package/dist/components/DropdownUi.vue +118 -0
  44. package/dist/components/ErrorMessage.vue +61 -0
  45. package/dist/components/Icon/CalendarIcon.vue +8 -0
  46. package/dist/components/Icon/CheckIcon.vue +8 -0
  47. package/dist/components/Icon/CloseIcon.vue +8 -0
  48. package/dist/components/Icon/Folder.vue +8 -0
  49. package/dist/components/Icon/Image.vue +14 -0
  50. package/dist/components/Icon/KeyboardArrowDownIcon.vue +8 -0
  51. package/dist/components/Icon/Tag.vue +8 -0
  52. package/dist/components/InputBox.vue +134 -0
  53. package/dist/components/InputGroup.vue +41 -0
  54. package/dist/components/LabeledCheckbox.vue +82 -0
  55. package/dist/components/LabeledFieldset.vue +41 -0
  56. package/dist/components/LoadingSpinner.vue +56 -0
  57. package/dist/components/ModalBox.vue +192 -0
  58. package/dist/components/PopupBox.vue +93 -0
  59. package/dist/components/RadioButtons.vue +163 -0
  60. package/dist/components/SelectBox.vue +166 -0
  61. package/dist/components/SlideDownUi.vue +123 -0
  62. package/dist/components/TabUI.vue +123 -0
  63. package/dist/components/TextArea.vue +115 -0
  64. package/dist/components/TextBox.vue +111 -0
  65. package/dist/components/TextButton.vue +47 -0
  66. package/dist/components/ToggleButton.vue +179 -0
  67. package/dist/const/index.ts +2 -0
  68. package/dist/const/list-theme.ts +62 -0
  69. package/dist/index.ts +126 -0
  70. package/dist/scripts/form-validation-manager.ts +63 -0
  71. package/dist/scripts/utils.ts +36 -0
  72. package/dist/types/custom.d.ts +1 -0
  73. package/dist/types/index.d.ts +93 -0
  74. package/dist/types/vue-shim.d.ts +5 -0
  75. package/package.json +44 -0
@@ -0,0 +1,247 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ Article,
4
+ Category,
5
+ PostConfig,
6
+ } from '../../../types'
7
+ import CardContainer from '../../../components/ArticleList/Parts/CardContainer.vue'
8
+ import ThumbnailImage from '../../../components/ArticleList/Parts/ThumbnailImage.vue'
9
+ import AuthorInfo from '../../../components/ArticleList/Parts/AuthorInfo.vue'
10
+ import CardHeading from '../../../components/ArticleList/Parts/CardHeading.vue'
11
+ import CategoryList from '../../../components/ArticleList/Parts/CategoryList.vue'
12
+ import TagList from '../../../components/ArticleList/Parts/TagList.vue'
13
+ import PostedDate from '../../../components/ArticleList/Parts/PostedDate.vue'
14
+ import ExcerptText from '../../../components/ArticleList/Parts/ExcerptText.vue'
15
+
16
+ defineProps<{
17
+ article: Article
18
+ path: string
19
+ isPickUpItem: boolean
20
+ postConfig: PostConfig
21
+ categories: Category[]
22
+ direction: 'horizontal' | 'vertical'
23
+ }>()
24
+
25
+ </script>
26
+
27
+ <template>
28
+ <CardContainer
29
+ v-if="article"
30
+ :class="[
31
+ $style.container,
32
+ { [$style.pickup]: isPickUpItem},
33
+ $style[direction],
34
+ ]"
35
+ :path="path"
36
+ >
37
+ <ThumbnailImage
38
+ :article="article"
39
+ :aspectRatio="{
40
+ desktop: isPickUpItem ? '21/9' : '4/3',
41
+ tablet : isPickUpItem ? '21/9' : '4/3',
42
+ mobile : '4/3',
43
+ }"
44
+ :class="$style.thumbnail"
45
+ style="grid-area: thumbnail;"
46
+ />
47
+
48
+ <div
49
+ :class="$style.date"
50
+ style="grid-area: date;"
51
+ >
52
+ <PostedDate
53
+ :date="article.date"
54
+ formatString="M.d"
55
+ color="var(--white)"
56
+ fontWeight="bold"
57
+ />
58
+ <PostedDate
59
+ :date="article.date"
60
+ formatString="yyyy"
61
+ color="var(--white)"
62
+ fontWeight="bold"
63
+ />
64
+ </div>
65
+ <CardHeading
66
+ :heading="article.title.rendered"
67
+ :class="$style.heading"
68
+ :fontSize="isPickUpItem ? 'large' : 'medium'"
69
+ :color="isPickUpItem && direction === 'horizontal' ? 'var(--white)' : 'var(--text-color)'"
70
+ style="grid-area: heading;"
71
+ />
72
+ <ExcerptText
73
+ :excerpt="article.excerpt.rendered"
74
+ :class="$style.excerpt"
75
+ :row="2"
76
+ fontSize="small"
77
+ style="grid-area: excerpt;"
78
+ />
79
+ <AuthorInfo
80
+ v-if="postConfig.author"
81
+ :avatarUrls="article._embedded.author[0].avatar_urls"
82
+ :thumbnail="{
83
+ size : 'large',
84
+ shape: 'square',
85
+ }"
86
+ :class="$style.author"
87
+ style="grid-area: author;"
88
+ />
89
+ <CategoryList
90
+ v-if="postConfig.category && article.categories"
91
+ :categoryIds="article.categories"
92
+ :categoryData="categories"
93
+ :label="{
94
+ color : 'var(--gray)',
95
+ fontSize: 'smaller',
96
+ }"
97
+ :class="$style.category"
98
+ style="grid-area: category;"
99
+ />
100
+ <TagList
101
+ v-if="postConfig.tag"
102
+ :article="article"
103
+ :label="{
104
+ color : 'var(--gray)',
105
+ fontSize: 'smaller',
106
+ }"
107
+ :class="$style.tag"
108
+ style="grid-area: tag;"
109
+ />
110
+ </CardContainer>
111
+ </template>
112
+
113
+ <style lang="scss" module>
114
+ @use '../../../assets/scss/mixin' as *;
115
+
116
+ .container {
117
+ --date-size: calc(var(--bv) * 7);
118
+ grid-template-columns: auto 1fr auto;
119
+ grid-template-rows : fit-content(50%) auto 1fr auto auto;
120
+ grid-template-areas :
121
+ 'thumbnail thumbnail thumbnail'
122
+ 'date heading heading'
123
+ 'excerpt excerpt excerpt'
124
+ 'category category author'
125
+ 'tag tag author';
126
+ height : 100%;
127
+ box-shadow: 0 0 1px 0 rgba(var(--black-rgb), .4);
128
+ transition: box-shadow var(--animation-duration) linear;
129
+
130
+ &:hover {
131
+ box-shadow: 0 0 var(--sp-small) 2px rgba(var(--black-rgb), .2);
132
+ }
133
+
134
+ @include media('tablet') {
135
+ &.horizontal {
136
+ grid-template-columns: fit-content(50%) auto 1fr auto;
137
+ grid-template-rows : auto 1fr auto auto;
138
+ grid-template-areas :
139
+ 'thumbnail date heading heading'
140
+ 'thumbnail excerpt excerpt excerpt'
141
+ 'thumbnail category category author'
142
+ 'thumbnail tag tag author';
143
+ }
144
+
145
+ &.pickup {
146
+ grid-template-columns: 1fr;
147
+ grid-template-rows : 1fr 0 0;
148
+ grid-template-areas :
149
+ 'thumbnail'
150
+ 'heading'
151
+ 'date';
152
+ text-align: left;
153
+
154
+ .thumbnail {
155
+ position: relative;
156
+
157
+ &::before {
158
+ content : '';
159
+ display : block;
160
+ width : 100%;
161
+ height : 100%;
162
+ background-color: rgba(var(--black-rgb), .6);
163
+ mix-blend-mode : multiply;
164
+ pointer-events : none;
165
+ position : absolute;
166
+ top : 0;
167
+ left : 0;
168
+ z-index : 1;
169
+ transition : all var(--animation-duration);
170
+ }
171
+ }
172
+
173
+ .heading,
174
+ .date {
175
+ position: absolute;
176
+ z-index : 2;
177
+ }
178
+
179
+ .heading {
180
+ padding : 0;
181
+ padding-right: var(--sp-medium);
182
+ left : calc(var(--date-size) + var(--sp-medium) * 2);
183
+ bottom : var(--sp-medium);
184
+ }
185
+
186
+ .date {
187
+ margin: 0;
188
+ bottom: var(--sp-medium);
189
+ left : var(--sp-medium);
190
+ }
191
+
192
+ .excerpt,
193
+ .category,
194
+ .tag,
195
+ .author {
196
+ display: none;
197
+ }
198
+ }
199
+ }
200
+ }
201
+
202
+ .date {
203
+ display : flex;
204
+ flex-direction : column;
205
+ justify-content : center;
206
+ align-items : center;
207
+ gap : var(--sp-min);
208
+ width : var(--date-size);
209
+ height : var(--date-size);
210
+ margin : var(--sp-medium);
211
+ background-color: var(--black);
212
+
213
+ > * {
214
+ letter-spacing: .1em;
215
+ line-height : 1;
216
+ }
217
+ }
218
+
219
+ .heading {
220
+ display : flex;
221
+ align-items : center;
222
+ padding : var(--sp-medium);
223
+ padding-inline-start: 0;
224
+
225
+ > h2 {
226
+ @include textEllipsis(2);
227
+ }
228
+ }
229
+
230
+ .category,
231
+ .tag {
232
+ margin-inline-start: var(--sp-medium);
233
+ padding-block-end : var(--sp-medium);
234
+ }
235
+
236
+ .category {
237
+ align-items: flex-end;
238
+ }
239
+
240
+ .author {
241
+ padding: var(--sp-medium);
242
+ }
243
+
244
+ .excerpt {
245
+ padding: var(--sp-medium);
246
+ }
247
+ </style>
@@ -0,0 +1,150 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ Article,
4
+ Category,
5
+ PostConfig,
6
+ } from '../../../types'
7
+ import CardContainer from '../../../components/ArticleList/Parts/CardContainer.vue'
8
+ import ThumbnailImage from '../../../components/ArticleList/Parts/ThumbnailImage.vue'
9
+ import AuthorInfo from '../../../components/ArticleList/Parts/AuthorInfo.vue'
10
+ import CardHeading from '../../../components/ArticleList/Parts/CardHeading.vue'
11
+ import CategoryList from '../../../components/ArticleList/Parts/CategoryList.vue'
12
+ import TagList from '../../../components/ArticleList/Parts/TagList.vue'
13
+ import PostedDate from '../../../components/ArticleList/Parts/PostedDate.vue'
14
+ import ExcerptText from '../../../components/ArticleList/Parts/ExcerptText.vue'
15
+
16
+ defineProps<{
17
+ article: Article
18
+ path: string
19
+ postConfig: PostConfig
20
+ categories: Category[]
21
+ }>()
22
+ </script>
23
+
24
+ <template>
25
+ <CardContainer
26
+ v-if="article"
27
+ :class="$style.container"
28
+ :path="path"
29
+ >
30
+ <ThumbnailImage
31
+ :article="article"
32
+ :aspectRatio="{
33
+ desktop: '16/9',
34
+ tablet : '4/3',
35
+ mobile : '1/1',
36
+ }"
37
+ :class="$style.thumbnail"
38
+ style="grid-area: thumbnail;"
39
+ />
40
+ <PostedDate
41
+ :date="article.date"
42
+ :class="$style.date"
43
+ formatString="yyyy.M.d"
44
+ fontWeight="bold"
45
+ style="grid-area: date;"
46
+ />
47
+ <CategoryList
48
+ v-if="postConfig.category && article.categories"
49
+ :categoryIds="article.categories"
50
+ :categoryData="categories"
51
+ :label="{
52
+ color : 'var(--main-color)',
53
+ fontSize: 'small',
54
+ }"
55
+ :class="$style.category"
56
+ style="grid-area: category;"
57
+ />
58
+ <CardHeading
59
+ :heading="article.title.rendered"
60
+ :class="$style.heading"
61
+ style="grid-area: heading;"
62
+ />
63
+ <ExcerptText
64
+ :excerpt="article.excerpt.rendered"
65
+ :class="$style.excerpt"
66
+ style="grid-area: excerpt;"
67
+ />
68
+ <TagList
69
+ v-if="postConfig.tag"
70
+ :article="article"
71
+ :label="{
72
+ color : 'var(--gray)',
73
+ fontSize: 'small',
74
+ }"
75
+ :class="$style.tag"
76
+ style="grid-area: tag;"
77
+ />
78
+ <AuthorInfo
79
+ v-if="postConfig.author"
80
+ :name="article._embedded.author[0].name"
81
+ :class="$style.author"
82
+ :text="{
83
+ color : 'var(--gray)',
84
+ preposition: 'by',
85
+ }"
86
+ fontSize="small"
87
+ style="grid-area: author;"
88
+ />
89
+ </CardContainer>
90
+ </template>
91
+
92
+ <style lang="scss" module>
93
+ @use '../../../assets/scss/mixin' as *;
94
+
95
+ .container {
96
+ grid-template-columns : 28% auto auto;
97
+ grid-template-rows : auto auto 1fr auto;
98
+ grid-template-areas :
99
+ 'thumbnail date category'
100
+ 'thumbnail heading heading'
101
+ 'thumbnail excerpt excerpt'
102
+ 'thumbnail tag author';
103
+ row-gap : var(--sp-small);
104
+ column-gap: var(--sp-large);
105
+
106
+ @include media('mobile') {
107
+ grid-template-columns: 33% auto auto;
108
+ column-gap : var(--sp-medium);
109
+ }
110
+
111
+ &:hover {
112
+ .thumbnail {
113
+ opacity: .8;
114
+ }
115
+ }
116
+ }
117
+
118
+ .thumbnail {
119
+ transition: opacity var(--animation-duration);
120
+ }
121
+
122
+ .heading {
123
+ @include textEllipsis();
124
+ }
125
+
126
+ .category,
127
+ .tag {
128
+ li {
129
+ @include media('mobile') {
130
+ @include textEllipsis();
131
+ }
132
+ }
133
+ }
134
+
135
+ .category {
136
+ justify-content: flex-end;
137
+ }
138
+
139
+ .excerpt {
140
+ > p {
141
+ @include media('mobile') {
142
+ @include textEllipsis(2);
143
+ }
144
+ }
145
+ }
146
+
147
+ .author {
148
+ justify-content: flex-end;
149
+ }
150
+ </style>
@@ -0,0 +1,154 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ Article,
4
+ Category,
5
+ PostConfig,
6
+ } from '../../../types'
7
+ import CardContainer from '../../../components/ArticleList/Parts/CardContainer.vue'
8
+ import ThumbnailImage from '../../../components/ArticleList/Parts/ThumbnailImage.vue'
9
+ import AuthorInfo from '../../../components/ArticleList/Parts/AuthorInfo.vue'
10
+ import CardHeading from '../../../components/ArticleList/Parts/CardHeading.vue'
11
+ import CategoryList from '../../../components/ArticleList/Parts/CategoryList.vue'
12
+ import TagList from '../../../components/ArticleList/Parts/TagList.vue'
13
+ import PostedDate from '../../../components/ArticleList/Parts/PostedDate.vue'
14
+ import ExcerptText from '../../../components/ArticleList/Parts/ExcerptText.vue'
15
+
16
+ defineProps<{
17
+ article: Article
18
+ path: string
19
+ isPickUpItem: boolean
20
+ postConfig: PostConfig
21
+ categories: Category[]
22
+ }>()
23
+ </script>
24
+
25
+ <template>
26
+ <CardContainer
27
+ v-if="article"
28
+ :path="path"
29
+ :class="[$style.container, {[$style.pickup]: isPickUpItem}]"
30
+ >
31
+ <ThumbnailImage
32
+ :article="article"
33
+ :class="$style.thumbnail"
34
+ style="grid-area: thumbnail;"
35
+ />
36
+ <PostedDate
37
+ :date="article.date"
38
+ formatString="yy.M.d"
39
+ color="var(--gray)"
40
+ :class="$style.date"
41
+ style="grid-area: date;"
42
+ />
43
+ <AuthorInfo
44
+ v-if="postConfig.author"
45
+ :avatarUrls="article._embedded.author[0].avatar_urls"
46
+ :thumbnail="{
47
+ shape: 'circle',
48
+ }"
49
+ :class="$style.author"
50
+ direction="row-reverse"
51
+ style="grid-area: author;"
52
+ />
53
+ <CardHeading
54
+ :heading="article.title.rendered"
55
+ :class="$style.heading"
56
+ style="grid-area: heading;"
57
+ />
58
+ <CategoryList
59
+ v-if="postConfig.category && article.categories"
60
+ :categoryIds="article.categories"
61
+ :categoryData="categories"
62
+ :icon="{ color: 'var(--main-color)' }"
63
+ :label="{
64
+ backgroundColor: 'var(--main-color)',
65
+ color : 'var(--white)',
66
+ fontSize : 'small',
67
+ shape : 'rounded',
68
+ }"
69
+ :class="$style.category"
70
+ style="grid-area: category;"
71
+ />
72
+ <TagList
73
+ v-if="postConfig.tag"
74
+ :article="article"
75
+ :icon="{ color: 'var(--sub-color)' }"
76
+ :label="{
77
+ backgroundColor: 'var(--sub-color)',
78
+ color : 'var(--white)',
79
+ fontSize : 'smaller',
80
+ shape : 'rounded',
81
+ }"
82
+ :class="$style.tag"
83
+ style="grid-area: tag;"
84
+ />
85
+ <ExcerptText
86
+ :excerpt="article.excerpt.rendered"
87
+ :class="$style.excerpt"
88
+ style="grid-area: excerpt;"
89
+ />
90
+ </CardContainer>
91
+ </template>
92
+
93
+ <style lang="scss" module>
94
+ @use '../../../assets/scss/mixin' as *;
95
+
96
+ .container {
97
+ grid-template-columns: auto auto;
98
+ grid-template-rows : auto auto auto auto auto 1fr;
99
+ grid-template-areas :
100
+ 'thumbnail thumbnail'
101
+ 'date author'
102
+ 'heading heading'
103
+ 'category category'
104
+ 'tag tag'
105
+ 'excerpt excerpt';
106
+ gap: var(--sp-small);
107
+
108
+ &:hover {
109
+ .thumbnail {
110
+ opacity: .8;
111
+ }
112
+ }
113
+
114
+ &.pickup {
115
+ @include media('tablet') {
116
+ grid-template-columns: calc((100% - var(--sp-larger) * 2) / 3) auto auto;
117
+ grid-template-rows : auto auto auto auto 1fr;
118
+ grid-template-areas :
119
+ 'thumbnail date author'
120
+ 'thumbnail heading heading'
121
+ 'thumbnail category category'
122
+ 'thumbnail tag tag'
123
+ 'thumbnail excerpt excerpt';
124
+ column-gap: var(--sp-larger);
125
+
126
+ .thumbnail {
127
+ margin-inline-end: var(--sp-larger);
128
+ margin-block-end: 0;
129
+ }
130
+
131
+ .heading {
132
+ font-size: xx-large;
133
+ }
134
+ }
135
+ }
136
+ }
137
+
138
+ .date {
139
+ align-items: center;
140
+ }
141
+
142
+ .thumbnail {
143
+ transition : opacity var(--animation-duration);
144
+ margin-block-end: var(--sp-small);
145
+
146
+ > * {
147
+ border-radius: var(--bv);
148
+ }
149
+ }
150
+
151
+ .heading {
152
+ margin-block-end: var(--sp-small);
153
+ }
154
+ </style>
@@ -0,0 +1,167 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ Article,
4
+ Category,
5
+ PostConfig,
6
+ } from '../../../types'
7
+ import CardContainer from '../../../components/ArticleList/Parts/CardContainer.vue'
8
+ import ThumbnailImage from '../../../components/ArticleList/Parts/ThumbnailImage.vue'
9
+ import AuthorInfo from '../../../components/ArticleList/Parts/AuthorInfo.vue'
10
+ import CardHeading from '../../../components/ArticleList/Parts/CardHeading.vue'
11
+ import CategoryList from '../../../components/ArticleList/Parts/CategoryList.vue'
12
+ import TagList from '../../../components/ArticleList/Parts/TagList.vue'
13
+ import PostedDate from '../../../components/ArticleList/Parts/PostedDate.vue'
14
+ import ExcerptText from '../../../components/ArticleList/Parts/ExcerptText.vue'
15
+
16
+ defineProps<{
17
+ article: Article
18
+ path: string
19
+ postConfig: PostConfig
20
+ categories: Category[]
21
+ }>()
22
+ </script>
23
+
24
+ <template>
25
+ <CardContainer
26
+ v-if="article"
27
+ :class="$style.container"
28
+ :path="path"
29
+ >
30
+ <CategoryList
31
+ v-if="postConfig.category && article.categories"
32
+ :categoryIds="article.categories"
33
+ :categoryData="categories"
34
+ :label="{
35
+ color : 'var(--gray)',
36
+ fontSize : 'clamp(24px, 0.55rem + 2.99vw, 40px)',
37
+ }"
38
+ :class="$style.category"
39
+ style="grid-area: category;"
40
+ />
41
+ <ThumbnailImage
42
+ :article="article"
43
+ :aspectRatio="{
44
+ desktop: '21/9',
45
+ tablet : '21/9',
46
+ mobile : '21/9',
47
+ }"
48
+ :class="$style.thumbnail"
49
+ style="grid-area: thumbnail;"
50
+ />
51
+ <PostedDate
52
+ :date="article.date"
53
+ formatString="yy.M.d"
54
+ :class="$style.date"
55
+ color="var(--gray)"
56
+ style="grid-area: date;"
57
+ />
58
+ <CardHeading
59
+ :heading="article.title.rendered"
60
+ :class="$style.heading"
61
+ style="grid-area: heading;"
62
+ />
63
+ <ExcerptText
64
+ :excerpt="article.excerpt.rendered"
65
+ :class="$style.excerpt"
66
+ fontSize="small"
67
+ style="grid-area: excerpt;"
68
+ />
69
+ <TagList
70
+ v-if="postConfig.tag"
71
+ :article="article"
72
+ :label="{
73
+ color : 'var(--text-color)',
74
+ fontSize: 'small',
75
+ }"
76
+ :class="$style.tag"
77
+ delimiter="/"
78
+ style="grid-area: tag;"
79
+ />
80
+ <AuthorInfo
81
+ v-if="postConfig.author"
82
+ :avatarUrls="article._embedded.author[0].avatar_urls"
83
+ :name="article._embedded.author[0].name"
84
+ :class="$style.author"
85
+ :text="{
86
+ fontSize: 'small',
87
+ color : 'var(--gray)',
88
+ }"
89
+ style="grid-area: author;"
90
+ />
91
+ </CardContainer>
92
+ </template>
93
+
94
+ <style lang="scss" module>
95
+ @use '../../../assets/scss/mixin' as *;
96
+
97
+ .container {
98
+ grid-template-columns: 50% 1fr auto;
99
+ grid-template-rows : auto auto auto 1fr auto;
100
+ grid-template-areas :
101
+ 'category category category'
102
+ 'thumbnail date date'
103
+ 'thumbnail heading heading'
104
+ 'thumbnail excerpt excerpt'
105
+ 'thumbnail tag author';
106
+ column-gap: var(--sp-large);
107
+
108
+ &::before {
109
+ content : '';
110
+ display : block;
111
+ width : calc(100% + var(--sp-medium));
112
+ height : 100%;
113
+ background-color: var(--primary-color);
114
+ mix-blend-mode : soft-light;
115
+ position : absolute;
116
+ top : var(--sp-small);
117
+ left : calc(-1 * var(--sp-small));
118
+ transition : opacity var(--animation-duration);
119
+ opacity : 0;
120
+ pointer-events : none;
121
+ }
122
+
123
+ &:hover {
124
+ &::before {
125
+ opacity: .1;
126
+ }
127
+ }
128
+
129
+ @include media('mobile') {
130
+ grid-template-columns: 1fr auto;
131
+ grid-template-rows : auto auto auto auto 1fr auto;
132
+ grid-template-areas :
133
+ 'category category'
134
+ 'thumbnail thumbnail'
135
+ 'date date'
136
+ 'heading heading'
137
+ 'excerpt excerpt'
138
+ 'tag author';
139
+ column-gap: 0;
140
+ }
141
+ }
142
+
143
+ .thumbnail {
144
+ @include media('mobile') {
145
+ margin-block-end: var(--sp-small);
146
+ }
147
+ }
148
+
149
+ .excerpt {
150
+ @include media('mobile') {
151
+ margin-block-end: var(--sp-medium);
152
+ }
153
+ }
154
+
155
+ .category {
156
+ position: relative;
157
+ top : var(--sp-small);
158
+ }
159
+
160
+ .heading {
161
+ margin-block-end: var(--sp-medium);
162
+ }
163
+
164
+ .tag {
165
+ padding-block: var(--sp-small);
166
+ }
167
+ </style>