rebly-sections 1.2.0 → 1.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.
|
@@ -5,25 +5,36 @@ import re
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
def check_has_color_scheme(content, schema_json):
|
|
8
|
-
"""Check if
|
|
8
|
+
"""Check if color_scheme setting exists AND has a non-blank default."""
|
|
9
9
|
if not schema_json:
|
|
10
10
|
return ("WARN", "No schema to check for color_scheme")
|
|
11
11
|
settings = schema_json.get("settings", [])
|
|
12
|
-
|
|
13
|
-
if
|
|
14
|
-
return ("
|
|
15
|
-
|
|
12
|
+
cs_settings = [s for s in settings if s.get("type") == "color_scheme"]
|
|
13
|
+
if not cs_settings:
|
|
14
|
+
return ("WARN", "Missing color_scheme setting — recommended for theme consistency")
|
|
15
|
+
# Verify default is non-blank (Shopify rejects blank default)
|
|
16
|
+
for cs in cs_settings:
|
|
17
|
+
default = cs.get("default", "")
|
|
18
|
+
if not default or str(default).strip() == "":
|
|
19
|
+
return ("WARN", "color_scheme has blank/missing default — Shopify will reject upload. Set default: \"scheme-1\"")
|
|
20
|
+
return ("PASS", "color_scheme setting present with valid default")
|
|
16
21
|
|
|
17
22
|
|
|
18
23
|
def check_has_font_picker(content, schema_json):
|
|
19
|
-
"""Check if
|
|
24
|
+
"""Check if font_picker exists AND is wired via font_face filter in Liquid."""
|
|
20
25
|
if not schema_json:
|
|
21
26
|
return ("WARN", "No schema to check for font_picker")
|
|
22
27
|
settings = schema_json.get("settings", [])
|
|
23
|
-
|
|
24
|
-
if
|
|
25
|
-
return ("
|
|
26
|
-
|
|
28
|
+
fp_settings = [s for s in settings if s.get("type") == "font_picker"]
|
|
29
|
+
if not fp_settings:
|
|
30
|
+
return ("WARN", "Missing font_picker — sections with headings should include typography control")
|
|
31
|
+
# Verify font_face filter usage (required to actually load the font)
|
|
32
|
+
if "font_face" not in content:
|
|
33
|
+
return ("WARN", "font_picker exists but font_face filter not used — font won't load. Add: {{ font_var | font_face: font_display: 'swap' }}")
|
|
34
|
+
# Verify CSS variable references the font family
|
|
35
|
+
if ".family" not in content and "font-family" not in content:
|
|
36
|
+
return ("WARN", "font_picker exists but font family not applied in CSS")
|
|
37
|
+
return ("PASS", "font_picker present and wired via font_face")
|
|
27
38
|
|
|
28
39
|
|
|
29
40
|
def check_has_heading_tag(content, schema_json):
|
|
@@ -53,3 +64,20 @@ def check_no_hardcoded_colors(content, schema_json):
|
|
|
53
64
|
if hex_colors:
|
|
54
65
|
return ("WARN", f"Hardcoded colors in CSS: {', '.join(hex_colors[:5])} — use CSS variables instead")
|
|
55
66
|
return ("PASS", "No hardcoded colors in CSS")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def check_has_font_size_controls(content, schema_json):
|
|
70
|
+
"""Check if section has font size range settings for typography control."""
|
|
71
|
+
if not schema_json:
|
|
72
|
+
return ("WARN", "No schema to check for font size controls")
|
|
73
|
+
settings = schema_json.get("settings", [])
|
|
74
|
+
# Check if section uses heading/text elements
|
|
75
|
+
has_headings = bool(re.search(r'<h[1-6][\s>]', content))
|
|
76
|
+
has_description = bool(re.search(r'class="[^"]*description', content))
|
|
77
|
+
if not has_headings and not has_description:
|
|
78
|
+
return ("PASS", "No text elements requiring font size controls")
|
|
79
|
+
font_size_ids = [s.get("id", "") for s in settings if s.get("type") == "range"]
|
|
80
|
+
has_heading_size = any("font_size" in sid or "heading_size" in sid for sid in font_size_ids)
|
|
81
|
+
if has_headings and not has_heading_size:
|
|
82
|
+
return ("WARN", "Missing heading font size range — merchants can't adjust heading size")
|
|
83
|
+
return ("PASS", "Font size controls present")
|
|
@@ -39,10 +39,11 @@ QUALITY_CHECKS = [
|
|
|
39
39
|
|
|
40
40
|
# Advisory checks (PASS/WARN) — imported from quality-gate-checks.py
|
|
41
41
|
ADVISORY_CHECKS = [
|
|
42
|
-
("has_color_scheme", "color_scheme setting
|
|
43
|
-
("has_font_picker", "font_picker
|
|
42
|
+
("has_color_scheme", "color_scheme setting with valid default"),
|
|
43
|
+
("has_font_picker", "font_picker wired via font_face"),
|
|
44
44
|
("has_heading_tag", "Heading tag configurable via select"),
|
|
45
45
|
("no_hardcoded_colors", "No hardcoded hex colors in CSS"),
|
|
46
|
+
("has_font_size_controls", "Font size range controls present"),
|
|
46
47
|
]
|
|
47
48
|
|
|
48
49
|
|
|
@@ -210,6 +211,7 @@ def run_quality_gate(filepath):
|
|
|
210
211
|
"has_font_picker": _checks_mod.check_has_font_picker,
|
|
211
212
|
"has_heading_tag": _checks_mod.check_has_heading_tag,
|
|
212
213
|
"no_hardcoded_colors": _checks_mod.check_no_hardcoded_colors,
|
|
214
|
+
"has_font_size_controls": _checks_mod.check_has_font_size_controls,
|
|
213
215
|
}
|
|
214
216
|
for check_id, description in ADVISORY_CHECKS:
|
|
215
217
|
if check_id not in advisory_fns:
|
|
@@ -50,20 +50,42 @@ You are an expert Shopify OS2.0 theme developer. Generate production-ready secti
|
|
|
50
50
|
<mandatory_settings>
|
|
51
51
|
CONDITIONAL RULES (apply based on section content):
|
|
52
52
|
- IF section has heading or subheading text settings:
|
|
53
|
-
-> MUST include font_picker
|
|
53
|
+
-> MUST include font_picker with default "assistant_n4"
|
|
54
|
+
-> MUST wire font_picker to CSS using this exact pattern:
|
|
55
|
+
Liquid (before style tag):
|
|
56
|
+
{%- assign heading_font = section.settings.heading_font -%}
|
|
57
|
+
{{ heading_font | font_face: font_display: 'swap' }}
|
|
58
|
+
CSS variable on section root:
|
|
59
|
+
--heading-font: {{ heading_font.family }}, {{ heading_font.fallback_families }};
|
|
60
|
+
CSS on heading selector:
|
|
61
|
+
font-family: var(--heading-font);
|
|
62
|
+
-> MUST include heading_font_size (type: range, min: 16, max: 72, step: 2, unit: px, default: 40)
|
|
63
|
+
-> Wire heading_font_size as CSS variable and use in heading selector
|
|
54
64
|
-> MUST include heading_tag (type: select, options: h1/h2/h3/h4) for SEO
|
|
65
|
+
- IF section has body/description text settings:
|
|
66
|
+
-> MUST include body_font_size (type: range, min: 12, max: 24, step: 1, unit: px, default: 16)
|
|
67
|
+
-> Wire body_font_size as CSS variable and use in description selector
|
|
55
68
|
- ALWAYS include:
|
|
56
|
-
-> color_scheme (type: color_scheme)
|
|
69
|
+
-> color_scheme (type: color_scheme) — MUST have "default": "scheme-1" (Shopify rejects blank default)
|
|
57
70
|
-> padding_top + padding_bottom (type: range, 0-100px, step 4)
|
|
58
71
|
-> All colors via CSS custom properties, NEVER hardcoded hex
|
|
59
72
|
- IF section has CTA button:
|
|
60
73
|
-> Button settings: button_label, button_link, button_style
|
|
74
|
+
|
|
75
|
+
SHOPIFY SCHEMA VALIDATION RULES (violations cause upload failure):
|
|
76
|
+
- color_scheme: MUST have non-blank "default" value (e.g., "scheme-1")
|
|
77
|
+
- font_picker: MUST have "default" in format "family_style" (e.g., "assistant_n4")
|
|
78
|
+
- range: MUST have min, max, step, unit, and default
|
|
79
|
+
- select: MUST have non-empty options array, each with value + label
|
|
80
|
+
- All non-display settings (except header/paragraph) MUST have "label"
|
|
61
81
|
</mandatory_settings>
|
|
62
82
|
|
|
63
83
|
<pre_output_checklist>
|
|
64
84
|
Before writing code, verify your plan includes ALL:
|
|
65
|
-
- color_scheme setting
|
|
66
|
-
- font_picker for heading text (if section has headings)
|
|
85
|
+
- color_scheme setting with "default": "scheme-1" (REQUIRED — blank default causes Shopify upload error)
|
|
86
|
+
- font_picker for heading text with font_face filter + CSS variable wiring (if section has headings)
|
|
87
|
+
- heading_font_size range setting wired to CSS variable (if section has headings)
|
|
88
|
+
- body_font_size range setting wired to CSS variable (if section has body text)
|
|
67
89
|
- heading_tag select (h1/h2/h3/h4) (if section has headings)
|
|
68
90
|
- Padding/margin controls
|
|
69
91
|
- presets array with at least one preset
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rebly-sections",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Shopify section AI coding skill installer for Claude Code and Antigravity Kit",
|
|
5
5
|
"author": "Rebly Sections",
|
|
6
6
|
"homepage": "https://github.com/rebly-sections/sections-ai#readme",
|