{"id":3535,"date":"2026-04-29T14:56:46","date_gmt":"2026-04-29T14:56:46","guid":{"rendered":"https:\/\/www.passionnementtennis.com\/?page_id=3535"},"modified":"2026-05-14T15:49:57","modified_gmt":"2026-05-14T15:49:57","slug":"tennis-racket-stringing","status":"publish","type":"page","link":"https:\/\/www.passionnementtennis.com\/fr\/","title":{"rendered":"Tennis Racket Stringing"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"3535\" class=\"elementor elementor-3535\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ce8d850 e-flex e-con-boxed e-con e-parent\" data-id=\"ce8d850\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c2d074c elementor-widget elementor-widget-html\" data-id=\"c2d074c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!--\nSEO title: Tennis Stringing London | Racket Restringing with Online Booking\nMeta description: Professional tennis stringing in London with online booking, clear prices, string advice and convenient E3 drop-off for East London players.\nPrimary keyword: tennis stringing London\nSuggested slug: \/tennis-stringing-london\n-->\n<div id=\"pt-stringing-page\" style=\"font-family:Georgia,'Times New Roman',serif;color:#173629;background:#f7f5ef;\">\n  <style>\n    #pt-stringing-page *{box-sizing:border-box}\n    #pt-stringing-page .pt-wrap{max-width:1180px;margin:0 auto;padding:0 20px}\n    #pt-stringing-page .pt-btn{display:inline-block;padding:14px 24px;border-radius:999px;text-decoration:none;font-weight:700;transition:all .2s ease;margin:6px 8px 6px 0;font-family:Arial,Helvetica,sans-serif}\n    #pt-stringing-page .pt-btn-primary{background:#173629;color:#fff}\n    #pt-stringing-page .pt-btn-secondary{background:#d8b36a;color:#173629}\n    #pt-stringing-page .pt-btn:hover{transform:translateY(-1px);opacity:.95}\n    #pt-stringing-page .pt-hero{background:linear-gradient(135deg,rgba(0,0,0,.68),rgba(12,30,22,.78)),url('https:\/\/newyorktennismagazine.com\/wp-content\/uploads\/2017\/09\/03_1-1024x683.jpg') center\/cover no-repeat;color:#fff;padding:92px 0 78px}\n    #pt-stringing-page h1,#pt-stringing-page h2,#pt-stringing-page h3,#pt-stringing-page h4{margin:0 0 14px;line-height:1.1}\n    #pt-stringing-page h1{font-size:56px;color:#fff!important;text-shadow:0 2px 18px rgba(0,0,0,.6)}\n    #pt-stringing-page h2{font-size:38px}\n    #pt-stringing-page h3{font-size:24px}\n    #pt-stringing-page p{margin:0 0 16px;line-height:1.7;font-family:Arial,Helvetica,sans-serif}\n    #pt-stringing-page .pt-sub{font-size:20px;max-width:820px;color:#fff!important;text-shadow:0 2px 14px rgba(0,0,0,.55)}\n    #pt-stringing-page .pt-section{padding:68px 0}\n    #pt-stringing-page .pt-grid-2{display:grid;grid-template-columns:1.1fr .9fr;gap:28px}\n    #pt-stringing-page .pt-grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}\n    #pt-stringing-page .pt-grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}\n    #pt-stringing-page .pt-card{background:#fff;border:1px solid rgba(23,54,41,.08);border-radius:18px;padding:26px;box-shadow:0 8px 30px rgba(0,0,0,.05)}\n    #pt-stringing-page .pt-dark{background:#173629;color:#fff}\n    #pt-stringing-page .pt-dark *{color:#fff!important}\n    #pt-stringing-page .pt-price-card{text-align:center;padding:28px 20px}\n    #pt-stringing-page .pt-price-card h3{font-size:40px;color:#173629}\n    #pt-stringing-page .pt-highlight{border:2px solid #d8b36a;transform:translateY(-4px)}\n    #pt-stringing-page .pt-badge{display:inline-block;background:#d8b36a;color:#173629;padding:7px 12px;border-radius:999px;font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;font-family:Arial,Helvetica,sans-serif}\n    #pt-stringing-page .pt-list{padding-left:18px;margin:0;font-family:Arial,Helvetica,sans-serif;line-height:1.8}\n    #pt-stringing-page .pt-list li{margin-bottom:6px}\n    #pt-stringing-page .pt-photo{width:100%;height:100%;min-height:320px;object-fit:cover;border-radius:18px;box-shadow:0 10px 30px rgba(0,0,0,.08)}\n    #pt-stringing-page .pt-note{font-family:Arial,Helvetica,sans-serif;background:#efe7d4;border-left:4px solid #d8b36a;padding:16px 18px;border-radius:10px;color:#31443b}\n    #pt-stringing-page .pt-calc label{display:flex;justify-content:space-between;align-items:center;font-family:Arial,Helvetica,sans-serif;font-weight:700;margin:0 0 8px}\n    #pt-stringing-page .pt-calc input[type=range]{width:100%;margin:0 0 20px;accent-color:#173629}\n    #pt-stringing-page .pt-mini-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-top:14px}\n    #pt-stringing-page .pt-stat{background:rgba(255,255,255,.10);border-radius:16px;padding:14px;font-family:Arial,Helvetica,sans-serif}\n    #pt-stringing-page .pt-stat span{display:block;font-size:12px;color:rgba(255,255,255,.82)!important;text-transform:uppercase;letter-spacing:.05em;margin-bottom:4px}\n    #pt-stringing-page .pt-stat strong{font-size:24px;color:#fff!important}\n    #pt-stringing-page table{width:100%;border-collapse:collapse;font-family:Arial,Helvetica,sans-serif}\n    #pt-stringing-page th{background:#173629;color:#fff;padding:14px;text-align:left}\n    #pt-stringing-page td{padding:12px 14px;border-bottom:1px solid #eee}\n    #pt-stringing-page iframe{width:100%;border:0;border-radius:18px;min-height:360px}\n    #pt-stringing-page .pt-links{display:flex;flex-wrap:wrap;gap:10px;font-family:Arial,Helvetica,sans-serif}\n    #pt-stringing-page .pt-links a{background:#fff;color:#173629;text-decoration:none;border:1px solid rgba(23,54,41,.12);border-radius:999px;padding:10px 14px}\n    #pt-stringing-page .pt-cta-band{background:#173629;color:#fff;text-align:center;padding:50px 0}\n    @media(max-width:900px){#pt-stringing-page h1{font-size:38px}#pt-stringing-page h2{font-size:30px}#pt-stringing-page .pt-grid-2,#pt-stringing-page .pt-grid-3,#pt-stringing-page .pt-grid-4{grid-template-columns:1fr}#pt-stringing-page .pt-hero{padding:70px 0 60px}}\n  <\/style>\n\n  <script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"LocalBusiness\",\"name\":\"Passionnement Tennis\",\"description\":\"Professional tennis stringing in London with online booking, clear prices, string advice and convenient E3 drop-off for East London players.\",\"address\":{\"@type\":\"PostalAddress\",\"streetAddress\":\"Distillery Building, 11 Hart Yard\",\"postalCode\":\"E3 2AL\",\"addressLocality\":\"London\",\"addressCountry\":\"GB\"},\"areaServed\":[\"London\",\"East London\",\"Bow\",\"Mile End\",\"Victoria Park\",\"Hackney Wick\",\"Hackney\",\"Stratford\",\"Tower Hamlets\",\"Canary Wharf\"],\"makesOffer\":[{\"@type\":\"Offer\",\"name\":\"Tennis racket stringing with own string\",\"price\":\"20\",\"priceCurrency\":\"GBP\"},{\"@type\":\"Offer\",\"name\":\"Tennis racket stringing with included string\",\"priceSpecification\":{\"@type\":\"PriceSpecification\",\"minPrice\":\"25\",\"maxPrice\":\"40\",\"priceCurrency\":\"GBP\"}}]}<\/script>\n\n  <section class=\"pt-hero\">\n    <div class=\"pt-wrap\">\n      <span class=\"pt-badge\">London Tennis Stringing<\/span>\n      <h1>Tennis Stringing London<\/h1>\n      <p class=\"pt-sub\">Professional London tennis racket stringing for players who want better feel, cleaner contact and a setup that suits how they actually play. Easy E3 drop-off for players across East London, including Bow, Mile End, Victoria Park, Hackney Wick, Hackney, Stratford, Tower Hamlets and Canary Wharf.<\/p>\n      <div style=\"margin-top:24px\">\n        <a class=\"pt-btn pt-btn-secondary\" href=\"#book\">Book a Time for Dropoff<\/a>\n        <a class=\"pt-btn pt-btn-primary\" href=\"https:\/\/wa.me\/447467911129\" target=\"_blank\" rel=\"noopener\">Contact us on WhatsApp<\/a>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\" id=\"book\" style=\"background:#f7f5ef;padding:44px 0 64px;\">\n<div id=\"pt-booking-stepper\" style=\"font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Arial,sans-serif;color:#173629;background:#f7f5ef;\">\n  <style>\n    #pt-booking-stepper * { box-sizing:border-box; }\n    #pt-booking-stepper .ptb-wrap { max-width:1120px; margin:0 auto; padding:24px 16px; }\n    #pt-booking-stepper .ptb-shell { display:grid; grid-template-columns:minmax(0,1fr) 330px; gap:20px; align-items:start; }\n    #pt-booking-stepper .ptb-title { margin:0 0 6px; font-size:34px; line-height:1.08; letter-spacing:0; font-family:Georgia,'Times New Roman',serif; }\n    #pt-booking-stepper .ptb-sub { margin:0 0 22px; color:#4a5d54; line-height:1.55; }\n    #pt-booking-stepper .ptb-step {\n      background:#fff; border:1px solid rgba(23,54,41,.10); border-radius:18px; margin-bottom:12px;\n      box-shadow:0 8px 30px rgba(0,0,0,.045); overflow:hidden;\n    }\n    #pt-booking-stepper .ptb-step-head {\n      width:100%; border:0; background:#fff; color:#173629; display:flex; align-items:center; gap:12px;\n      padding:18px; text-align:left; cursor:pointer;\n    }\n    #pt-booking-stepper .ptb-num {\n      width:34px; height:34px; border-radius:50%; background:#173629; color:#fff; display:flex;\n      align-items:center; justify-content:center; font-weight:800; flex:0 0 auto;\n    }\n    #pt-booking-stepper .ptb-head-main { flex:1; min-width:0; }\n    #pt-booking-stepper .ptb-head-main strong { display:block; font-size:17px; }\n    #pt-booking-stepper .ptb-head-main span { display:block; color:#617168; font-size:13px; margin-top:3px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n    #pt-booking-stepper .ptb-edit { font-weight:800; color:#173629; font-size:13px; }\n    #pt-booking-stepper .ptb-body { padding:0 18px 18px; }\n    #pt-booking-stepper .ptb-step:not(.is-active) .ptb-body { display:none; }\n    #pt-booking-stepper .ptb-step.is-complete:not(.is-active) .ptb-num { background:#d8b36a; color:#173629; }\n    #pt-booking-stepper label { display:block; font-weight:800; font-size:13px; margin:0 0 7px; }\n    #pt-booking-stepper input[type=\"text\"],\n    #pt-booking-stepper input[type=\"tel\"],\n    #pt-booking-stepper input[type=\"date\"],\n    #pt-booking-stepper input[type=\"time\"] {\n      width:100%; border:1px solid rgba(23,54,41,.16); border-radius:12px; padding:13px 12px;\n      font:inherit; background:#fbfaf6; color:#173629; min-height:46px;\n    }\n    #pt-booking-stepper input[type=\"range\"] { width:100%; accent-color:#173629; }\n    #pt-booking-stepper .ptb-fields { display:grid; grid-template-columns:1fr 1fr; gap:12px; }\n    #pt-booking-stepper .ptb-options { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; }\n    #pt-booking-stepper .ptb-option {\n      border:1px solid rgba(23,54,41,.14); background:#fbfaf6; border-radius:16px; padding:14px;\n      cursor:pointer; min-height:92px; display:flex; gap:12px; align-items:flex-start; position:relative;\n    }\n    #pt-booking-stepper .ptb-option input { position:absolute; opacity:0; pointer-events:none; }\n    #pt-booking-stepper .ptb-option.is-selected { border-color:#d8b36a; box-shadow:0 0 0 2px rgba(216,179,106,.26); background:#fff; }\n    #pt-booking-stepper .ptb-option-main { flex:1; min-width:0; }\n    #pt-booking-stepper .ptb-option strong { display:block; font-size:15px; }\n    #pt-booking-stepper .ptb-option small { display:block; margin-top:4px; color:#617168; line-height:1.35; }\n    #pt-booking-stepper .ptb-price { font-weight:900; white-space:nowrap; color:#173629; }\n    #pt-booking-stepper .ptb-pack {\n      width:44px; height:58px; border-radius:9px; flex:0 0 auto; box-shadow:inset 0 0 0 1px rgba(255,255,255,.28), 0 7px 16px rgba(0,0,0,.12);\n      display:flex; align-items:center; justify-content:center; color:#fff; font-size:10px; font-weight:900; text-align:center; padding:4px; line-height:1.05;\n    }\n    #pt-booking-stepper .ptb-pack.light { color:#173629; }\n    #pt-booking-stepper .ptb-string-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; max-height:520px; overflow:auto; padding-right:3px; }\n    #pt-booking-stepper .ptb-slider-box { background:#fbfaf6; border:1px solid rgba(23,54,41,.10); border-radius:16px; padding:14px; margin-bottom:12px; }\n    #pt-booking-stepper .ptb-slider-row { display:flex; justify-content:space-between; align-items:center; gap:12px; margin-bottom:8px; }\n    #pt-booking-stepper .ptb-slider-row strong { font-size:22px; }\n    #pt-booking-stepper .ptb-actions { display:flex; justify-content:flex-end; gap:10px; margin-top:16px; flex-wrap:wrap; }\n    #pt-booking-stepper .ptb-btn {\n      border:0; border-radius:999px; padding:13px 18px; font-weight:900; cursor:pointer; font:inherit;\n      min-height:46px; text-decoration:none; display:inline-flex; align-items:center; justify-content:center;\n    }\n    #pt-booking-stepper .ptb-btn-primary { background:#173629; color:#fff; }\n    #pt-booking-stepper .ptb-btn-secondary { background:#d8b36a; color:#173629; }\n    #pt-booking-stepper .ptb-btn-plain { background:#efe7d4; color:#173629; }\n    #pt-booking-stepper .ptb-summary {\n      position:sticky; top:14px; background:#173629; color:#fff; border-radius:20px; padding:18px;\n      box-shadow:0 12px 36px rgba(0,0,0,.12);\n    }\n    #pt-booking-stepper .ptb-summary h3 { margin:0 0 12px; font-size:18px; color:#fff; }\n    #pt-booking-stepper .ptb-total { font-size:42px; font-weight:950; line-height:1; margin:0 0 12px; color:#fff; }\n    #pt-booking-stepper .ptb-line { display:flex; justify-content:space-between; gap:12px; padding:9px 0; border-top:1px solid rgba(255,255,255,.14); font-size:14px; }\n    #pt-booking-stepper .ptb-line span:first-child { color:rgba(255,255,255,.78); }\n    #pt-booking-stepper .ptb-note { margin:12px 0 0; color:rgba(255,255,255,.78); font-size:13px; line-height:1.45; }\n    #pt-booking-stepper .ptb-review {\n      background:#fbfaf6; border:1px solid rgba(23,54,41,.10); border-radius:16px; padding:14px; line-height:1.55;\n    }\n    #pt-booking-stepper .ptb-success {\n      display:none; background:#173629; color:#fff; border-radius:18px; padding:18px; margin-top:14px;\n    }\n    #pt-booking-stepper .ptb-success h3 { margin:0 0 8px; color:#fff; }\n    #pt-booking-stepper .ptb-success p { color:rgba(255,255,255,.86); }\n    #pt-booking-stepper .ptb-error { display:none; color:#9a2a1f; font-weight:800; margin-top:10px; }\n    #pt-booking-stepper .ptb-send-note { display:none; margin:10px 0 0; color:#617168; font-weight:800; font-size:13px; }\n    @media (max-width: 920px) {\n      #pt-booking-stepper .ptb-shell { grid-template-columns:1fr; }\n      #pt-booking-stepper .ptb-summary { position:sticky; top:0; z-index:5; border-radius:0 0 20px 20px; margin:-24px -16px 18px; }\n      #pt-booking-stepper .ptb-fields, #pt-booking-stepper .ptb-options, #pt-booking-stepper .ptb-string-grid { grid-template-columns:1fr; }\n      #pt-booking-stepper .ptb-title { font-size:28px; }\n      #pt-booking-stepper .ptb-total { font-size:36px; }\n    }\n  <\/style>\n\n  <div class=\"ptb-wrap\">\n    <h2 class=\"ptb-title\">Book Tennis Racket Stringing<\/h2>\n    <p class=\"ptb-sub\">Choose your drop-off, string, tension and turnaround. The price updates as you build your setup.<\/p>\n\n    <div class=\"ptb-shell\">\n      <div class=\"ptb-flow\">\n        <section class=\"ptb-step is-active\" data-step=\"1\">\n          <button class=\"ptb-step-head\" type=\"button\" data-open-step=\"1\">\n            <span class=\"ptb-num\">1<\/span>\n            <span class=\"ptb-head-main\"><strong>Drop-off date and time<\/strong><span data-summary=\"dropoff\">Choose a drop-off slot<\/span><\/span>\n            <span class=\"ptb-edit\">Edit<\/span>\n          <\/button>\n          <div class=\"ptb-body\">\n            <div class=\"ptb-fields\">\n              <div>\n                <label for=\"ptb-date\">Drop-off date<\/label>\n                <input id=\"ptb-date\" type=\"date\" required>\n              <\/div>\n              <div>\n                <label for=\"ptb-time\">Drop-off time<\/label>\n                <input id=\"ptb-time\" type=\"time\" value=\"18:00\" required>\n              <\/div>\n            <\/div>\n            <div class=\"ptb-actions\"><button class=\"ptb-btn ptb-btn-primary\" type=\"button\" data-next=\"2\">Continue<\/button><\/div>\n          <\/div>\n        <\/section>\n\n        <section class=\"ptb-step\" data-step=\"2\">\n          <button class=\"ptb-step-head\" type=\"button\" data-open-step=\"2\">\n            <span class=\"ptb-num\">2<\/span>\n            <span class=\"ptb-head-main\"><strong>Choose string<\/strong><span data-summary=\"string\">Bring your own string or choose from stock<\/span><\/span>\n            <span class=\"ptb-edit\">Edit<\/span>\n          <\/button>\n          <div class=\"ptb-body\">\n            <div class=\"ptb-string-grid\" id=\"ptb-string-options\"><\/div>\n            <div class=\"ptb-actions\">\n              <button class=\"ptb-btn ptb-btn-plain\" type=\"button\" data-next=\"1\">Back<\/button>\n              <button class=\"ptb-btn ptb-btn-primary\" type=\"button\" data-next=\"3\">Continue<\/button>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section class=\"ptb-step\" data-step=\"3\">\n          <button class=\"ptb-step-head\" type=\"button\" data-open-step=\"3\">\n            <span class=\"ptb-num\">3<\/span>\n            <span class=\"ptb-head-main\"><strong>Choose tension<\/strong><span data-summary=\"tension\">Mains 52 lbs \/ crosses 52 lbs<\/span><\/span>\n            <span class=\"ptb-edit\">Edit<\/span>\n          <\/button>\n          <div class=\"ptb-body\">\n            <div class=\"ptb-slider-box\">\n              <div class=\"ptb-slider-row\"><label for=\"ptb-mains\">Mains tension<\/label><strong><span id=\"ptb-mains-val\">52<\/span> lbs<\/strong><\/div>\n              <input id=\"ptb-mains\" type=\"range\" min=\"40\" max=\"65\" value=\"52\">\n            <\/div>\n            <div class=\"ptb-slider-box\">\n              <div class=\"ptb-slider-row\"><label for=\"ptb-crosses\">Crosses tension<\/label><strong><span id=\"ptb-crosses-val\">52<\/span> lbs<\/strong><\/div>\n              <input id=\"ptb-crosses\" type=\"range\" min=\"40\" max=\"65\" value=\"52\">\n            <\/div>\n            <div class=\"ptb-actions\">\n              <button class=\"ptb-btn ptb-btn-plain\" type=\"button\" data-next=\"2\">Back<\/button>\n              <button class=\"ptb-btn ptb-btn-primary\" type=\"button\" data-next=\"4\">Continue<\/button>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section class=\"ptb-step\" data-step=\"4\">\n          <button class=\"ptb-step-head\" type=\"button\" data-open-step=\"4\">\n            <span class=\"ptb-num\">4<\/span>\n            <span class=\"ptb-head-main\"><strong>Collection speed<\/strong><span data-summary=\"speed\">Standard collection within 7 days<\/span><\/span>\n            <span class=\"ptb-edit\">Edit<\/span>\n          <\/button>\n          <div class=\"ptb-body\">\n            <div class=\"ptb-options\" id=\"ptb-speed-options\">\n              <label class=\"ptb-option\"><input type=\"radio\" name=\"speed\" value=\"standard\" data-label=\"Standard\" data-days=\"7\" data-price=\"0\" checked><span class=\"ptb-option-main\"><strong>Standard<\/strong><small>Ready within 7 days<\/small><\/span><span class=\"ptb-price\">+\u00a30<\/span><\/label>\n              <label class=\"ptb-option\"><input type=\"radio\" name=\"speed\" value=\"fast\" data-label=\"Fast\" data-days=\"4\" data-price=\"2\"><span class=\"ptb-option-main\"><strong>Fast<\/strong><small>Ready within 4 days<\/small><\/span><span class=\"ptb-price\">+\u00a32<\/span><\/label>\n              <label class=\"ptb-option\"><input type=\"radio\" name=\"speed\" value=\"urgent\" data-label=\"Urgent\" data-days=\"1\" data-price=\"6\"><span class=\"ptb-option-main\"><strong>Urgent<\/strong><small>Ready within 24 hours<\/small><\/span><span class=\"ptb-price\">+\u00a36<\/span><\/label>\n            <\/div>\n            <div class=\"ptb-actions\">\n              <button class=\"ptb-btn ptb-btn-plain\" type=\"button\" data-next=\"3\">Back<\/button>\n              <button class=\"ptb-btn ptb-btn-primary\" type=\"button\" data-next=\"5\">Continue<\/button>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section class=\"ptb-step\" data-step=\"5\">\n          <button class=\"ptb-step-head\" type=\"button\" data-open-step=\"5\">\n            <span class=\"ptb-num\">5<\/span>\n            <span class=\"ptb-head-main\"><strong>Additional services<\/strong><span data-summary=\"addons\">No extras selected<\/span><\/span>\n            <span class=\"ptb-edit\">Edit<\/span>\n          <\/button>\n          <div class=\"ptb-body\">\n            <div class=\"ptb-options\">\n              <label class=\"ptb-option\"><input type=\"checkbox\" name=\"addon\" value=\"overgrip\" data-label=\"Overgrip\" data-price=\"3\"><span class=\"ptb-option-main\"><strong>Overgrip<\/strong><small>Fresh overgrip fitted before collection<\/small><\/span><span class=\"ptb-price\">+\u00a33<\/span><\/label>\n              <label class=\"ptb-option\"><input type=\"checkbox\" name=\"addon\" value=\"dampener\" data-label=\"Dampener\" data-price=\"2\"><span class=\"ptb-option-main\"><strong>Dampener<\/strong><small>Add a vibration dampener<\/small><\/span><span class=\"ptb-price\">+\u00a32<\/span><\/label>\n            <\/div>\n            <div class=\"ptb-actions\">\n              <button class=\"ptb-btn ptb-btn-plain\" type=\"button\" data-next=\"4\">Back<\/button>\n              <button class=\"ptb-btn ptb-btn-primary\" type=\"button\" data-next=\"6\">Continue<\/button>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section class=\"ptb-step\" data-step=\"6\">\n          <button class=\"ptb-step-head\" type=\"button\" data-open-step=\"6\">\n            <span class=\"ptb-num\">6<\/span>\n            <span class=\"ptb-head-main\"><strong>Your details<\/strong><span data-summary=\"details\">Name and phone number required<\/span><\/span>\n            <span class=\"ptb-edit\">Edit<\/span>\n          <\/button>\n          <div class=\"ptb-body\">\n            <div class=\"ptb-fields\">\n              <div>\n                <label for=\"ptb-name\">Name<\/label>\n                <input id=\"ptb-name\" type=\"text\" autocomplete=\"name\" required>\n              <\/div>\n              <div>\n                <label for=\"ptb-phone\">Phone number<\/label>\n                <input id=\"ptb-phone\" type=\"tel\" autocomplete=\"tel\" required>\n              <\/div>\n            <\/div>\n            <div class=\"ptb-error\" id=\"ptb-details-error\">Please enter your name and phone number.<\/div>\n            <div class=\"ptb-actions\">\n              <button class=\"ptb-btn ptb-btn-plain\" type=\"button\" data-next=\"5\">Back<\/button>\n              <button class=\"ptb-btn ptb-btn-primary\" type=\"button\" data-next=\"7\">Review<\/button>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section class=\"ptb-step\" data-step=\"7\">\n          <button class=\"ptb-step-head\" type=\"button\" data-open-step=\"7\">\n            <span class=\"ptb-num\">7<\/span>\n            <span class=\"ptb-head-main\"><strong>Review and confirm<\/strong><span data-summary=\"review\">Check everything before confirming<\/span><\/span>\n            <span class=\"ptb-edit\">Edit<\/span>\n          <\/button>\n          <div class=\"ptb-body\">\n            <div class=\"ptb-review\" id=\"ptb-review\"><\/div>\n            <div class=\"ptb-actions\">\n              <button class=\"ptb-btn ptb-btn-plain\" type=\"button\" data-next=\"6\">Back<\/button>\n              <button class=\"ptb-btn ptb-btn-secondary\" type=\"button\" id=\"ptb-confirm\">Confirm request<\/button>\n            <\/div>\n            <div class=\"ptb-send-note\" id=\"ptb-send-note\">Sending request...<\/div>\n            <div class=\"ptb-success\" id=\"ptb-success\">\n              <h3>Request received<\/h3>\n              <p>We will reach out to confirm your drop-off and collection. You can also message us directly on WhatsApp.<\/p>\n              <a class=\"ptb-btn ptb-btn-secondary\" id=\"ptb-whatsapp\" href=\"https:\/\/wa.me\/447467911129\" target=\"_blank\" rel=\"noopener\">Message on WhatsApp<\/a>\n            <\/div>\n          <\/div>\n        <\/section>\n      <\/div>\n\n      <aside class=\"ptb-summary\">\n        <h3>Current total<\/h3>\n        <div class=\"ptb-total\" id=\"ptb-total\">\u00a320<\/div>\n        <div class=\"ptb-line\"><span>Base stringing<\/span><strong>\u00a320<\/strong><\/div>\n        <div class=\"ptb-line\"><span id=\"ptb-string-label\">String<\/span><strong id=\"ptb-string-price\">+\u00a30<\/strong><\/div>\n        <div class=\"ptb-line\"><span id=\"ptb-speed-label\">Turnaround<\/span><strong id=\"ptb-speed-price\">+\u00a30<\/strong><\/div>\n        <div class=\"ptb-line\"><span id=\"ptb-addon-label\">Extras<\/span><strong id=\"ptb-addon-price\">+\u00a30<\/strong><\/div>\n        <p class=\"ptb-note\" id=\"ptb-collection-note\">Standard collection is within 7 days.<\/p>\n      <\/aside>\n    <\/div>\n  <\/div>\n\n  <script>\n    (function(){\n      const webhookUrl = 'https:\/\/hooks.zapier.com\/hooks\/catch\/2101830\/4ye4ugf\/';\n      const basePrice = 20;\n      const strings = [\n        {name:\"Bring own string\", tier:\"Own string\", gauge:\"\", colour:\"\", type:\"\", profile:\"Use your own set\", price:0, swatch:\"linear-gradient(135deg,#f7f5ef,#e4ddcb)\", light:true},\n        {name:\"Solinco Confidential\", tier:\"Tier 1\", gauge:\"16\", colour:\"Grey\", type:\"Co-polyester\", profile:\"Control poly\", price:20, swatch:\"linear-gradient(135deg,#3e4447,#aeb4b8)\"},\n        {name:\"Babolat RPM Blast Rough\", tier:\"Tier 1\", gauge:\"17\", colour:\"Grey\", type:\"Textured co-polyester\", profile:\"Rough spin poly\", price:20, swatch:\"linear-gradient(135deg,#555,#b7b7b7)\"},\n        {name:\"Babolat RPM Blast\", tier:\"Tier 1\", gauge:\"17\", colour:\"Black\", type:\"Co-polyester\", profile:\"Shaped spin poly\", price:20, swatch:\"linear-gradient(135deg,#050505,#4b4b4b)\"},\n        {name:\"Luxilon ALU Power\", tier:\"Tier 1\", gauge:\"17\", colour:\"Grey\", type:\"Co-polyester\", profile:\"Premium control poly\", price:20, swatch:\"linear-gradient(135deg,#c8c8c8,#111)\"},\n        {name:\"Solinco Hyper-G\", tier:\"Tier 1\", gauge:\"17\", colour:\"Green\", type:\"Shaped co-polyester\", profile:\"Spin\/control poly\", price:20, swatch:\"linear-gradient(135deg,#78c850,#1f7a3a)\"},\n        {name:\"Luxilon Element\", tier:\"Tier 1\", gauge:\"17\", colour:\"Bronze\", type:\"Soft co-polyester\", profile:\"Comfort poly\", price:20, swatch:\"linear-gradient(135deg,#b57a42,#f2c27b)\"},\n        {name:\"Luxilon 4G\", tier:\"Tier 1\", gauge:\"17\", colour:\"Yellow\", type:\"Co-polyester\", profile:\"Tension stability poly\", price:20, swatch:\"linear-gradient(135deg,#f3df38,#837319)\", light:true},\n        {name:\"Yonex Poly Tour Fire\", tier:\"Tier 2\", gauge:\"17\", colour:\"Red\", type:\"Co-polyester\", profile:\"Round performance poly\", price:10, swatch:\"linear-gradient(135deg,#d71920,#7a0b0e)\"},\n        {name:\"TRU PRO Ghost Wire\", tier:\"Tier 2\", gauge:\"18\", colour:\"White\", type:\"Co-polyester\", profile:\"Round soft poly\", price:10, swatch:\"linear-gradient(135deg,#fff,#dadde2)\", light:true},\n        {name:\"Head Lynx Tour\", tier:\"Tier 2\", gauge:\"17\", colour:\"Black\", type:\"Co-polyester\", profile:\"Shaped poly\", price:10, swatch:\"linear-gradient(135deg,#111,#3d3d3d)\"},\n        {name:\"Wilson Revolve\", tier:\"Tier 2\", gauge:\"16\", colour:\"Black\/Grey\", type:\"Co-polyester\", profile:\"Spin poly\", price:10, swatch:\"linear-gradient(135deg,#111,#8f98a0)\"},\n        {name:\"Solinco Mach 10\", tier:\"Tier 2\", gauge:\"18\", colour:\"Blue\", type:\"Co-polyester\", profile:\"Modern spin\/control poly\", price:10, swatch:\"linear-gradient(135deg,#0d5bd7,#0a2f77)\"},\n        {name:\"Dunlop Explosive Speed\", tier:\"Tier 2\", gauge:\"16\", colour:\"Black\", type:\"Co-polyester\", profile:\"Power\/control poly\", price:10, swatch:\"linear-gradient(135deg,#050505,#3c3c3c)\"},\n        {name:\"Gamma Ocho\", tier:\"Tier 2\", gauge:\"16\", colour:\"White\", type:\"Co-polyester\", profile:\"Shaped poly\", price:10, swatch:\"linear-gradient(135deg,#fff,#d9d9d9)\", light:true},\n        {name:\"Wilson Sensation Plus\", tier:\"Tier 3\", gauge:\"17\", colour:\"Black\", type:\"Multifilament\", profile:\"Comfort string\", price:5, swatch:\"linear-gradient(135deg,#111,#535b66)\"},\n        {name:\"Babolat Synthetic Gut\", tier:\"Tier 3\", gauge:\"16\", colour:\"Clear\/White\", type:\"Synthetic gut\", profile:\"Value all-round string\", price:5, swatch:\"linear-gradient(135deg,#fff,#e6e1d7)\", light:true}\n      ];\n\n      const root = document.getElementById('pt-booking-stepper');\n      const stringWrap = root.querySelector('#ptb-string-options');\n      const currency = value => '\u00a3' + value;\n\n      strings.forEach((item, index) => {\n        const id = 'ptb-string-' + index;\n        const label = document.createElement('label');\n        label.className = 'ptb-option';\n        label.innerHTML = '<input type=\"radio\" name=\"string\" id=\"' + id + '\" value=\"' + index + '\" ' + (index === 0 ? 'checked' : '') + '>' +\n          '<span class=\"ptb-pack ' + (item.light ? 'light' : '') + '\" style=\"background:' + item.swatch + '\">' + (item.tier === 'Own string' ? 'OWN' : item.name.split(' ')[0]) + '<\/span>' +\n          '<span class=\"ptb-option-main\"><strong>' + item.name + '<\/strong><small>' + item.tier + (item.gauge ? ' \u00b7 ' + item.gauge + 'g \u00b7 ' + item.profile : ' \u00b7 no string charge') + '<\/small><\/span>' +\n          '<span class=\"ptb-price\">+' + currency(item.price) + '<\/span>';\n        stringWrap.appendChild(label);\n      });\n\n      const state = {\n        step: 1,\n        stringIndex: 0,\n        mains: 52,\n        crosses: 52,\n        speed: 'standard',\n        addons: [],\n        name: '',\n        phone: ''\n      };\n\n      const els = {\n        total: root.querySelector('#ptb-total'),\n        stringLabel: root.querySelector('#ptb-string-label'),\n        stringPrice: root.querySelector('#ptb-string-price'),\n        speedLabel: root.querySelector('#ptb-speed-label'),\n        speedPrice: root.querySelector('#ptb-speed-price'),\n        addonLabel: root.querySelector('#ptb-addon-label'),\n        addonPrice: root.querySelector('#ptb-addon-price'),\n        collectionNote: root.querySelector('#ptb-collection-note'),\n        date: root.querySelector('#ptb-date'),\n        time: root.querySelector('#ptb-time'),\n        mains: root.querySelector('#ptb-mains'),\n        crosses: root.querySelector('#ptb-crosses'),\n        mainsVal: root.querySelector('#ptb-mains-val'),\n        crossesVal: root.querySelector('#ptb-crosses-val'),\n        name: root.querySelector('#ptb-name'),\n        phone: root.querySelector('#ptb-phone'),\n        review: root.querySelector('#ptb-review'),\n        error: root.querySelector('#ptb-details-error'),\n        success: root.querySelector('#ptb-success'),\n        whatsapp: root.querySelector('#ptb-whatsapp'),\n        sendNote: root.querySelector('#ptb-send-note'),\n        confirm: root.querySelector('#ptb-confirm')\n      };\n\n      const tomorrow = new Date();\n      tomorrow.setDate(tomorrow.getDate() + 1);\n      const yyyyMmDd = date => date.toISOString().slice(0, 10);\n      els.date.min = yyyyMmDd(new Date());\n      els.date.value = yyyyMmDd(tomorrow);\n\n      function selectedString(){ return strings[Number(root.querySelector('input[name=\"string\"]:checked').value)]; }\n      function selectedSpeed(){ return root.querySelector('input[name=\"speed\"]:checked'); }\n      function selectedAddons(){ return Array.from(root.querySelectorAll('input[name=\"addon\"]:checked')); }\n      function totalPrice(){\n        const speed = selectedSpeed();\n        return basePrice + selectedString().price + Number(speed.dataset.price) + selectedAddons().reduce((sum, item) => sum + Number(item.dataset.price), 0);\n      }\n      function collectionDateText(){\n        const speed = selectedSpeed();\n        const date = els.date.value ? new Date(els.date.value + 'T12:00:00') : new Date();\n        date.setDate(date.getDate() + Number(speed.dataset.days));\n        return date.toLocaleDateString('en-GB', { weekday:'short', day:'numeric', month:'short' });\n      }\n      function markSelected(){\n        root.querySelectorAll('.ptb-option').forEach(option => {\n          const input = option.querySelector('input');\n          option.classList.toggle('is-selected', input.checked);\n        });\n      }\n      function setStep(step){\n        state.step = Number(step);\n        root.querySelectorAll('.ptb-step').forEach(card => {\n          const cardStep = Number(card.dataset.step);\n          card.classList.toggle('is-active', cardStep === state.step);\n          card.classList.toggle('is-complete', cardStep < state.step);\n        });\n        update();\n      }\n      function validateDetails(){\n        state.name = els.name.value.trim();\n        state.phone = els.phone.value.trim();\n        const ok = Boolean(state.name && state.phone);\n        els.error.style.display = ok ? 'none' : 'block';\n        return ok;\n      }\n      function updateReview(){\n        const string = selectedString();\n        const speed = selectedSpeed();\n        const addons = selectedAddons();\n        const addonText = addons.length ? addons.map(item => item.dataset.label).join(', ') : 'None';\n        const lines = [\n          '<strong>Drop-off:<\/strong> ' + (els.date.value || 'Not selected') + ' at ' + (els.time.value || 'Not selected'),\n          '<strong>String:<\/strong> ' + string.name + ' (' + string.tier + ')',\n          '<strong>Tension:<\/strong> mains ' + els.mains.value + ' lbs \/ crosses ' + els.crosses.value + ' lbs',\n          '<strong>Turnaround:<\/strong> ' + speed.dataset.label + ' \u00b7 estimated collection ' + collectionDateText(),\n          '<strong>Extras:<\/strong> ' + addonText,\n          '<strong>Name:<\/strong> ' + (els.name.value || '-'),\n          '<strong>Phone:<\/strong> ' + (els.phone.value || '-'),\n          '<strong>Total:<\/strong> ' + currency(totalPrice())\n        ];\n        els.review.innerHTML = lines.join('<br>');\n        const message = 'Tennis stringing request\\n' + lines.map(line => line.replace(\/<[^>]+>\/g, '')).join('\\n');\n        els.whatsapp.href = 'https:\/\/wa.me\/447467911129?text=' + encodeURIComponent(message);\n      }\n      function bookingPayload(){\n        const string = selectedString();\n        const speed = selectedSpeed();\n        const addons = selectedAddons();\n        return {\n          source: 'tennis-stringing-stepper-form',\n          submitted_at: new Date().toISOString(),\n          name: els.name.value.trim(),\n          phone: els.phone.value.trim(),\n          dropoff_date: els.date.value,\n          dropoff_time: els.time.value,\n          string_name: string.name,\n          string_tier: string.tier,\n          string_gauge: string.gauge,\n          string_colour: string.colour,\n          string_type: string.type,\n          string_price_addon: string.price,\n          mains_tension_lbs: Number(els.mains.value),\n          crosses_tension_lbs: Number(els.crosses.value),\n          turnaround: speed.dataset.label,\n          turnaround_days: Number(speed.dataset.days),\n          turnaround_price_addon: Number(speed.dataset.price),\n          estimated_collection: collectionDateText(),\n          addons: addons.map(item => ({\n            name: item.dataset.label,\n            price: Number(item.dataset.price)\n          })),\n          addons_total: addons.reduce((sum, item) => sum + Number(item.dataset.price), 0),\n          base_price: basePrice,\n          total_price: totalPrice()\n        };\n      }\n      function bookingFormData(){\n        const payload = bookingPayload();\n        const formData = new FormData();\n        Object.keys(payload).forEach(key => {\n          const value = payload[key];\n          formData.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n        });\n        return formData;\n      }\n      function update(){\n        const string = selectedString();\n        const speed = selectedSpeed();\n        const addons = selectedAddons();\n        const addonTotal = addons.reduce((sum, item) => sum + Number(item.dataset.price), 0);\n        const addonLabels = addons.map(item => item.dataset.label);\n        els.mainsVal.textContent = els.mains.value;\n        els.crossesVal.textContent = els.crosses.value;\n        els.total.textContent = currency(totalPrice());\n        els.stringLabel.textContent = string.name;\n        els.stringPrice.textContent = '+' + currency(string.price);\n        els.speedLabel.textContent = speed.dataset.label + ' turnaround';\n        els.speedPrice.textContent = '+' + currency(Number(speed.dataset.price));\n        els.addonLabel.textContent = addonLabels.length ? addonLabels.join(', ') : 'Extras';\n        els.addonPrice.textContent = '+' + currency(addonTotal);\n        els.collectionNote.textContent = speed.dataset.label + ' collection estimate: ' + collectionDateText() + '.';\n        root.querySelector('[data-summary=\"dropoff\"]').textContent = (els.date.value || 'Choose date') + ' at ' + (els.time.value || 'choose time') + ' \u00b7 base \u00a320';\n        root.querySelector('[data-summary=\"string\"]').textContent = string.name + ' \u00b7 ' + (string.price ? '+' + currency(string.price) : 'no string charge');\n        root.querySelector('[data-summary=\"tension\"]').textContent = 'Mains ' + els.mains.value + ' lbs \/ crosses ' + els.crosses.value + ' lbs';\n        root.querySelector('[data-summary=\"speed\"]').textContent = speed.dataset.label + ' \u00b7 collection estimate ' + collectionDateText();\n        root.querySelector('[data-summary=\"addons\"]').textContent = addonLabels.length ? addonLabels.join(', ') : 'No extras selected';\n        root.querySelector('[data-summary=\"details\"]').textContent = els.name.value && els.phone.value ? els.name.value + ' \u00b7 ' + els.phone.value : 'Name and phone number required';\n        updateReview();\n        markSelected();\n      }\n\n      root.addEventListener('click', event => {\n        const open = event.target.closest('[data-open-step]');\n        const next = event.target.closest('[data-next]');\n        if (open) setStep(open.dataset.openStep);\n        if (next) {\n          if (next.dataset.next === '7' && !validateDetails()) return;\n          setStep(next.dataset.next);\n        }\n      });\n      root.addEventListener('input', update);\n      root.addEventListener('change', update);\n      root.querySelector('#ptb-confirm').addEventListener('click', async () => {\n        if (!validateDetails()) {\n          setStep(6);\n          return;\n        }\n        updateReview();\n        els.confirm.disabled = true;\n        els.confirm.textContent = 'Sending...';\n        els.sendNote.style.display = 'block';\n        try {\n          await fetch(webhookUrl, {\n            method: 'POST',\n            mode: 'no-cors',\n            body: bookingFormData()\n          });\n          els.sendNote.textContent = 'Request sent.';\n        } catch (error) {\n          els.sendNote.textContent = 'Could not send automatically. Please message us on WhatsApp.';\n        }\n        els.success.style.display = 'block';\n        els.confirm.style.display = 'none';\n      });\n      update();\n    })();\n  <\/script>\n<\/div>\n\n  <\/section>\n\n  <section class=\"pt-section\">\n    <div class=\"pt-wrap\">\n      <div class=\"pt-grid-2\">\n        <div>\n          <h2>Tennis racket stringing for London players.<\/h2>\n          <p>If you play tennis in London, getting a racket restrung should be quick, clear and easy to organise. This page is for players who want professional tennis stringing, online booking and practical help choosing the right string and tension.<\/p>\n          <p>Passionnement Tennis offers a simple local drop-off and a sharper, more predictable racket feel. We can restring with your own string or help you choose from popular polyester, multifilament and synthetic gut options.<\/p>\n          <p>Players across London usually come to us for more spin, a softer arm-friendly feel, better durability or a tighter match-day setup. The aim is simple: a racket that feels reliable again.<\/p>\n          <div class=\"pt-note\"><strong>Drop-off:<\/strong> Distillery Building, 11 Hart Yard, E3 2AL, London, convenient for Bow, Mile End, Victoria Park, Hackney Wick, Hackney, Stratford, Tower Hamlets and Canary Wharf.<\/div>\n          <div style=\"margin-top:22px\">\n            <a class=\"pt-btn pt-btn-secondary\" href=\"#book\">Book a Time for Dropoff<\/a>\n            <a class=\"pt-btn pt-btn-primary\" href=\"https:\/\/wa.me\/447467911129\" target=\"_blank\" rel=\"noopener\">Contact us on WhatsApp<\/a>\n          <\/div>\n        <\/div>\n        <div><img decoding=\"async\" class=\"pt-photo\" src=\"https:\/\/i.ytimg.com\/vi\/_5E5OaDWsoA\/hq720.jpg?sqp=-oaymwE7CK4FEIIDSFryq4qpAy0IARUAAAAAGAElAADIQj0AgKJD8AEB-AH-CYAC0AWKAgwIABABGGUgWyhPMA8=&rs=AOn4CLCX3kw4v-WyI2sBrUVTPT4auAOcGg\" alt=\"tennis stringing London at Passionnement Tennis\"><\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\" style=\"background:#fbfaf6\">\n    <div class=\"pt-wrap\">\n      <div class=\"pt-grid-3\">\n        <div class=\"pt-card\"><span class=\"pt-badge\">Convenient<\/span><h3>Easy E3 drop-off<\/h3><p>Drop off your racket near E3 and collect once the restring is complete. 24-hour turnaround is available when capacity allows.<\/p><\/div>\n        <div class=\"pt-card\"><span class=\"pt-badge\">Advice<\/span><h3>String and tension help<\/h3><p>Tell us how you play and what you want to improve. We will suggest a sensible string and starting tension.<\/p><\/div>\n        <div class=\"pt-card\"><span class=\"pt-badge\">Clear pricing<\/span><h3>No confusing extras<\/h3><p>Bring your own string from \u00a320, or choose an included string tier from \u00a325 to \u00a340.<\/p><\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\">\n    <div class=\"pt-wrap\">\n      <div style=\"text-align:center;margin-bottom:32px\">\n        <span class=\"pt-badge\">Pricing<\/span>\n        <h2>London tennis stringing prices<\/h2>\n        <p>Simple pricing for tennis stringing in London, with online booking and E3 drop-off.<\/p>\n      <\/div>\n      <div class=\"pt-grid-4\">\n        <div class=\"pt-card pt-price-card\"><h3>\u00a320<\/h3><p><strong>Bring your own strings<\/strong><\/p><\/div>\n        <div class=\"pt-card pt-price-card\"><h3>\u00a325<\/h3><p><strong>With Tier 3 strings<\/strong><\/p><\/div>\n        <div class=\"pt-card pt-price-card\"><h3>\u00a330<\/h3><p><strong>With Tier 2 strings<\/strong><\/p><\/div>\n        <div class=\"pt-card pt-price-card pt-highlight\"><div class=\"pt-badge\" style=\"margin-bottom:10px\">Premium<\/div><h3>\u00a340<\/h3><p><strong>With Tier 1 strings<\/strong><\/p><\/div>\n      <\/div>\n      <div class=\"pt-card\" style=\"margin-top:18px;text-align:center\"><h3 style=\"margin-bottom:4px\">Fast turnaround options<\/h3><p>Standard collection is within 7 days. Fast turnaround within 4 days is +\u00a32, and urgent 24-hour turnaround is +\u00a36.<\/p><\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\">\n    <div class=\"pt-wrap\">\n      <div style=\"text-align:center;margin-bottom:28px;\">\n        <span class=\"pt-badge\">String Tiers<\/span>\n        <h2>Available strings by tier<\/h2>\n        <p>Choose a tier based on string type, performance, feel and budget.<\/p>\n      <\/div>\n\n      <div class=\"pt-card\" style=\"overflow-x:auto;\">\n        <table>\n          <thead>\n            <tr>\n              <th>String<\/th>\n              <th>Gauge<\/th>\n              <th>Colour<\/th>\n              <th>Type<\/th>\n              <th>Profile<\/th>\n              <th>Best For<\/th>\n              <th>Feel<\/th>\n              <th>Tier<\/th>\n            <\/tr>\n          <\/thead>\n          <tbody>\n            <tr><td>Solinco Confidential<\/td><td>16<\/td><td>Grey<\/td><td>Co-polyester<\/td><td>Control poly<\/td><td>Durability, control, lower launch<\/td><td>Firm \/ precise<\/td><td>Tier 1<\/td><\/tr>\n            <tr><td>Babolat RPM Blast Rough<\/td><td>17<\/td><td>Grey<\/td><td>Textured co-polyester<\/td><td>Rough spin poly<\/td><td>Heavy spin, bite, aggressive baseliners<\/td><td>Firm \/ textured<\/td><td>Tier 1<\/td><\/tr>\n            <tr><td>Babolat RPM Blast<\/td><td>17<\/td><td>Black<\/td><td>Co-polyester<\/td><td>Shaped spin poly<\/td><td>Heavy topspin, control, fast swings<\/td><td>Firm \/ low-powered<\/td><td>Tier 1<\/td><\/tr>\n            <tr><td>Luxilon ALU Power<\/td><td>17<\/td><td>Grey<\/td><td>Co-polyester<\/td><td>Premium control poly<\/td><td>Control, response, match-day feel<\/td><td>Crisp \/ direct<\/td><td>Tier 1<\/td><\/tr>\n            <tr><td>Solinco Hyper-G<\/td><td>17<\/td><td>Green<\/td><td>Shaped co-polyester<\/td><td>Spin\/control poly<\/td><td>Spin, control, modern baseline play<\/td><td>Firm \/ controlled<\/td><td>Tier 1<\/td><\/tr>\n            <tr><td>Luxilon Element<\/td><td>17<\/td><td>Bronze<\/td><td>Soft co-polyester<\/td><td>Comfort poly<\/td><td>Comfort, feel, easier depth<\/td><td>Softer \/ lively<\/td><td>Tier 1<\/td><\/tr>\n            <tr><td>Luxilon 4G<\/td><td>17<\/td><td>Yellow<\/td><td>Co-polyester<\/td><td>Control\/tension stability poly<\/td><td>Control, durability, tension hold<\/td><td>Firm \/ stable<\/td><td>Tier 1<\/td><\/tr>\n            <tr><td>Yonex Poly Tour Fire<\/td><td>17<\/td><td>Red<\/td><td>Co-polyester<\/td><td>Round performance poly<\/td><td>Spin, control, controlled power<\/td><td>Crisp \/ lively<\/td><td>Tier 2<\/td><\/tr>\n            <tr><td>TRU PRO Ghost Wire<\/td><td>18<\/td><td>White<\/td><td>Co-polyester<\/td><td>Round soft poly<\/td><td>Comfort, control, hybrid setups<\/td><td>Soft \/ controlled<\/td><td>Tier 2<\/td><\/tr>\n            <tr><td>Head Lynx Tour<\/td><td>17<\/td><td>Black<\/td><td>Co-polyester<\/td><td>Shaped poly<\/td><td>Spin, control, all-court play<\/td><td>Firm \/ responsive<\/td><td>Tier 2<\/td><\/tr>\n            <tr><td>Wilson Revolve<\/td><td>16<\/td><td>Black\/Grey<\/td><td>Co-polyester<\/td><td>Spin poly<\/td><td>Spin, snapback, baseline play<\/td><td>Medium-firm<\/td><td>Tier 2<\/td><\/tr>\n            <tr><td>Solinco Mach 10<\/td><td>18<\/td><td>Blue<\/td><td>Co-polyester<\/td><td>Modern spin\/control poly<\/td><td>Spin, feel, fast swings<\/td><td>Crisp \/ responsive<\/td><td>Tier 2<\/td><\/tr>\n            <tr><td>Dunlop Explosive Speed<\/td><td>16<\/td><td>Black<\/td><td>Co-polyester<\/td><td>Power\/control poly<\/td><td>Durability, control, pace<\/td><td>Firm \/ lively<\/td><td>Tier 2<\/td><\/tr>\n            <tr><td>Gamma Ocho<\/td><td>16<\/td><td>White<\/td><td>Co-polyester<\/td><td>Shaped poly<\/td><td>Spin, bite, durability<\/td><td>Firm \/ grippy<\/td><td>Tier 2<\/td><\/tr>\n            <tr><td>Wilson Sensation Plus<\/td><td>17<\/td><td>Black<\/td><td>Multifilament<\/td><td>Comfort string<\/td><td>Comfort, power, arm-friendliness<\/td><td>Soft \/ powerful<\/td><td>Tier 3<\/td><\/tr>\n            <tr><td>Babolat Synthetic Gut<\/td><td>16<\/td><td>Clear\/White<\/td><td>Synthetic gut<\/td><td>Value all-round string<\/td><td>Beginners, value, easy power<\/td><td>Medium \/ classic<\/td><td>Tier 3<\/td><\/tr>\n          <\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\" style=\"background:#fbfaf6\">\n    <div class=\"pt-wrap\">\n      <div style=\"text-align:center;margin-bottom:34px\">\n        <span class=\"pt-badge\">How It Works<\/span>\n        <h2>Book, drop off, collect ready to play.<\/h2>\n      <\/div>\n      <div class=\"pt-grid-4\">\n        <div class=\"pt-card\"><div class=\"pt-badge\">1<\/div><h3>Choose service<\/h3><p>Use your own string or pick one of the included string tiers.<\/p><\/div>\n        <div class=\"pt-card\"><div class=\"pt-badge\">2<\/div><h3>Pick setup<\/h3><p>Choose a tension or ask for a recommendation based on your game.<\/p><\/div>\n        <div class=\"pt-card\"><div class=\"pt-badge\">3<\/div><h3>Drop off<\/h3><p>Bring the racket to Distillery Building, 11 Hart Yard, E3 2AL, London.<\/p><\/div>\n        <div class=\"pt-card\"><div class=\"pt-badge\">4<\/div><h3>Collect fresh<\/h3><p>Collect your freshly strung racket and get back on court.<\/p><\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\">\n    <div class=\"pt-wrap\">\n      <div class=\"pt-grid-2 pt-calc\">\n        <div class=\"pt-card\">\n          <span class=\"pt-badge\">String + Tension Calculator<\/span>\n          <h2>Find a setup for your game<\/h2>\n          <p>Use this as a starting point before booking your London restring.<\/p>\n          <label for=\"pt-spin\"><span>Spin<\/span><strong id=\"pt-spin-val\">7<\/strong><\/label><input type=\"range\" id=\"pt-spin\" min=\"1\" max=\"10\" value=\"7\">\n          <label for=\"pt-stiffness\"><span>Firm feel<\/span><strong id=\"pt-stiffness-val\">6<\/strong><\/label><input type=\"range\" id=\"pt-stiffness\" min=\"1\" max=\"10\" value=\"6\">\n          <label for=\"pt-durability\"><span>Durability<\/span><strong id=\"pt-durability-val\">7<\/strong><\/label><input type=\"range\" id=\"pt-durability\" min=\"1\" max=\"10\" value=\"7\">\n          <label for=\"pt-power\"><span>Power<\/span><strong id=\"pt-power-val\">5<\/strong><\/label><input type=\"range\" id=\"pt-power\" min=\"1\" max=\"10\" value=\"5\">\n          <a href=\"javascript:void(0)\" onclick=\"ptRecommendSetup()\" class=\"pt-btn pt-btn-primary\">Recommend My Setup<\/a>\n        <\/div>\n        <div class=\"pt-card pt-dark\">\n          <div style=\"opacity:.8;text-transform:uppercase;letter-spacing:.08em;font-family:Arial,Helvetica,sans-serif;font-size:13px\">Your best-fit setup<\/div>\n          <h3 id=\"pt-best-name\" style=\"font-size:34px;margin-top:10px;color:#fff!important\">Solinco Hyper-G<\/h3>\n          <p id=\"pt-best-blurb\">Spin-friendly, controlled and durable.<\/p>\n          <div class=\"pt-mini-grid\" id=\"pt-score-grid\"><\/div>\n          <div class=\"pt-card\" style=\"margin-top:18px;background:rgba(255,255,255,.08);color:#fff;border:none\">\n            <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:13px;text-transform:uppercase;letter-spacing:.08em;opacity:.82\">Recommended starting tension<\/div>\n            <div id=\"pt-tension\" style=\"font-size:34px;font-weight:800;font-family:Arial,Helvetica,sans-serif;margin-top:6px\">52 lbs<\/div>\n            <p id=\"pt-tension-note\" style=\"margin:8px 0 0\">Balanced starting point for control, comfort and consistency.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\" style=\"background:#fbfaf6\">\n    <div class=\"pt-wrap\">\n      <div class=\"pt-grid-2\">\n        <div><img decoding=\"async\" class=\"pt-photo\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0271\/1345\/5703\/files\/Velociti_Edit_COLOR.00_00_00_00.Still001-2_1024x1024.jpg?v=1686089246\" alt=\"Tennis strings for London racket restringing\"><\/div>\n        <div class=\"pt-card\">\n          <span class=\"pt-badge\">Choosing Strings<\/span>\n          <h2>Strings for spin, comfort, power and control.<\/h2>\n          <p>If you play mostly from the baseline at London parks, local clubs and indoor courts across East London, a shaped poly may help with spin and control. If comfort is the priority, a multifilament or synthetic gut can make the racket easier on the arm.<\/p>\n          <ul class=\"pt-list\">\n            <li><strong>Polyester:<\/strong> control, spin and durability for faster swings.<\/li>\n            <li><strong>Multifilament:<\/strong> comfort, power and feel.<\/li>\n            <li><strong>Synthetic gut:<\/strong> good value and a balanced response.<\/li>\n          <\/ul>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  \n\n  <section class=\"pt-section\" style=\"background:#fbfaf6\">\n    <div class=\"pt-wrap\">\n      <div class=\"pt-grid-2\">\n        <div>\n          <span class=\"pt-badge\">Restring Guide<\/span>\n          <h2>When should London players restring?<\/h2>\n          <p>Strings lose tension and feel gradually. If you wait until they snap, you may spend weeks playing with a dead or inconsistent setup.<\/p>\n          <p>A useful rule is to restring roughly as many times per year as you play per week, then adjust for string type, hitting style and match schedule.<\/p>\n        <\/div>\n        <div class=\"pt-card\">\n          <h3>You probably need a restring if:<\/h3>\n          <ul class=\"pt-list\">\n            <li>Your shots are flying long more often than usual.<\/li>\n            <li>The racket feels dead, harsh or unpredictable.<\/li>\n            <li>You have lost spin, bite or directional control.<\/li>\n            <li>The strings are notching, moving around or fraying.<\/li>\n            <li>You have a match, tournament or coaching block coming up.<\/li>\n          <\/ul>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\">\n    <div class=\"pt-wrap\">\n      <div style=\"text-align:center;margin-bottom:28px\">\n        <span class=\"pt-badge\">FAQ<\/span>\n        <h2>London tennis stringing FAQs<\/h2>\n      <\/div>\n      <div class=\"pt-grid-2\">\n        <div class=\"pt-card\"><h3>Where do I drop off my racket?<\/h3><p>Drop-off is at Distillery Building, 11 Hart Yard, E3 2AL, London, convenient for Bow, Mile End, Victoria Park, Hackney Wick, Hackney, Stratford, Tower Hamlets and Canary Wharf.<\/p><\/div>\n        <div class=\"pt-card\"><h3>Can I bring my own strings?<\/h3><p>Yes. Bring your own tennis string and the stringing labour is \u00a320.<\/p><\/div>\n        <div class=\"pt-card\"><h3>Do you offer 24-hour turnaround?<\/h3><p>Yes, subject to availability. urgent 24-hour turnaround is available for an additional \u00a36.<\/p><\/div>\n        <div class=\"pt-card\"><h3>What tension should I choose?<\/h3><p>Lower tension usually gives easier power and comfort. Higher tension usually gives a firmer, more controlled feel.<\/p><\/div>\n        <div class=\"pt-card\"><h3>What if I do not know which string I need?<\/h3><p>Message us with your racket, level, playing style and any arm issues. We will recommend a sensible setup.<\/p><\/div>\n        <div class=\"pt-card\"><h3>Is this suitable for club and league players?<\/h3><p>Yes. We string for casual players, regular hitters, club players and players preparing for matches across London.<\/p><\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\" style=\"background:#fbfaf6\">\n    <div class=\"pt-wrap\">\n      <div style=\"text-align:center;margin-bottom:28px\">\n        <span class=\"pt-badge\">Location<\/span>\n        <h2>Find us for London tennis stringing<\/h2>\n        <p>Drop-off at Distillery Building, 11 Hart Yard, E3 2AL, London<\/p>\n      <\/div>\n      <iframe loading=\"lazy\" allowfullscreen referrerpolicy=\"no-referrer-when-downgrade\" src=\"https:\/\/www.google.com\/maps\/embed?pb=!1m18!1m12!1m3!1d79430.9156992449!2d-0.1497308672122703!3d51.52759583977197!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x48761de9821d11c3%3A0x52301fb7d4bb1a03!2sPT%20-%20Tennis%20Stringing!5e0!3m2!1sen!2suk!4v1778165469399!5m2!1sen!2suk\"><\/iframe>\n      <div style=\"text-align:center;margin-top:22px\">\n        <a class=\"pt-btn pt-btn-secondary\" href=\"https:\/\/share.google\/tT65wELOTwyJpbWOD\" target=\"_blank\" rel=\"noopener\">Open in Google Maps<\/a>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-section\">\n    <div class=\"pt-wrap\">\n      <span class=\"pt-badge\">Nearby Pages<\/span>\n      <h2>Other local tennis stringing pages<\/h2>\n      <div class=\"pt-links\"><a href=\"https:\/\/www.passionnementtennis.com\/fr\/tennis-stringing-bow\/\">Tennis Stringing in Bow<\/a><a href=\"\/fr\/racket-stringing-bow\/\">Racket Stringing in Bow<\/a><a href=\"\/fr\/tennis-stringing-mile-end\/\">Tennis Stringing in Mile End<\/a><a href=\"\/fr\/tennis-stringing-victoria-park\/\">Tennis Stringing near Victoria Park<\/a><a href=\"https:\/\/www.passionnementtennis.com\/fr\/tennis-stringing-hackney-wick\/\">Tennis Stringing in Hackney Wick<\/a><a href=\"https:\/\/www.passionnementtennis.com\/fr\/tennis-stringing-hackney\/\">Tennis Stringing in Hackney<\/a><a href=\"\/fr\/tennis-stringing-stratford\/\">Tennis Stringing in Stratford<\/a><a href=\"\/fr\/tennis-stringing-tower-hamlets\/\">Tennis Stringing in Tower Hamlets<\/a><a href=\"\/fr\/tennis-stringing-canary-wharf\/\">Tennis Stringing near Canary Wharf<\/a><\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"pt-cta-band\">\n    <div class=\"pt-wrap\">\n      <h2 style=\"color:#fff\">Need tennis stringing in London?<\/h2>\n      <p style=\"color:rgba(255,255,255,.88);max-width:760px;margin:0 auto 18px\">Book your drop-off slot or message on WhatsApp and we will help you choose the right string and tension for your game.<\/p>\n      <a class=\"pt-btn pt-btn-secondary\" href=\"#book\">Book a Time for Dropoff<\/a>\n      <a class=\"pt-btn pt-btn-primary\" href=\"https:\/\/wa.me\/447467911129\" target=\"_blank\" rel=\"noopener\">Contact us on WhatsApp<\/a>\n    <\/div>\n  <\/section>\n\n  <script>\n    const PT_STRINGS = [\n      {\n            \"name\": \"Solinco Confidential\",\n            \"spin\": 8,\n            \"stiffness\": 8,\n            \"durability\": 9,\n            \"power\": 4,\n            \"family\": \"Tier 1\",\n            \"type\": \"16g Co-polyester\",\n            \"blurb\": \"Low-powered, durable and precise for players who want a controlled launch.\"\n      },\n      {\n            \"name\": \"Babolat RPM Blast Rough\",\n            \"spin\": 10,\n            \"stiffness\": 8,\n            \"durability\": 7,\n            \"power\": 4,\n            \"family\": \"Tier 1\",\n            \"type\": \"17g Textured co-polyester\",\n            \"blurb\": \"Textured, spin-heavy poly for aggressive baseliners who want extra bite.\"\n      },\n      {\n            \"name\": \"Babolat RPM Blast\",\n            \"spin\": 9,\n            \"stiffness\": 8,\n            \"durability\": 7,\n            \"power\": 4,\n            \"family\": \"Tier 1\",\n            \"type\": \"17g Co-polyester\",\n            \"blurb\": \"Classic spin and control poly for fast swings and heavy topspin.\"\n      },\n      {\n            \"name\": \"Luxilon ALU Power\",\n            \"spin\": 7,\n            \"stiffness\": 7,\n            \"durability\": 6,\n            \"power\": 6,\n            \"family\": \"Tier 1\",\n            \"type\": \"17g Co-polyester\",\n            \"blurb\": \"Crisp and direct premium poly with a famous match-day response.\"\n      },\n      {\n            \"name\": \"Solinco Hyper-G\",\n            \"spin\": 9,\n            \"stiffness\": 7,\n            \"durability\": 8,\n            \"power\": 5,\n            \"family\": \"Tier 1\",\n            \"type\": \"17g Shaped co-polyester\",\n            \"blurb\": \"Spin-friendly, controlled and durable for modern baseline play.\"\n      },\n      {\n            \"name\": \"Luxilon Element\",\n            \"spin\": 5,\n            \"stiffness\": 4,\n            \"durability\": 6,\n            \"power\": 7,\n            \"family\": \"Tier 1\",\n            \"type\": \"17g Soft co-polyester\",\n            \"blurb\": \"Comfort-focused poly with easier depth and a softer response than firmer control strings.\"\n      },\n      {\n            \"name\": \"Luxilon 4G\",\n            \"spin\": 6,\n            \"stiffness\": 9,\n            \"durability\": 9,\n            \"power\": 3,\n            \"family\": \"Tier 1\",\n            \"type\": \"17g Co-polyester\",\n            \"blurb\": \"Firm, stable and durable poly known for control and tension maintenance.\"\n      },\n      {\n            \"name\": \"Yonex Poly Tour Fire\",\n            \"spin\": 8,\n            \"stiffness\": 7,\n            \"durability\": 7,\n            \"power\": 6,\n            \"family\": \"Tier 2\",\n            \"type\": \"17g Co-polyester\",\n            \"blurb\": \"Crisp, lively co-polyester with good spin access and controlled power for confident hitters.\"\n      },\n      {\n            \"name\": \"TRU PRO Ghost Wire\",\n            \"spin\": 6,\n            \"stiffness\": 4,\n            \"durability\": 6,\n            \"power\": 6,\n            \"family\": \"Tier 2\",\n            \"type\": \"18g Co-polyester\",\n            \"blurb\": \"A softer control poly that works well for comfort-focused players and hybrid setups.\"\n      },\n      {\n            \"name\": \"Head Lynx Tour\",\n            \"spin\": 8,\n            \"stiffness\": 7,\n            \"durability\": 8,\n            \"power\": 5,\n            \"family\": \"Tier 2\",\n            \"type\": \"17g Co-polyester\",\n            \"blurb\": \"Responsive shaped poly with strong spin and all-court control.\"\n      },\n      {\n            \"name\": \"Wilson Revolve\",\n            \"spin\": 8,\n            \"stiffness\": 6,\n            \"durability\": 7,\n            \"power\": 5,\n            \"family\": \"Tier 2\",\n            \"type\": \"16g Co-polyester\",\n            \"blurb\": \"Spin-friendly co-poly with useful snapback and a more accessible response.\"\n      },\n      {\n            \"name\": \"Solinco Mach 10\",\n            \"spin\": 8,\n            \"stiffness\": 6,\n            \"durability\": 6,\n            \"power\": 6,\n            \"family\": \"Tier 2\",\n            \"type\": \"18g Co-polyester\",\n            \"blurb\": \"Responsive modern co-poly with spin and feel for players who swing freely.\"\n      },\n      {\n            \"name\": \"Dunlop Explosive Speed\",\n            \"spin\": 6,\n            \"stiffness\": 7,\n            \"durability\": 8,\n            \"power\": 6,\n            \"family\": \"Tier 2\",\n            \"type\": \"16g Co-polyester\",\n            \"blurb\": \"Durable, lively poly for players who want controlled pace from the baseline.\"\n      },\n      {\n            \"name\": \"Gamma Ocho\",\n            \"spin\": 9,\n            \"stiffness\": 7,\n            \"durability\": 8,\n            \"power\": 4,\n            \"family\": \"Tier 2\",\n            \"type\": \"16g Co-polyester\",\n            \"blurb\": \"Shaped poly with bite and durability for players chasing extra rotation.\"\n      },\n      {\n            \"name\": \"Wilson Sensation Plus\",\n            \"spin\": 4,\n            \"stiffness\": 2,\n            \"durability\": 4,\n            \"power\": 9,\n            \"family\": \"Tier 3\",\n            \"type\": \"17g Multifilament\",\n            \"blurb\": \"Soft multifilament option for comfort, easy depth and arm-friendliness.\"\n      },\n      {\n            \"name\": \"Babolat Synthetic Gut\",\n            \"spin\": 4,\n            \"stiffness\": 5,\n            \"durability\": 6,\n            \"power\": 7,\n            \"family\": \"Tier 3\",\n            \"type\": \"16g Synthetic gut\",\n            \"blurb\": \"Classic value string with balanced comfort, power and playability.\"\n      }\n];\n    function ptBindSlider(id){const slider=document.getElementById(id);const out=document.getElementById(id+\"-val\");if(!slider||!out)return;slider.addEventListener(\"input\",function(){out.textContent=slider.value})}\n    [\"pt-spin\",\"pt-stiffness\",\"pt-durability\",\"pt-power\"].forEach(ptBindSlider);\n    function ptDistance(s,p){return Math.abs(s.spin-p.spin)*1.25+Math.abs(s.stiffness-p.stiffness)*1.05+Math.abs(s.durability-p.durability)*1.15+Math.abs(s.power-p.power)*1.2}\n    function ptStartingTension(match,prefs){let tension=52;if(match.type.toLowerCase().includes(\"multi\")||match.type.toLowerCase().includes(\"synthetic\"))tension+=2;if(match.type.toLowerCase().includes(\"poly\"))tension-=1;if(prefs.power>=8)tension+=3;else if(prefs.power>=6)tension+=1;if(prefs.spin>=8)tension-=1;if(prefs.stiffness>=8)tension-=2;else if(prefs.stiffness<=3)tension+=2;if(tension<44)tension=44;if(tension>58)tension=58;let note=\"Balanced starting point for control, comfort and consistency.\";if(tension<=47)note=\"Lower tension for easier depth, pocketing and comfort.\";else if(tension>=56)note=\"Higher tension for a firmer feel and tighter directional control.\";else if(match.type.toLowerCase().includes(\"poly\"))note=\"Solid middle-ground starting point for a polyester setup.\";return{value:tension,note}}\n    function ptStat(label,value){return '<div class=\"pt-stat\"><span>'+label+'<\/span><strong>'+value+\"\/10<\/strong><\/div>\"}\n    function ptRecommendSetup(){const prefs={spin:Number(document.getElementById(\"pt-spin\").value),stiffness:Number(document.getElementById(\"pt-stiffness\").value),durability:Number(document.getElementById(\"pt-durability\").value),power:Number(document.getElementById(\"pt-power\").value)};const ranked=PT_STRINGS.map(function(s){return Object.assign({},s,{fit:ptDistance(s,prefs)})}).sort(function(a,b){return a.fit-b.fit});const best=ranked[0];const tension=ptStartingTension(best,prefs);document.getElementById(\"pt-best-name\").textContent=best.name+\" \u00b7 \"+best.family;document.getElementById(\"pt-best-blurb\").textContent=best.blurb;document.getElementById(\"pt-score-grid\").innerHTML=ptStat(\"Spin\",best.spin)+ptStat(\"Stiffness\",best.stiffness)+ptStat(\"Durability\",best.durability)+ptStat(\"Power\",best.power);document.getElementById(\"pt-tension\").textContent=tension.value+\" lbs\";document.getElementById(\"pt-tension-note\").textContent=tension.note}\n    document.addEventListener(\"DOMContentLoaded\",ptRecommendSetup);setTimeout(ptRecommendSetup,300);\n  <\/script>\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"London Tennis Stringing Tennis Stringing London Professional London tennis racket stringing for players who want better feel, cleaner&hellip;","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_gspb_post_css":"","csco_display_header_overlay":false,"csco_singular_sidebar":"","csco_page_header_type":"","csco_page_load_nextpost":"","csco_post_video_location":[],"csco_post_video_location_hash":"","csco_post_video_url":"","csco_post_video_bg_start_time":0,"csco_post_video_bg_end_time":0,"footnotes":""},"class_list":{"0":"post-3535","1":"page","2":"type-page","3":"status-publish","5":"cs-entry","6":"cs-video-wrap"},"_links":{"self":[{"href":"https:\/\/www.passionnementtennis.com\/fr\/wp-json\/wp\/v2\/pages\/3535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.passionnementtennis.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.passionnementtennis.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.passionnementtennis.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.passionnementtennis.com\/fr\/wp-json\/wp\/v2\/comments?post=3535"}],"version-history":[{"count":7,"href":"https:\/\/www.passionnementtennis.com\/fr\/wp-json\/wp\/v2\/pages\/3535\/revisions"}],"predecessor-version":[{"id":3582,"href":"https:\/\/www.passionnementtennis.com\/fr\/wp-json\/wp\/v2\/pages\/3535\/revisions\/3582"}],"wp:attachment":[{"href":"https:\/\/www.passionnementtennis.com\/fr\/wp-json\/wp\/v2\/media?parent=3535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}