diff --git a/assets/critical.css b/assets/critical.css index cdb1ae1aa..d80fd1686 100644 --- a/assets/critical.css +++ b/assets/critical.css @@ -74,8 +74,164 @@ p:empty { /** Theme styles below */ body { font-family: var(--font-primary--family); + font-weight: var(--font-primary--weight); background-color: var(--color-background); color: var(--color-foreground); + font-size: var(--text-base); + line-height: 1.65; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +/** Typography */ +h1, +h2, +h3, +h4 { + font-family: var(--font-heading--family); + font-weight: var(--font-heading--weight); + font-style: var(--font-heading--style); + line-height: 1.08; + letter-spacing: var(--tracking-heading); + text-wrap: balance; +} + +h1 { + font-size: var(--text-4xl); +} +h2 { + font-size: var(--text-3xl); +} +h3 { + font-size: var(--text-2xl); +} +h4 { + font-size: var(--text-xl); +} + +a { + color: inherit; + text-underline-offset: 0.2em; + text-decoration-thickness: 1px; +} + +/** Eyebrow / overline label */ +.eyebrow { + display: inline-block; + font-family: var(--font-primary--family); + font-size: var(--text-xs); + font-weight: 600; + letter-spacing: var(--tracking-eyebrow); + text-transform: uppercase; + color: var(--color-accent); + margin: 0; +} + +/** Buttons */ +.button, +button.button { + --btn-bg: var(--color-navy); + --btn-fg: var(--color-contrast); + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.6em; + padding: 1rem 2.25rem; + min-height: 3rem; + font-family: var(--font-primary--family); + font-size: var(--text-sm); + font-weight: 600; + letter-spacing: 1.5px; + text-transform: uppercase; + text-decoration: none; + color: var(--btn-fg); + background-color: var(--btn-bg); + border: 1px solid var(--btn-bg); + border-radius: var(--style-border-radius-inputs); + cursor: pointer; + transition: background-color var(--duration) var(--ease), color var(--duration) var(--ease), border-color var(--duration) var(--ease), transform var(--duration) var(--ease); +} + +.button:hover { + --btn-bg: var(--color-accent); + --btn-fg: var(--color-contrast); +} + +.button--ghost { + --btn-bg: transparent; + --btn-fg: currentcolor; + border-color: currentcolor; +} +.button--ghost:hover { + --btn-bg: var(--color-foreground); + --btn-fg: var(--color-background); + border-color: var(--color-foreground); +} + +.button--on-dark { + --btn-bg: var(--color-contrast); + --btn-fg: var(--color-navy); + border-color: var(--color-contrast); +} +.button--on-dark:hover { + --btn-bg: var(--color-accent); + --btn-fg: var(--color-contrast); + border-color: var(--color-accent); +} + +/** Text link with animated underline */ +.link-underline { + position: relative; + display: inline-block; + font-size: var(--text-sm); + font-weight: 600; + letter-spacing: 1.5px; + text-transform: uppercase; + text-decoration: none; + padding-bottom: 0.3rem; +} +.link-underline::after { + content: ""; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 1px; + background-color: currentcolor; + transform: scaleX(1); + transform-origin: right; + transition: transform var(--duration) var(--ease); +} +.link-underline:hover::after { + transform: scaleX(0); +} + +/** Utilities */ +.section-spacing { + padding-block: var(--section-spacing); +} + +.measure { + max-width: 46ch; +} + +.text-center { + text-align: center; +} + +.on-dark { + background-color: var(--color-navy); + color: var(--color-contrast); +} +.on-dark .eyebrow { + color: var(--color-accent-soft); +} + +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.001ms !important; + transition-duration: 0.001ms !important; + } } /** Section layout utilities */ diff --git a/config/settings_schema.json b/config/settings_schema.json index 8d3b532d1..c86e3d3e1 100644 --- a/config/settings_schema.json +++ b/config/settings_schema.json @@ -1,9 +1,9 @@ [ { "name": "theme_info", - "theme_name": "Skeleton", + "theme_name": "Odyssey Jewels", "theme_version": "0.1.0", - "theme_author": "Shopify", + "theme_author": "Odyssey Jewels", "theme_documentation_url": "https://help.shopify.com/manual/online-store/themes", "theme_support_url": "https://support.shopify.com/" }, @@ -14,11 +14,37 @@ "type": "header", "content": "t:general.fonts" }, + { + "type": "font_picker", + "id": "type_heading_font", + "default": "playfair_display_n4", + "label": "Heading font" + }, { "type": "font_picker", "id": "type_primary_font", - "default": "work_sans_n4", + "default": "jost_n4", "label": "t:general.primary" + }, + { + "type": "range", + "id": "type_heading_tracking", + "min": -4, + "max": 4, + "step": 1, + "unit": "px", + "label": "Heading letter spacing", + "default": 0 + }, + { + "type": "range", + "id": "type_eyebrow_tracking", + "min": 0, + "max": 8, + "step": 1, + "unit": "px", + "label": "Eyebrow letter spacing", + "default": 3 } ] }, @@ -39,7 +65,7 @@ "label": "t:options.page_width.wide" } ], - "default": "90rem" + "default": "110rem" }, { "type": "range", @@ -49,7 +75,7 @@ "step": 1, "unit": "px", "label": "t:labels.page_margin", - "default": 20 + "default": 32 } ] }, @@ -59,15 +85,47 @@ { "type": "color", "id": "background_color", - "default": "#FFFFFF", + "default": "#FAF7F2", "label": "t:labels.background" }, { "type": "color", "id": "foreground_color", - "default": "#333333", + "default": "#12263F", "label": "t:labels.foreground" }, + { + "type": "header", + "content": "Brand" + }, + { + "type": "color", + "id": "color_navy", + "default": "#0E1E33", + "label": "Navy" + }, + { + "type": "color", + "id": "color_accent", + "default": "#B76E79", + "label": "Rose accent" + }, + { + "type": "color", + "id": "color_accent_soft", + "default": "#E7CFC9", + "label": "Rose soft" + }, + { + "type": "color", + "id": "color_contrast", + "default": "#FAF7F2", + "label": "On-dark text" + }, + { + "type": "header", + "content": "Shape" + }, { "type": "range", "id": "input_corner_radius", @@ -76,7 +134,7 @@ "step": 1, "unit": "px", "label": "t:labels.input_corner_radius", - "default": 4 + "default": 0 } ] } diff --git a/docs/ODYSSEY-JEWELS-BUILD-PLAN.md b/docs/ODYSSEY-JEWELS-BUILD-PLAN.md new file mode 100644 index 000000000..73f9f55e1 --- /dev/null +++ b/docs/ODYSSEY-JEWELS-BUILD-PLAN.md @@ -0,0 +1,329 @@ +# Odyssey Jewels — Theme Build Plan + +> **Tagline:** *Travel the World, Collect the World — Every Jewel Tells a Story.* +> +> This document translates the [OJ – Odyssey Jewels Web Timeline](https://docs.google.com/document/d/14x0lBh_xyqGfYKDEW3zwPg2JthE64zyl5WoszIA3utQ/edit) into a concrete technical build plan for the Shopify theme, grounded in this `skeleton-theme` codebase. +> +> **Status legend:** `[ ]` not started · `[~]` in progress · `[x]` done +> **Owner tags:** `@core` (our team / framework) · `@dev` (Upwork build-out devs) · `@client` (Gian & Angie) · `@app` (3rd-party app config) + +--- + +## 1. Goal & Success Criteria + +Build a **fully working, premium Shopify site live in ~90 days** (hard deadline before Christmas). + +**Definition of done (Day 90):** +- [ ] Site live on production domain, password removed. +- [ ] Full catalog uploaded (~1,000–2,000 products), structured but staged. +- [ ] Only the **first drop** visible: **Oceania Collection** (~200 pieces) + part of **The Founders Collection** (formerly "Private Collection"). +- [ ] Remaining collections staged and ready for region-by-region releases (7 Odyssey regions + 1 Founders). +- [ ] Core mechanics working: interactive world map, OJ Rewards, referral/affiliate, "sold = gone", region exclusivity. +- [ ] Influencer shortlist ready for activation. + +--- + +## 2. Guiding Strategy + +1. **We build the premium framework first.** Ship a custom, well-structured theme on top of this skeleton so the brand feels right. Then hand a documented, componentized theme to lower-cost Upwork devs for build-out, product upload, and technical grunt work. +2. **We project-manage, not hand-code everything.** Our value is architecture, brand, the "hero" custom features (world map, rewards logic), QA, and directing devs. +3. **Native-first, app-second, custom-last.** Prefer Shopify-native features → vetted apps → custom code, in that order, to hit the timeline. Reserve custom builds for the brand-defining pieces. + +--- + +## 3. Current State — Skeleton Audit + +This theme is Shopify's official **Skeleton Theme** (v0.1.0) — an intentionally minimal, best-practice starting point. What exists today: + +``` +assets/ critical.css, icon-account.svg, icon-cart.svg, shoppy-x-ray.svg +blocks/ group.liquid, text.liquid +config/ settings_data.json, settings_schema.json +layout/ theme.liquid, password.liquid +locales/ en.default.json, en.default.schema.json +sections/ header, footer, product, collection, collections, cart, blog, + article, search, page, 404, password, custom-section, hello-world +snippets/ css-variables.liquid, image.liquid, meta-tags.liquid +templates/ index, product, collection, list-collections, blog, article, + cart, page, search, 404, password, gift_card, (all JSON) +``` + +**Reality check:** Every section is currently bare-bones. For example, `sections/product.liquid` renders a raw image loop, title, price, description, and a plain variant ` +
+ + +
+ {% if form.posted_successfully? %} +

