@gemboss/gem-framework 0.16.1 → 0.18.13
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 +84 -0
- package/dist/SOURCE.json +3 -3
- package/dist/editions.d.ts +9 -0
- package/dist/editions.js +24 -0
- package/dist/gem-framework.css +45 -8
- package/dist/index.js +289 -41
- package/dist/primitives.css +40 -3
- package/dist/section-gate.js +156 -27
- package/dist/sections.css +5 -5
- package/dist/settings-schema.js +70 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -93,6 +93,90 @@ Từ 0.8.2 mỗi module có `.d.ts` cạnh nó (`mount(root?: ParentNode | null,
|
|
|
93
93
|
|
|
94
94
|
## Nhật ký thay đổi
|
|
95
95
|
|
|
96
|
+
- **0.18.13** (20/10/2026): ô nhập, select, textarea có trạng thái hover và lỗi (§9.2; GemFactory Framework › Controls đo cả
|
|
97
|
+
hai là INERT). Hover dày viền thêm 1px theo màu chữ của ô (vòng theo hộp; ô gạch chân và ô tô nền chỉ dày cạnh đáy), chỉ trên
|
|
98
|
+
máy có chuột (`@media (hover: hover)`), không áp cho ô disabled hay ô lỗi. Lỗi (`aria-invalid="true"`, do form đặt) tô viền
|
|
99
|
+
bằng `--gem-color-danger` trộn 70/30 với màu chữ của ô: đạt 3:1 trở lên cả trên ô trắng lẫn ô gạch chân trong băng tối/accent
|
|
100
|
+
(màu danger thuần chỉ 2,4:1 và 1,8:1 ở đó). Áp cho mọi store, có hay không có bộ form.
|
|
101
|
+
- **0.18.12** (20/10/2026): control nền thành một bộ (đo trên GemFactory Framework › Controls). Ô số lượng là một field của
|
|
102
|
+
bộ form: hộp theo chiều cao, viền và góc của bộ (góc tối đa 22px, bộ pill ra ô số lượng tròn), −/+ và con số theo nền và cỡ
|
|
103
|
+
chữ của bộ, shape underline không tô ô (`GEM_FORM_SET_CSS`). Con số nằm giữa ô (`<output>` lệch lên 8–9px). Luật sàn của Dawn
|
|
104
|
+
(`min-height: 4.5rem`) không còn gọi `.gem-input`: trên gốc chữ 16px nó là 72px, ô nhập cao gấp rưỡi select khi không có bộ
|
|
105
|
+
form; `.gem-input` theo sàn của primitive như mọi field.
|
|
106
|
+
- **0.18.11** (19/10/2026): `.gem-stars` nhận sao SVG (gap #45 của GemFactory). Hàng sao rộng đúng bằng các ngôi sao
|
|
107
|
+
(`width: max-content`), và `svg` / `img` trong hàng sao không bị luật nền `max-width: 100%` bóp. Trước đó sao SVG trong
|
|
108
|
+
lớp tô bị co theo bề rộng lớp tô (4,2 vẽ thành năm sao ép), và hàng sao là item bị giãn của grid / flex thì phần trăm tô
|
|
109
|
+
tính theo bề rộng đã giãn (3 trên 5 vẽ thành 5). Hàng sao bằng ký tự ★ trong một flex row (thẻ sản phẩm featured) không đổi.
|
|
110
|
+
|
|
111
|
+
- **0.18.10** (19/10/2026): section-gate (`fabricatedProofInSource`, `VERIFIED_BY_DEFAULT`) bắt cờ "đã xác minh"
|
|
112
|
+
(verified, isVerified, verified_buyer…) đọc theo kiểu thiếu thì coi là đúng: `!== false`, `?? true`, `|| true`,
|
|
113
|
+
`=== false ? null : <badge>`, `{ verified = true }`, kể cả xuống dòng. Huy hiệu "Verified Buyer" chỉ được hiện khi dữ liệu
|
|
114
|
+
nói `verified === true` (star-card-grid đã gắn nó cho mọi review không mang cờ).
|
|
115
|
+
- **0.18.9** (19/10/2026): `gemPlanFormSet(plan)`: bộ form mà MỌI trình vẽ dùng cho một plan. `tokens.form` của plan nếu
|
|
116
|
+
có; `tokens.form: null` khi người bán chọn "None" (không bộ nào); thiếu khoá (plan viết trước khi có bộ form) thì bộ mà
|
|
117
|
+
tính cách của nó suy ra (`deriveFormSetId`). `renderGemPreviewDocument` dùng nó cho cả tờ token lẫn `<body>`, như
|
|
118
|
+
storefront. Schema `tokens.form` nhận `null`. Giá trị lưu không phải một bộ (mảng, object rỗng) được đọc như thiếu khoá.
|
|
119
|
+
- **0.18.8** (19/10/2026): `deriveFormSetId` (và `GEM_SOFT_FIELD_FAMILIES`, `GemFormCharacter`): bộ form mà tính cách của
|
|
120
|
+
store suy ra (bo góc + kiểu nút + họ), chuyển từ `theme-presets` sang đây. Planner vẫn ghi nó vào mọi plan mới; storefront
|
|
121
|
+
dùng chính hàm này cho plan viết trước khi có bộ form (không có `tokens.form`), để mọi store có một bộ form thay vì mỗi
|
|
122
|
+
field một kiểu. `deriveStylePackFormSetId` của `theme-presets` giữ tên, gọi sang hàm này.
|
|
123
|
+
- **0.18.7** (19/10/2026): `GEM_FORM_VAR_SCOPE` khai biến của bộ form trên cả `output`. Gói này không có luật nào tô
|
|
124
|
+
`output` bằng biến của bộ form, nên tự nó không đổi gì trên trang. Nó cần cho gemsite, nơi con số giữa −/+ của ô số
|
|
125
|
+
lượng (giỏ và trang sản phẩm, đều là `<output>`) tô `--gem-input-bg` như hai nút: ngoài phạm vi, con số lấy giá trị đã
|
|
126
|
+
tính ở cấp trang, nên trong một băng có bảng màu riêng hai nút tối mà ô số vẫn sáng dưới chữ trắng của băng. Có hiệu
|
|
127
|
+
lực khi gemsite chép bản này (`lib/form-set.ts` và khối mặc định trong `globals.css`).
|
|
128
|
+
- **0.18.6** (16/10/2026): `./settings-schema` (hợp đồng schema của section): `color_scheme` phải là select trên các bảng
|
|
129
|
+
màu store vẽ được (`RENDERED_COLOR_SCHEMES`, option chuẩn `COLOR_SCHEME_OPTIONS`); `range` phải có `min`/`max`; select
|
|
130
|
+
không option là lỗi. `normalizeSettingsSchema` đổi mọi cách viết cũ của "scheme" (type `color`, `color_scheme`,
|
|
131
|
+
`setting`, `string`) thành select đó. 34/51 dòng `color_scheme` trong thư viện từng là ô chọn màu hoặc ô gõ chữ mà
|
|
132
|
+
store bỏ qua.
|
|
133
|
+
|
|
134
|
+
- **0.18.5** (15/10/2026): Luật nền của thẻ (`data-gem-card`) chỉ khớp `outline|shadow|filled`, luật clip của divider chỉ
|
|
135
|
+
khớp các hình có mask. Trước đó chúng khớp mọi giá trị, kể cả `"none"` (giá trị tắt mà các cửa ghi chuyển nguyên chữ ra
|
|
136
|
+
thuộc tính): hero lưu `card: "none"` từng mang hộp thẻ (đệm 32px, bo góc, ảnh bị bóp). Danh sách trắng viết trong
|
|
137
|
+
`:where(…)` nên độ đặc hiệu giữ nguyên.
|
|
138
|
+
|
|
139
|
+
- **0.18.4** (15/10/2026): Lưới sản phẩm của trang collection (`product-card-grid.quick-view-grid`) cách nhau 8px trên
|
|
140
|
+
điện thoại (trước 4px), như featured collection và hai rail sản phẩm: thẻ giờ là thẻ Dawn phẳng, không đệm riêng.
|
|
141
|
+
Đi cùng section-library 1.42.9 (`sizes` ảnh đo lại cho thẻ phẳng).
|
|
142
|
+
|
|
143
|
+
- **0.18.3** (15/10/2026): Lưới sản phẩm kiểu Dawn (4 cột, 2 cột trên điện thoại, khe 8px) và khung ảnh vuông
|
|
144
|
+
của thẻ áp thêm cho hai rail `recommended-products.product-rail` và `cart-recommendations.product-rail`, vì
|
|
145
|
+
hai section này giờ vẽ `.gem-product-card` (section-library 1.42.7). Không đổi section nào khác.
|
|
146
|
+
|
|
147
|
+
- **0.18.2** (14/10/2026): Checkbox `divider_flip` nhận thêm giá trị lưu `1` và `"1"`, theo cùng
|
|
148
|
+
hợp đồng với checkbox của renderer. `false`, chuỗi false/off/0, giá trị vắng hoặc sai vẫn không flip.
|
|
149
|
+
Không đổi hình học cạnh, CSS, edition hoặc phiên bản section library.
|
|
150
|
+
|
|
151
|
+
- **0.18.1** (14/10/2026): Trên document có divider native, nội dung của section parallax bên cạnh
|
|
152
|
+
cũng được xếp trên cạnh SVG. Chỉ bỏ stacking isolation; clipping nền parallax vẫn giữ nguyên.
|
|
153
|
+
Document không có divider native giữ hành vi cũ kể cả khi stylesheet còn được giữ sau navigation.
|
|
154
|
+
|
|
155
|
+
- **0.18.0** (14/10/2026): Thêm API native cho cạnh section element: `gemSectionDividers`,
|
|
156
|
+
`gemSectionDividerStyle`, `gemSectionDividerResponsiveStyle`, `GEM_ELEMENT_SECTION_DIVIDER_CSS` và
|
|
157
|
+
`GEM_SECTION_DIVIDER_PATHS`. Dùng lại năm shape `wave`, `slope`, `spikes`, `arch`, `blob`; chiều cao 0–320px,
|
|
158
|
+
màu/token và flip được kiểm tra trước khi render. Chiều cao có thể khác ở mobile/tablet. CSS mới chỉ dùng khi
|
|
159
|
+
consumer render lớp SVG native; CSS primitive và divider section-shell cũ giữ nguyên. Cần nâng renderer/editor
|
|
160
|
+
tương ứng trước khi coi các control mới là hoạt động; bump source không phải bằng chứng đã deploy consumer.
|
|
161
|
+
|
|
162
|
+
- **0.17.1** (14/10/2026): bộ đọc schema (`settings-schema.js`) nhận kiểu `datetime`: một thời điểm kèm offset, ISO 8601
|
|
163
|
+
(`2026-12-31T23:59:00+07:00`). Countdown dùng nó cho `target` (gemtheme #776). `requires` nhận thêm `{key, in: [...]}`
|
|
164
|
+
(hiện khi sibling là một trong vài giá trị) và báo lỗi vòng gate (A chờ B, B chờ A). Không đổi CSS hay runtime.
|
|
165
|
+
- **0.17.0** (12/10/2026): **edition 3**, trang collection theo bậc của Dawn. Đo trên theme "Start from scratch" ở 768:
|
|
166
|
+
- trước: bốn thẻ 170px đóng hộp quanh ảnh 120px, không badge Sale / Sold out, tiêu đề ở x=0 trên dải màu nhấn rồi mờ xám;
|
|
167
|
+
- edition 3: thẻ là ảnh + chữ; badge hiện khi section bật `show_badges`; số cột điện thoại (`columns_mobile`) giữ tới 989px;
|
|
168
|
+
tiêu đề compact-collection nằm trên trang, thẳng mép lưới, màu chữ của theme.
|
|
169
|
+
- Băng compact-collection có ẢNH collection (`.has-media`, ảnh là `.gem-hero__bg`) giữ màn phủ và chữ trắng; luật tiêu đề chỉ
|
|
170
|
+
áp khi không có ảnh (review #764: chữ tối trên ảnh còn khoảng 1:1).
|
|
171
|
+
- Theme morph giữ thẻ có hộp: profile morph nhắc lại hộp từ token thẻ, cao hơn một class, nên knob thẻ vẫn sống ở mọi edition.
|
|
172
|
+
|
|
173
|
+
Luật nằm ở trường MỚI `elements` của registry (`EDITION_3_ELEMENTS`), không nằm cạnh luật Dawn-parity: sections.css không
|
|
174
|
+
được nhắc `data-gem-edition` (`editions.test.ts`). `gemFrameworkEditionElementCss()` đóng primitives.css ngay TRƯỚC biến
|
|
175
|
+
của registry, nên mỗi luật thắng bằng selector của chính nó (thêm một class hay attribute), không bằng vị trí. Store đang ở
|
|
176
|
+
edition 1/2 không đổi; store mới nhận edition mới nhất. Chuỗi: gemsite nâng gói + sync (khối `primitives.css from
|
|
177
|
+
:where([data-gem-edition='2'])` dời mốc: BREAKS; `lib/framework-edition.test.ts` nhận luật phần tử; cổng `collection:grid`).
|
|
178
|
+
gemboss: CI đọc `main` của gemtheme, nên test edition (`framework-edition-setting.test.ts`, `the-edition-door-reaches-the-plan`)
|
|
179
|
+
phải hết ghim "edition 2 là mới nhất" và merge TRƯỚC; rồi nâng vendor.
|
|
96
180
|
- **0.16.1** (12/10/2026): SỬA cổng slot-contract (`slotsReadBy`, `…/section-gate`), gap #42 của GemFactory + review #758. Tên túi
|
|
97
181
|
slot chỉ tính khi đứng ĐẦU một biểu thức: không sau chữ, `$`, `-`, `.`, `/` hay dấu nháy. Nên id `…reward-slots.v1`,
|
|
98
182
|
`delivery-picker.slots.v1`, `gift.timeslots.v1`, chuỗi `"./slots.ts"` và `item.content.title` (tên alias làm thuộc tính của thứ
|
package/dist/SOURCE.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "@gemboss/gem-framework",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"gemtheme_sha": "
|
|
3
|
+
"version": "0.18.13",
|
|
4
|
+
"gemtheme_sha": "74aee046a4ea5b333966a87c337ec1d855508775",
|
|
5
5
|
"gemtheme_dirty": false,
|
|
6
|
-
"framework_version": "0.
|
|
6
|
+
"framework_version": "0.18.13"
|
|
7
7
|
}
|
package/dist/editions.d.ts
CHANGED
|
@@ -28,6 +28,13 @@ export interface GemFrameworkEdition {
|
|
|
28
28
|
changes: readonly string[];
|
|
29
29
|
/** The CSS this edition adds, unscoped; gemFrameworkEditionCss scopes it. Empty for edition 1. */
|
|
30
30
|
css: readonly string[];
|
|
31
|
+
/**
|
|
32
|
+
* ELEMENT rules this edition adds, `:where(&)`-scoped like `css` (gemFrameworkEditionElementCss). They close primitives.css
|
|
33
|
+
* just BEFORE the custom properties above, so they come before sections.css: each must out-rank, by its own selector, the
|
|
34
|
+
* sections.css and storefront rules it changes (a class or an attribute more), never by position. Kept here, not beside
|
|
35
|
+
* those rules, because sections.css must not name data-gem-edition (a new edition would move the storefront's anchors).
|
|
36
|
+
*/
|
|
37
|
+
elements?: readonly string[];
|
|
31
38
|
}
|
|
32
39
|
export declare const GEM_EDITION_SUPPORT_MONTHS = 6;
|
|
33
40
|
export declare const GEM_FRAMEWORK_EDITIONS: readonly GemFrameworkEdition[];
|
|
@@ -48,6 +55,8 @@ export declare function gemFrameworkEditionSupportedUntil(edition: unknown): str
|
|
|
48
55
|
export declare function addEditionSupportMonths(released: string): string;
|
|
49
56
|
/** `:where([data-gem-edition='N'], [data-gem-edition='N+1'], …)`: the attribute selectors of edition N and every later one. */
|
|
50
57
|
export declare function gemFrameworkEditionScope(edition: number): string;
|
|
58
|
+
/** Every edition's ELEMENT rules, scoped, oldest first: they close primitives.css just before gemFrameworkEditionCss. */
|
|
59
|
+
export declare function gemFrameworkEditionElementCss(): string;
|
|
51
60
|
/**
|
|
52
61
|
* Every edition's CSS, scoped, oldest first. It closes primitives.css (primitives.ts createGemThemeCssParts): the rules set
|
|
53
62
|
* custom properties on <html>, so their place in the sheet does not decide anything against element rules.
|
package/dist/editions.js
CHANGED
|
@@ -117,6 +117,14 @@ var GEM_EDITION_SUPPORT_MONTHS = 6;
|
|
|
117
117
|
var EDITION_2_CSS = [
|
|
118
118
|
`:where(&) { ${GEM_HEADING_SIZE_CSS_VARS.filter((decl) => !decl.startsWith("--gem-section-heading-size-mobile") && !decl.startsWith("--gem-hero-heading-size-mobile")).join(" ")} }`
|
|
119
119
|
];
|
|
120
|
+
var EDITION_3_ELEMENTS = [
|
|
121
|
+
`:where(&) .gem-product-card-grid--quick-view-grid .gem-product-card-grid__card { border: 0; border-radius: 0; box-shadow: none; background: transparent; padding: 0; }`,
|
|
122
|
+
`:where(&) .gem-product-card-grid--quick-view-grid .gem-product-card__media > .gem-product-card__badges { display: flex; }`,
|
|
123
|
+
`@media (max-width: 989px) { :where(&) .gem-product-card-grid--quick-view-grid .gem-product-card-grid__grid[data-gem-product-grid] { grid-template-columns: repeat(var(--gem-product-card-grid-mobile-columns, 2), minmax(0, 1fr)); } }`,
|
|
124
|
+
`:where(&) .gem-hero.gem-hero-banner--compact-collection .gem-hero__overlay:not(.has-media) { position: relative; inset: auto; z-index: auto; opacity: 1; width: min(var(--gem-layout-page, 1200px), calc(100% - var(--gem-layout-gutter, 32px))); margin: clamp(24px, 5vw, 48px) auto 0; background: none; color: var(--gem-color-text); border-radius: 0; }`,
|
|
125
|
+
`:where(&) .gem-hero.gem-hero-banner--compact-collection .gem-hero__overlay:not(.has-media) .gem-hero__heading { color: var(--gem-color-text); }`,
|
|
126
|
+
`:where(&) .gem-section.gem-hero.gem-hero-banner--compact-collection:not(:has(> .gem-hero__bg)) { padding-block-end: 0; }`
|
|
127
|
+
];
|
|
120
128
|
var GEM_FRAMEWORK_EDITIONS = [
|
|
121
129
|
{ edition: 1, since: "0.1.0", released: "2026-07-04", changes: [], css: [] },
|
|
122
130
|
{
|
|
@@ -125,6 +133,18 @@ var GEM_FRAMEWORK_EDITIONS = [
|
|
|
125
133
|
released: "2026-10-10",
|
|
126
134
|
changes: ["Section headings and hero titles follow your type scale on tablets and computers. Phones keep their current size."],
|
|
127
135
|
css: EDITION_2_CSS
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
// Edition 3. Collection pages at Dawn's tiers (12/10/2026, measured on a "Start from scratch" theme): EDITION_3_ELEMENTS.
|
|
139
|
+
edition: 3,
|
|
140
|
+
since: "0.17.0",
|
|
141
|
+
released: "2026-10-12",
|
|
142
|
+
changes: [
|
|
143
|
+
"Collection grids: each product photo fills its column, phones and tablets show your mobile column count, and Sale and Sold out badges appear.",
|
|
144
|
+
"The collection title sits on the page, lined up with the products, in your text colour."
|
|
145
|
+
],
|
|
146
|
+
css: [],
|
|
147
|
+
elements: EDITION_3_ELEMENTS
|
|
128
148
|
}
|
|
129
149
|
];
|
|
130
150
|
var LATEST_GEM_FRAMEWORK_EDITION = GEM_FRAMEWORK_EDITIONS[GEM_FRAMEWORK_EDITIONS.length - 1].edition;
|
|
@@ -146,6 +166,9 @@ function addEditionSupportMonths(released) {
|
|
|
146
166
|
function gemFrameworkEditionScope(edition) {
|
|
147
167
|
return GEM_FRAMEWORK_EDITIONS.filter((e) => e.edition >= edition).map((e) => `[data-gem-edition='${e.edition}']`).join(", ");
|
|
148
168
|
}
|
|
169
|
+
function gemFrameworkEditionElementCss() {
|
|
170
|
+
return GEM_FRAMEWORK_EDITIONS.flatMap((e) => (e.elements ?? []).map((rule) => rule.replaceAll("&", gemFrameworkEditionScope(e.edition)))).join("\n");
|
|
171
|
+
}
|
|
149
172
|
function gemFrameworkEditionCss() {
|
|
150
173
|
return GEM_FRAMEWORK_EDITIONS.flatMap((e) => e.css.map((rule) => rule.replaceAll("&", gemFrameworkEditionScope(e.edition)))).join("\n");
|
|
151
174
|
}
|
|
@@ -155,6 +178,7 @@ export {
|
|
|
155
178
|
LATEST_GEM_FRAMEWORK_EDITION,
|
|
156
179
|
addEditionSupportMonths,
|
|
157
180
|
gemFrameworkEditionCss,
|
|
181
|
+
gemFrameworkEditionElementCss,
|
|
158
182
|
gemFrameworkEditionOf,
|
|
159
183
|
gemFrameworkEditionScope,
|
|
160
184
|
gemFrameworkEditionSupportedUntil
|
package/dist/gem-framework.css
CHANGED
|
@@ -412,6 +412,30 @@ a {
|
|
|
412
412
|
block-size: var(--gem-checkbox-size);
|
|
413
413
|
accent-color: var(--gem-checkbox-accent);
|
|
414
414
|
}
|
|
415
|
+
[data-gem-form-set] :is(.gem-quantity-input) {
|
|
416
|
+
min-height: var(--gem-input-height);
|
|
417
|
+
border: var(--gem-input-border-width) solid var(--gem-input-border-color);
|
|
418
|
+
border-radius: min(var(--gem-input-radius), 22px);
|
|
419
|
+
}
|
|
420
|
+
[data-gem-form-set] :is(.gem-quantity-input__button, .gem-quantity-input__field) {
|
|
421
|
+
background: var(--gem-input-bg);
|
|
422
|
+
font-size: var(--gem-input-font-size);
|
|
423
|
+
}
|
|
424
|
+
[data-gem-form-set][data-gem-field-shape="underline"] :is(.gem-quantity-input__button, .gem-quantity-input__field) {
|
|
425
|
+
background: transparent;
|
|
426
|
+
}
|
|
427
|
+
@media (hover: hover) {
|
|
428
|
+
:is(.gem-input, .gem-select, .gem-textarea, .gem-shell-footer__newsletter .gem-input):where(:not(.gem-search-form .gem-input)):hover:not(:disabled):not([aria-invalid="true"]):not(:focus-visible) {
|
|
429
|
+
border-color: currentColor;
|
|
430
|
+
box-shadow: 0 0 0 1px currentColor;
|
|
431
|
+
}
|
|
432
|
+
[data-gem-form-set]:is([data-gem-field-shape="underline"], [data-gem-field-shape="filled"]) :is(.gem-input, .gem-select, .gem-textarea, .gem-shell-footer__newsletter .gem-input):where(:not(.gem-search-form .gem-input)):hover:not(:disabled):not([aria-invalid="true"]):not(:focus-visible) {
|
|
433
|
+
box-shadow: 0 1px 0 0 currentColor;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
:is(.gem-input, .gem-select, .gem-textarea, .gem-shell-footer__newsletter .gem-input):where(:not(.gem-search-form .gem-input))[aria-invalid="true"] {
|
|
437
|
+
border-color: color-mix(in srgb, var(--gem-color-danger, #b42318) 70%, currentColor);
|
|
438
|
+
}
|
|
415
439
|
.gem-submit {
|
|
416
440
|
cursor: pointer;
|
|
417
441
|
}
|
|
@@ -586,12 +610,14 @@ a {
|
|
|
586
610
|
--gem-stars-value: 5;
|
|
587
611
|
position: relative;
|
|
588
612
|
display: inline-block;
|
|
613
|
+
width: max-content;
|
|
589
614
|
line-height: 1;
|
|
590
615
|
font-size: var(--gem-text-sm, 0.8125rem);
|
|
591
616
|
letter-spacing: 0.1em;
|
|
592
617
|
color: var(--gem-color-border);
|
|
593
618
|
}
|
|
594
619
|
.gem-stars__base, .gem-stars__fill { display: block; white-space: nowrap; }
|
|
620
|
+
.gem-stars :is(svg, img) { max-width: none; flex: none; }
|
|
595
621
|
.gem-stars__fill {
|
|
596
622
|
position: absolute;
|
|
597
623
|
inset: 0;
|
|
@@ -922,6 +948,10 @@ a {
|
|
|
922
948
|
color: var(--gem-color-text);
|
|
923
949
|
text-align: center;
|
|
924
950
|
}
|
|
951
|
+
.gem-quantity-input__field {
|
|
952
|
+
display: grid;
|
|
953
|
+
place-items: center;
|
|
954
|
+
}
|
|
925
955
|
.gem-quantity-input__button {
|
|
926
956
|
font-weight: 750;
|
|
927
957
|
}
|
|
@@ -1142,7 +1172,7 @@ a {
|
|
|
1142
1172
|
[data-gem-ambient] { --gem-ambient-amp: 2px; animation-duration: 12s; }
|
|
1143
1173
|
[data-gem-reveal] { transition: none; opacity: 1; transform: none; }
|
|
1144
1174
|
}
|
|
1145
|
-
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top], :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom] { position: relative; overflow: clip; overflow-clip-margin: var(--gem-divider-height, 48px); }
|
|
1175
|
+
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top]:where([data-gem-divider-top='wave'], [data-gem-divider-top='slope'], [data-gem-divider-top='spikes'], [data-gem-divider-top='arch'], [data-gem-divider-top='blob']), :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom]:where([data-gem-divider-bottom='wave'], [data-gem-divider-bottom='slope'], [data-gem-divider-bottom='spikes'], [data-gem-divider-bottom='arch'], [data-gem-divider-bottom='blob']) { position: relative; overflow: clip; overflow-clip-margin: var(--gem-divider-height, 48px); }
|
|
1146
1176
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom='wave']::after, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom='slope']::after, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom='spikes']::after, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom='arch']::after, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom='blob']::after, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top='wave']::before, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top='slope']::before, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top='spikes']::before, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top='arch']::before, :is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top='blob']::before { content: ''; position: absolute; left: 0; right: 0; z-index: 1; pointer-events: none; height: var(--gem-divider-height, 48px); background: var(--gem-section-bg, var(--gem-color-background)); -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-size: 100% 100%; mask-size: 100% 100%; }
|
|
1147
1177
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom]::after { top: 100%; }
|
|
1148
1178
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top]::before { bottom: 100%; transform: scaleY(-1); }
|
|
@@ -1156,7 +1186,7 @@ a {
|
|
|
1156
1186
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top='arch']::before { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 10' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' d='M0 0 H100 V2 Q50 12 0 2 Z'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 10' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' d='M0 0 H100 V2 Q50 12 0 2 Z'/%3E%3C/svg%3E"); }
|
|
1157
1187
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-bottom='blob']::after { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 10' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' d='M0 0 H100 V4 C85 11 72 0 58 5 C44 10 30 2 16 6 C10 8 5 5 0 6 Z'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 10' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' d='M0 0 H100 V4 C85 11 72 0 58 5 C44 10 30 2 16 6 C10 8 5 5 0 6 Z'/%3E%3C/svg%3E"); }
|
|
1158
1188
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-divider-top='blob']::before { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 10' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' d='M0 0 H100 V4 C85 11 72 0 58 5 C44 10 30 2 16 6 C10 8 5 5 0 6 Z'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 10' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' d='M0 0 H100 V4 C85 11 72 0 58 5 C44 10 30 2 16 6 C10 8 5 5 0 6 Z'/%3E%3C/svg%3E"); }
|
|
1159
|
-
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-card] :is(.gem-section__inner, [class*='__inner']) { border-radius: var(--gem-radius-md); padding: var(--gem-space-xl); }
|
|
1189
|
+
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-card]:where([data-gem-card='outline'], [data-gem-card='shadow'], [data-gem-card='filled']) :is(.gem-section__inner, [class*='__inner']) { border-radius: var(--gem-radius-md); padding: var(--gem-space-xl); }
|
|
1160
1190
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-card='outline'] :is(.gem-section__inner, [class*='__inner']) { border: 1px solid var(--gem-color-border); }
|
|
1161
1191
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-card='shadow'] :is(.gem-section__inner, [class*='__inner']) { background: var(--gem-color-surface); box-shadow: var(--gem-shadow-md); }
|
|
1162
1192
|
:is(.gem-section, .gem-hero, .gem-hero-split, .gem-hero-collage, .gem-hero-triptych, .gem-slideshow)[data-gem-card='filled'] :is(.gem-section__inner, [class*='__inner']) { background: color-mix(in srgb, currentColor 6%, transparent); }
|
|
@@ -1526,7 +1556,14 @@ a {
|
|
|
1526
1556
|
.gem-collection-filter-toolbar__active-filter, .gem-collection-filter-toolbar__clear { min-height: 2.25rem; align-items: center; }
|
|
1527
1557
|
}
|
|
1528
1558
|
|
|
1529
|
-
:where([data-gem-edition='
|
|
1559
|
+
:where([data-gem-edition='3']) .gem-product-card-grid--quick-view-grid .gem-product-card-grid__card { border: 0; border-radius: 0; box-shadow: none; background: transparent; padding: 0; }
|
|
1560
|
+
:where([data-gem-edition='3']) .gem-product-card-grid--quick-view-grid .gem-product-card__media > .gem-product-card__badges { display: flex; }
|
|
1561
|
+
@media (max-width: 989px) { :where([data-gem-edition='3']) .gem-product-card-grid--quick-view-grid .gem-product-card-grid__grid[data-gem-product-grid] { grid-template-columns: repeat(var(--gem-product-card-grid-mobile-columns, 2), minmax(0, 1fr)); } }
|
|
1562
|
+
:where([data-gem-edition='3']) .gem-hero.gem-hero-banner--compact-collection .gem-hero__overlay:not(.has-media) { position: relative; inset: auto; z-index: auto; opacity: 1; width: min(var(--gem-layout-page, 1200px), calc(100% - var(--gem-layout-gutter, 32px))); margin: clamp(24px, 5vw, 48px) auto 0; background: none; color: var(--gem-color-text); border-radius: 0; }
|
|
1563
|
+
:where([data-gem-edition='3']) .gem-hero.gem-hero-banner--compact-collection .gem-hero__overlay:not(.has-media) .gem-hero__heading { color: var(--gem-color-text); }
|
|
1564
|
+
:where([data-gem-edition='3']) .gem-section.gem-hero.gem-hero-banner--compact-collection:not(:has(> .gem-hero__bg)) { padding-block-end: 0; }
|
|
1565
|
+
|
|
1566
|
+
:where([data-gem-edition='2'], [data-gem-edition='3']) { --gem-section-heading-size: calc(var(--gem-h2) * var(--gem-typography-heading-scale, 1)); --gem-hero-heading-size: calc(var(--gem-h1) * var(--gem-typography-heading-scale, 1)); }
|
|
1530
1567
|
|
|
1531
1568
|
.gem-popup-shell { padding: 0; }
|
|
1532
1569
|
.gem-popup-shell__dialog {
|
|
@@ -1784,7 +1821,7 @@ sticky-header.header-wrapper {
|
|
|
1784
1821
|
.newsletter-form__field-wrapper, .field {
|
|
1785
1822
|
position: relative;
|
|
1786
1823
|
}
|
|
1787
|
-
.field__input, .field input
|
|
1824
|
+
.field__input, .field input {
|
|
1788
1825
|
min-height: 4.5rem;
|
|
1789
1826
|
border-radius: var(--inputs-radius, 0);
|
|
1790
1827
|
}
|
|
@@ -2480,7 +2517,7 @@ main > .gem-section:first-child { padding-top: 0; }
|
|
|
2480
2517
|
.gem-card, .gem-product-card { border: 0; border-radius: 0; box-shadow: none; background: transparent; padding: 0; }
|
|
2481
2518
|
.gem-product-card__media, .gem-media { border: 0; border-radius: 0; box-shadow: none; background: rgb(244 244 244); }
|
|
2482
2519
|
.gem-product-card__media { display: block; position: relative; width: 100%; height: 0; min-block-size: 0; padding-bottom: 100%; aspect-ratio: auto; overflow: hidden; }
|
|
2483
|
-
.gem-featured-collection--editorial-grid .gem-product-card__media, .gem-product-card-grid--quick-view-grid .gem-product-card__media, .gem-main-search .gem-product-card__media, .gem-cart-recommendations--dawn-empty .gem-product-card__media { min-block-size: 0 !important; }
|
|
2520
|
+
.gem-featured-collection--editorial-grid .gem-product-card__media, .gem-product-card-grid--quick-view-grid .gem-product-card__media, .gem-main-search .gem-product-card__media, .gem-cart-recommendations--dawn-empty .gem-product-card__media, .gem-recommended-products--product-rail .gem-product-card__media, .gem-cart-recommendations--product-rail .gem-product-card__media { min-block-size: 0 !important; }
|
|
2484
2521
|
.gem-product-card__media > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
|
|
2485
2522
|
.gem-featured-collection .gem-product-card__media > img, .gem-product-card-grid .gem-product-card__media > img { object-fit: cover; }
|
|
2486
2523
|
.gem-product-card-grid--quick-view-grid .gem-product-card__media { display: block; min-height: 0; }
|
|
@@ -2494,7 +2531,7 @@ main > .gem-section:first-child { padding-top: 0; }
|
|
|
2494
2531
|
.gem-cart-recommendations--dawn-empty .gem-product-card__quick-actions { display: none; }
|
|
2495
2532
|
.gem-featured-collection--editorial-grid > .gem-section__inner > .gem-section__heading, .gem-featured-collection--editorial-grid > .gem-section__inner > .gem-section__body { display: none; }
|
|
2496
2533
|
.gem-featured-collection--editorial-grid { padding-block: 28px 36px; }
|
|
2497
|
-
.gem-featured-collection--editorial-grid .gem-section__grid, .gem-product-card-grid--quick-view-grid .gem-section__grid, .gem-main-search .gem-section__grid { grid-template-columns: repeat(var(--gem-product-card-grid-columns, 4), minmax(0, 1fr)); gap: 8px; }
|
|
2534
|
+
.gem-featured-collection--editorial-grid .gem-section__grid, .gem-product-card-grid--quick-view-grid .gem-section__grid, .gem-main-search .gem-section__grid, .gem-recommended-products--product-rail .gem-section__grid, .gem-cart-recommendations--product-rail .gem-section__grid { grid-template-columns: repeat(var(--gem-product-card-grid-columns, 4), minmax(0, 1fr)); gap: 8px; }
|
|
2498
2535
|
.gem-product-card-grid--quick-view-grid { padding-top: 0; }
|
|
2499
2536
|
.gem-product-card-grid--quick-view-grid .gem-section__heading:empty { display: none; }
|
|
2500
2537
|
.gem-product-card-grid--quick-view-grid .gem-price:not(.gem-price--on-sale) .gem-price__compare { display: none; }
|
|
@@ -2648,13 +2685,13 @@ main > .gem-section:first-child { padding-top: 0; }
|
|
|
2648
2685
|
.gem-hero-banner--compact-collection { padding-block: 25px; }
|
|
2649
2686
|
.gem-hero-banner--compact-collection .gem-section__heading { font-size: 30px; line-height: 39px; }
|
|
2650
2687
|
.gem-product-card-grid--quick-view-grid > .gem-section__inner, .gem-main-search > .gem-section__inner { width: calc(100% - 30px); }
|
|
2651
|
-
.gem-product-card-grid--quick-view-grid .gem-product-card-grid__grid { gap:
|
|
2688
|
+
.gem-product-card-grid--quick-view-grid .gem-product-card-grid__grid { gap: 8px !important; }
|
|
2652
2689
|
.gem-product-card__content { padding-top: 8px; gap: 4px; }
|
|
2653
2690
|
.gem-product-card__title { font-size: 15px; line-height: 24px; }
|
|
2654
2691
|
.gem-product-card__price, .gem-product-card__price .gem-price { font-size: 16px; line-height: 24px; }
|
|
2655
2692
|
.gem-section__heading { font-size: var(--gem-section-heading-size-mobile, var(--gem-heading-phone-cap)); }
|
|
2656
2693
|
.gem-hero-banner h1, .gem-hero-banner h2 { font-size: var(--gem-hero-heading-size-mobile, var(--gem-heading-phone-cap)); }
|
|
2657
|
-
.gem-featured-collection--editorial-grid .gem-section__grid, .gem-product-card-grid--quick-view-grid .gem-section__grid, .gem-main-search .gem-section__grid { grid-template-columns: repeat(var(--gem-product-card-grid-mobile-columns, 2), minmax(0, 1fr)); }
|
|
2694
|
+
.gem-featured-collection--editorial-grid .gem-section__grid, .gem-product-card-grid--quick-view-grid .gem-section__grid, .gem-main-search .gem-section__grid, .gem-recommended-products--product-rail .gem-section__grid, .gem-cart-recommendations--product-rail .gem-section__grid { grid-template-columns: repeat(var(--gem-product-card-grid-mobile-columns, 2), minmax(0, 1fr)); }
|
|
2658
2695
|
.gem-product-main[data-gem-product-main-layout='dawn-main'] > .gem-section__inner { width: calc(100% - 30px); }
|
|
2659
2696
|
.gem-product-main[data-gem-product-main-layout='dawn-main'] .gem-product-media-gallery__frame { display: flex; gap: 0; overflow-x: auto; scroll-snap-type: x mandatory; }
|
|
2660
2697
|
.gem-product-main[data-gem-product-main-layout='dawn-main'] .gem-product-media-gallery__item { flex: 0 0 100%; scroll-snap-align: start; aspect-ratio: 1 / 1; }
|