1<!doctype html> 2<html 3 4 lang="en" 5> 6 <head><link 7 rel="icon" 8 type="image/png" 9 href="//www.tnbl.co.uk/cdn/shop/files/TNBL_logo-cropped.svg?crop=center&height=32&v=1771858612&width=32" 10 > 11 12 <link 13 rel="expect" 14 href="#MainContent" 15 blocking="render" 16 id="view-transition-render-blocker" 17 > 18 19<meta charset="utf-8"> 20<meta 21 http-equiv="X-UA-Compatible" 22 content="IE=edge" 23> 24<meta 25 name="viewport" 26 content="width=device-width,initial-scale=1" 27> 28<meta 29 name="view-transition" 30 content="same-origin" 31> 32<meta 33 name="theme-color" 34 content="" 35> 36 37<meta 38 property="og:site_name" 39 content="TNBL UK" 40> 41 42
43<script type="application/ld+json"> 44{ 45 "@context": "https://schema.org", 46 "@type": "Organization", 47 "name": "TNBL UK Limited", 48 "alternateName": [ 49 "TNBL", 50 "The Nail and Beauty Link" 51 ], 52 "url": "https://www.tnbl.co.uk/", 53 "logo": "https://www.tnbl.co.uk/cdn/shop/files/logo.png", 54 "legalName": "TNBL UK Limited", 55 "foundingDate": "2008", 56 "description": "Your ultimate destination for professional nail and beauty supplies, serving nail salons, beauty salons, and independent nail technicians across the UK and Europe.", 57 "address": { 58 "@type": "PostalAddress", 59 "streetAddress": "50â62 Hockley Street, Jewellery Quarter", 60 "addressLocality": "Birmingham", 61 "postalCode": "B18 6BH", 62 "addressCountry": "GB" 63 }, 64 "contactPoint": { 65 "@type": "ContactPoint", 66 "telephone": "+44-121-523-5535", 67 "contactType": "customer service", 68 "email": "[email protected]", 69 "areaServed": ["GB", "EU"], 70 "availableLanguage": "English" 71 }, 72 "sameAs": [ 73 "https://www.facebook.com/tnbluk/", 74 "https://www.instagram.com/tnbl_uk/", 75 "https://www.youtube.com/@tnbluk487", 76 "https://www.tiktok.com/@tnbl_uk", 77 "https://www.trustpilot.com/review/www.tnbl.co.uk" 78 ] 79} 80</script>
80 81 82<meta 83 property="og:url" 84 content="https://www.tnbl.co.uk/" 85> 86<meta 87 property="og:title" 88 content="Nail & Beauty Superstore - Wide Range of Beauty Supplies" 89> 90<meta 91 property="og:type" 92 content="website" 93> 94<meta 95 property="og:description" 96 content="Europe's leading professional nail & beauty wholesale for trade professionals. Get All the Beauty Supplies You Need at TNBL - The Nail & Beauty Link." 97><meta 98 property="og:image" 99 content="http://www.tnbl.co.uk/cdn/shop/files/tnbl_black_logo_transparent.webp?v=1785145865" 100 > 101 <meta 102 property="og:image:secure_url" 103 content="https://www.tnbl.co.uk/cdn/shop/files/tnbl_black_logo_transparent.webp?v=1785145865" 104 > 105 <meta 106 property="og:image:width" 107 content="1200" 108 > 109 <meta 110 property="og:image:height" 111 content="628" 112 ><meta 113 name="twitter:card" 114 content="summary_large_image" 115> 116<meta 117 name="twitter:title" 118 content="Nail & Beauty Superstore - Wide Range of Beauty Supplies" 119> 120<meta 121 name="twitter:description" 122 content="Europe's leading professional nail & beauty wholesale for trade professionals. Get All the Beauty Supplies You Need at TNBL - The Nail & Beauty Link." 123> 124 125<title> 126 Nail & Beauty Superstore - Wide Range of Beauty Supplies 127 – TNBL UK</title> 128 129<link 130 rel="canonical" 131 href="https://www.tnbl.co.uk/" 132> 133 134 135 <meta 136 name="description" 137 content="Europe's leading professional nail & beauty wholesale for trade professionals. Get All the Beauty Supplies You Need at TNBL - The Nail & Beauty Link." 138 > 139 140 141<meta name="msvalidate.01" content="C2A4C6063837382A28F407FD20D338C5" /> 142<meta name="google-site-verification" content="4aJ5bni32DHffvQQ58B2XxCcMEhkg4AfYADuYXK3mDg" /> 143<meta name="msvalidate.01" content="82CEF137C6BAC1728A470BB1779ECFE0" /><link href="//www.tnbl.co.uk/cdn/shop/t/6/assets/overflow-list.css?v=101911674359793798601774530324" as="style" rel="preload"> 144<link href="//www.tnbl.co.uk/cdn/shop/t/6/assets/base.css?v=42362885590071652391774530327" rel="stylesheet" type="text/css" media="all" /> 145 146<link 147 rel="preload" 148 as="font" 149 href="//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_n4.cc3f184f0be0174773c72c5502453af88810902e.woff2" 150 type="font/woff2" 151 crossorigin 152 fetchpriority="low" 153 ><link 154 rel="preload" 155 as="font" 156 href="//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_n7.592b3435e0fff3f50b26d410c73ae7ec893f6910.woff2" 157 type="font/woff2" 158 crossorigin 159 fetchpriority="low" 160 ><link 161 rel="preload" 162 as="font" 163 href="//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_n6.41e9dda2e7301ca861c0ec25a53c1bdf16b6624d.woff2" 164 type="font/woff2" 165 crossorigin 166 fetchpriority="low" 167 >
168<script async crossorigin fetchpriority="high" src="/cdn/shopifycloud/importmap-polyfill/es-modules-shim.2.4.0.js"></script>
vendor: 1 bytes, line 168
168
169<script type="importmap"> 170 { 171 "imports": { 172 "@theme/overflow-list": "//www.tnbl.co.uk/cdn/shop/t/6/assets/overflow-list.js?v=46858356770684902511774530325", 173 "@theme/product-title": "//www.tnbl.co.uk/cdn/shop/t/6/assets/product-title-truncation.js?v=81744426891537421781774530329", 174 "@theme/component": "//www.tnbl.co.uk/cdn/shop/t/6/assets/component.js?v=184240237101443119871774530330", 175 "@theme/dialog": "//www.tnbl.co.uk/cdn/shop/t/6/assets/dialog.js?v=61774032287387761671774530324", 176 "@theme/events": "//www.tnbl.co.uk/cdn/shop/t/6/assets/events.js?v=147926035229139604561774530327", 177 "@theme/focus": "//www.tnbl.co.uk/cdn/shop/t/6/assets/focus.js?v=60436577539430446401774530330", 178 "@theme/morph": "//www.tnbl.co.uk/cdn/shop/t/6/assets/morph.js?v=35457747882330740861774530324", 179 "@theme/paginated-list": "//www.tnbl.co.uk/cdn/shop/t/6/assets/paginated-list.js?v=95298315036233333871774530326", 180 "@theme/performance": "//www.tnbl.co.uk/cdn/shop/t/6/assets/performance.js?v=171015751390534793081774530327", 181 "@theme/product-form": "//www.tnbl.co.uk/cdn/shop/t/6/assets/product-form.js?v=146907120448681380161774530325", 182 "@theme/recently-viewed-products": "//www.tnbl.co.uk/cdn/shop/t/6/assets/recently-viewed-products.js?v=26214479841066411761774530326", 183 "@theme/scrolling": "//www.tnbl.co.uk/cdn/shop/t/6/assets/scrolling.js?v=118005526288211533611774530328", 184 "@theme/section-renderer": "//www.tnbl.co.uk/cdn/shop/t/6/assets/section-renderer.js?v=117273408521114569061774530324", 185 "@theme/section-hydration": "//www.tnbl.co.uk/cdn/shop/t/6/assets/section-hydration.js?v=177651605160027701221774530330", 186 "@theme/utilities": "//www.tnbl.co.uk/cdn/shop/t/6/assets/utilities.js?v=74252600229394689081774530329", 187 "@theme/variant-picker": "//www.tnbl.co.uk/cdn/shop/t/6/assets/variant-picker.js?v=135960636952703356951774530329", 188 "@theme/media-gallery": "//www.tnbl.co.uk/cdn/shop/t/6/assets/media-gallery.js?v=111441960308641931071774530329", 189 "@theme/quick-add": "//www.tnbl.co.uk/cdn/shop/t/6/assets/quick-add.js?v=92813402004259032011774530324", 190 "@theme/paginated-list-aspect-ratio": "//www.tnbl.co.uk/cdn/shop/t/6/assets/paginated-list-aspect-ratio.js?v=25254270272143792451774530326", 191 "@theme/popover-polyfill": "//www.tnbl.co.uk/cdn/shop/t/6/assets/popover-polyfill.js?v=119029313658895111201774530328", 192 "@theme/component-quantity-selector": "//www.tnbl.co.uk/cdn/shop/t/6/assets/component-quantity-selector.js?v=67906657287482036641774530329", 193 "@theme/comparison-slider": "//www.tnbl.co.uk/cdn/shop/t/6/assets/comparison-slider.js?v=106705562947035711941774530327", 194 "@theme/sticky-add-to-cart": "//www.tnbl.co.uk/cdn/shop/t/6/assets/sticky-add-to-cart.js?v=139436074259139393941774530326", 195 "@theme/fly-to-cart": "//www.tnbl.co.uk/cdn/shop/t/6/assets/fly-to-cart.js?v=129971753673458693881774530329" 196 } 197 } 198</script>
198 199
200<script 201 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/view-transitions.js?v=7106414069516106341774530324" 202 async 203 204 blocking="render" 205 206></script>
206 207
208<script> 209 window.dataLayer = window.dataLayer || []; 210 function gtag(){dataLayer.push(arguments);} 211 212 //Initialize GTM tag
vendor: 339 bytes, lines 212-217
212 213 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 214 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 215 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 216 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 217 })(window,document,'script','dataLayer', '
217GTM-M5JH7L5
vendor: 4 bytes, line 217
217');
218</script>
218 219 220 221<link 222 rel="modulepreload" 223 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/utilities.js?v=74252600229394689081774530329" 224 fetchpriority="low" 225> 226<link 227 rel="modulepreload" 228 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/component.js?v=184240237101443119871774530330" 229 fetchpriority="low" 230> 231<link 232 rel="modulepreload" 233 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/section-renderer.js?v=117273408521114569061774530324" 234 fetchpriority="low" 235> 236<link 237 rel="modulepreload" 238 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/section-hydration.js?v=177651605160027701221774530330" 239 fetchpriority="low" 240> 241<link 242 rel="modulepreload" 243 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/morph.js?v=35457747882330740861774530324" 244 fetchpriority="low" 245> 246 247 248 249<link 250 rel="modulepreload" 251 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/focus.js?v=60436577539430446401774530330" 252 fetchpriority="low" 253> 254<link 255 rel="modulepreload" 256 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/recently-viewed-products.js?v=26214479841066411761774530326" 257 fetchpriority="low" 258> 259<link 260 rel="modulepreload" 261 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/scrolling.js?v=118005526288211533611774530328" 262 fetchpriority="low" 263> 264<link 265 rel="modulepreload" 266 href="//www.tnbl.co.uk/cdn/shop/t/6/assets/events.js?v=147926035229139604561774530327" 267 fetchpriority="low" 268>
269<script 270 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/popover-polyfill.js?v=119029313658895111201774530328" 271 type="module" 272 fetchpriority="low" 273></script>
vendor: 1 bytes, line 273
273
274<script 275 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/overflow-list.js?v=46858356770684902511774530325" 276 type="module" 277 fetchpriority="low" 278></script>
vendor: 1 bytes, line 278
278
279<script 280 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/quick-add.js?v=92813402004259032011774530324" 281 type="module" 282 fetchpriority="low" 283></script>
283 284 285
285<script 286 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/cart-discount.js?v=107077853990124422021774530330" 287 type="module" 288 fetchpriority="low" 289 ></script>
289 290 291
292<script 293 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/dialog.js?v=61774032287387761671774530324" 294 type="module" 295 fetchpriority="low" 296></script>
vendor: 1 bytes, line 296
296
297<script 298 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/variant-picker.js?v=135960636952703356951774530329" 299 type="module" 300 fetchpriority="low" 301></script>
vendor: 1 bytes, line 301
301
302<script 303 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/product-card.js?v=124402285637860180781774530324" 304 type="module" 305 fetchpriority="low" 306></script>
vendor: 1 bytes, line 306
306
307<script 308 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/product-form.js?v=146907120448681380161774530325" 309 type="module" 310 fetchpriority="low" 311></script>
vendor: 1 bytes, line 311
311
312<script 313 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/fly-to-cart.js?v=129971753673458693881774530329" 314 type="module" 315 fetchpriority="low" 316></script>
vendor: 1 bytes, line 316
316
317<script 318 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/accordion-custom.js?v=99000499017714805851774530323" 319 type="module" 320 fetchpriority="low" 321></script>
vendor: 1 bytes, line 321
321
322<script 323 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/disclosure-custom.js?v=168050880623268140331774530325" 324 type="module" 325 fetchpriority="low" 326></script>
vendor: 1 bytes, line 326
326
327<script 328 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/media.js?v=37825095869491791421774530330" 329 type="module" 330 fetchpriority="low" 331></script>
vendor: 1 bytes, line 331
331
332<script 333 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/product-price.js?v=117989390664188536191774530327" 334 type="module" 335 fetchpriority="low" 336></script>
vendor: 1 bytes, line 336
336
337<script 338 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/product-sku.js?v=121804655373531320511774530328" 339 type="module" 340 fetchpriority="low" 341></script>
vendor: 1 bytes, line 341
341
342<script 343 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/product-title-truncation.js?v=81744426891537421781774530329" 344 type="module" 345 fetchpriority="low" 346></script>
vendor: 1 bytes, line 346
346
347<script 348 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/product-inventory.js?v=16343734458933704981774530326" 349 type="module" 350 fetchpriority="low" 351></script>
vendor: 1 bytes, line 351
351
352<script 353 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/show-more.js?v=94563802205717136101774530324" 354 type="module" 355 fetchpriority="low" 356></script>
vendor: 1 bytes, line 356
356
357<script 358 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/slideshow.js?v=697393657165964831774530325" 359 type="module" 360 fetchpriority="low" 361></script>
vendor: 1 bytes, line 361
361
362<script 363 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/layered-slideshow.js?v=30135417790894624731774530326" 364 type="module" 365 fetchpriority="low" 366></script>
vendor: 1 bytes, line 366
366
367<script 368 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/anchored-popover.js?v=95953304814728754461774530325" 369 type="module" 370 fetchpriority="low" 371></script>
vendor: 1 bytes, line 371
371
372<script 373 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/floating-panel.js?v=128677600744947036551774530328" 374 type="module" 375 fetchpriority="low" 376></script>
vendor: 1 bytes, line 376
376
377<script 378 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/video-background.js?v=25237992823806706551774530330" 379 type="module" 380 fetchpriority="low" 381></script>
vendor: 1 bytes, line 381
381
382<script 383 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/component-quantity-selector.js?v=67906657287482036641774530329" 384 type="module" 385 fetchpriority="low" 386></script>
vendor: 1 bytes, line 386
386
387<script 388 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/media-gallery.js?v=111441960308641931071774530329" 389 type="module" 390 fetchpriority="low" 391></script>
vendor: 1 bytes, line 391
391
392<script 393 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/rte-formatter.js?v=101420294193111439321774530328" 394 type="module" 395 fetchpriority="low" 396></script>
vendor: 1 bytes, line 396
396
397<script 398 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/volume-pricing.js?v=15442793518842484731774530325" 399 type="module" 400 fetchpriority="low" 401></script>
vendor: 1 bytes, line 401
401
402<script 403 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/price-per-item.js?v=144512917617120124431774530329" 404 type="module" 405 fetchpriority="low" 406></script>
vendor: 1 bytes, line 406
406
407<script 408 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/volume-pricing-info.js?v=94479640769665442661774530325" 409 type="module" 410 fetchpriority="low" 411></script>
411 412 413 414
414<script 415 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/localization.js?v=15585934801240115691774530328" 416 type="module" 417 fetchpriority="low" 418 ></script>
418 419 420 421 422 423 424
424<script 425 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/product-card-link.js?v=97122579314620396511774530330" 426 type="module" 427 fetchpriority="low" 428 ></script>
428 429 430
431<script 432 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/auto-close-details.js?v=58350291535404441581774530326" 433 defer="defer" 434></script>
434 435
436<script> 437 const Theme = { 438 translations: { 439 placeholder_image: `Placeholder image`, 440 added: `Added`, 441 recipient_form_fields_visible: `Recipient form fields are now visible`, 442 recipient_form_fields_hidden: `Recipient form fields are now hidden`, 443 recipient_form_error: `There was an error with the form submission`, 444 items_added_to_cart_one: `1 item added to cart`, 445 items_added_to_cart_other: `{{ count }} items added to cart`, 446 cart_error_quantity_too_high: `The quantity you entered is too high. Please enter a smaller amount.`, 447 }, 448 routes: { 449 cart_add_url: '/cart/add.js', 450 cart_change_url: '/cart/change', 451 cart_update_url: '/cart/update', 452 cart_url: '/cart', 453 predictive_search_url: '/search/suggest', 454 search_url: '/search', 455 }, 456 template: { 457 name: 'index', 458 }, 459 }; 460</script>
460 461<style data-shopify> 462@font-face { 463 font-family: "Mona Sans"; 464 font-weight: 400; 465 font-style: normal; 466 font-display: swap; 467 src: url("//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_n4.cc3f184f0be0174773c72c5502453af88810902e.woff2") format("woff2"), 468 url("//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_n4.fa36f5da9700fad1da93752dd8c5592c2878aaec.woff") format("woff"); 469} 470@font-face { 471 font-family: "Mona Sans"; 472 font-weight: 700; 473 font-style: normal; 474 font-display: swap; 475 src: url("//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_n7.7a174deadcf23a8eb1f5b59b4449a81c215adf52.woff2") format("woff2"), 476 url("//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_n7.fa6a2ddc8ef9995151c1d6e9116360bce89c3e37.woff") format("woff"); 477} 478@font-face { 479 font-family: "Mona Sans"; 480 font-weight: 400; 481 font-style: italic; 482 font-display: swap; 483 src: url("//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_i4.8afe827b8e1249d54e8235898b9437caf25eb86d.woff2") format("woff2"), 484 url("//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_i4.f786ef97cfdb9bdf0574b567a4b4eb003f584167.woff") format("woff"); 485} 486@font-face { 487 font-family: "Mona Sans"; 488 font-weight: 700; 489 font-style: italic; 490 font-display: swap; 491 src: url("//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_i7.89aaf4e957e47c275eefdc2401ad05ae83998937.woff2") format("woff2"), 492 url("//www.tnbl.co.uk/cdn/fonts/mona_sans/monasans_i7.c3ddf121e9050e4a9b2cd9e66994f7aca1957aad.woff") format("woff"); 493} 494@font-face { 495 font-family: "Playfair Display"; 496 font-weight: 700; 497 font-style: normal; 498 font-display: swap; 499 src: url("//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_n7.592b3435e0fff3f50b26d410c73ae7ec893f6910.woff2") format("woff2"), 500 url("//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_n7.998b1417dec711058cce2abb61a0b8c59066498f.woff") format("woff"); 501} 502@font-face { 503 font-family: "Playfair Display"; 504 font-weight: 700; 505 font-style: italic; 506 font-display: swap; 507 src: url("//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_i7.ba833b400bcd9c858b439c75a4a7c6eddc4c7de0.woff2") format("woff2"), 508 url("//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_i7.4872c65919810cd2f622f4ba52cd2e9e595f11d5.woff") format("woff"); 509} 510@font-face { 511 font-family: "Playfair Display"; 512 font-weight: 600; 513 font-style: normal; 514 font-display: swap; 515 src: url("//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_n6.41e9dda2e7301ca861c0ec25a53c1bdf16b6624d.woff2") format("woff2"), 516 url("//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_n6.3fecbbfefcd2c3e39326078af5db97c0302e18b5.woff") format("woff"); 517} 518@font-face { 519 font-family: "Playfair Display"; 520 font-weight: 600; 521 font-style: italic; 522 font-display: swap; 523 src: url("//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_i6.e139889de066849bfa40e4922acb535e30fe59b4.woff2") format("woff2"), 524 url("//www.tnbl.co.uk/cdn/fonts/playfair_display/playfairdisplay_i6.241aa0a92d0a28d4bc4c79030f71570c08f31eeb.woff") format("woff"); 525} 526 527 528 :root { 529 /* Page Layout */ 530 --sidebar-width: 25rem; 531 --narrow-content-width: 36rem; 532 --normal-content-width: 42rem; 533 --wide-content-width: 46rem; 534 --narrow-page-width: 90rem; 535 --normal-page-width: 120rem; 536 --wide-page-width: 150rem; 537 538 /* Section Heights */ 539 --section-height-small: 15rem; 540 --section-height-medium: 25rem; 541 --section-height-large: 35rem; 542 543 @media screen and (min-width: 40em) { 544 --section-height-small: 40svh; 545 --section-height-medium: 55svh; 546 --section-height-large: 70svh; 547 } 548 549 @media screen and (min-width: 60em) { 550 --section-height-small: 50svh; 551 --section-height-medium: 65svh; 552 --section-height-large: 80svh; 553 } 554 555 /* Letter spacing */ 556 --letter-spacing-sm: 0.06em; 557 --letter-spacing-md: 0.13em; 558 559 /* Font families */ 560 --font-body--family: "Mona Sans", sans-serif; 561 --font-body--style: normal; 562 --font-body--weight: 400; 563 --font-subheading--family: "New York", Iowan Old Style, Apple Garamond, Baskerville, Times New Roman, Droid Serif, Times, Source Serif Pro, serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; 564 --font-subheading--style: normal; 565 --font-subheading--weight: 400; 566 --font-heading--family: "Playfair Display", serif; 567 --font-heading--style: normal; 568 --font-heading--weight: 700; 569 --font-accent--family: "Playfair Display", serif; 570 --font-accent--style: normal; 571 --font-accent--weight: 600; 572 573 /* Margin sizes */ 574 --font-h1--spacing: 0.25em; 575 --font-h2--spacing: 0.25em; 576 --font-h3--spacing: 0.25em; 577 --font-h4--spacing: 0.25em; 578 --font-h5--spacing: 0.25em; 579 --font-h6--spacing: 0.25em; 580 --font-paragraph--spacing: 0.5em; 581 582 /* Heading colors */ 583 --font-h1--color: var(--color-foreground-heading); 584 --font-h2--color: var(--color-foreground-heading); 585 --font-h3--color: var(--color-foreground-heading); 586 --font-h4--color: var(--color-foreground-heading); 587 --font-h5--color: var(--color-foreground-heading); 588 --font-h6--color: var(--color-foreground-heading); 589 590 /** Z-Index / Layering */ 591 --layer-section-background: -2; 592 --layer-lowest: -1; 593 --layer-base: 0; 594 --layer-flat: 1; 595 --layer-raised: 2; 596 --layer-heightened: 4; 597 --layer-sticky: 8; 598 --layer-window-overlay: 10; 599 --layer-header-menu: 12; 600 --layer-overlay: 16; 601 --layer-menu-drawer: 18; 602 --layer-temporary: 20; 603 604 /* Max-width / Measure */ 605 --max-width--body-normal: 32.5em; 606 --max-width--body-narrow: 22.75em; 607 608 --max-width--heading-normal: 32.5em; 609 --max-width--heading-narrow: 19.5em; 610 611 --max-width--display-normal: 13em; 612 --max-width--display-narrow: 9.75em; 613 --max-width--display-tight: 3.25em; 614 615 /* Letter-spacing / Tracking */ 616 --letter-spacing--display-tight: -0.03em; 617 --letter-spacing--display-normal: 0em; 618 --letter-spacing--display-loose: 0.03em; 619 620 --letter-spacing--heading-tight: -0.03em; 621 --letter-spacing--heading-normal: 0em; 622 --letter-spacing--heading-loose: 0.03em; 623 624 --letter-spacing--body-tight: -0.03em; 625 --letter-spacing--body-normal: 0em; 626 --letter-spacing--body-loose: 0.03em; 627 628 /* Line height / Leading */ 629 --line-height: 1; 630 631 --line-height--display-tight: 1; 632 --line-height--display-normal: 1.1; 633 --line-height--display-loose: 1.2; 634 635 --line-height--heading-tight: 1.15; 636 --line-height--heading-normal: 1.25; 637 --line-height--heading-loose: 1.35; 638 639 --line-height--body-tight: 1.2; 640 --line-height--body-normal: 1.4; 641 --line-height--body-loose: 1.6; 642 643 /* Typography presets */ 644 --font-size--paragraph: 0.875rem;--font-size--h1: clamp(3.0rem, 5.6vw, 3.5rem);--font-size--h2: clamp(2.25rem, 4.8vw, 3.0rem);--font-size--h3: 2.0rem;--font-size--h4: 1.25rem;--font-size--h5: 0.875rem;--font-size--h6: 0.875rem;--font-paragraph--weight: 400;--font-paragraph--letter-spacing: var(--letter-spacing--body-normal);--font-paragraph--size: var(--font-size--paragraph);--font-paragraph--family: var(--font-body--family);--font-paragraph--style: var(--font-body--style);--font-paragraph--case: ;--font-paragraph--line-height: var(--line-height--body-loose);--font-h1--weight: var(--font-heading--weight);--font-h1--letter-spacing: var(--letter-spacing--heading-normal);--font-h1--size: var(--font-size--h1);--font-h1--family: var(--font-heading--family);--font-h1--style: var(--font-heading--style);--font-h1--case: none;--font-h1--line-height: var(--line-height--display-tight);--font-h2--weight: var(--font-heading--weight);--font-h2--letter-spacing: var(--letter-spacing--heading-normal);--font-h2--size: var(--font-size--h2);--font-h2--family: var(--font-heading--family);--font-h2--style: var(--font-heading--style);--font-h2--case: none;--font-h2--line-height: var(--line-height--display-tight);--font-h3--weight: var(--font-heading--weight);--font-h3--letter-spacing: var(--letter-spacing--heading-normal);--font-h3--size: var(--font-size--h3);--font-h3--family: var(--font-heading--family);--font-h3--style: var(--font-heading--style);--font-h3--case: none;--font-h3--line-height: var(--line-height--display-normal);--font-h4--weight: var(--font-heading--weight);--font-h4--letter-spacing: var(--letter-spacing--heading-normal);--font-h4--size: var(--font-size--h4);--font-h4--family: var(--font-heading--family);--font-h4--style: var(--font-heading--style);--font-h4--case: none;--font-h4--line-height: var(--line-height--display-tight);--font-h5--weight: var(--font-subheading--weight);--font-h5--letter-spacing: var(--letter-spacing--heading-normal);--font-h5--size: var(--font-size--h5);--font-h5--family: var(--font-subheading--family);--font-h5--style: var(--font-subheading--style);--font-h5--case: none;--font-h5--line-height: var(--line-height--display-loose);--font-h6--weight: var(--font-body--weight);--font-h6--letter-spacing: var(--letter-spacing--heading-normal);--font-h6--size: var(--font-size--h6);--font-h6--family: var(--font-body--family);--font-h6--style: var(--font-body--style);--font-h6--case: none;--font-h6--line-height: var(--line-height--display-loose); 645 646 /* Hardcoded font sizes */ 647 --font-size--3xs: 0.625rem; 648 --font-size--2xs: 0.75rem; 649 --font-size--xs: 0.8125rem; 650 --font-size--sm: 0.875rem; 651 --font-size--md: 1rem; 652 --font-size--lg: 1.125rem; 653 --font-size--xl: 1.25rem; 654 --font-size--2xl: 1.5rem; 655 --font-size--3xl: 2rem; 656 --font-size--4xl: 2.5rem; 657 --font-size--5xl: 3rem; 658 --font-size--6xl: 3.5rem; 659 660 /* Menu font sizes */ 661 --menu-font-sm--size: 0.875rem; 662 --menu-font-sm--line-height: calc(1.1 + 0.5 * min(16 / 14)); 663 --menu-font-md--size: 1rem; 664 --menu-font-md--line-height: calc(1.1 + 0.5 * min(16 / 16)); 665 --menu-font-lg--size: 1.125rem; 666 --menu-font-lg--line-height: calc(1.1 + 0.5 * min(16 / 18)); 667 --menu-font-xl--size: 1.25rem; 668 --menu-font-xl--line-height: calc(1.1 + 0.5 * min(16 / 20)); 669 --menu-font-2xl--size: 1.75rem; 670 --menu-font-2xl--line-height: calc(1.1 + 0.5 * min(16 / 28)); 671 672 /* Colors */ 673 --color-error: #8B0000; 674 --color-success: #006400; 675 --color-white: #FFFFFF; 676 --color-white-rgb: 255 255 255; 677 --color-black: #000000; 678 --color-instock: #3ED660; 679 --color-lowstock: #EE9441; 680 --color-outofstock: #C8C8C8; 681 682 /* Opacity */ 683 --opacity-5: 0.05; 684 --opacity-8: 0.08; 685 --opacity-10: 0.1; 686 --opacity-15: 0.15; 687 --opacity-20: 0.2;
688 --opacity-25: 0.25; 689 --opacity-30: 0.3; 690 --opacity-40: 0.4; 691 --opacity-50: 0.5; 692 --opacity-60: 0.6; 693 --opacity-70: 0.7; 694 --opacity-80: 0.8; 695 --opacity-85: 0.85; 696 --opacity-90: 0.9; 697 --opacity-subdued-text: var(--opacity-70); 698 699 --shadow-button: 0 2px 3px rgb(0 0 0 / 20%); 700 --gradient-image-overlay: linear-gradient(to top, rgb(0 0 0 / 0.5), transparent); 701 702 /* Spacing */ 703 --margin-3xs: 0.125rem; 704 --margin-2xs: 0.3rem; 705 --margin-xs: 0.5rem; 706 --margin-sm: 0.7rem; 707 --margin-md: 0.8rem; 708 --margin-lg: 1rem; 709 --margin-xl: 1.25rem; 710 --margin-2xl: 1.5rem; 711 --margin-3xl: 1.75rem; 712 --margin-4xl: 2rem; 713 --margin-5xl: 3rem; 714 --margin-6xl: 5rem; 715 716 --scroll-margin: 50px; 717 718 --padding-3xs: 0.125rem; 719 --padding-2xs: 0.25rem; 720 --padding-xs: 0.5rem; 721 --padding-sm: 0.7rem; 722 --padding-md: 0.8rem; 723 --padding-lg: 1rem; 724 --padding-xl: 1.25rem; 725 --padding-2xl: 1.5rem; 726 --padding-3xl: 1.75rem; 727 --padding-4xl: 2rem; 728 --padding-5xl: 3rem; 729 --padding-6xl: 4rem; 730 731 --gap-3xs: 0.125rem; 732 --gap-2xs: 0.3rem; 733 --gap-xs: 0.5rem; 734 --gap-sm: 0.7rem; 735 --gap-md: 0.9rem; 736 --gap-lg: 1rem; 737 --gap-xl: 1.25rem; 738 --gap-2xl: 2rem; 739 --gap-3xl: 3rem; 740 741 --spacing-scale-sm: 0.6; 742 --spacing-scale-md: 0.7; 743 --spacing-scale-default: 1.0; 744 745 /* Checkout buttons gap */ 746 --checkout-button-gap: 10px; 747 748 /* Borders */ 749 --style-border-width: 1px; 750 --style-border-radius-xs: 0.2rem; 751 --style-border-radius-sm: 0.6rem; 752 --style-border-radius-md: 0.8rem; 753 --style-border-radius-50: 50%; 754 --style-border-radius-lg: 1rem; 755 --style-border-radius-pills: 40px; 756 --style-border-radius-inputs: 12px; 757 --style-border-radius-buttons-primary: 100px; 758 --style-border-radius-buttons-secondary: 100px; 759 --style-border-width-primary: 2px; 760 --style-border-width-secondary: 2px; 761 --style-border-width-inputs: 1px; 762 --style-border-radius-popover: 14px; 763 --style-border-popover: 1px none rgb(var(--color-border-rgb) / 50%); 764 --style-border-drawer: 1px none rgb(var(--color-border-rgb) / 50%); 765 --style-border-swatch-opacity: 10%; 766 --style-border-swatch-width: 1px; 767 --style-border-swatch-style: solid; 768 769 /* Animation */ 770 --ease-out-cubic: cubic-bezier(0.33, 1, 0.68, 1); 771 --ease-out-quad: cubic-bezier(0.32, 0.72, 0, 1); 772 --animation-speed-fast: 0.0625s; 773 --animation-speed: 0.125s; 774 --animation-speed-slow: 0.2s; 775 --animation-speed-medium: 0.15s; 776 --animation-easing: ease-in-out; 777 --animation-slideshow-easing: cubic-bezier(0.4, 0, 0.2, 1); 778 --drawer-animation-speed: 0.2s; 779 --animation-values-slow: var(--animation-speed-slow) var(--animation-easing); 780 --animation-values: var(--animation-speed) var(--animation-easing); 781 --animation-values-fast: var(--animation-speed-fast) var(--animation-easing); 782 --animation-values-allow-discrete: var(--animation-speed) var(--animation-easing) allow-discrete; 783 --animation-timing-hover: cubic-bezier(0.25, 0.46, 0.45, 0.94); 784 --animation-timing-active: cubic-bezier(0.5, 0, 0.75, 0); 785 --animation-timing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); 786 --animation-timing-default: cubic-bezier(0, 0, 0.2, 1); 787 --animation-timing-fade-in: cubic-bezier(0.16, 1, 0.3, 1); 788 --animation-timing-fade-out: cubic-bezier(0.4, 0, 0.2, 1); 789 790 /* View transitions */ 791 /* View transition old */ 792 --view-transition-old-main-content: var(--animation-speed) var(--animation-easing) both fadeOut; 793 794 /* View transition new */ 795 --view-transition-new-main-content: var(--animation-speed) var(--animation-easing) both fadeIn, var(--animation-speed) var(--animation-easing) both slideInTopViewTransition; 796 797 /* Focus */ 798 --focus-outline-width: 0.09375rem; 799 --focus-outline-offset: 0.2em; 800 801 /* Badges */ 802 --badge-blob-padding-block: 1px; 803 --badge-blob-padding-inline: 12px 8px; 804 --badge-rectangle-padding-block: 1px; 805 --badge-rectangle-padding-inline: 6px; 806 @media screen and (min-width: 750px) { 807 --badge-blob-padding-block: 4px; 808 --badge-blob-padding-inline: 16px 12px; 809 --badge-rectangle-padding-block: 4px; 810 --badge-rectangle-padding-inline: 10px; 811 } 812 813 /* Icons */ 814 --icon-size-2xs: 0.6rem; 815 --icon-size-xs: 0.85rem; 816 --icon-size-sm: 1.25rem; 817 --icon-size-md: 1.375rem; 818 --icon-size-lg: 1.5rem; 819 --icon-stroke-width: 1.5px; 820 821 /* Input */ 822 --input-email-min-width: 200px; 823 --input-search-max-width: 650px; 824 --input-padding-y: 0.8rem; 825 --input-padding-x: 0.8rem; 826 --input-padding: var(--input-padding-y) var(--input-padding-x); 827 --input-box-shadow-width: var(--style-border-width-inputs); 828 --input-box-shadow: 0 0 0 var(--input-box-shadow-width) var(--color-input-border); 829 --input-box-shadow-focus: 0 0 0 calc(var(--input-box-shadow-width) + 0.5px) var(--color-input-border); 830 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 831 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5)); 832 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50));
833 --input-textarea-min-height: 55px; 834 835 /* Button size */ 836 --button-size-sm: 30px; 837 --button-size-md: 36px; 838 --button-size: var(--minimum-touch-target); 839 --button-padding-inline: 24px; 840 --button-padding-block: 16px; 841 842 /* Button font-family */ 843 --button-font-family-primary: var(--font-body--family); 844 --button-font-family-secondary: var(--font-body--family); 845 846 /* Button text case */ 847 --button-text-case: ; 848 --button-text-case-primary: default; 849 --button-text-case-secondary: default; 850 851 /* Borders */ 852 --border-color: rgb(var(--color-border-rgb) / var(--opacity-50)); 853 --border-width-sm: 1px; 854 --border-width-md: 2px; 855 --border-width-lg: 5px; 856 --border-radius-sm: 0.25rem; 857 858 /* Drawers */ 859 --drawer-inline-padding: 25px; 860 --drawer-menu-inline-padding: 2.5rem; 861 --drawer-header-block-padding: 20px; 862 --drawer-content-block-padding: 10px; 863 --drawer-header-desktop-top: 0rem; 864 --drawer-padding: calc(var(--padding-sm) + 7px); 865 --drawer-height: 100dvh; 866 --drawer-width: 95vw; 867 --drawer-max-width: 500px; 868 869 /* Variant Picker Swatches */ 870 --variant-picker-swatch-width-unitless: 34; 871 --variant-picker-swatch-height-unitless: 34; 872 --variant-picker-swatch-width: 34px; 873 --variant-picker-swatch-height: 34px; 874 --variant-picker-swatch-radius: 32px; 875 --variant-picker-border-width: 1px; 876 --variant-picker-border-style: solid; 877 --variant-picker-border-opacity: 10%; 878 879 /* Variant Picker Buttons */ 880 --variant-picker-button-radius: 14px; 881 --variant-picker-button-border-width: 1px; 882 883 /* Slideshow */ 884 --slideshow-controls-size: 3.5rem; 885 --slideshow-controls-icon: 2rem; 886 --peek-next-slide-size: 3rem; 887 888 /* Utilities */ 889 --backdrop-opacity: 0.15; 890 --backdrop-color-rgb: var(--color-shadow-rgb); 891 --minimum-touch-target: 44px; 892 --disabled-opacity: 0.5; 893 --skeleton-opacity: 0.025; 894 895 /* Shapes */ 896 --shape--circle: circle(50% at center); 897 --shape--sunburst: polygon(100% 50%,94.62% 55.87%,98.3% 62.94%,91.57% 67.22%,93.3% 75%,85.7% 77.39%,85.36% 85.36%,77.39% 85.7%,75% 93.3%,67.22% 91.57%,62.94% 98.3%,55.87% 94.62%,50% 100%,44.13% 94.62%,37.06% 98.3%,32.78% 91.57%,25% 93.3%,22.61% 85.7%,14.64% 85.36%,14.3% 77.39%,6.7% 75%,8.43% 67.22%,1.7% 62.94%,5.38% 55.87%,0% 50%,5.38% 44.13%,1.7% 37.06%,8.43% 32.78%,6.7% 25%,14.3% 22.61%,14.64% 14.64%,22.61% 14.3%,25% 6.7%,32.78% 8.43%,37.06% 1.7%,44.13% 5.38%,50% 0%,55.87% 5.38%,62.94% 1.7%,67.22% 8.43%,75% 6.7%,77.39% 14.3%,85.36% 14.64%,85.7% 22.61%,93.3% 25%,91.57% 32.78%,98.3% 37.06%,94.62% 44.13%); 898 --shape--diamond: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); 899 --shape--blob: polygon(85.349% 11.712%, 87.382% 13.587%, 89.228% 15.647%, 90.886% 17.862%, 92.359% 20.204%, 93.657% 22.647%, 94.795% 25.169%, 95.786% 27.752%, 96.645% 30.382%, 97.387% 33.048%, 98.025% 35.740%, 98.564% 38.454%, 99.007% 41.186%, 99.358% 43.931%, 99.622% 46.685%, 99.808% 49.446%, 99.926% 52.210%, 99.986% 54.977%, 99.999% 57.744%, 99.975% 60.511%, 99.923% 63.278%, 99.821% 66.043%, 99.671% 68.806%, 99.453% 71.565%, 99.145% 74.314%, 98.724% 77.049%, 98.164% 79.759%, 97.433% 82.427%, 96.495% 85.030%, 95.311% 87.529%, 93.841% 89.872%, 92.062% 91.988%, 89.972% 93.796%, 87.635% 95.273%, 85.135% 96.456%, 82.532% 97.393%, 79.864% 98.127%, 77.156% 98.695%, 74.424% 99.129%, 71.676% 99.452%, 68.918% 99.685%, 66.156% 99.844%, 63.390% 99.942%, 60.624% 99.990%, 57.856% 99.999%, 55.089% 99.978%, 52.323% 99.929%, 49.557% 99.847%, 46.792% 99.723%, 44.031% 99.549%, 41.273% 99.317%, 38.522% 99.017%, 35.781% 98.639%, 33.054% 98.170%, 30.347% 97.599%, 27.667% 96.911%, 25.024% 96.091%, 22.432% 95.123%, 19.907% 93.994%, 17.466% 92.690%, 15.126% 91.216%, 12.902% 89.569%, 10.808% 87.761%, 8.854% 85.803%, 7.053% 83.703%, 5.418% 81.471%, 3.962% 79.119%, 2.702% 76.656%, 1.656% 74.095%, 0.846% 71.450%, 0.294% 68.740%, 0.024% 65.987%, 0.050% 63.221%, 0.343% 60.471%, 0.858% 57.752%, 1.548% 55.073%, 2.370% 52.431%, 3.283% 49.819%, 4.253% 47.227%, 5.249% 44.646%, 6.244% 42.063%, 7.211% 39.471%, 8.124% 36.858%, 8.958% 34.220%, 9.711% 31.558%, 10.409% 28.880%, 11.083% 26.196%, 11.760% 23.513%, 12.474% 20.839%, 13.259% 18.186%, 14.156% 15.569%, 15.214% 13.012%, 16.485% 10.556%, 18.028% 8.261%, 19.883
899% 6.211%, 22.041% 4.484%, 24.440% 3.110%, 26.998% 2.057%, 29.651% 1.275%, 32.360% 0.714%, 35.101% 0.337%, 37.859% 0.110%, 40.624% 0.009%, 43.391% 0.016%, 46.156% 0.113%, 48.918% 0.289%, 51.674% 0.533%, 54.425% 0.837%, 57.166% 1.215%, 59.898% 1.654%, 62.618% 2.163%, 65.322% 2.750%, 68.006% 3.424%, 70.662% 4.197%, 73.284% 5.081%, 75.860% 6.091%, 78.376% 7.242%, 80.813% 8.551%, 83.148% 10.036%, 85.349% 11.712%); 900 901 /* Buy buttons */ 902 --height-buy-buttons: calc(var(--padding-lg) * 2 + var(--icon-size-sm)); 903 904 /* Card image width and height variables */ 905 --card-width-small: 10rem; 906 907 --height-small: 10rem; 908 --height-medium: 11.5rem; 909 --height-large: 13rem; 910 --height-full: 100vh; 911 912 @media screen and (min-width: 750px) { 913 --height-small: 17.5rem; 914 --height-medium: 21.25rem; 915 --height-large: 25rem; 916 } 917 918 /* Modal */ 919 --modal-max-height: 65dvh; 920 921 /* Card styles for search */ 922 --card-bg-hover: rgb(var(--color-foreground-rgb) / var(--opacity-5)); 923 --card-border-hover: rgb(var(--color-foreground-rgb) / var(--opacity-30)); 924 --card-border-focus: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 925 926 /* Cart */ 927 --cart-primary-font-family: var(--font-body--family); 928 --cart-primary-font-style: var(--font-body--style); 929 --cart-primary-font-weight: var(--font-body--weight); 930 --cart-secondary-font-family: var(--font-secondary--family); 931 --cart-secondary-font-style: var(--font-secondary--style); 932 --cart-secondary-font-weight: var(--font-secondary--weight); 933 } 934</style> 935<style data-shopify> 936 937 938 :root, 939 940 941 942 .color-scheme-1 { 943 --color-background: rgb(255 255 255 / 1.0); 944 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 945 --color-background-rgb: 255 255 255; 946 --opacity-5-15: 0.05; 947 --opacity-10-25: 0.1; 948 --opacity-35-55: 0.35; 949 --opacity-40-60: 0.4; 950 --opacity-30-60: 0.3; 951 --color-foreground: rgb(17 17 17 / 1.0); 952 --color-foreground-rgb: 17 17 17; 953 --color-foreground-heading: rgb(17 17 17 / 1.0); 954 --color-foreground-heading-rgb: 17 17 17; 955 --color-primary: rgb(17 17 17 / 1.0); 956 --color-primary-rgb: 17 17 17; 957 --color-primary-hover: rgb(0 0 0 / 1.0); 958 --color-primary-hover-rgb: 0 0 0; 959 --color-border: rgb(217 217 217 / 1.0); 960 --color-border-rgb: 217 217 217; 961 --color-shadow: rgb(0 0 0 / 1.0); 962 --color-shadow-rgb: 0 0 0; 963 --color-primary-button-text: rgb(255 255 255 / 1.0); 964 --color-primary-button-background: rgb(172 150 105 / 1.0); 965 --color-primary-button-border: rgb(255 255 255 / 1.0); 966 --color-primary-button-hover-text: rgb(17 17 17 / 1.0); 967 --color-primary-button-hover-background: rgb(255 255 255 / 1.0); 968 --color-primary-button-hover-border: rgb(172 150 105 / 1.0); 969 --color-secondary-button-text: rgb(0 0 0 / 1.0); 970 --color-secondary-button-background: rgb(0 0 0 / 0.0); 971 --color-secondary-button-border: rgb(0 0 0 / 1.0); 972 --color-secondary-button-hover-text: rgb(51 51 51 / 1.0); 973 --color-secondary-button-hover-background: rgb(250 250 250 / 1.0); 974 --color-secondary-button-hover-border: rgb(51 51 51 / 1.0); 975 --color-input-background: rgb(255 255 255 / 0.78); 976 --color-input-text: rgb(51 51 51 / 1.0); 977 --color-input-text-rgb: 51 51 51; 978 --color-input-border: rgb(223 223 223 / 1.0); 979 --color-input-hover-background: rgb(0 0 0 / 0.01); 980 --color-variant-background: rgb(255 255 255 / 1.0); 981 --color-variant-border: rgb(0 0 0 / 0.13); 982 --color-variant-text: rgb(0 0 0 / 1.0); 983 --color-variant-text-rgb: 0 0 0; 984 --color-variant-hover-background: rgb(245 245 245 / 1.0); 985 --color-variant-hover-text: rgb(0 0 0 / 1.0); 986 --color-variant-hover-border: rgb(230 230 230 / 1.0); 987 --color-selected-variant-background: rgb(0 0 0 / 1.0); 988 --color-selected-variant-border: rgb(0 0 0 / 1.0); 989 --color-selected-variant-text: rgb(255 255 255 / 1.0); 990 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 991 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 992 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 993 994 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 995 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 996 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 997 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 998 --font-h1--color: var(--color-foreground-heading); 999 --font-h2--color: var(--color-foreground-heading); 1000 --font-h3--color: var(--color-foreground-heading); 1001 --font-h4--color: var(--color-foreground-heading); 1002 --font-h5--color: var(--color-foreground-heading); 1003 --font-h6--color: var(--color-foreground-heading); 1004 1005 /* Shadows */ 1006 1007 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1008 1009 1010 --shadow-blur: 20px; 1011 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1012 1013 } 1014 1015 1016 1017 1018 .color-scheme-2 {
1019 --color-background: rgb(255 240 230 / 1.0); 1020 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1021 --color-background-rgb: 255 240 230; 1022 --opacity-5-15: 0.05; 1023 --opacity-10-25: 0.1; 1024 --opacity-35-55: 0.35; 1025 --opacity-40-60: 0.4; 1026 --opacity-30-60: 0.3; 1027 --color-foreground: rgb(255 255 255 / 1.0); 1028 --color-foreground-rgb: 255 255 255; 1029 --color-foreground-heading: rgb(255 255 255 / 1.0); 1030 --color-foreground-heading-rgb: 255 255 255; 1031 --color-primary: rgb(0 0 0 / 0.81); 1032 --color-primary-rgb: 0 0 0; 1033 --color-primary-hover: rgb(255 255 255 / 1.0); 1034 --color-primary-hover-rgb: 255 255 255; 1035 --color-border: rgb(223 223 223 / 1.0); 1036 --color-border-rgb: 223 223 223; 1037 --color-shadow: rgb(0 0 0 / 1.0); 1038 --color-shadow-rgb: 0 0 0; 1039 --color-primary-button-text: rgb(255 255 255 / 1.0); 1040 --color-primary-button-background: rgb(0 0 0 / 1.0); 1041 --color-primary-button-border: rgb(0 0 0 / 1.0); 1042 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1043 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1044 --color-primary-button-hover-border: rgb(51 51 51 / 1.0); 1045 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1046 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1047 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1048 --color-secondary-button-hover-text: rgb(0 0 0 / 1.0); 1049 --color-secondary-button-hover-background: rgb(255 255 255 / 0.36); 1050 --color-secondary-button-hover-border: rgb(51 51 51 / 0.73); 1051 --color-input-background: rgb(0 0 0 / 0.0); 1052 --color-input-text: rgb(0 0 0 / 0.53); 1053 --color-input-text-rgb: 0 0 0; 1054 --color-input-border: rgb(0 0 0 / 0.13); 1055 --color-input-hover-background: rgb(255 255 255 / 0.36); 1056 --color-variant-background: rgb(255 255 255 / 1.0); 1057 --color-variant-border: rgb(230 230 230 / 1.0); 1058 --color-variant-text: rgb(0 0 0 / 1.0); 1059 --color-variant-text-rgb: 0 0 0; 1060 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1061 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1062 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1063 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1064 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1065 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1066 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1067 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1068 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1069 1070 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1071 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1072 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1073 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1074 --font-h1--color: var(--color-foreground-heading); 1075 --font-h2--color: var(--color-foreground-heading); 1076 --font-h3--color: var(--color-foreground-heading); 1077 --font-h4--color: var(--color-foreground-heading); 1078 --font-h5--color: var(--color-foreground-heading); 1079 --font-h6--color: var(--color-foreground-heading); 1080 1081 /* Shadows */ 1082 1083 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1084 1085 1086 --shadow-blur: 20px; 1087 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1088 1089 } 1090 1091 1092 1093 1094 .color-scheme-3 { 1095 --color-background: rgb(255 237 247 / 1.0); 1096 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1097 --color-background-rgb: 255 237 247; 1098 --opacity-5-15: 0.05; 1099 --opacity-10-25: 0.1; 1100 --opacity-35-55: 0.35; 1101 --opacity-40-60: 0.4; 1102 --opacity-30-60: 0.3; 1103 --color-foreground: rgb(17 17 17 / 1.0); 1104 --color-foreground-rgb: 17 17 17; 1105 --color-foreground-heading: rgb(17 17 17 / 1.0); 1106 --color-foreground-heading-rgb: 17 17 17; 1107 --color-primary: rgb(0 0 0 / 0.81); 1108 --color-primary-rgb: 0 0 0; 1109 --color-primary-hover: rgb(0 0 0 / 1.0); 1110 --color-primary-hover-rgb: 0 0 0; 1111 --color-border: rgb(17 17 17 / 1.0); 1112 --color-border-rgb: 17 17 17; 1113 --color-shadow: rgb(0 0 0 / 1.0); 1114 --color-shadow-rgb: 0 0 0; 1115 --color-primary-button-text: rgb(255 255 255 / 1.0); 1116 --color-primary-button-background: rgb(0 0 0 / 1.0); 1117 --color-primary-button-border: rgb(0 0 0 / 1.0); 1118 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1119 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1120 --color-primary-button-hover-border: rgb(51 51 51 / 1.0); 1121 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1122 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1123 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1124 --color-secondary-button-hover-text: rgb(0 0 0 / 0.81); 1125 --color-secondary-button-hover-background: rgb(255 255 255 / 0.36); 1126 --color-secondary-button-hover-border: rgb(0 0 0 / 0.81); 1127 --color-input-background: rgb(0 0 0 / 0.0); 1128 --color-input-text: rgb(0 0 0 / 0.81); 1129 --color-input-text-rgb: 0 0 0; 1130 --color-input-border: rgb(0 0 0 / 0.81); 1131 --color-input-hover-background: rgb(255 255 255 / 0.36); 1132 --color-variant-background: rgb(255 255 255 / 1.0); 1133 --color-variant-border: rgb(230 230 230 / 1.0); 1134 --color-variant-text: rgb(0 0 0 / 1.0); 1135 --color-variant-text-rgb: 0 0 0; 1136 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1137 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1138 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1139 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1140 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1141 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1142 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1143 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1144 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1145 1146 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1147 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1148 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1149 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1150 --font-h1--color: var(--color-foreground-heading); 1151 --font-h2--color: var(--color-foreground-heading); 1152 --font-h3--color: var(--color-foreground-heading); 1153 --font-h4--color: var(--color-foreground-heading); 1154 --font-h5--color: var(--color-foreground-heading); 1155 --font-h6--color: var(--color-foreground-heading); 1156 1157 /* Shadows */ 1158 1159 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1160 1161 1162 --shadow-blur: 20px; 1163 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1164 1165 } 1166 1167 1168 1169 1170 .color-scheme-4 { 1171 --color-background: rgb(255 255 255 / 1.0); 1172 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1173 --color-background-rgb: 255 255 255; 1174 --opacity-5-15: 0.05; 1175 --opacity-10-25: 0.1; 1176 --opacity-35-55: 0.35; 1177 --opacity-40-60: 0.4; 1178 --opacity-30-60: 0.3; 1179 --color-foreground: rgb(0 0 0 / 0.81); 1180 --color-foreground-rgb: 0 0 0; 1181 --color-foreground-heading: rgb(0 0 0 / 1.0); 1182 --color-foreground-heading-rgb: 0 0 0; 1183 --color-primary: rgb(0 0 0 / 0.81); 1184 --color-primary-rgb: 0 0 0; 1185 --color-primary-hover: rgb(0 0 0 / 1.0); 1186 --color-primary-hover-rgb: 0 0 0; 1187 --color-border: rgb(255 255 255 / 1.0); 1188 --color-border-rgb: 255 255 255; 1189 --color-shadow: rgb(0 0 0 / 1.0); 1190 --color-shadow-rgb: 0 0 0; 1191 --color-primary-button-text: rgb(255 255 255 / 1.0); 1192 --color-primary-button-background: rgb(0 0 0 / 1.0); 1193 --color-primary-button-border: rgb(29 54 134 / 1.0); 1194 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1195 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1196 --color-primary-button-hover-border: rgb(0 0 0 / 1.0); 1197 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1198 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1199 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1200 --color-secondary-button-hover-text: rgb(0 0 0 / 0.81); 1201 --color-secondary-button-hover-background: rgb(255 255 255 / 0.36); 1202 --color-secondary-button-hover-border: rgb(0 0 0 / 0.81); 1203 --color-input-background: rgb(0 0 0 / 0.0); 1204 --color-input-text: rgb(0 0 0 / 0.81); 1205 --color-input-text-rgb: 0 0 0; 1206 --color-input-border: rgb(0 0 0 / 0.81); 1207 --color-input-hover-background: rgb(255 255 255 / 0.36); 1208 --color-variant-background: rgb(255 255 255 / 1.0); 1209 --color-variant-border: rgb(230 230 230 / 1.0); 1210 --color-variant-text: rgb(0 0 0 / 1.0); 1211 --color-variant-text-rgb: 0 0 0; 1212 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1213 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1214 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1215 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1216 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1217 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1218 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1219 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1220 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1221 1222 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1223 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1224 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1225 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1226 --font-h1--color: var(--color-foreground-heading); 1227 --font-h2--color: var(--color-foreground-heading); 1228 --font-h3--color: var(--color-foreground-heading); 1229 --font-h4--color: var(--color-foreground-heading); 1230 --font-h5--color: var(--color-foreground-heading); 1231 --font-h6--color: var(--color-foreground-heading); 1232 1233 /* Shadows */ 1234 1235 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1236 1237 1238 --shadow-blur: 20px; 1239 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1240 1241 } 1242 1243 1244 1245 1246 .color-scheme-5 { 1247 --color-background: rgb(51 51 51 / 1.0); 1248 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1249 --color-background-rgb: 51 51 51; 1250 --opacity-5-15: 0.15; 1251 --opacity-10-25: 0.25; 1252 --opacity-35-55: 0.55; 1253 --opacity-40-60: 0.6; 1254 --opacity-30-60: 0.6; 1255 --color-foreground: rgb(255 255 255 / 1.0); 1256 --color-foreground-rgb: 255 255 255; 1257 --color-foreground-heading: rgb(255 255 255 / 1.0); 1258 --color-foreground-heading-rgb: 255 255 255; 1259 --color-primary: rgb(255 255 255 / 1.0); 1260 --color-primary-rgb: 255 255 255; 1261 --color-primary-hover: rgb(255 255 255 / 0.69); 1262 --color-primary-hover-rgb: 255 255 255; 1263 --color-border: rgb(255 255 255 / 0.69); 1264 --color-border-rgb: 255 255 255; 1265 --color-shadow: rgb(0 0 0 / 1.0); 1266 --color-shadow-rgb: 0 0 0; 1267 --color-primary-button-text: rgb(0 0 0 / 1.0); 1268 --color-primary-button-background: rgb(255 255 255 / 1.0); 1269 --color-primary-button-border: rgb(255 255 255 / 1.0); 1270 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1271 --color-primary-button-hover-background: rgb(0 0 0 / 1.0); 1272 --color-primary-button-hover-border: rgb(0 0 0 / 1.0); 1273 --color-secondary-button-text: rgb(255 255 255 / 1.0); 1274 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1275 --color-secondary-button-border: rgb(255 255 255 / 0.69); 1276 --color-secondary-button-hover-text: rgb(255 255 255 / 0.93); 1277 --color-secondary-button-hover-background: rgb(255 255 255 / 0.04); 1278 --color-secondary-button-hover-border: rgb(255 255 255 / 0.69); 1279 --color-input-background: rgb(51 51 51 / 1.0); 1280 --color-input-text: rgb(255 255 255 / 0.93); 1281 --color-input-text-rgb: 255 255 255; 1282 --color-input-border: rgb(255 255 255 / 0.69); 1283 --color-input-hover-background: rgb(255 255 255 / 0.04); 1284 --color-variant-background: rgb(255 255 255 / 1.0); 1285 --color-variant-border: rgb(230 230 230 / 1.0); 1286 --color-variant-text: rgb(0 0 0 / 1.0); 1287 --color-variant-text-rgb: 0 0 0; 1288 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1289 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1290 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1291 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1292 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1293 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1294 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1295 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1296 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1297 1298 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1299 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1300 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1301 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1302 --font-h1--color: var(--color-foreground-heading); 1303 --font-h2--color: var(--color-foreground-heading); 1304 --font-h3--color: var(--color-foreground-heading); 1305 --font-h4--color: var(--color-foreground-heading); 1306 --font-h5--color: var(--color-foreground-heading); 1307 --font-h6--color: var(--color-foreground-heading); 1308 1309 /* Shadows */ 1310 1311 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1312 1313 1314 --shadow-blur: 20px; 1315 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1316 1317 } 1318 1319 1320 1321 1322 .color-scheme-6 { 1323 --color-background: rgb(0 0 0 / 0.0); 1324 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1325 --color-background-rgb: 0 0 0; 1326 --opacity-5-15: 0.15; 1327 --opacity-10-25: 0.25; 1328 --opacity-35-55: 0.55; 1329 --opacity-40-60: 0.6; 1330 --opacity-30-60: 0.6; 1331 --color-foreground: rgb(255 255 255 / 1.0); 1332 --color-foreground-rgb: 255 255 255; 1333 --color-foreground-heading: rgb(255 255 255 / 1.0); 1334 --color-foreground-heading-rgb: 255 255 255; 1335 --color-primary: rgb(255 255 255 / 1.0); 1336 --color-primary-rgb: 255 255 255; 1337 --color-primary-hover: rgb(255 255 255 / 0.69); 1338 --color-primary-hover-rgb: 255 255 255; 1339 --color-border: rgb(230 230 230 / 1.0); 1340 --color-border-rgb: 230 230 230; 1341 --color-shadow: rgb(0 0 0 / 1.0); 1342 --color-shadow-rgb: 0 0 0; 1343 --color-primary-button-text: rgb(255 255 255 / 1.0); 1344 --color-primary-button-background: rgb(172 150 105 / 1.0); 1345 --color-primary-button-border: rgb(255 255 255 / 1.0); 1346 --color-primary-button-hover-text: rgb(17 17 17 / 1.0); 1347 --color-primary-button-hover-background: rgb(255 255 255 / 1.0); 1348 --color-primary-button-hover-border: rgb(172 150 105 / 1.0); 1349
1349 --color-secondary-button-text: rgb(255 255 255 / 1.0); 1350 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1351 --color-secondary-button-border: rgb(255 255 255 / 1.0); 1352 --color-secondary-button-hover-text: rgb(255 255 255 / 1.0); 1353 --color-secondary-button-hover-background: rgb(255 255 255 / 0.08); 1354 --color-secondary-button-hover-border: rgb(255 255 255 / 1.0); 1355 --color-input-background: rgb(255 255 255 / 1.0); 1356 --color-input-text: rgb(0 0 0 / 0.53); 1357 --color-input-text-rgb: 0 0 0; 1358 --color-input-border: rgb(0 0 0 / 0.13); 1359 --color-input-hover-background: rgb(250 250 250 / 1.0); 1360 --color-variant-background: rgb(255 255 255 / 1.0); 1361 --color-variant-border: rgb(230 230 230 / 1.0); 1362 --color-variant-text: rgb(0 0 0 / 1.0); 1363 --color-variant-text-rgb: 0 0 0; 1364 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1365 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1366 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1367 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1368 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1369 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1370 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1371 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1372 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1373 1374 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1375 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1376 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1377 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1378 --font-h1--color: var(--color-foreground-heading); 1379 --font-h2--color: var(--color-foreground-heading); 1380 --font-h3--color: var(--color-foreground-heading); 1381 --font-h4--color: var(--color-foreground-heading); 1382 --font-h5--color: var(--color-foreground-heading); 1383 --font-h6--color: var(--color-foreground-heading); 1384 1385 /* Shadows */ 1386 1387 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1388 1389 1390 --shadow-blur: 20px; 1391 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1392 1393 } 1394 1395 1396 1397 1398 .color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 { 1399 --color-background: rgb(172 150 105 / 1.0); 1400 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1401 --color-background-rgb: 172 150 105; 1402 --opacity-5-15: 0.05; 1403 --opacity-10-25: 0.1; 1404 --opacity-35-55: 0.35; 1405 --opacity-40-60: 0.4; 1406 --opacity-30-60: 0.3; 1407 --color-foreground: rgb(255 255 255 / 1.0); 1408 --color-foreground-rgb: 255 255 255; 1409 --color-foreground-heading: rgb(255 255 255 / 1.0); 1410 --color-foreground-heading-rgb: 255 255 255; 1411 --color-primary: rgb(255 255 255 / 1.0); 1412 --color-primary-rgb: 255 255 255; 1413 --color-primary-hover: rgb(0 0 0 / 0.53); 1414 --color-primary-hover-rgb: 0 0 0; 1415 --color-border: rgb(255 255 255 / 1.0); 1416 --color-border-rgb: 255 255 255; 1417 --color-shadow: rgb(0 0 0 / 1.0); 1418 --color-shadow-rgb: 0 0 0; 1419 --color-primary-button-text: rgb(255 255 255 / 1.0); 1420 --color-primary-button-background: rgb(0 0 0 / 1.0); 1421 --color-primary-button-border: rgb(172 150 105 / 1.0); 1422 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1423 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1424 --color-primary-button-hover-border: rgb(172 150 105 / 1.0); 1425 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1426 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1427 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1428 --color-secondary-button-hover-text: rgb(51 51 51 / 1.0); 1429 --color-secondary-button-hover-background: rgb(250 250 250 / 1.0); 1430 --color-secondary-button-hover-border: rgb(51 51 51 / 1.0); 1431 --color-input-background: rgb(255 255 255 / 1.0); 1432 --color-input-text: rgb(0 0 0 / 0.53); 1433 --color-input-text-rgb: 0 0 0; 1434 --color-input-border: rgb(0 0 0 / 0.13); 1435 --color-input-hover-background: rgb(250 250 250 / 1.0); 1436 --color-variant-background: rgb(255 255 255 / 1.0); 1437 --color-variant-border: rgb(230 230 230 / 1.0); 1438 --color-variant-text: rgb(0 0 0 / 1.0); 1439 --color-variant-text-rgb: 0 0 0; 1440 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1441 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1442 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1443 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1444 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1445 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1446 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1447 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1448 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1449 1450 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1451 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1452 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1453 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1454 --font-h1--color: var(--color-foreground-heading); 1455 --font-h2--color: var(--color-foreground-heading); 1456 --font-h3--color: var(--color-foreground-heading); 1457 --font-h4--color: var(--color-foreground-heading); 1458 --font-h5--color: var(--color-foreground-heading); 1459 --font-h6--color: var(--color-foreground-heading); 1460 1461 /* Shadows */ 1462 1463 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1464 1465 1466 --shadow-blur: 20px; 1467 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1468 1469 } 1470 1471 1472 body, .color-scheme-1, .color-scheme-2, .color-scheme-3, .color-scheme-4, .color-scheme-5, .color-scheme-6, .color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 { 1473 color: var(--color-foreground); 1474 background-color: var(--color-background); 1475 } 1476</style> 1477 1478 1479
1479<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
1479<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/98633711962/digital_wallets/dialog"> 1480<meta id="in-context-paypal-metadata" data-shop-id="98633711962" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="GBP"> 1481<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
1481<script async="async" src="/checkouts/internal/preloads.js?locale=en-GB&default_configuration_id=7864779098"></script>
vendor: 1 bytes, line 1481
1481
1482<script id="shopify-features" type="application/json">{"accessToken":"e2da49057becda449bb18eb413c8d844","betas":["rich-media-storefront-analytics"],"domain":"www.tnbl.co.uk","predictiveSearch":true,"shopId":98633711962,"locale":"en"}</script>
vendor: 1 bytes, line 1482
1482
1483<script>var Shopify = Shopify || {}; 1484Shopify.shop = "tnbl-uk.myshopify.com"; 1485Shopify.locale = "en"; 1486Shopify.currency = {"active":"GBP","rate":"1.0"}; 1487Shopify.country = "GB"; 1488Shopify.theme = {"name":"tnbl_shopify\/main","id":193010991450,"schema_name":"Horizon","schema_version":"3.2.1","theme_store_id":null,"role":"main"}; 1489Shopify.theme.handle = "null"; 1490Shopify.theme.style = {"id":null,"handle":null}; 1491Shopify.cdnHost = "www.tnbl.co.uk/cdn"; 1492Shopify.routes = Shopify.routes || {}; 1493Shopify.routes.root = "/"; 1494Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 1495Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 1496Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 1497Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 1497
1497
1498<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 1498
1498
1499<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 1499
1499
1500<script> 1501 window.Shopify = window.Shopify || {}; 1502 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 1503 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 1504 window.Shopify.SignInWithShop.eligible = true; 1505</script>
vendor: 1 bytes, line 1505
1505
1506<script id="shop-js-analytics" type="application/json">{"pageType":"index"}</script>
vendor: 1 bytes, line 1506
1506
1507<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 1507
1507
1508<script type="module"> 1509 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 1510 1511 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 1512 1513</script>
vendor: 1 bytes, line 1513
1513
1514<script> 1515 window.Shopify = window.Shopify || {}; 1516 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 1517 window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]}; 1518</script>
vendor: 1 bytes, line 1518
1518
1519<script>(function() { 1520 var isLoaded = false; 1521 function asyncLoad() { 1522 if (isLoaded) return; 1523 isLoaded = true; 1524 var urls = ["https:\/\/cdn.salesfire.co.uk\/code\/c7accaaa-a294-445b-957a-64072951e91d.js?shop=tnbl-uk.myshopify.com"]; 1525 for (var i = 0; i < urls.length; i++) { 1526 var s = document.createElement('script'); 1527 s.type = 'text/javascript'; 1528 s.async = true; 1529 s.src = urls[i]; 1530 var x = document.getElementsByTagName('script')[0]; 1531 x.parentNode.insertBefore(s, x); 1532 } 1533 }; 1534 if(window.attachEvent) { 1535 window.attachEvent('onload', asyncLoad); 1536 } else { 1537 window.addEventListener('load', asyncLoad, false); 1538 } 1539})();</script>
vendor: 1 bytes, line 1539
1539
1540<script id="__st">var __st={"a":98633711962,"offset":3600,"reqid":"cfc2cb5b-ea41-489e-8d0c-2823e7cb911e-1791516082","pageurl":"www.tnbl.co.uk\/","u":"79e7928dcf7c","p":"home"};</script>
vendor: 1 bytes, line 1540
1540
1541<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 1541
1541
1542<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 1542
1542
1543<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//www.tnbl.co.uk/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 1543
1543
1544<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//www.tnbl.co.uk/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
1544<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 1544
1544
1545<script> 1546 window.Shopify = window.Shopify || {}; 1547 window.Shopify.MCP = window.Shopify.MCP || {}; 1548 window.Shopify.MCP.enabled = true; 1549 window.Shopify.MCP.shop = "tnbl-uk.myshopify.com"; 1550 window.Shopify.MCP.mcpEndpoint = "https:\/\/www.tnbl.co.uk\/api\/mcp"; 1551 window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\nSet policy_types to also get the store's written policies (full text and URL).\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."},"policy_types":{"type":"array","items":{"type":"string","enum":["refund","shipping","privacy","terms_of_service","terms_of_sale","subscription","legal_notice","contact"]},"description":"Policy kinds to fetch, chosen from the user's question â e.g. [\"refund\"] for returns\/exchanges\/damaged items, [\"contact\"] for phone\/hours\/address. Include every kind the question touches. Omit it to get only FAQ answers."}},"required":["query"]}}]; 1552</script>
vendor: 1 bytes, line 1552
1552
1553<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/www.tnbl.co.uk\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 1554</script>
vendor: 1 bytes, line 1554
1554
1555<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://www.tnbl.co.uk/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 1556</script>
vendor: 1 bytes, line 1556
1556
1557<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 1558 function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent); 1559</script>
vendor: 1 bytes, line 1559
1559
1560<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}})); 1561</script>
vendor: 1 bytes, line 1561
1561
1562<script id='scb4127' type='text/javascript' async='' src='https://www.tnbl.co.uk/cdn/shopifycloud/privacy-banner/storefront-banner.js'></script>
1562<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://www.tnbl.co.uk/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 1563<style id="shopify-accelerated-checkout-cart"> 1564 #shopify-buyer-consent { 1565 margin-top: 1em; 1566 display: inline-block; 1567 width: 100%; 1568} 1569 1570#shopify-buyer-consent.hidden { 1571 display: none; 1572} 1573 1574#shopify-subscription-policy-button { 1575 background: none; 1576 border: none; 1577 padding: 0; 1578 text-decoration: underline; 1579 font-size: inherit; 1580 cursor: pointer; 1581} 1582 1583#shopify-subscription-policy-button::before { 1584 box-shadow: none; 1585} 1586 1587 </style> 1588<link rel="stylesheet" media="screen" href="//www.tnbl.co.uk/cdn/shop/t/6/compiled_assets/styles.css?v=87217545299018215091791216548">
1589<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
1589 1590 1591
1591<script> 1592 window.markerConfig = { 1593 project: '6989ca01a3e8b6cadc8533d4', 1594 source: 'snippet', 1595 }; 1596 1597 !(function (e, r, a) { 1598 if (!e.__Marker) { 1599 e.__Marker = {}; 1600 var t = [], 1601 n = { __cs: t }; 1602 [ 1603 'show', 1604 'hide', 1605 'isVisible', 1606 'capture', 1607 'cancelCapture', 1608 'unload', 1609 'reload', 1610 'isExtensionInstalled', 1611 'setReporter', 1612 'clearReporter', 1613 'setCustomData', 1614 'on', 1615 'off', 1616 ].forEach(function (e) { 1617 n[e] = function () { 1618 var r = Array.prototype.slice.call(arguments); 1619 r.unshift(e), t.push(r); 1620 }; 1621 }), 1622 (e.Marker = n); 1623 var s = r.createElement('script'); 1624 (s.async = 1), (s.src = 'https://edge.marker.io/latest/shim.js'); 1625 var i = r.getElementsByTagName('script')[0]; 1626 i.parentNode.insertBefore(s, i); 1627 } 1628 })(window, document); 1629 </script>
1629 1630 <!-- BEGIN app block: shopify://apps/salesfire-cro-tools/blocks/app-embed/67207dd3-43ec-4f5a-96a4-5ccceb0d9033 -->
1630<script src="https://cdn.salesfire.co.uk/code/shopify/98633711962.js" async></script>
1630 1631 1632 1633<!-- END app block --><!-- BEGIN app block: shopify://apps/countdown-sami/blocks/app-embed-block/4a43514a-3558-477f-914e-e834a137453e -->
1633<script type="text/javascript"> 1634 window.Samita = window.Samita || {}; 1635 Samita.Countdowns = Samita.Countdowns || {}; 1636 Samita.Countdowns.locale = {"shop_locale":{"locale":"en","enabled":true,"primary":true,"published":true}}; 1637 Samita.Countdowns.page = { 1638 title : document.title.replaceAll('"', "'"), 1639 href : window.location.href, 1640 type: "index" 1641 }; 1642 Samita.Countdowns.dataShop = {"configuration":{"money_format":"£{{amount}}"},"pricing":{"plan":"BETA","features":[]},"flags":{"watermark":true,"customize":true},"settings":{"notUseSearchFileApp":false,"collectFeedback":true,"countdownTimers":0,"countdownDeliveries":1,"salePopups":0},"url":"tnbl-uk.myshopify.com","api_url":"","app_url":"https://timer.samita.io","storefront_access_token":"bfaad0516a5a05a2006749cd46d0f4a8"}; 1643 Samita.Countdowns.theme_id = null; 1644 Samita.Countdowns.products = []; 1645 Samita.Countdowns.intervals = []; 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 if (typeof Shopify!= "undefined" && Shopify?.theme?.id == 190369366362) { 1666 Samita.Countdowns.themeInfo = {"id":190369366362,"name":"tnbl_shopify/dev_branch","role":"main","theme_store_id":null,"theme_name":"Horizon","theme_version":"3.2.1"} 1667 } 1668 1669 1670 1671 1672 1673 if (typeof Shopify!= "undefined" && Shopify?.theme?.id == 190369366362) { 1674 Samita.Countdowns.theme = {"selectors":{"product":{"elementSelectors":[".product-top",".Product",".product-detail",".product-page-container","#ProductSection-product-template","#shopify-section-product-template",".product:not(.featured-product,.slick-slide)",".product-main",".grid:not(.product-grid,.sf-grid,.featured-product)",".grid.product-single","#__pf",".gfqv-product-wrapper",".ga-product",".t4s-container",".gCartItem, .flexRow.noGutter, .cart__row, .line-item, .cart-item, .cart-row, .CartItem, .cart-line-item, .cart-table tbody tr, .container-indent table tbody tr"],"notShowCustomBlocks":".variant-swatch__item,.swatch-element,.fera-productReviews-review,share-button,.hdt-variant-picker,.col-story-block,.lightly-spaced-row","link":"[samitaPL-product-link], h3[data-href*=\"/products/\"], div[data-href*=\"/products/\"], a[data-href*=\"/products/\"], a.product-block__link[href*=\"/products/\"], a.indiv-product__link[href*=\"/products/\"], a.thumbnail__link[href*=\"/products/\"], a.product-item__link[href*=\"/products/\"], a.product-card__link[href*=\"/products/\"], a.product-card-link[href*=\"/products/\"], a.product-block__image__link[href*=\"/products/\"], a.stretched-link[href*=\"/products/\"], a.grid-product__link[href*=\"/products/\"], a.product-grid-item--link[href*=\"/products/\"], a.product-link[href*=\"/products/\"], a.product__link[href*=\"/products/\"], a.full-unstyled-link[href*=\"/products/\"], a.grid-item__link[href*=\"/products/\"], a.grid-product__link[href*=\"/products/\"], a[data-product-page-link][href*=\"/products/\"], a[href*=\"/products/\"]:not(.logo-bar__link,.ButtonGroup__Item.Button,.menu-promotion__link,.site-nav__link,.mobile-nav__link,.hero__sidebyside-image-link,.announcement-link,.breadcrumbs-list__link,.single-level-link,.d-none,.icon-twitter,.icon-facebook,.icon-pinterest,#btn,.list-menu__item.link.link--tex,.btnProductQuickview,.index-banner-slides-each,.global-banner-switch,.sub-nav-item-link,.announcement-bar__link,.Carousel__Cell,.Heading,.facebook,.twitter,.pinterest,.loyalty-redeem-product-title,.breadcrumbs__link,.btn-slide,.h2m-menu-item-inner--sub,.glink,.announcement-bar__link,.ts-link)","signal":"[data-product-handle], [data-product-id]","notSignal":":not([data-section-id=\"product-recommendations\"],[data-section-type=\"product-recommendations\"],#product-area,#looxReviews)","priceSelectors":[".product-option .cvc-money","#ProductPrice-product-template",".product-block--price",".price-list","#ProductPrice",".product-price",".product__priceâreg","#productPrice-product-template",".product__current-price",".product-thumb-caption-price-current",".product-item-caption-price-current",".grid-product__price,.product__price","span.price","span.product-price",".productitem--price",".product-pricing","div.price","span.money",".product-item__price",".product-list-item-price","p.price",".product-meta__prices","div.product-price","span#price",".price.money","h3.price","a.price",".price-area",".product-item-price",".pricearea",".collectionGrid .collectionBlock-info > p","#ComparePrice",".product--price-wrapper",".product-page--price-wrapper",".color--shop-accent.font-size--s.t--meta.f--main",".ComparePrice",".ProductPrice",".prodThumb .title span:last-child",".price",".product-single__price-product-template",".product-info-price",".price-money",".prod-price","#price-field",".product-grid--price",".prices,.pricing","#product-price",".money-styling",".compare-at-price",".product-item--price",".card__price",".product-card__price",".product-price__price",".product-item__price-wrapper",".product-single__price",".grid-product__price-wrap","a.grid-link p.grid-link__meta",".product__prices","#comparePrice-product-template","dl[class*=\"price\"]","div[class*=\"price\"]",".gl-card-pricing",".ga-product_price-container"],"titleSelectors":[".prod-title",".product-block--title",".product-info__title",".product-thumbnail__title",".product-card__title","div.product__title",".card__heading.h5",".cart-item__name.h4",".spf-product-card__title.h4",".gl-card-title",".ga-product_title"],"imageSelectors":["img.rimage__image",".grid_img",".imgWrapper > img",".gitem-img",".card__media img",".image__inner img",".snize-thumbnail",".zoomImg",".spf-product-card__image",".boost-pfs-filter-product-item-main-image",".pwzrswiper-slide > img",".product__image-wrapper img",".grid__image-ratio",".product__media img",".AspectRatio > img",".product__media img",".rimage-wrapper > img",".ProductItem__Image",".img-wrapper img",".aspect-ratio img",".product-card__image-wrapper > .product-card__image",".ga-products_image img",".image__container",".image-wrap .grid-product__image",".boost-sd__product-image img",".box-ratio > img",".image-cell img.card__image","img[src*=\"cdn.shopify.com\"][src*=\"/products/\"]","img[srcset*=\"cdn.shopify.com\"][srcset*=\"/products/\"]","img[data-srcset*=\"cdn.shopify.com\"][data-srcset*=\"/products/\"]","img[data-src*=\"cdn.shopify.com\"][data-src*=\"/products/\"]","img[data-srcset*=\"cdn.shopify.com\"][data-srcset*=\"/products/\"]","img[srcset*=\"cdn.shopify.com\"][src*=\"no-image\"]",".product-card__image > img",".product-image-main .image-wrap",".grid-product__image",".media > img","img[srcset*=\"cdn/shop/products/\"]","[data-bgset*=\"cdn.shopify.com\"][data-bgset*=\"/products/\"] > [data-bgset*=\"cdn.shopify.com\"][data-bgset*=\"/products/\"]","[data-bgset*=\"cdn.shopify.com\"][data-bgset*=\"/products/\"]","img[src*=\"cdn.shopify.com\"][src*=\"no-image\"]","img[src*=\"cdn/shop/products/\"]",".ga-product_image",".gfqv-product-image"],"media":".card__inner,.spf-product-card__inner","soldOutBadge":".tag.tag--rectangle, .grid-product__tag--sold-out","paymentButton":".shopify-payment-button, .product-form--smart-payment-buttons, .lh-wrap-buynow, .wx-checkout-btn","formSelectors":["product-form form.form","form.product-form","form.product_form",".main-product-form","form.t4s-form__product",".product-single__form",".shopify-product-form","#shopify-section-product-template form[action*=\"/cart/add\"]","form[action*=\"/cart/add\"]:not(.form-card)",".ga-products-table li.ga-product",".pf-product-form"],"variantActivator":".product__swatches [data-swatch-option], .swatch-view-item, variant-radios input, .swatch__container .swatch__option, .gf_swatches .gf_swatch, .product-form__controls-group-options select, ul.clickyboxes li, .pf-variant-select, ul.swatches-select li, .product-options__value, .form-check-swatch, button.btn.swatch select.product__variant, .pf-container a, button.variant.option, ul.js-product__variant--container li, .variant-input, .product-variant > ul > li ,.input--dropdown, .HorizontalList > li, .product-single__swatch__item, .globo-swatch-list ul.value > .select-option, .form-swatch-item, .selector-wrapper select, select.pf-input, ul.swatches-select > li.nt-swatch.swatch_pr_item, ul.gfqv-swatch-values > li, .lh-swatch-select, .swatch-image, .variant-image-swatch, #option-size, .selector-wrapper .replaced, .regular-select-content > .regular-select-item, .radios--input, ul.swatch-view > li > .swatch-selector ,.single-option-selector, .swatch-element input, [data-product-option], .single-option-selector__radio, [data-index^=\"option\"], .SizeSwatchList input, .swatch-panda input[type=radio], .swatch input, .swatch-element input[type=radio], select[id*=\"product-select-\"], select[id|=\"product-select-option\"], [id|=\"productSelect-product\"], [id|=\"ProductSelect-option\"],select[id|=\"product-variants-option\"],select[id|=\"sca-qv-product-selected-option\"],select[id*=\"product-variants-\"],select[id|=\"product-selectors-option\"],select[id|=\"variant-listbox-option\"],select[id|=\"id-option\"],select[id|=\"SingleOptionSelector\"], .variant-input-wrap input, [data-action=\"select-value\"]","variant":".variant-selection__variants, .product-variant-id, .product-form__variants, .ga-product_variant_select, select[name=\"id\"], input[name=\"id\"], .qview-variants > select, select[name=\"id[]\"]","variantIdByAttribute":"swatch-current-variant","quantity":".gInputElement, [name=\"qty\"], [name=\"quantity\"]","quantityWrapper":"#Quantity, input.quantity-selector.quantity-input, [data-quantity-input-wrapper], .product-form__quantity-selector, .product-form__item--quantity, .ProductForm__QuantitySelector, .quantity-product-template, .product-qty, .qty-selection, .product__quantity, .js-qty__num","productAddToCartBtnSelectors":[".samita-cu
1674stom-button-atc","#AddToCart",".product-form__cart-submit",".add-to-cart-btn",".product__add-to-cart-button","#AddToCart--product-template","#addToCart","#AddToCart-product-template","#AddToCart",".add_to_cart",".product-form--atc-button","#AddToCart-product",".AddtoCart","button.btn-addtocart",".product-submit","[name=\"add\"]","[type=\"submit\"]",".product-form__add-button",".product-form--add-to-cart",".btn--add-to-cart",".button-cart",".action-button > .add-to-cart","button.btn--tertiary.add-to-cart",".form-actions > button.button",".gf_add-to-cart",".zend_preorder_submit_btn",".gt_button",".wx-add-cart-btn",".previewer_add-to-cart_btn > button",".qview-btn-addtocart",".ProductForm__AddToCart",".button--addToCart","#AddToCartDesk","[data-pf-type=\"ProductATC\"]"],"customAddEl":{"productPageSameLevel":true,"collectionPageSameLevel":true,"cartPageSameLevel":false},"collection":{"positionBadgeImageWrapper":"","positionBadgeTitleWrapper":"","positionBadgePriceWrapper":"","notElClass":["cart-items","cart-item-list__body","product-list","samitaPL-card-list","cart-items-con","boost-pfs-search-suggestion-group","collection","pf-slide","boost-sd__cart-body","boost-sd__product-list","snize-search-results-content","productGrid","footer__links","header__links-list","cartitems--list","Cart__ItemList","minicart-list-prd","mini-cart-item","mini-cart__line-item-list","grid","products","ajax-cart__form","hero__link","collection__page-products","cc-filters-results","footer-sect","collection-grid","card-list","page-width","collection-template","mobile-nav__sublist","product-grid","site-nav__dropdown","search__results","product-recommendations","faq__wrapper","section-featured-product","announcement_wrapper","cart-summary-item-container","cart-drawer__line-items","product-quick-add","cart__items","rte","m-cart-drawer__items","scd__items"]},"quickView":{"activator":"a.quickview-icon.quickview, .qv-icon, .previewer-button, .sca-qv-button, .product-item__action-button[data-action=\"open-modal\"], .boost-pfs-quickview-btn, .collection-product[data-action=\"show-product\"], button.product-item__quick-shop-button, .product-item__quick-shop-button-wrapper, .open-quick-view, .product-item__action-button[data-action=\"open-modal\"], .tt-btn-quickview, .product-item-quick-shop .available, .quickshop-trigger, .productitem--action-trigger:not(.productitem--action-atc), .quick-product__btn, .thumbnail, .quick_shop, a.sca-qv-button, .overlay, .quick-view, .open-quick-view, [data-product-card-link], a[rel=\"quick-view\"], a.quick-buy, div.quickview-button > a, .block-inner a.more-info, .quick-shop-modal-trigger, a.quick-view-btn, a.spo-quick-view, div.quickView-button, a.product__label--quick-shop, span.trigger-quick-view, a.act-quickview-button, a.product-modal, [data-quickshop-full], [data-quickshop-slim], [data-quickshop-trigger]","productForm":".qv-form, .qview-form, .description-wrapper_content, .wx-product-wrapper, #sca-qv-add-item-form, .product-form, #boost-pfs-quickview-cart-form, .product.preview .shopify-product-form, .product-details__form, .gfqv-product-form, #ModalquickView form#modal_quick_view, .quick-shop-modal form[action*=\"/cart/add\"], #quick-shop-modal form[action*=\"/cart/add\"], .white-popup.quick-view form[action*=\"/cart/add\"], .quick-view form[action*=\"/cart/add\"], [id*=\"QuickShopModal-\"] form[action*=\"/cart/add\"], .quick-shop.active form[action*=\"/cart/add\"], .quick-view-panel form[action*=\"/cart/add\"], .content.product.preview form[action*=\"/cart/add\"], .quickView-wrap form[action*=\"/cart/add\"], .quick-modal form[action*=\"/cart/add\"], #colorbox form[action*=\"/cart/add\"], .product-quick-view form[action*=\"/cart/add\"], .quickform, .modal--quickshop-full, .modal--quickshop form[action*=\"/cart/add\"], .quick-shop-form, .fancybox-inner form[action*=\"/cart/add\"], #quick-view-modal form[action*=\"/cart/add\"], [data-product-modal] form[action*=\"/cart/add\"], .modal--quick-shop.modal--is-active form[action*=\"/cart/add\"]","appVariantActivator":".previewer_options","appVariantSelector":".full_info, [data-behavior=\"previewer_link\"]","appButtonClass":["sca-qv-cartbtn","qview-btn","btn--fill btn--regular"]}},"cart":{"form":["cart-items > .page-width","cart-items.page-width","[samitaWS-checkout-form]","cart-form",".ajax-cart__form-wrapper","#CartPage form[action*=\"/cart\"]",".cart-wrapper form[action*=\"/cart\"]",".main-content-inner form[action=\"/cart\"]",".main-content form[action=\"/cart\"]","[data-section-id=\"cart-template\"] form[action*=\"/cart\"]","cart-items form[action*=\"/cart\"]","form#updateform","form#cartForm","form[action*=\"/cart\"]#cartform",".page-content form[action*=\"/cart\"]","form[action*=\"/cart\"]:not([action*=\"/cart/add\"]):not([hidden])","#cart-notification-form"],"drawerForm":["[samitaWS-drawer-form]","#CartDrawer .drawer__inner","div#CartDrawer-Overlay .drawer__inner","#cart-notification-form"]}},"integrateApps":["globo.relatedproduct.loaded","globoFilterQuickviewRenderCompleted","globoFilterRenderSearchCompleted","globoFilterRenderCompleted","globoRelatedBuildWidgetCalback","cart:open","cartdrawer:opened","cart:build","cart:quantity.cart-cart-drawer","cart:updated","cart:close","collectionUpdate","theme:drawer:toggle","theme:drawer:close","theme:drawer:open","cart-update","addwishlistitem","transitionend"],"timeOut":1500} 1675 } 1676 1677 1678 1679 Samita.Countdowns.dataCountdowns = []; 1680 1681 1682 1683 1684 1685 1686 Samita.Countdowns.dataCountdowns[11486] = {"11486":{"id":11486,"type":"delivery","countdown_configs":{"timer":{"holidays":["2026-01-01"],"date_range":{"delivery":{"days":["mon","tue","wed","thu","fri"],"values":[2,5]},"dispatched":{"days":["mon","tue","wed","thu","fri"],"values":[0,1]}
1686,"cutoff_time":{"type":false,"custom":[{"hours":23,"minutes":59},{"hours":"11","minutes":59},{"hours":"11","minutes":59},{"hours":"11","minutes":59},{"hours":"11","minutes":59},{"hours":"11","minutes":59},{"hours":23,"minutes":59}],"default":{"hours":23,"minutes":59},"delivery":[{"day":"sun","cutoff":{"end_time":{"hours":23,"minutes":59},"start_time":{"hours":"0","minutes":"0"}}},{"day":"mon","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"0","minutes":"0"}}},{"day":"tue","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"0","minutes":"0"}}},{"day":"wed","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"0","minutes":"0"}}},{"day":"thu","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"0","minutes":"0"}}},{"day":"fri","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"0","minutes":"0"}}},{"day":"sat","cutoff":{"end_time":{"hours":23,"minutes":59},"start_time":{"hours":"0","minutes":"0"}}}],"dispatched":[{"day":"sun","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"9","minutes":"0"}}},{"day":"mon","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"9","minutes":"0"}}},{"day":"tue","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"9","minutes":"0"}}},{"day":"wed","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"9","minutes":"0"}}},{"day":"thu","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"9","minutes":"0"}}},{"day":"fri","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"9","minutes":"0"}}},{"day":"sat","cutoff":{"end_time":{"hours":"11","minutes":59},"start_time":{"hours":"9","minutes":"0"}}}]},"date_format":"MMM DD","time_format":"1"}},"design":{"layout":"mes_progress","content":{"items":[{"lang":"default","content":"\u003cp\u003eð Free Shipping to \u003cspan style=\"color: rgb(48, 141, 84);\"\u003e\u003cstrong\u003e{country_flag} {country_name}\u003c\/strong\u003e\u003c\/span\u003e \u003cbr\u003eâ
Order within the next \u003cstrong\u003e\u003cspan style=\"color: rgb(48, 141, 84);\"\u003e{cutoff_time}\u003c\/span\u003e\u003c\/strong\u003e for delivery between \u003cspan style=\"color: rgb(241, 196, 15);\"\u003eð¥ \u003c\/span\u003e\u003cspan style=\"color: rgb(241, 196, 15);\"\u003e\u003cspan style=\"color: rgb(0, 0, 0);\"\u003e\u003cstrong\u003e\u003cspan style=\"color: rgb(48, 141, 84);\"\u003e{delivered_min_date} - {delivered_max_date}\u003c\/span\u003e\u003c\/strong\u003e \u003c\/span\u003eð¥\u003c\/span\u003e\u003c\/p\u003e","duration":10,"property":{"text":"Delivery between"},"template":"default"},{"lang":"en","content":"\u003cp style=\"text-align: center;\"\u003eOrder within the next \u003cspan class=\"samita-cutoff-time\" style=\"color: rgb(0, 0, 0);\"\u003e\u003cstrong\u003e{cutoff_time}\u003c\/strong\u003e\u003c\/span\u003e and select Express Shipping at checkout for delivery between \u003cspan style=\"color: rgb(0, 0, 0);\"\u003e\u003cstrong\u003e{delivered_min_date} - {delivered_max_date}\u003c\/strong\u003e\u003c\/span\u003e\u003c\/p\u003e","duration":10,"property":{"text":"Delivery between","active":true},"template":"template4"},{"lang":"vi","content":"\u003cp\u003eð Free Shipping to \u003cspan style=\"color: rgb(48, 141, 84);\"\u003e\u003cstrong\u003e{country_flag} {country_name}\u003c\/strong\u003e\u003c\/span\u003e \u003cbr\u003eâ
Order within the next \u003cstrong\u003e\u003cspan style=\"color: rgb(48, 141, 84);\"\u003e{cutoff_time}\u003c\/span\u003e\u003c\/strong\u003e for delivery between \u003cspan style=\"color: rgb(241, 196, 15);\"\u003eð¥ \u003c\/span\u003e\u003cspan style=\"color: rgb(241, 196, 15);\"\u003e\u003cspan style=\"color: rgb(0, 0, 0);\"\u003e\u003cstrong\u003e\u003cspan style=\"color: rgb(48, 141, 84);\"\u003e{delivered_min_date} - {delivered_max_date}\u003c\/span\u003e\u003c\/strong\u003e \u003c\/span\u003eð¥\u003c\/span\u003e\u003c\/p\u003e","duration":10,"property":{"text":"Delivery between"}}]},"message":{"font":{"size":"14","values":[],"desSize":12,"iconSize":30,"titleSize":18,"customFont":false,"fontFamily":"Andika","fontVariant":"regular","customFontFamily":"Lato","customFontVariant":"400"}
1686,"size":{"value":"small","custom":{"width":"150","height":"150","setCaratWidth":"px","setCaratHeight":"px"}},"color":{"bgColor":{"a":1,"b":247,"g":237,"r":255},"textColor":{"a":1,"b":51,"g":51,"r":51},"borderColor":{"a":1,"b":0,"g":0,"r":0}},"border":{"size":"0","style":"solid","radius":"5"},"margin":{"top":"0","left":"0","right":"0","bottom":"0"},"shadow":false,"padding":{"top":"10","left":"10","right":"10","bottom":"10"}},"progress":{"font":{"size":"14","values":[],"desSize":13,"dateSize":12,"iconSize":30,"titleSize":13,"customFont":false,"fontFamily":"Andika","fontVariant":"regular","customFontFamily":"Lato","customFontVariant":"400"},"size":{"value":"small","custom":{"width":"150","height":"150","setCaratWidth":"px","setCaratHeight":"px"}},"color":{"bgColor":{"a":0,"b":255,"g":255,"r":255},"desColor":{"a":1,"b":0,"g":0,"r":0},"dateColor":{"a":1,"b":0,"g":0,"r":0},"iconColor":{"a":1,"b":0,"g":0,"r":0},"titleColor":{"a":1,"b":0,"g":0,"r":0},"borderColor":{"a":1,"b":255,"g":255,"r":255},"iconBgColor":{"a":1,"b":247,"g":237,"r":255},"lineBgColor":{"a":1,"b":247,"g":237,"r":255},"borderIconColor":{"a":1,"b":0,"g":0,"r":0}},"border":{"size":"0","style":"solid","radius":"5"},"margin":{"top":"0","left":"0","right":"0","bottom":"0"},"shadow":false,"padding":{"top":"20","left":"0","right":"0","bottom":"15"},"template":"template1"},"progress_bar":{"status":[{"lang":"default","ordered":{"icon":{"id":"icon_14","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" height=\"40\" width=\"40\" id=\"Capa_1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 612 612\" enableBackground=\"new 0 0 612 612\" xmlSpace=\"preserve\"\u003e\u003cg\u003e\u003cg\u003e\u003cg\u003e\u003cpath d=\"M608.126,124.457c-3.239-3.945-8.075-6.233-13.179-6.233H107.539L91.367,34.782c-1.555-8.018-8.577-13.81-16.743-13.81 h-57.57C7.633,20.972,0,28.608,0,38.026s7.633,17.054,17.054,17.054h43.501l73.439,384.296 c1.435,8.155,8.519,14.101,16.796,14.101h60.242c-32.342,5.858-56.956,34.204-56.956,68.21c0,38.233,31.106,69.34,69.34,69.34 c38.233,0,69.336-31.106,69.336-69.34c0-34.005-24.609-62.351-56.953-68.21h221.5c-32.344,5.858-56.959,34.204-56.959,68.21 c0,38.233,31.109,69.34,69.344,69.34c38.233,0,69.339-31.106,69.339-69.34c0-34.005-24.612-62.351-56.953-68.21h51.932 c9.418,0,17.054-7.636,17.054-17.054c0-9.42-7.636-17.054-17.054-17.054H165.109l-5.224-29.721h387.974 c8.142,0,15.144-5.752,16.73-13.736l47.086-237.314C612.667,133.591,611.365,128.403,608.126,124.457z M504.917,521.687 c0,19.426-15.805,35.23-35.23,35.23c-19.428,0-35.236-15.804-35.236-35.23c0-19.426,15.808-35.23,35.236-35.23 C489.112,486.458,504.917,502.26,504.917,521.687z M258.646,521.687c0,19.426-15.802,35.23-35.227,35.23 c-19.428,0-35.233-15.804-35.233-35.23c0-19.426,15.805-35.23,35.233-35.23C242.842,486.458,258.646,502.26,258.646,521.687z M153.539,355.539l-23.13-119.328h64.366l19.605,119.328H153.539z M327.099,355.539h-78.154l-19.605-119.328h97.76V355.539z M440.591,355.539h-79.384V236.212h96.513L440.591,355.539z M533.857,355.539H475.05l17.13-119.328h65.352L533.857,355.539z M564.299,202.104h-440.5l-9.648-49.77h460.025L564.299,202.104z\"\/\u003e\u003c\/g\u003e\u003c\/g\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003c\/svg\u003e"},"title":"Ordered","tooltip":null,"description":null},"delivered":{"icon":{"id":"icon_16","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" id=\"Capa_1\" x=\"0px\" y=\"0px\" width=\"60\" height=\"60\" viewBox=\"0 0 38 38\" enableBackground=\"new 0 0 38 38\" xmlSpace=\"preserve\"\u003e\u003cg\u003e\u003cpath d=\"M19,0C11.096,0,4.666,6.43,4.666,14.333c0,11.379,12.796,22.81,13.341,23.292C18.292,37.875,18.646,38,19,38 c0.368,0,0.736-0.135,1.023-0.404c0.543-0.508,13.311-12.568,13.311-23.262C33.334,6.431,26.902,0,19,0z M19,21.168 c-3.775,0-6.834-3.061-6.834-6.833S15.225,7.502,19,7.502c3.773,0,6.832,3.06,6.832,6.833S22.773,21.168,19,21.168z\"\/\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003c\/svg\u003e"},"title":"Order Delivered","tooltip":null,"description":null}
1686,"dispatched":{"icon":{"id":"icon_29","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" id=\"Layer_1\" x=\"0px\" y=\"0px\" width=\"40\" height=\"40\" viewBox=\"0 0 512 512\" enableBackground=\"new 0 0 512 512\" xmlSpace=\"preserve\"\u003e\n \u003cpath d=\"M497.081,14.933c-1.515-1.495-3.75-1.912-5.703-1.048L26.753,221.692c-6.771,3.027-11.623,9.185-12.947,16.471 c-1.355,7.286,0.978,14.769,6.206,20.006l100.095,100.095L392.792,111.76c1.009-0.93,2.585-0.89,3.563,0.088 c0.979,0.974,1.009,2.553,0.096,3.584L149.978,388.117l12.693,98.073c0.412,3.29,2.492,6.141,5.482,7.553 c3.027,1.425,8.979,0.101,11.059-2.492c11.658-14.422,32.234-42.187,32.234-42.187l42.376,42.906 c5.259,5.237,12.725,7.562,20.006,6.215c7.307-1.342,13.452-6.185,16.475-12.944L498.12,20.622 C499.002,18.692,498.563,16.429,497.081,14.933z\"\/\u003e\n \u003c\/svg\u003e"},"title":"Order Dispatched","status":true,"tooltip":null,"description":null}},{"lang":"en","ordered":{"icon":{"id":"icon_22","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" id=\"Capa_1\" x=\"0px\" y=\"0px\" width=\"40\" height=\"40\" viewBox=\"0 0 406.215 406.215\" enableBackground=\"new 0 0 406.215 406.215\" xmlSpace=\"preserve\"\u003e\u003cg\u003e\u003cg\u003e\u003cg\u003e\u003cpath d=\"M226.793,243.186v163.029h134.115c17.431,0,31.568-14.129,31.568-31.57V243.186H226.793z\"\/\u003e\u003cpath d=\"M179.374,243.186H13.749v131.459c0,17.441,14.141,31.57,31.57,31.57h134.055V243.186z M56.788,373.086 c-6.545,0-11.855-5.311-11.855-11.854v-65.778c0-6.544,5.311-11.854,11.855-11.854s11.855,5.312,11.855,11.854v65.778 C68.643,367.775,63.333,373.086,56.788,373.086z\"\/\u003e\u003c\/g\u003e\u003cpath d=\"M371.176,119.564h-59.293c8.184-3.928,15.049-7.986,19.2-12.133c24.423-24.419,24.423-64.03,0-88.453 C318.857,6.768,302.85,0.664,286.844,0.664c-16.009,0-32.019,6.104-44.229,18.314c-10.141,10.144-19.897,35.182-27.862,60.983 c-3.72-1.021-7.549-1.736-11.577-1.736c-4.014,0-7.844,0.716-11.547,1.729c-7.996-26.034-17.844-51.412-28.08-61.641 C151.338,6.103,135.346,0,119.322,0c-16.008,0-32.016,6.104-44.227,18.313c-24.422,24.432-24.422,64.035,0,88.453 c4.369,4.388,11.73,8.679,20.562,12.798H35.038c-17.43,0-31.553,14.128-31.553,31.556v26.852c0,17.43,14.123,31.551,31.553,31.551 h144.336v-88.707h47.419v88.707h144.384c17.428,0,31.553-14.123,31.553-31.552v-26.852 C402.729,133.692,388.604,119.564,371.176,119.564z M264.971,41.332c5.834-5.838,13.612-9.057,21.873-9.057 c8.272,0,16.039,3.219,21.891,9.057c5.834,5.841,9.045,13.607,9.045,21.873s-3.211,16.031-9.016,21.835 c-6.531,6.161-32.107,15.76-63.725,24.701c-0.894-3.066-2.101-5.967-3.627-8.716C250.026,71.272,259.073,47.567,264.971,41.332z M97.448,40.668c5.836-5.834,13.615-9.053,21.875-9.053c8.273,0,16.039,3.211,21.857,9.037 c5.945,6.291,15.098,30.303,23.773,60.365c-1.436,2.577-2.576,5.296-3.473,8.158c-31.768-8.952-57.502-18.6-64.033-24.758 C85.391,72.353,85.391,52.732,97.448,40.668z\"\/\u003e\u003c\/g\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003c\/svg\u003e"},"title":"Ordered","tooltip":null,"description":null},"delivered":{"icon":{"id":"icon_16","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" id=\"Capa_1\" x=\"0px\" y=\"0px\" width=\"60\" height=\"60\" viewBox=\"0 0 38 38\" enableBackground=\"new 0 0 38 38\" xmlSpace=\"preserve\"\u003e\u003cg\u003e\u003cpath d=\"M19,0C11.096,0,4.666,6.43,4.666,14.333c0,11.379,12.796,22.81,13.341,23.292C18.292,37.875,18.646,38,19,38 c0.368,0,0.736-0.135,1.023-0.404c0.543-0.508,13.311-12.568,13.311-23.262C33.334,6.431,26.902,0,19,0z M19,21.168 c-3.775,0-6.834-3.061-6.834-6.833S15.225,7.502,19,7.502c3.773,0,6.832,3.06,6.832,6.833S22.773,21.168,19,21.168z\"\/\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003c\/svg\u003e"},"title":"Order Delivered","tooltip":null,"description":null}
1686,"dispatched":{"icon":{"id":"icon_29","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" id=\"Layer_1\" x=\"0px\" y=\"0px\" width=\"40\" height=\"40\" viewBox=\"0 0 512 512\" enableBackground=\"new 0 0 512 512\" xmlSpace=\"preserve\"\u003e\n \u003cpath d=\"M497.081,14.933c-1.515-1.495-3.75-1.912-5.703-1.048L26.753,221.692c-6.771,3.027-11.623,9.185-12.947,16.471 c-1.355,7.286,0.978,14.769,6.206,20.006l100.095,100.095L392.792,111.76c1.009-0.93,2.585-0.89,3.563,0.088 c0.979,0.974,1.009,2.553,0.096,3.584L149.978,388.117l12.693,98.073c0.412,3.29,2.492,6.141,5.482,7.553 c3.027,1.425,8.979,0.101,11.059-2.492c11.658-14.422,32.234-42.187,32.234-42.187l42.376,42.906 c5.259,5.237,12.725,7.562,20.006,6.215c7.307-1.342,13.452-6.185,16.475-12.944L498.12,20.622 C499.002,18.692,498.563,16.429,497.081,14.933z\"\/\u003e\n \u003c\/svg\u003e"},"title":"Order Dispatched","status":true,"tooltip":null,"description":null}},{"lang":"vi","ordered":{"icon":{"id":"icon_14","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" height=\"40\" width=\"40\" id=\"Capa_1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 612 612\" enableBackground=\"new 0 0 612 612\" xmlSpace=\"preserve\"\u003e\u003cg\u003e\u003cg\u003e\u003cg\u003e\u003cpath d=\"M608.126,124.457c-3.239-3.945-8.075-6.233-13.179-6.233H107.539L91.367,34.782c-1.555-8.018-8.577-13.81-16.743-13.81 h-57.57C7.633,20.972,0,28.608,0,38.026s7.633,17.054,17.054,17.054h43.501l73.439,384.296 c1.435,8.155,8.519,14.101,16.796,14.101h60.242c-32.342,5.858-56.956,34.204-56.956,68.21c0,38.233,31.106,69.34,69.34,69.34 c38.233,0,69.336-31.106,69.336-69.34c0-34.005-24.609-62.351-56.953-68.21h221.5c-32.344,5.858-56.959,34.204-56.959,68.21 c0,38.233,31.109,69.34,69.344,69.34c38.233,0,69.339-31.106,69.339-69.34c0-34.005-24.612-62.351-56.953-68.21h51.932 c9.418,0,17.054-7.636,17.054-17.054c0-9.42-7.636-17.054-17.054-17.054H165.109l-5.224-29.721h387.974 c8.142,0,15.144-5.752,16.73-13.736l47.086-237.314C612.667,133.591,611.365,128.403,608.126,124.457z M504.917,521.687 c0,19.426-15.805,35.23-35.23,35.23c-19.428,0-35.236-15.804-35.236-35.23c0-19.426,15.808-35.23,35.236-35.23 C489.112,486.458,504.917,502.26,504.917,521.687z M258.646,521.687c0,19.426-15.802,35.23-35.227,35.23 c-19.428,0-35.233-15.804-35.233-35.23c0-19.426,15.805-35.23,35.233-35.23C242.842,486.458,258.646,502.26,258.646,521.687z M153.539,355.539l-23.13-119.328h64.366l19.605,119.328H153.539z M327.099,355.539h-78.154l-19.605-119.328h97.76V355.539z M440.591,355.539h-79.384V236.212h96.513L440.591,355.539z M533.857,355.539H475.05l17.13-119.328h65.352L533.857,355.539z M564.299,202.104h-440.5l-9.648-49.77h460.025L564.299,202.104z\"\/\u003e\u003c\/g\u003e\u003c\/g\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003c\/svg\u003e"},"title":"Ordered","tooltip":null,"description":null},"delivered":{"icon":{"id":"icon_16","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" id=\"Capa_1\" x=\"0px\" y=\"0px\" width=\"60\" height=\"60\" viewBox=\"0 0 38 38\" enableBackground=\"new 0 0 38 38\" xmlSpace=\"preserve\"\u003e\u003cg\u003e\u003cpath d=\"M19,0C11.096,0,4.666,6.43,4.666,14.333c0,11.379,12.796,22.81,13.341,23.292C18.292,37.875,18.646,38,19,38 c0.368,0,0.736-0.135,1.023-0.404c0.543-0.508,13.311-12.568,13.311-23.262C33.334,6.431,26.902,0,19,0z M19,21.168 c-3.775,0-6.834-3.061-6.834-6.833S15.225,7.502,19,7.502c3.773,0,6.832,3.06,6.832,6.833S22.773,21.168,19,21.168z\"\/\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003cg\u003e\u003c\/g\u003e\u003c\/svg\u003e"},"title":"Order Delivered","tooltip":null,"description":null}
1686,"dispatched":{"icon":{"id":"icon_29","svg":"\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlnsXlink=\"http:\/\/www.w3.org\/1999\/xlink\" version=\"1.1\" id=\"Layer_1\" x=\"0px\" y=\"0px\" width=\"40\" height=\"40\" viewBox=\"0 0 512 512\" enableBackground=\"new 0 0 512 512\" xmlSpace=\"preserve\"\u003e\n \u003cpath d=\"M497.081,14.933c-1.515-1.495-3.75-1.912-5.703-1.048L26.753,221.692c-6.771,3.027-11.623,9.185-12.947,16.471 c-1.355,7.286,0.978,14.769,6.206,20.006l100.095,100.095L392.792,111.76c1.009-0.93,2.585-0.89,3.563,0.088 c0.979,0.974,1.009,2.553,0.096,3.584L149.978,388.117l12.693,98.073c0.412,3.29,2.492,6.141,5.482,7.553 c3.027,1.425,8.979,0.101,11.059-2.492c11.658-14.422,32.234-42.187,32.234-42.187l42.376,42.906 c5.259,5.237,12.725,7.562,20.006,6.215c7.307-1.342,13.452-6.185,16.475-12.944L498.12,20.622 C499.002,18.692,498.563,16.429,497.081,14.933z\"\/\u003e\n \u003c\/svg\u003e"},"title":"Order Dispatched","status":true,"tooltip":null,"description":null}}]}},"translations":[{"lang":"default","time":{"hours":"Hours","minutes":"Minutes","seconds":"Seconds"}}],"productPreview":{"productPreview":{"ids":[10666571170138]}}},"condition_configs":{"manual":{"on_pages":["productPage"],"device_targeting":{"show_on":"all"}},"automate":{"operator":"and","conditions":[{"value":null,"where":"EQUALS","select":"ALL","values":[]}]}},"status":1}}[11486]; 1687 1688 1689 1690 1691 1692 Samita.Countdowns.dataSalesPopups = [] 1693 1694 1695 1696 Samita.Countdowns.dataBanners = [] 1697 1698 1699 1700 1701 </script>
1701 1702 <!-- END app block -->
1702<script src="https://cdn.shopify.com/extensions/01a11e93-cfdd-7e31-8fce-4101c959d1b1/avada-upsell-272/assets/avada-free-gift.js" type="text/javascript" defer="defer"></script>
vendor: 1 bytes, line 1702
1702
1703<script src="https://cdn.shopify.com/extensions/01a11c04-5004-7089-99f7-e26379ae3845/forms-2615/assets/shopify-forms-loader.js" type="text/javascript" defer="defer"></script>
vendor: 1 bytes, line 1703
1703
1704<script src="https://cdn.shopify.com/extensions/01a0d281-f883-79d1-9066-ada610f6412a/countdown-timer-bar-samita-118/assets/samita.countdowns.index.js" type="text/javascript" defer="defer"></script>
1704 1705<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
1706<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 98633711962,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "index"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 1706
1706
1707<script> 1708 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 1709</script>
vendor: 1 bytes, line 1709
1709
1710<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
1710).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 98633711962,storefrontBaseUrl: "https://www.tnbl.co.uk",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://www.tnbl.co.uk/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab"],webPixelsConfigList: [{"id":"4197941594","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"6e6b2e32fe6866115b7e49e2ae3c75b2","type":"APP","apiClientId":5940125,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]}
1710,"dataSharingState":"unrestricted"},{"id":"4022337882","configuration":"{\"config\":\"{\\\"google_tag_ids\\\":[\\\"G-7TERMZ9RHX\\\",\\\"AW-591385983\\\",\\\"GT-WVR4LPWJ\\\"],\\\"target_country\\\":\\\"ZZ\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":[\\\"G-7TERMZ9RHX\\\",\\\"AW-591385983\\\/iUKXCJqpmZIcEP-q_5kC\\\"]},{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":[\\\"G-7TERMZ9RHX\\\",\\\"AW-591385983\\\/W-woCJarmZIcEP-q_5kC\\\"]},{\\\"type\\\":\\\"remove_from_cart\\\",\\\"action_label\\\":\\\"G-7TERMZ9RHX\\\"},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":[\\\"G-7TERMZ9RHX\\\",\\\"AW-591385983\\\/p09LCJOrmZIcEP-q_5kC\\\",\\\"MC-E9WFHS98NK\\\"]},{\\\"type\\\":\\\"add_shipping_info\\\",\\\"action_label\\\":\\\"G-7TERMZ9RHX\\\"},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":[\\\"G-7TERMZ9RHX\\\",\\\"AW-591385983\\\/xjToCJepmZIcEP-q_5kC\\\",\\\"MC-E9WFHS98NK\\\"]},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":[\\\"G-7TERMZ9RHX\\\",\\\"AW-591385983\\\/zMS7CJCrmZIcEP-q_5kC\\\",\\\"MC-E9WFHS98NK\\\"]},{\\\"type\\\":\\\"view_item_list\\\",\\\"action_label\\\":\\\"G-7TERMZ9RHX\\\"},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":[\\\"G-7TERMZ9RHX\\\",\\\"AW-591385983\\\/j0WjCJmrmZIcEP-q_5kC\\\"]},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":[\\\"G-7TERMZ9RHX\\\",\\\"AW-591385983\\\/A2rDCI2rmZIcEP-q_5kC\\\"]},{\\\"type\\\":\\\"view_cart\\\",\\\"action_label\\\":\\\"G-7TERMZ9RHX\\\"}],\\\"enable_monitoring_mode\\\":false}\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"a3321ca85cf5aaf6b57585fcd8d67b3a","type":"APP","apiClientId":1780363,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"3721855322","configuration":"{\"siteID\":\"c7accaaa-a294-445b-957a-64072951e91d\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"f5a1297a20299bbb60a304a0ec8edd84","type":"APP","apiClientId":3983114241,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"307069274","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"name":"Google Tag Manager"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"TNBL UK","paymentSettings":{"currencyCode":"GBP"},"myshopifyDomain":"tnbl-uk.myshopify.com","countryCode":"GB","storefrontUrl":"https:\/\/www.tnbl.co.uk"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[{"id":"10912290505050","handle":"onail-nail-drill-pro-max","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54397449830746","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"11024830300506","handle":"rechargeable-intelligent-uv-disinfector-for-nail-beauty-tools","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54933241299290","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"11022935228762","handle":"mr-nail-3-layer-lint-free-nail-wipes-500pcs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54925456146778","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]}
1710,{"id":"11022914093402","handle":"disposable-salon-towels-biodegradable-70-x-35cm-hair-nails-pedicure","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54925336052058","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"11022872576346","handle":"tnbl-breast-cancer-charity-day-5-entry-ticket-wednesday-21st-october-2026","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54925177520474","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"11020550406490","handle":"apres-nova-led-lamp-mini","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54916494557530","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"11020474974554","handle":"adjustable-silicone-nail-stamper-enlarge-reduce-stamping-designs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54915240788314","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"11006315200858","handle":"cnd-shellacâ¢-magenta-sky-polish-7-3ml-hema-tpo-free","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54841813926234","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"11005042655578","handle":"saeyang-k38-portable-nail-file-machine","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54838219735386","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"10666571170138","handle":"tnbl-h-easy-french-v-shape-cutters-silver","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"53270702719322","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"10666571268442","handle":"tnbl-k-easy-french-water-drop-cutters-gold","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"53270702883162","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"10666571235674","handle":"tnbl-k-easy-french-water-drop-cutters-silver","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"53270702850394","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"10666595680602","handle":"tnbl-0-25g-long-handle-measuring-spoon-4pcs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"53270759309658","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]}],"purchasingCompany":null},},"https://www.tnbl.co.uk/cdn","7ec887c8w14f9f074p854094e1m1370c602",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"false","themeId":"193010991450","themePublished":"true","eventMetadataId":"c75db4c8-fb76-4afd-90e3-3ad003c35abc","pageType":"home","shopId":"98633711962","storefrontBaseUrl":"https:\/\/www.tnbl.co.uk","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\"]","isMerchantRequest":"false","hashVersion":"7ec887c8w14f9f074p854094e1m1370c602","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
1710<script> 1711 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 1712 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 1713 window.ShopifyAnalytics.meta.currency = 'GBP'; 1714 var meta = {"page":{"pageType":"home","requestId":"cfc2cb5b-ea41-489e-8d0c-2823e7cb911e-1791516082"}}; 1715 for (var attr in meta) { 1716 window.ShopifyAnalytics.meta[attr] = meta[attr]; 1717 } 1718</script>
vendor: 1 bytes, line 1718
1718
1719<script class="analytics"> 1720 (function () { 1721 var customDocumentWrite = function(content) { 1722 var jquery = null; 1723 1724 if (window.jQuery) { 1725 jquery = window.jQuery; 1726 } else if (window.Checkout && window.Checkout.$) { 1727 jquery = window.Checkout.$; 1728 } 1729 1730 if (jquery) { 1731 jquery('body').append(content); 1732 } 1733 }; 1734 1735 var hasLoggedConversion = function(token) { 1736 if (token) { 1737 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 1738 } 1739 return false; 1740 } 1741 1742 var setCookieIfConversion = function(token) { 1743 if (token) { 1744 var twoMonthsFromNow = new Date(Date.now()); 1745 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 1746 1747 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 1748 } 1749 } 1750 1751 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 1752 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 1753 if (trekkie.integrations) { 1754 return; 1755 } 1756 trekkie.methods = [ 1757 'identify', 1758 'page', 1759 'ready', 1760 'track', 1761 'trackForm', 1762 'trackLink' 1763 ]; 1764 trekkie.factory = function(method) { 1765 return function() { 1766 var args = Array.prototype.slice.call(arguments); 1767 args.unshift(method); 1768 trekkie.push(args); 1769 if (method == 'track' || method == 'page') { 1770 var pageUrl; 1771 try { 1772 pageUrl = window.location.href; 1773 } catch (e) {} 1774 var pageReferrer; 1775 try { 1776 pageReferrer = document.referrer; 1777 } catch (e) {} 1778 try { 1779 if (window.__TREKKIE_SHIM_QUEUE == null) { 1780 window.__TREKKIE_SHIM_QUEUE = []; 1781 } 1782 window.__TREKKIE_SHIM_QUEUE.push({ 1783 from: 'trekkie-stub', 1784 method: method, 1785 args: args.slice(1), 1786 pageContext: { 1787 url: pageUrl, 1788 referrer: pageReferrer 1789 } 1790 }); 1791 } catch (e) { 1792 // no-op 1793 } 1794 } 1795 return trekkie; 1796 }; 1797 }; 1798 for (var i = 0; i < trekkie.methods.length; i++) { 1799 var key = trekkie.methods[i]; 1800 trekkie[key] = trekkie.factory(key); 1801 } 1802 trekkie.load = function(config) { 1803 trekkie.config = config || {}; 1804 trekkie.config.initialDocumentCookie = document.cookie; 1805 var first = document.getElementsByTagName('script')[0]; 1806var script = document.createElement('script'); 1807script.type = 'text/javascript'; 1808script.onerror = function(e) { 1809 var scriptFallback = document.createElement('script'); 1810 scriptFallback.type = 'text/javascript'; 1811 scriptFallback.onerror = function(error) { 1812 var Monorail = { 1813 produce: function produce(monorailDomain, schemaId, payload) { 1814 var currentMs = new Date().getTime(); 1815 var event = { 1816 schema_id: schemaId, 1817 payload: payload, 1818 metadata: { 1819 event_created_at_ms: currentMs, 1820 event_sent_at_ms: currentMs 1821 } 1822 }; 1823 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 1824 }, 1825 sendRequest: function sendRequest(endpointUrl, payload) { 1826 // Try the sendBeacon API 1827 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 1828 var blobData = new window.Blob([payload], { 1829 type: 'text/plain' 1830 }); 1831 1832 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 1833 return true; 1834 } // sendBeacon was not successful 1835 1836 } // XHR beacon 1837 1838 var xhr = new XMLHttpRequest(); 1839 1840 try { 1841 xhr.open('POST', endpointUrl); 1842 xhr.setRequestHeader('Content-Type', 'text/plain'); 1843 xhr.send(payload); 1844 } catch (e) { 1845 console.log(e); 1846 } 1847 1848 return false; 1849 }, 1850 isIos12: function isIos12() { 1851 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 1852 } 1853 }; 1854 Monorail.produce('monorail-edge.shopifysvc.com', 1855 'trekkie_storefront_load_errors/1.1', 1856 {shop_id: 98633711962, 1857 theme_id: 193010991450, 1858 app_name: "storefront", 1859 context_url: window.location.href, 1860 source_url: "//www.tnbl.co.uk/cdn/s/trekkie.storefront.51e69540e15035ae012ec8cc42e8f9cd792233a0.min.js"}); 1861 1862 }; 1863 scriptFallback.async = true; 1864 scriptFallback.src = '//www.tnbl.co.uk/cdn/s/trekkie.storefront.51e69540e15035ae012ec8cc42e8f9cd792233a0.min.js'; 1865 first.parentNode.insertBefore(scriptFallback, first); 1866}; 1867script.async = true; 1868script.src = '//www.tnbl.co.uk/cdn/s/trekkie.storefront.51e69540e15035ae012ec8cc42e8f9cd792233a0.min.js'; 1869first.parentNode.insertBefore(script, first); 1870 1871 }; 1872 trekkie.load( 1873 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":98633711962,"isMerchantRequest":null,"themeId":193010991450,"themeCityHash":"6561244280233220478","contentLanguage":"en","currency":"GBP","eventMetadataId":"c75db4c8-fb76-4afd-90e3-3ad003c35abc"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer","apiClientId":580111}} 1874 ); 1875 1876 var loaded = false;
1877 trekkie.ready(function() { 1878 if (loaded) return; 1879 loaded = true; 1880 1881 window.ShopifyAnalytics.lib = window.trekkie; 1882 1883 var originalDocumentWrite = document.write; 1884 document.write = customDocumentWrite; 1885 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 1886 document.write = originalDocumentWrite; 1887 1888 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 1889 var token = match? match[1]: undefined; 1890 if (!hasLoggedConversion(token)) { 1891 setCookieIfConversion(token); 1892 1893 } 1894 }); 1895 1896 window.ShopifyAnalytics.lib.page(null,{"pageType":"home","requestId":"cfc2cb5b-ea41-489e-8d0c-2823e7cb911e-1791516082","shopifyEmitted":true}); 1897 1898 var eventsListenerScript = document.createElement('script'); 1899 eventsListenerScript.async = true; 1900 eventsListenerScript.src = "//www.tnbl.co.uk/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 1901 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 1902})();</script>
vendor: 1 bytes, line 1902
1902
1903<script 1904 defer 1905 src="https://www.tnbl.co.uk/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.10.1.min.js" 1906 data-application="storefront-renderer" 1907 data-shop-id="98633711962" 1908 data-render-region="gcp-us-west1" 1909 data-page-type="index" 1910 data-theme-instance-id="193010991450" 1911 data-theme-name="Horizon" 1912 data-theme-version="3.2.1" 1913 data-monorail-region="shop_domain" 1914 data-resource-timing-sampling-rate="10" 1915 data-shs="true" 1916 data-shs-beacon="true" 1917 data-shs-export-with-fetch="true" 1918 data-shs-logs-sample-rate="1" 1919 data-shs-beacon-endpoint="https://www.tnbl.co.uk/api/collect" 1920></script>
1920 1921<meta name="shopify-y" content="79cb4c2c-205a-4b89-b875-2d7849e23950" data-expiration="1823073682000"><meta name="shopify-s" content="a5b4ee7d-e3fa-44b6-8494-d4551df1fa8e" data-expiration="1791517882000"> 1922</head> 1923 1924 <body class="page-width-narrow card-hover-effect-none"> 1925 <a 1926 class="skip-to-content-link button-secondary" 1927 href="#MainContent" 1928> 1929 Skip to content 1930</a> 1931 1932 <div id="header-group"> 1933 <!-- BEGIN sections: header-group --> 1934<div id="shopify-section-sections--28213213561178__header_announcements_9jGBFp" class="shopify-section shopify-section-group-header-group"> 1935 1936 1937
1937<script 1938 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/announcement-bar.js?v=34024675399582161451774530326" 1939 type="module" 1940 fetchpriority="low" 1941 ></script>
1941 1942 1943 1944<div class="section-background color-scheme-3"></div> 1945<aside 1946 class="announcement-bar spacing-style section section--page-width color-scheme-3" 1947 style="--padding-block-start: 15px; --padding-block-end:15px; 1948--padding-inline-start:0px; --padding-inline-end:0px; 1949; --border-bottom-width: 0px;" 1950> 1951 1952 1953 <announcement-bar-component 1954 class="announcement-bar__slider" 1955 1956 autoplay="5" aria-live="polite" 1957 1958 > 1959 1960 <slideshow-arrows 1961 position="center" 1962 1963><button 1964 class=" 1965 slideshow-control slideshow-control--previous 1966 1967 1968 slideshow-control--style-chevron 1969 button button-unstyled button-unstyled--transparent 1970 flip-x 1971 " 1972 1973 aria-label="Previous slide" 1974 1975 on:click="/previous" 1976 ref="previous" 1977> 1978 <span class="svg-wrapper icon-caret"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 1979 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 1980</svg> 1981</span> 1982</button> 1983<button 1984 class=" 1985 slideshow-control slideshow-control--next 1986 1987 1988 slideshow-control--style-chevron 1989 button button-unstyled button-unstyled--transparent 1990 1991 " 1992 1993 aria-label="Next slide" 1994 1995 on:click="/next" 1996 ref="next" 1997> 1998 <span class="svg-wrapper icon-caret"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 1999 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2000</svg> 2001</span> 2002</button> 2003</slideshow-arrows> 2004 2005 2006 2007 <div class="announcement-bar__slides"> 2008 2009<slideshow-slide 2010 ref="slides[]" 2011 class=" 2012 announcement-bar__slide 2013 text-block 2014 text-block--AM0lZaU1DR3pweWRvW__announcement_BxgCk9 2015 text-block--align-center 2016 text-block--full-width 2017 custom-typography 2018 custom-font-size 2019 2020 " 2021 style=" 2022 2023--color: ;--font-size: 0.75rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-); --letter-spacing: var(--letter-spacing--body-normal); 2024 --width: 100%; 2025 --text-align: center; 2026 --line-height: 1.2; 2027 " 2028 2029 aria-hidden="false" 2030 > 2031 <p class="announcement-bar__text"> 2032 Free UK mainland delivery on orders over £60 2033 </p> 2034 2035 2036 </slideshow-slide> 2037 2038 2039 2040<slideshow-slide 2041 ref="slides[]" 2042 class=" 2043 announcement-bar__slide 2044 text-block 2045 text-block--AVDhBRytvdzZSTGN6b__announcement_qJjj8M 2046 text-block--align-center 2047 text-block--full-width 2048 custom-typography 2049 custom-font-size 2050 2051 " 2052 style=" 2053 2054--color: ;--font-size: 0.75rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-); --letter-spacing: var(--letter-spacing--body-normal); 2055 --width: 100%; 2056 --text-align: center; 2057 --line-height: 1.2; 2058 " 2059 2060 aria-hidden="true" 2061 > 2062 <p class="announcement-bar__text"> 2063 Sign up for a Trade Account today 2064 </p> 2065 2066 2067 <a 2068 class="announcement-bar__link" 2069 href="https://account.tnbl.co.uk" 2070 > 2071 <span class="visually-hidden"> 2072 Sign up for a Trade Account today 2073 </span> 2074 </a> 2075 2076 </slideshow-slide> 2077 2078 2079 2080<slideshow-slide 2081 ref="slides[]" 2082 class=" 2083 announcement-bar__slide 2084 text-block 2085 text-block--AQXJDYUxHQVc2Qk9uQ__announcement_dC8YgV 2086 text-block--align-center 2087 text-block--full-width 2088 custom-typography 2089 custom-font-size 2090 2091 " 2092 style=" 2093 2094--color: ;--font-size: 0.75rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-); --letter-spacing: var(--letter-spacing--body-normal); 2095 --width: 100%; 2096 --text-align: center; 2097 --line-height: 1.2; 2098 " 2099 2100 aria-hidden="true" 2101 > 2102 <p class="announcement-bar__text"> 2103 Check out our Nail Courses 2104 </p> 2105 2106 2107 <a 2108 class="announcement-bar__link" 2109 href="/pages/courses" 2110 >
2111 <span class="visually-hidden"> 2112 Check out our Nail Courses 2113 </span> 2114 </a> 2115 2116 </slideshow-slide> 2117 2118 2119 2120 </div> 2121 </announcement-bar-component> 2122</aside> 2123 2124 2125 2126 2127</div><header id="shopify-section-sections--28213213561178__header_section" class="shopify-section shopify-section-group-header-group header-section"> 2128 2129 2130 2131 2132
2133<script type="application/ld+json"> 2134 { 2135 "@context": "http://schema.org", 2136 "@type": "Organization", 2137 "name": "TNBL UK", 2138 2139 "logo": "https:\/\/www.tnbl.co.uk\/cdn\/shop\/files\/TNBL.png?v=1766497859\u0026width=500", 2140 2141 "url": "https:\/\/www.tnbl.co.uk" 2142 } 2143</script>
2143 2144 2145<header-component 2146 id="header-component" 2147 class="header" 2148 data-theme-color="rgb(255 255 255)" 2149 2150 2151 sticky="always" 2152 2153 data-skip-node-update 2154 data-scroll-direction="none" 2155><h1 class="visually-hidden">TNBL UK</h1> 2156 2157 2158 2159 2160 2161 2162 <div 2163 class="header__row header__row--top color-scheme-1 section section--full-width-margin section--page-width" 2164 ref="headerRowTop"style="--border-bottom-width: 0px; --border-bottom-width-mobile: 0px;"> 2165 <div class="header__columns spacing-style"> 2166 <div 2167 class="header__column header__column--left" 2168 data-testid="header-top-left" 2169 > 2170 2171 2172 2173 2174 2175 2176 2177 <div 2178 class="header__drawer desktop:hidden" 2179 ref="headerDrawerContainer" 2180 2181 > 2182 2183
2184<script 2185 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/header-drawer.js?v=44357639294953783801774530325" 2186 type="module" 2187 fetchpriority="low" 2188></script>
2188 2189 2190<header-drawer 2191 class="header-drawer header__drawer--mobile" 2192 style="--menu-image-border-radius: 12px; --resource-card-corner-radius: 12px;" 2193> 2194 <details 2195 id="Details-menu-drawer-container" 2196 data-skip-node-update="true" 2197 class="menu-drawer-container" 2198 ref="details" 2199 scroll-lock 2200 > 2201 <summary 2202 class="header__icon header__icon--menu header__icon--summary" 2203 aria-label="Menu" 2204 on:click="/toggle" 2205 > 2206 <span class="svg-wrapper header-drawer-icon header-drawer-icon--open"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2207 <path d="M1 3.5H13" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 2208 <path d="M1 10.5H13" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 2209</svg> 2210</span> 2211 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2212 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2213 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2214</svg> 2215</span> 2216 </summary> 2217 <div 2218 data-header-drawer 2219 class=" 2220 menu-drawer 2221 motion-reduce 2222 color-scheme-1 2223 " 2224 > 2225 <button 2226 class="button button-unstyled close-button menu-drawer__close-button" 2227 type="button" 2228 aria-label="Close" 2229 on:click="/close" 2230 > 2231 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2232 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2233 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2234</svg> 2235</span> 2236 </button> 2237 <nav 2238 class="menu-drawer__navigation" 2239 style="--menu-top-level-font-family: var(--font-body--family); 2240--menu-top-level-font-size-desktop: 1rem; --menu-top-level-font-style: var(--font-body--style); --menu-top-level-font-weight: var(--font-body--weight); --menu-top-level-font-case:none; 2241 2242 --menu-top-level-font-size: var(--menu-font-2xl--size); --menu-top-level-font-line-height: 2243 var(--menu-font-2xl--line-height); 2244 2245--menu-top-level-font-color: var(--color-foreground); --menu-top-level-font-color-rgb: var(--color-foreground-rgb); 2246 2247--menu-parent-font-family: var(--font-body--family); --menu-parent-font-style: 2248var(--font-body--style); --menu-parent-font-weight: var(--font-body--weight); --menu-parent-font-case: 2249none; 2250 2251 --menu-parent-font-size: var(--menu-font-md--size); --menu-parent-font-line-height: 2252 var(--menu-font-md--line-height); --menu-parent-font-color: var(--color-foreground); 2253 --menu-parent-active-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 2254 2255--menu-child-font-family: var(--font-body--family); --menu-child-font-style: 2256var(--font-body--style); --menu-child-font-weight: var(--font-body--weight); --menu-child-font-case: 2257none; 2258 2259 --menu-child-font-size: var(--menu-font-sm--size); --menu-child-font-line-height: var(--menu-font-sm--line-height); 2260 --menu-child-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 2261 --menu-child-active-font-color: var(--color-foreground); 2262 2263 2264 " 2265 > 2266 <ul 2267 class="menu-drawer__menu has-submenu" 2268 role="list" 2269 > 2270 2271 2272 <li 2273 class="menu-drawer__list-item" 2274 style="--menu-drawer-animation-index: 1;" 2275 ><a 2276 id="HeaderDrawer-new-in" 2277 href="/collections/new" 2278 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 2279 2280 >
2281 <span class="menu-drawer__menu-item-text wrap-text">New In</span> 2282 </a></li> 2283 <li 2284 class="menu-drawer__list-item" 2285 style="--menu-drawer-animation-index: 2;" 2286 ><details 2287 id="Details-menu-drawer-menu-item-2" 2288 class="menu-drawer__menu-container" 2289 > 2290 <summary 2291 id="HeaderDrawer-apres-nails" 2292 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 2293 on:click="header-drawer/open" 2294 > 2295 <span class="menu-drawer__menu-item-text wrap-text">Apres Nails</span> 2296 <span class="svg-wrapper icon-caret icon-caret--forward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2297 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2298</svg> 2299</span> 2300 </summary> 2301 <div 2302 id="link-apres-nails" 2303 class="menu-drawer__submenu has-submenu gradient motion-reduce" 2304 tabindex="-1" 2305 style="--menu-drawer-animation-index: 2;" 2306 > 2307 <div class="menu-drawer__inner-submenu"> 2308 <div class="menu-drawer__nav-buttons"> 2309 <button 2310 class="button menu-drawer__back-button focus-inset" 2311 aria-expanded="true" 2312 on:click="header-drawer/back" 2313 aria-label="Back" 2314 > 2315 <span class="svg-wrapper icon-caret icon-caret--backward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2316 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2317</svg> 2318</span> 2319 <span class="menu-drawer__menu-item-text wrap-text">Apres Nails</span> 2320 </button> 2321 <button 2322 class="button button-unstyled close-button menu-drawer__close-button" 2323 type="button" 2324 aria-label="Close" 2325 on:click="header-drawer/close" 2326 > 2327 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2328 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2329 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2330</svg> 2331</span> 2332 </button> 2333 </div> 2334 2335 2336 <ul 2337 class="menu-drawer__menu menu-drawer__menu--childlist" 2338 role="list" 2339 tabindex="-1" 2340 > 2341 <li 2342 class=" 2343 menu-drawer__list-item 2344 menu-drawer__list-item--flat 2345 " 2346 > 2347 2348<a 2349 id="HeaderDrawer-apres-nails-apres-nails" 2350 href="/pages/apres" 2351 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 2352 > 2353 <span class="menu-drawer__menu-item-text wrap-text">Apres Nails</span> 2354 </a> 2355 2356 <ul 2357 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 2358 role="list" 2359 tabindex="-1" 2360 ><li 2361 class="menu-drawer__list-item" 2362 style="--menu-drawer-animation-index: 1;" 2363 > 2364 <a 2365 id="HeaderDrawer-apres-nails-apres-nails-gel-x-kits" 2366 href="/collections/apres-gel-x-kits" 2367 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2368 2369 > 2370
2371 <span class="menu-drawer__menu-item-text wrap-text">Gel-X Kits</span> 2372 </a> 2373 </li><li 2374 class="menu-drawer__list-item" 2375 style="--menu-drawer-animation-index: 2;" 2376 > 2377 <a 2378 id="HeaderDrawer-apres-nails-apres-nails-gel-x-tips" 2379 href="/collections/apres-gel-x-tips" 2380 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2381 2382 > 2383 2384 <span class="menu-drawer__menu-item-text wrap-text">Gel-X Tips</span> 2385 </a> 2386 </li><li 2387 class="menu-drawer__list-item" 2388 style="--menu-drawer-animation-index: 3;" 2389 > 2390 <a 2391 id="HeaderDrawer-apres-nails-apres-nails-gel-colours" 2392 href="/collections/apres-gel-colour" 2393 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2394 2395 > 2396 2397 <span class="menu-drawer__menu-item-text wrap-text">Gel Colours</span> 2398 </a> 2399 </li><li 2400 class="menu-drawer__list-item" 2401 style="--menu-drawer-animation-index: 4;" 2402 > 2403 <a 2404 id="HeaderDrawer-apres-nails-apres-nails-essentials" 2405 href="/collections/apres-essentials" 2406 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2407 2408 > 2409 2410 <span class="menu-drawer__menu-item-text wrap-text">Essentials</span> 2411 </a> 2412 </li><li 2413 class="menu-drawer__list-item" 2414 style="--menu-drawer-animation-index: 5;" 2415 > 2416 <a 2417 id="HeaderDrawer-apres-nails-apres-nails-tools-accessories" 2418 href="/collections/apres-tools-accessories" 2419 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2420 2421 > 2422 2423 <span class="menu-drawer__menu-item-text wrap-text">Tools & Accessories</span> 2424 </a> 2425 </li><li 2426 class="menu-drawer__list-item" 2427 style="--menu-drawer-animation-index: 6;" 2428 > 2429 <a 2430 id="HeaderDrawer-apres-nails-apres-nails-aer-gel" 2431 href="/collections/apres-aer-gel" 2432 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2433 2434 > 2435
2436 <span class="menu-drawer__menu-item-text wrap-text">Aer Gel</span> 2437 </a> 2438 </li><li 2439 class="menu-drawer__list-item" 2440 style="--menu-drawer-animation-index: 7;" 2441 > 2442 <a 2443 id="HeaderDrawer-apres-nails-apres-nails-art-inks" 2444 href="/collections/apres-art-inks" 2445 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2446 2447 > 2448 2449 <span class="menu-drawer__menu-item-text wrap-text">Art Inks</span> 2450 </a> 2451 </li><li 2452 class="menu-drawer__list-item" 2453 style="--menu-drawer-animation-index: 8;" 2454 > 2455 <a 2456 id="HeaderDrawer-apres-nails-apres-nails-apres-clearance" 2457 href="/collections/apres-clearance" 2458 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2459 2460 > 2461 2462 <span class="menu-drawer__menu-item-text wrap-text">Apres Clearance</span> 2463 </a> 2464 </li></ul></li></ul> 2465 2466 </div> 2467 </div> 2468 </details></li> 2469 <li 2470 class="menu-drawer__list-item" 2471 style="--menu-drawer-animation-index: 3;" 2472 ><details 2473 id="Details-menu-drawer-menu-item-3" 2474 class="menu-drawer__menu-container" 2475 > 2476 <summary 2477 id="HeaderDrawer-nails" 2478 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 2479 on:click="header-drawer/open" 2480 > 2481 <span class="menu-drawer__menu-item-text wrap-text">Nails</span> 2482 <span class="svg-wrapper icon-caret icon-caret--forward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2483 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2484</svg> 2485</span> 2486 </summary> 2487 <div 2488 id="link-nails" 2489 class="menu-drawer__submenu has-submenu gradient motion-reduce" 2490 tabindex="-1" 2491 style="--menu-drawer-animation-index: 3;" 2492 > 2493 <div class="menu-drawer__inner-submenu"> 2494 <div class="menu-drawer__nav-buttons"> 2495 <button 2496 class="button menu-drawer__back-button focus-inset" 2497 aria-expanded="true" 2498 on:click="header-drawer/back" 2499 aria-label="Back" 2500 > 2501 <span class="svg-wrapper icon-caret icon-caret--backward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2502 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2503</svg> 2504</span>
2505 <span class="menu-drawer__menu-item-text wrap-text">Nails</span> 2506 </button> 2507 <button 2508 class="button button-unstyled close-button menu-drawer__close-button" 2509 type="button" 2510 aria-label="Close" 2511 on:click="header-drawer/close" 2512 > 2513 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 2514 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2515 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 2516</svg> 2517</span> 2518 </button> 2519 </div> 2520 2521 2522 2523 <div class="menu-drawer__shop-by-colour menu-drawer__animated-element"> 2524 <p class="menu-drawer__shop-by-colour-title">Shop by Colour</p> 2525 <ul class="menu-drawer__shop-by-colour-grid list-unstyled" role="list"> 2526 2527 2528 <li> 2529 <a 2530 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Beige&sort_by=best-selling&grid=default" 2531 class="menu-drawer__shop-by-colour-link" 2532 aria-label="Beige" 2533 > 2534 2535 <span class="menu-drawer__shop-by-colour-placeholder"></span> 2536 2537 <span class="menu-drawer__shop-by-colour-name">Beige</span> 2538 </a> 2539 </li> 2540 2541 2542 <li> 2543 <a 2544 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Black&sort_by=best-selling&grid=default" 2545 class="menu-drawer__shop-by-colour-link" 2546 aria-label="Black" 2547 > 2548 2549 <span class="menu-drawer__shop-by-colour-swatch"> 2550 <img 2551 src="//www.tnbl.co.uk/cdn/shop/files/Black.png?v=1770112825&width=200" 2552 alt="" 2553 width="24" 2554 height="24" 2555 loading="lazy" 2556 > 2557 </span> 2558 2559 <span class="menu-drawer__shop-by-colour-name">Black</span> 2560 </a> 2561 </li> 2562 2563 2564 <li> 2565 <a 2566 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Blue&sort_by=best-selling&grid=default" 2567 class="menu-drawer__shop-by-colour-link" 2568 aria-label="Blue" 2569 > 2570 2571 <span class="menu-drawer__shop-by-colour-swatch"> 2572 <img 2573 src="//www.tnbl.co.uk/cdn/shop/files/Blue.png?v=1770112825&width=200" 2574 alt="" 2575 width="24" 2576 height="24" 2577 loading="lazy" 2578 > 2579 </span> 2580
2581 <span class="menu-drawer__shop-by-colour-name">Blue</span> 2582 </a> 2583 </li> 2584 2585 2586 <li> 2587 <a 2588 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Brown&sort_by=best-selling&grid=default" 2589 class="menu-drawer__shop-by-colour-link" 2590 aria-label="Brown" 2591 > 2592 2593 <span class="menu-drawer__shop-by-colour-swatch"> 2594 <img 2595 src="//www.tnbl.co.uk/cdn/shop/files/Brown.png?v=1770112826&width=200" 2596 alt="" 2597 width="24" 2598 height="24" 2599 loading="lazy" 2600 > 2601 </span> 2602 2603 <span class="menu-drawer__shop-by-colour-name">Brown</span> 2604 </a> 2605 </li> 2606 2607 2608 <li> 2609 <a 2610 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Clear&sort_by=best-selling&grid=default" 2611 class="menu-drawer__shop-by-colour-link" 2612 aria-label="Clear" 2613 > 2614 2615 <span class="menu-drawer__shop-by-colour-swatch"> 2616 <img 2617 src="//www.tnbl.co.uk/cdn/shop/files/Clear.png?v=1770112825&width=200" 2618 alt="" 2619 width="24" 2620 height="24" 2621 loading="lazy" 2622 > 2623 </span> 2624 2625 <span class="menu-drawer__shop-by-colour-name">Clear</span> 2626 </a> 2627 </li> 2628 2629 2630 <li> 2631 <a 2632 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Gold&sort_by=best-selling&grid=default" 2633 class="menu-drawer__shop-by-colour-link" 2634 aria-label="Gold" 2635 > 2636 2637 <span class="menu-drawer__shop-by-colour-swatch"> 2638 <img 2639 src="//www.tnbl.co.uk/cdn/shop/files/Gold.png?v=1770112826&width=200" 2640 alt="" 2641 width="24" 2642 height="24" 2643 loading="lazy" 2644 > 2645 </span> 2646 2647 <span class="menu-drawer__shop-by-colour-name">Gold</span> 2648 </a> 2649 </li> 2650 2651 2652 <li> 2653 <a 2654 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Green&sort_by=best-selling&grid=default" 2655 class="menu-drawer__shop-by-colour-link" 2656 aria-label="Green" 2657 > 2658
2659 <span class="menu-drawer__shop-by-colour-swatch"> 2660 <img 2661 src="//www.tnbl.co.uk/cdn/shop/files/Green.png?v=1770112825&width=200" 2662 alt="" 2663 width="24" 2664 height="24" 2665 loading="lazy" 2666 > 2667 </span> 2668 2669 <span class="menu-drawer__shop-by-colour-name">Green</span> 2670 </a> 2671 </li> 2672 2673 2674 <li> 2675 <a 2676 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Grey&sort_by=best-selling&grid=default" 2677 class="menu-drawer__shop-by-colour-link" 2678 aria-label="Grey" 2679 > 2680 2681 <span class="menu-drawer__shop-by-colour-swatch"> 2682 <img 2683 src="//www.tnbl.co.uk/cdn/shop/files/Grey.png?v=1770112826&width=200" 2684 alt="" 2685 width="24" 2686 height="24" 2687 loading="lazy" 2688 > 2689 </span> 2690 2691 <span class="menu-drawer__shop-by-colour-name">Grey</span> 2692 </a> 2693 </li> 2694 2695 2696 <li> 2697 <a 2698 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Natural&sort_by=best-selling&grid=default" 2699 class="menu-drawer__shop-by-colour-link" 2700 aria-label="Natural" 2701 > 2702 2703 <span class="menu-drawer__shop-by-colour-swatch"> 2704 <img 2705 src="//www.tnbl.co.uk/cdn/shop/files/Natural.png?v=1770112826&width=200" 2706 alt="" 2707 width="24" 2708 height="24" 2709 loading="lazy" 2710 > 2711 </span> 2712 2713 <span class="menu-drawer__shop-by-colour-name">Natural</span> 2714 </a> 2715 </li> 2716 2717 2718 <li> 2719 <a 2720 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Nude&sort_by=best-selling&grid=default" 2721 class="menu-drawer__shop-by-colour-link" 2722 aria-label="Nude" 2723 > 2724 2725 <span class="menu-drawer__shop-by-colour-swatch"> 2726 <img 2727 src="//www.tnbl.co.uk/cdn/shop/files/Nude.png?v=1770112825&width=200" 2728 alt="" 2729 width="24" 2730 height="24" 2731 loading="lazy" 2732 > 2733 </span> 2734
2735 <span class="menu-drawer__shop-by-colour-name">Nude</span> 2736 </a> 2737 </li> 2738 2739 2740 <li> 2741 <a 2742 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Orange&sort_by=best-selling&grid=default" 2743 class="menu-drawer__shop-by-colour-link" 2744 aria-label="Orange" 2745 > 2746 2747 <span class="menu-drawer__shop-by-colour-swatch"> 2748 <img 2749 src="//www.tnbl.co.uk/cdn/shop/files/Orange.png?v=1770112825&width=200" 2750 alt="" 2751 width="24" 2752 height="24" 2753 loading="lazy" 2754 > 2755 </span> 2756 2757 <span class="menu-drawer__shop-by-colour-name">Orange</span> 2758 </a> 2759 </li> 2760 2761 2762 <li> 2763 <a 2764 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Pink&sort_by=best-selling&grid=default" 2765 class="menu-drawer__shop-by-colour-link" 2766 aria-label="Pink" 2767 > 2768 2769 <span class="menu-drawer__shop-by-colour-swatch"> 2770 <img 2771 src="//www.tnbl.co.uk/cdn/shop/files/Pink.png?v=1770112826&width=200" 2772 alt="" 2773 width="24" 2774 height="24" 2775 loading="lazy" 2776 > 2777 </span> 2778 2779 <span class="menu-drawer__shop-by-colour-name">Pink</span> 2780 </a> 2781 </li> 2782 2783 2784 <li> 2785 <a 2786 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Purple&sort_by=best-selling&grid=default" 2787 class="menu-drawer__shop-by-colour-link" 2788 aria-label="Purple" 2789 > 2790 2791 <span class="menu-drawer__shop-by-colour-swatch"> 2792 <img 2793 src="//www.tnbl.co.uk/cdn/shop/files/Purple.png?v=1770112826&width=200" 2794 alt="" 2795 width="24" 2796 height="24" 2797 loading="lazy" 2798 > 2799 </span> 2800 2801 <span class="menu-drawer__shop-by-colour-name">Purple</span> 2802 </a> 2803 </li> 2804 2805 2806 <li> 2807 <a 2808 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Red&sort_by=best-selling&grid=default" 2809 class="menu-drawer__shop-by-colour-link" 2810 aria-label="Red" 2811 > 2812
2813 <span class="menu-drawer__shop-by-colour-swatch"> 2814 <img 2815 src="//www.tnbl.co.uk/cdn/shop/files/Red.png?v=1770112825&width=200" 2816 alt="" 2817 width="24" 2818 height="24" 2819 loading="lazy" 2820 > 2821 </span> 2822 2823 <span class="menu-drawer__shop-by-colour-name">Red</span> 2824 </a> 2825 </li> 2826 2827 2828 <li> 2829 <a 2830 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Silver&sort_by=best-selling&grid=default" 2831 class="menu-drawer__shop-by-colour-link" 2832 aria-label="Silver" 2833 > 2834 2835 <span class="menu-drawer__shop-by-colour-swatch"> 2836 <img 2837 src="//www.tnbl.co.uk/cdn/shop/files/Silver.png?v=1770112826&width=200" 2838 alt="" 2839 width="24" 2840 height="24" 2841 loading="lazy" 2842 > 2843 </span> 2844 2845 <span class="menu-drawer__shop-by-colour-name">Silver</span> 2846 </a> 2847 </li> 2848 2849 2850 <li> 2851 <a 2852 href="/collections/gel-nail-polish?filter.p.m.custom.colour=White&sort_by=best-selling&grid=default" 2853 class="menu-drawer__shop-by-colour-link" 2854 aria-label="White" 2855 > 2856 2857 <span class="menu-drawer__shop-by-colour-swatch"> 2858 <img 2859 src="//www.tnbl.co.uk/cdn/shop/files/White.png?v=1770112826&width=200" 2860 alt="" 2861 width="24" 2862 height="24" 2863 loading="lazy" 2864 > 2865 </span> 2866 2867 <span class="menu-drawer__shop-by-colour-name">White</span> 2868 </a> 2869 </li> 2870 2871 2872 <li> 2873 <a 2874 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Yellow&sort_by=best-selling&grid=default" 2875 class="menu-drawer__shop-by-colour-link" 2876 aria-label="Yellow" 2877 > 2878 2879 <span class="menu-drawer__shop-by-colour-swatch"> 2880 <img 2881 src="//www.tnbl.co.uk/cdn/shop/files/Yellow.png?v=1770112824&width=200" 2882 alt="" 2883 width="24" 2884 height="24" 2885 loading="lazy" 2886 > 2887 </span> 2888
2889 <span class="menu-drawer__shop-by-colour-name">Yellow</span> 2890 </a> 2891 </li> 2892 2893 </ul> 2894 </div> 2895 2896 2897 2898 <ul 2899 class="menu-drawer__menu menu-drawer__menu--childlist" 2900 role="list" 2901 tabindex="-1" 2902 > 2903 <li 2904 class=" 2905 menu-drawer__list-item 2906 menu-drawer__list-item--flat 2907 " 2908 > 2909 2910<a 2911 id="HeaderDrawer-nails-nail-extensions" 2912 href="/collections/nail-extensions" 2913 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 2914 > 2915 <span class="menu-drawer__menu-item-text wrap-text">Nail Extensions</span> 2916 </a> 2917 2918 <ul 2919 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 2920 role="list" 2921 tabindex="-1" 2922 ><li 2923 class="menu-drawer__list-item" 2924 style="--menu-drawer-animation-index: 1;" 2925 > 2926 <a 2927 id="HeaderDrawer-nails-nail-extensions-acrylic-powder" 2928 href="/collections/nail-extensions-acrylic-powder" 2929 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2930 2931 > 2932 2933 <span class="menu-drawer__menu-item-text wrap-text">Acrylic Powder</span> 2934 </a> 2935 </li><li 2936 class="menu-drawer__list-item" 2937 style="--menu-drawer-animation-index: 2;" 2938 > 2939 <a 2940 id="HeaderDrawer-nails-nail-extensions-acrylic-monomer-liquids" 2941 href="/collections/nail-extensions-acrylic-monomer-liquids" 2942 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2943 2944 > 2945 2946 <span class="menu-drawer__menu-item-text wrap-text">Acrylic Monomer & Liquids</span> 2947 </a> 2948 </li><li 2949 class="menu-drawer__list-item" 2950 style="--menu-drawer-animation-index: 3;" 2951 > 2952 <a 2953 id="HeaderDrawer-nails-nail-extensions-acrylic-gel-brushes" 2954 href="/collections/nail-extensions-acrylic-gel-brushes" 2955 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2956 2957 > 2958
2959 <span class="menu-drawer__menu-item-text wrap-text">Acrylic Gel & Brushes</span> 2960 </a> 2961 </li><li 2962 class="menu-drawer__list-item" 2963 style="--menu-drawer-animation-index: 4;" 2964 > 2965 <a 2966 id="HeaderDrawer-nails-nail-extensions-soft-gel-extensions" 2967 href="/collections/nail-extensions-soft-gel-extensions" 2968 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2969 2970 > 2971 2972 <span class="menu-drawer__menu-item-text wrap-text">Soft Gel Extensions</span> 2973 </a> 2974 </li><li 2975 class="menu-drawer__list-item" 2976 style="--menu-drawer-animation-index: 5;" 2977 > 2978 <a 2979 id="HeaderDrawer-nails-nail-extensions-dipping-powder" 2980 href="/collections/nail-extensions-dip-powder" 2981 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2982 2983 > 2984 2985 <span class="menu-drawer__menu-item-text wrap-text">Dipping Powder</span> 2986 </a> 2987 </li><li 2988 class="menu-drawer__list-item" 2989 style="--menu-drawer-animation-index: 6;" 2990 > 2991 <a 2992 id="HeaderDrawer-nails-nail-extensions-nail-prep" 2993 href="/collections/nail-extensions-nail-prep" 2994 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 2995 2996 > 2997 2998 <span class="menu-drawer__menu-item-text wrap-text">Nail Prep</span> 2999 </a> 3000 </li><li 3001 class="menu-drawer__list-item" 3002 style="--menu-drawer-animation-index: 7;" 3003 > 3004 <a 3005 id="HeaderDrawer-nails-nail-extensions-nail-tips" 3006 href="/collections/nail-extensions-nail-tips" 3007 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3008 3009 > 3010 3011 <span class="menu-drawer__menu-item-text wrap-text">Nail Tips</span> 3012 </a> 3013 </li><li 3014 class="menu-drawer__list-item" 3015 style="--menu-drawer-animation-index: 8;" 3016 > 3017 <a 3018 id="HeaderDrawer-nails-nail-extensions-nail-glue" 3019 href="/collections/nail-extensions-nail-glue" 3020 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3021 3022 > 3023
3024 <span class="menu-drawer__menu-item-text wrap-text">Nail Glue</span> 3025 </a> 3026 </li></ul></li><li 3027 class=" 3028 menu-drawer__list-item 3029 menu-drawer__list-item--flat 3030 " 3031 > 3032 3033<a 3034 id="HeaderDrawer-nails-gel-nail-polish" 3035 href="/collections/gel-nail-polish" 3036 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 3037 > 3038 <span class="menu-drawer__menu-item-text wrap-text">Gel & Nail Polish</span> 3039 </a> 3040 3041 <ul 3042 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 3043 role="list" 3044 tabindex="-1" 3045 ><li 3046 class="menu-drawer__list-item" 3047 style="--menu-drawer-animation-index: 1;" 3048 > 3049 <a 3050 id="HeaderDrawer-nails-gel-nail-polish-nail-polish" 3051 href="/collections/nail-polish" 3052 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3053 3054 > 3055 3056 <span class="menu-drawer__menu-item-text wrap-text">Nail Polish</span> 3057 </a> 3058 </li><li 3059 class="menu-drawer__list-item" 3060 style="--menu-drawer-animation-index: 2;" 3061 > 3062 <a 3063 id="HeaderDrawer-nails-gel-nail-polish-hema-tpo-free-gel-polish" 3064 href="/collections/https-www-tnbl-co-uk-collections-hema-tpo-free-gel-polish" 3065 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3066 3067 > 3068 3069 <span class="menu-drawer__menu-item-text wrap-text">Hema + TPO Free Gel Polish</span> 3070 </a> 3071 </li><li 3072 class="menu-drawer__list-item" 3073 style="--menu-drawer-animation-index: 3;" 3074 > 3075 <a 3076 id="HeaderDrawer-nails-gel-nail-polish-gel-polish" 3077 href="/collections/gel-nail-polish-gel-polish" 3078 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3079 3080 > 3081 3082 <span class="menu-drawer__menu-item-text wrap-text">Gel Polish</span> 3083 </a> 3084 </li><li 3085 class="menu-drawer__list-item" 3086 style="--menu-drawer-animation-index: 4;" 3087 > 3088 <a 3089 id="HeaderDrawer-nails-gel-nail-polish-builder-gel-biab" 3090 href="/collections/builder
3090-gel-biab" 3091 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3092 3093 > 3094 3095 <span class="menu-drawer__menu-item-text wrap-text">Builder Gel (BIAB)</span> 3096 </a> 3097 </li><li 3098 class="menu-drawer__list-item" 3099 style="--menu-drawer-animation-index: 5;" 3100 > 3101 <a 3102 id="HeaderDrawer-nails-gel-nail-polish-hard-gel" 3103 href="/collections/gel-nail-polish-hard-gel" 3104 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3105 3106 > 3107 3108 <span class="menu-drawer__menu-item-text wrap-text">Hard Gel</span> 3109 </a> 3110 </li><li 3111 class="menu-drawer__list-item" 3112 style="--menu-drawer-animation-index: 6;" 3113 > 3114 <a 3115 id="HeaderDrawer-nails-gel-nail-polish-poly-gel" 3116 href="/collections/poly-gel" 3117 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3118 3119 > 3120 3121 <span class="menu-drawer__menu-item-text wrap-text">Poly Gel</span> 3122 </a> 3123 </li><li 3124 class="menu-drawer__list-item" 3125 style="--menu-drawer-animation-index: 7;" 3126 > 3127 <a 3128 id="HeaderDrawer-nails-gel-nail-polish-gel-essentials" 3129 href="/collections/gel-nail-polish-gel-essentials" 3130 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3131 3132 > 3133 3134 <span class="menu-drawer__menu-item-text wrap-text">Gel Essentials</span> 3135 </a> 3136 </li><li 3137 class="menu-drawer__list-item" 3138 style="--menu-drawer-animation-index: 8;" 3139 > 3140 <a 3141 id="HeaderDrawer-nails-gel-nail-polish-nail-polish-essentials" 3142 href="/collections/nail-polish-essentials" 3143 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3144 3145 > 3146 3147 <span class="menu-drawer__menu-item-text wrap-text">Nail Polish Essentials</span> 3148 </a> 3149 </li><li 3150 class="menu-drawer__list-item" 3151 style="--menu-drawer-animation-index: 9;" 3152 > 3153 <a 3154 id="HeaderDrawer-nails-gel-nail-polish-gel-art" 3155 href="/collections/gel-nail-polish-gel-art" 3156 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3157 3158 > 3159
3160 <span class="menu-drawer__menu-item-text wrap-text">Gel Art</span> 3161 </a> 3162 </li></ul></li><li 3163 class=" 3164 menu-drawer__list-item 3165 menu-drawer__list-item--flat 3166 " 3167 > 3168 3169<a 3170 id="HeaderDrawer-nails-nail-art" 3171 href="/collections/nail-art" 3172 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 3173 > 3174 <span class="menu-drawer__menu-item-text wrap-text">Nail Art</span> 3175 </a> 3176 3177 <ul 3178 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 3179 role="list" 3180 tabindex="-1" 3181 ><li 3182 class="menu-drawer__list-item" 3183 style="--menu-drawer-animation-index: 1;" 3184 > 3185 <a 3186 id="HeaderDrawer-nails-nail-art-nail-art-brushes-tools" 3187 href="/collections/nail-art-brushes-tools" 3188 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3189 3190 > 3191 3192 <span class="menu-drawer__menu-item-text wrap-text">Nail Art Brushes & Tools</span> 3193 </a> 3194 </li><li 3195 class="menu-drawer__list-item" 3196 style="--menu-drawer-animation-index: 2;" 3197 > 3198 <a 3199 id="HeaderDrawer-nails-nail-art-chrome-powders-pigments" 3200 href="/collections/nail-art-chrome-powders-pigments" 3201 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3202 3203 > 3204 3205 <span class="menu-drawer__menu-item-text wrap-text">Chrome Powders & Pigments</span> 3206 </a> 3207 </li><li 3208 class="menu-drawer__list-item" 3209 style="--menu-drawer-animation-index: 3;" 3210 > 3211 <a 3212 id="HeaderDrawer-nails-nail-art-crystals-rhinestones" 3213 href="/collections/nail-art-crystal-rhinestones" 3214 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3215 3216 > 3217 3218 <span class="menu-drawer__menu-item-text wrap-text">Crystals & Rhinestones</span> 3219 </a> 3220 </li><li 3221 class="menu-drawer__list-item" 3222 style="--menu-drawer-animation-index: 4;" 3223 > 3224 <a 3225 id="HeaderDrawer-nails-nail-art-glitters" 3226 href="/collections/nail-art-glitters" 3227 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3228 3229 > 3230
3231 <span class="menu-drawer__menu-item-text wrap-text">Glitters</span> 3232 </a> 3233 </li><li 3234 class="menu-drawer__list-item" 3235 style="--menu-drawer-animation-index: 5;" 3236 > 3237 <a 3238 id="HeaderDrawer-nails-nail-art-glitter-shapes" 3239 href="/collections/nail-art-glitter-shapes" 3240 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3241 3242 > 3243 3244 <span class="menu-drawer__menu-item-text wrap-text">Glitter Shapes</span> 3245 </a> 3246 </li><li 3247 class="menu-drawer__list-item" 3248 style="--menu-drawer-animation-index: 6;" 3249 > 3250 <a 3251 id="HeaderDrawer-nails-nail-art-stickers" 3252 href="/collections/nail-art-stickers" 3253 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3254 3255 > 3256 3257 <span class="menu-drawer__menu-item-text wrap-text">Stickers</span> 3258 </a> 3259 </li><li 3260 class="menu-drawer__list-item" 3261 style="--menu-drawer-animation-index: 7;" 3262 > 3263 <a 3264 id="HeaderDrawer-nails-nail-art-charms-decals" 3265 href="/collections/nail-art-charms-decals" 3266 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3267 3268 > 3269 3270 <span class="menu-drawer__menu-item-text wrap-text">Charms & Decals</span> 3271 </a> 3272 </li><li 3273 class="menu-drawer__list-item" 3274 style="--menu-drawer-animation-index: 8;" 3275 > 3276 <a 3277 id="HeaderDrawer-nails-nail-art-angel-paper-transfer-foils" 3278 href="/collections/nail-art-angel-paper-transfer-foils" 3279 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3280 3281 > 3282 3283 <span class="menu-drawer__menu-item-text wrap-text">Angel Paper & Transfer Foils</span> 3284 </a> 3285 </li><li 3286 class="menu-drawer__list-item" 3287 style="--menu-drawer-animation-index: 9;" 3288 > 3289 <a 3290 id="HeaderDrawer-nails-nail-art-flakes" 3291 href="/collections/nail-art-flakes" 3292 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3293 3294 > 3295
3296 <span class="menu-drawer__menu-item-text wrap-text">Flakes</span> 3297 </a> 3298 </li><li 3299 class="menu-drawer__list-item" 3300 style="--menu-drawer-animation-index: 10;" 3301 > 3302 <a 3303 id="HeaderDrawer-nails-nail-art-dried-flowers" 3304 href="/collections/nail-art-dried-flowers" 3305 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3306 3307 > 3308 3309 <span class="menu-drawer__menu-item-text wrap-text">Dried Flowers</span> 3310 </a> 3311 </li><li 3312 class="menu-drawer__list-item" 3313 style="--menu-drawer-animation-index: 11;" 3314 > 3315 <a 3316 id="HeaderDrawer-nails-nail-art-fimo" 3317 href="/collections/nail-art-fimo" 3318 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3319 3320 > 3321 3322 <span class="menu-drawer__menu-item-text wrap-text">Fimo</span> 3323 </a> 3324 </li><li 3325 class="menu-drawer__list-item" 3326 style="--menu-drawer-animation-index: 12;" 3327 > 3328 <a 3329 id="HeaderDrawer-nails-nail-art-chains" 3330 href="/collections/nail-art-chains" 3331 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3332 3333 > 3334 3335 <span class="menu-drawer__menu-item-text wrap-text">Chains</span> 3336 </a> 3337 </li><li 3338 class="menu-drawer__list-item" 3339 style="--menu-drawer-animation-index: 13;" 3340 > 3341 <a 3342 id="HeaderDrawer-nails-nail-art-netting-lace" 3343 href="/collections/nail-art-netting-lace" 3344 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3345 3346 > 3347 3348 <span class="menu-drawer__menu-item-text wrap-text">Netting & Lace</span> 3349 </a> 3350 </li><li 3351 class="menu-drawer__list-item" 3352 style="--menu-drawer-animation-index: 14;" 3353 > 3354 <a 3355 id="HeaderDrawer-nails-nail-art-micro-beads" 3356 href="/collections/nail-art-micro-beads" 3357 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3358 3359 > 3360
3361 <span class="menu-drawer__menu-item-text wrap-text">Micro Beads</span> 3362 </a> 3363 </li><li 3364 class="menu-drawer__list-item" 3365 style="--menu-drawer-animation-index: 15;" 3366 > 3367 <a 3368 id="HeaderDrawer-nails-nail-art-nail-art-stripers-paint" 3369 href="/collections/nail-art-stripers-paint" 3370 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3371 3372 > 3373 3374 <span class="menu-drawer__menu-item-text wrap-text">Nail Art Stripers & Paint</span> 3375 </a> 3376 </li><li 3377 class="menu-drawer__list-item" 3378 style="--menu-drawer-animation-index: 16;" 3379 > 3380 <a 3381 id="HeaderDrawer-nails-nail-art-other" 3382 href="/collections/nail-art-other" 3383 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3384 3385 > 3386 3387 <span class="menu-drawer__menu-item-text wrap-text">Other</span> 3388 </a> 3389 </li></ul></li><li 3390 class=" 3391 menu-drawer__list-item 3392 menu-drawer__list-item--flat 3393 " 3394 > 3395 3396<a 3397 id="HeaderDrawer-nails-nail-tools-accessories" 3398 href="/collections/nail-tools-accessories" 3399 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 3400 > 3401 <span class="menu-drawer__menu-item-text wrap-text">Nail Tools & Accessories</span> 3402 </a> 3403 3404 <ul 3405 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 3406 role="list" 3407 tabindex="-1" 3408 ><li 3409 class="menu-drawer__list-item" 3410 style="--menu-drawer-animation-index: 1;" 3411 > 3412 <a 3413 id="HeaderDrawer-nails-nail-tools-accessories-brushes" 3414 href="/collections/nail-tools-accessories-brushes" 3415 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3416 3417 > 3418 3419 <span class="menu-drawer__menu-item-text wrap-text">Brushes</span> 3420 </a> 3421 </li><li 3422 class="menu-drawer__list-item" 3423 style="--menu-drawer-animation-index: 2;" 3424 > 3425 <a 3426 id="HeaderDrawer-nails-nail-tools-accessories-cuticle-pushers-nippers" 3427 href="/collections/cuticle-pushers-nippers" 3428 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3429 3430 > 3431
3432 <span class="menu-drawer__menu-item-text wrap-text">Cuticle Pushers & Nippers</span> 3433 </a> 3434 </li><li 3435 class="menu-drawer__list-item" 3436 style="--menu-drawer-animation-index: 3;" 3437 > 3438 <a 3439 id="HeaderDrawer-nails-nail-tools-accessories-tip-cutters-nail-clippers" 3440 href="/collections/tip-cutters-nail-clippers" 3441 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3442 3443 > 3444 3445 <span class="menu-drawer__menu-item-text wrap-text">Tip Cutters & Nail Clippers</span> 3446 </a> 3447 </li><li 3448 class="menu-drawer__list-item" 3449 style="--menu-drawer-animation-index: 4;" 3450 > 3451 <a 3452 id="HeaderDrawer-nails-nail-tools-accessories-nail-files-buffers" 3453 href="/collections/nail-files-buffers" 3454 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3455 3456 > 3457 3458 <span class="menu-drawer__menu-item-text wrap-text">Nail Files & Buffers</span> 3459 </a> 3460 </li><li 3461 class="menu-drawer__list-item" 3462 style="--menu-drawer-animation-index: 5;" 3463 > 3464 <a 3465 id="HeaderDrawer-nails-nail-tools-accessories-drill-bits-accessories" 3466 href="/collections/drill-bits-accessories" 3467 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3468 3469 > 3470 3471 <span class="menu-drawer__menu-item-text wrap-text">Drill Bits & Accessories</span> 3472 </a> 3473 </li><li 3474 class="menu-drawer__list-item" 3475 style="--menu-drawer-animation-index: 6;" 3476 > 3477 <a 3478 id="HeaderDrawer-nails-nail-tools-accessories-implements" 3479 href="/collections/nail-tools-accessories-implements" 3480 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3481 3482 > 3483 3484 <span class="menu-drawer__menu-item-text wrap-text">Implements</span> 3485 </a> 3486 </li><li 3487 class="menu-drawer__list-item" 3488 style="--menu-drawer-animation-index: 7;" 3489 > 3490 <a 3491 id="HeaderDrawer-nails-nail-tools-accessories-dappen-dishes" 3492 href="/collections/dappen-dishes" 3493 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3494 3495 > 3496
3497 <span class="menu-drawer__menu-item-text wrap-text">Dappen Dishes</span> 3498 </a> 3499 </li><li 3500 class="menu-drawer__list-item" 3501 style="--menu-drawer-animation-index: 8;" 3502 > 3503 <a 3504 id="HeaderDrawer-nails-nail-tools-accessories-storage" 3505 href="/collections/nail-tools-accessories-storage" 3506 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3507 3508 > 3509 3510 <span class="menu-drawer__menu-item-text wrap-text">Storage</span> 3511 </a> 3512 </li><li 3513 class="menu-drawer__list-item" 3514 style="--menu-drawer-animation-index: 9;" 3515 > 3516 <a 3517 id="HeaderDrawer-nails-nail-tools-accessories-display-swatches" 3518 href="/collections/displays-swatches" 3519 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3520 3521 > 3522 3523 <span class="menu-drawer__menu-item-text wrap-text">Display & Swatches</span> 3524 </a> 3525 </li><li 3526 class="menu-drawer__list-item" 3527 style="--menu-drawer-animation-index: 10;" 3528 > 3529 <a 3530 id="HeaderDrawer-nails-nail-tools-accessories-practice-hands-fingers" 3531 href="/collections/practise-hands-fingers" 3532 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3533 3534 > 3535 3536 <span class="menu-drawer__menu-item-text wrap-text">Practice Hands & Fingers</span> 3537 </a> 3538 </li><li 3539 class="menu-drawer__list-item" 3540 style="--menu-drawer-animation-index: 11;" 3541 > 3542 <a 3543 id="HeaderDrawer-nails-nail-tools-accessories-soak-off" 3544 href="/collections/nail-tools-accessories-soak-off" 3545 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3546 3547 > 3548 3549 <span class="menu-drawer__menu-item-text wrap-text">Soak Off</span> 3550 </a> 3551 </li></ul></li><li 3552 class=" 3553 menu-drawer__list-item 3554 menu-drawer__list-item--flat 3555 " 3556 > 3557 3558<a 3559 id="HeaderDrawer-nails-salon-care-hygiene" 3560 href="/collections/salon-essentials-hygiene" 3561 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 3562 >
3563 <span class="menu-drawer__menu-item-text wrap-text">Salon Care & Hygiene</span> 3564 </a> 3565 3566 <ul 3567 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 3568 role="list" 3569 tabindex="-1" 3570 ><li 3571 class="menu-drawer__list-item" 3572 style="--menu-drawer-animation-index: 1;" 3573 > 3574 <a 3575 id="HeaderDrawer-nails-salon-care-hygiene-nail-wipes" 3576 href="/collections/hygiene-nail-wipes" 3577 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3578 3579 > 3580 3581 <span class="menu-drawer__menu-item-text wrap-text">Nail Wipes</span> 3582 </a> 3583 </li><li 3584 class="menu-drawer__list-item" 3585 style="--menu-drawer-animation-index: 2;" 3586 > 3587 <a 3588 id="HeaderDrawer-nails-salon-care-hygiene-face-mask-gloves" 3589 href="/collections/hygiene-face-masks-gloves" 3590 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3591 3592 > 3593 3594 <span class="menu-drawer__menu-item-text wrap-text">Face Mask & Gloves</span> 3595 </a> 3596 </li><li 3597 class="menu-drawer__list-item" 3598 style="--menu-drawer-animation-index: 3;" 3599 > 3600 <a 3601 id="HeaderDrawer-nails-salon-care-hygiene-table-mats" 3602 href="/collections/hygiene-table-mats" 3603 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3604 3605 > 3606 3607 <span class="menu-drawer__menu-item-text wrap-text">Table Mats</span> 3608 </a> 3609 </li><li 3610 class="menu-drawer__list-item" 3611 style="--menu-drawer-animation-index: 4;" 3612 > 3613 <a 3614 id="HeaderDrawer-nails-salon-care-hygiene-sanitisers-disinfectants" 3615 href="/collections/hygiene-sanitizers-disinfectants" 3616 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3617 3618 > 3619 3620 <span class="menu-drawer__menu-item-text wrap-text">Sanitisers & Disinfectants</span> 3621 </a> 3622 </li><li 3623 class="menu-drawer__list-item" 3624 style="--menu-drawer-animation-index: 5;" 3625 > 3626 <a 3627 id="HeaderDrawer-nails-salon-care-hygiene-empty-bottles-pots"
3628 href="/collections/hygiene-empty-bottles-accessories" 3629 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3630 3631 > 3632 3633 <span class="menu-drawer__menu-item-text wrap-text">Empty Bottles & Pots</span> 3634 </a> 3635 </li><li 3636 class="menu-drawer__list-item" 3637 style="--menu-drawer-animation-index: 6;" 3638 > 3639 <a 3640 id="HeaderDrawer-nails-salon-care-hygiene-miscellaneous" 3641 href="/collections/nail-kits-misc" 3642 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3643 3644 > 3645 3646 <span class="menu-drawer__menu-item-text wrap-text">Miscellaneous</span> 3647 </a> 3648 </li></ul></li><li 3649 class=" 3650 menu-drawer__list-item 3651 menu-drawer__list-item--flat 3652 " 3653 > 3654 3655<a 3656 id="HeaderDrawer-nails-nail-kits" 3657 href="/collections/nail-kits" 3658 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 3659 > 3660 <span class="menu-drawer__menu-item-text wrap-text">Nail Kits</span> 3661 </a> 3662 3663 <ul 3664 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 3665 role="list" 3666 tabindex="-1" 3667 ><li 3668 class="menu-drawer__list-item" 3669 style="--menu-drawer-animation-index: 1;" 3670 > 3671 <a 3672 id="HeaderDrawer-nails-nail-kits-acrylic-nail-kits" 3673 href="/collections/nail-kits-acrylic-nail-kits" 3674 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3675 3676 > 3677 3678 <span class="menu-drawer__menu-item-text wrap-text">Acrylic Nail Kits</span> 3679 </a> 3680 </li><li 3681 class="menu-drawer__list-item" 3682 style="--menu-drawer-animation-index: 2;" 3683 > 3684 <a 3685 id="HeaderDrawer-nails-nail-kits-gel-nail-kits" 3686 href="/collections/nail-kits-gel-nail-kits" 3687 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3688 3689 > 3690 3691 <span class="menu-drawer__menu-item-text wrap-text">Gel Nail Kits</span> 3692 </a> 3693 </li><li 3694 class="menu-drawer__list-item" 3695 style="--menu-drawer-animation-index: 3;" 3696 > 3697 <a 3698 id="HeaderDrawer-nails-nail-kits-nail-art-kits" 3699 href="/collections/nail-kits-nail-art-kits" 3700 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3701 3702 > 3703
3704 <span class="menu-drawer__menu-item-text wrap-text">Nail Art Kits</span> 3705 </a> 3706 </li><li 3707 class="menu-drawer__list-item" 3708 style="--menu-drawer-animation-index: 4;" 3709 > 3710 <a 3711 id="HeaderDrawer-nails-nail-kits-soft-gel-extensions" 3712 href="/collections/nail-extensions-soft-gel-extensions" 3713 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3714 3715 > 3716 3717 <span class="menu-drawer__menu-item-text wrap-text">Soft Gel Extensions</span> 3718 </a> 3719 </li><li 3720 class="menu-drawer__list-item" 3721 style="--menu-drawer-animation-index: 5;" 3722 > 3723 <a 3724 id="HeaderDrawer-nails-nail-kits-dip-powder-kits" 3725 href="/collections/nail-extensions-dip-powder" 3726 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3727 3728 > 3729 3730 <span class="menu-drawer__menu-item-text wrap-text">Dip Powder Kits</span> 3731 </a> 3732 </li><li 3733 class="menu-drawer__list-item" 3734 style="--menu-drawer-animation-index: 6;" 3735 > 3736 <a 3737 id="HeaderDrawer-nails-nail-kits-misc" 3738 href="/collections/nail-kits-misc" 3739 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3740 3741 > 3742 3743 <span class="menu-drawer__menu-item-text wrap-text">Misc</span> 3744 </a> 3745 </li></ul></li><li 3746 class=" 3747 menu-drawer__list-item 3748 menu-drawer__list-item--flat 3749 " 3750 > 3751 3752<a 3753 id="HeaderDrawer-nails-manicure-pedicure" 3754 href="/collections/manicure-pedicure" 3755 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 3756 > 3757 <span class="menu-drawer__menu-item-text wrap-text">Manicure & Pedicure</span> 3758 </a> 3759 3760 <ul 3761 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 3762 role="list" 3763 tabindex="-1" 3764 ><li 3765 class="menu-drawer__list-item" 3766 style="--menu-drawer-animation-index: 1;" 3767 > 3768 <a 3769 id="HeaderDrawer-nails-manicure-pedicure-nail-cuticle-care" 3770 href="/collections/manicure-pedicure-nail-cuticle-care" 3771 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3772 3773 > 3774
3775 <span class="menu-drawer__menu-item-text wrap-text">Nail & Cuticle Care</span> 3776 </a> 3777 </li><li 3778 class="menu-drawer__list-item" 3779 style="--menu-drawer-animation-index: 2;" 3780 > 3781 <a 3782 id="HeaderDrawer-nails-manicure-pedicure-moisturising-lotions-creams" 3783 href="/collections/manicure-pedicure-moisturising-lotions-creams" 3784 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3785 3786 > 3787 3788 <span class="menu-drawer__menu-item-text wrap-text">Moisturising Lotions & Creams</span> 3789 </a> 3790 </li><li 3791 class="menu-drawer__list-item" 3792 style="--menu-drawer-animation-index: 3;" 3793 > 3794 <a 3795 id="HeaderDrawer-nails-manicure-pedicure-soaks-scrubs" 3796 href="/collections/manicure-pedicure-soaks-scrubs" 3797 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3798 3799 > 3800 3801 <span class="menu-drawer__menu-item-text wrap-text">Soaks & Scrubs</span> 3802 </a> 3803 </li><li 3804 class="menu-drawer__list-item" 3805 style="--menu-drawer-animation-index: 4;" 3806 > 3807 <a 3808 id="HeaderDrawer-nails-manicure-pedicure-masks" 3809 href="/collections/manicure-pedicure-masks" 3810 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3811 3812 > 3813 3814 <span class="menu-drawer__menu-item-text wrap-text">Masks</span> 3815 </a> 3816 </li><li 3817 class="menu-drawer__list-item" 3818 style="--menu-drawer-animation-index: 5;" 3819 > 3820 <a 3821 id="HeaderDrawer-nails-manicure-pedicure-foot-files-accessories" 3822 href="/collections/manicure-pedicure-foot-file-accesories" 3823 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3824 3825 > 3826 3827 <span class="menu-drawer__menu-item-text wrap-text">Foot Files & Accessories</span> 3828 </a> 3829 </li><li 3830 class="menu-drawer__list-item" 3831 style="--menu-drawer-animation-index: 6;" 3832 > 3833 <a 3834 id="HeaderDrawer-nails-manicure-pedicure-bowls-accessories" 3835 href="/collections/manicure-pedicure-bowls-accesories" 3836 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3837 3838 > 3839
3840 <span class="menu-drawer__menu-item-text wrap-text">Bowls & Accessories</span> 3841 </a> 3842 </li><li 3843 class="menu-drawer__list-item" 3844 style="--menu-drawer-animation-index: 7;" 3845 > 3846 <a 3847 id="HeaderDrawer-nails-manicure-pedicure-toe-separators-slippers" 3848 href="/collections/manicure-pedicure-toe-seperators-slippers" 3849 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3850 3851 > 3852 3853 <span class="menu-drawer__menu-item-text wrap-text">Toe Separators & Slippers</span> 3854 </a> 3855 </li></ul></li><li 3856 class=" 3857 menu-drawer__list-item 3858 menu-drawer__list-item--flat 3859 " 3860 > 3861 3862<a 3863 id="HeaderDrawer-nails-miscellaneous" 3864 href="/collections/nails-misc" 3865 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 3866 > 3867 <span class="menu-drawer__menu-item-text wrap-text">Miscellaneous</span> 3868 </a> 3869 3870 <ul 3871 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 3872 role="list" 3873 tabindex="-1" 3874 ><li 3875 class="menu-drawer__list-item" 3876 style="--menu-drawer-animation-index: 1;" 3877 > 3878 <a 3879 id="HeaderDrawer-nails-miscellaneous-salon-posters" 3880 href="/collections/misc-salon-posters" 3881 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3882 3883 > 3884 3885 <span class="menu-drawer__menu-item-text wrap-text">Salon Posters</span> 3886 </a> 3887 </li></ul></li></ul> 3888 3889 </div> 3890 </div> 3891 </details></li> 3892 <li 3893 class="menu-drawer__list-item" 3894 style="--menu-drawer-animation-index: 4;" 3895 ><details 3896 id="Details-menu-drawer-menu-item-4" 3897 class="menu-drawer__menu-container" 3898 > 3899 <summary 3900 id="HeaderDrawer-beauty" 3901 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 3902 on:click="header-drawer/open" 3903 > 3904 <span class="menu-drawer__menu-item-text wrap-text">Beauty</span> 3905 <span class="svg-wrapper icon-caret icon-caret--forward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 3906 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 3907</svg> 3908</span> 3909 </summary> 3910 <div 3911 id="link-beauty" 3912 class="menu-drawer__submenu has-submenu gradient motion-reduce" 3913 tabindex="-1" 3914 style="--menu-drawer-animation-index: 4;" 3915 > 3916 <div class="menu-drawer__inner-submenu"> 3917 <div class="menu-drawer__nav-buttons"> 3918 <button 3919 class="button menu-drawer__back-button focus-inset" 3920 aria-expanded="true" 3921 on:click="header-drawer/back" 3922 aria-label="Back" 3923 >
3924 <span class="svg-wrapper icon-caret icon-caret--backward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 3925 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 3926</svg> 3927</span> 3928 <span class="menu-drawer__menu-item-text wrap-text">Beauty</span> 3929 </button> 3930 <button 3931 class="button button-unstyled close-button menu-drawer__close-button" 3932 type="button" 3933 aria-label="Close" 3934 on:click="header-drawer/close" 3935 > 3936 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 3937 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 3938 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 3939</svg> 3940</span> 3941 </button> 3942 </div> 3943 3944 3945 <ul 3946 class="menu-drawer__menu menu-drawer__menu--childlist" 3947 role="list" 3948 tabindex="-1" 3949 > 3950 <li 3951 class=" 3952 menu-drawer__list-item 3953 menu-drawer__list-item--flat 3954 " 3955 > 3956 3957<a 3958 id="HeaderDrawer-beauty-beauty" 3959 href="/collections/beauty" 3960 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 3961 > 3962 <span class="menu-drawer__menu-item-text wrap-text">Beauty</span> 3963 </a> 3964 3965 <ul 3966 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 3967 role="list" 3968 tabindex="-1" 3969 ><li 3970 class="menu-drawer__list-item" 3971 style="--menu-drawer-animation-index: 1;" 3972 > 3973 <a 3974 id="HeaderDrawer-beauty-beauty-body" 3975 href="/collections/body" 3976 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3977 3978 > 3979 3980 <span class="menu-drawer__menu-item-text wrap-text">Body</span> 3981 </a> 3982 </li><li 3983 class="menu-drawer__list-item" 3984 style="--menu-drawer-animation-index: 2;" 3985 > 3986 <a 3987 id="HeaderDrawer-beauty-beauty-eyebrows" 3988 href="/collections/eyebrows" 3989 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 3990 3991 > 3992
3993 <span class="menu-drawer__menu-item-text wrap-text">Eyebrows</span> 3994 </a> 3995 </li><li 3996 class="menu-drawer__list-item" 3997 style="--menu-drawer-animation-index: 3;" 3998 > 3999 <a 4000 id="HeaderDrawer-beauty-beauty-eyelashes" 4001 href="/collections/eyelashes" 4002 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4003 4004 > 4005 4006 <span class="menu-drawer__menu-item-text wrap-text">Eyelashes</span> 4007 </a> 4008 </li><li 4009 class="menu-drawer__list-item" 4010 style="--menu-drawer-animation-index: 4;" 4011 > 4012 <a 4013 id="HeaderDrawer-beauty-beauty-waxing" 4014 href="/collections/waxing" 4015 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4016 4017 > 4018 4019 <span class="menu-drawer__menu-item-text wrap-text">Waxing</span> 4020 </a> 4021 </li><li 4022 class="menu-drawer__list-item" 4023 style="--menu-drawer-animation-index: 5;" 4024 > 4025 <a 4026 id="HeaderDrawer-beauty-beauty-tanning" 4027 href="/collections/tanning" 4028 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4029 4030 > 4031 4032 <span class="menu-drawer__menu-item-text wrap-text">Tanning</span> 4033 </a> 4034 </li><li 4035 class="menu-drawer__list-item" 4036 style="--menu-drawer-animation-index: 6;" 4037 > 4038 <a 4039 id="HeaderDrawer-beauty-beauty-facial" 4040 href="/collections/facial" 4041 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4042 4043 > 4044 4045 <span class="menu-drawer__menu-item-text wrap-text">Facial</span> 4046 </a> 4047 </li></ul></li></ul> 4048 4049 </div> 4050 </div> 4051 </details></li> 4052 <li 4053 class="menu-drawer__list-item" 4054 style="--menu-drawer-animation-index: 5;" 4055 ><details 4056 id="Details-menu-drawer-menu-item-5" 4057 class="menu-drawer__menu-container" 4058 > 4059 <summary 4060 id="HeaderDrawer-electricals" 4061 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 4062 on:click="header-drawer/open" 4063 >
4064 <span class="menu-drawer__menu-item-text wrap-text">Electricals</span> 4065 <span class="svg-wrapper icon-caret icon-caret--forward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4066 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4067</svg> 4068</span> 4069 </summary> 4070 <div 4071 id="link-electricals" 4072 class="menu-drawer__submenu has-submenu gradient motion-reduce" 4073 tabindex="-1" 4074 style="--menu-drawer-animation-index: 5;" 4075 > 4076 <div class="menu-drawer__inner-submenu"> 4077 <div class="menu-drawer__nav-buttons"> 4078 <button 4079 class="button menu-drawer__back-button focus-inset" 4080 aria-expanded="true" 4081 on:click="header-drawer/back" 4082 aria-label="Back" 4083 > 4084 <span class="svg-wrapper icon-caret icon-caret--backward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4085 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4086</svg> 4087</span> 4088 <span class="menu-drawer__menu-item-text wrap-text">Electricals</span> 4089 </button> 4090 <button 4091 class="button button-unstyled close-button menu-drawer__close-button" 4092 type="button" 4093 aria-label="Close" 4094 on:click="header-drawer/close" 4095 > 4096 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4097 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4098 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4099</svg> 4100</span> 4101 </button> 4102 </div> 4103 4104 4105 <ul 4106 class="menu-drawer__menu menu-drawer__menu--childlist" 4107 role="list" 4108 tabindex="-1" 4109 > 4110 <li 4111 class=" 4112 menu-drawer__list-item 4113 menu-drawer__list-item--flat 4114 " 4115 > 4116 4117<a 4118 id="HeaderDrawer-electricals-electricals" 4119 href="/collections/electricals" 4120 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 4121 > 4122 <span class="menu-drawer__menu-item-text wrap-text">Electricals</span> 4123 </a> 4124 4125 <ul 4126 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 4127 role="list" 4128 tabindex="-1" 4129 ><li 4130 class="menu-drawer__list-item" 4131 style="--menu-drawer-animation-index: 1;" 4132 > 4133 <a 4134 id="HeaderDrawer-electricals-electricals-nail-file-machines" 4135 href="/collections/nail-file-machines" 4136 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4137 4138 > 4139
4140 <span class="menu-drawer__menu-item-text wrap-text">Nail File Machines</span> 4141 </a> 4142 </li><li 4143 class="menu-drawer__list-item" 4144 style="--menu-drawer-animation-index: 2;" 4145 > 4146 <a 4147 id="HeaderDrawer-electricals-electricals-uv-led-lamps" 4148 href="/collections/uv-led-lamps" 4149 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4150 4151 > 4152 4153 <span class="menu-drawer__menu-item-text wrap-text">UV/LED Lamps</span> 4154 </a> 4155 </li><li 4156 class="menu-drawer__list-item" 4157 style="--menu-drawer-animation-index: 3;" 4158 > 4159 <a 4160 id="HeaderDrawer-electricals-electricals-dust-collector" 4161 href="/collections/dust-collector" 4162 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4163 4164 > 4165 4166 <span class="menu-drawer__menu-item-text wrap-text">Dust Collector</span> 4167 </a> 4168 </li><li 4169 class="menu-drawer__list-item" 4170 style="--menu-drawer-animation-index: 4;" 4171 > 4172 <a 4173 id="HeaderDrawer-electricals-electricals-table-lamps" 4174 href="/collections/table-lamps" 4175 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4176 4177 > 4178 4179 <span class="menu-drawer__menu-item-text wrap-text">Table Lamps</span> 4180 </a> 4181 </li><li 4182 class="menu-drawer__list-item" 4183 style="--menu-drawer-animation-index: 5;" 4184 > 4185 <a 4186 id="HeaderDrawer-electricals-electricals-nail-dryers" 4187 href="/collections/nail-dryers" 4188 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4189 4190 > 4191 4192 <span class="menu-drawer__menu-item-text wrap-text">Nail Dryers</span> 4193 </a> 4194 </li><li 4195 class="menu-drawer__list-item" 4196 style="--menu-drawer-animation-index: 6;" 4197 > 4198 <a 4199 id="HeaderDrawer-electricals-electricals-wax-heaters" 4200 href="/collections/wax-heaters" 4201 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4202 4203 > 4204
4205 <span class="menu-drawer__menu-item-text wrap-text">Wax Heaters</span> 4206 </a> 4207 </li><li 4208 class="menu-drawer__list-item" 4209 style="--menu-drawer-animation-index: 7;" 4210 > 4211 <a 4212 id="HeaderDrawer-electricals-electricals-steriliser" 4213 href="/collections/steriliser" 4214 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4215 4216 > 4217 4218 <span class="menu-drawer__menu-item-text wrap-text">Steriliser</span> 4219 </a> 4220 </li><li 4221 class="menu-drawer__list-item" 4222 style="--menu-drawer-animation-index: 8;" 4223 > 4224 <a 4225 id="HeaderDrawer-electricals-electricals-towel-warmers" 4226 href="/collections/towel-warmers" 4227 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4228 4229 > 4230 4231 <span class="menu-drawer__menu-item-text wrap-text">Towel Warmers</span> 4232 </a> 4233 </li><li 4234 class="menu-drawer__list-item" 4235 style="--menu-drawer-animation-index: 9;" 4236 > 4237 <a 4238 id="HeaderDrawer-electricals-electricals-accessories-spares" 4239 href="/collections/accessories-spare-parts" 4240 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4241 4242 > 4243 4244 <span class="menu-drawer__menu-item-text wrap-text">Accessories & Spares</span> 4245 </a> 4246 </li><li 4247 class="menu-drawer__list-item" 4248 style="--menu-drawer-animation-index: 10;" 4249 > 4250 <a 4251 id="HeaderDrawer-electricals-electricals-servicing-repairs" 4252 href="/collections/servicing-repairs" 4253 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4254 4255 > 4256 4257 <span class="menu-drawer__menu-item-text wrap-text">Servicing & Repairs</span> 4258 </a> 4259 </li></ul></li></ul> 4260 4261 </div> 4262 </div> 4263 </details></li> 4264 <li 4265 class="menu-drawer__list-item" 4266 style="--menu-drawer-animation-index: 6;" 4267 ><details 4268 id="Details-menu-drawer-menu-item-6" 4269 class="menu-drawer__menu-container" 4270 > 4271 <summary 4272 id="HeaderDrawer-furniture" 4273 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 4274 on:click="header-drawer/open" 4275 >
4276 <span class="menu-drawer__menu-item-text wrap-text">Furniture</span> 4277 <span class="svg-wrapper icon-caret icon-caret--forward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4278 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4279</svg> 4280</span> 4281 </summary> 4282 <div 4283 id="link-furniture" 4284 class="menu-drawer__submenu has-submenu gradient motion-reduce" 4285 tabindex="-1" 4286 style="--menu-drawer-animation-index: 6;" 4287 > 4288 <div class="menu-drawer__inner-submenu"> 4289 <div class="menu-drawer__nav-buttons"> 4290 <button 4291 class="button menu-drawer__back-button focus-inset" 4292 aria-expanded="true" 4293 on:click="header-drawer/back" 4294 aria-label="Back" 4295 > 4296 <span class="svg-wrapper icon-caret icon-caret--backward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4297 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4298</svg> 4299</span> 4300 <span class="menu-drawer__menu-item-text wrap-text">Furniture</span> 4301 </button> 4302 <button 4303 class="button button-unstyled close-button menu-drawer__close-button" 4304 type="button" 4305 aria-label="Close" 4306 on:click="header-drawer/close" 4307 > 4308 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4309 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4310 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4311</svg> 4312</span> 4313 </button> 4314 </div> 4315 4316 4317 <ul 4318 class="menu-drawer__menu menu-drawer__menu--childlist" 4319 role="list" 4320 tabindex="-1" 4321 > 4322 <li 4323 class=" 4324 menu-drawer__list-item 4325 menu-drawer__list-item--flat 4326 " 4327 > 4328 4329<a 4330 id="HeaderDrawer-furniture-furniture" 4331 href="/collections/furniture" 4332 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 4333 > 4334 <span class="menu-drawer__menu-item-text wrap-text">Furniture</span> 4335 </a> 4336 4337 <ul 4338 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 4339 role="list" 4340 tabindex="-1" 4341 ><li 4342 class="menu-drawer__list-item" 4343 style="--menu-drawer-animation-index: 1;" 4344 > 4345 <a 4346 id="HeaderDrawer-furniture-furniture-manicure-table" 4347 href="/collections/manicure-tables" 4348 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4349 4350 > 4351
4352 <span class="menu-drawer__menu-item-text wrap-text">Manicure Table</span> 4353 </a> 4354 </li><li 4355 class="menu-drawer__list-item" 4356 style="--menu-drawer-animation-index: 2;" 4357 > 4358 <a 4359 id="HeaderDrawer-furniture-furniture-pedicure-chairs" 4360 href="/collections/pedicure-chairs" 4361 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4362 4363 > 4364 4365 <span class="menu-drawer__menu-item-text wrap-text">Pedicure Chairs</span> 4366 </a> 4367 </li><li 4368 class="menu-drawer__list-item" 4369 style="--menu-drawer-animation-index: 3;" 4370 > 4371 <a 4372 id="HeaderDrawer-furniture-furniture-reception-desks" 4373 href="/collections/reception-desks" 4374 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4375 4376 > 4377 4378 <span class="menu-drawer__menu-item-text wrap-text">Reception Desks</span> 4379 </a> 4380 </li><li 4381 class="menu-drawer__list-item" 4382 style="--menu-drawer-animation-index: 4;" 4383 > 4384 <a 4385 id="HeaderDrawer-furniture-furniture-chairs-stools" 4386 href="/collections/chairs-stools" 4387 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4388 4389 > 4390 4391 <span class="menu-drawer__menu-item-text wrap-text">Chairs & Stools</span> 4392 </a> 4393 </li><li 4394 class="menu-drawer__list-item" 4395 style="--menu-drawer-animation-index: 5;" 4396 > 4397 <a 4398 id="HeaderDrawer-furniture-furniture-trolleys" 4399 href="/collections/trolleys" 4400 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4401 4402 > 4403 4404 <span class="menu-drawer__menu-item-text wrap-text">Trolleys</span> 4405 </a> 4406 </li><li 4407 class="menu-drawer__list-item" 4408 style="--menu-drawer-animation-index: 6;" 4409 > 4410 <a 4411 id="HeaderDrawer-furniture-furniture-arm-foot-rests" 4412 href="/collections/arm-foot-rests" 4413 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4414 4415 > 4416
4417 <span class="menu-drawer__menu-item-text wrap-text">Arm & Foot Rests</span> 4418 </a> 4419 </li><li 4420 class="menu-drawer__list-item" 4421 style="--menu-drawer-animation-index: 7;" 4422 > 4423 <a 4424 id="HeaderDrawer-furniture-furniture-wall-counter-displays" 4425 href="/collections/wall-counter-displays" 4426 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4427 4428 > 4429 4430 <span class="menu-drawer__menu-item-text wrap-text">Wall & Counter Displays</span> 4431 </a> 4432 </li></ul></li></ul> 4433 4434 </div> 4435 </div> 4436 </details></li> 4437 <li 4438 class="menu-drawer__list-item" 4439 style="--menu-drawer-animation-index: 7;" 4440 ><details 4441 id="Details-menu-drawer-menu-item-7" 4442 class="menu-drawer__menu-container" 4443 > 4444 <summary 4445 id="HeaderDrawer-brands" 4446 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset menu-drawer__menu-item--active" 4447 on:click="header-drawer/open" 4448 > 4449 <span class="menu-drawer__menu-item-text wrap-text">Brands</span> 4450 <span class="svg-wrapper icon-caret icon-caret--forward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4451 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4452</svg> 4453</span> 4454 </summary> 4455 <div 4456 id="link-brands" 4457 class="menu-drawer__submenu has-submenu gradient motion-reduce" 4458 tabindex="-1" 4459 style="--menu-drawer-animation-index: 7;" 4460 > 4461 <div class="menu-drawer__inner-submenu"> 4462 <div class="menu-drawer__nav-buttons"> 4463 <button 4464 class="button menu-drawer__back-button focus-inset" 4465 aria-expanded="true" 4466 on:click="header-drawer/back" 4467 aria-label="Back" 4468 > 4469 <span class="svg-wrapper icon-caret icon-caret--backward"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4470 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4471</svg> 4472</span> 4473 <span class="menu-drawer__menu-item-text wrap-text">Brands</span> 4474 </button> 4475 <button 4476 class="button button-unstyled close-button menu-drawer__close-button" 4477 type="button" 4478 aria-label="Close" 4479 on:click="header-drawer/close" 4480 > 4481 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4482 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4483 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4484</svg> 4485</span> 4486 </button> 4487 </div> 4488 4489 4490 <ul 4491 class="menu-drawer__menu menu-drawer__menu--childlist" 4492 role="list" 4493 tabindex="-1" 4494 > 4495 <li 4496 class=" 4497 menu-drawer__list-item 4498 menu-drawer__list-item--flat 4499 " 4500 > 4501 4502<a 4503 id="HeaderDrawer-brands-lorem-ipsum" 4504 href="/collections" 4505 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset" 4506 >
4507 <span class="menu-drawer__menu-item-text wrap-text">Lorem Ipsum</span> 4508 </a> 4509 4510 <ul 4511 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 4512 role="list" 4513 tabindex="-1" 4514 ><li 4515 class="menu-drawer__list-item" 4516 style="--menu-drawer-animation-index: 1;" 4517 > 4518 <a 4519 id="HeaderDrawer-brands-lorem-ipsum-777" 4520 href="/collections/777" 4521 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4522 4523 > 4524 4525 <span class="menu-drawer__menu-item-text wrap-text">777</span> 4526 </a> 4527 </li><li 4528 class="menu-drawer__list-item" 4529 style="--menu-drawer-animation-index: 2;" 4530 > 4531 <a 4532 id="HeaderDrawer-brands-lorem-ipsum-aeon" 4533 href="/collections/aeon" 4534 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4535 4536 > 4537 4538 <span class="menu-drawer__menu-item-text wrap-text">AEON</span> 4539 </a> 4540 </li><li 4541 class="menu-drawer__list-item" 4542 style="--menu-drawer-animation-index: 3;" 4543 > 4544 <a 4545 id="HeaderDrawer-brands-lorem-ipsum-aiko" 4546 href="/collections/aiko" 4547 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4548 4549 > 4550 4551 <span class="menu-drawer__menu-item-text wrap-text">AIKO</span> 4552 </a> 4553 </li><li 4554 class="menu-drawer__list-item" 4555 style="--menu-drawer-animation-index: 4;" 4556 > 4557 <a 4558 id="HeaderDrawer-brands-lorem-ipsum-apres" 4559 href="/collections/apres" 4560 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4561 4562 > 4563 4564 <span class="menu-drawer__menu-item-text wrap-text">APRES</span> 4565 </a> 4566 </li><li 4567 class="menu-drawer__list-item" 4568 style="--menu-drawer-animation-index: 5;" 4569 > 4570 <a 4571 id="HeaderDrawer-brands-lorem-ipsum-ardell" 4572 href="/collections/ardell" 4573 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4574 4575 > 4576
4577 <span class="menu-drawer__menu-item-text wrap-text">ARDELL</span> 4578 </a> 4579 </li><li 4580 class="menu-drawer__list-item" 4581 style="--menu-drawer-animation-index: 6;" 4582 > 4583 <a 4584 id="HeaderDrawer-brands-lorem-ipsum-art-club" 4585 href="/collections/art-club" 4586 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4587 4588 > 4589 4590 <span class="menu-drawer__menu-item-text wrap-text">ART CLUB</span> 4591 </a> 4592 </li><li 4593 class="menu-drawer__list-item" 4594 style="--menu-drawer-animation-index: 7;" 4595 > 4596 <a 4597 id="HeaderDrawer-brands-lorem-ipsum-aurelia" 4598 href="/collections/aurelia" 4599 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4600 4601 > 4602 4603 <span class="menu-drawer__menu-item-text wrap-text">AURELIA</span> 4604 </a> 4605 </li><li 4606 class="menu-drawer__list-item" 4607 style="--menu-drawer-animation-index: 8;" 4608 > 4609 <a 4610 id="HeaderDrawer-brands-lorem-ipsum-avp" 4611 href="/collections/avp" 4612 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4613 4614 > 4615 4616 <span class="menu-drawer__menu-item-text wrap-text">AVP</span> 4617 </a> 4618 </li><li 4619 class="menu-drawer__list-item" 4620 style="--menu-drawer-animation-index: 9;" 4621 > 4622 <a 4623 id="HeaderDrawer-brands-lorem-ipsum-baisidai" 4624 href="/collections/baisidai" 4625 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4626 4627 > 4628 4629 <span class="menu-drawer__menu-item-text wrap-text">BAISIDAI</span> 4630 </a> 4631 </li><li 4632 class="menu-drawer__list-item" 4633 style="--menu-drawer-animation-index: 10;" 4634 > 4635 <a 4636 id="HeaderDrawer-brands-lorem-ipsum-barbicide" 4637 href="/collections/barbicide" 4638 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4639 4640 > 4641
4642 <span class="menu-drawer__menu-item-text wrap-text">BARBICIDE</span> 4643 </a> 4644 </li><li 4645 class="menu-drawer__list-item" 4646 style="--menu-drawer-animation-index: 11;" 4647 > 4648 <a 4649 id="HeaderDrawer-brands-lorem-ipsum-be-beauty" 4650 href="/collections/be-beauty" 4651 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4652 4653 > 4654 4655 <span class="menu-drawer__menu-item-text wrap-text">BE BEAUTY</span> 4656 </a> 4657 </li><li 4658 class="menu-drawer__list-item" 4659 style="--menu-drawer-animation-index: 12;" 4660 > 4661 <a 4662 id="HeaderDrawer-brands-lorem-ipsum-beauty-max" 4663 href="/collections/beauty-max" 4664 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4665 4666 > 4667 4668 <span class="menu-drawer__menu-item-text wrap-text">BEAUTY MAX</span> 4669 </a> 4670 </li><li 4671 class="menu-drawer__list-item" 4672 style="--menu-drawer-animation-index: 13;" 4673 > 4674 <a 4675 id="HeaderDrawer-brands-lorem-ipsum-cacee" 4676 href="/collections/cacee" 4677 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4678 4679 > 4680 4681 <span class="menu-drawer__menu-item-text wrap-text">CACEE</span> 4682 </a> 4683 </li><li 4684 class="menu-drawer__list-item" 4685 style="--menu-drawer-animation-index: 14;" 4686 > 4687 <a 4688 id="HeaderDrawer-brands-lorem-ipsum-chernaya-rechka" 4689 href="/collections/chernaya-rechka" 4690 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4691 4692 > 4693 4694 <span class="menu-drawer__menu-item-text wrap-text">CHERNAYA RECHKA</span> 4695 </a> 4696 </li><li 4697 class="menu-drawer__list-item" 4698 style="--menu-drawer-animation-index: 15;" 4699 > 4700 <a 4701 id="HeaderDrawer-brands-lorem-ipsum-christrio" 4702 href="/collections/christrio" 4703 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4704 4705 > 4706
4707 <span class="menu-drawer__menu-item-text wrap-text">CHRISTRIO</span> 4708 </a> 4709 </li><li 4710 class="menu-drawer__list-item" 4711 style="--menu-drawer-animation-index: 16;" 4712 > 4713 <a 4714 id="HeaderDrawer-brands-lorem-ipsum-cnd" 4715 href="/collections/cnd" 4716 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4717 4718 > 4719 4720 <span class="menu-drawer__menu-item-text wrap-text">CND</span> 4721 </a> 4722 </li><li 4723 class="menu-drawer__list-item" 4724 style="--menu-drawer-animation-index: 17;" 4725 > 4726 <a 4727 id="HeaderDrawer-brands-lorem-ipsum-color-club" 4728 href="/collections/color-club" 4729 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4730 4731 > 4732 4733 <span class="menu-drawer__menu-item-text wrap-text">COLOR CLUB</span> 4734 </a> 4735 </li><li 4736 class="menu-drawer__list-item" 4737 style="--menu-drawer-animation-index: 18;" 4738 > 4739 <a 4740 id="HeaderDrawer-brands-lorem-ipsum-credo" 4741 href="/collections/credo" 4742 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4743 4744 > 4745 4746 <span class="menu-drawer__menu-item-text wrap-text">CREDO</span> 4747 </a> 4748 </li></ul></li><li 4749 class=" 4750 menu-drawer__list-item 4751 menu-drawer__list-item--flat 4752 " 4753 > 4754 4755<a 4756 id="HeaderDrawer-brands-lorem-ipsum" 4757 href="/" 4758 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset menu-drawer__menu-item--active" 4759 > 4760 <span class="menu-drawer__menu-item-text wrap-text">Lorem Ipsum</span> 4761 </a> 4762 4763 <ul 4764 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 4765 role="list" 4766 tabindex="-1" 4767 ><li 4768 class="menu-drawer__list-item" 4769 style="--menu-drawer-animation-index: 1;" 4770 > 4771 <a 4772 id="HeaderDrawer-brands-lorem-ipsum-cuccio" 4773 href="/collections/cuccio" 4774 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4775 4776 > 4777
4778 <span class="menu-drawer__menu-item-text wrap-text">CUCCIO</span> 4779 </a> 4780 </li><li 4781 class="menu-drawer__list-item" 4782 style="--menu-drawer-animation-index: 2;" 4783 > 4784 <a 4785 id="HeaderDrawer-brands-lorem-ipsum-daisy" 4786 href="/collections/daisy" 4787 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4788 4789 > 4790 4791 <span class="menu-drawer__menu-item-text wrap-text">DAISY</span> 4792 </a> 4793 </li><li 4794 class="menu-drawer__list-item" 4795 style="--menu-drawer-animation-index: 3;" 4796 > 4797 <a 4798 id="HeaderDrawer-brands-lorem-ipsum-derma-v10" 4799 href="/collections/derma-v10" 4800 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4801 4802 > 4803 4804 <span class="menu-drawer__menu-item-text wrap-text">DERMA V10</span> 4805 </a> 4806 </li><li 4807 class="menu-drawer__list-item" 4808 style="--menu-drawer-animation-index: 4;" 4809 > 4810 <a 4811 id="HeaderDrawer-brands-lorem-ipsum-dermert" 4812 href="/collections/dermert" 4813 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4814 4815 > 4816 4817 <span class="menu-drawer__menu-item-text wrap-text">DERMERT</span> 4818 </a> 4819 </li><li 4820 class="menu-drawer__list-item" 4821 style="--menu-drawer-animation-index: 5;" 4822 > 4823 <a 4824 id="HeaderDrawer-brands-lorem-ipsum-dnd-dc" 4825 href="/collections/dnd-dc" 4826 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4827 4828 > 4829 4830 <span class="menu-drawer__menu-item-text wrap-text">DND DC</span> 4831 </a> 4832 </li><li 4833 class="menu-drawer__list-item" 4834 style="--menu-drawer-animation-index: 6;" 4835 > 4836 <a 4837 id="HeaderDrawer-brands-lorem-ipsum-emi" 4838 href="/collections/emi" 4839 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4840 4841 > 4842
4843 <span class="menu-drawer__menu-item-text wrap-text">EMI</span> 4844 </a> 4845 </li><li 4846 class="menu-drawer__list-item" 4847 style="--menu-drawer-animation-index: 7;" 4848 > 4849 <a 4850 id="HeaderDrawer-brands-lorem-ipsum-entity" 4851 href="/collections/entity" 4852 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4853 4854 > 4855 4856 <span class="menu-drawer__menu-item-text wrap-text">ENTITY</span> 4857 </a> 4858 </li><li 4859 class="menu-drawer__list-item" 4860 style="--menu-drawer-animation-index: 8;" 4861 > 4862 <a 4863 id="HeaderDrawer-brands-lorem-ipsum-ezflow" 4864 href="/collections/ezflow" 4865 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4866 4867 > 4868 4869 <span class="menu-drawer__menu-item-text wrap-text">EZFLOW</span> 4870 </a> 4871 </li><li 4872 class="menu-drawer__list-item" 4873 style="--menu-drawer-animation-index: 9;" 4874 > 4875 <a 4876 id="HeaderDrawer-brands-lorem-ipsum-gelish" 4877 href="/collections/gelish" 4878 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4879 4880 > 4881 4882 <span class="menu-drawer__menu-item-text wrap-text">GELISH</span> 4883 </a> 4884 </li><li 4885 class="menu-drawer__list-item" 4886 style="--menu-drawer-animation-index: 10;" 4887 > 4888 <a 4889 id="HeaderDrawer-brands-lorem-ipsum-glam-glits" 4890 href="/collections/glam-glits" 4891 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4892 4893 > 4894 4895 <span class="menu-drawer__menu-item-text wrap-text">GLAM & GLITS</span> 4896 </a> 4897 </li><li 4898 class="menu-drawer__list-item" 4899 style="--menu-drawer-animation-index: 11;" 4900 > 4901 <a 4902 id="HeaderDrawer-brands-lorem-ipsum-glamlac" 4903 href="/collections/glamlac" 4904 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4905 4906 > 4907
4908 <span class="menu-drawer__menu-item-text wrap-text">GLAMLAC</span> 4909 </a> 4910 </li><li 4911 class="menu-drawer__list-item" 4912 style="--menu-drawer-animation-index: 12;" 4913 > 4914 <a 4915 id="HeaderDrawer-brands-lorem-ipsum-glamlash" 4916 href="/collections/glamlash" 4917 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4918 4919 > 4920 4921 <span class="menu-drawer__menu-item-text wrap-text">GLAMLASH</span> 4922 </a> 4923 </li><li 4924 class="menu-drawer__list-item" 4925 style="--menu-drawer-animation-index: 13;" 4926 > 4927 <a 4928 id="HeaderDrawer-brands-lorem-ipsum-glamlashes" 4929 href="/collections/glamlashes" 4930 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4931 4932 > 4933 4934 <span class="menu-drawer__menu-item-text wrap-text">GLAMLASHES</span> 4935 </a> 4936 </li><li 4937 class="menu-drawer__list-item" 4938 style="--menu-drawer-animation-index: 14;" 4939 > 4940 <a 4941 id="HeaderDrawer-brands-lorem-ipsum-halo" 4942 href="/collections/halo" 4943 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4944 4945 > 4946 4947 <span class="menu-drawer__menu-item-text wrap-text">HALO</span> 4948 </a> 4949 </li><li 4950 class="menu-drawer__list-item" 4951 style="--menu-drawer-animation-index: 15;" 4952 > 4953 <a 4954 id="HeaderDrawer-brands-lorem-ipsum-hong-kong-girl" 4955 href="/collections/hong-kong-girl" 4956 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4957 4958 > 4959 4960 <span class="menu-drawer__menu-item-text wrap-text">HONG KONG GIRL</span> 4961 </a> 4962 </li><li 4963 class="menu-drawer__list-item" 4964 style="--menu-drawer-animation-index: 16;" 4965 > 4966 <a 4967 id="HeaderDrawer-brands-lorem-ipsum-ibd" 4968 href="/collections/ibd" 4969 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4970 4971 > 4972
4973 <span class="menu-drawer__menu-item-text wrap-text">IBD</span> 4974 </a> 4975 </li><li 4976 class="menu-drawer__list-item" 4977 style="--menu-drawer-animation-index: 17;" 4978 > 4979 <a 4980 id="HeaderDrawer-brands-lorem-ipsum-icon" 4981 href="/collections/icon" 4982 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 4983 4984 > 4985 4986 <span class="menu-drawer__menu-item-text wrap-text">ICON</span> 4987 </a> 4988 </li></ul></li><li 4989 class=" 4990 menu-drawer__list-item 4991 menu-drawer__list-item--flat 4992 " 4993 > 4994 4995<a 4996 id="HeaderDrawer-brands-lorem-ipsum" 4997 href="/" 4998 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset menu-drawer__menu-item--active" 4999 > 5000 <span class="menu-drawer__menu-item-text wrap-text">Lorem Ipsum</span> 5001 </a> 5002 5003 <ul 5004 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 5005 role="list" 5006 tabindex="-1" 5007 ><li 5008 class="menu-drawer__list-item" 5009 style="--menu-drawer-animation-index: 1;" 5010 > 5011 <a 5012 id="HeaderDrawer-brands-lorem-ipsum-infalab" 5013 href="/collections/infalab" 5014 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5015 5016 > 5017 5018 <span class="menu-drawer__menu-item-text wrap-text">INFALAB</span> 5019 </a> 5020 </li><li 5021 class="menu-drawer__list-item" 5022 style="--menu-drawer-animation-index: 2;" 5023 > 5024 <a 5025 id="HeaderDrawer-brands-lorem-ipsum-jet" 5026 href="/collections/jet" 5027 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5028 5029 > 5030 5031 <span class="menu-drawer__menu-item-text wrap-text">JET</span> 5032 </a> 5033 </li><li 5034 class="menu-drawer__list-item" 5035 style="--menu-drawer-animation-index: 3;" 5036 > 5037 <a 5038 id="HeaderDrawer-brands-lorem-ipsum-jinhong" 5039 href="/collections/jinhong" 5040 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5041 5042 > 5043
5044 <span class="menu-drawer__menu-item-text wrap-text">JINHONG</span> 5045 </a> 5046 </li><li 5047 class="menu-drawer__list-item" 5048 style="--menu-drawer-animation-index: 4;" 5049 > 5050 <a 5051 id="HeaderDrawer-brands-lorem-ipsum-kds" 5052 href="/collections/kds" 5053 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5054 5055 > 5056 5057 <span class="menu-drawer__menu-item-text wrap-text">KDS</span> 5058 </a> 5059 </li><li 5060 class="menu-drawer__list-item" 5061 style="--menu-drawer-animation-index: 5;" 5062 > 5063 <a 5064 id="HeaderDrawer-brands-lorem-ipsum-keli" 5065 href="/collections/keli" 5066 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5067 5068 > 5069 5070 <span class="menu-drawer__menu-item-text wrap-text">KELI</span> 5071 </a> 5072 </li><li 5073 class="menu-drawer__list-item" 5074 style="--menu-drawer-animation-index: 6;" 5075 > 5076 <a 5077 id="HeaderDrawer-brands-lorem-ipsum-kiara-sky" 5078 href="/collections/kiara-sky" 5079 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5080 5081 > 5082 5083 <span class="menu-drawer__menu-item-text wrap-text">KIARA SKY</span> 5084 </a> 5085 </li><li 5086 class="menu-drawer__list-item" 5087 style="--menu-drawer-animation-index: 7;" 5088 > 5089 <a 5090 id="HeaderDrawer-brands-lorem-ipsum-kiehl" 5091 href="/collections/kiehl" 5092 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5093 5094 > 5095 5096 <span class="menu-drawer__menu-item-text wrap-text">KIEHL</span> 5097 </a> 5098 </li><li 5099 class="menu-drawer__list-item" 5100 style="--menu-drawer-animation-index: 8;" 5101 > 5102 <a 5103 id="HeaderDrawer-brands-lorem-ipsum-kupa" 5104 href="/collections/kupa" 5105 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5106 5107 > 5108
5109 <span class="menu-drawer__menu-item-text wrap-text">KUPA</span> 5110 </a> 5111 </li><li 5112 class="menu-drawer__list-item" 5113 style="--menu-drawer-animation-index: 9;" 5114 > 5115 <a 5116 id="HeaderDrawer-brands-lorem-ipsum-lamour" 5117 href="/collections/lamour" 5118 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5119 5120 > 5121 5122 <span class="menu-drawer__menu-item-text wrap-text">LAMOUR</span> 5123 </a> 5124 </li><li 5125 class="menu-drawer__list-item" 5126 style="--menu-drawer-animation-index: 10;" 5127 > 5128 <a 5129 id="HeaderDrawer-brands-lorem-ipsum-lazy-fun" 5130 href="/collections/lazy-fun" 5131 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5132 5133 > 5134 5135 <span class="menu-drawer__menu-item-text wrap-text">LAZY FUN</span> 5136 </a> 5137 </li><li 5138 class="menu-drawer__list-item" 5139 style="--menu-drawer-animation-index: 11;" 5140 > 5141 <a 5142 id="HeaderDrawer-brands-lorem-ipsum-lion" 5143 href="/collections/lion" 5144 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5145 5146 > 5147 5148 <span class="menu-drawer__menu-item-text wrap-text">LION</span> 5149 </a> 5150 </li><li 5151 class="menu-drawer__list-item" 5152 style="--menu-drawer-animation-index: 12;" 5153 > 5154 <a 5155 id="HeaderDrawer-brands-lorem-ipsum-lorossi" 5156 href="/collections/lorossi" 5157 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5158 5159 > 5160 5161 <span class="menu-drawer__menu-item-text wrap-text">LOROSSI</span> 5162 </a> 5163 </li><li 5164 class="menu-drawer__list-item" 5165 style="--menu-drawer-animation-index: 13;" 5166 > 5167 <a 5168 id="HeaderDrawer-brands-lorem-ipsum-mae" 5169 href="/collections/mae" 5170 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5171 5172 > 5173
5174 <span class="menu-drawer__menu-item-text wrap-text">MAE</span> 5175 </a> 5176 </li><li 5177 class="menu-drawer__list-item" 5178 style="--menu-drawer-animation-index: 14;" 5179 > 5180 <a 5181 id="HeaderDrawer-brands-lorem-ipsum-medicool" 5182 href="/collections/medicool" 5183 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5184 5185 > 5186 5187 <span class="menu-drawer__menu-item-text wrap-text">MEDICOOL</span> 5188 </a> 5189 </li><li 5190 class="menu-drawer__list-item" 5191 style="--menu-drawer-animation-index: 15;" 5192 > 5193 <a 5194 id="HeaderDrawer-brands-lorem-ipsum-mei-na-si" 5195 href="/collections/mei-na-si" 5196 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5197 5198 > 5199 5200 <span class="menu-drawer__menu-item-text wrap-text">MEI NA SI</span> 5201 </a> 5202 </li><li 5203 class="menu-drawer__list-item" 5204 style="--menu-drawer-animation-index: 16;" 5205 > 5206 <a 5207 id="HeaderDrawer-brands-lorem-ipsum-micra" 5208 href="/collections/micra" 5209 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5210 5211 > 5212 5213 <span class="menu-drawer__menu-item-text wrap-text">MICRA</span> 5214 </a> 5215 </li><li 5216 class="menu-drawer__list-item" 5217 style="--menu-drawer-animation-index: 17;" 5218 > 5219 <a 5220 id="HeaderDrawer-brands-lorem-ipsum-moding" 5221 href="/collections/moding" 5222 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5223 5224 > 5225 5226 <span class="menu-drawer__menu-item-text wrap-text">MODING</span> 5227 </a> 5228 </li></ul></li><li 5229 class=" 5230 menu-drawer__list-item 5231 menu-drawer__list-item--flat 5232 " 5233 > 5234 5235<a 5236 id="HeaderDrawer-brands-lorem-ipsum" 5237 href="/" 5238 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset menu-drawer__menu-item--active" 5239 >
5240 <span class="menu-drawer__menu-item-text wrap-text">Lorem Ipsum</span> 5241 </a> 5242 5243 <ul 5244 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 5245 role="list" 5246 tabindex="-1" 5247 ><li 5248 class="menu-drawer__list-item" 5249 style="--menu-drawer-animation-index: 1;" 5250 > 5251 <a 5252 id="HeaderDrawer-brands-lorem-ipsum-morgan-taylor" 5253 href="/collections/morgan-taylor" 5254 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5255 5256 > 5257 5258 <span class="menu-drawer__menu-item-text wrap-text">MORGAN TAYLOR</span> 5259 </a> 5260 </li><li 5261 class="menu-drawer__list-item" 5262 style="--menu-drawer-animation-index: 2;" 5263 > 5264 <a 5265 id="HeaderDrawer-brands-lorem-ipsum-nail-artists" 5266 href="/collections/nail-artists" 5267 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5268 5269 > 5270 5271 <span class="menu-drawer__menu-item-text wrap-text">NAIL ARTISTS</span> 5272 </a> 5273 </li><li 5274 class="menu-drawer__list-item" 5275 style="--menu-drawer-animation-index: 3;" 5276 > 5277 <a 5278 id="HeaderDrawer-brands-lorem-ipsum-nailpro" 5279 href="/collections/nailpro" 5280 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5281 5282 > 5283 5284 <span class="menu-drawer__menu-item-text wrap-text">NAILPRO</span> 5285 </a> 5286 </li><li 5287 class="menu-drawer__list-item" 5288 style="--menu-drawer-animation-index: 4;" 5289 > 5290 <a 5291 id="HeaderDrawer-brands-lorem-ipsum-nghia" 5292 href="/collections/nghia" 5293 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5294 5295 > 5296 5297 <span class="menu-drawer__menu-item-text wrap-text">NGHIA</span> 5298 </a> 5299 </li><li 5300 class="menu-drawer__list-item" 5301 style="--menu-drawer-animation-index: 5;" 5302 > 5303 <a 5304 id="HeaderDrawer-brands-lorem-ipsum-nola" 5305 href="/collections/nola" 5306 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5307 5308 > 5309
5310 <span class="menu-drawer__menu-item-text wrap-text">NOLA</span> 5311 </a> 5312 </li><li 5313 class="menu-drawer__list-item" 5314 style="--menu-drawer-animation-index: 6;" 5315 > 5316 <a 5317 id="HeaderDrawer-brands-lorem-ipsum-nps" 5318 href="/collections/nps" 5319 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5320 5321 > 5322 5323 <span class="menu-drawer__menu-item-text wrap-text">NPS</span> 5324 </a> 5325 </li><li 5326 class="menu-drawer__list-item" 5327 style="--menu-drawer-animation-index: 7;" 5328 > 5329 <a 5330 id="HeaderDrawer-brands-lorem-ipsum-ns-101" 5331 href="/collections/ns-101" 5332 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5333 5334 > 5335 5336 <span class="menu-drawer__menu-item-text wrap-text">NS-101</span> 5337 </a> 5338 </li><li 5339 class="menu-drawer__list-item" 5340 style="--menu-drawer-animation-index: 8;" 5341 > 5342 <a 5343 id="HeaderDrawer-brands-lorem-ipsum-nsi" 5344 href="/collections/nsi" 5345 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5346 5347 > 5348 5349 <span class="menu-drawer__menu-item-text wrap-text">NSI</span> 5350 </a> 5351 </li><li 5352 class="menu-drawer__list-item" 5353 style="--menu-drawer-animation-index: 9;" 5354 > 5355 <a 5356 id="HeaderDrawer-brands-lorem-ipsum-opi" 5357 href="/collections/opi" 5358 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5359 5360 > 5361 5362 <span class="menu-drawer__menu-item-text wrap-text">OPI</span> 5363 </a> 5364 </li><li 5365 class="menu-drawer__list-item" 5366 style="--menu-drawer-animation-index: 10;" 5367 > 5368 <a 5369 id="HeaderDrawer-brands-lorem-ipsum-orly" 5370 href="/collections/orly" 5371 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5372 5373 > 5374
5375 <span class="menu-drawer__menu-item-text wrap-text">ORLY</span> 5376 </a> 5377 </li><li 5378 class="menu-drawer__list-item" 5379 style="--menu-drawer-animation-index: 11;" 5380 > 5381 <a 5382 id="HeaderDrawer-brands-lorem-ipsum-qtica" 5383 href="/collections/qtica" 5384 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5385 5386 > 5387 5388 <span class="menu-drawer__menu-item-text wrap-text">QTICA</span> 5389 </a> 5390 </li><li 5391 class="menu-drawer__list-item" 5392 style="--menu-drawer-animation-index: 12;" 5393 > 5394 <a 5395 id="HeaderDrawer-brands-lorem-ipsum-refectocil" 5396 href="/collections/refectocil" 5397 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5398 5399 > 5400 5401 <span class="menu-drawer__menu-item-text wrap-text">REFECTOCIL</span> 5402 </a> 5403 </li><li 5404 class="menu-drawer__list-item" 5405 style="--menu-drawer-animation-index: 13;" 5406 > 5407 <a 5408 id="HeaderDrawer-brands-lorem-ipsum-rococo" 5409 href="/collections/rococo" 5410 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5411 5412 > 5413 5414 <span class="menu-drawer__menu-item-text wrap-text">ROCOCO</span> 5415 </a> 5416 </li><li 5417 class="menu-drawer__list-item" 5418 style="--menu-drawer-animation-index: 14;" 5419 > 5420 <a 5421 id="HeaderDrawer-brands-lorem-ipsum-saeyang" 5422 href="/collections/saeyang" 5423 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5424 5425 > 5426 5427 <span class="menu-drawer__menu-item-text wrap-text">SAEYANG</span> 5428 </a> 5429 </li><li 5430 class="menu-drawer__list-item" 5431 style="--menu-drawer-animation-index: 15;" 5432 > 5433 <a 5434 id="HeaderDrawer-brands-lorem-ipsum-salon-system" 5435 href="/collections/salon-system" 5436 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5437 5438 > 5439
5440 <span class="menu-drawer__menu-item-text wrap-text">SALON SYSTEM</span> 5441 </a> 5442 </li><li 5443 class="menu-drawer__list-item" 5444 style="--menu-drawer-animation-index: 16;" 5445 > 5446 <a 5447 id="HeaderDrawer-brands-lorem-ipsum-seche" 5448 href="/collections/seche" 5449 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5450 5451 > 5452 5453 <span class="menu-drawer__menu-item-text wrap-text">SECHE</span> 5454 </a> 5455 </li><li 5456 class="menu-drawer__list-item" 5457 style="--menu-drawer-animation-index: 17;" 5458 > 5459 <a 5460 id="HeaderDrawer-brands-lorem-ipsum-seiko" 5461 href="/collections/seiko" 5462 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5463 5464 > 5465 5466 <span class="menu-drawer__menu-item-text wrap-text">SEIKO</span> 5467 </a> 5468 </li></ul></li><li 5469 class=" 5470 menu-drawer__list-item 5471 menu-drawer__list-item--flat 5472 " 5473 > 5474 5475<a 5476 id="HeaderDrawer-brands-lorem-ipsum" 5477 href="/" 5478 class="menu-drawer__menu-item menu-drawer__menu-item--parent focus-inset menu-drawer__menu-item--active" 5479 > 5480 <span class="menu-drawer__menu-item-text wrap-text">Lorem Ipsum</span> 5481 </a> 5482 5483 <ul 5484 class="menu-drawer__menu menu-drawer__menu--grandchildlist details-content" 5485 role="list" 5486 tabindex="-1" 5487 ><li 5488 class="menu-drawer__list-item" 5489 style="--menu-drawer-animation-index: 1;" 5490 > 5491 <a 5492 id="HeaderDrawer-brands-lorem-ipsum-simply" 5493 href="/collections/simply" 5494 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5495 5496 > 5497 5498 <span class="menu-drawer__menu-item-text wrap-text">SIMPLY</span> 5499 </a> 5500 </li><li 5501 class="menu-drawer__list-item" 5502 style="--menu-drawer-animation-index: 2;" 5503 > 5504 <a 5505 id="HeaderDrawer-brands-lorem-ipsum-sleep-in-rollers" 5506 href="/collections/sleep-in-rollers" 5507 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5508 5509 > 5510
5511 <span class="menu-drawer__menu-item-text wrap-text">SLEEP IN ROLLERS</span> 5512 </a> 5513 </li><li 5514 class="menu-drawer__list-item" 5515 style="--menu-drawer-animation-index: 3;" 5516 > 5517 <a 5518 id="HeaderDrawer-brands-lorem-ipsum-startool" 5519 href="/collections/startool" 5520 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5521 5522 > 5523 5524 <span class="menu-drawer__menu-item-text wrap-text">STARTOOL</span> 5525 </a> 5526 </li><li 5527 class="menu-drawer__list-item" 5528 style="--menu-drawer-animation-index: 4;" 5529 > 5530 <a 5531 id="HeaderDrawer-brands-lorem-ipsum-strictly-professional" 5532 href="/collections/strictly-professional" 5533 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5534 5535 > 5536 5537 <span class="menu-drawer__menu-item-text wrap-text">STRICTLY PROFESSIONAL</span> 5538 </a> 5539 </li><li 5540 class="menu-drawer__list-item" 5541 style="--menu-drawer-animation-index: 5;" 5542 > 5543 <a 5544 id="HeaderDrawer-brands-lorem-ipsum-supernail" 5545 href="/collections/supernail" 5546 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5547 5548 > 5549 5550 <span class="menu-drawer__menu-item-text wrap-text">SUPERNAIL</span> 5551 </a> 5552 </li><li 5553 class="menu-drawer__list-item" 5554 style="--menu-drawer-animation-index: 6;" 5555 > 5556 <a 5557 id="HeaderDrawer-brands-lorem-ipsum-swarovski" 5558 href="/collections/swarovski" 5559 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5560 5561 > 5562 5563 <span class="menu-drawer__menu-item-text wrap-text">SWAROVSKI</span> 5564 </a> 5565 </li><li 5566 class="menu-drawer__list-item" 5567 style="--menu-drawer-animation-index: 7;" 5568 > 5569 <a 5570 id="HeaderDrawer-brands-lorem-ipsum-titania" 5571 href="/collections/titania" 5572 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5573 5574 > 5575
5576 <span class="menu-drawer__menu-item-text wrap-text">TITANIA</span> 5577 </a> 5578 </li><li 5579 class="menu-drawer__list-item" 5580 style="--menu-drawer-animation-index: 8;" 5581 > 5582 <a 5583 id="HeaderDrawer-brands-lorem-ipsum-tnbl" 5584 href="/collections/tnbl" 5585 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5586 5587 > 5588 5589 <span class="menu-drawer__menu-item-text wrap-text">TNBL</span> 5590 </a> 5591 </li><li 5592 class="menu-drawer__list-item" 5593 style="--menu-drawer-animation-index: 9;" 5594 > 5595 <a 5596 id="HeaderDrawer-brands-lorem-ipsum-upower" 5597 href="/collections/upower" 5598 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5599 5600 > 5601 5602 <span class="menu-drawer__menu-item-text wrap-text">UPOWER</span> 5603 </a> 5604 </li><li 5605 class="menu-drawer__list-item" 5606 style="--menu-drawer-animation-index: 10;" 5607 > 5608 <a 5609 id="HeaderDrawer-brands-lorem-ipsum-varisi" 5610 href="/collections/varisi" 5611 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5612 5613 > 5614 5615 <span class="menu-drawer__menu-item-text wrap-text">VARISI</span> 5616 </a> 5617 </li><li 5618 class="menu-drawer__list-item" 5619 style="--menu-drawer-animation-index: 11;" 5620 > 5621 <a 5622 id="HeaderDrawer-brands-lorem-ipsum-veniiz" 5623 href="/collections/veniiz" 5624 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5625 5626 > 5627 5628 <span class="menu-drawer__menu-item-text wrap-text">VENIIZ</span> 5629 </a> 5630 </li><li 5631 class="menu-drawer__list-item" 5632 style="--menu-drawer-animation-index: 12;" 5633 > 5634 <a 5635 id="HeaderDrawer-brands-lorem-ipsum-vina" 5636 href="/collections/vina" 5637 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5638 5639 > 5640
5641 <span class="menu-drawer__menu-item-text wrap-text">VINA</span> 5642 </a> 5643 </li><li 5644 class="menu-drawer__list-item" 5645 style="--menu-drawer-animation-index: 13;" 5646 > 5647 <a 5648 id="HeaderDrawer-brands-lorem-ipsum-vins" 5649 href="/collections/vins" 5650 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5651 5652 > 5653 5654 <span class="menu-drawer__menu-item-text wrap-text">VINS</span> 5655 </a> 5656 </li><li 5657 class="menu-drawer__list-item" 5658 style="--menu-drawer-animation-index: 14;" 5659 > 5660 <a 5661 id="HeaderDrawer-brands-lorem-ipsum-voesh" 5662 href="/collections/voesh" 5663 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5664 5665 > 5666 5667 <span class="menu-drawer__menu-item-text wrap-text">VOESH</span> 5668 </a> 5669 </li><li 5670 class="menu-drawer__list-item" 5671 style="--menu-drawer-animation-index: 15;" 5672 > 5673 <a 5674 id="HeaderDrawer-brands-lorem-ipsum-willow" 5675 href="/collections/willow" 5676 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5677 5678 > 5679 5680 <span class="menu-drawer__menu-item-text wrap-text">WILLOW</span> 5681 </a> 5682 </li><li 5683 class="menu-drawer__list-item" 5684 style="--menu-drawer-animation-index: 16;" 5685 > 5686 <a 5687 id="HeaderDrawer-brands-lorem-ipsum-wonder-gel" 5688 href="/collections/wonder-gel" 5689 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5690 5691 > 5692 5693 <span class="menu-drawer__menu-item-text wrap-text">WONDER GEL</span> 5694 </a> 5695 </li><li 5696 class="menu-drawer__list-item" 5697 style="--menu-drawer-animation-index: 17;" 5698 > 5699 <a 5700 id="HeaderDrawer-brands-lorem-ipsum-yoyo" 5701 href="/collections/yoyo" 5702 class="menu-drawer__menu-item menu-drawer__menu-item--child focus-inset" 5703 5704 > 5705
5706 <span class="menu-drawer__menu-item-text wrap-text">YOYO</span> 5707 </a> 5708 </li></ul></li></ul> 5709 5710 </div> 5711 </div> 5712 </details></li> 5713 <li 5714 class="menu-drawer__list-item" 5715 style="--menu-drawer-animation-index: 8;" 5716 ><a 5717 id="HeaderDrawer-sale" 5718 href="/collections/tnbl-sale" 5719 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 5720 5721 > 5722 <span class="menu-drawer__menu-item-text wrap-text">Sale</span> 5723 </a></li> 5724 </ul> 5725 </nav> 5726 <div 5727 class="menu-drawer__utility-links menu-drawer__animated-element" 5728 style="--menu-drawer-animation-index: 8;" 5729 > 5730 5731 </div> 5732 5733 5734 </div> 5735 <div 5736 class="menu-drawer__backdrop" 5737 on:click="header-drawer/close" 5738 ></div> 5739 </details> 5740</header-drawer> 5741 5742 5743 5744 </div> 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 <search-button class="search-action desktop:hidden"> 5759 <button 5760 on:click="#search-modal/showDialog" 5761 class="button button-unstyled search-modal__button header-actions__action" 5762 aria-label="Search" 5763 aria-haspopup="dialog" 5764 > 5765 <span 5766 aria-hidden="true" 5767 class="svg-wrapper" 5768 > 5769 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 5770<path d="M19.1361 20L11.4929 12.3568C10.8825 12.8764 10.1807 13.2786 9.38723 13.5634C8.59379 13.8483 7.79649 13.9907 6.99533 13.9907C5.04023 13.9907 3.38552 13.3139 2.03119 11.9604C0.677063 10.6069 0 8.95318 0 6.9993C0 5.04522 0.676758 3.39009 2.03027 2.03393C3.38379 0.677977 5.03748 0 6.99136 0C8.94545 0 10.6006 0.677063 11.9567 2.03119C13.3127 3.38552 13.9907 5.04023 13.9907 6.99533C13.9907 7.84349 13.8404 8.66429 13.5399 9.45772C13.2394 10.2512 12.8451 10.9295 12.3568 11.4929L20 19.1364L19.1361 20ZM6.99533 12.77C8.61495 12.77 9.9823 12.2125 11.0974 11.0974C12.2125 9.9825 12.77 8.61515 12.77 6.99533C12.77 5.37551 12.2125 4.00816 11.0974 2.89328C9.9823 1.7782 8.61495 1.22067 6.99533 1.22067C5.37551 1.22067 4.00816 1.7782 2.89328 2.89328C1.7782 4.00816 1.22067 5.37551 1.22067 6.99533C1.22067 8.61515 1.7782 9.9825 2.89328 11.0974C4.00816 12.2125 5.37551 12.77 6.99533 12.77Z" fill="#111111"/> 5771</svg> 5772 5773 </span> 5774 </button> 5775 </search-button> 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790<a 5791 5792 href="/" 5793 class="size-style spacing-style header-logo" 5794 style=" 5795 --size-style-width: ;--size-style-height: ; 5796 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 5797 --font-family: var(--font-body--family); 5798 --font-style: var(--font-body--style); 5799 --font-weight: 600; 5800 " 5801 5802> 5803 5804 5805 <span 5806 class="header-logo__image-container header-logo__image-container--original" 5807 data-testid="header-logo" 5808 > 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 <img src="//www.tnbl.co.uk/cdn/shop/files/TNBL.png?height=60&v=1766497859" alt="" width="130" height="60" class="header-logo__image" srcset="//www.tnbl.co.uk/cdn/shop/files/TNBL.png?height=60&v=1766497859 1x, //www.tnbl.co.uk/cdn/shop/files/TNBL.png?height=120&v=1766497859 2x, //www.tnbl.co.uk/cdn/shop/files/TNBL.png?height=180&v=1766497859 3x" style="--header-logo-image-width: 130px;--header-logo-image-width-mobile: 91px; --header-logo-image-height: 60px; --header-logo-image-height-mobile: 42px;"> 5821 5822 5823 </span> 5824 5825 5826</a> 5827 5828 5829 5830 5831 5832 5833 5834 5835 </div><div 5836 class="header__column header__column--center" 5837 data-testid="header-top-center" 5838 > 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 <header-menu 5851 ref="headerMenu" 5852 class="header-menu mobile:hidden" 5853 data-animation-delay="200" 5854 5855 style="--submenu-animation-speed: 200ms;" 5856 > 5857 <div class="header-menu__inner"> 5858 <nav header-menu> 5859 <div 5860 class="menu-list" 5861 style="--menu-top-level-font-family: var(--font-body--family); 5862--menu-top-level-font-size-desktop: 1rem; --menu-top-level-font-style: var(--font-body--style);
5862 --menu-top-level-font-weight: var(--font-body--weight); --menu-top-level-font-case:none; 5863 5864 --menu-top-level-font-size: var(--menu-font-sm--size); --menu-top-level-font-line-height: 5865 var(--menu-font-sm--line-height); 5866 5867--menu-top-level-font-color: var(--color-foreground); --menu-top-level-font-color-rgb: var(--color-foreground-rgb); 5868" 5869 > 5870 5871 <overflow-list 5872 5873 ref="overflowMenu" 5874 5875 5876 class="overflow-menu color-scheme-matches-parent" 5877 5878 5879 minimum-items="2" 5880 5881 5882 data-testid="header-menu-overflow-list" 5883 5884 5885 data-skip-node-update 5886 5887> 5888 <template shadowrootmode="open"> 5889 <link href="//www.tnbl.co.uk/cdn/shop/t/6/assets/overflow-list.css?v=101911674359793798601774530324" rel="stylesheet" type="text/css" media="all" /> 5890 5891 <ul part="list"> 5892 <slot></slot> 5893 <slot 5894 name="more" 5895 part="more" 5896 hidden 5897 5898 > 5899 <li 5900 part="more" 5901 > 5902 <button 5903 class="button" 5904 type="button" 5905 tabindex="0" 5906 > 5907 More 5908 </button> 5909 </li> 5910 </slot> 5911 <li 5912 part="placeholder" 5913 hidden 5914 ></li> 5915 </ul> 5916 5917 <div part="overflow"> 5918 <ul part="overflow-list"> 5919 <slot name="overflow"></slot> 5920 </ul> 5921 </div> 5922 </template> 5923 5924 5925 5926 <li 5927 role="presentation" 5928 class="menu-list__list-item" 5929 on:focus="/activate" 5930 on:blur="/deactivate" 5931 on:pointerenter="/activate" 5932 on:pointerleave="/deactivate" 5933 > 5934 <a 5935 href="/collections/new" 5936 data-skip-node-update="true" 5937 class="menu-list__link"ref="menuitem" 5938 > 5939 <span class="menu-list__link-title">New In</span> 5940 </a></li> 5941 5942 <li 5943 role="presentation" 5944 class="menu-list__list-item" 5945 on:focus="/activate" 5946 on:blur="/deactivate" 5947 on:pointerenter="/activate" 5948 on:pointerleave="/deactivate" 5949 > 5950 <a 5951 href="/pages/apres" 5952 data-skip-node-update="true" 5953 class="menu-list__link"aria-controls="submenu-2" 5954 aria-haspopup="true" 5955 aria-expanded="false"ref="menuitem" 5956 > 5957 <span class="menu-list__link-title">Apres Nails</span> 5958 </a><div class="menu-list__submenu color-scheme-matches-parent" ref="submenu[]"> 5959 <div 5960 id="submenu-2" 5961 class="menu-list__submenu-inner menu-list__submenu-inner--apres-nails" 5962 style="--menu-parent-font-family: var(--font-body--family); --menu-parent-font-style: 5963var(--font-body--style); --menu-parent-font-weight: var(--font-body--weight); --menu-parent-font-case: 5964none; 5965 5966 --menu-parent-font-size: var(--menu-font-md--size); --menu-parent-font-line-height: 5967 var(--menu-font-md--line-height); --menu-parent-font-color: var(--color-foreground); 5968 --menu-parent-active-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 5969 5970--menu-child-font-family: var(--font-body--family); --menu-child-font-style: 5971var(--font-body--style); --menu-child-font-weight: var(--font-body--weight); --menu-child-font-case: 5972none; 5973 5974 --menu-child-font-size: var(--menu-font-sm--size); --menu-child-font-line-height: var(--menu-font-sm--line-height); 5975 --menu-child-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 5976 --menu-child-active-font-color: var(--color-foreground); 5977 5978" 5979 > 5980 5981 <div class="mega-menu section section--full-width-margin section--page-width"> 5982 <div 5983 class="mega-menu__grid" 5984 data-menu-grid-id="MegaMenuList-2" 5985 > 5986 5987<ul 5988 data-menu-list-id="MegaMenuList-2" 5989 class="mega-menu__list list-unstyled" 5990 style="--menu-image-border-radius: 12px;" 5991> 5992 5993 5994 5995 <li class="mega-menu__column mega-menu__column--span-1"> 5996 <div> 5997 <a 5998 5999 href="/pages/apres" 6000 6001 class="mega-menu__link mega-menu__link--parent" 6002 > 6003
6004 <span 6005 class="mega-menu__link-title wrap-text" 6006 >Apres Nails</span> 6007 </a> 6008 6009 <ul 6010 class="list-unstyled" 6011 style="column-count: 1;" 6012 > 6013 6014 <li 6015 class="mega-menu__link--child" 6016 > 6017 <a 6018 href="/collections/apres-gel-x-kits" 6019 class="mega-menu__link" 6020 > 6021 <span class="mega-menu__link-title wrap-text">Gel-X Kits</span> 6022 </a> 6023 </li> 6024 6025 <li 6026 class="mega-menu__link--child" 6027 > 6028 <a 6029 href="/collections/apres-gel-x-tips" 6030 class="mega-menu__link" 6031 > 6032 <span class="mega-menu__link-title wrap-text">Gel-X Tips</span> 6033 </a> 6034 </li> 6035 6036 <li 6037 class="mega-menu__link--child" 6038 > 6039 <a 6040 href="/collections/apres-gel-colour" 6041 class="mega-menu__link" 6042 > 6043 <span class="mega-menu__link-title wrap-text">Gel Colours</span> 6044 </a> 6045 </li> 6046 6047 <li 6048 class="mega-menu__link--child" 6049 > 6050 <a 6051 href="/collections/apres-essentials" 6052 class="mega-menu__link" 6053 > 6054 <span class="mega-menu__link-title wrap-text">Essentials</span> 6055 </a> 6056 </li> 6057 6058 <li 6059 class="mega-menu__link--child" 6060 > 6061 <a 6062 href="/collections/apres-tools-accessories" 6063 class="mega-menu__link" 6064 > 6065 <span class="mega-menu__link-title wrap-text">Tools & Accessories</span> 6066 </a> 6067 </li> 6068 6069 <li 6070 class="mega-menu__link--child" 6071 > 6072 <a 6073 href="/collections/apres-aer-gel" 6074 class="mega-menu__link" 6075 > 6076 <span class="mega-menu__link-title wrap-text">Aer Gel</span> 6077 </a> 6078 </li> 6079 6080 <li 6081 class="mega-menu__link--child" 6082 > 6083 <a 6084 href="/collections/apres-art-inks" 6085 class="mega-menu__link" 6086 > 6087 <span class="mega-menu__link-title wrap-text">Art Inks</span> 6088 </a> 6089 </li> 6090 6091 <li 6092 class="mega-menu__link--child" 6093 > 6094 <a 6095 href="/collections/apres-clearance" 6096 class="mega-menu__link" 6097 > 6098 <span class="mega-menu__link-title wrap-text">Apres Clearance</span> 6099 </a> 6100 </li> 6101 6102 </ul> 6103 6104 </div> 6105 6106 </li> 6107 6108 6109</ul> 6110 6111 6112 6113<style data-shopify> 6114 [data-menu-grid-id="MegaMenuList-2"] { 6115 6116 --menu-columns-desktop: 5; 6117 --menu-columns-tablet: 3; 6118 6119 } 6120 6121 [data-menu-list-id="MegaMenuList-2"] { 6122 6123 --menu-columns-desktop: 1; 6124 --menu-columns-tablet: 1; 6125 6126 } 6127</style> 6128 6129 6130 6131 6132 6133 <span 6134 class="mega-menu__content" 6135 style="--menu-content-columns-desktop: 1; --menu-content-columns-tablet: 1; --resource-card-corner-radius: 12px;" 6136 > 6137 <ul 6138 class="mega-menu__content-list mega-menu__content-list--promos list-unstyled" 6139 > 6140 6141 6142 6143 </ul> 6144 </span> 6145 6146 6147 </div> 6148 </div> 6149 </div> 6150 </div></li> 6151 6152 <li 6153 role="presentation" 6154 class="menu-list__list-item" 6155 on:focus="/activate" 6156 on:blur="/deactivate" 6157 on:pointerenter="/activate" 6158 on:pointerleave="/deactivate" 6159 > 6160 <a 6161 href="/collections/nails" 6162 data-skip-node-update="true" 6163 class="menu-list__link"aria-controls="submenu-3" 6164 aria-haspopup="true" 6165 aria-expanded="false"ref="menuitem" 6166 > 6167 <span class="menu-list__link-title">Nails</span> 6168 </a>
6168<div class="menu-list__submenu color-scheme-matches-parent" ref="submenu[]"> 6169 <div 6170 id="submenu-3" 6171 class="menu-list__submenu-inner menu-list__submenu-inner--nails" 6172 style="--menu-parent-font-family: var(--font-body--family); --menu-parent-font-style: 6173var(--font-body--style); --menu-parent-font-weight: var(--font-body--weight); --menu-parent-font-case: 6174none; 6175 6176 --menu-parent-font-size: var(--menu-font-md--size); --menu-parent-font-line-height: 6177 var(--menu-font-md--line-height); --menu-parent-font-color: var(--color-foreground); 6178 --menu-parent-active-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 6179 6180--menu-child-font-family: var(--font-body--family); --menu-child-font-style: 6181var(--font-body--style); --menu-child-font-weight: var(--font-body--weight); --menu-child-font-case: 6182none; 6183 6184 --menu-child-font-size: var(--menu-font-sm--size); --menu-child-font-line-height: var(--menu-font-sm--line-height); 6185 --menu-child-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 6186 --menu-child-active-font-color: var(--color-foreground); 6187 6188" 6189 > 6190 6191 <div class="mega-menu section section--full-width-margin section--page-width"> 6192 <div 6193 class="mega-menu__grid" 6194 data-menu-grid-id="MegaMenuList-3" 6195 > 6196 6197<ul 6198 data-menu-list-id="MegaMenuList-3" 6199 class="mega-menu__list list-unstyled" 6200 style="--menu-image-border-radius: 12px;" 6201> 6202 6203 6204 6205 <li class="mega-menu__column mega-menu__column--shop-by-colour"> 6206 <div class="mega-menu__shop-by-colour-inner"> 6207 <h3 class="mega-menu__shop-by-colour-title">Shop by Colour</h3> 6208 <ul class="mega-menu__shop-by-colour-grid list-unstyled"> 6209 6210 6211 <li class="mega-menu__shop-by-colour-item"> 6212 <a 6213 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Beige&sort_by=best-selling&grid=default" 6214 class="mega-menu__shop-by-colour-card" 6215 aria-label="Beige" 6216 > 6217 6218 <div class="mega-menu__shop-by-colour-placeholder"></div> 6219 6220 <span class="mega-menu__shop-by-colour-name">Beige</span> 6221 </a> 6222 </li> 6223 6224 6225 <li class="mega-menu__shop-by-colour-item"> 6226 <a 6227 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Black&sort_by=best-selling&grid=default" 6228 class="mega-menu__shop-by-colour-card" 6229 aria-label="Black" 6230 > 6231 6232 <div class="mega-menu__shop-by-colour-swatch"> 6233 <img 6234 src="//www.tnbl.co.uk/cdn/shop/files/Black.png?v=1770112825&width=200" 6235 alt="Black" 6236 width="24" 6237 height="24" 6238 loading="lazy" 6239 > 6240 </div> 6241 6242 <span class="mega-menu__shop-by-colour-name">Black</span> 6243 </a> 6244 </li> 6245 6246 6247 <li class="mega-menu__shop-by-colour-item"> 6248 <a 6249 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Blue&sort_by=best-selling&grid=default" 6250 class="mega-menu__shop-by-colour-card" 6251 aria-label="Blue" 6252 > 6253 6254 <div class="mega-menu__shop-by-colour-swatch"> 6255 <img 6256 src="//www.tnbl.co.uk/cdn/shop/files/Blue.png?v=1770112825&width=200" 6257 alt="Blue" 6258 width="24" 6259 height="24" 6260 loading="lazy" 6261 > 6262 </div> 6263 6264 <span class="mega-menu__shop-by-colour-name">Blue</span> 6265 </a> 6266 </li> 6267 6268 6269 <li class="mega-menu__shop-by-colour-item"> 6270 <a 6271 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Brown&sort_by=best-selling&grid=default" 6272 class="mega-menu__shop-by-colour-card" 6273 aria-label="Brown" 6274 > 6275 6276 <div class="mega-menu__shop-by-colour-swatch"> 6277 <img 6278 src="//www.tnbl.co.uk/cdn/shop/files/Brown.png?v=1770112826&width=200" 6279 alt="Brown" 6280 width="24" 6281 height="24" 6282 loading="lazy" 6283 > 6284 </div> 6285
6286 <span class="mega-menu__shop-by-colour-name">Brown</span> 6287 </a> 6288 </li> 6289 6290 6291 <li class="mega-menu__shop-by-colour-item"> 6292 <a 6293 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Clear&sort_by=best-selling&grid=default" 6294 class="mega-menu__shop-by-colour-card" 6295 aria-label="Clear" 6296 > 6297 6298 <div class="mega-menu__shop-by-colour-swatch"> 6299 <img 6300 src="//www.tnbl.co.uk/cdn/shop/files/Clear.png?v=1770112825&width=200" 6301 alt="Clear" 6302 width="24" 6303 height="24" 6304 loading="lazy" 6305 > 6306 </div> 6307 6308 <span class="mega-menu__shop-by-colour-name">Clear</span> 6309 </a> 6310 </li> 6311 6312 6313 <li class="mega-menu__shop-by-colour-item"> 6314 <a 6315 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Gold&sort_by=best-selling&grid=default" 6316 class="mega-menu__shop-by-colour-card" 6317 aria-label="Gold" 6318 > 6319 6320 <div class="mega-menu__shop-by-colour-swatch"> 6321 <img 6322 src="//www.tnbl.co.uk/cdn/shop/files/Gold.png?v=1770112826&width=200" 6323 alt="Gold" 6324 width="24" 6325 height="24" 6326 loading="lazy" 6327 > 6328 </div> 6329 6330 <span class="mega-menu__shop-by-colour-name">Gold</span> 6331 </a> 6332 </li> 6333 6334 6335 <li class="mega-menu__shop-by-colour-item"> 6336 <a 6337 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Green&sort_by=best-selling&grid=default" 6338 class="mega-menu__shop-by-colour-card" 6339 aria-label="Green" 6340 > 6341 6342 <div class="mega-menu__shop-by-colour-swatch"> 6343 <img 6344 src="//www.tnbl.co.uk/cdn/shop/files/Green.png?v=1770112825&width=200" 6345 alt="Green" 6346 width="24" 6347 height="24" 6348 loading="lazy" 6349 > 6350 </div> 6351 6352 <span class="mega-menu__shop-by-colour-name">Green</span> 6353 </a> 6354 </li> 6355 6356 6357 <li class="mega-menu__shop-by-colour-item"> 6358 <a 6359 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Grey&sort_by=best-selling&grid=default" 6360 class="mega-menu__shop-by-colour-card" 6361 aria-label="Grey" 6362 > 6363 6364 <div class="mega-menu__shop-by-colour-swatch"> 6365 <img 6366 src="//www.tnbl.co.uk/cdn/shop/files/Grey.png?v=1770112826&width=200" 6367 alt="Grey" 6368 width="24" 6369 height="24" 6370 loading="lazy" 6371 > 6372 </div> 6373 6374 <span class="mega-menu__shop-by-colour-name">Grey</span> 6375 </a> 6376 </li> 6377 6378 6379 <li class="mega-menu__shop-by-colour-item"> 6380 <a 6381 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Natural&sort_by=best-selling&grid=default" 6382 class="mega-menu__shop-by-colour-card" 6383 aria-label="Natural" 6384 > 6385 6386 <div class="mega-menu__shop-by-colour-swatch"> 6387 <img 6388 src="//www.tnbl.co.uk/cdn/shop/files/Natural.png?v=1770112826&width=200" 6389 alt="Natural" 6390 width="24" 6391 height="24" 6392 loading="lazy" 6393 > 6394 </div> 6395
6396 <span class="mega-menu__shop-by-colour-name">Natural</span> 6397 </a> 6398 </li> 6399 6400 6401 <li class="mega-menu__shop-by-colour-item"> 6402 <a 6403 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Nude&sort_by=best-selling&grid=default" 6404 class="mega-menu__shop-by-colour-card" 6405 aria-label="Nude" 6406 > 6407 6408 <div class="mega-menu__shop-by-colour-swatch"> 6409 <img 6410 src="//www.tnbl.co.uk/cdn/shop/files/Nude.png?v=1770112825&width=200" 6411 alt="Nude" 6412 width="24" 6413 height="24" 6414 loading="lazy" 6415 > 6416 </div> 6417 6418 <span class="mega-menu__shop-by-colour-name">Nude</span> 6419 </a> 6420 </li> 6421 6422 6423 <li class="mega-menu__shop-by-colour-item"> 6424 <a 6425 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Orange&sort_by=best-selling&grid=default" 6426 class="mega-menu__shop-by-colour-card" 6427 aria-label="Orange" 6428 > 6429 6430 <div class="mega-menu__shop-by-colour-swatch"> 6431 <img 6432 src="//www.tnbl.co.uk/cdn/shop/files/Orange.png?v=1770112825&width=200" 6433 alt="Orange" 6434 width="24" 6435 height="24" 6436 loading="lazy" 6437 > 6438 </div> 6439 6440 <span class="mega-menu__shop-by-colour-name">Orange</span> 6441 </a> 6442 </li> 6443 6444 6445 <li class="mega-menu__shop-by-colour-item"> 6446 <a 6447 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Pink&sort_by=best-selling&grid=default" 6448 class="mega-menu__shop-by-colour-card" 6449 aria-label="Pink" 6450 > 6451 6452 <div class="mega-menu__shop-by-colour-swatch"> 6453 <img 6454 src="//www.tnbl.co.uk/cdn/shop/files/Pink.png?v=1770112826&width=200" 6455 alt="Pink" 6456 width="24" 6457 height="24" 6458 loading="lazy" 6459 > 6460 </div> 6461 6462 <span class="mega-menu__shop-by-colour-name">Pink</span> 6463 </a> 6464 </li> 6465 6466 6467 <li class="mega-menu__shop-by-colour-item"> 6468 <a 6469 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Purple&sort_by=best-selling&grid=default" 6470 class="mega-menu__shop-by-colour-card" 6471 aria-label="Purple" 6472 > 6473 6474 <div class="mega-menu__shop-by-colour-swatch"> 6475 <img 6476 src="//www.tnbl.co.uk/cdn/shop/files/Purple.png?v=1770112826&width=200" 6477 alt="Purple" 6478 width="24" 6479 height="24" 6480 loading="lazy" 6481 > 6482 </div> 6483 6484 <span class="mega-menu__shop-by-colour-name">Purple</span> 6485 </a> 6486 </li> 6487 6488 6489 <li class="mega-menu__shop-by-colour-item"> 6490 <a 6491 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Red&sort_by=best-selling&grid=default" 6492 class="mega-menu__shop-by-colour-card" 6493 aria-label="Red" 6494 > 6495 6496 <div class="mega-menu__shop-by-colour-swatch"> 6497 <img 6498 src="//www.tnbl.co.uk/cdn/shop/files/Red.png?v=1770112825&width=200" 6499 alt="Red" 6500 width="24" 6501 height="24" 6502 loading="lazy" 6503 > 6504 </div> 6505
6506 <span class="mega-menu__shop-by-colour-name">Red</span> 6507 </a> 6508 </li> 6509 6510 6511 <li class="mega-menu__shop-by-colour-item"> 6512 <a 6513 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Silver&sort_by=best-selling&grid=default" 6514 class="mega-menu__shop-by-colour-card" 6515 aria-label="Silver" 6516 > 6517 6518 <div class="mega-menu__shop-by-colour-swatch"> 6519 <img 6520 src="//www.tnbl.co.uk/cdn/shop/files/Silver.png?v=1770112826&width=200" 6521 alt="Silver" 6522 width="24" 6523 height="24" 6524 loading="lazy" 6525 > 6526 </div> 6527 6528 <span class="mega-menu__shop-by-colour-name">Silver</span> 6529 </a> 6530 </li> 6531 6532 6533 <li class="mega-menu__shop-by-colour-item"> 6534 <a 6535 href="/collections/gel-nail-polish?filter.p.m.custom.colour=White&sort_by=best-selling&grid=default" 6536 class="mega-menu__shop-by-colour-card" 6537 aria-label="White" 6538 > 6539 6540 <div class="mega-menu__shop-by-colour-swatch"> 6541 <img 6542 src="//www.tnbl.co.uk/cdn/shop/files/White.png?v=1770112826&width=200" 6543 alt="White" 6544 width="24" 6545 height="24" 6546 loading="lazy" 6547 > 6548 </div> 6549 6550 <span class="mega-menu__shop-by-colour-name">White</span> 6551 </a> 6552 </li> 6553 6554 6555 <li class="mega-menu__shop-by-colour-item"> 6556 <a 6557 href="/collections/gel-nail-polish?filter.p.m.custom.colour=Yellow&sort_by=best-selling&grid=default" 6558 class="mega-menu__shop-by-colour-card" 6559 aria-label="Yellow" 6560 > 6561 6562 <div class="mega-menu__shop-by-colour-swatch"> 6563 <img 6564 src="//www.tnbl.co.uk/cdn/shop/files/Yellow.png?v=1770112824&width=200" 6565 alt="Yellow" 6566 width="24" 6567 height="24" 6568 loading="lazy" 6569 > 6570 </div> 6571 6572 <span class="mega-menu__shop-by-colour-name">Yellow</span> 6573 </a> 6574 </li> 6575 6576 </ul> 6577 </div> 6578 </li> 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 <li class="mega-menu__column mega-menu__column--span-1"> 6591 <div> 6592 <a href="/collections/nail-extensions" class="mega-menu__link mega-menu__link--parent"> 6593 <span class="mega-menu__link-title wrap-text">Nail Extensions</span> 6594 </a> 6595 6596 <ul class="list-unstyled" style="column-count: 1;"> 6597 6598 <li class="mega-menu__link--child"> 6599 <a href="/collections/nail-extensions-acrylic-powder" class="mega-menu__link"> 6600 <span class="mega-menu__link-title wrap-text">Acrylic Powder</span> 6601 </a> 6602 </li> 6603 6604 <li class="mega-menu__link--child"> 6605 <a href="/collections/nail-extensions-acrylic-monomer-liquids" class="mega-menu__link"> 6606 <span class="mega-menu__link-title wrap-text">Acrylic Monomer & Liquids</span> 6607 </a> 6608 </li> 6609 6610 <li class="mega-menu__link--child"> 6611 <a href="/collections/nail-extensions-acrylic-gel-brushes" class="mega-menu__link"> 6612 <span class="mega-menu__link-title wrap-text">Acrylic Gel & Brushes</span> 6613 </a> 6614 </li> 6615 6616 <li class="mega-menu__link--child"> 6617 <a href="/collections/nail-extensions-soft-gel-extensions" class="mega-menu__link">
6618 <span class="mega-menu__link-title wrap-text">Soft Gel Extensions</span> 6619 </a> 6620 </li> 6621 6622 <li class="mega-menu__link--child"> 6623 <a href="/collections/nail-extensions-dip-powder" class="mega-menu__link"> 6624 <span class="mega-menu__link-title wrap-text">Dipping Powder</span> 6625 </a> 6626 </li> 6627 6628 <li class="mega-menu__link--child"> 6629 <a href="/collections/nail-extensions-nail-prep" class="mega-menu__link"> 6630 <span class="mega-menu__link-title wrap-text">Nail Prep</span> 6631 </a> 6632 </li> 6633 6634 <li class="mega-menu__link--child"> 6635 <a href="/collections/nail-extensions-nail-tips" class="mega-menu__link"> 6636 <span class="mega-menu__link-title wrap-text">Nail Tips</span> 6637 </a> 6638 </li> 6639 6640 <li class="mega-menu__link--child"> 6641 <a href="/collections/nail-extensions-nail-glue" class="mega-menu__link"> 6642 <span class="mega-menu__link-title wrap-text">Nail Glue</span> 6643 </a> 6644 </li> 6645 6646 </ul> 6647 6648 </div> 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 <div> 6663 <a href="/collections/nail-kits" class="mega-menu__link mega-menu__link--parent"> 6664 <span class="mega-menu__link-title wrap-text">Nail Kits</span> 6665 </a> 6666 6667 <ul class="list-unstyled" style="column-count: 1;"> 6668 6669 <li class="mega-menu__link--child"> 6670 <a href="/collections/nail-kits-acrylic-nail-kits" class="mega-menu__link"> 6671 <span class="mega-menu__link-title wrap-text">Acrylic Nail Kits</span> 6672 </a> 6673 </li> 6674 6675 <li class="mega-menu__link--child"> 6676 <a href="/collections/nail-kits-gel-nail-kits" class="mega-menu__link"> 6677 <span class="mega-menu__link-title wrap-text">Gel Nail Kits</span> 6678 </a> 6679 </li> 6680 6681 <li class="mega-menu__link--child"> 6682 <a href="/collections/nail-kits-nail-art-kits" class="mega-menu__link"> 6683 <span class="mega-menu__link-title wrap-text">Nail Art Kits</span> 6684 </a> 6685 </li> 6686 6687 <li class="mega-menu__link--child"> 6688 <a href="/collections/nail-extensions-soft-gel-extensions" class="mega-menu__link"> 6689 <span class="mega-menu__link-title wrap-text">Soft Gel Extensions</span> 6690 </a> 6691 </li> 6692 6693 <li class="mega-menu__link--child"> 6694 <a href="/collections/nail-extensions-dip-powder" class="mega-menu__link"> 6695 <span class="mega-menu__link-title wrap-text">Dip Powder Kits</span> 6696 </a> 6697 </li> 6698 6699 <li class="mega-menu__link--child"> 6700 <a href="/collections/nail-kits-misc" class="mega-menu__link"> 6701 <span class="mega-menu__link-title wrap-text">Misc</span> 6702 </a> 6703 </li> 6704 6705 </ul> 6706 6707 </div> 6708 6709 6710 </li> 6711 6712 6713 6714 6715 6716 6717 6718 <li class="mega-menu__column mega-menu__column--span-1"> 6719 <div> 6720 <a href="/collections/gel-nail-polish" class="mega-menu__link mega-menu__link--parent">
6721 <span class="mega-menu__link-title wrap-text">Gel & Nail Polish</span> 6722 </a> 6723 6724 <ul class="list-unstyled" style="column-count: 1;"> 6725 6726 <li class="mega-menu__link--child"> 6727 <a href="/collections/nail-polish" class="mega-menu__link"> 6728 <span class="mega-menu__link-title wrap-text">Nail Polish</span> 6729 </a> 6730 </li> 6731 6732 <li class="mega-menu__link--child"> 6733 <a href="/collections/https-www-tnbl-co-uk-collections-hema-tpo-free-gel-polish" class="mega-menu__link"> 6734 <span class="mega-menu__link-title wrap-text">Hema + TPO Free Gel Polish</span> 6735 </a> 6736 </li> 6737 6738 <li class="mega-menu__link--child"> 6739 <a href="/collections/gel-nail-polish-gel-polish" class="mega-menu__link"> 6740 <span class="mega-menu__link-title wrap-text">Gel Polish</span> 6741 </a> 6742 </li> 6743 6744 <li class="mega-menu__link--child"> 6745 <a href="/collections/builder-gel-biab" class="mega-menu__link"> 6746 <span class="mega-menu__link-title wrap-text">Builder Gel (BIAB)</span> 6747 </a> 6748 </li> 6749 6750 <li class="mega-menu__link--child"> 6751 <a href="/collections/gel-nail-polish-hard-gel" class="mega-menu__link"> 6752 <span class="mega-menu__link-title wrap-text">Hard Gel</span> 6753 </a> 6754 </li> 6755 6756 <li class="mega-menu__link--child"> 6757 <a href="/collections/poly-gel" class="mega-menu__link"> 6758 <span class="mega-menu__link-title wrap-text">Poly Gel</span> 6759 </a> 6760 </li> 6761 6762 <li class="mega-menu__link--child"> 6763 <a href="/collections/gel-nail-polish-gel-essentials" class="mega-menu__link"> 6764 <span class="mega-menu__link-title wrap-text">Gel Essentials</span> 6765 </a> 6766 </li> 6767 6768 <li class="mega-menu__link--child"> 6769 <a href="/collections/nail-polish-essentials" class="mega-menu__link"> 6770 <span class="mega-menu__link-title wrap-text">Nail Polish Essentials</span> 6771 </a> 6772 </li> 6773 6774 <li class="mega-menu__link--child"> 6775 <a href="/collections/gel-nail-polish-gel-art" class="mega-menu__link"> 6776 <span class="mega-menu__link-title wrap-text">Gel Art</span> 6777 </a> 6778 </li> 6779 6780 </ul> 6781 6782 </div> 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 <div> 6799 <a href="/collections/manicure-pedicure" class="mega-menu__link mega-menu__link--parent"> 6800 <span class="mega-menu__link-title wrap-text">Manicure & Pedicure</span> 6801 </a> 6802 6803 <ul class="list-unstyled" style="column-count: 1;"> 6804 6805 <li class="mega-menu__link--child"> 6806 <a href="/collections/manicure-pedicure-nail-cuticle-care" class="mega-menu__link"> 6807 <span class="mega-menu__link-title wrap-text">Nail & Cuticle Care</span> 6808 </a> 6809 </li> 6810 6811 <li class="mega-menu__link--child"> 6812 <a href="/collections/manicure-pedicure-moisturising-lotions-creams" class="mega-menu__link">
6813 <span class="mega-menu__link-title wrap-text">Moisturising Lotions & Creams</span> 6814 </a> 6815 </li> 6816 6817 <li class="mega-menu__link--child"> 6818 <a href="/collections/manicure-pedicure-soaks-scrubs" class="mega-menu__link"> 6819 <span class="mega-menu__link-title wrap-text">Soaks & Scrubs</span> 6820 </a> 6821 </li> 6822 6823 <li class="mega-menu__link--child"> 6824 <a href="/collections/manicure-pedicure-masks" class="mega-menu__link"> 6825 <span class="mega-menu__link-title wrap-text">Masks</span> 6826 </a> 6827 </li> 6828 6829 <li class="mega-menu__link--child"> 6830 <a href="/collections/manicure-pedicure-foot-file-accesories" class="mega-menu__link"> 6831 <span class="mega-menu__link-title wrap-text">Foot Files & Accessories</span> 6832 </a> 6833 </li> 6834 6835 <li class="mega-menu__link--child"> 6836 <a href="/collections/manicure-pedicure-bowls-accesories" class="mega-menu__link"> 6837 <span class="mega-menu__link-title wrap-text">Bowls & Accessories</span> 6838 </a> 6839 </li> 6840 6841 <li class="mega-menu__link--child"> 6842 <a href="/collections/manicure-pedicure-toe-seperators-slippers" class="mega-menu__link"> 6843 <span class="mega-menu__link-title wrap-text">Toe Separators & Slippers</span> 6844 </a> 6845 </li> 6846 6847 </ul> 6848 6849 </div> 6850 6851 6852 </li> 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 <li class="mega-menu__column mega-menu__column--span-1"> 6863 <div> 6864 <a href="/collections/nail-art" class="mega-menu__link mega-menu__link--parent"> 6865 <span class="mega-menu__link-title wrap-text">Nail Art</span> 6866 </a> 6867 6868 <ul class="list-unstyled" style="column-count: 1;"> 6869 6870 <li class="mega-menu__link--child"> 6871 <a href="/collections/nail-art-brushes-tools" class="mega-menu__link"> 6872 <span class="mega-menu__link-title wrap-text">Nail Art Brushes & Tools</span> 6873 </a> 6874 </li> 6875 6876 <li class="mega-menu__link--child"> 6877 <a href="/collections/nail-art-chrome-powders-pigments" class="mega-menu__link"> 6878 <span class="mega-menu__link-title wrap-text">Chrome Powders & Pigments</span> 6879 </a> 6880 </li> 6881 6882 <li class="mega-menu__link--child"> 6883 <a href="/collections/nail-art-crystal-rhinestones" class="mega-menu__link"> 6884 <span class="mega-menu__link-title wrap-text">Crystals & Rhinestones</span> 6885 </a> 6886 </li> 6887 6888 <li class="mega-menu__link--child"> 6889 <a href="/collections/nail-art-glitters" class="mega-menu__link"> 6890 <span class="mega-menu__link-title wrap-text">Glitters</span> 6891 </a> 6892 </li> 6893 6894 <li class="mega-menu__link--child"> 6895 <a href="/collections/nail-art-glitter-shapes" class="mega-menu__link"> 6896 <span class="mega-menu__link-title wrap-text">Glitter Shapes</span> 6897 </a> 6898 </li> 6899 6900 <li class="mega-menu__link--child"> 6901 <a href="/collections/nail-art-stickers" class="mega-menu__link">
6902 <span class="mega-menu__link-title wrap-text">Stickers</span> 6903 </a> 6904 </li> 6905 6906 <li class="mega-menu__link--child"> 6907 <a href="/collections/nail-art-charms-decals" class="mega-menu__link"> 6908 <span class="mega-menu__link-title wrap-text">Charms & Decals</span> 6909 </a> 6910 </li> 6911 6912 <li class="mega-menu__link--child"> 6913 <a href="/collections/nail-art-angel-paper-transfer-foils" class="mega-menu__link"> 6914 <span class="mega-menu__link-title wrap-text">Angel Paper & Transfer Foils</span> 6915 </a> 6916 </li> 6917 6918 <li class="mega-menu__link--child"> 6919 <a href="/collections/nail-art-flakes" class="mega-menu__link"> 6920 <span class="mega-menu__link-title wrap-text">Flakes</span> 6921 </a> 6922 </li> 6923 6924 <li class="mega-menu__link--child"> 6925 <a href="/collections/nail-art-dried-flowers" class="mega-menu__link"> 6926 <span class="mega-menu__link-title wrap-text">Dried Flowers</span> 6927 </a> 6928 </li> 6929 6930 <li class="mega-menu__link--child"> 6931 <a href="/collections/nail-art-fimo" class="mega-menu__link"> 6932 <span class="mega-menu__link-title wrap-text">Fimo</span> 6933 </a> 6934 </li> 6935 6936 <li class="mega-menu__link--child"> 6937 <a href="/collections/nail-art-chains" class="mega-menu__link"> 6938 <span class="mega-menu__link-title wrap-text">Chains</span> 6939 </a> 6940 </li> 6941 6942 <li class="mega-menu__link--child"> 6943 <a href="/collections/nail-art-netting-lace" class="mega-menu__link"> 6944 <span class="mega-menu__link-title wrap-text">Netting & Lace</span> 6945 </a> 6946 </li> 6947 6948 <li class="mega-menu__link--child"> 6949 <a href="/collections/nail-art-micro-beads" class="mega-menu__link"> 6950 <span class="mega-menu__link-title wrap-text">Micro Beads</span> 6951 </a> 6952 </li> 6953 6954 <li class="mega-menu__link--child"> 6955 <a href="/collections/nail-art-stripers-paint" class="mega-menu__link"> 6956 <span class="mega-menu__link-title wrap-text">Nail Art Stripers & Paint</span> 6957 </a> 6958 </li> 6959 6960 <li class="mega-menu__link--child"> 6961 <a href="/collections/nail-art-other" class="mega-menu__link"> 6962 <span class="mega-menu__link-title wrap-text">Other</span> 6963 </a> 6964 </li> 6965 6966 </ul> 6967 6968 </div> 6969 6970 </li> 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 <li class="mega-menu__column mega-menu__column--span-1"> 6983 <div> 6984 <a href="/collections/nail-tools-accessories" class="mega-menu__link mega-menu__link--parent"> 6985 <span class="mega-menu__link-title wrap-text">Nail Tools & Accessories</span> 6986 </a> 6987 6988 <ul class="list-unstyled" style="column-count: 1;"> 6989 6990 <li class="mega-menu__link--child"> 6991 <a href="/collections/nail-tools-accessories-brushes" class="mega-menu__link"> 6992 <span class="mega-menu__link-title wrap-text">Brushes</span> 6993 </a> 6994 </li> 6995 6996 <li class="mega-menu__link--child"> 6997 <a href="/collections/cuticle-pushers-nippers" class="mega-menu__link">
6998 <span class="mega-menu__link-title wrap-text">Cuticle Pushers & Nippers</span> 6999 </a> 7000 </li> 7001 7002 <li class="mega-menu__link--child"> 7003 <a href="/collections/tip-cutters-nail-clippers" class="mega-menu__link"> 7004 <span class="mega-menu__link-title wrap-text">Tip Cutters & Nail Clippers</span> 7005 </a> 7006 </li> 7007 7008 <li class="mega-menu__link--child"> 7009 <a href="/collections/nail-files-buffers" class="mega-menu__link"> 7010 <span class="mega-menu__link-title wrap-text">Nail Files & Buffers</span> 7011 </a> 7012 </li> 7013 7014 <li class="mega-menu__link--child"> 7015 <a href="/collections/drill-bits-accessories" class="mega-menu__link"> 7016 <span class="mega-menu__link-title wrap-text">Drill Bits & Accessories</span> 7017 </a> 7018 </li> 7019 7020 <li class="mega-menu__link--child"> 7021 <a href="/collections/nail-tools-accessories-implements" class="mega-menu__link"> 7022 <span class="mega-menu__link-title wrap-text">Implements</span> 7023 </a> 7024 </li> 7025 7026 <li class="mega-menu__link--child"> 7027 <a href="/collections/dappen-dishes" class="mega-menu__link"> 7028 <span class="mega-menu__link-title wrap-text">Dappen Dishes</span> 7029 </a> 7030 </li> 7031 7032 <li class="mega-menu__link--child"> 7033 <a href="/collections/nail-tools-accessories-storage" class="mega-menu__link"> 7034 <span class="mega-menu__link-title wrap-text">Storage</span> 7035 </a> 7036 </li> 7037 7038 <li class="mega-menu__link--child"> 7039 <a href="/collections/displays-swatches" class="mega-menu__link"> 7040 <span class="mega-menu__link-title wrap-text">Display & Swatches</span> 7041 </a> 7042 </li> 7043 7044 <li class="mega-menu__link--child"> 7045 <a href="/collections/practise-hands-fingers" class="mega-menu__link"> 7046 <span class="mega-menu__link-title wrap-text">Practice Hands & Fingers</span> 7047 </a> 7048 </li> 7049 7050 <li class="mega-menu__link--child"> 7051 <a href="/collections/nail-tools-accessories-soak-off" class="mega-menu__link"> 7052 <span class="mega-menu__link-title wrap-text">Soak Off</span> 7053 </a> 7054 </li> 7055 7056 </ul> 7057 7058 </div> 7059 7060 </li> 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 <li class="mega-menu__column mega-menu__column--span-1"> 7075 <div> 7076 <a href="/collections/salon-essentials-hygiene" class="mega-menu__link mega-menu__link--parent"> 7077 <span class="mega-menu__link-title wrap-text">Salon Care & Hygiene</span> 7078 </a> 7079 7080 <ul class="list-unstyled" style="column-count: 1;"> 7081 7082 <li class="mega-menu__link--child"> 7083 <a href="/collections/hygiene-nail-wipes" class="mega-menu__link"> 7084 <span class="mega-menu__link-title wrap-text">Nail Wipes</span> 7085 </a> 7086 </li> 7087 7088 <li class="mega-menu__link--child"> 7089 <a href="/collections/hygiene-face-masks-gloves" class="mega-menu__link">
7090 <span class="mega-menu__link-title wrap-text">Face Mask & Gloves</span> 7091 </a> 7092 </li> 7093 7094 <li class="mega-menu__link--child"> 7095 <a href="/collections/hygiene-table-mats" class="mega-menu__link"> 7096 <span class="mega-menu__link-title wrap-text">Table Mats</span> 7097 </a> 7098 </li> 7099 7100 <li class="mega-menu__link--child"> 7101 <a href="/collections/hygiene-sanitizers-disinfectants" class="mega-menu__link"> 7102 <span class="mega-menu__link-title wrap-text">Sanitisers & Disinfectants</span> 7103 </a> 7104 </li> 7105 7106 <li class="mega-menu__link--child"> 7107 <a href="/collections/hygiene-empty-bottles-accessories" class="mega-menu__link"> 7108 <span class="mega-menu__link-title wrap-text">Empty Bottles & Pots</span> 7109 </a> 7110 </li> 7111 7112 <li class="mega-menu__link--child"> 7113 <a href="/collections/nail-kits-misc" class="mega-menu__link"> 7114 <span class="mega-menu__link-title wrap-text">Miscellaneous</span> 7115 </a> 7116 </li> 7117 7118 </ul> 7119 7120 </div> 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 <div> 7139 <a href="/collections/nails-misc" class="mega-menu__link mega-menu__link--parent"> 7140 <span class="mega-menu__link-title wrap-text">Miscellaneous</span> 7141 </a> 7142 7143 <ul class="list-unstyled" style="column-count: 1;"> 7144 7145 <li class="mega-menu__link--child"> 7146 <a href="/collections/misc-salon-posters" class="mega-menu__link"> 7147 <span class="mega-menu__link-title wrap-text">Salon Posters</span> 7148 </a> 7149 </li> 7150 7151 </ul> 7152 7153 </div> 7154 7155 7156 </li> 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185</ul> 7186 7187 7188 7189<style data-shopify> 7190 [data-menu-grid-id="MegaMenuList-3"] { 7191 7192 7193 7194 --menu-columns-desktop: 10; 7195 --menu-columns-tablet: 8; 7196 7197 7198 } 7199 7200 [data-menu-list-id="MegaMenuList-3"] { 7201 7202 --menu-columns-desktop: 6; 7203 --menu-columns-tablet: 6; 7204 7205 } 7206</style> 7207 7208 7209 7210 7211 7212 <span 7213 class="mega-menu__content" 7214 style="--menu-content-columns-desktop: 1; --menu-content-columns-tablet: 1; --resource-card-corner-radius: 12px;" 7215 > 7216 <ul 7217 class="mega-menu__content-list mega-menu__content-list--promos list-unstyled" 7218 > 7219 7220 7221 7222 </ul> 7223 </span> 7224 7225 7226 </div> 7227 </div> 7228 </div> 7229 </div></li> 7230 7231 <li 7232 role="presentation" 7233 class="menu-list__list-item" 7234 on:focus="/activate" 7235 on:blur="/deactivate" 7236 on:pointerenter="/activate" 7237 on:pointerleave="/deactivate" 7238 > 7239 <a 7240 href="/collections/beauty" 7241 data-skip-node-update="true" 7242 class="menu-list__link"aria-controls="submenu-4" 7243 aria-haspopup="true" 7244 aria-expanded="false"ref="menuitem" 7245 > 7246 <span class="menu-list__link-title">Beauty</span> 7247 </a><div class="menu-list__submenu color-scheme-matches-parent" ref="submenu[]"> 7248 <div 7249 id="submenu-4" 7250 class="menu-list__submenu-inner menu-list__submenu-inner--beauty" 7251 style="--menu-parent-font-family: var(--font-body--family); --menu-parent-font-style: 7252var(--font-body--style);
7252 --menu-parent-font-weight: var(--font-body--weight); --menu-parent-font-case: 7253none; 7254 7255 --menu-parent-font-size: var(--menu-font-md--size); --menu-parent-font-line-height: 7256 var(--menu-font-md--line-height); --menu-parent-font-color: var(--color-foreground); 7257 --menu-parent-active-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 7258 7259--menu-child-font-family: var(--font-body--family); --menu-child-font-style: 7260var(--font-body--style); --menu-child-font-weight: var(--font-body--weight); --menu-child-font-case: 7261none; 7262 7263 --menu-child-font-size: var(--menu-font-sm--size); --menu-child-font-line-height: var(--menu-font-sm--line-height); 7264 --menu-child-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 7265 --menu-child-active-font-color: var(--color-foreground); 7266 7267" 7268 > 7269 7270 <div class="mega-menu section section--full-width-margin section--page-width"> 7271 <div 7272 class="mega-menu__grid" 7273 data-menu-grid-id="MegaMenuList-4" 7274 > 7275 7276<ul 7277 data-menu-list-id="MegaMenuList-4" 7278 class="mega-menu__list list-unstyled" 7279 style="--menu-image-border-radius: 12px;" 7280> 7281 7282 7283 7284 <li class="mega-menu__column mega-menu__column--span-1"> 7285 <div> 7286 <a 7287 7288 href="/collections/beauty" 7289 7290 class="mega-menu__link mega-menu__link--parent" 7291 > 7292 7293 <span 7294 class="mega-menu__link-title wrap-text" 7295 >Beauty</span> 7296 </a> 7297 7298 <ul 7299 class="list-unstyled" 7300 style="column-count: 1;" 7301 > 7302 7303 <li 7304 class="mega-menu__link--child" 7305 > 7306 <a 7307 href="/collections/body" 7308 class="mega-menu__link" 7309 > 7310 <span class="mega-menu__link-title wrap-text">Body</span> 7311 </a> 7312 </li> 7313 7314 <li 7315 class="mega-menu__link--child" 7316 > 7317 <a 7318 href="/collections/eyebrows" 7319 class="mega-menu__link" 7320 > 7321 <span class="mega-menu__link-title wrap-text">Eyebrows</span> 7322 </a> 7323 </li> 7324 7325 <li 7326 class="mega-menu__link--child" 7327 > 7328 <a 7329 href="/collections/eyelashes" 7330 class="mega-menu__link" 7331 > 7332 <span class="mega-menu__link-title wrap-text">Eyelashes</span> 7333 </a> 7334 </li> 7335 7336 <li 7337 class="mega-menu__link--child" 7338 > 7339 <a 7340 href="/collections/waxing" 7341 class="mega-menu__link" 7342 > 7343 <span class="mega-menu__link-title wrap-text">Waxing</span> 7344 </a> 7345 </li> 7346 7347 <li 7348 class="mega-menu__link--child" 7349 > 7350 <a 7351 href="/collections/tanning" 7352 class="mega-menu__link" 7353 > 7354 <span class="mega-menu__link-title wrap-text">Tanning</span> 7355 </a> 7356 </li> 7357 7358 <li 7359 class="mega-menu__link--child" 7360 > 7361 <a 7362 href="/collections/facial" 7363 class="mega-menu__link" 7364 > 7365 <span class="mega-menu__link-title wrap-text">Facial</span> 7366 </a> 7367 </li> 7368 7369 </ul> 7370 7371 </div> 7372 7373 </li> 7374 7375 7376</ul> 7377 7378 7379 7380<style data-shopify> 7381 [data-menu-grid-id="MegaMenuList-4"] { 7382 7383 --menu-columns-desktop: 5; 7384 --menu-columns-tablet: 3; 7385 7386 } 7387 7388 [data-menu-list-id="MegaMenuList-4"] { 7389 7390 --menu-columns-desktop: 1; 7391 --menu-columns-tablet: 1; 7392 7393 } 7394</style> 7395 7396 7397 7398 7399 7400 <span 7401 class="mega-menu__content" 7402 style="--menu-content-columns-desktop: 3; --menu-content-columns-tablet: 2; --resource-card-corner-radius: 12px;" 7403 > 7404 <ul 7405 class="mega-menu__content-list mega-menu__content-list--promos list-unstyled" 7406 > 7407 7408 7409 <li class="mega-menu__content-list-item"> 7410 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 7411 <div class="mega-menu__promo-card__media-wrap"> 7412 7413 <a href="/collections/eyelashes" class="mega-menu__promo-card__link"> 7414 <img src="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy_2.png?v=1770737954&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy_2.png?v=1770737954&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 7415 </a> 7416 7417 7418 <div 7419 class="overlay overlay--gradient mega-menu__promo-card__overlay" 7420 style=" 7421 --overlay-layer: var(--layer-flat); 7422 --overlay-color: #00000026; 7423 --overlay-color--end: rgba(0, 0, 0, 0); 7424 --overlay-direction: to top; 7425 --overlay-border-radius: var(--resource-card-corner-radius, 0); 7426 " 7427 ></div> 7428 7429 </div> 7430 <p class="resource-card__title h5 mega-menu__promo-card__title">Eyelashes</p> 7431 </div> 7432 </li> 7433 7434 <li class="mega-menu__content-list-item"> 7435 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 7436 <div class="mega-menu__promo-card__media-wrap"> 7437 7438 <a href="/collections/body" class="mega-menu__promo-card__link"> 7439 <img src="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy.png?v=1770737954&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy.png?v=1770737954&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 7440 </a> 7441 7442 7443 <div 7444 class="overlay overlay--gradient mega-menu__promo-card__overlay" 7445 style=" 7446 --overlay-layer: var(--layer-flat); 7447 --overlay-color: #00000026; 7448 --overlay-color--end: rgba(0, 0, 0, 0); 7449 --overlay-direction: to top; 7450 --overlay-border-radius: var(--resource-card-corner-radius, 0); 7451 " 7452 ></div> 7453 7454 </div> 7455 <p class="resource-card__title h5 mega-menu__promo-card__title">Body</p> 7456 </div> 7457 </li> 7458 7459 <li class="mega-menu__content-list-item mega-menu__content-list-item--hidden-tablet"> 7460 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 7461 <div class="mega-menu__promo-card__media-wrap"> 7462 7463 <a href="/collections/eyebrows" class="mega-menu__promo-card__link"> 7464 <img src="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy_2.png?v=1770737954&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy_2.png?v=1770737954&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 7465 </a> 7466 7467 7468 <div 7469 class="overlay overlay--gradient mega-menu__promo-card__overlay" 7470 style=" 7471 --overlay-layer: var(--layer-flat); 7472 --overlay-color: #00000026; 7473 --overlay-color--end: rgba(0, 0, 0, 0); 7474 --overlay-direction: to top; 7475 --overlay-border-radius: var(--resource-card-corner-radius, 0); 7476 " 7477 ></div> 7478 7479 </div> 7480 <p class="resource-card__title h5 mega-menu__promo-card__title">Eyebrows</p> 7481 </div> 7482 </li> 7483 7484 7485 </ul> 7486 </span> 7487 7488 7489 </div> 7490 </div> 7491 </div> 7492 </div></li> 7493 7494 <li 7495 role="presentation" 7496 class="menu-list__list-item" 7497 on:focus="/activate" 7498 on:blur="/deactivate"
7499 on:pointerenter="/activate" 7500 on:pointerleave="/deactivate" 7501 > 7502 <a 7503 href="/collections/electricals" 7504 data-skip-node-update="true" 7505 class="menu-list__link"aria-controls="submenu-5" 7506 aria-haspopup="true" 7507 aria-expanded="false"ref="menuitem" 7508 > 7509 <span class="menu-list__link-title">Electricals</span> 7510 </a><div class="menu-list__submenu color-scheme-matches-parent" ref="submenu[]"> 7511 <div 7512 id="submenu-5" 7513 class="menu-list__submenu-inner menu-list__submenu-inner--electricals" 7514 style="--menu-parent-font-family: var(--font-body--family); --menu-parent-font-style: 7515var(--font-body--style); --menu-parent-font-weight: var(--font-body--weight); --menu-parent-font-case: 7516none; 7517 7518 --menu-parent-font-size: var(--menu-font-md--size); --menu-parent-font-line-height: 7519 var(--menu-font-md--line-height); --menu-parent-font-color: var(--color-foreground); 7520 --menu-parent-active-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 7521 7522--menu-child-font-family: var(--font-body--family); --menu-child-font-style: 7523var(--font-body--style); --menu-child-font-weight: var(--font-body--weight); --menu-child-font-case: 7524none; 7525 7526 --menu-child-font-size: var(--menu-font-sm--size); --menu-child-font-line-height: var(--menu-font-sm--line-height); 7527 --menu-child-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 7528 --menu-child-active-font-color: var(--color-foreground); 7529 7530" 7531 > 7532 7533 <div class="mega-menu section section--full-width-margin section--page-width"> 7534 <div 7535 class="mega-menu__grid" 7536 data-menu-grid-id="MegaMenuList-5" 7537 > 7538 7539<ul 7540 data-menu-list-id="MegaMenuList-5" 7541 class="mega-menu__list list-unstyled" 7542 style="--menu-image-border-radius: 12px;" 7543> 7544 7545 7546 7547 <li class="mega-menu__column mega-menu__column--span-1"> 7548 <div> 7549 <a 7550 7551 href="/collections/electricals" 7552 7553 class="mega-menu__link mega-menu__link--parent" 7554 > 7555 7556 <span 7557 class="mega-menu__link-title wrap-text" 7558 >Electricals</span> 7559 </a> 7560 7561 <ul 7562 class="list-unstyled" 7563 style="column-count: 1;" 7564 > 7565 7566 <li 7567 class="mega-menu__link--child" 7568 > 7569 <a 7570 href="/collections/nail-file-machines" 7571 class="mega-menu__link" 7572 > 7573 <span class="mega-menu__link-title wrap-text">Nail File Machines</span> 7574 </a> 7575 </li> 7576 7577 <li 7578 class="mega-menu__link--child" 7579 > 7580 <a 7581 href="/collections/uv-led-lamps" 7582 class="mega-menu__link" 7583 > 7584 <span class="mega-menu__link-title wrap-text">UV/LED Lamps</span> 7585 </a> 7586 </li> 7587 7588 <li 7589 class="mega-menu__link--child" 7590 > 7591 <a 7592 href="/collections/dust-collector" 7593 class="mega-menu__link" 7594 > 7595 <span class="mega-menu__link-title wrap-text">Dust Collector</span> 7596 </a> 7597 </li> 7598 7599 <li 7600 class="mega-menu__link--child" 7601 > 7602 <a 7603 href="/collections/table-lamps" 7604 class="mega-menu__link" 7605 > 7606 <span class="mega-menu__link-title wrap-text">Table Lamps</span> 7607 </a> 7608 </li> 7609 7610 <li 7611 class="mega-menu__link--child" 7612 > 7613 <a 7614 href="/collections/nail-dryers" 7615 class="mega-menu__link" 7616 > 7617 <span class="mega-menu__link-title wrap-text">Nail Dryers</span> 7618 </a> 7619 </li> 7620 7621 <li 7622 class="mega-menu__link--child" 7623 > 7624 <a 7625 href="/collections/wax-heaters" 7626 class="mega-menu__link" 7627 >
7628 <span class="mega-menu__link-title wrap-text">Wax Heaters</span> 7629 </a> 7630 </li> 7631 7632 <li 7633 class="mega-menu__link--child" 7634 > 7635 <a 7636 href="/collections/steriliser" 7637 class="mega-menu__link" 7638 > 7639 <span class="mega-menu__link-title wrap-text">Steriliser</span> 7640 </a> 7641 </li> 7642 7643 <li 7644 class="mega-menu__link--child" 7645 > 7646 <a 7647 href="/collections/towel-warmers" 7648 class="mega-menu__link" 7649 > 7650 <span class="mega-menu__link-title wrap-text">Towel Warmers</span> 7651 </a> 7652 </li> 7653 7654 <li 7655 class="mega-menu__link--child" 7656 > 7657 <a 7658 href="/collections/accessories-spare-parts" 7659 class="mega-menu__link" 7660 > 7661 <span class="mega-menu__link-title wrap-text">Accessories & Spares</span> 7662 </a> 7663 </li> 7664 7665 <li 7666 class="mega-menu__link--child" 7667 > 7668 <a 7669 href="/collections/servicing-repairs" 7670 class="mega-menu__link" 7671 > 7672 <span class="mega-menu__link-title wrap-text">Servicing & Repairs</span> 7673 </a> 7674 </li> 7675 7676 </ul> 7677 7678 </div> 7679 7680 </li> 7681 7682 7683</ul> 7684 7685 7686 7687<style data-shopify> 7688 [data-menu-grid-id="MegaMenuList-5"] { 7689 7690 --menu-columns-desktop: 5; 7691 --menu-columns-tablet: 3; 7692 7693 } 7694 7695 [data-menu-list-id="MegaMenuList-5"] { 7696 7697 --menu-columns-desktop: 1; 7698 --menu-columns-tablet: 1; 7699 7700 } 7701</style> 7702 7703 7704 7705 7706 7707 <span 7708 class="mega-menu__content" 7709 style="--menu-content-columns-desktop: 3; --menu-content-columns-tablet: 2; --resource-card-corner-radius: 12px;" 7710 > 7711 <ul 7712 class="mega-menu__content-list mega-menu__content-list--promos list-unstyled" 7713 > 7714 7715 7716 <li class="mega-menu__content-list-item"> 7717 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 7718 <div class="mega-menu__promo-card__media-wrap"> 7719 7720 <a href="/collections/nail-file-machines" class="mega-menu__promo-card__link"> 7721 <img src="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65.png?v=1770737946&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65.png?v=1770737946&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 7722 </a> 7723 7724 7725 <div 7726 class="overlay overlay--gradient mega-menu__promo-card__overlay" 7727 style=" 7728 --overlay-layer: var(--layer-flat); 7729 --overlay-color: #00000026; 7730 --overlay-color--end: rgba(0, 0, 0, 0); 7731 --overlay-direction: to top; 7732 --overlay-border-radius: var(--resource-card-corner-radius, 0); 7733 " 7734 ></div> 7735 7736 </div> 7737 <p class="resource-card__title h5 mega-menu__promo-card__title">Nail File Machines</p> 7738 </div> 7739 </li> 7740 7741 <li class="mega-menu__content-list-item"> 7742 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 7743 <div class="mega-menu__promo-card__media-wrap"> 7744 7745 <a href="/collections/uv-led-lamps" class="mega-menu__promo-card__link"> 7746 <img src="//www.tnbl.co.uk/cdn/shop/files/image_1.png?v=1770737946&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/image_1.png?v=1770737946&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 7747 </a> 7748 7749 7750 <div 7751 class="overlay overlay--gradient mega-menu__promo-card__overlay" 7752 style=" 7753 --overlay-layer: var(--layer-flat); 7754 --overlay-color: #00000026; 7755 --overlay-color--end: rgba(0, 0, 0, 0); 7756 --overlay-direction: to top; 7757 --overlay-border-radius: var(--resource-card-corner-radius, 0); 7758 " 7759 ></div> 7760 7761 </div> 7762 <p class="resource-card__title h5 mega-menu__promo-card__title">UV/LED Lamps</p> 7763 </div> 7764 </li> 7765 7766 <li class="mega-menu__content-list-item mega-menu__content-list-item--hidden-tablet"> 7767 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 7768 <div class="mega-menu__promo-card__media-wrap"> 7769 7770 <a href="/collections/table-lamps" class="mega-menu__promo-card__link"> 7771 <img src="//www.tnbl.co.uk/cdn/shop/files/image_2.png?v=1770737945&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/image_2.png?v=1770737945&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 7772 </a> 7773 7774 7775 <div 7776 class="overlay overlay--gradient mega-menu__promo-card__overlay" 7777 style=" 7778 --overlay-layer: var(--layer-flat); 7779 --overlay-color: #00000026; 7780 --overlay-color--end: rgba(0, 0, 0, 0); 7781 --overlay-direction: to top; 7782 --overlay-border-radius: var(--resource-card-corner-radius, 0); 7783 " 7784 ></div> 7785 7786 </div> 7787 <p class="resource-card__title h5 mega-menu__promo-card__title">Table Lamps</p> 7788 </div> 7789 </li> 7790 7791 7792 </ul> 7793 </span> 7794 7795 7796 </div> 7797 </div> 7798 </div> 7799 </div></li> 7800 7801 <li 7802 role="presentation" 7803 class="menu-list__list-item" 7804 on:focus="/activate" 7805 on:blur="/deactivate"
7806 on:pointerenter="/activate" 7807 on:pointerleave="/deactivate" 7808 > 7809 <a 7810 href="/collections/furniture" 7811 data-skip-node-update="true" 7812 class="menu-list__link"aria-controls="submenu-6" 7813 aria-haspopup="true" 7814 aria-expanded="false"ref="menuitem" 7815 > 7816 <span class="menu-list__link-title">Furniture</span> 7817 </a><div class="menu-list__submenu color-scheme-matches-parent" ref="submenu[]"> 7818 <div 7819 id="submenu-6" 7820 class="menu-list__submenu-inner menu-list__submenu-inner--furniture" 7821 style="--menu-parent-font-family: var(--font-body--family); --menu-parent-font-style: 7822var(--font-body--style); --menu-parent-font-weight: var(--font-body--weight); --menu-parent-font-case: 7823none; 7824 7825 --menu-parent-font-size: var(--menu-font-md--size); --menu-parent-font-line-height: 7826 var(--menu-font-md--line-height); --menu-parent-font-color: var(--color-foreground); 7827 --menu-parent-active-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 7828 7829--menu-child-font-family: var(--font-body--family); --menu-child-font-style: 7830var(--font-body--style); --menu-child-font-weight: var(--font-body--weight); --menu-child-font-case: 7831none; 7832 7833 --menu-child-font-size: var(--menu-font-sm--size); --menu-child-font-line-height: var(--menu-font-sm--line-height); 7834 --menu-child-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 7835 --menu-child-active-font-color: var(--color-foreground); 7836 7837" 7838 > 7839 7840 <div class="mega-menu section section--full-width-margin section--page-width"> 7841 <div 7842 class="mega-menu__grid" 7843 data-menu-grid-id="MegaMenuList-6" 7844 > 7845 7846<ul 7847 data-menu-list-id="MegaMenuList-6" 7848 class="mega-menu__list list-unstyled" 7849 style="--menu-image-border-radius: 12px;" 7850> 7851 7852 7853 7854 <li class="mega-menu__column mega-menu__column--span-1"> 7855 <div> 7856 <a 7857 7858 href="/collections/furniture" 7859 7860 class="mega-menu__link mega-menu__link--parent" 7861 > 7862 7863 <span 7864 class="mega-menu__link-title wrap-text" 7865 >Furniture</span> 7866 </a> 7867 7868 <ul 7869 class="list-unstyled" 7870 style="column-count: 1;" 7871 > 7872 7873 <li 7874 class="mega-menu__link--child" 7875 > 7876 <a 7877 href="/collections/manicure-tables" 7878 class="mega-menu__link" 7879 > 7880 <span class="mega-menu__link-title wrap-text">Manicure Table</span> 7881 </a> 7882 </li> 7883 7884 <li 7885 class="mega-menu__link--child" 7886 > 7887 <a 7888 href="/collections/pedicure-chairs" 7889 class="mega-menu__link" 7890 > 7891 <span class="mega-menu__link-title wrap-text">Pedicure Chairs</span> 7892 </a> 7893 </li> 7894 7895 <li 7896 class="mega-menu__link--child" 7897 > 7898 <a 7899 href="/collections/reception-desks" 7900 class="mega-menu__link" 7901 > 7902 <span class="mega-menu__link-title wrap-text">Reception Desks</span> 7903 </a> 7904 </li> 7905 7906 <li 7907 class="mega-menu__link--child" 7908 > 7909 <a 7910 href="/collections/chairs-stools" 7911 class="mega-menu__link" 7912 > 7913 <span class="mega-menu__link-title wrap-text">Chairs & Stools</span> 7914 </a> 7915 </li> 7916 7917 <li 7918 class="mega-menu__link--child" 7919 > 7920 <a 7921 href="/collections/trolleys" 7922 class="mega-menu__link" 7923 > 7924 <span class="mega-menu__link-title wrap-text">Trolleys</span> 7925 </a> 7926 </li> 7927 7928 <li 7929 class="mega-menu__link--child" 7930 > 7931 <a 7932 href="/collections/arm-foot-rests" 7933 class="mega-menu__link" 7934 >
7935 <span class="mega-menu__link-title wrap-text">Arm & Foot Rests</span> 7936 </a> 7937 </li> 7938 7939 <li 7940 class="mega-menu__link--child" 7941 > 7942 <a 7943 href="/collections/wall-counter-displays" 7944 class="mega-menu__link" 7945 > 7946 <span class="mega-menu__link-title wrap-text">Wall & Counter Displays</span> 7947 </a> 7948 </li> 7949 7950 </ul> 7951 7952 </div> 7953 7954 </li> 7955 7956 7957</ul> 7958 7959 7960 7961<style data-shopify> 7962 [data-menu-grid-id="MegaMenuList-6"] { 7963 7964 --menu-columns-desktop: 5; 7965 --menu-columns-tablet: 3; 7966 7967 } 7968 7969 [data-menu-list-id="MegaMenuList-6"] { 7970 7971 --menu-columns-desktop: 1; 7972 --menu-columns-tablet: 1; 7973 7974 } 7975</style> 7976 7977 7978 7979 7980 7981 <span 7982 class="mega-menu__content" 7983 style="--menu-content-columns-desktop: 3; --menu-content-columns-tablet: 2; --resource-card-corner-radius: 12px;" 7984 > 7985 <ul 7986 class="mega-menu__content-list mega-menu__content-list--promos list-unstyled" 7987 > 7988 7989 7990 <li class="mega-menu__content-list-item"> 7991 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 7992 <div class="mega-menu__promo-card__media-wrap"> 7993 7994 <a href="/collections/chairs-stools" class="mega-menu__promo-card__link"> 7995 <img src="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_a305ecf2-f347-48e9-95ba-4ade1adc1183.png?v=1770737962&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_a305ecf2-f347-48e9-95ba-4ade1adc1183.png?v=1770737962&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 7996 </a> 7997 7998 7999 <div 8000 class="overlay overlay--gradient mega-menu__promo-card__overlay" 8001 style=" 8002 --overlay-layer: var(--layer-flat); 8003 --overlay-color: #00000026; 8004 --overlay-color--end: rgba(0, 0, 0, 0); 8005 --overlay-direction: to top; 8006 --overlay-border-radius: var(--resource-card-corner-radius, 0); 8007 " 8008 ></div> 8009 8010 </div> 8011 <p class="resource-card__title h5 mega-menu__promo-card__title">Chairs & Stools</p> 8012 </div> 8013 </li> 8014 8015 <li class="mega-menu__content-list-item"> 8016 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 8017 <div class="mega-menu__promo-card__media-wrap"> 8018 8019 <a href="/collections/arm-foot-rests" class="mega-menu__promo-card__link"> 8020 <img src="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy_2_c245f012-56d0-4715-9846-a264cdd818a9.png?v=1770737962&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy_2_c245f012-56d0-4715-9846-a264cdd818a9.png?v=1770737962&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 8021 </a> 8022 8023 8024 <div 8025 class="overlay overlay--gradient mega-menu__promo-card__overlay" 8026 style=" 8027 --overlay-layer: var(--layer-flat); 8028 --overlay-color: #00000026; 8029 --overlay-color--end: rgba(0, 0, 0, 0); 8030 --overlay-direction: to top; 8031 --overlay-border-radius: var(--resource-card-corner-radius, 0); 8032 " 8033 ></div> 8034 8035 </div> 8036 <p class="resource-card__title h5 mega-menu__promo-card__title">Arm & Foot Rests</p> 8037 </div> 8038 </li> 8039 8040 <li class="mega-menu__content-list-item mega-menu__content-list-item--hidden-tablet"> 8041 <div class="resource-card mega-menu__promo-card" data-resource-type="promo"> 8042 <div class="mega-menu__promo-card__media-wrap"> 8043 8044 <a href="/collections/displays-swatches" class="mega-menu__promo-card__link"> 8045 <img src="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy_8972af1f-2
8045656-4029-8887-cbb22aee3ee0.png?v=1770737961&width=302" srcset="//www.tnbl.co.uk/cdn/shop/files/Rectangle_65_copy_8972af1f-2656-4029-8887-cbb22aee3ee0.png?v=1770737961&width=302 302w" width="302" height="302" loading="lazy" class="mega-menu__content-promo"> 8046 </a> 8047 8048 8049 <div 8050 class="overlay overlay--gradient mega-menu__promo-card__overlay" 8051 style=" 8052 --overlay-layer: var(--layer-flat); 8053 --overlay-color: #00000026; 8054 --overlay-color--end: rgba(0, 0, 0, 0); 8055 --overlay-direction: to top; 8056 --overlay-border-radius: var(--resource-card-corner-radius, 0); 8057 " 8058 ></div> 8059 8060 </div> 8061 <p class="resource-card__title h5 mega-menu__promo-card__title">Display Stands</p> 8062 </div> 8063 </li> 8064 8065 8066 </ul> 8067 </span> 8068 8069 8070 </div> 8071 </div> 8072 </div> 8073 </div></li> 8074 8075 <li 8076 role="presentation" 8077 class="menu-list__list-item" 8078 on:focus="/activate" 8079 on:blur="/deactivate" 8080 on:pointerenter="/activate" 8081 on:pointerleave="/deactivate" 8082 > 8083 <a 8084 href="/" 8085 data-skip-node-update="true" 8086 class="menu-list__link menu-list__link--active"aria-controls="submenu-7" 8087 aria-haspopup="true" 8088 aria-expanded="false"ref="menuitem" 8089 > 8090 <span class="menu-list__link-title">Brands</span> 8091 </a><div class="menu-list__submenu color-scheme-matches-parent" ref="submenu[]"> 8092 <div 8093 id="submenu-7" 8094 class="menu-list__submenu-inner menu-list__submenu-inner--brands" 8095 style="--menu-parent-font-family: var(--font-body--family); --menu-parent-font-style: 8096var(--font-body--style); --menu-parent-font-weight: var(--font-body--weight); --menu-parent-font-case: 8097none; 8098 8099 --menu-parent-font-size: var(--menu-font-md--size); --menu-parent-font-line-height: 8100 var(--menu-font-md--line-height); --menu-parent-font-color: var(--color-foreground); 8101 --menu-parent-active-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 8102 8103--menu-child-font-family: var(--font-body--family); --menu-child-font-style: 8104var(--font-body--style); --menu-child-font-weight: var(--font-body--weight); --menu-child-font-case: 8105none; 8106 8107 --menu-child-font-size: var(--menu-font-sm--size); --menu-child-font-line-height: var(--menu-font-sm--line-height); 8108 --menu-child-font-color: rgb(var(--color-foreground-rgb) / var(--opacity-subdued-text)); 8109 --menu-child-active-font-color: var(--color-foreground); 8110 8111" 8112 > 8113 8114 <div class="mega-menu section section--full-width-margin section--page-width"> 8115 <div 8116 class="mega-menu__grid" 8117 data-menu-grid-id="MegaMenuList-7" 8118 > 8119 8120<ul 8121 data-menu-list-id="MegaMenuList-7" 8122 class="mega-menu__list list-unstyled" 8123 style="--menu-image-border-radius: 12px;" 8124> 8125 8126 8127 8128 <li class="mega-menu__column mega-menu__column--span-2 mega-menu__column--hide-title"> 8129 <div> 8130 <a 8131 8132 href="/collections" 8133 8134 class="mega-menu__link mega-menu__link--parent" 8135 > 8136 8137 <span 8138 class="mega-menu__link-title wrap-text" 8139 >Lorem Ipsum</span> 8140 </a> 8141 8142 <ul 8143 class="list-unstyled" 8144 style="column-count: 1;" 8145 > 8146 8147 <li 8148 class="mega-menu__link--child" 8149 > 8150 <a 8151 href="/collections/777" 8152 class="mega-menu__link" 8153 > 8154 <span class="mega-menu__link-title wrap-text">777</span> 8155 </a> 8156 </li> 8157 8158 <li 8159 class="mega-menu__link--child" 8160 > 8161 <a 8162 href="/collections/aeon" 8163 class="mega-menu__link" 8164 >
8165 <span class="mega-menu__link-title wrap-text">AEON</span> 8166 </a> 8167 </li> 8168 8169 <li 8170 class="mega-menu__link--child" 8171 > 8172 <a 8173 href="/collections/aiko" 8174 class="mega-menu__link" 8175 > 8176 <span class="mega-menu__link-title wrap-text">AIKO</span> 8177 </a> 8178 </li> 8179 8180 <li 8181 class="mega-menu__link--child" 8182 > 8183 <a 8184 href="/collections/apres" 8185 class="mega-menu__link" 8186 > 8187 <span class="mega-menu__link-title wrap-text">APRES</span> 8188 </a> 8189 </li> 8190 8191 <li 8192 class="mega-menu__link--child" 8193 > 8194 <a 8195 href="/collections/ardell" 8196 class="mega-menu__link" 8197 > 8198 <span class="mega-menu__link-title wrap-text">ARDELL</span> 8199 </a> 8200 </li> 8201 8202 <li 8203 class="mega-menu__link--child" 8204 > 8205 <a 8206 href="/collections/art-club" 8207 class="mega-menu__link" 8208 > 8209 <span class="mega-menu__link-title wrap-text">ART CLUB</span> 8210 </a> 8211 </li> 8212 8213 <li 8214 class="mega-menu__link--child" 8215 > 8216 <a 8217 href="/collections/aurelia" 8218 class="mega-menu__link" 8219 > 8220 <span class="mega-menu__link-title wrap-text">AURELIA</span> 8221 </a> 8222 </li> 8223 8224 <li 8225 class="mega-menu__link--child" 8226 > 8227 <a 8228 href="/collections/avp" 8229 class="mega-menu__link" 8230 > 8231 <span class="mega-menu__link-title wrap-text">AVP</span> 8232 </a> 8233 </li> 8234 8235 <li 8236 class="mega-menu__link--child" 8237 > 8238 <a 8239 href="/collections/baisidai" 8240 class="mega-menu__link" 8241 > 8242 <span class="mega-menu__link-title wrap-text">BAISIDAI</span> 8243 </a> 8244 </li> 8245 8246 <li 8247 class="mega-menu__link--child" 8248 > 8249 <a 8250 href="/collections/barbicide" 8251 class="mega-menu__link" 8252 > 8253 <span class="mega-menu__link-title wrap-text">BARBICIDE</span> 8254 </a> 8255 </li> 8256 8257 <li 8258 class="mega-menu__link--child" 8259 > 8260 <a 8261 href="/collections/be-beauty" 8262 class="mega-menu__link" 8263 > 8264 <span class="mega-menu__link-title wrap-text">BE BEAUTY</span> 8265 </a> 8266 </li> 8267 8268 <li 8269 class="mega-menu__link--child" 8270 > 8271 <a 8272 href="/collections/beauty-max" 8273 class="mega-menu__link" 8274 > 8275 <span class="mega-menu__link-title wrap-text">BEAUTY MAX</span> 8276 </a> 8277 </li> 8278 8279 <li 8280 class="mega-menu__link--child" 8281 > 8282 <a 8283 href="/collections/cacee" 8284 class="mega-menu__link" 8285 > 8286 <span class="mega-menu__link-title wrap-text">CACEE</span> 8287 </a> 8288 </li> 8289 8290 <li 8291 class="mega-menu__link--child" 8292 > 8293 <a 8294 href="/collections/chernaya-rechka" 8295 class="mega-menu__link" 8296 > 8297 <span class="mega-menu__link-title wrap-text">CHERNAYA RECHKA</span> 8298 </a> 8299 </li> 8300 8301 <li 8302 class="mega-menu__link--child" 8303 > 8304 <a 8305 href="/collections/christrio" 8306 class="mega-menu__link" 8307 >
8308 <span class="mega-menu__link-title wrap-text">CHRISTRIO</span> 8309 </a> 8310 </li> 8311 8312 <li 8313 class="mega-menu__link--child" 8314 > 8315 <a 8316 href="/collections/cnd" 8317 class="mega-menu__link" 8318 > 8319 <span class="mega-menu__link-title wrap-text">CND</span> 8320 </a> 8321 </li> 8322 8323 <li 8324 class="mega-menu__link--child" 8325 > 8326 <a 8327 href="/collections/color-club" 8328 class="mega-menu__link" 8329 > 8330 <span class="mega-menu__link-title wrap-text">COLOR CLUB</span> 8331 </a> 8332 </li> 8333 8334 <li 8335 class="mega-menu__link--child" 8336 > 8337 <a 8338 href="/collections/credo" 8339 class="mega-menu__link" 8340 > 8341 <span class="mega-menu__link-title wrap-text">CREDO</span> 8342 </a> 8343 </li> 8344 8345 </ul> 8346 8347 </div> 8348 8349 </li> 8350 8351 <li class="mega-menu__column mega-menu__column--span-2 mega-menu__column--hide-title"> 8352 <div> 8353 <a 8354 8355 href="/" 8356 8357 class="mega-menu__link mega-menu__link--parent" 8358 > 8359 8360 <span 8361 class="mega-menu__link-title wrap-text" 8362 >Lorem Ipsum</span> 8363 </a> 8364 8365 <ul 8366 class="list-unstyled" 8367 style="column-count: 1;" 8368 > 8369 8370 <li 8371 class="mega-menu__link--child" 8372 > 8373 <a 8374 href="/collections/cuccio" 8375 class="mega-menu__link" 8376 > 8377 <span class="mega-menu__link-title wrap-text">CUCCIO</span> 8378 </a> 8379 </li> 8380 8381 <li 8382 class="mega-menu__link--child" 8383 > 8384 <a 8385 href="/collections/daisy" 8386 class="mega-menu__link" 8387 > 8388 <span class="mega-menu__link-title wrap-text">DAISY</span> 8389 </a> 8390 </li> 8391 8392 <li 8393 class="mega-menu__link--child" 8394 > 8395 <a 8396 href="/collections/derma-v10" 8397 class="mega-menu__link" 8398 > 8399 <span class="mega-menu__link-title wrap-text">DERMA V10</span> 8400 </a> 8401 </li> 8402 8403 <li 8404 class="mega-menu__link--child" 8405 > 8406 <a 8407 href="/collections/dermert" 8408 class="mega-menu__link" 8409 > 8410 <span class="mega-menu__link-title wrap-text">DERMERT</span> 8411 </a> 8412 </li> 8413 8414 <li 8415 class="mega-menu__link--child" 8416 > 8417 <a 8418 href="/collections/dnd-dc" 8419 class="mega-menu__link" 8420 > 8421 <span class="mega-menu__link-title wrap-text">DND DC</span> 8422 </a> 8423 </li> 8424 8425 <li 8426 class="mega-menu__link--child" 8427 > 8428 <a 8429 href="/collections/emi" 8430 class="mega-menu__link" 8431 > 8432 <span class="mega-menu__link-title wrap-text">EMI</span> 8433 </a> 8434 </li> 8435 8436 <li 8437 class="mega-menu__link--child" 8438 > 8439 <a 8440 href="/collections/entity" 8441 class="mega-menu__link" 8442 > 8443 <span class="mega-menu__link-title wrap-text">ENTITY</span> 8444 </a> 8445 </li> 8446 8447 <li 8448 class="mega-menu__link--child" 8449 > 8450 <a 8451 href="/collections/ezflow" 8452 class="mega-menu__link" 8453 > 8454 <span class="mega-menu__link-title wrap-text">EZFLOW</span> 8455 </a> 8456 </li> 8457 8458 <li 8459 class="mega-menu__link--child" 8460 > 8461 <a 8462 href="/collections/gelish" 8463 class="mega-menu__link" 8464 >
8465 <span class="mega-menu__link-title wrap-text">GELISH</span> 8466 </a> 8467 </li> 8468 8469 <li 8470 class="mega-menu__link--child" 8471 > 8472 <a 8473 href="/collections/glam-glits" 8474 class="mega-menu__link" 8475 > 8476 <span class="mega-menu__link-title wrap-text">GLAM & GLITS</span> 8477 </a> 8478 </li> 8479 8480 <li 8481 class="mega-menu__link--child" 8482 > 8483 <a 8484 href="/collections/glamlac" 8485 class="mega-menu__link" 8486 > 8487 <span class="mega-menu__link-title wrap-text">GLAMLAC</span> 8488 </a> 8489 </li> 8490 8491 <li 8492 class="mega-menu__link--child" 8493 > 8494 <a 8495 href="/collections/glamlash" 8496 class="mega-menu__link" 8497 > 8498 <span class="mega-menu__link-title wrap-text">GLAMLASH</span> 8499 </a> 8500 </li> 8501 8502 <li 8503 class="mega-menu__link--child" 8504 > 8505 <a 8506 href="/collections/glamlashes" 8507 class="mega-menu__link" 8508 > 8509 <span class="mega-menu__link-title wrap-text">GLAMLASHES</span> 8510 </a> 8511 </li> 8512 8513 <li 8514 class="mega-menu__link--child" 8515 > 8516 <a 8517 href="/collections/halo" 8518 class="mega-menu__link" 8519 > 8520 <span class="mega-menu__link-title wrap-text">HALO</span> 8521 </a> 8522 </li> 8523 8524 <li 8525 class="mega-menu__link--child" 8526 > 8527 <a 8528 href="/collections/hong-kong-girl" 8529 class="mega-menu__link" 8530 > 8531 <span class="mega-menu__link-title wrap-text">HONG KONG GIRL</span> 8532 </a> 8533 </li> 8534 8535 <li 8536 class="mega-menu__link--child" 8537 > 8538 <a 8539 href="/collections/ibd" 8540 class="mega-menu__link" 8541 > 8542 <span class="mega-menu__link-title wrap-text">IBD</span> 8543 </a> 8544 </li> 8545 8546 <li 8547 class="mega-menu__link--child" 8548 > 8549 <a 8550 href="/collections/icon" 8551 class="mega-menu__link" 8552 > 8553 <span class="mega-menu__link-title wrap-text">ICON</span> 8554 </a> 8555 </li> 8556 8557 </ul> 8558 8559 </div> 8560 8561 </li> 8562 8563 <li class="mega-menu__column mega-menu__column--span-2 mega-menu__column--hide-title"> 8564 <div> 8565 <a 8566 8567 href="/" 8568 8569 class="mega-menu__link mega-menu__link--parent" 8570 > 8571 8572 <span 8573 class="mega-menu__link-title wrap-text" 8574 >Lorem Ipsum</span> 8575 </a> 8576 8577 <ul 8578 class="list-unstyled" 8579 style="column-count: 1;" 8580 > 8581 8582 <li 8583 class="mega-menu__link--child" 8584 > 8585 <a 8586 href="/collections/infalab" 8587 class="mega-menu__link" 8588 > 8589 <span class="mega-menu__link-title wrap-text">INFALAB</span> 8590 </a> 8591 </li> 8592 8593 <li 8594 class="mega-menu__link--child" 8595 > 8596 <a 8597 href="/collections/jet" 8598 class="mega-menu__link" 8599 > 8600 <span class="mega-menu__link-title wrap-text">JET</span> 8601 </a> 8602 </li> 8603 8604 <li 8605 class="mega-menu__link--child" 8606 > 8607 <a 8608 href="/collections/jinhong" 8609 class="mega-menu__link" 8610 > 8611 <span class="mega-menu__link-title wrap-text">JINHONG</span> 8612 </a> 8613 </li> 8614 8615 <li 8616 class="mega-menu__link--child" 8617 > 8618 <a 8619 href="/collections/kds" 8620 class="mega-menu__link" 8621 >
8622 <span class="mega-menu__link-title wrap-text">KDS</span> 8623 </a> 8624 </li> 8625 8626 <li 8627 class="mega-menu__link--child" 8628 > 8629 <a 8630 href="/collections/keli" 8631 class="mega-menu__link" 8632 > 8633 <span class="mega-menu__link-title wrap-text">KELI</span> 8634 </a> 8635 </li> 8636 8637 <li 8638 class="mega-menu__link--child" 8639 > 8640 <a 8641 href="/collections/kiara-sky" 8642 class="mega-menu__link" 8643 > 8644 <span class="mega-menu__link-title wrap-text">KIARA SKY</span> 8645 </a> 8646 </li> 8647 8648 <li 8649 class="mega-menu__link--child" 8650 > 8651 <a 8652 href="/collections/kiehl" 8653 class="mega-menu__link" 8654 > 8655 <span class="mega-menu__link-title wrap-text">KIEHL</span> 8656 </a> 8657 </li> 8658 8659 <li 8660 class="mega-menu__link--child" 8661 > 8662 <a 8663 href="/collections/kupa" 8664 class="mega-menu__link" 8665 > 8666 <span class="mega-menu__link-title wrap-text">KUPA</span> 8667 </a> 8668 </li> 8669 8670 <li 8671 class="mega-menu__link--child" 8672 > 8673 <a 8674 href="/collections/lamour" 8675 class="mega-menu__link" 8676 > 8677 <span class="mega-menu__link-title wrap-text">LAMOUR</span> 8678 </a> 8679 </li> 8680 8681 <li 8682 class="mega-menu__link--child" 8683 > 8684 <a 8685 href="/collections/lazy-fun" 8686 class="mega-menu__link" 8687 > 8688 <span class="mega-menu__link-title wrap-text">LAZY FUN</span> 8689 </a> 8690 </li> 8691 8692 <li 8693 class="mega-menu__link--child" 8694 > 8695 <a 8696 href="/collections/lion" 8697 class="mega-menu__link" 8698 > 8699 <span class="mega-menu__link-title wrap-text">LION</span> 8700 </a> 8701 </li> 8702 8703 <li 8704 class="mega-menu__link--child" 8705 > 8706 <a 8707 href="/collections/lorossi" 8708 class="mega-menu__link" 8709 > 8710 <span class="mega-menu__link-title wrap-text">LOROSSI</span> 8711 </a> 8712 </li> 8713 8714 <li 8715 class="mega-menu__link--child" 8716 > 8717 <a 8718 href="/collections/mae" 8719 class="mega-menu__link" 8720 > 8721 <span class="mega-menu__link-title wrap-text">MAE</span> 8722 </a> 8723 </li> 8724 8725 <li 8726 class="mega-menu__link--child" 8727 > 8728 <a 8729 href="/collections/medicool" 8730 class="mega-menu__link" 8731 > 8732 <span class="mega-menu__link-title wrap-text">MEDICOOL</span> 8733 </a> 8734 </li> 8735 8736 <li 8737 class="mega-menu__link--child" 8738 > 8739 <a 8740 href="/collections/mei-na-si" 8741 class="mega-menu__link" 8742 > 8743 <span class="mega-menu__link-title wrap-text">MEI NA SI</span> 8744 </a> 8745 </li> 8746 8747 <li 8748 class="mega-menu__link--child" 8749 > 8750 <a 8751 href="/collections/micra" 8752 class="mega-menu__link" 8753 > 8754 <span class="mega-menu__link-title wrap-text">MICRA</span> 8755 </a> 8756 </li> 8757 8758 <li 8759 class="mega-menu__link--child" 8760 > 8761 <a 8762 href="/collections/moding" 8763 class="mega-menu__link" 8764 > 8765 <span class="mega-menu__link-title wrap-text">MODING</span> 8766 </a> 8767 </li> 8768 8769 </ul> 8770 8771 </div> 8772 8773 </li> 8774 8775 <li class="mega-menu__column mega-menu__column--span-2 mega-menu__column--hide-title"> 8776 <div> 8777 <a 8778 8779 href="/" 8780 8781 class="mega-menu__link mega-menu__link--parent" 8782 > 8783
8784 <span 8785 class="mega-menu__link-title wrap-text" 8786 >Lorem Ipsum</span> 8787 </a> 8788 8789 <ul 8790 class="list-unstyled" 8791 style="column-count: 1;" 8792 > 8793 8794 <li 8795 class="mega-menu__link--child" 8796 > 8797 <a 8798 href="/collections/morgan-taylor" 8799 class="mega-menu__link" 8800 > 8801 <span class="mega-menu__link-title wrap-text">MORGAN TAYLOR</span> 8802 </a> 8803 </li> 8804 8805 <li 8806 class="mega-menu__link--child" 8807 > 8808 <a 8809 href="/collections/nail-artists" 8810 class="mega-menu__link" 8811 > 8812 <span class="mega-menu__link-title wrap-text">NAIL ARTISTS</span> 8813 </a> 8814 </li> 8815 8816 <li 8817 class="mega-menu__link--child" 8818 > 8819 <a 8820 href="/collections/nailpro" 8821 class="mega-menu__link" 8822 > 8823 <span class="mega-menu__link-title wrap-text">NAILPRO</span> 8824 </a> 8825 </li> 8826 8827 <li 8828 class="mega-menu__link--child" 8829 > 8830 <a 8831 href="/collections/nghia" 8832 class="mega-menu__link" 8833 > 8834 <span class="mega-menu__link-title wrap-text">NGHIA</span> 8835 </a> 8836 </li> 8837 8838 <li 8839 class="mega-menu__link--child" 8840 > 8841 <a 8842 href="/collections/nola" 8843 class="mega-menu__link" 8844 > 8845 <span class="mega-menu__link-title wrap-text">NOLA</span> 8846 </a> 8847 </li> 8848 8849 <li 8850 class="mega-menu__link--child" 8851 > 8852 <a 8853 href="/collections/nps" 8854 class="mega-menu__link" 8855 > 8856 <span class="mega-menu__link-title wrap-text">NPS</span> 8857 </a> 8858 </li> 8859 8860 <li 8861 class="mega-menu__link--child" 8862 > 8863 <a 8864 href="/collections/ns-101" 8865 class="mega-menu__link" 8866 > 8867 <span class="mega-menu__link-title wrap-text">NS-101</span> 8868 </a> 8869 </li> 8870 8871 <li 8872 class="mega-menu__link--child" 8873 > 8874 <a 8875 href="/collections/nsi" 8876 class="mega-menu__link" 8877 > 8878 <span class="mega-menu__link-title wrap-text">NSI</span> 8879 </a> 8880 </li> 8881 8882 <li 8883 class="mega-menu__link--child" 8884 > 8885 <a 8886 href="/collections/opi" 8887 class="mega-menu__link" 8888 > 8889 <span class="mega-menu__link-title wrap-text">OPI</span> 8890 </a> 8891 </li> 8892 8893 <li 8894 class="mega-menu__link--child" 8895 > 8896 <a 8897 href="/collections/orly" 8898 class="mega-menu__link" 8899 > 8900 <span class="mega-menu__link-title wrap-text">ORLY</span> 8901 </a> 8902 </li> 8903 8904 <li 8905 class="mega-menu__link--child" 8906 > 8907 <a 8908 href="/collections/qtica" 8909 class="mega-menu__link" 8910 > 8911 <span class="mega-menu__link-title wrap-text">QTICA</span> 8912 </a> 8913 </li> 8914 8915 <li 8916 class="mega-menu__link--child" 8917 > 8918 <a 8919 href="/collections/refectocil" 8920 class="mega-menu__link" 8921 > 8922 <span class="mega-menu__link-title wrap-text">REFECTOCIL</span> 8923 </a> 8924 </li> 8925 8926 <li 8927 class="mega-menu__link--child" 8928 > 8929 <a 8930 href="/collections/rococo" 8931 class="mega-menu__link" 8932 >
8933 <span class="mega-menu__link-title wrap-text">ROCOCO</span> 8934 </a> 8935 </li> 8936 8937 <li 8938 class="mega-menu__link--child" 8939 > 8940 <a 8941 href="/collections/saeyang" 8942 class="mega-menu__link" 8943 > 8944 <span class="mega-menu__link-title wrap-text">SAEYANG</span> 8945 </a> 8946 </li> 8947 8948 <li 8949 class="mega-menu__link--child" 8950 > 8951 <a 8952 href="/collections/salon-system" 8953 class="mega-menu__link" 8954 > 8955 <span class="mega-menu__link-title wrap-text">SALON SYSTEM</span> 8956 </a> 8957 </li> 8958 8959 <li 8960 class="mega-menu__link--child" 8961 > 8962 <a 8963 href="/collections/seche" 8964 class="mega-menu__link" 8965 > 8966 <span class="mega-menu__link-title wrap-text">SECHE</span> 8967 </a> 8968 </li> 8969 8970 <li 8971 class="mega-menu__link--child" 8972 > 8973 <a 8974 href="/collections/seiko" 8975 class="mega-menu__link" 8976 > 8977 <span class="mega-menu__link-title wrap-text">SEIKO</span> 8978 </a> 8979 </li> 8980 8981 </ul> 8982 8983 </div> 8984 8985 </li> 8986 8987 <li class="mega-menu__column mega-menu__column--span-2 mega-menu__column--hide-title"> 8988 <div> 8989 <a 8990 8991 href="/" 8992 8993 class="mega-menu__link mega-menu__link--parent" 8994 > 8995 8996 <span 8997 class="mega-menu__link-title wrap-text" 8998 >Lorem Ipsum</span> 8999 </a> 9000 9001 <ul 9002 class="list-unstyled" 9003 style="column-count: 1;" 9004 > 9005 9006 <li 9007 class="mega-menu__link--child" 9008 > 9009 <a 9010 href="/collections/simply" 9011 class="mega-menu__link" 9012 > 9013 <span class="mega-menu__link-title wrap-text">SIMPLY</span> 9014 </a> 9015 </li> 9016 9017 <li 9018 class="mega-menu__link--child" 9019 > 9020 <a 9021 href="/collections/sleep-in-rollers" 9022 class="mega-menu__link" 9023 > 9024 <span class="mega-menu__link-title wrap-text">SLEEP IN ROLLERS</span> 9025 </a> 9026 </li> 9027 9028 <li 9029 class="mega-menu__link--child" 9030 > 9031 <a 9032 href="/collections/startool" 9033 class="mega-menu__link" 9034 > 9035 <span class="mega-menu__link-title wrap-text">STARTOOL</span> 9036 </a> 9037 </li> 9038 9039 <li 9040 class="mega-menu__link--child" 9041 > 9042 <a 9043 href="/collections/strictly-professional" 9044 class="mega-menu__link" 9045 > 9046 <span class="mega-menu__link-title wrap-text">STRICTLY PROFESSIONAL</span> 9047 </a> 9048 </li> 9049 9050 <li 9051 class="mega-menu__link--child" 9052 > 9053 <a 9054 href="/collections/supernail" 9055 class="mega-menu__link" 9056 > 9057 <span class="mega-menu__link-title wrap-text">SUPERNAIL</span> 9058 </a> 9059 </li> 9060 9061 <li 9062 class="mega-menu__link--child" 9063 > 9064 <a 9065 href="/collections/swarovski" 9066 class="mega-menu__link" 9067 > 9068 <span class="mega-menu__link-title wrap-text">SWAROVSKI</span> 9069 </a> 9070 </li> 9071 9072 <li 9073 class="mega-menu__link--child" 9074 > 9075 <a 9076 href="/collections/titania" 9077 class="mega-menu__link" 9078 > 9079 <span class="mega-menu__link-title wrap-text">TITANIA</span> 9080 </a> 9081 </li> 9082 9083 <li 9084 class="mega-menu__link--child" 9085 > 9086 <a 9087 href="/collections/tnbl" 9088 class="mega-menu__link" 9089 >
9090 <span class="mega-menu__link-title wrap-text">TNBL</span> 9091 </a> 9092 </li> 9093 9094 <li 9095 class="mega-menu__link--child" 9096 > 9097 <a 9098 href="/collections/upower" 9099 class="mega-menu__link" 9100 > 9101 <span class="mega-menu__link-title wrap-text">UPOWER</span> 9102 </a> 9103 </li> 9104 9105 <li 9106 class="mega-menu__link--child" 9107 > 9108 <a 9109 href="/collections/varisi" 9110 class="mega-menu__link" 9111 > 9112 <span class="mega-menu__link-title wrap-text">VARISI</span> 9113 </a> 9114 </li> 9115 9116 <li 9117 class="mega-menu__link--child" 9118 > 9119 <a 9120 href="/collections/veniiz" 9121 class="mega-menu__link" 9122 > 9123 <span class="mega-menu__link-title wrap-text">VENIIZ</span> 9124 </a> 9125 </li> 9126 9127 <li 9128 class="mega-menu__link--child" 9129 > 9130 <a 9131 href="/collections/vina" 9132 class="mega-menu__link" 9133 > 9134 <span class="mega-menu__link-title wrap-text">VINA</span> 9135 </a> 9136 </li> 9137 9138 <li 9139 class="mega-menu__link--child" 9140 > 9141 <a 9142 href="/collections/vins" 9143 class="mega-menu__link" 9144 > 9145 <span class="mega-menu__link-title wrap-text">VINS</span> 9146 </a> 9147 </li> 9148 9149 <li 9150 class="mega-menu__link--child" 9151 > 9152 <a 9153 href="/collections/voesh" 9154 class="mega-menu__link" 9155 > 9156 <span class="mega-menu__link-title wrap-text">VOESH</span> 9157 </a> 9158 </li> 9159 9160 <li 9161 class="mega-menu__link--child" 9162 > 9163 <a 9164 href="/collections/willow" 9165 class="mega-menu__link" 9166 > 9167 <span class="mega-menu__link-title wrap-text">WILLOW</span> 9168 </a> 9169 </li> 9170 9171 <li 9172 class="mega-menu__link--child" 9173 > 9174 <a 9175 href="/collections/wonder-gel" 9176 class="mega-menu__link" 9177 > 9178 <span class="mega-menu__link-title wrap-text">WONDER GEL</span> 9179 </a> 9180 </li> 9181 9182 <li 9183 class="mega-menu__link--child" 9184 > 9185 <a 9186 href="/collections/yoyo" 9187 class="mega-menu__link" 9188 > 9189 <span class="mega-menu__link-title wrap-text">YOYO</span> 9190 </a> 9191 </li> 9192 9193 </ul> 9194 9195 </div> 9196 9197 </li> 9198 9199 9200</ul> 9201 9202 9203 9204<style data-shopify> 9205 [data-menu-grid-id="MegaMenuList-7"] { 9206 9207 --menu-columns-desktop: 12; 9208 --menu-columns-tablet: 11; 9209 9210 } 9211 9212 [data-menu-list-id="MegaMenuList-7"] { 9213 9214 --menu-columns-desktop: 10; 9215 --menu-columns-tablet: 10; 9216 9217 } 9218</style> 9219 9220 9221 9222 9223 9224 <span 9225 class="mega-menu__content" 9226 style="--menu-content-columns-desktop: 1; --menu-content-columns-tablet: 1; --resource-card-corner-radius: 12px;" 9227 > 9228 <ul 9229 class="mega-menu__content-list mega-menu__content-list--promos list-unstyled" 9230 > 9231 9232 9233 9234 </ul> 9235 </span> 9236 9237 9238 </div> 9239 </div> 9240 </div> 9241 </div></li> 9242 9243 <li 9244 role="presentation" 9245 class="menu-list__list-item" 9246 on:focus="/activate" 9247 on:blur="/deactivate" 9248 on:pointerenter="/activate" 9249 on:pointerleave="/deactivate" 9250 > 9251 <a 9252 href="/collections/tnbl-sale" 9253 data-skip-node-update="true" 9254 class="menu-list__link"ref="menuitem" 9255 >
9256 <span class="menu-list__link-title">Sale</span> 9257 </a></li> 9258 9259 <li 9260 class="menu-list__list-item" 9261 role="presentation" 9262 slot="more" 9263 on:focus="/activate" 9264 on:blur="/deactivate" 9265 on:pointerenter="/activate" 9266 on:pointerleave="/deactivate" 9267 > 9268 <button role="menuitem" class="button menu-list__link button-unstyled"> 9269 <span class="menu-list__link-title">More</span> 9270 </button> 9271 </li> 9272 9273</overflow-list> 9274 9275 </div> 9276 </nav> 9277 </div> 9278 9279
9279<script 9280 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/header-menu.js?v=32392277473258403531774530326" 9281 type="module" 9282 fetchpriority="low" 9283 ></script>
9283 9284 </header-menu> 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 </div><div 9295 class="header__column header__column--right" 9296 data-testid="header-top-right" 9297 > 9298 9299 9300 9301 9302 9303 9304 9305 9306 9307 9308 9309 9310 9311 <search-button class="search-action mobile:hidden"> 9312 <button 9313 on:click="#search-modal/showDialog" 9314 class="button button-unstyled search-modal__button header-actions__action" 9315 aria-label="Search" 9316 aria-haspopup="dialog" 9317 > 9318 <span 9319 aria-hidden="true" 9320 class="svg-wrapper" 9321 > 9322 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 9323<path d="M19.1361 20L11.4929 12.3568C10.8825 12.8764 10.1807 13.2786 9.38723 13.5634C8.59379 13.8483 7.79649 13.9907 6.99533 13.9907C5.04023 13.9907 3.38552 13.3139 2.03119 11.9604C0.677063 10.6069 0 8.95318 0 6.9993C0 5.04522 0.676758 3.39009 2.03027 2.03393C3.38379 0.677977 5.03748 0 6.99136 0C8.94545 0 10.6006 0.677063 11.9567 2.03119C13.3127 3.38552 13.9907 5.04023 13.9907 6.99533C13.9907 7.84349 13.8404 8.66429 13.5399 9.45772C13.2394 10.2512 12.8451 10.9295 12.3568 11.4929L20 19.1364L19.1361 20ZM6.99533 12.77C8.61495 12.77 9.9823 12.2125 11.0974 11.0974C12.2125 9.9825 12.77 8.61515 12.77 6.99533C12.77 5.37551 12.2125 4.00816 11.0974 2.89328C9.9823 1.7782 8.61495 1.22067 6.99533 1.22067C5.37551 1.22067 4.00816 1.7782 2.89328 2.89328C1.7782 4.00816 1.22067 5.37551 1.22067 6.99533C1.22067 8.61515 1.7782 9.9825 2.89328 11.0974C4.00816 12.2125 5.37551 12.77 6.99533 12.77Z" fill="#111111"/> 9324</svg> 9325 9326 </span> 9327 </button> 9328 </search-button> 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338
9338<script 9339 type="module" 9340 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/cart-icon.js?v=157241182139685326961774530324" 9341 fetchpriority="low" 9342></script>
9342 9343 9344 9345 9346<header-actions> 9347 <button 9348 class="st-wishlist-details-button st-wishlist-details-button--header-icon header-actions__action" 9349 data-type="manually" 9350 title="Open Wishlist Details" 9351 aria-label="Open Wishlist Details" 9352 > 9353 <span 9354 class="svg-wrapper st-wishlist-icon" 9355 aria-hidden="true" 9356 > 9357 <svg width="22" height="20" viewBox="0 0 22 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 9358<path d="M11 20L10.0739 19.1446C8.0792 17.2813 6.42919 15.6863 5.12386 14.3598C3.81873 13.033 2.7885 11.8629 2.03317 10.8496C1.27783 9.83634 0.750139 8.91947 0.450083 8.09904C0.150028 7.27881 0 6.4537 0 5.62368C0 4.03426 0.528102 2.69968 1.58431 1.61993C2.64031 0.539977 3.94554 0 5.5 0C6.57494 0 7.58328 0.281184 8.525 0.843552C9.46672 1.40592 10.2917 2.22385 11 3.29735C11.7083 2.22385 12.5333 1.40592 13.475 0.843552C14.4167 0.281184 15.4251 0 16.5 0C18.0545 0 19.3597 0.539977 20.4157 1.61993C21.4719 2.69968 22 4.03426 22 5.62368C22 6.4537 21.85 7.27881 21.5499 8.09904C21.2499 8.91947 20.7222 9.83634 19.9668 10.8496C19.2115 11.8629 18.1851 13.033 16.8878 14.3598C15.5904 15.6863 13.9365 17.2813 11.9261 19.1446L11 20ZM11 18.3082C12.9556 16.5009 14.5648 14.9528 15.8278 13.664C17.0907 12.3749 18.0889 11.2565 18.8222 10.3088C19.5556 9.36114 20.0648 8.52165 20.35 7.79036C20.6352 7.05887 20.7778 6.33664 20.7778 5.62368C20.7778 4.37397 20.3704 3.33255 19.5556 2.49941C18.7407 1.66628 17.7222 1.24971 16.5 1.24971C15.5269 1.24971 14.6291 1.5337 13.8065 2.1017C12.9838 2.66969 12.2473 3.5248 11.5971 4.66703H10.4029C9.73704 3.50876 8.99668 2.64959 8.18186 2.08951C7.36705 1.52964 6.47309 1.24971 5.5 1.24971C4.29346 1.24971 3.27882 1.66628 2.45606 2.49941C1.6335 3.33255 1.22222 4.37397 1.22222 5.62368C1.22222 6.33664 1.36481 7.05887 1.65 7.79036C1.93519 8.52165 2.44444 9.36114 3.17778 10.3088C3.91111 11.2565 4.90926 12.3708 6.17222 13.6518C7.43518 14.9327 9.04444 16.4849 11 18.3082Z" fill="#111111"/> 9359</svg> 9360 9361 </span> 9362 </button> 9363 9364 9365
9365<script 9366 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/dialog.js?v=61774032287387761671774530324" 9367 type="module" 9368 ></script>
9368 9369 9370 <anchored-popover-component 9371 data-close-on-resize="true" 9372 class="account-popover mobile:hidden" 9373 > 9374 <button 9375 class="account-button header-actions__action" 9376 aria-label="Account" 9377 aria-haspopup="dialog"popovertarget="account-popover" 9378 popovertargetaction="toggle"ref="trigger" 9379 9380><span 9381 class="account-button__icon" 9382 aria-hidden="true" 9383 ><svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 9384<path d="M10.5 9.06961C9.2625 9.06961 8.20312 8.62558 7.32188 7.73751C6.44063 6.84944 6 5.78188 6 4.5348C6 3.28773 6.44063 2.22016 7.32188 1.3321C8.20312 0.444033 9.2625 0 10.5 0C11.7375 0 12.7969 0.444033 13.6781 1.3321C14.5594 2.22016 15 3.28773 15 4.5348C15 5.78188 14.5594 6.84944 13.6781 7.73751C12.7969 8.62558 11.7375 9.06961 10.5 9.06961ZM0 20V17.5115C0 16.8875 0.18025 16.3036 0.54075 15.76C0.9015 15.2165 1.38662 14.7945 1.99612 14.494C3.41162 13.81 4.828 13.2969 6.24525 12.9548C7.6625 12.6129 9.08075 12.442 10.5 12.442C11.9193 12.442 13.3375 12.6129 14.7548 12.9548C16.172 13.2969 17.5884 13.81 19.0039 14.494C19.6134 14.7945 20.0985 15.2165 20.4593 15.76C20.8198 16.3036 21 16.8875 21 17.5115V20H0ZM1.5 18.4884H19.5V17.5115C19.5 17.1762 19.3927 16.8613 19.1782 16.5668C18.964 16.2723 18.6674 16.0232 18.2884 15.8197C17.0539 15.217 15.781 14.7554 14.4698 14.4347C13.1585 14.1139 11.8353 13.9536 10.5 13.9536C9.16475 13.9536 7.8415 14.1139 6.53025 14.4347C5.219 14.7554 3.94613 15.217 2.71163 15.8197C2.33262 16.0232 2.036 16.2723 1.82175 16.5668C1.60725 16.8613 1.5 17.1762 1.5 17.5115V18.4884ZM10.5 7.55801C11.325 7.55801 12.0312 7.26199 12.6188 6.66994C13.2063 6.0779 13.5 5.36619 13.5 4.5348C13.5 3.70342 13.2063 2.99171 12.6188 2.39967C12.0312 1.80762 11.325 1.5116 10.5 1.5116C9.675 1.5116 8.96875 1.80762 8.38125 2.39967C7.79375 2.99171 7.5 3.70342 7.5 4.5348C7.5 5.36619 7.79375 6.0779 8.38125 6.66994C8.96875 7.26199 9.675 7.55801 10.5 7.55801Z" fill="#111111"/> 9385</svg> 9386</span></button> 9387 9388 9389 9390 <div 9391 class="account-popover__panel details-content color-scheme-1" 9392 id="account-popover" 9393 popover="auto" 9394 ref="popover" 9395 > 9396 <div class="account-actions"> 9397 <div class="account-actions__main-menu"> 9398 <header class="account-actions__header"> 9399 <h2 9400 id="account-drawer-heading" 9401 class="account-actions__title h5" 9402 > 9403 9404 Account 9405 9406 </h2> 9407 9408 </header> 9409 9410 9411 <div 9412 class="account-actions__sign-ins" 9413 data-skip-subtree-update="true" 9414 > 9415
9415<script 9416 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/account-login-actions.js?v=132624473766457443991774530324" 9417 type="module" 9418 fetchpriority="low" 9419 ></script>
9419 9420 <account-login-actions class="account-actions__shop-login"> 9421
9421<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.shop-login-button.en.esm.js"></script>
vendor: 1 bytes, line 9421
9421
9422<script type="module"> 9423 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.shop-login-button.en.esm.js"); 9424 9425 9426</script>
9426 9427 9428<shop-login-button ux-mode="windoid" return-uri="https://www.tnbl.co.uk/account/redirect" proxy="true" proxy-core-idp="true" redirect-type="iframe" response-type="code"></shop-login-button> 9429 9430 </account-login-actions> 9431 9432 <a 9433 href="/customer_authentication/login?return_to=%2F&locale=en&ui_hint=full®ion_country=GB" 9434 class="account-actions__link button" 9435 > 9436 <span class="account-actions__sign-in-text"> 9437 Other sign in options 9438 </span> 9439 <span class="account-actions__fallback-text"> 9440 Sign in 9441 </span> 9442 </a> 9443 </div> 9444 9445 9446 <nav class="account-actions__nav"> 9447 <ul class="account-actions__list"> 9448 <li class="account-actions__list-item"> 9449 <a 9450 href="/account" 9451 class="account-actions__link button-secondary" 9452 > 9453 <span 9454 class="account-actions__icon" 9455 aria-hidden="true" 9456 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"> 9457 <path stroke-linecap="round" stroke="currentColor" stroke-width="var(--icon-stroke-width)" d="M2.929 7.705c0-.482.154-.95.44-1.338L5.06 4.08c.303-.41.783-.652 1.293-.652h7.42c.525 0 1.018.257 1.319.69l1.577 2.266c.262.377.403.826.403 1.285v8.294c0 .888-.72 1.608-1.608 1.608H4.536c-.888 0-1.607-.72-1.607-1.608V7.705Z"/> 9458 <path stroke="currentColor" stroke-width="var(--icon-stroke-width)" d="M2.929 6.965h14.143M10 3.428v3.535M6.143 14.035v-2.571c0-.178.143-.321.321-.321h3.857c.178 0 .322.143.322.321v2.571a.321.321 0 0 1-.322.322H6.464a.321.321 0 0 1-.321-.322Z"/> 9459</svg> 9460</span> 9461 Orders 9462 </a> 9463 </li> 9464 <li class="account-actions__list-item"> 9465 <a 9466 href="/account/addresses" 9467 class="account-actions__link button-secondary" 9468 > 9469 <span 9470 class="account-actions__icon" 9471 aria-hidden="true" 9472 ><svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 9473<path d="M10.5 9.06961C9.2625 9.06961 8.20312 8.62558 7.32188 7.73751C6.44063 6.84944 6 5.78188 6 4.5348C6 3.28773 6.44063 2.22016 7.32188 1.3321C8.20312 0.444033 9.2625 0 10.5 0C11.7375 0 12.7969 0.444033 13.6781 1.3321C14.5594 2.22016 15 3.28773 15 4.5348C15 5.78188 14.5594 6.84944 13.6781 7.73751C12.7969 8.62558 11.7375 9.06961 10.5 9.06961ZM0 20V17.5115C0 16.8875 0.18025 16.3036 0.54075 15.76C0.9015 15.2165 1.38662 14.7945 1.99612 14.494C3.41162 13.81 4.828 13.2969 6.24525 12.9548C7.6625 12.6129 9.08075 12.442 10.5 12.442C11.9193 12.442 13.3375 12.6129 14.7548 12.9548C16.172 13.2969 17.5884 13.81 19.0039 14.494C19.6134 14.7945 20.0985 15.2165 20.4593 15.76C20.8198 16.3036 21 16.8875 21 17.5115V20H0ZM1.5 18.4884H19.5V17.5115C19.5 17.1762 19.3927 16.8613 19.1782 16.5668C18.964 16.2723 18.6674 16.0232 18.2884 15.8197C17.0539 15.217 15.781 14.7554 14.4698 14.4347C13.1585 14.1139 11.8353 13.9536 10.5 13.9536C9.16475 13.9536 7.8415 14.1139 6.53025 14.4347C5.219 14.7554 3.94613 15.217 2.71163 15.8197C2.33262 16.0232 2.036 16.2723 1.82175 16.5668C1.60725 16.8613 1.5 17.1762 1.5 17.5115V18.4884ZM10.5 7.55801C11.325 7.55801 12.0312 7.26199 12.6188 6.66994C13.2063 6.0779 13.5 5.36619 13.5 4.5348C13.5 3.70342 13.2063 2.99171 12.6188 2.39967C12.0312 1.80762 11.325 1.5116 10.5 1.5116C9.675 1.5116 8.96875 1.80762 8.38125 2.39967C7.79375 2.99171 7.5 3.70342 7.5 4.5348C7.5 5.36619 7.79375 6.0779 8.38125 6.66994C8.96875 7.26199 9.675 7.55801 10.5 7.55801Z" fill="#111111"/> 9474</svg> 9475</span> 9476 Profile 9477 </a> 9478 </li> 9479 </ul> 9480 </nav> 9481 </div> 9482</div> 9483 9484 9485 9486 </div> 9487 </anchored-popover-component> 9488 9489 <dialog-component 9490 class="account-drawer" 9491 9492 > 9493 <button 9494 class="account-button header-actions__action" 9495 aria-label="Account" 9496 aria-haspopup="dialog"ref="trigger"
9497 on:click="/showDialog" 9498><span 9499 class="account-button__icon" 9500 aria-hidden="true" 9501 ><svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 9502<path d="M10.5 9.06961C9.2625 9.06961 8.20312 8.62558 7.32188 7.73751C6.44063 6.84944 6 5.78188 6 4.5348C6 3.28773 6.44063 2.22016 7.32188 1.3321C8.20312 0.444033 9.2625 0 10.5 0C11.7375 0 12.7969 0.444033 13.6781 1.3321C14.5594 2.22016 15 3.28773 15 4.5348C15 5.78188 14.5594 6.84944 13.6781 7.73751C12.7969 8.62558 11.7375 9.06961 10.5 9.06961ZM0 20V17.5115C0 16.8875 0.18025 16.3036 0.54075 15.76C0.9015 15.2165 1.38662 14.7945 1.99612 14.494C3.41162 13.81 4.828 13.2969 6.24525 12.9548C7.6625 12.6129 9.08075 12.442 10.5 12.442C11.9193 12.442 13.3375 12.6129 14.7548 12.9548C16.172 13.2969 17.5884 13.81 19.0039 14.494C19.6134 14.7945 20.0985 15.2165 20.4593 15.76C20.8198 16.3036 21 16.8875 21 17.5115V20H0ZM1.5 18.4884H19.5V17.5115C19.5 17.1762 19.3927 16.8613 19.1782 16.5668C18.964 16.2723 18.6674 16.0232 18.2884 15.8197C17.0539 15.217 15.781 14.7554 14.4698 14.4347C13.1585 14.1139 11.8353 13.9536 10.5 13.9536C9.16475 13.9536 7.8415 14.1139 6.53025 14.4347C5.219 14.7554 3.94613 15.217 2.71163 15.8197C2.33262 16.0232 2.036 16.2723 1.82175 16.5668C1.60725 16.8613 1.5 17.1762 1.5 17.5115V18.4884ZM10.5 7.55801C11.325 7.55801 12.0312 7.26199 12.6188 6.66994C13.2063 6.0779 13.5 5.36619 13.5 4.5348C13.5 3.70342 13.2063 2.99171 12.6188 2.39967C12.0312 1.80762 11.325 1.5116 10.5 1.5116C9.675 1.5116 8.96875 1.80762 8.38125 2.39967C7.79375 2.99171 7.5 3.70342 7.5 4.5348C7.5 5.36619 7.79375 6.0779 8.38125 6.66994C8.96875 7.26199 9.675 7.55801 10.5 7.55801Z" fill="#111111"/> 9503</svg> 9504</span></button> 9505 9506 9507 9508 <dialog 9509 ref="dialog" 9510 class="color-scheme-1 dialog-modal dialog-drawer dialog-bottom-sheet account-drawer__dialog" 9511 scroll-lock 9512 aria-labelledby="account-drawer-heading" 9513 > 9514 <button 9515 ref="closeButton" 9516 on:click="/closeDialog" 9517 class="button button-unstyled close-button account-drawer__close-button" 9518 aria-label="Close dialog" 9519 autofocus 9520 > 9521 <span 9522 class="svg-wrapper" 9523 aria-hidden="true" 9524 ><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 9525 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 9526 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 9527</svg> 9528</span> 9529 </button> 9530 <div class="account-actions"> 9531 <div class="account-actions__main-menu"> 9532 <header class="account-actions__header"> 9533 <h2 9534 id="account-drawer-heading" 9535 class="account-actions__title h5" 9536 > 9537 9538 Account 9539 9540 </h2> 9541 9542 </header> 9543 9544 9545 <div 9546 class="account-actions__sign-ins" 9547 data-skip-subtree-update="true" 9548 > 9549
9549<script 9550 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/account-login-actions.js?v=132624473766457443991774530324" 9551 type="module" 9552 fetchpriority="low" 9553 ></script>
9553 9554 <account-login-actions class="account-actions__shop-login"> 9555
9555<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.shop-login-button.en.esm.js"></script>
vendor: 1 bytes, line 9555
9555
9556<script type="module"> 9557 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.shop-login-button.en.esm.js"); 9558 9559 9560</script>
9560 9561 9562<shop-login-button ux-mode="windoid" return-uri="https://www.tnbl.co.uk/account/redirect" proxy="true" proxy-core-idp="true" redirect-type="iframe" response-type="code"></shop-login-button> 9563 9564 </account-login-actions> 9565 9566 <a 9567 href="/customer_authentication/login?return_to=%2F&locale=en&ui_hint=full®ion_country=GB" 9568 class="account-actions__link button" 9569 > 9570 <span class="account-actions__sign-in-text"> 9571 Other sign in options 9572 </span> 9573 <span class="account-actions__fallback-text"> 9574 Sign in 9575 </span> 9576 </a> 9577 </div> 9578 9579 9580 <nav class="account-actions__nav"> 9581 <ul class="account-actions__list"> 9582 <li class="account-actions__list-item"> 9583 <a 9584 href="/account" 9585 class="account-actions__link button-secondary" 9586 > 9587 <span 9588 class="account-actions__icon" 9589 aria-hidden="true" 9590 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"> 9591 <path stroke-linecap="round" stroke="currentColor" stroke-width="var(--icon-stroke-width)" d="M2.929 7.705c0-.482.154-.95.44-1.338L5.06 4.08c.303-.41.783-.652 1.293-.652h7.42c.525 0 1.018.257 1.319.69l1.577 2.266c.262.377.403.826.403 1.285v8.294c0 .888-.72 1.608-1.608 1.608H4.536c-.888 0-1.607-.72-1.607-1.608V7.705Z"/> 9592 <path stroke="currentColor" stroke-width="var(--icon-stroke-width)" d="M2.929 6.965h14.143M10 3.428v3.535M6.143 14.035v-2.571c0-.178.143-.321.321-.321h3.857c.178 0 .322.143.322.321v2.571a.321.321 0 0 1-.322.322H6.464a.321.321 0 0 1-.321-.322Z"/> 9593</svg> 9594</span> 9595 Orders 9596 </a> 9597 </li> 9598 <li class="account-actions__list-item"> 9599 <a 9600 href="/account/addresses" 9601 class="account-actions__link button-secondary" 9602 > 9603 <span 9604 class="account-actions__icon" 9605 aria-hidden="true" 9606 ><svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 9607<path d="M10.5 9.06961C9.2625 9.06961 8.20312 8.62558 7.32188 7.73751C6.44063 6.84944 6 5.78188 6 4.5348C6 3.28773 6.44063 2.22016 7.32188 1.3321C8.20312 0.444033 9.2625 0 10.5 0C11.7375 0 12.7969 0.444033 13.6781 1.3321C14.5594 2.22016 15 3.28773 15 4.5348C15 5.78188 14.5594 6.84944 13.6781 7.73751C12.7969 8.62558 11.7375 9.06961 10.5 9.06961ZM0 20V17.5115C0 16.8875 0.18025 16.3036 0.54075 15.76C0.9015 15.2165 1.38662 14.7945 1.99612 14.494C3.41162 13.81 4.828 13.2969 6.24525 12.9548C7.6625 12.6129 9.08075 12.442 10.5 12.442C11.9193 12.442 13.3375 12.6129 14.7548 12.9548C16.172 13.2969 17.5884 13.81 19.0039 14.494C19.6134 14.7945 20.0985 15.2165 20.4593 15.76C20.8198 16.3036 21 16.8875 21 17.5115V20H0ZM1.5 18.4884H19.5V17.5115C19.5 17.1762 19.3927 16.8613 19.1782 16.5668C18.964 16.2723 18.6674 16.0232 18.2884 15.8197C17.0539 15.217 15.781 14.7554 14.4698 14.4347C13.1585 14.1139 11.8353 13.9536 10.5 13.9536C9.16475 13.9536 7.8415 14.1139 6.53025 14.4347C5.219 14.7554 3.94613 15.217 2.71163 15.8197C2.33262 16.0232 2.036 16.2723 1.82175 16.5668C1.60725 16.8613 1.5 17.1762 1.5 17.5115V18.4884ZM10.5 7.55801C11.325 7.55801 12.0312 7.26199 12.6188 6.66994C13.2063 6.0779 13.5 5.36619 13.5 4.5348C13.5 3.70342 13.2063 2.99171 12.6188 2.39967C12.0312 1.80762 11.325 1.5116 10.5 1.5116C9.675 1.5116 8.96875 1.80762 8.38125 2.39967C7.79375 2.99171 7.5 3.70342 7.5 4.5348C7.5 5.36619 7.79375 6.0779 8.38125 6.66994C8.96875 7.26199 9.675 7.55801 10.5 7.55801Z" fill="#111111"/> 9608</svg> 9609</span> 9610 Profile 9611 </a> 9612 </li> 9613 </ul> 9614 </nav> 9615 </div> 9616</div> 9617 9618 9619 9620 </dialog> 9621 </dialog-component> 9622 9623 9624 9625 <a 9626 href="/cart" 9627 class="header-actions__action action__cart" 9628 aria-label="Cart" 9629 aria-describedby="cart-bubble-text" 9630 > 9631 9632 <cart-icon 9633 class=" 9634 header-actions__cart-icon 9635 9636 " 9637 data-testid="cart-icon" 9638 > 9639 <span 9640 class="svg-wrapper" 9641 aria-hidden="true" 9642 > 9643 <svg width="16" height="20" viewBox="0 0 16 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 9644<path d="M1.84629 20C1.32019 20 0.880952 19.8287 0.528571 19.4861C0.17619 19.1435 0 18.7165 0 18.205V6.23944C0 5.72796 0.17619 5.30093 0.528571 4.95833C0.880952 4.61574 1.32019 4.44444 1.84629 4.44444H4V3.88889C4 2.80907 4.38905 1.89102 5.16714 1.13472C5.94505 0.37824 6.88933 0 8 0C9.11067 0 10.055 0.37824 10.8329 1.13472C11.611 1.89102 12 2.80907 12 3.88889V4.44444H14.1537C14.6798 4.44444 15.119 4.61574 15.4714 4.95833C15.8238 5.30093 16 5.72796 16 6.23944V18.205C16 18.7165 15.8238 19.1435 15.4714 19.4861C15.119 19.8287 14.6798 20 14.1537 20H1.84629ZM1.84629 18.8889H14.1537C14.3297 18.8889 14.491 18.8177 14.6374 18.6753C14.7839 18.5329 14.8571 18.3761 14.8571 18.205V6.23944C14.8571 6.06833 14.7839 5.91157 14.6374 5.76917C14.491 5.62676 14.3297 5.55556 14.1537 5.55556H12V8.33333C12 8.49148 11.9454 8.62361 11.8363 8.72972C11.7271 8.83583 11.5912 8.88889 11.4286 8.88889C11.2659 8.88889 11.13 8.83583 11.02
964409 8.72972C10.9117 8.62361 10.8571 8.49148 10.8571 8.33333V5.55556H5.14286V8.33333C5.14286 8.49148 5.08829 8.62361 4.97914 8.72972C4.87 8.83583 4.7341 8.88889 4.57143 8.88889C4.40876 8.88889 4.27286 8.83583 4.16371 8.72972C4.05457 8.62361 4 8.49148 4 8.33333V5.55556H1.84629C1.67029 5.55556 1.50905 5.62676 1.36257 5.76917C1.2161 5.91157 1.14286 6.06833 1.14286 6.23944V18.205C1.14286 18.3761 1.2161 18.5329 1.36257 18.6753C1.50905 18.8177 1.67029 18.8889 1.84629 18.8889ZM5.14286 4.44444H10.8571V3.88889C10.8571 3.10685 10.5821 2.44833 10.032 1.91333C9.48171 1.37852 8.80438 1.11111 8 1.11111C7.19562 1.11111 6.51829 1.37852 5.968 1.91333C5.4179 2.44833 5.14286 3.10685 5.14286 3.88889V4.44444Z" fill="#111111"/> 9645</svg> 9646 9647 </span> 9648 9649 <div 9650 ref="cartBubble" 9651 class="cart-bubble visually-hidden" 9652 9653 9654 data-maintain-ratio 9655 9656> 9657 <span class="cart-bubble__background"></span> 9658 <span 9659 ref="cartBubbleText" 9660 id="cart-bubble-text" 9661 class="cart-bubble__text" 9662 9663 role="status" 9664 9665 > 9666 <span class="visually-hidden">Total items in cart: 0 9667 </span> 9668 <span 9669 class="cart-bubble__text-count hidden" 9670 ref="cartBubbleCount" 9671 aria-hidden="true" 9672 data-testid="cart-bubble" 9673 > 96740</span> 9675 </span> 9676</div> 9677 9678 </cart-icon> 9679 9680 </a> 9681 9682</header-actions> 9683 9684 9685 9686 9687 9688 9689 </div> 9690 </div> 9691 </div> 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703</header-component> 9704
9705<script 9706 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/header.js?v=155792906110242140481774530326" 9707 type="module" 9708></script>
9708 9709 9710 9711 9712 9713
9713<script type="module"> 9714 import { hydrate } from '@theme/section-hydration'; 9715 const url = new URL(window.location.href); 9716 url.searchParams.delete('page'); 9717 hydrate('sections--28213213561178__header_section', url); 9718 </script>
9718 9719 9720 9721 9722</header> 9723<!-- END sections: header-group --> 9724 </div> 9725 9726
9726<script> 9727 // Inline header height calculation to prevent layout shift 9728 // Note: Updates in calculateHeaderGroupHeight() and updateTransparentHeaderOffset()utilities.js should be kept in sync with this function 9729 (function setHeaderHeighCustomProperties() { 9730 /* 9731 * Header calculation functions for maintaining CSS variables 9732 * Mimic calculateHeaderGroupHeight() in utilities.js 9733 */ 9734 const header = document.querySelector('header-component'); 9735 const headerGroup = document.querySelector('#header-group'); 9736 const hasHeaderSection = headerGroup?.querySelector('.header-section'); 9737 9738 if (!header || !headerGroup) return; 9739 9740 const headerHeight = header.offsetHeight; 9741 9742 // Calculate the total height of the header group 9743 let headerGroupHeight = 0; 9744 const children = headerGroup.children; 9745 for (let i = 0; i < children.length; i++) { 9746 const element = children[i]; 9747 if (element === header || !(element instanceof HTMLElement)) continue; 9748 headerGroupHeight += element.offsetHeight; 9749 } 9750 9751 // Check for transparent header special case 9752 if (header.hasAttribute('transparent') && header.parentElement?.nextElementSibling) { 9753 headerGroupHeight += headerHeight; 9754 } 9755 9756 // Set CSS variables 9757 document.body.style.setProperty('--header-height', `${headerHeight}px`); 9758 document.body.style.setProperty('--header-group-height', `${headerGroupHeight}px`); 9759 9760 /** 9761 * Updates CSS custom properties for transparent header offset calculation 9762 * Mimic updateTransparentHeaderOffset() in utilities.js 9763 */ 9764 9765 if (!hasHeaderSection || !header?.hasAttribute('transparent')) { 9766 document.body.style.setProperty('--transparent-header-offset-boolean', '0'); 9767 return; 9768 } 9769 9770 const hasImmediateSection = hasHeaderSection.nextElementSibling?.classList.contains('shopify-section'); 9771 9772 const shouldApplyOffset = !hasImmediateSection ? '1' : '0'; 9773 document.body.style.setProperty('--transparent-header-offset-boolean', shouldApplyOffset); 9774 })(); 9775 </script>
9775 9776 9777 <main 9778 id="MainContent" 9779 class="content-for-layout" 9780 role="main" 9781 data-page-transition-enabled="true" 9782 data-product-transition="true" 9783 data-template="index" 9784 > 9785 <div id="shopify-section-template--28213213921626__1791215612c0a88329" class="shopify-section section-wrapper"> 9786 9787 9788 9789<div class="section-background color-scheme-1"></div> 9790<div 9791 class="section section--page-width color-scheme-1" 9792 data-testid="ui-test-section" 9793 9794 9795 9796 style=" 9797 9798 9799 9800 " 9801> 9802 <div class="custom-section-background"> 9803 9804 9805 9806 9807 </div> 9808 9809 <div 9810 class="border-style custom-section-content" 9811 style="--border-width: 1px; --border-style: none; --border-color: 9812rgb(var(--color-border-rgb) / 1.0); --border-radius: 98130px; 9814" 9815 > 9816 9817 9818 <div 9819 class=" 9820 spacing-style 9821 layout-panel-flex 9822 layout-panel-flex--column 9823 section-content-wrapper 9824 mobile-column 9825 " 9826 style=" 9827 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 9828 9829--gap: 12px; 9830 9831--horizontal-alignment: flex-start; --vertical-alignment: center; 9832--vertical-alignment-mobile: center; 9833 9834 --padding-block-start: 0px;--padding-block-end: 0px; 9835 " 9836 data-testid="section-content" 9837 > 9838 9839 9840 9841<style data-shopify> 9842.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv{display:block;width:100%}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__viewport{position:relative;width:100%;max-width:100%;overflow:hidden;background:#eee9df}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide{display:none;position:relative;width:100%;height:600px;color:#000000}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide.is-active{display:block}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__media,.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__shade{position:absolute;inset:0}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__media img,.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__placeholder svg{display:block;width:100%;height:100%;object-fit:cover}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__shade{background:rgba(0,0,0,0.05)}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__placeholder{height:100%}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__empty{position:absolute;bottom:12px;left:50%;transform:translateX(-50%);color:#333;background:#fff;padding:8px}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content{position:absolute;z-index:1;display:flex;flex-direction:column;gap:12px;max-width:80%;padding:clamp(20px,5vw,64px)} 9843.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide-1 .ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content{text-align:left;top:0;left:0;}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide-2 .ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content{text-align:left;top:0;left:0;}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide-3 .ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content{text-align:left;top:0;left:0;}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide-4 .ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content{text-align:left;top:0;left:0;} 9844.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__heading{margin:0;font-family:Cormorant,serif;font-size:50px;line-height:1.1}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__text{font-family:"Mona Sans",sans-serif;font-size:18px;line-height:1.5}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__text p{margin:0}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__button{display:inline-flex;width:fit-content;padding:12px 24px;background:#ac9669;color:#ffffff;text-decoration:none}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow{position:absolute;z-index:3;top:50%;transform:translateY(-50%);width:42px;height:42px;border:1px solid #fff;border-radius:50%;background:rgba(0,0,0,.7);color:#fff;cursor:pointer}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow--prev{left:16px}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow--next{right:16px}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dots{position:absolute;z-index:3;bottom:14px;left:50%;transform:translateX(-50%);display:flex;gap:8px}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dot{width:12px;height:12px;border:1px solid #fff;border-radius:50%;background:transparent}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dot[aria-current=true]{background:#fff}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__button:focus-visible,.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow:focus-visible,.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dot:focus-visible{outline:2px solid currentColor;outline-offset:3px}@media(max-width:749px){.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__viewport{width:100%}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide{height:400px}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content{max-width:92%;padding:22px}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__heading{font-size:18px}.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__text{font-size:12px}} 9845</style> 9846<final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv" data-autoplay="false" data-interval="5" ><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__viewport" aria-roledescription="carousel"> 9847<div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide-1 is-active" ><a href="https://www.tnbl.co.uk/products/apres-nova-led-lamp-mini?_pos=2&_psq=nova&_psid=4f35e873a&_ss=e" aria-label="High Standards. Mini Nova." style="position:absolute;inset:0;z-index:0"></a><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__media"><picture><source media="(max-width:749px)" srcset="//www.tnbl.co.uk/cdn/shop/files/Get_a_FREE_Extend_Gel_Set_with_every_Mini_Nova_LED_Lamp_while_stocks_last_3.png?v=1791471296&width=1000"><img src="//www.tnbl.co.uk/cdn/shop/files/High_Standards._Mini_Nova._1600_x_8
984700_px_1.png?v=1791471034&width=2400" alt="High Standards. Mini Nova." loading="lazy" width="1600" height="800"></picture></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__shade"></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content"><h2 class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__heading">High Standards. Mini Nova.</h2><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__text"><p><br/>45 dual-wavelength LEDs, <br/>Low Heat Mode, Auto-Sensor, & moreâbuilt for every station.<br/><br/>Get a FREE Extend Gel Set with every<br/>Mini Nova LED Lamp â while stocks last!<br/><br/><br/></p></div><a class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__button" href="https://www.tnbl.co.uk/products/apres-nova-led-lamp-mini?_pos=2&_psq=nova&_psid=4f35e873a&_ss=e">Shop Mini Nova</a></div></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide-2" hidden><a href="/collections/opi-gelcolor-intelli-gel" aria-label="OPI INTELLI-GEL" style="position:absolute;inset:0;z-index:0"></a><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__media"><picture><source media="(max-width:749px)" srcset="//www.tnbl.co.uk/cdn/shop/files/opi_intelli-gel.jpg?v=1791231412&width=1000"><img src="//www.tnbl.co.uk/cdn/shop/files/opi_intelli-gel_banner.jpg?v=1791231387&width=2400" alt="OPI INTELLI-GEL" loading="lazy" width="1600" height="800"></picture></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__shade"></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content"><h2 class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__heading">OPI INTELLI-GEL</h2><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__text"><p>BOLD COLOURS. MODERN SHINE.<br/></p></div><a class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__button" href="/collections/opi-gelcolor-intelli-gel">shop now.</a></div></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide-3" hidden><a href="/products/onail-nail-drill-pro-max" aria-label="King of Nail Drills" style="position:absolute;inset:0;z-index:0"></a><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__media"><picture><source media="(max-width:749px)" srcset="//www.tnbl.co.uk/cdn/shop/files/Minimalist_ONAIL_Nail_Device_Studio_Shot.png?v=1791230775&width=1000"><img src="//www.tnbl.co.uk/cdn/shop/files/onail_banner_2.jpg?v=1783521723&width=2400" alt="King of Nail Drills" loading="lazy" width="1869" height="842"></picture></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__shade"></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content"><h2 class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__heading">King of Nail Drills</h2><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__text"><p>Up to 50,000 RPM</p><p>Ultra-Low Vibration</p><p>Quieter Performance</p><p>Cordless & Rechargeable</p><p></p></div><a class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__button" href="/products/onail-nail-drill-pro-max">shop now.</a></div></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide-4" hidden><a href="/collections/soft-gel-builders" aria-label="COLOR SOFT GEL BUILDER" style="position:absolute;inset:0;z-index:0"></a><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__media"><picture><source media="(max-width:749px)" srcset="//www.tnbl.co.uk/cdn/shop/files/Pastel_Pink_Gel_Polish_Collection.png?v=1791231165&width=1000"><img src="//www.tnbl.co.uk/cdn/shop/files/Apres_ColorSoftGelBuilder_LifestylePhotos162.jpg?v=1791231152&width=2400" alt="COLOR SOFT GEL BUILDER" loading="lazy" width="2500" height="1280"></picture></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__shade"></div><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__content"><h2 class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__heading">COLOR SOFT GEL BUILDER</h2><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__text"><p>Available in 5 colors</p></div><a class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__button" href="/collections/soft-gel-builders">shop now.</a></div></div> 9848<button class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow--prev" aria-label="Previous slide" type="button">â¹</button><button class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow--next" aria-label="Next slide" type="button">âº</button><div class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dots" role="group" aria-label="Cho
9848ose slide"><button class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dot" type="button" data-dot="0" aria-label="Go to slide 1" aria-current="true"></button><button class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dot" type="button" data-dot="1" aria-label="Go to slide 2" ></button><button class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dot" type="button" data-dot="2" aria-label="Go to slide 3" ></button><button class="ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dot" type="button" data-dot="3" aria-label="Go to slide 4" ></button></div></div></final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv>
9849<script>(function(){const n='final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv';if(customElements.get(n))return;class S extends HTMLElement{connectedCallback(){this.s=[...this.querySelectorAll('.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__slide')];this.d=[...this.querySelectorAll('.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__dot')];this.i=0;this.querySelector('.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow--prev')?.addEventListener('click',()=>this.show(this.i-1));this.querySelector('.ai-final-slideshow-asgh6cjh3n2twvgxttaigenblock0f1f114bfjyzv__arrow--next')?.addEventListener('click',()=>this.show(this.i+1));this.d.forEach(x=>x.addEventListener('click',()=>this.show(+x.dataset.dot)));if(this.dataset.autoplay==='true'&&this.s.length>1&&!matchMedia('(prefers-reduced-motion: reduce)').matches)this.timer=setInterval(()=>this.show(this.i+1),+this.dataset.interval*1000)}disconnectedCallback(){clearInterval(this.timer)}show(i){this.i=(i+this.s.length)%this.s.length;this.s.forEach((x,j)=>{x.hidden=j!==this.i;x.classList.toggle('is-active',j===this.i)});this.d.forEach((x,j)=>j===this.i?x.setAttribute('aria-current','true'):x.removeAttribute('aria-current'))}}customElements.define(n,S)})();</script>
9849 9850 9851 9852 </div> 9853 </div> 9854</div> 9855 9856 9857 9858 9859 9860</div><div id="shopify-section-template--28213213921626__collection_list_dEADaM" class="shopify-section ui-test-collection-list"> 9861 9862 9863 9864<div class="section-background color-scheme-1"></div> 9865 9866<div 9867 class=" 9868 section 9869 section--page-width 9870 color-scheme-1 9871 section-resource-list 9872 section-collection-list 9873 spacing-style 9874 gap-style 9875 9876 " 9877 style=" 9878 --padding-block-start: max(20px, calc(var(--spacing-scale) * 50px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 25px)); 9879 --gap: 12px; 9880 " 9881 id="collection-list-template--28213213921626__collection_list_dEADaM" 9882 data-testid="collection-list" 9883 data-collection-card-reveal-enabled="false" 9884 data-collection-card-reveal-stagger-ms="100" 9885 data-mobile-columns="2" 9886 data-mobile-card-size="60cqw" 9887> 9888 <div class="section-resource-list__content"></div> 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898<div 9899 class=" 9900 resource-list 9901 9902 9903 resource-list--grid 9904 " 9905 style="--resource-list-column-gap-desktop: 24px;--resource-list-row-gap-desktop: 8px;--resource-list-columns: repeat(6, 1fr);--resource-list-columns-tablet: repeat(3, 1fr);--resource-list-columns-mobile: repeat(2, 1fr);--column-count-mobile: 2;" 9906 9907 data-testid="collections-list-grid" 9908 9909> 9910 9911 9912 9913 <div 9914 class="resource-list__item" 9915 9916 > 9917 9918 9919 9920 9921 9922 9923 9924 9925<style data-shopify> 9926 9927</style> 9928 9929 9930 9931<div 9932 class=" 9933 collection-card 9934 border-style 9935 9936 9937 9938 9939 " 9940 data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card" 9941 9942 style=" 9943 --border-width: 1px; --border-style: none; --border-color: 9944rgb(var(--color-border-rgb) / 1.0); --border-radius: 994512px; overflow: hidden; 9946 9947 --horizontal-alignment: flex-start; 9948 --vertical-alignment: flex-start; 9949 --background-overlay-color: ; 9950 --gap: 8px; 9951 "> 9952 <a 9953 class="collection-card__link" 9954 9955 href="/collections/apres" 9956 9957 > 9958 <span class="visually-hidden">Apres</span> 9959 </a> 9960 <div class="collection-card__inner"> 9961 9962 9963 9964 9965 9966 9967 9968<style data-shopify> 9969 9970 .collection-card[data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card"] { 9971 --ratio: 1.375; 9972 } 9973 9974 9975</style> 9976 9977 9978 <div 9979 class=" 9980 image-block 9981 resource-image 9982 9983 9984 collection-card__image 9985 9986 spacing-style border-style 9987 9988 " 9989 style="--border-width: 1px; --border-style: none; --border-color: 9990rgb(var(--color-border-rgb) / 1.0); --border-radius: 99910px; 9992" 9993 9994 > 9995 <img src="//www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=3840" alt="Apres" srcset="//www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=240 240w, //www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=352 352w, //www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=832 832w, //www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/collections/ApresNails_60496a8d-449e-40fe-91eb-59e7e00d25b5.png?v=1770738257&width=3840 3840w" width="3840" height="2793" loading="eager" class="image-block__image" sizes="(min-width: 750px) 16vw, 100vw"> 9996 9997 </div> 9998 9999 10000 10001 10002 10003 10004 10005 10006 <div class="collection-card__content layout-panel-flex--column"> 10007 10008 10009 10010 10011 10012<div class="collection-title-wrapper collection-title-wrapper--arrow-on-mobile"> 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 <div class=" spacing-style text-block text-block--ARlJ4VmczaVlJelhka__collection_title_zD33z9 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:4px; --padding-inline-start:8px; --padding-inline-end:4px; --color: var(--color-foreground);--font-size: 1.125rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 10024 <p>Apres</p> 10025 </div> 10026 10027 10028 10029 10030
10031<script type="module"> 10032 class TextReadMoreWrapper extends HTMLElement { 10033 #expanded = false; 10034 #animation = null; 10035 #collapsedHeight = 0; 10036 10037 connectedCallback() { 10038 const content = this.querySelector('.text-read-more__content'); 10039 const textElement = this.querySelector('.text-read-more__text'); 10040 const button = this.querySelector('.text-read-more__button'); 10041 10042 if (!content || !textElement || !button) return; 10043 10044 // Set initial state 10045 this.dataset.expanded = 'false'; 10046 10047 // Wait for content to render - use double RAF to ensure layout is complete 10048 requestAnimationFrame(() => { 10049 requestAnimationFrame(() => { 10050 // Additional small delay to ensure fonts and styles are applied 10051 setTimeout(() => { 10052 this.#checkOverflow(content, textElement, button); 10053 }, 50); 10054 10055 // Recheck on resize 10056 const resizeObserver = new ResizeObserver(() => { 10057 if (!this.#expanded) { 10058 this.#checkOverflow(content, textElement, button); 10059 } 10060 }); 10061 resizeObserver.observe(content); 10062 10063 // Setup button click handler 10064 button.addEventListener('click', (e) => { 10065 e.preventDefault(); 10066 this.#toggle(content, textElement, button); 10067 }); 10068 }); 10069 }); 10070 } 10071 10072 #checkOverflow(content, textElement, button) { 10073 // Ensure collapsed state is applied 10074 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 10075 textElement.classList.add('text-read-more__text--collapsed'); 10076 } 10077 10078 // Get collapsed height first 10079 const collapsedHeight = content.scrollHeight; 10080 this.#collapsedHeight = collapsedHeight; 10081 10082 // Temporarily remove line-clamp to measure full height 10083 textElement.classList.remove('text-read-more__text--collapsed'); 10084 10085 // Force reflow 10086 void content.offsetHeight; 10087 10088 const fullHeight = content.scrollHeight; 10089 10090 // Restore line-clamp 10091 textElement.classList.add('text-read-more__text--collapsed'); 10092 10093 // Show button if content exceeds 2 lines (with small threshold for rounding) 10094 if (fullHeight > collapsedHeight + 5) { 10095 button.removeAttribute('hidden'); 10096 } else { 10097 button.setAttribute('hidden', ''); 10098 } 10099 } 10100 10101 #toggle(content, textElement, button) { 10102 const startHeight = content.offsetHeight; 10103 let endHeight; 10104 10105 if (!this.#expanded) { 10106 // Expanding 10107 textElement.classList.remove('text-read-more__text--collapsed'); 10108 endHeight = content.scrollHeight; 10109 this.#expanded = true; 10110 } else { 10111 // Collapsing 10112 endHeight = this.#collapsedHeight; 10113 this.#expanded = false; 10114 } 10115 10116 this.dataset.expanded = this.#expanded; 10117 button.setAttribute('aria-expanded', this.#expanded); 10118 10119 // Animate 10120 content.style.overflow = 'hidden'; 10121 this.#animation?.cancel(); 10122 10123 this.#animation = content.animate( 10124 { 10125 height: [`${startHeight}px`, `${endHeight}px`], 10126 }, 10127 { 10128 duration: 300, 10129 easing: 'ease-in-out', 10130 } 10131 ); 10132 10133 this.#animation.onfinish = () => { 10134 if (this.#expanded) { 10135 content.style.removeProperty('height'); 10136 content.style.overflow = ''; 10137 } else { 10138 textElement.classList.add('text-read-more__text--collapsed'); 10139 content.style.removeProperty('height'); 10140 content.style.overflow = ''; 10141 } 10142 }; 10143 } 10144 } 10145 10146 if (!customElements.get('text-read-more-wrapper')) { 10147 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 10148 } 10149</script>
10149 10150 10151 10152 10153 <span class="collection-title-arrow"> 10154 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 10155 <path d="M1.5 1L6.5 6L1.5 11" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 10156</svg> 10157 10158 </span> 10159 10160</div> 10161 10162 10163 10164 10165 10166 10167 </div> 10168 </div> 10169</div> 10170 10171 10172 10173 10174 10175 10176 </div> 10177 10178 <!--@list/split--> 10179 10180 10181 <div 10182 class="resource-list__item" 10183 10184 > 10185 10186 10187 10188 10189 10190 10191 10192 10193<style data-shopify> 10194 10195</style> 10196 10197 10198 10199<div 10200 class=" 10201 collection-card 10202 border-style 10203 10204 10205 10206 10207 " 10208 data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-1" 10209 10210 style=" 10211 --border-width: 1px; --border-style: none; --border-color: 10212rgb(var(--color-border-rgb) / 1.0); --border-radius: 1021312px; overflow: hidden; 10214 10215 --horizontal-alignment: flex-start; 10216 --vertical-alignment: flex-start; 10217 --background-overlay-color: ; 10218 --gap: 8px; 10219 "> 10220 <a 10221 class="collection-card__link" 10222 10223 href="/collections/gel-nail-polish" 10224 10225 > 10226 <span class="visually-hidden">Gel & Nail Polish</span> 10227 </a> 10228 <div class="collection-card__inner"> 10229 10230 10231 10232 10233 10234 10235 10236<style data-shopify> 10237 10238 .collection-card[data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-1"] { 10239 --ratio: 1.375; 10240 } 10241 10242 10243</style> 10244 10245 10246 <div 10247 class=" 10248 image-block 10249 resource-image 10250 10251 10252 collection-card__image 10253 10254 spacing-style border-style 10255 10256 " 10257 style="--border-width: 1px; --border-style: none; --border-color: 10258rgb(var(--color-border-rgb) / 1.0); --border-radius: 102590px; 10260" 10261 10262 > 10263 <img src="//www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=3840" alt="Gel & Nail Polish" srcset="//www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=240 240w, //www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=352 352w, //www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=832 832w, //www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/collections/Gel_NailPolish.png?v=1770738296&width=3840 3840w" width="3840" height="2793" loading="eager" class="image-block__image" sizes="(min-width: 750px) 16vw, 100vw"> 10264 10265 </div> 10266 10267 10268 10269 10270 10271 10272 10273 10274 <div class="collection-card__content layout-panel-flex--column"> 10275 10276 10277 10278 10279 10280<div class="collection-title-wrapper collection-title-wrapper--arrow-on-mobile"> 10281 10282 10283 10284 10285 10286 10287 10288 10289 10290 10291 <div class=" spacing-style text-block text-block--ARlJ4VmczaVlJelhka__collection_title_zD33z9-1 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:4px; --padding-inline-start:8px; --padding-inline-end:4px; --color: var(--color-foreground);--font-size: 1.125rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 10292 <p>Gel & Nail Polish</p> 10293 </div> 10294 10295 10296 10297 10298
10299<script type="module"> 10300 class TextReadMoreWrapper extends HTMLElement { 10301 #expanded = false; 10302 #animation = null; 10303 #collapsedHeight = 0; 10304 10305 connectedCallback() { 10306 const content = this.querySelector('.text-read-more__content'); 10307 const textElement = this.querySelector('.text-read-more__text'); 10308 const button = this.querySelector('.text-read-more__button'); 10309 10310 if (!content || !textElement || !button) return; 10311 10312 // Set initial state 10313 this.dataset.expanded = 'false'; 10314 10315 // Wait for content to render - use double RAF to ensure layout is complete 10316 requestAnimationFrame(() => { 10317 requestAnimationFrame(() => { 10318 // Additional small delay to ensure fonts and styles are applied 10319 setTimeout(() => { 10320 this.#checkOverflow(content, textElement, button); 10321 }, 50); 10322 10323 // Recheck on resize 10324 const resizeObserver = new ResizeObserver(() => { 10325 if (!this.#expanded) { 10326 this.#checkOverflow(content, textElement, button); 10327 } 10328 }); 10329 resizeObserver.observe(content); 10330 10331 // Setup button click handler 10332 button.addEventListener('click', (e) => { 10333 e.preventDefault(); 10334 this.#toggle(content, textElement, button); 10335 }); 10336 }); 10337 }); 10338 } 10339 10340 #checkOverflow(content, textElement, button) { 10341 // Ensure collapsed state is applied 10342 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 10343 textElement.classList.add('text-read-more__text--collapsed'); 10344 } 10345 10346 // Get collapsed height first 10347 const collapsedHeight = content.scrollHeight; 10348 this.#collapsedHeight = collapsedHeight; 10349 10350 // Temporarily remove line-clamp to measure full height 10351 textElement.classList.remove('text-read-more__text--collapsed'); 10352 10353 // Force reflow 10354 void content.offsetHeight; 10355 10356 const fullHeight = content.scrollHeight; 10357 10358 // Restore line-clamp 10359 textElement.classList.add('text-read-more__text--collapsed'); 10360 10361 // Show button if content exceeds 2 lines (with small threshold for rounding) 10362 if (fullHeight > collapsedHeight + 5) { 10363 button.removeAttribute('hidden'); 10364 } else { 10365 button.setAttribute('hidden', ''); 10366 } 10367 } 10368 10369 #toggle(content, textElement, button) { 10370 const startHeight = content.offsetHeight; 10371 let endHeight; 10372 10373 if (!this.#expanded) { 10374 // Expanding 10375 textElement.classList.remove('text-read-more__text--collapsed'); 10376 endHeight = content.scrollHeight; 10377 this.#expanded = true; 10378 } else { 10379 // Collapsing 10380 endHeight = this.#collapsedHeight; 10381 this.#expanded = false; 10382 } 10383 10384 this.dataset.expanded = this.#expanded; 10385 button.setAttribute('aria-expanded', this.#expanded); 10386 10387 // Animate 10388 content.style.overflow = 'hidden'; 10389 this.#animation?.cancel(); 10390 10391 this.#animation = content.animate( 10392 { 10393 height: [`${startHeight}px`, `${endHeight}px`], 10394 }, 10395 { 10396 duration: 300, 10397 easing: 'ease-in-out', 10398 } 10399 ); 10400 10401 this.#animation.onfinish = () => { 10402 if (this.#expanded) { 10403 content.style.removeProperty('height'); 10404 content.style.overflow = ''; 10405 } else { 10406 textElement.classList.add('text-read-more__text--collapsed'); 10407 content.style.removeProperty('height'); 10408 content.style.overflow = ''; 10409 } 10410 }; 10411 } 10412 } 10413 10414 if (!customElements.get('text-read-more-wrapper')) { 10415 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 10416 } 10417</script>
10417 10418 10419 10420 10421 <span class="collection-title-arrow"> 10422 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 10423 <path d="M1.5 1L6.5 6L1.5 11" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 10424</svg> 10425 10426 </span> 10427 10428</div> 10429 10430 10431 10432 10433 10434 10435 </div> 10436 </div> 10437</div> 10438 10439 10440 10441 10442 10443 10444 </div> 10445 10446 <!--@list/split--> 10447 10448 10449 <div 10450 class="resource-list__item" 10451 10452 > 10453 10454 10455 10456 10457 10458 10459 10460 10461<style data-shopify> 10462 10463</style> 10464 10465 10466 10467<div 10468 class=" 10469 collection-card 10470 border-style 10471 10472 10473 10474 10475 " 10476 data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-2" 10477 10478 style=" 10479 --border-width: 1px; --border-style: none; --border-color: 10480rgb(var(--color-border-rgb) / 1.0); --border-radius: 1048112px; overflow: hidden; 10482 10483 --horizontal-alignment: flex-start; 10484 --vertical-alignment: flex-start; 10485 --background-overlay-color: ; 10486 --gap: 8px; 10487 "> 10488 <a 10489 class="collection-card__link" 10490 10491 href="/collections/nail-tools-accessories" 10492 10493 > 10494 <span class="visually-hidden">Nail Tools & Accessories</span> 10495 </a> 10496 <div class="collection-card__inner"> 10497 10498 10499 10500 10501 10502 10503 10504<style data-shopify> 10505 10506 .collection-card[data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-2"] { 10507 --ratio: 1.375; 10508 } 10509 10510 10511</style> 10512 10513 10514 <div 10515 class=" 10516 image-block 10517 resource-image 10518 10519 10520 collection-card__image 10521 10522 spacing-style border-style 10523 10524 " 10525 style="--border-width: 1px; --border-style: none; --border-color: 10526rgb(var(--color-border-rgb) / 1.0); --border-radius: 105270px; 10528" 10529 10530 > 10531 <img src="//www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=3840" alt="Nail Tools & Accessories" srcset="//www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=240 240w, //www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=352 352w, //www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=832 832w, //www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/collections/NailTools_f6ce766a-2e60-492d-9e89-00bac4fe0604.png?v=1770738331&width=3840 3840w" width="3840" height="2793" loading="eager" class="image-block__image" sizes="(min-width: 750px) 16vw, 100vw"> 10532 10533 </div> 10534 10535 10536 10537 10538 10539 10540 10541 10542 <div class="collection-card__content layout-panel-flex--column"> 10543 10544 10545 10546 10547 10548<div class="collection-title-wrapper collection-title-wrapper--arrow-on-mobile"> 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 <div class=" spacing-style text-block text-block--ARlJ4VmczaVlJelhka__collection_title_zD33z9-2 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:4px; --padding-inline-start:8px; --padding-inline-end:4px; --color: var(--color-foreground);--font-size: 1.125rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 10560 <p>Nail Tools & Accessories</p> 10561 </div> 10562 10563 10564 10565 10566
10567<script type="module"> 10568 class TextReadMoreWrapper extends HTMLElement { 10569 #expanded = false; 10570 #animation = null; 10571 #collapsedHeight = 0; 10572 10573 connectedCallback() { 10574 const content = this.querySelector('.text-read-more__content'); 10575 const textElement = this.querySelector('.text-read-more__text'); 10576 const button = this.querySelector('.text-read-more__button'); 10577 10578 if (!content || !textElement || !button) return; 10579 10580 // Set initial state 10581 this.dataset.expanded = 'false'; 10582 10583 // Wait for content to render - use double RAF to ensure layout is complete 10584 requestAnimationFrame(() => { 10585 requestAnimationFrame(() => { 10586 // Additional small delay to ensure fonts and styles are applied 10587 setTimeout(() => { 10588 this.#checkOverflow(content, textElement, button); 10589 }, 50); 10590 10591 // Recheck on resize 10592 const resizeObserver = new ResizeObserver(() => { 10593 if (!this.#expanded) { 10594 this.#checkOverflow(content, textElement, button); 10595 } 10596 }); 10597 resizeObserver.observe(content); 10598 10599 // Setup button click handler 10600 button.addEventListener('click', (e) => { 10601 e.preventDefault(); 10602 this.#toggle(content, textElement, button); 10603 }); 10604 }); 10605 }); 10606 } 10607 10608 #checkOverflow(content, textElement, button) { 10609 // Ensure collapsed state is applied 10610 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 10611 textElement.classList.add('text-read-more__text--collapsed'); 10612 } 10613 10614 // Get collapsed height first 10615 const collapsedHeight = content.scrollHeight; 10616 this.#collapsedHeight = collapsedHeight; 10617 10618 // Temporarily remove line-clamp to measure full height 10619 textElement.classList.remove('text-read-more__text--collapsed'); 10620 10621 // Force reflow 10622 void content.offsetHeight; 10623 10624 const fullHeight = content.scrollHeight; 10625 10626 // Restore line-clamp 10627 textElement.classList.add('text-read-more__text--collapsed'); 10628 10629 // Show button if content exceeds 2 lines (with small threshold for rounding) 10630 if (fullHeight > collapsedHeight + 5) { 10631 button.removeAttribute('hidden'); 10632 } else { 10633 button.setAttribute('hidden', ''); 10634 } 10635 } 10636 10637 #toggle(content, textElement, button) { 10638 const startHeight = content.offsetHeight; 10639 let endHeight; 10640 10641 if (!this.#expanded) { 10642 // Expanding 10643 textElement.classList.remove('text-read-more__text--collapsed'); 10644 endHeight = content.scrollHeight; 10645 this.#expanded = true; 10646 } else { 10647 // Collapsing 10648 endHeight = this.#collapsedHeight; 10649 this.#expanded = false; 10650 } 10651 10652 this.dataset.expanded = this.#expanded; 10653 button.setAttribute('aria-expanded', this.#expanded); 10654 10655 // Animate 10656 content.style.overflow = 'hidden'; 10657 this.#animation?.cancel(); 10658 10659 this.#animation = content.animate( 10660 { 10661 height: [`${startHeight}px`, `${endHeight}px`], 10662 }, 10663 { 10664 duration: 300, 10665 easing: 'ease-in-out', 10666 } 10667 ); 10668 10669 this.#animation.onfinish = () => { 10670 if (this.#expanded) { 10671 content.style.removeProperty('height'); 10672 content.style.overflow = ''; 10673 } else { 10674 textElement.classList.add('text-read-more__text--collapsed'); 10675 content.style.removeProperty('height'); 10676 content.style.overflow = ''; 10677 } 10678 }; 10679 } 10680 } 10681 10682 if (!customElements.get('text-read-more-wrapper')) { 10683 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 10684 } 10685</script>
10685 10686 10687 10688 10689 <span class="collection-title-arrow"> 10690 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 10691 <path d="M1.5 1L6.5 6L1.5 11" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 10692</svg> 10693 10694 </span> 10695 10696</div> 10697 10698 10699 10700 10701 10702 10703 </div> 10704 </div> 10705</div> 10706 10707 10708 10709 10710 10711 10712 </div> 10713 10714 <!--@list/split--> 10715 10716 10717 <div 10718 class="resource-list__item" 10719 10720 > 10721 10722 10723 10724 10725 10726 10727 10728 10729<style data-shopify> 10730 10731</style> 10732 10733 10734 10735<div 10736 class=" 10737 collection-card 10738 border-style 10739 10740 10741 10742 10743 " 10744 data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-3" 10745 10746 style=" 10747 --border-width: 1px; --border-style: none; --border-color: 10748rgb(var(--color-border-rgb) / 1.0); --border-radius: 1074912px; overflow: hidden; 10750 10751 --horizontal-alignment: flex-start; 10752 --vertical-alignment: flex-start; 10753 --background-overlay-color: ; 10754 --gap: 8px; 10755 "> 10756 <a 10757 class="collection-card__link" 10758 10759 href="/collections/nail-art" 10760 10761 > 10762 <span class="visually-hidden">Nail Art</span> 10763 </a> 10764 <div class="collection-card__inner"> 10765 10766 10767 10768 10769 10770 10771 10772<style data-shopify> 10773 10774 .collection-card[data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-3"] { 10775 --ratio: 1.375; 10776 } 10777 10778 10779</style> 10780 10781 10782 <div 10783 class=" 10784 image-block 10785 resource-image 10786 10787 10788 collection-card__image 10789 10790 spacing-style border-style 10791 10792 " 10793 style="--border-width: 1px; --border-style: none; --border-color: 10794rgb(var(--color-border-rgb) / 1.0); --border-radius: 107950px; 10796" 10797 10798 > 10799 <img src="//www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=3840" alt="Nail Art" srcset="//www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=240 240w, //www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=352 352w, //www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=832 832w, //www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/collections/NailArt_c79e2974-2223-44ba-81ed-869861dc4c3e.png?v=1770738347&width=3840 3840w" width="3840" height="2793" loading="eager" class="image-block__image" sizes="(min-width: 750px) 16vw, 100vw"> 10800 10801 </div> 10802 10803 10804 10805 10806 10807 10808 10809 10810 <div class="collection-card__content layout-panel-flex--column"> 10811 10812 10813 10814 10815 10816<div class="collection-title-wrapper collection-title-wrapper--arrow-on-mobile"> 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 <div class=" spacing-style text-block text-block--ARlJ4VmczaVlJelhka__collection_title_zD33z9-3 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:4px; --padding-inline-start:8px; --padding-inline-end:4px; --color: var(--color-foreground);--font-size: 1.125rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 10828 <p>Nail Art</p> 10829 </div> 10830 10831 10832 10833 10834
10835<script type="module"> 10836 class TextReadMoreWrapper extends HTMLElement { 10837 #expanded = false; 10838 #animation = null; 10839 #collapsedHeight = 0; 10840 10841 connectedCallback() { 10842 const content = this.querySelector('.text-read-more__content'); 10843 const textElement = this.querySelector('.text-read-more__text'); 10844 const button = this.querySelector('.text-read-more__button'); 10845 10846 if (!content || !textElement || !button) return; 10847 10848 // Set initial state 10849 this.dataset.expanded = 'false'; 10850 10851 // Wait for content to render - use double RAF to ensure layout is complete 10852 requestAnimationFrame(() => { 10853 requestAnimationFrame(() => { 10854 // Additional small delay to ensure fonts and styles are applied 10855 setTimeout(() => { 10856 this.#checkOverflow(content, textElement, button); 10857 }, 50); 10858 10859 // Recheck on resize 10860 const resizeObserver = new ResizeObserver(() => { 10861 if (!this.#expanded) { 10862 this.#checkOverflow(content, textElement, button); 10863 } 10864 }); 10865 resizeObserver.observe(content); 10866 10867 // Setup button click handler 10868 button.addEventListener('click', (e) => { 10869 e.preventDefault(); 10870 this.#toggle(content, textElement, button); 10871 }); 10872 }); 10873 }); 10874 } 10875 10876 #checkOverflow(content, textElement, button) { 10877 // Ensure collapsed state is applied 10878 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 10879 textElement.classList.add('text-read-more__text--collapsed'); 10880 } 10881 10882 // Get collapsed height first 10883 const collapsedHeight = content.scrollHeight; 10884 this.#collapsedHeight = collapsedHeight; 10885 10886 // Temporarily remove line-clamp to measure full height 10887 textElement.classList.remove('text-read-more__text--collapsed'); 10888 10889 // Force reflow 10890 void content.offsetHeight; 10891 10892 const fullHeight = content.scrollHeight; 10893 10894 // Restore line-clamp 10895 textElement.classList.add('text-read-more__text--collapsed'); 10896 10897 // Show button if content exceeds 2 lines (with small threshold for rounding) 10898 if (fullHeight > collapsedHeight + 5) { 10899 button.removeAttribute('hidden'); 10900 } else { 10901 button.setAttribute('hidden', ''); 10902 } 10903 } 10904 10905 #toggle(content, textElement, button) { 10906 const startHeight = content.offsetHeight; 10907 let endHeight; 10908 10909 if (!this.#expanded) { 10910 // Expanding 10911 textElement.classList.remove('text-read-more__text--collapsed'); 10912 endHeight = content.scrollHeight; 10913 this.#expanded = true; 10914 } else { 10915 // Collapsing 10916 endHeight = this.#collapsedHeight; 10917 this.#expanded = false; 10918 } 10919 10920 this.dataset.expanded = this.#expanded; 10921 button.setAttribute('aria-expanded', this.#expanded); 10922 10923 // Animate 10924 content.style.overflow = 'hidden'; 10925 this.#animation?.cancel(); 10926 10927 this.#animation = content.animate( 10928 { 10929 height: [`${startHeight}px`, `${endHeight}px`], 10930 }, 10931 { 10932 duration: 300, 10933 easing: 'ease-in-out', 10934 } 10935 ); 10936 10937 this.#animation.onfinish = () => { 10938 if (this.#expanded) { 10939 content.style.removeProperty('height'); 10940 content.style.overflow = ''; 10941 } else { 10942 textElement.classList.add('text-read-more__text--collapsed'); 10943 content.style.removeProperty('height'); 10944 content.style.overflow = ''; 10945 } 10946 }; 10947 } 10948 } 10949 10950 if (!customElements.get('text-read-more-wrapper')) { 10951 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 10952 } 10953</script>
10953 10954 10955 10956 10957 <span class="collection-title-arrow"> 10958 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 10959 <path d="M1.5 1L6.5 6L1.5 11" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 10960</svg> 10961 10962 </span> 10963 10964</div> 10965 10966 10967 10968 10969 10970 10971 </div> 10972 </div> 10973</div> 10974 10975 10976 10977 10978 10979 10980 </div> 10981 10982 <!--@list/split--> 10983 10984 10985 <div 10986 class="resource-list__item" 10987 10988 > 10989 10990 10991 10992 10993 10994 10995 10996 10997<style data-shopify> 10998 10999</style> 11000 11001 11002 11003<div 11004 class=" 11005 collection-card 11006 border-style 11007 11008 11009 11010 11011 " 11012 data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-4" 11013 11014 style=" 11015 --border-width: 1px; --border-style: none; --border-color: 11016rgb(var(--color-border-rgb) / 1.0); --border-radius: 1101712px; overflow: hidden; 11018 11019 --horizontal-alignment: flex-start; 11020 --vertical-alignment: flex-start; 11021 --background-overlay-color: ; 11022 --gap: 8px; 11023 "> 11024 <a 11025 class="collection-card__link" 11026 11027 href="/collections/nail-extensions" 11028 11029 > 11030 <span class="visually-hidden">Nail Extensions</span> 11031 </a> 11032 <div class="collection-card__inner"> 11033 11034 11035 11036 11037 11038 11039 11040<style data-shopify> 11041 11042 .collection-card[data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-4"] { 11043 --ratio: 1.375; 11044 } 11045 11046 11047</style> 11048 11049 11050 <div 11051 class=" 11052 image-block 11053 resource-image 11054 11055 11056 collection-card__image 11057 11058 spacing-style border-style 11059 11060 " 11061 style="--border-width: 1px; --border-style: none; --border-color: 11062rgb(var(--color-border-rgb) / 1.0); --border-radius: 110630px; 11064" 11065 11066 > 11067 <img src="//www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=3840" alt="Nail Extensions" srcset="//www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=240 240w, //www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=352 352w, //www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=832 832w, //www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/collections/NailExtensions_ea48b36f-6ede-4e56-9e37-69e441025cf6.png?v=1770738367&width=3840 3840w" width="3840" height="2793" loading="eager" class="image-block__image" sizes="(min-width: 750px) 16vw, 100vw"> 11068 11069 </div> 11070 11071 11072 11073 11074 11075 11076 11077 11078 <div class="collection-card__content layout-panel-flex--column"> 11079 11080 11081 11082 11083 11084<div class="collection-title-wrapper collection-title-wrapper--arrow-on-mobile"> 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 <div class=" spacing-style text-block text-block--ARlJ4VmczaVlJelhka__collection_title_zD33z9-4 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:4px; --padding-inline-start:8px; --padding-inline-end:4px; --color: var(--color-foreground);--font-size: 1.125rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 11096 <p>Nail Extensions</p> 11097 </div> 11098 11099 11100 11101 11102
11103<script type="module"> 11104 class TextReadMoreWrapper extends HTMLElement { 11105 #expanded = false; 11106 #animation = null; 11107 #collapsedHeight = 0; 11108 11109 connectedCallback() { 11110 const content = this.querySelector('.text-read-more__content'); 11111 const textElement = this.querySelector('.text-read-more__text'); 11112 const button = this.querySelector('.text-read-more__button'); 11113 11114 if (!content || !textElement || !button) return; 11115 11116 // Set initial state 11117 this.dataset.expanded = 'false'; 11118 11119 // Wait for content to render - use double RAF to ensure layout is complete 11120 requestAnimationFrame(() => { 11121 requestAnimationFrame(() => { 11122 // Additional small delay to ensure fonts and styles are applied 11123 setTimeout(() => { 11124 this.#checkOverflow(content, textElement, button); 11125 }, 50); 11126 11127 // Recheck on resize 11128 const resizeObserver = new ResizeObserver(() => { 11129 if (!this.#expanded) { 11130 this.#checkOverflow(content, textElement, button); 11131 } 11132 }); 11133 resizeObserver.observe(content); 11134 11135 // Setup button click handler 11136 button.addEventListener('click', (e) => { 11137 e.preventDefault(); 11138 this.#toggle(content, textElement, button); 11139 }); 11140 }); 11141 }); 11142 } 11143 11144 #checkOverflow(content, textElement, button) { 11145 // Ensure collapsed state is applied 11146 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 11147 textElement.classList.add('text-read-more__text--collapsed'); 11148 } 11149 11150 // Get collapsed height first 11151 const collapsedHeight = content.scrollHeight; 11152 this.#collapsedHeight = collapsedHeight; 11153 11154 // Temporarily remove line-clamp to measure full height 11155 textElement.classList.remove('text-read-more__text--collapsed'); 11156 11157 // Force reflow 11158 void content.offsetHeight; 11159 11160 const fullHeight = content.scrollHeight; 11161 11162 // Restore line-clamp 11163 textElement.classList.add('text-read-more__text--collapsed'); 11164 11165 // Show button if content exceeds 2 lines (with small threshold for rounding) 11166 if (fullHeight > collapsedHeight + 5) { 11167 button.removeAttribute('hidden'); 11168 } else { 11169 button.setAttribute('hidden', ''); 11170 } 11171 } 11172 11173 #toggle(content, textElement, button) { 11174 const startHeight = content.offsetHeight; 11175 let endHeight; 11176 11177 if (!this.#expanded) { 11178 // Expanding 11179 textElement.classList.remove('text-read-more__text--collapsed'); 11180 endHeight = content.scrollHeight; 11181 this.#expanded = true; 11182 } else { 11183 // Collapsing 11184 endHeight = this.#collapsedHeight; 11185 this.#expanded = false; 11186 } 11187 11188 this.dataset.expanded = this.#expanded; 11189 button.setAttribute('aria-expanded', this.#expanded); 11190 11191 // Animate 11192 content.style.overflow = 'hidden'; 11193 this.#animation?.cancel(); 11194 11195 this.#animation = content.animate( 11196 { 11197 height: [`${startHeight}px`, `${endHeight}px`], 11198 }, 11199 { 11200 duration: 300, 11201 easing: 'ease-in-out', 11202 } 11203 ); 11204 11205 this.#animation.onfinish = () => { 11206 if (this.#expanded) { 11207 content.style.removeProperty('height'); 11208 content.style.overflow = ''; 11209 } else { 11210 textElement.classList.add('text-read-more__text--collapsed'); 11211 content.style.removeProperty('height'); 11212 content.style.overflow = ''; 11213 } 11214 }; 11215 } 11216 } 11217 11218 if (!customElements.get('text-read-more-wrapper')) { 11219 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 11220 } 11221</script>
11221 11222 11223 11224 11225 <span class="collection-title-arrow"> 11226 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 11227 <path d="M1.5 1L6.5 6L1.5 11" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 11228</svg> 11229 11230 </span> 11231 11232</div> 11233 11234 11235 11236 11237 11238 11239 </div> 11240 </div> 11241</div> 11242 11243 11244 11245 11246 11247 11248 </div> 11249 11250 <!--@list/split--> 11251 11252 11253 <div 11254 class="resource-list__item" 11255 11256 > 11257 11258 11259 11260 11261 11262 11263 11264 11265<style data-shopify> 11266 11267</style> 11268 11269 11270 11271<div 11272 class=" 11273 collection-card 11274 border-style 11275 11276 11277 11278 11279 " 11280 data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-5" 11281 11282 style=" 11283 --border-width: 1px; --border-style: none; --border-color: 11284rgb(var(--color-border-rgb) / 1.0); --border-radius: 1128512px; overflow: hidden; 11286 11287 --horizontal-alignment: flex-start; 11288 --vertical-alignment: flex-start; 11289 --background-overlay-color: ; 11290 --gap: 8px; 11291 "> 11292 <a 11293 class="collection-card__link" 11294 11295 href="/collections/nail-kits" 11296 11297 > 11298 <span class="visually-hidden">Nail Kits</span> 11299 </a> 11300 <div class="collection-card__inner"> 11301 11302 11303 11304 11305 11306 11307 11308<style data-shopify> 11309 11310 .collection-card[data-block-id="AeFNqblVIS2cxU0xkM__static-collection-card-5"] { 11311 --ratio: 1.375; 11312 } 11313 11314 11315</style> 11316 11317 11318 <div 11319 class=" 11320 image-block 11321 resource-image 11322 11323 11324 collection-card__image 11325 11326 spacing-style border-style 11327 11328 " 11329 style="--border-width: 1px; --border-style: none; --border-color: 11330rgb(var(--color-border-rgb) / 1.0); --border-radius: 113310px; 11332" 11333 11334 > 11335 <img src="//www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=3840" alt="Nail Kits" srcset="//www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=240 240w, //www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=352 352w, //www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=832 832w, //www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/collections/NailKits_836af5cf-6a10-4005-b221-67a0363ad645.png?v=1770738390&width=3840 3840w" width="3840" height="2793" loading="eager" class="image-block__image" sizes="(min-width: 750px) 16vw, 100vw"> 11336 11337 </div> 11338 11339 11340 11341 11342 11343 11344 11345 11346 <div class="collection-card__content layout-panel-flex--column"> 11347 11348 11349 11350 11351 11352<div class="collection-title-wrapper collection-title-wrapper--arrow-on-mobile"> 11353 11354 11355 11356 11357 11358 11359 11360 11361 11362 11363 <div class=" spacing-style text-block text-block--ARlJ4VmczaVlJelhka__collection_title_zD33z9-5 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:4px; --padding-inline-start:8px; --padding-inline-end:4px; --color: var(--color-foreground);--font-size: 1.125rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 11364 <p>Nail Kits</p> 11365 </div> 11366 11367 11368 11369 11370
11371<script type="module"> 11372 class TextReadMoreWrapper extends HTMLElement { 11373 #expanded = false; 11374 #animation = null; 11375 #collapsedHeight = 0; 11376 11377 connectedCallback() { 11378 const content = this.querySelector('.text-read-more__content'); 11379 const textElement = this.querySelector('.text-read-more__text'); 11380 const button = this.querySelector('.text-read-more__button'); 11381 11382 if (!content || !textElement || !button) return; 11383 11384 // Set initial state 11385 this.dataset.expanded = 'false'; 11386 11387 // Wait for content to render - use double RAF to ensure layout is complete 11388 requestAnimationFrame(() => { 11389 requestAnimationFrame(() => { 11390 // Additional small delay to ensure fonts and styles are applied 11391 setTimeout(() => { 11392 this.#checkOverflow(content, textElement, button); 11393 }, 50); 11394 11395 // Recheck on resize 11396 const resizeObserver = new ResizeObserver(() => { 11397 if (!this.#expanded) { 11398 this.#checkOverflow(content, textElement, button); 11399 } 11400 }); 11401 resizeObserver.observe(content); 11402 11403 // Setup button click handler 11404 button.addEventListener('click', (e) => { 11405 e.preventDefault(); 11406 this.#toggle(content, textElement, button); 11407 }); 11408 }); 11409 }); 11410 } 11411 11412 #checkOverflow(content, textElement, button) { 11413 // Ensure collapsed state is applied 11414 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 11415 textElement.classList.add('text-read-more__text--collapsed'); 11416 } 11417 11418 // Get collapsed height first 11419 const collapsedHeight = content.scrollHeight; 11420 this.#collapsedHeight = collapsedHeight; 11421 11422 // Temporarily remove line-clamp to measure full height 11423 textElement.classList.remove('text-read-more__text--collapsed'); 11424 11425 // Force reflow 11426 void content.offsetHeight; 11427 11428 const fullHeight = content.scrollHeight; 11429 11430 // Restore line-clamp 11431 textElement.classList.add('text-read-more__text--collapsed'); 11432 11433 // Show button if content exceeds 2 lines (with small threshold for rounding) 11434 if (fullHeight > collapsedHeight + 5) { 11435 button.removeAttribute('hidden'); 11436 } else { 11437 button.setAttribute('hidden', ''); 11438 } 11439 } 11440 11441 #toggle(content, textElement, button) { 11442 const startHeight = content.offsetHeight; 11443 let endHeight; 11444 11445 if (!this.#expanded) { 11446 // Expanding 11447 textElement.classList.remove('text-read-more__text--collapsed'); 11448 endHeight = content.scrollHeight; 11449 this.#expanded = true; 11450 } else { 11451 // Collapsing 11452 endHeight = this.#collapsedHeight; 11453 this.#expanded = false; 11454 } 11455 11456 this.dataset.expanded = this.#expanded; 11457 button.setAttribute('aria-expanded', this.#expanded); 11458 11459 // Animate 11460 content.style.overflow = 'hidden'; 11461 this.#animation?.cancel(); 11462 11463 this.#animation = content.animate( 11464 { 11465 height: [`${startHeight}px`, `${endHeight}px`], 11466 }, 11467 { 11468 duration: 300, 11469 easing: 'ease-in-out', 11470 } 11471 ); 11472 11473 this.#animation.onfinish = () => { 11474 if (this.#expanded) { 11475 content.style.removeProperty('height'); 11476 content.style.overflow = ''; 11477 } else { 11478 textElement.classList.add('text-read-more__text--collapsed'); 11479 content.style.removeProperty('height'); 11480 content.style.overflow = ''; 11481 } 11482 }; 11483 } 11484 } 11485 11486 if (!customElements.get('text-read-more-wrapper')) { 11487 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 11488 } 11489</script>
11489 11490 11491 11492 11493 <span class="collection-title-arrow"> 11494 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 11495 <path d="M1.5 1L6.5 6L1.5 11" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 11496</svg> 11497 11498 </span> 11499 11500</div> 11501 11502 11503 11504 11505 11506 11507 </div> 11508 </div> 11509</div> 11510 11511 11512 11513 11514 11515 11516 </div> 11517 11518 11519 11520 11521 11522</div> 11523 11524 11525 11526 11527 11528 11529</div> 11530
11531<script> 11532 (() => { 11533 const section = document.getElementById('collection-list-template--28213213921626__collection_list_dEADaM'); 11534 if (!section) return; 11535 11536 if (section.dataset.collectionCardRevealEnabled !== 'true') return; 11537 if (section.dataset.collectionListRevealed === 'true') return; 11538 11539 // Only apply the hidden start state when JS is active 11540 section.dataset.collectionCardRevealInit = 'true'; 11541 11542 const reducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches; 11543 11544 const reveal = () => { 11545 section.dataset.collectionListRevealed = 'true'; 11546 }; 11547 11548 // Progressive enhancement fallbacks 11549 if (window.Shopify?.designMode) { 11550 reveal(); 11551 return; 11552 } 11553 11554 if (reducedMotion) { 11555 reveal(); 11556 return; 11557 } 11558 11559 if (!('IntersectionObserver' in window)) { 11560 reveal(); 11561 return; 11562 } 11563 11564 const observer = new IntersectionObserver( 11565 (entries) => { 11566 for (const entry of entries) { 11567 if (entry.isIntersecting) { 11568 reveal(); 11569 observer.disconnect(); 11570 break; 11571 } 11572 } 11573 }, 11574 { root: null, threshold: 0.15 } 11575 ); 11576 11577 observer.observe(section); 11578 })(); 11579</script>
11579 11580 11581 11582</div><div id="shopify-section-template--28213213921626__product_list_ykU4x3" class="shopify-section ui-test-product-list"> 11583 11584 11585 11586<div class="section-background color-scheme-1"></div> 11587<div 11588 data-testid="product-list" 11589 class=" 11590 section 11591 section--page-width 11592 color-scheme-1 11593 section-resource-list 11594 spacing-style 11595 gap-style 11596 " 11597 style=" 11598 --padding-block-start: max(20px, calc(var(--spacing-scale) * 25px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 80px)); 11599 --gap: max(24px, calc(var(--gap-scale, 1.0) * 28px)); 11600 " 11601> 11602 <div class="section-resource-list__header"> 11603<div 11604 class=" 11605 group-block 11606 group-block--height-fit 11607 group-block--width-fill 11608 border-style 11609 spacing-style 11610 size-style 11611 11612 11613 11614 11615 " 11616 style=" 11617 --border-width: 1px; --border-style: none; --border-color: 11618rgb(var(--color-border-rgb) / 1.0); --border-radius: 116190px; 11620 11621 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 11622 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 11623 11624 " 11625 11626 data-testid="group-block" 11627><div class="group-block__media-wrapper"> 11628 11629 11630 11631 11632 11633 </div> 11634 11635 <div 11636 class=" 11637 group-block-content 11638 11639 layout-panel-flex 11640 layout-panel-flex--row 11641 11642 11643 group-block-content--has-animation group-block-content--animate- 11644 " 11645 data-animation-type="" 11646 style="--flex-direction: row; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 11647 11648--gap: 12px; 11649 11650--horizontal-alignment: space-between; --vertical-alignment: last baseline; 11651--vertical-alignment-mobile: last baseline; 11652" 11653 > 11654 11655 11656 11657 11658 11659 11660 11661 11662 11663 11664 11665 11666 <rte-formatter class=" spacing-style text-block text-block--ASlhVdjdIaE1uN2t3b__product_list_text_zkKMin rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 11667 <h3><strong>New In</strong></h3> 11668 </rte-formatter> 11669 11670 11671 11672 11673
11674<script type="module"> 11675 class TextReadMoreWrapper extends HTMLElement { 11676 #expanded = false; 11677 #animation = null; 11678 #collapsedHeight = 0; 11679 11680 connectedCallback() { 11681 const content = this.querySelector('.text-read-more__content'); 11682 const textElement = this.querySelector('.text-read-more__text'); 11683 const button = this.querySelector('.text-read-more__button'); 11684 11685 if (!content || !textElement || !button) return; 11686 11687 // Set initial state 11688 this.dataset.expanded = 'false'; 11689 11690 // Wait for content to render - use double RAF to ensure layout is complete 11691 requestAnimationFrame(() => { 11692 requestAnimationFrame(() => { 11693 // Additional small delay to ensure fonts and styles are applied 11694 setTimeout(() => { 11695 this.#checkOverflow(content, textElement, button); 11696 }, 50); 11697 11698 // Recheck on resize 11699 const resizeObserver = new ResizeObserver(() => { 11700 if (!this.#expanded) { 11701 this.#checkOverflow(content, textElement, button); 11702 } 11703 }); 11704 resizeObserver.observe(content); 11705 11706 // Setup button click handler 11707 button.addEventListener('click', (e) => { 11708 e.preventDefault(); 11709 this.#toggle(content, textElement, button); 11710 }); 11711 }); 11712 }); 11713 } 11714 11715 #checkOverflow(content, textElement, button) { 11716 // Ensure collapsed state is applied 11717 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 11718 textElement.classList.add('text-read-more__text--collapsed'); 11719 } 11720 11721 // Get collapsed height first 11722 const collapsedHeight = content.scrollHeight; 11723 this.#collapsedHeight = collapsedHeight; 11724 11725 // Temporarily remove line-clamp to measure full height 11726 textElement.classList.remove('text-read-more__text--collapsed'); 11727 11728 // Force reflow 11729 void content.offsetHeight; 11730 11731 const fullHeight = content.scrollHeight; 11732 11733 // Restore line-clamp 11734 textElement.classList.add('text-read-more__text--collapsed'); 11735 11736 // Show button if content exceeds 2 lines (with small threshold for rounding) 11737 if (fullHeight > collapsedHeight + 5) { 11738 button.removeAttribute('hidden'); 11739 } else { 11740 button.setAttribute('hidden', ''); 11741 } 11742 } 11743 11744 #toggle(content, textElement, button) { 11745 const startHeight = content.offsetHeight; 11746 let endHeight; 11747 11748 if (!this.#expanded) { 11749 // Expanding 11750 textElement.classList.remove('text-read-more__text--collapsed'); 11751 endHeight = content.scrollHeight; 11752 this.#expanded = true; 11753 } else { 11754 // Collapsing 11755 endHeight = this.#collapsedHeight; 11756 this.#expanded = false; 11757 } 11758 11759 this.dataset.expanded = this.#expanded; 11760 button.setAttribute('aria-expanded', this.#expanded); 11761 11762 // Animate 11763 content.style.overflow = 'hidden'; 11764 this.#animation?.cancel(); 11765 11766 this.#animation = content.animate( 11767 { 11768 height: [`${startHeight}px`, `${endHeight}px`], 11769 }, 11770 { 11771 duration: 300, 11772 easing: 'ease-in-out', 11773 } 11774 ); 11775 11776 this.#animation.onfinish = () => { 11777 if (this.#expanded) { 11778 content.style.removeProperty('height'); 11779 content.style.overflow = ''; 11780 } else { 11781 textElement.classList.add('text-read-more__text--collapsed'); 11782 content.style.removeProperty('height'); 11783 content.style.overflow = ''; 11784 } 11785 }; 11786 } 11787 } 11788 11789 if (!customElements.get('text-read-more-wrapper')) { 11790 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 11791 } 11792</script>
11792 11793 11794 11795 11796 11797 11798 11799 11800 11801 11802 11803 11804 11805 11806<a 11807 11808 href="/collections/new" 11809 11810 class=" 11811 size-style 11812 link 11813 link--ATkt5cndtVnhsblFoT__product_list_button_64f7VP 11814 11815 button--arrow-on-mobile 11816 " 11817 style="--size-style-width: fit-content;--size-style-height: ;--size-style-width-mobile: fit-content; --size-style-width-mobile-min: fit-content;" 11818> 11819 Shop All New In 11820 11821 <span class="button__arrow-icon" aria-hidden="true"> 11822 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 11823 <path d="M1.5 1L6.5 6L1.5 11" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 11824</svg> 11825 11826 </span> 11827 11828</a> 11829 11830 11831 11832 11833 11834 11835</div> 11836</div> 11837 11838 11839
11840<script type="module"> 11841 (function() { 11842 // Only run if Intersection Observer is supported 11843 if (typeof IntersectionObserver === 'undefined') { 11844 // Fallback: show all animated content immediately 11845 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 11846 el.classList.add('group-block-content--in-view'); 11847 }); 11848 return; 11849 } 11850 11851 // Respect reduced motion preference 11852 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 11853 if (prefersReducedMotion) { 11854 // Show all animated content immediately without animation 11855 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 11856 el.style.opacity = '1'; 11857 el.style.transform = 'none'; 11858 }); 11859 return; 11860 } 11861 11862 // Set up Intersection Observer for scroll-triggered animations 11863 const observerOptions = { 11864 root: null, 11865 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 11866 threshold: 0.1 // Trigger when 10% of element is visible 11867 }; 11868 11869 const observer = new IntersectionObserver((entries) => { 11870 entries.forEach(entry => { 11871 if (entry.isIntersecting) { 11872 const contentElement = entry.target; 11873 // Add the in-view class to trigger animation 11874 contentElement.classList.add('group-block-content--in-view'); 11875 // Unobserve after animation is triggered (only animate once) 11876 observer.unobserve(contentElement); 11877 } 11878 }); 11879 }, observerOptions); 11880 11881 // Observe all group blocks with animations 11882 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 11883 observer.observe(el); 11884 }); 11885 })(); 11886</script>
11886 11887 11888</div> 11889 11890 11891 11892 11893 11894 11895 11896<div 11897 class=" 11898 resource-list 11899 11900 force-full-width 11901 11902 11903 resource-list__carousel 11904 " 11905 style="--resource-list-column-gap-desktop: 24px;--column-count: 4;--column-count-mobile: 1;--mobile-card-size: 60cqw;" 11906 11907 data-testid="resource-list-grid" 11908 11909> 11910 11911 11912 11913 11914 11915<div 11916 class="resource-list__carousel" 11917 style="--gutter-slide-width: var(--util-page-margin-offset); --slide-width-max: 450px;" 11918> 11919 <slideshow-component 11920 11921 ref="resourceListCarousel" 11922 11923 11924 class="resource-list__carousel" 11925 11926 style="--slideshow-timeline: --slide-1, --slide-2, --slide-3, --slide-4, --slide-5, --slide-6, --slide-7, --slide-8;--slide-min-height: auto;--slide-min-height-desktop: auto;" 11927 11928 initial-slide="0" 11929 11930 11931 11932 11933 11934> 11935 11936 <slideshow-container ref="slideshowContainer"> 11937 11938 <slideshow-arrows 11939 position="center" 11940 11941><button 11942 class=" 11943 slideshow-control slideshow-control--previous 11944 11945 slideshow-control--shape-circle 11946 slideshow-control--style-arrow 11947 button button-unstyled button-unstyled--transparent 11948 flip-x 11949 " 11950 11951 aria-label="Previous slide" 11952 11953 on:click="/previous" 11954 ref="previous" 11955> 11956 <span class="svg-wrapper icon-arrow"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" vector-effect="non-scaling-stroke" d="M4.25 10h11.5m0 0-4-4m4 4-4 4"/></svg> 11957</span> 11958</button> 11959<button 11960 class=" 11961 slideshow-control slideshow-control--next 11962 11963 slideshow-control--shape-circle 11964 slideshow-control--style-arrow 11965 button button-unstyled button-unstyled--transparent 11966 11967 " 11968 11969 aria-label="Next slide" 11970 11971 on:click="/next" 11972 ref="next" 11973> 11974 <span class="svg-wrapper icon-arrow"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" vector-effect="non-scaling-stroke" d="M4.25 10h11.5m0 0-4-4m4 4-4 4"/></svg> 11975</span> 11976</button> 11977</slideshow-arrows> 11978 11979 11980 11981 <slideshow-slides 11982 tabindex="-1" 11983 ref="scroller" 11984 11985 gutters="start end" 11986 11987 > 11988 11989 11990 <slideshow-slide 11991 ref="slides[]" 11992 aria-hidden="false" 11993 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 11994 11995 class="resource-list__slide" 11996 11997 11998 11999 12000 12001 12002 12003> 12004 <div 12005 class="resource-list__item" 12006 > 12007 12008 12009 12010<div > 12011 12012 12013<style data-shopify> 12014 12015</style> 12016 12017 12018<product-card-link 12019 data-product-id="11024830300506" 12020 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=500" 12021 data-product-transition="true" 12022 12023 ><product-card 12024 class="product-card" 12025 data-product-id="11024830300506" 12026 id="product-card-AeTdjd2lkb3BwakczM__static-product-card" 12027 data-product-transition="true" 12028 12029 12030> 12031 <a 12032 id="4e48057268a67adb3213cc44e81c9b93" 12033 12034 href="/products/rechargeable-intelligent-uv-disinfector-for-nail-beauty-tools?variant=54933241299290" 12035 12036 class="product-card__link" 12037 ref="productCardLink" 12038 > 12039 <span class="visually-hidden"> 12040 Rechargeable Intelligent UV Disinfector for Nail & Beauty Tools 12041 </span> 12042 </a> 12043 <div 12044 class=" 12045 product-card__content 12046 layout-panel-flex 12047 layout-panel-flex--column 12048 product-grid__card 12049 spacing-style 12050 border-style 12051 gap-style 12052 12053 " 12054 style=" 12055 --border-width: 1px; --border-style: none; --border-color: 12056rgb(var(--color-border-rgb) / 1.0); --border-radius: 120570px; 12058 12059 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 12060 12061 12062 12063--horizontal-alignment: ; --vertical-alignment: ; 12064--vertical-alignment-mobile: ; 12065 12066 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 12067 --product-card-gap: 8px; 12068 --quick-add-display: flex; 12069 --quick-add-mobile-display: flex; 12070 --quick-add-mobile-opacity: 1; 12071 12072 12073 12074 12075 " 12076 > 12077 12078 12079 12080 12081 12082 12083 12084 12085 12086<div 12087 ref="cardGallery"
12088 class="card-gallery card-gallery-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7 spacing-style border-style" 12089 style=" 12090 --border-width: 1px; --border-style: solid; --border-color: 12091rgb(var(--color-border-rgb) / 1.0); --border-radius: 1209212px; overflow: hidden; 12093 12094 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 12095 --gallery-aspect-ratio: 1.0; 12096 " 12097 data-product-id="11024830300506" 12098 12099 on:pointerenter="/previewImage" 12100 on:pointerleave="/resetImage" 12101 12102 12103 data-view-transition-to-main-product 12104 12105 data-image-ratio="adapt" 12106 12107> 12108 <a 12109 class="contents" 12110 ref="cardGalleryLink" 12111 href="/products/rechargeable-intelligent-uv-disinfector-for-nail-beauty-tools" 12112 aria-label="Rechargeable Intelligent UV Disinfector for Nail & Beauty Tools" 12113 > 12114 <slideshow-component 12115 12116 ref="slideshow" 12117 12118 12119 style="--slideshow-timeline: --slide-1, --slide-2;--slide-min-height: auto;--slide-min-height-desktop: auto;" 12120 12121 initial-slide="0" 12122 12123 12124 infinite 12125 12126 12127 12128 data-generic-media-size="2" allow-nested="true" 12129> 12130 12131 <slideshow-container ref="slideshowContainer"> 12132 12133 12134 <slideshow-slides 12135 tabindex="-1" 12136 ref="scroller" 12137 12138 > 12139 <slideshow-slide 12140 ref="slides[]" 12141 aria-hidden="false" 12142 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 12143 12144 class="product-media-container media-fit product-media-container--image" 12145 12146 12147 12148 12149 slide-id="62529835860314" 12150 12151 12152 12153 12154> 12155 12156 12157<div 12158 class="product-media" 12159 style="--ratio: 1.0" 12160 data-media-id="62529835860314" 12161> 12162 12163 <img src="//www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=3840" alt="Rechargeable Intelligent UV Disinfector for Nail & Beauty Tools" srcset="//www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=3840 3840w" width="3840" height="3840" loading="eager" sizes="(min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 12164 12165 12166</div> 12167 12168 12169 12170</slideshow-slide> 12171<slideshow-slide 12172 ref="slides[]" 12173 aria-hidden="true" 12174 style="--slideshow-timeline: --slide-1; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 12175 12176 class="product-media-container media-fit product-media-container--image" 12177 12178 12179 12180 12181 slide-id="62529835827546" 12182 12183 12184 12185 12186> 12187 12188 12189<div 12190 class="product-media" 12191 style="--ratio: 1.0" 12192 data-media-id="62529835827546" 12193> 12194 12195 <img src="//www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=3840" alt="Rechargeable Intelligent UV Disinfector for Nail & Beauty Tools" srcset="//www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/intellegentdisinfector2.jpg?v=1791474363&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 12196 12197 12198</div> 12199 12200 12201 12202</slideshow-slide> 12203 12204 </slideshow-slides> 12205 </slideshow-container> 12206 12207</slideshow-component> 12208 12209 12210 12211 </a> 12212 12213 12214 <div 12215 class="product-badges product-badges--top-right" 12216 style=" 12217 --badge-border-radius: 100px; 12218 --badge-font-family: var(--font-body--family);
12218 --badge-font-weight: var(--font-body--weight); --badge-text-transform: none; 12219 " 12220 ></div> 12221 12222 12223 12224<quick-add-component 12225 class="quick-add color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 " 12226 ref="quickAdd" 12227 data-product-title="Rechargeable Intelligent UV Disinfector for Nail & Beauty Tools" 12228 data-quick-add-button="add" 12229 data-product-options-count="1" 12230> 12231 <product-form-component 12232 data-section-id="template--28213213921626__product_list_ykU4x3" 12233 data-product-id="11024830300506" 12234 on:submit="/handleSubmit" 12235 class="quick-add__product-form-component" 12236 > 12237 <div 12238 class="visually-hidden" 12239 aria-live="assertive" 12240 role="status" 12241 aria-atomic="true" 12242 ref="liveRegion" 12243 ></div><form method="post" action="/cart/add" id="QuickAdd-ProductForm-11024830300506-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="â" /><input 12244 type="hidden" 12245 name="id" 12246 ref="variantId" 12247 value="54933241299290" 12248 12249 > 12250 <input 12251 type="hidden" 12252 name="quantity" 12253 value="1" 12254 > 12255 12256 <add-to-cart-component 12257 ref="addToCartButtonContainer" 12258 data-product-variant-media="//www.tnbl.co.uk/cdn/shop/files/intelligentdisinfector.jpg?v=1791474364&width=100" 12259 data-add-to-cart-animation="true" 12260> 12261 <button 12262 12263 type="submit" 12264 name="add" 12265 ref="addToCartButton" 12266 on:click="/handleClick" 12267 class="button button quick-add__button quick-add__button--add add-to-cart-button" 12268 12269 12270 > 12271 <span 12272 class="add-to-cart-text" 12273 > 12274 12275 <span 12276 aria-hidden="true" 12277 class="svg-wrapper add-to-cart-icon" 12278 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 12279</span> 12280 12281 <span class="add-to-cart-text__content is-visually-hidden-mobile"> 12282 <span> 12283 <span>Add</span> 12284 </span> 12285 </span> 12286 </span> 12287 12288 <span class="add-to-cart__added"> 12289 <span class="svg-wrapper add-to-cart__added-icon"><svg aria-hidden="true" class="checkmark-burst" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 12290 <g class="check"> 12291 <circle class="ring" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 12292 <path class="tick" d="M9 12.75L11.25 15L15 9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 12293 </g> 12294 <g class="burst"> 12295 <g style="--index: 0;"> 12296 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 12297 </g> 12298 <g style="--index: 1;"> 12299 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 12300 </g> 12301 <g style="--index: 2;"> 12302 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 12303 </g> 12304 <g style="--index: 3;"> 12305 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 12306 </g> 12307 <g style="--index: 4;"> 12308 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 12309 </g> 12310 <g style="--index: 5;"> 12311 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 12312 </g> 12313 <g style="--index: 6;"> 12314 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 12315 </g> 12316 <g style="--index: 7;"> 12317 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 12318 </g> 12319 </g> 12320</svg> 12321</span> 12322 </span> 12323 </button> 12324</add-to-cart-component> 12325 12326 12327 12328 12329 <button 12330 class="button quick-add__button quick-add__button--choose add-to-cart-button" 12331 12332 type="button" 12333 name="add" 12334 on:click="quick-add-component/handleClick" 12335 >
12336 <span 12337 class="add-to-cart-text quick-add__button-content" 12338 > 12339 12340 <span 12341 aria-hidden="true" 12342 class="svg-wrapper add-to-cart-icon quick-add__button-icon" 12343 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 12344</span> 12345 <span class="add-to-cart-text__content is-visually-hidden-mobile quick-add__button-text"> 12346 <span> 12347 12348 <span> 12349 Add 12350 </span> 12351 </span> 12352 </span> 12353 </span> 12354 </button><input type="hidden" name="product-id" value="11024830300506" /><input type="hidden" name="section-id" value="template--28213213921626__product_list_ykU4x3" /></form></product-form-component> 12355</quick-add-component> 12356 12357 12358 12359 12360 12361 12362</div> 12363 12364 12365 12366 12367 12368<div class="product-grid-view-zoom-out--details"> 12369 12370 <h3 class="h4">Rechargeable Intelligent UV Disinfector for Nail & Beauty Tools</h3> 12371 12372</div> 12373 12374 12375 12376 12377 12378 12379 12380 12381 12382 12383 12384 12385 12386 12387 <div class=" spacing-style text-block text-block--AWHY0bEN1blVtbmFle__text_JM9p8t custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 12388 <p>TNBL </p> 12389 </div> 12390 12391 12392 12393 12394
12395<script type="module"> 12396 class TextReadMoreWrapper extends HTMLElement { 12397 #expanded = false; 12398 #animation = null; 12399 #collapsedHeight = 0; 12400 12401 connectedCallback() { 12402 const content = this.querySelector('.text-read-more__content'); 12403 const textElement = this.querySelector('.text-read-more__text'); 12404 const button = this.querySelector('.text-read-more__button'); 12405 12406 if (!content || !textElement || !button) return; 12407 12408 // Set initial state 12409 this.dataset.expanded = 'false'; 12410 12411 // Wait for content to render - use double RAF to ensure layout is complete 12412 requestAnimationFrame(() => { 12413 requestAnimationFrame(() => { 12414 // Additional small delay to ensure fonts and styles are applied 12415 setTimeout(() => { 12416 this.#checkOverflow(content, textElement, button); 12417 }, 50); 12418 12419 // Recheck on resize 12420 const resizeObserver = new ResizeObserver(() => { 12421 if (!this.#expanded) { 12422 this.#checkOverflow(content, textElement, button); 12423 } 12424 }); 12425 resizeObserver.observe(content); 12426 12427 // Setup button click handler 12428 button.addEventListener('click', (e) => { 12429 e.preventDefault(); 12430 this.#toggle(content, textElement, button); 12431 }); 12432 }); 12433 }); 12434 } 12435 12436 #checkOverflow(content, textElement, button) { 12437 // Ensure collapsed state is applied 12438 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 12439 textElement.classList.add('text-read-more__text--collapsed'); 12440 } 12441 12442 // Get collapsed height first 12443 const collapsedHeight = content.scrollHeight; 12444 this.#collapsedHeight = collapsedHeight; 12445 12446 // Temporarily remove line-clamp to measure full height 12447 textElement.classList.remove('text-read-more__text--collapsed'); 12448 12449 // Force reflow 12450 void content.offsetHeight; 12451 12452 const fullHeight = content.scrollHeight; 12453 12454 // Restore line-clamp 12455 textElement.classList.add('text-read-more__text--collapsed'); 12456 12457 // Show button if content exceeds 2 lines (with small threshold for rounding) 12458 if (fullHeight > collapsedHeight + 5) { 12459 button.removeAttribute('hidden'); 12460 } else { 12461 button.setAttribute('hidden', ''); 12462 } 12463 } 12464 12465 #toggle(content, textElement, button) { 12466 const startHeight = content.offsetHeight; 12467 let endHeight; 12468 12469 if (!this.#expanded) { 12470 // Expanding 12471 textElement.classList.remove('text-read-more__text--collapsed'); 12472 endHeight = content.scrollHeight; 12473 this.#expanded = true; 12474 } else { 12475 // Collapsing 12476 endHeight = this.#collapsedHeight; 12477 this.#expanded = false; 12478 } 12479 12480 this.dataset.expanded = this.#expanded; 12481 button.setAttribute('aria-expanded', this.#expanded); 12482 12483 // Animate 12484 content.style.overflow = 'hidden'; 12485 this.#animation?.cancel(); 12486 12487 this.#animation = content.animate( 12488 { 12489 height: [`${startHeight}px`, `${endHeight}px`], 12490 }, 12491 { 12492 duration: 300, 12493 easing: 'ease-in-out', 12494 } 12495 ); 12496 12497 this.#animation.onfinish = () => { 12498 if (this.#expanded) { 12499 content.style.removeProperty('height'); 12500 content.style.overflow = ''; 12501 } else { 12502 textElement.classList.add('text-read-more__text--collapsed'); 12503 content.style.removeProperty('height'); 12504 content.style.overflow = ''; 12505 } 12506 }; 12507 } 12508 } 12509 12510 if (!customElements.get('text-read-more-wrapper')) { 12511 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 12512 } 12513</script>
12513 12514 12515 12516 12517 12518 12519 12520 12521 <a 12522 class="contents user-select-text" 12523 ref="productTitleLink" 12524 href="/products/rechargeable-intelligent-uv-disinfector-for-nail-beauty-tools" 12525 > 12526 12527 12528 12529 12530 12531 12532 12533 12534 <div class=" spacing-style text-block text-block--ATnhFUTdmeU5LMzR6T__product_title_BLLeMm custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 12535 <p>Rechargeable Intelligent UV Disinfector for Nail & Beauty Tools</p> 12536 </div> 12537 12538 12539 12540 12541
12542<script type="module"> 12543 class TextReadMoreWrapper extends HTMLElement { 12544 #expanded = false; 12545 #animation = null; 12546 #collapsedHeight = 0; 12547 12548 connectedCallback() { 12549 const content = this.querySelector('.text-read-more__content'); 12550 const textElement = this.querySelector('.text-read-more__text'); 12551 const button = this.querySelector('.text-read-more__button'); 12552 12553 if (!content || !textElement || !button) return; 12554 12555 // Set initial state 12556 this.dataset.expanded = 'false'; 12557 12558 // Wait for content to render - use double RAF to ensure layout is complete 12559 requestAnimationFrame(() => { 12560 requestAnimationFrame(() => { 12561 // Additional small delay to ensure fonts and styles are applied 12562 setTimeout(() => { 12563 this.#checkOverflow(content, textElement, button); 12564 }, 50); 12565 12566 // Recheck on resize 12567 const resizeObserver = new ResizeObserver(() => { 12568 if (!this.#expanded) { 12569 this.#checkOverflow(content, textElement, button); 12570 } 12571 }); 12572 resizeObserver.observe(content); 12573 12574 // Setup button click handler 12575 button.addEventListener('click', (e) => { 12576 e.preventDefault(); 12577 this.#toggle(content, textElement, button); 12578 }); 12579 }); 12580 }); 12581 } 12582 12583 #checkOverflow(content, textElement, button) { 12584 // Ensure collapsed state is applied 12585 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 12586 textElement.classList.add('text-read-more__text--collapsed'); 12587 } 12588 12589 // Get collapsed height first 12590 const collapsedHeight = content.scrollHeight; 12591 this.#collapsedHeight = collapsedHeight; 12592 12593 // Temporarily remove line-clamp to measure full height 12594 textElement.classList.remove('text-read-more__text--collapsed'); 12595 12596 // Force reflow 12597 void content.offsetHeight; 12598 12599 const fullHeight = content.scrollHeight; 12600 12601 // Restore line-clamp 12602 textElement.classList.add('text-read-more__text--collapsed'); 12603 12604 // Show button if content exceeds 2 lines (with small threshold for rounding) 12605 if (fullHeight > collapsedHeight + 5) { 12606 button.removeAttribute('hidden'); 12607 } else { 12608 button.setAttribute('hidden', ''); 12609 } 12610 } 12611 12612 #toggle(content, textElement, button) { 12613 const startHeight = content.offsetHeight; 12614 let endHeight; 12615 12616 if (!this.#expanded) { 12617 // Expanding 12618 textElement.classList.remove('text-read-more__text--collapsed'); 12619 endHeight = content.scrollHeight; 12620 this.#expanded = true; 12621 } else { 12622 // Collapsing 12623 endHeight = this.#collapsedHeight; 12624 this.#expanded = false; 12625 } 12626 12627 this.dataset.expanded = this.#expanded; 12628 button.setAttribute('aria-expanded', this.#expanded); 12629 12630 // Animate 12631 content.style.overflow = 'hidden'; 12632 this.#animation?.cancel(); 12633 12634 this.#animation = content.animate( 12635 { 12636 height: [`${startHeight}px`, `${endHeight}px`], 12637 }, 12638 { 12639 duration: 300, 12640 easing: 'ease-in-out', 12641 } 12642 ); 12643 12644 this.#animation.onfinish = () => { 12645 if (this.#expanded) { 12646 content.style.removeProperty('height'); 12647 content.style.overflow = ''; 12648 } else { 12649 textElement.classList.add('text-read-more__text--collapsed'); 12650 content.style.removeProperty('height'); 12651 content.style.overflow = ''; 12652 } 12653 }; 12654 } 12655 } 12656 12657 if (!customElements.get('text-read-more-wrapper')) { 12658 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 12659 } 12660</script>
12660 12661 12662 </a> 12663 12664 12665 12666 12667 12668 12669<product-price 12670 class="text-block text-block--align-left custom-typography custom-font-size custom-color text-left custom spacing-style" 12671 data-block-id="ARDI3alNNdlArbVBQd__price_UQh7nT" 12672 data-product-id="11024830300506" 12673 style=" 12674 12675--color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-subheading--weight);--font-family: var(--font-subheading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); 12676 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 12677 --width: 100%; 12678 " 12679 12680> 12681 <div ref="priceContainer"> 12682 12683 12684 12685 12686 12687 <span class="price">£18.00</span> 12688 12689 12690 12691 12692</div> 12693 12694 12695</product-price> 12696 12697 12698 12699 12700 12701 12702 12703 12704 </div> 12705</product-card></product-card-link> 12706 12707</div> 12708 12709 12710 12711 12712 12713 12714 12715 </div> 12716 12717 12718 12719</slideshow-slide> 12720 12721 12722 <slideshow-slide 12723 ref="slides[]" 12724 aria-hidden="true" 12725 style="--slideshow-timeline: --slide-1; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 12726 12727 class="resource-list__slide" 12728 12729 12730 12731 12732 12733 12734 12735> 12736 12737 12738 12739 <div 12740 class="resource-list__item" 12741 > 12742 12743 12744 12745<div > 12746 12747 12748<style data-shopify> 12749 12750</style> 12751 12752 12753<product-card-link 12754 data-product-id="11022935228762" 12755 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=500" 12756 data-product-transition="true" 12757 12758 ><product-card 12759 class="product-card" 12760 data-product-id="11022935228762" 12761 id="product-card-AeTdjd2lkb3BwakczM__static-product-card-1" 12762 data-product-transition="true" 12763 12764 12765> 12766 <a 12767 id="5ec47469afaaa59a91f4cc5778f4eb4c" 12768 12769 href="/products/mr-nail-3-layer-lint-free-nail-wipes-500pcs?variant=54925456146778" 12770 12771 class="product-card__link" 12772 ref="productCardLink" 12773 > 12774 <span class="visually-hidden"> 12775 MR NAIL 3-Layer Lint-Free Nail Wipes â 500pcs 12776 </span> 12777 </a> 12778 <div 12779 class=" 12780 product-card__content 12781 layout-panel-flex 12782 layout-panel-flex--column 12783 product-grid__card 12784 spacing-style 12785 border-style 12786 gap-style 12787 12788 " 12789 style=" 12790 --border-width: 1px; --border-style: none; --border-color: 12791rgb(var(--color-border-rgb) / 1.0); --border-radius: 127920px; 12793 12794 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 12795 12796 12797 12798--horizontal-alignment: ; --vertical-alignment: ; 12799--vertical-alignment-mobile: ; 12800 12801 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 12802 --product-card-gap: 8px; 12803 --quick-add-display: flex; 12804 --quick-add-mobile-display: flex; 12805 --quick-add-mobile-opacity: 1; 12806 12807 12808 12809 12810 " 12811 > 12812 12813 12814 12815 12816 12817 12818 12819 12820 12821<div 12822 ref="cardGallery" 12823 class="card-gallery card-gallery-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-1 spacing-style border-style" 12824 style=" 12825 --border-width: 1px; --border-style: solid; --border-color: 12826rgb(var(--color-border-rgb) / 1.0); --border-radius: 1282712px; overflow: hidden; 12828 12829 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 12830 --gallery-aspect-ratio: 1.0; 12831 " 12832 data-product-id="11022935228762" 12833 12834 on:pointerenter="/previewImage" 12835 on:pointerleave="/resetImage" 12836 12837 12838 data-view-transition-to-main-product 12839 12840 data-image-ratio="adapt" 12841 12842> 12843 <a 12844 class="contents" 12845 ref="cardGalleryLink" 12846 href="/products/mr-nail-3-layer-lint-free-nail-wipes-500pcs" 12847 aria-label="MR NAIL 3-Layer Lint-Free Nail Wipes â 500pcs" 12848 > 12849 <slideshow-component 12850 12851 ref="slideshow" 12852 12853 12854 style="--slideshow-timeline: --slide-1;--slide-min-height: auto;--slide-min-height-desktop: auto;" 12855 12856 initial-slide="0" 12857 12858 12859 infinite 12860 12861 12862 12863 data-generic-media-size="1" allow-nested="true" 12864> 12865 12866 <slideshow-container ref="slideshowContainer"> 12867 12868 12869 <slideshow-slides 12870 tabindex="-1" 12871 ref="scroller" 12872 12873 > 12874 <slideshow-slide 12875 ref="slides[]" 12876 aria-hidden="false" 12877 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 12878 12879 class="product-media-container media-fit product-media-container--image" 12880 12881 12882 12883 12884 slide-id="62515806470490" 12885 12886 12887 12888 12889> 12890 12891 12892<div 12893 class="product-media" 12894 style="--ratio: 1.0" 12895 data-media-id="62515806470490" 12896> 12897 12898 <img src="//www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=3840" alt="MR NAIL 3-Layer Lint-Free Nail Wipes â 500pcs" srcset="//www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=3840 3840w" width="3840" height="3840" loading="eager" sizes="(min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 12899 12900 12901</div> 12902 12903 12904 12905</slideshow-slide> 12906 12907 </slideshow-slides> 12908 </slideshow-container> 12909 12910</slideshow-component> 12911 12912 12913 12914 </a> 12915 12916 12917 <div 12918 class="product-badges product-badges--top-right" 12919 style=" 12920 --badge-border-radius: 100px; 12921 --badge-font-family: var(--font-body--family);
12921 --badge-font-weight: var(--font-body--weight); --badge-text-transform: none; 12922 " 12923 ></div> 12924 12925 12926 12927<quick-add-component 12928 class="quick-add color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 " 12929 ref="quickAdd" 12930 data-product-title="MR NAIL 3-Layer Lint-Free Nail Wipes â 500pcs" 12931 data-quick-add-button="add" 12932 data-product-options-count="1" 12933> 12934 <product-form-component 12935 data-section-id="template--28213213921626__product_list_ykU4x3" 12936 data-product-id="11022935228762" 12937 on:submit="/handleSubmit" 12938 class="quick-add__product-form-component" 12939 > 12940 <div 12941 class="visually-hidden" 12942 aria-live="assertive" 12943 role="status" 12944 aria-atomic="true" 12945 ref="liveRegion" 12946 ></div><form method="post" action="/cart/add" id="QuickAdd-ProductForm-11022935228762-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-1" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="â" /><input 12947 type="hidden" 12948 name="id" 12949 ref="variantId" 12950 value="54925456146778" 12951 12952 > 12953 <input 12954 type="hidden" 12955 name="quantity" 12956 value="1" 12957 > 12958 12959 <add-to-cart-component 12960 ref="addToCartButtonContainer" 12961 data-product-variant-media="//www.tnbl.co.uk/cdn/shop/files/disposablesalontowel_1.png?v=1791385545&width=100" 12962 data-add-to-cart-animation="true" 12963> 12964 <button 12965 12966 type="submit" 12967 name="add" 12968 ref="addToCartButton" 12969 on:click="/handleClick" 12970 class="button button quick-add__button quick-add__button--add add-to-cart-button" 12971 12972 12973 > 12974 <span 12975 class="add-to-cart-text" 12976 > 12977 12978 <span 12979 aria-hidden="true" 12980 class="svg-wrapper add-to-cart-icon" 12981 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 12982</span> 12983 12984 <span class="add-to-cart-text__content is-visually-hidden-mobile"> 12985 <span> 12986 <span>Add</span> 12987 </span> 12988 </span> 12989 </span> 12990 12991 <span class="add-to-cart__added"> 12992 <span class="svg-wrapper add-to-cart__added-icon"><svg aria-hidden="true" class="checkmark-burst" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 12993 <g class="check"> 12994 <circle class="ring" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 12995 <path class="tick" d="M9 12.75L11.25 15L15 9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 12996 </g> 12997 <g class="burst"> 12998 <g style="--index: 0;"> 12999 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13000 </g> 13001 <g style="--index: 1;"> 13002 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13003 </g> 13004 <g style="--index: 2;"> 13005 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13006 </g> 13007 <g style="--index: 3;"> 13008 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13009 </g> 13010 <g style="--index: 4;"> 13011 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13012 </g> 13013 <g style="--index: 5;"> 13014 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13015 </g> 13016 <g style="--index: 6;"> 13017 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13018 </g> 13019 <g style="--index: 7;"> 13020 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13021 </g> 13022 </g> 13023</svg> 13024</span> 13025 </span> 13026 </button> 13027</add-to-cart-component> 13028 13029 13030 13031 13032 <button 13033 class="button quick-add__button quick-add__button--choose add-to-cart-button" 13034 13035 type="button" 13036 name="add" 13037 on:click="quick-add-component/handleClick" 13038 >
13039 <span 13040 class="add-to-cart-text quick-add__button-content" 13041 > 13042 13043 <span 13044 aria-hidden="true" 13045 class="svg-wrapper add-to-cart-icon quick-add__button-icon" 13046 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 13047</span> 13048 <span class="add-to-cart-text__content is-visually-hidden-mobile quick-add__button-text"> 13049 <span> 13050 13051 <span> 13052 Add 13053 </span> 13054 </span> 13055 </span> 13056 </span> 13057 </button><input type="hidden" name="product-id" value="11022935228762" /><input type="hidden" name="section-id" value="template--28213213921626__product_list_ykU4x3" /></form></product-form-component> 13058</quick-add-component> 13059 13060 13061 13062 13063 13064 13065</div> 13066 13067 13068 13069 13070 13071<div class="product-grid-view-zoom-out--details"> 13072 13073 <h3 class="h4">MR NAIL 3-Layer Lint-Free Nail Wipes â 500pcs</h3> 13074 13075</div> 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 <div class=" spacing-style text-block text-block--AWHY0bEN1blVtbmFle__text_JM9p8t-1 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 13091 <p>MR NAIL </p> 13092 </div> 13093 13094 13095 13096 13097
13098<script type="module"> 13099 class TextReadMoreWrapper extends HTMLElement { 13100 #expanded = false; 13101 #animation = null; 13102 #collapsedHeight = 0; 13103 13104 connectedCallback() { 13105 const content = this.querySelector('.text-read-more__content'); 13106 const textElement = this.querySelector('.text-read-more__text'); 13107 const button = this.querySelector('.text-read-more__button'); 13108 13109 if (!content || !textElement || !button) return; 13110 13111 // Set initial state 13112 this.dataset.expanded = 'false'; 13113 13114 // Wait for content to render - use double RAF to ensure layout is complete 13115 requestAnimationFrame(() => { 13116 requestAnimationFrame(() => { 13117 // Additional small delay to ensure fonts and styles are applied 13118 setTimeout(() => { 13119 this.#checkOverflow(content, textElement, button); 13120 }, 50); 13121 13122 // Recheck on resize 13123 const resizeObserver = new ResizeObserver(() => { 13124 if (!this.#expanded) { 13125 this.#checkOverflow(content, textElement, button); 13126 } 13127 }); 13128 resizeObserver.observe(content); 13129 13130 // Setup button click handler 13131 button.addEventListener('click', (e) => { 13132 e.preventDefault(); 13133 this.#toggle(content, textElement, button); 13134 }); 13135 }); 13136 }); 13137 } 13138 13139 #checkOverflow(content, textElement, button) { 13140 // Ensure collapsed state is applied 13141 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 13142 textElement.classList.add('text-read-more__text--collapsed'); 13143 } 13144 13145 // Get collapsed height first 13146 const collapsedHeight = content.scrollHeight; 13147 this.#collapsedHeight = collapsedHeight; 13148 13149 // Temporarily remove line-clamp to measure full height 13150 textElement.classList.remove('text-read-more__text--collapsed'); 13151 13152 // Force reflow 13153 void content.offsetHeight; 13154 13155 const fullHeight = content.scrollHeight; 13156 13157 // Restore line-clamp 13158 textElement.classList.add('text-read-more__text--collapsed'); 13159 13160 // Show button if content exceeds 2 lines (with small threshold for rounding) 13161 if (fullHeight > collapsedHeight + 5) { 13162 button.removeAttribute('hidden'); 13163 } else { 13164 button.setAttribute('hidden', ''); 13165 } 13166 } 13167 13168 #toggle(content, textElement, button) { 13169 const startHeight = content.offsetHeight; 13170 let endHeight; 13171 13172 if (!this.#expanded) { 13173 // Expanding 13174 textElement.classList.remove('text-read-more__text--collapsed'); 13175 endHeight = content.scrollHeight; 13176 this.#expanded = true; 13177 } else { 13178 // Collapsing 13179 endHeight = this.#collapsedHeight; 13180 this.#expanded = false; 13181 } 13182 13183 this.dataset.expanded = this.#expanded; 13184 button.setAttribute('aria-expanded', this.#expanded); 13185 13186 // Animate 13187 content.style.overflow = 'hidden'; 13188 this.#animation?.cancel(); 13189 13190 this.#animation = content.animate( 13191 { 13192 height: [`${startHeight}px`, `${endHeight}px`], 13193 }, 13194 { 13195 duration: 300, 13196 easing: 'ease-in-out', 13197 } 13198 ); 13199 13200 this.#animation.onfinish = () => { 13201 if (this.#expanded) { 13202 content.style.removeProperty('height'); 13203 content.style.overflow = ''; 13204 } else { 13205 textElement.classList.add('text-read-more__text--collapsed'); 13206 content.style.removeProperty('height'); 13207 content.style.overflow = ''; 13208 } 13209 }; 13210 } 13211 } 13212 13213 if (!customElements.get('text-read-more-wrapper')) { 13214 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 13215 } 13216</script>
13216 13217 13218 13219 13220 13221 13222 13223 13224 <a 13225 class="contents user-select-text" 13226 ref="productTitleLink" 13227 href="/products/mr-nail-3-layer-lint-free-nail-wipes-500pcs" 13228 > 13229 13230 13231 13232 13233 13234 13235 13236 13237 <div class=" spacing-style text-block text-block--ATnhFUTdmeU5LMzR6T__product_title_BLLeMm-1 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 13238 <p>MR NAIL 3-Layer Lint-Free Nail Wipes â 500pcs</p> 13239 </div> 13240 13241 13242 13243 13244
13245<script type="module"> 13246 class TextReadMoreWrapper extends HTMLElement { 13247 #expanded = false; 13248 #animation = null; 13249 #collapsedHeight = 0; 13250 13251 connectedCallback() { 13252 const content = this.querySelector('.text-read-more__content'); 13253 const textElement = this.querySelector('.text-read-more__text'); 13254 const button = this.querySelector('.text-read-more__button'); 13255 13256 if (!content || !textElement || !button) return; 13257 13258 // Set initial state 13259 this.dataset.expanded = 'false'; 13260 13261 // Wait for content to render - use double RAF to ensure layout is complete 13262 requestAnimationFrame(() => { 13263 requestAnimationFrame(() => { 13264 // Additional small delay to ensure fonts and styles are applied 13265 setTimeout(() => { 13266 this.#checkOverflow(content, textElement, button); 13267 }, 50); 13268 13269 // Recheck on resize 13270 const resizeObserver = new ResizeObserver(() => { 13271 if (!this.#expanded) { 13272 this.#checkOverflow(content, textElement, button); 13273 } 13274 }); 13275 resizeObserver.observe(content); 13276 13277 // Setup button click handler 13278 button.addEventListener('click', (e) => { 13279 e.preventDefault(); 13280 this.#toggle(content, textElement, button); 13281 }); 13282 }); 13283 }); 13284 } 13285 13286 #checkOverflow(content, textElement, button) { 13287 // Ensure collapsed state is applied 13288 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 13289 textElement.classList.add('text-read-more__text--collapsed'); 13290 } 13291 13292 // Get collapsed height first 13293 const collapsedHeight = content.scrollHeight; 13294 this.#collapsedHeight = collapsedHeight; 13295 13296 // Temporarily remove line-clamp to measure full height 13297 textElement.classList.remove('text-read-more__text--collapsed'); 13298 13299 // Force reflow 13300 void content.offsetHeight; 13301 13302 const fullHeight = content.scrollHeight; 13303 13304 // Restore line-clamp 13305 textElement.classList.add('text-read-more__text--collapsed'); 13306 13307 // Show button if content exceeds 2 lines (with small threshold for rounding) 13308 if (fullHeight > collapsedHeight + 5) { 13309 button.removeAttribute('hidden'); 13310 } else { 13311 button.setAttribute('hidden', ''); 13312 } 13313 } 13314 13315 #toggle(content, textElement, button) { 13316 const startHeight = content.offsetHeight; 13317 let endHeight; 13318 13319 if (!this.#expanded) { 13320 // Expanding 13321 textElement.classList.remove('text-read-more__text--collapsed'); 13322 endHeight = content.scrollHeight; 13323 this.#expanded = true; 13324 } else { 13325 // Collapsing 13326 endHeight = this.#collapsedHeight; 13327 this.#expanded = false; 13328 } 13329 13330 this.dataset.expanded = this.#expanded; 13331 button.setAttribute('aria-expanded', this.#expanded); 13332 13333 // Animate 13334 content.style.overflow = 'hidden'; 13335 this.#animation?.cancel(); 13336 13337 this.#animation = content.animate( 13338 { 13339 height: [`${startHeight}px`, `${endHeight}px`], 13340 }, 13341 { 13342 duration: 300, 13343 easing: 'ease-in-out', 13344 } 13345 ); 13346 13347 this.#animation.onfinish = () => { 13348 if (this.#expanded) { 13349 content.style.removeProperty('height'); 13350 content.style.overflow = ''; 13351 } else { 13352 textElement.classList.add('text-read-more__text--collapsed'); 13353 content.style.removeProperty('height'); 13354 content.style.overflow = ''; 13355 } 13356 }; 13357 } 13358 } 13359 13360 if (!customElements.get('text-read-more-wrapper')) { 13361 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 13362 } 13363</script>
13363 13364 13365 </a> 13366 13367 13368 13369 13370 13371 13372<product-price 13373 class="text-block text-block--align-left custom-typography custom-font-size custom-color text-left custom spacing-style" 13374 data-block-id="ARDI3alNNdlArbVBQd__price_UQh7nT-1" 13375 data-product-id="11022935228762" 13376 style=" 13377 13378--color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-subheading--weight);--font-family: var(--font-subheading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); 13379 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 13380 --width: 100%; 13381 " 13382 13383> 13384 <div ref="priceContainer"> 13385 13386 13387 13388 13389 13390 <span class="price">£4.00</span> 13391 13392 13393 13394 13395</div> 13396 13397 13398</product-price> 13399 13400 13401 13402 13403 13404 13405 13406 13407 </div> 13408</product-card></product-card-link> 13409 13410</div> 13411 13412 13413 13414 13415 13416 13417 13418 </div> 13419 13420 13421 13422</slideshow-slide> 13423 13424 13425 <slideshow-slide 13426 ref="slides[]" 13427 aria-hidden="true" 13428 style="--slideshow-timeline: --slide-2; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 13429 13430 class="resource-list__slide" 13431 13432 13433 13434 13435 13436 13437 13438> 13439 13440 13441 13442 <div 13443 class="resource-list__item" 13444 > 13445 13446 13447 13448<div > 13449 13450 13451<style data-shopify> 13452 13453</style> 13454 13455 13456<product-card-link 13457 data-product-id="11022914093402" 13458 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=500" 13459 data-product-transition="true" 13460 13461 ><product-card 13462 class="product-card" 13463 data-product-id="11022914093402" 13464 id="product-card-AeTdjd2lkb3BwakczM__static-product-card-2" 13465 data-product-transition="true" 13466 13467 13468> 13469 <a 13470 id="d2b62c68d28ecc9e46fddd064543554f" 13471 13472 href="/products/disposable-salon-towels-biodegradable-70-x-35cm-hair-nails-pedicure?variant=54925336052058" 13473 13474 class="product-card__link" 13475 ref="productCardLink" 13476 > 13477 <span class="visually-hidden"> 13478 Biodegradable Disposable Salon Towels â 70 x 35cm | Hair, Nails & Pedicure 13479 </span> 13480 </a> 13481 <div 13482 class=" 13483 product-card__content 13484 layout-panel-flex 13485 layout-panel-flex--column 13486 product-grid__card 13487 spacing-style 13488 border-style 13489 gap-style 13490 13491 " 13492 style=" 13493 --border-width: 1px; --border-style: none; --border-color: 13494rgb(var(--color-border-rgb) / 1.0); --border-radius: 134950px; 13496 13497 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 13498 13499 13500 13501--horizontal-alignment: ; --vertical-alignment: ; 13502--vertical-alignment-mobile: ; 13503 13504 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 13505 --product-card-gap: 8px; 13506 --quick-add-display: flex; 13507 --quick-add-mobile-display: flex; 13508 --quick-add-mobile-opacity: 1; 13509 13510 13511 13512 13513 " 13514 > 13515 13516 13517 13518 13519 13520 13521 13522 13523 13524<div 13525 ref="cardGallery" 13526 class="card-gallery card-gallery-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-2 spacing-style border-style" 13527 style=" 13528 --border-width: 1px; --border-style: solid; --border-color: 13529rgb(var(--color-border-rgb) / 1.0); --border-radius: 1353012px; overflow: hidden; 13531 13532 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 13533 --gallery-aspect-ratio: 1.0; 13534 " 13535 data-product-id="11022914093402" 13536 13537 on:pointerenter="/previewImage" 13538 on:pointerleave="/resetImage" 13539 13540 13541 data-view-transition-to-main-product 13542 13543 data-image-ratio="adapt" 13544 13545> 13546 <a 13547 class="contents" 13548 ref="cardGalleryLink" 13549 href="/products/disposable-salon-towels-biodegradable-70-x-35cm-hair-nails-pedicure" 13550 aria-label="Biodegradable Disposable Salon Towels â 70 x 35cm | Hair, Nails & Pedicure" 13551 > 13552 <slideshow-component 13553 13554 ref="slideshow" 13555 13556 13557 style="--slideshow-timeline: --slide-1, --slide-2, --slide-3;--slide-min-height: auto;--slide-min-height-desktop: auto;" 13558 13559 initial-slide="0" 13560 13561 13562 infinite 13563 13564 13565 13566 data-generic-media-size="3" allow-nested="true" 13567> 13568 13569 <slideshow-container ref="slideshowContainer"> 13570 13571 <slideshow-arrows 13572 position="center" 13573 13574><button 13575 class=" 13576 slideshow-control slideshow-control--previous 13577 13578 13579 slideshow-control--style-arrow 13580 button button-unstyled button-unstyled--transparent 13581 flip-x 13582 " 13583 13584 aria-label="Previous slide" 13585
13586 on:click="/previous" 13587 ref="previous" 13588> 13589 <span class="svg-wrapper icon-arrow"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" vector-effect="non-scaling-stroke" d="M4.25 10h11.5m0 0-4-4m4 4-4 4"/></svg> 13590</span> 13591</button> 13592<button 13593 class=" 13594 slideshow-control slideshow-control--next 13595 13596 13597 slideshow-control--style-arrow 13598 button button-unstyled button-unstyled--transparent 13599 13600 " 13601 13602 aria-label="Next slide" 13603 13604 on:click="/next" 13605 ref="next" 13606> 13607 <span class="svg-wrapper icon-arrow"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" vector-effect="non-scaling-stroke" d="M4.25 10h11.5m0 0-4-4m4 4-4 4"/></svg> 13608</span> 13609</button> 13610</slideshow-arrows> 13611 13612 13613 13614 <slideshow-slides 13615 tabindex="-1" 13616 ref="scroller" 13617 13618 > 13619 <slideshow-slide 13620 ref="slides[]" 13621 aria-hidden="false" 13622 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 13623 13624 class="product-media-container media-fit product-media-container--image" 13625 13626 13627 13628 13629 slide-id="62515699155290" 13630 13631 13632 13633 13634> 13635 13636 13637<div 13638 class="product-media" 13639 style="--ratio: 1.0" 13640 data-media-id="62515699155290" 13641> 13642 13643 <img src="//www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=3840" alt="Biodegradable Disposable Salon Towels â 70 x 35cm | Hair, Nails & Pedicure" srcset="//www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=3840 3840w" width="3840" height="3840" loading="eager" sizes="(min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 13644 13645 13646</div> 13647 13648 13649 13650</slideshow-slide> 13651<slideshow-slide 13652 ref="slides[]" 13653 aria-hidden="true" 13654 style="--slideshow-timeline: --slide-1; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 13655 13656 class="product-media-container media-fit product-media-container--image" 13657 13658 13659 13660 13661 slide-id="62515699188058" 13662 13663 13664 13665 13666> 13667 13668 13669<div 13670 class="product-media" 13671 style="--ratio: 1.0" 13672 data-media-id="62515699188058" 13673> 13674 13675 <img src="//www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=3840" alt="Biodegradable Disposable Salon Towels â 70 x 35cm | Hair, Nails & Pedicure" srcset="//www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/disposablesalontowel.png?v=1791384240&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 13676 13677 13678</div> 13679 13680 13681 13682</slideshow-slide> 13683<slideshow-slide 13684 ref="slides[]" 13685 aria-hidden="true" 13686 style="--slideshow-timeline: --slide-2; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 13687 13688 class="product-media-container media-fit product-media-container--image" 13689 13690 13691 13692 13693 slide-id="62515750601050" 13694 13695 13696 13697 13698> 13699 13700 13701<div 13702 class="product-media" 13703 style="--ratio: 1.0" 13704 data-media-id="62515750601050" 13705> 13706
13707 <img src="//www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=3840" alt="Biodegradable Disposable Salon Towels â 70 x 35cm | Hair, Nails & Pedicure" srcset="//www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/disposabel_towel.jpg?v=1791384555&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 13708 13709 13710</div> 13711 13712 13713 13714</slideshow-slide> 13715 13716 </slideshow-slides> 13717 </slideshow-container> 13718 13719</slideshow-component> 13720 13721 13722 13723 </a> 13724 13725 13726 <div 13727 class="product-badges product-badges--top-right" 13728 style=" 13729 --badge-border-radius: 100px; 13730 --badge-font-family: var(--font-body--family); --badge-font-weight: var(--font-body--weight); --badge-text-transform: none; 13731 " 13732 ></div> 13733 13734 13735 13736<quick-add-component 13737 class="quick-add color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 " 13738 ref="quickAdd" 13739 data-product-title="Biodegradable Disposable Salon Towels â 70 x 35cm | Hair, Nails & Pedicure" 13740 data-quick-add-button="add" 13741 data-product-options-count="1" 13742> 13743 <product-form-component 13744 data-section-id="template--28213213921626__product_list_ykU4x3" 13745 data-product-id="11022914093402" 13746 on:submit="/handleSubmit" 13747 class="quick-add__product-form-component" 13748 > 13749 <div 13750 class="visually-hidden" 13751 aria-live="assertive" 13752 role="status" 13753 aria-atomic="true" 13754 ref="liveRegion" 13755 ></div><form method="post" action="/cart/add" id="QuickAdd-ProductForm-11022914093402-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-2" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="â" /><input 13756 type="hidden" 13757 name="id" 13758 ref="variantId" 13759 value="54925336052058" 13760 13761 > 13762 <input 13763 type="hidden" 13764 name="quantity" 13765 value="1" 13766 > 13767 13768 <add-to-cart-component 13769 ref="addToCartButtonContainer" 13770 data-product-variant-media="//www.tnbl.co.uk/cdn/shop/files/toweldisposable.jpg?v=1791384239&width=100" 13771 data-add-to-cart-animation="true" 13772> 13773 <button 13774 13775 type="submit" 13776 name="add" 13777 ref="addToCartButton" 13778 on:click="/handleClick" 13779 class="button button quick-add__button quick-add__button--add add-to-cart-button" 13780 13781 13782 > 13783 <span 13784 class="add-to-cart-text" 13785 > 13786 13787 <span 13788 aria-hidden="true" 13789 class="svg-wrapper add-to-cart-icon" 13790 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 13791</span> 13792 13793 <span class="add-to-cart-text__content is-visually-hidden-mobile"> 13794 <span> 13795 <span>Add</span> 13796 </span> 13797 </span> 13798 </span> 13799 13800 <span class="add-to-cart__added">
13801 <span class="svg-wrapper add-to-cart__added-icon"><svg aria-hidden="true" class="checkmark-burst" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 13802 <g class="check"> 13803 <circle class="ring" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 13804 <path class="tick" d="M9 12.75L11.25 15L15 9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 13805 </g> 13806 <g class="burst"> 13807 <g style="--index: 0;"> 13808 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13809 </g> 13810 <g style="--index: 1;"> 13811 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13812 </g> 13813 <g style="--index: 2;"> 13814 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13815 </g> 13816 <g style="--index: 3;"> 13817 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13818 </g> 13819 <g style="--index: 4;"> 13820 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13821 </g> 13822 <g style="--index: 5;"> 13823 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13824 </g> 13825 <g style="--index: 6;"> 13826 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13827 </g> 13828 <g style="--index: 7;"> 13829 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 13830 </g> 13831 </g> 13832</svg> 13833</span> 13834 </span> 13835 </button> 13836</add-to-cart-component> 13837 13838 13839 13840 13841 <button 13842 class="button quick-add__button quick-add__button--choose add-to-cart-button" 13843 13844 type="button" 13845 name="add" 13846 on:click="quick-add-component/handleClick" 13847 > 13848 <span 13849 class="add-to-cart-text quick-add__button-content" 13850 > 13851 13852 <span 13853 aria-hidden="true" 13854 class="svg-wrapper add-to-cart-icon quick-add__button-icon" 13855 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 13856</span> 13857 <span class="add-to-cart-text__content is-visually-hidden-mobile quick-add__button-text"> 13858 <span> 13859 13860 <span> 13861 Add 13862 </span> 13863 </span> 13864 </span> 13865 </span> 13866 </button><input type="hidden" name="product-id" value="11022914093402" /><input type="hidden" name="section-id" value="template--28213213921626__product_list_ykU4x3" /></form></product-form-component> 13867</quick-add-component> 13868 13869 13870 13871 13872 13873 13874</div> 13875 13876 13877 13878 13879 13880<div class="product-grid-view-zoom-out--details"> 13881 13882 <h3 class="h4">Biodegradable Disposable Salon Towels â 70 x 35cm | Hair, Nails & Pedicure</h3> 13883 13884</div> 13885 13886 13887 13888 13889 13890 13891 13892 13893 13894 13895 13896 13897 13898 13899 <div class=" spacing-style text-block text-block--AWHY0bEN1blVtbmFle__text_JM9p8t-2 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 13900 <p>TNBL UK </p> 13901 </div> 13902 13903 13904 13905 13906
13907<script type="module"> 13908 class TextReadMoreWrapper extends HTMLElement { 13909 #expanded = false; 13910 #animation = null; 13911 #collapsedHeight = 0; 13912 13913 connectedCallback() { 13914 const content = this.querySelector('.text-read-more__content'); 13915 const textElement = this.querySelector('.text-read-more__text'); 13916 const button = this.querySelector('.text-read-more__button'); 13917 13918 if (!content || !textElement || !button) return; 13919 13920 // Set initial state 13921 this.dataset.expanded = 'false'; 13922 13923 // Wait for content to render - use double RAF to ensure layout is complete 13924 requestAnimationFrame(() => { 13925 requestAnimationFrame(() => { 13926 // Additional small delay to ensure fonts and styles are applied 13927 setTimeout(() => { 13928 this.#checkOverflow(content, textElement, button); 13929 }, 50); 13930 13931 // Recheck on resize 13932 const resizeObserver = new ResizeObserver(() => { 13933 if (!this.#expanded) { 13934 this.#checkOverflow(content, textElement, button); 13935 } 13936 }); 13937 resizeObserver.observe(content); 13938 13939 // Setup button click handler 13940 button.addEventListener('click', (e) => { 13941 e.preventDefault(); 13942 this.#toggle(content, textElement, button); 13943 }); 13944 }); 13945 }); 13946 } 13947 13948 #checkOverflow(content, textElement, button) { 13949 // Ensure collapsed state is applied 13950 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 13951 textElement.classList.add('text-read-more__text--collapsed'); 13952 } 13953 13954 // Get collapsed height first 13955 const collapsedHeight = content.scrollHeight; 13956 this.#collapsedHeight = collapsedHeight; 13957 13958 // Temporarily remove line-clamp to measure full height 13959 textElement.classList.remove('text-read-more__text--collapsed'); 13960 13961 // Force reflow 13962 void content.offsetHeight; 13963 13964 const fullHeight = content.scrollHeight; 13965 13966 // Restore line-clamp 13967 textElement.classList.add('text-read-more__text--collapsed'); 13968 13969 // Show button if content exceeds 2 lines (with small threshold for rounding) 13970 if (fullHeight > collapsedHeight + 5) { 13971 button.removeAttribute('hidden'); 13972 } else { 13973 button.setAttribute('hidden', ''); 13974 } 13975 } 13976 13977 #toggle(content, textElement, button) { 13978 const startHeight = content.offsetHeight; 13979 let endHeight; 13980 13981 if (!this.#expanded) { 13982 // Expanding 13983 textElement.classList.remove('text-read-more__text--collapsed'); 13984 endHeight = content.scrollHeight; 13985 this.#expanded = true; 13986 } else { 13987 // Collapsing 13988 endHeight = this.#collapsedHeight; 13989 this.#expanded = false; 13990 } 13991 13992 this.dataset.expanded = this.#expanded; 13993 button.setAttribute('aria-expanded', this.#expanded); 13994 13995 // Animate 13996 content.style.overflow = 'hidden'; 13997 this.#animation?.cancel(); 13998 13999 this.#animation = content.animate( 14000 { 14001 height: [`${startHeight}px`, `${endHeight}px`], 14002 }, 14003 { 14004 duration: 300, 14005 easing: 'ease-in-out', 14006 } 14007 ); 14008 14009 this.#animation.onfinish = () => { 14010 if (this.#expanded) { 14011 content.style.removeProperty('height'); 14012 content.style.overflow = ''; 14013 } else { 14014 textElement.classList.add('text-read-more__text--collapsed'); 14015 content.style.removeProperty('height'); 14016 content.style.overflow = ''; 14017 } 14018 }; 14019 } 14020 } 14021 14022 if (!customElements.get('text-read-more-wrapper')) { 14023 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 14024 } 14025</script>
14025 14026 14027 14028 14029 14030 14031 14032 14033 <a 14034 class="contents user-select-text" 14035 ref="productTitleLink" 14036 href="/products/disposable-salon-towels-biodegradable-70-x-35cm-hair-nails-pedicure" 14037 > 14038 14039 14040 14041 14042 14043 14044 14045 14046 <div class=" spacing-style text-block text-block--ATnhFUTdmeU5LMzR6T__product_title_BLLeMm-2 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 14047 <p>Biodegradable Disposable Salon Towels â 70 x 35cm | Hair, Nails & Pedicure</p> 14048 </div> 14049 14050 14051 14052 14053
14054<script type="module"> 14055 class TextReadMoreWrapper extends HTMLElement { 14056 #expanded = false; 14057 #animation = null; 14058 #collapsedHeight = 0; 14059 14060 connectedCallback() { 14061 const content = this.querySelector('.text-read-more__content'); 14062 const textElement = this.querySelector('.text-read-more__text'); 14063 const button = this.querySelector('.text-read-more__button'); 14064 14065 if (!content || !textElement || !button) return; 14066 14067 // Set initial state 14068 this.dataset.expanded = 'false'; 14069 14070 // Wait for content to render - use double RAF to ensure layout is complete 14071 requestAnimationFrame(() => { 14072 requestAnimationFrame(() => { 14073 // Additional small delay to ensure fonts and styles are applied 14074 setTimeout(() => { 14075 this.#checkOverflow(content, textElement, button); 14076 }, 50); 14077 14078 // Recheck on resize 14079 const resizeObserver = new ResizeObserver(() => { 14080 if (!this.#expanded) { 14081 this.#checkOverflow(content, textElement, button); 14082 } 14083 }); 14084 resizeObserver.observe(content); 14085 14086 // Setup button click handler 14087 button.addEventListener('click', (e) => { 14088 e.preventDefault(); 14089 this.#toggle(content, textElement, button); 14090 }); 14091 }); 14092 }); 14093 } 14094 14095 #checkOverflow(content, textElement, button) { 14096 // Ensure collapsed state is applied 14097 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 14098 textElement.classList.add('text-read-more__text--collapsed'); 14099 } 14100 14101 // Get collapsed height first 14102 const collapsedHeight = content.scrollHeight; 14103 this.#collapsedHeight = collapsedHeight; 14104 14105 // Temporarily remove line-clamp to measure full height 14106 textElement.classList.remove('text-read-more__text--collapsed'); 14107 14108 // Force reflow 14109 void content.offsetHeight; 14110 14111 const fullHeight = content.scrollHeight; 14112 14113 // Restore line-clamp 14114 textElement.classList.add('text-read-more__text--collapsed'); 14115 14116 // Show button if content exceeds 2 lines (with small threshold for rounding) 14117 if (fullHeight > collapsedHeight + 5) { 14118 button.removeAttribute('hidden'); 14119 } else { 14120 button.setAttribute('hidden', ''); 14121 } 14122 } 14123 14124 #toggle(content, textElement, button) { 14125 const startHeight = content.offsetHeight; 14126 let endHeight; 14127 14128 if (!this.#expanded) { 14129 // Expanding 14130 textElement.classList.remove('text-read-more__text--collapsed'); 14131 endHeight = content.scrollHeight; 14132 this.#expanded = true; 14133 } else { 14134 // Collapsing 14135 endHeight = this.#collapsedHeight; 14136 this.#expanded = false; 14137 } 14138 14139 this.dataset.expanded = this.#expanded; 14140 button.setAttribute('aria-expanded', this.#expanded); 14141 14142 // Animate 14143 content.style.overflow = 'hidden'; 14144 this.#animation?.cancel(); 14145 14146 this.#animation = content.animate( 14147 { 14148 height: [`${startHeight}px`, `${endHeight}px`], 14149 }, 14150 { 14151 duration: 300, 14152 easing: 'ease-in-out', 14153 } 14154 ); 14155 14156 this.#animation.onfinish = () => { 14157 if (this.#expanded) { 14158 content.style.removeProperty('height'); 14159 content.style.overflow = ''; 14160 } else { 14161 textElement.classList.add('text-read-more__text--collapsed'); 14162 content.style.removeProperty('height'); 14163 content.style.overflow = ''; 14164 } 14165 }; 14166 } 14167 } 14168 14169 if (!customElements.get('text-read-more-wrapper')) { 14170 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 14171 } 14172</script>
14172 14173 14174 </a> 14175 14176 14177 14178 14179 14180 14181<product-price 14182 class="text-block text-block--align-left custom-typography custom-font-size custom-color text-left custom spacing-style" 14183 data-block-id="ARDI3alNNdlArbVBQd__price_UQh7nT-2" 14184 data-product-id="11022914093402" 14185 style=" 14186 14187--color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-subheading--weight);--font-family: var(--font-subheading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); 14188 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 14189 --width: 100%; 14190 " 14191 14192> 14193 <div ref="priceContainer"> 14194 14195 14196 14197 14198 14199 <span class="price">£15.00</span> 14200 14201 14202 14203 14204</div> 14205 14206 14207</product-price> 14208 14209 14210 14211 14212 14213 14214 14215 14216 </div> 14217</product-card></product-card-link> 14218 14219</div> 14220 14221 14222 14223 14224 14225 14226 14227 </div> 14228 14229 14230 14231</slideshow-slide> 14232 14233 14234 <slideshow-slide 14235 ref="slides[]" 14236 aria-hidden="true" 14237 style="--slideshow-timeline: --slide-3; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 14238 14239 class="resource-list__slide" 14240 14241 14242 14243 14244 14245 14246 14247> 14248 14249 14250 14251 <div 14252 class="resource-list__item" 14253 > 14254 14255 14256 14257<div > 14258 14259 14260<style data-shopify> 14261 14262</style> 14263 14264 14265<product-card-link 14266 data-product-id="11022872576346" 14267 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=500" 14268 data-product-transition="true" 14269 14270 ><product-card 14271 class="product-card" 14272 data-product-id="11022872576346" 14273 id="product-card-AeTdjd2lkb3BwakczM__static-product-card-3" 14274 data-product-transition="true" 14275 14276 14277> 14278 <a 14279 id="8b1a0a652210a099a136cf0b86550ed5" 14280 14281 href="/products/tnbl-breast-cancer-charity-day-5-entry-ticket-wednesday-21st-october-2026?variant=54925177520474" 14282 14283 class="product-card__link" 14284 ref="productCardLink" 14285 > 14286 <span class="visually-hidden"> 14287 TNBL Breast Cancer Charity Day â £5 Entry Ticket â Wednesday 21st October 2026 14288 </span> 14289 </a> 14290 <div 14291 class=" 14292 product-card__content 14293 layout-panel-flex 14294 layout-panel-flex--column 14295 product-grid__card 14296 spacing-style 14297 border-style 14298 gap-style 14299 14300 " 14301 style=" 14302 --border-width: 1px; --border-style: none; --border-color: 14303rgb(var(--color-border-rgb) / 1.0); --border-radius: 143040px; 14305 14306 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 14307 14308 14309 14310--horizontal-alignment: ; --vertical-alignment: ; 14311--vertical-alignment-mobile: ; 14312 14313 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 14314 --product-card-gap: 8px; 14315 --quick-add-display: flex; 14316 --quick-add-mobile-display: flex; 14317 --quick-add-mobile-opacity: 1; 14318 14319 14320 14321 14322 " 14323 > 14324 14325 14326 14327 14328 14329 14330 14331 14332 14333<div 14334 ref="cardGallery" 14335 class="card-gallery card-gallery-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-3 spacing-style border-style" 14336 style=" 14337 --border-width: 1px; --border-style: solid; --border-color: 14338rgb(var(--color-border-rgb) / 1.0); --border-radius: 1433912px; overflow: hidden; 14340 14341 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 14342 --gallery-aspect-ratio: 1.0; 14343 " 14344 data-product-id="11022872576346" 14345 14346 on:pointerenter="/previewImage" 14347 on:pointerleave="/resetImage" 14348 14349 14350 data-view-transition-to-main-product 14351 14352 data-image-ratio="adapt" 14353 14354> 14355 <a 14356 class="contents" 14357 ref="cardGalleryLink" 14358 href="/products/tnbl-breast-cancer-charity-day-5-entry-ticket-wednesday-21st-october-2026" 14359 aria-label="TNBL Breast Cancer Charity Day â £5 Entry Ticket â Wednesday 21st October 2026" 14360 > 14361 <slideshow-component 14362 14363 ref="slideshow" 14364 14365 14366 style="--slideshow-timeline: --slide-1;--slide-min-height: auto;--slide-min-height-desktop: auto;" 14367 14368 initial-slide="0" 14369 14370 14371 infinite 14372 14373 14374 14375 data-generic-media-size="1" allow-nested="true" 14376> 14377 14378 <slideshow-container ref="slideshowContainer"> 14379 14380 14381 <slideshow-slides 14382 tabindex="-1" 14383 ref="scroller" 14384 14385 > 14386 <slideshow-slide 14387 ref="slides[]" 14388 aria-hidden="false" 14389 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 14390 14391 class="product-media-container media-fit product-media-container--image" 14392 14393 14394 14395 14396 slide-id="62513508483418" 14397 14398 14399 14400 14401> 14402 14403 14404<div 14405 class="product-media" 14406 style="--ratio: 1.0" 14407 data-media-id="62513508483418" 14408> 14409 14410 <img src="//www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=3840" alt="TNBL Breast Cancer Charity Day â £5 Entry Ticket â Wednesday 21st October 2026" srcset="//www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=3840 3840w" width="3840" height="3840" loading="eager" sizes="(min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 14411 14412 14413</div> 14414 14415 14416 14417</slideshow-slide> 14418 14419 </slideshow-slides> 14420 </slideshow-container> 14421 14422</slideshow-component> 14423 14424 14425 14426 </a> 14427 14428 14429 <div 14430 class="product-badges product-badges--top-right" 14431 style=" 14432 --badge-border-radius: 100px; 14433 --badge-font-family: var(--font-body--family);
14433 --badge-font-weight: var(--font-body--weight); --badge-text-transform: none; 14434 " 14435 ></div> 14436 14437 14438 14439<quick-add-component 14440 class="quick-add color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 " 14441 ref="quickAdd" 14442 data-product-title="TNBL Breast Cancer Charity Day â £5 Entry Ticket â Wednesday 21st October 2026" 14443 data-quick-add-button="add" 14444 data-product-options-count="1" 14445> 14446 <product-form-component 14447 data-section-id="template--28213213921626__product_list_ykU4x3" 14448 data-product-id="11022872576346" 14449 on:submit="/handleSubmit" 14450 class="quick-add__product-form-component" 14451 > 14452 <div 14453 class="visually-hidden" 14454 aria-live="assertive" 14455 role="status" 14456 aria-atomic="true" 14457 ref="liveRegion" 14458 ></div><form method="post" action="/cart/add" id="QuickAdd-ProductForm-11022872576346-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-3" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="â" /><input 14459 type="hidden" 14460 name="id" 14461 ref="variantId" 14462 value="54925177520474" 14463 14464 > 14465 <input 14466 type="hidden" 14467 name="quantity" 14468 value="1" 14469 > 14470 14471 <add-to-cart-component 14472 ref="addToCartButtonContainer" 14473 data-product-variant-media="//www.tnbl.co.uk/cdn/shop/files/Charitybreastcancerticket.jpg?v=1791381804&width=100" 14474 data-add-to-cart-animation="true" 14475> 14476 <button 14477 14478 type="submit" 14479 name="add" 14480 ref="addToCartButton" 14481 on:click="/handleClick" 14482 class="button button quick-add__button quick-add__button--add add-to-cart-button" 14483 14484 14485 > 14486 <span 14487 class="add-to-cart-text" 14488 > 14489 14490 <span 14491 aria-hidden="true" 14492 class="svg-wrapper add-to-cart-icon" 14493 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 14494</span> 14495 14496 <span class="add-to-cart-text__content is-visually-hidden-mobile"> 14497 <span> 14498 <span>Add</span> 14499 </span> 14500 </span> 14501 </span> 14502 14503 <span class="add-to-cart__added"> 14504 <span class="svg-wrapper add-to-cart__added-icon"><svg aria-hidden="true" class="checkmark-burst" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 14505 <g class="check"> 14506 <circle class="ring" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 14507 <path class="tick" d="M9 12.75L11.25 15L15 9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 14508 </g> 14509 <g class="burst"> 14510 <g style="--index: 0;"> 14511 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 14512 </g> 14513 <g style="--index: 1;"> 14514 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 14515 </g> 14516 <g style="--index: 2;"> 14517 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 14518 </g> 14519 <g style="--index: 3;"> 14520 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 14521 </g> 14522 <g style="--index: 4;"> 14523 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 14524 </g> 14525 <g style="--index: 5;"> 14526 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 14527 </g> 14528 <g style="--index: 6;"> 14529 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 14530 </g> 14531 <g style="--index: 7;"> 14532 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 14533 </g> 14534 </g> 14535</svg> 14536</span> 14537 </span> 14538 </button> 14539</add-to-cart-component> 14540 14541 14542 14543 14544 <button 14545 class="button quick-add__button quick-add__button--choose add-to-cart-button" 14546 14547 type="button" 14548 name="add" 14549 on:click="quick-add-component/handleClick" 14550 >
14551 <span 14552 class="add-to-cart-text quick-add__button-content" 14553 > 14554 14555 <span 14556 aria-hidden="true" 14557 class="svg-wrapper add-to-cart-icon quick-add__button-icon" 14558 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 14559</span> 14560 <span class="add-to-cart-text__content is-visually-hidden-mobile quick-add__button-text"> 14561 <span> 14562 14563 <span> 14564 Add 14565 </span> 14566 </span> 14567 </span> 14568 </span> 14569 </button><input type="hidden" name="product-id" value="11022872576346" /><input type="hidden" name="section-id" value="template--28213213921626__product_list_ykU4x3" /></form></product-form-component> 14570</quick-add-component> 14571 14572 14573 14574 14575 14576 14577</div> 14578 14579 14580 14581 14582 14583<div class="product-grid-view-zoom-out--details"> 14584 14585 <h3 class="h4">TNBL Breast Cancer Charity Day â £5 Entry Ticket â Wednesday 21st October 2026</h3> 14586 14587</div> 14588 14589 14590 14591 14592 14593 14594 14595 14596 14597 14598 14599 14600 14601 14602 <div class=" spacing-style text-block text-block--AWHY0bEN1blVtbmFle__text_JM9p8t-3 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 14603 <p>TNBL UK </p> 14604 </div> 14605 14606 14607 14608 14609
14610<script type="module"> 14611 class TextReadMoreWrapper extends HTMLElement { 14612 #expanded = false; 14613 #animation = null; 14614 #collapsedHeight = 0; 14615 14616 connectedCallback() { 14617 const content = this.querySelector('.text-read-more__content'); 14618 const textElement = this.querySelector('.text-read-more__text'); 14619 const button = this.querySelector('.text-read-more__button'); 14620 14621 if (!content || !textElement || !button) return; 14622 14623 // Set initial state 14624 this.dataset.expanded = 'false'; 14625 14626 // Wait for content to render - use double RAF to ensure layout is complete 14627 requestAnimationFrame(() => { 14628 requestAnimationFrame(() => { 14629 // Additional small delay to ensure fonts and styles are applied 14630 setTimeout(() => { 14631 this.#checkOverflow(content, textElement, button); 14632 }, 50); 14633 14634 // Recheck on resize 14635 const resizeObserver = new ResizeObserver(() => { 14636 if (!this.#expanded) { 14637 this.#checkOverflow(content, textElement, button); 14638 } 14639 }); 14640 resizeObserver.observe(content); 14641 14642 // Setup button click handler 14643 button.addEventListener('click', (e) => { 14644 e.preventDefault(); 14645 this.#toggle(content, textElement, button); 14646 }); 14647 }); 14648 }); 14649 } 14650 14651 #checkOverflow(content, textElement, button) { 14652 // Ensure collapsed state is applied 14653 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 14654 textElement.classList.add('text-read-more__text--collapsed'); 14655 } 14656 14657 // Get collapsed height first 14658 const collapsedHeight = content.scrollHeight; 14659 this.#collapsedHeight = collapsedHeight; 14660 14661 // Temporarily remove line-clamp to measure full height 14662 textElement.classList.remove('text-read-more__text--collapsed'); 14663 14664 // Force reflow 14665 void content.offsetHeight; 14666 14667 const fullHeight = content.scrollHeight; 14668 14669 // Restore line-clamp 14670 textElement.classList.add('text-read-more__text--collapsed'); 14671 14672 // Show button if content exceeds 2 lines (with small threshold for rounding) 14673 if (fullHeight > collapsedHeight + 5) { 14674 button.removeAttribute('hidden'); 14675 } else { 14676 button.setAttribute('hidden', ''); 14677 } 14678 } 14679 14680 #toggle(content, textElement, button) { 14681 const startHeight = content.offsetHeight; 14682 let endHeight; 14683 14684 if (!this.#expanded) { 14685 // Expanding 14686 textElement.classList.remove('text-read-more__text--collapsed'); 14687 endHeight = content.scrollHeight; 14688 this.#expanded = true; 14689 } else { 14690 // Collapsing 14691 endHeight = this.#collapsedHeight; 14692 this.#expanded = false; 14693 } 14694 14695 this.dataset.expanded = this.#expanded; 14696 button.setAttribute('aria-expanded', this.#expanded); 14697 14698 // Animate 14699 content.style.overflow = 'hidden'; 14700 this.#animation?.cancel(); 14701 14702 this.#animation = content.animate( 14703 { 14704 height: [`${startHeight}px`, `${endHeight}px`], 14705 }, 14706 { 14707 duration: 300, 14708 easing: 'ease-in-out', 14709 } 14710 ); 14711 14712 this.#animation.onfinish = () => { 14713 if (this.#expanded) { 14714 content.style.removeProperty('height'); 14715 content.style.overflow = ''; 14716 } else { 14717 textElement.classList.add('text-read-more__text--collapsed'); 14718 content.style.removeProperty('height'); 14719 content.style.overflow = ''; 14720 } 14721 }; 14722 } 14723 } 14724 14725 if (!customElements.get('text-read-more-wrapper')) { 14726 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 14727 } 14728</script>
14728 14729 14730 14731 14732 14733 14734 14735 14736 <a 14737 class="contents user-select-text" 14738 ref="productTitleLink" 14739 href="/products/tnbl-breast-cancer-charity-day-5-entry-ticket-wednesday-21st-october-2026" 14740 > 14741 14742 14743 14744 14745 14746 14747 14748 14749 <div class=" spacing-style text-block text-block--ATnhFUTdmeU5LMzR6T__product_title_BLLeMm-3 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 14750 <p>TNBL Breast Cancer Charity Day â £5 Entry Ticket â Wednesday 21st October 2026</p> 14751 </div> 14752 14753 14754 14755 14756
14757<script type="module"> 14758 class TextReadMoreWrapper extends HTMLElement { 14759 #expanded = false; 14760 #animation = null; 14761 #collapsedHeight = 0; 14762 14763 connectedCallback() { 14764 const content = this.querySelector('.text-read-more__content'); 14765 const textElement = this.querySelector('.text-read-more__text'); 14766 const button = this.querySelector('.text-read-more__button'); 14767 14768 if (!content || !textElement || !button) return; 14769 14770 // Set initial state 14771 this.dataset.expanded = 'false'; 14772 14773 // Wait for content to render - use double RAF to ensure layout is complete 14774 requestAnimationFrame(() => { 14775 requestAnimationFrame(() => { 14776 // Additional small delay to ensure fonts and styles are applied 14777 setTimeout(() => { 14778 this.#checkOverflow(content, textElement, button); 14779 }, 50); 14780 14781 // Recheck on resize 14782 const resizeObserver = new ResizeObserver(() => { 14783 if (!this.#expanded) { 14784 this.#checkOverflow(content, textElement, button); 14785 } 14786 }); 14787 resizeObserver.observe(content); 14788 14789 // Setup button click handler 14790 button.addEventListener('click', (e) => { 14791 e.preventDefault(); 14792 this.#toggle(content, textElement, button); 14793 }); 14794 }); 14795 }); 14796 } 14797 14798 #checkOverflow(content, textElement, button) { 14799 // Ensure collapsed state is applied 14800 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 14801 textElement.classList.add('text-read-more__text--collapsed'); 14802 } 14803 14804 // Get collapsed height first 14805 const collapsedHeight = content.scrollHeight; 14806 this.#collapsedHeight = collapsedHeight; 14807 14808 // Temporarily remove line-clamp to measure full height 14809 textElement.classList.remove('text-read-more__text--collapsed'); 14810 14811 // Force reflow 14812 void content.offsetHeight; 14813 14814 const fullHeight = content.scrollHeight; 14815 14816 // Restore line-clamp 14817 textElement.classList.add('text-read-more__text--collapsed'); 14818 14819 // Show button if content exceeds 2 lines (with small threshold for rounding) 14820 if (fullHeight > collapsedHeight + 5) { 14821 button.removeAttribute('hidden'); 14822 } else { 14823 button.setAttribute('hidden', ''); 14824 } 14825 } 14826 14827 #toggle(content, textElement, button) { 14828 const startHeight = content.offsetHeight; 14829 let endHeight; 14830 14831 if (!this.#expanded) { 14832 // Expanding 14833 textElement.classList.remove('text-read-more__text--collapsed'); 14834 endHeight = content.scrollHeight; 14835 this.#expanded = true; 14836 } else { 14837 // Collapsing 14838 endHeight = this.#collapsedHeight; 14839 this.#expanded = false; 14840 } 14841 14842 this.dataset.expanded = this.#expanded; 14843 button.setAttribute('aria-expanded', this.#expanded); 14844 14845 // Animate 14846 content.style.overflow = 'hidden'; 14847 this.#animation?.cancel(); 14848 14849 this.#animation = content.animate( 14850 { 14851 height: [`${startHeight}px`, `${endHeight}px`], 14852 }, 14853 { 14854 duration: 300, 14855 easing: 'ease-in-out', 14856 } 14857 ); 14858 14859 this.#animation.onfinish = () => { 14860 if (this.#expanded) { 14861 content.style.removeProperty('height'); 14862 content.style.overflow = ''; 14863 } else { 14864 textElement.classList.add('text-read-more__text--collapsed'); 14865 content.style.removeProperty('height'); 14866 content.style.overflow = ''; 14867 } 14868 }; 14869 } 14870 } 14871 14872 if (!customElements.get('text-read-more-wrapper')) { 14873 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 14874 } 14875</script>
14875 14876 14877 </a> 14878 14879 14880 14881 14882 14883 14884<product-price 14885 class="text-block text-block--align-left custom-typography custom-font-size custom-color text-left custom spacing-style" 14886 data-block-id="ARDI3alNNdlArbVBQd__price_UQh7nT-3" 14887 data-product-id="11022872576346" 14888 style=" 14889 14890--color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-subheading--weight);--font-family: var(--font-subheading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); 14891 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 14892 --width: 100%; 14893 " 14894 14895> 14896 <div ref="priceContainer"> 14897 14898 14899 14900 14901 14902 <span class="price">£5.00</span> 14903 14904 14905 14906 14907</div> 14908 14909 14910</product-price> 14911 14912 14913 14914 14915 14916 14917 14918 14919 </div> 14920</product-card></product-card-link> 14921 14922</div> 14923 14924 14925 14926 14927 14928 14929 14930 </div> 14931 14932 14933 14934</slideshow-slide> 14935 14936 14937 <slideshow-slide 14938 ref="slides[]" 14939 aria-hidden="true" 14940 style="--slideshow-timeline: --slide-4; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 14941 14942 class="resource-list__slide" 14943 14944 14945 14946 14947 14948 14949 14950> 14951 14952 14953 14954 <div 14955 class="resource-list__item" 14956 > 14957 14958 14959 14960<div > 14961 14962 14963<style data-shopify> 14964 14965</style> 14966 14967 14968<product-card-link 14969 data-product-id="11020550406490" 14970 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=500" 14971 data-product-transition="true" 14972 14973 ><product-card 14974 class="product-card" 14975 data-product-id="11020550406490" 14976 id="product-card-AeTdjd2lkb3BwakczM__static-product-card-4" 14977 data-product-transition="true" 14978 14979 14980> 14981 <a 14982 id="4aa6aad9e0e16f6d6f1c34ed862aba8a" 14983 14984 href="/products/apres-nova-led-lamp-mini?variant=54916494557530" 14985 14986 class="product-card__link" 14987 ref="productCardLink" 14988 > 14989 <span class="visually-hidden"> 14990 Aprés Mini Nova Led Lamp 14991 </span> 14992 </a> 14993 <div 14994 class=" 14995 product-card__content 14996 layout-panel-flex 14997 layout-panel-flex--column 14998 product-grid__card 14999 spacing-style 15000 border-style 15001 gap-style 15002 15003 " 15004 style=" 15005 --border-width: 1px; --border-style: none; --border-color: 15006rgb(var(--color-border-rgb) / 1.0); --border-radius: 150070px; 15008 15009 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 15010 15011 15012 15013--horizontal-alignment: ; --vertical-alignment: ; 15014--vertical-alignment-mobile: ; 15015 15016 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 15017 --product-card-gap: 8px; 15018 --quick-add-display: flex; 15019 --quick-add-mobile-display: flex; 15020 --quick-add-mobile-opacity: 1; 15021 15022 15023 15024 15025 " 15026 > 15027 15028 15029 15030 15031 15032 15033 15034 15035 15036<div 15037 ref="cardGallery" 15038 class="card-gallery card-gallery-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-4 spacing-style border-style" 15039 style=" 15040 --border-width: 1px; --border-style: solid; --border-color: 15041rgb(var(--color-border-rgb) / 1.0); --border-radius: 1504212px; overflow: hidden; 15043 15044 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 15045 --gallery-aspect-ratio: 1.0; 15046 " 15047 data-product-id="11020550406490" 15048 15049 on:pointerenter="/previewImage" 15050 on:pointerleave="/resetImage" 15051 15052 15053 data-view-transition-to-main-product 15054 15055 data-image-ratio="adapt" 15056 15057> 15058 <a 15059 class="contents" 15060 ref="cardGalleryLink" 15061 href="/products/apres-nova-led-lamp-mini" 15062 aria-label="Aprés Mini Nova Led Lamp" 15063 > 15064 <slideshow-component 15065 15066 ref="slideshow" 15067 15068 15069 style="--slideshow-timeline: --slide-1, --slide-2, --slide-3, --slide-4, --slide-5, --slide-6, --slide-7, --slide-8, --slide-9;--slide-min-height: auto;--slide-min-height-desktop: auto;" 15070 15071 initial-slide="0" 15072 15073 15074 infinite 15075 15076 15077 15078 data-generic-media-size="7" allow-nested="true" 15079> 15080 15081 <slideshow-container ref="slideshowContainer"> 15082 15083 <slideshow-arrows 15084 position="center" 15085 15086><button 15087 class=" 15088 slideshow-control slideshow-control--previous 15089 15090 15091 slideshow-control--style-arrow 15092 button button-unstyled button-unstyled--transparent 15093 flip-x 15094 " 15095 15096 aria-label="Previous slide" 15097
15098 on:click="/previous" 15099 ref="previous" 15100> 15101 <span class="svg-wrapper icon-arrow"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" vector-effect="non-scaling-stroke" d="M4.25 10h11.5m0 0-4-4m4 4-4 4"/></svg> 15102</span> 15103</button> 15104<button 15105 class=" 15106 slideshow-control slideshow-control--next 15107 15108 15109 slideshow-control--style-arrow 15110 button button-unstyled button-unstyled--transparent 15111 15112 " 15113 15114 aria-label="Next slide" 15115 15116 on:click="/next" 15117 ref="next" 15118> 15119 <span class="svg-wrapper icon-arrow"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" vector-effect="non-scaling-stroke" d="M4.25 10h11.5m0 0-4-4m4 4-4 4"/></svg> 15120</span> 15121</button> 15122</slideshow-arrows> 15123 15124 15125 15126 <slideshow-slides 15127 tabindex="-1" 15128 ref="scroller" 15129 15130 > 15131 <slideshow-slide 15132 ref="slides[]" 15133 aria-hidden="false" 15134 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 15135 15136 class="product-media-container media-fit product-media-container--image" 15137 15138 variant-image 15139 15140 15141 slide-id="62492790292826" 15142 15143 15144 15145 variant-image 15146> 15147 15148 15149<div 15150 class="product-media" 15151 style="--ratio: 1.0" 15152 data-media-id="62492790292826" 15153> 15154 15155 <img src="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=3840" alt="Aprés Mini Nova Led Lamp" srcset="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=3840 3840w" width="3840" height="3840" loading="eager" sizes="(min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 15156 15157 15158</div> 15159 15160 15161 15162</slideshow-slide> 15163<slideshow-slide 15164 ref="slides[]" 15165 aria-hidden="true" 15166 style="--slideshow-timeline: --slide-1; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 15167 15168 class="product-media-container media-fit product-media-container--image" 15169 15170 15171 15172 15173 slide-id="62492790358362" 15174 15175 15176 15177 15178> 15179 15180 15181<div 15182 class="product-media" 15183 style="--ratio: 1.0" 15184 data-media-id="62492790358362" 15185> 15186 15187 <img src="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=3840" alt="Aprés Mini Nova Led Lamp" srcset="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-03_84d8a61e-a804-40d2-bf85-d0171ee6bb0a.jpg?v=1791299545&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 15188 15189 15190</div> 15191 15192 15193 15194</slideshow-slide> 15195<slideshow-slide 15196 ref="slides[]" 15197 aria-hidden="true" 15198 style="--slideshow-timeline: --slide-2; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 15199 15200 class="product-media-container media-fit product-media-container--image" 15201 15202 15203 15204 15205 slide-id="62492790423898" 15206 15207 15208 15209 15210> 15211 15212 15213<div 15214 class="product-media" 15215 style="--ratio: 1.0" 15216 data-media-id="62492790423898" 15217> 15218 15219 <img src="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=3840" alt="Aprés Mini Nova Led Lamp" srcset="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-05_016ed5ad-faee-4651-921c-27fd1752887b.jpg?v=1791299545&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 15220 15221 15222</div> 15223 15224 15225 15226</slideshow-slide> 15227<slideshow-slide 15228 ref="slides[]" 15229 aria-hidden="true" 15230 style="--slideshow-timeline: --slide-3; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 15231 15232 class="product-media-container media-fit product-media-container--image" 15233 15234 15235 15236 15237 slide-id="62492790489434" 15238 15239 15240 15241 15242> 15243 15244 15245<div 15246 class="product-media" 15247 style="--ratio: 1.0" 15248 data-media-id="62492790489434" 15249> 15250 15251 <img src="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=3840" alt="Aprés Mini Nova Led Lamp" srcset="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-07_d3ec6f52-dd94-4aa0-b0d1-acf171211853.jpg?v=1791299545&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 15252 15253 15254</div> 15255 15256 15257 15258</slideshow-slide> 15259<slideshow-slide 15260 ref="slides[]" 15261 aria-hidden="true" 15262 style="--slideshow-timeline: --slide-4; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 15263 15264 class="product-media-container media-fit product-media-container--image" 15265 15266 15267 15268 15269 slide-id="62492790522202" 15270 15271 15272 15273 15274> 15275 15276 15277<div 15278 class="product-media" 15279 style="--ratio: 1.0" 15280 data-media-id="62492790522202" 15281> 15282 15283 <img src="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=3840" alt="Aprés Mini Nova Led Lamp" srcset="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-02_5dc8cdd5-66c4-4d21-a840-c83697dbf979.jpg?v=1791299546&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 15284 15285 15286</div> 15287 15288 15289 15290</slideshow-slide> 15291<slideshow-slide 15292 ref="slides[]" 15293 aria-hidden="true" 15294 style="--slideshow-timeline: --slide-6; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 15295 15296 class="product-media-container media-fit product-media-container--image" 15297 15298 variant-image 15299 15300 15301 slide-id="62492795863386" 15302 15303 15304 hidden 15305 15306 15307 variant-image 15308> 15309 15310 15311<div 15312 class="product-media" 15313 style="--ratio: 1.0" 15314 data-media-id="62492795863386" 15315> 15316 15317 <img src="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=3840" alt="Aprés Mini Nova Led Lamp" srcset="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_White-01.jpg?v=1791299606&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 15318 15319 15320</div> 15321 15322 15323 15324</slideshow-slide> 15325 15326 </slideshow-slides> 15327 </slideshow-container> 15328 15329</slideshow-component> 15330 15331 15332 15333 </a> 15334 15335 15336 <div 15337 class="product-badges product-badges--top-right" 15338 style=" 15339 --badge-border-radius: 100px; 15340 --badge-font-family: var(--font-body--family);
15340 --badge-font-weight: var(--font-body--weight); --badge-text-transform: none; 15341 " 15342 ></div> 15343 15344 15345 15346<quick-add-component 15347 class="quick-add color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 " 15348 ref="quickAdd" 15349 data-product-title="Aprés Mini Nova Led Lamp" 15350 data-quick-add-button="choose" 15351 data-product-options-count="1" 15352> 15353 <product-form-component 15354 data-section-id="template--28213213921626__product_list_ykU4x3" 15355 data-product-id="11020550406490" 15356 on:submit="/handleSubmit" 15357 class="quick-add__product-form-component" 15358 > 15359 <div 15360 class="visually-hidden" 15361 aria-live="assertive" 15362 role="status" 15363 aria-atomic="true" 15364 ref="liveRegion" 15365 ></div><form method="post" action="/cart/add" id="QuickAdd-ProductForm-11020550406490-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-4" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="â" /><input 15366 type="hidden" 15367 name="id" 15368 ref="variantId" 15369 value="54916494557530" 15370 15371 > 15372 <input 15373 type="hidden" 15374 name="quantity" 15375 value="1" 15376 > 15377 15378 <add-to-cart-component 15379 ref="addToCartButtonContainer" 15380 data-product-variant-media="//www.tnbl.co.uk/cdn/shop/files/Mini_Nova_LED_Lamp_-_Listing_Photos_Black-01_42c26b96-b29c-4fc0-b200-d0819dd343db.jpg?v=1791299544&width=100" 15381 data-add-to-cart-animation="true" 15382> 15383 <button 15384 15385 type="submit" 15386 name="add" 15387 ref="addToCartButton" 15388 on:click="/handleClick" 15389 class="button button quick-add__button quick-add__button--add add-to-cart-button" 15390 15391 15392 > 15393 <span 15394 class="add-to-cart-text" 15395 > 15396 15397 <span 15398 aria-hidden="true" 15399 class="svg-wrapper add-to-cart-icon" 15400 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 15401</span> 15402 15403 <span class="add-to-cart-text__content is-visually-hidden-mobile"> 15404 <span> 15405 <span>Add</span> 15406 </span> 15407 </span> 15408 </span> 15409 15410 <span class="add-to-cart__added"> 15411 <span class="svg-wrapper add-to-cart__added-icon"><svg aria-hidden="true" class="checkmark-burst" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 15412 <g class="check"> 15413 <circle class="ring" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 15414 <path class="tick" d="M9 12.75L11.25 15L15 9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 15415 </g> 15416 <g class="burst"> 15417 <g style="--index: 0;"> 15418 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 15419 </g> 15420 <g style="--index: 1;"> 15421 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 15422 </g> 15423 <g style="--index: 2;"> 15424 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 15425 </g> 15426 <g style="--index: 3;"> 15427 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 15428 </g> 15429 <g style="--index: 4;"> 15430 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 15431 </g> 15432 <g style="--index: 5;"> 15433 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 15434 </g> 15435 <g style="--index: 6;"> 15436 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 15437 </g> 15438 <g style="--index: 7;"> 15439 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 15440 </g> 15441 </g> 15442</svg> 15443</span> 15444 </span> 15445 </button> 15446</add-to-cart-component> 15447 15448 15449 15450 15451 <button 15452 class="button quick-add__button quick-add__button--choose add-to-cart-button" 15453 15454 type="button" 15455 name="add" 15456 on:click="quick-add-component/handleClick" 15457 >
15458 <span 15459 class="add-to-cart-text quick-add__button-content" 15460 > 15461 15462 <span 15463 aria-hidden="true" 15464 class="svg-wrapper add-to-cart-icon quick-add__button-icon" 15465 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 15466</span> 15467 <span class="add-to-cart-text__content is-visually-hidden-mobile quick-add__button-text"> 15468 <span> 15469 15470 <span> 15471 Add 15472 </span> 15473 </span> 15474 </span> 15475 </span> 15476 </button><input type="hidden" name="product-id" value="11020550406490" /><input type="hidden" name="section-id" value="template--28213213921626__product_list_ykU4x3" /></form></product-form-component> 15477</quick-add-component> 15478 15479 15480 15481 15482 15483 15484</div> 15485 15486 15487 15488 15489 15490<div class="product-grid-view-zoom-out--details"> 15491 15492 <h3 class="h4">Aprés Mini Nova Led Lamp</h3> 15493 15494</div> 15495 15496 15497 15498 15499 15500 15501 15502 15503 15504 15505 15506 15507 15508 15509 <div class=" spacing-style text-block text-block--AWHY0bEN1blVtbmFle__text_JM9p8t-4 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 15510 <p>APRES </p> 15511 </div> 15512 15513 15514 15515 15516
15517<script type="module"> 15518 class TextReadMoreWrapper extends HTMLElement { 15519 #expanded = false; 15520 #animation = null; 15521 #collapsedHeight = 0; 15522 15523 connectedCallback() { 15524 const content = this.querySelector('.text-read-more__content'); 15525 const textElement = this.querySelector('.text-read-more__text'); 15526 const button = this.querySelector('.text-read-more__button'); 15527 15528 if (!content || !textElement || !button) return; 15529 15530 // Set initial state 15531 this.dataset.expanded = 'false'; 15532 15533 // Wait for content to render - use double RAF to ensure layout is complete 15534 requestAnimationFrame(() => { 15535 requestAnimationFrame(() => { 15536 // Additional small delay to ensure fonts and styles are applied 15537 setTimeout(() => { 15538 this.#checkOverflow(content, textElement, button); 15539 }, 50); 15540 15541 // Recheck on resize 15542 const resizeObserver = new ResizeObserver(() => { 15543 if (!this.#expanded) { 15544 this.#checkOverflow(content, textElement, button); 15545 } 15546 }); 15547 resizeObserver.observe(content); 15548 15549 // Setup button click handler 15550 button.addEventListener('click', (e) => { 15551 e.preventDefault(); 15552 this.#toggle(content, textElement, button); 15553 }); 15554 }); 15555 }); 15556 } 15557 15558 #checkOverflow(content, textElement, button) { 15559 // Ensure collapsed state is applied 15560 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 15561 textElement.classList.add('text-read-more__text--collapsed'); 15562 } 15563 15564 // Get collapsed height first 15565 const collapsedHeight = content.scrollHeight; 15566 this.#collapsedHeight = collapsedHeight; 15567 15568 // Temporarily remove line-clamp to measure full height 15569 textElement.classList.remove('text-read-more__text--collapsed'); 15570 15571 // Force reflow 15572 void content.offsetHeight; 15573 15574 const fullHeight = content.scrollHeight; 15575 15576 // Restore line-clamp 15577 textElement.classList.add('text-read-more__text--collapsed'); 15578 15579 // Show button if content exceeds 2 lines (with small threshold for rounding) 15580 if (fullHeight > collapsedHeight + 5) { 15581 button.removeAttribute('hidden'); 15582 } else { 15583 button.setAttribute('hidden', ''); 15584 } 15585 } 15586 15587 #toggle(content, textElement, button) { 15588 const startHeight = content.offsetHeight; 15589 let endHeight; 15590 15591 if (!this.#expanded) { 15592 // Expanding 15593 textElement.classList.remove('text-read-more__text--collapsed'); 15594 endHeight = content.scrollHeight; 15595 this.#expanded = true; 15596 } else { 15597 // Collapsing 15598 endHeight = this.#collapsedHeight; 15599 this.#expanded = false; 15600 } 15601 15602 this.dataset.expanded = this.#expanded; 15603 button.setAttribute('aria-expanded', this.#expanded); 15604 15605 // Animate 15606 content.style.overflow = 'hidden'; 15607 this.#animation?.cancel(); 15608 15609 this.#animation = content.animate( 15610 { 15611 height: [`${startHeight}px`, `${endHeight}px`], 15612 }, 15613 { 15614 duration: 300, 15615 easing: 'ease-in-out', 15616 } 15617 ); 15618 15619 this.#animation.onfinish = () => { 15620 if (this.#expanded) { 15621 content.style.removeProperty('height'); 15622 content.style.overflow = ''; 15623 } else { 15624 textElement.classList.add('text-read-more__text--collapsed'); 15625 content.style.removeProperty('height'); 15626 content.style.overflow = ''; 15627 } 15628 }; 15629 } 15630 } 15631 15632 if (!customElements.get('text-read-more-wrapper')) { 15633 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 15634 } 15635</script>
15635 15636 15637 15638 15639 15640 15641 15642 15643 <a 15644 class="contents user-select-text" 15645 ref="productTitleLink" 15646 href="/products/apres-nova-led-lamp-mini" 15647 > 15648 15649 15650 15651 15652 15653 15654 15655 15656 <div class=" spacing-style text-block text-block--ATnhFUTdmeU5LMzR6T__product_title_BLLeMm-4 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 15657 <p>Aprés Mini Nova Led Lamp</p> 15658 </div> 15659 15660 15661 15662 15663
15664<script type="module"> 15665 class TextReadMoreWrapper extends HTMLElement { 15666 #expanded = false; 15667 #animation = null; 15668 #collapsedHeight = 0; 15669 15670 connectedCallback() { 15671 const content = this.querySelector('.text-read-more__content'); 15672 const textElement = this.querySelector('.text-read-more__text'); 15673 const button = this.querySelector('.text-read-more__button'); 15674 15675 if (!content || !textElement || !button) return; 15676 15677 // Set initial state 15678 this.dataset.expanded = 'false'; 15679 15680 // Wait for content to render - use double RAF to ensure layout is complete 15681 requestAnimationFrame(() => { 15682 requestAnimationFrame(() => { 15683 // Additional small delay to ensure fonts and styles are applied 15684 setTimeout(() => { 15685 this.#checkOverflow(content, textElement, button); 15686 }, 50); 15687 15688 // Recheck on resize 15689 const resizeObserver = new ResizeObserver(() => { 15690 if (!this.#expanded) { 15691 this.#checkOverflow(content, textElement, button); 15692 } 15693 }); 15694 resizeObserver.observe(content); 15695 15696 // Setup button click handler 15697 button.addEventListener('click', (e) => { 15698 e.preventDefault(); 15699 this.#toggle(content, textElement, button); 15700 }); 15701 }); 15702 }); 15703 } 15704 15705 #checkOverflow(content, textElement, button) { 15706 // Ensure collapsed state is applied 15707 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 15708 textElement.classList.add('text-read-more__text--collapsed'); 15709 } 15710 15711 // Get collapsed height first 15712 const collapsedHeight = content.scrollHeight; 15713 this.#collapsedHeight = collapsedHeight; 15714 15715 // Temporarily remove line-clamp to measure full height 15716 textElement.classList.remove('text-read-more__text--collapsed'); 15717 15718 // Force reflow 15719 void content.offsetHeight; 15720 15721 const fullHeight = content.scrollHeight; 15722 15723 // Restore line-clamp 15724 textElement.classList.add('text-read-more__text--collapsed'); 15725 15726 // Show button if content exceeds 2 lines (with small threshold for rounding) 15727 if (fullHeight > collapsedHeight + 5) { 15728 button.removeAttribute('hidden'); 15729 } else { 15730 button.setAttribute('hidden', ''); 15731 } 15732 } 15733 15734 #toggle(content, textElement, button) { 15735 const startHeight = content.offsetHeight; 15736 let endHeight; 15737 15738 if (!this.#expanded) { 15739 // Expanding 15740 textElement.classList.remove('text-read-more__text--collapsed'); 15741 endHeight = content.scrollHeight; 15742 this.#expanded = true; 15743 } else { 15744 // Collapsing 15745 endHeight = this.#collapsedHeight; 15746 this.#expanded = false; 15747 } 15748 15749 this.dataset.expanded = this.#expanded; 15750 button.setAttribute('aria-expanded', this.#expanded); 15751 15752 // Animate 15753 content.style.overflow = 'hidden'; 15754 this.#animation?.cancel(); 15755 15756 this.#animation = content.animate( 15757 { 15758 height: [`${startHeight}px`, `${endHeight}px`], 15759 }, 15760 { 15761 duration: 300, 15762 easing: 'ease-in-out', 15763 } 15764 ); 15765 15766 this.#animation.onfinish = () => { 15767 if (this.#expanded) { 15768 content.style.removeProperty('height'); 15769 content.style.overflow = ''; 15770 } else { 15771 textElement.classList.add('text-read-more__text--collapsed'); 15772 content.style.removeProperty('height'); 15773 content.style.overflow = ''; 15774 } 15775 }; 15776 } 15777 } 15778 15779 if (!customElements.get('text-read-more-wrapper')) { 15780 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 15781 } 15782</script>
15782 15783 15784 </a> 15785 15786 15787 15788 15789 15790 15791<product-price 15792 class="text-block text-block--align-left custom-typography custom-font-size custom-color text-left custom spacing-style" 15793 data-block-id="ARDI3alNNdlArbVBQd__price_UQh7nT-4" 15794 data-product-id="11020550406490" 15795 style=" 15796 15797--color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-subheading--weight);--font-family: var(--font-subheading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); 15798 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 15799 --width: 100%; 15800 " 15801 15802> 15803 <div ref="priceContainer"> 15804 15805 15806 15807 15808 15809 <span class="price">£99.95</span> 15810 15811 15812 15813 15814</div> 15815 15816 15817</product-price> 15818 15819 15820 15821 15822 15823 15824 15825 15826 </div> 15827</product-card></product-card-link> 15828 15829</div> 15830 15831 15832 15833 15834 15835 15836 15837 </div> 15838 15839 15840 15841</slideshow-slide> 15842 15843 15844 <slideshow-slide 15845 ref="slides[]" 15846 aria-hidden="true" 15847 style="--slideshow-timeline: --slide-5; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 15848 15849 class="resource-list__slide" 15850 15851 15852 15853 15854 15855 15856 15857> 15858 15859 15860 15861 <div 15862 class="resource-list__item" 15863 > 15864 15865 15866 15867<div > 15868 15869 15870<style data-shopify> 15871 15872</style> 15873 15874 15875<product-card-link 15876 data-product-id="11020474974554" 15877 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=500" 15878 data-product-transition="true" 15879 15880 ><product-card 15881 class="product-card" 15882 data-product-id="11020474974554" 15883 id="product-card-AeTdjd2lkb3BwakczM__static-product-card-5" 15884 data-product-transition="true" 15885 15886 15887> 15888 <a 15889 id="1441a0d17d45dd3568532f95a07e33ad" 15890 15891 href="/products/adjustable-silicone-nail-stamper-enlarge-reduce-stamping-designs?variant=54915240788314" 15892 15893 class="product-card__link" 15894 ref="productCardLink" 15895 > 15896 <span class="visually-hidden"> 15897 Adjustable Silicone Nail Stamper â Enlarge & Reduce Stamping Designs 15898 </span> 15899 </a> 15900 <div 15901 class=" 15902 product-card__content 15903 layout-panel-flex 15904 layout-panel-flex--column 15905 product-grid__card 15906 spacing-style 15907 border-style 15908 gap-style 15909 15910 " 15911 style=" 15912 --border-width: 1px; --border-style: none; --border-color: 15913rgb(var(--color-border-rgb) / 1.0); --border-radius: 159140px; 15915 15916 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 15917 15918 15919 15920--horizontal-alignment: ; --vertical-alignment: ; 15921--vertical-alignment-mobile: ; 15922 15923 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 15924 --product-card-gap: 8px; 15925 --quick-add-display: flex; 15926 --quick-add-mobile-display: flex; 15927 --quick-add-mobile-opacity: 1; 15928 15929 15930 15931 15932 " 15933 > 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943<div 15944 ref="cardGallery" 15945 class="card-gallery card-gallery-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-5 spacing-style border-style" 15946 style=" 15947 --border-width: 1px; --border-style: solid; --border-color: 15948rgb(var(--color-border-rgb) / 1.0); --border-radius: 1594912px; overflow: hidden; 15950 15951 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 15952 --gallery-aspect-ratio: 1.0; 15953 " 15954 data-product-id="11020474974554" 15955 15956 on:pointerenter="/previewImage" 15957 on:pointerleave="/resetImage" 15958 15959 15960 data-view-transition-to-main-product 15961 15962 data-image-ratio="adapt" 15963 15964> 15965 <a 15966 class="contents" 15967 ref="cardGalleryLink" 15968 href="/products/adjustable-silicone-nail-stamper-enlarge-reduce-stamping-designs" 15969 aria-label="Adjustable Silicone Nail Stamper â Enlarge & Reduce Stamping Designs" 15970 > 15971 <slideshow-component 15972 15973 ref="slideshow" 15974 15975 15976 style="--slideshow-timeline: --slide-1, --slide-2, --slide-3;--slide-min-height: auto;--slide-min-height-desktop: auto;" 15977 15978 initial-slide="0" 15979 15980 15981 infinite 15982 15983 15984 15985 data-generic-media-size="3" allow-nested="true" 15986> 15987 15988 <slideshow-container ref="slideshowContainer"> 15989 15990 <slideshow-arrows 15991 position="center" 15992 15993><button 15994 class=" 15995 slideshow-control slideshow-control--previous 15996 15997 15998 slideshow-control--style-arrow 15999 button button-unstyled button-unstyled--transparent 16000 flip-x 16001 " 16002 16003 aria-label="Previous slide" 16004
16005 on:click="/previous" 16006 ref="previous" 16007> 16008 <span class="svg-wrapper icon-arrow"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" vector-effect="non-scaling-stroke" d="M4.25 10h11.5m0 0-4-4m4 4-4 4"/></svg> 16009</span> 16010</button> 16011<button 16012 class=" 16013 slideshow-control slideshow-control--next 16014 16015 16016 slideshow-control--style-arrow 16017 button button-unstyled button-unstyled--transparent 16018 16019 " 16020 16021 aria-label="Next slide" 16022 16023 on:click="/next" 16024 ref="next" 16025> 16026 <span class="svg-wrapper icon-arrow"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" vector-effect="non-scaling-stroke" d="M4.25 10h11.5m0 0-4-4m4 4-4 4"/></svg> 16027</span> 16028</button> 16029</slideshow-arrows> 16030 16031 16032 16033 <slideshow-slides 16034 tabindex="-1" 16035 ref="scroller" 16036 16037 > 16038 <slideshow-slide 16039 ref="slides[]" 16040 aria-hidden="false" 16041 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 16042 16043 class="product-media-container media-fit product-media-container--image" 16044 16045 16046 16047 16048 slide-id="62491997307226" 16049 16050 16051 16052 16053> 16054 16055 16056<div 16057 class="product-media" 16058 style="--ratio: 1.0" 16059 data-media-id="62491997307226" 16060> 16061 16062 <img src="//www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=3840" alt="Adjustable Silicone Nail Stamper â Enlarge & Reduce Stamping Designs" srcset="//www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=3840 3840w" width="3840" height="3840" loading="eager" sizes="(min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 16063 16064 16065</div> 16066 16067 16068 16069</slideshow-slide> 16070<slideshow-slide 16071 ref="slides[]" 16072 aria-hidden="true" 16073 style="--slideshow-timeline: --slide-1; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 16074 16075 class="product-media-container media-fit product-media-container--image" 16076 16077 16078 16079 16080 slide-id="62491997372762" 16081 16082 16083 16084 16085> 16086 16087 16088<div 16089 class="product-media" 16090 style="--ratio: 1.0" 16091 data-media-id="62491997372762" 16092> 16093 16094 <img src="//www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=3840" alt="Adjustable Silicone Nail Stamper â Enlarge & Reduce Stamping Designs" srcset="//www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/mrnailstamper.jpg?v=1791294086&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 16095 16096 16097</div> 16098 16099 16100 16101</slideshow-slide> 16102<slideshow-slide 16103 ref="slides[]" 16104 aria-hidden="true" 16105 style="--slideshow-timeline: --slide-2; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 16106 16107 class="product-media-container media-fit product-media-container--image" 16108 16109 16110 16111 16112 slide-id="62491997339994" 16113 16114 16115 16116 16117> 16118 16119 16120<div 16121 class="product-media" 16122 style="--ratio: 1.0" 16123 data-media-id="62491997339994" 16124> 16125 16126 <img src="//www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=3840" alt="Adjustable Silicone Nail Stamper â Enlarge & Reduce Stamping Designs" srcset="//www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="auto, (min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/5_10.jpg?v=1791294086&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 16127 16128 16129</div> 16130 16131 16132 16133</slideshow-slide> 16134 16135 </slideshow-slides> 16136 </slideshow-container> 16137 16138</slideshow-component> 16139 16140 16141 16142 </a> 16143 16144 16145 <div 16146 class="product-badges product-badges--top-right" 16147 style=" 16148 --badge-border-radius: 100px; 16149 --badge-font-family: var(--font-body--family);
16149 --badge-font-weight: var(--font-body--weight); --badge-text-transform: none; 16150 " 16151 ></div> 16152 16153 16154 16155<quick-add-component 16156 class="quick-add color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 " 16157 ref="quickAdd" 16158 data-product-title="Adjustable Silicone Nail Stamper â Enlarge & Reduce Stamping Designs" 16159 data-quick-add-button="add" 16160 data-product-options-count="1" 16161> 16162 <product-form-component 16163 data-section-id="template--28213213921626__product_list_ykU4x3" 16164 data-product-id="11020474974554" 16165 on:submit="/handleSubmit" 16166 class="quick-add__product-form-component" 16167 > 16168 <div 16169 class="visually-hidden" 16170 aria-live="assertive" 16171 role="status" 16172 aria-atomic="true" 16173 ref="liveRegion" 16174 ></div><form method="post" action="/cart/add" id="QuickAdd-ProductForm-11020474974554-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-5" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="â" /><input 16175 type="hidden" 16176 name="id" 16177 ref="variantId" 16178 value="54915240788314" 16179 16180 > 16181 <input 16182 type="hidden" 16183 name="quantity" 16184 value="1" 16185 > 16186 16187 <add-to-cart-component 16188 ref="addToCartButtonContainer" 16189 data-product-variant-media="//www.tnbl.co.uk/cdn/shop/files/3_12.jpg?v=1791294086&width=100" 16190 data-add-to-cart-animation="true" 16191> 16192 <button 16193 16194 type="submit" 16195 name="add" 16196 ref="addToCartButton" 16197 on:click="/handleClick" 16198 class="button button quick-add__button quick-add__button--add add-to-cart-button" 16199 16200 16201 > 16202 <span 16203 class="add-to-cart-text" 16204 > 16205 16206 <span 16207 aria-hidden="true" 16208 class="svg-wrapper add-to-cart-icon" 16209 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 16210</span> 16211 16212 <span class="add-to-cart-text__content is-visually-hidden-mobile"> 16213 <span> 16214 <span>Add</span> 16215 </span> 16216 </span> 16217 </span> 16218 16219 <span class="add-to-cart__added"> 16220 <span class="svg-wrapper add-to-cart__added-icon"><svg aria-hidden="true" class="checkmark-burst" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 16221 <g class="check"> 16222 <circle class="ring" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 16223 <path class="tick" d="M9 12.75L11.25 15L15 9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 16224 </g> 16225 <g class="burst"> 16226 <g style="--index: 0;"> 16227 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16228 </g> 16229 <g style="--index: 1;"> 16230 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16231 </g> 16232 <g style="--index: 2;"> 16233 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16234 </g> 16235 <g style="--index: 3;"> 16236 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16237 </g> 16238 <g style="--index: 4;"> 16239 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16240 </g> 16241 <g style="--index: 5;"> 16242 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16243 </g> 16244 <g style="--index: 6;"> 16245 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16246 </g> 16247 <g style="--index: 7;"> 16248 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16249 </g> 16250 </g> 16251</svg> 16252</span> 16253 </span> 16254 </button> 16255</add-to-cart-component> 16256 16257 16258 16259 16260 <button 16261 class="button quick-add__button quick-add__button--choose add-to-cart-button" 16262 16263 type="button" 16264 name="add" 16265 on:click="quick-add-component/handleClick" 16266 >
16267 <span 16268 class="add-to-cart-text quick-add__button-content" 16269 > 16270 16271 <span 16272 aria-hidden="true" 16273 class="svg-wrapper add-to-cart-icon quick-add__button-icon" 16274 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 16275</span> 16276 <span class="add-to-cart-text__content is-visually-hidden-mobile quick-add__button-text"> 16277 <span> 16278 16279 <span> 16280 Add 16281 </span> 16282 </span> 16283 </span> 16284 </span> 16285 </button><input type="hidden" name="product-id" value="11020474974554" /><input type="hidden" name="section-id" value="template--28213213921626__product_list_ykU4x3" /></form></product-form-component> 16286</quick-add-component> 16287 16288 16289 16290 16291 16292 16293</div> 16294 16295 16296 16297 16298 16299<div class="product-grid-view-zoom-out--details"> 16300 16301 <h3 class="h4">Adjustable Silicone Nail Stamper â Enlarge & Reduce Stamping Designs</h3> 16302 16303</div> 16304 16305 16306 16307 16308 16309 16310 16311 16312 16313 16314 16315 16316 16317 16318 <div class=" spacing-style text-block text-block--AWHY0bEN1blVtbmFle__text_JM9p8t-5 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 16319 <p>MR NAIL </p> 16320 </div> 16321 16322 16323 16324 16325
16326<script type="module"> 16327 class TextReadMoreWrapper extends HTMLElement { 16328 #expanded = false; 16329 #animation = null; 16330 #collapsedHeight = 0; 16331 16332 connectedCallback() { 16333 const content = this.querySelector('.text-read-more__content'); 16334 const textElement = this.querySelector('.text-read-more__text'); 16335 const button = this.querySelector('.text-read-more__button'); 16336 16337 if (!content || !textElement || !button) return; 16338 16339 // Set initial state 16340 this.dataset.expanded = 'false'; 16341 16342 // Wait for content to render - use double RAF to ensure layout is complete 16343 requestAnimationFrame(() => { 16344 requestAnimationFrame(() => { 16345 // Additional small delay to ensure fonts and styles are applied 16346 setTimeout(() => { 16347 this.#checkOverflow(content, textElement, button); 16348 }, 50); 16349 16350 // Recheck on resize 16351 const resizeObserver = new ResizeObserver(() => { 16352 if (!this.#expanded) { 16353 this.#checkOverflow(content, textElement, button); 16354 } 16355 }); 16356 resizeObserver.observe(content); 16357 16358 // Setup button click handler 16359 button.addEventListener('click', (e) => { 16360 e.preventDefault(); 16361 this.#toggle(content, textElement, button); 16362 }); 16363 }); 16364 }); 16365 } 16366 16367 #checkOverflow(content, textElement, button) { 16368 // Ensure collapsed state is applied 16369 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 16370 textElement.classList.add('text-read-more__text--collapsed'); 16371 } 16372 16373 // Get collapsed height first 16374 const collapsedHeight = content.scrollHeight; 16375 this.#collapsedHeight = collapsedHeight; 16376 16377 // Temporarily remove line-clamp to measure full height 16378 textElement.classList.remove('text-read-more__text--collapsed'); 16379 16380 // Force reflow 16381 void content.offsetHeight; 16382 16383 const fullHeight = content.scrollHeight; 16384 16385 // Restore line-clamp 16386 textElement.classList.add('text-read-more__text--collapsed'); 16387 16388 // Show button if content exceeds 2 lines (with small threshold for rounding) 16389 if (fullHeight > collapsedHeight + 5) { 16390 button.removeAttribute('hidden'); 16391 } else { 16392 button.setAttribute('hidden', ''); 16393 } 16394 } 16395 16396 #toggle(content, textElement, button) { 16397 const startHeight = content.offsetHeight; 16398 let endHeight; 16399 16400 if (!this.#expanded) { 16401 // Expanding 16402 textElement.classList.remove('text-read-more__text--collapsed'); 16403 endHeight = content.scrollHeight; 16404 this.#expanded = true; 16405 } else { 16406 // Collapsing 16407 endHeight = this.#collapsedHeight; 16408 this.#expanded = false; 16409 } 16410 16411 this.dataset.expanded = this.#expanded; 16412 button.setAttribute('aria-expanded', this.#expanded); 16413 16414 // Animate 16415 content.style.overflow = 'hidden'; 16416 this.#animation?.cancel(); 16417 16418 this.#animation = content.animate( 16419 { 16420 height: [`${startHeight}px`, `${endHeight}px`], 16421 }, 16422 { 16423 duration: 300, 16424 easing: 'ease-in-out', 16425 } 16426 ); 16427 16428 this.#animation.onfinish = () => { 16429 if (this.#expanded) { 16430 content.style.removeProperty('height'); 16431 content.style.overflow = ''; 16432 } else { 16433 textElement.classList.add('text-read-more__text--collapsed'); 16434 content.style.removeProperty('height'); 16435 content.style.overflow = ''; 16436 } 16437 }; 16438 } 16439 } 16440 16441 if (!customElements.get('text-read-more-wrapper')) { 16442 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 16443 } 16444</script>
16444 16445 16446 16447 16448 16449 16450 16451 16452 <a 16453 class="contents user-select-text" 16454 ref="productTitleLink" 16455 href="/products/adjustable-silicone-nail-stamper-enlarge-reduce-stamping-designs" 16456 > 16457 16458 16459 16460 16461 16462 16463 16464 16465 <div class=" spacing-style text-block text-block--ATnhFUTdmeU5LMzR6T__product_title_BLLeMm-5 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 16466 <p>Adjustable Silicone Nail Stamper â Enlarge & Reduce Stamping Designs</p> 16467 </div> 16468 16469 16470 16471 16472
16473<script type="module"> 16474 class TextReadMoreWrapper extends HTMLElement { 16475 #expanded = false; 16476 #animation = null; 16477 #collapsedHeight = 0; 16478 16479 connectedCallback() { 16480 const content = this.querySelector('.text-read-more__content'); 16481 const textElement = this.querySelector('.text-read-more__text'); 16482 const button = this.querySelector('.text-read-more__button'); 16483 16484 if (!content || !textElement || !button) return; 16485 16486 // Set initial state 16487 this.dataset.expanded = 'false'; 16488 16489 // Wait for content to render - use double RAF to ensure layout is complete 16490 requestAnimationFrame(() => { 16491 requestAnimationFrame(() => { 16492 // Additional small delay to ensure fonts and styles are applied 16493 setTimeout(() => { 16494 this.#checkOverflow(content, textElement, button); 16495 }, 50); 16496 16497 // Recheck on resize 16498 const resizeObserver = new ResizeObserver(() => { 16499 if (!this.#expanded) { 16500 this.#checkOverflow(content, textElement, button); 16501 } 16502 }); 16503 resizeObserver.observe(content); 16504 16505 // Setup button click handler 16506 button.addEventListener('click', (e) => { 16507 e.preventDefault(); 16508 this.#toggle(content, textElement, button); 16509 }); 16510 }); 16511 }); 16512 } 16513 16514 #checkOverflow(content, textElement, button) { 16515 // Ensure collapsed state is applied 16516 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 16517 textElement.classList.add('text-read-more__text--collapsed'); 16518 } 16519 16520 // Get collapsed height first 16521 const collapsedHeight = content.scrollHeight; 16522 this.#collapsedHeight = collapsedHeight; 16523 16524 // Temporarily remove line-clamp to measure full height 16525 textElement.classList.remove('text-read-more__text--collapsed'); 16526 16527 // Force reflow 16528 void content.offsetHeight; 16529 16530 const fullHeight = content.scrollHeight; 16531 16532 // Restore line-clamp 16533 textElement.classList.add('text-read-more__text--collapsed'); 16534 16535 // Show button if content exceeds 2 lines (with small threshold for rounding) 16536 if (fullHeight > collapsedHeight + 5) { 16537 button.removeAttribute('hidden'); 16538 } else { 16539 button.setAttribute('hidden', ''); 16540 } 16541 } 16542 16543 #toggle(content, textElement, button) { 16544 const startHeight = content.offsetHeight; 16545 let endHeight; 16546 16547 if (!this.#expanded) { 16548 // Expanding 16549 textElement.classList.remove('text-read-more__text--collapsed'); 16550 endHeight = content.scrollHeight; 16551 this.#expanded = true; 16552 } else { 16553 // Collapsing 16554 endHeight = this.#collapsedHeight; 16555 this.#expanded = false; 16556 } 16557 16558 this.dataset.expanded = this.#expanded; 16559 button.setAttribute('aria-expanded', this.#expanded); 16560 16561 // Animate 16562 content.style.overflow = 'hidden'; 16563 this.#animation?.cancel(); 16564 16565 this.#animation = content.animate( 16566 { 16567 height: [`${startHeight}px`, `${endHeight}px`], 16568 }, 16569 { 16570 duration: 300, 16571 easing: 'ease-in-out', 16572 } 16573 ); 16574 16575 this.#animation.onfinish = () => { 16576 if (this.#expanded) { 16577 content.style.removeProperty('height'); 16578 content.style.overflow = ''; 16579 } else { 16580 textElement.classList.add('text-read-more__text--collapsed'); 16581 content.style.removeProperty('height'); 16582 content.style.overflow = ''; 16583 } 16584 }; 16585 } 16586 } 16587 16588 if (!customElements.get('text-read-more-wrapper')) { 16589 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 16590 } 16591</script>
16591 16592 16593 </a> 16594 16595 16596 16597 16598 16599 16600<product-price 16601 class="text-block text-block--align-left custom-typography custom-font-size custom-color text-left custom spacing-style" 16602 data-block-id="ARDI3alNNdlArbVBQd__price_UQh7nT-5" 16603 data-product-id="11020474974554" 16604 style=" 16605 16606--color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-subheading--weight);--font-family: var(--font-subheading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); 16607 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 16608 --width: 100%; 16609 " 16610 16611> 16612 <div ref="priceContainer"> 16613 16614 16615 16616 16617 16618 <span class="price">£6.00</span> 16619 16620 16621 16622 16623</div> 16624 16625 16626</product-price> 16627 16628 16629 16630 16631 16632 16633 16634 16635 </div> 16636</product-card></product-card-link> 16637 16638</div> 16639 16640 16641 16642 16643 16644 16645 16646 </div> 16647 16648 16649 16650</slideshow-slide> 16651 16652 16653 <slideshow-slide 16654 ref="slides[]" 16655 aria-hidden="true" 16656 style="--slideshow-timeline: --slide-6; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 16657 16658 class="resource-list__slide" 16659 16660 16661 16662 16663 16664 16665 16666> 16667 16668 16669 16670 <div 16671 class="resource-list__item" 16672 > 16673 16674 16675 16676<div > 16677 16678 16679<style data-shopify> 16680 16681</style> 16682 16683 16684<product-card-link 16685 data-product-id="11006315200858" 16686 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=500" 16687 data-product-transition="true" 16688 16689 ><product-card 16690 class="product-card" 16691 data-product-id="11006315200858" 16692 id="product-card-AeTdjd2lkb3BwakczM__static-product-card-6" 16693 data-product-transition="true" 16694 16695 16696> 16697 <a 16698 id="2f70f141bd401d32d1cc2a823a7430c3" 16699 16700 href="/products/cnd-shellac%E2%84%A2-magenta-sky-polish-7-3ml-hema-tpo-free?variant=54841813926234" 16701 16702 class="product-card__link" 16703 ref="productCardLink" 16704 > 16705 <span class="visually-hidden"> 16706 CND SHELLAC⢠Magenta Sky Polish 7.3ml â HEMA & TPO Free 16707 </span> 16708 </a> 16709 <div 16710 class=" 16711 product-card__content 16712 layout-panel-flex 16713 layout-panel-flex--column 16714 product-grid__card 16715 spacing-style 16716 border-style 16717 gap-style 16718 16719 " 16720 style=" 16721 --border-width: 1px; --border-style: none; --border-color: 16722rgb(var(--color-border-rgb) / 1.0); --border-radius: 167230px; 16724 16725 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 16726 16727 16728 16729--horizontal-alignment: ; --vertical-alignment: ; 16730--vertical-alignment-mobile: ; 16731 16732 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 16733 --product-card-gap: 8px; 16734 --quick-add-display: flex; 16735 --quick-add-mobile-display: flex; 16736 --quick-add-mobile-opacity: 1; 16737 16738 16739 16740 16741 " 16742 > 16743 16744 16745 16746 16747 16748 16749 16750 16751 16752<div 16753 ref="cardGallery" 16754 class="card-gallery card-gallery-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-6 spacing-style border-style" 16755 style=" 16756 --border-width: 1px; --border-style: solid; --border-color: 16757rgb(var(--color-border-rgb) / 1.0); --border-radius: 1675812px; overflow: hidden; 16759 16760 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 16761 --gallery-aspect-ratio: 1.0; 16762 " 16763 data-product-id="11006315200858" 16764 16765 on:pointerenter="/previewImage" 16766 on:pointerleave="/resetImage" 16767 16768 16769 data-view-transition-to-main-product 16770 16771 data-image-ratio="adapt" 16772 16773> 16774 <a 16775 class="contents" 16776 ref="cardGalleryLink" 16777 href="/products/cnd-shellac%E2%84%A2-magenta-sky-polish-7-3ml-hema-tpo-free" 16778 aria-label="CND SHELLAC⢠Magenta Sky Polish 7.3ml â HEMA & TPO Free" 16779 > 16780 <slideshow-component 16781 16782 ref="slideshow" 16783 16784 16785 style="--slideshow-timeline: --slide-1;--slide-min-height: auto;--slide-min-height-desktop: auto;" 16786 16787 initial-slide="0" 16788 16789 16790 infinite 16791 16792 16793 16794 data-generic-media-size="1" allow-nested="true" 16795> 16796 16797 <slideshow-container ref="slideshowContainer"> 16798 16799 16800 <slideshow-slides 16801 tabindex="-1" 16802 ref="scroller" 16803 16804 > 16805 <slideshow-slide 16806 ref="slides[]" 16807 aria-hidden="false" 16808 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 16809 16810 class="product-media-container media-fit product-media-container--image" 16811 16812 16813 16814 16815 slide-id="62361385238874" 16816 16817 16818 16819 16820> 16821 16822 16823<div 16824 class="product-media" 16825 style="--ratio: 1.0" 16826 data-media-id="62361385238874" 16827> 16828 16829 <img src="//www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=3840" alt="CND SHELLAC⢠Magenta Sky Polish 7.3ml â HEMA & TPO Free" srcset="//www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=3840 3840w" width="3840" height="3840" loading="eager" sizes="(min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 16830 16831 16832</div> 16833 16834 16835 16836</slideshow-slide> 16837 16838 </slideshow-slides> 16839 </slideshow-container> 16840 16841</slideshow-component> 16842 16843 16844 16845 </a> 16846 16847 16848 <div 16849 class="product-badges product-badges--top-right" 16850 style=" 16851 --badge-border-radius: 100px; 16852 --badge-font-family: var(--font-body--family);
16852 --badge-font-weight: var(--font-body--weight); --badge-text-transform: none; 16853 " 16854 ></div> 16855 16856 16857 16858<quick-add-component 16859 class="quick-add color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 " 16860 ref="quickAdd" 16861 data-product-title="CND SHELLAC⢠Magenta Sky Polish 7.3ml â HEMA & TPO Free" 16862 data-quick-add-button="add" 16863 data-product-options-count="1" 16864> 16865 <product-form-component 16866 data-section-id="template--28213213921626__product_list_ykU4x3" 16867 data-product-id="11006315200858" 16868 on:submit="/handleSubmit" 16869 class="quick-add__product-form-component" 16870 > 16871 <div 16872 class="visually-hidden" 16873 aria-live="assertive" 16874 role="status" 16875 aria-atomic="true" 16876 ref="liveRegion" 16877 ></div><form method="post" action="/cart/add" id="QuickAdd-ProductForm-11006315200858-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-6" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="â" /><input 16878 type="hidden" 16879 name="id" 16880 ref="variantId" 16881 value="54841813926234" 16882 16883 > 16884 <input 16885 type="hidden" 16886 name="quantity" 16887 value="1" 16888 > 16889 16890 <add-to-cart-component 16891 ref="addToCartButtonContainer" 16892 data-product-variant-media="//www.tnbl.co.uk/cdn/shop/files/MagentaSky.png?v=1790262619&width=100" 16893 data-add-to-cart-animation="true" 16894> 16895 <button 16896 16897 type="submit" 16898 name="add" 16899 ref="addToCartButton" 16900 on:click="/handleClick" 16901 class="button button quick-add__button quick-add__button--add add-to-cart-button" 16902 16903 16904 > 16905 <span 16906 class="add-to-cart-text" 16907 > 16908 16909 <span 16910 aria-hidden="true" 16911 class="svg-wrapper add-to-cart-icon" 16912 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 16913</span> 16914 16915 <span class="add-to-cart-text__content is-visually-hidden-mobile"> 16916 <span> 16917 <span>Add</span> 16918 </span> 16919 </span> 16920 </span> 16921 16922 <span class="add-to-cart__added"> 16923 <span class="svg-wrapper add-to-cart__added-icon"><svg aria-hidden="true" class="checkmark-burst" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 16924 <g class="check"> 16925 <circle class="ring" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 16926 <path class="tick" d="M9 12.75L11.25 15L15 9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 16927 </g> 16928 <g class="burst"> 16929 <g style="--index: 0;"> 16930 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16931 </g> 16932 <g style="--index: 1;"> 16933 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16934 </g> 16935 <g style="--index: 2;"> 16936 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16937 </g> 16938 <g style="--index: 3;"> 16939 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16940 </g> 16941 <g style="--index: 4;"> 16942 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16943 </g> 16944 <g style="--index: 5;"> 16945 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16946 </g> 16947 <g style="--index: 6;"> 16948 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16949 </g> 16950 <g style="--index: 7;"> 16951 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 16952 </g> 16953 </g> 16954</svg> 16955</span> 16956 </span> 16957 </button> 16958</add-to-cart-component> 16959 16960 16961 16962 16963 <button 16964 class="button quick-add__button quick-add__button--choose add-to-cart-button" 16965 16966 type="button" 16967 name="add" 16968 on:click="quick-add-component/handleClick" 16969 >
16970 <span 16971 class="add-to-cart-text quick-add__button-content" 16972 > 16973 16974 <span 16975 aria-hidden="true" 16976 class="svg-wrapper add-to-cart-icon quick-add__button-icon" 16977 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 16978</span> 16979 <span class="add-to-cart-text__content is-visually-hidden-mobile quick-add__button-text"> 16980 <span> 16981 16982 <span> 16983 Add 16984 </span> 16985 </span> 16986 </span> 16987 </span> 16988 </button><input type="hidden" name="product-id" value="11006315200858" /><input type="hidden" name="section-id" value="template--28213213921626__product_list_ykU4x3" /></form></product-form-component> 16989</quick-add-component> 16990 16991 16992 16993 16994 16995 16996</div> 16997 16998 16999 17000 17001 17002<div class="product-grid-view-zoom-out--details"> 17003 17004 <h3 class="h4">CND SHELLAC⢠Magenta Sky Polish 7.3ml â HEMA & TPO Free</h3> 17005 17006</div> 17007 17008 17009 17010 17011 17012 17013 17014 17015 17016 17017 17018 17019 17020 17021 <div class=" spacing-style text-block text-block--AWHY0bEN1blVtbmFle__text_JM9p8t-6 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 17022 <p>CND </p> 17023 </div> 17024 17025 17026 17027 17028
17029<script type="module"> 17030 class TextReadMoreWrapper extends HTMLElement { 17031 #expanded = false; 17032 #animation = null; 17033 #collapsedHeight = 0; 17034 17035 connectedCallback() { 17036 const content = this.querySelector('.text-read-more__content'); 17037 const textElement = this.querySelector('.text-read-more__text'); 17038 const button = this.querySelector('.text-read-more__button'); 17039 17040 if (!content || !textElement || !button) return; 17041 17042 // Set initial state 17043 this.dataset.expanded = 'false'; 17044 17045 // Wait for content to render - use double RAF to ensure layout is complete 17046 requestAnimationFrame(() => { 17047 requestAnimationFrame(() => { 17048 // Additional small delay to ensure fonts and styles are applied 17049 setTimeout(() => { 17050 this.#checkOverflow(content, textElement, button); 17051 }, 50); 17052 17053 // Recheck on resize 17054 const resizeObserver = new ResizeObserver(() => { 17055 if (!this.#expanded) { 17056 this.#checkOverflow(content, textElement, button); 17057 } 17058 }); 17059 resizeObserver.observe(content); 17060 17061 // Setup button click handler 17062 button.addEventListener('click', (e) => { 17063 e.preventDefault(); 17064 this.#toggle(content, textElement, button); 17065 }); 17066 }); 17067 }); 17068 } 17069 17070 #checkOverflow(content, textElement, button) { 17071 // Ensure collapsed state is applied 17072 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 17073 textElement.classList.add('text-read-more__text--collapsed'); 17074 } 17075 17076 // Get collapsed height first 17077 const collapsedHeight = content.scrollHeight; 17078 this.#collapsedHeight = collapsedHeight; 17079 17080 // Temporarily remove line-clamp to measure full height 17081 textElement.classList.remove('text-read-more__text--collapsed'); 17082 17083 // Force reflow 17084 void content.offsetHeight; 17085 17086 const fullHeight = content.scrollHeight; 17087 17088 // Restore line-clamp 17089 textElement.classList.add('text-read-more__text--collapsed'); 17090 17091 // Show button if content exceeds 2 lines (with small threshold for rounding) 17092 if (fullHeight > collapsedHeight + 5) { 17093 button.removeAttribute('hidden'); 17094 } else { 17095 button.setAttribute('hidden', ''); 17096 } 17097 } 17098 17099 #toggle(content, textElement, button) { 17100 const startHeight = content.offsetHeight; 17101 let endHeight; 17102 17103 if (!this.#expanded) { 17104 // Expanding 17105 textElement.classList.remove('text-read-more__text--collapsed'); 17106 endHeight = content.scrollHeight; 17107 this.#expanded = true; 17108 } else { 17109 // Collapsing 17110 endHeight = this.#collapsedHeight; 17111 this.#expanded = false; 17112 } 17113 17114 this.dataset.expanded = this.#expanded; 17115 button.setAttribute('aria-expanded', this.#expanded); 17116 17117 // Animate 17118 content.style.overflow = 'hidden'; 17119 this.#animation?.cancel(); 17120 17121 this.#animation = content.animate( 17122 { 17123 height: [`${startHeight}px`, `${endHeight}px`], 17124 }, 17125 { 17126 duration: 300, 17127 easing: 'ease-in-out', 17128 } 17129 ); 17130 17131 this.#animation.onfinish = () => { 17132 if (this.#expanded) { 17133 content.style.removeProperty('height'); 17134 content.style.overflow = ''; 17135 } else { 17136 textElement.classList.add('text-read-more__text--collapsed'); 17137 content.style.removeProperty('height'); 17138 content.style.overflow = ''; 17139 } 17140 }; 17141 } 17142 } 17143 17144 if (!customElements.get('text-read-more-wrapper')) { 17145 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 17146 } 17147</script>
17147 17148 17149 17150 17151 17152 17153 17154 17155 <a 17156 class="contents user-select-text" 17157 ref="productTitleLink" 17158 href="/products/cnd-shellac%E2%84%A2-magenta-sky-polish-7-3ml-hema-tpo-free" 17159 > 17160 17161 17162 17163 17164 17165 17166 17167 17168 <div class=" spacing-style text-block text-block--ATnhFUTdmeU5LMzR6T__product_title_BLLeMm-6 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 17169 <p>CND SHELLAC⢠Magenta Sky Polish 7.3ml â HEMA & TPO Free</p> 17170 </div> 17171 17172 17173 17174 17175
17176<script type="module"> 17177 class TextReadMoreWrapper extends HTMLElement { 17178 #expanded = false; 17179 #animation = null; 17180 #collapsedHeight = 0; 17181 17182 connectedCallback() { 17183 const content = this.querySelector('.text-read-more__content'); 17184 const textElement = this.querySelector('.text-read-more__text'); 17185 const button = this.querySelector('.text-read-more__button'); 17186 17187 if (!content || !textElement || !button) return; 17188 17189 // Set initial state 17190 this.dataset.expanded = 'false'; 17191 17192 // Wait for content to render - use double RAF to ensure layout is complete 17193 requestAnimationFrame(() => { 17194 requestAnimationFrame(() => { 17195 // Additional small delay to ensure fonts and styles are applied 17196 setTimeout(() => { 17197 this.#checkOverflow(content, textElement, button); 17198 }, 50); 17199 17200 // Recheck on resize 17201 const resizeObserver = new ResizeObserver(() => { 17202 if (!this.#expanded) { 17203 this.#checkOverflow(content, textElement, button); 17204 } 17205 }); 17206 resizeObserver.observe(content); 17207 17208 // Setup button click handler 17209 button.addEventListener('click', (e) => { 17210 e.preventDefault(); 17211 this.#toggle(content, textElement, button); 17212 }); 17213 }); 17214 }); 17215 } 17216 17217 #checkOverflow(content, textElement, button) { 17218 // Ensure collapsed state is applied 17219 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 17220 textElement.classList.add('text-read-more__text--collapsed'); 17221 } 17222 17223 // Get collapsed height first 17224 const collapsedHeight = content.scrollHeight; 17225 this.#collapsedHeight = collapsedHeight; 17226 17227 // Temporarily remove line-clamp to measure full height 17228 textElement.classList.remove('text-read-more__text--collapsed'); 17229 17230 // Force reflow 17231 void content.offsetHeight; 17232 17233 const fullHeight = content.scrollHeight; 17234 17235 // Restore line-clamp 17236 textElement.classList.add('text-read-more__text--collapsed'); 17237 17238 // Show button if content exceeds 2 lines (with small threshold for rounding) 17239 if (fullHeight > collapsedHeight + 5) { 17240 button.removeAttribute('hidden'); 17241 } else { 17242 button.setAttribute('hidden', ''); 17243 } 17244 } 17245 17246 #toggle(content, textElement, button) { 17247 const startHeight = content.offsetHeight; 17248 let endHeight; 17249 17250 if (!this.#expanded) { 17251 // Expanding 17252 textElement.classList.remove('text-read-more__text--collapsed'); 17253 endHeight = content.scrollHeight; 17254 this.#expanded = true; 17255 } else { 17256 // Collapsing 17257 endHeight = this.#collapsedHeight; 17258 this.#expanded = false; 17259 } 17260 17261 this.dataset.expanded = this.#expanded; 17262 button.setAttribute('aria-expanded', this.#expanded); 17263 17264 // Animate 17265 content.style.overflow = 'hidden'; 17266 this.#animation?.cancel(); 17267 17268 this.#animation = content.animate( 17269 { 17270 height: [`${startHeight}px`, `${endHeight}px`], 17271 }, 17272 { 17273 duration: 300, 17274 easing: 'ease-in-out', 17275 } 17276 ); 17277 17278 this.#animation.onfinish = () => { 17279 if (this.#expanded) { 17280 content.style.removeProperty('height'); 17281 content.style.overflow = ''; 17282 } else { 17283 textElement.classList.add('text-read-more__text--collapsed'); 17284 content.style.removeProperty('height'); 17285 content.style.overflow = ''; 17286 } 17287 }; 17288 } 17289 } 17290 17291 if (!customElements.get('text-read-more-wrapper')) { 17292 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 17293 } 17294</script>
17294 17295 17296 </a> 17297 17298 17299 17300 17301 17302 17303<product-price 17304 class="text-block text-block--align-left custom-typography custom-font-size custom-color text-left custom spacing-style" 17305 data-block-id="ARDI3alNNdlArbVBQd__price_UQh7nT-6" 17306 data-product-id="11006315200858" 17307 style=" 17308 17309--color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-subheading--weight);--font-family: var(--font-subheading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); 17310 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 17311 --width: 100%; 17312 " 17313 17314> 17315 <div ref="priceContainer"> 17316 17317 17318 17319 17320 17321 <span class="price">£14.00</span> 17322 17323 17324 17325 17326</div> 17327 17328 17329</product-price> 17330 17331 17332 17333 17334 17335 17336 17337 17338 </div> 17339</product-card></product-card-link> 17340 17341</div> 17342 17343 17344 17345 17346 17347 17348 17349 </div> 17350 17351 17352 17353</slideshow-slide> 17354 17355 17356 <slideshow-slide 17357 ref="slides[]" 17358 aria-hidden="true" 17359 style="--slideshow-timeline: --slide-7; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 17360 17361 class="resource-list__slide" 17362 17363 17364 17365 17366 17367 17368 17369> 17370 17371 17372 17373 <div 17374 class="resource-list__item" 17375 > 17376 17377 17378 17379<div > 17380 17381 17382<style data-shopify> 17383 17384</style> 17385 17386 17387<product-card-link 17388 data-product-id="11005042655578" 17389 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=500" 17390 data-product-transition="true" 17391 17392 ><product-card 17393 class="product-card" 17394 data-product-id="11005042655578" 17395 id="product-card-AeTdjd2lkb3BwakczM__static-product-card-7" 17396 data-product-transition="true" 17397 17398 17399> 17400 <a 17401 id="6286236381911b7ac399f25f03da4a64" 17402 17403 href="/products/saeyang-k38-portable-nail-file-machine?variant=54838219735386" 17404 17405 class="product-card__link" 17406 ref="productCardLink" 17407 > 17408 <span class="visually-hidden"> 17409 SAEYANG K38 Portable Nail File Machine 17410 </span> 17411 </a> 17412 <div 17413 class=" 17414 product-card__content 17415 layout-panel-flex 17416 layout-panel-flex--column 17417 product-grid__card 17418 spacing-style 17419 border-style 17420 gap-style 17421 17422 " 17423 style=" 17424 --border-width: 1px; --border-style: none; --border-color: 17425rgb(var(--color-border-rgb) / 1.0); --border-radius: 174260px; 17427 17428 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 17429 17430 17431 17432--horizontal-alignment: ; --vertical-alignment: ; 17433--vertical-alignment-mobile: ; 17434 17435 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 17436 --product-card-gap: 8px; 17437 --quick-add-display: flex; 17438 --quick-add-mobile-display: flex; 17439 --quick-add-mobile-opacity: 1; 17440 17441 17442 17443 17444 " 17445 > 17446 17447 17448 17449 17450 17451 17452 17453 17454 17455<div 17456 ref="cardGallery" 17457 class="card-gallery card-gallery-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-7 spacing-style border-style" 17458 style=" 17459 --border-width: 1px; --border-style: solid; --border-color: 17460rgb(var(--color-border-rgb) / 1.0); --border-radius: 1746112px; overflow: hidden; 17462 17463 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 17464 --gallery-aspect-ratio: 1.0; 17465 " 17466 data-product-id="11005042655578" 17467 17468 on:pointerenter="/previewImage" 17469 on:pointerleave="/resetImage" 17470 17471 17472 data-view-transition-to-main-product 17473 17474 data-image-ratio="adapt" 17475 17476> 17477 <a 17478 class="contents" 17479 ref="cardGalleryLink" 17480 href="/products/saeyang-k38-portable-nail-file-machine" 17481 aria-label="SAEYANG K38 Portable Nail File Machine" 17482 > 17483 <slideshow-component 17484 17485 ref="slideshow" 17486 17487 17488 style="--slideshow-timeline: --slide-1;--slide-min-height: auto;--slide-min-height-desktop: auto;" 17489 17490 initial-slide="0" 17491 17492 17493 infinite 17494 17495 17496 17497 data-generic-media-size="1" allow-nested="true" 17498> 17499 17500 <slideshow-container ref="slideshowContainer"> 17501 17502 17503 <slideshow-slides 17504 tabindex="-1" 17505 ref="scroller" 17506 17507 > 17508 <slideshow-slide 17509 ref="slides[]" 17510 aria-hidden="false" 17511 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 17512 17513 class="product-media-container media-fit product-media-container--image" 17514 17515 17516 17517 17518 slide-id="62340411392346" 17519 17520 17521 17522 17523> 17524 17525 17526<div 17527 class="product-media" 17528 style="--ratio: 1.0" 17529 data-media-id="62340411392346" 17530> 17531 17532 <img src="//www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=3840" alt="SAEYANG K38 Portable Nail File Machine" srcset="//www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=3840 3840w" width="3840" height="3840" loading="eager" sizes="(min-width: 750px) 25.0vw, 100vw" class="product-media__image" transitionToProduct="true" data_max_resolution="//www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=3840" fetchpriority="auto" style="--focal-point: 50.0% 50.0%;"> 17533 17534 17535</div> 17536 17537 17538 17539</slideshow-slide> 17540 17541 </slideshow-slides> 17542 </slideshow-container> 17543 17544</slideshow-component> 17545 17546 17547 17548 </a> 17549 17550 17551 <div 17552 class="product-badges product-badges--top-right" 17553 style=" 17554 --badge-border-radius: 100px; 17555 --badge-font-family: var(--font-body--family);
17555 --badge-font-weight: var(--font-body--weight); --badge-text-transform: none; 17556 " 17557 ></div> 17558 17559 17560 17561<quick-add-component 17562 class="quick-add color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 " 17563 ref="quickAdd" 17564 data-product-title="SAEYANG K38 Portable Nail File Machine" 17565 data-quick-add-button="add" 17566 data-product-options-count="1" 17567> 17568 <product-form-component 17569 data-section-id="template--28213213921626__product_list_ykU4x3" 17570 data-product-id="11005042655578" 17571 on:submit="/handleSubmit" 17572 class="quick-add__product-form-component" 17573 > 17574 <div 17575 class="visually-hidden" 17576 aria-live="assertive" 17577 role="status" 17578 aria-atomic="true" 17579 ref="liveRegion" 17580 ></div><form method="post" action="/cart/add" id="QuickAdd-ProductForm-11005042655578-AMkFPRXRiSW0yTnlCW__product_card_gallery_bDciU7-7" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="â" /><input 17581 type="hidden" 17582 name="id" 17583 ref="variantId" 17584 value="54838219735386" 17585 17586 > 17587 <input 17588 type="hidden" 17589 name="quantity" 17590 value="1" 17591 > 17592 17593 <add-to-cart-component 17594 ref="addToCartButtonContainer" 17595 data-product-variant-media="//www.tnbl.co.uk/cdn/shop/files/K38White3_db2c2b9d-c3e3-459d-a8e6-b8163fda682e.png?v=1790170862&width=100" 17596 data-add-to-cart-animation="true" 17597> 17598 <button 17599 17600 type="submit" 17601 name="add" 17602 ref="addToCartButton" 17603 on:click="/handleClick" 17604 class="button button quick-add__button quick-add__button--add add-to-cart-button" 17605 17606 17607 > 17608 <span 17609 class="add-to-cart-text" 17610 > 17611 17612 <span 17613 aria-hidden="true" 17614 class="svg-wrapper add-to-cart-icon" 17615 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 17616</span> 17617 17618 <span class="add-to-cart-text__content is-visually-hidden-mobile"> 17619 <span> 17620 <span>Add</span> 17621 </span> 17622 </span> 17623 </span> 17624 17625 <span class="add-to-cart__added"> 17626 <span class="svg-wrapper add-to-cart__added-icon"><svg aria-hidden="true" class="checkmark-burst" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 17627 <g class="check"> 17628 <circle class="ring" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 17629 <path class="tick" d="M9 12.75L11.25 15L15 9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 17630 </g> 17631 <g class="burst"> 17632 <g style="--index: 0;"> 17633 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 17634 </g> 17635 <g style="--index: 1;"> 17636 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 17637 </g> 17638 <g style="--index: 2;"> 17639 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 17640 </g> 17641 <g style="--index: 3;"> 17642 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 17643 </g> 17644 <g style="--index: 4;"> 17645 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 17646 </g> 17647 <g style="--index: 5;"> 17648 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 17649 </g> 17650 <g style="--index: 6;"> 17651 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 17652 </g> 17653 <g style="--index: 7;"> 17654 <line class="line" stroke-linecap="round" pathLength="1" x1="12" y1="8.5" x2="12" y2="15.5" stroke="currentColor"/> 17655 </g> 17656 </g> 17657</svg> 17658</span> 17659 </span> 17660 </button> 17661</add-to-cart-component> 17662 17663 17664 17665 17666 <button 17667 class="button quick-add__button quick-add__button--choose add-to-cart-button" 17668 17669 type="button" 17670 name="add" 17671 on:click="quick-add-component/handleClick" 17672 >
17673 <span 17674 class="add-to-cart-text quick-add__button-content" 17675 > 17676 17677 <span 17678 aria-hidden="true" 17679 class="svg-wrapper add-to-cart-icon quick-add__button-icon" 17680 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M16.608 9.421V6.906H3.392v8.016c0 .567.224 1.112.624 1.513.4.402.941.627 1.506.627H8.63M8.818 3h2.333c.618 0 1.212.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.344c0-.622.246-1.218.683-1.658A2.33 2.33 0 0 1 8.82 3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="var(--icon-stroke-width)" d="M14.608 12.563v5m2.5-2.5h-5"/></svg> 17681</span> 17682 <span class="add-to-cart-text__content is-visually-hidden-mobile quick-add__button-text"> 17683 <span> 17684 17685 <span> 17686 Add 17687 </span> 17688 </span> 17689 </span> 17690 </span> 17691 </button><input type="hidden" name="product-id" value="11005042655578" /><input type="hidden" name="section-id" value="template--28213213921626__product_list_ykU4x3" /></form></product-form-component> 17692</quick-add-component> 17693 17694 17695 17696 17697 17698 17699</div> 17700 17701 17702 17703 17704 17705<div class="product-grid-view-zoom-out--details"> 17706 17707 <h3 class="h4">SAEYANG K38 Portable Nail File Machine</h3> 17708 17709</div> 17710 17711 17712 17713 17714 17715 17716 17717 17718 17719 17720 17721 17722 17723 17724 <div class=" spacing-style text-block text-block--AWHY0bEN1blVtbmFle__text_JM9p8t-7 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 17725 <p>SAEYANG </p> 17726 </div> 17727 17728 17729 17730 17731
17732<script type="module"> 17733 class TextReadMoreWrapper extends HTMLElement { 17734 #expanded = false; 17735 #animation = null; 17736 #collapsedHeight = 0; 17737 17738 connectedCallback() { 17739 const content = this.querySelector('.text-read-more__content'); 17740 const textElement = this.querySelector('.text-read-more__text'); 17741 const button = this.querySelector('.text-read-more__button'); 17742 17743 if (!content || !textElement || !button) return; 17744 17745 // Set initial state 17746 this.dataset.expanded = 'false'; 17747 17748 // Wait for content to render - use double RAF to ensure layout is complete 17749 requestAnimationFrame(() => { 17750 requestAnimationFrame(() => { 17751 // Additional small delay to ensure fonts and styles are applied 17752 setTimeout(() => { 17753 this.#checkOverflow(content, textElement, button); 17754 }, 50); 17755 17756 // Recheck on resize 17757 const resizeObserver = new ResizeObserver(() => { 17758 if (!this.#expanded) { 17759 this.#checkOverflow(content, textElement, button); 17760 } 17761 }); 17762 resizeObserver.observe(content); 17763 17764 // Setup button click handler 17765 button.addEventListener('click', (e) => { 17766 e.preventDefault(); 17767 this.#toggle(content, textElement, button); 17768 }); 17769 }); 17770 }); 17771 } 17772 17773 #checkOverflow(content, textElement, button) { 17774 // Ensure collapsed state is applied 17775 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 17776 textElement.classList.add('text-read-more__text--collapsed'); 17777 } 17778 17779 // Get collapsed height first 17780 const collapsedHeight = content.scrollHeight; 17781 this.#collapsedHeight = collapsedHeight; 17782 17783 // Temporarily remove line-clamp to measure full height 17784 textElement.classList.remove('text-read-more__text--collapsed'); 17785 17786 // Force reflow 17787 void content.offsetHeight; 17788 17789 const fullHeight = content.scrollHeight; 17790 17791 // Restore line-clamp 17792 textElement.classList.add('text-read-more__text--collapsed'); 17793 17794 // Show button if content exceeds 2 lines (with small threshold for rounding) 17795 if (fullHeight > collapsedHeight + 5) { 17796 button.removeAttribute('hidden'); 17797 } else { 17798 button.setAttribute('hidden', ''); 17799 } 17800 } 17801 17802 #toggle(content, textElement, button) { 17803 const startHeight = content.offsetHeight; 17804 let endHeight; 17805 17806 if (!this.#expanded) { 17807 // Expanding 17808 textElement.classList.remove('text-read-more__text--collapsed'); 17809 endHeight = content.scrollHeight; 17810 this.#expanded = true; 17811 } else { 17812 // Collapsing 17813 endHeight = this.#collapsedHeight; 17814 this.#expanded = false; 17815 } 17816 17817 this.dataset.expanded = this.#expanded; 17818 button.setAttribute('aria-expanded', this.#expanded); 17819 17820 // Animate 17821 content.style.overflow = 'hidden'; 17822 this.#animation?.cancel(); 17823 17824 this.#animation = content.animate( 17825 { 17826 height: [`${startHeight}px`, `${endHeight}px`], 17827 }, 17828 { 17829 duration: 300, 17830 easing: 'ease-in-out', 17831 } 17832 ); 17833 17834 this.#animation.onfinish = () => { 17835 if (this.#expanded) { 17836 content.style.removeProperty('height'); 17837 content.style.overflow = ''; 17838 } else { 17839 textElement.classList.add('text-read-more__text--collapsed'); 17840 content.style.removeProperty('height'); 17841 content.style.overflow = ''; 17842 } 17843 }; 17844 } 17845 } 17846 17847 if (!customElements.get('text-read-more-wrapper')) { 17848 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 17849 } 17850</script>
17850 17851 17852 17853 17854 17855 17856 17857 17858 <a 17859 class="contents user-select-text" 17860 ref="productTitleLink" 17861 href="/products/saeyang-k38-portable-nail-file-machine" 17862 > 17863 17864 17865 17866 17867 17868 17869 17870 17871 <div class=" spacing-style text-block text-block--ATnhFUTdmeU5LMzR6T__product_title_BLLeMm-7 custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 4px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 17872 <p>SAEYANG K38 Portable Nail File Machine</p> 17873 </div> 17874 17875 17876 17877 17878
17879<script type="module"> 17880 class TextReadMoreWrapper extends HTMLElement { 17881 #expanded = false; 17882 #animation = null; 17883 #collapsedHeight = 0; 17884 17885 connectedCallback() { 17886 const content = this.querySelector('.text-read-more__content'); 17887 const textElement = this.querySelector('.text-read-more__text'); 17888 const button = this.querySelector('.text-read-more__button'); 17889 17890 if (!content || !textElement || !button) return; 17891 17892 // Set initial state 17893 this.dataset.expanded = 'false'; 17894 17895 // Wait for content to render - use double RAF to ensure layout is complete 17896 requestAnimationFrame(() => { 17897 requestAnimationFrame(() => { 17898 // Additional small delay to ensure fonts and styles are applied 17899 setTimeout(() => { 17900 this.#checkOverflow(content, textElement, button); 17901 }, 50); 17902 17903 // Recheck on resize 17904 const resizeObserver = new ResizeObserver(() => { 17905 if (!this.#expanded) { 17906 this.#checkOverflow(content, textElement, button); 17907 } 17908 }); 17909 resizeObserver.observe(content); 17910 17911 // Setup button click handler 17912 button.addEventListener('click', (e) => { 17913 e.preventDefault(); 17914 this.#toggle(content, textElement, button); 17915 }); 17916 }); 17917 }); 17918 } 17919 17920 #checkOverflow(content, textElement, button) { 17921 // Ensure collapsed state is applied 17922 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 17923 textElement.classList.add('text-read-more__text--collapsed'); 17924 } 17925 17926 // Get collapsed height first 17927 const collapsedHeight = content.scrollHeight; 17928 this.#collapsedHeight = collapsedHeight; 17929 17930 // Temporarily remove line-clamp to measure full height 17931 textElement.classList.remove('text-read-more__text--collapsed'); 17932 17933 // Force reflow 17934 void content.offsetHeight; 17935 17936 const fullHeight = content.scrollHeight; 17937 17938 // Restore line-clamp 17939 textElement.classList.add('text-read-more__text--collapsed'); 17940 17941 // Show button if content exceeds 2 lines (with small threshold for rounding) 17942 if (fullHeight > collapsedHeight + 5) { 17943 button.removeAttribute('hidden'); 17944 } else { 17945 button.setAttribute('hidden', ''); 17946 } 17947 } 17948 17949 #toggle(content, textElement, button) { 17950 const startHeight = content.offsetHeight; 17951 let endHeight; 17952 17953 if (!this.#expanded) { 17954 // Expanding 17955 textElement.classList.remove('text-read-more__text--collapsed'); 17956 endHeight = content.scrollHeight; 17957 this.#expanded = true; 17958 } else { 17959 // Collapsing 17960 endHeight = this.#collapsedHeight; 17961 this.#expanded = false; 17962 } 17963 17964 this.dataset.expanded = this.#expanded; 17965 button.setAttribute('aria-expanded', this.#expanded); 17966 17967 // Animate 17968 content.style.overflow = 'hidden'; 17969 this.#animation?.cancel(); 17970 17971 this.#animation = content.animate( 17972 { 17973 height: [`${startHeight}px`, `${endHeight}px`], 17974 }, 17975 { 17976 duration: 300, 17977 easing: 'ease-in-out', 17978 } 17979 ); 17980 17981 this.#animation.onfinish = () => { 17982 if (this.#expanded) { 17983 content.style.removeProperty('height'); 17984 content.style.overflow = ''; 17985 } else { 17986 textElement.classList.add('text-read-more__text--collapsed'); 17987 content.style.removeProperty('height'); 17988 content.style.overflow = ''; 17989 } 17990 }; 17991 } 17992 } 17993 17994 if (!customElements.get('text-read-more-wrapper')) { 17995 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 17996 } 17997</script>
17997 17998 17999 </a> 18000 18001 18002 18003 18004 18005 18006<product-price 18007 class="text-block text-block--align-left custom-typography custom-font-size custom-color text-left custom spacing-style" 18008 data-block-id="ARDI3alNNdlArbVBQd__price_UQh7nT-7" 18009 data-product-id="11005042655578" 18010 style=" 18011 18012--color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-subheading--weight);--font-family: var(--font-subheading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); 18013 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 18014 --width: 100%; 18015 " 18016 18017> 18018 <div ref="priceContainer"> 18019 18020 18021 18022 18023 18024 <span class="price">£290.00</span> 18025 18026 18027 18028 18029</div> 18030 18031 18032</product-price> 18033 18034 18035 18036 18037 18038 18039 18040 18041 </div> 18042</product-card></product-card-link> 18043 18044</div> 18045 18046 18047 18048 18049 18050 18051 18052 </div> 18053</slideshow-slide> 18054 18055 18056 18057 </slideshow-slides> 18058 </slideshow-container> 18059 18060</slideshow-component> 18061 18062 18063 18064</div> 18065 18066 18067 18068</div> 18069 18070 18071 18072 18073 18074 <div 18075 class="section-resource-list__content" 18076 style="--horizontal-alignment: flex-start;" 18077 ></div> 18078</div> 18079 18080 18081</div><div id="shopify-section-template--28213213921626__section_tGN8jF" class="shopify-section section-wrapper"> 18082 18083 18084 18085<div class="section-background color-scheme-1"></div> 18086<div 18087 class="section section--full-width color-scheme-1" 18088 data-testid="ui-test-section" 18089 18090 18091 18092 style=" 18093 18094 --section-min-height: var(--section-height-small); 18095 18096 18097 18098 --section-preview-height: 600px; 18099 18100 " 18101> 18102 <div class="custom-section-background"> 18103 18104 18105 18106 18107 </div> 18108 18109 <div 18110 class="border-style custom-section-content" 18111 style="--border-width: 1px; --border-style: none; --border-color: 18112rgb(var(--color-border-rgb) / 1.0); --border-radius: 181130px; 18114" 18115 > 18116 18117 18118 <div 18119 class=" 18120 spacing-style 18121 layout-panel-flex 18122 layout-panel-flex--row 18123 section-content-wrapper 18124 mobile-column 18125 " 18126 style=" 18127 --flex-direction: row; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 18128 18129--gap: 24px; 18130 18131--horizontal-alignment: flex-start; --vertical-alignment: center; 18132--vertical-alignment-mobile: center; 18133 18134 --padding-block-start: 0px;--padding-block-end: 0px; 18135 " 18136 data-testid="section-content" 18137 > 18138 18139 18140 18141 18142<div 18143 class=" 18144 group-block 18145 group-block--height-fill 18146 group-block--width-fill 18147 border-style 18148 spacing-style 18149 size-style 18150 18151 color-scheme-6 18152 group-block--increase-mobile-height 18153 18154 " 18155 style=" 18156 --border-width: 1px; --border-style: none; --border-color: 18157rgb(var(--color-border-rgb) / 1.0); --border-radius: 181580px; 18159 18160 --padding-block-start: max(20px, calc(var(--spacing-scale) * 40px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 80px));--padding-inline-start: max(20px, calc(var(--spacing-scale) * 40px));--padding-inline-end: max(20px, calc(var(--spacing-scale) * 40px)); 18161 --size-style-width: 100%;--size-style-height: 100%;--size-style-height-mobile: 100%;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 18162 18163 " 18164 18165 data-testid="group-block" 18166><div class="group-block__media-wrapper"> 18167 18168 <div 18169 class="background-image-container" 18170 > 18171 18172 18173 <img src="//www.tnbl.co.uk/cdn/shop/files/Apres.jpg?v=1766423128&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Apres.jpg?v=1766423128&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Apres.jpg?v=1766423128&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Apres.jpg?v=1766423128&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Apres.jpg?v=1766423128&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Apres.jpg?v=1766423128&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Apres.jpg?v=1766423128&width=3840 3840w" width="3840" height="2437" loading="lazy" sizes="100vw" fetchpriority="auto"> 18174</div> 18175 18176 18177 18178 18179 18180 </div> 18181 18182 <div 18183 class=" 18184 group-block-content 18185 18186 layout-panel-flex 18187 layout-panel-flex--column 18188 mobile-column 18189 18190 group-block-content--has-animation group-block-content--animate-slide-in-bottom group-block-content--disable-animation-mobile 18191 " 18192 data-animation-type="slide-in-bottom" 18193 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 18194 18195--gap: max(24px, calc(var(--gap-scale, 1.0) * 32px)); 18196 18197--horizontal-alignment: center; --vertical-alignment: flex-end; 18198--vertical-alignment-mobile: flex-end; 18199" 18200 > 18201 18202 18203 18204 18205 18206 18207 18208 18209 18210 18211 <div class=" spacing-style text-block text-block--AK2lZZEhnTnJ6UWFKO__text_tJL6rK h1 " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 18212 <h3>Apres Nails</h3> 18213 </div> 18214 18215 18216 18217 18218
18219<script type="module"> 18220 class TextReadMoreWrapper extends HTMLElement { 18221 #expanded = false; 18222 #animation = null; 18223 #collapsedHeight = 0; 18224 18225 connectedCallback() { 18226 const content = this.querySelector('.text-read-more__content'); 18227 const textElement = this.querySelector('.text-read-more__text'); 18228 const button = this.querySelector('.text-read-more__button'); 18229 18230 if (!content || !textElement || !button) return; 18231 18232 // Set initial state 18233 this.dataset.expanded = 'false'; 18234 18235 // Wait for content to render - use double RAF to ensure layout is complete 18236 requestAnimationFrame(() => { 18237 requestAnimationFrame(() => { 18238 // Additional small delay to ensure fonts and styles are applied 18239 setTimeout(() => { 18240 this.#checkOverflow(content, textElement, button); 18241 }, 50); 18242 18243 // Recheck on resize 18244 const resizeObserver = new ResizeObserver(() => { 18245 if (!this.#expanded) { 18246 this.#checkOverflow(content, textElement, button); 18247 } 18248 }); 18249 resizeObserver.observe(content); 18250 18251 // Setup button click handler 18252 button.addEventListener('click', (e) => { 18253 e.preventDefault(); 18254 this.#toggle(content, textElement, button); 18255 }); 18256 }); 18257 }); 18258 } 18259 18260 #checkOverflow(content, textElement, button) { 18261 // Ensure collapsed state is applied 18262 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 18263 textElement.classList.add('text-read-more__text--collapsed'); 18264 } 18265 18266 // Get collapsed height first 18267 const collapsedHeight = content.scrollHeight; 18268 this.#collapsedHeight = collapsedHeight; 18269 18270 // Temporarily remove line-clamp to measure full height 18271 textElement.classList.remove('text-read-more__text--collapsed'); 18272 18273 // Force reflow 18274 void content.offsetHeight; 18275 18276 const fullHeight = content.scrollHeight; 18277 18278 // Restore line-clamp 18279 textElement.classList.add('text-read-more__text--collapsed'); 18280 18281 // Show button if content exceeds 2 lines (with small threshold for rounding) 18282 if (fullHeight > collapsedHeight + 5) { 18283 button.removeAttribute('hidden'); 18284 } else { 18285 button.setAttribute('hidden', ''); 18286 } 18287 } 18288 18289 #toggle(content, textElement, button) { 18290 const startHeight = content.offsetHeight; 18291 let endHeight; 18292 18293 if (!this.#expanded) { 18294 // Expanding 18295 textElement.classList.remove('text-read-more__text--collapsed'); 18296 endHeight = content.scrollHeight; 18297 this.#expanded = true; 18298 } else { 18299 // Collapsing 18300 endHeight = this.#collapsedHeight; 18301 this.#expanded = false; 18302 } 18303 18304 this.dataset.expanded = this.#expanded; 18305 button.setAttribute('aria-expanded', this.#expanded); 18306 18307 // Animate 18308 content.style.overflow = 'hidden'; 18309 this.#animation?.cancel(); 18310 18311 this.#animation = content.animate( 18312 { 18313 height: [`${startHeight}px`, `${endHeight}px`], 18314 }, 18315 { 18316 duration: 300, 18317 easing: 'ease-in-out', 18318 } 18319 ); 18320 18321 this.#animation.onfinish = () => { 18322 if (this.#expanded) { 18323 content.style.removeProperty('height'); 18324 content.style.overflow = ''; 18325 } else { 18326 textElement.classList.add('text-read-more__text--collapsed'); 18327 content.style.removeProperty('height'); 18328 content.style.overflow = ''; 18329 } 18330 }; 18331 } 18332 } 18333 18334 if (!customElements.get('text-read-more-wrapper')) { 18335 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 18336 } 18337</script>
18337 18338 18339 18340 18341 18342 18343 18344<div 18345 class=" 18346 group-block 18347 group-block--height-fit 18348 group-block--width-fill 18349 border-style 18350 spacing-style 18351 size-style 18352 18353 18354 18355 18356 " 18357 style=" 18358 --border-width: 1px; --border-style: none; --border-color: 18359rgb(var(--color-border-rgb) / 1.0); --border-radius: 183600px; 18361 18362 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 18363 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 18364 18365 " 18366 18367 data-testid="group-block" 18368><div class="group-block__media-wrapper"> 18369 18370 18371 18372 18373 18374 </div> 18375 18376 <div 18377 class=" 18378 group-block-content 18379 18380 layout-panel-flex 18381 layout-panel-flex--row 18382 18383 group-block-content--force-single-row-mobile 18384 18385 " 18386 18387 style="--flex-direction: row; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 18388 18389--gap: 24px; 18390 18391--horizontal-alignment: center; --vertical-alignment: center; 18392--vertical-alignment-mobile: center; 18393" 18394 > 18395 18396 18397 18398 18399 18400<a 18401 18402 href="/collections/apres-gel-x-tips" 18403 18404 class=" 18405 size-style 18406 button 18407 button--ANUZRQzNSMDFrUVdLV__button_9i7wCm 18408 18409 18410 " 18411 style="--size-style-width: fit-content;--size-style-height:75%;--size-style-width-mobile: fit-content; --size-style-width-mobile-min: fit-content;" 18412> 18413 Gel-X Tips 18414 18415</a> 18416 18417 18418 18419 18420 18421 18422 18423 18424 18425 18426<a 18427 18428 href="/collections/apres-gel-colour" 18429 18430 class=" 18431 size-style 18432 button 18433 button--AM3NBRS9MRzUzRk9lQ__button_6wBy9x 18434 18435 18436 " 18437 style="--size-style-width: fit-content;--size-style-height:75%;--size-style-width-mobile: fit-content; --size-style-width-mobile-min: fit-content;" 18438> 18439 Gel Colour 18440 18441</a> 18442 18443 18444 18445 18446 18447 18448 18449 18450 18451 18452<a 18453 18454 href="/collections/apres-gel-x-kits" 18455 18456 class=" 18457 size-style 18458 button 18459 button--AYjRpZyt6c0NHYzNtU__button_njY6q8 18460 18461 18462 " 18463 style="--size-style-width: fit-content;--size-style-height:75%;--size-style-width-mobile: fit-content; --size-style-width-mobile-min: fit-content;" 18464> 18465 Gel-X Kits 18466 18467</a> 18468 18469 18470 18471 18472 18473 18474</div> 18475</div> 18476 18477 18478
18479<script type="module"> 18480 (function() { 18481 // Only run if Intersection Observer is supported 18482 if (typeof IntersectionObserver === 'undefined') { 18483 // Fallback: show all animated content immediately 18484 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18485 el.classList.add('group-block-content--in-view'); 18486 }); 18487 return; 18488 } 18489 18490 // Respect reduced motion preference 18491 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 18492 if (prefersReducedMotion) { 18493 // Show all animated content immediately without animation 18494 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18495 el.style.opacity = '1'; 18496 el.style.transform = 'none'; 18497 }); 18498 return; 18499 } 18500 18501 // Set up Intersection Observer for scroll-triggered animations 18502 const observerOptions = { 18503 root: null, 18504 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 18505 threshold: 0.1 // Trigger when 10% of element is visible 18506 }; 18507 18508 const observer = new IntersectionObserver((entries) => { 18509 entries.forEach(entry => { 18510 if (entry.isIntersecting) { 18511 const contentElement = entry.target; 18512 // Add the in-view class to trigger animation 18513 contentElement.classList.add('group-block-content--in-view'); 18514 // Unobserve after animation is triggered (only animate once) 18515 observer.unobserve(contentElement); 18516 } 18517 }); 18518 }, observerOptions); 18519 18520 // Observe all group blocks with animations 18521 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18522 observer.observe(el); 18523 }); 18524 })(); 18525</script>
18525 18526 18527 18528 18529 18530</div> 18531</div> 18532 18533 18534
18535<script type="module"> 18536 (function() { 18537 // Only run if Intersection Observer is supported 18538 if (typeof IntersectionObserver === 'undefined') { 18539 // Fallback: show all animated content immediately 18540 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18541 el.classList.add('group-block-content--in-view'); 18542 }); 18543 return; 18544 } 18545 18546 // Respect reduced motion preference 18547 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 18548 if (prefersReducedMotion) { 18549 // Show all animated content immediately without animation 18550 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18551 el.style.opacity = '1'; 18552 el.style.transform = 'none'; 18553 }); 18554 return; 18555 } 18556 18557 // Set up Intersection Observer for scroll-triggered animations 18558 const observerOptions = { 18559 root: null, 18560 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 18561 threshold: 0.1 // Trigger when 10% of element is visible 18562 }; 18563 18564 const observer = new IntersectionObserver((entries) => { 18565 entries.forEach(entry => { 18566 if (entry.isIntersecting) { 18567 const contentElement = entry.target; 18568 // Add the in-view class to trigger animation 18569 contentElement.classList.add('group-block-content--in-view'); 18570 // Unobserve after animation is triggered (only animate once) 18571 observer.unobserve(contentElement); 18572 } 18573 }); 18574 }, observerOptions); 18575 18576 // Observe all group blocks with animations 18577 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18578 observer.observe(el); 18579 }); 18580 })(); 18581</script>
18581 18582 18583 18584 18585 18586 18587 18588<div 18589 class=" 18590 group-block 18591 group-block--height-fill 18592 group-block--width-fill 18593 border-style 18594 spacing-style 18595 size-style 18596 18597 color-scheme-6 18598 group-block--increase-mobile-height 18599 18600 " 18601 style=" 18602 --border-width: 1px; --border-style: none; --border-color: 18603rgb(var(--color-border-rgb) / 1.0); --border-radius: 186040px; 18605 18606 --padding-block-start: max(20px, calc(var(--spacing-scale) * 40px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 80px));--padding-inline-start: max(20px, calc(var(--spacing-scale) * 40px));--padding-inline-end: max(20px, calc(var(--spacing-scale) * 40px)); 18607 --size-style-width: 100%;--size-style-height: 100%;--size-style-height-mobile: 100%;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 18608 18609 " 18610 18611 data-testid="group-block" 18612><div class="group-block__media-wrapper"> 18613 18614 <div 18615 class="background-image-container" 18616 > 18617 18618 18619 <img src="//www.tnbl.co.uk/cdn/shop/files/Salon.jpg?v=1766423135&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Salon.jpg?v=1766423135&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Salon.jpg?v=1766423135&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Salon.jpg?v=1766423135&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Salon.jpg?v=1766423135&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Salon.jpg?v=1766423135&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Salon.jpg?v=1766423135&width=3840 3840w" width="3840" height="2437" loading="lazy" sizes="100vw" fetchpriority="auto"> 18620</div> 18621 18622 18623 18624 18625 18626 </div> 18627 18628 <div 18629 class=" 18630 group-block-content 18631 18632 layout-panel-flex 18633 layout-panel-flex--column 18634 mobile-column 18635 18636 group-block-content--has-animation group-block-content--animate-slide-in-bottom group-block-content--disable-animation-mobile 18637 " 18638 data-animation-type="slide-in-bottom" 18639 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 18640 18641--gap: max(24px, calc(var(--gap-scale, 1.0) * 32px)); 18642 18643--horizontal-alignment: center; --vertical-alignment: flex-end; 18644--vertical-alignment-mobile: flex-end; 18645" 18646 > 18647 18648 18649 18650 18651 18652 18653 18654 18655 18656 18657 <div class=" spacing-style text-block text-block--AaUlZbDJXZ0h0dktLT__text_3WNhRK h1 " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 18658 <h3>Salon Ready</h3> 18659 </div> 18660 18661 18662 18663 18664
18665<script type="module"> 18666 class TextReadMoreWrapper extends HTMLElement { 18667 #expanded = false; 18668 #animation = null; 18669 #collapsedHeight = 0; 18670 18671 connectedCallback() { 18672 const content = this.querySelector('.text-read-more__content'); 18673 const textElement = this.querySelector('.text-read-more__text'); 18674 const button = this.querySelector('.text-read-more__button'); 18675 18676 if (!content || !textElement || !button) return; 18677 18678 // Set initial state 18679 this.dataset.expanded = 'false'; 18680 18681 // Wait for content to render - use double RAF to ensure layout is complete 18682 requestAnimationFrame(() => { 18683 requestAnimationFrame(() => { 18684 // Additional small delay to ensure fonts and styles are applied 18685 setTimeout(() => { 18686 this.#checkOverflow(content, textElement, button); 18687 }, 50); 18688 18689 // Recheck on resize 18690 const resizeObserver = new ResizeObserver(() => { 18691 if (!this.#expanded) { 18692 this.#checkOverflow(content, textElement, button); 18693 } 18694 }); 18695 resizeObserver.observe(content); 18696 18697 // Setup button click handler 18698 button.addEventListener('click', (e) => { 18699 e.preventDefault(); 18700 this.#toggle(content, textElement, button); 18701 }); 18702 }); 18703 }); 18704 } 18705 18706 #checkOverflow(content, textElement, button) { 18707 // Ensure collapsed state is applied 18708 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 18709 textElement.classList.add('text-read-more__text--collapsed'); 18710 } 18711 18712 // Get collapsed height first 18713 const collapsedHeight = content.scrollHeight; 18714 this.#collapsedHeight = collapsedHeight; 18715 18716 // Temporarily remove line-clamp to measure full height 18717 textElement.classList.remove('text-read-more__text--collapsed'); 18718 18719 // Force reflow 18720 void content.offsetHeight; 18721 18722 const fullHeight = content.scrollHeight; 18723 18724 // Restore line-clamp 18725 textElement.classList.add('text-read-more__text--collapsed'); 18726 18727 // Show button if content exceeds 2 lines (with small threshold for rounding) 18728 if (fullHeight > collapsedHeight + 5) { 18729 button.removeAttribute('hidden'); 18730 } else { 18731 button.setAttribute('hidden', ''); 18732 } 18733 } 18734 18735 #toggle(content, textElement, button) { 18736 const startHeight = content.offsetHeight; 18737 let endHeight; 18738 18739 if (!this.#expanded) { 18740 // Expanding 18741 textElement.classList.remove('text-read-more__text--collapsed'); 18742 endHeight = content.scrollHeight; 18743 this.#expanded = true; 18744 } else { 18745 // Collapsing 18746 endHeight = this.#collapsedHeight; 18747 this.#expanded = false; 18748 } 18749 18750 this.dataset.expanded = this.#expanded; 18751 button.setAttribute('aria-expanded', this.#expanded); 18752 18753 // Animate 18754 content.style.overflow = 'hidden'; 18755 this.#animation?.cancel(); 18756 18757 this.#animation = content.animate( 18758 { 18759 height: [`${startHeight}px`, `${endHeight}px`], 18760 }, 18761 { 18762 duration: 300, 18763 easing: 'ease-in-out', 18764 } 18765 ); 18766 18767 this.#animation.onfinish = () => { 18768 if (this.#expanded) { 18769 content.style.removeProperty('height'); 18770 content.style.overflow = ''; 18771 } else { 18772 textElement.classList.add('text-read-more__text--collapsed'); 18773 content.style.removeProperty('height'); 18774 content.style.overflow = ''; 18775 } 18776 }; 18777 } 18778 } 18779 18780 if (!customElements.get('text-read-more-wrapper')) { 18781 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 18782 } 18783</script>
18783 18784 18785 18786 18787 18788 18789 18790<div 18791 class=" 18792 group-block 18793 group-block--height-fit 18794 group-block--width-fill 18795 border-style 18796 spacing-style 18797 size-style 18798 18799 18800 18801 18802 " 18803 style=" 18804 --border-width: 1px; --border-style: none; --border-color: 18805rgb(var(--color-border-rgb) / 1.0); --border-radius: 188060px; 18807 18808 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 18809 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 18810 18811 " 18812 18813 data-testid="group-block" 18814><div class="group-block__media-wrapper"> 18815 18816 18817 18818 18819 18820 </div> 18821 18822 <div 18823 class=" 18824 group-block-content 18825 18826 layout-panel-flex 18827 layout-panel-flex--row 18828 18829 group-block-content--force-single-row-mobile 18830 18831 " 18832 18833 style="--flex-direction: row; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 18834 18835--gap: 24px; 18836 18837--horizontal-alignment: center; --vertical-alignment: center; 18838--vertical-alignment-mobile: center; 18839" 18840 > 18841 18842 18843 18844 18845 18846<a 18847 18848 href="/collections/furniture" 18849 18850 class=" 18851 size-style 18852 button 18853 button--AMElqZmFwQVMzbkdpd__button_JgkgGx 18854 18855 18856 " 18857 style="--size-style-width: fit-content;--size-style-height:75%;--size-style-width-mobile: fit-content; --size-style-width-mobile-min: fit-content;" 18858> 18859 Furniture 18860 18861</a> 18862 18863 18864 18865 18866 18867 18868 18869 18870 18871 18872<a 18873 18874 href="/collections/electricals" 18875 18876 class=" 18877 size-style 18878 button 18879 button--AN2FQTVZXY09PVzl4O__button_jm3n9p 18880 18881 18882 " 18883 style="--size-style-width: fit-content;--size-style-height:75%;--size-style-width-mobile: fit-content; --size-style-width-mobile-min: fit-content;" 18884> 18885 Electricals 18886 18887</a> 18888 18889 18890 18891 18892 18893 18894 18895 18896 18897 18898<a 18899 18900 href="/collections/salon-essentials-hygiene" 18901 18902 class=" 18903 size-style 18904 button 18905 button--AaHFxbUZRRzZIRSt4b__button_RikABB 18906 18907 18908 " 18909 style="--size-style-width: fit-content;--size-style-height:75%;--size-style-width-mobile: fit-content; --size-style-width-mobile-min: fit-content;" 18910> 18911 Hygiene 18912 18913</a> 18914 18915 18916 18917 18918 18919 18920</div> 18921</div> 18922 18923 18924
18925<script type="module"> 18926 (function() { 18927 // Only run if Intersection Observer is supported 18928 if (typeof IntersectionObserver === 'undefined') { 18929 // Fallback: show all animated content immediately 18930 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18931 el.classList.add('group-block-content--in-view'); 18932 }); 18933 return; 18934 } 18935 18936 // Respect reduced motion preference 18937 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 18938 if (prefersReducedMotion) { 18939 // Show all animated content immediately without animation 18940 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18941 el.style.opacity = '1'; 18942 el.style.transform = 'none'; 18943 }); 18944 return; 18945 } 18946 18947 // Set up Intersection Observer for scroll-triggered animations 18948 const observerOptions = { 18949 root: null, 18950 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 18951 threshold: 0.1 // Trigger when 10% of element is visible 18952 }; 18953 18954 const observer = new IntersectionObserver((entries) => { 18955 entries.forEach(entry => { 18956 if (entry.isIntersecting) { 18957 const contentElement = entry.target; 18958 // Add the in-view class to trigger animation 18959 contentElement.classList.add('group-block-content--in-view'); 18960 // Unobserve after animation is triggered (only animate once) 18961 observer.unobserve(contentElement); 18962 } 18963 }); 18964 }, observerOptions); 18965 18966 // Observe all group blocks with animations 18967 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18968 observer.observe(el); 18969 }); 18970 })(); 18971</script>
18971 18972 18973 18974 18975 18976</div> 18977</div> 18978 18979 18980
18981<script type="module"> 18982 (function() { 18983 // Only run if Intersection Observer is supported 18984 if (typeof IntersectionObserver === 'undefined') { 18985 // Fallback: show all animated content immediately 18986 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18987 el.classList.add('group-block-content--in-view'); 18988 }); 18989 return; 18990 } 18991 18992 // Respect reduced motion preference 18993 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 18994 if (prefersReducedMotion) { 18995 // Show all animated content immediately without animation 18996 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 18997 el.style.opacity = '1'; 18998 el.style.transform = 'none'; 18999 }); 19000 return; 19001 } 19002 19003 // Set up Intersection Observer for scroll-triggered animations 19004 const observerOptions = { 19005 root: null, 19006 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 19007 threshold: 0.1 // Trigger when 10% of element is visible 19008 }; 19009 19010 const observer = new IntersectionObserver((entries) => { 19011 entries.forEach(entry => { 19012 if (entry.isIntersecting) { 19013 const contentElement = entry.target; 19014 // Add the in-view class to trigger animation 19015 contentElement.classList.add('group-block-content--in-view'); 19016 // Unobserve after animation is triggered (only animate once) 19017 observer.unobserve(contentElement); 19018 } 19019 }); 19020 }, observerOptions); 19021 19022 // Observe all group blocks with animations 19023 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 19024 observer.observe(el); 19025 }); 19026 })(); 19027</script>
19027 19028 19029 19030 19031 19032 19033 </div> 19034 </div> 19035</div> 19036 19037 19038 19039 19040 19041</div><div id="shopify-section-template--28213213921626__section_3KbkGV" class="shopify-section section-wrapper"> 19042 19043 19044 19045<div class="section-background color-scheme-1"></div> 19046<div 19047 class="section section--page-width color-scheme-1" 19048 data-testid="ui-test-section" 19049 19050 19051 19052 style=" 19053 19054 19055 19056 " 19057> 19058 <div class="custom-section-background"> 19059 19060 19061 19062 19063 </div> 19064 19065 <div 19066 class="border-style custom-section-content" 19067 style="--border-width: 1px; --border-style: none; --border-color: 19068rgb(var(--color-border-rgb) / 1.0); --border-radius: 190690px; 19070" 19071 > 19072 19073 19074 <div 19075 class=" 19076 spacing-style 19077 layout-panel-flex 19078 layout-panel-flex--column 19079 section-content-wrapper 19080 mobile-column 19081 " 19082 style=" 19083 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 19084 19085--gap: 18px; 19086 19087--horizontal-alignment: flex-start; --vertical-alignment: center; 19088--vertical-alignment-mobile: center; 19089 19090 --padding-block-start: max(20px, calc(var(--spacing-scale) * 70px));--padding-block-end: 0px; 19091 " 19092 data-testid="section-content" 19093 > 19094 19095 19096 19097 19098 19099 19100 19101 19102 19103 19104 19105 <div class=" spacing-style text-block text-block--AZzcvcXN4Q1duRDBGQ__text_bDR4ec h3 " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 19106 <h2>Shop By Colour</h2> 19107 </div> 19108 19109 19110 19111 19112
19113<script type="module"> 19114 class TextReadMoreWrapper extends HTMLElement { 19115 #expanded = false; 19116 #animation = null; 19117 #collapsedHeight = 0; 19118 19119 connectedCallback() { 19120 const content = this.querySelector('.text-read-more__content'); 19121 const textElement = this.querySelector('.text-read-more__text'); 19122 const button = this.querySelector('.text-read-more__button'); 19123 19124 if (!content || !textElement || !button) return; 19125 19126 // Set initial state 19127 this.dataset.expanded = 'false'; 19128 19129 // Wait for content to render - use double RAF to ensure layout is complete 19130 requestAnimationFrame(() => { 19131 requestAnimationFrame(() => { 19132 // Additional small delay to ensure fonts and styles are applied 19133 setTimeout(() => { 19134 this.#checkOverflow(content, textElement, button); 19135 }, 50); 19136 19137 // Recheck on resize 19138 const resizeObserver = new ResizeObserver(() => { 19139 if (!this.#expanded) { 19140 this.#checkOverflow(content, textElement, button); 19141 } 19142 }); 19143 resizeObserver.observe(content); 19144 19145 // Setup button click handler 19146 button.addEventListener('click', (e) => { 19147 e.preventDefault(); 19148 this.#toggle(content, textElement, button); 19149 }); 19150 }); 19151 }); 19152 } 19153 19154 #checkOverflow(content, textElement, button) { 19155 // Ensure collapsed state is applied 19156 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 19157 textElement.classList.add('text-read-more__text--collapsed'); 19158 } 19159 19160 // Get collapsed height first 19161 const collapsedHeight = content.scrollHeight; 19162 this.#collapsedHeight = collapsedHeight; 19163 19164 // Temporarily remove line-clamp to measure full height 19165 textElement.classList.remove('text-read-more__text--collapsed'); 19166 19167 // Force reflow 19168 void content.offsetHeight; 19169 19170 const fullHeight = content.scrollHeight; 19171 19172 // Restore line-clamp 19173 textElement.classList.add('text-read-more__text--collapsed'); 19174 19175 // Show button if content exceeds 2 lines (with small threshold for rounding) 19176 if (fullHeight > collapsedHeight + 5) { 19177 button.removeAttribute('hidden'); 19178 } else { 19179 button.setAttribute('hidden', ''); 19180 } 19181 } 19182 19183 #toggle(content, textElement, button) { 19184 const startHeight = content.offsetHeight; 19185 let endHeight; 19186 19187 if (!this.#expanded) { 19188 // Expanding 19189 textElement.classList.remove('text-read-more__text--collapsed'); 19190 endHeight = content.scrollHeight; 19191 this.#expanded = true; 19192 } else { 19193 // Collapsing 19194 endHeight = this.#collapsedHeight; 19195 this.#expanded = false; 19196 } 19197 19198 this.dataset.expanded = this.#expanded; 19199 button.setAttribute('aria-expanded', this.#expanded); 19200 19201 // Animate 19202 content.style.overflow = 'hidden'; 19203 this.#animation?.cancel(); 19204 19205 this.#animation = content.animate( 19206 { 19207 height: [`${startHeight}px`, `${endHeight}px`], 19208 }, 19209 { 19210 duration: 300, 19211 easing: 'ease-in-out', 19212 } 19213 ); 19214 19215 this.#animation.onfinish = () => { 19216 if (this.#expanded) { 19217 content.style.removeProperty('height'); 19218 content.style.overflow = ''; 19219 } else { 19220 textElement.classList.add('text-read-more__text--collapsed'); 19221 content.style.removeProperty('height'); 19222 content.style.overflow = ''; 19223 } 19224 }; 19225 } 19226 } 19227 19228 if (!customElements.get('text-read-more-wrapper')) { 19229 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 19230 } 19231</script>
19231 19232 19233 19234 19235 19236 19237 19238 19239 19240 19241 19242 19243 19244 19245 <div class=" spacing-style text-block text-block--AYS9EU0dteG5mOWVpM__text_hD397y custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.125rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 19246 <p>Find your perfect shade instantly</p> 19247 </div> 19248 19249 19250 19251 19252
19253<script type="module"> 19254 class TextReadMoreWrapper extends HTMLElement { 19255 #expanded = false; 19256 #animation = null; 19257 #collapsedHeight = 0; 19258 19259 connectedCallback() { 19260 const content = this.querySelector('.text-read-more__content'); 19261 const textElement = this.querySelector('.text-read-more__text'); 19262 const button = this.querySelector('.text-read-more__button'); 19263 19264 if (!content || !textElement || !button) return; 19265 19266 // Set initial state 19267 this.dataset.expanded = 'false'; 19268 19269 // Wait for content to render - use double RAF to ensure layout is complete 19270 requestAnimationFrame(() => { 19271 requestAnimationFrame(() => { 19272 // Additional small delay to ensure fonts and styles are applied 19273 setTimeout(() => { 19274 this.#checkOverflow(content, textElement, button); 19275 }, 50); 19276 19277 // Recheck on resize 19278 const resizeObserver = new ResizeObserver(() => { 19279 if (!this.#expanded) { 19280 this.#checkOverflow(content, textElement, button); 19281 } 19282 }); 19283 resizeObserver.observe(content); 19284 19285 // Setup button click handler 19286 button.addEventListener('click', (e) => { 19287 e.preventDefault(); 19288 this.#toggle(content, textElement, button); 19289 }); 19290 }); 19291 }); 19292 } 19293 19294 #checkOverflow(content, textElement, button) { 19295 // Ensure collapsed state is applied 19296 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 19297 textElement.classList.add('text-read-more__text--collapsed'); 19298 } 19299 19300 // Get collapsed height first 19301 const collapsedHeight = content.scrollHeight; 19302 this.#collapsedHeight = collapsedHeight; 19303 19304 // Temporarily remove line-clamp to measure full height 19305 textElement.classList.remove('text-read-more__text--collapsed'); 19306 19307 // Force reflow 19308 void content.offsetHeight; 19309 19310 const fullHeight = content.scrollHeight; 19311 19312 // Restore line-clamp 19313 textElement.classList.add('text-read-more__text--collapsed'); 19314 19315 // Show button if content exceeds 2 lines (with small threshold for rounding) 19316 if (fullHeight > collapsedHeight + 5) { 19317 button.removeAttribute('hidden'); 19318 } else { 19319 button.setAttribute('hidden', ''); 19320 } 19321 } 19322 19323 #toggle(content, textElement, button) { 19324 const startHeight = content.offsetHeight; 19325 let endHeight; 19326 19327 if (!this.#expanded) { 19328 // Expanding 19329 textElement.classList.remove('text-read-more__text--collapsed'); 19330 endHeight = content.scrollHeight; 19331 this.#expanded = true; 19332 } else { 19333 // Collapsing 19334 endHeight = this.#collapsedHeight; 19335 this.#expanded = false; 19336 } 19337 19338 this.dataset.expanded = this.#expanded; 19339 button.setAttribute('aria-expanded', this.#expanded); 19340 19341 // Animate 19342 content.style.overflow = 'hidden'; 19343 this.#animation?.cancel(); 19344 19345 this.#animation = content.animate( 19346 { 19347 height: [`${startHeight}px`, `${endHeight}px`], 19348 }, 19349 { 19350 duration: 300, 19351 easing: 'ease-in-out', 19352 } 19353 ); 19354 19355 this.#animation.onfinish = () => { 19356 if (this.#expanded) { 19357 content.style.removeProperty('height'); 19358 content.style.overflow = ''; 19359 } else { 19360 textElement.classList.add('text-read-more__text--collapsed'); 19361 content.style.removeProperty('height'); 19362 content.style.overflow = ''; 19363 } 19364 }; 19365 } 19366 } 19367 19368 if (!customElements.get('text-read-more-wrapper')) { 19369 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 19370 } 19371</script>
19371 19372 19373 19374 19375 19376 19377 </div> 19378 </div> 19379</div> 19380 19381 19382 19383 19384 19385</div><div id="shopify-section-template--28213213921626__collection_list_pDpFPq" class="shopify-section ui-test-collection-list"> 19386 19387 19388 19389<div class="section-background color-scheme-1"></div> 19390 19391<div 19392 class=" 19393 section 19394 section--page-width 19395 color-scheme-1 19396 section-resource-list 19397 section-collection-list 19398 spacing-style 19399 gap-style 19400 section-collection-list--colour-swatches 19401 " 19402 style=" 19403 --padding-block-start: max(20px, calc(var(--spacing-scale) * 24px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 48px)); 19404 --gap: 0px; 19405 " 19406 id="collection-list-template--28213213921626__collection_list_pDpFPq" 19407 data-testid="collection-list" 19408 data-collection-card-reveal-enabled="true" 19409 data-collection-card-reveal-stagger-ms="100" 19410 data-mobile-columns="2" 19411 data-mobile-card-size="33cqw" 19412> 19413 <div class="section-resource-list__content"></div> 19414 19415 19416 19417 19418 19419 19420 19421 19422 19423<div 19424 class=" 19425 resource-list 19426 19427 force-full-width 19428 19429 19430 resource-list__carousel 19431 " 19432 style="--resource-list-column-gap-desktop: 0px;--column-count: 8;--column-count-mobile: 1;--mobile-card-size: 33cqw;" 19433 19434 data-testid="collections-list-grid" 19435 19436> 19437 19438 19439 19440 19441 19442<div 19443 class="resource-list__carousel" 19444 style="--gutter-slide-width: var(--util-page-margin-offset); --slide-width-max: 450px;" 19445> 19446 <slideshow-component 19447 19448 ref="collectionList" 19449 19450 19451 class="resource-list__carousel" 19452 19453 style="--slideshow-timeline: --slide-1, --slide-2, --slide-3, --slide-4, --slide-5, --slide-6, --slide-7, --slide-8, --slide-9, --slide-10, --slide-11;--slide-min-height: auto;--slide-min-height-desktop: auto;" 19454 19455 initial-slide="0" 19456 19457 19458 19459 data-scroll-persistence-key="template--28213213921626__collection_list_pDpFPq-collectionList" 19460 19461 19462 19463> 19464 19465 <slideshow-container ref="slideshowContainer"> 19466 19467 19468 <slideshow-slides 19469 tabindex="-1" 19470 ref="scroller" 19471 19472 gutters="start end" 19473 19474 > 19475 19476 19477 <slideshow-slide 19478 ref="slides[]" 19479 aria-hidden="false" 19480 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 19481 19482 class="resource-list__slide" 19483 19484 19485 19486 19487 19488 19489 19490> 19491 <div 19492 class="resource-list__item" 19493 19494 style="--collection-card-reveal-delay: 0ms;" 19495 19496 > 19497 19498 19499 19500 19501 19502 19503 19504 19505<style data-shopify> 19506 19507</style> 19508 19509 19510 19511<div 19512 class=" 19513 collection-card 19514 border-style 19515 19516 19517 19518 19519 " 19520 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card" 19521 19522 style=" 19523 --border-width: 1px; --border-style: none; --border-color: 19524rgb(var(--color-border-rgb) / 1.0); --border-radius: 195250px; 19526 19527 --horizontal-alignment: center; 19528 --vertical-alignment: center; 19529 --background-overlay-color: ; 19530 --gap: 12px; 19531 "> 19532 <a 19533 class="collection-card__link" 19534 19535 href="/collections/white" 19536 19537 > 19538 <span class="visually-hidden">White</span> 19539 </a> 19540 <div class="collection-card__inner"> 19541 19542 19543 19544 19545 19546 19547 19548<style data-shopify> 19549 19550 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card"] { 19551 --ratio: 1 / 1; 19552 } 19553 19554 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card"] .collection-card__image { 19555 width: 110px; 19556 height: 110px; 19557 aspect-ratio: unset; 19558 flex-shrink: 0; 19559 } 19560 19561 19562</style> 19563 19564 19565 <div 19566 class=" 19567 image-block 19568 resource-image 19569 resource-image--swatch 19570 19571 collection-card__image 19572 19573 spacing-style border-style 19574 19575 " 19576 style="--border-width: 1px; --border-style: none; --border-color: 19577rgb(var(--color-border-rgb) / 1.0); --border-radius: 195780px; 19579" 19580 19581 > 19582 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832743-97077200_f4da23fd-2d21-4c70-a4ef-c160acb189b8.png?v=1770115060&width=220" alt="White" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832743-97077200_f4da23fd-2d21-4c70-a4ef-c160acb189b8.png?v=1770115060&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832743-97077200_f4da23fd-2d21-4c70-a4ef-c160acb189b8.png?v=1770115060&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 19583 19584 </div> 19585 19586 19587 19588 19589 19590 19591 19592 19593 <div class="collection-card__content layout-panel-flex--column"> 19594 19595 19596 19597 19598 19599<div class="collection-title-wrapper"> 19600 19601 19602 19603 19604 19605 19606 19607 19608 19609 19610 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 19611 <p>White</p> 19612 </div> 19613 19614 19615 19616 19617
19618<script type="module"> 19619 class TextReadMoreWrapper extends HTMLElement { 19620 #expanded = false; 19621 #animation = null; 19622 #collapsedHeight = 0; 19623 19624 connectedCallback() { 19625 const content = this.querySelector('.text-read-more__content'); 19626 const textElement = this.querySelector('.text-read-more__text'); 19627 const button = this.querySelector('.text-read-more__button'); 19628 19629 if (!content || !textElement || !button) return; 19630 19631 // Set initial state 19632 this.dataset.expanded = 'false'; 19633 19634 // Wait for content to render - use double RAF to ensure layout is complete 19635 requestAnimationFrame(() => { 19636 requestAnimationFrame(() => { 19637 // Additional small delay to ensure fonts and styles are applied 19638 setTimeout(() => { 19639 this.#checkOverflow(content, textElement, button); 19640 }, 50); 19641 19642 // Recheck on resize 19643 const resizeObserver = new ResizeObserver(() => { 19644 if (!this.#expanded) { 19645 this.#checkOverflow(content, textElement, button); 19646 } 19647 }); 19648 resizeObserver.observe(content); 19649 19650 // Setup button click handler 19651 button.addEventListener('click', (e) => { 19652 e.preventDefault(); 19653 this.#toggle(content, textElement, button); 19654 }); 19655 }); 19656 }); 19657 } 19658 19659 #checkOverflow(content, textElement, button) { 19660 // Ensure collapsed state is applied 19661 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 19662 textElement.classList.add('text-read-more__text--collapsed'); 19663 } 19664 19665 // Get collapsed height first 19666 const collapsedHeight = content.scrollHeight; 19667 this.#collapsedHeight = collapsedHeight; 19668 19669 // Temporarily remove line-clamp to measure full height 19670 textElement.classList.remove('text-read-more__text--collapsed'); 19671 19672 // Force reflow 19673 void content.offsetHeight; 19674 19675 const fullHeight = content.scrollHeight; 19676 19677 // Restore line-clamp 19678 textElement.classList.add('text-read-more__text--collapsed'); 19679 19680 // Show button if content exceeds 2 lines (with small threshold for rounding) 19681 if (fullHeight > collapsedHeight + 5) { 19682 button.removeAttribute('hidden'); 19683 } else { 19684 button.setAttribute('hidden', ''); 19685 } 19686 } 19687 19688 #toggle(content, textElement, button) { 19689 const startHeight = content.offsetHeight; 19690 let endHeight; 19691 19692 if (!this.#expanded) { 19693 // Expanding 19694 textElement.classList.remove('text-read-more__text--collapsed'); 19695 endHeight = content.scrollHeight; 19696 this.#expanded = true; 19697 } else { 19698 // Collapsing 19699 endHeight = this.#collapsedHeight; 19700 this.#expanded = false; 19701 } 19702 19703 this.dataset.expanded = this.#expanded; 19704 button.setAttribute('aria-expanded', this.#expanded); 19705 19706 // Animate 19707 content.style.overflow = 'hidden'; 19708 this.#animation?.cancel(); 19709 19710 this.#animation = content.animate( 19711 { 19712 height: [`${startHeight}px`, `${endHeight}px`], 19713 }, 19714 { 19715 duration: 300, 19716 easing: 'ease-in-out', 19717 } 19718 ); 19719 19720 this.#animation.onfinish = () => { 19721 if (this.#expanded) { 19722 content.style.removeProperty('height'); 19723 content.style.overflow = ''; 19724 } else { 19725 textElement.classList.add('text-read-more__text--collapsed'); 19726 content.style.removeProperty('height'); 19727 content.style.overflow = ''; 19728 } 19729 }; 19730 } 19731 } 19732 19733 if (!customElements.get('text-read-more-wrapper')) { 19734 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 19735 } 19736</script>
19736 19737 19738 19739 19740</div> 19741 19742 19743 19744 19745 19746 19747 </div> 19748 </div> 19749</div> 19750 19751 19752 19753 19754 19755 19756 </div> 19757 19758 19759</slideshow-slide> 19760 19761 19762 <slideshow-slide 19763 ref="slides[]" 19764 aria-hidden="true" 19765 style="--slideshow-timeline: --slide-1; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 19766 19767 class="resource-list__slide" 19768 19769 19770 19771 19772 19773 19774 19775> 19776 19777 19778 19779 <div 19780 class="resource-list__item" 19781 19782 style="--collection-card-reveal-delay: 100ms;" 19783 19784 > 19785 19786 19787 19788 19789 19790 19791 19792 19793<style data-shopify> 19794 19795</style> 19796 19797 19798 19799<div 19800 class=" 19801 collection-card 19802 border-style 19803 19804 19805 19806 19807 " 19808 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-1" 19809 19810 style=" 19811 --border-width: 1px; --border-style: none; --border-color: 19812rgb(var(--color-border-rgb) / 1.0); --border-radius: 198130px; 19814 19815 --horizontal-alignment: center; 19816 --vertical-alignment: center; 19817 --background-overlay-color: ; 19818 --gap: 12px; 19819 "> 19820 <a 19821 class="collection-card__link" 19822 19823 href="/collections/blue" 19824 19825 > 19826 <span class="visually-hidden">Blue</span> 19827 </a> 19828 <div class="collection-card__inner"> 19829 19830 19831 19832 19833 19834 19835 19836<style data-shopify> 19837 19838 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-1"] { 19839 --ratio: 1 / 1; 19840 } 19841 19842 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-1"] .collection-card__image { 19843 width: 110px; 19844 height: 110px; 19845 aspect-ratio: unset; 19846 flex-shrink: 0; 19847 } 19848 19849 19850</style> 19851 19852 19853 <div 19854 class=" 19855 image-block 19856 resource-image 19857 resource-image--swatch 19858 19859 collection-card__image 19860 19861 spacing-style border-style 19862 19863 " 19864 style="--border-width: 1px; --border-style: none; --border-color: 19865rgb(var(--color-border-rgb) / 1.0); --border-radius: 198660px; 19867" 19868 19869 > 19870 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832758-60793800.png?v=1770114994&width=220" alt="Blue" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832758-60793800.png?v=1770114994&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832758-60793800.png?v=1770114994&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 19871 19872 </div> 19873 19874 19875 19876 19877 19878 19879 19880 19881 <div class="collection-card__content layout-panel-flex--column"> 19882 19883 19884 19885 19886 19887<div class="collection-title-wrapper"> 19888 19889 19890 19891 19892 19893 19894 19895 19896 19897 19898 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-1 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 19899 <p>Blue</p> 19900 </div> 19901 19902 19903 19904 19905
19906<script type="module"> 19907 class TextReadMoreWrapper extends HTMLElement { 19908 #expanded = false; 19909 #animation = null; 19910 #collapsedHeight = 0; 19911 19912 connectedCallback() { 19913 const content = this.querySelector('.text-read-more__content'); 19914 const textElement = this.querySelector('.text-read-more__text'); 19915 const button = this.querySelector('.text-read-more__button'); 19916 19917 if (!content || !textElement || !button) return; 19918 19919 // Set initial state 19920 this.dataset.expanded = 'false'; 19921 19922 // Wait for content to render - use double RAF to ensure layout is complete 19923 requestAnimationFrame(() => { 19924 requestAnimationFrame(() => { 19925 // Additional small delay to ensure fonts and styles are applied 19926 setTimeout(() => { 19927 this.#checkOverflow(content, textElement, button); 19928 }, 50); 19929 19930 // Recheck on resize 19931 const resizeObserver = new ResizeObserver(() => { 19932 if (!this.#expanded) { 19933 this.#checkOverflow(content, textElement, button); 19934 } 19935 }); 19936 resizeObserver.observe(content); 19937 19938 // Setup button click handler 19939 button.addEventListener('click', (e) => { 19940 e.preventDefault(); 19941 this.#toggle(content, textElement, button); 19942 }); 19943 }); 19944 }); 19945 } 19946 19947 #checkOverflow(content, textElement, button) { 19948 // Ensure collapsed state is applied 19949 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 19950 textElement.classList.add('text-read-more__text--collapsed'); 19951 } 19952 19953 // Get collapsed height first 19954 const collapsedHeight = content.scrollHeight; 19955 this.#collapsedHeight = collapsedHeight; 19956 19957 // Temporarily remove line-clamp to measure full height 19958 textElement.classList.remove('text-read-more__text--collapsed'); 19959 19960 // Force reflow 19961 void content.offsetHeight; 19962 19963 const fullHeight = content.scrollHeight; 19964 19965 // Restore line-clamp 19966 textElement.classList.add('text-read-more__text--collapsed'); 19967 19968 // Show button if content exceeds 2 lines (with small threshold for rounding) 19969 if (fullHeight > collapsedHeight + 5) { 19970 button.removeAttribute('hidden'); 19971 } else { 19972 button.setAttribute('hidden', ''); 19973 } 19974 } 19975 19976 #toggle(content, textElement, button) { 19977 const startHeight = content.offsetHeight; 19978 let endHeight; 19979 19980 if (!this.#expanded) { 19981 // Expanding 19982 textElement.classList.remove('text-read-more__text--collapsed'); 19983 endHeight = content.scrollHeight; 19984 this.#expanded = true; 19985 } else { 19986 // Collapsing 19987 endHeight = this.#collapsedHeight; 19988 this.#expanded = false; 19989 } 19990 19991 this.dataset.expanded = this.#expanded; 19992 button.setAttribute('aria-expanded', this.#expanded); 19993 19994 // Animate 19995 content.style.overflow = 'hidden'; 19996 this.#animation?.cancel(); 19997 19998 this.#animation = content.animate( 19999 { 20000 height: [`${startHeight}px`, `${endHeight}px`], 20001 }, 20002 { 20003 duration: 300, 20004 easing: 'ease-in-out', 20005 } 20006 ); 20007 20008 this.#animation.onfinish = () => { 20009 if (this.#expanded) { 20010 content.style.removeProperty('height'); 20011 content.style.overflow = ''; 20012 } else { 20013 textElement.classList.add('text-read-more__text--collapsed'); 20014 content.style.removeProperty('height'); 20015 content.style.overflow = ''; 20016 } 20017 }; 20018 } 20019 } 20020 20021 if (!customElements.get('text-read-more-wrapper')) { 20022 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 20023 } 20024</script>
20024 20025 20026 20027 20028</div> 20029 20030 20031 20032 20033 20034 20035 </div> 20036 </div> 20037</div> 20038 20039 20040 20041 20042 20043 20044 </div> 20045 20046 20047</slideshow-slide> 20048 20049 20050 <slideshow-slide 20051 ref="slides[]" 20052 aria-hidden="true" 20053 style="--slideshow-timeline: --slide-2; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 20054 20055 class="resource-list__slide" 20056 20057 20058 20059 20060 20061 20062 20063> 20064 20065 20066 20067 <div 20068 class="resource-list__item" 20069 20070 style="--collection-card-reveal-delay: 200ms;" 20071 20072 > 20073 20074 20075 20076 20077 20078 20079 20080 20081<style data-shopify> 20082 20083</style> 20084 20085 20086 20087<div 20088 class=" 20089 collection-card 20090 border-style 20091 20092 20093 20094 20095 " 20096 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-2" 20097 20098 style=" 20099 --border-width: 1px; --border-style: none; --border-color: 20100rgb(var(--color-border-rgb) / 1.0); --border-radius: 201010px; 20102 20103 --horizontal-alignment: center; 20104 --vertical-alignment: center; 20105 --background-overlay-color: ; 20106 --gap: 12px; 20107 "> 20108 <a 20109 class="collection-card__link" 20110 20111 href="/collections/gold" 20112 20113 > 20114 <span class="visually-hidden">Gold</span> 20115 </a> 20116 <div class="collection-card__inner"> 20117 20118 20119 20120 20121 20122 20123 20124<style data-shopify> 20125 20126 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-2"] { 20127 --ratio: 1 / 1; 20128 } 20129 20130 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-2"] .collection-card__image { 20131 width: 110px; 20132 height: 110px; 20133 aspect-ratio: unset; 20134 flex-shrink: 0; 20135 } 20136 20137 20138</style> 20139 20140 20141 <div 20142 class=" 20143 image-block 20144 resource-image 20145 resource-image--swatch 20146 20147 collection-card__image 20148 20149 spacing-style border-style 20150 20151 " 20152 style="--border-width: 1px; --border-style: none; --border-color: 20153rgb(var(--color-border-rgb) / 1.0); --border-radius: 201540px; 20155" 20156 20157 > 20158 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832782-80810400.png?v=1770114722&width=220" alt="Gold" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832782-80810400.png?v=1770114722&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832782-80810400.png?v=1770114722&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 20159 20160 </div> 20161 20162 20163 20164 20165 20166 20167 20168 20169 <div class="collection-card__content layout-panel-flex--column"> 20170 20171 20172 20173 20174 20175<div class="collection-title-wrapper"> 20176 20177 20178 20179 20180 20181 20182 20183 20184 20185 20186 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-2 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 20187 <p>Gold</p> 20188 </div> 20189 20190 20191 20192 20193
20194<script type="module"> 20195 class TextReadMoreWrapper extends HTMLElement { 20196 #expanded = false; 20197 #animation = null; 20198 #collapsedHeight = 0; 20199 20200 connectedCallback() { 20201 const content = this.querySelector('.text-read-more__content'); 20202 const textElement = this.querySelector('.text-read-more__text'); 20203 const button = this.querySelector('.text-read-more__button'); 20204 20205 if (!content || !textElement || !button) return; 20206 20207 // Set initial state 20208 this.dataset.expanded = 'false'; 20209 20210 // Wait for content to render - use double RAF to ensure layout is complete 20211 requestAnimationFrame(() => { 20212 requestAnimationFrame(() => { 20213 // Additional small delay to ensure fonts and styles are applied 20214 setTimeout(() => { 20215 this.#checkOverflow(content, textElement, button); 20216 }, 50); 20217 20218 // Recheck on resize 20219 const resizeObserver = new ResizeObserver(() => { 20220 if (!this.#expanded) { 20221 this.#checkOverflow(content, textElement, button); 20222 } 20223 }); 20224 resizeObserver.observe(content); 20225 20226 // Setup button click handler 20227 button.addEventListener('click', (e) => { 20228 e.preventDefault(); 20229 this.#toggle(content, textElement, button); 20230 }); 20231 }); 20232 }); 20233 } 20234 20235 #checkOverflow(content, textElement, button) { 20236 // Ensure collapsed state is applied 20237 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 20238 textElement.classList.add('text-read-more__text--collapsed'); 20239 } 20240 20241 // Get collapsed height first 20242 const collapsedHeight = content.scrollHeight; 20243 this.#collapsedHeight = collapsedHeight; 20244 20245 // Temporarily remove line-clamp to measure full height 20246 textElement.classList.remove('text-read-more__text--collapsed'); 20247 20248 // Force reflow 20249 void content.offsetHeight; 20250 20251 const fullHeight = content.scrollHeight; 20252 20253 // Restore line-clamp 20254 textElement.classList.add('text-read-more__text--collapsed'); 20255 20256 // Show button if content exceeds 2 lines (with small threshold for rounding) 20257 if (fullHeight > collapsedHeight + 5) { 20258 button.removeAttribute('hidden'); 20259 } else { 20260 button.setAttribute('hidden', ''); 20261 } 20262 } 20263 20264 #toggle(content, textElement, button) { 20265 const startHeight = content.offsetHeight; 20266 let endHeight; 20267 20268 if (!this.#expanded) { 20269 // Expanding 20270 textElement.classList.remove('text-read-more__text--collapsed'); 20271 endHeight = content.scrollHeight; 20272 this.#expanded = true; 20273 } else { 20274 // Collapsing 20275 endHeight = this.#collapsedHeight; 20276 this.#expanded = false; 20277 } 20278 20279 this.dataset.expanded = this.#expanded; 20280 button.setAttribute('aria-expanded', this.#expanded); 20281 20282 // Animate 20283 content.style.overflow = 'hidden'; 20284 this.#animation?.cancel(); 20285 20286 this.#animation = content.animate( 20287 { 20288 height: [`${startHeight}px`, `${endHeight}px`], 20289 }, 20290 { 20291 duration: 300, 20292 easing: 'ease-in-out', 20293 } 20294 ); 20295 20296 this.#animation.onfinish = () => { 20297 if (this.#expanded) { 20298 content.style.removeProperty('height'); 20299 content.style.overflow = ''; 20300 } else { 20301 textElement.classList.add('text-read-more__text--collapsed'); 20302 content.style.removeProperty('height'); 20303 content.style.overflow = ''; 20304 } 20305 }; 20306 } 20307 } 20308 20309 if (!customElements.get('text-read-more-wrapper')) { 20310 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 20311 } 20312</script>
20312 20313 20314 20315 20316</div> 20317 20318 20319 20320 20321 20322 20323 </div> 20324 </div> 20325</div> 20326 20327 20328 20329 20330 20331 20332 </div> 20333 20334 20335</slideshow-slide> 20336 20337 20338 <slideshow-slide 20339 ref="slides[]" 20340 aria-hidden="true" 20341 style="--slideshow-timeline: --slide-3; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 20342 20343 class="resource-list__slide" 20344 20345 20346 20347 20348 20349 20350 20351> 20352 20353 20354 20355 <div 20356 class="resource-list__item" 20357 20358 style="--collection-card-reveal-delay: 300ms;" 20359 20360 > 20361 20362 20363 20364 20365 20366 20367 20368 20369<style data-shopify> 20370 20371</style> 20372 20373 20374 20375<div 20376 class=" 20377 collection-card 20378 border-style 20379 20380 20381 20382 20383 " 20384 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-3" 20385 20386 style=" 20387 --border-width: 1px; --border-style: none; --border-color: 20388rgb(var(--color-border-rgb) / 1.0); --border-radius: 203890px; 20390 20391 --horizontal-alignment: center; 20392 --vertical-alignment: center; 20393 --background-overlay-color: ; 20394 --gap: 12px; 20395 "> 20396 <a 20397 class="collection-card__link" 20398 20399 href="/collections/natural" 20400 20401 > 20402 <span class="visually-hidden">Natural</span> 20403 </a> 20404 <div class="collection-card__inner"> 20405 20406 20407 20408 20409 20410 20411 20412<style data-shopify> 20413 20414 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-3"] { 20415 --ratio: 1 / 1; 20416 } 20417 20418 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-3"] .collection-card__image { 20419 width: 110px; 20420 height: 110px; 20421 aspect-ratio: unset; 20422 flex-shrink: 0; 20423 } 20424 20425 20426</style> 20427 20428 20429 <div 20430 class=" 20431 image-block 20432 resource-image 20433 resource-image--swatch 20434 20435 collection-card__image 20436 20437 spacing-style border-style 20438 20439 " 20440 style="--border-width: 1px; --border-style: none; --border-color: 20441rgb(var(--color-border-rgb) / 1.0); --border-radius: 204420px; 20443" 20444 20445 > 20446 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832745-78176900.png?v=1770114893&width=220" alt="Natural" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832745-78176900.png?v=1770114893&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832745-78176900.png?v=1770114893&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 20447 20448 </div> 20449 20450 20451 20452 20453 20454 20455 20456 20457 <div class="collection-card__content layout-panel-flex--column"> 20458 20459 20460 20461 20462 20463<div class="collection-title-wrapper"> 20464 20465 20466 20467 20468 20469 20470 20471 20472 20473 20474 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-3 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 20475 <p>Natural</p> 20476 </div> 20477 20478 20479 20480 20481
20482<script type="module"> 20483 class TextReadMoreWrapper extends HTMLElement { 20484 #expanded = false; 20485 #animation = null; 20486 #collapsedHeight = 0; 20487 20488 connectedCallback() { 20489 const content = this.querySelector('.text-read-more__content'); 20490 const textElement = this.querySelector('.text-read-more__text'); 20491 const button = this.querySelector('.text-read-more__button'); 20492 20493 if (!content || !textElement || !button) return; 20494 20495 // Set initial state 20496 this.dataset.expanded = 'false'; 20497 20498 // Wait for content to render - use double RAF to ensure layout is complete 20499 requestAnimationFrame(() => { 20500 requestAnimationFrame(() => { 20501 // Additional small delay to ensure fonts and styles are applied 20502 setTimeout(() => { 20503 this.#checkOverflow(content, textElement, button); 20504 }, 50); 20505 20506 // Recheck on resize 20507 const resizeObserver = new ResizeObserver(() => { 20508 if (!this.#expanded) { 20509 this.#checkOverflow(content, textElement, button); 20510 } 20511 }); 20512 resizeObserver.observe(content); 20513 20514 // Setup button click handler 20515 button.addEventListener('click', (e) => { 20516 e.preventDefault(); 20517 this.#toggle(content, textElement, button); 20518 }); 20519 }); 20520 }); 20521 } 20522 20523 #checkOverflow(content, textElement, button) { 20524 // Ensure collapsed state is applied 20525 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 20526 textElement.classList.add('text-read-more__text--collapsed'); 20527 } 20528 20529 // Get collapsed height first 20530 const collapsedHeight = content.scrollHeight; 20531 this.#collapsedHeight = collapsedHeight; 20532 20533 // Temporarily remove line-clamp to measure full height 20534 textElement.classList.remove('text-read-more__text--collapsed'); 20535 20536 // Force reflow 20537 void content.offsetHeight; 20538 20539 const fullHeight = content.scrollHeight; 20540 20541 // Restore line-clamp 20542 textElement.classList.add('text-read-more__text--collapsed'); 20543 20544 // Show button if content exceeds 2 lines (with small threshold for rounding) 20545 if (fullHeight > collapsedHeight + 5) { 20546 button.removeAttribute('hidden'); 20547 } else { 20548 button.setAttribute('hidden', ''); 20549 } 20550 } 20551 20552 #toggle(content, textElement, button) { 20553 const startHeight = content.offsetHeight; 20554 let endHeight; 20555 20556 if (!this.#expanded) { 20557 // Expanding 20558 textElement.classList.remove('text-read-more__text--collapsed'); 20559 endHeight = content.scrollHeight; 20560 this.#expanded = true; 20561 } else { 20562 // Collapsing 20563 endHeight = this.#collapsedHeight; 20564 this.#expanded = false; 20565 } 20566 20567 this.dataset.expanded = this.#expanded; 20568 button.setAttribute('aria-expanded', this.#expanded); 20569 20570 // Animate 20571 content.style.overflow = 'hidden'; 20572 this.#animation?.cancel(); 20573 20574 this.#animation = content.animate( 20575 { 20576 height: [`${startHeight}px`, `${endHeight}px`], 20577 }, 20578 { 20579 duration: 300, 20580 easing: 'ease-in-out', 20581 } 20582 ); 20583 20584 this.#animation.onfinish = () => { 20585 if (this.#expanded) { 20586 content.style.removeProperty('height'); 20587 content.style.overflow = ''; 20588 } else { 20589 textElement.classList.add('text-read-more__text--collapsed'); 20590 content.style.removeProperty('height'); 20591 content.style.overflow = ''; 20592 } 20593 }; 20594 } 20595 } 20596 20597 if (!customElements.get('text-read-more-wrapper')) { 20598 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 20599 } 20600</script>
20600 20601 20602 20603 20604</div> 20605 20606 20607 20608 20609 20610 20611 </div> 20612 </div> 20613</div> 20614 20615 20616 20617 20618 20619 20620 </div> 20621 20622 20623</slideshow-slide> 20624 20625 20626 <slideshow-slide 20627 ref="slides[]" 20628 aria-hidden="true" 20629 style="--slideshow-timeline: --slide-4; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 20630 20631 class="resource-list__slide" 20632 20633 20634 20635 20636 20637 20638 20639> 20640 20641 20642 20643 <div 20644 class="resource-list__item" 20645 20646 style="--collection-card-reveal-delay: 400ms;" 20647 20648 > 20649 20650 20651 20652 20653 20654 20655 20656 20657<style data-shopify> 20658 20659</style> 20660 20661 20662 20663<div 20664 class=" 20665 collection-card 20666 border-style 20667 20668 20669 20670 20671 " 20672 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-4" 20673 20674 style=" 20675 --border-width: 1px; --border-style: none; --border-color: 20676rgb(var(--color-border-rgb) / 1.0); --border-radius: 206770px; 20678 20679 --horizontal-alignment: center; 20680 --vertical-alignment: center; 20681 --background-overlay-color: ; 20682 --gap: 12px; 20683 "> 20684 <a 20685 class="collection-card__link" 20686 20687 href="/collections/purple" 20688 20689 > 20690 <span class="visually-hidden">Purple</span> 20691 </a> 20692 <div class="collection-card__inner"> 20693 20694 20695 20696 20697 20698 20699 20700<style data-shopify> 20701 20702 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-4"] { 20703 --ratio: 1 / 1; 20704 } 20705 20706 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-4"] .collection-card__image { 20707 width: 110px; 20708 height: 110px; 20709 aspect-ratio: unset; 20710 flex-shrink: 0; 20711 } 20712 20713 20714</style> 20715 20716 20717 <div 20718 class=" 20719 image-block 20720 resource-image 20721 resource-image--swatch 20722 20723 collection-card__image 20724 20725 spacing-style border-style 20726 20727 " 20728 style="--border-width: 1px; --border-style: none; --border-color: 20729rgb(var(--color-border-rgb) / 1.0); --border-radius: 207300px; 20731" 20732 20733 > 20734 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832750-05508400.png?v=1770114916&width=220" alt="Purple" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832750-05508400.png?v=1770114916&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832750-05508400.png?v=1770114916&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 20735 20736 </div> 20737 20738 20739 20740 20741 20742 20743 20744 20745 <div class="collection-card__content layout-panel-flex--column"> 20746 20747 20748 20749 20750 20751<div class="collection-title-wrapper"> 20752 20753 20754 20755 20756 20757 20758 20759 20760 20761 20762 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-4 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 20763 <p>Purple</p> 20764 </div> 20765 20766 20767 20768 20769
20770<script type="module"> 20771 class TextReadMoreWrapper extends HTMLElement { 20772 #expanded = false; 20773 #animation = null; 20774 #collapsedHeight = 0; 20775 20776 connectedCallback() { 20777 const content = this.querySelector('.text-read-more__content'); 20778 const textElement = this.querySelector('.text-read-more__text'); 20779 const button = this.querySelector('.text-read-more__button'); 20780 20781 if (!content || !textElement || !button) return; 20782 20783 // Set initial state 20784 this.dataset.expanded = 'false'; 20785 20786 // Wait for content to render - use double RAF to ensure layout is complete 20787 requestAnimationFrame(() => { 20788 requestAnimationFrame(() => { 20789 // Additional small delay to ensure fonts and styles are applied 20790 setTimeout(() => { 20791 this.#checkOverflow(content, textElement, button); 20792 }, 50); 20793 20794 // Recheck on resize 20795 const resizeObserver = new ResizeObserver(() => { 20796 if (!this.#expanded) { 20797 this.#checkOverflow(content, textElement, button); 20798 } 20799 }); 20800 resizeObserver.observe(content); 20801 20802 // Setup button click handler 20803 button.addEventListener('click', (e) => { 20804 e.preventDefault(); 20805 this.#toggle(content, textElement, button); 20806 }); 20807 }); 20808 }); 20809 } 20810 20811 #checkOverflow(content, textElement, button) { 20812 // Ensure collapsed state is applied 20813 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 20814 textElement.classList.add('text-read-more__text--collapsed'); 20815 } 20816 20817 // Get collapsed height first 20818 const collapsedHeight = content.scrollHeight; 20819 this.#collapsedHeight = collapsedHeight; 20820 20821 // Temporarily remove line-clamp to measure full height 20822 textElement.classList.remove('text-read-more__text--collapsed'); 20823 20824 // Force reflow 20825 void content.offsetHeight; 20826 20827 const fullHeight = content.scrollHeight; 20828 20829 // Restore line-clamp 20830 textElement.classList.add('text-read-more__text--collapsed'); 20831 20832 // Show button if content exceeds 2 lines (with small threshold for rounding) 20833 if (fullHeight > collapsedHeight + 5) { 20834 button.removeAttribute('hidden'); 20835 } else { 20836 button.setAttribute('hidden', ''); 20837 } 20838 } 20839 20840 #toggle(content, textElement, button) { 20841 const startHeight = content.offsetHeight; 20842 let endHeight; 20843 20844 if (!this.#expanded) { 20845 // Expanding 20846 textElement.classList.remove('text-read-more__text--collapsed'); 20847 endHeight = content.scrollHeight; 20848 this.#expanded = true; 20849 } else { 20850 // Collapsing 20851 endHeight = this.#collapsedHeight; 20852 this.#expanded = false; 20853 } 20854 20855 this.dataset.expanded = this.#expanded; 20856 button.setAttribute('aria-expanded', this.#expanded); 20857 20858 // Animate 20859 content.style.overflow = 'hidden'; 20860 this.#animation?.cancel(); 20861 20862 this.#animation = content.animate( 20863 { 20864 height: [`${startHeight}px`, `${endHeight}px`], 20865 }, 20866 { 20867 duration: 300, 20868 easing: 'ease-in-out', 20869 } 20870 ); 20871 20872 this.#animation.onfinish = () => { 20873 if (this.#expanded) { 20874 content.style.removeProperty('height'); 20875 content.style.overflow = ''; 20876 } else { 20877 textElement.classList.add('text-read-more__text--collapsed'); 20878 content.style.removeProperty('height'); 20879 content.style.overflow = ''; 20880 } 20881 }; 20882 } 20883 } 20884 20885 if (!customElements.get('text-read-more-wrapper')) { 20886 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 20887 } 20888</script>
20888 20889 20890 20891 20892</div> 20893 20894 20895 20896 20897 20898 20899 </div> 20900 </div> 20901</div> 20902 20903 20904 20905 20906 20907 20908 </div> 20909 20910 20911</slideshow-slide> 20912 20913 20914 <slideshow-slide 20915 ref="slides[]" 20916 aria-hidden="true" 20917 style="--slideshow-timeline: --slide-5; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 20918 20919 class="resource-list__slide" 20920 20921 20922 20923 20924 20925 20926 20927> 20928 20929 20930 20931 <div 20932 class="resource-list__item" 20933 20934 style="--collection-card-reveal-delay: 500ms;" 20935 20936 > 20937 20938 20939 20940 20941 20942 20943 20944 20945<style data-shopify> 20946 20947</style> 20948 20949 20950 20951<div 20952 class=" 20953 collection-card 20954 border-style 20955 20956 20957 20958 20959 " 20960 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-5" 20961 20962 style=" 20963 --border-width: 1px; --border-style: none; --border-color: 20964rgb(var(--color-border-rgb) / 1.0); --border-radius: 209650px; 20966 20967 --horizontal-alignment: center; 20968 --vertical-alignment: center; 20969 --background-overlay-color: ; 20970 --gap: 12px; 20971 "> 20972 <a 20973 class="collection-card__link" 20974 20975 href="/collections/silver" 20976 20977 > 20978 <span class="visually-hidden">Silver</span> 20979 </a> 20980 <div class="collection-card__inner"> 20981 20982 20983 20984 20985 20986 20987 20988<style data-shopify> 20989 20990 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-5"] { 20991 --ratio: 1 / 1; 20992 } 20993 20994 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-5"] .collection-card__image { 20995 width: 110px; 20996 height: 110px; 20997 aspect-ratio: unset; 20998 flex-shrink: 0; 20999 } 21000 21001 21002</style> 21003 21004 21005 <div 21006 class=" 21007 image-block 21008 resource-image 21009 resource-image--swatch 21010 21011 collection-card__image 21012 21013 spacing-style border-style 21014 21015 " 21016 style="--border-width: 1px; --border-style: none; --border-color: 21017rgb(var(--color-border-rgb) / 1.0); --border-radius: 210180px; 21019" 21020 21021 > 21022 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832755-99924400.png?v=1770115016&width=220" alt="Silver" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832755-99924400.png?v=1770115016&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832755-99924400.png?v=1770115016&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 21023 21024 </div> 21025 21026 21027 21028 21029 21030 21031 21032 21033 <div class="collection-card__content layout-panel-flex--column"> 21034 21035 21036 21037 21038 21039<div class="collection-title-wrapper"> 21040 21041 21042 21043 21044 21045 21046 21047 21048 21049 21050 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-5 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 21051 <p>Silver</p> 21052 </div> 21053 21054 21055 21056 21057
21058<script type="module"> 21059 class TextReadMoreWrapper extends HTMLElement { 21060 #expanded = false; 21061 #animation = null; 21062 #collapsedHeight = 0; 21063 21064 connectedCallback() { 21065 const content = this.querySelector('.text-read-more__content'); 21066 const textElement = this.querySelector('.text-read-more__text'); 21067 const button = this.querySelector('.text-read-more__button'); 21068 21069 if (!content || !textElement || !button) return; 21070 21071 // Set initial state 21072 this.dataset.expanded = 'false'; 21073 21074 // Wait for content to render - use double RAF to ensure layout is complete 21075 requestAnimationFrame(() => { 21076 requestAnimationFrame(() => { 21077 // Additional small delay to ensure fonts and styles are applied 21078 setTimeout(() => { 21079 this.#checkOverflow(content, textElement, button); 21080 }, 50); 21081 21082 // Recheck on resize 21083 const resizeObserver = new ResizeObserver(() => { 21084 if (!this.#expanded) { 21085 this.#checkOverflow(content, textElement, button); 21086 } 21087 }); 21088 resizeObserver.observe(content); 21089 21090 // Setup button click handler 21091 button.addEventListener('click', (e) => { 21092 e.preventDefault(); 21093 this.#toggle(content, textElement, button); 21094 }); 21095 }); 21096 }); 21097 } 21098 21099 #checkOverflow(content, textElement, button) { 21100 // Ensure collapsed state is applied 21101 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 21102 textElement.classList.add('text-read-more__text--collapsed'); 21103 } 21104 21105 // Get collapsed height first 21106 const collapsedHeight = content.scrollHeight; 21107 this.#collapsedHeight = collapsedHeight; 21108 21109 // Temporarily remove line-clamp to measure full height 21110 textElement.classList.remove('text-read-more__text--collapsed'); 21111 21112 // Force reflow 21113 void content.offsetHeight; 21114 21115 const fullHeight = content.scrollHeight; 21116 21117 // Restore line-clamp 21118 textElement.classList.add('text-read-more__text--collapsed'); 21119 21120 // Show button if content exceeds 2 lines (with small threshold for rounding) 21121 if (fullHeight > collapsedHeight + 5) { 21122 button.removeAttribute('hidden'); 21123 } else { 21124 button.setAttribute('hidden', ''); 21125 } 21126 } 21127 21128 #toggle(content, textElement, button) { 21129 const startHeight = content.offsetHeight; 21130 let endHeight; 21131 21132 if (!this.#expanded) { 21133 // Expanding 21134 textElement.classList.remove('text-read-more__text--collapsed'); 21135 endHeight = content.scrollHeight; 21136 this.#expanded = true; 21137 } else { 21138 // Collapsing 21139 endHeight = this.#collapsedHeight; 21140 this.#expanded = false; 21141 } 21142 21143 this.dataset.expanded = this.#expanded; 21144 button.setAttribute('aria-expanded', this.#expanded); 21145 21146 // Animate 21147 content.style.overflow = 'hidden'; 21148 this.#animation?.cancel(); 21149 21150 this.#animation = content.animate( 21151 { 21152 height: [`${startHeight}px`, `${endHeight}px`], 21153 }, 21154 { 21155 duration: 300, 21156 easing: 'ease-in-out', 21157 } 21158 ); 21159 21160 this.#animation.onfinish = () => { 21161 if (this.#expanded) { 21162 content.style.removeProperty('height'); 21163 content.style.overflow = ''; 21164 } else { 21165 textElement.classList.add('text-read-more__text--collapsed'); 21166 content.style.removeProperty('height'); 21167 content.style.overflow = ''; 21168 } 21169 }; 21170 } 21171 } 21172 21173 if (!customElements.get('text-read-more-wrapper')) { 21174 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 21175 } 21176</script>
21176 21177 21178 21179 21180</div> 21181 21182 21183 21184 21185 21186 21187 </div> 21188 </div> 21189</div> 21190 21191 21192 21193 21194 21195 21196 </div> 21197 21198 21199</slideshow-slide> 21200 21201 21202 <slideshow-slide 21203 ref="slides[]" 21204 aria-hidden="true" 21205 style="--slideshow-timeline: --slide-6; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 21206 21207 class="resource-list__slide" 21208 21209 21210 21211 21212 21213 21214 21215> 21216 21217 21218 21219 <div 21220 class="resource-list__item" 21221 21222 style="--collection-card-reveal-delay: 600ms;" 21223 21224 > 21225 21226 21227 21228 21229 21230 21231 21232 21233<style data-shopify> 21234 21235</style> 21236 21237 21238 21239<div 21240 class=" 21241 collection-card 21242 border-style 21243 21244 21245 21246 21247 " 21248 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-6" 21249 21250 style=" 21251 --border-width: 1px; --border-style: none; --border-color: 21252rgb(var(--color-border-rgb) / 1.0); --border-radius: 212530px; 21254 21255 --horizontal-alignment: center; 21256 --vertical-alignment: center; 21257 --background-overlay-color: ; 21258 --gap: 12px; 21259 "> 21260 <a 21261 class="collection-card__link" 21262 21263 href="/collections/yellow" 21264 21265 > 21266 <span class="visually-hidden">Yellow</span> 21267 </a> 21268 <div class="collection-card__inner"> 21269 21270 21271 21272 21273 21274 21275 21276<style data-shopify> 21277 21278 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-6"] { 21279 --ratio: 1 / 1; 21280 } 21281 21282 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-6"] .collection-card__image { 21283 width: 110px; 21284 height: 110px; 21285 aspect-ratio: unset; 21286 flex-shrink: 0; 21287 } 21288 21289 21290</style> 21291 21292 21293 <div 21294 class=" 21295 image-block 21296 resource-image 21297 resource-image--swatch 21298 21299 collection-card__image 21300 21301 spacing-style border-style 21302 21303 " 21304 style="--border-width: 1px; --border-style: none; --border-color: 21305rgb(var(--color-border-rgb) / 1.0); --border-radius: 213060px; 21307" 21308 21309 > 21310 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832782-80810400_31cc1f5a-0d37-4e7f-b589-1674fb222b9a.png?v=1770118697&width=220" alt="Yellow" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832782-80810400_31cc1f5a-0d37-4e7f-b589-1674fb222b9a.png?v=1770118697&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832782-80810400_31cc1f5a-0d37-4e7f-b589-1674fb222b9a.png?v=1770118697&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 21311 21312 </div> 21313 21314 21315 21316 21317 21318 21319 21320 21321 <div class="collection-card__content layout-panel-flex--column"> 21322 21323 21324 21325 21326 21327<div class="collection-title-wrapper"> 21328 21329 21330 21331 21332 21333 21334 21335 21336 21337 21338 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-6 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 21339 <p>Yellow</p> 21340 </div> 21341 21342 21343 21344 21345
21346<script type="module"> 21347 class TextReadMoreWrapper extends HTMLElement { 21348 #expanded = false; 21349 #animation = null; 21350 #collapsedHeight = 0; 21351 21352 connectedCallback() { 21353 const content = this.querySelector('.text-read-more__content'); 21354 const textElement = this.querySelector('.text-read-more__text'); 21355 const button = this.querySelector('.text-read-more__button'); 21356 21357 if (!content || !textElement || !button) return; 21358 21359 // Set initial state 21360 this.dataset.expanded = 'false'; 21361 21362 // Wait for content to render - use double RAF to ensure layout is complete 21363 requestAnimationFrame(() => { 21364 requestAnimationFrame(() => { 21365 // Additional small delay to ensure fonts and styles are applied 21366 setTimeout(() => { 21367 this.#checkOverflow(content, textElement, button); 21368 }, 50); 21369 21370 // Recheck on resize 21371 const resizeObserver = new ResizeObserver(() => { 21372 if (!this.#expanded) { 21373 this.#checkOverflow(content, textElement, button); 21374 } 21375 }); 21376 resizeObserver.observe(content); 21377 21378 // Setup button click handler 21379 button.addEventListener('click', (e) => { 21380 e.preventDefault(); 21381 this.#toggle(content, textElement, button); 21382 }); 21383 }); 21384 }); 21385 } 21386 21387 #checkOverflow(content, textElement, button) { 21388 // Ensure collapsed state is applied 21389 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 21390 textElement.classList.add('text-read-more__text--collapsed'); 21391 } 21392 21393 // Get collapsed height first 21394 const collapsedHeight = content.scrollHeight; 21395 this.#collapsedHeight = collapsedHeight; 21396 21397 // Temporarily remove line-clamp to measure full height 21398 textElement.classList.remove('text-read-more__text--collapsed'); 21399 21400 // Force reflow 21401 void content.offsetHeight; 21402 21403 const fullHeight = content.scrollHeight; 21404 21405 // Restore line-clamp 21406 textElement.classList.add('text-read-more__text--collapsed'); 21407 21408 // Show button if content exceeds 2 lines (with small threshold for rounding) 21409 if (fullHeight > collapsedHeight + 5) { 21410 button.removeAttribute('hidden'); 21411 } else { 21412 button.setAttribute('hidden', ''); 21413 } 21414 } 21415 21416 #toggle(content, textElement, button) { 21417 const startHeight = content.offsetHeight; 21418 let endHeight; 21419 21420 if (!this.#expanded) { 21421 // Expanding 21422 textElement.classList.remove('text-read-more__text--collapsed'); 21423 endHeight = content.scrollHeight; 21424 this.#expanded = true; 21425 } else { 21426 // Collapsing 21427 endHeight = this.#collapsedHeight; 21428 this.#expanded = false; 21429 } 21430 21431 this.dataset.expanded = this.#expanded; 21432 button.setAttribute('aria-expanded', this.#expanded); 21433 21434 // Animate 21435 content.style.overflow = 'hidden'; 21436 this.#animation?.cancel(); 21437 21438 this.#animation = content.animate( 21439 { 21440 height: [`${startHeight}px`, `${endHeight}px`], 21441 }, 21442 { 21443 duration: 300, 21444 easing: 'ease-in-out', 21445 } 21446 ); 21447 21448 this.#animation.onfinish = () => { 21449 if (this.#expanded) { 21450 content.style.removeProperty('height'); 21451 content.style.overflow = ''; 21452 } else { 21453 textElement.classList.add('text-read-more__text--collapsed'); 21454 content.style.removeProperty('height'); 21455 content.style.overflow = ''; 21456 } 21457 }; 21458 } 21459 } 21460 21461 if (!customElements.get('text-read-more-wrapper')) { 21462 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 21463 } 21464</script>
21464 21465 21466 21467 21468</div> 21469 21470 21471 21472 21473 21474 21475 </div> 21476 </div> 21477</div> 21478 21479 21480 21481 21482 21483 21484 </div> 21485 21486 21487</slideshow-slide> 21488 21489 21490 <slideshow-slide 21491 ref="slides[]" 21492 aria-hidden="true" 21493 style="--slideshow-timeline: --slide-7; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 21494 21495 class="resource-list__slide" 21496 21497 21498 21499 21500 21501 21502 21503> 21504 21505 21506 21507 <div 21508 class="resource-list__item" 21509 21510 style="--collection-card-reveal-delay: 700ms;" 21511 21512 > 21513 21514 21515 21516 21517 21518 21519 21520 21521<style data-shopify> 21522 21523</style> 21524 21525 21526 21527<div 21528 class=" 21529 collection-card 21530 border-style 21531 21532 21533 21534 21535 " 21536 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-7" 21537 21538 style=" 21539 --border-width: 1px; --border-style: none; --border-color: 21540rgb(var(--color-border-rgb) / 1.0); --border-radius: 215410px; 21542 21543 --horizontal-alignment: center; 21544 --vertical-alignment: center; 21545 --background-overlay-color: ; 21546 --gap: 12px; 21547 "> 21548 <a 21549 class="collection-card__link" 21550 21551 href="/collections/orange-copy" 21552 21553 > 21554 <span class="visually-hidden">Pink</span> 21555 </a> 21556 <div class="collection-card__inner"> 21557 21558 21559 21560 21561 21562 21563 21564<style data-shopify> 21565 21566 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-7"] { 21567 --ratio: 1 / 1; 21568 } 21569 21570 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-7"] .collection-card__image { 21571 width: 110px; 21572 height: 110px; 21573 aspect-ratio: unset; 21574 flex-shrink: 0; 21575 } 21576 21577 21578</style> 21579 21580 21581 <div 21582 class=" 21583 image-block 21584 resource-image 21585 resource-image--swatch 21586 21587 collection-card__image 21588 21589 spacing-style border-style 21590 21591 " 21592 style="--border-width: 1px; --border-style: none; --border-color: 21593rgb(var(--color-border-rgb) / 1.0); --border-radius: 215940px; 21595" 21596 21597 > 21598 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832774-62067100.png?v=1770114752&width=220" alt="Pink" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832774-62067100.png?v=1770114752&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832774-62067100.png?v=1770114752&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 21599 21600 </div> 21601 21602 21603 21604 21605 21606 21607 21608 21609 <div class="collection-card__content layout-panel-flex--column"> 21610 21611 21612 21613 21614 21615<div class="collection-title-wrapper"> 21616 21617 21618 21619 21620 21621 21622 21623 21624 21625 21626 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-7 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 21627 <p>Pink</p> 21628 </div> 21629 21630 21631 21632 21633
21634<script type="module"> 21635 class TextReadMoreWrapper extends HTMLElement { 21636 #expanded = false; 21637 #animation = null; 21638 #collapsedHeight = 0; 21639 21640 connectedCallback() { 21641 const content = this.querySelector('.text-read-more__content'); 21642 const textElement = this.querySelector('.text-read-more__text'); 21643 const button = this.querySelector('.text-read-more__button'); 21644 21645 if (!content || !textElement || !button) return; 21646 21647 // Set initial state 21648 this.dataset.expanded = 'false'; 21649 21650 // Wait for content to render - use double RAF to ensure layout is complete 21651 requestAnimationFrame(() => { 21652 requestAnimationFrame(() => { 21653 // Additional small delay to ensure fonts and styles are applied 21654 setTimeout(() => { 21655 this.#checkOverflow(content, textElement, button); 21656 }, 50); 21657 21658 // Recheck on resize 21659 const resizeObserver = new ResizeObserver(() => { 21660 if (!this.#expanded) { 21661 this.#checkOverflow(content, textElement, button); 21662 } 21663 }); 21664 resizeObserver.observe(content); 21665 21666 // Setup button click handler 21667 button.addEventListener('click', (e) => { 21668 e.preventDefault(); 21669 this.#toggle(content, textElement, button); 21670 }); 21671 }); 21672 }); 21673 } 21674 21675 #checkOverflow(content, textElement, button) { 21676 // Ensure collapsed state is applied 21677 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 21678 textElement.classList.add('text-read-more__text--collapsed'); 21679 } 21680 21681 // Get collapsed height first 21682 const collapsedHeight = content.scrollHeight; 21683 this.#collapsedHeight = collapsedHeight; 21684 21685 // Temporarily remove line-clamp to measure full height 21686 textElement.classList.remove('text-read-more__text--collapsed'); 21687 21688 // Force reflow 21689 void content.offsetHeight; 21690 21691 const fullHeight = content.scrollHeight; 21692 21693 // Restore line-clamp 21694 textElement.classList.add('text-read-more__text--collapsed'); 21695 21696 // Show button if content exceeds 2 lines (with small threshold for rounding) 21697 if (fullHeight > collapsedHeight + 5) { 21698 button.removeAttribute('hidden'); 21699 } else { 21700 button.setAttribute('hidden', ''); 21701 } 21702 } 21703 21704 #toggle(content, textElement, button) { 21705 const startHeight = content.offsetHeight; 21706 let endHeight; 21707 21708 if (!this.#expanded) { 21709 // Expanding 21710 textElement.classList.remove('text-read-more__text--collapsed'); 21711 endHeight = content.scrollHeight; 21712 this.#expanded = true; 21713 } else { 21714 // Collapsing 21715 endHeight = this.#collapsedHeight; 21716 this.#expanded = false; 21717 } 21718 21719 this.dataset.expanded = this.#expanded; 21720 button.setAttribute('aria-expanded', this.#expanded); 21721 21722 // Animate 21723 content.style.overflow = 'hidden'; 21724 this.#animation?.cancel(); 21725 21726 this.#animation = content.animate( 21727 { 21728 height: [`${startHeight}px`, `${endHeight}px`], 21729 }, 21730 { 21731 duration: 300, 21732 easing: 'ease-in-out', 21733 } 21734 ); 21735 21736 this.#animation.onfinish = () => { 21737 if (this.#expanded) { 21738 content.style.removeProperty('height'); 21739 content.style.overflow = ''; 21740 } else { 21741 textElement.classList.add('text-read-more__text--collapsed'); 21742 content.style.removeProperty('height'); 21743 content.style.overflow = ''; 21744 } 21745 }; 21746 } 21747 } 21748 21749 if (!customElements.get('text-read-more-wrapper')) { 21750 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 21751 } 21752</script>
21752 21753 21754 21755 21756</div> 21757 21758 21759 21760 21761 21762 21763 </div> 21764 </div> 21765</div> 21766 21767 21768 21769 21770 21771 21772 </div> 21773 21774 21775</slideshow-slide> 21776 21777 21778 <slideshow-slide 21779 ref="slides[]" 21780 aria-hidden="true" 21781 style="--slideshow-timeline: --slide-8; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 21782 21783 class="resource-list__slide" 21784 21785 21786 21787 21788 21789 21790 21791> 21792 21793 21794 21795 <div 21796 class="resource-list__item" 21797 21798 style="--collection-card-reveal-delay: 800ms;" 21799 21800 > 21801 21802 21803 21804 21805 21806 21807 21808 21809<style data-shopify> 21810 21811</style> 21812 21813 21814 21815<div 21816 class=" 21817 collection-card 21818 border-style 21819 21820 21821 21822 21823 " 21824 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-8" 21825 21826 style=" 21827 --border-width: 1px; --border-style: none; --border-color: 21828rgb(var(--color-border-rgb) / 1.0); --border-radius: 218290px; 21830 21831 --horizontal-alignment: center; 21832 --vertical-alignment: center; 21833 --background-overlay-color: ; 21834 --gap: 12px; 21835 "> 21836 <a 21837 class="collection-card__link" 21838 21839 href="/collections/red-copy" 21840 21841 > 21842 <span class="visually-hidden">Nude</span> 21843 </a> 21844 <div class="collection-card__inner"> 21845 21846 21847 21848 21849 21850 21851 21852<style data-shopify> 21853 21854 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-8"] { 21855 --ratio: 1 / 1; 21856 } 21857 21858 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-8"] .collection-card__image { 21859 width: 110px; 21860 height: 110px; 21861 aspect-ratio: unset; 21862 flex-shrink: 0; 21863 } 21864 21865 21866</style> 21867 21868 21869 <div 21870 class=" 21871 image-block 21872 resource-image 21873 resource-image--swatch 21874 21875 collection-card__image 21876 21877 spacing-style border-style 21878 21879 " 21880 style="--border-width: 1px; --border-style: none; --border-color: 21881rgb(var(--color-border-rgb) / 1.0); --border-radius: 218820px; 21883" 21884 21885 > 21886 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832789-80164700.png?v=1770114563&width=220" alt="Nude" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832789-80164700.png?v=1770114563&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832789-80164700.png?v=1770114563&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 21887 21888 </div> 21889 21890 21891 21892 21893 21894 21895 21896 21897 <div class="collection-card__content layout-panel-flex--column"> 21898 21899 21900 21901 21902 21903<div class="collection-title-wrapper"> 21904 21905 21906 21907 21908 21909 21910 21911 21912 21913 21914 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-8 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 21915 <p>Nude</p> 21916 </div> 21917 21918 21919 21920 21921
21922<script type="module"> 21923 class TextReadMoreWrapper extends HTMLElement { 21924 #expanded = false; 21925 #animation = null; 21926 #collapsedHeight = 0; 21927 21928 connectedCallback() { 21929 const content = this.querySelector('.text-read-more__content'); 21930 const textElement = this.querySelector('.text-read-more__text'); 21931 const button = this.querySelector('.text-read-more__button'); 21932 21933 if (!content || !textElement || !button) return; 21934 21935 // Set initial state 21936 this.dataset.expanded = 'false'; 21937 21938 // Wait for content to render - use double RAF to ensure layout is complete 21939 requestAnimationFrame(() => { 21940 requestAnimationFrame(() => { 21941 // Additional small delay to ensure fonts and styles are applied 21942 setTimeout(() => { 21943 this.#checkOverflow(content, textElement, button); 21944 }, 50); 21945 21946 // Recheck on resize 21947 const resizeObserver = new ResizeObserver(() => { 21948 if (!this.#expanded) { 21949 this.#checkOverflow(content, textElement, button); 21950 } 21951 }); 21952 resizeObserver.observe(content); 21953 21954 // Setup button click handler 21955 button.addEventListener('click', (e) => { 21956 e.preventDefault(); 21957 this.#toggle(content, textElement, button); 21958 }); 21959 }); 21960 }); 21961 } 21962 21963 #checkOverflow(content, textElement, button) { 21964 // Ensure collapsed state is applied 21965 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 21966 textElement.classList.add('text-read-more__text--collapsed'); 21967 } 21968 21969 // Get collapsed height first 21970 const collapsedHeight = content.scrollHeight; 21971 this.#collapsedHeight = collapsedHeight; 21972 21973 // Temporarily remove line-clamp to measure full height 21974 textElement.classList.remove('text-read-more__text--collapsed'); 21975 21976 // Force reflow 21977 void content.offsetHeight; 21978 21979 const fullHeight = content.scrollHeight; 21980 21981 // Restore line-clamp 21982 textElement.classList.add('text-read-more__text--collapsed'); 21983 21984 // Show button if content exceeds 2 lines (with small threshold for rounding) 21985 if (fullHeight > collapsedHeight + 5) { 21986 button.removeAttribute('hidden'); 21987 } else { 21988 button.setAttribute('hidden', ''); 21989 } 21990 } 21991 21992 #toggle(content, textElement, button) { 21993 const startHeight = content.offsetHeight; 21994 let endHeight; 21995 21996 if (!this.#expanded) { 21997 // Expanding 21998 textElement.classList.remove('text-read-more__text--collapsed'); 21999 endHeight = content.scrollHeight; 22000 this.#expanded = true; 22001 } else { 22002 // Collapsing 22003 endHeight = this.#collapsedHeight; 22004 this.#expanded = false; 22005 } 22006 22007 this.dataset.expanded = this.#expanded; 22008 button.setAttribute('aria-expanded', this.#expanded); 22009 22010 // Animate 22011 content.style.overflow = 'hidden'; 22012 this.#animation?.cancel(); 22013 22014 this.#animation = content.animate( 22015 { 22016 height: [`${startHeight}px`, `${endHeight}px`], 22017 }, 22018 { 22019 duration: 300, 22020 easing: 'ease-in-out', 22021 } 22022 ); 22023 22024 this.#animation.onfinish = () => { 22025 if (this.#expanded) { 22026 content.style.removeProperty('height'); 22027 content.style.overflow = ''; 22028 } else { 22029 textElement.classList.add('text-read-more__text--collapsed'); 22030 content.style.removeProperty('height'); 22031 content.style.overflow = ''; 22032 } 22033 }; 22034 } 22035 } 22036 22037 if (!customElements.get('text-read-more-wrapper')) { 22038 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 22039 } 22040</script>
22040 22041 22042 22043 22044</div> 22045 22046 22047 22048 22049 22050 22051 </div> 22052 </div> 22053</div> 22054 22055 22056 22057 22058 22059 22060 </div> 22061 22062 22063</slideshow-slide> 22064 22065 22066 <slideshow-slide 22067 ref="slides[]" 22068 aria-hidden="true" 22069 style="--slideshow-timeline: --slide-9; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 22070 22071 class="resource-list__slide" 22072 22073 22074 22075 22076 22077 22078 22079> 22080 22081 22082 22083 <div 22084 class="resource-list__item" 22085 22086 style="--collection-card-reveal-delay: 900ms;" 22087 22088 > 22089 22090 22091 22092 22093 22094 22095 22096 22097<style data-shopify> 22098 22099</style> 22100 22101 22102 22103<div 22104 class=" 22105 collection-card 22106 border-style 22107 22108 22109 22110 22111 " 22112 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-9" 22113 22114 style=" 22115 --border-width: 1px; --border-style: none; --border-color: 22116rgb(var(--color-border-rgb) / 1.0); --border-radius: 221170px; 22118 22119 --horizontal-alignment: center; 22120 --vertical-alignment: center; 22121 --background-overlay-color: ; 22122 --gap: 12px; 22123 "> 22124 <a 22125 class="collection-card__link" 22126 22127 href="/collections/gold-copy" 22128 22129 > 22130 <span class="visually-hidden">Red</span> 22131 </a> 22132 <div class="collection-card__inner"> 22133 22134 22135 22136 22137 22138 22139 22140<style data-shopify> 22141 22142 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-9"] { 22143 --ratio: 1 / 1; 22144 } 22145 22146 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-9"] .collection-card__image { 22147 width: 110px; 22148 height: 110px; 22149 aspect-ratio: unset; 22150 flex-shrink: 0; 22151 } 22152 22153 22154</style> 22155 22156 22157 <div 22158 class=" 22159 image-block 22160 resource-image 22161 resource-image--swatch 22162 22163 collection-card__image 22164 22165 spacing-style border-style 22166 22167 " 22168 style="--border-width: 1px; --border-style: none; --border-color: 22169rgb(var(--color-border-rgb) / 1.0); --border-radius: 221700px; 22171" 22172 22173 > 22174 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832786-82595100.png?v=1770114537&width=220" alt="Red" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832786-82595100.png?v=1770114537&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832786-82595100.png?v=1770114537&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 22175 22176 </div> 22177 22178 22179 22180 22181 22182 22183 22184 22185 <div class="collection-card__content layout-panel-flex--column"> 22186 22187 22188 22189 22190 22191<div class="collection-title-wrapper"> 22192 22193 22194 22195 22196 22197 22198 22199 22200 22201 22202 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-9 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 22203 <p>Red</p> 22204 </div> 22205 22206 22207 22208 22209
22210<script type="module"> 22211 class TextReadMoreWrapper extends HTMLElement { 22212 #expanded = false; 22213 #animation = null; 22214 #collapsedHeight = 0; 22215 22216 connectedCallback() { 22217 const content = this.querySelector('.text-read-more__content'); 22218 const textElement = this.querySelector('.text-read-more__text'); 22219 const button = this.querySelector('.text-read-more__button'); 22220 22221 if (!content || !textElement || !button) return; 22222 22223 // Set initial state 22224 this.dataset.expanded = 'false'; 22225 22226 // Wait for content to render - use double RAF to ensure layout is complete 22227 requestAnimationFrame(() => { 22228 requestAnimationFrame(() => { 22229 // Additional small delay to ensure fonts and styles are applied 22230 setTimeout(() => { 22231 this.#checkOverflow(content, textElement, button); 22232 }, 50); 22233 22234 // Recheck on resize 22235 const resizeObserver = new ResizeObserver(() => { 22236 if (!this.#expanded) { 22237 this.#checkOverflow(content, textElement, button); 22238 } 22239 }); 22240 resizeObserver.observe(content); 22241 22242 // Setup button click handler 22243 button.addEventListener('click', (e) => { 22244 e.preventDefault(); 22245 this.#toggle(content, textElement, button); 22246 }); 22247 }); 22248 }); 22249 } 22250 22251 #checkOverflow(content, textElement, button) { 22252 // Ensure collapsed state is applied 22253 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 22254 textElement.classList.add('text-read-more__text--collapsed'); 22255 } 22256 22257 // Get collapsed height first 22258 const collapsedHeight = content.scrollHeight; 22259 this.#collapsedHeight = collapsedHeight; 22260 22261 // Temporarily remove line-clamp to measure full height 22262 textElement.classList.remove('text-read-more__text--collapsed'); 22263 22264 // Force reflow 22265 void content.offsetHeight; 22266 22267 const fullHeight = content.scrollHeight; 22268 22269 // Restore line-clamp 22270 textElement.classList.add('text-read-more__text--collapsed'); 22271 22272 // Show button if content exceeds 2 lines (with small threshold for rounding) 22273 if (fullHeight > collapsedHeight + 5) { 22274 button.removeAttribute('hidden'); 22275 } else { 22276 button.setAttribute('hidden', ''); 22277 } 22278 } 22279 22280 #toggle(content, textElement, button) { 22281 const startHeight = content.offsetHeight; 22282 let endHeight; 22283 22284 if (!this.#expanded) { 22285 // Expanding 22286 textElement.classList.remove('text-read-more__text--collapsed'); 22287 endHeight = content.scrollHeight; 22288 this.#expanded = true; 22289 } else { 22290 // Collapsing 22291 endHeight = this.#collapsedHeight; 22292 this.#expanded = false; 22293 } 22294 22295 this.dataset.expanded = this.#expanded; 22296 button.setAttribute('aria-expanded', this.#expanded); 22297 22298 // Animate 22299 content.style.overflow = 'hidden'; 22300 this.#animation?.cancel(); 22301 22302 this.#animation = content.animate( 22303 { 22304 height: [`${startHeight}px`, `${endHeight}px`], 22305 }, 22306 { 22307 duration: 300, 22308 easing: 'ease-in-out', 22309 } 22310 ); 22311 22312 this.#animation.onfinish = () => { 22313 if (this.#expanded) { 22314 content.style.removeProperty('height'); 22315 content.style.overflow = ''; 22316 } else { 22317 textElement.classList.add('text-read-more__text--collapsed'); 22318 content.style.removeProperty('height'); 22319 content.style.overflow = ''; 22320 } 22321 }; 22322 } 22323 } 22324 22325 if (!customElements.get('text-read-more-wrapper')) { 22326 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 22327 } 22328</script>
22328 22329 22330 22331 22332</div> 22333 22334 22335 22336 22337 22338 22339 </div> 22340 </div> 22341</div> 22342 22343 22344 22345 22346 22347 22348 </div> 22349 22350 22351</slideshow-slide> 22352 22353 22354 <slideshow-slide 22355 ref="slides[]" 22356 aria-hidden="true" 22357 style="--slideshow-timeline: --slide-10; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 22358 22359 class="resource-list__slide" 22360 22361 22362 22363 22364 22365 22366 22367> 22368 22369 22370 22371 <div 22372 class="resource-list__item" 22373 22374 style="--collection-card-reveal-delay: 1000ms;" 22375 22376 > 22377 22378 22379 22380 22381 22382 22383 22384 22385<style data-shopify> 22386 22387</style> 22388 22389 22390 22391<div 22392 class=" 22393 collection-card 22394 border-style 22395 22396 22397 22398 22399 " 22400 data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-10" 22401 22402 style=" 22403 --border-width: 1px; --border-style: none; --border-color: 22404rgb(var(--color-border-rgb) / 1.0); --border-radius: 224050px; 22406 22407 --horizontal-alignment: center; 22408 --vertical-alignment: center; 22409 --background-overlay-color: ; 22410 --gap: 12px; 22411 "> 22412 <a 22413 class="collection-card__link" 22414 22415 href="/collections/pink-copy" 22416 22417 > 22418 <span class="visually-hidden">Black</span> 22419 </a> 22420 <div class="collection-card__inner"> 22421 22422 22423 22424 22425 22426 22427 22428<style data-shopify> 22429 22430 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-10"] { 22431 --ratio: 1 / 1; 22432 } 22433 22434 .collection-card[data-block-id="AS1lXanF6Z216VmJDa__static-collection-card-10"] .collection-card__image { 22435 width: 110px; 22436 height: 110px; 22437 aspect-ratio: unset; 22438 flex-shrink: 0; 22439 } 22440 22441 22442</style> 22443 22444 22445 <div 22446 class=" 22447 image-block 22448 resource-image 22449 resource-image--swatch 22450 22451 collection-card__image 22452 22453 spacing-style border-style 22454 22455 " 22456 style="--border-width: 1px; --border-style: none; --border-color: 22457rgb(var(--color-border-rgb) / 1.0); --border-radius: 224580px; 22459" 22460 22461 > 22462 <img src="//www.tnbl.co.uk/cdn/shop/collections/1726832785-53381800.png?v=1770114156&width=220" alt="Black" srcset="//www.tnbl.co.uk/cdn/shop/collections/1726832785-53381800.png?v=1770114156&width=110 110w, //www.tnbl.co.uk/cdn/shop/collections/1726832785-53381800.png?v=1770114156&width=220 220w" width="220" height="220" loading="eager" class="image-block__image" sizes="110px"> 22463 22464 </div> 22465 22466 22467 22468 22469 22470 22471 22472 22473 <div class="collection-card__content layout-panel-flex--column"> 22474 22475 22476 22477 22478 22479<div class="collection-title-wrapper"> 22480 22481 22482 22483 22484 22485 22486 22487 22488 22489 22490 <div class=" spacing-style text-block text-block--AUnkvcXVrOU1BSFU3M__collection_title_QC3aEP-10 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 22491 <p>Black</p> 22492 </div> 22493 22494 22495 22496 22497
22498<script type="module"> 22499 class TextReadMoreWrapper extends HTMLElement { 22500 #expanded = false; 22501 #animation = null; 22502 #collapsedHeight = 0; 22503 22504 connectedCallback() { 22505 const content = this.querySelector('.text-read-more__content'); 22506 const textElement = this.querySelector('.text-read-more__text'); 22507 const button = this.querySelector('.text-read-more__button'); 22508 22509 if (!content || !textElement || !button) return; 22510 22511 // Set initial state 22512 this.dataset.expanded = 'false'; 22513 22514 // Wait for content to render - use double RAF to ensure layout is complete 22515 requestAnimationFrame(() => { 22516 requestAnimationFrame(() => { 22517 // Additional small delay to ensure fonts and styles are applied 22518 setTimeout(() => { 22519 this.#checkOverflow(content, textElement, button); 22520 }, 50); 22521 22522 // Recheck on resize 22523 const resizeObserver = new ResizeObserver(() => { 22524 if (!this.#expanded) { 22525 this.#checkOverflow(content, textElement, button); 22526 } 22527 }); 22528 resizeObserver.observe(content); 22529 22530 // Setup button click handler 22531 button.addEventListener('click', (e) => { 22532 e.preventDefault(); 22533 this.#toggle(content, textElement, button); 22534 }); 22535 }); 22536 }); 22537 } 22538 22539 #checkOverflow(content, textElement, button) { 22540 // Ensure collapsed state is applied 22541 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 22542 textElement.classList.add('text-read-more__text--collapsed'); 22543 } 22544 22545 // Get collapsed height first 22546 const collapsedHeight = content.scrollHeight; 22547 this.#collapsedHeight = collapsedHeight; 22548 22549 // Temporarily remove line-clamp to measure full height 22550 textElement.classList.remove('text-read-more__text--collapsed'); 22551 22552 // Force reflow 22553 void content.offsetHeight; 22554 22555 const fullHeight = content.scrollHeight; 22556 22557 // Restore line-clamp 22558 textElement.classList.add('text-read-more__text--collapsed'); 22559 22560 // Show button if content exceeds 2 lines (with small threshold for rounding) 22561 if (fullHeight > collapsedHeight + 5) { 22562 button.removeAttribute('hidden'); 22563 } else { 22564 button.setAttribute('hidden', ''); 22565 } 22566 } 22567 22568 #toggle(content, textElement, button) { 22569 const startHeight = content.offsetHeight; 22570 let endHeight; 22571 22572 if (!this.#expanded) { 22573 // Expanding 22574 textElement.classList.remove('text-read-more__text--collapsed'); 22575 endHeight = content.scrollHeight; 22576 this.#expanded = true; 22577 } else { 22578 // Collapsing 22579 endHeight = this.#collapsedHeight; 22580 this.#expanded = false; 22581 } 22582 22583 this.dataset.expanded = this.#expanded; 22584 button.setAttribute('aria-expanded', this.#expanded); 22585 22586 // Animate 22587 content.style.overflow = 'hidden'; 22588 this.#animation?.cancel(); 22589 22590 this.#animation = content.animate( 22591 { 22592 height: [`${startHeight}px`, `${endHeight}px`], 22593 }, 22594 { 22595 duration: 300, 22596 easing: 'ease-in-out', 22597 } 22598 ); 22599 22600 this.#animation.onfinish = () => { 22601 if (this.#expanded) { 22602 content.style.removeProperty('height'); 22603 content.style.overflow = ''; 22604 } else { 22605 textElement.classList.add('text-read-more__text--collapsed'); 22606 content.style.removeProperty('height'); 22607 content.style.overflow = ''; 22608 } 22609 }; 22610 } 22611 } 22612 22613 if (!customElements.get('text-read-more-wrapper')) { 22614 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 22615 } 22616</script>
22616 22617 22618 22619 22620</div> 22621 22622 22623 22624 22625 22626 22627 </div> 22628 </div> 22629</div> 22630 22631 22632 22633 22634 22635 22636 </div> 22637</slideshow-slide> 22638 22639 22640 22641 </slideshow-slides> 22642 </slideshow-container> 22643 22644</slideshow-component> 22645 22646 22647 22648</div> 22649 22650 22651 22652</div> 22653 22654 22655 22656 22657 22658 22659 <style> 22660 @container resource-list-carousel (min-width: 750px) { 22661 #collection-list-template--28213213921626__collection_list_pDpFPq.section-collection-list--colour-swatches .resource-list__carousel .resource-list__slide { 22662 --slide-width: calc(var(--section-slide-width, var(--fallback-slide-width)) * 0.85); 22663 } 22664 #collection-list-template--28213213921626__collection_list_pDpFPq.section-collection-list--colour-swatches .resource-list__carousel .collection-card__inner { 22665 align-items: center; 22666 justify-content: center; 22667 } 22668 #collection-list-template--28213213921626__collection_list_pDpFPq.section-collection-list--colour-swatches .resource-list__carousel .collection-card__image { 22669 display: flex; 22670 justify-content: center; 22671 align-items: center; 22672 } 22673 #collection-list-template--28213213921626__collection_list_pDpFPq.section-collection-list--colour-swatches .resource-list__carousel .collection-card__image .image-block__image { 22674 object-fit: contain; 22675 object-position: center; 22676 } 22677 } 22678 @container resource-list-carousel (min-width: 750px) and (max-width: 989px) { 22679 #collection-list-template--28213213921626__collection_list_pDpFPq.section-collection-list--colour-swatches .resource-list__carousel .resource-list__slide { 22680 --slide-width: calc(var(--section-slide-width, var(--fallback-slide-width)) * 0.65); 22681 min-width: 140px; 22682 } 22683 #collection-list-template--28213213921626__collection_list_pDpFPq.section-collection-list--colour-swatches .resource-list__carousel slideshow-slides { 22684 gap: 24px; 22685 } 22686 } 22687 </style> 22688 22689</div> 22690
22691<script> 22692 (() => { 22693 const section = document.getElementById('collection-list-template--28213213921626__collection_list_pDpFPq'); 22694 if (!section) return; 22695 22696 if (section.dataset.collectionCardRevealEnabled !== 'true') return; 22697 if (section.dataset.collectionListRevealed === 'true') return; 22698 22699 // Only apply the hidden start state when JS is active 22700 section.dataset.collectionCardRevealInit = 'true'; 22701 22702 const reducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches; 22703 22704 const reveal = () => { 22705 section.dataset.collectionListRevealed = 'true'; 22706 }; 22707 22708 // Progressive enhancement fallbacks 22709 if (window.Shopify?.designMode) { 22710 reveal(); 22711 return; 22712 } 22713 22714 if (reducedMotion) { 22715 reveal(); 22716 return; 22717 } 22718 22719 if (!('IntersectionObserver' in window)) { 22720 reveal(); 22721 return; 22722 } 22723 22724 const observer = new IntersectionObserver( 22725 (entries) => { 22726 for (const entry of entries) { 22727 if (entry.isIntersecting) { 22728 reveal(); 22729 observer.disconnect(); 22730 break; 22731 } 22732 } 22733 }, 22734 { root: null, threshold: 0.15 } 22735 ); 22736 22737 observer.observe(section); 22738 })(); 22739</script>
22739 22740 22741 22742</div><div id="shopify-section-template--28213213921626__divider_zxcRey" class="shopify-section"> 22743 22744 22745 22746 22747 22748<div class="section-background color-scheme-4"></div> 22749<div 22750 class="section section--page-width color-scheme-4" 22751 data-testid="divider-template--28213213921626__divider_zxcRey" 22752> 22753 <div 22754 class="divider divider-template--28213213921626__divider_zxcRey spacing-style" 22755 style=" 22756 --divider-justify-content: center; 22757 --padding-block-start: 0px;--padding-block-end: 0px; 22758 " 22759 22760 22761> 22762 <span 22763 class="divider__line" 22764 style=" 22765 --divider-border-thickness: 1px; 22766 22767 --divider-border-rounded: 0; 22768 22769 --divider-flex-basis: 100%; 22770 " 22771 ></span> 22772</div> 22773 22774 22775 22776</div> 22777 22778 22779</div><div id="shopify-section-template--28213213921626__divider_kBFUjB" class="shopify-section"> 22780 22781 22782 22783 22784 22785<div class="section-background color-scheme-4"></div> 22786<div 22787 class="section section--page-width color-scheme-4" 22788 data-testid="divider-template--28213213921626__divider_kBFUjB" 22789> 22790 <div 22791 class="divider divider-template--28213213921626__divider_kBFUjB spacing-style" 22792 style=" 22793 --divider-justify-content: center; 22794 --padding-block-start: 0px;--padding-block-end: 0px; 22795 " 22796 22797 22798> 22799 <span 22800 class="divider__line" 22801 style=" 22802 --divider-border-thickness: 1px; 22803 22804 --divider-border-rounded: 0; 22805 22806 --divider-flex-basis: 100%; 22807 " 22808 ></span> 22809</div> 22810 22811 22812 22813</div> 22814 22815 22816</div><div id="shopify-section-template--28213213921626__section_U8fwi3" class="shopify-section section-wrapper"> 22817 22818 22819 22820<div class="section-background color-scheme-1"></div> 22821<div 22822 class="section section--page-width color-scheme-1" 22823 data-testid="ui-test-section" 22824 22825 22826 22827 style=" 22828 22829 22830 22831 " 22832> 22833 <div class="custom-section-background"> 22834 22835 22836 22837 22838 </div> 22839 22840 <div 22841 class="border-style custom-section-content" 22842 style="--border-width: 1px; --border-style: none; --border-color: 22843rgb(var(--color-border-rgb) / 1.0); --border-radius: 228440px; 22845" 22846 > 22847 22848 22849 <div 22850 class=" 22851 spacing-style 22852 layout-panel-flex 22853 layout-panel-flex--column 22854 section-content-wrapper 22855 mobile-column 22856 " 22857 style=" 22858 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 22859 22860--gap: max(24px, calc(var(--gap-scale, 1.0) * 25px)); 22861 22862--horizontal-alignment: flex-start; --vertical-alignment: center; 22863--vertical-alignment-mobile: center; 22864 22865 --padding-block-start: max(20px, calc(var(--spacing-scale) * 70px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 40px)); 22866 " 22867 data-testid="section-content" 22868 > 22869 22870 22871 22872 22873 22874 22875 22876 22877 22878 22879 22880 <div class=" spacing-style text-block text-block--AS0hlalFCOTlzSnBLN__text_gHm4pp h3 " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 22881 <h2>Shop By Brand</h2> 22882 </div> 22883 22884 22885 22886 22887
22888<script type="module"> 22889 class TextReadMoreWrapper extends HTMLElement { 22890 #expanded = false; 22891 #animation = null; 22892 #collapsedHeight = 0; 22893 22894 connectedCallback() { 22895 const content = this.querySelector('.text-read-more__content'); 22896 const textElement = this.querySelector('.text-read-more__text'); 22897 const button = this.querySelector('.text-read-more__button'); 22898 22899 if (!content || !textElement || !button) return; 22900 22901 // Set initial state 22902 this.dataset.expanded = 'false'; 22903 22904 // Wait for content to render - use double RAF to ensure layout is complete 22905 requestAnimationFrame(() => { 22906 requestAnimationFrame(() => { 22907 // Additional small delay to ensure fonts and styles are applied 22908 setTimeout(() => { 22909 this.#checkOverflow(content, textElement, button); 22910 }, 50); 22911 22912 // Recheck on resize 22913 const resizeObserver = new ResizeObserver(() => { 22914 if (!this.#expanded) { 22915 this.#checkOverflow(content, textElement, button); 22916 } 22917 }); 22918 resizeObserver.observe(content); 22919 22920 // Setup button click handler 22921 button.addEventListener('click', (e) => { 22922 e.preventDefault(); 22923 this.#toggle(content, textElement, button); 22924 }); 22925 }); 22926 }); 22927 } 22928 22929 #checkOverflow(content, textElement, button) { 22930 // Ensure collapsed state is applied 22931 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 22932 textElement.classList.add('text-read-more__text--collapsed'); 22933 } 22934 22935 // Get collapsed height first 22936 const collapsedHeight = content.scrollHeight; 22937 this.#collapsedHeight = collapsedHeight; 22938 22939 // Temporarily remove line-clamp to measure full height 22940 textElement.classList.remove('text-read-more__text--collapsed'); 22941 22942 // Force reflow 22943 void content.offsetHeight; 22944 22945 const fullHeight = content.scrollHeight; 22946 22947 // Restore line-clamp 22948 textElement.classList.add('text-read-more__text--collapsed'); 22949 22950 // Show button if content exceeds 2 lines (with small threshold for rounding) 22951 if (fullHeight > collapsedHeight + 5) { 22952 button.removeAttribute('hidden'); 22953 } else { 22954 button.setAttribute('hidden', ''); 22955 } 22956 } 22957 22958 #toggle(content, textElement, button) { 22959 const startHeight = content.offsetHeight; 22960 let endHeight; 22961 22962 if (!this.#expanded) { 22963 // Expanding 22964 textElement.classList.remove('text-read-more__text--collapsed'); 22965 endHeight = content.scrollHeight; 22966 this.#expanded = true; 22967 } else { 22968 // Collapsing 22969 endHeight = this.#collapsedHeight; 22970 this.#expanded = false; 22971 } 22972 22973 this.dataset.expanded = this.#expanded; 22974 button.setAttribute('aria-expanded', this.#expanded); 22975 22976 // Animate 22977 content.style.overflow = 'hidden'; 22978 this.#animation?.cancel(); 22979 22980 this.#animation = content.animate( 22981 { 22982 height: [`${startHeight}px`, `${endHeight}px`], 22983 }, 22984 { 22985 duration: 300, 22986 easing: 'ease-in-out', 22987 } 22988 ); 22989 22990 this.#animation.onfinish = () => { 22991 if (this.#expanded) { 22992 content.style.removeProperty('height'); 22993 content.style.overflow = ''; 22994 } else { 22995 textElement.classList.add('text-read-more__text--collapsed'); 22996 content.style.removeProperty('height'); 22997 content.style.overflow = ''; 22998 } 22999 }; 23000 } 23001 } 23002 23003 if (!customElements.get('text-read-more-wrapper')) { 23004 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 23005 } 23006</script>
23006 23007 23008 23009 23010 23011 23012 </div> 23013 </div> 23014</div> 23015 23016 23017 23018 23019 23020</div><div id="shopify-section-template--28213213921626__section_FMJwqj" class="shopify-section section-wrapper"> 23021 23022 23023 23024<div class="section-background color-scheme-1"></div> 23025<div 23026 class="section section--page-width color-scheme-1" 23027 data-testid="ui-test-section" 23028 23029 23030 23031 style=" 23032 23033 23034 23035 " 23036> 23037 <div class="custom-section-background"> 23038 23039 23040 23041 23042 </div> 23043 23044 <div 23045 class="border-style custom-section-content" 23046 style="--border-width: 1px; --border-style: none; --border-color: 23047rgb(var(--color-border-rgb) / 1.0); --border-radius: 2304812px; overflow: hidden; 23049" 23050 > 23051 23052 23053 <div 23054 class=" 23055 spacing-style 23056 layout-panel-flex 23057 layout-panel-flex--row 23058 section-content-wrapper 23059 mobile-grid 23060 " 23061 style=" 23062 --flex-direction: row; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 23063 23064--gap: 24px; 23065 23066--horizontal-alignment: flex-start; --vertical-alignment: center; 23067--vertical-alignment-mobile: center; 23068 23069 --padding-block-start: 0px;--padding-block-end: max(20px, calc(var(--spacing-scale) * 70px)); 23070 " 23071 data-testid="section-content" 23072 > 23073 23074 23075 23076 23077<div 23078 class=" 23079 group-block 23080 group-block--height-fit 23081 group-block--width-fill 23082 border-style 23083 spacing-style 23084 size-style 23085 23086 23087 23088 23089 " 23090 style=" 23091 --border-width: 1px; --border-style: none; --border-color: 23092rgb(var(--color-border-rgb) / 1.0); --border-radius: 230930px; 23094 23095 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 23096 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 23097 23098 " 23099 23100 data-testid="group-block" 23101><div class="group-block__media-wrapper"> 23102 23103 23104 23105 23106 23107 </div> 23108 23109 <div 23110 class=" 23111 group-block-content 23112 23113 layout-panel-flex 23114 layout-panel-flex--column 23115 mobile-column 23116 23117 23118 " 23119 23120 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 23121 23122--gap: 12px; 23123 23124--horizontal-alignment: flex-start; --vertical-alignment: center; 23125--vertical-alignment-mobile: center; 23126" 23127 > 23128 23129 23130 23131 23132 23133 23134 23135 23136 23137 23138 23139 23140 23141 23142 23143 23144 <a 23145 href="/collections/apres" 23146 class=" 23147 image-block image-block--AUnRQV0ptdklxa2R4b__image_hover_overlay_DKdFe6 image-block--height-fit spacing-style size-style 23148 image-block--has-overlay 23149 image-block--show-overlay-mobile 23150" 23151 style=" 23152 --ratio: 1.375; 23153 --primary-image-opacity: 0.65; 23154 --primary-image-brightness: 0.5; 23155 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 23156 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 23157" 23158 23159 > 23160 <div class="image-block__container"> 23161 23162<img src="//www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Apres_Default.png?v=1766575782&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--primary border-style" style=" 23163 --ratio: 1.375; 23164 --border-width: 1px; --border-style: none; --border-color: 23165rgb(var(--color-border-rgb) / 1.0); --border-radius: 231660px; 23167 23168" sizes="auto, (min-width: 750px) 100vw, 100vw"> 23169 23170 23171<img src="//www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&
23171width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Apres_Logo.png?v=1767781614&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--overlay border-style" style=" 23172 --ratio: 1.375; 23173 --border-width: 1px; --border-style: none; --border-color: 23174rgb(var(--color-border-rgb) / 1.0); --border-radius: 231750px; 23176 23177" sizes="auto, (min-width: 750px) 100vw, 100vw"> 23178 23179 </div> 23180 </a> 23181 23182 23183 23184 23185 23186 23187 23188 23189 23190 23191 23192 23193 23194 23195 23196 23197 <div class=" spacing-style text-block text-block--AWG5jeUxuUW1RMExYN__text_W3P3yA custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 23198 <p>Apres</p> 23199 </div> 23200 23201 23202 23203 23204
23205<script type="module"> 23206 class TextReadMoreWrapper extends HTMLElement { 23207 #expanded = false; 23208 #animation = null; 23209 #collapsedHeight = 0; 23210 23211 connectedCallback() { 23212 const content = this.querySelector('.text-read-more__content'); 23213 const textElement = this.querySelector('.text-read-more__text'); 23214 const button = this.querySelector('.text-read-more__button'); 23215 23216 if (!content || !textElement || !button) return; 23217 23218 // Set initial state 23219 this.dataset.expanded = 'false'; 23220 23221 // Wait for content to render - use double RAF to ensure layout is complete 23222 requestAnimationFrame(() => { 23223 requestAnimationFrame(() => { 23224 // Additional small delay to ensure fonts and styles are applied 23225 setTimeout(() => { 23226 this.#checkOverflow(content, textElement, button); 23227 }, 50); 23228 23229 // Recheck on resize 23230 const resizeObserver = new ResizeObserver(() => { 23231 if (!this.#expanded) { 23232 this.#checkOverflow(content, textElement, button); 23233 } 23234 }); 23235 resizeObserver.observe(content); 23236 23237 // Setup button click handler 23238 button.addEventListener('click', (e) => { 23239 e.preventDefault(); 23240 this.#toggle(content, textElement, button); 23241 }); 23242 }); 23243 }); 23244 } 23245 23246 #checkOverflow(content, textElement, button) { 23247 // Ensure collapsed state is applied 23248 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 23249 textElement.classList.add('text-read-more__text--collapsed'); 23250 } 23251 23252 // Get collapsed height first 23253 const collapsedHeight = content.scrollHeight; 23254 this.#collapsedHeight = collapsedHeight; 23255 23256 // Temporarily remove line-clamp to measure full height 23257 textElement.classList.remove('text-read-more__text--collapsed'); 23258 23259 // Force reflow 23260 void content.offsetHeight; 23261 23262 const fullHeight = content.scrollHeight; 23263 23264 // Restore line-clamp 23265 textElement.classList.add('text-read-more__text--collapsed'); 23266 23267 // Show button if content exceeds 2 lines (with small threshold for rounding) 23268 if (fullHeight > collapsedHeight + 5) { 23269 button.removeAttribute('hidden'); 23270 } else { 23271 button.setAttribute('hidden', ''); 23272 } 23273 } 23274 23275 #toggle(content, textElement, button) { 23276 const startHeight = content.offsetHeight; 23277 let endHeight; 23278 23279 if (!this.#expanded) { 23280 // Expanding 23281 textElement.classList.remove('text-read-more__text--collapsed'); 23282 endHeight = content.scrollHeight; 23283 this.#expanded = true; 23284 } else { 23285 // Collapsing 23286 endHeight = this.#collapsedHeight; 23287 this.#expanded = false; 23288 } 23289 23290 this.dataset.expanded = this.#expanded; 23291 button.setAttribute('aria-expanded', this.#expanded); 23292 23293 // Animate 23294 content.style.overflow = 'hidden'; 23295 this.#animation?.cancel(); 23296 23297 this.#animation = content.animate( 23298 { 23299 height: [`${startHeight}px`, `${endHeight}px`], 23300 }, 23301 { 23302 duration: 300, 23303 easing: 'ease-in-out', 23304 } 23305 ); 23306 23307 this.#animation.onfinish = () => { 23308 if (this.#expanded) { 23309 content.style.removeProperty('height'); 23310 content.style.overflow = ''; 23311 } else { 23312 textElement.classList.add('text-read-more__text--collapsed'); 23313 content.style.removeProperty('height'); 23314 content.style.overflow = ''; 23315 } 23316 }; 23317 } 23318 } 23319 23320 if (!customElements.get('text-read-more-wrapper')) { 23321 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 23322 } 23323</script>
23323 23324 23325 23326 23327 23328</div> 23329</div> 23330 23331 23332
23333<script type="module"> 23334 (function() { 23335 // Only run if Intersection Observer is supported 23336 if (typeof IntersectionObserver === 'undefined') { 23337 // Fallback: show all animated content immediately 23338 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23339 el.classList.add('group-block-content--in-view'); 23340 }); 23341 return; 23342 } 23343 23344 // Respect reduced motion preference 23345 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 23346 if (prefersReducedMotion) { 23347 // Show all animated content immediately without animation 23348 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23349 el.style.opacity = '1'; 23350 el.style.transform = 'none'; 23351 }); 23352 return; 23353 } 23354 23355 // Set up Intersection Observer for scroll-triggered animations 23356 const observerOptions = { 23357 root: null, 23358 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 23359 threshold: 0.1 // Trigger when 10% of element is visible 23360 }; 23361 23362 const observer = new IntersectionObserver((entries) => { 23363 entries.forEach(entry => { 23364 if (entry.isIntersecting) { 23365 const contentElement = entry.target; 23366 // Add the in-view class to trigger animation 23367 contentElement.classList.add('group-block-content--in-view'); 23368 // Unobserve after animation is triggered (only animate once) 23369 observer.unobserve(contentElement); 23370 } 23371 }); 23372 }, observerOptions); 23373 23374 // Observe all group blocks with animations 23375 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23376 observer.observe(el); 23377 }); 23378 })(); 23379</script>
23379 23380 23381 23382 23383 23384 23385 23386<div 23387 class=" 23388 group-block 23389 group-block--height-fit 23390 group-block--width-fill 23391 border-style 23392 spacing-style 23393 size-style 23394 23395 23396 23397 23398 " 23399 style=" 23400 --border-width: 1px; --border-style: none; --border-color: 23401rgb(var(--color-border-rgb) / 1.0); --border-radius: 234020px; 23403 23404 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 23405 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 23406 23407 " 23408 23409 data-testid="group-block" 23410><div class="group-block__media-wrapper"> 23411 23412 23413 23414 23415 23416 </div> 23417 23418 <div 23419 class=" 23420 group-block-content 23421 23422 layout-panel-flex 23423 layout-panel-flex--column 23424 mobile-column 23425 23426 23427 " 23428 23429 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 23430 23431--gap: 12px; 23432 23433--horizontal-alignment: flex-start; --vertical-alignment: center; 23434--vertical-alignment-mobile: center; 23435" 23436 > 23437 23438 23439 23440 23441 23442 23443 23444 23445 23446 23447 23448 23449 23450 23451 23452 23453 <a 23454 href="/collections/dnd-dc" 23455 class=" 23456 image-block image-block--ATFpGQjRCUXcrbzFLK__image_hover_overlay_LWQ6wV image-block--height-fit spacing-style size-style 23457 image-block--has-overlay 23458 image-block--show-overlay-mobile 23459" 23460 style=" 23461 --ratio: 1.375; 23462 --primary-image-opacity: 0.65; 23463 --primary-image-brightness: 0.5; 23464 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 23465 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 23466" 23467 23468 > 23469 <div class="image-block__container"> 23470 23471<img src="//www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website.jpg?v=1774527890&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--primary border-style" style=" 23472 --ratio: 1.375; 23473 --border-width: 1px; --border-style: none; --border-color: 23474rgb(var(--color-border-rgb) / 1.0); --border-radius: 234750px; 23476 23477" sizes="auto, (min-width: 750px) 100vw, 100vw"> 23478 23479 23480<img src="//www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/DND_1.png?v=1767781614&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--overlay border-style" style=" 23481 --ratio: 1.375; 23482 --border-width: 1px; --border-style: none; --border-color: 23483rgb(var(--color-border-rgb) / 1.0); --border-radius: 234840px; 23485 23486" sizes="auto, (min-width: 750px) 100vw, 100vw"> 23487 23488 </div> 23489 </a> 23490 23491 23492 23493 23494 23495 23496 23497 23498 23499 23500 23501 23502 23503 23504 23505 23506 <div class=" spacing-style text-block text-block--ATk5NRlBObm81aWRpb__text_JeFr6z custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 23507 <p>DND</p> 23508 </div> 23509 23510 23511 23512 23513
23514<script type="module"> 23515 class TextReadMoreWrapper extends HTMLElement { 23516 #expanded = false; 23517 #animation = null; 23518 #collapsedHeight = 0; 23519 23520 connectedCallback() { 23521 const content = this.querySelector('.text-read-more__content'); 23522 const textElement = this.querySelector('.text-read-more__text'); 23523 const button = this.querySelector('.text-read-more__button'); 23524 23525 if (!content || !textElement || !button) return; 23526 23527 // Set initial state 23528 this.dataset.expanded = 'false'; 23529 23530 // Wait for content to render - use double RAF to ensure layout is complete 23531 requestAnimationFrame(() => { 23532 requestAnimationFrame(() => { 23533 // Additional small delay to ensure fonts and styles are applied 23534 setTimeout(() => { 23535 this.#checkOverflow(content, textElement, button); 23536 }, 50); 23537 23538 // Recheck on resize 23539 const resizeObserver = new ResizeObserver(() => { 23540 if (!this.#expanded) { 23541 this.#checkOverflow(content, textElement, button); 23542 } 23543 }); 23544 resizeObserver.observe(content); 23545 23546 // Setup button click handler 23547 button.addEventListener('click', (e) => { 23548 e.preventDefault(); 23549 this.#toggle(content, textElement, button); 23550 }); 23551 }); 23552 }); 23553 } 23554 23555 #checkOverflow(content, textElement, button) { 23556 // Ensure collapsed state is applied 23557 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 23558 textElement.classList.add('text-read-more__text--collapsed'); 23559 } 23560 23561 // Get collapsed height first 23562 const collapsedHeight = content.scrollHeight; 23563 this.#collapsedHeight = collapsedHeight; 23564 23565 // Temporarily remove line-clamp to measure full height 23566 textElement.classList.remove('text-read-more__text--collapsed'); 23567 23568 // Force reflow 23569 void content.offsetHeight; 23570 23571 const fullHeight = content.scrollHeight; 23572 23573 // Restore line-clamp 23574 textElement.classList.add('text-read-more__text--collapsed'); 23575 23576 // Show button if content exceeds 2 lines (with small threshold for rounding) 23577 if (fullHeight > collapsedHeight + 5) { 23578 button.removeAttribute('hidden'); 23579 } else { 23580 button.setAttribute('hidden', ''); 23581 } 23582 } 23583 23584 #toggle(content, textElement, button) { 23585 const startHeight = content.offsetHeight; 23586 let endHeight; 23587 23588 if (!this.#expanded) { 23589 // Expanding 23590 textElement.classList.remove('text-read-more__text--collapsed'); 23591 endHeight = content.scrollHeight; 23592 this.#expanded = true; 23593 } else { 23594 // Collapsing 23595 endHeight = this.#collapsedHeight; 23596 this.#expanded = false; 23597 } 23598 23599 this.dataset.expanded = this.#expanded; 23600 button.setAttribute('aria-expanded', this.#expanded); 23601 23602 // Animate 23603 content.style.overflow = 'hidden'; 23604 this.#animation?.cancel(); 23605 23606 this.#animation = content.animate( 23607 { 23608 height: [`${startHeight}px`, `${endHeight}px`], 23609 }, 23610 { 23611 duration: 300, 23612 easing: 'ease-in-out', 23613 } 23614 ); 23615 23616 this.#animation.onfinish = () => { 23617 if (this.#expanded) { 23618 content.style.removeProperty('height'); 23619 content.style.overflow = ''; 23620 } else { 23621 textElement.classList.add('text-read-more__text--collapsed'); 23622 content.style.removeProperty('height'); 23623 content.style.overflow = ''; 23624 } 23625 }; 23626 } 23627 } 23628 23629 if (!customElements.get('text-read-more-wrapper')) { 23630 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 23631 } 23632</script>
23632 23633 23634 23635 23636 23637</div> 23638</div> 23639 23640 23641
23642<script type="module"> 23643 (function() { 23644 // Only run if Intersection Observer is supported 23645 if (typeof IntersectionObserver === 'undefined') { 23646 // Fallback: show all animated content immediately 23647 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23648 el.classList.add('group-block-content--in-view'); 23649 }); 23650 return; 23651 } 23652 23653 // Respect reduced motion preference 23654 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 23655 if (prefersReducedMotion) { 23656 // Show all animated content immediately without animation 23657 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23658 el.style.opacity = '1'; 23659 el.style.transform = 'none'; 23660 }); 23661 return; 23662 } 23663 23664 // Set up Intersection Observer for scroll-triggered animations 23665 const observerOptions = { 23666 root: null, 23667 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 23668 threshold: 0.1 // Trigger when 10% of element is visible 23669 }; 23670 23671 const observer = new IntersectionObserver((entries) => { 23672 entries.forEach(entry => { 23673 if (entry.isIntersecting) { 23674 const contentElement = entry.target; 23675 // Add the in-view class to trigger animation 23676 contentElement.classList.add('group-block-content--in-view'); 23677 // Unobserve after animation is triggered (only animate once) 23678 observer.unobserve(contentElement); 23679 } 23680 }); 23681 }, observerOptions); 23682 23683 // Observe all group blocks with animations 23684 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23685 observer.observe(el); 23686 }); 23687 })(); 23688</script>
23688 23689 23690 23691 23692 23693 23694 23695<div 23696 class=" 23697 group-block 23698 group-block--height-fit 23699 group-block--width-fill 23700 border-style 23701 spacing-style 23702 size-style 23703 23704 23705 23706 23707 " 23708 style=" 23709 --border-width: 1px; --border-style: none; --border-color: 23710rgb(var(--color-border-rgb) / 1.0); --border-radius: 237110px; 23712 23713 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 23714 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 23715 23716 " 23717 23718 data-testid="group-block" 23719><div class="group-block__media-wrapper"> 23720 23721 23722 23723 23724 23725 </div> 23726 23727 <div 23728 class=" 23729 group-block-content 23730 23731 layout-panel-flex 23732 layout-panel-flex--column 23733 mobile-column 23734 23735 23736 " 23737 23738 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 23739 23740--gap: 12px; 23741 23742--horizontal-alignment: flex-start; --vertical-alignment: center; 23743--vertical-alignment-mobile: center; 23744" 23745 > 23746 23747 23748 23749 23750 23751 23752 23753 23754 23755 23756 23757 23758 23759 23760 23761 23762 <a 23763 href="/collections/nola" 23764 class=" 23765 image-block image-block--ASlJIZlZtRTlhVUZ0T__image_hover_overlay_yj6yNr image-block--height-fit spacing-style size-style 23766 23767 image-block--show-overlay-mobile 23768" 23769 style=" 23770 --ratio: 1.375; 23771 --primary-image-opacity: 0.65; 23772 --primary-image-brightness: 0.5; 23773 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 23774 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 23775" 23776 23777 > 23778 <div class="image-block__container"> 23779 23780<img src="//www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/brand_image_for_shopify_website_1.jpg?v=1774528163&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--primary border-style" style=" 23781 --ratio: 1.375; 23782 --border-width: 1px; --border-style: none; --border-color: 23783rgb(var(--color-border-rgb) / 1.0); --border-radius: 237840px; 23785 23786" sizes="auto, (min-width: 750px) 100vw, 100vw"> 23787 23788 23789 23790 </div> 23791 </a> 23792 23793 23794 23795 23796 23797 23798 23799 23800 23801 23802 23803 23804 23805 23806 23807 23808 <div class=" spacing-style text-block text-block--AcWJYYm44SHlYSURKU__text_HMbHaV custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 23809 <p>NOLA</p> 23810 </div> 23811 23812 23813 23814 23815
23816<script type="module"> 23817 class TextReadMoreWrapper extends HTMLElement { 23818 #expanded = false; 23819 #animation = null; 23820 #collapsedHeight = 0; 23821 23822 connectedCallback() { 23823 const content = this.querySelector('.text-read-more__content'); 23824 const textElement = this.querySelector('.text-read-more__text'); 23825 const button = this.querySelector('.text-read-more__button'); 23826 23827 if (!content || !textElement || !button) return; 23828 23829 // Set initial state 23830 this.dataset.expanded = 'false'; 23831 23832 // Wait for content to render - use double RAF to ensure layout is complete 23833 requestAnimationFrame(() => { 23834 requestAnimationFrame(() => { 23835 // Additional small delay to ensure fonts and styles are applied 23836 setTimeout(() => { 23837 this.#checkOverflow(content, textElement, button); 23838 }, 50); 23839 23840 // Recheck on resize 23841 const resizeObserver = new ResizeObserver(() => { 23842 if (!this.#expanded) { 23843 this.#checkOverflow(content, textElement, button); 23844 } 23845 }); 23846 resizeObserver.observe(content); 23847 23848 // Setup button click handler 23849 button.addEventListener('click', (e) => { 23850 e.preventDefault(); 23851 this.#toggle(content, textElement, button); 23852 }); 23853 }); 23854 }); 23855 } 23856 23857 #checkOverflow(content, textElement, button) { 23858 // Ensure collapsed state is applied 23859 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 23860 textElement.classList.add('text-read-more__text--collapsed'); 23861 } 23862 23863 // Get collapsed height first 23864 const collapsedHeight = content.scrollHeight; 23865 this.#collapsedHeight = collapsedHeight; 23866 23867 // Temporarily remove line-clamp to measure full height 23868 textElement.classList.remove('text-read-more__text--collapsed'); 23869 23870 // Force reflow 23871 void content.offsetHeight; 23872 23873 const fullHeight = content.scrollHeight; 23874 23875 // Restore line-clamp 23876 textElement.classList.add('text-read-more__text--collapsed'); 23877 23878 // Show button if content exceeds 2 lines (with small threshold for rounding) 23879 if (fullHeight > collapsedHeight + 5) { 23880 button.removeAttribute('hidden'); 23881 } else { 23882 button.setAttribute('hidden', ''); 23883 } 23884 } 23885 23886 #toggle(content, textElement, button) { 23887 const startHeight = content.offsetHeight; 23888 let endHeight; 23889 23890 if (!this.#expanded) { 23891 // Expanding 23892 textElement.classList.remove('text-read-more__text--collapsed'); 23893 endHeight = content.scrollHeight; 23894 this.#expanded = true; 23895 } else { 23896 // Collapsing 23897 endHeight = this.#collapsedHeight; 23898 this.#expanded = false; 23899 } 23900 23901 this.dataset.expanded = this.#expanded; 23902 button.setAttribute('aria-expanded', this.#expanded); 23903 23904 // Animate 23905 content.style.overflow = 'hidden'; 23906 this.#animation?.cancel(); 23907 23908 this.#animation = content.animate( 23909 { 23910 height: [`${startHeight}px`, `${endHeight}px`], 23911 }, 23912 { 23913 duration: 300, 23914 easing: 'ease-in-out', 23915 } 23916 ); 23917 23918 this.#animation.onfinish = () => { 23919 if (this.#expanded) { 23920 content.style.removeProperty('height'); 23921 content.style.overflow = ''; 23922 } else { 23923 textElement.classList.add('text-read-more__text--collapsed'); 23924 content.style.removeProperty('height'); 23925 content.style.overflow = ''; 23926 } 23927 }; 23928 } 23929 } 23930 23931 if (!customElements.get('text-read-more-wrapper')) { 23932 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 23933 } 23934</script>
23934 23935 23936 23937 23938 23939</div> 23940</div> 23941 23942 23943
23944<script type="module"> 23945 (function() { 23946 // Only run if Intersection Observer is supported 23947 if (typeof IntersectionObserver === 'undefined') { 23948 // Fallback: show all animated content immediately 23949 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23950 el.classList.add('group-block-content--in-view'); 23951 }); 23952 return; 23953 } 23954 23955 // Respect reduced motion preference 23956 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 23957 if (prefersReducedMotion) { 23958 // Show all animated content immediately without animation 23959 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23960 el.style.opacity = '1'; 23961 el.style.transform = 'none'; 23962 }); 23963 return; 23964 } 23965 23966 // Set up Intersection Observer for scroll-triggered animations 23967 const observerOptions = { 23968 root: null, 23969 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 23970 threshold: 0.1 // Trigger when 10% of element is visible 23971 }; 23972 23973 const observer = new IntersectionObserver((entries) => { 23974 entries.forEach(entry => { 23975 if (entry.isIntersecting) { 23976 const contentElement = entry.target; 23977 // Add the in-view class to trigger animation 23978 contentElement.classList.add('group-block-content--in-view'); 23979 // Unobserve after animation is triggered (only animate once) 23980 observer.unobserve(contentElement); 23981 } 23982 }); 23983 }, observerOptions); 23984 23985 // Observe all group blocks with animations 23986 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 23987 observer.observe(el); 23988 }); 23989 })(); 23990</script>
23990 23991 23992 23993 23994 23995 23996 23997<div 23998 class=" 23999 group-block 24000 group-block--height-fit 24001 group-block--width-fill 24002 border-style 24003 spacing-style 24004 size-style 24005 24006 24007 24008 24009 " 24010 style=" 24011 --border-width: 1px; --border-style: none; --border-color: 24012rgb(var(--color-border-rgb) / 1.0); --border-radius: 240130px; 24014 24015 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 24016 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 24017 24018 " 24019 24020 data-testid="group-block" 24021><div class="group-block__media-wrapper"> 24022 24023 24024 24025 24026 24027 </div> 24028 24029 <div 24030 class=" 24031 group-block-content 24032 24033 layout-panel-flex 24034 layout-panel-flex--column 24035 mobile-column 24036 24037 24038 " 24039 24040 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 24041 24042--gap: 12px; 24043 24044--horizontal-alignment: flex-start; --vertical-alignment: center; 24045--vertical-alignment-mobile: center; 24046" 24047 > 24048 24049 24050 24051 24052 24053 24054 24055 24056 24057 24058 24059 24060 24061 24062 24063 24064 <a 24065 href="/collections/kiara-sky" 24066 class=" 24067 image-block image-block--AY0dXUFIvQWt4ekFrZ__image_hover_overlay_eyCzrq image-block--height-fit spacing-style size-style 24068 image-block--has-overlay 24069 image-block--show-overlay-mobile 24070" 24071 style=" 24072 --ratio: 1.375; 24073 --primary-image-opacity: 0.65; 24074 --primary-image-brightness: 0.5; 24075 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 24076 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 24077" 24078 24079 > 24080 <div class="image-block__container"> 24081 24082<img src="//www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Kiara_Default.png?v=1766575926&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--primary border-style" style=" 24083 --ratio: 1.375; 24084 --border-width: 1px; --border-style: none; --border-color: 24085rgb(var(--color-border-rgb) / 1.0); --border-radius: 240860px; 24087 24088" sizes="auto, (min-width: 750px) 100vw, 100vw"> 24089 24090 24091<img src="//www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/KiaraSky_1.png?v=1767781614&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--overlay border-style" style=" 24092 --ratio: 1.375; 24093 --border-width: 1px; --border-style: none; --border-color: 24094rgb(var(--color-border-rgb) / 1.0); --border-radius: 240950px; 24096 24097" sizes="auto, (min-width: 750px) 100vw, 100vw"> 24098 24099 </div> 24100 </a> 24101 24102 24103 24104 24105 24106 24107 24108 24109 24110 24111 24112 24113 24114 24115 24116 24117 <div class=" spacing-style text-block text-block--AUlBML2NzYlowTGNUM__text_qfrprc custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 24118 <p>Kiara Sky</p> 24119 </div> 24120 24121 24122 24123 24124
24125<script type="module"> 24126 class TextReadMoreWrapper extends HTMLElement { 24127 #expanded = false; 24128 #animation = null; 24129 #collapsedHeight = 0; 24130 24131 connectedCallback() { 24132 const content = this.querySelector('.text-read-more__content'); 24133 const textElement = this.querySelector('.text-read-more__text'); 24134 const button = this.querySelector('.text-read-more__button'); 24135 24136 if (!content || !textElement || !button) return; 24137 24138 // Set initial state 24139 this.dataset.expanded = 'false'; 24140 24141 // Wait for content to render - use double RAF to ensure layout is complete 24142 requestAnimationFrame(() => { 24143 requestAnimationFrame(() => { 24144 // Additional small delay to ensure fonts and styles are applied 24145 setTimeout(() => { 24146 this.#checkOverflow(content, textElement, button); 24147 }, 50); 24148 24149 // Recheck on resize 24150 const resizeObserver = new ResizeObserver(() => { 24151 if (!this.#expanded) { 24152 this.#checkOverflow(content, textElement, button); 24153 } 24154 }); 24155 resizeObserver.observe(content); 24156 24157 // Setup button click handler 24158 button.addEventListener('click', (e) => { 24159 e.preventDefault(); 24160 this.#toggle(content, textElement, button); 24161 }); 24162 }); 24163 }); 24164 } 24165 24166 #checkOverflow(content, textElement, button) { 24167 // Ensure collapsed state is applied 24168 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 24169 textElement.classList.add('text-read-more__text--collapsed'); 24170 } 24171 24172 // Get collapsed height first 24173 const collapsedHeight = content.scrollHeight; 24174 this.#collapsedHeight = collapsedHeight; 24175 24176 // Temporarily remove line-clamp to measure full height 24177 textElement.classList.remove('text-read-more__text--collapsed'); 24178 24179 // Force reflow 24180 void content.offsetHeight; 24181 24182 const fullHeight = content.scrollHeight; 24183 24184 // Restore line-clamp 24185 textElement.classList.add('text-read-more__text--collapsed'); 24186 24187 // Show button if content exceeds 2 lines (with small threshold for rounding) 24188 if (fullHeight > collapsedHeight + 5) { 24189 button.removeAttribute('hidden'); 24190 } else { 24191 button.setAttribute('hidden', ''); 24192 } 24193 } 24194 24195 #toggle(content, textElement, button) { 24196 const startHeight = content.offsetHeight; 24197 let endHeight; 24198 24199 if (!this.#expanded) { 24200 // Expanding 24201 textElement.classList.remove('text-read-more__text--collapsed'); 24202 endHeight = content.scrollHeight; 24203 this.#expanded = true; 24204 } else { 24205 // Collapsing 24206 endHeight = this.#collapsedHeight; 24207 this.#expanded = false; 24208 } 24209 24210 this.dataset.expanded = this.#expanded; 24211 button.setAttribute('aria-expanded', this.#expanded); 24212 24213 // Animate 24214 content.style.overflow = 'hidden'; 24215 this.#animation?.cancel(); 24216 24217 this.#animation = content.animate( 24218 { 24219 height: [`${startHeight}px`, `${endHeight}px`], 24220 }, 24221 { 24222 duration: 300, 24223 easing: 'ease-in-out', 24224 } 24225 ); 24226 24227 this.#animation.onfinish = () => { 24228 if (this.#expanded) { 24229 content.style.removeProperty('height'); 24230 content.style.overflow = ''; 24231 } else { 24232 textElement.classList.add('text-read-more__text--collapsed'); 24233 content.style.removeProperty('height'); 24234 content.style.overflow = ''; 24235 } 24236 }; 24237 } 24238 } 24239 24240 if (!customElements.get('text-read-more-wrapper')) { 24241 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 24242 } 24243</script>
24243 24244 24245 24246 24247 24248</div> 24249</div> 24250 24251 24252
24253<script type="module"> 24254 (function() { 24255 // Only run if Intersection Observer is supported 24256 if (typeof IntersectionObserver === 'undefined') { 24257 // Fallback: show all animated content immediately 24258 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24259 el.classList.add('group-block-content--in-view'); 24260 }); 24261 return; 24262 } 24263 24264 // Respect reduced motion preference 24265 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 24266 if (prefersReducedMotion) { 24267 // Show all animated content immediately without animation 24268 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24269 el.style.opacity = '1'; 24270 el.style.transform = 'none'; 24271 }); 24272 return; 24273 } 24274 24275 // Set up Intersection Observer for scroll-triggered animations 24276 const observerOptions = { 24277 root: null, 24278 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 24279 threshold: 0.1 // Trigger when 10% of element is visible 24280 }; 24281 24282 const observer = new IntersectionObserver((entries) => { 24283 entries.forEach(entry => { 24284 if (entry.isIntersecting) { 24285 const contentElement = entry.target; 24286 // Add the in-view class to trigger animation 24287 contentElement.classList.add('group-block-content--in-view'); 24288 // Unobserve after animation is triggered (only animate once) 24289 observer.unobserve(contentElement); 24290 } 24291 }); 24292 }, observerOptions); 24293 24294 // Observe all group blocks with animations 24295 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24296 observer.observe(el); 24297 }); 24298 })(); 24299</script>
24299 24300 24301 24302 24303 24304 24305 24306<div 24307 class=" 24308 group-block 24309 group-block--height-fit 24310 group-block--width-fill 24311 border-style 24312 spacing-style 24313 size-style 24314 24315 24316 24317 24318 " 24319 style=" 24320 --border-width: 1px; --border-style: none; --border-color: 24321rgb(var(--color-border-rgb) / 1.0); --border-radius: 243220px; 24323 24324 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 24325 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 24326 24327 " 24328 24329 data-testid="group-block" 24330><div class="group-block__media-wrapper"> 24331 24332 24333 24334 24335 24336 </div> 24337 24338 <div 24339 class=" 24340 group-block-content 24341 24342 layout-panel-flex 24343 layout-panel-flex--column 24344 mobile-column 24345 24346 24347 " 24348 24349 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 24350 24351--gap: 12px; 24352 24353--horizontal-alignment: flex-start; --vertical-alignment: center; 24354--vertical-alignment-mobile: center; 24355" 24356 > 24357 24358 24359 24360 24361 24362 24363 24364 24365 24366 24367 24368 24369 24370 24371 24372 24373 <a 24374 href="/collections/vina" 24375 class=" 24376 image-block image-block--AQ0JCT05QQVNiNGNZb__image_hover_overlay_eRT8i4 image-block--height-fit spacing-style size-style 24377 image-block--has-overlay 24378 image-block--show-overlay-mobile 24379" 24380 style=" 24381 --ratio: 1.375; 24382 --primary-image-opacity: 0.65; 24383 --primary-image-brightness: 0.5; 24384 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 24385 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 24386" 24387 24388 > 24389 <div class="image-block__container"> 24390 24391<img src="//www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/VINA_Default.png?v=1766575935&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--primary border-style" style=" 24392 --ratio: 1.375; 24393 --border-width: 1px; --border-style: none; --border-color: 24394rgb(var(--color-border-rgb) / 1.0); --border-radius: 243950px; 24396 24397" sizes="auto, (min-width: 750px) 100vw, 100vw"> 24398 24399 24400<img src="//www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Vina_1.png?v=1767781614&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--overlay border-style" style=" 24401 --ratio: 1.375; 24402 --border-width: 1px; --border-style: none; --border-color: 24403rgb(var(--color-border-rgb) / 1.0); --border-radius: 244040px; 24405 24406" sizes="auto, (min-width: 750px) 100vw, 100vw"> 24407 24408 </div> 24409 </a> 24410 24411 24412 24413 24414 24415 24416 24417 24418 24419 24420 24421 24422 24423 24424 24425 24426 <div class=" spacing-style text-block text-block--AU3Y3cVJvNS8xM1lRT__text_wtBNrW custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 24427 <p>VINA</p> 24428 </div> 24429 24430 24431 24432 24433
24434<script type="module"> 24435 class TextReadMoreWrapper extends HTMLElement { 24436 #expanded = false; 24437 #animation = null; 24438 #collapsedHeight = 0; 24439 24440 connectedCallback() { 24441 const content = this.querySelector('.text-read-more__content'); 24442 const textElement = this.querySelector('.text-read-more__text'); 24443 const button = this.querySelector('.text-read-more__button'); 24444 24445 if (!content || !textElement || !button) return; 24446 24447 // Set initial state 24448 this.dataset.expanded = 'false'; 24449 24450 // Wait for content to render - use double RAF to ensure layout is complete 24451 requestAnimationFrame(() => { 24452 requestAnimationFrame(() => { 24453 // Additional small delay to ensure fonts and styles are applied 24454 setTimeout(() => { 24455 this.#checkOverflow(content, textElement, button); 24456 }, 50); 24457 24458 // Recheck on resize 24459 const resizeObserver = new ResizeObserver(() => { 24460 if (!this.#expanded) { 24461 this.#checkOverflow(content, textElement, button); 24462 } 24463 }); 24464 resizeObserver.observe(content); 24465 24466 // Setup button click handler 24467 button.addEventListener('click', (e) => { 24468 e.preventDefault(); 24469 this.#toggle(content, textElement, button); 24470 }); 24471 }); 24472 }); 24473 } 24474 24475 #checkOverflow(content, textElement, button) { 24476 // Ensure collapsed state is applied 24477 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 24478 textElement.classList.add('text-read-more__text--collapsed'); 24479 } 24480 24481 // Get collapsed height first 24482 const collapsedHeight = content.scrollHeight; 24483 this.#collapsedHeight = collapsedHeight; 24484 24485 // Temporarily remove line-clamp to measure full height 24486 textElement.classList.remove('text-read-more__text--collapsed'); 24487 24488 // Force reflow 24489 void content.offsetHeight; 24490 24491 const fullHeight = content.scrollHeight; 24492 24493 // Restore line-clamp 24494 textElement.classList.add('text-read-more__text--collapsed'); 24495 24496 // Show button if content exceeds 2 lines (with small threshold for rounding) 24497 if (fullHeight > collapsedHeight + 5) { 24498 button.removeAttribute('hidden'); 24499 } else { 24500 button.setAttribute('hidden', ''); 24501 } 24502 } 24503 24504 #toggle(content, textElement, button) { 24505 const startHeight = content.offsetHeight; 24506 let endHeight; 24507 24508 if (!this.#expanded) { 24509 // Expanding 24510 textElement.classList.remove('text-read-more__text--collapsed'); 24511 endHeight = content.scrollHeight; 24512 this.#expanded = true; 24513 } else { 24514 // Collapsing 24515 endHeight = this.#collapsedHeight; 24516 this.#expanded = false; 24517 } 24518 24519 this.dataset.expanded = this.#expanded; 24520 button.setAttribute('aria-expanded', this.#expanded); 24521 24522 // Animate 24523 content.style.overflow = 'hidden'; 24524 this.#animation?.cancel(); 24525 24526 this.#animation = content.animate( 24527 { 24528 height: [`${startHeight}px`, `${endHeight}px`], 24529 }, 24530 { 24531 duration: 300, 24532 easing: 'ease-in-out', 24533 } 24534 ); 24535 24536 this.#animation.onfinish = () => { 24537 if (this.#expanded) { 24538 content.style.removeProperty('height'); 24539 content.style.overflow = ''; 24540 } else { 24541 textElement.classList.add('text-read-more__text--collapsed'); 24542 content.style.removeProperty('height'); 24543 content.style.overflow = ''; 24544 } 24545 }; 24546 } 24547 } 24548 24549 if (!customElements.get('text-read-more-wrapper')) { 24550 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 24551 } 24552</script>
24552 24553 24554 24555 24556 24557</div> 24558</div> 24559 24560 24561
24562<script type="module"> 24563 (function() { 24564 // Only run if Intersection Observer is supported 24565 if (typeof IntersectionObserver === 'undefined') { 24566 // Fallback: show all animated content immediately 24567 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24568 el.classList.add('group-block-content--in-view'); 24569 }); 24570 return; 24571 } 24572 24573 // Respect reduced motion preference 24574 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 24575 if (prefersReducedMotion) { 24576 // Show all animated content immediately without animation 24577 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24578 el.style.opacity = '1'; 24579 el.style.transform = 'none'; 24580 }); 24581 return; 24582 } 24583 24584 // Set up Intersection Observer for scroll-triggered animations 24585 const observerOptions = { 24586 root: null, 24587 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 24588 threshold: 0.1 // Trigger when 10% of element is visible 24589 }; 24590 24591 const observer = new IntersectionObserver((entries) => { 24592 entries.forEach(entry => { 24593 if (entry.isIntersecting) { 24594 const contentElement = entry.target; 24595 // Add the in-view class to trigger animation 24596 contentElement.classList.add('group-block-content--in-view'); 24597 // Unobserve after animation is triggered (only animate once) 24598 observer.unobserve(contentElement); 24599 } 24600 }); 24601 }, observerOptions); 24602 24603 // Observe all group blocks with animations 24604 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24605 observer.observe(el); 24606 }); 24607 })(); 24608</script>
24608 24609 24610 24611 24612 24613 24614 24615<div 24616 class=" 24617 group-block 24618 group-block--height-fit 24619 group-block--width-fill 24620 border-style 24621 spacing-style 24622 size-style 24623 24624 24625 24626 24627 " 24628 style=" 24629 --border-width: 1px; --border-style: none; --border-color: 24630rgb(var(--color-border-rgb) / 1.0); --border-radius: 246310px; 24632 24633 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 24634 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 24635 24636 " 24637 24638 data-testid="group-block" 24639><div class="group-block__media-wrapper"> 24640 24641 24642 24643 24644 24645 </div> 24646 24647 <div 24648 class=" 24649 group-block-content 24650 24651 layout-panel-flex 24652 layout-panel-flex--column 24653 mobile-column 24654 24655 24656 " 24657 24658 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 24659 24660--gap: 12px; 24661 24662--horizontal-alignment: flex-start; --vertical-alignment: center; 24663--vertical-alignment-mobile: center; 24664" 24665 > 24666 24667 24668 24669 24670 24671 24672 24673 24674 24675 24676 24677 24678 24679 24680 24681 24682 <a 24683 href="/collections/cuccio" 24684 class=" 24685 image-block image-block--AbksyRXpTT3kwMjlzU__image_hover_overlay_rmw9UD image-block--height-fit spacing-style size-style 24686 image-block--has-overlay 24687 image-block--show-overlay-mobile 24688" 24689 style=" 24690 --ratio: 1.375; 24691 --primary-image-opacity: 0.65; 24692 --primary-image-brightness: 0.5; 24693 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 24694 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 24695" 24696 24697 > 24698 <div class="image-block__container"> 24699 24700<img src="//www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_Default.png?v=1766575944&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--primary border-style" style=" 24701 --ratio: 1.375; 24702 --border-width: 1px; --border-style: none; --border-color: 24703rgb(var(--color-border-rgb) / 1.0); --border-radius: 247040px; 24705 24706" sizes="auto, (min-width: 750px) 100vw, 100vw"> 24707 24708 24709<img src="//www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Cuccio_1.png?v=1767781614&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--overlay border-style" style=" 24710 --ratio: 1.375; 24711 --border-width: 1px; --border-style: none; --border-color: 24712rgb(var(--color-border-rgb) / 1.0); --border-radius: 247130px; 24714 24715" sizes="auto, (min-width: 750px) 100vw, 100vw"> 24716 24717 </div> 24718 </a> 24719 24720 24721 24722 24723 24724 24725 24726 24727 24728 24729 24730 24731 24732 24733 24734 24735 <div class=" spacing-style text-block text-block--AcldmTENzVjNhRU96T__text_BQPFnU custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 24736 <p>Cuccio</p> 24737 </div> 24738 24739 24740 24741 24742
24743<script type="module"> 24744 class TextReadMoreWrapper extends HTMLElement { 24745 #expanded = false; 24746 #animation = null; 24747 #collapsedHeight = 0; 24748 24749 connectedCallback() { 24750 const content = this.querySelector('.text-read-more__content'); 24751 const textElement = this.querySelector('.text-read-more__text'); 24752 const button = this.querySelector('.text-read-more__button'); 24753 24754 if (!content || !textElement || !button) return; 24755 24756 // Set initial state 24757 this.dataset.expanded = 'false'; 24758 24759 // Wait for content to render - use double RAF to ensure layout is complete 24760 requestAnimationFrame(() => { 24761 requestAnimationFrame(() => { 24762 // Additional small delay to ensure fonts and styles are applied 24763 setTimeout(() => { 24764 this.#checkOverflow(content, textElement, button); 24765 }, 50); 24766 24767 // Recheck on resize 24768 const resizeObserver = new ResizeObserver(() => { 24769 if (!this.#expanded) { 24770 this.#checkOverflow(content, textElement, button); 24771 } 24772 }); 24773 resizeObserver.observe(content); 24774 24775 // Setup button click handler 24776 button.addEventListener('click', (e) => { 24777 e.preventDefault(); 24778 this.#toggle(content, textElement, button); 24779 }); 24780 }); 24781 }); 24782 } 24783 24784 #checkOverflow(content, textElement, button) { 24785 // Ensure collapsed state is applied 24786 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 24787 textElement.classList.add('text-read-more__text--collapsed'); 24788 } 24789 24790 // Get collapsed height first 24791 const collapsedHeight = content.scrollHeight; 24792 this.#collapsedHeight = collapsedHeight; 24793 24794 // Temporarily remove line-clamp to measure full height 24795 textElement.classList.remove('text-read-more__text--collapsed'); 24796 24797 // Force reflow 24798 void content.offsetHeight; 24799 24800 const fullHeight = content.scrollHeight; 24801 24802 // Restore line-clamp 24803 textElement.classList.add('text-read-more__text--collapsed'); 24804 24805 // Show button if content exceeds 2 lines (with small threshold for rounding) 24806 if (fullHeight > collapsedHeight + 5) { 24807 button.removeAttribute('hidden'); 24808 } else { 24809 button.setAttribute('hidden', ''); 24810 } 24811 } 24812 24813 #toggle(content, textElement, button) { 24814 const startHeight = content.offsetHeight; 24815 let endHeight; 24816 24817 if (!this.#expanded) { 24818 // Expanding 24819 textElement.classList.remove('text-read-more__text--collapsed'); 24820 endHeight = content.scrollHeight; 24821 this.#expanded = true; 24822 } else { 24823 // Collapsing 24824 endHeight = this.#collapsedHeight; 24825 this.#expanded = false; 24826 } 24827 24828 this.dataset.expanded = this.#expanded; 24829 button.setAttribute('aria-expanded', this.#expanded); 24830 24831 // Animate 24832 content.style.overflow = 'hidden'; 24833 this.#animation?.cancel(); 24834 24835 this.#animation = content.animate( 24836 { 24837 height: [`${startHeight}px`, `${endHeight}px`], 24838 }, 24839 { 24840 duration: 300, 24841 easing: 'ease-in-out', 24842 } 24843 ); 24844 24845 this.#animation.onfinish = () => { 24846 if (this.#expanded) { 24847 content.style.removeProperty('height'); 24848 content.style.overflow = ''; 24849 } else { 24850 textElement.classList.add('text-read-more__text--collapsed'); 24851 content.style.removeProperty('height'); 24852 content.style.overflow = ''; 24853 } 24854 }; 24855 } 24856 } 24857 24858 if (!customElements.get('text-read-more-wrapper')) { 24859 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 24860 } 24861</script>
24861 24862 24863 24864 24865 24866</div> 24867</div> 24868 24869 24870
24871<script type="module"> 24872 (function() { 24873 // Only run if Intersection Observer is supported 24874 if (typeof IntersectionObserver === 'undefined') { 24875 // Fallback: show all animated content immediately 24876 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24877 el.classList.add('group-block-content--in-view'); 24878 }); 24879 return; 24880 } 24881 24882 // Respect reduced motion preference 24883 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 24884 if (prefersReducedMotion) { 24885 // Show all animated content immediately without animation 24886 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24887 el.style.opacity = '1'; 24888 el.style.transform = 'none'; 24889 }); 24890 return; 24891 } 24892 24893 // Set up Intersection Observer for scroll-triggered animations 24894 const observerOptions = { 24895 root: null, 24896 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 24897 threshold: 0.1 // Trigger when 10% of element is visible 24898 }; 24899 24900 const observer = new IntersectionObserver((entries) => { 24901 entries.forEach(entry => { 24902 if (entry.isIntersecting) { 24903 const contentElement = entry.target; 24904 // Add the in-view class to trigger animation 24905 contentElement.classList.add('group-block-content--in-view'); 24906 // Unobserve after animation is triggered (only animate once) 24907 observer.unobserve(contentElement); 24908 } 24909 }); 24910 }, observerOptions); 24911 24912 // Observe all group blocks with animations 24913 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 24914 observer.observe(el); 24915 }); 24916 })(); 24917</script>
24917 24918 24919 24920 24921 24922 24923 24924<div 24925 class=" 24926 group-block 24927 group-block--height-fit 24928 group-block--width-fill 24929 border-style 24930 spacing-style 24931 size-style 24932 24933 24934 24935 24936 " 24937 style=" 24938 --border-width: 1px; --border-style: none; --border-color: 24939rgb(var(--color-border-rgb) / 1.0); --border-radius: 249400px; 24941 24942 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 24943 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 24944 24945 " 24946 24947 data-testid="group-block" 24948><div class="group-block__media-wrapper"> 24949 24950 24951 24952 24953 24954 </div> 24955 24956 <div 24957 class=" 24958 group-block-content 24959 24960 layout-panel-flex 24961 layout-panel-flex--column 24962 mobile-column 24963 24964 24965 " 24966 24967 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 24968 24969--gap: 12px; 24970 24971--horizontal-alignment: flex-start; --vertical-alignment: center; 24972--vertical-alignment-mobile: center; 24973" 24974 > 24975 24976 24977 24978 24979 24980 24981 24982 24983 24984 24985 24986 24987 24988 24989 24990 24991 <a 24992 href="/collections/cnd" 24993 class=" 24994 image-block image-block--AdThsQTUray9HeUpEK__image_hover_overlay_b8yaxT image-block--height-fit spacing-style size-style 24995 image-block--has-overlay 24996 image-block--show-overlay-mobile 24997" 24998 style=" 24999 --ratio: 1.375; 25000 --primary-image-opacity: 0.65; 25001 --primary-image-brightness: 0.5; 25002 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 25003 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 25004" 25005 25006 > 25007 <div class="image-block__container"> 25008 25009<img src="//www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/CND_Default.png?v=1766575918&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--primary border-style" style=" 25010 --ratio: 1.375; 25011 --border-width: 1px; --border-style: none; --border-color: 25012rgb(var(--color-border-rgb) / 1.0); --border-radius: 250130px; 25014 25015" sizes="auto, (min-width: 750px) 100vw, 100vw"> 25016 25017 25018<img src="//www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=352 352w, //www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/CND_1.png?v=1767781614&width=3840 3840w" width="440" height="320" loading="lazy" class="image-block__image image-block__image--overlay border-style" style=" 25019 --ratio: 1.375; 25020 --border-width: 1px; --border-style: none; --border-color: 25021rgb(var(--color-border-rgb) / 1.0); --border-radius: 250220px; 25023 25024" sizes="auto, (min-width: 750px) 100vw, 100vw"> 25025 25026 </div> 25027 </a> 25028 25029 25030 25031 25032 25033 25034 25035 25036 25037 25038 25039 25040 25041 25042 25043 25044 <div class=" spacing-style text-block text-block--ANmd4V0dwSWZodUtqS__text_K9GEkE custom custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: fit-content; --max-width: var(--max-width--body-normal); "> 25045 <p>CND</p> 25046 </div> 25047 25048 25049 25050 25051
25052<script type="module"> 25053 class TextReadMoreWrapper extends HTMLElement { 25054 #expanded = false; 25055 #animation = null; 25056 #collapsedHeight = 0; 25057 25058 connectedCallback() { 25059 const content = this.querySelector('.text-read-more__content'); 25060 const textElement = this.querySelector('.text-read-more__text'); 25061 const button = this.querySelector('.text-read-more__button'); 25062 25063 if (!content || !textElement || !button) return; 25064 25065 // Set initial state 25066 this.dataset.expanded = 'false'; 25067 25068 // Wait for content to render - use double RAF to ensure layout is complete 25069 requestAnimationFrame(() => { 25070 requestAnimationFrame(() => { 25071 // Additional small delay to ensure fonts and styles are applied 25072 setTimeout(() => { 25073 this.#checkOverflow(content, textElement, button); 25074 }, 50); 25075 25076 // Recheck on resize 25077 const resizeObserver = new ResizeObserver(() => { 25078 if (!this.#expanded) { 25079 this.#checkOverflow(content, textElement, button); 25080 } 25081 }); 25082 resizeObserver.observe(content); 25083 25084 // Setup button click handler 25085 button.addEventListener('click', (e) => { 25086 e.preventDefault(); 25087 this.#toggle(content, textElement, button); 25088 }); 25089 }); 25090 }); 25091 } 25092 25093 #checkOverflow(content, textElement, button) { 25094 // Ensure collapsed state is applied 25095 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 25096 textElement.classList.add('text-read-more__text--collapsed'); 25097 } 25098 25099 // Get collapsed height first 25100 const collapsedHeight = content.scrollHeight; 25101 this.#collapsedHeight = collapsedHeight; 25102 25103 // Temporarily remove line-clamp to measure full height 25104 textElement.classList.remove('text-read-more__text--collapsed'); 25105 25106 // Force reflow 25107 void content.offsetHeight; 25108 25109 const fullHeight = content.scrollHeight; 25110 25111 // Restore line-clamp 25112 textElement.classList.add('text-read-more__text--collapsed'); 25113 25114 // Show button if content exceeds 2 lines (with small threshold for rounding) 25115 if (fullHeight > collapsedHeight + 5) { 25116 button.removeAttribute('hidden'); 25117 } else { 25118 button.setAttribute('hidden', ''); 25119 } 25120 } 25121 25122 #toggle(content, textElement, button) { 25123 const startHeight = content.offsetHeight; 25124 let endHeight; 25125 25126 if (!this.#expanded) { 25127 // Expanding 25128 textElement.classList.remove('text-read-more__text--collapsed'); 25129 endHeight = content.scrollHeight; 25130 this.#expanded = true; 25131 } else { 25132 // Collapsing 25133 endHeight = this.#collapsedHeight; 25134 this.#expanded = false; 25135 } 25136 25137 this.dataset.expanded = this.#expanded; 25138 button.setAttribute('aria-expanded', this.#expanded); 25139 25140 // Animate 25141 content.style.overflow = 'hidden'; 25142 this.#animation?.cancel(); 25143 25144 this.#animation = content.animate( 25145 { 25146 height: [`${startHeight}px`, `${endHeight}px`], 25147 }, 25148 { 25149 duration: 300, 25150 easing: 'ease-in-out', 25151 } 25152 ); 25153 25154 this.#animation.onfinish = () => { 25155 if (this.#expanded) { 25156 content.style.removeProperty('height'); 25157 content.style.overflow = ''; 25158 } else { 25159 textElement.classList.add('text-read-more__text--collapsed'); 25160 content.style.removeProperty('height'); 25161 content.style.overflow = ''; 25162 } 25163 }; 25164 } 25165 } 25166 25167 if (!customElements.get('text-read-more-wrapper')) { 25168 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 25169 } 25170</script>
25170 25171 25172 25173 25174 25175</div> 25176</div> 25177 25178 25179
25180<script type="module"> 25181 (function() { 25182 // Only run if Intersection Observer is supported 25183 if (typeof IntersectionObserver === 'undefined') { 25184 // Fallback: show all animated content immediately 25185 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 25186 el.classList.add('group-block-content--in-view'); 25187 }); 25188 return; 25189 } 25190 25191 // Respect reduced motion preference 25192 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 25193 if (prefersReducedMotion) { 25194 // Show all animated content immediately without animation 25195 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 25196 el.style.opacity = '1'; 25197 el.style.transform = 'none'; 25198 }); 25199 return; 25200 } 25201 25202 // Set up Intersection Observer for scroll-triggered animations 25203 const observerOptions = { 25204 root: null, 25205 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 25206 threshold: 0.1 // Trigger when 10% of element is visible 25207 }; 25208 25209 const observer = new IntersectionObserver((entries) => { 25210 entries.forEach(entry => { 25211 if (entry.isIntersecting) { 25212 const contentElement = entry.target; 25213 // Add the in-view class to trigger animation 25214 contentElement.classList.add('group-block-content--in-view'); 25215 // Unobserve after animation is triggered (only animate once) 25216 observer.unobserve(contentElement); 25217 } 25218 }); 25219 }, observerOptions); 25220 25221 // Observe all group blocks with animations 25222 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 25223 observer.observe(el); 25224 }); 25225 })(); 25226</script>
25226 25227 25228 25229 25230 25231 25232 </div> 25233 </div> 25234</div> 25235 25236 25237 25238 25239 25240</div><div id="shopify-section-template--28213213921626__section_xx9rAM" class="shopify-section section-wrapper"> 25241 25242 25243 25244<div class="section-background color-scheme-2"></div> 25245<div 25246 class="section section--page-width color-scheme-2" 25247 data-testid="ui-test-section" 25248 25249 25250 25251 style=" 25252 25253 25254 25255 " 25256> 25257 <div class="custom-section-background"> 25258 25259 25260 25261 25262 </div> 25263 25264 <div 25265 class="border-style custom-section-content" 25266 style="--border-width: 1px; --border-style: none; --border-color: 25267rgb(var(--color-border-rgb) / 1.0); --border-radius: 252680px; 25269" 25270 > 25271 25272 25273 <div 25274 class=" 25275 spacing-style 25276 layout-panel-flex 25277 layout-panel-flex--row 25278 section-content-wrapper 25279 mobile-column 25280 " 25281 style=" 25282 --flex-direction: row; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 25283 25284--gap: 24px; 25285 25286--horizontal-alignment: flex-start; --vertical-alignment: center; 25287--vertical-alignment-mobile: center; 25288 25289 --padding-block-start: max(20px, calc(var(--spacing-scale) * 50px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 50px)); 25290 " 25291 data-testid="section-content" 25292 > 25293 25294 25295 25296 25297<div 25298 class=" 25299 group-block 25300 group-block--height-custom_px 25301 group-block--width-fill 25302 border-style 25303 spacing-style 25304 size-style 25305 group-block--text-arrow-on-hover 25306 25307 25308 25309 " 25310 style=" 25311 --border-width: 1px; --border-style: none; --border-color: 25312rgb(var(--color-border-rgb) / 1.0); --border-radius: 2531312px; overflow: hidden; 25314 25315 --padding-block-start: max(20px, calc(var(--spacing-scale) * 100px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 36px));--padding-inline-start: max(20px, calc(var(--spacing-scale) * 36px));--padding-inline-end: max(20px, calc(var(--spacing-scale) * 36px)); 25316 --size-style-width: 100%;--size-style-height: 260px;--size-style-height-mobile: 240px;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 25317 25318 " 25319 25320 data-testid="group-block" 25321><a 25322 href="/pages/courses" 25323 class="group-block__link" 25324 25325 ></a><div class="group-block__media-wrapper"> 25326 25327 <div 25328 class="background-image-container" 25329 > 25330 25331 25332 <img src="//www.tnbl.co.uk/cdn/shop/files/Nail_Courses.png?v=1766494674&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Nail_Courses.png?v=1766494674&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Nail_Courses.png?v=1766494674&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Nail_Courses.png?v=1766494674&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Nail_Courses.png?v=1766494674&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Nail_Courses.png?v=1766494674&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Nail_Courses.png?v=1766494674&width=3840 3840w" width="3840" height="2152" loading="lazy" sizes="(min-width: 1440px) 1440px, 100vw" fetchpriority="auto"> 25333</div> 25334 25335 25336 25337 25338 25339 </div> 25340 25341 <div 25342 class=" 25343 group-block-content 25344 25345 layout-panel-flex 25346 layout-panel-flex--column 25347 mobile-column 25348 25349 25350 " 25351 25352 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 25353 25354--gap: 12px; 25355 25356--horizontal-alignment: flex-start; --vertical-alignment: flex-end; 25357--vertical-alignment-mobile: flex-end; 25358" 25359 > 25360 25361 25362 25363 25364 25365 25366 25367 25368 25369 25370 <div class=" spacing-style text-block text-block--AZ1preUY3Zm1DNG9Hd__text_3VewnW h3 " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 25371 <h2>Nail Courses</h2> 25372 </div> 25373 25374 25375 25376 25377
25378<script type="module"> 25379 class TextReadMoreWrapper extends HTMLElement { 25380 #expanded = false; 25381 #animation = null; 25382 #collapsedHeight = 0; 25383 25384 connectedCallback() { 25385 const content = this.querySelector('.text-read-more__content'); 25386 const textElement = this.querySelector('.text-read-more__text'); 25387 const button = this.querySelector('.text-read-more__button'); 25388 25389 if (!content || !textElement || !button) return; 25390 25391 // Set initial state 25392 this.dataset.expanded = 'false'; 25393 25394 // Wait for content to render - use double RAF to ensure layout is complete 25395 requestAnimationFrame(() => { 25396 requestAnimationFrame(() => { 25397 // Additional small delay to ensure fonts and styles are applied 25398 setTimeout(() => { 25399 this.#checkOverflow(content, textElement, button); 25400 }, 50); 25401 25402 // Recheck on resize 25403 const resizeObserver = new ResizeObserver(() => { 25404 if (!this.#expanded) { 25405 this.#checkOverflow(content, textElement, button); 25406 } 25407 }); 25408 resizeObserver.observe(content); 25409 25410 // Setup button click handler 25411 button.addEventListener('click', (e) => { 25412 e.preventDefault(); 25413 this.#toggle(content, textElement, button); 25414 }); 25415 }); 25416 }); 25417 } 25418 25419 #checkOverflow(content, textElement, button) { 25420 // Ensure collapsed state is applied 25421 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 25422 textElement.classList.add('text-read-more__text--collapsed'); 25423 } 25424 25425 // Get collapsed height first 25426 const collapsedHeight = content.scrollHeight; 25427 this.#collapsedHeight = collapsedHeight; 25428 25429 // Temporarily remove line-clamp to measure full height 25430 textElement.classList.remove('text-read-more__text--collapsed'); 25431 25432 // Force reflow 25433 void content.offsetHeight; 25434 25435 const fullHeight = content.scrollHeight; 25436 25437 // Restore line-clamp 25438 textElement.classList.add('text-read-more__text--collapsed'); 25439 25440 // Show button if content exceeds 2 lines (with small threshold for rounding) 25441 if (fullHeight > collapsedHeight + 5) { 25442 button.removeAttribute('hidden'); 25443 } else { 25444 button.setAttribute('hidden', ''); 25445 } 25446 } 25447 25448 #toggle(content, textElement, button) { 25449 const startHeight = content.offsetHeight; 25450 let endHeight; 25451 25452 if (!this.#expanded) { 25453 // Expanding 25454 textElement.classList.remove('text-read-more__text--collapsed'); 25455 endHeight = content.scrollHeight; 25456 this.#expanded = true; 25457 } else { 25458 // Collapsing 25459 endHeight = this.#collapsedHeight; 25460 this.#expanded = false; 25461 } 25462 25463 this.dataset.expanded = this.#expanded; 25464 button.setAttribute('aria-expanded', this.#expanded); 25465 25466 // Animate 25467 content.style.overflow = 'hidden'; 25468 this.#animation?.cancel(); 25469 25470 this.#animation = content.animate( 25471 { 25472 height: [`${startHeight}px`, `${endHeight}px`], 25473 }, 25474 { 25475 duration: 300, 25476 easing: 'ease-in-out', 25477 } 25478 ); 25479 25480 this.#animation.onfinish = () => { 25481 if (this.#expanded) { 25482 content.style.removeProperty('height'); 25483 content.style.overflow = ''; 25484 } else { 25485 textElement.classList.add('text-read-more__text--collapsed'); 25486 content.style.removeProperty('height'); 25487 content.style.overflow = ''; 25488 } 25489 }; 25490 } 25491 } 25492 25493 if (!customElements.get('text-read-more-wrapper')) { 25494 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 25495 } 25496</script>
25496 25497 25498 25499 25500 25501 25502 25503 25504 25505 25506 25507 25508 25509 25510 <rte-formatter class=" spacing-style text-block text-block--AVXlLbk1sVC9WSlVJL__text_8PykCU rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 25511 <p>Unlock the secrets of nail artistry</p> 25512 </rte-formatter> 25513 25514 25515 25516 25517
25518<script type="module"> 25519 class TextReadMoreWrapper extends HTMLElement { 25520 #expanded = false; 25521 #animation = null; 25522 #collapsedHeight = 0; 25523 25524 connectedCallback() { 25525 const content = this.querySelector('.text-read-more__content'); 25526 const textElement = this.querySelector('.text-read-more__text'); 25527 const button = this.querySelector('.text-read-more__button'); 25528 25529 if (!content || !textElement || !button) return; 25530 25531 // Set initial state 25532 this.dataset.expanded = 'false'; 25533 25534 // Wait for content to render - use double RAF to ensure layout is complete 25535 requestAnimationFrame(() => { 25536 requestAnimationFrame(() => { 25537 // Additional small delay to ensure fonts and styles are applied 25538 setTimeout(() => { 25539 this.#checkOverflow(content, textElement, button); 25540 }, 50); 25541 25542 // Recheck on resize 25543 const resizeObserver = new ResizeObserver(() => { 25544 if (!this.#expanded) { 25545 this.#checkOverflow(content, textElement, button); 25546 } 25547 }); 25548 resizeObserver.observe(content); 25549 25550 // Setup button click handler 25551 button.addEventListener('click', (e) => { 25552 e.preventDefault(); 25553 this.#toggle(content, textElement, button); 25554 }); 25555 }); 25556 }); 25557 } 25558 25559 #checkOverflow(content, textElement, button) { 25560 // Ensure collapsed state is applied 25561 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 25562 textElement.classList.add('text-read-more__text--collapsed'); 25563 } 25564 25565 // Get collapsed height first 25566 const collapsedHeight = content.scrollHeight; 25567 this.#collapsedHeight = collapsedHeight; 25568 25569 // Temporarily remove line-clamp to measure full height 25570 textElement.classList.remove('text-read-more__text--collapsed'); 25571 25572 // Force reflow 25573 void content.offsetHeight; 25574 25575 const fullHeight = content.scrollHeight; 25576 25577 // Restore line-clamp 25578 textElement.classList.add('text-read-more__text--collapsed'); 25579 25580 // Show button if content exceeds 2 lines (with small threshold for rounding) 25581 if (fullHeight > collapsedHeight + 5) { 25582 button.removeAttribute('hidden'); 25583 } else { 25584 button.setAttribute('hidden', ''); 25585 } 25586 } 25587 25588 #toggle(content, textElement, button) { 25589 const startHeight = content.offsetHeight; 25590 let endHeight; 25591 25592 if (!this.#expanded) { 25593 // Expanding 25594 textElement.classList.remove('text-read-more__text--collapsed'); 25595 endHeight = content.scrollHeight; 25596 this.#expanded = true; 25597 } else { 25598 // Collapsing 25599 endHeight = this.#collapsedHeight; 25600 this.#expanded = false; 25601 } 25602 25603 this.dataset.expanded = this.#expanded; 25604 button.setAttribute('aria-expanded', this.#expanded); 25605 25606 // Animate 25607 content.style.overflow = 'hidden'; 25608 this.#animation?.cancel(); 25609 25610 this.#animation = content.animate( 25611 { 25612 height: [`${startHeight}px`, `${endHeight}px`], 25613 }, 25614 { 25615 duration: 300, 25616 easing: 'ease-in-out', 25617 } 25618 ); 25619 25620 this.#animation.onfinish = () => { 25621 if (this.#expanded) { 25622 content.style.removeProperty('height'); 25623 content.style.overflow = ''; 25624 } else { 25625 textElement.classList.add('text-read-more__text--collapsed'); 25626 content.style.removeProperty('height'); 25627 content.style.overflow = ''; 25628 } 25629 }; 25630 } 25631 } 25632 25633 if (!customElements.get('text-read-more-wrapper')) { 25634 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 25635 } 25636</script>
25636 25637 25638 25639 25640 25641</div> 25642</div> 25643 25644 25645
25646<script type="module"> 25647 (function() { 25648 // Only run if Intersection Observer is supported 25649 if (typeof IntersectionObserver === 'undefined') { 25650 // Fallback: show all animated content immediately 25651 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 25652 el.classList.add('group-block-content--in-view'); 25653 }); 25654 return; 25655 } 25656 25657 // Respect reduced motion preference 25658 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 25659 if (prefersReducedMotion) { 25660 // Show all animated content immediately without animation 25661 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 25662 el.style.opacity = '1'; 25663 el.style.transform = 'none'; 25664 }); 25665 return; 25666 } 25667 25668 // Set up Intersection Observer for scroll-triggered animations 25669 const observerOptions = { 25670 root: null, 25671 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 25672 threshold: 0.1 // Trigger when 10% of element is visible 25673 }; 25674 25675 const observer = new IntersectionObserver((entries) => { 25676 entries.forEach(entry => { 25677 if (entry.isIntersecting) { 25678 const contentElement = entry.target; 25679 // Add the in-view class to trigger animation 25680 contentElement.classList.add('group-block-content--in-view'); 25681 // Unobserve after animation is triggered (only animate once) 25682 observer.unobserve(contentElement); 25683 } 25684 }); 25685 }, observerOptions); 25686 25687 // Observe all group blocks with animations 25688 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 25689 observer.observe(el); 25690 }); 25691 })(); 25692</script>
25692 25693 25694 25695 25696 25697 25698 25699<div 25700 class=" 25701 group-block 25702 group-block--height-custom_px 25703 group-block--width-fill 25704 border-style 25705 spacing-style 25706 size-style 25707 group-block--text-arrow-on-hover 25708 25709 25710 25711 " 25712 style=" 25713 --border-width: 1px; --border-style: none; --border-color: 25714rgb(var(--color-border-rgb) / 1.0); --border-radius: 2571512px; overflow: hidden; 25716 25717 --padding-block-start: max(20px, calc(var(--spacing-scale) * 100px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 36px));--padding-inline-start: max(20px, calc(var(--spacing-scale) * 36px));--padding-inline-end: max(20px, calc(var(--spacing-scale) * 36px)); 25718 --size-style-width: 100%;--size-style-height: 260px;--size-style-height-mobile: 240px;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 25719 25720 " 25721 25722 data-testid="group-block" 25723><a 25724 href="https://account.tnbl.co.uk" 25725 class="group-block__link" 25726 25727 target="_blank" rel="noopener" 25728 25729 ></a><div class="group-block__media-wrapper"> 25730 25731 <div 25732 class="background-image-container" 25733 > 25734 25735 25736 <img src="//www.tnbl.co.uk/cdn/shop/files/Trade_Accounts.png?v=1766494686&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Trade_Accounts.png?v=1766494686&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Trade_Accounts.png?v=1766494686&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Trade_Accounts.png?v=1766494686&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Trade_Accounts.png?v=1766494686&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Trade_Accounts.png?v=1766494686&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Trade_Accounts.png?v=1766494686&width=3840 3840w" width="3840" height="2152" loading="lazy" sizes="(min-width: 1440px) 1440px, 100vw" fetchpriority="auto"> 25737</div> 25738 25739 25740 25741 25742 25743 </div> 25744 25745 <div 25746 class=" 25747 group-block-content 25748 25749 layout-panel-flex 25750 layout-panel-flex--column 25751 mobile-column 25752 25753 25754 " 25755 25756 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 25757 25758--gap: 12px; 25759 25760--horizontal-alignment: flex-start; --vertical-alignment: flex-end; 25761--vertical-alignment-mobile: flex-end; 25762" 25763 > 25764 25765 25766 25767 25768 25769 25770 25771 25772 25773 25774 <div class=" spacing-style text-block text-block--AbitCSVE4alprdDdlS__text_KkFtgm h3 " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 25775 <h2>Trade Account</h2> 25776 </div> 25777 25778 25779 25780 25781
25782<script type="module"> 25783 class TextReadMoreWrapper extends HTMLElement { 25784 #expanded = false; 25785 #animation = null; 25786 #collapsedHeight = 0; 25787 25788 connectedCallback() { 25789 const content = this.querySelector('.text-read-more__content'); 25790 const textElement = this.querySelector('.text-read-more__text'); 25791 const button = this.querySelector('.text-read-more__button'); 25792 25793 if (!content || !textElement || !button) return; 25794 25795 // Set initial state 25796 this.dataset.expanded = 'false'; 25797 25798 // Wait for content to render - use double RAF to ensure layout is complete 25799 requestAnimationFrame(() => { 25800 requestAnimationFrame(() => { 25801 // Additional small delay to ensure fonts and styles are applied 25802 setTimeout(() => { 25803 this.#checkOverflow(content, textElement, button); 25804 }, 50); 25805 25806 // Recheck on resize 25807 const resizeObserver = new ResizeObserver(() => { 25808 if (!this.#expanded) { 25809 this.#checkOverflow(content, textElement, button); 25810 } 25811 }); 25812 resizeObserver.observe(content); 25813 25814 // Setup button click handler 25815 button.addEventListener('click', (e) => { 25816 e.preventDefault(); 25817 this.#toggle(content, textElement, button); 25818 }); 25819 }); 25820 }); 25821 } 25822 25823 #checkOverflow(content, textElement, button) { 25824 // Ensure collapsed state is applied 25825 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 25826 textElement.classList.add('text-read-more__text--collapsed'); 25827 } 25828 25829 // Get collapsed height first 25830 const collapsedHeight = content.scrollHeight; 25831 this.#collapsedHeight = collapsedHeight; 25832 25833 // Temporarily remove line-clamp to measure full height 25834 textElement.classList.remove('text-read-more__text--collapsed'); 25835 25836 // Force reflow 25837 void content.offsetHeight; 25838 25839 const fullHeight = content.scrollHeight; 25840 25841 // Restore line-clamp 25842 textElement.classList.add('text-read-more__text--collapsed'); 25843 25844 // Show button if content exceeds 2 lines (with small threshold for rounding) 25845 if (fullHeight > collapsedHeight + 5) { 25846 button.removeAttribute('hidden'); 25847 } else { 25848 button.setAttribute('hidden', ''); 25849 } 25850 } 25851 25852 #toggle(content, textElement, button) { 25853 const startHeight = content.offsetHeight; 25854 let endHeight; 25855 25856 if (!this.#expanded) { 25857 // Expanding 25858 textElement.classList.remove('text-read-more__text--collapsed'); 25859 endHeight = content.scrollHeight; 25860 this.#expanded = true; 25861 } else { 25862 // Collapsing 25863 endHeight = this.#collapsedHeight; 25864 this.#expanded = false; 25865 } 25866 25867 this.dataset.expanded = this.#expanded; 25868 button.setAttribute('aria-expanded', this.#expanded); 25869 25870 // Animate 25871 content.style.overflow = 'hidden'; 25872 this.#animation?.cancel(); 25873 25874 this.#animation = content.animate( 25875 { 25876 height: [`${startHeight}px`, `${endHeight}px`], 25877 }, 25878 { 25879 duration: 300, 25880 easing: 'ease-in-out', 25881 } 25882 ); 25883 25884 this.#animation.onfinish = () => { 25885 if (this.#expanded) { 25886 content.style.removeProperty('height'); 25887 content.style.overflow = ''; 25888 } else { 25889 textElement.classList.add('text-read-more__text--collapsed'); 25890 content.style.removeProperty('height'); 25891 content.style.overflow = ''; 25892 } 25893 }; 25894 } 25895 } 25896 25897 if (!customElements.get('text-read-more-wrapper')) { 25898 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 25899 } 25900</script>
25900 25901 25902 25903 25904 25905 25906 25907 25908 25909 25910 25911 25912 25913 25914 <rte-formatter class=" spacing-style text-block text-block--AN1pqeUFkMHp0cjFGQ__text_KtqYH9 rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 25915 <p>All accounts get our best prices. *T&C's Apply.</p> 25916 </rte-formatter> 25917 25918 25919 25920 25921
25922<script type="module"> 25923 class TextReadMoreWrapper extends HTMLElement { 25924 #expanded = false; 25925 #animation = null; 25926 #collapsedHeight = 0; 25927 25928 connectedCallback() { 25929 const content = this.querySelector('.text-read-more__content'); 25930 const textElement = this.querySelector('.text-read-more__text'); 25931 const button = this.querySelector('.text-read-more__button'); 25932 25933 if (!content || !textElement || !button) return; 25934 25935 // Set initial state 25936 this.dataset.expanded = 'false'; 25937 25938 // Wait for content to render - use double RAF to ensure layout is complete 25939 requestAnimationFrame(() => { 25940 requestAnimationFrame(() => { 25941 // Additional small delay to ensure fonts and styles are applied 25942 setTimeout(() => { 25943 this.#checkOverflow(content, textElement, button); 25944 }, 50); 25945 25946 // Recheck on resize 25947 const resizeObserver = new ResizeObserver(() => { 25948 if (!this.#expanded) { 25949 this.#checkOverflow(content, textElement, button); 25950 } 25951 }); 25952 resizeObserver.observe(content); 25953 25954 // Setup button click handler 25955 button.addEventListener('click', (e) => { 25956 e.preventDefault(); 25957 this.#toggle(content, textElement, button); 25958 }); 25959 }); 25960 }); 25961 } 25962 25963 #checkOverflow(content, textElement, button) { 25964 // Ensure collapsed state is applied 25965 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 25966 textElement.classList.add('text-read-more__text--collapsed'); 25967 } 25968 25969 // Get collapsed height first 25970 const collapsedHeight = content.scrollHeight; 25971 this.#collapsedHeight = collapsedHeight; 25972 25973 // Temporarily remove line-clamp to measure full height 25974 textElement.classList.remove('text-read-more__text--collapsed'); 25975 25976 // Force reflow 25977 void content.offsetHeight; 25978 25979 const fullHeight = content.scrollHeight; 25980 25981 // Restore line-clamp 25982 textElement.classList.add('text-read-more__text--collapsed'); 25983 25984 // Show button if content exceeds 2 lines (with small threshold for rounding) 25985 if (fullHeight > collapsedHeight + 5) { 25986 button.removeAttribute('hidden'); 25987 } else { 25988 button.setAttribute('hidden', ''); 25989 } 25990 } 25991 25992 #toggle(content, textElement, button) { 25993 const startHeight = content.offsetHeight; 25994 let endHeight; 25995 25996 if (!this.#expanded) { 25997 // Expanding 25998 textElement.classList.remove('text-read-more__text--collapsed'); 25999 endHeight = content.scrollHeight; 26000 this.#expanded = true; 26001 } else { 26002 // Collapsing 26003 endHeight = this.#collapsedHeight; 26004 this.#expanded = false; 26005 } 26006 26007 this.dataset.expanded = this.#expanded; 26008 button.setAttribute('aria-expanded', this.#expanded); 26009 26010 // Animate 26011 content.style.overflow = 'hidden'; 26012 this.#animation?.cancel(); 26013 26014 this.#animation = content.animate( 26015 { 26016 height: [`${startHeight}px`, `${endHeight}px`], 26017 }, 26018 { 26019 duration: 300, 26020 easing: 'ease-in-out', 26021 } 26022 ); 26023 26024 this.#animation.onfinish = () => { 26025 if (this.#expanded) { 26026 content.style.removeProperty('height'); 26027 content.style.overflow = ''; 26028 } else { 26029 textElement.classList.add('text-read-more__text--collapsed'); 26030 content.style.removeProperty('height'); 26031 content.style.overflow = ''; 26032 } 26033 }; 26034 } 26035 } 26036 26037 if (!customElements.get('text-read-more-wrapper')) { 26038 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 26039 } 26040</script>
26040 26041 26042 26043 26044 26045</div> 26046</div> 26047 26048 26049
26050<script type="module"> 26051 (function() { 26052 // Only run if Intersection Observer is supported 26053 if (typeof IntersectionObserver === 'undefined') { 26054 // Fallback: show all animated content immediately 26055 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 26056 el.classList.add('group-block-content--in-view'); 26057 }); 26058 return; 26059 } 26060 26061 // Respect reduced motion preference 26062 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 26063 if (prefersReducedMotion) { 26064 // Show all animated content immediately without animation 26065 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 26066 el.style.opacity = '1'; 26067 el.style.transform = 'none'; 26068 }); 26069 return; 26070 } 26071 26072 // Set up Intersection Observer for scroll-triggered animations 26073 const observerOptions = { 26074 root: null, 26075 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 26076 threshold: 0.1 // Trigger when 10% of element is visible 26077 }; 26078 26079 const observer = new IntersectionObserver((entries) => { 26080 entries.forEach(entry => { 26081 if (entry.isIntersecting) { 26082 const contentElement = entry.target; 26083 // Add the in-view class to trigger animation 26084 contentElement.classList.add('group-block-content--in-view'); 26085 // Unobserve after animation is triggered (only animate once) 26086 observer.unobserve(contentElement); 26087 } 26088 }); 26089 }, observerOptions); 26090 26091 // Observe all group blocks with animations 26092 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 26093 observer.observe(el); 26094 }); 26095 })(); 26096</script>
26096 26097 26098 26099 26100 26101 26102 26103<div 26104 class=" 26105 group-block 26106 group-block--height-custom_px 26107 group-block--width-fill 26108 border-style 26109 spacing-style 26110 size-style 26111 group-block--text-arrow-on-hover 26112 26113 26114 26115 " 26116 style=" 26117 --border-width: 1px; --border-style: none; --border-color: 26118rgb(var(--color-border-rgb) / 1.0); --border-radius: 2611912px; overflow: hidden; 26120 26121 --padding-block-start: max(20px, calc(var(--spacing-scale) * 100px));--padding-block-end: max(20px, calc(var(--spacing-scale) * 36px));--padding-inline-start: max(20px, calc(var(--spacing-scale) * 36px));--padding-inline-end: max(20px, calc(var(--spacing-scale) * 36px)); 26122 --size-style-width: 100%;--size-style-height: 260px;--size-style-height-mobile: 240px;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 26123 26124 " 26125 26126 data-testid="group-block" 26127><a 26128 href="/pages/our-store" 26129 class="group-block__link" 26130 26131 ></a><div class="group-block__media-wrapper"> 26132 26133 <div 26134 class="background-image-container" 26135 > 26136 26137 26138 <img src="//www.tnbl.co.uk/cdn/shop/files/Our_Store.png?v=1766494696&width=3840" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/Our_Store.png?v=1766494696&width=832 832w, //www.tnbl.co.uk/cdn/shop/files/Our_Store.png?v=1766494696&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/files/Our_Store.png?v=1766494696&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/files/Our_Store.png?v=1766494696&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/files/Our_Store.png?v=1766494696&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/files/Our_Store.png?v=1766494696&width=3840 3840w" width="3840" height="2152" loading="lazy" sizes="(min-width: 1440px) 1440px, 100vw" fetchpriority="auto"> 26139</div> 26140 26141 26142 26143 26144 26145 </div> 26146 26147 <div 26148 class=" 26149 group-block-content 26150 26151 layout-panel-flex 26152 layout-panel-flex--column 26153 mobile-column 26154 26155 26156 " 26157 26158 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 26159 26160--gap: 12px; 26161 26162--horizontal-alignment: flex-start; --vertical-alignment: flex-end; 26163--vertical-alignment-mobile: flex-end; 26164" 26165 > 26166 26167 26168 26169 26170 26171 26172 26173 26174 26175 26176 <div class=" spacing-style text-block text-block--AeHVzV1E2ZFdoVGdmO__text_Bacjhw h3 " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 26177 <h2>Our Store</h2> 26178 </div> 26179 26180 26181 26182 26183
26184<script type="module"> 26185 class TextReadMoreWrapper extends HTMLElement { 26186 #expanded = false; 26187 #animation = null; 26188 #collapsedHeight = 0; 26189 26190 connectedCallback() { 26191 const content = this.querySelector('.text-read-more__content'); 26192 const textElement = this.querySelector('.text-read-more__text'); 26193 const button = this.querySelector('.text-read-more__button'); 26194 26195 if (!content || !textElement || !button) return; 26196 26197 // Set initial state 26198 this.dataset.expanded = 'false'; 26199 26200 // Wait for content to render - use double RAF to ensure layout is complete 26201 requestAnimationFrame(() => { 26202 requestAnimationFrame(() => { 26203 // Additional small delay to ensure fonts and styles are applied 26204 setTimeout(() => { 26205 this.#checkOverflow(content, textElement, button); 26206 }, 50); 26207 26208 // Recheck on resize 26209 const resizeObserver = new ResizeObserver(() => { 26210 if (!this.#expanded) { 26211 this.#checkOverflow(content, textElement, button); 26212 } 26213 }); 26214 resizeObserver.observe(content); 26215 26216 // Setup button click handler 26217 button.addEventListener('click', (e) => { 26218 e.preventDefault(); 26219 this.#toggle(content, textElement, button); 26220 }); 26221 }); 26222 }); 26223 } 26224 26225 #checkOverflow(content, textElement, button) { 26226 // Ensure collapsed state is applied 26227 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 26228 textElement.classList.add('text-read-more__text--collapsed'); 26229 } 26230 26231 // Get collapsed height first 26232 const collapsedHeight = content.scrollHeight; 26233 this.#collapsedHeight = collapsedHeight; 26234 26235 // Temporarily remove line-clamp to measure full height 26236 textElement.classList.remove('text-read-more__text--collapsed'); 26237 26238 // Force reflow 26239 void content.offsetHeight; 26240 26241 const fullHeight = content.scrollHeight; 26242 26243 // Restore line-clamp 26244 textElement.classList.add('text-read-more__text--collapsed'); 26245 26246 // Show button if content exceeds 2 lines (with small threshold for rounding) 26247 if (fullHeight > collapsedHeight + 5) { 26248 button.removeAttribute('hidden'); 26249 } else { 26250 button.setAttribute('hidden', ''); 26251 } 26252 } 26253 26254 #toggle(content, textElement, button) { 26255 const startHeight = content.offsetHeight; 26256 let endHeight; 26257 26258 if (!this.#expanded) { 26259 // Expanding 26260 textElement.classList.remove('text-read-more__text--collapsed'); 26261 endHeight = content.scrollHeight; 26262 this.#expanded = true; 26263 } else { 26264 // Collapsing 26265 endHeight = this.#collapsedHeight; 26266 this.#expanded = false; 26267 } 26268 26269 this.dataset.expanded = this.#expanded; 26270 button.setAttribute('aria-expanded', this.#expanded); 26271 26272 // Animate 26273 content.style.overflow = 'hidden'; 26274 this.#animation?.cancel(); 26275 26276 this.#animation = content.animate( 26277 { 26278 height: [`${startHeight}px`, `${endHeight}px`], 26279 }, 26280 { 26281 duration: 300, 26282 easing: 'ease-in-out', 26283 } 26284 ); 26285 26286 this.#animation.onfinish = () => { 26287 if (this.#expanded) { 26288 content.style.removeProperty('height'); 26289 content.style.overflow = ''; 26290 } else { 26291 textElement.classList.add('text-read-more__text--collapsed'); 26292 content.style.removeProperty('height'); 26293 content.style.overflow = ''; 26294 } 26295 }; 26296 } 26297 } 26298 26299 if (!customElements.get('text-read-more-wrapper')) { 26300 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 26301 } 26302</script>
26302 26303 26304 26305 26306 26307 26308 26309 26310 26311 26312 26313 26314 26315 26316 <rte-formatter class=" spacing-style text-block text-block--AbytKN3ZqU1o5Y2k3U__text_rJw4KU rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 26317 <p>Come visit us in person</p> 26318 </rte-formatter> 26319 26320 26321 26322 26323
26324<script type="module"> 26325 class TextReadMoreWrapper extends HTMLElement { 26326 #expanded = false; 26327 #animation = null; 26328 #collapsedHeight = 0; 26329 26330 connectedCallback() { 26331 const content = this.querySelector('.text-read-more__content'); 26332 const textElement = this.querySelector('.text-read-more__text'); 26333 const button = this.querySelector('.text-read-more__button'); 26334 26335 if (!content || !textElement || !button) return; 26336 26337 // Set initial state 26338 this.dataset.expanded = 'false'; 26339 26340 // Wait for content to render - use double RAF to ensure layout is complete 26341 requestAnimationFrame(() => { 26342 requestAnimationFrame(() => { 26343 // Additional small delay to ensure fonts and styles are applied 26344 setTimeout(() => { 26345 this.#checkOverflow(content, textElement, button); 26346 }, 50); 26347 26348 // Recheck on resize 26349 const resizeObserver = new ResizeObserver(() => { 26350 if (!this.#expanded) { 26351 this.#checkOverflow(content, textElement, button); 26352 } 26353 }); 26354 resizeObserver.observe(content); 26355 26356 // Setup button click handler 26357 button.addEventListener('click', (e) => { 26358 e.preventDefault(); 26359 this.#toggle(content, textElement, button); 26360 }); 26361 }); 26362 }); 26363 } 26364 26365 #checkOverflow(content, textElement, button) { 26366 // Ensure collapsed state is applied 26367 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 26368 textElement.classList.add('text-read-more__text--collapsed'); 26369 } 26370 26371 // Get collapsed height first 26372 const collapsedHeight = content.scrollHeight; 26373 this.#collapsedHeight = collapsedHeight; 26374 26375 // Temporarily remove line-clamp to measure full height 26376 textElement.classList.remove('text-read-more__text--collapsed'); 26377 26378 // Force reflow 26379 void content.offsetHeight; 26380 26381 const fullHeight = content.scrollHeight; 26382 26383 // Restore line-clamp 26384 textElement.classList.add('text-read-more__text--collapsed'); 26385 26386 // Show button if content exceeds 2 lines (with small threshold for rounding) 26387 if (fullHeight > collapsedHeight + 5) { 26388 button.removeAttribute('hidden'); 26389 } else { 26390 button.setAttribute('hidden', ''); 26391 } 26392 } 26393 26394 #toggle(content, textElement, button) { 26395 const startHeight = content.offsetHeight; 26396 let endHeight; 26397 26398 if (!this.#expanded) { 26399 // Expanding 26400 textElement.classList.remove('text-read-more__text--collapsed'); 26401 endHeight = content.scrollHeight; 26402 this.#expanded = true; 26403 } else { 26404 // Collapsing 26405 endHeight = this.#collapsedHeight; 26406 this.#expanded = false; 26407 } 26408 26409 this.dataset.expanded = this.#expanded; 26410 button.setAttribute('aria-expanded', this.#expanded); 26411 26412 // Animate 26413 content.style.overflow = 'hidden'; 26414 this.#animation?.cancel(); 26415 26416 this.#animation = content.animate( 26417 { 26418 height: [`${startHeight}px`, `${endHeight}px`], 26419 }, 26420 { 26421 duration: 300, 26422 easing: 'ease-in-out', 26423 } 26424 ); 26425 26426 this.#animation.onfinish = () => { 26427 if (this.#expanded) { 26428 content.style.removeProperty('height'); 26429 content.style.overflow = ''; 26430 } else { 26431 textElement.classList.add('text-read-more__text--collapsed'); 26432 content.style.removeProperty('height'); 26433 content.style.overflow = ''; 26434 } 26435 }; 26436 } 26437 } 26438 26439 if (!customElements.get('text-read-more-wrapper')) { 26440 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 26441 } 26442</script>
26442 26443 26444 26445 26446 26447</div> 26448</div> 26449 26450 26451
26452<script type="module"> 26453 (function() { 26454 // Only run if Intersection Observer is supported 26455 if (typeof IntersectionObserver === 'undefined') { 26456 // Fallback: show all animated content immediately 26457 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 26458 el.classList.add('group-block-content--in-view'); 26459 }); 26460 return; 26461 } 26462 26463 // Respect reduced motion preference 26464 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 26465 if (prefersReducedMotion) { 26466 // Show all animated content immediately without animation 26467 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 26468 el.style.opacity = '1'; 26469 el.style.transform = 'none'; 26470 }); 26471 return; 26472 } 26473 26474 // Set up Intersection Observer for scroll-triggered animations 26475 const observerOptions = { 26476 root: null, 26477 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 26478 threshold: 0.1 // Trigger when 10% of element is visible 26479 }; 26480 26481 const observer = new IntersectionObserver((entries) => { 26482 entries.forEach(entry => { 26483 if (entry.isIntersecting) { 26484 const contentElement = entry.target; 26485 // Add the in-view class to trigger animation 26486 contentElement.classList.add('group-block-content--in-view'); 26487 // Unobserve after animation is triggered (only animate once) 26488 observer.unobserve(contentElement); 26489 } 26490 }); 26491 }, observerOptions); 26492 26493 // Observe all group blocks with animations 26494 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 26495 observer.observe(el); 26496 }); 26497 })(); 26498</script>
26498 26499 26500 26501 26502 26503 26504 </div> 26505 </div> 26506</div> 26507 26508 26509 26510 26511 26512</div><section id="shopify-section-template--28213213921626__featured_blog_posts_FbCxA9" class="shopify-section featured-blog-posts"> 26513 26514 26515 26516<div class="section-background color-scheme-1"></div> 26517 26518<div 26519 class=" 26520 section 26521 section--page-width 26522 color-scheme-1 26523 section-resource-list 26524 spacing-style 26525 gap-style 26526 26527 " 26528 style="--padding-block-start: 0px;--padding-block-end: max(20px, calc(var(--spacing-scale) * 82px));--gap: 12px;" 26529> 26530 <div id="shopify-block-AcHZEa2pqWTVsblpOU__static-blog-title" class="shopify-block"> 26531 26532 26533 26534<div class="featured-blog-posts-title-wrapper"> 26535 <div class="featured-blog-posts-title__title"> 26536 26537 26538 26539 26540 26541 26542 26543 26544 <div class=" spacing-style text-block text-block--AcHZEa2pqWTVsblpOU__static-blog-title h3 " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 26545 <h3>Beyond the Base Coat</h3> 26546 </div> 26547 26548 26549 26550 26551
26552<script type="module"> 26553 class TextReadMoreWrapper extends HTMLElement { 26554 #expanded = false; 26555 #animation = null; 26556 #collapsedHeight = 0; 26557 26558 connectedCallback() { 26559 const content = this.querySelector('.text-read-more__content'); 26560 const textElement = this.querySelector('.text-read-more__text'); 26561 const button = this.querySelector('.text-read-more__button'); 26562 26563 if (!content || !textElement || !button) return; 26564 26565 // Set initial state 26566 this.dataset.expanded = 'false'; 26567 26568 // Wait for content to render - use double RAF to ensure layout is complete 26569 requestAnimationFrame(() => { 26570 requestAnimationFrame(() => { 26571 // Additional small delay to ensure fonts and styles are applied 26572 setTimeout(() => { 26573 this.#checkOverflow(content, textElement, button); 26574 }, 50); 26575 26576 // Recheck on resize 26577 const resizeObserver = new ResizeObserver(() => { 26578 if (!this.#expanded) { 26579 this.#checkOverflow(content, textElement, button); 26580 } 26581 }); 26582 resizeObserver.observe(content); 26583 26584 // Setup button click handler 26585 button.addEventListener('click', (e) => { 26586 e.preventDefault(); 26587 this.#toggle(content, textElement, button); 26588 }); 26589 }); 26590 }); 26591 } 26592 26593 #checkOverflow(content, textElement, button) { 26594 // Ensure collapsed state is applied 26595 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 26596 textElement.classList.add('text-read-more__text--collapsed'); 26597 } 26598 26599 // Get collapsed height first 26600 const collapsedHeight = content.scrollHeight; 26601 this.#collapsedHeight = collapsedHeight; 26602 26603 // Temporarily remove line-clamp to measure full height 26604 textElement.classList.remove('text-read-more__text--collapsed'); 26605 26606 // Force reflow 26607 void content.offsetHeight; 26608 26609 const fullHeight = content.scrollHeight; 26610 26611 // Restore line-clamp 26612 textElement.classList.add('text-read-more__text--collapsed'); 26613 26614 // Show button if content exceeds 2 lines (with small threshold for rounding) 26615 if (fullHeight > collapsedHeight + 5) { 26616 button.removeAttribute('hidden'); 26617 } else { 26618 button.setAttribute('hidden', ''); 26619 } 26620 } 26621 26622 #toggle(content, textElement, button) { 26623 const startHeight = content.offsetHeight; 26624 let endHeight; 26625 26626 if (!this.#expanded) { 26627 // Expanding 26628 textElement.classList.remove('text-read-more__text--collapsed'); 26629 endHeight = content.scrollHeight; 26630 this.#expanded = true; 26631 } else { 26632 // Collapsing 26633 endHeight = this.#collapsedHeight; 26634 this.#expanded = false; 26635 } 26636 26637 this.dataset.expanded = this.#expanded; 26638 button.setAttribute('aria-expanded', this.#expanded); 26639 26640 // Animate 26641 content.style.overflow = 'hidden'; 26642 this.#animation?.cancel(); 26643 26644 this.#animation = content.animate( 26645 { 26646 height: [`${startHeight}px`, `${endHeight}px`], 26647 }, 26648 { 26649 duration: 300, 26650 easing: 'ease-in-out', 26651 } 26652 ); 26653 26654 this.#animation.onfinish = () => { 26655 if (this.#expanded) { 26656 content.style.removeProperty('height'); 26657 content.style.overflow = ''; 26658 } else { 26659 textElement.classList.add('text-read-more__text--collapsed'); 26660 content.style.removeProperty('height'); 26661 content.style.overflow = ''; 26662 } 26663 }; 26664 } 26665 } 26666 26667 if (!customElements.get('text-read-more-wrapper')) { 26668 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 26669 } 26670</script>
26670 26671 26672 </div> 26673 26674 26675 <div class="featured-blog-posts-title__link-wrapper"> 26676 <a 26677 href="/blogs/blog" 26678 class="featured-blog-posts-title__link custom-typography 26679 custom-font-size 26680 custom-color" 26681 style=" 26682 26683 26684 26685 26686 --font-size: 1rem; 26687 26688 26689 26690 --font-family: var(--font-body--family); 26691 --font-weight: var(--font-body--weight); 26692 26693 --text-transform: none; 26694 --line-height: var(--line-height--body-normal); 26695 --letter-spacing: var(--letter-spacing--body-normal); 26696 26697 --color: var(--color-primary); 26698 text-decoration: none; 26699 white-space: nowrap; 26700 " 26701 > 26702 View Blog 26703 <span class="featured-blog-posts-title__link-icon" aria-hidden="true"> 26704 <svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 26705 <path d="M1.5 1L6.5 6L1.5 11" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 26706</svg> 26707 26708 </span> 26709 </a> 26710 </div> 26711 26712</div> 26713 26714 26715 26716 26717</div> 26718 26719 26720 26721 26722 26723 26724 26725 26726 26727 26728 26729 26730<div 26731 class=" 26732 resource-list 26733 26734 force-full-width 26735 26736 26737 resource-list__carousel 26738 " 26739 style="--resource-list-column-gap-desktop: 24px;--column-count: 4;--column-count-mobile: 1;--mobile-card-size: 60cqw;" 26740 26741 data-testid="featured-blog-posts" 26742 26743> 26744 26745 26746 26747 26748 26749<div 26750 class="resource-list__carousel" 26751 style="--gutter-slide-width: var(--util-page-margin-offset); --slide-width-max: 450px;" 26752> 26753 <slideshow-component 26754 26755 ref="featuredBlog" 26756 26757 26758 class="resource-list__carousel" 26759 26760 style="--slideshow-timeline: --slide-1, --slide-2, --slide-3, --slide-4, --slide-5, --slide-6, --slide-7, --slide-8, --slide-9, --slide-10;--slide-min-height: auto;--slide-min-height-desktop: auto;" 26761 26762 initial-slide="0" 26763 26764 26765 26766 26767 26768> 26769 26770 <slideshow-container ref="slideshowContainer"> 26771 26772 26773 <slideshow-slides 26774 tabindex="-1" 26775 ref="scroller" 26776 26777 gutters="start end" 26778 26779 > 26780 26781 26782 <slideshow-slide 26783 ref="slides[]" 26784 aria-hidden="false" 26785 style="--slideshow-timeline: --slide-0; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 26786 26787 class="resource-list__slide" 26788 26789 26790 26791 26792 26793 26794 26795> 26796 <div class="resource-list__item"> 26797 26798 26799 26800 26801 26802 26803 26804 26805 26806 26807 26808 26809 26810 26811<div 26812 class=" 26813 featured-blog-posts-card spacing-style border-style 26814 26815 26816 " 26817 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card" 26818 data-testid="featured-blog-posts-card" 26819 26820 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 26821rgb(var(--color-border-rgb) / 1.0); --border-radius: 268220px; 26823--text-align: left; 26824 --horizontal-alignment: left; 26825 --gap: 8px; 26826 " 26827 26828> 26829 <a 26830 class="featured-blog-posts-card__link" 26831 26832 href="/blogs/blog/should-i-use-led-or-uv-nail-lamp" 26833 26834 > 26835 <span class="visually-hidden">Should I Use LED or UV Nail Lamp?</span> 26836 </a> 26837 26838 <div class="featured-blog-posts-card__inner"> 26839 26840 26841 26842 26843 26844 26845 26846<style data-shopify> 26847 26848 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card"] { 26849 --ratio: 1 / 1; 26850 } 26851 26852</style> 26853 26854 26855 <div 26856 class=" 26857 image-block 26858 resource-image 26859 26860 26861 featured-blog-posts-card__image 26862 26863 spacing-style border-style 26864 26865 " 26866 style="--border-width: 1px; --border-style: none; --border-color: 26867rgb(var(--color-border-rgb) / 1.0); --border-radius: 2686812px; overflow: hidden; 26869" 26870 26871 > 26872 <img src="//www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=3840" alt="Should I Use LED or UV Nail Lamp?" srcset="//www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/UV_LED_Lamp_46caee69-3202-4498-b4c2-cf81d7681959.png?v=1789728093&width=3840 3840w" width="3840" height="2560" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 26873 26874 </div> 26875 26876 26877 26878 26879 26880 26881 26882 26883 26884 26885 26886 26887 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 26888 <h4> 26889 26890 26891 26892 26893 26894 26895 26896 26897 26898 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 26899 <h4>Should I Use LED or UV Nail Lamp?</h4> 26900 </div> 26901 26902 26903 26904 26905
26906<script type="module"> 26907 class TextReadMoreWrapper extends HTMLElement { 26908 #expanded = false; 26909 #animation = null; 26910 #collapsedHeight = 0; 26911 26912 connectedCallback() { 26913 const content = this.querySelector('.text-read-more__content'); 26914 const textElement = this.querySelector('.text-read-more__text'); 26915 const button = this.querySelector('.text-read-more__button'); 26916 26917 if (!content || !textElement || !button) return; 26918 26919 // Set initial state 26920 this.dataset.expanded = 'false'; 26921 26922 // Wait for content to render - use double RAF to ensure layout is complete 26923 requestAnimationFrame(() => { 26924 requestAnimationFrame(() => { 26925 // Additional small delay to ensure fonts and styles are applied 26926 setTimeout(() => { 26927 this.#checkOverflow(content, textElement, button); 26928 }, 50); 26929 26930 // Recheck on resize 26931 const resizeObserver = new ResizeObserver(() => { 26932 if (!this.#expanded) { 26933 this.#checkOverflow(content, textElement, button); 26934 } 26935 }); 26936 resizeObserver.observe(content); 26937 26938 // Setup button click handler 26939 button.addEventListener('click', (e) => { 26940 e.preventDefault(); 26941 this.#toggle(content, textElement, button); 26942 }); 26943 }); 26944 }); 26945 } 26946 26947 #checkOverflow(content, textElement, button) { 26948 // Ensure collapsed state is applied 26949 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 26950 textElement.classList.add('text-read-more__text--collapsed'); 26951 } 26952 26953 // Get collapsed height first 26954 const collapsedHeight = content.scrollHeight; 26955 this.#collapsedHeight = collapsedHeight; 26956 26957 // Temporarily remove line-clamp to measure full height 26958 textElement.classList.remove('text-read-more__text--collapsed'); 26959 26960 // Force reflow 26961 void content.offsetHeight; 26962 26963 const fullHeight = content.scrollHeight; 26964 26965 // Restore line-clamp 26966 textElement.classList.add('text-read-more__text--collapsed'); 26967 26968 // Show button if content exceeds 2 lines (with small threshold for rounding) 26969 if (fullHeight > collapsedHeight + 5) { 26970 button.removeAttribute('hidden'); 26971 } else { 26972 button.setAttribute('hidden', ''); 26973 } 26974 } 26975 26976 #toggle(content, textElement, button) { 26977 const startHeight = content.offsetHeight; 26978 let endHeight; 26979 26980 if (!this.#expanded) { 26981 // Expanding 26982 textElement.classList.remove('text-read-more__text--collapsed'); 26983 endHeight = content.scrollHeight; 26984 this.#expanded = true; 26985 } else { 26986 // Collapsing 26987 endHeight = this.#collapsedHeight; 26988 this.#expanded = false; 26989 } 26990 26991 this.dataset.expanded = this.#expanded; 26992 button.setAttribute('aria-expanded', this.#expanded); 26993 26994 // Animate 26995 content.style.overflow = 'hidden'; 26996 this.#animation?.cancel(); 26997 26998 this.#animation = content.animate( 26999 { 27000 height: [`${startHeight}px`, `${endHeight}px`], 27001 }, 27002 { 27003 duration: 300, 27004 easing: 'ease-in-out', 27005 } 27006 ); 27007 27008 this.#animation.onfinish = () => { 27009 if (this.#expanded) { 27010 content.style.removeProperty('height'); 27011 content.style.overflow = ''; 27012 } else { 27013 textElement.classList.add('text-read-more__text--collapsed'); 27014 content.style.removeProperty('height'); 27015 content.style.overflow = ''; 27016 } 27017 }; 27018 } 27019 } 27020 27021 if (!customElements.get('text-read-more-wrapper')) { 27022 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 27023 } 27024</script>
27024 27025 27026 27027 27028 27029 27030 27031</h4> 27032 27033 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text" class="shopify-block"> 27034 27035 27036 27037 27038<div 27039 class=" 27040 blog-post-details 27041 spacing-style 27042 justify-left 27043 27044 " 27045 style="--padding-block-start: 0px;--padding-block-end: 0px;" 27046 ><span><time datetime="2026-09-17T13:45:02Z">September 17, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 27047 27048 27049 27050 27051 27052</div> 27053 27054 27055 27056 27057 27058 27059 <a href="/blogs/blog/should-i-use-led-or-uv-nail-lamp" class="featured-blog-posts-card__read-more">Read more...</a> 27060 27061 </div> 27062 </div> 27063</div> 27064 27065 27066 27067 27068 27069 </div> 27070 27071 27072</slideshow-slide> 27073 27074 27075 <slideshow-slide 27076 ref="slides[]" 27077 aria-hidden="true" 27078 style="--slideshow-timeline: --slide-1; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 27079 27080 class="resource-list__slide" 27081 27082 27083 27084 27085 27086 27087 27088> 27089 27090 27091 27092 <div class="resource-list__item"> 27093 27094 27095 27096 27097 27098 27099 27100 27101 27102 27103 27104 27105 27106 27107<div 27108 class=" 27109 featured-blog-posts-card spacing-style border-style 27110 27111 27112 " 27113 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-1" 27114 data-testid="featured-blog-posts-card" 27115 27116 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 27117rgb(var(--color-border-rgb) / 1.0); --border-radius: 271180px; 27119--text-align: left; 27120 --horizontal-alignment: left; 27121 --gap: 8px; 27122 " 27123 27124> 27125 <a 27126 class="featured-blog-posts-card__link" 27127 27128 href="/blogs/blog/you-might-be-doing-this-wrong" 27129 27130 > 27131 <span class="visually-hidden">You Might Be Doing This Wrong</span> 27132 </a> 27133 27134 <div class="featured-blog-posts-card__inner"> 27135 27136 27137 27138 27139 27140 27141 27142<style data-shopify> 27143 27144 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-1"] { 27145 --ratio: 1 / 1; 27146 } 27147 27148</style> 27149 27150 27151 <div 27152 class=" 27153 image-block 27154 resource-image 27155 27156 27157 featured-blog-posts-card__image 27158 27159 spacing-style border-style 27160 27161 " 27162 style="--border-width: 1px; --border-style: none; --border-color: 27163rgb(var(--color-border-rgb) / 1.0); --border-radius: 2716412px; overflow: hidden; 27165" 27166 27167 > 27168 <img src="//www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=3840" alt="You Might Be Doing This Wrong" srcset="//www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/Blog1_96bc7f51-a5d3-4698-994b-afe1ce91c7ea.jpg?v=1789651809&width=3840 3840w" width="3840" height="3840" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 27169 27170 </div> 27171 27172 27173 27174 27175 27176 27177 27178 27179 27180 27181 27182 27183 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 27184 <h4> 27185 27186 27187 27188 27189 27190 27191 27192 27193 27194 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-1 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 27195 <h4>You Might Be Doing This Wrong</h4> 27196 </div> 27197 27198 27199 27200 27201
27202<script type="module"> 27203 class TextReadMoreWrapper extends HTMLElement { 27204 #expanded = false; 27205 #animation = null; 27206 #collapsedHeight = 0; 27207 27208 connectedCallback() { 27209 const content = this.querySelector('.text-read-more__content'); 27210 const textElement = this.querySelector('.text-read-more__text'); 27211 const button = this.querySelector('.text-read-more__button'); 27212 27213 if (!content || !textElement || !button) return; 27214 27215 // Set initial state 27216 this.dataset.expanded = 'false'; 27217 27218 // Wait for content to render - use double RAF to ensure layout is complete 27219 requestAnimationFrame(() => { 27220 requestAnimationFrame(() => { 27221 // Additional small delay to ensure fonts and styles are applied 27222 setTimeout(() => { 27223 this.#checkOverflow(content, textElement, button); 27224 }, 50); 27225 27226 // Recheck on resize 27227 const resizeObserver = new ResizeObserver(() => { 27228 if (!this.#expanded) { 27229 this.#checkOverflow(content, textElement, button); 27230 } 27231 }); 27232 resizeObserver.observe(content); 27233 27234 // Setup button click handler 27235 button.addEventListener('click', (e) => { 27236 e.preventDefault(); 27237 this.#toggle(content, textElement, button); 27238 }); 27239 }); 27240 }); 27241 } 27242 27243 #checkOverflow(content, textElement, button) { 27244 // Ensure collapsed state is applied 27245 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 27246 textElement.classList.add('text-read-more__text--collapsed'); 27247 } 27248 27249 // Get collapsed height first 27250 const collapsedHeight = content.scrollHeight; 27251 this.#collapsedHeight = collapsedHeight; 27252 27253 // Temporarily remove line-clamp to measure full height 27254 textElement.classList.remove('text-read-more__text--collapsed'); 27255 27256 // Force reflow 27257 void content.offsetHeight; 27258 27259 const fullHeight = content.scrollHeight; 27260 27261 // Restore line-clamp 27262 textElement.classList.add('text-read-more__text--collapsed'); 27263 27264 // Show button if content exceeds 2 lines (with small threshold for rounding) 27265 if (fullHeight > collapsedHeight + 5) { 27266 button.removeAttribute('hidden'); 27267 } else { 27268 button.setAttribute('hidden', ''); 27269 } 27270 } 27271 27272 #toggle(content, textElement, button) { 27273 const startHeight = content.offsetHeight; 27274 let endHeight; 27275 27276 if (!this.#expanded) { 27277 // Expanding 27278 textElement.classList.remove('text-read-more__text--collapsed'); 27279 endHeight = content.scrollHeight; 27280 this.#expanded = true; 27281 } else { 27282 // Collapsing 27283 endHeight = this.#collapsedHeight; 27284 this.#expanded = false; 27285 } 27286 27287 this.dataset.expanded = this.#expanded; 27288 button.setAttribute('aria-expanded', this.#expanded); 27289 27290 // Animate 27291 content.style.overflow = 'hidden'; 27292 this.#animation?.cancel(); 27293 27294 this.#animation = content.animate( 27295 { 27296 height: [`${startHeight}px`, `${endHeight}px`], 27297 }, 27298 { 27299 duration: 300, 27300 easing: 'ease-in-out', 27301 } 27302 ); 27303 27304 this.#animation.onfinish = () => { 27305 if (this.#expanded) { 27306 content.style.removeProperty('height'); 27307 content.style.overflow = ''; 27308 } else { 27309 textElement.classList.add('text-read-more__text--collapsed'); 27310 content.style.removeProperty('height'); 27311 content.style.overflow = ''; 27312 } 27313 }; 27314 } 27315 } 27316 27317 if (!customElements.get('text-read-more-wrapper')) { 27318 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 27319 } 27320</script>
27320 27321 27322 27323 27324 27325 27326 27327</h4> 27328 27329 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-1" class="shopify-block"> 27330 27331 27332 27333 27334<div 27335 class=" 27336 blog-post-details 27337 spacing-style 27338 justify-left 27339 27340 " 27341 style="--padding-block-start: 0px;--padding-block-end: 0px;" 27342 ><span><time datetime="2026-09-17T13:30:07Z">September 17, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 27343 27344 27345 27346 27347 27348</div> 27349 27350 27351 27352 27353 27354 27355 <a href="/blogs/blog/you-might-be-doing-this-wrong" class="featured-blog-posts-card__read-more">Read more...</a> 27356 27357 </div> 27358 </div> 27359</div> 27360 27361 27362 27363 27364 27365 </div> 27366 27367 27368</slideshow-slide> 27369 27370 27371 <slideshow-slide 27372 ref="slides[]" 27373 aria-hidden="true" 27374 style="--slideshow-timeline: --slide-2; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 27375 27376 class="resource-list__slide" 27377 27378 27379 27380 27381 27382 27383 27384> 27385 27386 27387 27388 <div class="resource-list__item"> 27389 27390 27391 27392 27393 27394 27395 27396 27397 27398 27399 27400 27401 27402 27403<div 27404 class=" 27405 featured-blog-posts-card spacing-style border-style 27406 27407 27408 " 27409 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-2" 27410 data-testid="featured-blog-posts-card" 27411 27412 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 27413rgb(var(--color-border-rgb) / 1.0); --border-radius: 274140px; 27415--text-align: left; 27416 --horizontal-alignment: left; 27417 --gap: 8px; 27418 " 27419 27420> 27421 <a 27422 class="featured-blog-posts-card__link" 27423 27424 href="/blogs/blog/opi-intelli-gel-review-everything-you-need-to-know-about-opi-gelcolor-intelli-gel" 27425 27426 > 27427 <span class="visually-hidden">OPI Intelli-Gel Review: Everything You Need to Know About OPI GelColor Intelli-Gel</span> 27428 </a> 27429 27430 <div class="featured-blog-posts-card__inner"> 27431 27432 27433 27434 27435 27436 27437 27438<style data-shopify> 27439 27440 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-2"] { 27441 --ratio: 1 / 1; 27442 } 27443 27444</style> 27445 27446 27447 <div 27448 class=" 27449 image-block 27450 resource-image 27451 27452 27453 featured-blog-posts-card__image 27454 27455 spacing-style border-style 27456 27457 " 27458 style="--border-width: 1px; --border-style: none; --border-color: 27459rgb(var(--color-border-rgb) / 1.0); --border-radius: 2746012px; overflow: hidden; 27461" 27462 27463 > 27464 <img src="//www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=3840" alt="OPI Intelli-Gel Review: Everything You Need to Know About OPI GelColor Intelli-Gel" srcset="//www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/OPI_Intelli-Gel_Blog_cd743011-603c-4750-842c-d7923e22a68f.png?v=1789728060&width=3840 3840w" width="3840" height="4096" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 27465 27466 </div> 27467 27468 27469 27470 27471 27472 27473 27474 27475 27476 27477 27478 27479 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 27480 <h4> 27481 27482 27483 27484 27485 27486 27487 27488 27489 27490 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-2 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 27491 <h4>OPI Intelli-Gel Review: Everything You Need to Know About OPI GelColor Intelli-Gel</h4> 27492 </div> 27493 27494 27495 27496 27497
27498<script type="module"> 27499 class TextReadMoreWrapper extends HTMLElement { 27500 #expanded = false; 27501 #animation = null; 27502 #collapsedHeight = 0; 27503 27504 connectedCallback() { 27505 const content = this.querySelector('.text-read-more__content'); 27506 const textElement = this.querySelector('.text-read-more__text'); 27507 const button = this.querySelector('.text-read-more__button'); 27508 27509 if (!content || !textElement || !button) return; 27510 27511 // Set initial state 27512 this.dataset.expanded = 'false'; 27513 27514 // Wait for content to render - use double RAF to ensure layout is complete 27515 requestAnimationFrame(() => { 27516 requestAnimationFrame(() => { 27517 // Additional small delay to ensure fonts and styles are applied 27518 setTimeout(() => { 27519 this.#checkOverflow(content, textElement, button); 27520 }, 50); 27521 27522 // Recheck on resize 27523 const resizeObserver = new ResizeObserver(() => { 27524 if (!this.#expanded) { 27525 this.#checkOverflow(content, textElement, button); 27526 } 27527 }); 27528 resizeObserver.observe(content); 27529 27530 // Setup button click handler 27531 button.addEventListener('click', (e) => { 27532 e.preventDefault(); 27533 this.#toggle(content, textElement, button); 27534 }); 27535 }); 27536 }); 27537 } 27538 27539 #checkOverflow(content, textElement, button) { 27540 // Ensure collapsed state is applied 27541 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 27542 textElement.classList.add('text-read-more__text--collapsed'); 27543 } 27544 27545 // Get collapsed height first 27546 const collapsedHeight = content.scrollHeight; 27547 this.#collapsedHeight = collapsedHeight; 27548 27549 // Temporarily remove line-clamp to measure full height 27550 textElement.classList.remove('text-read-more__text--collapsed'); 27551 27552 // Force reflow 27553 void content.offsetHeight; 27554 27555 const fullHeight = content.scrollHeight; 27556 27557 // Restore line-clamp 27558 textElement.classList.add('text-read-more__text--collapsed'); 27559 27560 // Show button if content exceeds 2 lines (with small threshold for rounding) 27561 if (fullHeight > collapsedHeight + 5) { 27562 button.removeAttribute('hidden'); 27563 } else { 27564 button.setAttribute('hidden', ''); 27565 } 27566 } 27567 27568 #toggle(content, textElement, button) { 27569 const startHeight = content.offsetHeight; 27570 let endHeight; 27571 27572 if (!this.#expanded) { 27573 // Expanding 27574 textElement.classList.remove('text-read-more__text--collapsed'); 27575 endHeight = content.scrollHeight; 27576 this.#expanded = true; 27577 } else { 27578 // Collapsing 27579 endHeight = this.#collapsedHeight; 27580 this.#expanded = false; 27581 } 27582 27583 this.dataset.expanded = this.#expanded; 27584 button.setAttribute('aria-expanded', this.#expanded); 27585 27586 // Animate 27587 content.style.overflow = 'hidden'; 27588 this.#animation?.cancel(); 27589 27590 this.#animation = content.animate( 27591 { 27592 height: [`${startHeight}px`, `${endHeight}px`], 27593 }, 27594 { 27595 duration: 300, 27596 easing: 'ease-in-out', 27597 } 27598 ); 27599 27600 this.#animation.onfinish = () => { 27601 if (this.#expanded) { 27602 content.style.removeProperty('height'); 27603 content.style.overflow = ''; 27604 } else { 27605 textElement.classList.add('text-read-more__text--collapsed'); 27606 content.style.removeProperty('height'); 27607 content.style.overflow = ''; 27608 } 27609 }; 27610 } 27611 } 27612 27613 if (!customElements.get('text-read-more-wrapper')) { 27614 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 27615 } 27616</script>
27616 27617 27618 27619 27620 27621 27622 27623</h4> 27624 27625 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-2" class="shopify-block"> 27626 27627 27628 27629 27630<div 27631 class=" 27632 blog-post-details 27633 spacing-style 27634 justify-left 27635 27636 " 27637 style="--padding-block-start: 0px;--padding-block-end: 0px;" 27638 ><span><time datetime="2026-09-17T11:27:12Z">September 17, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 27639 27640 27641 27642 27643 27644</div> 27645 27646 27647 27648 27649 27650 27651 <a href="/blogs/blog/opi-intelli-gel-review-everything-you-need-to-know-about-opi-gelcolor-intelli-gel" class="featured-blog-posts-card__read-more">Read more...</a> 27652 27653 </div> 27654 </div> 27655</div> 27656 27657 27658 27659 27660 27661 </div> 27662 27663 27664</slideshow-slide> 27665 27666 27667 <slideshow-slide 27668 ref="slides[]" 27669 aria-hidden="true" 27670 style="--slideshow-timeline: --slide-3; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 27671 27672 class="resource-list__slide" 27673 27674 27675 27676 27677 27678 27679 27680> 27681 27682 27683 27684 <div class="resource-list__item"> 27685 27686 27687 27688 27689 27690 27691 27692 27693 27694 27695 27696 27697 27698 27699<div 27700 class=" 27701 featured-blog-posts-card spacing-style border-style 27702 27703 27704 " 27705 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-3" 27706 data-testid="featured-blog-posts-card" 27707 27708 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 27709rgb(var(--color-border-rgb) / 1.0); --border-radius: 277100px; 27711--text-align: left; 27712 --horizontal-alignment: left; 27713 --gap: 8px; 27714 " 27715 27716> 27717 <a 27718 class="featured-blog-posts-card__link" 27719 27720 href="/blogs/blog/what-is-a-russian-manicure-the-ultimate-guide-to-precision-e-file-nail-care" 27721 27722 > 27723 <span class="visually-hidden">What Is a Russian Manicure? The Ultimate Guide to Precision E-File Nail Care</span> 27724 </a> 27725 27726 <div class="featured-blog-posts-card__inner"> 27727 27728 27729 27730 27731 27732 27733 27734<style data-shopify> 27735 27736 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-3"] { 27737 --ratio: 1 / 1; 27738 } 27739 27740</style> 27741 27742 27743 <div 27744 class=" 27745 image-block 27746 resource-image 27747 27748 27749 featured-blog-posts-card__image 27750 27751 spacing-style border-style 27752 27753 " 27754 style="--border-width: 1px; --border-style: none; --border-color: 27755rgb(var(--color-border-rgb) / 1.0); --border-radius: 2775612px; overflow: hidden; 27757" 27758 27759 > 27760 <img src="//www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=3840" alt="What Is a Russian Manicure? The Ultimate Guide to Precision E-File Nail Care" srcset="//www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/Gemini_Generated_Image_habzgihabzgihabz_d91c00b4-d39d-42bc-a8a3-e990f23c6c2a.png?v=1788473396&width=3840 3840w" width="3840" height="3018" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 27761 27762 </div> 27763 27764 27765 27766 27767 27768 27769 27770 27771 27772 27773 27774 27775 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 27776 <h4> 27777 27778 27779 27780 27781 27782 27783 27784 27785 27786 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-3 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 27787 <h4>What Is a Russian Manicure? The Ultimate Guide to Precision E-File Nail Care</h4> 27788 </div> 27789 27790 27791 27792 27793
27794<script type="module"> 27795 class TextReadMoreWrapper extends HTMLElement { 27796 #expanded = false; 27797 #animation = null; 27798 #collapsedHeight = 0; 27799 27800 connectedCallback() { 27801 const content = this.querySelector('.text-read-more__content'); 27802 const textElement = this.querySelector('.text-read-more__text'); 27803 const button = this.querySelector('.text-read-more__button'); 27804 27805 if (!content || !textElement || !button) return; 27806 27807 // Set initial state 27808 this.dataset.expanded = 'false'; 27809 27810 // Wait for content to render - use double RAF to ensure layout is complete 27811 requestAnimationFrame(() => { 27812 requestAnimationFrame(() => { 27813 // Additional small delay to ensure fonts and styles are applied 27814 setTimeout(() => { 27815 this.#checkOverflow(content, textElement, button); 27816 }, 50); 27817 27818 // Recheck on resize 27819 const resizeObserver = new ResizeObserver(() => { 27820 if (!this.#expanded) { 27821 this.#checkOverflow(content, textElement, button); 27822 } 27823 }); 27824 resizeObserver.observe(content); 27825 27826 // Setup button click handler 27827 button.addEventListener('click', (e) => { 27828 e.preventDefault(); 27829 this.#toggle(content, textElement, button); 27830 }); 27831 }); 27832 }); 27833 } 27834 27835 #checkOverflow(content, textElement, button) { 27836 // Ensure collapsed state is applied 27837 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 27838 textElement.classList.add('text-read-more__text--collapsed'); 27839 } 27840 27841 // Get collapsed height first 27842 const collapsedHeight = content.scrollHeight; 27843 this.#collapsedHeight = collapsedHeight; 27844 27845 // Temporarily remove line-clamp to measure full height 27846 textElement.classList.remove('text-read-more__text--collapsed'); 27847 27848 // Force reflow 27849 void content.offsetHeight; 27850 27851 const fullHeight = content.scrollHeight; 27852 27853 // Restore line-clamp 27854 textElement.classList.add('text-read-more__text--collapsed'); 27855 27856 // Show button if content exceeds 2 lines (with small threshold for rounding) 27857 if (fullHeight > collapsedHeight + 5) { 27858 button.removeAttribute('hidden'); 27859 } else { 27860 button.setAttribute('hidden', ''); 27861 } 27862 } 27863 27864 #toggle(content, textElement, button) { 27865 const startHeight = content.offsetHeight; 27866 let endHeight; 27867 27868 if (!this.#expanded) { 27869 // Expanding 27870 textElement.classList.remove('text-read-more__text--collapsed'); 27871 endHeight = content.scrollHeight; 27872 this.#expanded = true; 27873 } else { 27874 // Collapsing 27875 endHeight = this.#collapsedHeight; 27876 this.#expanded = false; 27877 } 27878 27879 this.dataset.expanded = this.#expanded; 27880 button.setAttribute('aria-expanded', this.#expanded); 27881 27882 // Animate 27883 content.style.overflow = 'hidden'; 27884 this.#animation?.cancel(); 27885 27886 this.#animation = content.animate( 27887 { 27888 height: [`${startHeight}px`, `${endHeight}px`], 27889 }, 27890 { 27891 duration: 300, 27892 easing: 'ease-in-out', 27893 } 27894 ); 27895 27896 this.#animation.onfinish = () => { 27897 if (this.#expanded) { 27898 content.style.removeProperty('height'); 27899 content.style.overflow = ''; 27900 } else { 27901 textElement.classList.add('text-read-more__text--collapsed'); 27902 content.style.removeProperty('height'); 27903 content.style.overflow = ''; 27904 } 27905 }; 27906 } 27907 } 27908 27909 if (!customElements.get('text-read-more-wrapper')) { 27910 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 27911 } 27912</script>
27912 27913 27914 27915 27916 27917 27918 27919</h4> 27920 27921 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-3" class="shopify-block"> 27922 27923 27924 27925 27926<div 27927 class=" 27928 blog-post-details 27929 spacing-style 27930 justify-left 27931 27932 " 27933 style="--padding-block-start: 0px;--padding-block-end: 0px;" 27934 ><span><time datetime="2026-09-03T22:09:51Z">September 3, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 27935 27936 27937 27938 27939 27940</div> 27941 27942 27943 27944 27945 27946 27947 <a href="/blogs/blog/what-is-a-russian-manicure-the-ultimate-guide-to-precision-e-file-nail-care" class="featured-blog-posts-card__read-more">Read more...</a> 27948 27949 </div> 27950 </div> 27951</div> 27952 27953 27954 27955 27956 27957 </div> 27958 27959 27960</slideshow-slide> 27961 27962 27963 <slideshow-slide 27964 ref="slides[]" 27965 aria-hidden="true" 27966 style="--slideshow-timeline: --slide-4; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 27967 27968 class="resource-list__slide" 27969 27970 27971 27972 27973 27974 27975 27976> 27977 27978 27979 27980 <div class="resource-list__item"> 27981 27982 27983 27984 27985 27986 27987 27988 27989 27990 27991 27992 27993 27994 27995<div 27996 class=" 27997 featured-blog-posts-card spacing-style border-style 27998 27999 28000 " 28001 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-4" 28002 data-testid="featured-blog-posts-card" 28003 28004 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 28005rgb(var(--color-border-rgb) / 1.0); --border-radius: 280060px; 28007--text-align: left; 28008 --horizontal-alignment: left; 28009 --gap: 8px; 28010 " 28011 28012> 28013 <a 28014 class="featured-blog-posts-card__link" 28015 28016 href="/blogs/blog/how-to-use-builder-gel-the-ultimate-biab-bible-for-flawless-nails" 28017 28018 > 28019 <span class="visually-hidden">How to Use Builder Gel: The Ultimate BIAB Bible for Flawless Nails</span> 28020 </a> 28021 28022 <div class="featured-blog-posts-card__inner"> 28023 28024 28025 28026 28027 28028 28029 28030<style data-shopify> 28031 28032 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-4"] { 28033 --ratio: 1 / 1; 28034 } 28035 28036</style> 28037 28038 28039 <div 28040 class=" 28041 image-block 28042 resource-image 28043 28044 28045 featured-blog-posts-card__image 28046 28047 spacing-style border-style 28048 28049 " 28050 style="--border-width: 1px; --border-style: none; --border-color: 28051rgb(var(--color-border-rgb) / 1.0); --border-radius: 2805212px; overflow: hidden; 28053" 28054 28055 > 28056 <img src="//www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=3840" alt="How to Use Builder Gel: The Ultimate BIAB Bible for Flawless Nails" srcset="//www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/Screenshot_2026-08-12_at_10.05.46_c217598d-5c32-44cf-879d-2ac5e74c8c45.png?v=1788470580&width=3840 3840w" width="3840" height="6410" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 28057 28058 </div> 28059 28060 28061 28062 28063 28064 28065 28066 28067 28068 28069 28070 28071 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 28072 <h4> 28073 28074 28075 28076 28077 28078 28079 28080 28081 28082 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-4 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 28083 <h4>How to Use Builder Gel: The Ultimate BIAB Bible for Flawless Nails</h4> 28084 </div> 28085 28086 28087 28088 28089
28090<script type="module"> 28091 class TextReadMoreWrapper extends HTMLElement { 28092 #expanded = false; 28093 #animation = null; 28094 #collapsedHeight = 0; 28095 28096 connectedCallback() { 28097 const content = this.querySelector('.text-read-more__content'); 28098 const textElement = this.querySelector('.text-read-more__text'); 28099 const button = this.querySelector('.text-read-more__button'); 28100 28101 if (!content || !textElement || !button) return; 28102 28103 // Set initial state 28104 this.dataset.expanded = 'false'; 28105 28106 // Wait for content to render - use double RAF to ensure layout is complete 28107 requestAnimationFrame(() => { 28108 requestAnimationFrame(() => { 28109 // Additional small delay to ensure fonts and styles are applied 28110 setTimeout(() => { 28111 this.#checkOverflow(content, textElement, button); 28112 }, 50); 28113 28114 // Recheck on resize 28115 const resizeObserver = new ResizeObserver(() => { 28116 if (!this.#expanded) { 28117 this.#checkOverflow(content, textElement, button); 28118 } 28119 }); 28120 resizeObserver.observe(content); 28121 28122 // Setup button click handler 28123 button.addEventListener('click', (e) => { 28124 e.preventDefault(); 28125 this.#toggle(content, textElement, button); 28126 }); 28127 }); 28128 }); 28129 } 28130 28131 #checkOverflow(content, textElement, button) { 28132 // Ensure collapsed state is applied 28133 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 28134 textElement.classList.add('text-read-more__text--collapsed'); 28135 } 28136 28137 // Get collapsed height first 28138 const collapsedHeight = content.scrollHeight; 28139 this.#collapsedHeight = collapsedHeight; 28140 28141 // Temporarily remove line-clamp to measure full height 28142 textElement.classList.remove('text-read-more__text--collapsed'); 28143 28144 // Force reflow 28145 void content.offsetHeight; 28146 28147 const fullHeight = content.scrollHeight; 28148 28149 // Restore line-clamp 28150 textElement.classList.add('text-read-more__text--collapsed'); 28151 28152 // Show button if content exceeds 2 lines (with small threshold for rounding) 28153 if (fullHeight > collapsedHeight + 5) { 28154 button.removeAttribute('hidden'); 28155 } else { 28156 button.setAttribute('hidden', ''); 28157 } 28158 } 28159 28160 #toggle(content, textElement, button) { 28161 const startHeight = content.offsetHeight; 28162 let endHeight; 28163 28164 if (!this.#expanded) { 28165 // Expanding 28166 textElement.classList.remove('text-read-more__text--collapsed'); 28167 endHeight = content.scrollHeight; 28168 this.#expanded = true; 28169 } else { 28170 // Collapsing 28171 endHeight = this.#collapsedHeight; 28172 this.#expanded = false; 28173 } 28174 28175 this.dataset.expanded = this.#expanded; 28176 button.setAttribute('aria-expanded', this.#expanded); 28177 28178 // Animate 28179 content.style.overflow = 'hidden'; 28180 this.#animation?.cancel(); 28181 28182 this.#animation = content.animate( 28183 { 28184 height: [`${startHeight}px`, `${endHeight}px`], 28185 }, 28186 { 28187 duration: 300, 28188 easing: 'ease-in-out', 28189 } 28190 ); 28191 28192 this.#animation.onfinish = () => { 28193 if (this.#expanded) { 28194 content.style.removeProperty('height'); 28195 content.style.overflow = ''; 28196 } else { 28197 textElement.classList.add('text-read-more__text--collapsed'); 28198 content.style.removeProperty('height'); 28199 content.style.overflow = ''; 28200 } 28201 }; 28202 } 28203 } 28204 28205 if (!customElements.get('text-read-more-wrapper')) { 28206 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 28207 } 28208</script>
28208 28209 28210 28211 28212 28213 28214 28215</h4> 28216 28217 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-4" class="shopify-block"> 28218 28219 28220 28221 28222<div 28223 class=" 28224 blog-post-details 28225 spacing-style 28226 justify-left 28227 28228 " 28229 style="--padding-block-start: 0px;--padding-block-end: 0px;" 28230 ><span><time datetime="2026-09-03T21:22:56Z">September 3, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 28231 28232 28233 28234 28235 28236</div> 28237 28238 28239 28240 28241 28242 28243 <a href="/blogs/blog/how-to-use-builder-gel-the-ultimate-biab-bible-for-flawless-nails" class="featured-blog-posts-card__read-more">Read more...</a> 28244 28245 </div> 28246 </div> 28247</div> 28248 28249 28250 28251 28252 28253 </div> 28254 28255 28256</slideshow-slide> 28257 28258 28259 <slideshow-slide 28260 ref="slides[]" 28261 aria-hidden="true" 28262 style="--slideshow-timeline: --slide-5; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 28263 28264 class="resource-list__slide" 28265 28266 28267 28268 28269 28270 28271 28272> 28273 28274 28275 28276 <div class="resource-list__item"> 28277 28278 28279 28280 28281 28282 28283 28284 28285 28286 28287 28288 28289 28290 28291<div 28292 class=" 28293 featured-blog-posts-card spacing-style border-style 28294 28295 28296 " 28297 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-5" 28298 data-testid="featured-blog-posts-card" 28299 28300 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 28301rgb(var(--color-border-rgb) / 1.0); --border-radius: 283020px; 28303--text-align: left; 28304 --horizontal-alignment: left; 28305 --gap: 8px; 28306 " 28307 28308> 28309 <a 28310 class="featured-blog-posts-card__link" 28311 28312 href="/blogs/blog/gel-x-lifting-the-ultimate-troubleshooting-guide" 28313 28314 > 28315 <span class="visually-hidden">Gel-X Lifting? The Ultimate Troubleshooting Guide</span> 28316 </a> 28317 28318 <div class="featured-blog-posts-card__inner"> 28319 28320 28321 28322 28323 28324 28325 28326<style data-shopify> 28327 28328 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-5"] { 28329 --ratio: 1 / 1; 28330 } 28331 28332</style> 28333 28334 28335 <div 28336 class=" 28337 image-block 28338 resource-image 28339 28340 28341 featured-blog-posts-card__image 28342 28343 spacing-style border-style 28344 28345 " 28346 style="--border-width: 1px; --border-style: none; --border-color: 28347rgb(var(--color-border-rgb) / 1.0); --border-radius: 2834812px; overflow: hidden; 28349" 28350 28351 > 28352 <img src="//www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=3840" alt="Gel-X Lifting? The Ultimate Troubleshooting Guide" srcset="//www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/tnbl_gel_x_3005ebfc-f796-4f6e-84f2-53099da9c0da.jpg?v=1788467631&width=3840 3840w" width="3840" height="3799" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 28353 28354 </div> 28355 28356 28357 28358 28359 28360 28361 28362 28363 28364 28365 28366 28367 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 28368 <h4> 28369 28370 28371 28372 28373 28374 28375 28376 28377 28378 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-5 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 28379 <h4>Gel-X Lifting? The Ultimate Troubleshooting Guide</h4> 28380 </div> 28381 28382 28383 28384 28385
28386<script type="module"> 28387 class TextReadMoreWrapper extends HTMLElement { 28388 #expanded = false; 28389 #animation = null; 28390 #collapsedHeight = 0; 28391 28392 connectedCallback() { 28393 const content = this.querySelector('.text-read-more__content'); 28394 const textElement = this.querySelector('.text-read-more__text'); 28395 const button = this.querySelector('.text-read-more__button'); 28396 28397 if (!content || !textElement || !button) return; 28398 28399 // Set initial state 28400 this.dataset.expanded = 'false'; 28401 28402 // Wait for content to render - use double RAF to ensure layout is complete 28403 requestAnimationFrame(() => { 28404 requestAnimationFrame(() => { 28405 // Additional small delay to ensure fonts and styles are applied 28406 setTimeout(() => { 28407 this.#checkOverflow(content, textElement, button); 28408 }, 50); 28409 28410 // Recheck on resize 28411 const resizeObserver = new ResizeObserver(() => { 28412 if (!this.#expanded) { 28413 this.#checkOverflow(content, textElement, button); 28414 } 28415 }); 28416 resizeObserver.observe(content); 28417 28418 // Setup button click handler 28419 button.addEventListener('click', (e) => { 28420 e.preventDefault(); 28421 this.#toggle(content, textElement, button); 28422 }); 28423 }); 28424 }); 28425 } 28426 28427 #checkOverflow(content, textElement, button) { 28428 // Ensure collapsed state is applied 28429 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 28430 textElement.classList.add('text-read-more__text--collapsed'); 28431 } 28432 28433 // Get collapsed height first 28434 const collapsedHeight = content.scrollHeight; 28435 this.#collapsedHeight = collapsedHeight; 28436 28437 // Temporarily remove line-clamp to measure full height 28438 textElement.classList.remove('text-read-more__text--collapsed'); 28439 28440 // Force reflow 28441 void content.offsetHeight; 28442 28443 const fullHeight = content.scrollHeight; 28444 28445 // Restore line-clamp 28446 textElement.classList.add('text-read-more__text--collapsed'); 28447 28448 // Show button if content exceeds 2 lines (with small threshold for rounding) 28449 if (fullHeight > collapsedHeight + 5) { 28450 button.removeAttribute('hidden'); 28451 } else { 28452 button.setAttribute('hidden', ''); 28453 } 28454 } 28455 28456 #toggle(content, textElement, button) { 28457 const startHeight = content.offsetHeight; 28458 let endHeight; 28459 28460 if (!this.#expanded) { 28461 // Expanding 28462 textElement.classList.remove('text-read-more__text--collapsed'); 28463 endHeight = content.scrollHeight; 28464 this.#expanded = true; 28465 } else { 28466 // Collapsing 28467 endHeight = this.#collapsedHeight; 28468 this.#expanded = false; 28469 } 28470 28471 this.dataset.expanded = this.#expanded; 28472 button.setAttribute('aria-expanded', this.#expanded); 28473 28474 // Animate 28475 content.style.overflow = 'hidden'; 28476 this.#animation?.cancel(); 28477 28478 this.#animation = content.animate( 28479 { 28480 height: [`${startHeight}px`, `${endHeight}px`], 28481 }, 28482 { 28483 duration: 300, 28484 easing: 'ease-in-out', 28485 } 28486 ); 28487 28488 this.#animation.onfinish = () => { 28489 if (this.#expanded) { 28490 content.style.removeProperty('height'); 28491 content.style.overflow = ''; 28492 } else { 28493 textElement.classList.add('text-read-more__text--collapsed'); 28494 content.style.removeProperty('height'); 28495 content.style.overflow = ''; 28496 } 28497 }; 28498 } 28499 } 28500 28501 if (!customElements.get('text-read-more-wrapper')) { 28502 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 28503 } 28504</script>
28504 28505 28506 28507 28508 28509 28510 28511</h4> 28512 28513 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-5" class="shopify-block"> 28514 28515 28516 28517 28518<div 28519 class=" 28520 blog-post-details 28521 spacing-style 28522 justify-left 28523 28524 " 28525 style="--padding-block-start: 0px;--padding-block-end: 0px;" 28526 ><span><time datetime="2026-09-03T20:33:47Z">September 3, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 28527 28528 28529 28530 28531 28532</div> 28533 28534 28535 28536 28537 28538 28539 <a href="/blogs/blog/gel-x-lifting-the-ultimate-troubleshooting-guide" class="featured-blog-posts-card__read-more">Read more...</a> 28540 28541 </div> 28542 </div> 28543</div> 28544 28545 28546 28547 28548 28549 </div> 28550 28551 28552</slideshow-slide> 28553 28554 28555 <slideshow-slide 28556 ref="slides[]" 28557 aria-hidden="true" 28558 style="--slideshow-timeline: --slide-6; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 28559 28560 class="resource-list__slide" 28561 28562 28563 28564 28565 28566 28567 28568> 28569 28570 28571 28572 <div class="resource-list__item"> 28573 28574 28575 28576 28577 28578 28579 28580 28581 28582 28583 28584 28585 28586 28587<div 28588 class=" 28589 featured-blog-posts-card spacing-style border-style 28590 28591 28592 " 28593 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-6" 28594 data-testid="featured-blog-posts-card" 28595 28596 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 28597rgb(var(--color-border-rgb) / 1.0); --border-radius: 285980px; 28599--text-align: left; 28600 --horizontal-alignment: left; 28601 --gap: 8px; 28602 " 28603 28604> 28605 <a 28606 class="featured-blog-posts-card__link" 28607 28608 href="/blogs/blog/e-files-vs-hand-files-what-s-the-difference-and-which-should-you-use" 28609 28610 > 28611 <span class="visually-hidden">E-Files vs Hand Files: Whatâs the Difference and Which Should You Use?</span> 28612 </a> 28613 28614 <div class="featured-blog-posts-card__inner"> 28615 28616 28617 28618 28619 28620 28621 28622<style data-shopify> 28623 28624 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-6"] { 28625 --ratio: 1 / 1; 28626 } 28627 28628</style> 28629 28630 28631 <div 28632 class=" 28633 image-block 28634 resource-image 28635 28636 28637 featured-blog-posts-card__image 28638 28639 spacing-style border-style 28640 28641 " 28642 style="--border-width: 1px; --border-style: none; --border-color: 28643rgb(var(--color-border-rgb) / 1.0); --border-radius: 2864412px; overflow: hidden; 28645" 28646 28647 > 28648 <img src="//www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=3840" alt="E-Files vs Hand Files: Whatâs the Difference and Which Should You Use?" srcset="//www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/onail5_b801bbd0-7566-4192-b075-536ebe2e70aa.jpg?v=1787841080&width=3840 3840w" width="3840" height="3840" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 28649 28650 </div> 28651 28652 28653 28654 28655 28656 28657 28658 28659 28660 28661 28662 28663 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 28664 <h4> 28665 28666 28667 28668 28669 28670 28671 28672 28673 28674 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-6 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 28675 <h4>E-Files vs Hand Files: Whatâs the Difference and Which Should You Use?</h4> 28676 </div> 28677 28678 28679 28680 28681
28682<script type="module"> 28683 class TextReadMoreWrapper extends HTMLElement { 28684 #expanded = false; 28685 #animation = null; 28686 #collapsedHeight = 0; 28687 28688 connectedCallback() { 28689 const content = this.querySelector('.text-read-more__content'); 28690 const textElement = this.querySelector('.text-read-more__text'); 28691 const button = this.querySelector('.text-read-more__button'); 28692 28693 if (!content || !textElement || !button) return; 28694 28695 // Set initial state 28696 this.dataset.expanded = 'false'; 28697 28698 // Wait for content to render - use double RAF to ensure layout is complete 28699 requestAnimationFrame(() => { 28700 requestAnimationFrame(() => { 28701 // Additional small delay to ensure fonts and styles are applied 28702 setTimeout(() => { 28703 this.#checkOverflow(content, textElement, button); 28704 }, 50); 28705 28706 // Recheck on resize 28707 const resizeObserver = new ResizeObserver(() => { 28708 if (!this.#expanded) { 28709 this.#checkOverflow(content, textElement, button); 28710 } 28711 }); 28712 resizeObserver.observe(content); 28713 28714 // Setup button click handler 28715 button.addEventListener('click', (e) => { 28716 e.preventDefault(); 28717 this.#toggle(content, textElement, button); 28718 }); 28719 }); 28720 }); 28721 } 28722 28723 #checkOverflow(content, textElement, button) { 28724 // Ensure collapsed state is applied 28725 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 28726 textElement.classList.add('text-read-more__text--collapsed'); 28727 } 28728 28729 // Get collapsed height first 28730 const collapsedHeight = content.scrollHeight; 28731 this.#collapsedHeight = collapsedHeight; 28732 28733 // Temporarily remove line-clamp to measure full height 28734 textElement.classList.remove('text-read-more__text--collapsed'); 28735 28736 // Force reflow 28737 void content.offsetHeight; 28738 28739 const fullHeight = content.scrollHeight; 28740 28741 // Restore line-clamp 28742 textElement.classList.add('text-read-more__text--collapsed'); 28743 28744 // Show button if content exceeds 2 lines (with small threshold for rounding) 28745 if (fullHeight > collapsedHeight + 5) { 28746 button.removeAttribute('hidden'); 28747 } else { 28748 button.setAttribute('hidden', ''); 28749 } 28750 } 28751 28752 #toggle(content, textElement, button) { 28753 const startHeight = content.offsetHeight; 28754 let endHeight; 28755 28756 if (!this.#expanded) { 28757 // Expanding 28758 textElement.classList.remove('text-read-more__text--collapsed'); 28759 endHeight = content.scrollHeight; 28760 this.#expanded = true; 28761 } else { 28762 // Collapsing 28763 endHeight = this.#collapsedHeight; 28764 this.#expanded = false; 28765 } 28766 28767 this.dataset.expanded = this.#expanded; 28768 button.setAttribute('aria-expanded', this.#expanded); 28769 28770 // Animate 28771 content.style.overflow = 'hidden'; 28772 this.#animation?.cancel(); 28773 28774 this.#animation = content.animate( 28775 { 28776 height: [`${startHeight}px`, `${endHeight}px`], 28777 }, 28778 { 28779 duration: 300, 28780 easing: 'ease-in-out', 28781 } 28782 ); 28783 28784 this.#animation.onfinish = () => { 28785 if (this.#expanded) { 28786 content.style.removeProperty('height'); 28787 content.style.overflow = ''; 28788 } else { 28789 textElement.classList.add('text-read-more__text--collapsed'); 28790 content.style.removeProperty('height'); 28791 content.style.overflow = ''; 28792 } 28793 }; 28794 } 28795 } 28796 28797 if (!customElements.get('text-read-more-wrapper')) { 28798 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 28799 } 28800</script>
28800 28801 28802 28803 28804 28805 28806 28807</h4> 28808 28809 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-6" class="shopify-block"> 28810 28811 28812 28813 28814<div 28815 class=" 28816 blog-post-details 28817 spacing-style 28818 justify-left 28819 28820 " 28821 style="--padding-block-start: 0px;--padding-block-end: 0px;" 28822 ><span><time datetime="2026-08-27T14:31:17Z">August 27, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 28823 28824 28825 28826 28827 28828</div> 28829 28830 28831 28832 28833 28834 28835 <a href="/blogs/blog/e-files-vs-hand-files-what-s-the-difference-and-which-should-you-use" class="featured-blog-posts-card__read-more">Read more...</a> 28836 28837 </div> 28838 </div> 28839</div> 28840 28841 28842 28843 28844 28845 </div> 28846 28847 28848</slideshow-slide> 28849 28850 28851 <slideshow-slide 28852 ref="slides[]" 28853 aria-hidden="true" 28854 style="--slideshow-timeline: --slide-7; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 28855 28856 class="resource-list__slide" 28857 28858 28859 28860 28861 28862 28863 28864> 28865 28866 28867 28868 <div class="resource-list__item"> 28869 28870 28871 28872 28873 28874 28875 28876 28877 28878 28879 28880 28881 28882 28883<div 28884 class=" 28885 featured-blog-posts-card spacing-style border-style 28886 28887 28888 " 28889 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-7" 28890 data-testid="featured-blog-posts-card" 28891 28892 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 28893rgb(var(--color-border-rgb) / 1.0); --border-radius: 288940px; 28895--text-align: left; 28896 --horizontal-alignment: left; 28897 --gap: 8px; 28898 " 28899 28900> 28901 <a 28902 class="featured-blog-posts-card__link" 28903 28904 href="/blogs/blog/how-to-know-if-i-am-allergic-to-nail-products" 28905 28906 > 28907 <span class="visually-hidden">How to Know If I Am Allergic to Nail Products</span> 28908 </a> 28909 28910 <div class="featured-blog-posts-card__inner"> 28911 28912 28913 28914 28915 28916 28917 28918<style data-shopify> 28919 28920 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-7"] { 28921 --ratio: 1 / 1; 28922 } 28923 28924</style> 28925 28926 28927 <div 28928 class=" 28929 image-block 28930 resource-image 28931 28932 28933 featured-blog-posts-card__image 28934 28935 spacing-style border-style 28936 28937 " 28938 style="--border-width: 1px; --border-style: none; --border-color: 28939rgb(var(--color-border-rgb) / 1.0); --border-radius: 2894012px; overflow: hidden; 28941" 28942 28943 > 28944 <img src="//www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=3840" alt="How to Know If I Am Allergic to Nail Products" srcset="//www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/Nail_tech_gloves_56a5ee40-8051-44b7-8a52-3c33a1774912.jpg?v=1787841056&width=3840 3840w" width="3840" height="4798" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 28945 28946 </div> 28947 28948 28949 28950 28951 28952 28953 28954 28955 28956 28957 28958 28959 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 28960 <h4> 28961 28962 28963 28964 28965 28966 28967 28968 28969 28970 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-7 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 28971 <h4>How to Know If I Am Allergic to Nail Products</h4> 28972 </div> 28973 28974 28975 28976 28977
28978<script type="module"> 28979 class TextReadMoreWrapper extends HTMLElement { 28980 #expanded = false; 28981 #animation = null; 28982 #collapsedHeight = 0; 28983 28984 connectedCallback() { 28985 const content = this.querySelector('.text-read-more__content'); 28986 const textElement = this.querySelector('.text-read-more__text'); 28987 const button = this.querySelector('.text-read-more__button'); 28988 28989 if (!content || !textElement || !button) return; 28990 28991 // Set initial state 28992 this.dataset.expanded = 'false'; 28993 28994 // Wait for content to render - use double RAF to ensure layout is complete 28995 requestAnimationFrame(() => { 28996 requestAnimationFrame(() => { 28997 // Additional small delay to ensure fonts and styles are applied 28998 setTimeout(() => { 28999 this.#checkOverflow(content, textElement, button); 29000 }, 50); 29001 29002 // Recheck on resize 29003 const resizeObserver = new ResizeObserver(() => { 29004 if (!this.#expanded) { 29005 this.#checkOverflow(content, textElement, button); 29006 } 29007 }); 29008 resizeObserver.observe(content); 29009 29010 // Setup button click handler 29011 button.addEventListener('click', (e) => { 29012 e.preventDefault(); 29013 this.#toggle(content, textElement, button); 29014 }); 29015 }); 29016 }); 29017 } 29018 29019 #checkOverflow(content, textElement, button) { 29020 // Ensure collapsed state is applied 29021 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 29022 textElement.classList.add('text-read-more__text--collapsed'); 29023 } 29024 29025 // Get collapsed height first 29026 const collapsedHeight = content.scrollHeight; 29027 this.#collapsedHeight = collapsedHeight; 29028 29029 // Temporarily remove line-clamp to measure full height 29030 textElement.classList.remove('text-read-more__text--collapsed'); 29031 29032 // Force reflow 29033 void content.offsetHeight; 29034 29035 const fullHeight = content.scrollHeight; 29036 29037 // Restore line-clamp 29038 textElement.classList.add('text-read-more__text--collapsed'); 29039 29040 // Show button if content exceeds 2 lines (with small threshold for rounding) 29041 if (fullHeight > collapsedHeight + 5) { 29042 button.removeAttribute('hidden'); 29043 } else { 29044 button.setAttribute('hidden', ''); 29045 } 29046 } 29047 29048 #toggle(content, textElement, button) { 29049 const startHeight = content.offsetHeight; 29050 let endHeight; 29051 29052 if (!this.#expanded) { 29053 // Expanding 29054 textElement.classList.remove('text-read-more__text--collapsed'); 29055 endHeight = content.scrollHeight; 29056 this.#expanded = true; 29057 } else { 29058 // Collapsing 29059 endHeight = this.#collapsedHeight; 29060 this.#expanded = false; 29061 } 29062 29063 this.dataset.expanded = this.#expanded; 29064 button.setAttribute('aria-expanded', this.#expanded); 29065 29066 // Animate 29067 content.style.overflow = 'hidden'; 29068 this.#animation?.cancel(); 29069 29070 this.#animation = content.animate( 29071 { 29072 height: [`${startHeight}px`, `${endHeight}px`], 29073 }, 29074 { 29075 duration: 300, 29076 easing: 'ease-in-out', 29077 } 29078 ); 29079 29080 this.#animation.onfinish = () => { 29081 if (this.#expanded) { 29082 content.style.removeProperty('height'); 29083 content.style.overflow = ''; 29084 } else { 29085 textElement.classList.add('text-read-more__text--collapsed'); 29086 content.style.removeProperty('height'); 29087 content.style.overflow = ''; 29088 } 29089 }; 29090 } 29091 } 29092 29093 if (!customElements.get('text-read-more-wrapper')) { 29094 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 29095 } 29096</script>
29096 29097 29098 29099 29100 29101 29102 29103</h4> 29104 29105 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-7" class="shopify-block"> 29106 29107 29108 29109 29110<div 29111 class=" 29112 blog-post-details 29113 spacing-style 29114 justify-left 29115 29116 " 29117 style="--padding-block-start: 0px;--padding-block-end: 0px;" 29118 ><span><time datetime="2026-08-27T14:30:52Z">August 27, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 29119 29120 29121 29122 29123 29124</div> 29125 29126 29127 29128 29129 29130 29131 <a href="/blogs/blog/how-to-know-if-i-am-allergic-to-nail-products" class="featured-blog-posts-card__read-more">Read more...</a> 29132 29133 </div> 29134 </div> 29135</div> 29136 29137 29138 29139 29140 29141 </div> 29142 29143 29144</slideshow-slide> 29145 29146 29147 <slideshow-slide 29148 ref="slides[]" 29149 aria-hidden="true" 29150 style="--slideshow-timeline: --slide-8; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 29151 29152 class="resource-list__slide" 29153 29154 29155 29156 29157 29158 29159 29160> 29161 29162 29163 29164 <div class="resource-list__item"> 29165 29166 29167 29168 29169 29170 29171 29172 29173 29174 29175 29176 29177 29178 29179<div 29180 class=" 29181 featured-blog-posts-card spacing-style border-style 29182 29183 29184 " 29185 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-8" 29186 data-testid="featured-blog-posts-card" 29187 29188 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 29189rgb(var(--color-border-rgb) / 1.0); --border-radius: 291900px; 29191--text-align: left; 29192 --horizontal-alignment: left; 29193 --gap: 8px; 29194 " 29195 29196> 29197 <a 29198 class="featured-blog-posts-card__link" 29199 29200 href="/blogs/blog/how-to-price-your-nail-sets-without-losing-clients-2026-guide" 29201 29202 > 29203 <span class="visually-hidden">How to Price Your Nail Sets Without Losing Clients (2026 Guide)</span> 29204 </a> 29205 29206 <div class="featured-blog-posts-card__inner"> 29207 29208 29209 29210 29211 29212 29213 29214<style data-shopify> 29215 29216 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-8"] { 29217 --ratio: 1 / 1; 29218 } 29219 29220</style> 29221 29222 29223 <div 29224 class=" 29225 image-block 29226 resource-image 29227 29228 29229 featured-blog-posts-card__image 29230 29231 spacing-style border-style 29232 29233 " 29234 style="--border-width: 1px; --border-style: none; --border-color: 29235rgb(var(--color-border-rgb) / 1.0); --border-radius: 2923612px; overflow: hidden; 29237" 29238 29239 > 29240 <img src="//www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=3840" alt="How to Price Your Nail Sets Without Losing Clients (2026 Guide)" srcset="//www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/Nail_prices_1bde0895-e455-4d85-a9a4-4f6ee812d23d.png?v=1786613056&width=3840 3840w" width="3840" height="2560" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 29241 29242 </div> 29243 29244 29245 29246 29247 29248 29249 29250 29251 29252 29253 29254 29255 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 29256 <h4> 29257 29258 29259 29260 29261 29262 29263 29264 29265 29266 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-8 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 29267 <h4>How to Price Your Nail Sets Without Losing Clients (2026 Guide)</h4> 29268 </div> 29269 29270 29271 29272 29273
29274<script type="module"> 29275 class TextReadMoreWrapper extends HTMLElement { 29276 #expanded = false; 29277 #animation = null; 29278 #collapsedHeight = 0; 29279 29280 connectedCallback() { 29281 const content = this.querySelector('.text-read-more__content'); 29282 const textElement = this.querySelector('.text-read-more__text'); 29283 const button = this.querySelector('.text-read-more__button'); 29284 29285 if (!content || !textElement || !button) return; 29286 29287 // Set initial state 29288 this.dataset.expanded = 'false'; 29289 29290 // Wait for content to render - use double RAF to ensure layout is complete 29291 requestAnimationFrame(() => { 29292 requestAnimationFrame(() => { 29293 // Additional small delay to ensure fonts and styles are applied 29294 setTimeout(() => { 29295 this.#checkOverflow(content, textElement, button); 29296 }, 50); 29297 29298 // Recheck on resize 29299 const resizeObserver = new ResizeObserver(() => { 29300 if (!this.#expanded) { 29301 this.#checkOverflow(content, textElement, button); 29302 } 29303 }); 29304 resizeObserver.observe(content); 29305 29306 // Setup button click handler 29307 button.addEventListener('click', (e) => { 29308 e.preventDefault(); 29309 this.#toggle(content, textElement, button); 29310 }); 29311 }); 29312 }); 29313 } 29314 29315 #checkOverflow(content, textElement, button) { 29316 // Ensure collapsed state is applied 29317 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 29318 textElement.classList.add('text-read-more__text--collapsed'); 29319 } 29320 29321 // Get collapsed height first 29322 const collapsedHeight = content.scrollHeight; 29323 this.#collapsedHeight = collapsedHeight; 29324 29325 // Temporarily remove line-clamp to measure full height 29326 textElement.classList.remove('text-read-more__text--collapsed'); 29327 29328 // Force reflow 29329 void content.offsetHeight; 29330 29331 const fullHeight = content.scrollHeight; 29332 29333 // Restore line-clamp 29334 textElement.classList.add('text-read-more__text--collapsed'); 29335 29336 // Show button if content exceeds 2 lines (with small threshold for rounding) 29337 if (fullHeight > collapsedHeight + 5) { 29338 button.removeAttribute('hidden'); 29339 } else { 29340 button.setAttribute('hidden', ''); 29341 } 29342 } 29343 29344 #toggle(content, textElement, button) { 29345 const startHeight = content.offsetHeight; 29346 let endHeight; 29347 29348 if (!this.#expanded) { 29349 // Expanding 29350 textElement.classList.remove('text-read-more__text--collapsed'); 29351 endHeight = content.scrollHeight; 29352 this.#expanded = true; 29353 } else { 29354 // Collapsing 29355 endHeight = this.#collapsedHeight; 29356 this.#expanded = false; 29357 } 29358 29359 this.dataset.expanded = this.#expanded; 29360 button.setAttribute('aria-expanded', this.#expanded); 29361 29362 // Animate 29363 content.style.overflow = 'hidden'; 29364 this.#animation?.cancel(); 29365 29366 this.#animation = content.animate( 29367 { 29368 height: [`${startHeight}px`, `${endHeight}px`], 29369 }, 29370 { 29371 duration: 300, 29372 easing: 'ease-in-out', 29373 } 29374 ); 29375 29376 this.#animation.onfinish = () => { 29377 if (this.#expanded) { 29378 content.style.removeProperty('height'); 29379 content.style.overflow = ''; 29380 } else { 29381 textElement.classList.add('text-read-more__text--collapsed'); 29382 content.style.removeProperty('height'); 29383 content.style.overflow = ''; 29384 } 29385 }; 29386 } 29387 } 29388 29389 if (!customElements.get('text-read-more-wrapper')) { 29390 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 29391 } 29392</script>
29392 29393 29394 29395 29396 29397 29398 29399</h4> 29400 29401 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-8" class="shopify-block"> 29402 29403 29404 29405 29406<div 29407 class=" 29408 blog-post-details 29409 spacing-style 29410 justify-left 29411 29412 " 29413 style="--padding-block-start: 0px;--padding-block-end: 0px;" 29414 ><span><time datetime="2026-08-07T14:58:29Z">August 7, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 29415 29416 29417 29418 29419 29420</div> 29421 29422 29423 29424 29425 29426 29427 <a href="/blogs/blog/how-to-price-your-nail-sets-without-losing-clients-2026-guide" class="featured-blog-posts-card__read-more">Read more...</a> 29428 29429 </div> 29430 </div> 29431</div> 29432 29433 29434 29435 29436 29437 </div> 29438 29439 29440</slideshow-slide> 29441 29442 29443 <slideshow-slide 29444 ref="slides[]" 29445 aria-hidden="true" 29446 style="--slideshow-timeline: --slide-9; --product-media-fit: cover; --grid-template-rows: 50dvh 1fr; --grid-template-rows-desktop: 70dvh 1fr;" 29447 29448 class="resource-list__slide" 29449 29450 29451 29452 29453 29454 29455 29456> 29457 29458 29459 29460 <div class="resource-list__item"> 29461 29462 29463 29464 29465 29466 29467 29468 29469 29470 29471 29472 29473 29474 29475<div 29476 class=" 29477 featured-blog-posts-card spacing-style border-style 29478 29479 29480 " 29481 data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-9" 29482 data-testid="featured-blog-posts-card" 29483 29484 style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;--border-width: 1px; --border-style: none; --border-color: 29485rgb(var(--color-border-rgb) / 1.0); --border-radius: 294860px; 29487--text-align: left; 29488 --horizontal-alignment: left; 29489 --gap: 8px; 29490 " 29491 29492> 29493 <a 29494 class="featured-blog-posts-card__link" 29495 29496 href="/blogs/blog/choosing-the-right-acrylic-liquid-monomer-which-one-is-best-for-you" 29497 29498 > 29499 <span class="visually-hidden">Choosing the Right Acrylic Liquid Monomer: Which One Is Best for You?</span> 29500 </a> 29501 29502 <div class="featured-blog-posts-card__inner"> 29503 29504 29505 29506 29507 29508 29509 29510<style data-shopify> 29511 29512 .featured-blog-posts-card[data-block-id="AcVFUazVHSndoeFhaN__static-blog-post-card-9"] { 29513 --ratio: 1 / 1; 29514 } 29515 29516</style> 29517 29518 29519 <div 29520 class=" 29521 image-block 29522 resource-image 29523 29524 29525 featured-blog-posts-card__image 29526 29527 spacing-style border-style 29528 29529 " 29530 style="--border-width: 1px; --border-style: none; --border-color: 29531rgb(var(--color-border-rgb) / 1.0); --border-radius: 2953212px; overflow: hidden; 29533" 29534 29535 > 29536 <img src="//www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=3840" alt="Choosing the Right Acrylic Liquid Monomer: Which One Is Best for You?" srcset="//www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=240 240w, //www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=352 352w, //www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=832 832w, //www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=1200 1200w, //www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=1600 1600w, //www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=1920 1920w, //www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=2560 2560w, //www.tnbl.co.uk/cdn/shop/articles/tnbl-premium-acrylic-monomer-hema-free-500ml-monomer-deodoriser-30ml-bundle-p10283-22016_medium_33549618-3366-4d67-a4e7-6893787699dc.jpg?v=1783674240&width=3840 3840w" width="3840" height="3840" loading="eager" class="image-block__image" sizes="(min-width: 750px) 25vw, 100vw"> 29537 29538 </div> 29539 29540 29541 29542 29543 29544 29545 29546 29547 29548 29549 29550 29551 <div class="featured-blog-posts-card__content layout-panel-flex--column"> 29552 <h4> 29553 29554 29555 29556 29557 29558 29559 29560 29561 29562 <div class=" spacing-style text-block text-block--AMFBLazAvd0ZjbmJse__title-9 custom text-block--align-left custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.25rem; --font-weight: var(--font-heading--weight);--font-family: var(--font-heading--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-); --text-align: left; "> 29563 <h4>Choosing the Right Acrylic Liquid Monomer: Which One Is Best for You?</h4> 29564 </div> 29565 29566 29567 29568 29569
29570<script type="module"> 29571 class TextReadMoreWrapper extends HTMLElement { 29572 #expanded = false; 29573 #animation = null; 29574 #collapsedHeight = 0; 29575 29576 connectedCallback() { 29577 const content = this.querySelector('.text-read-more__content'); 29578 const textElement = this.querySelector('.text-read-more__text'); 29579 const button = this.querySelector('.text-read-more__button'); 29580 29581 if (!content || !textElement || !button) return; 29582 29583 // Set initial state 29584 this.dataset.expanded = 'false'; 29585 29586 // Wait for content to render - use double RAF to ensure layout is complete 29587 requestAnimationFrame(() => { 29588 requestAnimationFrame(() => { 29589 // Additional small delay to ensure fonts and styles are applied 29590 setTimeout(() => { 29591 this.#checkOverflow(content, textElement, button); 29592 }, 50); 29593 29594 // Recheck on resize 29595 const resizeObserver = new ResizeObserver(() => { 29596 if (!this.#expanded) { 29597 this.#checkOverflow(content, textElement, button); 29598 } 29599 }); 29600 resizeObserver.observe(content); 29601 29602 // Setup button click handler 29603 button.addEventListener('click', (e) => { 29604 e.preventDefault(); 29605 this.#toggle(content, textElement, button); 29606 }); 29607 }); 29608 }); 29609 } 29610 29611 #checkOverflow(content, textElement, button) { 29612 // Ensure collapsed state is applied 29613 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 29614 textElement.classList.add('text-read-more__text--collapsed'); 29615 } 29616 29617 // Get collapsed height first 29618 const collapsedHeight = content.scrollHeight; 29619 this.#collapsedHeight = collapsedHeight; 29620 29621 // Temporarily remove line-clamp to measure full height 29622 textElement.classList.remove('text-read-more__text--collapsed'); 29623 29624 // Force reflow 29625 void content.offsetHeight; 29626 29627 const fullHeight = content.scrollHeight; 29628 29629 // Restore line-clamp 29630 textElement.classList.add('text-read-more__text--collapsed'); 29631 29632 // Show button if content exceeds 2 lines (with small threshold for rounding) 29633 if (fullHeight > collapsedHeight + 5) { 29634 button.removeAttribute('hidden'); 29635 } else { 29636 button.setAttribute('hidden', ''); 29637 } 29638 } 29639 29640 #toggle(content, textElement, button) { 29641 const startHeight = content.offsetHeight; 29642 let endHeight; 29643 29644 if (!this.#expanded) { 29645 // Expanding 29646 textElement.classList.remove('text-read-more__text--collapsed'); 29647 endHeight = content.scrollHeight; 29648 this.#expanded = true; 29649 } else { 29650 // Collapsing 29651 endHeight = this.#collapsedHeight; 29652 this.#expanded = false; 29653 } 29654 29655 this.dataset.expanded = this.#expanded; 29656 button.setAttribute('aria-expanded', this.#expanded); 29657 29658 // Animate 29659 content.style.overflow = 'hidden'; 29660 this.#animation?.cancel(); 29661 29662 this.#animation = content.animate( 29663 { 29664 height: [`${startHeight}px`, `${endHeight}px`], 29665 }, 29666 { 29667 duration: 300, 29668 easing: 'ease-in-out', 29669 } 29670 ); 29671 29672 this.#animation.onfinish = () => { 29673 if (this.#expanded) { 29674 content.style.removeProperty('height'); 29675 content.style.overflow = ''; 29676 } else { 29677 textElement.classList.add('text-read-more__text--collapsed'); 29678 content.style.removeProperty('height'); 29679 content.style.overflow = ''; 29680 } 29681 }; 29682 } 29683 } 29684 29685 if (!customElements.get('text-read-more-wrapper')) { 29686 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 29687 } 29688</script>
29688 29689 29690 29691 29692 29693 29694 29695</h4> 29696 29697 <div id="shopify-block-Ad05lb0dMSDA1bFAyU__blog-post-info-text-9" class="shopify-block"> 29698 29699 29700 29701 29702<div 29703 class=" 29704 blog-post-details 29705 spacing-style 29706 justify-left 29707 29708 " 29709 style="--padding-block-start: 0px;--padding-block-end: 0px;" 29710 ><span><time datetime="2026-07-10T09:03:18Z">July 10, 2026</time></span><span>|</span><span>Tnbl Tnbl</span></div> 29711 29712 29713 29714 29715 29716</div> 29717 29718 29719 29720 29721 29722 29723 <a href="/blogs/blog/choosing-the-right-acrylic-liquid-monomer-which-one-is-best-for-you" class="featured-blog-posts-card__read-more">Read more...</a> 29724 29725 </div> 29726 </div> 29727</div> 29728 29729 29730 29731 29732 29733 </div> 29734</slideshow-slide> 29735 29736 29737 29738 </slideshow-slides> 29739 </slideshow-container> 29740 29741</slideshow-component> 29742 29743 29744 29745</div> 29746 29747 29748 29749</div> 29750 29751 29752 29753 29754</div> 29755 29756 29757 29758 29759</section> 29760 </main> 29761 29762 <!-- BEGIN sections: footer-group --> 29763<footer id="shopify-section-sections--28213213528410__footer_m9NzUG" class="shopify-section shopify-section-group-footer-group section-wrapper"> 29764 29765<div class="section-background color-scheme-3"></div> 29766<div 29767 class="section section--page-width color-scheme-3" 29768> 29769 29770 <div 29771 class=" 29772 footer-content 29773 spacing-style 29774 29775 29776 " 29777 style=" 29778 --padding-block-start: max(20px, calc(var(--spacing-scale) * 30px));--padding-block-end: 0px; 29779 --footer-gap: 20px; 29780 --grid-columns: 1; 29781 --last-row-count: 1; 29782 --tablet-last-row-count: 1; 29783 " 29784 > 29785 29786 29787 29788<div 29789 class=" 29790 group-block 29791 group-block--height-fit 29792 group-block--width-fill 29793 border-style 29794 spacing-style 29795 size-style 29796 29797 29798 29799 29800 " 29801 style=" 29802 --border-width: 1px; --border-style: none; --border-color: 29803rgb(var(--color-border-rgb) / 1.0); --border-radius: 298040px; 29805 29806 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 29807 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 29808 29809 " 29810 29811 data-testid="group-block" 29812><div class="group-block__media-wrapper"> 29813 29814 29815 29816 29817 29818 </div> 29819 29820 <div 29821 class=" 29822 group-block-content 29823 29824 layout-panel-flex 29825 layout-panel-flex--column 29826 mobile-column 29827 29828 29829 " 29830 29831 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 29832 29833--gap: 12px; 29834 29835--horizontal-alignment: flex-start; --vertical-alignment: center; 29836--vertical-alignment-mobile: center; 29837" 29838 > 29839 29840 29841 29842<div 29843 class=" 29844 group-block 29845 group-block--height-fit 29846 group-block--width-fill 29847 border-style 29848 spacing-style 29849 size-style 29850 29851 29852 29853 29854 " 29855 style=" 29856 --border-width: 1px; --border-style: none; --border-color: 29857rgb(var(--color-border-rgb) / 1.0); --border-radius: 298580px; 29859 29860 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 29861 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 29862 29863 " 29864 29865 data-testid="group-block" 29866><div class="group-block__media-wrapper"> 29867 29868 29869 29870 29871 29872 </div> 29873 29874 <div 29875 class=" 29876 group-block-content 29877 29878 layout-panel-flex 29879 layout-panel-flex--column 29880 mobile-column 29881 29882 29883 " 29884 29885 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 29886 29887--gap: 12px; 29888 29889--horizontal-alignment: flex-start; --vertical-alignment: center; 29890--vertical-alignment-mobile: center; 29891" 29892 > 29893 29894 29895 29896<email-signup-block 29897 class="email-signup-block size-style spacing-style" 29898 style="--size-style-width: 100%;--size-style-height: ;--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;" 29899 29900> 29901 29902 <div class="email-signup__heading paragraph"> 29903 Newsletter 29904 </div> 29905 29906<form method="post" action="/contact#contact_form" id="contact_form" accept-charset="UTF-8" class="email-signup__form spacing-style"><input type="hidden" name="form_type" value="customer" /><input type="hidden" name="utf8" value="â" /> 29907 <div 29908 class="email-signup__input-group " 29909 style="--border-width: 1px; --border-radius: 100px;" 29910 > 29911 <label 29912 for="EmailInput-ANTllNjRyTVZRaVNTW__email_signup_JFmxQg" 29913 class="visually-hidden" 29914 > 29915 Email 29916 </label> 29917 <input 29918 id="EmailInput-ANTllNjRyTVZRaVNTW__email_signup_JFmxQg" 29919 class="email-signup__input email-signup__input--underline h3 " 29920 type="email" 29921 name="contact[email]" 29922 autocorrect="off" 29923 autocapitalize="off" 29924 autocomplete="email" 29925 placeholder="Email address" 29926 required 29927 29928 > 29929 <button 29930 class="email-signup__button email-signup__button--integrated email-signup__button--both paragraph button-unstyled button-unstyled--ANTllNjRyTVZRaVNTW__email_signup_JFmxQg " 29931 29932 aria-label="Sign up" 29933 29934 > 29935 29936 Subscribe 29937 <svg
29938 viewBox="0 0 20 20" 29939 xmlns="http://www.w3.org/2000/svg" 29940 focusable="false" 29941 aria-hidden="true" 29942 class="email-signup__button-icon" 29943 > 29944 29945<path 29946 clip-rule="evenodd" 29947 d="m11.246 5.31759c.0322-.07821.0833-.14723.1486-.20093.0654-.0537.143-.09041.2259-.10686.083-.01645.1688-.01214.2497.01257.0808.0247.1544.06902.214.12902l4.104 4.104c.0478.04765.0857.10426.1115.16659.0259.06232.0392.12913.0392.19661 0 .06747-.0133.13429-.0392.19661-.0258.06233-.0637.11893-.1115.16659l-4.104 4.10401c-.0963.0963-.227.1504-.3632.1504s-.2669-.0541-.3632-.1504-.1504-.227-.1504-.3632.0541-.2669.1504-.3632l3.2288-3.2278h-11.0736c-.13606 0-.26654-.0541-.36275-.15027-.0962-.0962-.15025-.22669-.15025-.36274 0-.13606.05405-.26654.15025-.36275.09621-.0962.22669-.15025.36275-.15025h11.0736l-3.2288-3.2278c-.0721-.07178-.1212-.16335-.1411-.2631s-.0097-.20316.0293-.2971z" 29948 fill="currentColor" 29949 fill-rule="evenodd" 29950 /> 29951 </svg> 29952 29953 </button> 29954 </div></form> 29955 29956
29956<script 29957 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/email-signup.js?v=11926998321451148611774530326" 29958 defer 29959 ></script>
29959 29960</email-signup-block> 29961 29962 29963 29964 29965 29966</div> 29967</div> 29968 29969 29970
29971<script type="module"> 29972 (function() { 29973 // Only run if Intersection Observer is supported 29974 if (typeof IntersectionObserver === 'undefined') { 29975 // Fallback: show all animated content immediately 29976 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 29977 el.classList.add('group-block-content--in-view'); 29978 }); 29979 return; 29980 } 29981 29982 // Respect reduced motion preference 29983 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 29984 if (prefersReducedMotion) { 29985 // Show all animated content immediately without animation 29986 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 29987 el.style.opacity = '1'; 29988 el.style.transform = 'none'; 29989 }); 29990 return; 29991 } 29992 29993 // Set up Intersection Observer for scroll-triggered animations 29994 const observerOptions = { 29995 root: null, 29996 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 29997 threshold: 0.1 // Trigger when 10% of element is visible 29998 }; 29999 30000 const observer = new IntersectionObserver((entries) => { 30001 entries.forEach(entry => { 30002 if (entry.isIntersecting) { 30003 const contentElement = entry.target; 30004 // Add the in-view class to trigger animation 30005 contentElement.classList.add('group-block-content--in-view'); 30006 // Unobserve after animation is triggered (only animate once) 30007 observer.unobserve(contentElement); 30008 } 30009 }); 30010 }, observerOptions); 30011 30012 // Observe all group blocks with animations 30013 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30014 observer.observe(el); 30015 }); 30016 })(); 30017</script>
30017 30018 30019 30020 30021 30022 30023 30024<div 30025 class=" 30026 group-block 30027 group-block--height-fit 30028 group-block--width-fill 30029 border-style 30030 spacing-style 30031 size-style 30032 30033 30034 30035 30036 " 30037 style=" 30038 --border-width: 1px; --border-style: none; --border-color: 30039rgb(var(--color-border-rgb) / 1.0); --border-radius: 300400px; 30041 30042 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 30043 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 30044 30045 " 30046 30047 data-testid="group-block" 30048><div class="group-block__media-wrapper"> 30049 30050 30051 30052 30053 30054 </div> 30055 30056 <div 30057 class=" 30058 group-block-content 30059 30060 layout-panel-flex 30061 layout-panel-flex--row 30062 mobile-column 30063 30064 30065 " 30066 30067 style="--flex-direction: row; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 30068 30069--gap: 24px; 30070 30071--horizontal-alignment: flex-start; --vertical-alignment: flex-start; 30072--vertical-alignment-mobile: flex-start; 30073" 30074 > 30075 30076 30077 30078 30079 30080 <accordion-custom 30081 class=" 30082 menu 30083 menu--accordion menu--plus 30084 menu--dividers 30085 30086 " 30087 data-disable-on-desktop="true" 30088 open-by-default-on-desktop 30089 30090 > 30091 <details 30092 class=" 30093 menu__details 30094 spacing-style 30095 30096 " 30097 data-testid="menu-details" 30098 style=" 30099 --spacing--size: 12px; 30100 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 30101 " 30102 30103 30104 > 30105 <summary class="menu__heading h4"> 30106 <span class="menu__heading__default">About TNBL</span> 30107 <span class="menu__heading__accordion"> 30108 About TNBL 30109 <span class="menu__heading__toggle svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 30110 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 30111</svg> 30112</span> 30113 <span class="menu__heading__toggle svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 30114 <path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 30115 <path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 30116</svg> 30117</span> 30118 </span> 30119 </summary> 30120 30121 <div class="details-content"> 30122 30123 <ul class="list-unstyled"> 30124 30125 <li class="menu__item paragraph"> 30126 <a href="/pages/about-us"> 30127 About us 30128 30129 </a> 30130 </li> 30131 30132 <li class="menu__item paragraph"> 30133 <a href="/pages/our-store"> 30134 Our Store 30135 30136 </a> 30137 </li> 30138 30139 <li class="menu__item paragraph"> 30140 <a href="/blogs/blog"> 30141 Blog 30142 30143 </a> 30144 </li> 30145 30146 <li class="menu__item paragraph"> 30147 <a href="/pages/privacy-policy"> 30148 Privacy Policy 30149 30150 </a> 30151 </li> 30152 30153 <li class="menu__item paragraph"> 30154 <a href="/pages/cookie-policy"> 30155 Cookie Policy 30156 30157 </a> 30158 </li> 30159 30160 </ul> 30161 30162 </div> 30163 </details> 30164 </accordion-custom> 30165 30166 30167 30168 30169 30170 30171 30172 30173 30174 30175 <accordion-custom 30176 class=" 30177 menu 30178 menu--accordion menu--plus 30179 menu--dividers 30180 30181 " 30182 data-disable-on-desktop="true" 30183 open-by-default-on-desktop 30184 30185 > 30186 <details 30187 class=" 30188 menu__details 30189 spacing-style 30190 30191 " 30192 data-testid="menu-details" 30193 style=" 30194 --spacing--size: 12px; 30195 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 30196 " 30197 30198 30199 > 30200 <summary class="menu__heading h4">
30201 <span class="menu__heading__default">Orders</span> 30202 <span class="menu__heading__accordion"> 30203 Orders 30204 <span class="menu__heading__toggle svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 30205 <path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 30206</svg> 30207</span> 30208 <span class="menu__heading__toggle svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 30209 <path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 30210 <path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 30211</svg> 30212</span> 30213 </span> 30214 </summary> 30215 30216 <div class="details-content"> 30217 30218 <ul class="list-unstyled"> 30219 30220 <li class="menu__item paragraph"> 30221 <a href="https://account.tnbl.co.uk/orders?locale=en®ion_country=GB&buyer_flags=eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0bmJsLXVrLm15c2hvcGlmeS5jb20iLCJmbGFncyI6W10sImV4cCI6MTc5MjEyMDg4MiwibmJmIjoxNzkxNTE2MDgyfQ.oj-nKjeVLw2YuaOMhVAV-fhFJ3qYdfwRbP0e84V91u8"> 30222 Trade Account 30223 30224 </a> 30225 </li> 30226 30227 <li class="menu__item paragraph"> 30228 <a href="/pages/delivery-returns"> 30229 Delivery & Returns 30230 30231 </a> 30232 </li> 30233 30234 <li class="menu__item paragraph"> 30235 <a href="/policies/terms-of-service"> 30236 Terms & Conditions 30237 30238 </a> 30239 </li> 30240 30241 <li class="menu__item paragraph"> 30242 <a href="/products/tnbl-gift-card"> 30243 Gift Vouchers 30244 30245 </a> 30246 </li> 30247 30248 </ul> 30249 30250 </div> 30251 </details> 30252 </accordion-custom> 30253 30254 30255 30256 30257 30258 30259 30260<div class="group-accordion-block"><accordion-custom 30261 class=" 30262 group-accordion 30263 group-accordion--dividers 30264 " 30265 data-disable-on-desktop="true" 30266 open-by-default-on-desktop 30267 30268 > 30269 <details 30270 class=" 30271 group-accordion__details 30272 spacing-style 30273 30274 " 30275 data-testid="accordion-details" 30276 style=" 30277 --spacing--size: 12px; 30278 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 30279 " 30280 30281 30282 > 30283 <summary class="group-accordion__heading h4"> 30284 <span class="group-accordion__heading__default">Contact Us</span> 30285 <span class="group-accordion__heading__accordion"> 30286 Contact Us 30287 <span class="group-accordion__heading__toggle svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 30288 <path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 30289 <path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 30290</svg> 30291</span> 30292 </span> 30293 </summary> 30294 30295 <div class="details-content"> 30296 <div 30297 class=" 30298 group-block 30299 group-block--height-fit 30300 group-block--width-fill 30301 border-style 30302 spacing-style 30303 size-style 30304 30305 30306 30307 30308 " 30309 style=" 30310 --border-width: 1px; --border-style: none; --border-color: 30311rgb(var(--color-border-rgb) / 1.0); --border-radius: 303120px; 30313 30314 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 30315 --size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 30316 30317 " 30318 30319 data-testid="group-block" 30320><div class="group-block__media-wrapper"> 30321 30322 30323 30324 30325 30326 </div> 30327 30328 <div 30329 class=" 30330 group-block-content 30331 30332 layout-panel-flex 30333 layout-panel-flex--column 30334 mobile-column 30335 30336 group-block-content--has-animation group-block-content--animate- 30337 " 30338 data-animation-type="" 30339 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 30340 30341--gap: 12px; 30342 30343--horizontal-alignment: flex-start; --vertical-alignment: center; 30344--vertical-alignment-mobile: center; 30345" 30346 > 30347 30348 30349 30350 30351 30352 30353 30354 30355 30356 30357 <rte-formatter class=" spacing-style text-block text-block--ANEFuMGl2QjlIQXE1b__text_KwyarJ rte rte " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --width: fit-content; --max-width: var(--max-width--body-normal); "> 30358 <p>50-62 Hockley Street</p><p>Birmingham, B18 6BH</p><p>0121 523 5535</p><p>[email protected]</p><p>Company Registration Number: 10765654 </p><p>VAT no. 276203803</p> 30359 </rte-formatter> 30360 30361 30362 30363 30364
30365<script type="module"> 30366 class TextReadMoreWrapper extends HTMLElement { 30367 #expanded = false; 30368 #animation = null; 30369 #collapsedHeight = 0; 30370 30371 connectedCallback() { 30372 const content = this.querySelector('.text-read-more__content'); 30373 const textElement = this.querySelector('.text-read-more__text'); 30374 const button = this.querySelector('.text-read-more__button'); 30375 30376 if (!content || !textElement || !button) return; 30377 30378 // Set initial state 30379 this.dataset.expanded = 'false'; 30380 30381 // Wait for content to render - use double RAF to ensure layout is complete 30382 requestAnimationFrame(() => { 30383 requestAnimationFrame(() => { 30384 // Additional small delay to ensure fonts and styles are applied 30385 setTimeout(() => { 30386 this.#checkOverflow(content, textElement, button); 30387 }, 50); 30388 30389 // Recheck on resize 30390 const resizeObserver = new ResizeObserver(() => { 30391 if (!this.#expanded) { 30392 this.#checkOverflow(content, textElement, button); 30393 } 30394 }); 30395 resizeObserver.observe(content); 30396 30397 // Setup button click handler 30398 button.addEventListener('click', (e) => { 30399 e.preventDefault(); 30400 this.#toggle(content, textElement, button); 30401 }); 30402 }); 30403 }); 30404 } 30405 30406 #checkOverflow(content, textElement, button) { 30407 // Ensure collapsed state is applied 30408 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 30409 textElement.classList.add('text-read-more__text--collapsed'); 30410 } 30411 30412 // Get collapsed height first 30413 const collapsedHeight = content.scrollHeight; 30414 this.#collapsedHeight = collapsedHeight; 30415 30416 // Temporarily remove line-clamp to measure full height 30417 textElement.classList.remove('text-read-more__text--collapsed'); 30418 30419 // Force reflow 30420 void content.offsetHeight; 30421 30422 const fullHeight = content.scrollHeight; 30423 30424 // Restore line-clamp 30425 textElement.classList.add('text-read-more__text--collapsed'); 30426 30427 // Show button if content exceeds 2 lines (with small threshold for rounding) 30428 if (fullHeight > collapsedHeight + 5) { 30429 button.removeAttribute('hidden'); 30430 } else { 30431 button.setAttribute('hidden', ''); 30432 } 30433 } 30434 30435 #toggle(content, textElement, button) { 30436 const startHeight = content.offsetHeight; 30437 let endHeight; 30438 30439 if (!this.#expanded) { 30440 // Expanding 30441 textElement.classList.remove('text-read-more__text--collapsed'); 30442 endHeight = content.scrollHeight; 30443 this.#expanded = true; 30444 } else { 30445 // Collapsing 30446 endHeight = this.#collapsedHeight; 30447 this.#expanded = false; 30448 } 30449 30450 this.dataset.expanded = this.#expanded; 30451 button.setAttribute('aria-expanded', this.#expanded); 30452 30453 // Animate 30454 content.style.overflow = 'hidden'; 30455 this.#animation?.cancel(); 30456 30457 this.#animation = content.animate( 30458 { 30459 height: [`${startHeight}px`, `${endHeight}px`], 30460 }, 30461 { 30462 duration: 300, 30463 easing: 'ease-in-out', 30464 } 30465 ); 30466 30467 this.#animation.onfinish = () => { 30468 if (this.#expanded) { 30469 content.style.removeProperty('height'); 30470 content.style.overflow = ''; 30471 } else { 30472 textElement.classList.add('text-read-more__text--collapsed'); 30473 content.style.removeProperty('height'); 30474 content.style.overflow = ''; 30475 } 30476 }; 30477 } 30478 } 30479 30480 if (!customElements.get('text-read-more-wrapper')) { 30481 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 30482 } 30483</script>
30483 30484 30485 30486 30487 30488 30489 30490 30491 30492<a 30493 30494 href="/pages/contact" 30495 30496 class=" 30497 size-style 30498 link 30499 link--AcEFnVjVYMFVhK2wvU__button_hXfpnL 30500 30501 30502 " 30503 style="--size-style-width: fit-content;--size-style-height: fit-content;--size-style-width-mobile: fit-content; --size-style-width-mobile-min: fit-content;" 30504> 30505 Contact Us 30506 30507</a> 30508 30509 30510 30511 30512 30513 30514</div> 30515</div> 30516 30517 30518
30519<script type="module"> 30520 (function() { 30521 // Only run if Intersection Observer is supported 30522 if (typeof IntersectionObserver === 'undefined') { 30523 // Fallback: show all animated content immediately 30524 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30525 el.classList.add('group-block-content--in-view'); 30526 }); 30527 return; 30528 } 30529 30530 // Respect reduced motion preference 30531 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 30532 if (prefersReducedMotion) { 30533 // Show all animated content immediately without animation 30534 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30535 el.style.opacity = '1'; 30536 el.style.transform = 'none'; 30537 }); 30538 return; 30539 } 30540 30541 // Set up Intersection Observer for scroll-triggered animations 30542 const observerOptions = { 30543 root: null, 30544 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 30545 threshold: 0.1 // Trigger when 10% of element is visible 30546 }; 30547 30548 const observer = new IntersectionObserver((entries) => { 30549 entries.forEach(entry => { 30550 if (entry.isIntersecting) { 30551 const contentElement = entry.target; 30552 // Add the in-view class to trigger animation 30553 contentElement.classList.add('group-block-content--in-view'); 30554 // Unobserve after animation is triggered (only animate once) 30555 observer.unobserve(contentElement); 30556 } 30557 }); 30558 }, observerOptions); 30559 30560 // Observe all group blocks with animations 30561 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30562 observer.observe(el); 30563 }); 30564 })(); 30565</script>
30565 30566 30567 </div> 30568 </details> 30569 </accordion-custom></div> 30570 30571 30572 30573 30574 30575 30576 30577 30578<div 30579 class=" 30580 group-block 30581 group-block--height-fit 30582 group-block--width-fill 30583 border-style 30584 spacing-style 30585 size-style 30586 30587 30588 30589 30590 " 30591 style=" 30592 --border-width: 1px; --border-style: none; --border-color: 30593rgb(var(--color-border-rgb) / 1.0); --border-radius: 305940px; 30595 30596 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 30597 --size-style-width: 100%;--size-style-height: fit;--size-style-height-mobile: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem; 30598 30599 " 30600 30601 data-testid="group-block" 30602><div class="group-block__media-wrapper"> 30603 30604 30605 30606 30607 30608 </div> 30609 30610 <div 30611 class=" 30612 group-block-content 30613 30614 layout-panel-flex 30615 layout-panel-flex--column 30616 mobile-column 30617 30618 30619 " 30620 30621 style="--flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 30622 30623--gap: 12px; 30624 30625--horizontal-alignment: flex-start; --vertical-alignment: center; 30626--vertical-alignment-mobile: center; 30627" 30628 > 30629 30630 30631 30632 30633 30634 30635 30636 30637 30638 30639 <div class=" spacing-style text-block text-block--AVHduTXlRL3hMSk95N__text_LzTnqK h4 " style=" --padding-block-start: 10px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: fit-content; --max-width: var(--max-width--body-normal); "> 30640 <h2>Socials</h2> 30641 </div> 30642 30643 30644 30645 30646
30647<script type="module"> 30648 class TextReadMoreWrapper extends HTMLElement { 30649 #expanded = false; 30650 #animation = null; 30651 #collapsedHeight = 0; 30652 30653 connectedCallback() { 30654 const content = this.querySelector('.text-read-more__content'); 30655 const textElement = this.querySelector('.text-read-more__text'); 30656 const button = this.querySelector('.text-read-more__button'); 30657 30658 if (!content || !textElement || !button) return; 30659 30660 // Set initial state 30661 this.dataset.expanded = 'false'; 30662 30663 // Wait for content to render - use double RAF to ensure layout is complete 30664 requestAnimationFrame(() => { 30665 requestAnimationFrame(() => { 30666 // Additional small delay to ensure fonts and styles are applied 30667 setTimeout(() => { 30668 this.#checkOverflow(content, textElement, button); 30669 }, 50); 30670 30671 // Recheck on resize 30672 const resizeObserver = new ResizeObserver(() => { 30673 if (!this.#expanded) { 30674 this.#checkOverflow(content, textElement, button); 30675 } 30676 }); 30677 resizeObserver.observe(content); 30678 30679 // Setup button click handler 30680 button.addEventListener('click', (e) => { 30681 e.preventDefault(); 30682 this.#toggle(content, textElement, button); 30683 }); 30684 }); 30685 }); 30686 } 30687 30688 #checkOverflow(content, textElement, button) { 30689 // Ensure collapsed state is applied 30690 if (!textElement.classList.contains('text-read-more__text--collapsed')) { 30691 textElement.classList.add('text-read-more__text--collapsed'); 30692 } 30693 30694 // Get collapsed height first 30695 const collapsedHeight = content.scrollHeight; 30696 this.#collapsedHeight = collapsedHeight; 30697 30698 // Temporarily remove line-clamp to measure full height 30699 textElement.classList.remove('text-read-more__text--collapsed'); 30700 30701 // Force reflow 30702 void content.offsetHeight; 30703 30704 const fullHeight = content.scrollHeight; 30705 30706 // Restore line-clamp 30707 textElement.classList.add('text-read-more__text--collapsed'); 30708 30709 // Show button if content exceeds 2 lines (with small threshold for rounding) 30710 if (fullHeight > collapsedHeight + 5) { 30711 button.removeAttribute('hidden'); 30712 } else { 30713 button.setAttribute('hidden', ''); 30714 } 30715 } 30716 30717 #toggle(content, textElement, button) { 30718 const startHeight = content.offsetHeight; 30719 let endHeight; 30720 30721 if (!this.#expanded) { 30722 // Expanding 30723 textElement.classList.remove('text-read-more__text--collapsed'); 30724 endHeight = content.scrollHeight; 30725 this.#expanded = true; 30726 } else { 30727 // Collapsing 30728 endHeight = this.#collapsedHeight; 30729 this.#expanded = false; 30730 } 30731 30732 this.dataset.expanded = this.#expanded; 30733 button.setAttribute('aria-expanded', this.#expanded); 30734 30735 // Animate 30736 content.style.overflow = 'hidden'; 30737 this.#animation?.cancel(); 30738 30739 this.#animation = content.animate( 30740 { 30741 height: [`${startHeight}px`, `${endHeight}px`], 30742 }, 30743 { 30744 duration: 300, 30745 easing: 'ease-in-out', 30746 } 30747 ); 30748 30749 this.#animation.onfinish = () => { 30750 if (this.#expanded) { 30751 content.style.removeProperty('height'); 30752 content.style.overflow = ''; 30753 } else { 30754 textElement.classList.add('text-read-more__text--collapsed'); 30755 content.style.removeProperty('height'); 30756 content.style.overflow = ''; 30757 } 30758 }; 30759 } 30760 } 30761 30762 if (!customElements.get('text-read-more-wrapper')) { 30763 customElements.define('text-read-more-wrapper', TextReadMoreWrapper); 30764 } 30765</script>
30765 30766 30767 30768 30769 30770 30771<div 30772 class="social-icons__wrapper footer-utilities__icons" 30773 30774> 30775 30776 30777 30778 30779 30780 30781 30782 30783 <div 30784 class="social-icons__icon-wrapper" 30785 > 30786 <a 30787 href="https://www.facebook.com/thenailandbeautylink/" 30788 target="_blank" 30789 rel="noopener noreferrer" 30790 aria-label="Facebook" 30791 30792 > 30793 <span class="social-icons__icon-label">Facebook</span> 30794 30795 <svg 30796 class="social-icons__icon icon-default" 30797 aria-hidden="true" 30798 focusable="false" 30799 xmlns="http://www.w3.org/2000/svg" 30800 viewBox="0 0 20 20" 30801 > 30802<path d="M18 10.049C18 5.603 14.419 2 10 2c-4.419 0-8 3.603-8 8.049C2 14.067 4.925 17.396 8.75 18v-5.624H6.719v-2.328h2.03V8.275c0-2.017 1.195-3.132 3.023-3.132.874 0 1.79.158 1.79.158v1.98h-1.009c-.994 0-1.303.621-1.303 1.258v1.51h2.219l-.355 2.326H11.25V18c3.825-.604 6.75-3.933 6.75-7.951Z" /></svg> 30803 30804 </a> 30805 </div> 30806 30807 30808 30809 30810 30811 30812 30813 30814 <div 30815 class="social-icons__icon-wrapper" 30816 > 30817 <a 30818 href="https://www.instagram.com/tnbl_uk/" 30819 target="_blank" 30820 rel="noopener noreferrer" 30821 aria-label="Instagram" 30822 30823 > 30824 <span class="social-icons__icon-label">Instagram</span> 30825 30826 <svg 30827 class="social-icons__icon icon-default" 30828 aria-hidden="true" 30829 focusable="false" 30830 xmlns="http://www.w3.org/2000/svg"
30831 viewBox="0 0 20 20" 30832 > 30833<path 30834 fill-rule="evenodd" 30835 d="M13.23 3.492c-.84-.037-1.096-.046-3.23-.046-2.144 0-2.39.01-3.238.055-.776.027-1.195.164-1.487.273a2.43 2.43 0 0 0-.912.593 2.486 2.486 0 0 0-.602.922c-.11.282-.238.702-.274 1.486-.046.84-.046 1.095-.046 3.23 0 2.134.01 2.39.046 3.229.004.51.097 1.016.274 1.495.145.365.319.639.602.913.282.282.538.456.92.602.474.176.974.268 1.479.273.848.046 1.103.046 3.238.046 2.134 0 2.39-.01 3.23-.046.784-.036 1.203-.164 1.486-.273.374-.146.648-.329.921-.602.283-.283.447-.548.602-.922.177-.476.27-.979.274-1.486.037-.84.046-1.095.046-3.23 0-2.134-.01-2.39-.055-3.229-.027-.784-.164-1.204-.274-1.495a2.43 2.43 0 0 0-.593-.913 2.604 2.604 0 0 0-.92-.602c-.284-.11-.703-.237-1.488-.273ZM6.697 2.05c.857-.036 1.131-.045 3.302-.045 1.1-.014 2.202.001 3.302.045.664.014 1.321.14 1.943.374a3.968 3.968 0 0 1 1.414.922c.41.397.728.88.93 1.414.23.622.354 1.279.365 1.942C18 7.56 18 7.824 18 10.005c0 2.17-.01 2.444-.046 3.292-.036.858-.173 1.442-.374 1.943-.2.53-.474.976-.92 1.423a3.896 3.896 0 0 1-1.415.922c-.51.191-1.095.337-1.943.374-.857.036-1.122.045-3.302.045-2.171 0-2.445-.009-3.302-.055-.849-.027-1.432-.164-1.943-.364a4.152 4.152 0 0 1-1.414-.922 4.128 4.128 0 0 1-.93-1.423c-.183-.51-.329-1.085-.365-1.943C2.009 12.45 2 12.167 2 10.004c0-2.161 0-2.435.055-3.302.027-.848.164-1.432.365-1.942a4.44 4.44 0 0 1 .92-1.414 4.18 4.18 0 0 1 1.415-.93c.51-.183 1.094-.33 1.943-.366Zm.427 4.806a4.105 4.105 0 1 1 5.805 5.805 4.105 4.105 0 0 1-5.805-5.805Zm1.882 5.371a2.668 2.668 0 1 0 2.042-4.93 2.668 2.668 0 0 0-2.042 4.93Zm5.922-5.942a.958.958 0 1 1-1.355-1.355.958.958 0 0 1 1.355 1.355Z" 30836 clip-rule="evenodd" 30837 /></svg> 30838 30839 </a> 30840 </div> 30841 30842 30843 30844 30845 30846 30847 30848 30849 30850 30851 30852 30853 30854 30855 30856 30857 30858 30859 30860 30861 30862 30863 30864 30865 30866 30867 30868 30869 30870 30871 30872 30873 30874 30875 30876 30877 30878 30879 30880 30881 30882 30883 30884 30885 30886 30887 30888 30889 30890 30891 30892 30893 30894 30895 30896 30897 30898 30899</div> 30900 30901 30902 30903 30904 30905</div> 30906</div> 30907 30908 30909
30910<script type="module"> 30911 (function() { 30912 // Only run if Intersection Observer is supported 30913 if (typeof IntersectionObserver === 'undefined') { 30914 // Fallback: show all animated content immediately 30915 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30916 el.classList.add('group-block-content--in-view'); 30917 }); 30918 return; 30919 } 30920 30921 // Respect reduced motion preference 30922 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 30923 if (prefersReducedMotion) { 30924 // Show all animated content immediately without animation 30925 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30926 el.style.opacity = '1'; 30927 el.style.transform = 'none'; 30928 }); 30929 return; 30930 } 30931 30932 // Set up Intersection Observer for scroll-triggered animations 30933 const observerOptions = { 30934 root: null, 30935 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 30936 threshold: 0.1 // Trigger when 10% of element is visible 30937 }; 30938 30939 const observer = new IntersectionObserver((entries) => { 30940 entries.forEach(entry => { 30941 if (entry.isIntersecting) { 30942 const contentElement = entry.target; 30943 // Add the in-view class to trigger animation 30944 contentElement.classList.add('group-block-content--in-view'); 30945 // Unobserve after animation is triggered (only animate once) 30946 observer.unobserve(contentElement); 30947 } 30948 }); 30949 }, observerOptions); 30950 30951 // Observe all group blocks with animations 30952 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30953 observer.observe(el); 30954 }); 30955 })(); 30956</script>
30956 30957 30958 30959 30960 30961</div> 30962</div> 30963 30964 30965
30966<script type="module"> 30967 (function() { 30968 // Only run if Intersection Observer is supported 30969 if (typeof IntersectionObserver === 'undefined') { 30970 // Fallback: show all animated content immediately 30971 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30972 el.classList.add('group-block-content--in-view'); 30973 }); 30974 return; 30975 } 30976 30977 // Respect reduced motion preference 30978 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 30979 if (prefersReducedMotion) { 30980 // Show all animated content immediately without animation 30981 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 30982 el.style.opacity = '1'; 30983 el.style.transform = 'none'; 30984 }); 30985 return; 30986 } 30987 30988 // Set up Intersection Observer for scroll-triggered animations 30989 const observerOptions = { 30990 root: null, 30991 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 30992 threshold: 0.1 // Trigger when 10% of element is visible 30993 }; 30994 30995 const observer = new IntersectionObserver((entries) => { 30996 entries.forEach(entry => { 30997 if (entry.isIntersecting) { 30998 const contentElement = entry.target; 30999 // Add the in-view class to trigger animation 31000 contentElement.classList.add('group-block-content--in-view'); 31001 // Unobserve after animation is triggered (only animate once) 31002 observer.unobserve(contentElement); 31003 } 31004 }); 31005 }, observerOptions); 31006 31007 // Observe all group blocks with animations 31008 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 31009 observer.observe(el); 31010 }); 31011 })(); 31012</script>
31012 31013 31014 31015 31016 31017 31018<div 31019 class="divider divider-ASVNVckZuY1A0UWlCc__divider_JKifR7 spacing-style" 31020 style=" 31021 --divider-justify-content: center; 31022 --padding-block-start: 0px;--padding-block-end: 0px; 31023 " 31024 31025 31026> 31027 <span 31028 class="divider__line" 31029 style=" 31030 --divider-border-thickness: 1px; 31031 31032 --divider-border-rounded: 0; 31033 31034 --divider-flex-basis: 100%; 31035 " 31036 ></span> 31037</div> 31038 31039 31040 31041 31042 31043 31044</div> 31045</div> 31046 31047 31048
31049<script type="module"> 31050 (function() { 31051 // Only run if Intersection Observer is supported 31052 if (typeof IntersectionObserver === 'undefined') { 31053 // Fallback: show all animated content immediately 31054 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 31055 el.classList.add('group-block-content--in-view'); 31056 }); 31057 return; 31058 } 31059 31060 // Respect reduced motion preference 31061 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 31062 if (prefersReducedMotion) { 31063 // Show all animated content immediately without animation 31064 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 31065 el.style.opacity = '1'; 31066 el.style.transform = 'none'; 31067 }); 31068 return; 31069 } 31070 31071 // Set up Intersection Observer for scroll-triggered animations 31072 const observerOptions = { 31073 root: null, 31074 rootMargin: '0px 0px -10% 0px', // Trigger when element is 10% from bottom of viewport 31075 threshold: 0.1 // Trigger when 10% of element is visible 31076 }; 31077 31078 const observer = new IntersectionObserver((entries) => { 31079 entries.forEach(entry => { 31080 if (entry.isIntersecting) { 31081 const contentElement = entry.target; 31082 // Add the in-view class to trigger animation 31083 contentElement.classList.add('group-block-content--in-view'); 31084 // Unobserve after animation is triggered (only animate once) 31085 observer.unobserve(contentElement); 31086 } 31087 }); 31088 }, observerOptions); 31089 31090 // Observe all group blocks with animations 31091 document.querySelectorAll('.group-block-content--has-animation').forEach(el => { 31092 observer.observe(el); 31093 }); 31094 })(); 31095</script>
31095 31096 31097 31098 31099 31100 </div> 31101</div> 31102 31103 31104 31105 31106</footer><div id="shopify-section-sections--28213213528410__footer_utilities_jLGE8U" class="shopify-section shopify-section-group-footer-group footer-utilities"> 31107 31108<div class="section-background color-scheme-3"></div> 31109<div 31110 class="section section--page-width color-scheme-3" 31111 31112> 31113 <div 31114 class="utilities utilities--blocks-2 spacing-style" 31115 style="--padding-block-start: 20px;--padding-block-end: max(20px, calc(var(--spacing-scale) * 48px)); --border-width: 0px; --gap: 24px;" 31116 data-testid="footer-utilities" 31117 > 31118 31119 31120<div 31121 class=" 31122 footer-utilities__group-copyright 31123 custom-typography 31124 footer-utilities__text 31125 custom-font-size 31126 " 31127 style=" 31128--color: ;--font-size: 0.75rem; --font-weight: ;--font-family: ; --text-transform: uppercase; --text-wrap: pretty; --line-height: var(--line-height--body-); --letter-spacing: var(--letter-spacing--body-);" 31129 31130> 31131 <span class="footer-utilities__text"> 31132 © 2026 31133 <a href="/" title="">TNBL UK</a></span> 31134</div> 31135 31136 31137 31138 31139<div 31140 class=" 31141 payment-icons 31142 spacing-style 31143 " 31144 style=" 31145 --padding-block-start: 0px; --padding-block-end:0px; 31146--padding-inline-start:0px; --padding-inline-end:0px; 31147 31148 --icon-gap: 10px; 31149 --alignment: flex-end; 31150 --alignment-mobile: flex-start; 31151 " 31152 31153> 31154 <span class="visually-hidden">Payment methods</span> 31155 <ul 31156 class="payment-icons__list" 31157 role="list" 31158 ><li class="payment-icons__item"> 31159 <svg class="icon icon--full-color" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" x="0" y="0" width="38" height="24" viewBox="0 0 165.521 105.965" xml:space="preserve" aria-labelledby="pi-apple_pay"><title id="pi-apple_pay">Apple Pay</title><path fill="#000" d="M150.698 0H14.823c-.566 0-1.133 0-1.698.003-.477.004-.953.009-1.43.022-1.039.028-2.087.09-3.113.274a10.51 10.51 0 0 0-2.958.975 9.932 9.932 0 0 0-4.35 4.35 10.463 10.463 0 0 0-.975 2.96C.113 9.611.052 10.658.024 11.696a70.22 70.22 0 0 0-.022 1.43C0 13.69 0 14.256 0 14.823v76.318c0 .567 0 1.132.002 1.699.003.476.009.953.022 1.43.028 1.036.09 2.084.275 3.11a10.46 10.46 0 0 0 .974 2.96 9.897 9.897 0 0 0 1.83 2.52 9.874 9.874 0 0 0 2.52 1.83c.947.483 1.917.79 2.96.977 1.025.183 2.073.245 3.112.273.477.011.953.017 1.43.02.565.004 1.132.004 1.698.004h135.875c.565 0 1.132 0 1.697-.004.476-.002.952-.009 1.431-.02 1.037-.028 2.085-.09 3.113-.273a10.478 10.478 0 0 0 2.958-.977 9.955 9.955 0 0 0 4.35-4.35c.483-.947.789-1.917.974-2.96.186-1.026.246-2.074.274-3.11.013-.477.02-.954.022-1.43.004-.567.004-1.132.004-1.699V14.824c0-.567 0-1.133-.004-1.699a63.067 63.067 0 0 0-.022-1.429c-.028-1.038-.088-2.085-.274-3.112a10.4 10.4 0 0 0-.974-2.96 9.94 9.94 0 0 0-4.35-4.35A10.52 10.52 0 0 0 156.939.3c-1.028-.185-2.076-.246-3.113-.274a71.417 71.417 0 0 0-1.431-.022C151.83 0 151.263 0 150.698 0z" /><path fill="#FFF" d="M150.698 3.532l1.672.003c.452.003.905.008 1.36.02.793.022 1.719.065 2.583.22.75.135 1.38.34 1.984.648a6.392 6.392 0 0 1 2.804 2.807c.306.6.51 1.226.645 1.983.154.854.197 1.783.218 2.58.013.45.019.9.02 1.36.005.557.005 1.113.005 1.671v76.318c0 .558 0 1.114-.004 1.682-.002.45-.008.9-.02 1.35-.022.796-.065 1.725-.221 2.589a6.855 6.855 0 0 1-.645 1.975 6.397 6.397 0 0 1-2.808 2.807c-.6.306-1.228.511-1.971.645-.881.157-1.847.2-2.574.22-.457.01-.912.017-1.379.019-.555.004-1.113.004-1.669.004H14.801c-.55 0-1.1 0-1.66-.004a74.993 74.993 0 0 1-1.35-.018c-.744-.02-1.71-.064-2.584-.22a6.938 6.938 0 0 1-1.986-.65 6.337 6.337 0 0 1-1.622-1.18 6.355 6.355 0 0 1-1.178-1.623 6.935 6.935 0 0 1-.646-1.985c-.156-.863-.2-1.788-.22-2.578a66.088 66.088 0 0 1-.02-1.355l-.003-1.327V14.474l.002-1.325a66.7 66.7 0 0 1 .02-1.357c.022-.792.065-1.717.222-2.587a6.924 6.924 0 0 1 .646-1.981c.304-.598.7-1.144 1.18-1.623a6.386 6.386 0 0 1 1.624-1.18 6.96 6.96 0 0 1 1.98-.646c.865-.155 1.792-.198 2.586-.22.452-.012.905-.017 1.354-.02l1.677-.003h135.875" /><g><g><path fill="#000" d="M43.508 35.77c1.404-1.755 2.356-4.112 2.105-6.52-2.054.102-4.56 1.355-6.012 3.112-1.303 1.504-2.456 3.959-2.156 6.266 2.306.2 4.61-1.152 6.063-2.858" /><path fill="#000" d="M45.587 39.079c-3.35-.2-6.196 1.9-7.795 1.9-1.6 0-4.049-1.8-6.698-1.751-3.447.05-6.645 2-8.395 5.1-3.598 6.2-.95 15.4 2.55 20.45 1.699 2.5 3.747 5.25 6.445 5.151 2.55-.1 3.549-1.65 6.647-1.65 3.097 0 3.997 1.65 6.696 1.6 2.798-.05 4.548-2.5 6.247-5 1.95-2.85 2.747-5.6 2.797-5.75-.05-.05-5.396-2.101-5.446-8.251-.05-5.15 4.198-7.6 4.398-7.751-2.399-3.548-6.147-3.948-7.447-4.048" /></g><g><path fill="#000" d="M78.973 32.11c7.278 0 12.347 5.017 12.347 12.321 0 7.33-5.173 12.373-12.529 12.373h-8.058V69.62h-5.822V32.11h14.062zm-8.24 19.807h6.68c5.07 0 7.954-2.729 7.954-7.46 0-4.73-2.885-7.434-7.928-7.434h-6.706v14.894z" />
31159<path fill="#000" d="M92.764 61.847c0-4.809 3.665-7.564 10.423-7.98l7.252-.442v-2.08c0-3.04-2.001-4.704-5.562-4.704-2.938 0-5.07 1.507-5.51 3.82h-5.252c.157-4.86 4.731-8.395 10.918-8.395 6.654 0 10.995 3.483 10.995 8.89v18.663h-5.38v-4.497h-.13c-1.534 2.937-4.914 4.782-8.579 4.782-5.406 0-9.175-3.222-9.175-8.057zm17.675-2.417v-2.106l-6.472.416c-3.64.234-5.536 1.585-5.536 3.95 0 2.288 1.975 3.77 5.068 3.77 3.95 0 6.94-2.522 6.94-6.03z" /><path fill="#000" d="M120.975 79.652v-4.496c.364.051 1.247.103 1.715.103 2.573 0 4.029-1.09 4.913-3.899l.52-1.663-9.852-27.293h6.082l6.863 22.146h.13l6.862-22.146h5.927l-10.216 28.67c-2.34 6.577-5.017 8.735-10.683 8.735-.442 0-1.872-.052-2.261-.157z" /></g></g></svg> 31160 31161 </li><li class="payment-icons__item"> 31162 <svg class="icon icon--full-color" xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" aria-labelledby="pi-google_pay"><title id="pi-google_pay">Google Pay</title><path d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z" fill="#000" opacity=".07"/><path d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32" fill="#FFF"/><path d="M18.093 11.976v3.2h-1.018v-7.9h2.691a2.447 2.447 0 0 1 1.747.692 2.28 2.28 0 0 1 .11 3.224l-.11.116c-.47.447-1.098.69-1.747.674l-1.673-.006zm0-3.732v2.788h1.698c.377.012.741-.135 1.005-.404a1.391 1.391 0 0 0-1.005-2.354l-1.698-.03zm6.484 1.348c.65-.03 1.286.188 1.778.613.445.43.682 1.03.65 1.649v3.334h-.969v-.766h-.049a1.93 1.93 0 0 1-1.673.931 2.17 2.17 0 0 1-1.496-.533 1.667 1.667 0 0 1-.613-1.324 1.606 1.606 0 0 1 .613-1.336 2.746 2.746 0 0 1 1.698-.515c.517-.02 1.03.093 1.49.331v-.208a1.134 1.134 0 0 0-.417-.901 1.416 1.416 0 0 0-.98-.368 1.545 1.545 0 0 0-1.319.717l-.895-.564a2.488 2.488 0 0 1 2.182-1.
3116206zM23.29 13.52a.79.79 0 0 0 .337.662c.223.176.5.269.785.263.429-.001.84-.17 1.146-.472.305-.286.478-.685.478-1.103a2.047 2.047 0 0 0-1.324-.374 1.716 1.716 0 0 0-1.03.294.883.883 0 0 0-.392.73zm9.286-3.75l-3.39 7.79h-1.048l1.281-2.728-2.224-5.062h1.103l1.612 3.885 1.569-3.885h1.097z" fill="#5F6368"/><path d="M13.986 11.284c0-.308-.024-.616-.073-.92h-4.29v1.747h2.451a2.096 2.096 0 0 1-.9 1.373v1.134h1.464a4.433 4.433 0 0 0 1.348-3.334z" fill="#4285F4"/><path d="M9.629 15.721a4.352 4.352 0 0 0 3.01-1.097l-1.466-1.14a2.752 2.752 0 0 1-4.094-1.44H5.577v1.17a4.53 4.53 0 0 0 4.052 2.507z" fill="#34A853"/><path d="M7.079 12.05a2.709 2.709 0 0 1 0-1.735v-1.17H5.577a4.505 4.505 0 0 0 0 4.075l1.502-1.17z" fill="#FBBC04"/><path d="M9.629 8.44a2.452 2.452 0 0 1 1.74.68l1.3-1.293a4.37 4.37 0 0 0-3.065-1.183 4.53 4.53 0 0 0-4.027 2.5l1.502 1.171a2.715 2.715 0 0 1 2.55-1.875z" fill="#EA4335"/></svg> 31163 31164 </li><li class="payment-icons__item"> 31165 <svg class="icon icon--full-color" xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" fill="none" aria-labelledby="pi-master"><title id="pi-master">Mastercard</title><rect x=".5" y=".5" width="37" height="23" rx="2.5" stroke="#000" stroke-opacity=".07" fill="none"/><path d="M35 0H3C1.3 0 0 1.3 0 3V21C0 22.7 1.4 24 3 24H35C36.7 24 38 22.7 38 21V3C38 1.3 36.6 0 35 0Z" fill="#1C1C1C" style="fill:#1C1C1C;fill:color(display-p3 0.1098 0.1098 0.1098);fill-opacity:1;"/><path d="M35 1C36.1 1 37 1.9 37 3V21C37 22.1 36.1 23 35 23H3C1.9 23 1 22.1 1 21V3C1 1.9 1.9 1 3 1H35Z" fill="#232323" style="fill:#232323;fill:color(display-p3 0.1373 0.1373 0.1373);fill-opacity:1;"/><path d="M14.6364 19.2727C18.8538 19.2727 22.2727 15.8538 22.2727 11.6364C22.2727 7.41892 18.8538 4 14.6364 4C10.4189 4 7 7.41892 7 11.6364C7 15.8538 10.4189 19.2727 14.6364 19.2727Z" fill="#EB001B" style="fill:#EB001B;fill:color(display-p3 0.9216 0.0000 0.1059);fill-opacity:1;"/><path d="M23.3637 19.2727C27.5811 19.2727 31 15.8538 31 11.6364C31 7.41892 27.5811 4 23.3637 4C19.1462 4 15.7273 7.41892 15.7273 11.6364C15.7273 15.8538 19.1462 19.2727 23.3637 19.2727Z" fill="#F79E1B" style="fill:#F79E1B;fill:color(display-p3 0.9686 0.6196 0.1059);fill-opacity:1;"/><path d="M22.2727 11.6362C22.2727 9.01797 20.9637 6.72706 19 5.41797C17.0364 6.83615 15.7273 9.12706 15.7273 11.6362C15.7273 14.1452 17.0364 16.5452 19 17.8543C20.9637 16.5452 22.2727 14.2543 22.2727 11.6362Z" fill="#FF5F00" style="fill:#FF5F00;fill:color(display-p3 1.0000 0.3725 0.0000);fill-opacity:1;"/></svg> 31166 31167 </li><li class="payment-icons__item"> 31168 <svg class="icon icon--full-color" viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" width="38" height="24" role="img" aria-labelledby="pi-paypal"><title id="pi-paypal">PayPal</title><path opacity=".07" d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"/><path fill="#fff" d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32"/><path fill="#003087" d="M23.9 8.3c.2-1 0-1.7-.6-2.3-.6-.7-1.7-1-3.1-1h-4.1c-.3 0-.5.2-.6.5L14 15.6c0 .2.1.4.3.4H17l.4-3.4 1.8-2.2 4.7-2.1z"/><path fill="#3086C8" d="M23.9 8.3l-.2.2c-.5 2.8-2.2 3.8-4.6 3.8H18c-.3 0-.5.2-.6.5l-.6 3.9-.2 1c0 .2.1.4.3.4H19c.3 0 .5-.2.5-.4v-.1l.4-2.4v-.1c0-.2.3-.4.5-.4h.3c2.1 0 3.7-.8 4.1-3.2.2-1 .1-1.8-.4-2.4-.1-.5-.3-.7-.5-.8z"/><path fill="#012169" d="M23.3 8.1c-.1-.1-.2-.1-.3-.1-.1 0-.2 0-.3-.1-.3-.1-.7-.1-1.1-.1h-3c-.1 0-.2
311680-.2.1-.2.1-.3.2-.3.4l-.7 4.4v.1c0-.3.3-.5.6-.5h1.3c2.5 0 4.1-1 4.6-3.8v-.2c-.1-.1-.3-.2-.5-.2h-.1z"/></svg> 31169 </li><li class="payment-icons__item"> 31170 <svg class="icon icon--full-color" xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" fill="none" aria-labelledby="pi-visa"><title id="pi-visa">Visa</title><rect x=".5" y=".5" width="37" height="23" rx="2.5" stroke="#000" stroke-opacity=".07" fill="none"/><path d="M35 0H3C1.3 0 0 1.3 0 3V21C0 22.7 1.4 24 3 24H35C36.7 24 38 22.7 38 21V3C38 1.3 36.6 0 35 0Z" fill="#142FBD" style="fill:#142FBD;fill:color(display-p3 0.0784 0.1843 0.7412);fill-opacity:1;"/><path d="M35 1C36.1 1 37 1.9 37 3V21C37 22.1 36.1 23 35 23H3C1.9 23 1 22.1 1 21V3C1 1.9 1.9 1 3 1H35Z" fill="#1532CB" style="fill:#1532CB;fill:color(display-p3 0.0824 0.1961 0.7961);fill-opacity:1;"/><path d="M29.5944 10.2167H29.2778C28.8556 11.2722 28.5389 11.8 28.2222 13.3833H30.2278C29.9111 11.8 29.9111 11.0611 29.5944 10.2167V10.2167ZM32.6556 16.4444H30.8611C30.7556 16.4444 30.7556 16.4444 30.65 16.3389L30.4389 15.3889L30.3333 15.1778H27.8C27.6944 15.1778 27.5889 15.1778 27.5889 15.3889L27.2722 16.3389C27.2722 16.4444 27.1667 16.4444 27.1667 16.4444H24.95L25.1611 15.9167L28.2222 8.73889C28.2222 8.21111 28.5389 8 29.0667 8H30.65C30.7556 8 30.8611 8 30.8611 8.21111L32.3389 15.0722C32.4444 15.4944 32.55 15.8111 32.55 16.2333C32.6556 16.3389 32.6556 16.3389 32.6556 16.4444V16.4444ZM18.5111 16.1278L18.9333 14.2278C19.0389 14.2278 19.1444 14.3333 19.1444 14.3333C19.8833 14.65 20.6222 14.8611 21.3611 14.7556C21.5722 14.7556 21.8889 14.65 22.1 14.5444C22.6278 14.3333 22.6278 13.8056 22.2056 13.3833C21.9944 13.1722 21.6778 13.0667 21.3611 12.8556C20.9389 12.6444 20.5167 12.4333 20.2 12.1167C18.9333 11.0611 19.3556 9.58333 20.0944 8.84444C20.7278 8.42222 21.0444 8 21.8889 8C23.1556 8 24.5278 8 25.1611 8.21111H25.2667C25.1611 8.84444 25.0556 9.37222 24.8444 10.0056C24.3167 9.79444 23.7889 9.58333 23.2611 9.58333C22.9444 9.58333 22.6278 9.58333 22.3111 9.68889C22.1 9.68889 21.9944 9.79444 21.8889 9.9C21.6778 10.1111 21.6778 10.4278 21.8889 10.6389L22.4167 11.0611C22.8389 11.2722 23.2611 11.4833 23.5778 11.6944C24.1056 12.0111 24.6333 12.5389 24.7389 13.1722C24.95 14.1222 24.6333 14.9667 23.7889 15.6C23.2611 16.0222 23.05 16.2333 22.3111 16.2333C20.8333 16.2333 19.6722 16.3389 18.7222 16.0222C18.6167 16.2333 18.6167 16.2333 18.5111 16.1278V16.1278ZM14.8167 16.4444C14.9222 15.7056 14.9222 15.7056 15.0278 15.3889C15.5556 13.0667 16.0833 10.6389 16.5056 8.31667C16.6111 8.10556 16.6111 8 16.8222 8H18.7222C18.5111 9.26667 18.3 10.2167 17.9833 11.3778C17.6667 12.9611 17.35 14.5444 16.9278 16.1278C16.9278 16.3389 16.8222 16.3389 16.6111 16.3389L14.8167 16.4444ZM5 8.21111C5 8.10556 5.21111 8 5.31667 8H8.90556C9.43333 8 9.85556 8.31667 9.96111 8.84444L10.9111 13.4889C10.9111 13.5944 10.9111 13.5944 11.0167 13.7C11.0167 13.5944 11.1222 13.5944 11.1222 13.5944L13.3389 8.21111C13.2333 8.10556 13.3389 8 13.4444 8H15.6611C15.6611 8.10556 15.6611 8.10556 15.5556 8.21111L12.2833 15.9167C12.1778 16.1278 12.1778
3117016.2333 12.0722 16.3389C11.9667 16.4444 11.7556 16.3389 11.5444 16.3389H9.96111C9.85556 16.3389 9.75 16.3389 9.75 16.1278L8.06111 9.58333C7.85 9.37222 7.53333 9.05556 7.11111 8.95C6.47778 8.63333 5.31667 8.42222 5.10556 8.42222L5 8.21111Z" fill="white" style="fill:white;fill-opacity:1;"/></svg> 31171 31172 </li></ul> 31173</div> 31174 31175 31176 31177 31178 31179 </div> 31180</div> 31181 31182 31183 31184 31185</div> 31186<!-- END sections: footer-group --> 31187 31188
31188<script 31189 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/dialog.js?v=61774032287387761671774530324" 31190 type="module" 31191></script>
31191 31192
31193<script 31194 src="//www.tnbl.co.uk/cdn/shop/t/6/assets/predictive-search.js?v=149240552485540508541774530329" 31195 type="module" 31196 fetchpriority="low" 31197></script>
31197 31198 31199<dialog-component 31200 id="search-modal" 31201 class="search-modal" 31202 31203> 31204 <dialog 31205 ref="dialog" 31206 on:click="/closeDialogOnClickOutside" 31207 on:keydown="/closeDialogOnEscapePress" 31208 class="search-modal__content dialog-modal" 31209 scroll-lock 31210 aria-labelledby="search-modal-heading" 31211 > 31212 <h2 31213 id="search-modal-heading" 31214 class="visually-hidden" 31215 > 31216 Search 31217 </h2> 31218 <predictive-search-component 31219 class="predictive-search color-scheme-1" 31220 style="--product-corner-radius: 0px; --card-corner-radius: 4px;" 31221 data-section-id="predictive-search" 31222 data-testid="search-component--modal" 31223 role="search" 31224 aria-label="Search" 31225 > 31226 <form 31227 action="/search" 31228 method="get" 31229 role="search" 31230 class="predictive-search-form" 31231 ref="form" 31232 on:keydown="/onSearchKeyDown" 31233 > 31234 <div 31235 class="predictive-search-form__header" 31236 > 31237 <div class="predictive-search-form__header-inner"> 31238 <label 31239 for="cmdk-input" 31240 class="visually-hidden" 31241 >Search</label> 31242 <input 31243 class="search-input" 31244 id="cmdk-input" 31245 type="search" 31246 name="q" 31247 role="combobox" 31248 aria-expanded="false" 31249 aria-owns="predictive-search-results" 31250 aria-controls="predictive-search-results" 31251 aria-haspopup="listbox" 31252 aria-autocomplete="list" 31253 autocomplete="off" 31254 placeholder="Search" 31255 ref="searchInput" 31256 on:input="/search" 31257 on:keydown="/onSearchKeyDown" 31258 > 31259 <input 31260 name="options[prefix]" 31261 type="hidden" 31262 value="last" 31263 > 31264 <span class="svg-wrapper predictive-search__icon"> 31265 <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 31266<path d="M19.1361 20L11.4929 12.3568C10.8825 12.8764 10.1807 13.2786 9.38723 13.5634C8.59379 13.8483 7.79649 13.9907 6.99533 13.9907C5.04023 13.9907 3.38552 13.3139 2.03119 11.9604C0.677063 10.6069 0 8.95318 0 6.9993C0 5.04522 0.676758 3.39009 2.03027 2.03393C3.38379 0.677977 5.03748 0 6.99136 0C8.94545 0 10.6006 0.677063 11.9567 2.03119C13.3127 3.38552 13.9907 5.04023 13.9907 6.99533C13.9907 7.84349 13.8404 8.66429 13.5399 9.45772C13.2394 10.2512 12.8451 10.9295 12.3568 11.4929L20 19.1364L19.1361 20ZM6.99533 12.77C8.61495 12.77 9.9823 12.2125 11.0974 11.0974C12.2125 9.9825 12.77 8.61515 12.77 6.99533C12.77 5.37551 12.2125 4.00816 11.0974 2.89328C9.9823 1.7782 8.61495 1.22067 6.99533 1.22067C5.37551 1.22067 4.00816 1.7782 2.89328 2.89328C1.7782 4.00816 1.22067 5.37551 1.22067 6.99533C1.22067 8.61515 1.7782 9.9825 2.89328 11.0974C4.00816 12.2125 5.37551 12.77 6.99533 12.77Z" fill="#111111"/> 31267</svg> 31268 31269 </span> 31270 <button 31271 type="button" 31272 class="button-unstyled predictive-search__reset-button" 31273 ref="resetButton" 31274 hidden 31275 on:click="/resetSearch" 31276 > 31277 Clear 31278 </button> 31279 </div> 31280 <button 31281 type="button" 31282 class="button predictive-search__close-modal-button" 31283 aria-label="Close dialog" 31284 on:click="dialog-component/closeDialog" 31285 ref="closeModalButton" 31286 > 31287 <span class="svg-wrapper"> 31288 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 31289 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 31290 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 31291</svg> 31292 31293 </span> 31294 </button> 31295 </div> 31296 31297 <div class="predictive-search-form__content-wrapper"> 31298 <div 31299 class="predictive-search-form__content" 31300 tabindex="-1" 31301 ref="predictiveSearchResults" 31302 on:click="/handleModalClick" 31303 > 31304 31305 31306<div 31307 id="predictive-search-results" 31308 class="predictive-search-dropdown" 31309 role="listbox"
31310 aria-expanded="true" 31311 style="--color-shadow: rgb(var(--color-foreground-rgb) / 0.1);" 31312> 31313 31314 <div class="predictive-search-results__inner"> 31315 31316 31317 31318 31319 31320 <div 31321 id="predictive-search-products" 31322 class="predictive-search-results__products" 31323 31324 data-testid="products-list-default--modal" 31325 31326> 31327 31328 <h4 class="predictive-search-results__title"> 31329 Products 31330 </h4> 31331 <ul 31332 class="predictive-search-results__list predictive-search-results__wrapper-products list-unstyled" 31333 role="listbox" 31334 aria-label="Products" 31335 > 31336 31337 31338 <li 31339 class="predictive-search-results__card predictive-search-results__card--product" 31340 ref="resultsItems[]" 31341 > 31342 31343<product-card-link 31344 data-product-id="10666571170138" 31345 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/1656080832-28260200_b0edcac7-1c87-4e6e-84f6-f4bd52d39a1b.jpg?v=1768909812&width=500" 31346 data-product-transition="true" 31347 ><div 31348 class="resource-card" 31349 href="/products/tnbl-h-easy-french-v-shape-cutters-silver" 31350 data-resource-type="product" 31351> 31352 <a 31353 class="resource-card__link" 31354 href="/products/tnbl-h-easy-french-v-shape-cutters-silver" 31355 > 31356 <span class="visually-hidden"> 31357 #H Easy French V-Shape Cutters - Silver 31358 </span> 31359 </a> 31360 <div 31361 class="resource-card__media" 31362 style="--resource-card-aspect-ratio: 4 / 5;" 31363 31364 data-view-transition-to-main-product 31365 31366 > 31367 31368 31369<img src="//www.tnbl.co.uk/cdn/shop/files/1656080832-28260200_b0edcac7-1c87-4e6e-84f6-f4bd52d39a1b.jpg?v=1768909812&width=500" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/1656080832-28260200_b0edcac7-1c87-4e6e-84f6-f4bd52d39a1b.jpg?v=1768909812&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/1656080832-28260200_b0edcac7-1c87-4e6e-84f6-f4bd52d39a1b.jpg?v=1768909812&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="true" style="object-position: 50.0% 50.0%;"> 31370</div> 31371 31372 <div class="resource-card__content"> 31373 31374 <p class="resource-card__vendor paragraph"> 31375 TNBL 31376 </p> 31377 31378 <p class="resource-card__title paragraph">#H Easy French V-Shape Cutters - Silver</p> 31379 31380 31381 <div ref="priceContainer"> 31382 31383 31384 31385 31386 31387 <span class="price">£5.00</span> 31388 31389 31390 31391 31392</div> 31393 31394 </div> 31395</div></product-card-link> 31396 31397 </li> 31398 31399 <li 31400 class="predictive-search-results__card predictive-search-results__card--product" 31401 ref="resultsItems[]" 31402 > 31403 31404<product-card-link 31405 data-product-id="10666571268442" 31406 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/1656501983-43261500_1efed7e0-0701-4485-b979-6f08f38e0f00.png?v=1768909817&width=500" 31407 data-product-transition="true" 31408 ><div 31409 class="resource-card" 31410 href="/products/tnbl-k-easy-french-water-drop-cutters-gold" 31411 data-resource-type="product" 31412> 31413 <a 31414 class="resource-card__link" 31415 href="/products/tnbl-k-easy-french-water-drop-cutters-gold" 31416 > 31417 <span class="visually-hidden"> 31418 #K Easy French Water Drop Cutters - Gold 31419 </span> 31420 </a> 31421 <div 31422 class="resource-card__media" 31423 style="--resource-card-aspect-ratio: 4 / 5;" 31424 31425 data-view-transition-to-main-product 31426 31427 > 31428 31429 31430<img src="//www.tnbl.co.uk/cdn/shop/files/1656501983-43261500_1efed7e0-0701-4485-b979-6f08f38e0f00.png?v=1768909817&width=500" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/1656501983-43261500_1efed7e0-0701-4485-b979-6f08f38e0f00.png?v=1768909817&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/1656501983-43261500_1efed7e0-0701-4485-b979-6f08f38e0f00.png?v=1768909817&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="true" style="object-position: 50.0% 50.0%;"> 31431</div> 31432 31433 <div class="resource-card__content"> 31434 31435 <p class="resource-card__vendor paragraph"> 31436 TNBL 31437 </p> 31438 31439 <p class="resource-card__title paragraph">#K Easy French Water Drop Cutters - Gold</p> 31440 31441 31442 <div ref="priceContainer"> 31443 31444 31445 31446 31447
31448 <span class="price">£5.00</span> 31449 31450 31451 31452 31453</div> 31454 31455 </div> 31456</div></product-card-link> 31457 31458 </li> 31459 31460 <li 31461 class="predictive-search-results__card predictive-search-results__card--product" 31462 ref="resultsItems[]" 31463 > 31464 31465<product-card-link 31466 data-product-id="10666571235674" 31467 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/1656080832-86649200_3a7669c5-f579-4718-9c0a-6f684f1e876a.jpg?v=1768909816&width=500" 31468 data-product-transition="true" 31469 ><div 31470 class="resource-card" 31471 href="/products/tnbl-k-easy-french-water-drop-cutters-silver" 31472 data-resource-type="product" 31473> 31474 <a 31475 class="resource-card__link" 31476 href="/products/tnbl-k-easy-french-water-drop-cutters-silver" 31477 > 31478 <span class="visually-hidden"> 31479 #K Easy French Water Drop Cutters - Silver 31480 </span> 31481 </a> 31482 <div 31483 class="resource-card__media" 31484 style="--resource-card-aspect-ratio: 4 / 5;" 31485 31486 data-view-transition-to-main-product 31487 31488 > 31489 31490 31491<img src="//www.tnbl.co.uk/cdn/shop/files/1656080832-86649200_3a7669c5-f579-4718-9c0a-6f684f1e876a.jpg?v=1768909816&width=500" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/1656080832-86649200_3a7669c5-f579-4718-9c0a-6f684f1e876a.jpg?v=1768909816&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/1656080832-86649200_3a7669c5-f579-4718-9c0a-6f684f1e876a.jpg?v=1768909816&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="true" style="object-position: 50.0% 50.0%;"> 31492</div> 31493 31494 <div class="resource-card__content"> 31495 31496 <p class="resource-card__vendor paragraph"> 31497 TNBL 31498 </p> 31499 31500 <p class="resource-card__title paragraph">#K Easy French Water Drop Cutters - Silver</p> 31501 31502 31503 <div ref="priceContainer"> 31504 31505 31506 31507 31508 31509 <span class="price">£5.00</span> 31510 31511 31512 31513 31514</div> 31515 31516 </div> 31517</div></product-card-link> 31518 31519 </li> 31520 31521 <li 31522 class="predictive-search-results__card predictive-search-results__card--product" 31523 ref="resultsItems[]" 31524 > 31525 31526<product-card-link 31527 data-product-id="10666595680602" 31528 data-featured-media-url="//www.tnbl.co.uk/cdn/shop/files/1705842587-67525300_f9520136-4076-48ea-8504-b94aec7b7572.png?v=1768910747&width=500" 31529 data-product-transition="true" 31530 ><div 31531 class="resource-card" 31532 href="/products/tnbl-0-25g-long-handle-measuring-spoon-4pcs" 31533 data-resource-type="product" 31534> 31535 <a 31536 class="resource-card__link" 31537 href="/products/tnbl-0-25g-long-handle-measuring-spoon-4pcs" 31538 > 31539 <span class="visually-hidden"> 31540 0.25g Long Handle Measuring Spoon 4pcs 31541 </span> 31542 </a> 31543 <div 31544 class="resource-card__media" 31545 style="--resource-card-aspect-ratio: 4 / 5;" 31546 31547 data-view-transition-to-main-product 31548 31549 > 31550 31551 31552<img src="//www.tnbl.co.uk/cdn/shop/files/1705842587-67525300_f9520136-4076-48ea-8504-b94aec7b7572.png?v=1768910747&width=500" alt="" srcset="//www.tnbl.co.uk/cdn/shop/files/1705842587-67525300_f9520136-4076-48ea-8504-b94aec7b7572.png?v=1768910747&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/1705842587-67525300_f9520136-4076-48ea-8504-b94aec7b7572.png?v=1768910747&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="true" style="object-position: 50.0% 50.0%;"> 31553 31554 <img src="//www.tnbl.co.uk/cdn/shop/files/1705842606-03003100_f447e117-fb23-4c00-94f7-a5ed87bc4bc0.png?v=1768910747&width=500" alt="0.25g Long Handle Measuring Spoon 4pcs" srcset="//www.tnbl.co.uk/cdn/shop/files/1705842606-03003100_f447e117-fb23-4c00-94f7-a5ed87bc4bc0.png?v=1768910747&width=240 240w, //www.tnbl.co.uk/cdn/shop/files/1705842606-03003100_f447e117-fb23-4c00-94f7-a5ed87bc4bc0.png?v=1768910747&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image resource-card__image--secondary" sizes="auto" transitionToProduct="true" data-media-id="58105734037850" style="object-position: 50.0% 50.0%;"> 31555</div> 31556 31557 <div class="resource-card__content"> 31558 31559 <p class="resource-card__vendor paragraph"> 31560 TNBL 31561 </p> 31562 31563 <p class="resource-card__title paragraph">0.25g Long Handle Measuring Spoon 4pcs</p> 31564 31565 31566 <div ref="priceContainer"> 31567 31568 31569 31570 31571
31572 <span class="price">£0.80</span> 31573 31574 31575 31576 31577</div> 31578 31579 </div> 31580</div></product-card-link> 31581 31582 </li> 31583 31584 </ul> 31585 31586</div> 31587 31588 31589 31590 31591 31592 </div> 31593 31594</div> 31595 31596 </div> 31597 31598 <div class="predictive-search-form__footer"> 31599 <button 31600 class="button button-primary predictive-search__search-button" 31601 ref="viewAllButton" 31602 > 31603 View all 31604 </button> 31605 </div> 31606 </div> 31607 </form> 31608 </predictive-search-component> 31609 </dialog> 31610</dialog-component> 31611 31612 31613 31614 31615 31616 <quick-add-dialog id="quick-add-dialog"> 31617 <dialog 31618 class="quick-add-modal dialog-modal color-scheme-1" 31619 ref="dialog" 31620 scroll-lock 31621 > 31622 <button 31623 ref="closeButton" 31624 on:click="/closeDialog" 31625 class="button button-unstyled close-button quick-add-modal__close" 31626 aria-label="Close dialog" 31627 ><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 31628 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 31629 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 31630</svg> 31631</button> 31632 <div 31633 id="quick-add-modal-content" 31634 class="quick-add-modal__content" 31635 ></div> 31636 </dialog> 31637</quick-add-dialog> 31638 31639 31640 31641 31642 31643 <style data-shopify> 31644 .samita-cutoff-time .samita-countdown-remaining--text:empty:before { 31645 content: '23 hours'; 31646 font-size: 13px !important; 31647 font-weight: bold !important; 31648 } 31649</style> 31650 <div id="shopify-block-AVDVzSVVWclljdm5RV__18147337299481159562" class="shopify-block shopify-app-block"> 31651<link rel="preload" href="https://cdn.shopify.com/extensions/01a0c2dc-0fea-7e5e-93fb-190052337476/pify-order-purchase-limit-452/assets/pol_def.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 31652<noscript><link rel="stylesheet" href="https://cdn.shopify.com/extensions/01a0c2dc-0fea-7e5e-93fb-190052337476/pify-order-purchase-limit-452/assets/pol_def.min.css"></noscript> 31653 31654<!-- BEGIN app snippet: app-init-zip --> 31655 31656 31657 31658 31659 31660<div class="pol-m"> 31661 <div class="pol-m-c"> 31662 <div class="pol-i"> 31663 <div class="pol-i-li1"> 31664 <div class="pol-i-li1-t">Cannot place order, conditions not met:</div> 31665 <div class="pol-i-li1-x"> 31666 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" class="icon-close" 31667 fill="none" viewBox="0 0 18 17"> 31668 <path 31669 d="M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z" 31670 fill="currentColor"></path> 31671 </svg> 31672 </div> 31673 </div> 31674 <div class="pol-i-li2"> 31675 <div class="pol-u"></div> 31676 </div> 31677 <div class="pol-i-li3"> 31678 <div class="pol-i-li3-t"> 31679 </div> 31680 <div class="pol-i-li3-s">OK</div> 31681 </div> 31682 </div> 31683 </div> 31684</div> 31685
31686<script> 31687 var _ps = {}; 31688 var _pol_rate = Shopify.currency?.rate ?? 1.0; 31689 31690 _ps.pageType = "index"; //index/collection/product/cart/page/search/list-collections 31691 _ps.shopDomain = Shopify.shop; 31692 // Custom compatibility for firewood-factory.myshopify.com. 31693 if ( 31694 _ps.shopDomain === 'firewood-factory.myshopify.com' && 31695 !document.querySelector('link[data-pify-firewood-factory-css="1"]') 31696 ) { 31697 var pifyFirewoodFactoryCss = document.createElement('link'); 31698 pifyFirewoodFactoryCss.rel = 'stylesheet'; 31699 pifyFirewoodFactoryCss.href = "https:\/\/cdn.shopify.com\/extensions\/01a0c2dc-0fea-7e5e-93fb-190052337476\/pify-order-purchase-limit-452\/assets\/pol_def_firewood-factory.min.css"; 31700 pifyFirewoodFactoryCss.setAttribute('data-pify-firewood-factory-css', '1'); 31701 document.head.appendChild(pifyFirewoodFactoryCss); 31702 } 31703 31704 _ps.countryCode = "GB"; 31705 31706 31707 _ps.marketHandle = "gb"; 31708 31709 _ps.marketId = null; 31710 31711 31712 _ps.defaultLanguageIsoCode = "en"; 31713 31714 _ps._sdwcc = true; 31715 31716 31717 _ps._iispwl = false; 31718 31719 31720 _ps._iisrwl = false; 31721 31722 31723 _ps.locale = "en"; 31724 var _shopifyLocale = typeof Shopify !== "undefined" ? Shopify.locale : null; 31725 if (typeof _shopifyLocale === "string" && _shopifyLocale.trim() !== "") _ps.locale = _shopifyLocale; 31726 31727 31728 31729 31730 31731 _ps.customerCurrency = { "currencyCode": "GBP", "currencySymbol": "£", "currencyRate": _pol_rate }; 31732 _ps.shopCurrency = { "currencyCode": "GBP", "weightUnit": "g" }; 31733 _ps.theme = { "schemaName": Shopify.theme.schema_name } 31734 _ps.globalSetting = {}; 31735 _ps.cartLimitRules = {}; 31736 _ps.orderLimitRules = {}; 31737 _ps.globalLimitRules = {}; 31738 _ps.collectionLimitRules = []; 31739 _ps.productLimitRules = []; 31740 _ps.variantLimitRules = []; 31741 _ps.orderLimitAlertMessages = {}; 31742 _ps.collectionLimitAlertMessages = {}; 31743 _ps.productLimitAlertMessages = {}; 31744 _ps.variantLimitAlertMessages = {}; 31745 _ps._pub = false; 31746 _ps.product = {}; 31747 _ps.productCollectionIds = []; 31748 _ps.variants = []; 31749 31750 31751 31752 31753 31754 31755 31756 31757 31758 31759 _ps.productLimitRules = [{"p":10666632642906,"inasp":true,"mq":1,"Mq":1,"qm":1,"mqv":1,"Mqv":1,"mv":1,"evil":[53270900539738],"ut":1788881624,"gst":"all"}]; 31760 31761 31762 31763 31764 31765 31766 31767 31768 31769 31770 31771 31772 31773 31774 31775 _ps.productLimitAlertMessages = [{"Key":"en","Value":{"languageIsoCode":"en","isNotAllowSinglePurchase":"\"{productTitle}\" cannot be purchased individually and must be bought together with other items.","minQuantityPerProduct":"Quantity for \"{productTitle}\" is below the minimum requirement. Minimum: {minProductQuantity}, Current: {currentQuantity}.","maxQuantityPerProduct":"Quantity for \"{productTitle}\" exceeds the maximum limit. Maximum: {maxProductQuantity}, Current: {currentQuantity}.","quantityMultiplePerProduct":"Quantity for \"{productTitle}\" must be a multiple of {productQuantityMultiple}
31775. Current: {currentQuantity}.","minQuantityPerVariant":"Quantity for \"{productTitle} - {variantTitle}\" is below the minimum requirement. Minimum: {minVariantQuantity}, Current: {currentQuantity}.","maxQuantityPerVariant":"Quantity for \"{productTitle} - {variantTitle}\" exceeds the maximum limit. Maximum: {maxVariantQuantity}, Current: {currentQuantity}.","quantityMultiplePerVariant":"Quantity for \"{productTitle} - {variantTitle}\" must be a multiple of {variantQuantityMultiple}. Current: {currentQuantity}.","isDefault":true}},{"Key":"vi","Value":{"languageIsoCode":"vi","isNotAllowSinglePurchase":"\"{productTitle}\" không thá» mua riêng lẻ và phải ÄÆ°á»£c mua cùng vá»i các sản phẩm khác.","minQuantityPerProduct":"Sá» lượng cá»§a \"{productTitle}\" thấp hÆ¡n mức tá»i thiá»u. Tá»i thiá»u: {minProductQuantity}, Hiá»n tại: {currentQuantity}.","maxQuantityPerProduct":"Sá» lượng cá»§a \"{productTitle}\" vượt quá mức tá»i Äa. Tá»i Äa: {maxProductQuantity}, Hiá»n tại: {currentQuantity}.","quantityMultiplePerProduct":"Sá» lượng cá»§a \"{productTitle}\" phải là bá»i sá» cá»§a {productQuantityMultiple}. Hiá»n tại: {currentQuantity}.","minQuantityPerVariant":"Sá» lượng cá»§a \"{productTitle} - {variantTitle}\" thấp hÆ¡n mức tá»i thiá»u. Tá»i thiá»u: {minVariantQuantity}, Hiá»n tại: {currentQuantity}.","maxQuantityPerVariant":"Sá» lượng cá»§a \"{productTitle} - {variantTitle}\" vượt quá mức tá»i Äa. Tá»i Äa: {maxVariantQuantity}, Hiá»n tại: {currentQuantity}.","quantityMultiplePerVariant":"Sá» lượng cá»§a \"{productTitle} - {variantTitle}\" phải là bá»i sá» cá»§a {variantQuantityMultiple}. Hiá»n tại: {currentQuantity}.","isDefault":false}}]; 31776 31777 31778 31779 _ps.variantLimitAlertMessages = [{"Key":"en","Value":{"languageIsoCode":"en","minQuantity":"Quantity for \"{productTitle} - {variantTitle}\" is below the minimum requirement. Minimum: {minVariantQuantity}, Current: {currentQuantity}.","maxQuantity":"Quantity for \"{productTitle} - {variantTitle}\" exceeds the maximum limit. Maximum: {maxVariantQuantity}, Current: {currentQuantity}.","multiple":"Quantity for \"{productTitle} - {variantTitle}\" must be a multiple of {variantQuantityMultiple}
31779. Current: {currentQuantity}.","isNotAllowSinglePurchase":"\"{productTitle} - {variantTitle}\" cannot be purchased individually and must be bought together with other items.","isOnlyAllowSinglePurchase":"\"{productTitle} - {variantTitle}\" can only be purchased individually and cannot be bought together with other items.","isDefault":true}},{"Key":"vi","Value":{"languageIsoCode":"vi","minQuantity":"Sá» lượng cho \"{productTitle} - {variantTitle}\" thấp hÆ¡n yêu cầu tá»i thiá»u. Tá»i thiá»u: {minVariantQuantity}, Hiá»n tại: {currentQuantity}.","maxQuantity":"Sá» lượng cho \"{productTitle} - {variantTitle}\" vượt quá giá»i hạn tá»i Äa. Tá»i Äa: {maxVariantQuantity}, Hiá»n tại: {currentQuantity}.","multiple":"Sá» lượng cho \"{productTitle} - {variantTitle}\" phải là bá»i sá» cá»§a {variantQuantityMultiple}. Hiá»n tại: {currentQuantity}.","isNotAllowSinglePurchase":"\"{productTitle} - {variantTitle}\" không thá» mua riêng lẻ và phải ÄÆ°á»£c mua cùng vá»i các mặt hà ng khác.","isOnlyAllowSinglePurchase":"\"{productTitle} - {variantTitle}\" chá» có thá» mua riêng lẻ và không thá» mua cùng vá»i các mặt hà ng khác.","isDefault":false}}]; 31780 31781 31782 31783 31784 31785 _ps._pub = true; 31786 31787_ps._sa = {}; 31788 31789 31790 _ps._sfat = "96fd5fae73adc7bcdb95f13d4027eec6"; 31791 _ps._log = false; 31792 _ps._ver = ""; 31793 Object.assign(_ps._sa, 31794 { 31795 "_a1": "", 31796 "_a2": "", 31797 "_a3": false, 31798 "_a4": "", 31799 "_a5": "", 31800 "_a6": false, 31801 "_a7": "div.product-details form[action=\"\/cart\/add\"] button.add-to-cart-button", 31802 "_a8": "", 31803 "_a9": false, 31804 "_aa": "#checkout", 31805 "_ab": "a.header-actions__action", 31806 "_ac": false, 31807 "_ad": false, 31808 "_ae": "", 31809 "_af": true, 31810 "_ag": "index,collection,product", 31811 "_ah": false 31812 }); 31813 31814 31815 31816 31817 31818 31819 31820 31821 Object.assign(_ps._sa, 31822 { 31823 "_i1": "#checkout", 31824 "_i2": 1, 31825 "_i3": "#cart-form input[name=\"updates[]\"]", 31826 "_i4": "button[name=\"minus\"]", 31827 "_i5": "button[name=\"plus\"]", 31828 "_i6": 0, 31829 "_i7": "cart_line", 31830 "_i8": "", 31831 "_i9": "", 31832 "_ia": "data-cart-line", 31833 "_ib": "", 31834 "_ic": 2, 31835 "_id": "dialog.cart-drawer__dialog", 31836 "_ie": "", 31837 "_if": "", 31838 "_ig": "open", 31839 "_ih": "null", 31840 "_ii": 0, 31841 "_ij": 1, 31842 "_ik": 3, 31843 "_il": "dialog.cart-drawer__dialog cart-items-component", 31844 "_im": "", 31845 "_in": "", 31846 "_io": "class", 31847 "_ip": "cart-items-disabled", 31848 "_iq": 0, 31849 "_ir": true, 31850 "_is": "", 31851 "_it": 1, 31852 "_iu": "" 31853 }); 31854 31855 31856 31857 31858 31859 31860 31861 31862 31863 31864 31865 31866 31867 31868</script>
31868 31869 31870 31871 31872 31873 31874 31875 31876 31877 31878 31879 31880 31881 31882
31882<script src="https://cdn.shopify.com/extensions/01a0c2dc-0fea-7e5e-93fb-190052337476/pify-order-purchase-limit-452/assets/pol_zip_i.min.js" type="module" defer="defer" async="async"></script>
31882 31883
31883<script src="https://cdn.shopify.com/extensions/01a0c2dc-0fea-7e5e-93fb-190052337476/pify-order-purchase-limit-452/assets/pol_zip_i.min.js" nomodule defer="defer" async="async"></script>
31883 31884 31885 31886 31887<!-- END app snippet --> 31888 31889 31890</div><div id="shopify-block-AOVh0R2hLSmdaU1I1b__8232719769135528861" class="shopify-block shopify-app-block">
31890<script id="volume-config"> 31891 // place the app at the bottom of body 31892 const volNewApp = document.createElement('div'); 31893 31894 volNewApp.setAttribute('id', 'qikify-volume'); 31895 31896 // App identifier marker so AI/crawlers can recognize this app on the storefront 31897 const marker = document.createComment(' Qikify Volume Discounts Bundle by Qikify - https://apps.shopify.com/qikify-bundles-quantity-break '); 31898 31899 // place it at the bottom 31900 document.body.appendChild(marker); 31901 document.body.appendChild(volNewApp); 31902 31903 31904 31905 _VL = { 31906 offers: [{"extension_type":"volume","offer_title":"Buy more, save more","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":true,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1 Nail File"},{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":10,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":"Most Popular","label_type":"classic","quantity":"10","subtitle":"Save 10%","title":"10 Nail Files"},{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":"50","enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":"Bulk Savings","label_type":"classic","quantity":"50","subtitle":"Save 45%","title":"50 Nail files"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"countdown_heading_content":"HURRY UP!","countdown_subheading_content":"Sale end in","layout":"vertical","border_radius":10,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FFEDF7","label_text_color":"#000000","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"PROFESSIONAL NAIL FILE ZEBRA HALF MOON AND SQUARE","trigger_data_products":[{"id":"10666633298266","title":"TNBL Nail File Professional - Half Moon Zebra","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1725620448-52066500_a6db78e4-7c76-4eb0-951c-7e9aee5309df.jpg?v=1768912030"},"totalVariants":3,"variants":"ALL","handle":"tnbl-nail-file-professional-half-moon-zebra"},{"id":"10666633232730","title":"TNBL Nail File Professional - Square Zebra","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1725619330-69778000_b21fa3d2-8ed0-431c-8b96-87bdd9eab310.jpg?v=1768912024"},"totalVariants":2,"variants":"ALL","handle":"tnbl-nail-file-professional-square-zebra"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":5106,"name":"PROFESSIONAL NAIL FILE ZEBRA HALF MOON AND SQUARE","type":"auto","created_at":"2026-04-27 15:59:25","updated_at":"2026-04-27 15:59:25","discount_id":1827413164378,"starts_at":"2026-03-11T15:00:18Z","ends_at":null},{"extension_type":"volume","offer_title":"Buy more, save more","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":true,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1 Nail File"},{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":10,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":"Most Popular","label_type":"classic","quantity":"10","subtitle":"Save 10%","title":"10 Nail Files"},{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":"57","enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":"Bulk Savings","label_type":"classic","quantity":"50","subtitle":"Save 56%","title":"50 Nail files"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"countdown_heading_content":"HURRY UP
31906!","countdown_subheading_content":"Sale end in","layout":"vertical","border_radius":10,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FFEDF7","label_text_color":"#000000","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"STRAIGHT ZEBRA PRO NAIL FILE","trigger_data_products":[{"id":"10666633494874","title":"TNBL Nail File Professional - 80/80 Round Zebra","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1725621672-93759200_5f6c5554-7319-4efa-9eea-431ac20f13c5.jpg?v=1768912031"},"totalVariants":1,"variants":"ALL","handle":"tnbl-nail-file-professional-80-80-round-zebra"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":5103,"name":"STRAIGHT ZEBRA PRO NAIL FILE","type":"auto","created_at":"2026-04-27 15:57:00","updated_at":"2026-04-27 15:57:24","discount_id":1827412935002,"starts_at":"2026-03-11T15:00:18Z","ends_at":null},{"extension_type":"volume","offer_title":"Buy more, save more","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":true,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1 Nail File"},{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":10,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":"Most Popular","label_type":"classic","quantity":"10","subtitle":"Save 10%","title":"10 Nail Files"},{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":"42","enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":"Bulk Savings","label_type":"classic","quantity":"50","subtitle":"Save 42%","title":"50 Nail files"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"countdown_heading_content":"HURRY UP!","countdown_subheading_content":"Sale end in","layout":"vertical","border_radius":10,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FFEDF7","label_text_color":"#000000","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"NAIL FILE PREMIUM","trigger_data_products":[{"id":"10666633331034","title":"TNBL Nail File Premium - Square Zebra","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1725620891-77007100_895d5bf2-7c62-4abe-b5ee-b00708582710.jpg?v=1768912033"},"totalVariants":3,"variants":"ALL","handle":"tnbl-nail-file-premium-square-zebra"},{"id":"10666633429338","title":"TNBL Nail File Premium - Half Moon Zebra","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1725621380-31366000_699538d0-c356-4c77-a20a-6f86191b5b56.jpg?v=1768912036"},"totalVariants":5,"variants":"ALL","handle":"tnbl-nail-file-premium-half-moon-zebra"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":5100,"name":"NAIL FILE PREMIUM","type":"auto","created_at":"2026-04-27 15:48:52","updated_at":"2026-04-27 15:50:34","discount_id":1827411263834,"starts_at":"2026-03-11T15:00:18Z","ends_at":null},{"extension_type":"volume","offer_title":"Buy more, save more","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":true,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1 Nail File"},{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":10,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":"Most Popular","label_type":"classic","quantity":"10","subtitle":"Save 10%","title":"10 Nail Files"},{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":"64","enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":"Bulk Savings","label_type":"classic","quantity":"50","subtitle":"Save 45%","title":"50 Nail files"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"countdown_heading_content":"HURRY UP
31906!","countdown_subheading_content":"Sale end in","layout":"vertical","border_radius":10,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FFEDF7","label_text_color":"#000000","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"Nail Files (Black & White)","trigger_data_products":[{"id":"10666633724250","title":"TNBL Nail File Professional - Round White","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1725622048-77994700_2f6a7777-6e4f-4849-a439-ff1d8f6580cc.jpg?v=1768912039"},"totalVariants":2,"variants":"ALL","handle":"tnbl-nail-file-professional-round-white"},{"id":"10666633855322","title":"TNBL Nail File Professional - Round Black","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1728048535-74983700_a9f7ac1b-7f9a-4139-bd36-de59ae1b05a6.png?v=1768912044"},"totalVariants":2,"variants":"ALL","handle":"tnbl-nail-file-professional-round-black"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":5098,"name":"Straight Black & White Nail Files","type":"auto","created_at":"2026-04-27 15:38:49","updated_at":"2026-04-27 15:40:55","discount_id":1827409887578,"starts_at":"2026-03-11T15:00:18Z","ends_at":null},{"extension_type":"volume","offer_title":"BUY 1 REFILL GET 3 12ML FREE","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":true,"enable_show_quantity_counter":false,"gift_title":"+ {gift_qty} FREE GIFT","gifts":[{"id":"10666583884122","handle":"vina-gel-polish-essentials-12ml-diamond-no-wipe-top-coat","quantity":"3","status":"ACTIVE","title":"VINA Gel Polish Essentials 12ml - Diamond No Wipe Top Coat","totalVariants":1,"image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1720710737-07447500_55dadf51-4987-4cb7-b672-4fea3089d533.jpg?v=1768910297"},"variants":"ALL","variantData":[{"id":"53270728409434","available":true,"price":"6.95","title":"Default Title"}]}],"is_default_selected":true,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1X DIAMOND NO WIPE 250ML"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"layout":"vertical","border_radius":8,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FC81C7","label_text_color":"#FFFFFF","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"VINADNWTOP","trigger_data_products":[{"id":"10666588143962","title":"VINA Gel Polish Refill 250ml - Diamond No Wipe Top Coat","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1696427765-16983200_f91bd619-59ad-48fc-93ce-2f838284f6ca.jpg?v=1768910492"},"totalVariants":1,"variants":"ALL","handle":"vina-gel-polish-refill-250ml-diamond-no-wipe-top-coat"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"id":4151,"name":"VINA DIAMOND NO WIPE","type":"auto","created_at":"2026-03-31 22:55:36","updated_at":"2026-04-01 07:57:55","discount_id":1820267479386,"starts_at":"2026-03-31T22:53:59Z","ends_at":null},{"extension_type":"volume","offer_title":"BUY 10 GET 1 FREE","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":true,"enable_show_quantity_counter":false,"gift_title":"+ {gift_qty}
31906 FREE GIFT","gifts":[{"id":"10666590470490","handle":"vina-hand-body-lotion-mini-mix-72pcs-4-x-scents","quantity":1,"status":"ACTIVE","title":"VINA Hand & Body Lotion Mini Mix -72Pcs (4 x Scents)","totalVariants":1,"image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1730135762-90190800_9f4c183c-a2c5-4508-b509-7c87d1537001.png?v=1768910591"},"variants":"ALL","variantData":[{"id":"53270744826202","available":true,"price":"45.00","title":"Default Title"}]}],"is_default_selected":false,"label_text":null,"label_type":"classic","quantity":"10","subtitle":"click to add offer","title":"10X VINA MINI LOTION 15ML 72PCS"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"layout":"vertical","border_radius":8,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FC81C7","label_text_color":"#FFFFFF","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"VINAML72-B10G1F","trigger_data_products":[{"id":"10666356932954","title":"VINA Mini Nail & Cuticle Oil","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1707928742-01614900_09774438-450d-4c95-ad7a-679fcbe289a5.png?v=1768902776"},"totalVariants":6,"variants":["53270263529818"],"handle":"vina-mini-nail-cuticle-oil"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":4150,"name":"VINA MINI LOTION B10G1F","type":"auto","created_at":"2026-03-31 22:49:16","updated_at":"2026-03-31 22:57:55","discount_id":1820267184474,"starts_at":"2026-03-31T22:31:45Z","ends_at":null},{"extension_type":"volume","offer_title":"BUY 5 GET 1 FREE","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":true,"enable_show_quantity_counter":false,"gift_title":"+ {gift_qty} FREE GIFT","gifts":[{"id":"10666356932954","handle":"vina-mini-nail-cuticle-oil","quantity":1,"status":"ACTIVE","title":"VINA Mini Nail & Cuticle Oil","totalVariants":6,"image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1707928742-01614900_09774438-450d-4c95-ad7a-679fcbe289a5.png?v=1768902776"},"variants":["53270263529818"],"variantData":[{"id":"53270263529818","available":true,"price":"55.00","title":"BOX OF 48PCS"}]}],"is_default_selected":false,"label_text":null,"label_type":"classic","quantity":"5","subtitle":"click to add offer","title":"5X VINA MINI CUTICLE OIL 48PCS"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"layout":"vertical","border_radius":8,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FC81C7","label_text_color":"#FFFFFF","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"VINACO48-B5G1F","trigger_data_products":[{"id":"
3190610666356932954","title":"VINA Mini Nail & Cuticle Oil","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1707928742-01614900_09774438-450d-4c95-ad7a-679fcbe289a5.png?v=1768902776"},"totalVariants":6,"variants":["53270263529818"],"handle":"vina-mini-nail-cuticle-oil"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":4149,"name":"VINA CUTICLE OIL B5G1F","type":"auto","created_at":"2026-03-31 22:47:57","updated_at":"2026-03-31 22:47:57","discount_id":1820267118938,"starts_at":"2026-03-31T22:31:45Z","ends_at":null},{"extension_type":"volume","offer_title":"BUY 5 GET 1 FREE","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":true,"enable_show_quantity_counter":false,"gift_title":"+ {gift_qty} FREE GIFT","gifts":[{"id":"10666586636634","handle":"goat-milk-hand-mask-glove-5pcs-pack","quantity":1,"status":"ACTIVE","title":"Goat Milk Hand Mask Glove (5pcs) pack","totalVariants":1,"image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1686147495-48309200.jpg?v=1768910425"},"variants":"ALL","variantData":[{"id":"53270736568666","available":true,"price":"5.00","title":"Default Title"}]}],"is_default_selected":false,"label_text":null,"label_type":"classic","quantity":"5","subtitle":"click to add offer","title":"5X GOAT MILK HAND MASK"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"layout":"vertical","border_radius":8,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FC81C7","label_text_color":"#FFFFFF","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"GM-B5G1F","trigger_data_products":[{"id":"10666586636634","title":"Goat Milk Hand Mask Glove (5pcs) pack","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1686147495-48309200.jpg?v=1768910425"},"totalVariants":1,"variants":"ALL","handle":"goat-milk-hand-mask-glove-5pcs-pack"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"id":4146,"name":"GOAT MASK B5G1F","type":"auto","created_at":"2026-03-31 22:34:08","updated_at":"2026-03-31 22:35:54","discount_id":1820266299738,"starts_at":"2026-03-31T22:31:45Z","ends_at":null},{"extension_type":"volume","offer_title":"Buy one, get one free!","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":"+ {gift_qty} FREE GIFT","gifts":[{"id":"10666389930330","handle":"tnbl-cotton-pads-square-pk-of-100","quantity":1,"status":"ACTIVE","title":"Cotton Pads Square Pk of 100","totalVariants":1,"image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1657555634-37813000_e95896f9-2b10-4333-bafb-b6b24b63ff66.jpg?v=1768903614"},"variants":"ALL","variantData":[{"id":"53270310879578","available":true,"price":"1.20","title":"Default Title"}]}],"is_default_selected":true,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1 Square Cotton Pads Pack of 100","product_image":null}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"layout":"vertical","border_radius":8,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FFEDF7","label_text_color":"#FFFFFF","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"CP B1G1F","trigger_data_products":[{"id":"
3190610666389930330","title":"Cotton Pads Square Pk of 100","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1657555634-37813000_e95896f9-2b10-4333-bafb-b6b24b63ff66.jpg?v=1768903614"},"totalVariants":1,"variants":"ALL","handle":"tnbl-cotton-pads-square-pk-of-100"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":4145,"name":"Cotton Pads Square Pack of 100","type":"auto","created_at":"2026-03-31 22:12:29","updated_at":"2026-03-31 22:29:38","discount_id":1820264661338,"starts_at":"2026-03-31T03:03:14Z","ends_at":null},{"extension_type":"volume","offer_title":"Buy one, get one free!","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":"+ {gift_qty} FREE GIFT","gifts":[{"id":"10666395074906","handle":"tnbl-brush-on-nail-glue-8g","quantity":1,"status":"ACTIVE","title":"TNBL Brush on Nail Glue 8g","totalVariants":1,"image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1657617325-15155800_c3be8fc4-dcd9-41ae-9cd5-2c7288e24e50.jpg?v=1768903779"},"variants":"ALL","variantData":[{"id":"53270319104346","available":true,"price":"3.49","title":"Default Title"}]}],"is_default_selected":true,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1 Brush on Nail Glue","product_image":null}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"layout":"vertical","border_radius":8,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FFEDF7","label_text_color":"#FFFFFF","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"discount_title":"BONG","trigger_data_products":[{"id":"10666395074906","title":"TNBL Brush on Nail Glue 8g","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1657617325-15155800_c3be8fc4-dcd9-41ae-9cd5-2c7288e24e50.jpg?v=1768903779"},"totalVariants":1,"variants":"ALL","handle":"tnbl-brush-on-nail-glue-8g"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"id":4118,"name":"Brush on Nail Glue","type":"auto","created_at":"2026-03-31 03:10:48","updated_at":"2026-03-31 22:29:52","discount_id":1820035219802,"starts_at":"2026-03-31T03:03:14Z","ends_at":null},{"extension_type":"volume","offer_title":"Buy more, save more","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1 box of 50"},{"badge":null,"discount_type":"percentage","discount_value_fixed":"2.25","discount_value_percentage":10,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":true,"label_text":"Bulk Savings","label_type":"classic","quantity":"10","subtitle":null,"title":"10 box of 50"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"layout":"vertical","border_radius":8,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FFEDF7","label_text_color":"#000000","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"enable_subscriptions":false,"discount_title":"Face Mask","trigger_data_products":[{"id":"
3190610666639098202","title":"Disposable Carbon Face Mask 4-ply","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1729688947-50384500_d124edf0-40b8-412a-95fa-4e5de1f0043a.png?v=1768912172"},"totalVariants":1,"variants":"ALL","handle":"disposable-carbon-face-mask-4-ply"},{"id":"10803156549978","title":"Disposable Face Mask 3-ply","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1657555759-23705200.jpg?v=1774538100"},"totalVariants":1,"variants":"ALL","handle":"tnbl-disposable-face-mask-3-ply"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":4117,"name":"Face Mask","type":"auto","created_at":"2026-03-31 03:00:23","updated_at":"2026-03-31 03:00:23","discount_id":1820035055962,"starts_at":"2026-03-26T14:47:36Z","ends_at":null},{"extension_type":"volume","offer_title":"Buy more, save more","discount_method":"auto","trigger_type":"products","enable_trigger_data_collection_excludes":false,"tier_settings":[{"badge":null,"discount_type":"percentage","discount_value_fixed":0,"discount_value_percentage":0,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":false,"label_text":null,"label_type":"classic","quantity":1,"subtitle":null,"title":"1 pack"},{"badge":null,"discount_type":"percentage","discount_value_fixed":"2.25","discount_value_percentage":10,"enable_show_gift_price":false,"enable_show_quantity_counter":false,"gift_title":null,"gifts":[],"is_default_selected":true,"label_text":"Most popular","label_type":"classic","quantity":"10","subtitle":null,"title":"10 Packs"}],"purchase_subscription_title":"Purchase options","subscription_position":"above","subscription_title":"Subscribe & save","subscription_subtitle":null,"subscription_onetime_purchase_title":"One time purchase","subscription_onetime_purchase_subtitle":null,"subscription_by_default":true,"allow_changing_tier_item_variant":false,"hide_theme_variant_picker":false,"show_price_per_unit":false,"show_both_prices":false,"use_compare_at_price":false,"combination_product_discount":true,"combination_order_discount":true,"combination_shipping_discount":true,"layout":"vertical","border_radius":8,"primary_color":"#000000","secondary_color":"#262626","label_background_color":"#FFEDF7","label_text_color":"#000000","heading_font_weight":"bold","heading_font_size":18,"body_font_weight":"regular","body_font_size":14,"badge_font_weight":"regular","badge_font_size":12,"highlight_font_weight":"bold","highlight_font_size":12,"enable_subscriptions":false,"discount_title":"Nail Wipes","trigger_data_products":[{"id":"10666389832026","title":"Lint Free Nail Wipes 200pcs","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1708030614-06445900_b6523e1c-5d11-47f3-8f5b-f68e9908ff15.jpg?v=1768903614"},"totalVariants":1,"variants":"ALL","handle":"tnbl-lint-free-nail-wipes-200pcs"},{"id":"10666389733722","title":"Meltblown Nail Wipes 200pcs","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1713861555-27446200_4492b143-6e2b-4bbd-bb6c-ae7a67e84e8b.jpg?v=1768903610"},"totalVariants":1,"variants":"ALL","handle":"tnbl-meltblown-nail-wipes-200pcs"},{"id":"10666389897562","title":"Lint Free Wipe Large 40pcs","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1716391148-03909600_fc7d4622-b70c-45b9-97e5-6c4035dd37e4.png?v=1768903615"},"totalVariants":1,"variants":"ALL","handle":"tnbl-lint-free-wipe-large-40pcs"},{"id":"10666389995866","title":"Nail Wipes on a Roll","image":{"url":"https://cdn.shopify.com/s/files/1/0986/3371/1962/files/1708030636-82872200_95578a3d-bb97-490d-a91d-3ac5580c8ccd.jpg?v=1768903616"},"totalVariants":2,"variants":["53270310945114"],"handle":"tnbl-nail-wipes-on-a-roll"}],"trigger_data_collections":[],"trigger_data_tags":[],"trigger_customer_tags":[],"discount_code":null,"id":4116,"name":"Nail Wipes","type":"auto","created_at":"2026-03-31 02:54:33","updated_at":"2026-03-31 02:54:33","discount_id":1820034924890,"starts_at":"2026-03-26T14:47:36Z","ends_at":null}], 31907 subscriptions: 0, 31908 instanceConfig: {"hide_watermark":true,"trigger_3978":{"id":3978,"name":"Nail Files","products":[{"id":"
3190810666633298266","variants":"ALL"},{"id":"10666633232730","variants":"ALL"},{"id":"10666633331034","variants":"ALL"},{"id":"10666633429338","variants":"ALL"},{"id":"10666633494874","variants":"ALL"},{"id":"10666633593178","variants":"ALL"},{"id":"10666633724250","variants":"ALL"},{"id":"10666633757018","variants":"ALL"},{"id":"10666633855322","variants":"ALL"}]},"trigger_4115":{"id":4115,"name":"Gloves","products":[{"id":"10666394976602","variants":["53270318940506","53270318973274","53270319006042"]},{"id":"10666395009370","variants":["53270319071578"]},{"id":"10666560913754","variants":"ALL"},{"id":"10666587750746","variants":"ALL"},{"id":"10666394943834","variants":["53270318743898","53270318776666","53270318809434","53270318842202"]}]},"trigger_4116":{"id":4116,"name":"Nail Wipes","products":[{"id":"10666389832026","variants":"ALL"},{"id":"10666389733722","variants":"ALL"},{"id":"10666389897562","variants":"ALL"},{"id":"10666389995866","variants":["53270310945114"]}]},"trigger_4117":{"id":4117,"name":"Face Mask","products":[{"id":"10666639098202","variants":"ALL"},{"id":"10803156549978","variants":"ALL"}]},"trigger_4118":{"id":4118,"name":"Brush on Nail Glue","products":[{"id":"10666395074906","variants":"ALL"}]},"trigger_4119":{"id":4119,"name":"Buy 500ml Monomer, Get 3 Acrylic Powders FREE","products":[{"id":"10666616095066","variants":["53270865412442"]},{"id":"10666616127834","variants":["53270865674586"]},{"id":"10666616226138","variants":"ALL"},{"id":"10666616357210","variants":["53270866133338"]},{"id":"10666616291674","variants":"ALL"}]},"trigger_4145":{"id":4145,"name":"Cotton Pads Square Pack of 100","products":[{"id":"10666389930330","variants":"ALL"}]},"trigger_4146":{"id":4146,"name":"GOAT MASK B5G1F","products":[{"id":"10666586636634","variants":"ALL"}]},"trigger_4148":{"id":4148,"name":"DND BASE B10G1F","products":[{"id":"10666635034970","variants":"ALL"}]},"trigger_4149":{"id":4149,"name":"VINA CUTICLE OIL B5G1F","products":[{"id":"10666356932954","variants":["53270263529818"]}]},"trigger_4150":{"id":4150,"name":"VINA MINI LOTION B10G1F","products":[{"id":"10666356932954","variants":["53270263529818"]}]},"trigger_4151":{"id":4151,"name":"VINA DIAMOND NO WIPE","products":[{"id":"10666588143962","variants":"ALL"}]},"trigger_4741":{"id":4741,"name":"Buy 250ml Monomer, Get 3 Acrylic Powders FREE","products":[{"id":"10666616357210","variants":["53270866100570"]},{"id":"10666616095066","variants":["53270865379674"]},{"id":"10666616127834","variants":["53270865641818"]}]},"trigger_5098":{"id":5098,"name":"Straight Black & White Nail Files","products":[{"id":"10666633724250","variants":"ALL"},{"id":"10666633855322","variants":"ALL"}]},"trigger_5100":{"id":5100,"name":"NAIL FILE PREMIUM","products":[{"id":"10666633331034","variants":"ALL"},{"id":"10666633429338","variants":"ALL"}]},"trigger_5103":{"id":5103,"name":"STRAIGHT ZEBRA PRO NAIL FILE","products":[{"id":"10666633494874","variants":"ALL"}]},"trigger_5106":{"id":5106,"name":"PROFESSIONAL NAIL FILE ZEBRA HALF MOON AND SQUARE","products":[{"id":"10666633298266","variants":"ALL"},{"id":"10666633232730","variants":"ALL"}]}}, 31909 userStatus: "ACTIVATED", 31910 version: 1, 31911 storeFrontAccessToken: "65559eef1531f2ae80accc97fcf34b1b", 31912 generalTranslation: 0, 31913 volumeTranslation: 0, 31914 shop: 0 31915 } 31916 31917 qvlStore = { 31918 productData: {}, 31919 page: "index", 31920 currency: "GBP", 31921 moneyFormat: "£{{amount}}", 31922 market: "103848444250", 31923 country: "GB", 31924 shop: "tnbl-uk.myshopify.com", 31925 designMode: false, 31926 shopLocale: { 31927 iso_code: "en", 31928 primary: true, 31929 root_url: "/", 31930 } 31931 } 31932 31933 31934 31935 31936 31937 31938 31939 31940</script>
31940 31941
31942<script src="https://cdn.shopify.com/extensions/01a11564-863b-7784-95cd-1d76a720d5d7/qikify-bundles-quantity-break-97/assets/volume-v1.js" defer="defer"></script>
31942 31943 31944 31945 31946 31947 <style id="bkvolume-custom-style"></style> 31948 31949 31950 31951
31951<script id="bkvolume-custom-script"></script>
31951 31952 31953 31954 31955</div><div id="shopify-block-AbVBQN25GV0ZIRk1MY__14041968213898805026" class="shopify-block shopify-app-block"><!-- BEGIN app snippet: free-gift -->
31955<script> 31956 try { 31957 const initFreeGiftData = () => { 31958 const metafields = {"configSettings":{"id":"eOpdFoAfq8TnINLpas7I","shopId":"3rRPp0rjVHkdUgMpqHvO","closeBtnTime":600,"continueShoppingTime":300,"alwaysRemoveGift":false,"queryCheckoutBtn":"button[name='checkout']","createdAt":"2026-03-27T10:44:56.635Z","optimizeAddGift":true,"enableAddParentLineKey":true,"isBxgxV2":true},"congratsBarDesignSetting":{"name":"Congrats bar","icon":"free_gift_icon_8","type":"congrats-bar","newTextColor":"#ffffff","background":"#ac9669","newIconColor":"#000000","gradientBackground":false,"shopId":"3rRPp0rjVHkdUgMpqHvO","createdAt":"2026-03-27T10:44:53.196Z","theme":"scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7","id":"gMHcYtI0rxst7AZNrLsa"},"giftCampaigns":[{"id":"Se19xyekQg9IvUnj9WOz","status":"active","code":"FREEGIFTOVER50","discountCodeAppId":"gid:\/\/shopify\/DiscountCodeNode\/1820259549530","minimumTriggerValue":"50","enabledCongratsBar":true,"grabGiftBehavior":"manual","congratsBarText":"Yay! You unlocked a FREE gift in your cart!","popupTitle":"Woohoo, a special surprise awaits!","createdAt":"2026-03-31T21:28:03.768Z","popupDescription":"Your cart qualifies for special gifts. Add them now before checking out!","giftProducts":[{"handle":"avp-gel-colour-15ml-222","id":"10666673209690","hasOnlyDefaultVariant":true,"hasSelectedAllVariants":true,"image":"https:\/\/cdn.shopify.com\/s\/files\/1\/0986\/3371\/1962\/files\/avp_222.jpg?v=1779117512","options":[{"name":"Title","values":["Default Title"]}],"status":"ACTIVE","title":"AVP Gel Colour 15ml - 222","totalInventory":10,"variants":[{"id":"53270981869914","image":"https:\/\/cdn.shopify.com\/s\/files\/1\/0986\/3371\/1962\/files\/1758120413-24967500_59c1d4f1-3cde-4049-a181-a357242d814a.jpg?v=1768913220","inventoryPolicy":"DENY","isTracked":true,"selectedOptions":[{"name":"Title","value":"Default Title"}],"title":"Default Title","price":"2.50","compareAtPrice":"10.00","inventoryQuantity":10}],"quantity":1,"totalVariants":1}],"discountType":"free","discountValue":10,"discountCombinations":["order_discounts","shipping_discounts","product_discounts"],"enabledEndDate":false,"startDate":"2026-03-31T21:25:56.293Z","endDate":null,"type":"gift-with-cart-value","shopId":"3rRPp0rjVHkdUgMpqHvO","enabledGiftLimitation":false,"maximumGifts":1,"name":"Gift with cart value #1","excludedProducts":[],"enabledExcludedProducts":false,"enabledPromotionCard":false,"promotionCardMessage":"Spend {{trigger_value}} to receive gifts","promotionCardMessageGiftLimit":"Spend {{trigger_value}} and get a free gift","promotionCardMessageWhenReached":"Nice! Youâve unlocked free gifts","promotionCardTitle":"EXCLUSIVE GIFTS!","enabledSharableLink":false,"enabledCountdownTimer":true,"enabledUsageLimit":false,"valueUsageLimit":1,"purchasedCount":0,"enabledOncePerCustomer":false,"enabledAllCustomer":true,"enabledCustomerSegment":false,"customerSegments":[],"enabledMultiCurrency":false,"currencyData":[],"giftProductsOptionB":[],"enabledABTesting":false,"enabledABTestOptionA":false,"enabledABTestOptionB":false,"discountTypeOptionB":"free","discountValueOptionB":10,"endedABTestAt":null,"enabledCustomerLocation":false,"customerLocations":[],"enabledExcludeCustomerLocation":false,"excludeCustomerLocations":[],"enabledExcludeCustomerSegment":false,"excludeCustomerSegments":[],"floatingButtonTitle":"You got free gifts!","floatingTitle":"You've unlocked a special gifts!","floatingDescription":"Select your favorite items at exclusive prices","excludedCollections":[],"excludedType":"excluded-product","enabledMultiplyGift":false,"includeCollection":[],"includeType":"included-product","totalGifts":1,"campaignCartTitle":"Free Gifts","campaignCartSubtitle":"Youâve qualified for this gift","popupCartTitle":"You've unlocked a special gifts!","popupCartDescription":"Select your favorite items at exclusive prices","redirectPage":"home","triggerPage":[]}],"popUpDesignSetting":{"name":"Pop-up","type":"pop-up","addToCartText":"Add to cart","continueShoppingText":"Continue Shopping","countGiftText":"gift(s) selected","searchPlaceholder":"Search ...","variantPlaceholder":"Choose variant","borderRadius":8,"layout":"horizontal","displayLocation":"all","colorStyle":"basic","primaryColor":"#ac9669","secondaryColor":"#000000","headerBackgroun
31958d":"#FFFFFF","headerText":"#1C1C1C","primaryText":"#1C1C1C","secondaryText":"#33333380","background":"#FFFFFF","productBackground":"#33333308","productSelectedBackground":"#1C1C1C08","productSelectedBorder":"#1C1C1C","buttonBackground":"#ffedf7","buttonText":"#000000","badgeBackground":"#000000","tertiaryText":"#1C1C1C","badgeText":"#ffffff","shopId":"3rRPp0rjVHkdUgMpqHvO","createdAt":"2026-03-27T10:44:53.416Z","theme":"scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7","id":"xvM3p0Qv2pn9OE6Fiydf"},"storefrontAccessToken":"e3055ac9983753e5ee0af9f048b97dee"}; 31959 const optimizeAddGift = metafields.configSettings?.optimizeAddGift; 31960 const enableUsOcInstock = metafields.configSettings?.enableUsOcInstock; 31961 31962 const collections = []; 31963 const productsOfCollection = {}; 31964 31965 productsOfCollection[10666571170138] = {}; 31966 31967 productsOfCollection[10666571170138][53270702719322] = { 31968 price: 500, 31969 }; 31970 31971 31972 productsOfCollection[10666571268442] = {}; 31973 31974 productsOfCollection[10666571268442][53270702883162] = { 31975 price: 500, 31976 }; 31977 31978 31979 productsOfCollection[10666571235674] = {}; 31980 31981 productsOfCollection[10666571235674][53270702850394] = { 31982 price: 500, 31983 }; 31984 31985 31986 productsOfCollection[10666595680602] = {}; 31987 31988 productsOfCollection[10666595680602][53270759309658] = { 31989 price: 80, 31990 }; 31991 31992 31993 31994 31995 31996 const metafieldVariants = {} 31997 if(enableUsOcInstock){ 31998 31999 } 32000 32001 32002 32003 32004 const currentCart = {"note":null,"attributes":{},"original_total_price":0,"total_price":0,"total_discount":0,"total_weight":0.0,"item_count":0,"items":[],"requires_shipping":false,"currency":"GBP","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0}; 32005 const cartItems = []; 32006 const productsCart = []; 32007 32008 32009 const cartItemUpdated = cartItems.map((item) => { 32010 const productInItem = productsCart.find(p => p.id === item.variant_id); 32011 if (productInItem) { 32012 return { 32013 ...item, 32014 collections: productInItem.collections, 32015 ...(enableUsOcInstock && { metafieldUsOcInstock: productInItem.metafieldUsOcInstock }), 32016 }; 32017 } 32018 return item; 32019 }); 32020 32021 return { 32022 ...metafields, 32023 // Shops installed before the key was renamed only have the legacy 32024 // `storeFrontAccessToken` (capital F) metafield. This line runs AFTER the spread 32025 // above, so without the `default:` fallback it renders `null` and overwrites the 32026 // valid token that `...metafields` just brought in. getStorefrontToken() then reads 32027 // null, misses its cache, and calls /ensure-storefront-token on every page load. 32028 // Remove the fallback once the legacy shops are backfilled to the lowercase key. 32029 storefrontAccessToken: "e3055ac9983753e5ee0af9f048b97dee", 32030 32031 shopCurrency: "GBP", 32032 marketCountry: "GB",marketId: 103848444250, 32033 cart: { 32034 cartItems: cartItemUpdated 32035 }, 32036 product: { 32037 id: null, 32038 variants: null, 32039 selectedVariant: null, 32040 collectionTitles: [], 32041 collectionIds: [], 32042 title: null, 32043 type: null, 32044 handle: null, 32045 vendor: null, 32046 tags: null, 32047 price: null, 32048 hasOnlyDefaultVariant: null, 32049 available: null, 32050 image: null, 32051 options: null, 32052 ...(enableUsOcInstock ? {metafieldVariants} : {}), 32053 32054 }, 32055 customer: { 32056 id: null, 32057 email: null, 32058 first_name: null, 32059 last_name: null, 32060 isB2B: null, 32061 }, 32062 currentCart, 32063 currentRequestID: 0, 32064 productsOfCollection 32065 } 32066 }; 32067 if (!window.AVADA_FREE_GIFTS) window.AVADA_FREE_GIFTS = initFreeGiftData(); 32068 } catch (e) { 32069 console.error('Error assigning aov free gift variable', e); 32070 } 32071</script>
32071 32072<!-- END app snippet --> 32073 32074 32075</div><div id="shopify-block-AK0h3cTVsZkRtSWZvY__back-in-stock-restock-alerts-4bb73be2-b7c2-4870-949f-c528145452a3" class="shopify-block shopify-app-block"><link rel="preconnect" href="https://app.restockrocket.io" crossorigin><link rel="preconnect" href="https://tnbl-uk.myshopify.com" crossorigin><!-- Config and setup JS -->
32076<script id="RestockRocketConfig"> 32077 window._RestockRocketConfig = window._RestockRocketConfig || {} 32078 window._RestockRocket = window._RestockRocket || {} 32079 window._Stoq = window._RestockRocket 32080 window._StoqConfig = window._RestockRocketConfig 32081 try { window._RestockRocket.inlineRanAt = performance.now(); } catch (e) { } 32082 function normalizeLocale(locale) { 32083 if (!locale || locale.trim() === '') { 32084 return ''; 32085 } 32086 return locale.toString().toLowerCase().replace(/-/g, '_'); 32087 } 32088 32089 window._RestockRocketConfig.locale = 'en'; 32090 window._RestockRocketConfig.normalizedLocale = normalizeLocale('en'); 32091 window._RestockRocketConfig.shop = 'tnbl-uk.myshopify.com'; 32092 window._RestockRocketConfig.pageType = 'index'; 32093 window._RestockRocketConfig.liquidRenderedAt = 1791516082;window._RestockRocketConfig.marketId = 103848444250;window._RestockRocketConfig.countryName = 'United Kingdom'; 32094 window._RestockRocketConfig.countryIsoCode = 'GB';window._RestockRocketConfig.languageIsoCode = 'en';window._RestockRocketConfig.cartInventoryQuantity = {}; 32095 if (!window._RestockRocketConfig.cartToken) { 32096 try { 32097 const m = document.cookie.match(/(?:^|;\s*)cart=([^;]+)/); 32098 if (m && m[1]) window._RestockRocketConfig.cartToken = decodeURIComponent(m[1]); 32099 } catch (e) { } 32100 } 32101window._RestockRocketConfig.cachedSettings = {"id":51063,"shop_id":51039,"currency":"GBP","created_at":"2026-01-07T00:00:21.123Z","updated_at":"2026-10-01T04:51:42.865Z","enable_app":true,"enable_signup_widget":true,"storefront_button_text":"Notify me when available","storefront_button_text_color":"#FFFFFF","storefront_button_background_color":"#202223","storefront_form_header":"Notify me","storefront_form_description":"Get a notification as soon as this product is back in stock by signing up below!","storefront_form_button_text":"Notify me when available","storefront_form_button_text_color":"#FFFFFF","storefront_form_button_background_color":"#202223","storefront_form_terms":"Promise we won't spam. You'll only receive notifications for this product.","storefront_form_error":"Please enter a valid email address","storefront_form_success":"Thank you! We will notify you when the product is available.","enable_powered_by":true,"show_button_on_preorder":false,"sms_enabled":false,"email_enabled":true,"storefront_button_disable_tag":"rocket-hide","theme_config":{"preorderButtonDelayAmount":1000},"storefront_form_email_placeholder":"Email address","storefront_form_phone_placeholder":"SMS","storefront_form_phone_label":"Phone number","storefront_form_email_label":"Email","storefront_form_phone_error":"Please enter a valid phone number","storefront_form_customer_name_placeholder":"Name","storefront_form_customer_name_error":"Please enter your name","storefront_form_did_you_mean_error":"Did you mean %{suggested_email}? Or use %{current_email}","form_customer_name_enabled":false,"form_customer_name_required":false,"css_config":"/* Theme defaults from Horizon (any version) */\n \n\n.restock-rocket-button {\n height: 55px !important;\n border-radius: 15px !important;\n}\n\n","js_config":"/* Theme defaults from Horizon (any version) */\nlet selector = 'dialog[open]'; window.addEventListener('stoq:preorder-modal:opened', function(event) { console.log('Preorder modal opened!', event.detail); const dialog = document.querySelector(selector); if (dialog) { dialog.close() } }); window.addEventListener('stoq:restock-modal:opened', function(event) { console.log('Restock modal opened!', event.detail); const dialog = document.querySelector(selector); if (dialog) { dialog.close() } });","collect_promotion_consent":false,"storefront_form_promotion_consent_label":"Notify me about other news, sales, discounts & offers too!","show_button_on_collection":false,"sms_default_country":"us","sms_allowed_countries":[],"sms_restrict_country":false,"sms_default_channel":true,"optin_required":false,"optin_custom_domain_enabled":false,"optin_success_text":"Registration confirmed! You'll receive an alert when the product is restocked.","storefront_button_border_radius":0,"storefront_button_disable_tag_hides_button":true,"storefront_button_disable_tag_enabled":false,"quantity_required":false,"storefront_form_quantity_label":"Quantity","enable_alerts":true,"sms_allowed":false,"email_allowed":true,"collect_promotion_consent_default":true,"insert_button_after_selector":".product-form-buttons","insert_button_after_selector_type":"afterend","storefront_button_position_type":"specific","storefront_form_duplicate_error":"You've already subscribed for alerts to this product.","storefront_mixed_cart_error":"Preorders must be purchased
32101separately from regular items. Please complete your current order first, or clear your cart to continue.","storefront_error_heading":"Error","default_locale":"en","collection_page_button_text_color":"#FFFFFF","collection_page_button_background_color":"#202223","show_button_if_any_out_of_stock":false,"show_button_if_any_variant_out_of_stock_collection":false,"show_button_on_index":false,"insert_button_after_selector_collection":".product-card__content","insert_button_after_selector_index":".product-card__content","push_enabled":false,"push_allowed":false,"storefront_form_push_label":"Push","storefront_form_push_description":"Click 'Allow' to be notified via push notification","storefront_form_push_error":"Permission rejected! Please review notification settings and try again.","storefront_font_family":"OpenSans","insert_button_after_selector_collection_type":"afterend","show_channel_selector":false,"storefront_form_empty_error":"Please fill in one or more of the options above","storefront_form_push_input":"Send push notification","insert_button_after_selector_page":".product-card__content","show_button_on_page":false,"insert_button_after_selector_search":".product-card__content","show_button_on_search":false,"app_proxy_path_prefix":"/apps/restockrocket-production","collection_link_selector":"","index_link_selector":"","page_link_selector":"","search_link_selector":"","collection_check_link_visibility":true,"collection_buttons_container":"","index_buttons_container":"","page_buttons_container":"","search_buttons_container":"","extension_enable_url_variant_detection":true,"extension_enable_value_variant_detection":true,"extension_value_variant_selector":"[name='id']","resubscribe_text":"This product is out of stock. Get notified when itâs restocked again by entering your details below!","preorder_enabled":false,"preorder_buy_button_selector":"","preorder_add_to_cart_button_selector":"add-to-cart-component button","preorder_badge_selector":"product-price div","preorder_button_out_of_stock_text":"Out of stock","preorder_button_add_to_cart_text":"Add to cart","preorder_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_enabled":false,"preorder_collection_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_index_enabled":false,"preorder_index_form_selector":"form[action*=\"/cart/add\"]","preorder_index_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_page_enabled":false,"preorder_page_form_selector":"form[action*=\"/cart/add\"]","preorder_page_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_search_enabled":false,"preorder_search_form_selector":"form[action*=\"/cart/add\"]","preorder_search_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_collection_badge_selector":"","preorder_index_badge_selector":"","preorder_page_badge_selector":"","preorder_search_badge_selector":"","preorder_badge_selector_type":"beforeend","preorder_collection_badge_selector_type":"afterend","preorder_button_child_selector":".add-to-cart-text__content","preorder_button_disclaimer_insert_selector":"","preorder_button_disclaimer_insert_selector_type":"afterend","preorder_payment_insert_selector":".product-form-buttons","preorder_payment_insert_selector_type":"beforebegin","preorder_price_container_selector":".price","preorder_price_container_selector_insert_type":"afterend","preorder_terms_insert_selector":"","preorder_terms_insert_selector_type":"afterend","preorder_original_price_selector":"product-price .price","preorder_price_format":"{{amount}} {{currency}}","show_badge_if_any_variant_is_preorder":false,"enable_console_debug":false,"inline_form_enabled":false,"inline_form_selector":".shopify-product-form","inline_form_selector_type":"afterend","storefront_form_prefill_customer":true,"storefront_form_show_image":false,"storefront_form_text_color":"#202223","storefront_form_background_color":"#FFFFFF","storefront_form_border_radius":10,"market_setup_type":"single_market","shopify_app_id":5940125,"preorder_progress_bar_insert_selector":"","preorder_progress_bar_insert_selector_type":"beforebegin","countdown_timer_insert_selector":"","countdown_timer_insert_selector_type":"afterend","configure_notify_me_enabled":false,"restock_note_insert_selector":null,"restock_note_insert_selector_type":"afterend","restock_note_background_color":"#f3f4f6","restock_note_text_color":"#202223","restock_note_border_radius":4,"preorder_modal_continue_button_text":"Continue","preorder_modal_cancel_button_text":"Cancel","meta_pixel_enabled":false,"meta_pixel_id":null,"cache":true,"cached_at":"2026-10-01T04:51:42.894Z","multi_language_enabled":false,"translation_locale":"en","disable_refresh_on_stale_liquid":false,"api_host":"https://ext.stoqapp.com"};window._RestockRocketConfig.storefrontAccessToken = "41e1fe566da10458dd3f2635ef4b3fd5"; 32102 window._RestockRocketConfig.metafieldNamespace = 'restockrocket_production'; 32103 window._RestockRocketConfig.storefrontApiVersion = '2026-07';window._RestockRocketConfig.cachedPreorderVariantIds = { preorder_variant_ids: [] };window._RestockRocketConfig.cachedInStockVariantIds = { in_stock_variant_ids: [] };window._RestockRocketConfig.cachedOutOfStockVariantIds = { out_of_stock_variant_ids: [] };window._RestockRocketConfig.cachedVariantPreorderLimits = { variant_preorder_limits: {} };window._RestockRocketConfig.cachedVariantShippingTexts = { variant_shipping_texts: {} }; 32104window._RestockRocketConfig.sellingPlans = [];(function() { 32105 const cachedData = {"plans":[{"shopify_selling_plan_group_id":79468331354,"shopify_selling_plan_id":692204306778,"enabled":false,"variant_ids":[54395368735066,54395368931674,54395368505690,54395368243546,54395392196954,54395357987162],"product_variants_source":"custom","name":"Preorder","preorder_button_text":"Preorder","preorder_button_description":"Pre-order before it's gone.","preorder_button_description_enabled":false,"preorder_button_description_background_color":"#1F2937","preorder_button_description_text_color":"#FFFFFF","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_prefix":"Shipping: ","delivery_exact_time":null,"delivery_after_n_intervals":null,"delivery_at":"2026-07-06T16:54:33.557Z","delivery_type":"asap","quantity_limit_text":"{{ quantity }} units available for preorder","preorder_button_description_show_shipping":true,"preorder_button_description_icons_enabled":true,"preorder_shipping_text":"Shipping: Ships by 17 July 2026","shipping_applies_to_all_products":true,"shipping_text":"Shipping: Ships by 17 July 2026","payment_type":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_line_item_property_enabled":false,"shipping_line_item_property_enabled":true,"custom_line_item_property_text":null,"preorder_button_colors_enabled":false,"markets_enabled":false,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":true,"payment_options":[{"billing_type":"no_remaining_balance","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","billing_at":"2026-07-06T16:54:33.557Z","billing_after_n_intervals":null,"billing_after_interval_type":"day","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"billing_title":"Full payment","billing_description":null,"discount_text":"Save {{ discount }}","shopify_selling_plan_id":692204306778,"is_default":true,"type":"full","translations":{}}],"require_preorder_acknowledgement":false,"preorder_acknowledgement_text":"I acknowledge and agree to the preorder terms and conditions for this product.","disable_button_until_acknowledged":false,"acknowledgement_line_item_property_enabled":false,"acknowledgement_line_item_property_text":"Preorder Terms Accepted","preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":true,"countdown_timer_style":"text","countdown_timer_text_color":"#000000","countdown_timer_background_color":"#f5f5f5","countdown_timer_border_radius":8,"countdown_timer_format":"DHMS","countdown_timer_use_schedule_dates":false,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":"2026-07-13T11:00:00.000Z","countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"countdown_timer_days_label":"Days","countdown_timer_hours_label":"Hours","countdown_timer_minutes_label":"Mins","countdown_timer_seconds_label":"Secs","schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2026-07-24T20:21:4
321056.942Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"batches_enabled":false,"preorder_batches":[]},{"shopify_selling_plan_group_id":79469314394,"shopify_selling_plan_id":692205289818,"enabled":false,"variant_ids":[54397449830746],"product_variants_source":"custom","name":"Preorder","preorder_button_text":"Preorder","preorder_button_description":"Pre-order before it's gone.","preorder_button_description_enabled":false,"preorder_button_description_background_color":"#1F2937","preorder_button_description_text_color":"#FFFFFF","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_prefix":"Shipping: ","delivery_exact_time":null,"delivery_after_n_intervals":null,"delivery_at":"2026-07-08T11:43:03.412Z","delivery_type":"asap","quantity_limit_text":"{{ quantity }} units available for preorder","preorder_button_description_show_shipping":true,"preorder_button_description_icons_enabled":true,"preorder_shipping_text":"Shipping: As soon as possible","shipping_applies_to_all_products":true,"shipping_text":"Shipping: As soon as possible","payment_type":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_line_item_property_enabled":false,"shipping_line_item_property_enabled":true,"custom_line_item_property_text":null,"preorder_button_colors_enabled":false,"markets_enabled":false,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":true,"payment_options":[{"billing_type":"no_remaining_balance","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","billing_at":"2026-07-08T11:43:03.412Z","billing_after_n_intervals":null,"billing_after_interval_type":"day","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"billing_title":"Full payment","billing_description":null,"discount_text":"Save {{ discount }}","shopify_selling_plan_id":692205289818,"is_default":true,"type":"full","translations":{}}],"require_preorder_acknowledgement":false,"preorder_acknowledgement_text":"I acknowledge and agree to the preorder terms and conditions for this product.","disable_button_until_acknowledged":false,"acknowledgement_line_item_property_enabled":false,"acknowledgement_line_item_property_text":"Preorder Terms Accepted","preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":true,"countdown_timer_style":"text","countdown_timer_text_color":"#000000","countdown_timer_background_color":"#f5f5f5","countdown_timer_border_radius":8,"countdown_timer_format":"DHMS","countdown_timer_use_schedule_dates":true,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"countdown_timer_days_label":"Days","countdown_timer_hours_label":"Hours","countdown_timer_minutes_label":"Mins","countdown_timer_seconds_label":"Secs","schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2026-07-28T15:17:40.080Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased
32105separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"batches_enabled":false,"preorder_batches":[]}],"disabled_plan_ids":[692196213082],"has_in_stock_offer":false,"has_preorder_offer":false,"read_flags":{"enable_storefront_product_reads":true,"enable_storefront_integrations_read":true,"enable_storefront_selling_plans_read":true},"cached_at":"2026-10-04T10:29:37Z"}; 32106 32107 if (cachedData && typeof cachedData === 'object' && cachedData.cached_at) { 32108 window._RestockRocketConfig.readFlags = cachedData.read_flags || {}; 32109 const oldPlans = window._RestockRocketConfig.sellingPlans; 32110 const maxUpdatedAt = Array.isArray(oldPlans) && oldPlans.length > 0 32111 ? oldPlans.reduce(function(max, plan) { 32112 if (plan.updated_at) { 32113 const planDate = new Date(plan.updated_at); 32114 const maxDate = max ? new Date(max) : null; 32115 return (!maxDate || (planDate && !isNaN(planDate) && planDate > maxDate)) ? plan.updated_at : max; 32116 } 32117 return max; 32118 }, '') 32119 : null; 32120 const cachedDate = new Date(cachedData.cached_at); 32121 const maxDate = maxUpdatedAt ? new Date(maxUpdatedAt) : null; 32122 const useCached = !maxUpdatedAt || (cachedDate && !isNaN(cachedDate) && (!maxDate || cachedDate > maxDate)); 32123 32124 if (useCached) { 32125 if (Array.isArray(cachedData.plans)) { 32126 window._RestockRocketConfig.sellingPlans = cachedData.plans; 32127 window._RestockRocketConfig.disabledSellingPlanIds = cachedData.disabled_plan_ids || []; 32128 console.debug('[RR] Using selling plans from cachedSellingPlans (cached_at: ' + cachedData.cached_at + ')'); 32129 } 32130 } else { 32131 window._RestockRocketConfig.disabledSellingPlanIds = []; 32132 console.debug('[RR] Using selling plans from old format (max updated_at: ' + maxUpdatedAt + ')'); 32133 } 32134 } 32135 })();window._RestockRocketConfig.enabledNotifyMeVariantIds = [];window._RestockRocketConfig.disabledNotifyMeVariantIds = [];window._RestockRocketConfig.backInStockTemplates = [];window._RestockRocketConfig.restockNotes = {};window._RestockRocketConfig.integrations = []; 32136 try { 32137 var _sqCfg = window._RestockRocketConfig; 32138 var _sqPlanEnabled = Array.isArray(_sqCfg.sellingPlans) && 32139 _sqCfg.sellingPlans.some(function (p) { return p && p.enabled; }); 32140 var _sqPreCount = ((_sqCfg.cachedPreorderVariantIds && 32141 _sqCfg.cachedPreorderVariantIds.preorder_variant_ids) || []).length; 32142 _sqCfg.preordersConfigured = !!(_sqPlanEnabled && _sqPreCount); 32143 } catch (e) { } 32144 try { 32145 var _sqc = window._RestockRocketConfig; 32146 var _sqOn = !(_sqc.cachedSettings && _sqc.cachedSettings.block_accelerated_checkout === false); 32147 var _sqPre = (_sqc.cachedPreorderVariantIds && 32148 _sqc.cachedPreorderVariantIds.preorder_variant_ids) || []; 32149 var _sqArm = false; 32150 if (_sqOn && _sqc.preordersConfigured) { 32151 if (_sqc.pageType === 'product' && _sqc.product && _sqc.product.variants) { 32152 _sqArm = _sqc.product.variants.some(function (v) { return _sqPre.indexOf(Number(v.id)) !== -1; }); 32153 } else { 32154 _sqArm = (_sqc.integrations || []).some(function (i) { 32155 return i && i.type === 'featured_product' && i.enabled && 32156 Array.isArray(i.page_types) && i.page_types.indexOf(_sqc.pageType) !== -1; 32157 }); 32158 } 32159 } 32160 if (_sqArm && document.documentElement) { 32161 _sqc.acceleratedGateArmed = true; 32162 document.documentElement.classList.add('stoq-buy-now-pending'); 32163 setTimeout(function () { 32164 document.documentElement.classList.remove('stoq-buy-now-pending'); 32165 }, 6000); 32166 } 32167 } catch (e) { } 32168 32169 window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/01a11b87-29d7-70f4-9f88-0cbf7270f710/restockrocket-1-602/assets/restockrocket-product.js' 32170 window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/01a11b87-29d7-70f4-9f88-0cbf7270f710/restockrocket-1-602/assets/restockrocket-collection.js' 32171 window._RestockRocketConfig.scriptUrlProductBis = 'https://cdn.shopify.com/extensions/01a11b87-29d7-70f4-9f88-0cbf7270f710/restockrocket-1-602/assets/restockrocket-product-bis.js' 32172 window._RestockRocketConfig.scriptUrlCollectionBis = 'https://cdn.shopify.com/extensions/01a11b87-29d7-70f4-9f88-0cbf7270f710/restockrocket-1-602/assets/restockrocket-collection-bis.js' 32173 window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1) 32174 window._RestockRocketConfig.host = (window._RestockRocketConfig.cachedSettings && window._RestockRocketConfig.cachedSettings.api_host) || 'https://app.restockrocket.io' 32175 try { 32176 const _stoqVersionMatch = window._RestockRocketConfig.scriptHost.match(/(\d+)\/?(?:assets\/?)?$/); 32177 window._RestockRocketConfig.appVersion = (_stoqVersionMatch && _stoqVersionMatch[1]) || ''; 32178 } catch (e) { 32179 window._RestockRocketConfig.appVersion = ''; 32180 } 32181 const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; 32182 const LIQUID_CACHE_MAX_AGE = 15 * 60; 32183 const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt; 32184 if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) { 32185 console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh'); 32186 window._RestockRocketConfig.isLiquidCacheFresh = true; 32187 window._RestockRocketConfig.liquidCacheAge = null; 32188 } else { 32189 const now = Math.floor(Date.now() / 1000);
32190 const liquidCacheAge = now - liquidRenderedAt; 32191 window._RestockRocketConfig.liquidCacheAge = Math.max(0, liquidCacheAge); 32192 if (liquidCacheAge < 0) { 32193 console.debug(`STOQ - Client clock appears ahead of server by ${Math.abs(Math.round(liquidCacheAge / 60))} minutes, assuming cache fresh`); 32194 window._RestockRocketConfig.isLiquidCacheFresh = true; 32195 } else if (liquidCacheAge <= LIQUID_CACHE_MAX_AGE) { 32196 console.debug(`STOQ - Liquid cache is fresh (${Math.round(liquidCacheAge / 60)} minutes old)`); 32197 window._RestockRocketConfig.isLiquidCacheFresh = true; 32198 } else { 32199 console.debug(`STOQ - Liquid cache is stale (${Math.round(liquidCacheAge / 60)} minutes old, max ${Math.round(LIQUID_CACHE_MAX_AGE / 60)} minutes)`); 32200 window._RestockRocketConfig.isLiquidCacheFresh = false; 32201 } 32202 } 32203 32204 function checkSettingsExpiry(settings) { 32205 try { 32206 if (!settings || !settings.updated_at) { 32207 console.debug('STOQ - Invalid settings data structure'); 32208 return null; 32209 } 32210 32211 if (!settings.cache) { 32212 console.debug('STOQ - settings caching disabled'); 32213 return null; 32214 } 32215 if (settings.multi_language_enabled) { 32216 if (!settings.translations) { 32217 console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh'); 32218 return null; 32219 } 32220 if (window._RestockRocketConfig.normalizedLocale && 32221 !Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) { 32222 console.debug('STOQ - locale not explicitly translated, will use default language from cache'); 32223 } 32224 } 32225 32226 const updatedAt = new Date(settings.updated_at); 32227 if (isNaN(updatedAt.getTime())) { 32228 console.debug('STOQ - Invalid updated_at date format in settings'); 32229 return null; 32230 } 32231 32232 const age = Date.now() - updatedAt.getTime(); 32233 if (age < SETTINGS_CACHE_DURATION) { 32234 console.debug('STOQ - settings changed recently, skipping cache'); 32235 return null; 32236 } 32237 32238 return settings; 32239 } catch (error) { 32240 console.debug('STOQ - Error checking settings cache:', error); 32241 return null; 32242 } 32243 } 32244 32245 function createRestockRocketContainer() { 32246 const restockRocketContainer = document.createElement('div'); 32247 restockRocketContainer.id = 'restock-rocket'; 32248 document.body.appendChild(restockRocketContainer); 32249 } 32250 32251 function createRestockRocketScript(scriptUrl) { 32252 const restockRocketScriptElement = document.createElement('script'); 32253 restockRocketScriptElement.setAttribute('defer', 'defer'); 32254 restockRocketScriptElement.src = scriptUrl; 32255 document.body.appendChild(restockRocketScriptElement); 32256 } 32257 32258 createRestockRocketContainer() 32259 32260 console.debug('STOQ - extension activated') 32261 try { 32262 const _stoqInitConfig = window._RestockRocketConfig; 32263 const _stoqDetectedVariantIds = (_stoqInitConfig.product && Array.isArray(_stoqInitConfig.product.variants)
32263) 32264 ? _stoqInitConfig.product.variants.map(function(v) { return v.id }) 32265 : []; 32266 const _stoqSelectedVariantId = _stoqInitConfig.selected_variant_id; 32267 var _stoqPageSeq = 0; 32268 try { 32269 _stoqPageSeq = (parseInt(window.sessionStorage.getItem('_stoq_pls') || '0', 10) || 0) + 1; 32270 window.sessionStorage.setItem('_stoq_pls', String(_stoqPageSeq)); 32271 } catch (e) { } 32272 Shopify?.analytics?.publish?.('stoq_initialized', { 32273 cart_token: _stoqInitConfig.cartToken || '', 32274 page_url: window.location.href, 32275 page_type: _stoqInitConfig.pageType || '', 32276 shop_domain: _stoqInitConfig.shop || '', 32277 market_id: _stoqInitConfig.marketId || '', 32278 country_code: _stoqInitConfig.countryIsoCode || '', 32279 detected_variant_ids: _stoqDetectedVariantIds, 32280 selected_variant_id: _stoqSelectedVariantId || '', 32281 page_load_seq: _stoqPageSeq, 32282 liquid_rendered_at: _stoqInitConfig.liquidRenderedAt || 0, 32283 app_version: _stoqInitConfig.appVersion || '', 32284 liquid_cache_age: _stoqInitConfig.liquidCacheAge, 32285 inventory_policy: (_stoqInitConfig.variantsInventoryPolicy || {})[_stoqSelectedVariantId] || '', 32286 inventory_quantity: (_stoqInitConfig.variantsInventoryQuantity || {})[_stoqSelectedVariantId], 32287 }); 32288 } catch (e) { 32289 console.debug('STOQ - stoq_initialized publish failed:', e); 32290 } 32291 try { 32292 var _sqTrack = window._RestockRocketConfig; 32293 if (_sqTrack.preordersConfigured) { 32294 document.addEventListener('click', function (e) { 32295 try { 32296 var t = e.target; 32297 if (!t || !t.closest) return; 32298 var host = t.closest('.shopify-payment-button, shopify-payment-terms'); 32299 if (!host) return; 32300 var channel = host.matches && host.matches('shopify-payment-terms') 32301 ? 'shop_pay_installments' : 'buy_now'; 32302 var form = host.closest('form'); 32303 var vidEl = form && form.querySelector('[name="id"]'); 32304 var variantId = (vidEl && vidEl.value) || _sqTrack.selected_variant_id || ''; 32305 var _sqVidNum = Number(variantId); 32306 var _sqPlan = null; 32307 var _sqPlans = Array.isArray(_sqTrack.sellingPlans) ? _sqTrack.sellingPlans : []; 32308 var _sqMktId = Number(_sqTrack.marketId); 32309 var _sqForVariant = function (pl) { 32310 return pl && pl.enabled && Array.isArray(pl.variant_ids) && 32311 pl.variant_ids.indexOf(_sqVidNum) !== -1; 32312 }; 32313 _sqPlans.forEach(function (pl) { 32314 if (!_sqPlan && _sqForVariant(pl) && pl.markets_enabled && 32315 Array.isArray(pl.shopify_market_ids) && 32316 pl.shopify_market_ids.indexOf(_sqMktId) !== -1) { _sqPlan = pl; } 32317 }); 32318 if (!_sqPlan) { 32319 _sqPlans.forEach(function (pl) { 32320 if (!_sqPlan && _sqForVariant(pl) && !pl.markets_enabled) { _sqPlan = pl; } 32321 }); 32322 } 32323 Shopify?.analytics?.publish?.('stoq_accelerated_checkout_clicked', { 32324 variant_id: variantId, 32325 product_id: (_sqTrack.product && _sqTrack.product.id) || '', 32326 channel: channel, 32327 market_id: _sqTrack.marketId || '', 32328 country_code: _sqTrack.countryIsoCode || '', 32329 page_type: _sqTrack.pageType || '', 32330 cart_token: _sqTrack.cartToken || '', 32331 page_url: (window.location && window.location.href) || '', 32332 properties: { 32333 is_preorder_variant: (function () { 32334 var vid = Number(variantId); 32335 var has = function (a) { return Array.isArray(a) && a.indexOf(vid) !== -1; }; 32336 return has(_sqTrack.preorderVariantIds) || 32337 has(_sqTrack.cachedPreorderVariantIds && 32338 _sqTrack.cachedPreorderVariantIds.preorder_variant_ids); 32339 })(), 32340 in_enabled_plan: !!_sqPlan, 32341 is_instock_variant: (function () { 32342 var has = function (a) { return Array.isArray(a) && a.indexOf(_sqVidNum) !== -1; }; 32343 return has(_sqTrack.inStockVariantIds) || 32344 has(_sqTrack.cachedInStockVariantIds && 32345 _sqTrack.cachedInStockVariantIds.in_stock_variant_ids); 32346 })(), 32347 enrolled_plan_id: (_sqPlan && (_sqPlan.shopify_selling_plan_id || _sqPlan.shopify_selling_plan_group_id)) || '', 32348 enrolled_plan_provider: (_sqPlan && _sqPlan.inventory_provider) || '', 32349 block_enabled: !(_sqTrack.cachedSettings && _sqTrack.cachedSettings.block_accelerated_checkout === false), 32350 gate_armed: !!_sqTrack.acceleratedGateArmed, 32351 gate_active_at_click: !!(document.documentElement && 32352 document.documentElement.classList.contains('stoq-buy-now-pending')), 32353 blocked: (function () { 32354 try { 32355 var rr = window._RestockRocket; 32356 return !!(rr && typeof rr.willBlockAcceleratedCl
32356ick === 'function' && 32357 rr.willBlockAcceleratedClick(e)); 32358 } catch (err) { return false; } 32359 })(), 32360 }, 32361 }); 32362 } catch (err) { } 32363 }, true); 32364 } 32365 } catch (e) { } 32366 function applyTranslations(settings) { 32367 try { 32368 if (!settings || !settings.multi_language_enabled) { 32369 return settings; 32370 } 32371 32372 if (!settings.translations) { 32373 console.debug('STOQ - No translations found, skipping translation'); 32374 return settings; 32375 } 32376 32377 const normalizedLocale = window._RestockRocketConfig.normalizedLocale; 32378 const translations = settings.translations; 32379 32380 if (!normalizedLocale) { 32381 console.debug('STOQ - No matching locale for translations. Available:', Object.keys(translations || {})); 32382 delete settings.translations; 32383 return settings; 32384 } 32385 32386 console.debug(`STOQ - Applying translations for normalized locale: ${normalizedLocale} (original: ${window._RestockRocketConfig.locale})`); 32387 32388 const translatedFields = translations[normalizedLocale]; 32389 if (translatedFields && typeof translatedFields === 'object') { 32390 Object.keys(translatedFields).forEach(function(key) { 32391 const value = translatedFields[key]; 32392 if (value !== null && value !== undefined && value !== '') { 32393 settings[key] = value; 32394 } 32395 }); 32396 } else { 32397 console.debug('STOQ - No translated fields found for locale:', normalizedLocale); 32398 } 32399 32400 delete settings.translations; 32401 return settings; 32402 } catch (e) { 32403 console.debug('STOQ - error applying translations:', e); 32404 return settings; 32405 } 32406 } 32407 function setupCartSellingPlanUpdater(settings) { 32408 window.addEventListener('stoq:inventory-data-loaded', function(event) { 32409 console.debug('STOQ - Inventory data loaded, updating cart selling plans'); 32410 if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) { 32411 window._RestockRocket.updateCartSellingPlans() 32412 .then(hasUpdates => { 32413 if (hasUpdates) { 32414 console.debug('STOQ - cart selling plans updated successfully'); 32415 } else { 32416 console.debug('STOQ - no cart selling plan updates needed'); 32417 } 32418 }) 32419 .catch(error => { 32420 console.error('STOQ - error updating cart selling plans:', error); 32421 }); 32422 } 32423 }); 32424 } 32425 function storefrontGraphql(query, variables) { 32426 const cfg = window._RestockRocketConfig; 32427 if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) { 32428 return Promise.reject(new Error('Storefront API unavailable')); 32429 } 32430 return fetch( 32431 `https://${cfg.shop}/api/${cfg.storefrontApiVersion}/graphql.json`, 32432 { 32433 method: 'POST', 32434 headers: { 32435 'Content-Type': 'application/json', 32436 'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken, 32437 }, 32438 body: JSON.stringify({ query: query, variables: variables }), 32439 } 32440 ) 32441 .then(function(response) { 32442 if (!response.ok) { throw new Error('Storefront API HTTP ' + response.status); } 32443 return response.json(); 32444 }) 32445 .then(function(body) { 32446 if (body && body.errors && body.errors.length) { 32447 throw new Error('Storefront API errors: ' + body.errors.map(function(e) { return e && e.message; }).join(', ')); 32448 } 32449 return body && body.data; 32450 }); 32451 } 32452 function fetchStorefrontShopMetafield(key) { 32453 const cfg = window._RestockRocketConfig; 32454 const query = 'query StoqShopMetafield($namespace: String!, $key: String!) { shop { metafield(namespace: $namespace, key: $key) { value } } }'; 32455 return storefrontGraphql(query, { namespace: cfg.metafieldNamespace, key: key }) 32456 .then(function(data) { 32457 const value = data && data.shop && data.shop.metafield && data.shop.metafield.value; 32458 if (!value) { throw new Error('Storefront API returned no ' + key + ' metafield value'); } 32459 return JSON.parse(value); 32460 }); 32461 } 32462 (function loadStorefrontSettings() { 32463 const cfg = window._RestockRocketConfig; 32464 if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return; 32465 function run() { 32466 // The live-settings read is one more shop-level metafield fetch, so it 32467 // shares fetchStorefrontShopMetafield with the integrations/selling_plans 32468 // reads rather than re-issuing the same query + parse. 32469 fetchStorefrontShopMetafield('settings') 32470 .then(function(settings) { 32471 cfg.storefrontSettings = settings; 32472 console.debug('STOQ - stored live settings from Storefront API on config.storefrontSettings'); 32473 }) 32474 .catch(function(e) { 32475 console.debug('STOQ - Storefront settings fetch failed (non-fatal):', e && e.message); 32476 }); 32477 } 32478 32479 if (typeof window.requestIdleCallback === 'function') { 32480 window.requestIdleCallback(run, { timeout: 5000 }); 32481 } else { 32482 setTimeout(run, 0); 32483 } 32484 })(); 32485 const cachedSettings = window._RestockRocketConfig.cachedSettings; 32486 const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null; 32487 32488 if (validCachedSettings) { 32489 console.debug('STOQ - using cached settings'); 32490 initializeScripts(validCachedSettings); 32491 } else { 32492 console.debug('STOQ - fetching fresh settings'); 32493 const headers = { 32494 'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop, 32495 'ngrok-skip-browser-warning': 'skip' 32496 }; 32497 32498 if (window.Shopify?.theme?.role === 'main') { 32499 headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name; 32500 headers['X-Shopify-Theme-Schema-Version'] = window.Shopify.theme.schema_version; 32501 headers['X-Shopify-Theme-Store-Id'] = window.Shopify.theme.theme_store_id; 32502 } 32503 32504 fetch( 32505 `${window._RestockRocketConfig.host}/api/v1/setting.json?translation_locale=${window._RestockRocketConfig.normalizedLocale}`, 32506 { headers } 32507 ) 32508 .then(function(response) { 32509 if (!response.ok) { 32510 throw new Error('Network response was not ok'); 32511 } 32512 return response.json(); 32513 }) 32514 .then(function(settings) { 32515 initializeScripts(settings); 32516 }) 32517 .catch(function(error) { 32518 if (cachedSettings) { 32519 console.debug('STOQ - using expired cached settings as fallback'); 32520 initializeScripts(cachedSettings); 32521 } else { 32522 console.error('STOQ - failed to load settings:', error); 32523 } 32524 }) 32525 .catch(function(e) { 32526 console.error(e) 32527 }) 32528 } 32529 32530 function fetchEmbedConfig(endpoint, apply) { 32531 return fetch( 32532 `${window._RestockRocketConfig.host}/api/v1/embed/${endpoint}.json`, 32533 { 32534 headers: { 32535 'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop, 32536 'ngrok-skip-browser-warning': 'skip' 32537 } 32538 } 32539 ) 32540 .then(function(response) { 32541 if (!response.ok) throw new Error(`Failed to fetch ${endpoint}`); 32542 return response.json(); 32543 }) 32544 .then(function(data) {
32545 try { 32546 apply(data); 32547 } catch (applyError) { 32548 console.error('STOQ - apply failed for ' + endpoint + ':', applyError); 32549 throw applyError; 32550 } 32551 }) 32552 .catch(function(error) { 32553 console.debug(`STOQ - using cached ${endpoint}:`, error.message); 32554 }); 32555 } 32556 function refreshShopConfig(source) { 32557 const cfg = window._RestockRocketConfig; 32558 const viaEmbed = function() { return fetchEmbedConfig(source.endpoint, source.apply); }; 32559 const flagOn = !!cfg.readFlags && cfg.readFlags[source.flag] === true; 32560 if (!flagOn || source.embedOnly === true) { return viaEmbed(); } 32561 32562 return fetchStorefrontShopMetafield(source.metafieldKey) 32563 .then(function(value) { 32564 if (!source.isValid(value)) { throw new Error(source.metafieldKey + ' metafield is not a valid ' + source.endpoint + ' payload'); } 32565 source.apply(value); 32566 console.debug('STOQ - refreshed ' + source.endpoint + ' from the Storefront API'); 32567 }) 32568 .catch(function(error) { 32569 console.debug('STOQ - Storefront ' + source.endpoint + ' read failed, using embed:', error.message); 32570 return viaEmbed(); 32571 }); 32572 } 32573 function refreshIntegrations() { 32574 const cfg = window._RestockRocketConfig; 32575 return refreshShopConfig({ 32576 endpoint: 'integrations', 32577 metafieldKey: 'integrations', 32578 flag: 'enable_storefront_integrations_read', 32579 isValid: function(value) { return Array.isArray(value); }, 32580 apply: function(data) { 32581 cfg.integrations = data; 32582 } 32583 }); 32584 } 32585 function refreshSellingPlans(embedOnly) { 32586 const cfg = window._RestockRocketConfig; 32587 return refreshShopConfig({ 32588 embedOnly: embedOnly === true, 32589 endpoint: 'selling_plans', 32590 metafieldKey: 'cachedSellingPlans', 32591 flag: 'enable_storefront_selling_plans_read', 32592 isValid: function(value) { return !!value && Array.isArray(value.plans); }, 32593 apply: function(data) { 32594 cfg.sellingPlans = data.plans; 32595 cfg.disabledSellingPlanIds = data.disabled_plan_ids || []; 32596 if (data && data.read_flags && typeof data.read_flags === 'object' && !Array.isArray(data.read_flags)) { 32597 cfg.readFlags = data.read_flags; 32598 } 32599 } 32600 }); 32601 } 32602 32603 function initializeScripts(settings) { 32604 settings = applyTranslations(settings); 32605 window._RestockRocketConfig.settings = settings; 32606 console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`); 32607 const forceEmbedSellingPlans = settings.force_embed_selling_plans === true; 32608 const staleRefresh = !window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid; 32609 if (forceEmbedSellingPlans || staleRefresh) { 32610 console.debug('STOQ - refreshing selling_plans' + (staleRefresh ? ' + integrations (Liquid cache stale)' : ' (force_embed_selling_plans)')); 32611 const refreshes = [refreshSellingPlans(forceEmbedSellingPlans)]; 32612 if (staleRefresh) { refreshes.push(refreshIntegrations()); } 32613 Promise.race([ 32614 Promise.all(refreshes), 32615 new Promise(function(resolve) { setTimeout(resolve, 1000); }) 32616 ]).then(function() { loadScripts(settings); }); 32617 return; 32618 } 32619 32620 loadScripts(settings); 32621 } 32622 32623 function loadScripts(settings) { 32624 setupCartSellingPlanUpdater(settings); 32625 32626 if(settings.enable_app) { 32627 const hijackIntegration = window._RestockRocketConfig.integrations.find(function(integration) { 32628 return integration.type === 'hijack' && integration.enabled && integration.page_types.includes(window._RestockRocketConfig.pageType); 32629 }) 32630 const hasEnabledOffer = Array.isArray(window._RestockRocketConfig.sellingPlans) 32631 && window._RestockRocketConfig.sellingPlans.some(function(plan) { return plan && plan.enabled; }); 32632 const hasDisabledPlanIds = Array.isArray(window._RestockRocketConfig.disabledSellingPlanIds) 32633 && window._RestockRocketConfig.disabledSellingPlanIds.length > 0; 32634 const usePreorderBuild = settings.preorder_enabled || hasEnabledOffer || hasDisabledPlanIds; 32635 32636 const collectionScriptUrl = usePreorderBuild 32637 ? window._RestockRocketConfig.scriptUrlCollection 32638 : window._RestockRocketConfig.scriptUrlCollectionBis; 32639 const productScriptUrl = usePreorderBuild 32640 ? window._RestockRocketConfig.scriptUrlProduct 32641 : window._RestockRocketConfig.scriptUrlProductBis; 32642 32643 const pageType = window._RestockRocketConfig.pageType; 32644 const collectionPageTypes = ['collection', 'index', 'search', 'page']; 32645
32646 if(collectionPageTypes.indexOf(pageType) !== -1 && (settings[`show_button_on_${pageType}`] || settings[`preorder_${pageType}_enabled`])) { 32647 createRestockRocketScript(collectionScriptUrl); 32648 } else if(pageType === 'product') { 32649 createRestockRocketScript(productScriptUrl); 32650 } else if(hijackIntegration) { 32651 createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); 32652 } else if(usePreorderBuild) { 32653 createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); 32654 } else { 32655 console.debug(`STOQ - no scripts enabled for ${pageType}`); 32656 } 32657 const appLoadedEvent = new CustomEvent('stoq:loaded', { 32658 detail: { 32659 pageType: window._RestockRocketConfig.pageType, 32660 enabled: settings.enable_app, 32661 settings: settings, 32662 preorderEnabled: settings.preorder_enabled 32663 } 32664 }); 32665 console.debug('STOQ - dispatching app loaded event'); 32666 window.dispatchEvent(appLoadedEvent); 32667 } 32668 } 32669</script>
32669<style id="RestockRocketStyle">html.stoq-buy-now-pending .shopify-payment-button{pointer-events:none!important}</style> 32670 32671 32672</div><div id="shopify-block-AZFd6aGFnS21FS1hVa__13768625480086291342" class="shopify-block shopify-app-block">
32672<script> 32673 window['ShopifyForms'] = { 32674 ...window['ShopifyForms'], 32675 currentPageType: "index" 32676 }; 32677</script>
32677 32678 32679 32680</div><div id="shopify-block-Aa2IwTnk2KzlzQURZd__6933373160360723723" class="shopify-block shopify-app-block"><!-- BEGIN app snippet: wishlist_styles --><style> :root{ --st-add-icon-color: #121212; --st-added-icon-color: #dc2626; --st-loading-icon-color: #6b7280; --st-add-icon-background-color: transparent; --st-added-icon-background-color: transparent; --st-atc-button-border-radius: 8px; --st-atc-button-color: #ffffff; --st-atc-button-background-color: #111111; --st-product-card-btn-size: 40px; --st-product-card-icon-size: 20px; --st-product-card-btn-border-width: 0px; --st-product-card-btn-border-style: none; --st-product-card-btn-border-color: transparent; } /* Product-card circular button: lock square size early (before st_wl_styles). */ .st-wishlist-button[data-type="product-card"], .st-wishlist-button.st-wishlist-button--product-card { box-sizing: border-box !important; width: var(--st-product-card-btn-size, 40px) !important; height: var(--st-product-card-btn-size, 40px) !important; min-width: var(--st-product-card-btn-size, 40px) !important; min-height: var(--st-product-card-btn-size, 40px) !important; max-width: var(--st-product-card-btn-size, 40px) !important; max-height: var(--st-product-card-btn-size, 40px) !important; padding: 0 !important; line-height: 1 !important; border-width: var(--st-product-card-btn-border-width, 0px) !important; border-style: var(--st-product-card-btn-border-style, none) !important; border-color: var(--st-product-card-btn-border-color, transparent) !important; border-radius: 50%; align-items: center; justify-content: center; } .st-wishlist-button[data-type="product-card"]:empty, .st-wishlist-button.st-wishlist-button--product-card:empty { display: none !important; } .st-wishlist-button[data-type="product-card"] .st-wishlist-icon, .st-wishlist-button[data-type="product-card"] .st-wishlist-loading-icon, .st-wishlist-button[data-type="product-card"] svg:not(.st-locker-icon), .st-wishlist-button.st-wishlist-button--product-card .st-wishlist-icon, .st-wishlist-button.st-wishlist-button--product-card .st-wishlist-loading-icon, .st-wishlist-button.st-wishlist-button--product-card svg:not(.st-locker-icon) { width: var(--st-product-card-icon-size, 20px) !important; height: var(--st-product-card-icon-size, 20px) !important; } /* .st-wishlist-button, #st_wishlist_icons, .st-wishlist-details-button{ display: none; } */ /* Visually hide the SVG symbol sprite without `display: none`. WebKit/Safari often fails to paint <use href="#â¦"> when the referenced symbol lives in a display:none subtree (Chrome still paints). Keep a non-zero box off-screen: width/height 0 can still collapse <use> intrinsic size on Safari (PDP icon-only buttons then paint at ~0px). */ #st_wishlist_icons, #st-wishlist-icons-sprites { position: absolute !important; left: -10000px !important; top: -10000px !important; width: 24px !important; height: 24px !important; overflow: hidden !important; pointer-events: none !important; /* Do not use display:none / visibility:hidden / opacity:0 / zero-box here. */ } /* Hard icon box so theme rules like `svg { width:auto; height:auto }` cannot collapse <use> icons on WebKit. Product-card keeps its own size vars (higher specificity). Details PDP uses this 20px box. */ .st-wishlist-button .st-wishlist-icon, .st-wishlist-button .st-wishlist-loading-icon, .st-wishlist-button svg:not(.st-locker-icon) { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; flex-shrink: 0 !important; overflow: visible !important; } .st-wishlist-button[data-type="details"] .st-wishlist-icon, .st-wishlist-button[data-type="details"] .st-wishlist-loading-icon, .st-wishlist-button[data-type="details"] svg:not(.st-locker-icon) { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; flex-shrink: 0 !important; overflow: visible !important; } .st-wishlist-initialized .st-wishlist-button{ display: flex; } /* Override store's --colorTextBody variable to prevent color inheritance */ .st-wishlist-button:not([data-type="details"]) { --colorTextBody: var(--st-add-icon-color) !important; } .st-wishlist-button.st-is-added:not([data-type="details"]) { --colorTextBody: var(--st-added-icon-color) !important; } .st-wishlist-button.st-is-loading:not([data-type="details"]) { --colorTextBody: var(--st-loading-icon-color) !important; } .st-wishlist-loading-icon{ color: var(--st-loading-icon-color) !important; fill: var(--st-loading-icon-color) !important; } .st-wishlist-button:not([data-type="details"]) .st-wishlist-icon{ color: var(--st-add-icon-color) !important; fill: var(--st-add-icon-color) !important; } .st-wishlist-button:not([data-type="details"]) .st-wishlist-icon use { fill: var(--st-add-icon-color) !important; } .st-wishlist-button.st-is-added:not([data-type="details"]) .st-wishlist-icon{ color: var(--st-added-icon-color) !important; fill: var(--st-added-icon-color) !important; } .st-wishlist-button.st-is-added:not([data-type="details"]) .st-wishlist-icon use { fill: var(--st-added-icon-color) !important; } .st-wishlist-button.st-is-loading:not([data-type="details"]) .st-wishlist-icon{ color: var(--st-loading-icon-color) !important; fill: var(--st-loading-icon-color) !important; } .st-wishlist-button.st-is-loading:not([data-type="details"]) .st-wishlist-icon use { fill: var(--st-loading-icon-color) !important; } .st-wishlist-initialized { .st-wishlist-details-button--header-icon, .st-wishlist-details-button { display: flex; } } .st-initialized.st-wishlist-details-button--header-icon, .st-initialized.st-wishlist-details-button{ display: flex; } .st-wishlist-details-button { cursor: pointer; } .st-wishlist-details-button:not([data-custom-icon="true"]):not([data-swishlist-had-custom-icon-at-mark="1"]) { --colorTextBody: var(--icon-color) !important; } .st-wishlist-details-button:not([data-custom-icon="true"]):not([data-swishlist-had-custom-icon-at-mark="1"]) .st-wishlist-icon{ color: var(--icon-color); fill: var(--icon-color); } .st-wishlist-details-button:not([data-custom-icon="true"]):not([data-swishlist-had-custom-icon-at-mark="1"]) .st-wishlist-icon use { fill: var(--icon-color) !important; } /* ===== Wishlist popups (create / manage / confirm) ===== */ .st-popup { position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center; pointer-events: none; } .st-popup_overlay { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.4); pointer-events: auto; } .st-popup_box { position: relative; pointer-events: auto; background-color: #ffffff; color: #202223; min-width: min(420px, 92vw); max-width: 520px; border-radius: 10px; box-shadow: 0 24px 48px rgba(0, 0, 0, 0.14); /* padding: 20px 24px 18px; */ } .st-popup_box header { margin-bottom: 12px; } .st-popup_box header .st-h3 { font-size: 18px; font-weight: 600; } .st-popup_box main { margin: 8px 0 16px; } .st-popup_box footer { margin-top: 4px; opacity: 1 !important; transform: none !important; transition: none !important; } /* Close button in popup header */ .st-popup_box .st-close-button { border: none; background: transparent; cursor: pointer; padding: 0; color: #8c9196; } .st-popup_box .st-close-button:hover { color: #202223; } /* Create / manage wishlist specific styling */ .st-popup--create-wishlist label, .st-popup--manage-wishlist label { display: block; margin-bottom: 6px; font-size: 13px; color: #6d7175; } .st-popup--create-wishlist input[type="text"], .st-popup--manage-wishlist input[type="text"] { width: 100%; border-radius: 6px; border: 1px solid #c9ccd0; padding: 7px 10px; font-size: 14px; box-shadow: inset 0 0 0 1px transparent; outline: none; } .st-popup--create-wishlist input[type="text"]:focus, .st-popup--manage-wishlist input[type="text"]:focus { border-color: #5c6ac4; box-shadow: 0 0 0 1px #5c6ac4; } .st-popup--manage-wishlist .st-wishlist-item_input { flex: 1 1 auto; } .st-popup--manage-wishlist .st-wishhlist-item form { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .st-popup--manage-wishlist .st-wishhlist-item + .st-wishhlist-item { margin-top: 8px; } .st-popup--manage-wishlist .st-edit-button, .st-popup--manage-wishlist .st-delete-button { border: none; background: #f6f6f7; border-radius: 6px; width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; } .st-popup--manage-wishlist .st-delete-button { margin-left: 4px; } .st-popup--manage-wishlist .st-edit-button:hover { background: #e3e5e8; } .st-popup--manage-wishlist .st-delete-button:hover { background: #fdebea; } /* Hide delete button when only one wishlist (safety) */ .st-popup--manage-wishlist.st-has-single-wishlist .st-delete-button { display: none; } /* Confirm popup buttons */ .st-popup--confirm footer .st-cancel-button, .st-popup--confirm footer .st-confirm-button { min-width: 110px; border-radius: 6px; padding: 7px 14px; font-size: 14px; font-weight: 500; border: 1px solid transparent; cursor: pointer; } .st-popup--confirm footer .st-cancel-button { background: #ffffff; color: #202223; border-color: #c9ccd0; } .st-popup--confirm footer .st-cancel-button:hover { background: #f6f6f7; } .st-popup--confirm footer .st-confirm-button { background: #de3618;
32680 color: #ffffff; border-color: #de3618; } .st-popup--confirm footer .st-confirm-button:hover { background: #bf2710; border-color: #bf2710; } .st-popup--danger .st-confirm-button { background: #de3618; border-color: #de3618; } /* Login popup */ .st-popup--login { z-index: 2041997; } .st-popup--login.st-is-open { display: flex !important; } .st-popup--login .popup-close-x { position: absolute; top: 0; right: 0; padding: 10px; } .st-popup--login .popup-close-x button { background: transparent; border: none; color: #AAAAAA; transition: color 0.2s ease; cursor: pointer; } .st-popup--login .popup-close-x button:hover { color: #FFFFFF; } .st-popup--login .popup-header { background: #000; padding: 10px 10px; } .st-popup--login .popup-header .header-title { color: #fff; font-size: 18px; font-weight: bold; text-align: center; margin: 0; } .st-popup--login .popup-body { display: flex; flex-wrap: wrap; padding: 16px; align-items: center; gap: 16px; color: #000; } .st-popup--login .popup-footer { display: flex; justify-content: center; align-items: center; padding: 16px; gap: 16px; color: #000; } .st-popup--login .popup--button { background: #eee; padding: 10px 20px; border-radius: 5px; border: 1px solid #ccc; cursor: pointer; } .st-popup--login .popup--button:hover { background: #ddd; } </style> <!-- END app snippet --><link rel="stylesheet" href="https://cdn.shopify.com/extensions/01a11a04-6da5-7ed6-89a8-7dba9a26990f/swishlist-606/assets/st_wl_styles.min.css" media="print" onload="this.media='all'" > <noscript><link href="//cdn.shopify.com/extensions/01a11a04-6da5-7ed6-89a8-7dba9a26990f/swishlist-606/assets/st_wl_styles.min.css" rel="stylesheet" type="text/css" media="all" /></noscript> <style id="st-wishlist-custom-css"> </style> <template id="st_wishlist_template"><!-- BEGIN app snippet: wishlist_template_core --><div id="wishlist_button"> <svg width="20" height="20" class="st-wishlist-icon"> <use xlink:href="#st_add_icon"></use> </svg> <span class="st-label">[label]</span> </div> <div class="st-toast"> <div class="st-content"></div> <button class="st-close-button" aria-label="Close" title="Close"> <svg class="st-icon" width="20" height="20" aria-hidden="true" focusable="false"> <use xlink:href="#st_close_icon"></use> </svg> </button> </div> <div id="st_toast_error"> <div class="st-toast-error"> <span class="st-error-icon" role="img" aria-label="Error">ð´</span> <p class="st-message">[message]</p> </div> </div> <div id="toast_product_message"> <div class="st-product-toast"> <div class="st-product-toast_content" data-src="[src]"> <div class="st-image"> [img] </div> </div> <div class="st-product-toast_title"> <p>[title]</p> <span>[message]</span> <p class="st-product-toast_sub-message">[subMessage]</p> </div> </div> </div><!-- BEGIN app snippet: details_button --><button type="button" class="st-wishlist-details-button" aria-label="Open Wishlist Details" title="Open Wishlist Details" data-type="floating" > <svg width="20" height="20" class="st-wishlist-icon"> <use xlink:href="#st_details_icon"></use> </svg> <span class="st-label st-none st-js-label">My Wishlist</span> <span class="st-number st-js-number st-none">0</span> </button> <!-- END app snippet --><!-- END app snippet --></template><template id="st_wishlist_shell_template"><!-- BEGIN app snippet: wishlist_template_shell --><!-- BEGIN app snippet: wishlist_drawer --> <div class="st-wishlist-details st-wishlist-details--drawer st-wishlist-details--right st-is-loading "> <div class="st-wishlist-details_overlay"><span></span></div> <div class="st-wishlist-details_wrapper"> <div class="st-wishlist-details_header"> <div class="st-wishlist-details_title st-flex st-justify-between"> <div class="st-h3 h2">My Wishlist</div> <button class="st-close-button" aria-label="Close the wishlist drawer" title="Close the wishlist drawer" > <svg class="st-icon" width="20" height="20" aria-hidden="true" focusable="false"> <use xlink:href="#st_close_icon"></use> </svg> </button> </div><div class="st-wishlist-details_shares"><!-- BEGIN app snippet: wishlist_shares --><div class="st-wishlist-shares-wrap"> <ul class="st-wishlist-shares st-list-style-none st-flex st-gap-20 st-justify-center" data-list=""> <li class="st-wishlist-share-item st-wishlist-share-item--facebook"> <button class="st-share-button" data-type="facebook" aria-label="Share on Facebook" title="Share on Facebook" > <svg class="st-icon" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" > <g>
32680<path fill="currentColor" d="M18.768,7.465H14.5V5.56c0-0.896,0.594-1.105,1.012-1.105s2.988,0,2.988,0V0.513L14.171,0.5C10.244,0.5,9.5,3.438,9.5,5.32 v2.145h-3v4h3c0,5.212,0,12,0,12h5c0,0,0-6.85,0-12h3.851L18.768,7.465z"></path></g> </svg> </button> </li> <li class="st-wishlist-share-item st-wishlist-share-item--pinterest"> <button class="st-share-button" data-type="pinterest" aria-label="Pin on Pinterest" title="Pin on Pinterest" > <svg class="st-icon" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" > <path fill="currentColor" d="M12.137,0.5C5.86,0.5,2.695,5,2.695,8.752c0,2.272,0.8 ,4.295,2.705,5.047c0.303,0.124,0.574,0.004,0.661-0.33 c0.062-0.231,0.206-0.816,0.271-1.061c0.088-0.331,0.055-0.446-0.19-0.736c-0.532-0.626-0.872-1.439-0.872-2.59 c0-3.339,2.498-6.328,6.505-6.328c3.548,0,5.497,2.168,5.497,5.063c0,3.809-1.687,7.024-4.189,7.024 c-1.382,0-2.416-1.142-2.085-2.545c0.397-1.675,1.167-3.479,1.167-4.688c0-1.081-0.58-1.983-1.782-1.983 c-1.413,0-2.548,1.461-2.548,3.42c0,1.247,0.422,2.09,0.422,2.09s-1.445,6.126-1.699,7.199c-0.505,2.137-0.076,4.756-0.04,5.02 c0.021,0.157,0.224,0.195,0.314,0.078c0.13-0.171,1.813-2.25,2.385-4.325c0.162-0.589,0.929-3.632,0.929-3.632 c0.459,0.876,1.801,1.646,3.228,1.646c4.247,0,7.128-3.871,7.128-9.053C20.5,4.15,17.182,0.5,12.137,0.5z"></path> </svg> </button> </li> <li class="st-wishlist-share-item st-wishlist-share-item--twitter"> <button class="st-share-button" data-type="twitter" aria-label="Tweet on Twitter" title="Tweet on Twitter" > <svg class="st-icon" width="24px" height="24px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" > <path fill="currentColor" d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/> </svg> </button> </li> <li class="st-wishlist-share-item st-wishlist-share-item--whatsapp"> <button class="st-share-button" data-type="whatsapp" aria-label="Share on WhatsApp" title="Share on WhatsApp" > <svg class="st-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"> <path fill="currentColor" d="M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7 .9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z"/> </svg> </button> </li> <li class="st-wishlist-share-item st-wishlist-share-item--email"> <button class="st-share-button" data-type="email" aria-label="Share on Email" title="Share on Email" > <svg class="st-icon" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" > <path fill="currentColor" d="M22,4H2C0.897,4,0,4.897,0,6v12c0,1.103,0.897,2,2,2h20c1.103,0,2-0.897,2-2V6C24,4.897,23.103,4,22,4z M7.248,14.434 l-3.5,2C3.67,16.479,3.584,16.5,3.5,16.5c-0.174,0-0.342-0.09-0.435-0.252c-0.137-0.239-0.054-0.545,0.186-0.682l3.5-2 c0.24-0.137,0.545-0.054,0.682,0.186C7.571,13.992,7.488,14.297,7.248,14.434z M12,14.5c-0.094,0-0.189-0.026-0.271-0.08l-8.5-5.5 C2.997,8.77,2.93,8.46,3.081,8.229c0.15-0.23,0.459-0.298,0.691-0.147L12,13.405l8.229-5.324c0.232-0.15,0.542-0.084,0.691,0.147 c0.15,0.232,0.083,0.542-0.148,0.691l-8.5,5.5C12.189,14.474,12.095,14.5,12,14.5z M20.934,16.248 C20.842,16.41,20.673,16.5,20.5,16.5c-0.084,0-0.169-0.021-0.248-0.065l-3.5-2c-0.24-0.137-0.323-0.442-0.186-0.682 s0.443-0.322,0.682-0.186l3.5,2C20.988,15.703,21.071,16.009,20.934,16.248z"></path> </svg> </button> </li> <li class="st-wishlist-share-item st-wishlist-share-item--copy_link"> <button class="st-share-button" data-type="copy_link" aria-label="Copy to Clipboard" title="Copy to Clipboard" > <svg class="st-icon" width="24" height="24" viewBox="0 0 512 512">
32680 <path fill="currentColor" d="M459.654,233.373l-90.531,90.5c-49.969,50-131.031,50-181,0c-7.875-7.844-14.031-16.688-19.438-25.813 l42.063-42.063c2-2.016,4.469-3.172,6.828-4.531c2.906,9.938,7.984,19.344,15.797,27.156c24.953,24.969,65.563,24.938,90.5,0 l90.5-90.5c24.969-24.969,24.969-65.563,0-90.516c-24.938-24.953-65.531-24.953-90.5,0l-32.188,32.219 c-26.109-10.172-54.25-12.906-81.641-8.891l68.578-68.578c50-49.984,131.031-49.984,181.031,0 C509.623,102.342,509.623,183.389,459.654,233.373z M220.326,382.186l-32.203,32.219c-24.953,24.938-65.563,24.938-90.516,0 c-24.953-24.969-24.953-65.563,0-90.531l90.516-90.5c24.969-24.969,65.547-24.969,90.5,0c7.797,7.797,12.875,17.203,15.813,27.125 c2.375-1.375,4.813-2.5,6.813-4.5l42.063-42.047c-5.375-9.156-11.563-17.969-19.438-25.828c-49.969-49.984-131.031-49.984-181.016,0 l-90.5,90.5c-49.984,50-49.984,131.031,0,181.031c49.984,49.969,131.031,49.969,181.016,0l68.594-68.594 C274.561,395.092,246.42,392.342,220.326,382.186z"></path> </svg> <span>Copied</span> </button> </li> </ul> <div class="st-email-options-popup-content"> <button type="button" class="st-email-options-popup-close-button" data-email-action="close" >Ã</button> <div class="st-email-options-popup-title">Choose email method</div> <div class="st-email-options-popup-buttons"> <button type="button" class="st-email-options-popup-option-button" data-email-action="mail-client" aria-label="Email client" title="Email client" > <div class="st-email-options-popup-option-icon">@</div> <div class="st-email-options-popup-option-text"> <div class="st-email-options-popup-option-title">Mail Client</div> <div class="st-email-options-popup-option-description">Outlook, Apple Mail, Thunderbird</div> </div> </button> <button type="button" class="st-email-options-popup-option-button" data-email-action="gmail" aria-label="Gmail Web" title="Gmail Web" > <div class="st-email-options-popup-option-icon">G</div> <div class="st-email-options-popup-option-text"> <div class="st-email-options-popup-option-title">Gmail Web</div> <div class="st-email-options-popup-option-description">Open in browser</div> </div> </button> <button type="button" class="st-email-options-popup-option-button" data-email-action="outlook" aria-label="Outlook Web" title="Outlook Web" > <div class="st-email-options-popup-option-icon">O</div> <div class="st-email-options-popup-option-text"> <div class="st-email-options-popup-option-title">Outlook Live Web</div> <div class="st-email-options-popup-option-description">Open Outlook Live web in browser</div> </div> </button> <button type="button" class="st-email-options-popup-option-button" data-email-action="copy" aria-label="Copy shareable link" title="Copy shareable link" > <div class="st-email-options-popup-option-icon">C</div> <div class="st-email-options-popup-option-text"> <div class="st-email-options-popup-option-title st-email-options-popup-copy-title">Copy Link</div> <div class="st-email-options-popup-option-description">Copy shareable link</div> </div> </button> </div> </div> </div> <!-- END app snippet --></div></div> <div class="st-wishlist-details_main"><div class="st-wishlist-details_products st-js-products"></div> <div class="st-wishlist-details_products_total_price"> <span class="st-total-price-label">Total in Wishlist:</span> <span class="st-total-price-value">[totalPriceWishlist]</span> </div> <div class="st-wishlist-details_loading"> <svg width="50" height="50"> <use xlink:href="#st_loading_icon"></use> </svg> </div> <div class="st-wishlist-details_empty st-text-center"> <p> <b>Love it? Add to your wishlist</b> </p> <p>Your favorites, all in one place. Shop quickly and easily with the wishlist feature!</p> <div class="st-wishlist-details_empty_actions"> <a href="/collections/all" class="st-atc-button" > Start Shopping </a> </div> </div> </div> <div class="st-wishlist-details_footer_buttons"> <button type="button" class="st-footer-button st-add-all-to-cart-button" data-location-button="drawer" data-add-all-label="Add All to Cart"> Add All to Cart </button> <button type="button" class="st-footer-button st-go-to-cart-button" data-cart-url="/cart"> Go to Cart </button> <button type="button" class="st-footer-button st-remove-all-items-button" data-remove-all-label="Clear Wishlist"> Clear Wishlist </button> </div><div class="st-wishlist-save-your-wishlist"><!-- BEGIN app snippet: guest_save_wishlist_login_link --><a href="https://www.tnbl.co.uk/customer_authentication/redirect?locale=en®ion_country=GB&return_url=%2F" rel="nofollow">Log in to save it and sync across devices.</a> <!-- END app snippet --></div></div> <template style="display: none;"> <!-- BEGIN app snippet: product_card --><st-product-card data-handle="[handle]" data-id="[id]" data-wishlist-id="[wishlistId]" data-variant-id="[variantId]" class="st-product-card st-product-card--drawer st-product-card--[viewMode]" > <div class="st-product-card_image"> <div class="st-image">[img]</div> </div> <form action="/cart/add" class="st-product-card_form"> <input type="hidden" name="form_type" value="product"> <input type="hidden" name="quantity" value="[quantityRuleMin]"> <div class="st-product-card_group st-product-card_group--title">
32680 <div class="st-product-card_vendor_title [vendorClass]"> <div class="st-product-card_vendor">[vendor]</div> <div class="st-product-card_title">[title]</div> <div class="st-product-card_sku [skuClass]">[sku]</div> </div> <div class="st-product-card_options st-none"> <div class="st-pr"> <select name="id" data-product-id="[id]"></select> <span class="st-product-card_variant-text st-none"></span> <svg class="st-variant-select-caret" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" > <path fill-rule="evenodd" clip-rule="evenodd" d="M10 12.9998C9.68524 12.9998 9.38885 12.8516 9.2 12.5998L6.20001 8.59976C5.97274 8.29674 5.93619 7.89133 6.10558 7.55254C6.27497 7.21376 6.62123 6.99976 7 6.99976H13C13.3788 6.99976 13.725 7.21376 13.8944 7.55254C14.0638 7.89133 14.0273 8.29674 13.8 8.59976L10.8 12.5998C10.6111 12.8516 10.3148 12.9998 10 12.9998Z" fill="black"/> </svg> </div> </div> </div> <div class="st-product-card_group st-product-card_group--quantity"> <div class="st-product-card_quantity"> <p class="st-product-card_price st-js-price [priceFreeClass] [compareAtPriceClass] [visibilityHidePriceClass]">[price]<span class="st-js-compare-at-price">[compareAtPrice]</span></p> <div class="st-quantity-widget st-none"> <button type="button" class="st-minus-button" aria-label="" > - </button> <input type="number" class="st-quantity-input" min="1" value="[quantityRuleMin]"> <button type="button" class="st-plus-button" aria-label="" > + </button> </div> </div> <button type="submit" class="st-atc-button [visibilityHideAtcClass]"> <span>Add to Cart</span> <svg width="20" height="20"> <use xlink:href="#st_loading_icon"></use> </svg> </button> </div> </form> <div class="st-product-card_actions st-pa st-js-actions"> <button class="st-delete-button st-flex st-justify-center st-align-center" aria-label="Delete" title="Delete" > <svg width="24" height="24" class="st-icon st-delete-icon"> <use xlink:href="#st_close_icon"></use> </svg> </button> </div> <div class="st-product-card_loading"> <div></div> <svg width="50" height="50"> <use xlink:href="#st_loading_icon"></use> </svg> </div> </st-product-card> <!-- END app snippet --> </template> </div> <!-- END app snippet --> <!-- BEGIN app snippet: confirm_popup --> <div class="st-popup st-popup--confirm" style="display:none;"> <div class="st-popup_overlay"></div> <div class="st-popup_box"> <header class="st-text-center"> </header> <main> <div class="message st-text-center"></div> </main> <footer class="st-flex st-justify-center st-gap-20"> <button class="st-cancel-button"> Cancel </button> <button class="st-confirm-button"> Delete </button> </footer> </div> </div> <!-- END app snippet --><!-- END app snippet --></template>
32680<script id="swishlist-bootstrap-data" type="application/json"> { "configuration": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaG9wIjoidG5ibC11ay5teXNob3BpZnkuY29tIiwiaWF0IjoxNzY3NzQzNjA4fQ.Zina85-L3b8kuc6hsqoDRgzjJIusvG8SNSsb6TvJwy0", "customer": null, "currency": { "currency": "GBP", "moneyFormat": "£{{amount}}", "moneyWithCurrencyFormat": "£{{amount}} GBP" }, "routes": { "root_url": "\/", "account_login_url": "https:\/\/www.tnbl.co.uk\/customer_authentication\/redirect?locale=en\u0026region_country=GB", "account_logout_url": "\/account\/logout", "account_profile_url": "https:\/\/account.tnbl.co.uk\/profile?locale=en\u0026region_country=GB\u0026buyer_flags=eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0bmJsLXVrLm15c2hvcGlmeS5jb20iLCJmbGFncyI6W10sImV4cCI6MTc5MjEyMDg4MiwibmJmIjoxNzkxNTE2MDgyfQ.oj-nKjeVLw2YuaOMhVAV-fhFJ3qYdfwRbP0e84V91u8", "account_url": "\/account", "collections_url": "\/collections", "cart_url": "\/cart", "product_recommendations_url": "\/recommendations\/products" }, "visibility": { "showAddWishlistButton": true }, "pdpWishlistButtonMissingBeforeFallback": false, "pdpWishlistFloatingFallbackApplied": false, "debug": {} }, "appOtherInfo": {"isReachedLimit":false,"typeReachedLimit":"","levelReachedLimit":1}, "activeThemeId": null, "themeSettings": null, "numberThemesSettings": 4, "themesSettings": [{"id":"46106","storeId":11604,"themeId":"193038713178","settings":{"general":{"pages":{"wishlistDetails":"","shareWishlist":""},"addToCartButtonStyles":{"borderRadius":"8px","backgroundColor":"#111111","color":"#ffffff"},"redirectToPage":false,"afterAddedItemToCartBehavior":"redirect_cart_page","afterAddedItemToCartBehaviorCustomUrl":"","customer":{"allowGuest":true,"useLoginPopup":false,"redirectLoginPage":false,"syncLocalToServer":true,"tagsMode":"all","tags":[]},"allowAddMultipleVariants":false,"icons":{"loading":{"type":"icon_5","custom":null,"color":"#6b7280"},"add":{"type":"icon_2","custom":null,"color":"#121212","backgroundColor":"transparent","buttonBackgroundColor":"transparent"},"added":{"type":"icon_1","custom":null,"color":"#dc2626","backgroundColor":"transparent","buttonBackgroundColor":"transparent"}},"sharing":{"socialList":["facebook","twitter","pinterest","email","copy_link"]}},"detailsButton":{"itemsCount":{"show":true,"hideWhenEmpty":true,"color":{"hex":"#fff","alpha":1},"bgColor":{"hex":"#FF0001","alpha":1}},"type":"floating","selectorQueries":[],"afterClick":"open_drawer","showLabel":true,"styles":{"borderRadius":"8px","backgroundColor":"#111111","color":"#ffffff"},"placement":"bottom_right","icon":{"type":"icon_2","color":"#dc2626","custom":null},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenEmpty":true,"interval":"20s"},"imageFitType":"cover","otherInfo":{"price":{"styles":{"color":"#111827"}},"vendor":{"show":false,"position":"above_product_title","styles":{"color":"#111827"}},"compareAtPrice":{"show":false,"position":"right_of_price","styles":{"color":"#b91c1c"}},"sku":{"show":false,"styles":{"color":"#111827"}},"totalPrice":{"show":false,"position":"bottom","styles":{"color":"#111827","fontSize":"20px"}},"formatPrice":{"type":"amount_without_currency"},"quantityWidget":{"show":false,"styles":{}},"variantSelector":{"hide":false,"type":"select","styles":{}}}},"notificationPopup":{"placement":"left_top","duration":3000,"effect":{"type":""},"hideOnAddRemoveItemToWishlist":false,"hideOnAddRemoveItemToCart":false,"showPopupReminder":false,"numberProductsPopupReminder":1,"showNotificationReminder":false,"minDaysShowPopupReminder":2,"minDaysReShowPopupReminder":2,"showPopupReminderInProductPage":true,"stylesToast":{"backgroundColor":"#ffffff","colorTitle":"#000000","colorMessage":"#000000","colorClose":"#000000"},"stylesReminder":{"backgroundColor":"#ffffff","shadowColor":"#000000","backgroundColorHeader":"#000000","colorHeader":"#ffffff","colorProductTitle":"#000000","backgroundButton":"#000000","colorButton":"#ffffff"}},"eventNotification":{"enable":false,"saleEventProducts":[],"priceEventProducts":[],"inventoryEventProducts":[],"settings":{"useImage":false,"useIcon":false,"useGreeting":false,"requireInteraction":false,"imageType":"default","iconType":"default","imageUpload":null,"iconUpload":null,"quietTime":{"enable":false,"start":"22:00","end":"08:00","timezone":"UTC+0"},"batching":{"enable":false},"saleEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}},"priceEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}},"inventoryEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}}},"saleOn":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleOff":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleDeeper":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleShallower":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"priceDrop":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"priceRise":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"outStock":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"inStock":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"}},"productPage":{"insertType":"manually","buttonPosition":"beforebegin","floatingButtonPosition":"bottom_right","insertSelector":"","wishlistButton":{"fullWidth":true,"showLabel":true,"showNumberActivities":false,"icon":{"color":"#FF0000","addedColor":"#ffffff"},"styles":{"borderWidth":"1px","borderColor":"#e5e7eb","borderStyle":"solid","borderRadius":"8px","backgroundColor":"#111111","color":"#ffffff","margin":"10px 0px","padding":"10px"},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenAdded":true,"interval":"20s"}}},"productCard":{"insertType":"manually","buttonPosition":"right_top","childPosition":"last_child","insertSelector":"","wishlistButton":{"fullWidth":false,"showLabel":false,"showNumberActivities":false,"icon":{"color":"#FF0000","addedColor":"#ffffff","backgroundColor":"transparent","addedBackgroun
32680dColor":"transparent"},"styles":{"borderWidth":"1px","borderColor":"#e5e7eb","borderStyle":"solid","borderRadius":"8px","backgroundColor":"#111111","color":"#ffffff","margin":"","padding":"10px"},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenAdded":true,"interval":"20s"}}}},"version":"1.0.0","createdAt":"2026-03-30T07:23:25.031Z","updatedAt":"2026-03-30T07:23:25.031Z"},{"id":"45981","storeId":11604,"themeId":"193010991450","settings":{"general":{"pages":{"wishlistDetails":"","shareWishlist":""},"addToCartButtonStyles":{"borderRadius":"8px","backgroundColor":"#111111","color":"#ffffff"},"redirectToPage":false,"afterAddedItemToCartBehavior":"redirect_cart_page","afterAddedItemToCartBehaviorCustomUrl":"","customer":{"allowGuest":true,"useLoginPopup":false,"redirectLoginPage":false,"syncLocalToServer":true,"tagsMode":"all","tags":[]},"allowAddMultipleVariants":false,"icons":{"loading":{"type":"icon_5","custom":null,"color":"#6b7280"},"add":{"type":"icon_2","custom":null,"color":"#111111","backgroundColor":"transparent","buttonBackgroundColor":"transparent"},"added":{"type":"icon_1","custom":null,"color":"#111111","backgroundColor":"transparent","buttonBackgroundColor":"transparent"}},"sharing":{"socialList":["facebook","twitter","pinterest","email","copy_link"]}},"detailsButton":{"itemsCount":{"show":false,"hideWhenEmpty":true,"color":{"hex":"#fff","alpha":1},"bgColor":{"hex":"#FF0001","alpha":1}},"type":"header_icon","selectorQueries":[],"afterClick":"redirect_to_page","showLabel":true,"styles":{"borderRadius":"8px","backgroundColor":"#111111","color":"#ffffff"},"placement":"bottom_right","icon":{"type":"icon_2","color":"#111111","custom":null},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenEmpty":true,"interval":"20s"},"imageFitType":"cover","otherInfo":{"price":{"styles":{"color":"#111827"}},"vendor":{"show":false,"position":"above_product_title","styles":{"color":"#111827"}},"compareAtPrice":{"show":false,"position":"right_of_price","styles":{"color":"#b91c1c"}},"sku":{"show":false,"styles":{"color":"#111827"}},"totalPrice":{"show":false,"position":"bottom","styles":{"color":"#111827","fontSize":"20px"}},"formatPrice":{"type":"amount_without_currency"},"quantityWidget":{"show":false,"styles":{}},"variantSelector":{"hide":false,"type":"select","styles":{}}}},"notificationPopup":{"placement":"left_top","duration":3000,"effect":{"type":""},"hideOnAddRemoveItemToWishlist":false,"hideOnAddRemoveItemToCart":false,"showPopupReminder":false,"numberProductsPopupReminder":1,"showNotificationReminder":false,"minDaysShowPopupReminder":2,"minDaysReShowPopupReminder":2,"showPopupReminderInProductPage":true,"stylesToast":{"backgroundColor":"#ffffff","colorTitle":"#000000","colorMessage":"#000000","colorClose":"#000000"},"stylesReminder":{"backgroundColor":"#ffffff","shadowColor":"#000000","backgroundColorHeader":"#000000","colorHeader":"#ffffff","colorProductTitle":"#000000","backgroundButton":"#000000","colorButton":"#ffffff"}},"eventNotification":{"enable":false,"saleEventProducts":[],"priceEventProducts":[],"inventoryEventProducts":[],"settings":{"useImage":false,"useIcon":false,"useGreeting":false,"requireInteraction":false,"imageType":"default","iconType":"default","imageUpload":null,"iconUpload":null,"quietTime":{"enable":false,"start":"22:00","end":"08:00","timezone":"UTC+0"},"batching":{"enable":false},"saleEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}},"priceEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}},"inventoryEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}}},"saleOn":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleOff":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleDeeper":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleShallower":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"priceDrop":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"priceRise":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"outStock":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"inStock":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"}},"productPage":{"insertType":"manually","buttonPosition":"beforebegin","floatingButtonPosition":"bottom_right","insertSelector":"","wishlistButton":{"fullWidth":true,"showLabel":true,"showNumberActivities":false,"icon":{"color":"#111111","addedColor":"#111111"},"styles":{"borderWidth":"1px","borderColor":"#AC9669","borderStyle":"solid","borderRadius":"15px","backgroundColor":"#ffffff","color":"#111111","margin":"","padding":"10px"},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenAdded":true,"interval":"20s"}}},"productCard":{"insertType":"manually","buttonPosition":"right_top","childPosition":"last_child","insertSelector":"","wishlistButton":{"fullWidth":false,"showLabel":false,"showNumberActivities":false,"icon":{"color":"#FF0000","addedColor":"#ffffff","backgroundColor":"transparent","addedBackgroun
32680dColor":"transparent"},"styles":{"borderWidth":"1px","borderColor":"#e5e7eb","borderStyle":"solid","borderRadius":"8px","backgroundColor":"#111111","color":"#ffffff","margin":"","padding":"10px"},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenAdded":true,"interval":"20s"}}}},"version":"1.0.0","createdAt":"2026-03-26T16:11:31.533Z","updatedAt":"2026-03-30T07:27:48.374Z"},{"id":"42723","storeId":11604,"themeId":"191642468698","settings":{"general":{"pages":{"wishlistDetails":"","shareWishlist":""},"addToCartButtonStyles":{"borderRadius":"25px","backgroundColor":"#000000","color":"#ffffff"},"redirectToPage":false,"afterAddedItemToCartBehavior":"redirect_cart_page","afterAddedItemToCartBehaviorCustomUrl":"","customer":{"allowGuest":true,"useLoginPopup":false,"redirectLoginPage":false,"syncLocalToServer":true,"tagsMode":"all","tags":[]},"allowAddMultipleVariants":false,"icons":{"loading":{"type":"icon_5","custom":null,"color":"#000000"},"add":{"type":"icon_2","custom":null,"color":"#000000","backgroundColor":"transparent","buttonBackgroundColor":"transparent"},"added":{"type":"icon_1","custom":null,"color":"#FF0000","backgroundColor":"transparent","buttonBackgroundColor":"transparent"}},"sharing":{"socialList":["facebook","twitter","pinterest","email","copy_link"]}},"detailsButton":{"itemsCount":{"show":false,"hideWhenEmpty":true,"color":{"hex":"#fff","alpha":1},"bgColor":{"hex":"#FF0001","alpha":1}},"type":"floating","selectorQueries":[],"afterClick":"redirect_to_page","showLabel":true,"styles":{"borderRadius":"25px","backgroundColor":"#000000","color":"#ffffff"},"placement":"bottom_right","icon":{"type":"icon_2","color":"#FF0000","custom":null},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenEmpty":true,"interval":"20s"},"imageFitType":"cover","otherInfo":{"price":{"styles":{"color":"#000000"}},"vendor":{"show":false,"position":"above_product_title","styles":{"color":"#000000"}},"compareAtPrice":{"show":false,"position":"right_of_price","styles":{"color":"#FF0000"}},"totalPrice":{"show":false,"position":"bottom","styles":{"color":"#000000","fontSize":"20px"}},"formatPrice":{"type":"amount_without_currency"}}},"notificationPopup":{"placement":"left_top","duration":3000,"effect":{"type":""},"hideOnAddRemoveItemToWishlist":false,"hideOnAddRemoveItemToCart":false,"showPopupReminder":false,"numberProductsPopupReminder":1,"showNotificationReminder":false,"minDaysShowPopupReminder":2,"minDaysReShowPopupReminder":2,"showPopupReminderInProductPage":true,"stylesToast":{"backgroundColor":"#ffffff","colorTitle":"#000000","colorMessage":"#000000","colorClose":"#000000"},"stylesReminder":{"backgroundColor":"#ffffff","shadowColor":"#000000","backgroundColorHeader":"#000000","colorHeader":"#ffffff","colorProductTitle":"#000000","backgroundButton":"#000000","colorButton":"#ffffff"}},"eventNotification":{"enable":false,"saleEventProducts":[],"priceEventProducts":[],"inventoryEventProducts":[],"settings":{"useImage":false,"useIcon":false,"useGreeting":false,"requireInteraction":false,"imageType":"default","iconType":"default","imageUpload":null,"iconUpload":null,"quietTime":{"enable":false,"start":"22:00","end":"08:00","timezone":"UTC+0"},"batching":{"enable":false},"saleEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}},"priceEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}},"inventoryEventsSchedule":{"mode":"immediately","delay":0,"cooldown":{"enable":false,"duration":3600}}},"saleOn":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleOff":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleDeeper":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleShallower":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"priceDrop":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"priceRise":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"outStock":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"inStock":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"}}
32680,"productPage":{"insertType":"","buttonPosition":"","insertSelector":"","wishlistButton":{"fullWidth":true,"showLabel":true,"showNumberActivities":false,"icon":{"color":"#FF0000","addedColor":"#ffffff"},"styles":{"borderWidth":"4px","borderColor":"#000000","borderStyle":"inherit","borderRadius":"25px","backgroundColor":"#000000","color":"#ffffff","margin":"10px 0px","padding":"10px"},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenAdded":true,"interval":"20s"}}},"productCard":{"insertType":"manually","buttonPosition":"right_top","childPosition":"last_child","insertSelector":"","wishlistButton":{"fullWidth":false,"showLabel":false,"showNumberActivities":false,"icon":{"color":"#FF0000","addedColor":"#ffffff","backgroundColor":"transparent","addedBackgroundColor":"transparent"},"styles":{"borderWidth":"4px","borderColor":"#000000","borderStyle":"inherit","borderRadius":"25px","backgroundColor":"#000000","color":"#ffffff","margin":"","padding":"10px"},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenAdded":true,"interval":"20s"}}}},"version":"1.0.0","createdAt":"2026-01-29T17:40:09.808Z","updatedAt":"2026-03-09T11:12:31.612Z"},{"id":"41853","storeId":11604,"themeId":"190369366362","settings":{"general":{"pages":{"wishlistDetails":"","shareWishlist":""},"addToCartButtonStyles":{"borderRadius":"25px","backgroundColor":"#000000","color":"#ffffff"},"redirectToPage":false,"afterAddedItemToCartBehavior":"redirect_cart_page","afterAddedItemToCartBehaviorCustomUrl":"","customer":{"allowGuest":true,"useLoginPopup":false,"redirectLoginPage":false,"syncLocalToServer":true,"tagsMode":"all","tags":[]},"allowAddMultipleVariants":false,"icons":{"loading":{"type":"icon_5","custom":null,"color":"#000000"},"add":{"type":"icon_2","custom":null,"color":"#111111","backgroundColor":"transparent","buttonBackgroundColor":"transparent"},"added":{"type":"icon_1","custom":null,"color":"#111111","backgroundColor":"transparent","buttonBackgroundColor":"transparent"}},"sharing":{"socialList":["facebook","twitter","pinterest","email","copy_link"]}},"detailsButton":{"itemsCount":{"show":false,"hideWhenEmpty":true,"color":{"hex":"#fff","alpha":1},"bgColor":{"hex":"#FF0001","alpha":1}},"type":"header_icon","selectorQueries":[],"afterClick":"redirect_to_page","showLabel":true,"styles":{"borderRadius":"25px","backgroundColor":"#000000","color":"#ffffff"},"placement":"bottom_right","icon":{"type":"icon_2","color":"#111111","custom":null},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenEmpty":true,"interval":"20s"},"imageFitType":"cover","otherInfo":{"price":{"styles":{"color":"#111111"}},"vendor":{"show":false,"position":"above_product_title","styles":{"color":"#000000"}},"compareAtPrice":{"show":false,"position":"right_of_price","styles":{"color":"#FF0000"}},"totalPrice":{"show":false,"position":"bottom","styles":{"color":"#000000","fontSize":"20px"}},"formatPrice":{"type":"amount_without_currency"}}},"notificationPopup":{"placement":"left_top","duration":3000,"effect":{"type":""},"hideOnAddRemoveItemToWishlist":false,"hideOnAddRemoveItemToCart":false,"showPopupReminder":false,"numberProductsPopupReminder":1,"showNotificationReminder":false,"minDaysShowPopupReminder":2,"minDaysReShowPopupReminder":2,"showPopupReminderInProductPage":true,"stylesToast":{"backgroundColor":"#ffffff","colorTitle":"#000000","colorMessage":"#000000","colorClose":"#000000"},"stylesReminder":{"backgroundColor":"#ffffff","shadowColor":"#000000","backgroundColorHeader":"#000000","colorHeader":"#ffffff","colorProductTitle":"#000000","backgroundButton":"#000000","colorButton":"#ffffff"}},"eventNotification":{"enable":false,"saleEventProducts":[],"priceEventProducts":[],"inventoryEventProducts":[],"settings":{"useImage":false,"useIcon":false,"useGreeting":false,"requireInteraction":false,"imageType":"default","iconType":"default","imageUpload":null,"iconUpload":null},"saleOn":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleOff":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleDeeper":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"saleShallower":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"priceDrop":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"priceRise":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"outStock":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"},"inStock":{"enable":false,"products":[],"text_color":"#ffffff","background_color":"#000000"}}
32680,"productPage":{"insertType":"extension","buttonPosition":"","insertSelector":"","wishlistButton":{"fullWidth":true,"showLabel":true,"showNumberActivities":false,"icon":{"color":"#111111","addedColor":"#111111"},"styles":{"borderWidth":"1px","borderColor":"#AC9669","borderStyle":"solid","borderRadius":"15px","backgroundColor":"#ffffff","color":"#111111","margin":"","padding":"10px"},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenAdded":true,"interval":"20s"}}},"productCard":{"insertType":"manually","buttonPosition":"right_top","childPosition":"first_child","insertSelector":"","wishlistButton":{"fullWidth":false,"showLabel":false,"showNumberActivities":false,"icon":{"color":"#FF0000","addedColor":"#ffffff","backgroundColor":"transparent","addedBackgroundColor":"transparent"},"styles":{"borderWidth":"4px","borderColor":"#000000","borderStyle":"inherit","borderRadius":"25px","backgroundColor":"#000000","color":"#ffffff","margin":"","padding":"10px"},"animation":{"canUse":false,"enable":false,"type":"animation-sw-shake","disableWhenAdded":true,"interval":"20s"}}}},"version":"1.0.0","createdAt":"2026-01-14T12:32:27.443Z","updatedAt":"2026-03-09T11:12:42.202Z"}], "storeSettings": null, "localesInfo": [{"name":"Afrikaans","locale":"af","version":3},{"name":"Akan","locale":"ak","version":3},{"name":"Amharic","locale":"am","version":3},{"name":"Arabic","locale":"ar","version":3},{"name":"Assamese","locale":"as","version":3},{"name":"Azerbaijani","locale":"az","version":3},{"name":"Belarusian","locale":"be","version":3},{"name":"Bulgarian","locale":"bg","version":3},{"name":"Bambara","locale":"bm","version":3},{"name":"Bangla","locale":"bn","version":3},{"name":"Tibetan","locale":"bo","version":3},{"name":"Breton","locale":"br","version":3},{"name":"Bosnian","locale":"bs","version":3},{"name":"Catalan","locale":"ca","version":3},{"name":"Chechen","locale":"ce","version":3},{"name":"Central Kurdish","locale":"ckb","version":3},{"name":"Czech","locale":"cs","version":3},{"name":"Welsh","locale":"cy","version":3},{"name":"Danish","locale":"da","version":3},{"name":"German","locale":"de","version":3},{"name":"Dzongkha","locale":"dz","version":3},{"name":"Ewe","locale":"ee","version":3},{"name":"Greek","locale":"el","version":3},{"name":"English","locale":"en","version":3},{"name":"Esperanto","locale":"eo","version":3},{"name":"Spanish","locale":"es","version":3},{"name":"Estonian","locale":"et","version":3},{"name":"Basque","locale":"eu","version":3},{"name":"Persian","locale":"fa","version":3},{"name":"Fulah","locale":"ff","version":3},{"name":"Finnish","locale":"fi","version":3},{"name":"Filipino","locale":"fil","version":3},{"name":"Faroese","locale":"fo","version":3},{"name":"French","locale":"fr","version":3},{"name":"Western Frisian","locale":"fy","version":3},{"name":"Irish","locale":"ga","version":3},{"name":"Scottish Gaelic","locale":"gd","version":3},{"name":"Galician","locale":"gl","version":3},{"name":"Gujarati","locale":"gu","version":3},{"name":"Manx","locale":"gv","version":3},{"name":"Hausa","locale":"ha","version":3},{"name":"Hebrew","locale":"he","version":3},{"name":"Hindi","locale":"hi","version":3},{"name":"Croatian","locale":"hr","version":3},{"name":"Hungarian","locale":"hu","version":3},{"name":"Armenian","locale":"hy","version":3},{"name":"Interlingua","locale":"ia","version":3},{"name":"Indonesian","locale":"id","version":3},{"name":"Igbo","locale":"ig","version":3},{"name":"Sichuan Yi","locale":"ii","version":3},{"name":"Icelandic","locale":"is","version":3},{"name":"Italian","locale":"it","version":3},{"name":"Japanese","locale":"ja","version":3},{"name":"Javanese","locale":"jv","version":3},{"name":"Georgian","locale":"ka","version":3},{"name":"Kikuyu","locale":"ki","version":3},{"name":"Kazakh","locale":"kk","version":3},{"name":"Kalaallisut","locale":"kl","version":3},{"name":"Khmer","locale":"km","version":3},{"name":"Kannada","locale":"kn","version":3},{"name":"Korean","locale":"ko","version":3},{"name":"Kashmiri","locale":"ks","version":3},{"name":"Kurdish","locale":"ku","version":3},{"name":"Cornish","locale":"kw","version":3},{"name":"Kyrgyz","locale":"ky","version":3},{"name":"Luxembourgish","locale":"lb","version":3},{"name":"Ganda","locale":"lg","version":3},{"name":"Lingala","locale":"ln","version":3},{"name":"Lao","locale":"lo","version":3},{"name":"Lithuanian","locale":"lt","version":3}
32680,{"name":"Luba-Katanga","locale":"lu","version":3},{"name":"Latvian","locale":"lv","version":3},{"name":"Malagasy","locale":"mg","version":3},{"name":"MÄori","locale":"mi","version":3},{"name":"Macedonian","locale":"mk","version":3},{"name":"Malayalam","locale":"ml","version":3},{"name":"Mongolian","locale":"mn","version":3},{"name":"Marathi","locale":"mr","version":3},{"name":"Malay","locale":"ms","version":3},{"name":"Maltese","locale":"mt","version":3},{"name":"Burmese","locale":"my","version":3},{"name":"Norwegian (BokmÃ¥l)","locale":"nb","version":3},{"name":"North Ndebele","locale":"nd","version":3},{"name":"Nepali","locale":"ne","version":3},{"name":"Dutch","locale":"nl","version":3},{"name":"Norwegian Nynorsk","locale":"nn","version":3},{"name":"Norwegian","locale":"no","version":3},{"name":"Oromo","locale":"om","version":3},{"name":"Odia","locale":"or","version":3},{"name":"Ossetic","locale":"os","version":3},{"name":"Punjabi","locale":"pa","version":3},{"name":"Polish","locale":"pl","version":3},{"name":"Pashto","locale":"ps","version":3},{"name":"Portuguese (Brazil)","locale":"pt-BR","version":3},{"name":"Portuguese (Portugal)","locale":"pt-PT","version":3},{"name":"Quechua","locale":"qu","version":3},{"name":"Romansh","locale":"rm","version":3},{"name":"Rundi","locale":"rn","version":3},{"name":"Romanian","locale":"ro","version":3},{"name":"Russian","locale":"ru","version":3},{"name":"Kinyarwanda","locale":"rw","version":3},{"name":"Sanskrit","locale":"sa","version":3},{"name":"Sardinian","locale":"sc","version":3},{"name":"Sindhi","locale":"sd","version":3},{"name":"Northern Sami","locale":"se","version":3},{"name":"Sango","locale":"sg","version":3},{"name":"Sinhala","locale":"si","version":3},{"name":"Slovak","locale":"sk","version":3},{"name":"Slovenian","locale":"sl","version":3},{"name":"Shona","locale":"sn","version":3},{"name":"Somali","locale":"so","version":3},{"name":"Albanian","locale":"sq","version":3},{"name":"Serbian","locale":"sr","version":3},{"name":"Sundanese","locale":"su","version":3},{"name":"Swedish","locale":"sv","version":3},{"name":"Swahili","locale":"sw","version":3},{"name":"Tamil","locale":"ta","version":3},{"name":"Telugu","locale":"te","version":3},{"name":"Tajik","locale":"tg","version":3},{"name":"Thai","locale":"th","version":3},{"name":"Tigrinya","locale":"ti","version":3},{"name":"Turkmen","locale":"tk","version":3},{"name":"Tongan","locale":"to","version":3},{"name":"Turkish","locale":"tr","version":3},{"name":"Tatar","locale":"tt","version":3},{"name":"Uyghur","locale":"ug","version":3},{"name":"Ukrainian","locale":"uk","version":3},{"name":"Urdu","locale":"ur","version":3},{"name":"Uzbek","locale":"uz","version":3},{"name":"Vietnamese","locale":"vi","version":3},{"name":"Wolof","locale":"wo","version":3},{"name":"Xhosa","locale":"xh","version":3},{"name":"Yiddish","locale":"yi","version":3},{"name":"Yoruba","locale":"yo","version":3},{"name":"Chinese (Simplified)","locale":"zh-CN","version":3},{"name":"Chinese (Traditional)","locale":"zh-TW","version":3},{"name":"Zulu","locale":"zu","version":3}], "plan": { "type": "basic", "st_app_plan": "basic", "isFreePlan": false, "isBasicPlan": true, "isPremiumPlan": false }, "productJSON": null, "strings": { "locale": "en", "version": 3, "isPrimary": true, "accessibility": { "detailsButton": "Open Wishlist Details" }, "shareSocialContent": "Check out some of my favorite things {{link}}", "toast": { "errors": { "requiredLogin": "Please login to continue - \u003ca href='https:\/\/www.tnbl.co.uk\/customer_authentication\/redirect?locale=en\u0026region_country=GB' rel='nofollow' class='st-toast-login-link'\u003eLogin\u003c\/a\u003e", "requiredLoginWithoutLink": null, "noProductsToShare": "No Products to share", "noImageForPinterest": "A product image is required to share on Pinterest", "noWishlistLink": "This item is no longer on your wishlist. Refresh the page if it still appears.", "linkCustomerMismatch": "We couldn't update this wishlist item. Please refresh and try again.", "productNotInCatalog": "This product is no longer available in the store catalog.", "variantLinkMismatch": "This product variant is no longer on your wishlist.", "removeFailed": "Could not remove this item from your wishlist." }, "success": { "add": "Added to Wishlist successfully" }, "productAdded": "Added to Wishlist successfully", "productDeleted": "Deleted from Wishlist successfully", "productAddedCartSuccess": "Added to cart successfully", "productAddedCartFailed": "Failed to add to cart", "loginToKeepAndAccessWishlist": "Log in to keep your wishlist and access it anytime." }, "productCard": { "buttons": { "moreDetails": "More Details", "addToCart": "Add to Cart", "outOfStock": "Out of Stock" } }, "productPage": { "wishlistButton": { "add": "Add to Wishlist", "added": "Added to Wishlist" } }, "likeCount": { "label": "Likes", "tooltip": "[[sw_mb]]count[[sw_me]] shoppers saved this item" }, "guestOptIn": { "title": "Keep these favorites?", "body": "Leave your email so we can save this wishlist for you - and let you know about restocks and price drops.", "emailLabel": "Email", "consentLabel": "Yes, save my email with this wishlist.", "submit": "Save wishlist", "skip": "Not now", "errorEmail"
32680: "Enter a valid email.", "errorConsent": "Please tick the box to continue.", "errorGeneric": "Could not save. Please try again." } } } </script>
32680
32680<script src="https://cdn.shopify.com/extensions/01a11a04-6da5-7ed6-89a8-7dba9a26990f/swishlist-606/assets/st-wishlist-config.js" defer></script>
32680
32680<script> window.SWishlistIconLoaderConfig = { fullIconsScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-icons.js" }; </script>
32680<script> window.SWishlistRuntimeConfig = Object.assign(window.SWishlistRuntimeConfig || {}, {guestOptInScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-guest-opt-in.js" }); </script>
32680<script src="https://cdn.shopify.com/extensions/01a11a04-6da5-7ed6-89a8-7dba9a26990f/swishlist-606/assets/st-wishlist-icons-loader.js" defer></script>
32680<script> window.SWishlistLoaderConfig = { mainScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist.js", sharedScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-shared.js", detailsScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-details.js", productCardScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-product-card.js", sharePageScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-share-page.js", sharePageStylesheetUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st_share_page.min.css", settingsFallbackScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-settings-fallback.js", wishlistDetailsPageScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-details-page.js", customerToken: "", templateName: "index", guestOptInScriptUrl: "https:\/\/cdn.shopify.com\/extensions\/01a11a04-6da5-7ed6-89a8-7dba9a26990f\/swishlist-606\/assets\/st-wishlist-guest-opt-in.js" }; </script>
32680
32680<script src="https://cdn.shopify.com/extensions/01a11a04-6da5-7ed6-89a8-7dba9a26990f/swishlist-606/assets/st-wishlist-loader.js" defer></script>
32680 </div>
32680<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
32680 32681</body> 32682</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.