Thank you — welcome to the expedition.

+ {% endif %} + {% endform %} + + {% endif %} + + + + + {% stylesheet %} - footer { + .site-footer { + margin-top: 0; + } + .site-footer__inner { + padding: var(--space-2xl) var(--page-margin) var(--space-lg); + display: flex; + flex-direction: column; + gap: var(--space-xl); + } + .site-footer__top { display: flex; justify-content: space-between; - margin-top: 2rem; + gap: var(--space-xl); + flex-wrap: wrap; + padding-bottom: var(--space-lg); + border-bottom: 1px solid color-mix(in srgb, var(--color-contrast) 18%, transparent); + } + .site-footer__wordmark { + font-family: var(--font-heading--family); + font-size: var(--text-2xl); + letter-spacing: 2px; + text-transform: uppercase; + margin-top: var(--space-2xs); + } + .site-footer__blurb { + margin-top: var(--space-sm); + color: color-mix(in srgb, var(--color-contrast) 80%, transparent); + } + .site-footer__news-title { + font-size: var(--text-sm); + letter-spacing: 1.5px; + text-transform: uppercase; + margin-bottom: var(--space-sm); + } + .newsletter-field { + display: flex; + align-items: center; + gap: var(--space-2xs); + border-bottom: 1px solid var(--color-contrast); + min-width: min(24rem, 80vw); } - footer a { + .newsletter-field input { + flex: 1; + background: transparent; + border: 0; + color: var(--color-contrast); + padding: 0.75rem 0; + outline: none; + } + .newsletter-field input::placeholder { + color: color-mix(in srgb, var(--color-contrast) 60%, transparent); + } + .newsletter-field__submit { + background: none; + border: 0; + color: var(--color-contrast); + cursor: pointer; + display: inline-flex; + transition: color var(--duration) var(--ease), transform var(--duration) var(--ease); + } + .newsletter-field__submit:hover { + color: var(--color-accent-soft); + transform: translateX(3px); + } + .newsletter-note { + margin-top: var(--space-xs); + font-size: var(--text-sm); + color: var(--color-accent-soft); + } + + .site-footer__columns { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); + gap: var(--space-lg); + } + .footer-col__title { + font-size: var(--text-xs); + letter-spacing: 2px; + text-transform: uppercase; + color: var(--color-accent-soft); + margin-bottom: var(--space-sm); + } + .footer-col__list { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + gap: 0.7rem; + } + .footer-col__list a { text-decoration: none; - color: var(--color-foreground); + color: color-mix(in srgb, var(--color-contrast) 82%, transparent); + font-size: var(--text-sm); + transition: color var(--duration) var(--ease); + } + .footer-col__list a:hover { + color: var(--color-contrast); + } + + .site-footer__bottom { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-md); + flex-wrap: wrap; + padding-top: var(--space-lg); + border-top: 1px solid color-mix(in srgb, var(--color-contrast) 18%, transparent); + } + .site-footer__copyright { + font-size: var(--text-xs); + letter-spacing: 0.5px; + color: color-mix(in srgb, var(--color-contrast) 70%, transparent); } - footer .footer__links, - footer .footer__payment { + .site-footer__payment { display: flex; - gap: 1rem; + gap: 0.5rem; + flex-wrap: wrap; + } + + @media (max-width: 749px) { + .site-footer__top { + flex-direction: column; + gap: var(--space-lg); + } } {% endstylesheet %} @@ -42,9 +210,42 @@ "name": "t:general.footer", "settings": [ { - "type": "link_list", - "id": "menu", - "label": "t:labels.menu" + "type": "text", + "id": "tagline", + "label": "Tagline", + "default": "Travel the world, collect the world" + }, + { + "type": "textarea", + "id": "blurb", + "label": "Brand statement", + "default": "One-of-a-kind treasures gathered from artisans across the globe. Each piece carries the story of where it came from." + }, + { + "type": "header", + "content": "Newsletter" + }, + { + "type": "checkbox", + "id": "show_newsletter", + "label": "Show newsletter signup", + "default": true + }, + { + "type": "text", + "id": "newsletter_title", + "label": "Newsletter title", + "default": "Join the expedition" + }, + { + "type": "text", + "id": "newsletter_placeholder", + "label": "Newsletter placeholder", + "default": "Enter your email" + }, + { + "type": "header", + "content": "Bottom row" }, { "type": "checkbox", @@ -52,6 +253,35 @@ "label": "t:labels.show_payment_icons", "default": true } + ], + "blocks": [ + { + "type": "menu", + "name": "Link column", + "settings": [ + { + "type": "text", + "id": "title", + "label": "Title", + "default": "Explore" + }, + { + "type": "link_list", + "id": "menu", + "label": "t:labels.menu" + } + ] + } + ], + "max_blocks": 4, + "presets": [ + { + "name": "t:general.footer", + "blocks": [ + { "type": "menu" }, + { "type": "menu" } + ] + } ] } {% endschema %} diff --git a/sections/header.liquid b/sections/header.liquid index d873bdda7..975827346 100644 --- a/sections/header.liquid +++ b/sections/header.liquid @@ -1,66 +1,308 @@ -
-

