Classic Leather Collar
Create a collar that feels made for your pet. Choose the collar colour and size, then personalize it with letters and optional charms. Details Available in multiple colours and siz es. Compatible with collar letter add-ons and selected charm add-ons. Use the builder below to add the collar and matching letter inventory in one step. Personalized collar studio Design their signature collar Build the collar as a complete set: choose the name, match the letter finish, then add a charm by photo. Your pet's collar Choose size and colour above, then personalize below. Pet name or initials Letters A-Z only. Each letter is +$1.50 and added separately so inventory stays accurate. Letter style Silver Black Silver 11mm Letter style referenceReal letter photos for each finish. SilverBlackSilver 11mm Type a name to preview letters. Collar hole layout Choose letters and charms to arrange the collar. Letters only: max 10 Charms only: max 10 Letters + charms: max 10 total Charm add-on Make it feel like theirs. Start with a curated pick, or open the full charm library when you want to browse every photo. - No charm selected Optional finishing touch. Browse charms Charm library Loading charm photos... No charm All Heart Cross Gem Flower Star Other Loading charm photos... Add personalized set to cart #sp-collar-builder .sp-letter-reference{margin:12px 0 14px;padding:12px;border:1px solid #eee5d9;border-radius:8px;background:#fffaf2} #sp-collar-builder .sp-letter-reference-head{display:flex;justify-content:space-between;gap:10px;margin-bottom:10px} #sp-collar-builder .sp-letter-reference-head strong{font-size:13px} #sp-collar-builder .sp-letter-reference-head span{font-size:12px;color:#6c6256;text-align:right} #sp-collar-builder .sp-letter-reference-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px} #sp-collar-builder .sp-letter-reference figure{margin:0} #sp-collar-builder .sp-letter-reference img{display:block;width:100%;aspect-ratio:1.25/1;object-fit:contain;border-radius:6px;border:1px solid #eee5d9;background:#f8f3ea} #sp-collar-builder .sp-letter-reference figcaption{margin-top:6px;font-size:12px;font-weight:700;text-align:center} @media (max-width:520px){#sp-collar-builder .sp-letter-reference-grid{grid-template-columns:1fr}} .sp-collar-builder { border: 1px solid rgba(35, 35, 35, 0.12); border-radius: 8px; padding: 18px; margin: 18px 0; background: #fffdf8; color: #252525; } .sp-native-personalizer-hidden { display: none !important; } body.sp-collar-gallery-intro media-gallery slideshow-slide, body.sp-collar-gallery-intro media-gallery .slideshow-controls__thumbnail { display: none !important; } body.sp-collar-gallery-intro media-gallery slideshow-slide[data-sp-intro-media], body.sp-collar-gallery-intro media-gallery .slideshow-controls__thumbnail[data-sp-intro-media] { display: block !important; } body.sp-collar-gallery-color-mode media-gallery slideshow-slide[data-sp-intro-media], body.sp-collar-gallery-color-mode media-gallery .slideshow-controls__thumbnail[data-sp-intro-media] { display: none !important; } body.sp-collar-gallery-color-mode media-gallery slideshow-slide:not([data-sp-intro-media]) { display: flex !important; } body.sp-collar-gallery-color-mode media-gallery .slideshow-controls__thumbnail:not([data-sp-intro-media]) { display: block !important; } .sp-builder-header { border-bottom: 1px solid rgba(35, 35, 35, 0.1); padding-bottom: 14px; margin-bottom: 16px; } .sp-builder-kicker { margin: 0 0 6px; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: #7b6c58; } .sp-builder-header h3 { margin: 0 0 6px; font-size: 22px; line-height: 1.2; } .sp-builder-header p, .sp-builder-field small, .sp-selected-charm small, .sp-builder-guide p, .sp-builder-message { margin: 0; font-size: 13px; line-height: 1.45; color: #6c6256; } .sp-studio-preview { border: 1px solid rgba(35, 35, 35, 0.1); border-radius: 8px; overflow: hidden; background: #f7f3ea; margin: 16px 0; } .sp-preview-stage { min-height: 184px; display: flex; align-items: center; justify-content: center; padding: 22px 18px; background: linear-gradient(90deg, rgba(35, 35, 35, 0.035) 1px, transparent 1px), linear-gradient(180deg, rgba(35, 35, 35, 0.035) 1px, transparent 1px), radial-gradient(circle at 22% 18%, rgba(255, 255, 255, 0.92), transparent 34%), linear-gradient(135deg, #fffaf2, #eadfcf); background-size: 22px 22px, 22px 22px, auto, auto; } .sp-preview-collar { position: relative; width: min(100%, 470px); height: 116px; transition: width 0.18s ease, height 0.18s ease; } .sp-preview-collar.is-xs { width: min(72%, 330px); height: 96px; } .sp-preview-collar.is-s { width: min(82%, 380px); height: 104px; } .sp-preview-collar.is-m { width: min(92%, 430px); height: 112px; } .sp-preview-collar.is-l { width: min(100%, 470px); height: 116px; } .sp-preview-collar.is-xl { width: min(100%, 520px); height: 124px; } .sp-preview-strap { position: absolute; left: 6%; right: 6%; top: 42px; height: 30px; border-radius: 999px; background: #f8f6ef; border: 1px solid rgba(35, 35, 35, 0.22); box-shadow: inset 0 3px 10px rgba(255, 255, 255, 0.65), inset 0 -4px 10px rgba(0, 0, 0, 0.12); } .sp-preview-collar.is-xs .sp-preview-strap { left: 10%; right: 10%; top: 40px; height: 22px; } .sp-preview-collar.is-s .sp-preview-strap { left: 8%; right: 8%; top: 41px; height: 25px; } .sp-preview-collar.is-m .sp-preview-strap { top: 42px; height: 28px; } .sp-preview-collar.is-xl .sp-preview-strap { left: 5%; right: 5%; top: 43px; height: 34px; } .sp-preview-ring, .sp-preview-buckle { position: absolute; top: 36px; width: 20px; height: 36px; border: 4px solid #c7c9cc; border-radius: 7px; background: rgba(255, 255, 255, 0.42); box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.9), 0 2px 5px rgba(0, 0, 0, 0.12); } .sp-preview-ring-left { left: 9%; } .sp-preview-ring-right { right: 9%; } .sp-preview-buckle { left: 15%; width: 38px; } .sp-preview-name { position: absolute; left: 50%; top: 33px; transform: translateX(-50%); display: flex; gap: 3px; align-items: center; justify-content: center; min-height: 54px; max-width: 66%; padding: 0 8px; white-space: nowrap; } .sp-preview-name span { position: relative; min-width: 19px; height: 28px; border-radius: 0; display: inline-flex; align-items: center; justify-content: center; font-family: "Arial Rounded MT Bold", "Arial Black", "Helvetica Neue", sans-serif; font-weight: 900; font-size: 18px; line-height: 1; letter-spacing: 0; border: 0; background: transparent; color: #eceeee; -webkit-text-stroke: 1.25px #565d64; text-shadow: 0 -1px 0 #ffffff, 1px 0 0 #858d94, -1px 0 0 #cbd0d5, 0 2px 0 #656d75, 0 3px 3px rgba(0, 0, 0, 0.24); filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.22)); } .sp-preview-name.is-black span { color: #111; -webkit-text-stroke: 1.25px #777e86; text-shadow: 0 -1px 0 #333, 1px 0 0 #a5abb1, -1px 0 0 #4b5055, 0 2px 0 #757c84, 0 3px 3px rgba(0, 0, 0, 0.3); filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.28)); } .sp-preview-name.is-small span { min-width: 15px; height: 23px; font-size: 15px; -webkit-text-stroke-width: 0.9px; } .sp-preview-name span.has-letter-art, .sp-letter-chip.has-letter-art { color: transparent; -webkit-text-stroke: 0; text-shadow: none; } .sp-preview-name span.has-letter-art { min-width: 24px; width: 24px; height: 30px; } .sp-preview-name.is-small span.has-letter-art { min-width: 17px; width: 17px; height: 22px; } .sp-preview-collar.is-xs .sp-preview-name { top: 31px; transform: translateX(-50%) scale(0.82); } .sp-preview-collar.is-s .sp-preview-name { top: 32px; transform: translateX(-50%) scale(0.9); } .sp-preview-collar.is-xl .sp-preview-name { top: 35px; transform: translateX(-50%) scale(1.08); } .sp-preview-name span.has-letter-art img, .sp-letter-chip.has-letter-art img { display: block; width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.18)); } .sp-preview-name span.has-letter-art img { --sp-preview-letter-rotate: 0deg; transform: rotate(var(--sp-preview-letter-rotate)) scale(0.88); transform-origin: center; } .sp-preview-name span.sp-preview-layout-charm { width: 26px; min-width: 26px; height: 26px; border-radius: 50%; overflow: hidden; background: rgba(255, 255, 255, 0.74); box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); } .sp-preview-name.is-small span.sp-preview-layout-charm { width: 20px; min-width: 20px; height: 20px; } .sp-preview-name span.sp-preview-layout-charm img { width: 100%; height: 100%; object-fit: cover; display: block; } .sp-preview-charm { position: absolute; right: 20%; top: 70px; width: 48px; height: 48px; border-radius: 50%; overflow: hidden; background: #fff; border: 1px solid rgba(35, 35, 35, 0.14); box-shadow: 0 5px 12px rgba(0, 0, 0, 0.18); } .sp-preview-charm img { width: 100%; height: 100%; object-fit: cover; } .sp-preview-meta { display: flex; justify-content: space-between; gap: 10px; padding: 11px 14px; background: #fff; border-top: 1px solid rgba(35, 35, 35, 0.08); } .sp-preview-meta span { color: #6c6256; font-size: 12px; text-align: right; } .sp-builder-field { margin: 14px 0; } .sp-builder-field label, .sp-builder-fieldset legend { display: block; margin-bottom: 7px; font-size: 14px; font-weight: 650; } .sp-builder-fieldset { border: 0; padding: 0; } .sp-builder-input { width: 100%; min-height: 44px; border: 1px solid rgba(35, 35, 35, 0.18); border-radius: 6px; padding: 10px 12px; background: #fff; color: #252525; font: inherit; } .sp-hidden-select { position: absolute !important; width: 1px !important; height: 1px !important; overflow: hidden !important; opacity: 0 !important; pointer-events: none !important; } .sp-style-options { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; } .sp-style-option { display: flex; align-items: center; gap: 8px; min-height: 44px; border: 1px solid rgba(35, 35, 35, 0.14); border-radius: 6px; padding: 9px 10px; cursor: pointer; background: #fff; font-size: 13px; } .sp-style-option input { position: absolute; opacity: 0; pointer-events: none; } .sp-style-option.is-selected { border-color: #202020; box-shadow: inset 0 0 0 1px #202020; } .sp-style-swatch { width: 18px; height: 18px; border-radius: 50%; border: 1px solid rgba(35, 35, 35, 0.22); flex: 0 0 auto; } .sp-style-silver { background: linear-gradient(135deg, #f7f8fa, #9aa1a8 48%, #ffffff); } .sp-style-black { background: linear-gradient(135deg, #4b4b4b, #050505 55%, #777); } .sp-style-silver-small { background: linear-gradient(135deg, #ffffff, #c7ccd2 50%, #eef2f5); } .sp-letter-preview { display: flex; flex-wrap: wrap; gap: 9px; min-height: 48px; align-items: center; margin: 12px 0; } .sp-letter-chip { min-width: 34px; height: 42px; border-radius: 7px; border: 1px solid rgba(35, 35, 35, 0.1); display: inline-flex; align-items: center; justify-content: center; padding: 0 4px; background: linear-gradient(180deg, #fffdfa, #f4eee4); color: #eceeee; font-family: "Arial Rounded MT Bold", "Arial Black", "Helvetica Neue", sans-serif; font-size: 26px; font-weight: 900; line-height: 1; letter-spacing: 0; -webkit-text-stroke: 1.25px #565d64; text-shadow: 0 -1px 0 #ffffff, 1px 0 0 #858d94, -1px 0 0 #cbd0d5, 0 2px 0 #656d75, 0 3px 3px rgba(0, 0, 0, 0.22); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.85), 0 2px 5px rgba(0, 0, 0, 0.08); } .sp-letter-preview.is-black .sp-letter-chip { color: #111; -webkit-text-stroke: 1.25px #777e86; text-shadow: 0 -1px 0 #333, 1px 0 0 #a5abb1, -1px 0 0 #4b5055, 0 2px 0 #757c84, 0 3px 3px rgba(0, 0, 0, 0.26); } .sp-letter-preview.is-small .sp-letter-chip { min-width: 30px; height: 38px; font-size: 23px; -webkit-text-stroke-width: 0.9px; } .sp-letter-chip.has-letter-art { min-width: 42px; width: 42px; padding: 4px; } .sp-letter-preview.is-small .sp-letter-chip.has-letter-art { min-width: 36px; width: 36px; height: 38px; } .sp-layout-planner { border: 1px solid rgba(35, 35, 35, 0.1); border-radius: 8px; padding: 14px; margin: 14px 0 18px; background: #fff; } .sp-layout-head { display: flex; justify-content: space-between; gap: 10px; align-items: flex-start; margin-bottom: 12px; } .sp-layout-head strong { font-size: 14px; } .sp-layout-head small, .sp-layout-message { margin: 0; font-size: 12px; line-height: 1.4; color: #6c6256; text-align: right; } .sp-layout-rules { display: flex; flex-wrap: wrap; gap: 6px; margin: -2px 0 14px; } .sp-layout-rules span { display: inline-flex; align-items: center; min-height: 28px; border: 1px solid rgba(35, 35, 35, 0.1); border-radius: 999px; padding: 5px 9px; background: #fbf8f1; color: #5f564d; font-size: 11px; font-weight: 700; line-height: 1.25; } .sp-hole-track { display: grid; grid-template-columns: repeat(10, minmax(0, 1fr)); gap: 7px; } .sp-hole { position: relative; min-width: 0; appearance: none; aspect-ratio: 1; border: 1px solid rgba(35, 35, 35, 0.18); border-radius: 999px; background: #faf7ef; color: #282520; font: inherit; font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: border-color 0.16s ease, box-shadow 0.16s ease, background 0.16s ease; } .sp-hole::after { content: attr(data-hole); position: absolute; bottom: -15px; left: 50%; transform: translateX(-50%); font-size: 9px; font-weight: 500; color: #9a8f82; } .sp-hole:hover { border-color: rgba(35, 35, 35, 0.42); } .sp-hole.is-target { border-color: #202020; box-shadow: 0 0 0 3px rgba(32, 32, 32, 0.12); } .sp-hole.is-filled { background: #f3eadc; box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.68); } .sp-hole.is-charm { color: #7c4f22; } .sp-hole img { width: 78%; height: 78%; object-fit: cover; border-radius: 50%; pointer-events: none; } .sp-layout-tray { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; padding: 10px; border: 1px solid rgba(35, 35, 35, 0.1); border-radius: 8px; background: #fffdfa; } .sp-layout-piece { display: inline-flex; align-items: center; gap: 4px; padding: 3px; border: 1px solid rgba(35, 35, 35, 0.08); border-radius: 999px; background: #fff; } .sp-layout-chip { min-width: 38px; height: 38px; border: 1px solid rgba(35, 35, 35, 0.14); border-radius: 999px; background: #f8f3ea; color: #282520; display: inline-flex; align-items: center; justify-content: center; padding: 0 10px; font-size: 12px; font-weight: 800; line-height: 1; cursor: grab; transition: border-color 0.16s ease, box-shadow 0.16s ease, transform 0.16s ease; } .sp-layout-chip:active { cursor: grabbing; } .sp-layout-chip.is-active { border-color: #202020; box-shadow: 0 0 0 3px rgba(32, 32, 32, 0.12); transform: translateY(-1px); } .sp-layout-chip.is-placed { background: #f2eadf; } .sp-layout-chip img { width: 28px; height: 28px; border-radius: 50%; object-fit: cover; display: block; pointer-events: none; } .sp-layout-remove { width: 30px; height: 30px; flex: 0 0 30px; border: 1px solid rgba(35, 35, 35, 0.12); border-radius: 999px; background: #f7f3ea; color: #5f3a31; display: inline-flex; align-items: center; justify-content: center; padding: 0; font-size: 16px; font-weight: 800; line-height: 1; cursor: pointer; } .sp-layout-remove:hover { border-color: rgba(95, 58, 49, 0.42); background: #efe3d5; } .sp-layout-message { min-height: 17px; margin-top: 18px; text-align: left; } .sp-layout-message.is-error { color: #9f2f2f; } .sp-charm-picker { display: grid; grid-template-columns: 1fr auto; gap: 10px; align-items: stretch; border: 1px solid rgba(35, 35, 35, 0.12); border-radius: 8px; padding: 10px; background: #fff; } .sp-charm-story { display: grid; gap: 2px; margin: 0 0 8px; padding: 10px 12px; border-left: 3px solid #202020; background: #f7f3ea; border-radius: 6px; } .sp-charm-story strong { font-size: 13px; line-height: 1.3; } .sp-charm-story span { color: #6c6256; font-size: 12px; line-height: 1.4; } .sp-selected-charm { display: flex; gap: 10px; align-items: center; min-width: 0; } .sp-selected-charm-thumb { width: 48px; height: 48px; border-radius: 7px; border: 1px solid rgba(35, 35, 35, 0.12); background: #f7f3ea; color: #8a8175; display: flex; align-items: center; justify-content: center; overflow: hidden; flex: 0 0 auto; } .sp-selected-charm-thumb img { width: 100%; height: 100%; object-fit: cover; } .sp-selected-charm strong { display: block; font-size: 14px; line-height: 1.25; } .sp-charm-toggle { min-height: 48px; border: 0; border-radius: 6px; background: #202020; color: #fff; padding: 0 14px; cursor: pointer; font: inherit; font-weight: 700; white-space: nowrap; } .sp-featured-charms { display: none !important; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin-top: 10px; } .sp-featured-charm { position: relative; min-height: 124px; border: 1px solid rgba(35, 35, 35, 0.12); border-radius: 8px; padding: 7px; background: #fff; cursor: pointer; text-align: left; font: inherit; color: inherit; overflow: hidden; } .sp-featured-charm.is-selected { border-color: #202020; box-shadow: inset 0 0 0 1px #202020; } .sp-charm-qty { position: absolute; top: 6px; right: 6px; min-width: 24px; height: 24px; border-radius: 999px; padding: 0 7px; display: inline-flex; align-items: center; justify-content: center; background: #202020; color: #fff; font-size: 11px; font-weight: 800; line-height: 1; box-shadow: 0 2px 7px rgba(0, 0, 0, 0.22); pointer-events: none; } .sp-featured-charm img, .sp-featured-charm .sp-charm-empty-thumb { width: 100%; aspect-ratio: 1 / 1; border-radius: 6px; object-fit: cover; background: #f7f3ea; border: 1px solid rgba(35, 35, 35, 0.08); } .sp-featured-charm span { display: block; margin-top: 6px; font-size: 11px; line-height: 1.25; color: #252525; } .sp-charm-panel { border: 1px solid rgba(35, 35, 35, 0.12); border-radius: 8px; margin-top: 10px; padding: 12px; background: #fff; } .sp-charm-panel-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; margin-bottom: 10px; } .sp-charm-panel-head strong, .sp-charm-panel-head small { display: block; } .sp-charm-panel-head small { margin-top: 2px; color: #6c6256; font-size: 12px; } .sp-charm-clear { min-height: 34px; border: 1px solid rgba(35, 35, 35, 0.16); border-radius: 6px; padding: 7px 10px; background: #fff; color: #252525; cursor: pointer; font: inherit; font-size: 12px; white-space: nowrap; } .sp-charm-tabs { display: flex; gap: 6px; overflow-x: auto; padding: 10px 0 2px; } .sp-charm-tabs button { border: 1px solid rgba(35, 35, 35, 0.14); border-radius: 999px; min-height: 34px; padding: 7px 11px; background: #fff; color: #252525; cursor: pointer; font: inherit; font-size: 12px; white-space: nowrap; } .sp-charm-tabs button.is-active { background: #202020; border-color: #202020; color: #fff; } .sp-charm-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; max-height: 460px; overflow: auto; padding: 8px 2px 2px; margin-top: 10px; } .sp-charm-card { position: relative; display: grid; gap: 6px; align-content: start; border: 1px solid rgba(35, 35, 35, 0.12); border-radius: 8px; padding: 7px; background: #fff; cursor: pointer; text-align: left; font: inherit; color: inherit; } .sp-charm-card.is-selected { border-color: #202020; box-shadow: inset 0 0 0 1px #202020; } .sp-charm-card img, .sp-charm-empty-thumb { width: 100%; aspect-ratio: 1 / 1; border-radius: 6px; object-fit: cover; background: #f7f3ea; border: 1px solid rgba(35, 35, 35, 0.08); } .sp-charm-empty-thumb { display: flex; align-items: center; justify-content: center; color: #8a8175; font-size: 22px; } .sp-charm-card .sp-charm-name { display: block; font-size: 11px; line-height: 1.25; min-height: 28px; text-align: center; } .sp-charm-card .sp-charm-price { display: block; margin-top: -3px; color: #705f4a; font-size: 11px; font-weight: 800; line-height: 1.15; text-align: center; } .sp-charm-loading, .sp-charm-empty { grid-column: 1 / -1; margin: 0; color: #6c6256; font-size: 13px; } .sp-builder-guide { display: flex; align-items: center; justify-content: space-between; gap: 12px; border-top: 1px solid rgba(35, 35, 35, 0.1); padding-top: 14px; margin-top: 14px; } .sp-guide-toggle { border: 1px solid rgba(35, 35, 35, 0.18); border-radius: 6px; background: #fff; min-height: 38px; padding: 8px 12px; cursor: pointer; font: inherit; white-space: nowrap; } .sp-guide-panel { margin-top: 12px; } .sp-guide-images { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; } .sp-guide-card { display: grid; gap: 7px; } .sp-guide-card img { width: 100%; aspect-ratio: 1 / 1; object-fit: cover; border-radius: 6px; border: 1px solid rgba(35, 35, 35, 0.1); background: #f7f3ea; } .sp-guide-card span { color: #252525; font-size: 12px; font-weight: 700; line-height: 1.25; } .sp-builder-submit { width: 100%; min-height: 48px; border: 0; border-radius: 6px; margin-top: 16px; background: #202020; color: #fff; font: inherit; font-weight: 700; cursor: pointer; } .sp-builder-submit[disabled] { opacity: 0.55; cursor: wait; } .sp-builder-message { margin-top: 10px; } .sp-builder-message.is-error { color: #b42318; } .sp-builder-message.is-success { color: #087443; } @media (max-width: 640px) { .sp-style-options, .sp-guide-images { grid-template-columns: 1fr; } .sp-charm-picker { grid-template-columns: 1fr; } .sp-featured-charms { grid-template-columns: repeat(2, minmax(0, 1fr)); } .sp-charm-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); max-height: 430px; } .sp-preview-meta { display: block; } .sp-preview-meta span { display: block; margin-top: 3px; text-align: left; } .sp-layout-head { display: block; } .sp-layout-head small { display: block; margin-top: 3px; text-align: left; } .sp-layout-rules { margin-top: 10px; margin-bottom: 16px; } .sp-layout-rules span { min-height: 30px; font-size: 11px; } .sp-hole-track { grid-template-columns: repeat(5, minmax(42px, 1fr)); gap: 18px 8px; padding-bottom: 4px; } .sp-hole { min-height: 42px; font-size: 13px; } .sp-hole::after { bottom: -14px; font-size: 10px; } .sp-layout-tray { flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; margin-top: 24px; padding: 10px 8px; } .sp-layout-chip { flex: 0 0 auto; min-width: 46px; height: 46px; scroll-snap-align: start; font-size: 14px; } .sp-layout-chip img { width: 34px; height: 34px; } .sp-layout-piece { flex: 0 0 auto; gap: 5px; padding: 4px; } .sp-layout-remove { width: 36px; height: 36px; flex-basis: 36px; font-size: 18px; } } #sp-collar-builder .sp-hole-track { gap: 9px; align-items: center; } #sp-collar-builder .sp-hole { width: 34px; height: 34px; min-width: 34px; border-radius: 999px; border: 1px solid #ded6ca; background: linear-gradient(180deg, #fffdf8, #f7f1e8); box-shadow: 0 1px 2px rgba(35, 35, 35, 0.06), inset 0 1px 0 rgba(255, 255, 255, 0.9); color: transparent; font-size: 0; line-height: 1; position: relative; display: inline-flex !important; align-items: center; justify-content: center; } #sp-collar-builder .sp-hole .sp-hole-number { display: none !important; } #sp-collar-builder .sp-hole.is-empty::after { content: ""; position: absolute; left: 50%; top: 50%; width: 5px; height: 5px; border-radius: 50%; transform: translate(-50%, -50%); background: #cfc6ba; opacity: 0.9; } #sp-collar-builder .sp-hole:not(.is-empty) { width: 42px; height: 42px; min-width: 42px; border-color: #c9bdae; background: #fffaf2; box-shadow: 0 0 0 4px #f8f1e7, 0 3px 9px rgba(35, 35, 35, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.95); } #sp-collar-builder .sp-hole:not(.is-empty)::after { display: none; } #sp-collar-builder .sp-hole .sp-layout-chip { width: 32px; height: 32px; border: 0; background: transparent; box-shadow: none; color: #29241f; font-size: 13px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; } #sp-collar-builder .sp-hole .sp-preview-layout-charm img, #sp-collar-builder .sp-hole .sp-layout-chip img { width: 30px; height: 30px; object-fit: contain; } #sp-collar-builder .sp-hole.is-selected { outline: 2px solid #8f7a5d; outline-offset: 3px; } @media (max-width: 520px) { #sp-collar-builder .sp-hole-track { gap: 6px; } #sp-collar-builder .sp-hole { width: 29px; height: 29px; min-width: 29px; } #sp-collar-builder .sp-hole:not(.is-empty) { width: 36px; height: 36px; min-width: 36px; box-shadow: 0 0 0 3px #f8f1e7, 0 2px 7px rgba(35,35,35,.08); } } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] { left: 50%; top: 43px; width: 58%; max-width: 58%; min-height: 30px; padding: 0; transform: translateX(-50%); display: grid !important; grid-template-columns: repeat(10, minmax(0, 1fr)); gap: 4px; align-items: center; justify-items: center; pointer-events: none; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot { width: 20px; height: 24px; min-width: 0; border: 0 !important; background: transparent !important; box-shadow: none !important; display: inline-flex; align-items: center; justify-content: center; position: relative; color: #f8f7f1; font-size: 13px; line-height: 1; font-weight: 900; text-shadow: 0 1px 1px rgba(0,0,0,.52), 0 0 1px rgba(0,0,0,.62); } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.is-empty::after { content: ""; width: 4px; height: 4px; border-radius: 999px; background: rgba(65, 75, 72, .42); box-shadow: inset 0 1px 1px rgba(0,0,0,.35), 0 1px 0 rgba(255,255,255,.45); } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-piece { width: 23px; height: 25px; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-piece::before, #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm::before { display: none !important; content: none !important; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot > span, #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot > img, #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot * { position: relative; z-index: 1; background: transparent !important; box-shadow: none !important; border: 0 !important; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm img, #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot .sp-preview-layout-charm img { width: 22px; height: 22px; object-fit: contain; border-radius: 0 !important; mix-blend-mode: normal; filter: drop-shadow(0 1px 1px rgba(0,0,0,.28)); } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.is-black { color: #101010; text-shadow: 0 1px 0 rgba(255,255,255,.45), 0 0 1px rgba(255,255,255,.35); } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.is-small { font-size: 11px; } @media (max-width: 520px) { #sp-collar-builder .sp-preview-name[data-sp-hole-preview] { width: 64%; max-width: 64%; gap: 2px; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot { width: 15px; height: 20px; font-size: 10px; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-piece { width: 17px; height: 20px; } } #sp-collar-builder [data-c].is-picked,#sp-collar-builder [data-c].is-selected{outline:2px solid #202020!important;box-shadow:0 0 0 3px rgba(32,32,32,.12)!important} #sp-collar-builder .sp-hole.is-selected,#sp-collar-builder .sp-layout-piece.is-selected{outline:2px solid #202020!important;outline-offset:3px;box-shadow:0 0 0 3px rgba(255,255,255,.95)!important} #sp-collar-builder .sp-layout-piece{position:relative} #sp-collar-builder .sp-control-x{position:absolute;right:-7px;top:-7px;width:18px;height:18px;border-radius:999px;background:#202020;color:#fff;font:700 12px/18px Arial,sans-serif;text-align:center;cursor:pointer;z-index:5;box-shadow:0 2px 6px rgba(0,0,0,.22)} #sp-collar-builder .sp-final-pick{display:inline-grid;place-items:center;position:relative;width:38px;height:38px;margin-right:5px;border:1px solid rgba(32,32,32,.12);border-radius:8px;background:#fff} #sp-collar-builder .sp-final-pick img{max-width:28px;max-height:28px;object-fit:contain} #sp-collar-builder .sp-preview-layout-charm{position:relative;background:transparent!important;border:0!important;box-shadow:none!important} #sp-collar-builder .sp-preview-layout-charm img,#sp-collar-builder .sp-preview-slot.has-charm img{background:transparent!important;border:0!important;box-shadow:none!important;object-fit:contain!important;border-radius:0!important} #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-piece:not(.has-charm){transform:none!important;background:transparent!important;border:0!important;box-shadow:none!important} #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-piece:not(.has-charm)::after{content:none!important;display:none!important} #sp-collar-builder .sp-real-letter{display:block;width:23px;height:27px;object-fit:contain;background:transparent!important;border:0!important;box-shadow:none!important;filter:drop-shadow(0 1px 1px rgba(0,0,0,.25))} #sp-collar-builder .sp-preview-slot.is-small .sp-real-letter{width:18px;height:22px} #sp-collar-builder.sp-letter-black .sp-layout-chip{color:#080808!important;-webkit-text-fill-color:#080808!important;text-shadow:0 1px 1px rgba(255,255,255,.35)!important;filter:none!important} #sp-collar-builder .sp-layout-piece .sp-control-x{display:block} #sp-collar-builder .sp-featured-charms{display:none!important} #sp-collar-builder .sp-layout-message:empty,#sp-collar-builder .sp-builder-message:empty{display:none!important} #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm,#sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm *{background:transparent!important;border:0!important;box-shadow:none!important} #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm img{mix-blend-mode:normal!important;background:transparent!important;border-radius:0!important} #sp-collar-builder .sp-preview-stage{background:linear-gradient(135deg,#fffaf5,#f0e5d7)!important} #sp-collar-builder .sp-real-letter{image-rendering:auto!important;transform:none!important;width:27px!important;height:31px!important;object-fit:contain!important} #sp-collar-builder .sp-preview-slot.is-small .sp-real-letter{width:22px!important;height:26px!important} #sp-collar-builder .sp-preview-name[data-sp-hole-preview]{top:42px!important;width:60%!important;max-width:60%!important} @media (max-width: 749px) { #sp-collar-builder { margin-top: 16px !important; padding: 14px !important; border-radius: 8px !important; } #sp-collar-builder .sp-builder-header { margin-bottom: 12px !important; padding-bottom: 10px !important; } #sp-collar-builder .sp-builder-kicker { font-size: 10px !important; letter-spacing: .06em !important; } #sp-collar-builder .sp-builder-header h3 { font-size: 19px !important; line-height: 1.18 !important; margin-bottom: 6px !important; } #sp-collar-builder .sp-builder-header p, #sp-collar-builder .sp-builder-field small, #sp-collar-builder .sp-selected-charm small, #sp-collar-builder .sp-builder-message, #sp-collar-builder .sp-layout-message { font-size: 12px !important; line-height: 1.38 !important; } #sp-collar-builder .sp-studio-preview { margin: 12px 0 !important; border-radius: 8px !important; } #sp-collar-builder .sp-preview-stage { min-height: 138px !important; padding: 12px 10px !important; background-size: 18px 18px, 18px 18px, auto, auto !important; } #sp-collar-builder .sp-preview-collar { width: min(100%, 330px) !important; height: 92px !important; } #sp-collar-builder .sp-preview-strap { left: 7% !important; right: 7% !important; top: 34px !important; height: 24px !important; } #sp-collar-builder .sp-preview-ring, #sp-collar-builder .sp-preview-buckle { top: 29px !important; width: 16px !important; height: 30px !important; border-width: 3px !important; border-radius: 6px !important; } #sp-collar-builder .sp-preview-buckle { width: 30px !important; } #sp-collar-builder .sp-preview-meta { grid-template-columns: 1fr !important; gap: 2px !important; padding: 10px 12px !important; } #sp-collar-builder .sp-preview-meta strong, #sp-collar-builder .sp-preview-meta span { font-size: 12px !important; text-align: left !important; } #sp-collar-builder .sp-builder-field { margin: 12px 0 !important; } #sp-collar-builder .sp-builder-input { min-height: 44px !important; font-size: 16px !important; } #sp-collar-builder .sp-style-options { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; gap: 7px !important; } #sp-collar-builder .sp-style-option { min-height: 44px !important; padding: 8px 6px !important; justify-content: center !important; gap: 5px !important; font-size: 12px !important; white-space: nowrap !important; } #sp-collar-builder .sp-style-swatch { width: 16px !important; height: 16px !important; flex: 0 0 16px !important; } #sp-collar-builder .sp-letter-reference { margin: 10px 0 12px !important; padding: 9px !important; } #sp-collar-builder .sp-letter-reference-head { display: block !important; margin-bottom: 8px !important; } #sp-collar-builder .sp-letter-reference-head span { display: block !important; margin-top: 2px !important; text-align: left !important; font-size: 11px !important; } #sp-collar-builder .sp-letter-reference-grid { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; gap: 6px !important; } #sp-collar-builder .sp-letter-reference img { aspect-ratio: 1 / .92 !important; border-radius: 5px !important; } #sp-collar-builder .sp-letter-reference figcaption { font-size: 10px !important; line-height: 1.15 !important; margin-top: 4px !important; } #sp-collar-builder .sp-letter-preview { min-height: 0 !important; padding: 0 !important; border: 0 !important; background: transparent !important; font-size: 12px !important; } #sp-collar-builder .sp-layout-planner { padding: 12px 10px !important; margin-top: 12px !important; } #sp-collar-builder .sp-layout-head { display: block !important; } #sp-collar-builder .sp-layout-head small { display: block !important; margin-top: 2px !important; font-size: 11px !important; } #sp-collar-builder .sp-layout-rules { gap: 5px !important; margin: 8px 0 10px !important; } #sp-collar-builder .sp-layout-rules span { padding: 5px 7px !important; font-size: 10px !important; } #sp-collar-builder .sp-hole-track { display: grid !important; grid-template-columns: repeat(10, minmax(0, 1fr)) !important; gap: 3px !important; width: 100% !important; justify-items: center !important; } #sp-collar-builder .sp-hole, #sp-collar-builder .sp-hole:not(.is-empty) { width: 25px !important; min-width: 25px !important; height: 25px !important; min-height: 25px !important; border-radius: 999px !important; padding: 0 !important; } #sp-collar-builder .sp-hole-number { font-size: 9px !important; } #sp-collar-builder .sp-hole .sp-layout-chip { font-size: 11px !important; } #sp-collar-builder .sp-hole .sp-layout-chip img, #sp-collar-builder .sp-hole .sp-preview-layout-charm img { width: 22px !important; height: 22px !important; } #sp-collar-builder .sp-layout-tray { gap: 6px !important; padding: 9px !important; min-height: 50px !important; } #sp-collar-builder .sp-layout-piece { width: 34px !important; min-width: 34px !important; height: 34px !important; } #sp-collar-builder .sp-charm-story { padding: 10px !important; gap: 3px !important; } #sp-collar-builder .sp-charm-picker { display: grid !important; grid-template-columns: 1fr !important; gap: 8px !important; } #sp-collar-builder .sp-selected-charm, #sp-collar-builder .sp-charm-toggle, #sp-collar-builder .sp-builder-submit { min-height: 44px !important; width: 100% !important; } #sp-collar-builder .sp-charm-tabs { display: flex !important; overflow-x: auto !important; flex-wrap: nowrap !important; gap: 6px !important; padding-bottom: 4px !important; -webkit-overflow-scrolling: touch !important; } #sp-collar-builder .sp-charm-tabs button { flex: 0 0 auto !important; min-height: 36px !important; padding: 7px 10px !important; font-size: 12px !important; } #sp-collar-builder .sp-charm-grid { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; gap: 8px !important; } #sp-collar-builder .sp-charm-card { min-height: 116px !important; padding: 8px !important; } #sp-collar-builder .sp-charm-card img { width: 58px !important; height: 58px !important; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] { top: 33px !important; width: 64% !important; max-width: 64% !important; gap: 1px !important; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot { width: 14px !important; height: 18px !important; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-piece { width: 16px !important; height: 19px !important; } #sp-collar-builder .sp-real-letter { width: 18px !important; height: 22px !important; } #sp-collar-builder .sp-preview-slot.is-small .sp-real-letter { width: 15px !important; height: 18px !important; } } @media (max-width: 360px) { #sp-collar-builder .sp-style-options { grid-template-columns: 1fr !important; } #sp-collar-builder .sp-hole, #sp-collar-builder .sp-hole:not(.is-empty) { width: 22px !important; min-width: 22px !important; height: 22px !important; } #sp-collar-builder .sp-letter-reference-grid { gap: 4px !important; } } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm { width: 35px !important; height: 35px !important; overflow: visible !important; z-index: 2 !important; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm img { width: 34px !important; height: 34px !important; max-width: 34px !important; max-height: 34px !important; object-fit: contain !important; transform: translateY(-1px); filter: drop-shadow(0 1px 1px rgba(0,0,0,.30)) !important; } @media (max-width: 749px) { #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm { width: 29px !important; height: 29px !important; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm img { width: 28px !important; height: 28px !important; max-width: 28px !important; max-height: 28px !important; } } @media (max-width: 360px) { #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm { width: 26px !important; height: 26px !important; } #sp-collar-builder .sp-preview-name[data-sp-hole-preview] .sp-preview-slot.has-charm img { width: 25px !important; height: 25px !important; max-width: 25px !important; max-height: 25px !important; } } (function(){ if(window.spStableCollarBuilder)return;window.spStableCollarBuilder=1; var LETTER_IMG={Silver:'https://cdn.shopify.com/s/files/1/0711/2759/7217/files/170_6eb3e3c0-ef5a-4b2f-888f-7f4118018f3c.png?v=1782479450',Black:'https://cdn.shopify.com/s/files/1/0711/2759/7217/files/169_b55b69a4-36f8-4876-88f8-538f10ce4f3d.png?v=1782479450','Silver 11mm':'https://cdn.shopify.com/s/files/1/0711/2759/7217/files/168_aa55a61c-84e0-4386-8125-82415a99b5f2.png?v=1782479450'}; var LETTER_BOX={Silver:{A:[115,417,270,614],B:[400,434,561,632],C:[649,408,792,599],D:[905,394,1070,586],E:[1152,405,1300,598],F:[1424,398,1567,588],G:[1679,399,1868,588],H:[112,786,289,988],I:[423,773,474,967],J:[675,768,779,967],K:[918,739,1072,938],L:[1192,715,1326,903],M:[1417,714,1646,907],N:[1722,700,1886,888],O:[106,1096,305,1290],P:[410,1070,556,1265],Q:[630,1084,854,1285],R:[961,1054,1116,1255],S:[1213,1045,1361,1244],T:[1454,1045,1608,1241],U:[1725,1004,1889,1194],V:[83,1417,275,1631],W:[354,1426,594,1626],X:[689,1415,883,1624],Y:[969,1426,1124,1627],Z:[1210,1381,1386,1581]},Black:{A:[192,433,362,648],B:[450,431,629,647],C:[682,433,840,644],D:[933,430,1118,643],E:[1193,407,1346,616],F:[1473,398,1607,618],G:[1719,379,1931,588],H:[164,727,348,941],I:[489,704,552,916],J:[677,740,795,954],K:[946,726,1126,954],L:[1234,739,1380,948],M:[1445,713,1694,926],N:[1747,694,1926,901],O:[121,1018,339,1234],P:[428,1041,588,1257],Q:[650,1040,871,1256],R:[963,1038,1141,1259],S:[1247,1035,1402,1247],T:[1475,1025,1642,1236],U:[1713,980,1895,1197],V:[102,1386,312,1606],W:[373,1380,631,1602],X:[709,1346,910,1566],Y:[968,1330,1138,1550],Z:[1197,1317,1387,1539]},'Silver 11mm':{A:[209,438,370,636],B:[429,406,583,605],C:[686,409,839,585],D:[948,378,1097,557],E:[1168,340,1318,530],F:[1440,368,1573,559],G:[1659,353,1826,539],H:[215,697,386,916],I:[474,693,543,894],J:[637,647,791,845],K:[925,614,1078,810],L:[1196,608,1339,803],M:[1389,612,1574,799],N:[1650,580,1813,776],O:[200,1022,362,1217],P:[473,1015,627,1223],Q:[712,995,884,1191],R:[970,983,1135,1187],S:[1229,944,1363,1143],T:[1425,933,1574,1128],U:[1657,886,1832,1080],V:[198,1416,369,1635],W:[408,1394,669,1637],X:[709,1347,938,1584],Y:[986,1327,1176,1530],Z:[1265,1286,1452,1519]}}; var STRAP={white:{b:'rgb(212,211,202)',l:'rgba(244,243,237,.48)',e:'rgba(155,153,145,.22)',bd:'rgba(150,146,135,.42)'},yellow:{b:'rgb(213,217,108)',l:'rgba(242,243,162,.45)',e:'rgba(159,163,70,.22)',bd:'rgba(160,160,70,.42)'},black:{b:'rgb(38,39,42)',l:'rgba(115,116,120,.20)',e:'rgba(0,0,0,.28)',bd:'rgba(0,0,0,.48)'},magenta:{b:'rgb(223,101,150)',l:'rgba(246,160,194,.42)',e:'rgba(154,45,92,.22)',bd:'rgba(170,62,108,.42)'},pink:{b:'rgb(235,176,199)',l:'rgba(250,216,229,.45)',e:'rgba(190,101,139,.22)',bd:'rgba(196,121,150,.40)'},blue:{b:'rgb(159,224,233)',l:'rgba(211,245,249,.46)',e:'rgba(70,158,174,.22)',bd:'rgba(72,150,166,.42)'},purple:{b:'rgb(127,92,143)',l:'rgba(180,148,196,.36)',e:'rgba(77,48,96,.25)',bd:'rgba(91,60,110,.42)'},gold:{b:'rgb(238,194,69)',l:'rgba(255,226,130,.42)',e:'rgba(169,118,33,.22)',bd:'rgba(178,132,44,.42)'},orange:{b:'rgb(219,165,113)',l:'rgba(246,205,160,.42)',e:'rgba(164,96,52,.22)',bd:'rgba(176,111,67,.42)'},green:{b:'rgb(104,185,121)',l:'rgba(172,222,180,.42)',e:'rgba(54,126,69,.22)',bd:'rgba(62,138,78,.42)'}}; var imgCache={}, letterCache={}, charmCache={}; function q(s,p){return(p||document).querySelector(s)} function A(s,p){return Array.prototype.slice.call((p||document).querySelectorAll(s))} function esc(v){return String(v==null?'':v).replace(/[&"']/g,function(c){return{'&':'&','','"':'"',"'":'''}[c]})} function root(){return document.getElementById('sp-collar-builder')} function state(r){if(!r.__spStable)r.__spStable={layout:Array(10).fill(null),charms:[],sel:null,key:'',letters:{},allCharms:[],ready:false,filter:'All'};return r.__spStable} function style(r){var x=q('input[name="sp-letter-style"]:checked',r);return x?x.value:'Silver'} function cleanName(r){var i=q('#sp-pet-name',r),v=i?i.value.toUpperCase().replace(/[^A-Z]/g,'').slice(0,10):'';if(i&&i.value!==v)i.value=v;return v} function charmCap(r){return Math.max(0,10-cleanName(r).length)} function key(s,l){return s+'|'+l} function money(v){return '+$'+((Number(v)||0)/100).toFixed(2)} function category(t){t=String(t||'').toLowerCase();if(t.indexOf('heart')>-1)return'Heart';if(t.indexOf('cross')>-1)return'Cross';if(t.indexOf('gem')>-1||t.indexOf('diamond')>-1)return'Gem';if(t.indexOf('flower')>-1)return'Flower';if(t.indexOf('star')>-1)return'Star';return'Other'} function say(r,t,bad){var m=q('[data-sp-builder-message]',r)||q('[data-sp-layout-message]',r);if(m){m.textContent=t;m.className='sp-builder-message '+(bad?'is-error':'is-success')}} function loadImg(src,cb){if(!src)return cb(null);if(imgCache[src])return cb(imgCache[src]);var im=new Image();im.crossOrigin='anonymous';im.onload=function(){imgCache[src]=im;cb(im)};im.onerror=function(){cb(null)};im.src=src} function letterSrc(st,l,cb){var k=st+'|'+l;if(letterCache[k])return cb(letterCache[k]);loadImg(LETTER_IMG[st]||LETTER_IMG.Silver,function(im){if(!im)return cb('');try{var boxes=LETTER_BOX[st]||LETTER_BOX.Silver,box=boxes[l]||LETTER_BOX.Silver[l]||LETTER_BOX.Silver.A,w=im.naturalWidth||im.width,h=im.naturalHeight||im.height,pad=st==='Silver 11mm'?26:24,sx=Math.max(0,box[0]-pad),sy=Math.max(0,box[1]-pad),ex=Math.min(w,box[2]+pad),ey=Math.min(h,box[3]+pad),sw=ex-sx,sh=ey-sy,c=document.createElement('canvas');c.width=104;c.height=122;var x=c.getContext('2d');x.clearRect(0,0,c.width,c.height);var scale=Math.min(90/sw,110/sh),dw=Math.max(1,sw*scale),dh=Math.max(1,sh*scale),dx=(c.width-dw)/2,dy=(c.height-dh)/2;x.imageSmoothingEnabled=true;x.imageSmoothingQuality='high';x.drawImage(im,sx,sy,sw,sh,dx,dy,dw,dh);var d=x.getImageData(0,0,c.width,c.height),a=d.data;for(var i=0;i232&&g>225&&b>212&&r-b>3&&g-b>-4)||(mx>246&&mx-mn208&&b>190)||(mx>232&&mx-mn-1)next[x]=p}})}S.layout=next;S.key=sig} function chip(p,withX){if(!p)return'';if(p.type==='charm')return''+(withX?'x':'')+'';return''+esc(p.letter)+''} function renderPreview(r){var S=state(r),p=q('[data-sp-preview-name]',r);if(!p)return;p.setAttribute('data-sp-hole-preview','');p.innerHTML=S.layout.map(function(it,i){if(!it)return'';if(it.type==='charm')return'';return''}).join('');S.layout.forEach(function(it,i){var slot=p.children[i];if(!slot||!it)return;if(it.type==='letter'){letterSrc(it.style,it.letter,function(src){if(slot.parentNode&&slot.dataset.letter===it.letter&&src)slot.innerHTML=''})}else if(it.type==='charm'){var img=q('img',slot);charmSrc(it.img,function(src){if(img&&src)img.src=src})}})} function renderCharms(r){var S=state(r),filter=S.filter||'All',list=S.allCharms.filter(function(c){return filter==='All'||c.category===filter}),grid=q('[data-sp-charm-grid]',r),feat=q('[data-sp-featured-charms]',r),count=q('[data-sp-charm-count]',r);if(count)count.textContent=list.length?list.length+' charms':'No charms';function btn(c,cls){var on=S.charms.some(function(x){return x.id===c.id});return''+esc(c.title.replace(/ Charm$/,''))+''+esc(c.priceText||money(c.price))+''}if(grid)grid.innerHTML=list.length?list.map(function(c){return btn(c,'sp-charm-card')}).join(''):'No charms in this category.';if(feat){feat.innerHTML='';feat.hidden=true}A('[data-sp-charm-tabs] button',r).forEach(function(b){var f=b.dataset.category?b.dataset.category.charAt(0).toUpperCase()+b.dataset.category.slice(1):b.textContent.trim();if(f==='All'||b.dataset.category==='all')f='All';b.classList.toggle('is-active',f===filter)})} function paint(r,force){var S=state(r);build(r,!!force);r.classList.toggle('sp-letter-black',style(r)==='Black');A('.sp-style-option',r).forEach(function(l){var input=q('input',l);l.classList.toggle('is-selected',!!input&&input.checked)});A('[data-c]',r).forEach(function(b){var on=S.charms.some(function(c){return c.id===String(b.dataset.c)});b.classList.toggle('is-picked',on);b.classList.toggle('is-selected',on);b.setAttribute('aria-pressed',on?'true':'false')});var th=q('[data-sp-selected-charm-thumb]',r),cn=q('[data-sp-selected-charm-name]',r),nt=q('[data-sp-selected-charm-note]',r);if(cn)cn.textContent=S.charms.length?S.charms.length+' charms selected':'No charm selected';if(nt)nt.textContent=S.charms.length?'Tap an item, then tap a hole to move it. Click x to delete.':'Optional finishing touch.';if(th)th.innerHTML=S.charms.length?S.charms.map(function(c){return'x'}).join(''):'-';A('.sp-hole',r).forEach(function(h,i){var p=S.layout[i];h.dataset.i=i;h.className='sp-hole '+(!p?'is-empty ':'')+(p&&S.sel===p.uid?'is-selected ':'');h.setAttribute('aria-label','Hole '+(i+1)+(p?': '+(p.type==='letter'?p.letter:p.title):''));h.innerHTML=p?chip(p,false)+''+(i+1)+'':''+(i+1)+''});var track=q('[data-sp-hole-track]',r);if(track&&A('.sp-hole',track).length!==10)track.innerHTML=Array(10).fill(0).map(function(_,i){return''+(i+1)+''}).join('');var tray=q('[data-sp-layout-tray]',r);if(tray)tray.innerHTML=S.layout.filter(Boolean).map(function(p){return''+chip(p,p.type==='charm')+''}).join('');var summary=q('[data-sp-layout-summary]',r);if(summary)summary.textContent=S.layout.some(Boolean)?'Tap an item below, then tap a hole to move it.':'Type a name or choose charms to start.';renderPreview(r);paintColor();} function toggleCharm(r,b){var S=state(r),c=cardFromButton(b),i=S.charms.findIndex(function(x){return x.id===c.id});if(i>-1)S.charms.splice(i,1);else{if(S.charms.length>=charmCap(r)){say(r,'Max '+charmCap(r)+' charms for this name.',true);return}S.charms.push(c)}S.sel=null;paint(r,false);renderCharms(r)} function removeItem(r,uid){var S=state(r);S.charms=S.charms.filter(function(c){return c.uid!==uid});S.layout=S.layout.map(function(p){return p&&p.uid===uid?null:p});S.sel=null;paint(r,false);renderCharms(r)} function moveTo(r,i){var S=state(r);if(!S.sel){if(S.layout[i])S.sel=S.layout[i].uid;paint(r,false);return}var j=S.layout.findIndex(function(p){return p&&p.uid===S.sel});if(j>-1){var t=S.layout[i];S.layout[i]=S.layout[j];S.layout[j]=t}S.sel=null;paint(r,false)} function variantId(){var x=document.querySelector('form[action*="/cart/add"] input[name="id"],product-form input[name="id"],input.product-variant-id');return(x&&x.value)||new URLSearchParams(location.search).get('variant')||''} function addSet(r){var S=state(r);if(!S.ready){say(r,'Please wait for options to load.',true);return}paint(r,false);var used=S.layout.filter(Boolean),bad=used.filter(function(p){return !p.variant}),id=variantId();if(!id){say(r,'Please choose collar size and colour first.',true);return}if(!used.length){say(r,'Please type a name or choose a charm first.',true);return}if(bad.length){say(r,'One selected letter or charm is unavailable.',true);return}var cnt={},props={'Pet name':cleanName(r)||'None','Letter style':style(r),'Collar layout':used.map(function(p,i){return(i+1)+': '+(p.type==='letter'?p.letter:p.title)}).join(', '),'Selected charms':S.charms.map(function(c){return c.title}).join(', ')||'None'},items=[{id:+id,quantity:1,properties:props}];used.forEach(function(p){cnt[p.variant]=(cnt[p.variant]||0)+1});Object.keys(cnt).forEach(function(k){items.push({id:+k,quantity:cnt[k]})});say(r,'Adding personalized set...');fetch('/cart/add.js',{method:'POST',headers:{'Content-Type':'application/json','Accept':'application/json'},body:JSON.stringify({items:items})}).then(function(x){if(!x.ok)throw 1;return x.json()}).then(function(){say(r,'Personalized set added to cart.')}).catch(function(){say(r,'Could not add everything. Please try again.',true)})} function pickColor(){var K=['white','yellow','black','magenta','pink','blue','purple','gold','orange','green'],inputs=A('input[type=radio]:checked,input:checked,select option:checked');for(var i=0;i-1)return v}var labels=A('label');for(var j=0;j-1)return K[k]}}}return'white'} function paintColor(){var r=root();if(!r)return;var c=STRAP[pickColor()]||STRAP.teal;A('.sp-preview-strap',r).forEach(function(el){el.style.setProperty('background','linear-gradient(180deg,'+c.l+' 0%,rgba(255,255,255,.16) 36%,rgba(0,0,0,.05) 100%),linear-gradient(90deg,'+c.e+' 0%,rgba(255,255,255,.18) 22%,rgba(255,255,255,.05) 52%,'+c.e+' 100%),'+c.b,'important');el.style.setProperty('border-color',c.bd,'important');el.style.setProperty('box-shadow','inset 0 1px 0 rgba(255,255,255,.55),inset 0 -3px 5px rgba(75,55,60,.10),0 8px 18px rgba(50,35,28,.10)','important')})} function loadData(r){var S=state(r);Promise.all([fetch('/products/collar-letter-add-on.js').then(function(x){return x.json()}),fetch('/products/collar-charm-add-on.js').then(function(x){return x.json()})]).then(function(data){data[0].variants.forEach(function(v){var parts=String(v.title||'').split(' '),l=parts.pop(),st=parts.join(' ');if(/^[A-Z]$/.test(l)&&v.available!==false)S.letters[key(st,l)]=v.id});S.allCharms=data[1].variants.filter(function(v){return v.available!==false&&v.featured_image&&v.featured_image.src}).map(function(v){return{id:String(v.id),uid:'C'+v.id,variant:String(v.id),title:v.title,img:v.featured_image.src,price:v.price||0,priceText:money(v.price),category:category(v.title),type:'charm'}});S.ready=true;renderCharms(r);paint(r,false)}).catch(function(){S.ready=true;say(r,'Charm photos could not load. Please refresh the page.',true);paint(r,false)})} function bind(r){if(r.dataset.spStableBound)return;r.dataset.spStableBound='1';r.addEventListener('click',function(e){var b=e.target&&e.target.closest&&e.target.closest('[data-sp-remove],[data-sp-builder-submit],[data-sp-charm-toggle],[data-sp-charm-clear],[data-sp-charm-tabs] button,[data-c],.sp-hole,[data-piece]');if(!b||!r.contains(b))return;if(b.dataset.spRemove){e.preventDefault();e.stopImmediatePropagation();removeItem(r,b.dataset.spRemove);return}if(b.matches('[data-sp-builder-submit]')){e.preventDefault();e.stopImmediatePropagation();addSet(r);return}if(b.matches('[data-sp-charm-toggle]')){var p=q('[data-sp-charm-panel]',r);if(p){p.hidden=!p.hidden;b.setAttribute('aria-expanded',String(!p.hidden))}return}if(b.matches('[data-sp-charm-clear]')){e.preventDefault();state(r).charms=[];state(r).sel=null;paint(r,false);renderCharms(r);return}if(b.closest('[data-sp-charm-tabs]')){e.preventDefault();var f=b.dataset.category?b.dataset.category.charAt(0).toUpperCase()+b.dataset.category.slice(1):b.textContent.trim();state(r).filter=(f==='All'||b.dataset.category==='all')?'All':f;renderCharms(r);return}if(b.dataset.c){e.preventDefault();e.stopImmediatePropagation();toggleCharm(r,b);return}if(b.classList.contains('sp-hole')){e.preventDefault();e.stopImmediatePropagation();moveTo(r,+b.dataset.i);return}if(b.dataset.piece){e.preventDefault();e.stopImmediatePropagation();state(r).sel=b.dataset.piece;paint(r,false);return}},true);r.addEventListener('input',function(e){if(e.target&&e.target.id==='sp-pet-name')paint(r,true)},true);r.addEventListener('change',function(){paint(r,true);paintColor()},true)} function placeBuilder(){var b=root(),cls='free'+'-collar'+'-customizer',old=q('.'+cls);if(old){old.classList.add('sp-native-personalizer-hidden');old.setAttribute('hidden','hidden');old.style.setProperty('display','none','important')}if(!b)return null;if(old&&old.parentNode&&b.parentNode!==old.parentNode){old.parentNode.insertBefore(b,old);b.setAttribute('data-sp-positioned','under-color')}else if(old&&old.parentNode&&old.previousSibling!==b){old.parentNode.insertBefore(b,old);b.setAttribute('data-sp-positioned','under-color')}else{var vp=q('variant-picker')||q('variant-radios')||q('[data-product-options]');if(vp&&vp.parentNode&&!vp.parentNode.contains(b)){vp.parentNode.insertBefore(b,vp.nextSibling);b.setAttribute('data-sp-positioned','under-color')}}return b} function boot(){var r=placeBuilder();if(!r)return;bind(r);var track=q('[data-sp-hole-track]',r);if(track&&A('.sp-hole',track).length!==10)track.innerHTML=Array(10).fill(0).map(function(_,i){return''+(i+1)+''}).join('');paint(r,true);if(!state(r).loading){state(r).loading=true;loadData(r)}} document.addEventListener('change',function(){setTimeout(paintColor,40);setTimeout(paintColor,220)},true); document.addEventListener('click',function(){setTimeout(paintColor,80)},true); if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',boot);else boot();setTimeout(boot,500);setTimeout(boot,1500); })();
More you might like
Related
Classic Leather Collar
Related
Classic Leather Collar
Related
Classic Leather Collar
Related