[{"data":1,"prerenderedAt":4941},["ShallowReactive",2],{"knowledge-routes":3,"zh:footer-pages":352,"zh:\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcountdown-timer":365,"zh:\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcountdown-timer:navigation":4910,"zh:related:\u002Fpresentation\u002Fcountdown-timer,\u002Fshopify\u002Fthemes\u002Fdawn\u002Farchitecture,\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcustom-elements-pubsub,\u002Fshopify\u002Fthemes\u002Fdawn\u002Ftheme-editor-events,\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcontent-sections-and-animations,\u002Fshopify\u002Fthemes\u002Fdawn\u002Faccessibility-patterns,\u002Fshopify\u002Fthemes\u002Fdawn\u002Fnewsletter-and-badges,\u002Fshopify\u002Fshopify-discounts,\u002Fcontent-types\u002Fpromotions,\u002Fmodules\u002Fpromotion-redemption,\u002Fshopify\u002Fthemes\u002Fpattern-coverage,\u002Fshopify\u002Ftheme\u002Fsettings":4915,"zh:graph:\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcountdown-timer":4928},{"en":4,"zh":33},[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"\u002Fshopify\u002Fshopify-app-boundaries","\u002Fshopify\u002Fshopify-app-distribution","\u002Fshopify\u002Fshopify-app-environment-strategy","\u002Fshopify\u002Fshopify-app-review-access","\u002Fshopify\u002Fshopify-app-usage-billing","\u002Fshopify\u002Fshopify-multiple-apps-shared-backend","\u002Fshopify\u002Fshopify-oauth-redirect-callback","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fadd-to-cart-race","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fcomponent-base","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fkeyed-hydration","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Flayout-thrashing","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fliquid-smart-contrast","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fsection-rendering-morph","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fview-transitions","\u002Fshopify\u002Ftopics\u002Fapps-integrations","\u002Fdomains\u002Facquisition-marketing","\u002Fdomains\u002Fcustomer-service","\u002Fdomains\u002Fdata-analytics","\u002Fdomains\u002Ffinance-compliance","\u002Fdomains\u002Ffulfillment-logistics","\u002Fdomains\u002Fpayments","\u002Fdomains\u002Fplatform-development","\u002Fdomains\u002Fproduct-pricing","\u002Fdomains\u002Fretention","\u002Fdomains\u002Fstorefront-experience","\u002Fjourney\u002Fconvert","\u002Ffunnel\u002Fintent","\u002Ffunnel\u002Fpurchase",[34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,5,6,7,8,9,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,10,197,198,11,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,12,254,255,256,257,258,13,259,260,261,14,262,15,16,263,264,265,266,267,268,269,17,270,271,272,18,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,19,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,20,21,22,23,24,25,26,27,28,29,30,342,343,344,345,346,347,348,349,350,31,32,351],"\u002Fcommerce\u002Faccessibility-compliance-baseline","\u002Fcommerce\u002Fcheckout-funnel","\u002Fcommerce\u002Fcross-border-basics","\u002Fcommerce\u002Fcustomer-journey-models","\u002Fcommerce\u002Fdtc-customer-journey","\u002Fcommerce\u002Ffulfillment-delivery","\u002Fcommerce\u002Finventory-basics","\u002Fcommerce\u002Fjourney-stage-alignment","\u002Fcommerce\u002Fmarketing-funnel","\u002Fcommerce\u002Fpayments-chargebacks","\u002Fcommerce\u002Fpricing-discounts","\u002Fcommerce\u002Fproduct-search-visibility","\u002Fcommerce\u002Frepeat-purchase-retention","\u002Fcommerce\u002Freturns-refunds","\u002Fcontent-types\u002Fbrand-story","\u002Fcontent-types\u002Fbrand-values","\u002Fcontent-types\u002Fcore-message","\u002Fcontent-types\u002Fcustomer-reviews","\u002Fcontent-types\u002Fcustomer-testimonials","\u002Fcontent-types\u002Femail-signup","\u002Fcontent-types\u002Ffaq","\u002Fcontent-types\u002Ffeatured-products","\u002Fcontent-types\u002Fguarantee","\u002Fcontent-types\u002Floyalty-rewards","\u002Fcontent-types\u002Fmedia-coverage","\u002Fcontent-types\u002Fpackage-contents","\u002Fcontent-types\u002Fpayment-options","\u002Fcontent-types\u002Fproduct-categories","\u002Fcontent-types\u002Fproduct-overview","\u002Fcontent-types\u002Fproduct-showcase","\u002Fcontent-types\u002Fproduct-specifications","\u002Fcontent-types\u002Fproduct-video","\u002Fcontent-types\u002Fpromotions","\u002Fcontent-types\u002Fproof-metrics","\u002Fcontent-types\u002Frelated-products","\u002Fcontent-types\u002Fresources","\u002Fcontent-types\u002Fshipping-delivery-info","\u002Fcontent-types\u002Fsocial-follow","\u002Fcontent-types\u002Fsupport-contact","\u002Fcontent-types\u002Fthird-party-reviews","\u002Fcontent-types\u002Ftrust-marks","\u002Fcontent-types\u002Ftypes","\u002Fcontent-types\u002Fuser-generated-content","\u002Fmodules\u002Favailability-notification","\u002Fmodules\u002Fbuy-box","\u002Fmodules\u002Fcart-summary","\u002Fmodules\u002Fcollection-browse-filter","\u002Fmodules\u002Fcookie-consent","\u002Fmodules\u002Fcross-sell-upsell","\u002Fmodules\u002Ffit-guidance","\u002Fmodules\u002Fpage-composition","\u002Fmodules\u002Fpatterns","\u002Fmodules\u002Fproduct-selection","\u002Fmodules\u002Fproduct-support-navigation","\u002Fmodules\u002Fpromotion-redemption","\u002Fmodules\u002Freview-display","\u002Fmodules\u002Fsignup-capture","\u002Fmodules\u002Fsite-search","\u002Fmodules\u002Fsocial-proof-strip","\u002Fmodules\u002Fsubscription-terms-summary","\u002Fmodules\u002Fvariant-media-gallery","\u002Fpresentation\u002Faccordion","\u002Fpresentation\u002Fbadge","\u002Fpresentation\u002Fbanner","\u002Fpresentation\u002Fbefore-after","\u002Fpresentation\u002Fcallout","\u002Fpresentation\u002Fcards","\u002Fpresentation\u002Fcarousel","\u002Fpresentation\u002Fcomparison","\u002Fpresentation\u002Fcountdown-timer","\u002Fpresentation\u002Fdrawer","\u002Fpresentation\u002Fempty-state","\u002Fpresentation\u002Fgrid","\u002Fpresentation\u002Fhero","\u002Fpresentation\u002Fhotspot","\u002Fpresentation\u002Finline-form","\u002Fpresentation\u002Flist","\u002Fpresentation\u002Fmarquee","\u002Fpresentation\u002Fmasonry","\u002Fpresentation\u002Fmedia-gallery","\u002Fpresentation\u002Fmodal","\u002Fpresentation\u002Fnavigation-menu","\u002Fpresentation\u002Foverlay","\u002Fpresentation\u002Fpagination","\u002Fpresentation\u002Fpatterns","\u002Fpresentation\u002Fpopover","\u002Fpresentation\u002Fprogress-bar","\u002Fpresentation\u002Frating-stars","\u002Fpresentation\u002Fscroll-reveal","\u002Fpresentation\u002Fsingle-column","\u002Fpresentation\u002Fskeleton-loader","\u002Fpresentation\u002Fsplit","\u002Fpresentation\u002Fstepper","\u002Fpresentation\u002Fsticky-bar","\u002Fpresentation\u002Fswatch","\u002Fpresentation\u002Ftable","\u002Fpresentation\u002Ftabs","\u002Fpresentation\u002Ftimeline","\u002Fpresentation\u002Ftoast","\u002Fshopify\u002Farticle","\u002Fshopify\u002Farticle\u002Fbuying-guide-article","\u002Fshopify\u002Farticle\u002Fhow-to-article","\u002Fshopify\u002Fblog","\u002Fshopify\u002Fcart","\u002Fshopify\u002Fcollection","\u002Fshopify\u002Fcollection\u002Fcampaign-collection-page","\u002Fshopify\u002Fcollection\u002Fcategory-collection-page","\u002Fshopify\u002Fhomepage","\u002Fshopify\u002Flist-collections","\u002Fshopify\u002Fpage","\u002Fshopify\u002Fpage\u002Fabout-us","\u002Fshopify\u002Fpage\u002Fbrand-story","\u002Fshopify\u002Fpage\u002Fcampaign-landing","\u002Fshopify\u002Fpage\u002Fcontact-us","\u002Fshopify\u002Fpage\u002Ffaq","\u002Fshopify\u002Fpage\u002Floyalty-program","\u002Fshopify\u002Fpage\u002Forder-tracking","\u002Fshopify\u002Fpage\u002Fpolicies","\u002Fshopify\u002Fpage\u002Fpress","\u002Fshopify\u002Fpage\u002Freviews","\u002Fshopify\u002Fpage\u002Fshipping-returns","\u002Fshopify\u002Fpage\u002Fsize-guide","\u002Fshopify\u002Fpage\u002Fstore-locator","\u002Fshopify\u002Fproduct","\u002Fshopify\u002Fproduct\u002Ffit-sensitive-product-page","\u002Fshopify\u002Fproduct\u002Fpreorder-subscription-page","\u002Fshopify\u002Fproduct\u002Fstandard-product-page","\u002Fshopify\u002Fsearch","\u002Fshopify\u002Fshopify-admin-api-graphql","\u002Fshopify\u002Fshopify-admin-map","\u002Fshopify\u002Fshopify-amount-check","\u002Fshopify\u002Fshopify-analytics-reports","\u002Fshopify\u002Fshopify-b2b","\u002Fshopify\u002Fshopify-bundles","\u002Fshopify\u002Fshopify-checkout-customization","\u002Fshopify\u002Fshopify-collections-publishing","\u002Fshopify\u002Fshopify-custom-data","\u002Fshopify\u002Fshopify-customer-accounts","\u002Fshopify\u002Fshopify-customer-privacy","\u002Fshopify\u002Fshopify-customer-segments","\u002Fshopify\u002Fshopify-discounts","\u002Fshopify\u002Fshopify-domains-dns","\u002Fshopify\u002Fshopify-ecosystem","\u002Fshopify\u002Fshopify-ecosystem-analysis","\u002Fshopify\u002Fshopify-entry-map","\u002Fshopify\u002Fshopify-file-sync-diff","\u002Fshopify\u002Fshopify-files-media","\u002Fshopify\u002Fshopify-flow","\u002Fshopify\u002Fshopify-follow-on-shop","\u002Fshopify\u002Fshopify-fraud-disputes","\u002Fshopify\u002Fshopify-fulfillment-delivery","\u002Fshopify\u002Fshopify-functions-extensions","\u002Fshopify\u002Fshopify-gift-cards","\u002Fshopify\u002Fshopify-headless","\u002Fshopify\u002Fshopify-identities-permissions","\u002Fshopify\u002Fshopify-inventory-locations","\u002Fshopify\u002Fshopify-knowledge-base-method","\u002Fshopify\u002Fshopify-knowledge-source-inventory","\u002Fshopify\u002Fshopify-local-delivery-pickup","\u002Fshopify\u002Fshopify-marketing-channels","\u002Fshopify\u002Fshopify-marketing-messaging","\u002Fshopify\u002Fshopify-markets-shipping","\u002Fshopify\u002Fshopify-multi-currency-pricing","\u002Fshopify\u002Fshopify-navigation-menus","\u002Fshopify\u002Fshopify-notifications-emails","\u002Fshopify\u002Fshopify-online-store-preferences","\u002Fshopify\u002Fshopify-order-payment-status","\u002Fshopify\u002Fshopify-orders-management","\u002Fshopify\u002Fshopify-payments-checkout","\u002Fshopify\u002Fshopify-plans","\u002Fshopify\u002Fshopify-pos","\u002Fshopify\u002Fshopify-product-import-export","\u002Fshopify\u002Fshopify-products-variants","\u002Fshopify\u002Fshopify-purchase-journey","\u002Fshopify\u002Fshopify-purchase-validation","\u002Fshopify\u002Fshopify-returns-refunds","\u002Fshopify\u002Fshopify-sales-channels","\u002Fshopify\u002Fshopify-search-and-discovery","\u002Fshopify\u002Fshopify-selling-plans","\u002Fshopify\u002Fshopify-shipping-rates-labels","\u002Fshopify\u002Fshopify-storefront","\u002Fshopify\u002Fshopify-storefront-performance","\u002Fshopify\u002Fshopify-storefront-seo-framework","\u002Fshopify\u002Fshopify-tagging-options","\u002Fshopify\u002Fshopify-taxes-duties","\u002Fshopify\u002Fshopify-theme-management","\u002Fshopify\u002Fshopify-translation-localization","\u002Fshopify\u002Fshopify-url-redirects","\u002Fshopify\u002Fshopify-verification-priorities","\u002Fshopify\u002Fshopify-web-pixels","\u002Fshopify\u002Fshopify-webhooks-events","\u002Fshopify\u002Ftheme\u002Farchitecture","\u002Fshopify\u002Ftheme\u002Fcapability-modules","\u002Fshopify\u002Ftheme\u002Fcontent-architecture","\u002Fshopify\u002Ftheme\u002Fdelivery-framework","\u002Fshopify\u002Ftheme\u002Fglobal-regions","\u002Fshopify\u002Ftheme\u002Flayout","\u002Fshopify\u002Ftheme\u002Flocales","\u002Fshopify\u002Ftheme\u002Fsettings","\u002Fshopify\u002Ftheme\u002Ftemplates","\u002Fshopify\u002Fthemes\u002Fdawn\u002Faccessibility-patterns","\u002Fshopify\u002Fthemes\u002Fdawn\u002Farchitecture","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fbuy-form-and-availability","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcart-drawer-notification","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcolor-schemes","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcontent-sections-and-animations","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcountdown-timer","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcustom-elements-pubsub","\u002Fshopify\u002Fthemes\u002Fdawn\u002Ffacets-and-pagination","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fheader-navigation","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fhtml-update-utility","\u002Fshopify\u002Fthemes\u002Fdawn\u002Floading-performance","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fnewsletter-and-badges","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fpredictive-search","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fproduct-media","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fquantity-input","\u002Fshopify\u002Fthemes\u002Fdawn\u002Frecommendations","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fsection-rendering","\u002Fshopify\u002Fthemes\u002Fdawn\u002Ftheme-editor-events","\u002Fshopify\u002Fthemes\u002Fdawn\u002Fvariant-update-protocol","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Farchitecture","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fbadges-reviews-signup","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fbuying","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fcart","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fcollection-search","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fcontent-modules","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Ffacets-and-pagination","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fheader-navigation","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Flayout","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fmarquee-slideshow-animations","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fmedia-zoom-and-hotspots","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fpredictive-search","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fproduct-cards","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fproduct-page","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Freading-source","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Frecommendations","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fsticky-add-to-cart-and-availability","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fstyles","\u002Fshopify\u002Fthemes\u002Fhorizon\u002Fvariants","\u002Fshopify\u002Fthemes\u002Fimpact\u002Fbehavior-components","\u002Fshopify\u002Fthemes\u002Fimpact\u002Fcart-events","\u002Fshopify\u002Fthemes\u002Fimpact\u002Fdialog-element","\u002Fshopify\u002Fthemes\u002Fimpact","\u002Fshopify\u002Fthemes\u002Fimpact\u002Flazy-media-player","\u002Fshopify\u002Fthemes\u002Fimpact\u002Fsection-spacing-collapsing","\u002Fshopify\u002Fthemes\u002Fimpact\u002Fvariant-picker-rerender","\u002Fshopify\u002Fthemes","\u002Fshopify\u002Fthemes\u002Fpattern-coverage","\u002Fterms\u002Faccessible-rich-internet-applications","\u002Fterms\u002Famericans-with-disabilities-act","\u002Fterms\u002Faverage-order-value","\u002Fterms\u002Fbusiness-to-business","\u002Fterms\u002Fbuy-now-pay-later","\u002Fterms\u002Fcall-to-action","\u002Fterms\u002Fcart-abandonment-rate","\u002Fterms\u002Fcash-on-delivery","\u002Fterms\u002Fclick-through-rate","\u002Fterms\u002Fconversion-rate","\u002Fterms\u002Fcumulative-layout-shift","\u002Fterms\u002Fcustomer-acquisition-cost","\u002Fterms\u002Fcustomer-lifetime-value","\u002Fterms\u002Fdelivered-at-place","\u002Fterms\u002Fdelivered-duty-paid","\u002Fterms\u002Feuropean-accessibility-act","\u002Fterms\u002Fgeneral-data-protection-regulation","\u002Fterms\u002Fglobal-trade-item-number","\u002Fterms\u002Fgross-merchandise-value","\u002Fterms\u002Fharmonized-system-code","\u002Fterms\u002Fhash-based-message-authentication-code","\u002Fterms\u002Fimport-one-stop-shop","\u002Fterms\u002Flargest-contentful-paint","\u002Fterms\u002Fminimum-order-quantity","\u002Fterms\u002Fmonth-to-date","\u002Fterms\u002Fpoint-of-sale","\u002Fterms\u002Freturn-on-ad-spend","\u002Fterms\u002Frevenue-per-session","\u002Fterms\u002Fstock-keeping-unit","\u002Fterms\u002Fstrong-customer-authentication","\u002Fterms\u002Ftelevision-commercial","\u002Fterms\u002Fthree-domain-secure","\u002Fterms\u002Furchin-tracking-module","\u002Fterms\u002Fuser-generated-content","\u002Fterms\u002Fvalue-added-tax","\u002Fterms\u002Fweb-content-accessibility-guidelines","\u002Fshopify\u002Ftopics\u002Fcustomers","\u002Fshopify\u002Ftopics\u002Fdata-automation","\u002Fshopify\u002Ftopics\u002Fecosystem","\u002Fshopify\u002Ftopics\u002Fofficial-themes","\u002Fshopify\u002Ftopics\u002Fpage-composition-patterns","\u002Fshopify\u002Ftopics\u002Fproducts-content","\u002Fshopify\u002Ftopics\u002Fstore-management","\u002Fshopify\u002Ftopics\u002Fstorefront","\u002Fshopify\u002Ftopics\u002Fstorefront-content-types","\u002Fshopify\u002Ftopics\u002Fstorefront-modules","\u002Fshopify\u002Ftopics\u002Fstorefront-pages","\u002Fshopify\u002Ftopics\u002Ftransactions","\u002Fcommerce\u002Fpaths\u002Fcommerce-concepts","\u002Fshopify\u002Fpaths\u002Fbuild-your-store","\u002Fshopify\u002Fpaths\u002Fcontent-foundations","\u002Fshopify\u002Fpaths\u002Fdawn","\u002Fshopify\u002Fpaths\u002Fofficial-themes","\u002Fshopify\u002Fpaths\u002Fpage-recipes","\u002Fshopify\u002Fpaths\u002Fplatform-basics","\u002Fshopify\u002Fpaths\u002Fpresentation-accessibility","\u002Fshopify\u002Fpaths\u002Fstorefront-platform-mechanisms","\u002Fshopify\u002Fpaths\u002Ftheme-foundations","\u002Fshopify\u002Fpaths\u002Ftheme-pattern-audit","\u002Fshopify\u002Fpaths\u002Fvalidate-purchase-tracking","\u002Fjourney\u002Fdeliver","\u002Fjourney\u002Fevaluate","\u002Fjourney\u002Fdiscover","\u002Fjourney\u002Frepurchase","\u002Fjourney\u002Fuse","\u002Fjourney\u002Fengage","\u002Ffunnel\u002Fawareness","\u002Ffunnel\u002Finterest","\u002Ffunnel\u002Fconsideration","\u002Ffunnel\u002Fengage",[353,357,361],{"id":354,"path":355,"title":356},"zh_sitePages\u002Fabout.md","\u002Fabout","关于 WooDawn",{"id":358,"path":359,"title":360},"zh_sitePages\u002Flegal\u002Fprivacy.md","\u002Flegal\u002Fprivacy","隐私说明",{"id":362,"path":363,"title":364},"zh_sitePages\u002Flegal\u002Fterms.md","\u002Flegal\u002Fterms","内容使用说明",{"document":366,"isArticle":912},{"id":367,"title":368,"abbreviations":369,"aliases":370,"answers":371,"appliesTo":372,"articleType":373,"body":374,"businessModel":4859,"constrainedBy":4860,"currency":4861,"description":4862,"discussionUrl":372,"domains":4863,"evidenceStatus":4865,"extension":4866,"funnel":4867,"implements":4868,"indexable":912,"measuredBy":4869,"meta":4870,"metric":372,"navigation":912,"needs":4871,"originalSources":4872,"path":240,"regions":4873,"related":4874,"reviewAfter":372,"roles":4875,"seo":4877,"seoImage":372,"seoTitle":372,"sources":4878,"stages":4891,"status":4893,"stem":4894,"supersededBy":372,"tags":4895,"term":372,"themeSources":4900,"tools":4904,"updatedAt":4906,"uses":4907,"verification":4908,"verifiedAt":4906,"__hash__":4909},"zh_articles\u002Fshopify\u002Fthemes\u002Fdawn\u002Fcountdown-timer.md","给 Dawn 增加倒计时分区：同源截止时间、服务端时钟与编辑器清理",[],[],[],null,"guide",{"type":375,"value":376,"toc":4847},"minimark",[377,413,421,426,479,483,488,583,597,662,691,694,697,880,884,1703,1706,1763,1776,1779,3718,3721,3886,3889,4280,4305,4313,4438,4486,4493,4518,4521,4694,4697,4741,4744,4788,4791,4798,4843],[378,379,380,381,391,392,395,396,399,400,403,404,407,408,412],"p",{},"本文基于 Dawn v16.0.0，源码固定到 ",[382,383,387],"a",{"href":384,"rel":385},"https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Ftree\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204",[386],"nofollow",[388,389,390],"code",{},"bc39a7d","（核验于 2026-10-08：",[388,393,394],{},"v16.0.0"," 标签指向该提交，",[388,397,398],{},"config\u002Fsettings_schema.json"," 的 ",[388,401,402],{},"theme_version"," 为 ",[388,405,406],{},"16.0.0","，是 GitHub Releases 上的最新发布）。与本库其他 Dawn 文章不同，这一篇不是解读既有功能，而是",[409,410,411],"strong",{},"新增","一个主题里没有的功能。实现代码只做了静态检查，未在真实店铺运行；每一处未验证的判断都在文内标出。",[378,414,415,416,420],{},"倒计时该不该做、什么时候做，不在本文范围：真实性红线、合规与无障碍要求以 ",[382,417,419],{"href":418},"\u002Fzh\u002Fpresentation\u002Fcountdown-timer","Countdown Timer"," 为准，本文只回答「在 Dawn 里怎样按它的要求实现」。",[422,423,425],"h2",{"id":424},"先确认-dawn-没有倒计时","先确认 Dawn 没有倒计时",[378,427,428,429,432,433,432,436,439,440,399,443,446,447,450,451,454,455,460,461,464,465,468,469,432,472,432,475,478],{},"在固定提交全仓库搜索 ",[388,430,431],{},"countdown","、",[388,434,435],{},"count-down",[388,437,438],{},"timer","（不区分大小写）：命中只有 ",[388,441,442],{},"assets\u002Fconstants.js",[388,444,445],{},"ON_CHANGE_DEBOUNCE_TIMER","（购物车与批量加购的防抖常量）和几个语言文件里的无关词（如挪威语 ",[388,448,449],{},"Estimert totalsum","）。搜索 ",[388,452,453],{},"setInterval"," 只命中 ",[382,456,459],{"href":457,"rel":458},"https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Fassets\u002Fglobal.js",[386],"global.js"," 的轮播自动播放与 ",[388,462,463],{},"BulkAdd"," 请求队列；",[388,466,467],{},"\u003Ctime"," 元素在 ",[388,470,471],{},"sections",[388,473,474],{},"snippets",[388,476,477],{},"layout"," 中无命中。结论：Dawn v16.0.0 没有内置倒计时，也没有可以直接复用的计时组件，需要新增文件，不需要改动既有分区。",[422,480,482],{"id":481},"先定数据来源再写代码","先定数据来源，再写代码",[378,484,485,487],{},[382,486,419],{"href":418}," 的第一条红线是「同一时间源」：倒计时读的截止时刻必须就是折扣实际结束的那份数据。这在 Dawn 里绕不开一个平台限制：",[489,490,491,540,566],"ul",{},[492,493,494,497,498,501,502,432,505,432,508,432,511,432,514,432,517,432,520,523,524,527,528,531,532,535,536,539],"li",{},[409,495,496],{},"Liquid 读不到折扣的起止时间。"," ",[388,499,500],{},"discount_application"," 对象只有 ",[388,503,504],{},"target_selection",[388,506,507],{},"target_type",[388,509,510],{},"title",[388,512,513],{},"total_allocated_amount",[388,515,516],{},"type",[388,518,519],{},"value",[388,521,522],{},"value_type","（shopify.dev，核验于 2026-10-07），描述的是购物车里已经生效的折扣；",[388,525,526],{},"shop"," 对象没有任何折扣或促销日程属性。折扣的 ",[388,529,530],{},"startsAt"," \u002F ",[388,533,534],{},"endsAt"," 只在 Admin GraphQL（如 ",[388,537,538],{},"discountAutomaticAppCreate"," 的返回）里出现，店面主题拿不到。",[492,541,542,545,546,432,549,432,552,432,555,558,559,432,562,565],{},[409,543,544],{},"分区设置没有日期类型。"," 输入设置类型列表里只有 ",[388,547,548],{},"text",[388,550,551],{},"number",[388,553,554],{},"range",[388,556,557],{},"select"," 等基础类型和 ",[388,560,561],{},"product",[388,563,564],{},"metaobject"," 等资源类型，没有 date 或 datetime（shopify.dev 输入设置页，核验于 2026-10-07）。",[492,567,568,497,575,578,579,582],{},[409,569,570,571,574],{},"Liquid 里的 ",[388,572,573],{},"now"," 会被缓存。",[388,576,577],{},"date"," 过滤器文档写明，",[388,580,581],{},"'now'"," 输出的是 Liquid 最近一次渲染的时间，「可能不会在每次页面访问时更新」。所以剩余时间不能在 Liquid 里算。",[378,584,585,586,592,593,596],{},"因此本实现把截止时间放在 ",[409,587,588,589],{},"shop 级元字段 ",[388,590,591],{},"promo.ends_at","（类型 ",[388,594,595],{},"date_time","）里，分区只读不写：",[598,599,600,616],"table",{},[601,602,603],"thead",{},[604,605,606,610,613],"tr",{},[607,608,609],"th",{},"方案",[607,611,612],{},"做法",[607,614,615],{},"与「同源」的距离",[617,618,619,638,649],"tbody",{},[604,620,621,625,635],{},[622,623,624],"td",{},"元字段（本文采用）",[622,626,627,628,630,631,634],{},"应用或 Shopify Flow 在创建、修改折扣时把 ",[388,629,534],{}," 写入 ",[388,632,633],{},"shop.metafields.promo.ends_at","；主题读它",[622,636,637],{},"最近：主题与折扣之间只隔一个同步动作。同步本身不在主题内，本文没有实现，Flow 能否直接写该元字段未核验",[604,639,640,643,646],{},[622,641,642],{},"分区文本设置（本文仅作回退）",[622,644,645],{},"商家在编辑器里手填 ISO 8601 字符串",[622,647,648],{},"最远：两处手填，必然出现不一致；只在没有元字段时使用，编辑器文案里明确要求与后台折扣一致",[604,650,651,654,659],{},[622,652,653],{},"应用代理或 Storefront API 实时查询",[622,655,656,657],{},"前端请求应用接口取 ",[388,658,534],{},[622,660,661],{},"同源但引入外部依赖与额外请求；超出本文范围",[378,663,664,666,667,670,671,673,674,676,677,680,681,684,685,687,688,690],{},[388,665,595],{}," 元字段的值是「不预设时区的 ISO 8601 字符串，默认按 GMT」（shopify.dev 元字段类型页）；Liquid 里 ",[388,668,669],{},"metafield.value"," 对 ",[388,672,595],{}," 返回日期字符串，可以接 ",[388,675,577],{}," 过滤器（shopify.dev metafield 对象页）。本实现据此把没有 ",[388,678,679],{},"Z"," 或 ",[388,682,683],{},"+"," 偏移的值视为 UTC，补上 ",[388,686,679],{}," 后再交给浏览器解析；",[388,689,577],{}," 过滤器解析这种字符串时按哪个时区取值，本文未验证，所以服务端只用它判断「是否已经结束」，不用它算剩余时长。",[422,692,693],{"id":693},"文件与职责",[378,695,696],{},"下表的每一条都对应 Dawn 既有写法，便于与主题其余部分保持一致：",[598,698,699,712],{},[601,700,701],{},[604,702,703,706,709],{},[607,704,705],{},"文件",[607,707,708],{},"职责",[607,710,711],{},"参照的 Dawn 写法",[617,713,714,758,795,820,841,859],{},[604,715,716,722,728],{},[622,717,718,721],{},[388,719,720],{},"sections\u002Fcountdown-timer.liquid","（新增）",[622,723,724,725],{},"读截止时间、判断三种状态、输出静态截止文案与数字骨架、",[388,726,727],{},"{% schema %}",[622,729,730,399,735,432,738,432,741,432,744,747,748,753,754,757],{},[382,731,734],{"href":732,"rel":733},"https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Fsections\u002Frich-text.liquid",[386],"rich-text.liquid",[388,736,737],{},"section-{{ section.id }}-padding",[388,739,740],{},"color_scheme",[388,742,743],{},"page-width",[388,745,746],{},"t:"," 键；",[382,749,752],{"href":750,"rel":751},"https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Fsections\u002Fmain-product.liquid",[386],"main-product.liquid"," 在分区内用 ",[388,755,756],{},"\u003Cscript defer>"," 加载自己的脚本",[604,759,760,765,768],{},[622,761,762,721],{},[388,763,764],{},"assets\u002Fcountdown-timer.js",[622,766,767],{},"自定义元素：估计服务端时钟偏移、按两档间隔更新、到期收尾、隐藏按钮、状态播报",[622,769,770,399,773,776,777,780,781,432,784,432,787,790,791,794],{},[382,771,459],{"href":457,"rel":772},[386],[388,774,775],{},"customElements.define"," 与 ",[388,778,779],{},"matchMedia('(prefers-reduced-motion: reduce)')","；",[388,782,783],{},"cart.js",[388,785,786],{},"product-info.js",[388,788,789],{},"cart-disclosure-modal.js"," 等在 ",[388,792,793],{},"disconnectedCallback"," 里清理",[604,796,797,802,809],{},[622,798,799,721],{},[388,800,801],{},"assets\u002Fsection-countdown-timer.css",[622,803,804,805,808],{},"分区样式；唯一的过渡放在 ",[388,806,807],{},"prefers-reduced-motion: no-preference"," 里",[622,810,811,399,816,819],{},[382,812,815],{"href":813,"rel":814},"https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Fassets\u002Fbase.css",[386],"base.css",[388,817,818],{},"--duration-short"," 与减少动态媒体查询",[604,821,822,828,834],{},[622,823,824,827],{},[388,825,826],{},"locales\u002Fen.default.json","（追加）",[622,829,830,831],{},"前台文案 ",[388,832,833],{},"sections.countdown_timer.*",[622,835,836,837,840],{},"既有 ",[388,838,839],{},"sections.*"," 结构",[604,842,843,848,854],{},[622,844,845,827],{},[388,846,847],{},"locales\u002Fen.default.schema.json",[622,849,850,851],{},"编辑器文案 ",[388,852,853],{},"sections.countdown-timer.*",[622,855,836,856,840],{},[388,857,858],{},"sections.rich-text.*",[604,860,861,867,873],{},[622,862,863,866],{},[388,864,865],{},"layout\u002Ftheme.liquid","（追加 4 行）",[622,868,869,870],{},"把两条播报文案暴露为 ",[388,871,872],{},"window.countdownStrings",[622,874,875,876,879],{},"同文件已有的 ",[388,877,878],{},"window.accessibilityStrings"," 等",[422,881,883],{"id":882},"分区-liquid","分区 Liquid",[885,886,891],"pre",{"className":887,"code":888,"language":889,"meta":890,"style":890},"language-liquid shiki shiki-themes github-light","{{ 'section-countdown-timer.css' | asset_url | stylesheet_tag }}\n\u003Cscript src=\"{{ 'countdown-timer.js' | asset_url }}\" defer=\"defer\">\u003C\u002Fscript>\n\n{%- liquid\n  assign ends_at = shop.metafields.promo.ends_at.value\n  if ends_at == blank\n    assign ends_at = section.settings.ends_at_fallback\n  endif\n  assign ends_at = ends_at | strip\n  assign last_char = ends_at | slice: -1\n  assign has_offset = false\n  if last_char == 'Z' or ends_at contains '+'\n    assign has_offset = true\n  endif\n  if ends_at != blank and has_offset == false\n    assign ends_at = ends_at | append: 'Z'\n  endif\n  assign ends_at_unix = ends_at | date: '%s' | plus: 0\n  assign rendered_at_unix = 'now' | date: '%s' | plus: 0\n  assign state = 'running'\n  if ends_at == blank or ends_at_unix == 0\n    assign state = 'missing'\n  elsif rendered_at_unix >= ends_at_unix\n    assign state = 'ended'\n  endif\n-%}\n\n{%- style -%}\n  .section-{{ section.id }}-padding {\n    padding-top: {{ section.settings.padding_top | times: 0.75 | round: 0 }}px;\n    padding-bottom: {{ section.settings.padding_bottom | times: 0.75 | round: 0 }}px;\n  }\n\n  @media screen and (min-width: 750px) {\n    .section-{{ section.id }}-padding {\n      padding-top: {{ section.settings.padding_top }}px;\n      padding-bottom: {{ section.settings.padding_bottom }}px;\n    }\n  }\n{%- endstyle -%}\n\n{%- if state == 'missing' -%}\n  {%- if request.design_mode -%}\n    \u003Cdiv class=\"page-width section-{{ section.id }}-padding\">\n      \u003Cp class=\"caption-with-letter-spacing\">{{ 'sections.countdown_timer.missing_end_time' | t }}\u003C\u002Fp>\n    \u003C\u002Fdiv>\n  {%- endif -%}\n{%- else -%}\n  \u003Cdiv class=\"color-{{ section.settings.color_scheme }} gradient section-{{ section.id }}-padding\">\n    \u003Ccountdown-timer\n      class=\"countdown-timer page-width\"\n      data-ends-at=\"{{ ends_at | escape }}\"\n      data-state=\"{{ state }}\"\n      data-section-id=\"{{ section.id }}\"\n    >\n      {%- if section.settings.heading != blank -%}\n        \u003Ch2 class=\"countdown-timer__heading inline-richtext {{ section.settings.heading_size }}\">\n          {{ section.settings.heading }}\n        \u003C\u002Fh2>\n      {%- endif -%}\n\n      \u003Cp class=\"countdown-timer__ends-at\">\n        {{ 'sections.countdown_timer.ends_at_html' | t: ends_at: ends_at | date: '%Y-%m-%d %H:%M UTC' }}\n        \u003Ctime datetime=\"{{ ends_at | escape }}\" data-ends-at-local hidden>\u003C\u002Ftime>\n      \u003C\u002Fp>\n\n      \u003Cdiv class=\"countdown-timer__clock\" data-clock{% if state == 'ended' %} hidden{% endif %} aria-hidden=\"true\">\n        {%- assign units = 'days,hours,minutes,seconds' | split: ',' -%}\n        {%- for unit in units -%}\n          {%- assign unit_key = 'sections.countdown_timer.' | append: unit -%}\n          \u003Cdiv class=\"countdown-timer__unit\" data-unit-wrapper=\"{{ unit }}\">\n            \u003Cspan class=\"countdown-timer__value h2\" data-unit=\"{{ unit }}\">--\u003C\u002Fspan>\n            \u003Cspan class=\"countdown-timer__label caption-with-letter-spacing\">{{ unit_key | t }}\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n        {%- endfor -%}\n      \u003C\u002Fdiv>\n\n      \u003Cp class=\"countdown-timer__ended\" data-ended{% unless state == 'ended' %} hidden{% endunless %}>\n        {{ 'sections.countdown_timer.ended' | t }}\n      \u003C\u002Fp>\n\n      {%- if section.settings.show_hide_button and state != 'ended' -%}\n        \u003Cbutton type=\"button\" class=\"link link--text countdown-timer__hide\" data-hide hidden>\n          {{ 'sections.countdown_timer.hide' | t }}\n        \u003C\u002Fbutton>\n      {%- endif -%}\n\n      \u003Cp class=\"visually-hidden\" role=\"status\" data-status>\u003C\u002Fp>\n    \u003C\u002Fcountdown-timer>\n  \u003C\u002Fdiv>\n{%- endif -%}\n\n{% schema %}\n{\n  \"name\": \"t:sections.countdown-timer.name\",\n  \"tag\": \"section\",\n  \"class\": \"section\",\n  \"disabled_on\": { \"groups\": [\"footer\"] },\n  \"settings\": [\n    { \"type\": \"paragraph\", \"content\": \"t:sections.countdown-timer.settings.paragraph.content\" },\n    {\n      \"type\": \"text\",\n      \"id\": \"ends_at_fallback\",\n      \"label\": \"t:sections.countdown-timer.settings.ends_at_fallback.label\",\n      \"info\": \"t:sections.countdown-timer.settings.ends_at_fallback.info\"\n    },\n    {\n      \"type\": \"inline_richtext\",\n      \"id\": \"heading\",\n      \"default\": \"t:sections.countdown-timer.settings.heading.default\",\n      \"label\": \"t:sections.countdown-timer.settings.heading.label\"\n    },\n    {\n      \"type\": \"select\",\n      \"id\": \"heading_size\",\n      \"options\": [\n        { \"value\": \"h2\", \"label\": \"t:sections.all.heading_size.options__1.label\" },\n        { \"value\": \"h1\", \"label\": \"t:sections.all.heading_size.options__2.label\" },\n        { \"value\": \"h0\", \"label\": \"t:sections.all.heading_size.options__3.label\" }\n      ],\n      \"default\": \"h1\",\n      \"label\": \"t:sections.all.heading_size.label\"\n    },\n    {\n      \"type\": \"checkbox\",\n      \"id\": \"show_hide_button\",\n      \"default\": true,\n      \"label\": \"t:sections.countdown-timer.settings.show_hide_button.label\",\n      \"info\": \"t:sections.countdown-timer.settings.show_hide_button.info\"\n    },\n    { \"type\": \"color_scheme\", \"id\": \"color_scheme\", \"label\": \"t:sections.all.colors.label\", \"default\": \"scheme-1\" },\n    { \"type\": \"header\", \"content\": \"t:sections.all.padding.section_padding_heading\" },\n    { \"type\": \"range\", \"id\": \"padding_top\", \"min\": 0, \"max\": 100, \"step\": 4, \"unit\": \"px\", \"label\": \"t:sections.all.padding.padding_top\", \"default\": 36 },\n    { \"type\": \"range\", \"id\": \"padding_bottom\", \"min\": 0, \"max\": 100, \"step\": 4, \"unit\": \"px\", \"label\": \"t:sections.all.padding.padding_bottom\", \"default\": 36 }\n  ],\n  \"presets\": [{ \"name\": \"t:sections.countdown-timer.presets.name\" }]\n}\n{% endschema %}\n","liquid","",[388,892,893,901,907,914,920,926,932,938,944,950,956,962,968,974,979,985,991,996,1002,1008,1014,1020,1026,1032,1038,1043,1049,1054,1060,1066,1072,1078,1084,1089,1095,1101,1107,1113,1119,1124,1130,1135,1141,1147,1153,1159,1165,1171,1177,1183,1189,1195,1201,1207,1213,1219,1225,1231,1237,1243,1249,1254,1260,1266,1272,1278,1283,1289,1295,1301,1307,1313,1319,1325,1331,1337,1343,1348,1354,1360,1365,1370,1376,1382,1388,1394,1399,1404,1410,1416,1422,1428,1433,1439,1445,1451,1457,1463,1469,1475,1481,1487,1493,1499,1505,1511,1517,1522,1528,1534,1540,1546,1551,1556,1562,1568,1574,1580,1586,1592,1598,1604,1610,1615,1620,1626,1632,1638,1644,1650,1655,1661,1667,1673,1679,1685,1691,1697],{"__ignoreMap":890},[894,895,898],"span",{"class":896,"line":897},"line",1,[894,899,900],{},"{{ 'section-countdown-timer.css' | asset_url | stylesheet_tag }}\n",[894,902,904],{"class":896,"line":903},2,[894,905,906],{},"\u003Cscript src=\"{{ 'countdown-timer.js' | asset_url }}\" defer=\"defer\">\u003C\u002Fscript>\n",[894,908,910],{"class":896,"line":909},3,[894,911,913],{"emptyLinePlaceholder":912},true,"\n",[894,915,917],{"class":896,"line":916},4,[894,918,919],{},"{%- liquid\n",[894,921,923],{"class":896,"line":922},5,[894,924,925],{},"  assign ends_at = shop.metafields.promo.ends_at.value\n",[894,927,929],{"class":896,"line":928},6,[894,930,931],{},"  if ends_at == blank\n",[894,933,935],{"class":896,"line":934},7,[894,936,937],{},"    assign ends_at = section.settings.ends_at_fallback\n",[894,939,941],{"class":896,"line":940},8,[894,942,943],{},"  endif\n",[894,945,947],{"class":896,"line":946},9,[894,948,949],{},"  assign ends_at = ends_at | strip\n",[894,951,953],{"class":896,"line":952},10,[894,954,955],{},"  assign last_char = ends_at | slice: -1\n",[894,957,959],{"class":896,"line":958},11,[894,960,961],{},"  assign has_offset = false\n",[894,963,965],{"class":896,"line":964},12,[894,966,967],{},"  if last_char == 'Z' or ends_at contains '+'\n",[894,969,971],{"class":896,"line":970},13,[894,972,973],{},"    assign has_offset = true\n",[894,975,977],{"class":896,"line":976},14,[894,978,943],{},[894,980,982],{"class":896,"line":981},15,[894,983,984],{},"  if ends_at != blank and has_offset == false\n",[894,986,988],{"class":896,"line":987},16,[894,989,990],{},"    assign ends_at = ends_at | append: 'Z'\n",[894,992,994],{"class":896,"line":993},17,[894,995,943],{},[894,997,999],{"class":896,"line":998},18,[894,1000,1001],{},"  assign ends_at_unix = ends_at | date: '%s' | plus: 0\n",[894,1003,1005],{"class":896,"line":1004},19,[894,1006,1007],{},"  assign rendered_at_unix = 'now' | date: '%s' | plus: 0\n",[894,1009,1011],{"class":896,"line":1010},20,[894,1012,1013],{},"  assign state = 'running'\n",[894,1015,1017],{"class":896,"line":1016},21,[894,1018,1019],{},"  if ends_at == blank or ends_at_unix == 0\n",[894,1021,1023],{"class":896,"line":1022},22,[894,1024,1025],{},"    assign state = 'missing'\n",[894,1027,1029],{"class":896,"line":1028},23,[894,1030,1031],{},"  elsif rendered_at_unix >= ends_at_unix\n",[894,1033,1035],{"class":896,"line":1034},24,[894,1036,1037],{},"    assign state = 'ended'\n",[894,1039,1041],{"class":896,"line":1040},25,[894,1042,943],{},[894,1044,1046],{"class":896,"line":1045},26,[894,1047,1048],{},"-%}\n",[894,1050,1052],{"class":896,"line":1051},27,[894,1053,913],{"emptyLinePlaceholder":912},[894,1055,1057],{"class":896,"line":1056},28,[894,1058,1059],{},"{%- style -%}\n",[894,1061,1063],{"class":896,"line":1062},29,[894,1064,1065],{},"  .section-{{ section.id }}-padding {\n",[894,1067,1069],{"class":896,"line":1068},30,[894,1070,1071],{},"    padding-top: {{ section.settings.padding_top | times: 0.75 | round: 0 }}px;\n",[894,1073,1075],{"class":896,"line":1074},31,[894,1076,1077],{},"    padding-bottom: {{ section.settings.padding_bottom | times: 0.75 | round: 0 }}px;\n",[894,1079,1081],{"class":896,"line":1080},32,[894,1082,1083],{},"  }\n",[894,1085,1087],{"class":896,"line":1086},33,[894,1088,913],{"emptyLinePlaceholder":912},[894,1090,1092],{"class":896,"line":1091},34,[894,1093,1094],{},"  @media screen and (min-width: 750px) {\n",[894,1096,1098],{"class":896,"line":1097},35,[894,1099,1100],{},"    .section-{{ section.id }}-padding {\n",[894,1102,1104],{"class":896,"line":1103},36,[894,1105,1106],{},"      padding-top: {{ section.settings.padding_top }}px;\n",[894,1108,1110],{"class":896,"line":1109},37,[894,1111,1112],{},"      padding-bottom: {{ section.settings.padding_bottom }}px;\n",[894,1114,1116],{"class":896,"line":1115},38,[894,1117,1118],{},"    }\n",[894,1120,1122],{"class":896,"line":1121},39,[894,1123,1083],{},[894,1125,1127],{"class":896,"line":1126},40,[894,1128,1129],{},"{%- endstyle -%}\n",[894,1131,1133],{"class":896,"line":1132},41,[894,1134,913],{"emptyLinePlaceholder":912},[894,1136,1138],{"class":896,"line":1137},42,[894,1139,1140],{},"{%- if state == 'missing' -%}\n",[894,1142,1144],{"class":896,"line":1143},43,[894,1145,1146],{},"  {%- if request.design_mode -%}\n",[894,1148,1150],{"class":896,"line":1149},44,[894,1151,1152],{},"    \u003Cdiv class=\"page-width section-{{ section.id }}-padding\">\n",[894,1154,1156],{"class":896,"line":1155},45,[894,1157,1158],{},"      \u003Cp class=\"caption-with-letter-spacing\">{{ 'sections.countdown_timer.missing_end_time' | t }}\u003C\u002Fp>\n",[894,1160,1162],{"class":896,"line":1161},46,[894,1163,1164],{},"    \u003C\u002Fdiv>\n",[894,1166,1168],{"class":896,"line":1167},47,[894,1169,1170],{},"  {%- endif -%}\n",[894,1172,1174],{"class":896,"line":1173},48,[894,1175,1176],{},"{%- else -%}\n",[894,1178,1180],{"class":896,"line":1179},49,[894,1181,1182],{},"  \u003Cdiv class=\"color-{{ section.settings.color_scheme }} gradient section-{{ section.id }}-padding\">\n",[894,1184,1186],{"class":896,"line":1185},50,[894,1187,1188],{},"    \u003Ccountdown-timer\n",[894,1190,1192],{"class":896,"line":1191},51,[894,1193,1194],{},"      class=\"countdown-timer page-width\"\n",[894,1196,1198],{"class":896,"line":1197},52,[894,1199,1200],{},"      data-ends-at=\"{{ ends_at | escape }}\"\n",[894,1202,1204],{"class":896,"line":1203},53,[894,1205,1206],{},"      data-state=\"{{ state }}\"\n",[894,1208,1210],{"class":896,"line":1209},54,[894,1211,1212],{},"      data-section-id=\"{{ section.id }}\"\n",[894,1214,1216],{"class":896,"line":1215},55,[894,1217,1218],{},"    >\n",[894,1220,1222],{"class":896,"line":1221},56,[894,1223,1224],{},"      {%- if section.settings.heading != blank -%}\n",[894,1226,1228],{"class":896,"line":1227},57,[894,1229,1230],{},"        \u003Ch2 class=\"countdown-timer__heading inline-richtext {{ section.settings.heading_size }}\">\n",[894,1232,1234],{"class":896,"line":1233},58,[894,1235,1236],{},"          {{ section.settings.heading }}\n",[894,1238,1240],{"class":896,"line":1239},59,[894,1241,1242],{},"        \u003C\u002Fh2>\n",[894,1244,1246],{"class":896,"line":1245},60,[894,1247,1248],{},"      {%- endif -%}\n",[894,1250,1252],{"class":896,"line":1251},61,[894,1253,913],{"emptyLinePlaceholder":912},[894,1255,1257],{"class":896,"line":1256},62,[894,1258,1259],{},"      \u003Cp class=\"countdown-timer__ends-at\">\n",[894,1261,1263],{"class":896,"line":1262},63,[894,1264,1265],{},"        {{ 'sections.countdown_timer.ends_at_html' | t: ends_at: ends_at | date: '%Y-%m-%d %H:%M UTC' }}\n",[894,1267,1269],{"class":896,"line":1268},64,[894,1270,1271],{},"        \u003Ctime datetime=\"{{ ends_at | escape }}\" data-ends-at-local hidden>\u003C\u002Ftime>\n",[894,1273,1275],{"class":896,"line":1274},65,[894,1276,1277],{},"      \u003C\u002Fp>\n",[894,1279,1281],{"class":896,"line":1280},66,[894,1282,913],{"emptyLinePlaceholder":912},[894,1284,1286],{"class":896,"line":1285},67,[894,1287,1288],{},"      \u003Cdiv class=\"countdown-timer__clock\" data-clock{% if state == 'ended' %} hidden{% endif %} aria-hidden=\"true\">\n",[894,1290,1292],{"class":896,"line":1291},68,[894,1293,1294],{},"        {%- assign units = 'days,hours,minutes,seconds' | split: ',' -%}\n",[894,1296,1298],{"class":896,"line":1297},69,[894,1299,1300],{},"        {%- for unit in units -%}\n",[894,1302,1304],{"class":896,"line":1303},70,[894,1305,1306],{},"          {%- assign unit_key = 'sections.countdown_timer.' | append: unit -%}\n",[894,1308,1310],{"class":896,"line":1309},71,[894,1311,1312],{},"          \u003Cdiv class=\"countdown-timer__unit\" data-unit-wrapper=\"{{ unit }}\">\n",[894,1314,1316],{"class":896,"line":1315},72,[894,1317,1318],{},"            \u003Cspan class=\"countdown-timer__value h2\" data-unit=\"{{ unit }}\">--\u003C\u002Fspan>\n",[894,1320,1322],{"class":896,"line":1321},73,[894,1323,1324],{},"            \u003Cspan class=\"countdown-timer__label caption-with-letter-spacing\">{{ unit_key | t }}\u003C\u002Fspan>\n",[894,1326,1328],{"class":896,"line":1327},74,[894,1329,1330],{},"          \u003C\u002Fdiv>\n",[894,1332,1334],{"class":896,"line":1333},75,[894,1335,1336],{},"        {%- endfor -%}\n",[894,1338,1340],{"class":896,"line":1339},76,[894,1341,1342],{},"      \u003C\u002Fdiv>\n",[894,1344,1346],{"class":896,"line":1345},77,[894,1347,913],{"emptyLinePlaceholder":912},[894,1349,1351],{"class":896,"line":1350},78,[894,1352,1353],{},"      \u003Cp class=\"countdown-timer__ended\" data-ended{% unless state == 'ended' %} hidden{% endunless %}>\n",[894,1355,1357],{"class":896,"line":1356},79,[894,1358,1359],{},"        {{ 'sections.countdown_timer.ended' | t }}\n",[894,1361,1363],{"class":896,"line":1362},80,[894,1364,1277],{},[894,1366,1368],{"class":896,"line":1367},81,[894,1369,913],{"emptyLinePlaceholder":912},[894,1371,1373],{"class":896,"line":1372},82,[894,1374,1375],{},"      {%- if section.settings.show_hide_button and state != 'ended' -%}\n",[894,1377,1379],{"class":896,"line":1378},83,[894,1380,1381],{},"        \u003Cbutton type=\"button\" class=\"link link--text countdown-timer__hide\" data-hide hidden>\n",[894,1383,1385],{"class":896,"line":1384},84,[894,1386,1387],{},"          {{ 'sections.countdown_timer.hide' | t }}\n",[894,1389,1391],{"class":896,"line":1390},85,[894,1392,1393],{},"        \u003C\u002Fbutton>\n",[894,1395,1397],{"class":896,"line":1396},86,[894,1398,1248],{},[894,1400,1402],{"class":896,"line":1401},87,[894,1403,913],{"emptyLinePlaceholder":912},[894,1405,1407],{"class":896,"line":1406},88,[894,1408,1409],{},"      \u003Cp class=\"visually-hidden\" role=\"status\" data-status>\u003C\u002Fp>\n",[894,1411,1413],{"class":896,"line":1412},89,[894,1414,1415],{},"    \u003C\u002Fcountdown-timer>\n",[894,1417,1419],{"class":896,"line":1418},90,[894,1420,1421],{},"  \u003C\u002Fdiv>\n",[894,1423,1425],{"class":896,"line":1424},91,[894,1426,1427],{},"{%- endif -%}\n",[894,1429,1431],{"class":896,"line":1430},92,[894,1432,913],{"emptyLinePlaceholder":912},[894,1434,1436],{"class":896,"line":1435},93,[894,1437,1438],{},"{% schema %}\n",[894,1440,1442],{"class":896,"line":1441},94,[894,1443,1444],{},"{\n",[894,1446,1448],{"class":896,"line":1447},95,[894,1449,1450],{},"  \"name\": \"t:sections.countdown-timer.name\",\n",[894,1452,1454],{"class":896,"line":1453},96,[894,1455,1456],{},"  \"tag\": \"section\",\n",[894,1458,1460],{"class":896,"line":1459},97,[894,1461,1462],{},"  \"class\": \"section\",\n",[894,1464,1466],{"class":896,"line":1465},98,[894,1467,1468],{},"  \"disabled_on\": { \"groups\": [\"footer\"] },\n",[894,1470,1472],{"class":896,"line":1471},99,[894,1473,1474],{},"  \"settings\": [\n",[894,1476,1478],{"class":896,"line":1477},100,[894,1479,1480],{},"    { \"type\": \"paragraph\", \"content\": \"t:sections.countdown-timer.settings.paragraph.content\" },\n",[894,1482,1484],{"class":896,"line":1483},101,[894,1485,1486],{},"    {\n",[894,1488,1490],{"class":896,"line":1489},102,[894,1491,1492],{},"      \"type\": \"text\",\n",[894,1494,1496],{"class":896,"line":1495},103,[894,1497,1498],{},"      \"id\": \"ends_at_fallback\",\n",[894,1500,1502],{"class":896,"line":1501},104,[894,1503,1504],{},"      \"label\": \"t:sections.countdown-timer.settings.ends_at_fallback.label\",\n",[894,1506,1508],{"class":896,"line":1507},105,[894,1509,1510],{},"      \"info\": \"t:sections.countdown-timer.settings.ends_at_fallback.info\"\n",[894,1512,1514],{"class":896,"line":1513},106,[894,1515,1516],{},"    },\n",[894,1518,1520],{"class":896,"line":1519},107,[894,1521,1486],{},[894,1523,1525],{"class":896,"line":1524},108,[894,1526,1527],{},"      \"type\": \"inline_richtext\",\n",[894,1529,1531],{"class":896,"line":1530},109,[894,1532,1533],{},"      \"id\": \"heading\",\n",[894,1535,1537],{"class":896,"line":1536},110,[894,1538,1539],{},"      \"default\": \"t:sections.countdown-timer.settings.heading.default\",\n",[894,1541,1543],{"class":896,"line":1542},111,[894,1544,1545],{},"      \"label\": \"t:sections.countdown-timer.settings.heading.label\"\n",[894,1547,1549],{"class":896,"line":1548},112,[894,1550,1516],{},[894,1552,1554],{"class":896,"line":1553},113,[894,1555,1486],{},[894,1557,1559],{"class":896,"line":1558},114,[894,1560,1561],{},"      \"type\": \"select\",\n",[894,1563,1565],{"class":896,"line":1564},115,[894,1566,1567],{},"      \"id\": \"heading_size\",\n",[894,1569,1571],{"class":896,"line":1570},116,[894,1572,1573],{},"      \"options\": [\n",[894,1575,1577],{"class":896,"line":1576},117,[894,1578,1579],{},"        { \"value\": \"h2\", \"label\": \"t:sections.all.heading_size.options__1.label\" },\n",[894,1581,1583],{"class":896,"line":1582},118,[894,1584,1585],{},"        { \"value\": \"h1\", \"label\": \"t:sections.all.heading_size.options__2.label\" },\n",[894,1587,1589],{"class":896,"line":1588},119,[894,1590,1591],{},"        { \"value\": \"h0\", \"label\": \"t:sections.all.heading_size.options__3.label\" }\n",[894,1593,1595],{"class":896,"line":1594},120,[894,1596,1597],{},"      ],\n",[894,1599,1601],{"class":896,"line":1600},121,[894,1602,1603],{},"      \"default\": \"h1\",\n",[894,1605,1607],{"class":896,"line":1606},122,[894,1608,1609],{},"      \"label\": \"t:sections.all.heading_size.label\"\n",[894,1611,1613],{"class":896,"line":1612},123,[894,1614,1516],{},[894,1616,1618],{"class":896,"line":1617},124,[894,1619,1486],{},[894,1621,1623],{"class":896,"line":1622},125,[894,1624,1625],{},"      \"type\": \"checkbox\",\n",[894,1627,1629],{"class":896,"line":1628},126,[894,1630,1631],{},"      \"id\": \"show_hide_button\",\n",[894,1633,1635],{"class":896,"line":1634},127,[894,1636,1637],{},"      \"default\": true,\n",[894,1639,1641],{"class":896,"line":1640},128,[894,1642,1643],{},"      \"label\": \"t:sections.countdown-timer.settings.show_hide_button.label\",\n",[894,1645,1647],{"class":896,"line":1646},129,[894,1648,1649],{},"      \"info\": \"t:sections.countdown-timer.settings.show_hide_button.info\"\n",[894,1651,1653],{"class":896,"line":1652},130,[894,1654,1516],{},[894,1656,1658],{"class":896,"line":1657},131,[894,1659,1660],{},"    { \"type\": \"color_scheme\", \"id\": \"color_scheme\", \"label\": \"t:sections.all.colors.label\", \"default\": \"scheme-1\" },\n",[894,1662,1664],{"class":896,"line":1663},132,[894,1665,1666],{},"    { \"type\": \"header\", \"content\": \"t:sections.all.padding.section_padding_heading\" },\n",[894,1668,1670],{"class":896,"line":1669},133,[894,1671,1672],{},"    { \"type\": \"range\", \"id\": \"padding_top\", \"min\": 0, \"max\": 100, \"step\": 4, \"unit\": \"px\", \"label\": \"t:sections.all.padding.padding_top\", \"default\": 36 },\n",[894,1674,1676],{"class":896,"line":1675},134,[894,1677,1678],{},"    { \"type\": \"range\", \"id\": \"padding_bottom\", \"min\": 0, \"max\": 100, \"step\": 4, \"unit\": \"px\", \"label\": \"t:sections.all.padding.padding_bottom\", \"default\": 36 }\n",[894,1680,1682],{"class":896,"line":1681},135,[894,1683,1684],{},"  ],\n",[894,1686,1688],{"class":896,"line":1687},136,[894,1689,1690],{},"  \"presets\": [{ \"name\": \"t:sections.countdown-timer.presets.name\" }]\n",[894,1692,1694],{"class":896,"line":1693},137,[894,1695,1696],{},"}\n",[894,1698,1700],{"class":896,"line":1699},138,[894,1701,1702],{},"{% endschema %}\n",[378,1704,1705],{},"三种状态由服务端决定：",[489,1707,1708,1732,1747],{},[492,1709,1710,1715,1716,1719,1720,1723,1724,1726,1727,1731],{},[409,1711,1712],{},[388,1713,1714],{},"missing","：没有截止时间，或字符串经 ",[388,1717,1718],{},"date: '%s'"," 得不到有效时间戳。前台不输出任何内容；只在 ",[388,1721,1722],{},"request.design_mode"," 下显示一行提示，告诉商家去哪里填。这对应通用契约里「数据缺失时隐藏倒计时」，同时沿用 Dawn 用 ",[388,1725,1722],{}," 区分编辑器的做法（",[382,1728,1730],{"href":1729},"\u002Fzh\u002Fshopify\u002Fthemes\u002Fdawn\u002Ftheme-editor-events","主题编辑器适配","）。",[492,1733,1734,1739,1740,1743,1744,1746],{},[409,1735,1736],{},[388,1737,1738],{},"ended","：渲染时刻已经晚于截止时刻。数字骨架带 ",[388,1741,1742],{},"hidden"," 输出，直接显示「已结束」。因为 ",[388,1745,581],{}," 可能是缓存时间，这个判断只会偏保守：缓存页面渲染得早，服务端判断为未结束时，由浏览器脚本补判；反过来不会发生，所以不会出现「已结束又重新开始」。",[492,1748,1749,1754,1755,1758,1759,1762],{},[409,1750,1751],{},[388,1752,1753],{},"running","：输出带时区的静态截止文案（UTC），",[388,1756,1757],{},"\u003Ctime datetime>"," 承载机器可读值，再输出四个值为 ",[388,1760,1761],{},"--"," 的占位。没有 JavaScript 时访客看到的就是这一行绝对时间，没有假数字。",[378,1764,1765,1768,1769,1771,1772,1775],{},[388,1766,1767],{},"show_hide_button"," 产生的按钮带 ",[388,1770,1742],{}," 输出，由脚本在确认能运行后再显示，避免无 JS 时出现没有作用的按钮。",[388,1773,1774],{},"aria-hidden=\"true\""," 加在数字区上，让每分钟或每秒变化的数字不进入辅助技术的读取顺序；对读屏用户有意义的信息是上一行的绝对时间。",[422,1777,1778],{"id":1778},"自定义元素",[885,1780,1784],{"className":1781,"code":1782,"language":1783,"meta":890,"style":890},"language-js shiki shiki-themes github-light","if (!customElements.get('countdown-timer')) {\n  customElements.define(\n    'countdown-timer',\n    class CountdownTimer extends HTMLElement {\n      static STORAGE_KEY = 'countdown-timer-hidden';\n\n      connectedCallback() {\n        this.endsAt = Date.parse(this.dataset.endsAt);\n        this.clock = this.querySelector('[data-clock]');\n        this.values = Object.fromEntries(\n          Array.from(this.querySelectorAll('[data-unit]')).map((element) => [element.dataset.unit, element])\n        );\n        this.secondsWrapper = this.querySelector('[data-unit-wrapper=\"seconds\"]');\n        this.endedMessage = this.querySelector('[data-ended]');\n        this.status = this.querySelector('[data-status]');\n        this.hideButton = this.querySelector('[data-hide]');\n        this.localTime = this.querySelector('[data-ends-at-local]');\n        this.skew = 0;\n        this.announcedHour = false;\n\n        if (Number.isNaN(this.endsAt) || this.dataset.state === 'ended') {\n          this.finish(false);\n          return;\n        }\n\n        this.renderLocalTime();\n        this.hideButton?.addEventListener('click', this.onHide.bind(this));\n        if (this.hideButton && this.readHiddenPreference()) {\n          this.hideClock();\n        } else {\n          this.hideButton?.removeAttribute('hidden');\n        }\n\n        this.estimateSkew().finally(() => {\n          if (!this.isConnected) return;\n          this.tick();\n        });\n      }\n\n      disconnectedCallback() {\n        clearTimeout(this.timer);\n      }\n\n      async estimateSkew() {\n        try {\n          const sentAt = Date.now();\n          const response = await fetch(window.location.href, { method: 'HEAD', cache: 'no-store' });\n          const serverDate = Date.parse(response.headers.get('date'));\n          if (Number.isNaN(serverDate)) return;\n          const roundTrip = Date.now() - sentAt;\n          this.skew = serverDate + roundTrip \u002F 2 - Date.now();\n        } catch {\n          this.skew = 0;\n        }\n      }\n\n      remainingMs() {\n        return this.endsAt - (Date.now() + this.skew);\n      }\n\n      tick() {\n        const remaining = this.remainingMs();\n        if (remaining \u003C= 0) {\n          this.finish(true);\n          return;\n        }\n\n        const totalSeconds = Math.floor(remaining \u002F 1000);\n        const parts = {\n          days: Math.floor(totalSeconds \u002F 86400),\n          hours: Math.floor((totalSeconds % 86400) \u002F 3600),\n          minutes: Math.floor((totalSeconds % 3600) \u002F 60),\n          seconds: totalSeconds % 60,\n        };\n        const underOneHour = remaining \u003C 3600 * 1000;\n        Object.entries(parts).forEach(([unit, value]) => {\n          const element = this.values[unit];\n          if (element) element.textContent = String(value).padStart(2, '0');\n        });\n        this.secondsWrapper?.toggleAttribute('hidden', !underOneHour);\n\n        if (underOneHour && !this.announcedHour) {\n          this.announcedHour = true;\n          this.announce(window.countdownStrings.lessThanOneHour);\n        }\n\n        const interval = underOneHour ? 1000 : 60 * 1000;\n        this.timer = setTimeout(this.tick.bind(this), interval - (remaining % interval || interval));\n      }\n\n      finish(announce) {\n        clearTimeout(this.timer);\n        this.dataset.state = 'ended';\n        this.clock?.setAttribute('hidden', '');\n        this.hideButton?.setAttribute('hidden', '');\n        this.endedMessage?.removeAttribute('hidden');\n        if (announce) this.announce(window.countdownStrings.ended);\n      }\n\n      announce(message) {\n        if (!this.status || !message) return;\n        this.status.textContent = '';\n        requestAnimationFrame(() => {\n          this.status.textContent = message;\n        });\n      }\n\n      renderLocalTime() {\n        if (!this.localTime || typeof Intl === 'undefined') return;\n        try {\n          const formatter = new Intl.DateTimeFormat(document.documentElement.lang || undefined, {\n            dateStyle: 'medium',\n            timeStyle: 'short',\n            timeZoneName: 'short',\n          });\n          this.localTime.textContent = ` (${formatter.format(new Date(this.endsAt))})`;\n          this.localTime.removeAttribute('hidden');\n        } catch {\n          \u002F\u002F keep the server-rendered UTC text only\n        }\n      }\n\n      onHide() {\n        this.hideClock();\n        try {\n          sessionStorage.setItem(CountdownTimer.STORAGE_KEY, '1');\n        } catch {\n          \u002F\u002F storage unavailable; hide for this page only\n        }\n      }\n\n      hideClock() {\n        this.clock?.setAttribute('hidden', '');\n        this.hideButton?.setAttribute('hidden', '');\n        clearTimeout(this.timer);\n        this.timer = setTimeout(this.tick.bind(this), 60 * 1000);\n      }\n\n      readHiddenPreference() {\n        try {\n          return sessionStorage.getItem(CountdownTimer.STORAGE_KEY) === '1';\n        } catch {\n          return false;\n        }\n      }\n    }\n  );\n}\n","js",[388,1785,1786,1816,1827,1835,1852,1870,1874,1882,1908,1934,1951,1994,1999,2021,2043,2065,2087,2109,2123,2137,2141,2176,2193,2200,2205,2209,2221,2254,2277,2288,2298,2314,2318,2322,2344,2363,2374,2379,2384,2388,2395,2407,2411,2415,2425,2432,2448,2478,2503,2518,2540,2571,2580,2592,2596,2600,2604,2611,2636,2640,2644,2651,2670,2684,2699,2705,2709,2713,2738,2749,2767,2791,2813,2824,2829,2853,2884,2898,2928,2932,2953,2957,2974,2987,2999,3003,3007,3035,3077,3081,3085,3096,3106,3118,3139,3157,3172,3188,3192,3196,3208,3231,3245,3256,3267,3271,3275,3279,3286,3317,3323,3352,3362,3372,3381,3386,3430,3445,3453,3459,3463,3467,3471,3478,3488,3494,3515,3523,3528,3532,3536,3540,3547,3565,3583,3593,3627,3631,3635,3643,3650,3674,3683,3692,3697,3702,3707,3713],{"__ignoreMap":890},[894,1787,1788,1792,1796,1799,1802,1806,1809,1813],{"class":896,"line":897},[894,1789,1791],{"class":1790},"sD7c4","if",[894,1793,1795],{"class":1794},"sgsFI"," (",[894,1797,1798],{"class":1790},"!",[894,1800,1801],{"class":1794},"customElements.",[894,1803,1805],{"class":1804},"s7eDp","get",[894,1807,1808],{"class":1794},"(",[894,1810,1812],{"class":1811},"sYBdl","'countdown-timer'",[894,1814,1815],{"class":1794},")) {\n",[894,1817,1818,1821,1824],{"class":896,"line":903},[894,1819,1820],{"class":1794},"  customElements.",[894,1822,1823],{"class":1804},"define",[894,1825,1826],{"class":1794},"(\n",[894,1828,1829,1832],{"class":896,"line":909},[894,1830,1831],{"class":1811},"    'countdown-timer'",[894,1833,1834],{"class":1794},",\n",[894,1836,1837,1840,1843,1846,1849],{"class":896,"line":916},[894,1838,1839],{"class":1790},"    class",[894,1841,1842],{"class":1804}," CountdownTimer",[894,1844,1845],{"class":1790}," extends",[894,1847,1848],{"class":1804}," HTMLElement",[894,1850,1851],{"class":1794}," {\n",[894,1853,1854,1857,1861,1864,1867],{"class":896,"line":922},[894,1855,1856],{"class":1790},"      static",[894,1858,1860],{"class":1859},"sqxcx"," STORAGE_KEY",[894,1862,1863],{"class":1790}," =",[894,1865,1866],{"class":1811}," 'countdown-timer-hidden'",[894,1868,1869],{"class":1794},";\n",[894,1871,1872],{"class":896,"line":928},[894,1873,913],{"emptyLinePlaceholder":912},[894,1875,1876,1879],{"class":896,"line":934},[894,1877,1878],{"class":1804},"      connectedCallback",[894,1880,1881],{"class":1794},"() {\n",[894,1883,1884,1888,1891,1894,1897,1900,1902,1905],{"class":896,"line":940},[894,1885,1887],{"class":1886},"sYu0t","        this",[894,1889,1890],{"class":1794},".endsAt ",[894,1892,1893],{"class":1790},"=",[894,1895,1896],{"class":1794}," Date.",[894,1898,1899],{"class":1804},"parse",[894,1901,1808],{"class":1794},[894,1903,1904],{"class":1886},"this",[894,1906,1907],{"class":1794},".dataset.endsAt);\n",[894,1909,1910,1912,1915,1917,1920,1923,1926,1928,1931],{"class":896,"line":946},[894,1911,1887],{"class":1886},[894,1913,1914],{"class":1794},".clock ",[894,1916,1893],{"class":1790},[894,1918,1919],{"class":1886}," this",[894,1921,1922],{"class":1794},".",[894,1924,1925],{"class":1804},"querySelector",[894,1927,1808],{"class":1794},[894,1929,1930],{"class":1811},"'[data-clock]'",[894,1932,1933],{"class":1794},");\n",[894,1935,1936,1938,1941,1943,1946,1949],{"class":896,"line":952},[894,1937,1887],{"class":1886},[894,1939,1940],{"class":1794},".values ",[894,1942,1893],{"class":1790},[894,1944,1945],{"class":1794}," Object.",[894,1947,1948],{"class":1804},"fromEntries",[894,1950,1826],{"class":1794},[894,1952,1953,1956,1959,1961,1963,1965,1968,1970,1973,1976,1979,1982,1985,1988,1991],{"class":896,"line":958},[894,1954,1955],{"class":1794},"          Array.",[894,1957,1958],{"class":1804},"from",[894,1960,1808],{"class":1794},[894,1962,1904],{"class":1886},[894,1964,1922],{"class":1794},[894,1966,1967],{"class":1804},"querySelectorAll",[894,1969,1808],{"class":1794},[894,1971,1972],{"class":1811},"'[data-unit]'",[894,1974,1975],{"class":1794},")).",[894,1977,1978],{"class":1804},"map",[894,1980,1981],{"class":1794},"((",[894,1983,1984],{"class":1859},"element",[894,1986,1987],{"class":1794},") ",[894,1989,1990],{"class":1790},"=>",[894,1992,1993],{"class":1794}," [element.dataset.unit, element])\n",[894,1995,1996],{"class":896,"line":964},[894,1997,1998],{"class":1794},"        );\n",[894,2000,2001,2003,2006,2008,2010,2012,2014,2016,2019],{"class":896,"line":970},[894,2002,1887],{"class":1886},[894,2004,2005],{"class":1794},".secondsWrapper ",[894,2007,1893],{"class":1790},[894,2009,1919],{"class":1886},[894,2011,1922],{"class":1794},[894,2013,1925],{"class":1804},[894,2015,1808],{"class":1794},[894,2017,2018],{"class":1811},"'[data-unit-wrapper=\"seconds\"]'",[894,2020,1933],{"class":1794},[894,2022,2023,2025,2028,2030,2032,2034,2036,2038,2041],{"class":896,"line":976},[894,2024,1887],{"class":1886},[894,2026,2027],{"class":1794},".endedMessage ",[894,2029,1893],{"class":1790},[894,2031,1919],{"class":1886},[894,2033,1922],{"class":1794},[894,2035,1925],{"class":1804},[894,2037,1808],{"class":1794},[894,2039,2040],{"class":1811},"'[data-ended]'",[894,2042,1933],{"class":1794},[894,2044,2045,2047,2050,2052,2054,2056,2058,2060,2063],{"class":896,"line":981},[894,2046,1887],{"class":1886},[894,2048,2049],{"class":1794},".status ",[894,2051,1893],{"class":1790},[894,2053,1919],{"class":1886},[894,2055,1922],{"class":1794},[894,2057,1925],{"class":1804},[894,2059,1808],{"class":1794},[894,2061,2062],{"class":1811},"'[data-status]'",[894,2064,1933],{"class":1794},[894,2066,2067,2069,2072,2074,2076,2078,2080,2082,2085],{"class":896,"line":987},[894,2068,1887],{"class":1886},[894,2070,2071],{"class":1794},".hideButton ",[894,2073,1893],{"class":1790},[894,2075,1919],{"class":1886},[894,2077,1922],{"class":1794},[894,2079,1925],{"class":1804},[894,2081,1808],{"class":1794},[894,2083,2084],{"class":1811},"'[data-hide]'",[894,2086,1933],{"class":1794},[894,2088,2089,2091,2094,2096,2098,2100,2102,2104,2107],{"class":896,"line":993},[894,2090,1887],{"class":1886},[894,2092,2093],{"class":1794},".localTime ",[894,2095,1893],{"class":1790},[894,2097,1919],{"class":1886},[894,2099,1922],{"class":1794},[894,2101,1925],{"class":1804},[894,2103,1808],{"class":1794},[894,2105,2106],{"class":1811},"'[data-ends-at-local]'",[894,2108,1933],{"class":1794},[894,2110,2111,2113,2116,2118,2121],{"class":896,"line":998},[894,2112,1887],{"class":1886},[894,2114,2115],{"class":1794},".skew ",[894,2117,1893],{"class":1790},[894,2119,2120],{"class":1886}," 0",[894,2122,1869],{"class":1794},[894,2124,2125,2127,2130,2132,2135],{"class":896,"line":1004},[894,2126,1887],{"class":1886},[894,2128,2129],{"class":1794},".announcedHour ",[894,2131,1893],{"class":1790},[894,2133,2134],{"class":1886}," false",[894,2136,1869],{"class":1794},[894,2138,2139],{"class":896,"line":1010},[894,2140,913],{"emptyLinePlaceholder":912},[894,2142,2143,2146,2149,2152,2154,2156,2159,2162,2164,2167,2170,2173],{"class":896,"line":1016},[894,2144,2145],{"class":1790},"        if",[894,2147,2148],{"class":1794}," (Number.",[894,2150,2151],{"class":1804},"isNaN",[894,2153,1808],{"class":1794},[894,2155,1904],{"class":1886},[894,2157,2158],{"class":1794},".endsAt) ",[894,2160,2161],{"class":1790},"||",[894,2163,1919],{"class":1886},[894,2165,2166],{"class":1794},".dataset.state ",[894,2168,2169],{"class":1790},"===",[894,2171,2172],{"class":1811}," 'ended'",[894,2174,2175],{"class":1794},") {\n",[894,2177,2178,2181,2183,2186,2188,2191],{"class":896,"line":1022},[894,2179,2180],{"class":1886},"          this",[894,2182,1922],{"class":1794},[894,2184,2185],{"class":1804},"finish",[894,2187,1808],{"class":1794},[894,2189,2190],{"class":1886},"false",[894,2192,1933],{"class":1794},[894,2194,2195,2198],{"class":896,"line":1028},[894,2196,2197],{"class":1790},"          return",[894,2199,1869],{"class":1794},[894,2201,2202],{"class":896,"line":1034},[894,2203,2204],{"class":1794},"        }\n",[894,2206,2207],{"class":896,"line":1040},[894,2208,913],{"emptyLinePlaceholder":912},[894,2210,2211,2213,2215,2218],{"class":896,"line":1045},[894,2212,1887],{"class":1886},[894,2214,1922],{"class":1794},[894,2216,2217],{"class":1804},"renderLocalTime",[894,2219,2220],{"class":1794},"();\n",[894,2222,2223,2225,2228,2231,2233,2236,2239,2241,2244,2247,2249,2251],{"class":896,"line":1051},[894,2224,1887],{"class":1886},[894,2226,2227],{"class":1794},".hideButton?.",[894,2229,2230],{"class":1804},"addEventListener",[894,2232,1808],{"class":1794},[894,2234,2235],{"class":1811},"'click'",[894,2237,2238],{"class":1794},", ",[894,2240,1904],{"class":1886},[894,2242,2243],{"class":1794},".onHide.",[894,2245,2246],{"class":1804},"bind",[894,2248,1808],{"class":1794},[894,2250,1904],{"class":1886},[894,2252,2253],{"class":1794},"));\n",[894,2255,2256,2258,2260,2262,2264,2267,2269,2271,2274],{"class":896,"line":1056},[894,2257,2145],{"class":1790},[894,2259,1795],{"class":1794},[894,2261,1904],{"class":1886},[894,2263,2071],{"class":1794},[894,2265,2266],{"class":1790},"&&",[894,2268,1919],{"class":1886},[894,2270,1922],{"class":1794},[894,2272,2273],{"class":1804},"readHiddenPreference",[894,2275,2276],{"class":1794},"()) {\n",[894,2278,2279,2281,2283,2286],{"class":896,"line":1062},[894,2280,2180],{"class":1886},[894,2282,1922],{"class":1794},[894,2284,2285],{"class":1804},"hideClock",[894,2287,2220],{"class":1794},[894,2289,2290,2293,2296],{"class":896,"line":1068},[894,2291,2292],{"class":1794},"        } ",[894,2294,2295],{"class":1790},"else",[894,2297,1851],{"class":1794},[894,2299,2300,2302,2304,2307,2309,2312],{"class":896,"line":1074},[894,2301,2180],{"class":1886},[894,2303,2227],{"class":1794},[894,2305,2306],{"class":1804},"removeAttribute",[894,2308,1808],{"class":1794},[894,2310,2311],{"class":1811},"'hidden'",[894,2313,1933],{"class":1794},[894,2315,2316],{"class":896,"line":1080},[894,2317,2204],{"class":1794},[894,2319,2320],{"class":896,"line":1086},[894,2321,913],{"emptyLinePlaceholder":912},[894,2323,2324,2326,2328,2331,2334,2337,2340,2342],{"class":896,"line":1091},[894,2325,1887],{"class":1886},[894,2327,1922],{"class":1794},[894,2329,2330],{"class":1804},"estimateSkew",[894,2332,2333],{"class":1794},"().",[894,2335,2336],{"class":1804},"finally",[894,2338,2339],{"class":1794},"(() ",[894,2341,1990],{"class":1790},[894,2343,1851],{"class":1794},[894,2345,2346,2349,2351,2353,2355,2358,2361],{"class":896,"line":1097},[894,2347,2348],{"class":1790},"          if",[894,2350,1795],{"class":1794},[894,2352,1798],{"class":1790},[894,2354,1904],{"class":1886},[894,2356,2357],{"class":1794},".isConnected) ",[894,2359,2360],{"class":1790},"return",[894,2362,1869],{"class":1794},[894,2364,2365,2367,2369,2372],{"class":896,"line":1103},[894,2366,2180],{"class":1886},[894,2368,1922],{"class":1794},[894,2370,2371],{"class":1804},"tick",[894,2373,2220],{"class":1794},[894,2375,2376],{"class":896,"line":1109},[894,2377,2378],{"class":1794},"        });\n",[894,2380,2381],{"class":896,"line":1115},[894,2382,2383],{"class":1794},"      }\n",[894,2385,2386],{"class":896,"line":1121},[894,2387,913],{"emptyLinePlaceholder":912},[894,2389,2390,2393],{"class":896,"line":1126},[894,2391,2392],{"class":1804},"      disconnectedCallback",[894,2394,1881],{"class":1794},[894,2396,2397,2400,2402,2404],{"class":896,"line":1132},[894,2398,2399],{"class":1804},"        clearTimeout",[894,2401,1808],{"class":1794},[894,2403,1904],{"class":1886},[894,2405,2406],{"class":1794},".timer);\n",[894,2408,2409],{"class":896,"line":1137},[894,2410,2383],{"class":1794},[894,2412,2413],{"class":896,"line":1143},[894,2414,913],{"emptyLinePlaceholder":912},[894,2416,2417,2420,2423],{"class":896,"line":1149},[894,2418,2419],{"class":1790},"      async",[894,2421,2422],{"class":1804}," estimateSkew",[894,2424,1881],{"class":1794},[894,2426,2427,2430],{"class":896,"line":1155},[894,2428,2429],{"class":1790},"        try",[894,2431,1851],{"class":1794},[894,2433,2434,2437,2440,2442,2444,2446],{"class":896,"line":1161},[894,2435,2436],{"class":1790},"          const",[894,2438,2439],{"class":1886}," sentAt",[894,2441,1863],{"class":1790},[894,2443,1896],{"class":1794},[894,2445,573],{"class":1804},[894,2447,2220],{"class":1794},[894,2449,2450,2452,2455,2457,2460,2463,2466,2469,2472,2475],{"class":896,"line":1167},[894,2451,2436],{"class":1790},[894,2453,2454],{"class":1886}," response",[894,2456,1863],{"class":1790},[894,2458,2459],{"class":1790}," await",[894,2461,2462],{"class":1804}," fetch",[894,2464,2465],{"class":1794},"(window.location.href, { method: ",[894,2467,2468],{"class":1811},"'HEAD'",[894,2470,2471],{"class":1794},", cache: ",[894,2473,2474],{"class":1811},"'no-store'",[894,2476,2477],{"class":1794}," });\n",[894,2479,2480,2482,2485,2487,2489,2491,2494,2496,2498,2501],{"class":896,"line":1173},[894,2481,2436],{"class":1790},[894,2483,2484],{"class":1886}," serverDate",[894,2486,1863],{"class":1790},[894,2488,1896],{"class":1794},[894,2490,1899],{"class":1804},[894,2492,2493],{"class":1794},"(response.headers.",[894,2495,1805],{"class":1804},[894,2497,1808],{"class":1794},[894,2499,2500],{"class":1811},"'date'",[894,2502,2253],{"class":1794},[894,2504,2505,2507,2509,2511,2514,2516],{"class":896,"line":1179},[894,2506,2348],{"class":1790},[894,2508,2148],{"class":1794},[894,2510,2151],{"class":1804},[894,2512,2513],{"class":1794},"(serverDate)) ",[894,2515,2360],{"class":1790},[894,2517,1869],{"class":1794},[894,2519,2520,2522,2525,2527,2529,2531,2534,2537],{"class":896,"line":1185},[894,2521,2436],{"class":1790},[894,2523,2524],{"class":1886}," roundTrip",[894,2526,1863],{"class":1790},[894,2528,1896],{"class":1794},[894,2530,573],{"class":1804},[894,2532,2533],{"class":1794},"() ",[894,2535,2536],{"class":1790},"-",[894,2538,2539],{"class":1794}," sentAt;\n",[894,2541,2542,2544,2546,2548,2551,2553,2556,2559,2562,2565,2567,2569],{"class":896,"line":1191},[894,2543,2180],{"class":1886},[894,2545,2115],{"class":1794},[894,2547,1893],{"class":1790},[894,2549,2550],{"class":1794}," serverDate ",[894,2552,683],{"class":1790},[894,2554,2555],{"class":1794}," roundTrip ",[894,2557,2558],{"class":1790},"\u002F",[894,2560,2561],{"class":1886}," 2",[894,2563,2564],{"class":1790}," -",[894,2566,1896],{"class":1794},[894,2568,573],{"class":1804},[894,2570,2220],{"class":1794},[894,2572,2573,2575,2578],{"class":896,"line":1197},[894,2574,2292],{"class":1794},[894,2576,2577],{"class":1790},"catch",[894,2579,1851],{"class":1794},[894,2581,2582,2584,2586,2588,2590],{"class":896,"line":1203},[894,2583,2180],{"class":1886},[894,2585,2115],{"class":1794},[894,2587,1893],{"class":1790},[894,2589,2120],{"class":1886},[894,2591,1869],{"class":1794},[894,2593,2594],{"class":896,"line":1209},[894,2595,2204],{"class":1794},[894,2597,2598],{"class":896,"line":1215},[894,2599,2383],{"class":1794},[894,2601,2602],{"class":896,"line":1221},[894,2603,913],{"emptyLinePlaceholder":912},[894,2605,2606,2609],{"class":896,"line":1227},[894,2607,2608],{"class":1804},"      remainingMs",[894,2610,1881],{"class":1794},[894,2612,2613,2616,2618,2620,2622,2625,2627,2629,2631,2633],{"class":896,"line":1233},[894,2614,2615],{"class":1790},"        return",[894,2617,1919],{"class":1886},[894,2619,1890],{"class":1794},[894,2621,2536],{"class":1790},[894,2623,2624],{"class":1794}," (Date.",[894,2626,573],{"class":1804},[894,2628,2533],{"class":1794},[894,2630,683],{"class":1790},[894,2632,1919],{"class":1886},[894,2634,2635],{"class":1794},".skew);\n",[894,2637,2638],{"class":896,"line":1239},[894,2639,2383],{"class":1794},[894,2641,2642],{"class":896,"line":1245},[894,2643,913],{"emptyLinePlaceholder":912},[894,2645,2646,2649],{"class":896,"line":1251},[894,2647,2648],{"class":1804},"      tick",[894,2650,1881],{"class":1794},[894,2652,2653,2656,2659,2661,2663,2665,2668],{"class":896,"line":1256},[894,2654,2655],{"class":1790},"        const",[894,2657,2658],{"class":1886}," remaining",[894,2660,1863],{"class":1790},[894,2662,1919],{"class":1886},[894,2664,1922],{"class":1794},[894,2666,2667],{"class":1804},"remainingMs",[894,2669,2220],{"class":1794},[894,2671,2672,2674,2677,2680,2682],{"class":896,"line":1262},[894,2673,2145],{"class":1790},[894,2675,2676],{"class":1794}," (remaining ",[894,2678,2679],{"class":1790},"\u003C=",[894,2681,2120],{"class":1886},[894,2683,2175],{"class":1794},[894,2685,2686,2688,2690,2692,2694,2697],{"class":896,"line":1268},[894,2687,2180],{"class":1886},[894,2689,1922],{"class":1794},[894,2691,2185],{"class":1804},[894,2693,1808],{"class":1794},[894,2695,2696],{"class":1886},"true",[894,2698,1933],{"class":1794},[894,2700,2701,2703],{"class":896,"line":1274},[894,2702,2197],{"class":1790},[894,2704,1869],{"class":1794},[894,2706,2707],{"class":896,"line":1280},[894,2708,2204],{"class":1794},[894,2710,2711],{"class":896,"line":1285},[894,2712,913],{"emptyLinePlaceholder":912},[894,2714,2715,2717,2720,2722,2725,2728,2731,2733,2736],{"class":896,"line":1291},[894,2716,2655],{"class":1790},[894,2718,2719],{"class":1886}," totalSeconds",[894,2721,1863],{"class":1790},[894,2723,2724],{"class":1794}," Math.",[894,2726,2727],{"class":1804},"floor",[894,2729,2730],{"class":1794},"(remaining ",[894,2732,2558],{"class":1790},[894,2734,2735],{"class":1886}," 1000",[894,2737,1933],{"class":1794},[894,2739,2740,2742,2745,2747],{"class":896,"line":1297},[894,2741,2655],{"class":1790},[894,2743,2744],{"class":1886}," parts",[894,2746,1863],{"class":1790},[894,2748,1851],{"class":1794},[894,2750,2751,2754,2756,2759,2761,2764],{"class":896,"line":1303},[894,2752,2753],{"class":1794},"          days: Math.",[894,2755,2727],{"class":1804},[894,2757,2758],{"class":1794},"(totalSeconds ",[894,2760,2558],{"class":1790},[894,2762,2763],{"class":1886}," 86400",[894,2765,2766],{"class":1794},"),\n",[894,2768,2769,2772,2774,2777,2780,2782,2784,2786,2789],{"class":896,"line":1309},[894,2770,2771],{"class":1794},"          hours: Math.",[894,2773,2727],{"class":1804},[894,2775,2776],{"class":1794},"((totalSeconds ",[894,2778,2779],{"class":1790},"%",[894,2781,2763],{"class":1886},[894,2783,1987],{"class":1794},[894,2785,2558],{"class":1790},[894,2787,2788],{"class":1886}," 3600",[894,2790,2766],{"class":1794},[894,2792,2793,2796,2798,2800,2802,2804,2806,2808,2811],{"class":896,"line":1315},[894,2794,2795],{"class":1794},"          minutes: Math.",[894,2797,2727],{"class":1804},[894,2799,2776],{"class":1794},[894,2801,2779],{"class":1790},[894,2803,2788],{"class":1886},[894,2805,1987],{"class":1794},[894,2807,2558],{"class":1790},[894,2809,2810],{"class":1886}," 60",[894,2812,2766],{"class":1794},[894,2814,2815,2818,2820,2822],{"class":896,"line":1321},[894,2816,2817],{"class":1794},"          seconds: totalSeconds ",[894,2819,2779],{"class":1790},[894,2821,2810],{"class":1886},[894,2823,1834],{"class":1794},[894,2825,2826],{"class":896,"line":1327},[894,2827,2828],{"class":1794},"        };\n",[894,2830,2831,2833,2836,2838,2841,2844,2846,2849,2851],{"class":896,"line":1333},[894,2832,2655],{"class":1790},[894,2834,2835],{"class":1886}," underOneHour",[894,2837,1863],{"class":1790},[894,2839,2840],{"class":1794}," remaining ",[894,2842,2843],{"class":1790},"\u003C",[894,2845,2788],{"class":1886},[894,2847,2848],{"class":1790}," *",[894,2850,2735],{"class":1886},[894,2852,1869],{"class":1794},[894,2854,2855,2858,2861,2864,2867,2870,2873,2875,2877,2880,2882],{"class":896,"line":1339},[894,2856,2857],{"class":1794},"        Object.",[894,2859,2860],{"class":1804},"entries",[894,2862,2863],{"class":1794},"(parts).",[894,2865,2866],{"class":1804},"forEach",[894,2868,2869],{"class":1794},"(([",[894,2871,2872],{"class":1859},"unit",[894,2874,2238],{"class":1794},[894,2876,519],{"class":1859},[894,2878,2879],{"class":1794},"]) ",[894,2881,1990],{"class":1790},[894,2883,1851],{"class":1794},[894,2885,2886,2888,2891,2893,2895],{"class":896,"line":1345},[894,2887,2436],{"class":1790},[894,2889,2890],{"class":1886}," element",[894,2892,1863],{"class":1790},[894,2894,1919],{"class":1886},[894,2896,2897],{"class":1794},".values[unit];\n",[894,2899,2900,2902,2905,2907,2910,2913,2916,2918,2921,2923,2926],{"class":896,"line":1350},[894,2901,2348],{"class":1790},[894,2903,2904],{"class":1794}," (element) element.textContent ",[894,2906,1893],{"class":1790},[894,2908,2909],{"class":1804}," String",[894,2911,2912],{"class":1794},"(value).",[894,2914,2915],{"class":1804},"padStart",[894,2917,1808],{"class":1794},[894,2919,2920],{"class":1886},"2",[894,2922,2238],{"class":1794},[894,2924,2925],{"class":1811},"'0'",[894,2927,1933],{"class":1794},[894,2929,2930],{"class":896,"line":1356},[894,2931,2378],{"class":1794},[894,2933,2934,2936,2939,2942,2944,2946,2948,2950],{"class":896,"line":1362},[894,2935,1887],{"class":1886},[894,2937,2938],{"class":1794},".secondsWrapper?.",[894,2940,2941],{"class":1804},"toggleAttribute",[894,2943,1808],{"class":1794},[894,2945,2311],{"class":1811},[894,2947,2238],{"class":1794},[894,2949,1798],{"class":1790},[894,2951,2952],{"class":1794},"underOneHour);\n",[894,2954,2955],{"class":896,"line":1367},[894,2956,913],{"emptyLinePlaceholder":912},[894,2958,2959,2961,2964,2966,2969,2971],{"class":896,"line":1372},[894,2960,2145],{"class":1790},[894,2962,2963],{"class":1794}," (underOneHour ",[894,2965,2266],{"class":1790},[894,2967,2968],{"class":1790}," !",[894,2970,1904],{"class":1886},[894,2972,2973],{"class":1794},".announcedHour) {\n",[894,2975,2976,2978,2980,2982,2985],{"class":896,"line":1378},[894,2977,2180],{"class":1886},[894,2979,2129],{"class":1794},[894,2981,1893],{"class":1790},[894,2983,2984],{"class":1886}," true",[894,2986,1869],{"class":1794},[894,2988,2989,2991,2993,2996],{"class":896,"line":1384},[894,2990,2180],{"class":1886},[894,2992,1922],{"class":1794},[894,2994,2995],{"class":1804},"announce",[894,2997,2998],{"class":1794},"(window.countdownStrings.lessThanOneHour);\n",[894,3000,3001],{"class":896,"line":1390},[894,3002,2204],{"class":1794},[894,3004,3005],{"class":896,"line":1396},[894,3006,913],{"emptyLinePlaceholder":912},[894,3008,3009,3011,3014,3016,3019,3022,3024,3027,3029,3031,3033],{"class":896,"line":1401},[894,3010,2655],{"class":1790},[894,3012,3013],{"class":1886}," interval",[894,3015,1863],{"class":1790},[894,3017,3018],{"class":1794}," underOneHour ",[894,3020,3021],{"class":1790},"?",[894,3023,2735],{"class":1886},[894,3025,3026],{"class":1790}," :",[894,3028,2810],{"class":1886},[894,3030,2848],{"class":1790},[894,3032,2735],{"class":1886},[894,3034,1869],{"class":1794},[894,3036,3037,3039,3042,3044,3047,3049,3051,3054,3056,3058,3060,3063,3065,3067,3069,3072,3074],{"class":896,"line":1406},[894,3038,1887],{"class":1886},[894,3040,3041],{"class":1794},".timer ",[894,3043,1893],{"class":1790},[894,3045,3046],{"class":1804}," setTimeout",[894,3048,1808],{"class":1794},[894,3050,1904],{"class":1886},[894,3052,3053],{"class":1794},".tick.",[894,3055,2246],{"class":1804},[894,3057,1808],{"class":1794},[894,3059,1904],{"class":1886},[894,3061,3062],{"class":1794},"), interval ",[894,3064,2536],{"class":1790},[894,3066,2676],{"class":1794},[894,3068,2779],{"class":1790},[894,3070,3071],{"class":1794}," interval ",[894,3073,2161],{"class":1790},[894,3075,3076],{"class":1794}," interval));\n",[894,3078,3079],{"class":896,"line":1412},[894,3080,2383],{"class":1794},[894,3082,3083],{"class":896,"line":1418},[894,3084,913],{"emptyLinePlaceholder":912},[894,3086,3087,3090,3092,3094],{"class":896,"line":1424},[894,3088,3089],{"class":1804},"      finish",[894,3091,1808],{"class":1794},[894,3093,2995],{"class":1859},[894,3095,2175],{"class":1794},[894,3097,3098,3100,3102,3104],{"class":896,"line":1430},[894,3099,2399],{"class":1804},[894,3101,1808],{"class":1794},[894,3103,1904],{"class":1886},[894,3105,2406],{"class":1794},[894,3107,3108,3110,3112,3114,3116],{"class":896,"line":1435},[894,3109,1887],{"class":1886},[894,3111,2166],{"class":1794},[894,3113,1893],{"class":1790},[894,3115,2172],{"class":1811},[894,3117,1869],{"class":1794},[894,3119,3120,3122,3125,3128,3130,3132,3134,3137],{"class":896,"line":1441},[894,3121,1887],{"class":1886},[894,3123,3124],{"class":1794},".clock?.",[894,3126,3127],{"class":1804},"setAttribute",[894,3129,1808],{"class":1794},[894,3131,2311],{"class":1811},[894,3133,2238],{"class":1794},[894,3135,3136],{"class":1811},"''",[894,3138,1933],{"class":1794},[894,3140,3141,3143,3145,3147,3149,3151,3153,3155],{"class":896,"line":1447},[894,3142,1887],{"class":1886},[894,3144,2227],{"class":1794},[894,3146,3127],{"class":1804},[894,3148,1808],{"class":1794},[894,3150,2311],{"class":1811},[894,3152,2238],{"class":1794},[894,3154,3136],{"class":1811},[894,3156,1933],{"class":1794},[894,3158,3159,3161,3164,3166,3168,3170],{"class":896,"line":1453},[894,3160,1887],{"class":1886},[894,3162,3163],{"class":1794},".endedMessage?.",[894,3165,2306],{"class":1804},[894,3167,1808],{"class":1794},[894,3169,2311],{"class":1811},[894,3171,1933],{"class":1794},[894,3173,3174,3176,3179,3181,3183,3185],{"class":896,"line":1459},[894,3175,2145],{"class":1790},[894,3177,3178],{"class":1794}," (announce) ",[894,3180,1904],{"class":1886},[894,3182,1922],{"class":1794},[894,3184,2995],{"class":1804},[894,3186,3187],{"class":1794},"(window.countdownStrings.ended);\n",[894,3189,3190],{"class":896,"line":1465},[894,3191,2383],{"class":1794},[894,3193,3194],{"class":896,"line":1471},[894,3195,913],{"emptyLinePlaceholder":912},[894,3197,3198,3201,3203,3206],{"class":896,"line":1477},[894,3199,3200],{"class":1804},"      announce",[894,3202,1808],{"class":1794},[894,3204,3205],{"class":1859},"message",[894,3207,2175],{"class":1794},[894,3209,3210,3212,3214,3216,3218,3220,3222,3224,3227,3229],{"class":896,"line":1483},[894,3211,2145],{"class":1790},[894,3213,1795],{"class":1794},[894,3215,1798],{"class":1790},[894,3217,1904],{"class":1886},[894,3219,2049],{"class":1794},[894,3221,2161],{"class":1790},[894,3223,2968],{"class":1790},[894,3225,3226],{"class":1794},"message) ",[894,3228,2360],{"class":1790},[894,3230,1869],{"class":1794},[894,3232,3233,3235,3238,3240,3243],{"class":896,"line":1489},[894,3234,1887],{"class":1886},[894,3236,3237],{"class":1794},".status.textContent ",[894,3239,1893],{"class":1790},[894,3241,3242],{"class":1811}," ''",[894,3244,1869],{"class":1794},[894,3246,3247,3250,3252,3254],{"class":896,"line":1495},[894,3248,3249],{"class":1804},"        requestAnimationFrame",[894,3251,2339],{"class":1794},[894,3253,1990],{"class":1790},[894,3255,1851],{"class":1794},[894,3257,3258,3260,3262,3264],{"class":896,"line":1501},[894,3259,2180],{"class":1886},[894,3261,3237],{"class":1794},[894,3263,1893],{"class":1790},[894,3265,3266],{"class":1794}," message;\n",[894,3268,3269],{"class":896,"line":1507},[894,3270,2378],{"class":1794},[894,3272,3273],{"class":896,"line":1513},[894,3274,2383],{"class":1794},[894,3276,3277],{"class":896,"line":1519},[894,3278,913],{"emptyLinePlaceholder":912},[894,3280,3281,3284],{"class":896,"line":1524},[894,3282,3283],{"class":1804},"      renderLocalTime",[894,3285,1881],{"class":1794},[894,3287,3288,3290,3292,3294,3296,3298,3300,3303,3306,3308,3311,3313,3315],{"class":896,"line":1530},[894,3289,2145],{"class":1790},[894,3291,1795],{"class":1794},[894,3293,1798],{"class":1790},[894,3295,1904],{"class":1886},[894,3297,2093],{"class":1794},[894,3299,2161],{"class":1790},[894,3301,3302],{"class":1790}," typeof",[894,3304,3305],{"class":1794}," Intl ",[894,3307,2169],{"class":1790},[894,3309,3310],{"class":1811}," 'undefined'",[894,3312,1987],{"class":1794},[894,3314,2360],{"class":1790},[894,3316,1869],{"class":1794},[894,3318,3319,3321],{"class":896,"line":1536},[894,3320,2429],{"class":1790},[894,3322,1851],{"class":1794},[894,3324,3325,3327,3330,3332,3335,3338,3341,3344,3346,3349],{"class":896,"line":1542},[894,3326,2436],{"class":1790},[894,3328,3329],{"class":1886}," formatter",[894,3331,1863],{"class":1790},[894,3333,3334],{"class":1790}," new",[894,3336,3337],{"class":1794}," Intl.",[894,3339,3340],{"class":1804},"DateTimeFormat",[894,3342,3343],{"class":1794},"(document.documentElement.lang ",[894,3345,2161],{"class":1790},[894,3347,3348],{"class":1886}," undefined",[894,3350,3351],{"class":1794},", {\n",[894,3353,3354,3357,3360],{"class":896,"line":1548},[894,3355,3356],{"class":1794},"            dateStyle: ",[894,3358,3359],{"class":1811},"'medium'",[894,3361,1834],{"class":1794},[894,3363,3364,3367,3370],{"class":896,"line":1553},[894,3365,3366],{"class":1794},"            timeStyle: ",[894,3368,3369],{"class":1811},"'short'",[894,3371,1834],{"class":1794},[894,3373,3374,3377,3379],{"class":896,"line":1558},[894,3375,3376],{"class":1794},"            timeZoneName: ",[894,3378,3369],{"class":1811},[894,3380,1834],{"class":1794},[894,3382,3383],{"class":896,"line":1564},[894,3384,3385],{"class":1794},"          });\n",[894,3387,3388,3390,3393,3395,3398,3401,3403,3406,3408,3411,3414,3416,3418,3420,3422,3425,3428],{"class":896,"line":1570},[894,3389,2180],{"class":1886},[894,3391,3392],{"class":1794},".localTime.textContent ",[894,3394,1893],{"class":1790},[894,3396,3397],{"class":1811}," ` (${",[894,3399,3400],{"class":1794},"formatter",[894,3402,1922],{"class":1811},[894,3404,3405],{"class":1804},"format",[894,3407,1808],{"class":1811},[894,3409,3410],{"class":1790},"new",[894,3412,3413],{"class":1804}," Date",[894,3415,1808],{"class":1811},[894,3417,1904],{"class":1886},[894,3419,1922],{"class":1811},[894,3421,534],{"class":1794},[894,3423,3424],{"class":1811},"))",[894,3426,3427],{"class":1811},"})`",[894,3429,1869],{"class":1794},[894,3431,3432,3434,3437,3439,3441,3443],{"class":896,"line":1576},[894,3433,2180],{"class":1886},[894,3435,3436],{"class":1794},".localTime.",[894,3438,2306],{"class":1804},[894,3440,1808],{"class":1794},[894,3442,2311],{"class":1811},[894,3444,1933],{"class":1794},[894,3446,3447,3449,3451],{"class":896,"line":1582},[894,3448,2292],{"class":1794},[894,3450,2577],{"class":1790},[894,3452,1851],{"class":1794},[894,3454,3455],{"class":896,"line":1588},[894,3456,3458],{"class":3457},"sAwPA","          \u002F\u002F keep the server-rendered UTC text only\n",[894,3460,3461],{"class":896,"line":1594},[894,3462,2204],{"class":1794},[894,3464,3465],{"class":896,"line":1600},[894,3466,2383],{"class":1794},[894,3468,3469],{"class":896,"line":1606},[894,3470,913],{"emptyLinePlaceholder":912},[894,3472,3473,3476],{"class":896,"line":1612},[894,3474,3475],{"class":1804},"      onHide",[894,3477,1881],{"class":1794},[894,3479,3480,3482,3484,3486],{"class":896,"line":1617},[894,3481,1887],{"class":1886},[894,3483,1922],{"class":1794},[894,3485,2285],{"class":1804},[894,3487,2220],{"class":1794},[894,3489,3490,3492],{"class":896,"line":1622},[894,3491,2429],{"class":1790},[894,3493,1851],{"class":1794},[894,3495,3496,3499,3502,3505,3508,3510,3513],{"class":896,"line":1628},[894,3497,3498],{"class":1794},"          sessionStorage.",[894,3500,3501],{"class":1804},"setItem",[894,3503,3504],{"class":1794},"(CountdownTimer.",[894,3506,3507],{"class":1886},"STORAGE_KEY",[894,3509,2238],{"class":1794},[894,3511,3512],{"class":1811},"'1'",[894,3514,1933],{"class":1794},[894,3516,3517,3519,3521],{"class":896,"line":1634},[894,3518,2292],{"class":1794},[894,3520,2577],{"class":1790},[894,3522,1851],{"class":1794},[894,3524,3525],{"class":896,"line":1640},[894,3526,3527],{"class":3457},"          \u002F\u002F storage unavailable; hide for this page only\n",[894,3529,3530],{"class":896,"line":1646},[894,3531,2204],{"class":1794},[894,3533,3534],{"class":896,"line":1652},[894,3535,2383],{"class":1794},[894,3537,3538],{"class":896,"line":1657},[894,3539,913],{"emptyLinePlaceholder":912},[894,3541,3542,3545],{"class":896,"line":1663},[894,3543,3544],{"class":1804},"      hideClock",[894,3546,1881],{"class":1794},[894,3548,3549,3551,3553,3555,3557,3559,3561,3563],{"class":896,"line":1669},[894,3550,1887],{"class":1886},[894,3552,3124],{"class":1794},[894,3554,3127],{"class":1804},[894,3556,1808],{"class":1794},[894,3558,2311],{"class":1811},[894,3560,2238],{"class":1794},[894,3562,3136],{"class":1811},[894,3564,1933],{"class":1794},[894,3566,3567,3569,3571,3573,3575,3577,3579,3581],{"class":896,"line":1675},[894,3568,1887],{"class":1886},[894,3570,2227],{"class":1794},[894,3572,3127],{"class":1804},[894,3574,1808],{"class":1794},[894,3576,2311],{"class":1811},[894,3578,2238],{"class":1794},[894,3580,3136],{"class":1811},[894,3582,1933],{"class":1794},[894,3584,3585,3587,3589,3591],{"class":896,"line":1681},[894,3586,2399],{"class":1804},[894,3588,1808],{"class":1794},[894,3590,1904],{"class":1886},[894,3592,2406],{"class":1794},[894,3594,3595,3597,3599,3601,3603,3605,3607,3609,3611,3613,3615,3618,3621,3623,3625],{"class":896,"line":1687},[894,3596,1887],{"class":1886},[894,3598,3041],{"class":1794},[894,3600,1893],{"class":1790},[894,3602,3046],{"class":1804},[894,3604,1808],{"class":1794},[894,3606,1904],{"class":1886},[894,3608,3053],{"class":1794},[894,3610,2246],{"class":1804},[894,3612,1808],{"class":1794},[894,3614,1904],{"class":1886},[894,3616,3617],{"class":1794},"), ",[894,3619,3620],{"class":1886},"60",[894,3622,2848],{"class":1790},[894,3624,2735],{"class":1886},[894,3626,1933],{"class":1794},[894,3628,3629],{"class":896,"line":1693},[894,3630,2383],{"class":1794},[894,3632,3633],{"class":896,"line":1699},[894,3634,913],{"emptyLinePlaceholder":912},[894,3636,3638,3641],{"class":896,"line":3637},139,[894,3639,3640],{"class":1804},"      readHiddenPreference",[894,3642,1881],{"class":1794},[894,3644,3646,3648],{"class":896,"line":3645},140,[894,3647,2429],{"class":1790},[894,3649,1851],{"class":1794},[894,3651,3653,3655,3658,3661,3663,3665,3667,3669,3672],{"class":896,"line":3652},141,[894,3654,2197],{"class":1790},[894,3656,3657],{"class":1794}," sessionStorage.",[894,3659,3660],{"class":1804},"getItem",[894,3662,3504],{"class":1794},[894,3664,3507],{"class":1886},[894,3666,1987],{"class":1794},[894,3668,2169],{"class":1790},[894,3670,3671],{"class":1811}," '1'",[894,3673,1869],{"class":1794},[894,3675,3677,3679,3681],{"class":896,"line":3676},142,[894,3678,2292],{"class":1794},[894,3680,2577],{"class":1790},[894,3682,1851],{"class":1794},[894,3684,3686,3688,3690],{"class":896,"line":3685},143,[894,3687,2197],{"class":1790},[894,3689,2134],{"class":1886},[894,3691,1869],{"class":1794},[894,3693,3695],{"class":896,"line":3694},144,[894,3696,2204],{"class":1794},[894,3698,3700],{"class":896,"line":3699},145,[894,3701,2383],{"class":1794},[894,3703,3705],{"class":896,"line":3704},146,[894,3706,1118],{"class":1794},[894,3708,3710],{"class":896,"line":3709},147,[894,3711,3712],{"class":1794},"  );\n",[894,3714,3716],{"class":896,"line":3715},148,[894,3717,1696],{"class":1794},[378,3719,3720],{},"逐项说明它为什么这样写：",[489,3722,3723,3756,3777,3787,3805,3838,3855],{},[492,3724,3725,497,3728,3730,3731,3734,3735,3738,3739,3742,3743,3745,3746,3749,3750,3752,3753,3755],{},[409,3726,3727],{},"不以访客时钟为真值。",[388,3729,2330],{}," 对当前页发一个 ",[388,3732,3733],{},"HEAD"," 且 ",[388,3736,3737],{},"cache: 'no-store'"," 的请求，用响应的 ",[388,3740,3741],{},"Date"," 头减去往返时间的一半，估出本机时钟与服务端的偏移；之后所有剩余时长都加上这个偏移。这是 ",[382,3744,419],{"href":418}," 里的设计建议，",[409,3747,3748],{},"未在 Shopify 店面上验证","：",[388,3751,3733],{}," 是否被店面与 CDN 正常响应、",[388,3754,3741],{}," 头是否可读，都要在店铺里实测。请求失败时偏移取 0，退回本机时钟，这是本实现里明确接受的残余风险。",[492,3757,3758,3761,3762,3765,3766,3769,3770,3772,3773,1731],{},[409,3759,3760],{},"不逐秒更新，也不逐秒朗读。"," 距离截止超过一小时时每分钟更新一次并隐藏秒位；最后一小时才每秒更新。",[388,3763,3764],{},"setTimeout"," 的延时对齐到整分或整秒，避免累计漂移。",[388,3767,3768],{},"role=\"status\""," 的区域只在两个节点写入文案：进入最后一小时，以及到期；其余时间保持空白。Dawn 自己对价格块、筛选结果数也是用 ",[388,3771,3768],{}," 做一次性播报（",[382,3774,3776],{"href":3775},"\u002Fzh\u002Fshopify\u002Fthemes\u002Fdawn\u002Faccessibility-patterns","无障碍写法",[492,3778,3779,3782,3783,3786],{},[409,3780,3781],{},"可以停止。"," WCAG 2.2.2 要求自动更新的内容可以暂停、停止或隐藏。「隐藏倒计时」按钮把数字区藏起来，绝对截止时间仍然可见；选择记在 ",[388,3784,3785],{},"sessionStorage","，同一会话内不再弹回。隐藏后脚本仍每分钟检查一次是否到期，到期时同样切换到「已结束」。",[492,3788,3789,497,3792,3794,3795,3798,3799,3801,3802,3804],{},[409,3790,3791],{},"到期即收尾，不重置。",[388,3793,2185],{}," 清掉定时器、隐藏数字与按钮、显示「已结束」，并把 ",[388,3796,3797],{},"data-state"," 改为 ",[388,3800,1738],{},"。没有任何路径会在到期后重新开始计时；刷新后服务端会按缓存时间或浏览器会按真实时间再次得到 ",[388,3803,1738],{},"。折扣本身是否失效由平台执行，倒计时不参与。",[492,3806,3807,3810,3811,3814,3815,3817,3818,3821,3822,432,3824,3826,3827,3830,3831,3833,3834,3837],{},[409,3808,3809],{},"编辑器里不泄漏定时器。"," 主题编辑器在分区重渲染时先触发 ",[388,3812,3813],{},"shopify:section:unload"," 再插入新 HTML，官方文档要求此时清理监听与变量。自定义元素被移出文档就会触发 ",[388,3816,793],{},"，这里只需要 ",[388,3819,3820],{},"clearTimeout","；Dawn 的 ",[388,3823,783],{},[388,3825,786],{}," 等也是在这个回调里做清理，因此不需要再往 ",[388,3828,3829],{},"theme-editor.js"," 里加事件处理。",[388,3832,2330],{}," 回来时先检查 ",[388,3835,3836],{},"isConnected","，避免给已经卸载的元素起定时器。",[492,3839,3840,3843,3844,3846,3847,3850,3851,3854],{},[409,3841,3842],{},"减少动态。"," 数字只做文本替换，没有翻页或缩放动画；CSS 里唯一的透明度过渡放在 ",[388,3845,807],{}," 下，与 ",[382,3848,815],{"href":813,"rel":3849},[386]," 处理动效的方式一致，所以脚本里不需要再读 ",[388,3852,3853],{},"matchMedia","。",[492,3856,3857,497,3860,3862,3863,3866,3867,3870,3871,3874,3875,3877,3878,399,3883,3854],{},[409,3858,3859],{},"本地时间只是补充。",[388,3861,2217],{}," 用 ",[388,3864,3865],{},"Intl.DateTimeFormat"," 按页面 ",[388,3868,3869],{},"lang"," 把截止时刻格式化成访客时区并带时区缩写，填进服务端留下的 ",[388,3872,3873],{},"\u003Ctime>","；失败时保留 UTC 文案。页面 ",[388,3876,3869],{}," 来自 ",[382,3879,3882],{"href":3880,"rel":3881},"https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Flayout\u002Ftheme.liquid",[386],"theme.liquid",[388,3884,3885],{},"request.locale.iso_code",[422,3887,3888],{"id":3888},"样式与文案",[885,3890,3894],{"className":3891,"code":3892,"language":3893,"meta":890,"style":890},"language-css shiki shiki-themes github-light",".countdown-timer {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 1.5rem;\n  text-align: center;\n}\n\n.countdown-timer__heading,\n.countdown-timer__ends-at,\n.countdown-timer__ended {\n  margin: 0;\n}\n\n.countdown-timer__clock {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: 2rem;\n}\n\n.countdown-timer__unit {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  min-width: 6rem;\n}\n\n.countdown-timer__value {\n  margin: 0;\n  font-variant-numeric: tabular-nums;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .countdown-timer__value {\n    transition: opacity var(--duration-short) ease;\n  }\n}\n\n.countdown-timer__hide {\n  background: none;\n  border: 0;\n  cursor: pointer;\n  font-size: 1.2rem;\n}\n","css",[388,3895,3896,3903,3916,3928,3940,3955,3966,3970,3974,3981,3988,3995,4007,4011,4015,4022,4032,4044,4055,4067,4071,4075,4082,4092,4102,4112,4126,4130,4134,4141,4151,4163,4167,4171,4179,4186,4208,4212,4216,4220,4227,4239,4250,4262,4276],{"__ignoreMap":890},[894,3897,3898,3901],{"class":896,"line":897},[894,3899,3900],{"class":1804},".countdown-timer",[894,3902,1851],{"class":1794},[894,3904,3905,3908,3911,3914],{"class":896,"line":903},[894,3906,3907],{"class":1886},"  display",[894,3909,3910],{"class":1794},": ",[894,3912,3913],{"class":1886},"flex",[894,3915,1869],{"class":1794},[894,3917,3918,3921,3923,3926],{"class":896,"line":909},[894,3919,3920],{"class":1886},"  flex-direction",[894,3922,3910],{"class":1794},[894,3924,3925],{"class":1886},"column",[894,3927,1869],{"class":1794},[894,3929,3930,3933,3935,3938],{"class":896,"line":916},[894,3931,3932],{"class":1886},"  align-items",[894,3934,3910],{"class":1794},[894,3936,3937],{"class":1886},"center",[894,3939,1869],{"class":1794},[894,3941,3942,3945,3947,3950,3953],{"class":896,"line":922},[894,3943,3944],{"class":1886},"  gap",[894,3946,3910],{"class":1794},[894,3948,3949],{"class":1886},"1.5",[894,3951,3952],{"class":1790},"rem",[894,3954,1869],{"class":1794},[894,3956,3957,3960,3962,3964],{"class":896,"line":928},[894,3958,3959],{"class":1886},"  text-align",[894,3961,3910],{"class":1794},[894,3963,3937],{"class":1886},[894,3965,1869],{"class":1794},[894,3967,3968],{"class":896,"line":934},[894,3969,1696],{"class":1794},[894,3971,3972],{"class":896,"line":940},[894,3973,913],{"emptyLinePlaceholder":912},[894,3975,3976,3979],{"class":896,"line":946},[894,3977,3978],{"class":1804},".countdown-timer__heading",[894,3980,1834],{"class":1794},[894,3982,3983,3986],{"class":896,"line":952},[894,3984,3985],{"class":1804},".countdown-timer__ends-at",[894,3987,1834],{"class":1794},[894,3989,3990,3993],{"class":896,"line":958},[894,3991,3992],{"class":1804},".countdown-timer__ended",[894,3994,1851],{"class":1794},[894,3996,3997,4000,4002,4005],{"class":896,"line":964},[894,3998,3999],{"class":1886},"  margin",[894,4001,3910],{"class":1794},[894,4003,4004],{"class":1886},"0",[894,4006,1869],{"class":1794},[894,4008,4009],{"class":896,"line":970},[894,4010,1696],{"class":1794},[894,4012,4013],{"class":896,"line":976},[894,4014,913],{"emptyLinePlaceholder":912},[894,4016,4017,4020],{"class":896,"line":981},[894,4018,4019],{"class":1804},".countdown-timer__clock",[894,4021,1851],{"class":1794},[894,4023,4024,4026,4028,4030],{"class":896,"line":987},[894,4025,3907],{"class":1886},[894,4027,3910],{"class":1794},[894,4029,3913],{"class":1886},[894,4031,1869],{"class":1794},[894,4033,4034,4037,4039,4042],{"class":896,"line":993},[894,4035,4036],{"class":1886},"  flex-wrap",[894,4038,3910],{"class":1794},[894,4040,4041],{"class":1886},"wrap",[894,4043,1869],{"class":1794},[894,4045,4046,4049,4051,4053],{"class":896,"line":998},[894,4047,4048],{"class":1886},"  justify-content",[894,4050,3910],{"class":1794},[894,4052,3937],{"class":1886},[894,4054,1869],{"class":1794},[894,4056,4057,4059,4061,4063,4065],{"class":896,"line":1004},[894,4058,3944],{"class":1886},[894,4060,3910],{"class":1794},[894,4062,2920],{"class":1886},[894,4064,3952],{"class":1790},[894,4066,1869],{"class":1794},[894,4068,4069],{"class":896,"line":1010},[894,4070,1696],{"class":1794},[894,4072,4073],{"class":896,"line":1016},[894,4074,913],{"emptyLinePlaceholder":912},[894,4076,4077,4080],{"class":896,"line":1022},[894,4078,4079],{"class":1804},".countdown-timer__unit",[894,4081,1851],{"class":1794},[894,4083,4084,4086,4088,4090],{"class":896,"line":1028},[894,4085,3907],{"class":1886},[894,4087,3910],{"class":1794},[894,4089,3913],{"class":1886},[894,4091,1869],{"class":1794},[894,4093,4094,4096,4098,4100],{"class":896,"line":1034},[894,4095,3920],{"class":1886},[894,4097,3910],{"class":1794},[894,4099,3925],{"class":1886},[894,4101,1869],{"class":1794},[894,4103,4104,4106,4108,4110],{"class":896,"line":1040},[894,4105,3932],{"class":1886},[894,4107,3910],{"class":1794},[894,4109,3937],{"class":1886},[894,4111,1869],{"class":1794},[894,4113,4114,4117,4119,4122,4124],{"class":896,"line":1045},[894,4115,4116],{"class":1886},"  min-width",[894,4118,3910],{"class":1794},[894,4120,4121],{"class":1886},"6",[894,4123,3952],{"class":1790},[894,4125,1869],{"class":1794},[894,4127,4128],{"class":896,"line":1051},[894,4129,1696],{"class":1794},[894,4131,4132],{"class":896,"line":1056},[894,4133,913],{"emptyLinePlaceholder":912},[894,4135,4136,4139],{"class":896,"line":1062},[894,4137,4138],{"class":1804},".countdown-timer__value",[894,4140,1851],{"class":1794},[894,4142,4143,4145,4147,4149],{"class":896,"line":1068},[894,4144,3999],{"class":1886},[894,4146,3910],{"class":1794},[894,4148,4004],{"class":1886},[894,4150,1869],{"class":1794},[894,4152,4153,4156,4158,4161],{"class":896,"line":1074},[894,4154,4155],{"class":1886},"  font-variant-numeric",[894,4157,3910],{"class":1794},[894,4159,4160],{"class":1886},"tabular-nums",[894,4162,1869],{"class":1794},[894,4164,4165],{"class":896,"line":1080},[894,4166,1696],{"class":1794},[894,4168,4169],{"class":896,"line":1086},[894,4170,913],{"emptyLinePlaceholder":912},[894,4172,4173,4176],{"class":896,"line":1091},[894,4174,4175],{"class":1790},"@media",[894,4177,4178],{"class":1794}," (prefers-reduced-motion: no-preference) {\n",[894,4180,4181,4184],{"class":896,"line":1097},[894,4182,4183],{"class":1804},"  .countdown-timer__value",[894,4185,1851],{"class":1794},[894,4187,4188,4191,4194,4197,4199,4201,4203,4206],{"class":896,"line":1103},[894,4189,4190],{"class":1886},"    transition",[894,4192,4193],{"class":1794},": opacity ",[894,4195,4196],{"class":1886},"var",[894,4198,1808],{"class":1794},[894,4200,818],{"class":1859},[894,4202,1987],{"class":1794},[894,4204,4205],{"class":1886},"ease",[894,4207,1869],{"class":1794},[894,4209,4210],{"class":896,"line":1109},[894,4211,1083],{"class":1794},[894,4213,4214],{"class":896,"line":1115},[894,4215,1696],{"class":1794},[894,4217,4218],{"class":896,"line":1121},[894,4219,913],{"emptyLinePlaceholder":912},[894,4221,4222,4225],{"class":896,"line":1126},[894,4223,4224],{"class":1804},".countdown-timer__hide",[894,4226,1851],{"class":1794},[894,4228,4229,4232,4234,4237],{"class":896,"line":1132},[894,4230,4231],{"class":1886},"  background",[894,4233,3910],{"class":1794},[894,4235,4236],{"class":1886},"none",[894,4238,1869],{"class":1794},[894,4240,4241,4244,4246,4248],{"class":896,"line":1137},[894,4242,4243],{"class":1886},"  border",[894,4245,3910],{"class":1794},[894,4247,4004],{"class":1886},[894,4249,1869],{"class":1794},[894,4251,4252,4255,4257,4260],{"class":896,"line":1143},[894,4253,4254],{"class":1886},"  cursor",[894,4256,3910],{"class":1794},[894,4258,4259],{"class":1886},"pointer",[894,4261,1869],{"class":1794},[894,4263,4264,4267,4269,4272,4274],{"class":896,"line":1149},[894,4265,4266],{"class":1886},"  font-size",[894,4268,3910],{"class":1794},[894,4270,4271],{"class":1886},"1.2",[894,4273,3952],{"class":1790},[894,4275,1869],{"class":1794},[894,4277,4278],{"class":896,"line":1155},[894,4279,1696],{"class":1794},[378,4281,4282,4284,4285,432,4287,432,4290,432,4293,432,4296,432,4298,776,4301,4304],{},[388,4283,4160],{}," 让数字等宽，更新时不会左右跳动。",[388,4286,422],{},[388,4288,4289],{},"caption-with-letter-spacing",[388,4291,4292],{},"link link--text",[388,4294,4295],{},"visually-hidden",[388,4297,743],{},[388,4299,4300],{},"color-*",[388,4302,4303],{},"gradient"," 都是 Dawn 既有类，不需要新写。",[378,4306,4307,4309,4310,4312],{},[388,4308,826],{}," 在 ",[388,4311,471],{}," 下追加：",[885,4314,4318],{"className":4315,"code":4316,"language":4317,"meta":890,"style":890},"language-json shiki shiki-themes github-light","\"countdown_timer\": {\n  \"days\": \"Days\",\n  \"hours\": \"Hours\",\n  \"minutes\": \"Minutes\",\n  \"seconds\": \"Seconds\",\n  \"ends_at_html\": \"Ends {{ ends_at }}\",\n  \"ended\": \"This offer has ended.\",\n  \"less_than_one_hour\": \"Less than one hour left.\",\n  \"hide\": \"Hide countdown\",\n  \"missing_end_time\": \"Countdown: set the shop metafield promo.ends_at or the fallback end time to show this section.\"\n}\n","json",[388,4319,4320,4328,4340,4352,4364,4376,4388,4400,4412,4424,4434],{"__ignoreMap":890},[894,4321,4322,4325],{"class":896,"line":897},[894,4323,4324],{"class":1811},"\"countdown_timer\"",[894,4326,4327],{"class":1794},": {\n",[894,4329,4330,4333,4335,4338],{"class":896,"line":903},[894,4331,4332],{"class":1886},"  \"days\"",[894,4334,3910],{"class":1794},[894,4336,4337],{"class":1811},"\"Days\"",[894,4339,1834],{"class":1794},[894,4341,4342,4345,4347,4350],{"class":896,"line":909},[894,4343,4344],{"class":1886},"  \"hours\"",[894,4346,3910],{"class":1794},[894,4348,4349],{"class":1811},"\"Hours\"",[894,4351,1834],{"class":1794},[894,4353,4354,4357,4359,4362],{"class":896,"line":916},[894,4355,4356],{"class":1886},"  \"minutes\"",[894,4358,3910],{"class":1794},[894,4360,4361],{"class":1811},"\"Minutes\"",[894,4363,1834],{"class":1794},[894,4365,4366,4369,4371,4374],{"class":896,"line":922},[894,4367,4368],{"class":1886},"  \"seconds\"",[894,4370,3910],{"class":1794},[894,4372,4373],{"class":1811},"\"Seconds\"",[894,4375,1834],{"class":1794},[894,4377,4378,4381,4383,4386],{"class":896,"line":928},[894,4379,4380],{"class":1886},"  \"ends_at_html\"",[894,4382,3910],{"class":1794},[894,4384,4385],{"class":1811},"\"Ends {{ ends_at }}\"",[894,4387,1834],{"class":1794},[894,4389,4390,4393,4395,4398],{"class":896,"line":934},[894,4391,4392],{"class":1886},"  \"ended\"",[894,4394,3910],{"class":1794},[894,4396,4397],{"class":1811},"\"This offer has ended.\"",[894,4399,1834],{"class":1794},[894,4401,4402,4405,4407,4410],{"class":896,"line":940},[894,4403,4404],{"class":1886},"  \"less_than_one_hour\"",[894,4406,3910],{"class":1794},[894,4408,4409],{"class":1811},"\"Less than one hour left.\"",[894,4411,1834],{"class":1794},[894,4413,4414,4417,4419,4422],{"class":896,"line":946},[894,4415,4416],{"class":1886},"  \"hide\"",[894,4418,3910],{"class":1794},[894,4420,4421],{"class":1811},"\"Hide countdown\"",[894,4423,1834],{"class":1794},[894,4425,4426,4429,4431],{"class":896,"line":952},[894,4427,4428],{"class":1886},"  \"missing_end_time\"",[894,4430,3910],{"class":1794},[894,4432,4433],{"class":1811},"\"Countdown: set the shop metafield promo.ends_at or the fallback end time to show this section.\"\n",[894,4435,4436],{"class":896,"line":958},[894,4437,1696],{"class":1794},[378,4439,4440,4309,4442,4444,4445,4448,4449,432,4452,4455,4456,531,4459,4462,4463,531,4466,432,4469,531,4472,776,4474,4477,4478,4481,4482,4485],{},[388,4441,847],{},[388,4443,471],{}," 下追加 ",[388,4446,4447],{},"countdown-timer"," 节点，含 ",[388,4450,4451],{},"name",[388,4453,4454],{},"settings.paragraph.content","（写明值必须等于后台折扣的结束时间）、",[388,4457,4458],{},"settings.ends_at_fallback.label",[388,4460,4461],{},".info","（只在元字段为空时使用，ISO 8601 UTC 示例）、",[388,4464,4465],{},"settings.heading.label",[388,4467,4468],{},".default",[388,4470,4471],{},"settings.show_hide_button.label",[388,4473,4461],{},[388,4475,4476],{},"presets.name","。其他语言文件没有同步追加，Dawn 的 ",[388,4479,4480],{},".theme-check.yml"," 关闭了 ",[388,4483,4484],{},"MatchingTranslations","，缺失键会回退到默认语言；正式上线前应补齐店铺启用的语言。",[378,4487,4488,4309,4490,4492],{},[388,4489,865],{},[388,4491,878],{}," 之前追加：",[885,4494,4496],{"className":887,"code":4495,"language":889,"meta":890,"style":890},"window.countdownStrings = {\n  ended: `{{ 'sections.countdown_timer.ended' | t }}`,\n  lessThanOneHour: `{{ 'sections.countdown_timer.less_than_one_hour' | t }}`,\n};\n",[388,4497,4498,4503,4508,4513],{"__ignoreMap":890},[894,4499,4500],{"class":896,"line":897},[894,4501,4502],{},"window.countdownStrings = {\n",[894,4504,4505],{"class":896,"line":903},[894,4506,4507],{},"  ended: `{{ 'sections.countdown_timer.ended' | t }}`,\n",[894,4509,4510],{"class":896,"line":909},[894,4511,4512],{},"  lessThanOneHour: `{{ 'sections.countdown_timer.less_than_one_hour' | t }}`,\n",[894,4514,4515],{"class":896,"line":916},[894,4516,4517],{},"};\n",[422,4519,4520],{"id":4520},"对照通用契约",[598,4522,4523,4538],{},[601,4524,4525],{},[604,4526,4527,4532,4535],{},[607,4528,4529,4531],{},[382,4530,419],{"href":418}," 的要求",[607,4533,4534],{},"本实现",[607,4536,4537],{},"状态",[617,4539,4540,4554,4570,4584,4597,4608,4626,4637,4648,4662,4673,4683],{},[604,4541,4542,4545,4551],{},[622,4543,4544],{},"同一时间源",[622,4546,4547,4548,4550],{},"读 ",[388,4549,633],{},"；文本设置只作回退",[622,4552,4553],{},"部分：元字段与折扣之间的同步要由应用或 Flow 完成，本文未实现",[604,4555,4556,4559,4567],{},[622,4557,4558],{},"不用客户端时钟作真值",[622,4560,4561,4563,4564,4566],{},[388,4562,3733],{}," 请求的 ",[388,4565,3741],{}," 头估计偏移",[622,4568,4569],{},"设计已落实，店面实测未做",[604,4571,4572,4575,4581],{},[622,4573,4574],{},"不循环重置",[622,4576,4577,4578,4580],{},"只有绝对截止时刻，到期进入 ",[388,4579,1738],{}," 且无重启路径",[622,4582,4583],{},"已落实",[604,4585,4586,4589,4595],{},[622,4587,4588],{},"绝对时间始终可读、机器可读",[622,4590,4591,4592,4594],{},"UTC 文案 + ",[388,4593,1757],{}," + 访客时区文本",[622,4596,4583],{},[604,4598,4599,4602,4605],{},[622,4600,4601],{},"只服务一个活动",[622,4603,4604],{},"一个 shop 级元字段只能存一个时刻",[622,4606,4607],{},"已落实；多活动场景不支持",[604,4609,4610,4613,4623],{},[622,4611,4612],{},"不逐秒朗读",[622,4614,4615,4616,4619,4620,4622],{},"数字区 ",[388,4617,4618],{},"aria-hidden","，",[388,4621,3768],{}," 仅两次写入",[622,4624,4625],{},"已落实，读屏实测未做",[604,4627,4628,4631,4634],{},[622,4629,4630],{},"WCAG 2.2.2 可暂停 \u002F 停止 \u002F 隐藏",[622,4632,4633],{},"「隐藏倒计时」按钮，会话内记忆",[622,4635,4636],{},"已落实；「必要」例外是否成立未判断",[604,4638,4639,4642,4645],{},[622,4640,4641],{},"WCAG 2.2.1 时限",[622,4643,4644],{},"本分区只用于营销截止，不限制访客操作",[622,4646,4647],{},"是否适用需无障碍确认",[604,4649,4650,4653,4660],{},[622,4651,4652],{},"减少动态",[622,4654,4655,4656,4659],{},"无动画；唯一过渡在 ",[388,4657,4658],{},"no-preference"," 下",[622,4661,4583],{},[604,4663,4664,4667,4670],{},[622,4665,4666],{},"已结束",[622,4668,4669],{},"服务端与浏览器两处判定；撤下数字与按钮",[622,4671,4672],{},"已落实；折扣失效与缓存页撤下由平台和商家流程负责",[604,4674,4675,4678,4681],{},[622,4676,4677],{},"无 JavaScript",[622,4679,4680],{},"服务端输出绝对截止时间，按钮默认隐藏",[622,4682,4583],{},[604,4684,4685,4688,4691],{},[622,4686,4687],{},"时钟偏差过大或数据缺失",[622,4689,4690],{},"缺失则不输出；偏移估计失败则退回本机时钟",[622,4692,4693],{},"部分：无法检测的本机时钟错误仍会显示错误数字",[422,4695,4696],{"id":4696},"安装与配置",[4698,4699,4700,4713,4725,4728],"ol",{},[492,4701,4702,4703,776,4706,4709,4710,4712],{},"把三个新文件放进 ",[388,4704,4705],{},"sections\u002F",[388,4707,4708],{},"assets\u002F","，追加两个语言文件与 ",[388,4711,3882],{}," 的改动。",[492,4714,4715,4716,4718,4719,4721,4722,4724],{},"为店铺创建 shop 级元字段定义 ",[388,4717,591],{},"，类型 ",[388,4720,595],{},"；由应用在折扣创建或修改时写入 ",[388,4723,534],{},"，或在没有应用时手动填写（手动填写就失去了同源保证，属于退而求其次）。后台创建 shop 级定义的具体路径本文未逐步核验。",[492,4726,4727],{},"在主题编辑器里添加「Countdown timer」分区。没有元字段也没有回退值时，编辑器内只会看到一行提示，前台不输出。",[492,4729,4730,4731,4735,4736,4740],{},"后台折扣的结束时间必须与元字段一致；按 ",[382,4732,4734],{"href":4733},"\u002Fzh\u002Fshopify\u002Fshopify-discounts","Shopify 折扣"," 与",[382,4737,4739],{"href":4738},"\u002Fzh\u002Fmodules\u002Fpromotion-redemption","促销兑现","核对到期后的购物车行为。",[422,4742,4743],{"id":4743},"读源码时发现的问题",[489,4745,4746,4760],{},[492,4747,4748,4749,4751,4752,531,4754,4756,4757,4759],{},"Dawn 的 ",[388,4750,3829],{}," 只处理轮播、商品弹窗和图片缩放脚本，对分区级定时器没有通用清理机制；任何带 ",[388,4753,453],{},[388,4755,3764],{}," 的新分区都得自己在 ",[388,4758,793],{}," 里收尾。",[492,4761,4762,4765,4766,4769,4770,4773,4774,399,4777,531,4780,4783,4784,4787],{},[388,4763,4764],{},"announcement-bar.liquid"," 的轮播是主题里唯一按时间自动更新的内容，它用 ",[388,4767,4768],{},"aria-live=\"polite\""," 并在自动播放时切到 ",[388,4771,4772],{},"off","（",[382,4775,459],{"href":457,"rel":4776},[386],[388,4778,4779],{},"play",[388,4781,4782],{},"pause","）；倒计时没有沿用这一套，因为每分钟变化的数字即使 ",[388,4785,4786],{},"polite"," 也会打扰读屏用户。",[422,4789,4790],{"id":4790},"建议的验证范围",[378,4792,4793,4794,4797],{},"本篇只做了静态检查（theme check 与 ",[388,4795,4796],{},"node --check","），以下均未执行：",[4698,4799,4800,4816,4825,4828,4831,4834,4837,4840],{},[492,4801,4802,4803,4805,4806,776,4809,4812,4813,4815],{},"在开发店铺把 ",[388,4804,595],{}," 元字段分别填为 ",[388,4807,4808],{},"2026-10-31T15:59:00",[388,4810,4811],{},"2026-10-31T15:59:00Z","，核对服务端 ",[388,4814,1738],{}," 判断与前台静态文案的时区。",[492,4817,4818,4819,4821,4822,4824],{},"在店面对当前页发 ",[388,4820,3733],{}," 请求，确认有 ",[388,4823,3741],{}," 响应头且不被缓存层改写；故意调错本机时钟，核对数字按服务端时间显示。",[492,4826,4827],{},"在主题编辑器里反复修改分区设置、拖动顺序、删除分区，用浏览器性能面板确认没有残留定时器。",[492,4829,4830],{},"用屏幕阅读器确认数字区不被读出，进入最后一小时与到期时各只播报一次。",[492,4832,4833],{},"开启系统的减少动态设置，确认数字只做文本替换。",[492,4835,4836],{},"禁用 JavaScript，确认只显示绝对截止时间，没有占位数字与按钮。",[492,4838,4839],{},"把折扣结束时间与元字段故意设成不同值，确认流程上能发现并纠正；这是同源要求的最后一道人工检查。",[492,4841,4842],{},"同页放两个分区实例，确认各自独立计时、隐藏按钮互不影响。",[4844,4845,4846],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":890,"searchDepth":903,"depth":903,"links":4848},[4849,4850,4851,4852,4853,4854,4855,4856,4857,4858],{"id":424,"depth":903,"text":425},{"id":481,"depth":903,"text":482},{"id":693,"depth":903,"text":693},{"id":882,"depth":903,"text":883},{"id":1778,"depth":903,"text":1778},{"id":3888,"depth":903,"text":3888},{"id":4520,"depth":903,"text":4520},{"id":4696,"depth":903,"text":4696},{"id":4743,"depth":903,"text":4743},{"id":4790,"depth":903,"text":4790},"dtc",[],"historical","基于 Dawn v16.0.0 固定源码，先以全仓库搜索确认主题未内置倒计时，再按 Dawn 自身写法新增一个 countdown-timer 分区：截止时间读 shop 元字段而不另填，剩余时间不在 Liquid 里算，自定义元素按分钟与秒两档更新、只在两个节点播报、提供隐藏按钮并在编辑器卸载时清理；代码通过 theme check，未在真实店铺运行。",[4864],"storefront-experience","partial","md",[],[103],[],{},[],[],[],[103,235,241,252,239,234,246,174,66,88,281,232],[4876],"developer",{"title":368,"description":4862},[732,4879,750,457,4880,4881,813,3880,4882,4883,4884,4885,4886,4887,4888,4889,4890],"https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Fsections\u002Fannouncement-bar.liquid","https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Fassets\u002Ftheme-editor.js","https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Fassets\u002Fanimations.js","https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Flocales\u002Fen.default.schema.json","https:\u002F\u002Fgithub.com\u002FShopify\u002Fdawn\u002Fblob\u002Fbc39a7d2024f1e5c14c42f855bd3552b4913e204\u002Fconfig\u002Fsettings_schema.json","https:\u002F\u002Fshopify.dev\u002Fdocs\u002Fstorefronts\u002Fthemes\u002Farchitecture\u002Fsettings\u002Finput-settings","https:\u002F\u002Fshopify.dev\u002Fdocs\u002Fapi\u002Fliquid\u002Fobjects\u002Fdiscount_application","https:\u002F\u002Fshopify.dev\u002Fdocs\u002Fapi\u002Fliquid\u002Fobjects\u002Fshop","https:\u002F\u002Fshopify.dev\u002Fdocs\u002Fapi\u002Fliquid\u002Fobjects\u002Fmetafield","https:\u002F\u002Fshopify.dev\u002Fdocs\u002Fapps\u002Fbuild\u002Fcustom-data\u002Fmetafields\u002Flist-of-data-types","https:\u002F\u002Fshopify.dev\u002Fdocs\u002Fapi\u002Fliquid\u002Ffilters\u002Fdate","https:\u002F\u002Fshopify.dev\u002Fdocs\u002Fstorefronts\u002Fthemes\u002Farchitecture\u002Fsections\u002Fintegrate-sections-with-the-theme-editor",[4892],"convert","published","shopify\u002Fthemes\u002Fdawn\u002Fcountdown-timer",[4896,4897,4898,419,4899,406],"Dawn","Shopify","倒计时","定制实现",[4901],{"theme":4902,"version":4903,"url":384},"dawn","v16.0.0 · bc39a7d2024f1e5c14c42f855bd3552b4913e204",[4905],"shopify","2026-10-08",[],"2026-10-08 对照 Dawn v16.0.0 固定提交 bc39a7d 复核：在该提交上用 rg 全仓库搜索 countdown、count-down、timer、setInterval 与 \u003Ctime；读取 rich-text、announcement-bar、main-product 分区、global.js、theme-editor.js、animations.js、base.css、layout\u002Ftheme.liquid、en.default.schema.json 与 settings_schema.json 的写法；读取 shopify.dev 的输入设置类型、discount_application、shop、metafield 对象、date 过滤器与主题编辑器事件页。实现文件放入该提交的副本后运行 Shopify CLI 4.8.5 的 theme check，新增文件 0 条问题，整仓问题数与改动前相同（9 条警告均为 Dawn 既有）；JS 通过 node --check。2026-10-07 曾在 v15.3.0（ecb06c3）上做过同样的检查，结论一致。未执行 Liquid 渲染、主题编辑器、真实店铺、屏幕阅读器与减少动态实测；元字段字符串经 date 过滤器解析时的时区、HEAD 请求的 Date 响应头在 Shopify 缓存下是否可用，均未验证。","WxXJLpUjEf9NUobdIarS9EfNdXxGUh5ZoNRQd2jN3LI",{"topic":4911,"paths":4914},{"featured":4912,"title":4913,"path":321},[280,235,249,254,267,256,272,266,258,257,262,271,259,268,237,236,250,247,242,243,248,246,239,251,253,244,241,238,245,234,252,240,265,260,269,261,270,264,263,255,281,13,17,14,18,12,16,15,228],"官方主题解析",[],[4916,4918,4920,4922,4924,4926],{"title":4917,"path":103},"Countdown Timer：倒计时",{"title":4919,"path":235},"Dawn 15.3.0 架构：从商品页进入渲染与交互",{"title":4921,"path":241},"Dawn 的组件组织：Custom Elements 加 25 行 pubsub",{"title":4923,"path":252},"Dawn 怎样适配主题编辑器：设计模式、编辑器事件与重渲染清理",{"title":4925,"path":239},"Dawn 内容分区与动效：轮播、折叠、横幅与滚动显现",{"title":4927,"path":234},"Dawn 的无障碍写法：details 增强、焦点管理、状态播报与 combobox",{"titles":4929,"toolNames":4930,"domainPaths":4935,"reverse":4936},{"\u002Fpresentation\u002Fcountdown-timer":4917},{"google-ads":4931,"google-analytics":4932,"meta-ads":4933,"shopify":4897,"woocommerce":4934},"Google Ads","Google Analytics","Meta Ads","WooCommerce",[20,21,22,23,24,25,26,27,28,29],{"implements":4937,"measuredBy":4938,"needs":4939,"constrainedBy":4940},[],[],[],[],1791601780526]