- {{ shop.name | link_to: routes.root_url }} -

- -
- {% for link in section.settings.menu.links %} - {{ link.title | link_to: link.url }} - {% endfor %} +{% comment %} + Premium site header: announcement bar, centered brand, region-based nav, + search / account / cart. Optional transparent overlay on the homepage hero. +{% endcomment %} + +{% liquid + assign is_transparent = false + if section.settings.transparent_on_home and template.name == 'index' + assign is_transparent = true + endif +%} + +{% if section.settings.announcement != blank %} +
+

{{ section.settings.announcement }}

+{% endif %} -
- {% if shop.customer_accounts_enabled %} - - {{ 'icon-account.svg' | inline_asset_content }} - - {% endif %} +
+
{% stylesheet %} - header { - height: 5rem; - display: flex; + .announcement { + background-color: var(--color-navy); + color: var(--color-contrast); + text-align: center; + padding: 0.6rem var(--page-margin); + } + .announcement__text { + font-size: var(--text-xs); + letter-spacing: var(--tracking-eyebrow); + text-transform: uppercase; + font-weight: 600; + } + + .site-header { + position: sticky; + top: 0; + z-index: 20; + background-color: var(--color-background); + border-bottom: 1px solid var(--color-line); + transition: background-color var(--duration) var(--ease), color var(--duration) var(--ease), border-color var(--duration) var(--ease); + } + + .site-header__inner { + display: grid; + grid-template-columns: 1fr auto 1fr; align-items: center; - justify-content: space-between; + gap: var(--space-md); + padding-inline: var(--page-margin); + min-height: 5.5rem; + } + + .site-header__nav { + display: flex; + gap: var(--space-md); + } + .site-header__nav--left { + justify-content: flex-start; } - header a { + + .nav-link { + font-size: var(--text-sm); + letter-spacing: 1.5px; + text-transform: uppercase; + text-decoration: none; + color: currentcolor; position: relative; + padding-block: 0.5rem; + } + .nav-link::after { + content: ""; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 1px; + background-color: var(--color-accent); + transform: scaleX(0); + transform-origin: left; + transition: transform var(--duration) var(--ease); + } + .nav-link:hover::after { + transform: scaleX(1); + } + + .site-header__brand { + text-align: center; text-decoration: none; - color: var(--color-foreground); + color: currentcolor; + } + .site-header__wordmark { + font-family: var(--font-heading--family); + font-size: var(--text-xl); + letter-spacing: 3px; + text-transform: uppercase; + } + .site-header__logo { + height: auto; + margin-inline: auto; + } + + .site-header__actions { display: flex; align-items: center; + justify-content: flex-end; + gap: var(--space-sm); + } + .site-header__icon { + display: inline-flex; + align-items: center; justify-content: center; + color: currentcolor; + background: none; + border: 0; + cursor: pointer; + position: relative; + } + .site-header__icon svg { + width: 22px; + height: 22px; } - header a sup { + .site-header__cart-count { position: absolute; + top: -0.5rem; left: 100%; - overflow: hidden; - max-width: var(--page-margin); + margin-left: -0.6rem; + font-size: 0.65rem; + font-weight: 700; + background-color: var(--color-accent); + color: var(--color-contrast); + min-width: 1.1rem; + height: 1.1rem; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0 0.25rem; } - header svg { - width: 2rem; + + /* Transparent overlay on homepage hero */ + .site-header--transparent:not([data-scrolled="true"]) { + position: fixed; + inset: 0 0 auto 0; + background-color: transparent; + border-bottom-color: transparent; + color: var(--color-contrast); + } + .site-header--transparent:not([data-scrolled="true"]) .nav-link::after { + background-color: var(--color-contrast); + } + + /* Mobile nav */ + .nav-mobile { + display: none; + position: relative; } - header .header__menu, - header .header__icons { + .nav-mobile__panel { + position: absolute; + right: 0; + top: calc(100% + 0.75rem); + background-color: var(--color-background); + color: var(--color-foreground); + border: 1px solid var(--color-line); + padding: var(--space-sm); + min-width: 14rem; display: flex; - gap: 1rem; + flex-direction: column; + gap: 0.25rem; + box-shadow: 0 20px 50px -20px rgba(14, 30, 51, 0.35); + } + .nav-mobile__link { + padding: 0.65rem 0.5rem; + text-decoration: none; + text-transform: uppercase; + letter-spacing: 1.5px; + font-size: var(--text-sm); + border-bottom: 1px solid var(--color-line); + } + .nav-mobile__link:last-child { + border-bottom: 0; + } + .nav-mobile summary { + list-style: none; + } + .nav-mobile summary::-webkit-details-marker { + display: none; + } + + @media (max-width: 749px) { + .site-header__nav--left { + display: none; + } + .site-header__inner { + grid-template-columns: 1fr auto 1fr; + min-height: 4.5rem; + } + .nav-mobile { + display: block; + } } {% endstylesheet %} +{% javascript %} + (function () { + const header = document.currentScript + ? document.querySelector('.site-header') + : null; + const el = document.querySelector('.site-header--transparent'); + if (!el) return; + const onScroll = () => { + el.dataset.scrolled = window.scrollY > 40 ? 'true' : 'false'; + }; + onScroll(); + window.addEventListener('scroll', onScroll, { passive: true }); + })(); +{% endjavascript %} + {% schema %} { "name": "t:general.header", "settings": [ + { + "type": "text", + "id": "announcement", + "label": "Announcement text", + "default": "Complimentary worldwide shipping — Every jewel tells a story" + }, + { + "type": "image_picker", + "id": "logo", + "label": "Logo" + }, + { + "type": "range", + "id": "logo_width", + "min": 80, + "max": 320, + "step": 10, + "unit": "px", + "label": "Logo width", + "default": 160 + }, { "type": "link_list", "id": "menu", @@ -71,6 +313,18 @@ "id": "customer_account_menu", "label": "t:labels.customer_account_menu", "default": "customer-account-main-menu" + }, + { + "type": "checkbox", + "id": "sticky", + "label": "Sticky header", + "default": true + }, + { + "type": "checkbox", + "id": "transparent_on_home", + "label": "Transparent over homepage hero", + "default": true } ] } diff --git a/sections/hero.liquid b/sections/hero.liquid new file mode 100644 index 000000000..ed263f67a --- /dev/null +++ b/sections/hero.liquid @@ -0,0 +1,259 @@ +{% comment %} + Full-viewport cinematic hero with a background video (or image fallback), + overlay, eyebrow, headline and call-to-action buttons. +{% endcomment %} + +{% liquid + assign poster = section.settings.poster_url + if section.settings.poster_image != blank + assign poster = section.settings.poster_image | image_url: width: 2400 + endif +%} + +
+
+ {% if section.settings.video_url != blank %} + + {% else %} + + {% endif %} +
+
+ +
+ {% if section.settings.eyebrow != blank %} +

{{ section.settings.eyebrow }}

+ {% endif %} + {% if section.settings.heading != blank %} +

{{ section.settings.heading }}

+ {% endif %} + {% if section.settings.subheading != blank %} +

{{ section.settings.subheading }}

+ {% endif %} + +
+ {% if section.settings.button_label != blank %} + + {{ section.settings.button_label }} + + {% endif %} + {% if section.settings.button_label_2 != blank %} + + {{ section.settings.button_label_2 }} + + {% endif %} +
+
+ + {% if section.settings.show_scroll_cue %} + + {% endif %} +
+ +{% stylesheet %} + .hero { + position: relative; + min-height: var(--min-h, 92svh); + display: grid; + place-items: center; + overflow: hidden; + color: var(--color-contrast); + isolation: isolate; + } + .hero__media { + position: absolute; + inset: 0; + z-index: -1; + } + .hero__video { + width: 100%; + height: 100%; + object-fit: cover; + } + .hero__overlay { + position: absolute; + inset: 0; + background: + linear-gradient(to bottom, rgba(14, 30, 51, 0.25), rgba(14, 30, 51, 0.65)), + rgba(14, 30, 51, calc(var(--overlay) / 100)); + } + .hero__content { + padding: var(--space-2xl) var(--page-margin); + max-width: 60rem; + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-md); + animation: hero-rise 1.2s var(--ease) both; + } + .hero__eyebrow { + color: var(--color-accent-soft); + } + .hero__heading { + font-size: var(--text-hero); + margin: 0; + } + .hero__subheading { + font-size: var(--text-lg); + color: color-mix(in srgb, var(--color-contrast) 88%, transparent); + } + .hero__actions { + display: flex; + gap: var(--space-sm); + flex-wrap: wrap; + justify-content: center; + margin-top: var(--space-sm); + } + .hero__button-ghost { + color: var(--color-contrast); + border-color: var(--color-contrast); + } + .hero__button-ghost:hover { + background-color: var(--color-contrast); + color: var(--color-navy); + } + .hero__scroll { + position: absolute; + bottom: 2rem; + left: 50%; + transform: translateX(-50%); + width: 1px; + height: 3.5rem; + background: color-mix(in srgb, var(--color-contrast) 40%, transparent); + overflow: hidden; + } + .hero__scroll span { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 40%; + background: var(--color-contrast); + animation: hero-scroll 2s var(--ease) infinite; + } + + @keyframes hero-rise { + from { opacity: 0; transform: translateY(24px); } + to { opacity: 1; transform: translateY(0); } + } + @keyframes hero-scroll { + 0% { transform: translateY(-100%); } + 100% { transform: translateY(250%); } + } +{% endstylesheet %} + +{% schema %} +{ + "name": "Hero", + "settings": [ + { + "type": "header", + "content": "Media" + }, + { + "type": "text", + "id": "video_url", + "label": "Background video URL (mp4)", + "info": "Leave empty to use the poster image only.", + "default": "https://assets.mixkit.co/videos/preview/mixkit-waves-coming-to-the-beach-5016-large.mp4" + }, + { + "type": "image_picker", + "id": "poster_image", + "label": "Poster image" + }, + { + "type": "text", + "id": "poster_url", + "label": "Poster image URL (fallback)", + "default": "https://images.unsplash.com/photo-1505142468610-359e7d316be0?auto=format&fit=crop&w=2400&q=80" + }, + { + "type": "range", + "id": "overlay_opacity", + "min": 0, + "max": 80, + "step": 5, + "unit": "%", + "label": "Overlay darkness", + "default": 25 + }, + { + "type": "range", + "id": "height", + "min": 60, + "max": 100, + "step": 2, + "unit": "vh", + "label": "Section height", + "default": 92 + }, + { + "type": "header", + "content": "Content" + }, + { + "type": "text", + "id": "eyebrow", + "label": "Eyebrow", + "default": "Odyssey Jewels" + }, + { + "type": "text", + "id": "heading", + "label": "Heading", + "default": "Travel the World, Collect the World" + }, + { + "type": "textarea", + "id": "subheading", + "label": "Subheading", + "default": "Rare, one-of-a-kind treasures gathered from artisans across the globe. Every jewel tells a story." + }, + { + "type": "text", + "id": "button_label", + "label": "Primary button label", + "default": "Explore the collection" + }, + { + "type": "url", + "id": "button_url", + "label": "Primary button link" + }, + { + "type": "text", + "id": "button_label_2", + "label": "Secondary button label", + "default": "Our story" + }, + { + "type": "url", + "id": "button_url_2", + "label": "Secondary button link" + }, + { + "type": "checkbox", + "id": "show_scroll_cue", + "label": "Show scroll indicator", + "default": true + } + ], + "presets": [ + { + "name": "Hero" + } + ] +} +{% endschema %} diff --git a/sections/promises.liquid b/sections/promises.liquid new file mode 100644 index 000000000..e5693a7af --- /dev/null +++ b/sections/promises.liquid @@ -0,0 +1,112 @@ +{% comment %} + Slim assurance band: a row of short brand promises (icon + label + text). +{% endcomment %} + +
+
+ {% for block in section.blocks %} +
+ {% if block.settings.title != blank %} +

{{ block.settings.title }}

+ {% endif %} + {% if block.settings.text != blank %} +

{{ block.settings.text }}

+ {% endif %} +
+ {% endfor %} +
+
+ +{% stylesheet %} + .promises__row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr)); + gap: var(--space-lg); + padding: var(--space-xl) var(--page-margin); + border-top: 1px solid var(--color-line); + border-bottom: 1px solid var(--color-line); + } + .on-dark .promises__row { + border-color: color-mix(in srgb, var(--color-contrast) 18%, transparent); + } + .promise { + text-align: center; + display: flex; + flex-direction: column; + gap: 0.5rem; + } + .promise__title { + font-family: var(--font-heading--family); + font-size: var(--text-xl); + } + .promise__text { + font-size: var(--text-sm); + color: var(--color-foreground-50); + } + .on-dark .promise__text { + color: color-mix(in srgb, var(--color-contrast) 78%, transparent); + } +{% endstylesheet %} + +{% schema %} +{ + "name": "Promises", + "settings": [ + { + "type": "checkbox", + "id": "dark", + "label": "Dark theme", + "default": false + } + ], + "blocks": [ + { + "type": "promise", + "name": "Promise", + "settings": [ + { + "type": "text", + "id": "title", + "label": "Title", + "default": "One of a kind" + }, + { + "type": "text", + "id": "text", + "label": "Text", + "default": "Every piece is unique. When it's gone, it's gone." + } + ] + } + ], + "max_blocks": 4, + "presets": [ + { + "name": "Promises", + "blocks": [ + { + "type": "promise", + "settings": { + "title": "One of a kind", + "text": "Every piece is unique. When it's gone, it's gone." + } + }, + { + "type": "promise", + "settings": { + "title": "Artisan made", + "text": "Crafted by master makers in their homeland." + } + }, + { + "type": "promise", + "settings": { + "title": "Worldwide delivery", + "text": "Complimentary, insured shipping across the globe." + } + } + ] + } + ] +} +{% endschema %} diff --git a/sections/regions.liquid b/sections/regions.liquid new file mode 100644 index 000000000..6baa12357 --- /dev/null +++ b/sections/regions.liquid @@ -0,0 +1,255 @@ +{% comment %} + Region-based collection showcase. Each block is a region card with imagery, + a status label (e.g. Available now / Coming soon) and a link. +{% endcomment %} + +
+
+ {% if section.settings.eyebrow != blank %} +

{{ section.settings.eyebrow }}

+ {% endif %} + {% if section.settings.heading != blank %} +

{{ section.settings.heading }}

+ {% endif %} + {% if section.settings.subheading != blank %} +

{{ section.settings.subheading }}

+ {% endif %} +
+ +
+ {% for block in section.blocks %} + {% liquid + assign img = block.settings.image_url + if block.settings.image != blank + assign img = block.settings.image | image_url: width: 1200 + endif + %} + +
+ {{ block.settings.title | escape }} +
+
+
+ {% if block.settings.status != blank %} + {{ block.settings.status }} + {% endif %} +

{{ block.settings.title }}

+ {% if block.settings.subtitle != blank %} +

{{ block.settings.subtitle }}

+ {% endif %} + {{ block.settings.cta | default: 'Discover' }} +
+
+ {% endfor %} +
+
+ +{% stylesheet %} + .regions__head { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-sm); + margin-bottom: var(--space-xl); + } + .regions__sub { + color: var(--color-foreground-50); + font-size: var(--text-lg); + } + .regions__grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(20rem, 100%), 1fr)); + gap: var(--space-md); + } + .region-card { + position: relative; + display: block; + text-decoration: none; + color: var(--color-contrast); + overflow: hidden; + aspect-ratio: 4 / 5; + isolation: isolate; + } + .region-card__media { + position: absolute; + inset: 0; + z-index: -1; + } + .region-card__media img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 1.2s var(--ease); + } + .region-card__overlay { + position: absolute; + inset: 0; + background: linear-gradient(to top, rgba(14, 30, 51, 0.85) 0%, rgba(14, 30, 51, 0.1) 55%, rgba(14, 30, 51, 0.2) 100%); + transition: background var(--duration) var(--ease); + } + .region-card:hover .region-card__media img { + transform: scale(1.06); + } + .region-card__body { + position: absolute; + inset: auto 0 0 0; + padding: var(--space-lg); + display: flex; + flex-direction: column; + gap: 0.5rem; + } + .region-card__status { + align-self: flex-start; + font-size: var(--text-xs); + letter-spacing: 2px; + text-transform: uppercase; + padding: 0.35rem 0.75rem; + border: 1px solid color-mix(in srgb, var(--color-contrast) 55%, transparent); + color: var(--color-contrast); + margin-bottom: var(--space-2xs); + } + .region-card__title { + font-size: var(--text-2xl); + margin: 0; + } + .region-card__subtitle { + color: color-mix(in srgb, var(--color-contrast) 82%, transparent); + font-size: var(--text-sm); + } + .region-card__cta { + margin-top: var(--space-xs); + font-size: var(--text-sm); + letter-spacing: 1.5px; + text-transform: uppercase; + position: relative; + width: fit-content; + padding-bottom: 0.3rem; + } + .region-card__cta::after { + content: ""; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 1px; + background: var(--color-accent); + transform: scaleX(0); + transform-origin: left; + transition: transform var(--duration) var(--ease); + } + .region-card:hover .region-card__cta::after { + transform: scaleX(1); + } +{% endstylesheet %} + +{% schema %} +{ + "name": "Region collections", + "settings": [ + { + "type": "text", + "id": "eyebrow", + "label": "Eyebrow", + "default": "Collections by region" + }, + { + "type": "text", + "id": "heading", + "label": "Heading", + "default": "Where in the world will you begin?" + }, + { + "type": "textarea", + "id": "subheading", + "label": "Subheading", + "default": "Each region reveals a curated collection of treasures — released one expedition at a time." + } + ], + "blocks": [ + { + "type": "region", + "name": "Region", + "settings": [ + { + "type": "image_picker", + "id": "image", + "label": "Image" + }, + { + "type": "text", + "id": "image_url", + "label": "Image URL (fallback)" + }, + { + "type": "text", + "id": "status", + "label": "Status label", + "default": "Available now" + }, + { + "type": "text", + "id": "title", + "label": "Title", + "default": "Oceania" + }, + { + "type": "text", + "id": "subtitle", + "label": "Subtitle", + "default": "Treasures of the South Pacific" + }, + { + "type": "text", + "id": "cta", + "label": "Link label", + "default": "Discover" + }, + { + "type": "url", + "id": "link", + "label": "Link" + } + ] + } + ], + "max_blocks": 8, + "presets": [ + { + "name": "Region collections", + "blocks": [ + { + "type": "region", + "settings": { + "title": "Oceania", + "status": "Available now", + "subtitle": "Treasures of the South Pacific", + "image_url": "https://images.unsplash.com/photo-1507525428034-b723cf961d3e?auto=format&fit=crop&w=1200&q=80" + } + }, + { + "type": "region", + "settings": { + "title": "The Founders Collection", + "status": "By invitation", + "subtitle": "Rare pieces for our earliest collectors", + "image_url": "https://images.unsplash.com/photo-1611591437281-460bfbe1220a?auto=format&fit=crop&w=1200&q=80" + } + }, + { + "type": "region", + "settings": { + "title": "Asia", + "status": "Coming soon", + "subtitle": "Along the ancient trade routes", + "image_url": "https://images.unsplash.com/photo-1528181304800-259b08848526?auto=format&fit=crop&w=1200&q=80" + } + } + ] + } + ] +} +{% endschema %} diff --git a/sections/story.liquid b/sections/story.liquid new file mode 100644 index 000000000..a821e932b --- /dev/null +++ b/sections/story.liquid @@ -0,0 +1,156 @@ +{% comment %} + Editorial split section: large image paired with a story column. + Supports image on the left or right and an optional dark theme. +{% endcomment %} + +{% liquid + assign img = section.settings.image_url + if section.settings.image != blank + assign img = section.settings.image | image_url: width: 1600 + endif +%} + +
+
+
+ {{ section.settings.heading | escape }} +
+
+ {% if section.settings.eyebrow != blank %} +

