@o2vend/theme-cli 1.0.32
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/README.md +425 -0
- package/assets/Logo_o2vend.png +0 -0
- package/assets/favicon.png +0 -0
- package/assets/logo-white.png +0 -0
- package/bin/o2vend +42 -0
- package/config/widget-map.json +50 -0
- package/lib/commands/check.js +201 -0
- package/lib/commands/generate.js +33 -0
- package/lib/commands/init.js +214 -0
- package/lib/commands/optimize.js +216 -0
- package/lib/commands/package.js +208 -0
- package/lib/commands/serve.js +105 -0
- package/lib/commands/validate.js +191 -0
- package/lib/lib/api-client.js +357 -0
- package/lib/lib/dev-server.js +2618 -0
- package/lib/lib/file-watcher.js +80 -0
- package/lib/lib/hot-reload.js +106 -0
- package/lib/lib/liquid-engine.js +822 -0
- package/lib/lib/liquid-filters.js +671 -0
- package/lib/lib/mock-api-server.js +989 -0
- package/lib/lib/mock-data.js +1468 -0
- package/lib/lib/widget-service.js +321 -0
- package/package.json +70 -0
- package/test-theme/README.md +27 -0
- package/test-theme/assets/async-sections.js +446 -0
- package/test-theme/assets/cart-drawer.js +463 -0
- package/test-theme/assets/cart-manager.js +223 -0
- package/test-theme/assets/checkout-price-handler.js +368 -0
- package/test-theme/assets/components.css +4629 -0
- package/test-theme/assets/delivery-zone.css +299 -0
- package/test-theme/assets/delivery-zone.js +396 -0
- package/test-theme/assets/logo.png +0 -0
- package/test-theme/assets/sections.css +48 -0
- package/test-theme/assets/theme.css +3500 -0
- package/test-theme/assets/theme.js +3745 -0
- package/test-theme/config/settings_data.json +292 -0
- package/test-theme/config/settings_schema.json +1050 -0
- package/test-theme/layout/theme.liquid +195 -0
- package/test-theme/locales/en.default.json +260 -0
- package/test-theme/sections/content-fallback.liquid +53 -0
- package/test-theme/sections/content.liquid +57 -0
- package/test-theme/sections/footer-fallback.liquid +328 -0
- package/test-theme/sections/footer.liquid +278 -0
- package/test-theme/sections/header-fallback.liquid +1805 -0
- package/test-theme/sections/header.liquid +1145 -0
- package/test-theme/sections/hero-fallback.liquid +212 -0
- package/test-theme/sections/hero.liquid +136 -0
- package/test-theme/snippets/account-sidebar.liquid +200 -0
- package/test-theme/snippets/add-to-cart-modal.liquid +484 -0
- package/test-theme/snippets/breadcrumbs.liquid +134 -0
- package/test-theme/snippets/cart-drawer.liquid +467 -0
- package/test-theme/snippets/delivery-zone-city-selector.liquid +79 -0
- package/test-theme/snippets/delivery-zone-modal.liquid +337 -0
- package/test-theme/snippets/delivery-zone-search.liquid +78 -0
- package/test-theme/snippets/icon.liquid +105 -0
- package/test-theme/snippets/login-modal.liquid +346 -0
- package/test-theme/snippets/mega-menu.liquid +812 -0
- package/test-theme/snippets/news-thumbnail.liquid +187 -0
- package/test-theme/snippets/pagination.liquid +120 -0
- package/test-theme/snippets/price.liquid +92 -0
- package/test-theme/snippets/product-card-related.liquid +78 -0
- package/test-theme/snippets/product-card-simple.liquid +41 -0
- package/test-theme/snippets/product-card.liquid +697 -0
- package/test-theme/snippets/rating.liquid +85 -0
- package/test-theme/snippets/skeleton-collection-grid.liquid +114 -0
- package/test-theme/snippets/skeleton-product-card.liquid +124 -0
- package/test-theme/snippets/skeleton-product-grid.liquid +34 -0
- package/test-theme/snippets/social-sharing.liquid +185 -0
- package/test-theme/templates/account/dashboard.liquid +401 -0
- package/test-theme/templates/account/loyalty-redemption.liquid +405 -0
- package/test-theme/templates/account/loyalty.liquid +588 -0
- package/test-theme/templates/account/order-detail.liquid +230 -0
- package/test-theme/templates/account/orders.liquid +349 -0
- package/test-theme/templates/account/profile.liquid +758 -0
- package/test-theme/templates/account/register.liquid +232 -0
- package/test-theme/templates/account/return-orders.liquid +348 -0
- package/test-theme/templates/account/store-credit.liquid +464 -0
- package/test-theme/templates/account/subscriptions.liquid +601 -0
- package/test-theme/templates/account/wishlist.liquid +419 -0
- package/test-theme/templates/address-book.liquid +1092 -0
- package/test-theme/templates/categories.liquid +452 -0
- package/test-theme/templates/checkout.liquid +4511 -0
- package/test-theme/templates/error.liquid +384 -0
- package/test-theme/templates/index.liquid +11 -0
- package/test-theme/templates/login.liquid +185 -0
- package/test-theme/templates/order-confirmation.liquid +720 -0
- package/test-theme/templates/page.liquid +297 -0
- package/test-theme/templates/product-detail.liquid +4363 -0
- package/test-theme/templates/products.liquid +518 -0
- package/test-theme/templates/search.liquid +922 -0
- package/test-theme/theme.json.example +19 -0
- package/test-theme/widgets/brand-carousel.liquid +676 -0
- package/test-theme/widgets/brand.liquid +245 -0
- package/test-theme/widgets/carousel.liquid +843 -0
- package/test-theme/widgets/category-list-carousel.liquid +656 -0
- package/test-theme/widgets/category-list.liquid +340 -0
- package/test-theme/widgets/category.liquid +475 -0
- package/test-theme/widgets/discount-time.liquid +176 -0
- package/test-theme/widgets/footer-menu.liquid +695 -0
- package/test-theme/widgets/footer.liquid +179 -0
- package/test-theme/widgets/gallery.liquid +271 -0
- package/test-theme/widgets/header-menu.liquid +932 -0
- package/test-theme/widgets/header.liquid +159 -0
- package/test-theme/widgets/html.liquid +214 -0
- package/test-theme/widgets/news.liquid +217 -0
- package/test-theme/widgets/product-canvas.liquid +235 -0
- package/test-theme/widgets/product-carousel.liquid +502 -0
- package/test-theme/widgets/product.liquid +45 -0
- package/test-theme/widgets/recently-viewed.liquid +26 -0
- package/test-theme/widgets/shared/product-grid.liquid +339 -0
- package/test-theme/widgets/simple-product.liquid +42 -0
- package/test-theme/widgets/single-product.liquid +610 -0
- package/test-theme/widgets/spacebar-carousel.liquid +663 -0
- package/test-theme/widgets/spacebar.liquid +279 -0
- package/test-theme/widgets/splash.liquid +378 -0
- package/test-theme/widgets/testimonial-carousel.liquid +709 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
{% liquid
|
|
2
|
+
assign widget_settings = widget.settings
|
|
3
|
+
assign widget_content = widget.content
|
|
4
|
+
assign widget_data = widget.data
|
|
5
|
+
|
|
6
|
+
assign columns = widget_data.columns | default: widget_content.columns | default: widget_settings.columns
|
|
7
|
+
if columns == nil or columns == empty
|
|
8
|
+
assign columns = widget_settings.links | default: widget_content.links | default: widget_data.links
|
|
9
|
+
endif
|
|
10
|
+
|
|
11
|
+
assign show_social = widget_settings.show_social
|
|
12
|
+
if show_social == nil and widget_content and widget_content.show_social != nil
|
|
13
|
+
assign show_social = widget_content.show_social
|
|
14
|
+
endif
|
|
15
|
+
if show_social == nil
|
|
16
|
+
assign show_social = true
|
|
17
|
+
endif
|
|
18
|
+
|
|
19
|
+
assign social_links = widget_settings.social_links | default: widget_content.social_links | default: widget_data.social_links
|
|
20
|
+
%}
|
|
21
|
+
|
|
22
|
+
<footer class="widget widget-footer" data-widget-id="{{ widget.id }}">
|
|
23
|
+
<div class="widget-footer__inner">
|
|
24
|
+
<div class="widget-footer__brand">
|
|
25
|
+
<h3>{{ widget_settings.title | default: widget_content.title | default: shop.name }}</h3>
|
|
26
|
+
<p>{{ widget_settings.description | default: widget_content.description | default: shop.description }}</p>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
{% if columns and columns.size > 0 %}
|
|
30
|
+
<div class="widget-footer__columns">
|
|
31
|
+
{% for column in columns %}
|
|
32
|
+
<div class="widget-footer__column">
|
|
33
|
+
<h4>{{ column.title | default: column.heading }}</h4>
|
|
34
|
+
{% if column.links and column.links.size > 0 %}
|
|
35
|
+
<ul>
|
|
36
|
+
{% for link in column.links %}
|
|
37
|
+
<li>
|
|
38
|
+
<a href="{{ link.url | default: link.href | default: '#' }}">{{ link.title | default: link.label }}</a>
|
|
39
|
+
</li>
|
|
40
|
+
{% endfor %}
|
|
41
|
+
</ul>
|
|
42
|
+
{% endif %}
|
|
43
|
+
</div>
|
|
44
|
+
{% endfor %}
|
|
45
|
+
</div>
|
|
46
|
+
{% endif %}
|
|
47
|
+
|
|
48
|
+
{% if show_social and social_links and social_links.size > 0 %}
|
|
49
|
+
<div class="widget-footer__social">
|
|
50
|
+
<span>{{ widget_settings.social_title | default: 'Follow us' }}</span>
|
|
51
|
+
<ul>
|
|
52
|
+
{% for social in social_links %}
|
|
53
|
+
<li>
|
|
54
|
+
<a href="{{ social.url | default: social.href | default: '#' }}" aria-label="{{ social.label | default: social.title }}">
|
|
55
|
+
{% if social.icon %}
|
|
56
|
+
<img src="{{ social.icon }}" alt="{{ social.label | default: social.title }}" width="18" height="18" loading="lazy">
|
|
57
|
+
{% else %}
|
|
58
|
+
{{ social.label | default: social.title }}
|
|
59
|
+
{% endif %}
|
|
60
|
+
</a>
|
|
61
|
+
</li>
|
|
62
|
+
{% endfor %}
|
|
63
|
+
</ul>
|
|
64
|
+
</div>
|
|
65
|
+
{% endif %}
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div class="widget-footer__bottom">
|
|
69
|
+
<p>© {{ 'now' | date: '%Y' }} {{ shop.name }}. {{ widget_settings.legal_text | default: 'All rights reserved.' }}</p>
|
|
70
|
+
{% if widget_settings.legal_links %}
|
|
71
|
+
<ul>
|
|
72
|
+
{% for link in widget_settings.legal_links %}
|
|
73
|
+
<li><a href="{{ link.url | default: link.href }}">{{ link.title | default: link.label }}</a></li>
|
|
74
|
+
{% endfor %}
|
|
75
|
+
</ul>
|
|
76
|
+
{% endif %}
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<style>
|
|
80
|
+
.widget-footer {
|
|
81
|
+
background: {{ widget_settings.background_color | default: settings.color_background }};
|
|
82
|
+
color: {{ widget_settings.text_color | default: settings.color_text }};
|
|
83
|
+
padding: 3rem 1rem;
|
|
84
|
+
border-top: 1px solid rgba(0,0,0,0.08);
|
|
85
|
+
}
|
|
86
|
+
.widget-footer__inner {
|
|
87
|
+
max-width: {{ settings.container_width }}px;
|
|
88
|
+
margin: 0 auto 2rem;
|
|
89
|
+
display: grid;
|
|
90
|
+
gap: 2rem;
|
|
91
|
+
}
|
|
92
|
+
.widget-footer__brand h3 {
|
|
93
|
+
margin: 0 0 0.5rem;
|
|
94
|
+
font-size: 1.5rem;
|
|
95
|
+
}
|
|
96
|
+
.widget-footer__columns {
|
|
97
|
+
display: grid;
|
|
98
|
+
gap: 1.5rem;
|
|
99
|
+
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
|
100
|
+
}
|
|
101
|
+
.widget-footer__column h4 {
|
|
102
|
+
margin: 0 0 1rem;
|
|
103
|
+
font-size: 1rem;
|
|
104
|
+
text-transform: uppercase;
|
|
105
|
+
letter-spacing: 0.08em;
|
|
106
|
+
}
|
|
107
|
+
.widget-footer__column ul {
|
|
108
|
+
list-style: none;
|
|
109
|
+
margin: 0;
|
|
110
|
+
padding: 0;
|
|
111
|
+
display: grid;
|
|
112
|
+
gap: 0.5rem;
|
|
113
|
+
}
|
|
114
|
+
.widget-footer__column a {
|
|
115
|
+
color: inherit;
|
|
116
|
+
text-decoration: none;
|
|
117
|
+
}
|
|
118
|
+
.widget-footer__column a:hover {
|
|
119
|
+
text-decoration: underline;
|
|
120
|
+
}
|
|
121
|
+
.widget-footer__social ul {
|
|
122
|
+
list-style: none;
|
|
123
|
+
margin: 0.75rem 0 0;
|
|
124
|
+
padding: 0;
|
|
125
|
+
display: flex;
|
|
126
|
+
gap: 0.5rem;
|
|
127
|
+
flex-wrap: wrap;
|
|
128
|
+
}
|
|
129
|
+
.widget-footer__social a {
|
|
130
|
+
display: inline-flex;
|
|
131
|
+
align-items: center;
|
|
132
|
+
justify-content: center;
|
|
133
|
+
width: 36px;
|
|
134
|
+
height: 36px;
|
|
135
|
+
border-radius: 50%;
|
|
136
|
+
background: rgba(255,255,255,0.08);
|
|
137
|
+
color: inherit;
|
|
138
|
+
text-decoration: none;
|
|
139
|
+
font-size: 0.875rem;
|
|
140
|
+
}
|
|
141
|
+
.widget-footer__social img {
|
|
142
|
+
max-width: 18px;
|
|
143
|
+
max-height: 18px;
|
|
144
|
+
}
|
|
145
|
+
.widget-footer__bottom {
|
|
146
|
+
max-width: {{ settings.container_width }}px;
|
|
147
|
+
margin: 0 auto;
|
|
148
|
+
padding-top: 1.5rem;
|
|
149
|
+
border-top: 1px solid rgba(255,255,255,0.08);
|
|
150
|
+
display: flex;
|
|
151
|
+
flex-direction: column;
|
|
152
|
+
gap: 0.75rem;
|
|
153
|
+
font-size: 0.875rem;
|
|
154
|
+
}
|
|
155
|
+
.widget-footer__bottom ul {
|
|
156
|
+
list-style: none;
|
|
157
|
+
margin: 0;
|
|
158
|
+
padding: 0;
|
|
159
|
+
display: flex;
|
|
160
|
+
gap: 1rem;
|
|
161
|
+
flex-wrap: wrap;
|
|
162
|
+
}
|
|
163
|
+
.widget-footer__bottom a {
|
|
164
|
+
color: inherit;
|
|
165
|
+
text-decoration: none;
|
|
166
|
+
}
|
|
167
|
+
@media (min-width: 768px) {
|
|
168
|
+
.widget-footer__inner {
|
|
169
|
+
grid-template-columns: minmax(0, 1.2fr) minmax(0, 2fr);
|
|
170
|
+
}
|
|
171
|
+
.widget-footer__bottom {
|
|
172
|
+
flex-direction: row;
|
|
173
|
+
align-items: center;
|
|
174
|
+
justify-content: space-between;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
</style>
|
|
178
|
+
</footer>
|
|
179
|
+
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
{% liquid
|
|
2
|
+
assign widget_settings = widget.settings
|
|
3
|
+
assign widget_data = widget.data
|
|
4
|
+
|
|
5
|
+
comment
|
|
6
|
+
Gallery Widget - Displays images in a grid layout
|
|
7
|
+
Static Widget: Content comes from widget_data.content (Items array)
|
|
8
|
+
Settings come from widget_settings
|
|
9
|
+
endcomment
|
|
10
|
+
|
|
11
|
+
assign content_data = widget_data.content | default: widget.content
|
|
12
|
+
assign items = content_data.Items | default: content_data.items | default: widget_data.Items | default: widget_data.items | default: widget_data.images
|
|
13
|
+
|
|
14
|
+
assign heading = widget_settings.title | default: widget.Title | default: widget.title
|
|
15
|
+
assign subtitle = widget_settings.subtitle
|
|
16
|
+
assign show_widget_title_raw = widget_settings.showWidgetTitle | default: 'Yes'
|
|
17
|
+
if show_widget_title_raw == null or show_widget_title_raw == blank or show_widget_title_raw == 'null'
|
|
18
|
+
assign show_widget_title = true
|
|
19
|
+
else
|
|
20
|
+
if show_widget_title_raw == 'Yes'
|
|
21
|
+
assign show_widget_title = true
|
|
22
|
+
elsif show_widget_title_raw == true
|
|
23
|
+
assign show_widget_title = true
|
|
24
|
+
else
|
|
25
|
+
assign show_widget_title = false
|
|
26
|
+
endif
|
|
27
|
+
endif
|
|
28
|
+
assign widget_title_alignment_raw = widget_settings.widgetTitleAlignment | default: 'center'
|
|
29
|
+
assign widget_title_alignment = widget_title_alignment_raw | downcase
|
|
30
|
+
if widget_title_alignment != 'left' and widget_title_alignment != 'right' and widget_title_alignment != 'center'
|
|
31
|
+
assign widget_title_alignment = 'center'
|
|
32
|
+
endif
|
|
33
|
+
assign columns = widget_settings.columns | default: 4
|
|
34
|
+
assign background_color = widget_settings.backgroundColor
|
|
35
|
+
assign text_color = widget_settings.textColor
|
|
36
|
+
assign show_container = widget_settings.showContainer
|
|
37
|
+
assign gap = widget_settings.gap | default: 16
|
|
38
|
+
%}
|
|
39
|
+
|
|
40
|
+
<section class="widget widget-gallery" data-widget-id="{{ widget.id }}"{% if background_color and background_color != blank and background_color != 'null' %} style="background-color: {{ background_color }};"{% endif %}>
|
|
41
|
+
<div class="widget-gallery__inner{% if show_container == 'No' %} widget-gallery__inner--full{% endif %}">
|
|
42
|
+
{% if show_widget_title %}
|
|
43
|
+
{% if heading or subtitle %}
|
|
44
|
+
<header class="widget-header" style="text-align: {{ widget_title_alignment }};{% if text_color and text_color != 'null' %} color: {{ text_color }};{% endif %}">
|
|
45
|
+
{% if heading %}<h2 class="widget-title">{{ heading }}</h2>{% endif %}
|
|
46
|
+
{% if subtitle %}<p class="widget-subtitle">{{ subtitle }}</p>{% endif %}
|
|
47
|
+
</header>
|
|
48
|
+
{% endif %}
|
|
49
|
+
{% endif %}
|
|
50
|
+
|
|
51
|
+
{% if items and items.size > 0 %}
|
|
52
|
+
<div class="widget-gallery__grid widget-gallery__grid--{{ columns }}-col">
|
|
53
|
+
{% for item in items %}
|
|
54
|
+
{% assign image_url = item.ImageUrl | default: item.imageUrl | default: item.Image | default: item.image | default: item.src | default: item.url %}
|
|
55
|
+
{% assign image_alt = item.Alt | default: item.alt | default: item.Caption | default: item.caption | default: item.Title | default: item.title | default: heading | default: 'Gallery image' %}
|
|
56
|
+
{% assign item_caption = item.Caption | default: item.caption %}
|
|
57
|
+
{% assign item_link = item.Link | default: item.link | default: item.TargetUrl | default: item.targetUrl %}
|
|
58
|
+
|
|
59
|
+
{% if image_url and image_url != blank and image_url != 'null' %}
|
|
60
|
+
{% if image_url contains 'http://' or image_url contains 'https://' %}
|
|
61
|
+
{% assign image_src = image_url %}
|
|
62
|
+
{% else %}
|
|
63
|
+
{% assign image_src = image_url | asset_url %}
|
|
64
|
+
{% endif %}
|
|
65
|
+
{% endif %}
|
|
66
|
+
|
|
67
|
+
{% if item_link and item_link != blank and item_link != 'null' %}
|
|
68
|
+
<a href="{{ item_link }}" class="widget-gallery__item widget-gallery__item--link">
|
|
69
|
+
{% if image_url and image_url != blank and image_url != 'null' %}
|
|
70
|
+
<img src="{{ image_src }}" alt="{{ image_alt }}" width="400" height="400" loading="lazy">
|
|
71
|
+
{% if item_caption and item_caption != blank %}
|
|
72
|
+
<div class="widget-gallery__caption">{{ item_caption }}</div>
|
|
73
|
+
{% endif %}
|
|
74
|
+
{% endif %}
|
|
75
|
+
</a>
|
|
76
|
+
{% else %}
|
|
77
|
+
<figure class="widget-gallery__item">
|
|
78
|
+
{% if image_url and image_url != blank and image_url != 'null' %}
|
|
79
|
+
<img src="{{ image_src }}" alt="{{ image_alt }}" width="400" height="400" loading="lazy">
|
|
80
|
+
{% if item_caption and item_caption != blank %}
|
|
81
|
+
<figcaption class="widget-gallery__caption">{{ item_caption }}</figcaption>
|
|
82
|
+
{% endif %}
|
|
83
|
+
{% endif %}
|
|
84
|
+
</figure>
|
|
85
|
+
{% endif %}
|
|
86
|
+
{% endfor %}
|
|
87
|
+
</div>
|
|
88
|
+
{% else %}
|
|
89
|
+
<div class="widget-empty">
|
|
90
|
+
<p>{{ widget_settings.empty_state | default: 'Add images to build your gallery.' }}</p>
|
|
91
|
+
</div>
|
|
92
|
+
{% endif %}
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<style>
|
|
96
|
+
.widget-gallery {
|
|
97
|
+
padding: 48px 0;
|
|
98
|
+
position: relative;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.widget-gallery__inner {
|
|
102
|
+
max-width: 1400px;
|
|
103
|
+
margin: 0 auto;
|
|
104
|
+
padding: 0 24px;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.widget-gallery__inner--full {
|
|
108
|
+
max-width: 100%;
|
|
109
|
+
padding: 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.widget-gallery .widget-header {
|
|
113
|
+
margin-bottom: 32px;
|
|
114
|
+
position: static;
|
|
115
|
+
z-index: auto;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.widget-gallery .widget-title {
|
|
119
|
+
font-size: 1.4rem;
|
|
120
|
+
font-weight: 500;
|
|
121
|
+
line-height: 1.3;
|
|
122
|
+
color: #111;
|
|
123
|
+
margin: 0 0 8px 0;
|
|
124
|
+
letter-spacing: -0.01em;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.widget-gallery .widget-subtitle {
|
|
128
|
+
font-size: 14px;
|
|
129
|
+
color: #6b7280;
|
|
130
|
+
margin: 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.widget-gallery__grid {
|
|
134
|
+
display: grid;
|
|
135
|
+
gap: {{ gap }}px;
|
|
136
|
+
grid-auto-rows: 1fr;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.widget-gallery__grid--2-col {
|
|
140
|
+
grid-template-columns: repeat(2, 1fr);
|
|
141
|
+
}
|
|
142
|
+
.widget-gallery__grid--3-col {
|
|
143
|
+
grid-template-columns: repeat(3, 1fr);
|
|
144
|
+
}
|
|
145
|
+
.widget-gallery__grid--4-col {
|
|
146
|
+
grid-template-columns: repeat(4, 1fr);
|
|
147
|
+
}
|
|
148
|
+
.widget-gallery__grid--5-col {
|
|
149
|
+
grid-template-columns: repeat(5, 1fr);
|
|
150
|
+
}
|
|
151
|
+
.widget-gallery__grid--6-col {
|
|
152
|
+
grid-template-columns: repeat(6, 1fr);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.widget-gallery__item {
|
|
156
|
+
position: relative;
|
|
157
|
+
overflow: hidden;
|
|
158
|
+
background: #f5f5f5;
|
|
159
|
+
aspect-ratio: 1 / 1;
|
|
160
|
+
box-shadow: 0 4px 12px rgba(15, 23, 42, 0.08);
|
|
161
|
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
|
162
|
+
border-radius: var(--border-radius-medium);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.widget-gallery__item:hover {
|
|
166
|
+
transform: translateY(-4px);
|
|
167
|
+
box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.widget-gallery__item--link {
|
|
171
|
+
display: block;
|
|
172
|
+
text-decoration: none;
|
|
173
|
+
color: inherit;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.widget-gallery__item img {
|
|
177
|
+
display: block;
|
|
178
|
+
width: 100%;
|
|
179
|
+
height: 100%;
|
|
180
|
+
object-fit: cover;
|
|
181
|
+
transition: transform 0.3s ease;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.widget-gallery__item:hover img {
|
|
185
|
+
transform: scale(1.05);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.widget-gallery__caption {
|
|
189
|
+
position: absolute;
|
|
190
|
+
bottom: 0;
|
|
191
|
+
left: 0;
|
|
192
|
+
right: 0;
|
|
193
|
+
padding: 16px;
|
|
194
|
+
background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.7) 100%);
|
|
195
|
+
color: #fff;
|
|
196
|
+
font-size: 14px;
|
|
197
|
+
font-weight: 500;
|
|
198
|
+
line-height: 1.4;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.widget-gallery__item figure {
|
|
202
|
+
margin: 0;
|
|
203
|
+
height: 100%;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.widget-gallery__item figcaption {
|
|
207
|
+
position: absolute;
|
|
208
|
+
bottom: 0;
|
|
209
|
+
left: 0;
|
|
210
|
+
right: 0;
|
|
211
|
+
padding: 16px;
|
|
212
|
+
background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.7) 100%);
|
|
213
|
+
color: #fff;
|
|
214
|
+
font-size: 14px;
|
|
215
|
+
font-weight: 500;
|
|
216
|
+
line-height: 1.4;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* Tablet: 3 columns */
|
|
220
|
+
@media (max-width: 1024px) {
|
|
221
|
+
.widget-gallery__grid--4-col,
|
|
222
|
+
.widget-gallery__grid--5-col,
|
|
223
|
+
.widget-gallery__grid--6-col {
|
|
224
|
+
grid-template-columns: repeat(3, 1fr);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* Small Tablet: 2 columns */
|
|
229
|
+
@media (max-width: 768px) {
|
|
230
|
+
.widget-gallery {
|
|
231
|
+
padding: 36px 0;
|
|
232
|
+
}
|
|
233
|
+
.widget-gallery__inner {
|
|
234
|
+
padding: 0 16px;
|
|
235
|
+
}
|
|
236
|
+
.widget-gallery .widget-header {
|
|
237
|
+
margin-bottom: 24px;
|
|
238
|
+
}
|
|
239
|
+
.widget-gallery .widget-title {
|
|
240
|
+
font-size: 1.3rem;
|
|
241
|
+
}
|
|
242
|
+
.widget-gallery__grid {
|
|
243
|
+
gap: 12px;
|
|
244
|
+
}
|
|
245
|
+
.widget-gallery__grid--3-col,
|
|
246
|
+
.widget-gallery__grid--4-col,
|
|
247
|
+
.widget-gallery__grid--5-col,
|
|
248
|
+
.widget-gallery__grid--6-col {
|
|
249
|
+
grid-template-columns: repeat(2, 1fr);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/* Mobile: 2 columns */
|
|
254
|
+
@media (max-width: 480px) {
|
|
255
|
+
.widget-gallery__inner {
|
|
256
|
+
padding: 0 12px;
|
|
257
|
+
}
|
|
258
|
+
.widget-gallery__grid {
|
|
259
|
+
gap: 10px;
|
|
260
|
+
}
|
|
261
|
+
.widget-gallery .widget-title {
|
|
262
|
+
font-size: 1.2rem;
|
|
263
|
+
}
|
|
264
|
+
.widget-gallery__caption,
|
|
265
|
+
.widget-gallery__item figcaption {
|
|
266
|
+
padding: 12px;
|
|
267
|
+
font-size: 13px;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
</style>
|
|
271
|
+
</section>
|