{{ section.settings.eyebrow }}

+ {% endif %} + {% if section.settings.heading != blank %} +

{{ section.settings.heading }}

+ {% endif %} + {% if section.settings.body != blank %} +
{{ section.settings.body }}
+ {% endif %} + {% if section.settings.button_label != blank %} + + {{ section.settings.button_label }} + + {% endif %} +
+
+
+ +{% stylesheet %} + .story__grid { + display: grid; + grid-template-columns: 1.1fr 0.9fr; + align-items: center; + gap: clamp(2rem, 5vw, 6rem); + padding-inline: var(--page-margin); + } + .story--media-right .story__media { + order: 2; + } + .story__media { + overflow: hidden; + } + .story__media img { + width: 100%; + height: 100%; + object-fit: cover; + aspect-ratio: 4 / 5; + } + .story__content { + display: flex; + flex-direction: column; + gap: var(--space-md); + max-width: 34rem; + } + .story__heading { + font-size: var(--text-3xl); + } + .story__body { + color: var(--color-foreground-50); + font-size: var(--text-lg); + line-height: 1.7; + } + .on-dark .story__body { + color: color-mix(in srgb, var(--color-contrast) 80%, transparent); + } + .story__link { + margin-top: var(--space-2xs); + } + + @media (max-width: 749px) { + .story__grid { + grid-template-columns: 1fr; + gap: var(--space-lg); + } + .story--media-right .story__media { + order: 0; + } + } +{% endstylesheet %} + +{% schema %} +{ + "name": "Story", + "settings": [ + { + "type": "image_picker", + "id": "image", + "label": "Image" + }, + { + "type": "text", + "id": "image_url", + "label": "Image URL (fallback)", + "default": "https://images.unsplash.com/photo-1515562141207-7a88fb7ce338?auto=format&fit=crop&w=1600&q=80" + }, + { + "type": "select", + "id": "media_position", + "label": "Image position", + "options": [ + { "value": "left", "label": "Left" }, + { "value": "right", "label": "Right" } + ], + "default": "left" + }, + { + "type": "checkbox", + "id": "dark", + "label": "Dark theme", + "default": false + }, + { + "type": "text", + "id": "eyebrow", + "label": "Eyebrow", + "default": "Our philosophy" + }, + { + "type": "text", + "id": "heading", + "label": "Heading", + "default": "Every jewel tells a story" + }, + { + "type": "richtext", + "id": "body", + "label": "Body", + "default": "

We travel to the far corners of the world to work directly with master artisans. Each piece we bring home is one of a kind — shaped by the hands, heritage and horizon of the place it came from. When it's gone, it's gone.

" + }, + { + "type": "text", + "id": "button_label", + "label": "Link label", + "default": "Read our story" + }, + { + "type": "url", + "id": "button_url", + "label": "Link" + } + ], + "presets": [ + { + "name": "Story" + } + ] +} +{% endschema %} diff --git a/snippets/css-variables.liquid b/snippets/css-variables.liquid index 99b5497a3..f487713d5 100644 --- a/snippets/css-variables.liquid +++ b/snippets/css-variables.liquid @@ -1,18 +1,66 @@ {% style %} - {% # Loads all font variantions with display: swap %} + {% # Load all body font variations with display: swap %} {{ settings.type_primary_font | font_face: font_display: 'swap' }} {{ settings.type_primary_font | font_modify: 'weight', 'bold' | font_face: font_display: 'swap' }} {{ settings.type_primary_font | font_modify: 'weight', 'bold' | font_modify: 'style', 'italic' | font_face: font_display: 'swap' }} {{ settings.type_primary_font | font_modify: 'style', 'italic' | font_face: font_display: 'swap' }} + {% # Load heading font variations %} + {{ settings.type_heading_font | font_face: font_display: 'swap' }} + {{ settings.type_heading_font | font_modify: 'weight', 'bold' | font_face: font_display: 'swap' }} + {{ settings.type_heading_font | font_modify: 'style', 'italic' | font_face: font_display: 'swap' }} + :root { + /* Typography */ --font-primary--family: {{ settings.type_primary_font.family }}, {{ settings.type_primary_font.fallback_families }}; --font-primary--style: {{ settings.type_primary_font.style }}; --font-primary--weight: {{ settings.type_primary_font.weight }}; + --font-heading--family: {{ settings.type_heading_font.family }}, {{ settings.type_heading_font.fallback_families }}; + --font-heading--style: {{ settings.type_heading_font.style }}; + --font-heading--weight: {{ settings.type_heading_font.weight }}; + --tracking-heading: {{ settings.type_heading_tracking }}px; + --tracking-eyebrow: {{ settings.type_eyebrow_tracking }}px; + + /* Type scale (fluid) */ + --text-xs: 0.75rem; + --text-sm: 0.875rem; + --text-base: 1rem; + --text-lg: 1.125rem; + --text-xl: clamp(1.25rem, 1.1rem + 0.6vw, 1.5rem); + --text-2xl: clamp(1.6rem, 1.3rem + 1.4vw, 2.25rem); + --text-3xl: clamp(2rem, 1.5rem + 2.4vw, 3.25rem); + --text-4xl: clamp(2.6rem, 1.8rem + 4vw, 5rem); + --text-hero: clamp(3rem, 2rem + 6vw, 7rem); + + /* Layout */ --page-width: {{ settings.max_page_width }}; --page-margin: {{ settings.min_page_margin }}px; + + /* Spacing scale */ + --space-2xs: 0.5rem; + --space-xs: 0.75rem; + --space-sm: 1rem; + --space-md: 1.5rem; + --space-lg: 2.5rem; + --space-xl: 4rem; + --space-2xl: 6rem; + --space-3xl: 9rem; + --section-spacing: clamp(4rem, 2rem + 7vw, 9rem); + + /* Colors */ --color-background: {{ settings.background_color }}; --color-foreground: {{ settings.foreground_color }}; + --color-navy: {{ settings.color_navy }}; + --color-accent: {{ settings.color_accent }}; + --color-accent-soft: {{ settings.color_accent_soft }}; + --color-contrast: {{ settings.color_contrast }}; + --color-foreground-50: color-mix(in srgb, var(--color-foreground) 50%, transparent); + --color-foreground-12: color-mix(in srgb, var(--color-foreground) 12%, transparent); + --color-line: color-mix(in srgb, var(--color-foreground) 14%, transparent); + + /* Shape & motion */ --style-border-radius-inputs: {{ settings.input_corner_radius }}px; + --ease: cubic-bezier(0.22, 1, 0.36, 1); + --duration: 0.6s; } {% endstyle %} diff --git a/templates/index.json b/templates/index.json index 1f827db93..5ae798e4f 100644 --- a/templates/index.json +++ b/templates/index.json @@ -9,12 +9,180 @@ */ { "sections": { - "main": { - "type": "hello-world", - "settings": {} + "hero": { + "type": "hero", + "settings": { + "eyebrow": "Odyssey Jewels", + "heading": "Travel the World, Collect the World", + "subheading": "Rare, one-of-a-kind treasures gathered from artisans across the globe. Every jewel tells a story.", + "button_label": "Explore the collection", + "button_label_2": "Our story", + "overlay_opacity": 25, + "height": 92 + } + }, + "promises": { + "type": "promises", + "blocks": { + "p1": { + "type": "promise", + "settings": { + "title": "One of a kind", + "text": "Every piece is unique. When it's gone, it's gone." + } + }, + "p2": { + "type": "promise", + "settings": { + "title": "Artisan made", + "text": "Crafted by master makers in their homeland." + } + }, + "p3": { + "type": "promise", + "settings": { + "title": "Worldwide delivery", + "text": "Complimentary, insured shipping across the globe." + } + } + }, + "block_order": ["p1", "p2", "p3"] + }, + "regions": { + "type": "regions", + "settings": { + "eyebrow": "Collections by region", + "heading": "Where in the world will you begin?", + "subheading": "Each region reveals a curated collection of treasures — released one expedition at a time." + }, + "blocks": { + "r1": { + "type": "region", + "settings": { + "title": "Oceania", + "status": "Available now", + "subtitle": "Treasures of the South Pacific", + "cta": "Discover", + "image_url": "https://images.unsplash.com/photo-1507525428034-b723cf961d3e?auto=format&fit=crop&w=1200&q=80" + } + }, + "r2": { + "type": "region", + "settings": { + "title": "The Founders Collection", + "status": "By invitation", + "subtitle": "Rare pieces for our earliest collectors", + "cta": "Enquire", + "image_url": "https://images.unsplash.com/photo-1611591437281-460bfbe1220a?auto=format&fit=crop&w=1200&q=80" + } + }, + "r3": { + "type": "region", + "settings": { + "title": "Asia", + "status": "Coming soon", + "subtitle": "Along the ancient trade routes", + "cta": "Join the waitlist", + "image_url": "https://images.unsplash.com/photo-1528181304800-259b08848526?auto=format&fit=crop&w=1200&q=80" + } + } + }, + "block_order": ["r1", "r2", "r3"] + }, + "story": { + "type": "story", + "settings": { + "media_position": "left", + "dark": false, + "eyebrow": "Our philosophy", + "heading": "Every jewel tells a story", + "body": "

We travel to the far corners of the world to work directly with master artisans. Each piece we bring home is one of a kind — shaped by the hands, heritage and horizon of the place it came from. When it's gone, it's gone.

", + "button_label": "Read our story", + "image_url": "https://images.unsplash.com/photo-1515562141207-7a88fb7ce338?auto=format&fit=crop&w=1600&q=80" + } + }, + "featured": { + "type": "featured", + "settings": { + "eyebrow": "The first drop", + "heading": "Oceania Collection", + "link_label": "View all pieces" + }, + "blocks": { + "f1": { + "type": "piece", + "settings": { + "title": "Coral Tide Ring", + "region": "Oceania", + "badge": "One of a kind", + "price": "$1,200", + "image_url": "https://images.unsplash.com/photo-1605100804763-247f67b3557e?auto=format&fit=crop&w=900&q=80" + } + }, + "f2": { + "type": "piece", + "settings": { + "title": "Lagoon Pearl Pendant", + "region": "Oceania", + "badge": "One of a kind", + "price": "$980", + "image_url": "https://images.unsplash.com/photo-1599643478518-a784e5dc4c8f?auto=format&fit=crop&w=900&q=80" + } + }, + "f3": { + "type": "piece", + "settings": { + "title": "Reef Gold Bangle", + "region": "Oceania", + "badge": "One of a kind", + "price": "$1,540", + "image_url": "https://images.unsplash.com/photo-1611085583191-a3b181a88401?auto=format&fit=crop&w=900&q=80" + } + }, + "f4": { + "type": "piece", + "settings": { + "title": "Tide Drop Earrings", + "region": "Oceania", + "badge": "One of a kind", + "price": "$760", + "image_url": "https://images.unsplash.com/photo-1535632066927-ab7c9ab60908?auto=format&fit=crop&w=900&q=80" + } + } + }, + "block_order": ["f1", "f2", "f3", "f4"] + }, + "story_artisans": { + "type": "story", + "settings": { + "media_position": "right", + "dark": true, + "eyebrow": "The makers", + "heading": "Meet the artisans", + "body": "

Behind every treasure is a person and a place. We put their names, their cities and their craft at the heart of the story — because you're not just collecting jewellery, you're collecting the world.

", + "button_label": "Meet the makers", + "image_url": "https://images.unsplash.com/photo-1590650516494-0c8e4a4dd67e?auto=format&fit=crop&w=1600&q=80" + } + }, + "cta": { + "type": "cta-banner", + "settings": { + "eyebrow": "The odyssey begins", + "heading": "Begin your collection", + "subheading": "The first expedition has landed. Claim a piece of Oceania before it's gone forever.", + "button_label": "Shop the first drop", + "overlay_opacity": 45, + "image_url": "https://images.unsplash.com/photo-1519046904884-53103b34b206?auto=format&fit=crop&w=2400&q=80" + } } }, "order": [ - "main" + "hero", + "promises", + "regions", + "story", + "featured", + "story_artisans", + "cta" ] }