1<!DOCTYPE html> 2<html lang="en"> 3 4<head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <title>The Local's Dozen | Toronto's Best Free Events Listings This Week</title> 8 9 <link rel="stylesheet" href="/assets/built/screen.css?v=hyaPx3lkD4rPhRRw"> 10 11 <meta name="description" content="a dozen-ish curated free events in Toronto this week from festivals to book events to farmers' markets and more."> 12 <link rel="icon" href="https://www.localsdozen.com/content/images/size/w256h256/2026/06/the-local-s-dozen-centred_1-1.png" type="image/png"> 13 <link rel="canonical" href="https://www.localsdozen.com/"> 14 <meta name="referrer" content="no-referrer-when-downgrade"> 15 <link rel="next" href="https://www.localsdozen.com/page/2/"> 16 17 <meta property="og:site_name" content="The Local's Dozen"> 18 <meta property="og:type" content="website"> 19 <meta property="og:title" content="The Local's Dozen"> 20 <meta property="og:description" content="a dozen-ish curated free events in Toronto this week from festivals to book events to farmers' markets and more."> 21 <meta property="og:url" content="https://www.localsdozen.com/"> 22 <meta name="twitter:card" content="summary"> 23 <meta name="twitter:title" content="The Local's Dozen"> 24 <meta name="twitter:description" content="a dozen-ish curated free events in Toronto this week from festivals to book events to farmers' markets and more."> 25 <meta name="twitter:url" content="https://www.localsdozen.com/"> 26 27
27<script type="application/ld+json"> 28{ 29 "@context": "https://schema.org", 30 "@type": "WebSite", 31 "publisher": { 32 "@type": "Organization", 33 "name": "The Local's Dozen", 34 "url": "https://www.localsdozen.com/", 35 "logo": { 36 "@type": "ImageObject", 37 "url": "https://www.localsdozen.com/content/images/size/w256h256/2026/06/the-local-s-dozen-centred_1-1.png", 38 "width": 60, 39 "height": 60 40 } 41 }, 42 "url": "https://www.localsdozen.com/", 43 "name": "The Local's Dozen", 44 "mainEntityOfPage": "https://www.localsdozen.com/", 45 "description": "a dozen-ish curated free events in Toronto this week from festivals to book events to farmers' markets and more." 46} 47 </script>
47 48 49 <meta name="generator" content="Ghost 6.67"> 50 <link rel="alternate" type="application/rss+xml" title="The Local's Dozen" href="https://www.localsdozen.com/daily-posts/rss/"> 51
51<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://www.localsdozen.com/" data-key="819dc1cde5b95403085ef9cae7" data-api="https://www.localsdozen.com/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script>
51<style id="gh-members-styles">.gh-post-upgrade-cta-content, 52.gh-post-upgrade-cta { 53 display: flex; 54 flex-direction: column; 55 align-items: center; 56 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 57 text-align: center; 58 width: 100%; 59 color: #ffffff; 60 font-size: 16px; 61} 62 63.gh-post-upgrade-cta-content { 64 border-radius: 8px; 65 padding: 40px 4vw; 66} 67 68.gh-post-upgrade-cta h2 { 69 color: #ffffff; 70 font-size: 28px; 71 letter-spacing: -0.2px; 72 margin: 0; 73 padding: 0; 74} 75 76.gh-post-upgrade-cta p { 77 margin: 20px 0 0; 78 padding: 0; 79} 80 81.gh-post-upgrade-cta small { 82 font-size: 16px; 83 letter-spacing: -0.2px; 84} 85 86.gh-post-upgrade-cta a { 87 color: #ffffff; 88 cursor: pointer; 89 font-weight: 500; 90 box-shadow: none; 91 text-decoration: underline; 92} 93 94.gh-post-upgrade-cta a:hover { 95 color: #ffffff; 96 opacity: 0.8; 97 box-shadow: none; 98 text-decoration: underline; 99} 100 101.gh-post-upgrade-cta a.gh-btn { 102 display: block; 103 background: #ffffff; 104 text-decoration: none; 105 margin: 28px 0 0; 106 padding: 8px 18px; 107 border-radius: 4px; 108 font-size: 16px; 109 font-weight: 600; 110} 111 112.gh-post-upgrade-cta a.gh-btn:hover { 113 opacity: 0.92; 114}</style>
114<script async src="https://js.stripe.com/v3/"></script>
114 115
115<script defer src="https://jsdelivr.net" data-key="819dc1cde5b95403085ef9cae7" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://www.localsdozen.com/" data-locale="en" crossorigin="anonymous"></script>
115 116 117 <link href="https://www.localsdozen.com/webmentions/receive/" rel="webmention"> 118
118<script defer src="/public/cards.min.js?v=ShRHxgy4po8zN-Wf"></script>
118 119 <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=WwnU9jw5ancNC8Gc"> 120
120<script defer src="/public/comment-counts.min.js?v=oFYkaGLdiMqB8VN9" data-ghost-comments-counts-api="https://www.localsdozen.com/members/api/comments/counts/"></script>
120 121
121<script defer src="/public/member-attribution.min.js?v=AKG4hWena9j3yX3I"></script>
121 122
122<script defer src="/public/ghost-stats.min.js?v=vFcCUf6ZQ0Hyhc8h" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://www.localsdozen.com/.ghost/analytics/api/v1/page_hit" tb_site_uuid="ec2ae83a-b4b3-4820-9013-497da3b3713c" tb_post_uuid="undefined" tb_post_type="null" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script>
122<style>:root {--ghost-accent-color: #edddb4;}</style> 123 <!-- Google Analytics --> 124<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 124-125
124 125<script async src="https://www.googletagmanager.com/gtag/js?id=
125G-G59YVBRJKM
vendor: 12 bytes, line 125
125"></script>
126<script> 127
vendor: 134 bytes, lines 127-131
127window.dataLayer = window.dataLayer || []; 128 function gtag(){dataLayer.push(arguments);} 129 gtag('js', new Date()); 130 131 gtag('config', '
131G-G59YVBRJKM
vendor: 4 bytes, line 131
131');
132</script>
132 133 134 135<!-- // add custom fonts --> 136<link rel="preconnect" href="https://fonts.googleapis.com"> 137<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 138<link href="https://googleapis.com" rel="stylesheet"> 139 140<style> 141:root { 142 --font-base: 'News Cycle', sans-serif; /* Changes body text */ 143 --font-headings: 'Special Elite', system-ui; /* Changes headings */ 144} 145 146</style> 147<!-- HIDE TAGS ON THE WHOLE SITE --> 148<style> 149 /* Hides tags on the homepage and daily post feed cards */ 150 .feed-calendar, 151 .feed-length, 152 .feed-item .feed-primary-tag { 153 display: none !important; 154 } 155 156 /* Hides the tag/category header on the /tag/daily archive page */ 157 .archive-header .archive-tag, 158 .archive-header .archive-description, 159 .tag-template .archive-header { 160 display: none !important; 161 } 162 163 /* Hides the tag label at the top of individual post pages */ 164 .single-meta .single-meta-tag, 165 .post-template .single-meta-tag { 166 display: none !important; 167 } 168</style> 169<!-- ADD DROPDOWN MENU ABILITY USE DASH (-) IN ORDER TO SHOW UP AS DROPDOWN ITEM --> 170<style> 171/* ============================================================ 172 GHOST EDITION â HIERARCHICAL NAVIGATION 173 ------------------------------------------------------------ 174 Ghost Primary Navigation: 175 176 Calendars 177 - Outdoor Movies 178 - Live Music 179 - Fitness 180 - Farmers' Markets 181 - Art 182 About 183 Support 184 185 Desktop: 186 ⢠Dropdown opens on hover/focus/click 187 ⢠Submenu floats below parent 188 ⢠No tree lines 189 190 Mobile: 191 ⢠Submenu opens by tapping arrow 192 ⢠Child items use indented tree styling 193 194 Edition breakpoint: 195 ⢠Desktop/tablet: 768px+ 196 ⢠Mobile/hamburger: 767px and below 197 ============================================================ */ 198 199 200/* ============================================================ 201 SHARED 202 ============================================================ */ 203 204.gh-head .nav > .gh-nav-dropdown { 205 position: relative; 206} 207 208 209/* ------------------------------------------------------------ 210 Dropdown arrow button 211 ------------------------------------------------------------ */ 212 213.gh-nav-dropdown-toggle { 214 appearance: none; 215 -webkit-appearance: none; 216 217 display: inline-flex; 218 align-items: center; 219 justify-content: center; 220 221 width: 22px; 222 height: 22px; 223 224 margin: 0 0 0 5px; 225 padding: 0; 226 227 border: 0; 228 outline: 0; 229 230 background: transparent; 231 color: inherit; 232 233 font: inherit; 234 cursor: pointer; 235 236 vertical-align: middle; 237} 238 239 240/* Arrow / chevron */ 241 242.gh-nav-dropdown-toggle::after { 243 content: ""; 244 245 display: block; 246 247 width: 6px; 248 height: 6px; 249 250 border-right: 2px solid currentColor; 251 border-bottom: 2px solid currentColor; 252 253 transform: rotate(45deg) translate(-1px, -1px); 254 transform-origin: center; 255 256 transition: transform 150ms ease; 257} 258 259 260/* Keyboard focus */ 261 262.gh-nav-dropdown-toggle:focus-visible { 263 outline: 2px solid currentColor; 264 outline-offset: 2px; 265 border-radius: 3px; 266} 267 268 269/* ------------------------------------------------------------ 270 Submenu base reset 271 ------------------------------------------------------------ */ 272 273.gh-nav-submenu { 274 margin: 0; 275 padding: 0; 276 277 list-style: none; 278} 279 280.gh-nav-submenu > li { 281 margin: 0; 282 padding: 0; 283 284 list-style: none; 285} 286 287.gh-nav-submenu > li::marker { 288 content: ""; 289} 290 291 292/* ============================================================ 293 DESKTOP / TABLET â 768px+ 294 ============================================================ */ 295 296@media (min-width: 768px) { 297 298 /* -------------------------------------------------------- 299 Keep dropdown parent aligned with the normal Edition menu 300 -------------------------------------------------------- */ 301 302 .gh-head .nav > .gh-nav-dropdown { 303 position: relative !important; 304 305 display: flex !important; 306 align-items: center !important; 307 308 width: auto !important; 309 height: auto !important; 310 311 margin-top: 0 !important; 312 margin-bottom: 0 !important; 313 } 314 315 316 .gh-head .nav > .gh-nav-dropdown > a { 317 display: inline-flex !important; 318 align-items: center !important; 319 320 margin: 0 !important; 321 } 322 323 324 .gh-head .nav > .gh-nav-dropdown > .gh-nav-dropdown-toggle { 325 flex: 0 0 auto; 326 } 327 328 329 /* -------------------------------------------------------- 330 Floating desktop dropdown 331 -------------------------------------------------------- */ 332 333 .gh-head .gh-nav-dropdown > .gh-nav-submenu { 334 position: absolute !important; 335 336 top: calc(100% + 12px) !important; 337 bottom: auto !important; 338 339 left: 50% !important; 340 right: auto !important; 341 342 z-index: 10000; 343 344 display: block !important; 345 346 min-width: 210px; 347 width: max-content; 348 max-width: min(320px, calc(100vw - 32px)); 349 350 margin: 0 !important; 351 padding: 7px !important; 352 353 list-style: none !important; 354 355 background: var(--color-background, #fff); 356 357 border: 1px solid rgba(0, 0, 0, 0.10) !important; 358 border-radius: 8px !important; 359 360 box-shadow: 361 0 12px 30px rgba(0, 0, 0, 0.10), 362 0 2px 5px rgba(0, 0, 0, 0.04); 363 364 visibility: hidden; 365 opacity: 0; 366 367 pointer-events: none; 368 369 transform: translate(-50%, -5px); 370 371 transition: 372 opacity 150ms ease, 373 transform 150ms ease, 374 visibility 150ms ease; 375 } 376 377 378 /* Invisible gap bridge so hover doesn't drop while 379 moving the pointer from Calendars to the submenu */ 380 381 .gh-head .gh-nav-dropdown > .gh-nav-submenu::before { 382 content: ""; 383 384 position: absolute; 385 386 left: 0; 387 right: 0; 388 bottom: 100%; 389 390 height: 14px; 391 } 392 393 394 /* -------------------------------------------------------- 395 Desktop submenu items 396 -------------------------------------------------------- */ 397 398 .gh-head .gh-nav-submenu > li { 399 position: static !important; 400 401 display: block !important; 402 403 width: 100% !important; 404 405 margin: 0 !important; 406 padding: 0 !important; 407 408 border: 0 !important; 409 410 opacity: 1 !important; 411 transform: none !important; 412 } 413 414 415 /* Remove mobile tree branches on desktop */ 416 417 .gh-head .gh-nav-submenu > li::before, 418 .gh-head .gh-nav-submenu > li::after { 419 content: none !important; 420 display: none !important; 421 } 422 423 424 .gh-head .gh-nav-submenu > li > a { 425 display: block !important; 426 427 width: 100%; 428 429 padding: 9px 12px !important; 430 431 border: 0 !important; 432 border-radius: 5px; 433 434 color: inherit !important; 435 background: transparent; 436 437 font: inherit; 438 font-size: inherit; 439 font-weight: 500; 440 line-height: 1.35; 441 442 text-align: left; 443 text-decoration: none !important; 444 445 white-space: nowrap; 446 447 opacity: 1 !important; 448 transform: none !important; 449 450 box-sizing: border-box; 451 } 452 453 454 .gh-head .gh-nav-submenu > li > a:hover, 455 .gh-head .gh-nav-submenu > li > a:focus-visible { 456 background: rgba(0, 0, 0, 0.055); 457 } 458 459 460 /* -------------------------------------------------------- 461 SHOW DROPDOWN 462 463 Hover = desktop mouse 464 focus-within = keyboard 465 is-open = arrow click/touch devices 466 -------------------------------------------------------- */ 467 468 .gh-head .gh-nav-dropdown:hover > .gh-nav-submenu, 469 .gh-head .gh-nav-dropdown:focus-within > .gh-nav-submenu, 470 .gh-head .gh-nav-dropdown.is-open > .gh-nav-submenu { 471 visibility: visible; 472 opacity: 1; 473 474 pointer-events: auto; 475 476 transform: translate(-50%, 0); 477 } 478 479 480 /* Rotate arrow while menu is visible */ 481 482 .gh-head .gh-nav-dropdown:hover 483 > .gh-nav-dropdown-toggle::after, 484 485 .gh-head .gh-nav-dropdown:focus-within 486 > .gh-nav-dropdown-toggle::after, 487 488 .gh-head .gh-nav-dropdown.is-open 489 > .gh-nav-dropdown-toggle::after { 490 491 transform: rotate(225deg) translate(-1px, -1px); 492 } 493} 494 495 496/* ============================================================ 497 MOBILE / HAMBURGER â 767px and below 498 ============================================================ */ 499 500@media (max-width: 767px) { 501 502 /* -------------------------------------------------------- 503 Parent 504 -------------------------------------------------------- */ 505 506 .gh-head .nav > .gh-nav-dropdown { 507 position: relative !important; 508 509 display: block !important; 510 511 width: auto !important; 512 513 margin: 0 !important; 514 515 text-align: center; 516 } 517 518 519 .gh-head .gh-nav-dropdown > a { 520 display: inline !important; 521 } 522 523 524 /* Slightly larger touch target */ 525 526 .gh-nav-dropdown-toggle { 527 width: 30px; 528 height: 30px; 529 530 margin-left: 5px; 531 532 vertical-align: 3px; 533 } 534 535 536 /* -------------------------------------------------------- 537 Mobile submenu 538 539 Hidden until arrow is tapped. 540 It stays in normal document flow rather than floating. 541 -------------------------------------------------------- */ 542 543 .gh-head .gh-nav-dropdown > .gh-nav-submenu { 544 position: relative !important; 545 546 top: auto !important; 547 right: auto !important; 548 bottom: auto !important; 549 left: auto !important; 550 551 z-index: auto !important; 552 553 display: none !important; 554 555 width: max-content; 556 max-width: calc(100vw - 64px); 557 558 margin: 9px auto 6px !important; 559 padding: 3px 0 3px 18px !important; 560 561 list-style: none !important; 562 563 background: transparent !important; 564 565 border: 0 !important; 566 border-left: 1px solid rgba(21, 23, 26, 0.28) !important; 567 border-radius: 0 !important; 568 569 box-shadow: none !important; 570 571 visibility: visible !important; 572 opacity: 1 !important; 573 574 pointer-events: auto !important; 575 576 transform: none !important; 577 578 text-align: left; 579 } 580 581 582 /* Show mobile submenu after tapping arrow */ 583 584 .gh-head .gh-nav-dropdown.is-open > .gh-nav-submenu { 585 display: block !important; 586 } 587 588 589 /* --------------------------------------------------------
590 Mobile submenu children 591 -------------------------------------------------------- */ 592 593 .gh-head .gh-nav-submenu > li { 594 position: relative !important; 595 596 display: block !important; 597 598 width: auto !important; 599 600 margin: 0 !important; 601 padding: 0 !important; 602 603 list-style: none !important; 604 605 border: 0 !important; 606 607 opacity: 1 !important; 608 transform: none !important; 609 } 610 611 612 /* Horizontal branch from tree */ 613 614 .gh-head .gh-nav-submenu > li::before { 615 content: "" !important; 616 617 position: absolute; 618 619 top: 50%; 620 left: -18px; 621 622 display: block !important; 623 624 width: 10px; 625 height: 0; 626 627 border-top: 1px solid rgba(21, 23, 26, 0.28); 628 629 transform: translateY(-50%); 630 } 631 632 633 /* 634 * Cover the vertical line underneath the final item so 635 * the tree terminates cleanly. 636 */ 637 638 .gh-head .gh-nav-submenu > li:last-child::after { 639 content: "" !important; 640 641 position: absolute; 642 643 top: 50%; 644 bottom: -10px; 645 left: -19px; 646 647 display: block !important; 648 649 width: 3px; 650 651 background: var(--color-background, #fff); 652 } 653 654 655 .gh-head .gh-nav-submenu > li > a { 656 position: relative; 657 658 display: block !important; 659 660 width: auto !important; 661 662 padding: 6px 2px !important; 663 664 border: 0 !important; 665 666 color: inherit !important; 667 background: transparent !important; 668 669 font: inherit; 670 font-size: 0.88em !important; 671 font-weight: 500 !important; 672 line-height: 1.35 !important; 673 674 text-align: left; 675 text-decoration: none !important; 676 677 white-space: normal; 678 679 opacity: 0.78 !important; 680 transform: none !important; 681 } 682 683 684 .gh-head .gh-nav-submenu > li > a:active { 685 opacity: 1 !important; 686 } 687 688 689 /* Rotate arrow when mobile submenu is open */ 690 691 .gh-head .gh-nav-dropdown.is-open 692 > .gh-nav-dropdown-toggle::after { 693 694 transform: rotate(225deg) translate(-1px, -1px); 695 } 696} 697 698 699/* ============================================================ 700 DARK MODE / DARK THEME SUPPORT 701 ============================================================ */ 702 703@media (prefers-color-scheme: dark) { 704 705 @media (min-width: 768px) { 706 707 .gh-head .gh-nav-dropdown > .gh-nav-submenu { 708 border-color: rgba(255, 255, 255, 0.14) !important; 709 } 710 711 .gh-head .gh-nav-submenu > li > a:hover, 712 .gh-head .gh-nav-submenu > li > a:focus-visible { 713 background: rgba(255, 255, 255, 0.08); 714 } 715 } 716 717 @media (max-width: 767px) { 718 719 .gh-head .gh-nav-dropdown > .gh-nav-submenu { 720 border-left-color: 721 rgba(255, 255, 255, 0.30) !important; 722 } 723 724 .gh-head .gh-nav-submenu > li::before { 725 border-top-color: 726 rgba(255, 255, 255, 0.30); 727 } 728 } 729} 730 731 732/* ============================================================ 733 REDUCED MOTION 734 ============================================================ */ 735 736@media (prefers-reduced-motion: reduce) { 737 738 .gh-nav-dropdown-toggle::after, 739 .gh-head .gh-nav-dropdown > .gh-nav-submenu { 740 transition: none !important; 741 } 742} 743</style> 744<!-- CODE TO RESTYLE NEWSLETTER SIGNUP ON CALENDAR PAGES --> 745<style> 746/* ========================================================================== 747 LOCAL'S DOZEN â CALENDAR SIGNUP CARDS 748 749 Applies only to native Ghost Signup cards inside posts/pages tagged with 750 the internal tag #calendar (rendered by Ghost as .tag-hash-calendar). 751 752 Ghost editor setup for each calendar: 753 - Add a native Signup card 754 - Choose Regular width 755 - Do not add an image 756 - Set that calendar's heading, subtitle, button and member label in the card 757 ========================================================================== */ 758 759/* Card shell */ 760.tag-hash-calendar .kg-signup-card, 761.tag-hash-calendar .kg-signup-card * { 762 box-sizing: border-box; 763} 764 765.tag-hash-calendar .kg-signup-card { 766 --ld-calendar-ink: var(--darker-gray-color, #1a1a1a); 767 --ld-calendar-muted: var(--secondary-text-color, #777); 768 --ld-calendar-paper: var(--lighter-gray-color, #f6f6f6); 769 --ld-calendar-line: var(--light-gray-color, #e6e6e6); 770 --ld-calendar-white: var(--white-color, #fff); 771 772 container-type: inline-size; 773 width: 100% !important; 774 max-width: 100% !important; 775 min-height: 0 !important; 776 margin: 32px 0 !important; 777 padding: 0 !important; 778 overflow: visible !important; 779 color: var(--ld-calendar-ink) !important; 780 background: transparent !important; 781 border: 0 !important; 782 border-radius: 0 !important; 783 box-shadow: none !important; 784} 785 786/* Keep every calendar signup compact, even if an image layout was selected. */ 787.tag-hash-calendar .kg-signup-card-content { 788 display: block !important; 789 width: 100% !important; 790 min-height: 0 !important; 791 padding: 0 !important; 792 background: transparent !important; 793} 794 795.tag-hash-calendar .kg-signup-card-content > picture, 796.tag-hash-calendar .kg-signup-card-image { 797 display: none !important; 798} 799 800/* Horizontal editorial strip */ 801.tag-hash-calendar .kg-signup-card-text { 802 display: grid !important; 803 grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.25fr); 804 grid-template-rows: auto auto; 805 column-gap: 24px; 806 row-gap: 6px; 807 align-items: center; 808 width: 100% !important; 809 min-width: 0; 810 min-height: 0 !important; 811 margin: 0 !important; 812 padding: 20px 32px 20px 24px !important; 813 color: var(--ld-calendar-ink) !important; 814 text-align: left !important; 815 background: var(--ld-calendar-paper) !important; 816 border-top: 5px solid var(--ld-calendar-ink) !important; 817 border-right: 0 !important; 818 border-bottom: 1px solid var(--ld-calendar-line) !important; 819 border-left: 0 !important; 820 border-radius: 0 !important; 821} 822 823/* Copy */ 824.tag-hash-calendar .kg-signup-card-heading { 825 grid-column: 1; 826 grid-row: 1; 827 align-self: end; 828 min-width: 0; 829 margin: 0 !important; 830 padding: 0 !important; 831 color: var(--ld-calendar-ink) !important; 832 font-family: var(--gh-font-heading, var(--font-serif, Georgia, "Times New Roman", serif)) !important; 833 font-size: clamp(21px, 2.2vw, 26px) !important; 834 font-weight: 800 !important; 835 line-height: 1.08 !important; 836 letter-spacing: -0.025em !important; 837 text-align: left !important; 838} 839 840.tag-hash-calendar .kg-signup-card-subheading { 841 grid-column: 1; 842 grid-row: 2;
843 align-self: start; 844 min-width: 0; 845 margin: 0 !important; 846 padding: 0 !important; 847 color: var(--ld-calendar-muted) !important; 848 font-family: var(--gh-font-body, var(--font-sans, Arial, sans-serif)) !important; 849 font-size: 15px !important; 850 font-weight: 400 !important; 851 line-height: 1.35 !important; 852 letter-spacing: 0 !important; 853 text-align: left !important; 854} 855 856/* Form */ 857.tag-hash-calendar .kg-signup-card-form { 858 grid-column: 2; 859 grid-row: 1 / span 2; 860 align-self: center; 861 width: 100% !important; 862 min-width: 0; 863 margin: 0 !important; 864 padding: 0 !important; 865} 866 867.tag-hash-calendar .kg-signup-card-fields { 868 display: grid !important; 869 grid-template-columns: minmax(0, 1fr) max-content; 870 gap: 8px; 871 align-items: stretch; 872 width: 100% !important; 873 min-width: 0; 874 margin: 0 !important; 875 padding: 0 !important; 876 border: 0 !important; 877 background: transparent !important; 878} 879 880.tag-hash-calendar .kg-signup-card-input, 881.tag-hash-calendar .kg-signup-card-button { 882 height: 46px !important; 883 min-height: 46px !important; 884 margin: 0 !important; 885 border-radius: 5px !important; 886 font-family: var(--gh-font-body, var(--font-sans, Arial, sans-serif)) !important; 887 font-size: 15px !important; 888 line-height: 1 !important; 889} 890 891.tag-hash-calendar .kg-signup-card-input { 892 display: block !important; 893 width: 100% !important; 894 min-width: 0 !important; 895 padding: 0 14px !important; 896 color: var(--ld-calendar-ink) !important; 897 appearance: none; 898 background: var(--ld-calendar-white) !important; 899 border: 1px solid var(--ld-calendar-line) !important; 900 outline: none !important; 901 box-shadow: none !important; 902} 903 904.tag-hash-calendar .kg-signup-card-input::placeholder { 905 color: var(--ld-calendar-muted) !important; 906 opacity: 0.75; 907} 908 909.tag-hash-calendar .kg-signup-card-input:focus { 910 border-color: var(--ld-calendar-ink) !important; 911 box-shadow: 0 0 0 1px var(--ld-calendar-ink) !important; 912} 913 914.tag-hash-calendar .kg-signup-card-button { 915 position: relative !important; 916 display: inline-flex !important; 917 align-items: center !important; 918 justify-content: center !important; 919 width: auto !important; 920 max-width: 100% !important; 921 padding: 0 18px !important; 922 color: var(--ld-calendar-white) !important; 923 font-weight: 800 !important; 924 white-space: nowrap; 925 text-transform: none !important; 926 letter-spacing: 0 !important; 927 cursor: pointer; 928 background: var(--ld-calendar-ink) !important; 929 border: 1px solid var(--ld-calendar-ink) !important; 930 outline: none !important; 931 box-shadow: none !important; 932 transition: opacity 120ms ease, transform 120ms ease; 933} 934 935.tag-hash-calendar .kg-signup-card-button:hover { 936 opacity: 0.84; 937 transform: translateY(-1px); 938} 939 940.tag-hash-calendar .kg-signup-card-button:focus-visible { 941 outline: 2px solid var(--ld-calendar-ink) !important; 942 outline-offset: 3px !important; 943} 944 945/* Ghost's loading, success and error states */ 946.tag-hash-calendar .kg-signup-card-success, 947.tag-hash-calendar .kg-signup-card-error { 948 color: var(--ld-calendar-muted) !important; 949 font-family: var(--gh-font-body, var(--font-sans, Arial, sans-serif)) !important; 950 font-size: 13px !important; 951 line-height: 1.35 !important; 952 text-align: left !important; 953} 954 955.tag-hash-calendar .kg-signup-card-error { 956 margin-top: 8px !important; 957 color: #9d2727 !important; 958} 959 960/* The subtitle already provides the useful supporting copy. */ 961.tag-hash-calendar .kg-signup-card-disclaimer { 962 display: none !important; 963} 964 965/* Stack based on the card's real content width, not the full browser width. */ 966@container (max-width: 620px) { 967 .tag-hash-calendar .kg-signup-card-text { 968 grid-template-columns: minmax(0, 1fr); 969 grid-template-rows: auto; 970 row-gap: 0; 971 padding: 20px !important; 972 } 973 974 .tag-hash-calendar .kg-signup-card-heading, 975 .tag-hash-calendar .kg-signup-card-subheading, 976 .tag-hash-calendar .kg-signup-card-form { 977 grid-column: 1; 978 grid-row: auto; 979 } 980 981 .tag-hash-calendar .kg-signup-card-subheading { 982 margin-top: 6px !important; 983 } 984 985 .tag-hash-calendar .kg-signup-card-form { 986 margin-top: 16px !important; 987 } 988} 989 990@container (max-width: 480px) { 991 .tag-hash-calendar .kg-signup-card-fields { 992 grid-template-columns: minmax(0, 1fr); 993 } 994 995 .tag-hash-calendar .kg-signup-card-button { 996 width: 100% !important; 997 } 998} 999 1000/* Fallback for older browsers without container queries. */ 1001@supports not (container-type: inline-size) { 1002 @media (max-width: 700px) { 1003 .tag-hash-calendar .kg-signup-card-text { 1004 grid-template-columns: minmax(0, 1fr); 1005 grid-template-rows: auto; 1006 row-gap: 0; 1007 padding: 20px !important; 1008 } 1009 1010 .tag-hash-calendar .kg-signup-card-heading, 1011 .tag-hash-calendar .kg-signup-card-subheading, 1012 .tag-hash-calendar .kg-signup-card-form { 1013 grid-column: 1; 1014 grid-row: auto; 1015 } 1016 1017 .tag-hash-calendar .kg-signup-card-subheading { 1018 margin-top: 6px !important; 1019 } 1020 1021 .tag-hash-calendar .kg-signup-card-form { 1022 margin-top: 16px !important; 1023 } 1024 } 1025 1026 @media (max-width: 520px) { 1027 .tag-hash-calendar .kg-signup-card-fields { 1028 grid-template-columns: minmax(0, 1fr); 1029 } 1030 1031 .tag-hash-calendar .kg-signup-card-button { 1032 width: 100% !important; 1033 } 1034 } 1035} 1036</style> 1037<!-- homepage set thumbnails back to the width of the header image in Edition theme --> 1038<style> 1039/* Local's Dozen â show complete weekly feature images on homepage */ 1040 1041.home-template .feed-image.u-placeholder.rectangle::before { 1042 display: none !important; 1043} 1044 1045.home-template .feed-image .u-object-fit { 1046 position: relative !important; 1047 top: auto !important; 1048 left: auto !important; 1049 width: 100% !important; 1050 height: auto !important; 1051 object-fit: contain !important; 1052 display: block !important; 1053} 1054</style> 1055</head> 1056 1057<body class="home-template is-head-left-logo"> 1058<div class="site"> 1059 1060 <header id="gh-head" class="gh-head gh-outer"> 1061 <div class="gh-head-inner"> 1062 <div class="gh-head-brand"> 1063 <div class="gh-head-brand-wrapper"> 1064 <a class="gh-head-logo" href="https://www.localsdozen.com"> 1065 The Local's Dozen 1066 </a> 1067 </div> 1068 <button class="gh-search gh-icon-btn" aria-label="Search this site" data-ghost-search><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="20" height="20"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg></button> 1069 <button class="gh-burger" aria-label="Toggle menu"></button> 1070 </div> 1071 1072 <nav class="gh-head-menu"> 1073 <ul class="nav"> 1074 <li class="nav-home nav-current"><a href="https://www.localsdozen.com/">Home</a></li> 1075 <li class="nav-daily-picks"><a href="https://www.localsdozen.com/daily/">Daily Picks</a></li> 1076 <li class="nav-calendars"><a href="https://www.localsdozen.com/calendars/">Calendars</a></li> 1077 <li class="nav-outdoor-movies"><a href="https://www.localsdozen.com/toronto-free-outdoor-movies-calendar-2026/">- Outdoor Movies</a></li> 1078 <li class="nav-live-music"><a href="https://www.localsdozen.com/toronto-outdoor-live-music-2026/">- Live Music</a></li> 1079 <li class="nav-fitness"><a href="https://www.localsdozen.com/toronto-free-outdoor-fitness-calendar/">- Fitness</a></li> 1080 <li class="nav-farmers-markets"><a href="https://www.localsdozen.com/toronto-farmers-markets/">- Farmers' Markets</a></li> 1081 <li class="nav-art"><a href="https://www.localsdozen.com/toronto-art-calendar/">- Art</a></li> 1082 <li class="nav-about"><a href="https://www.localsdozen.com/about/">About</a></li> 1083 <li class="nav-support"><a href="https://www.localsdozen.com/support-the-locals-dozen/">Support</a></li> 1084</ul> 1085 1086 </nav> 1087 1088 <div class="gh-head-actions"> 1089 <button class="gh-search gh-icon-btn" aria-label="Search this site" data-ghost-search><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="20" height="20"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg></button> 1090 <div class="gh-head-members"> 1091 <a class="gh-head-link" href="#/portal/signin" data-portal="signin">Sign in</a> 1092 <a class="gh-head-btn gh-btn gh-primary-btn" href="#/portal/signup" data-portal="signup">Subscribe</a> 1093 </div> 1094 </div> 1095 </div> 1096 </header> 1097 1098 <div class="cover gh-outer"> 1099 1100 <div class="cover-content"> 1101 <div class="cover-description"> 1102 twelve things that are worth leaving the house for every week. 1103 </div> 1104 1105 <form class="form-wrapper cover-form" data-members-form> 1106 <input class="auth-email" type="email" name="email" data-members-email placeholder="Your email address" required="true"> 1107 <button class="form-button" type="submit" aria-label="Submit">
1108 <span class="default">Subscribe</span> 1109 <span class="loader"><svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"> 1110 <path opacity="0.3" fill="currentColor" d="M20.201,5.169c-8.254,0-14.946,6.692-14.946,14.946c0,8.255,6.692,14.946,14.946,14.946 s14.946-6.691,14.946-14.946C35.146,11.861,28.455,5.169,20.201,5.169z M20.201,31.749c-6.425,0-11.634-5.208-11.634-11.634 c0-6.425,5.209-11.634,11.634-11.634c6.425,0,11.633,5.209,11.633,11.634C31.834,26.541,26.626,31.749,20.201,31.749z" /> 1111 <path fill="currentColor" d="M26.013,10.047l1.654-2.866c-2.198-1.272-4.743-2.012-7.466-2.012h0v3.312h0 C22.32,8.481,24.301,9.057,26.013,10.047z"> 1112 <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 20 20" to="360 20 20" dur="0.5s" repeatCount="indefinite" /> 1113 </path> 1114</svg></span> 1115 <span class="success">Email sent</span> 1116 </button> 1117 </form> 1118 </div> 1119 1120 <button class="button-icon cover-arrow"> 1121 <svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" fill="currentColor" viewBox="0 0 256 256" class="icon"> 1122 <rect width="256" height="256" fill="none"></rect><polyline points="208 96 128 176 48 96" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="24"></polyline> 1123</svg> </button> 1124</div> 1125 <div class="site-content"> 1126 1127<main class="site-main"> 1128 1129 <header class="feed-header gh-canvas"> 1130 <div class="feed-header-wrapper"> 1131 <h2 class="feed-header-title">Latest</h2> 1132 </div> 1133 </header> 1134 1135 <div class="post-feed expanded gh-feed gh-canvas"> 1136 <article class="feed post tag-weekly featured" data-month="October 2026"> 1137 1138 <div class="feed-calendar"> 1139 <div class="feed-calendar-day"> 1140 02 1141 </div> 1142 <div class="feed-calendar-month"> 1143 Oct 1144 </div> 1145 </div> 1146 1147 <div class="feed-image u-placeholder rectangle"> 1148 <img 1149 class="u-object-fit" 1150 srcset="/content/images/size/w400/2026/10/localsdozen-2026-10-02-featured-3-.png 400w, 1151/content/images/size/w750/2026/10/localsdozen-2026-10-02-featured-3-.png 750w, 1152/content/images/size/w960/2026/10/localsdozen-2026-10-02-featured-3-.png 960w, 1153/content/images/size/w1140/2026/10/localsdozen-2026-10-02-featured-3-.png 1140w" 1154 sizes="(min-width: 576px) 160px, 90vw" 1155 src="/content/images/size/w750/2026/10/localsdozen-2026-10-02-featured-3-.png" 1156 alt="what to see and what to skip at nuit blanche in toronto" 1157 loading="lazy" 1158 > 1159 </div> 1160 1161 <div class="feed-wrapper"> 1162 <h2 class="feed-title">what to see and what to skip at nuit blanche in toronto</h2> 1163 <div class="feed-excerpt">it's the 20th anniversary, and there are 70+ art projects. It is possible to see them all, but</div> 1164 <div class="feed-right"> 1165 <time class="feed-date" datetime="2026-10-02"> 1166 02 Oct 2026 1167 </time> 1168 <div class="feed-visibility feed-visibility-public"> 1169 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1170 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1171</svg> </div> 1172 <div class="feed-length"> 1173 10 min read 1174 </div> 1175
1175<script 1176 data-ghost-comment-count="6abd839db3c1000001dbefef" 1177 data-ghost-comment-count-empty="" 1178 data-ghost-comment-count-singular="comment" 1179 data-ghost-comment-count-plural="comments" 1180 data-ghost-comment-count-tag="div" 1181 data-ghost-comment-count-class-name="feed-comments" 1182 data-ghost-comment-count-autowrap="true" 1183> 1184</script>
1184 1185 <div class="feed-icon"> 1186 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1187 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1188</svg> </div> 1189 </div> 1190 </div> 1191 1192 <a class="u-permalink" href="/what-to-see-and-what-to-skip-at-nuit-blanche-in-toronto/" aria-label="what to see and what to skip at nuit blanche in toronto"></a> 1193 1194</article> <article class="feed post tag-weekly" data-month="September 2026"> 1195 1196 <div class="feed-calendar"> 1197 <div class="feed-calendar-day"> 1198 30 1199 </div> 1200 <div class="feed-calendar-month"> 1201 Sep 1202 </div> 1203 </div> 1204 1205 <div class="feed-image u-placeholder rectangle"> 1206 <img 1207 class="u-object-fit" 1208 srcset="/content/images/size/w400/2026/10/localsdozen-2026-10-02-featured.png 400w, 1209/content/images/size/w750/2026/10/localsdozen-2026-10-02-featured.png 750w, 1210/content/images/size/w960/2026/10/localsdozen-2026-10-02-featured.png 960w, 1211/content/images/size/w1140/2026/10/localsdozen-2026-10-02-featured.png 1140w" 1212 sizes="(min-width: 576px) 160px, 90vw" 1213 src="/content/images/size/w750/2026/10/localsdozen-2026-10-02-featured.png" 1214 alt="nuit x 20 | Oct 2 - Oct 8 2026" 1215 loading="lazy" 1216 > 1217 </div> 1218 1219 <div class="feed-wrapper"> 1220 <h2 class="feed-title">nuit x 20 | Oct 2 - Oct 8 2026</h2> 1221 <div class="feed-excerpt">It's the 20th anniversary of Nuit Blanche this weekend, proof that art can be made accessible and generate</div> 1222 <div class="feed-right"> 1223 <time class="feed-date" datetime="2026-09-30"> 1224 30 Sep 2026 1225 </time> 1226 <div class="feed-visibility feed-visibility-public"> 1227 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1228 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1229</svg> </div> 1230 <div class="feed-length"> 1231 14 min read 1232 </div> 1233
1233<script 1234 data-ghost-comment-count="6abd6cc0b3c1000001dbefe9" 1235 data-ghost-comment-count-empty="" 1236 data-ghost-comment-count-singular="comment" 1237 data-ghost-comment-count-plural="comments" 1238 data-ghost-comment-count-tag="div" 1239 data-ghost-comment-count-class-name="feed-comments" 1240 data-ghost-comment-count-autowrap="true" 1241> 1242</script>
1242 1243 <div class="feed-icon"> 1244 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1245 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1246</svg> </div> 1247 </div> 1248 </div> 1249 1250 <a class="u-permalink" href="/nuit-x-20-oct-2-oct-8-2026/" aria-label="nuit x 20 | Oct 2 - Oct 8 2026"></a> 1251 1252</article> <article class="feed post tag-weekly" data-month="September 2026"> 1253 1254 <div class="feed-calendar"> 1255 <div class="feed-calendar-day"> 1256 23 1257 </div> 1258 <div class="feed-calendar-month"> 1259 Sep 1260 </div> 1261 </div> 1262 1263 <div class="feed-image u-placeholder rectangle"> 1264 <img 1265 class="u-object-fit" 1266 srcset="/content/images/size/w400/2026/09/localsdozen-2026-09-25-featured.png 400w, 1267/content/images/size/w750/2026/09/localsdozen-2026-09-25-featured.png 750w, 1268/content/images/size/w960/2026/09/localsdozen-2026-09-25-featured.png 960w, 1269/content/images/size/w1140/2026/09/localsdozen-2026-09-25-featured.png 1140w" 1270 sizes="(min-width: 576px) 160px, 90vw" 1271 src="/content/images/size/w750/2026/09/localsdozen-2026-09-25-featured.png" 1272 alt="the fall | Sep 25 - Oct 1 2026" 1273 loading="lazy" 1274 > 1275 </div> 1276 1277 <div class="feed-wrapper"> 1278 <h2 class="feed-title">the fall | Sep 25 - Oct 1 2026</h2> 1279 <div class="feed-excerpt">It's officially a new season but events haven't slowed down on weekends. When it does slow</div> 1280 <div class="feed-right"> 1281 <time class="feed-date" datetime="2026-09-23"> 1282 23 Sep 2026 1283 </time> 1284 <div class="feed-visibility feed-visibility-public"> 1285 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1286 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1287</svg> </div> 1288 <div class="feed-length"> 1289 11 min read 1290 </div> 1291
1291<script 1292 data-ghost-comment-count="6ab4814eef7a2d0001e196d8" 1293 data-ghost-comment-count-empty="" 1294 data-ghost-comment-count-singular="comment" 1295 data-ghost-comment-count-plural="comments" 1296 data-ghost-comment-count-tag="div" 1297 data-ghost-comment-count-class-name="feed-comments" 1298 data-ghost-comment-count-autowrap="true" 1299> 1300</script>
1300 1301 <div class="feed-icon"> 1302 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1303 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1304</svg> </div> 1305 </div> 1306 </div> 1307 1308 <a class="u-permalink" href="/the-fall-sep-25-oct-1-2026/" aria-label="the fall | Sep 25 - Oct 1 2026"></a> 1309 1310</article> <article class="feed post tag-weekly" data-month="September 2026"> 1311 1312 <div class="feed-calendar"> 1313 <div class="feed-calendar-day"> 1314 16 1315 </div> 1316 <div class="feed-calendar-month"> 1317 Sep 1318 </div> 1319 </div> 1320 1321 <div class="feed-image u-placeholder rectangle"> 1322 <img 1323 class="u-object-fit" 1324 srcset="/content/images/size/w400/2026/09/localsdozen-2026-09-18-featured-1-.png 400w, 1325/content/images/size/w750/2026/09/localsdozen-2026-09-18-featured-1-.png 750w, 1326/content/images/size/w960/2026/09/localsdozen-2026-09-18-featured-1-.png 960w, 1327/content/images/size/w1140/2026/09/localsdozen-2026-09-18-featured-1-.png 1140w" 1328 sizes="(min-width: 576px) 160px, 90vw" 1329 src="/content/images/size/w750/2026/09/localsdozen-2026-09-18-featured-1-.png" 1330 alt="remnants of summer | Sep 18 - Sep 24 2026" 1331 loading="lazy" 1332 > 1333 </div> 1334 1335 <div class="feed-wrapper"> 1336 <h2 class="feed-title">remnants of summer | Sep 18 - Sep 24 2026</h2> 1337 <div class="feed-excerpt">The last big weekend of festivals is here with TIFF still going on and a brand new waterfront weekend experience.</div> 1338 <div class="feed-right"> 1339 <time class="feed-date" datetime="2026-09-16"> 1340 16 Sep 2026 1341 </time> 1342 <div class="feed-visibility feed-visibility-public"> 1343 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1344 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1345</svg> </div> 1346 <div class="feed-length"> 1347 10 min read 1348 </div> 1349
1349<script 1350 data-ghost-comment-count="6aab3923afdfdc00015a8ea6" 1351 data-ghost-comment-count-empty="" 1352 data-ghost-comment-count-singular="comment" 1353 data-ghost-comment-count-plural="comments" 1354 data-ghost-comment-count-tag="div" 1355 data-ghost-comment-count-class-name="feed-comments" 1356 data-ghost-comment-count-autowrap="true" 1357> 1358</script>
1358 1359 <div class="feed-icon"> 1360 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1361 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1362</svg> </div> 1363 </div> 1364 </div> 1365 1366 <a class="u-permalink" href="/remnants-of-summer-sep-18-sep-24-2026/" aria-label="remnants of summer | Sep 18 - Sep 24 2026"></a> 1367 1368</article> <article class="feed post tag-weekly" data-month="September 2026"> 1369 1370 <div class="feed-calendar"> 1371 <div class="feed-calendar-day"> 1372 09 1373 </div> 1374 <div class="feed-calendar-month"> 1375 Sep 1376 </div> 1377 </div> 1378 1379 <div class="feed-image u-placeholder rectangle"> 1380 <img 1381 class="u-object-fit" 1382 srcset="/content/images/size/w400/2026/09/localsdozen-2026-09-11-featured.png 400w, 1383/content/images/size/w750/2026/09/localsdozen-2026-09-11-featured.png 750w, 1384/content/images/size/w960/2026/09/localsdozen-2026-09-11-featured.png 960w, 1385/content/images/size/w1140/2026/09/localsdozen-2026-09-11-featured.png 1140w" 1386 sizes="(min-width: 576px) 160px, 90vw" 1387 src="/content/images/size/w750/2026/09/localsdozen-2026-09-11-featured.png" 1388 alt="25 years | Sep 11 - Sep 17 2026" 1389 loading="lazy" 1390 > 1391 </div> 1392 1393 <div class="feed-wrapper"> 1394 <h2 class="feed-title">25 years | Sep 11 - Sep 17 2026</h2> 1395 <div class="feed-excerpt">Two things this week that I couldn't believe. I saw Halloween decorations already out and more importantly, it&</div> 1396 <div class="feed-right"> 1397 <time class="feed-date" datetime="2026-09-09"> 1398 09 Sep 2026 1399 </time> 1400 <div class="feed-visibility feed-visibility-public"> 1401 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1402 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1403</svg> </div> 1404 <div class="feed-length"> 1405 11 min read 1406 </div> 1407
1407<script 1408 data-ghost-comment-count="6aa1ec93d35f2a0001dbb8cb" 1409 data-ghost-comment-count-empty="" 1410 data-ghost-comment-count-singular="comment" 1411 data-ghost-comment-count-plural="comments" 1412 data-ghost-comment-count-tag="div" 1413 data-ghost-comment-count-class-name="feed-comments" 1414 data-ghost-comment-count-autowrap="true" 1415> 1416</script>
1416 1417 <div class="feed-icon"> 1418 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1419 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1420</svg> </div> 1421 </div> 1422 </div> 1423 1424 <a class="u-permalink" href="/25-years-sep-11-sep-17-2026/" aria-label="25 years | Sep 11 - Sep 17 2026"></a> 1425 1426</article> <article class="feed post tag-weekly" data-month="September 2026"> 1427 1428 <div class="feed-calendar"> 1429 <div class="feed-calendar-day"> 1430 02 1431 </div> 1432 <div class="feed-calendar-month"> 1433 Sep 1434 </div> 1435 </div> 1436 1437 <div class="feed-image u-placeholder rectangle"> 1438 <img 1439 class="u-object-fit" 1440 srcset="/content/images/size/w400/2026/09/localsdozen-2026-09-04-featured.png 400w, 1441/content/images/size/w750/2026/09/localsdozen-2026-09-04-featured.png 750w, 1442/content/images/size/w960/2026/09/localsdozen-2026-09-04-featured.png 960w, 1443/content/images/size/w1140/2026/09/localsdozen-2026-09-04-featured.png 1140w" 1444 sizes="(min-width: 576px) 160px, 90vw" 1445 src="/content/images/size/w750/2026/09/localsdozen-2026-09-04-featured.png" 1446 alt="what a storm | Sep 4 - Sep 10 2026" 1447 loading="lazy" 1448 > 1449 </div> 1450 1451 <div class="feed-wrapper"> 1452 <h2 class="feed-title">what a storm | Sep 4 - Sep 10 2026</h2> 1453 <div class="feed-excerpt">What was that?? Hail, winds going crazy, and everyone's phone blasting the same sound as the amber alert.</div> 1454 <div class="feed-right"> 1455 <time class="feed-date" datetime="2026-09-02"> 1456 02 Sep 2026 1457 </time> 1458 <div class="feed-visibility feed-visibility-public"> 1459 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1460 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1461</svg> </div> 1462 <div class="feed-length"> 1463 10 min read 1464 </div> 1465
1465<script 1466 data-ghost-comment-count="6a989876f2105d0001e2e0f1" 1467 data-ghost-comment-count-empty="" 1468 data-ghost-comment-count-singular="comment" 1469 data-ghost-comment-count-plural="comments" 1470 data-ghost-comment-count-tag="div" 1471 data-ghost-comment-count-class-name="feed-comments" 1472 data-ghost-comment-count-autowrap="true" 1473> 1474</script>
1474 1475 <div class="feed-icon"> 1476 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1477 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1478</svg> </div> 1479 </div> 1480 </div> 1481 1482 <a class="u-permalink" href="/what-a-storm-sep-4-sep-10-2026/" aria-label="what a storm | Sep 4 - Sep 10 2026"></a> 1483 1484</article> <article class="feed post tag-weekly" data-month="August 2026"> 1485 1486 <div class="feed-calendar"> 1487 <div class="feed-calendar-day"> 1488 26 1489 </div> 1490 <div class="feed-calendar-month"> 1491 Aug 1492 </div> 1493 </div> 1494 1495 <div class="feed-image u-placeholder rectangle"> 1496 <img 1497 class="u-object-fit" 1498 srcset="/content/images/size/w400/2026/08/localsdozen-2026-08-26-featured--2-.png 400w, 1499/content/images/size/w750/2026/08/localsdozen-2026-08-26-featured--2-.png 750w, 1500/content/images/size/w960/2026/08/localsdozen-2026-08-26-featured--2-.png 960w, 1501/content/images/size/w1140/2026/08/localsdozen-2026-08-26-featured--2-.png 1140w" 1502 sizes="(min-width: 576px) 160px, 90vw" 1503 src="/content/images/size/w750/2026/08/localsdozen-2026-08-26-featured--2-.png" 1504 alt="oh dolly | Aug 26 - Sep 3 2026" 1505 loading="lazy" 1506 > 1507 </div> 1508 1509 <div class="feed-wrapper"> 1510 <h2 class="feed-title">oh dolly | Aug 26 - Sep 3 2026</h2> 1511 <div class="feed-excerpt">A few changes this week. I'm going to try and fix the way these go out. The newsletter</div> 1512 <div class="feed-right"> 1513 <time class="feed-date" datetime="2026-08-26"> 1514 26 Aug 2026 1515 </time> 1516 <div class="feed-visibility feed-visibility-public"> 1517 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1518 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1519</svg> </div> 1520 <div class="feed-length"> 1521 12 min read 1522 </div> 1523
1523<script 1524 data-ghost-comment-count="6a8f4543d5da5f0001c5d331" 1525 data-ghost-comment-count-empty="" 1526 data-ghost-comment-count-singular="comment" 1527 data-ghost-comment-count-plural="comments" 1528 data-ghost-comment-count-tag="div" 1529 data-ghost-comment-count-class-name="feed-comments" 1530 data-ghost-comment-count-autowrap="true" 1531> 1532</script>
1532 1533 <div class="feed-icon"> 1534 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1535 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1536</svg> </div> 1537 </div> 1538 </div> 1539 1540 <a class="u-permalink" href="/oh-dolly-aug-26-sep-3-2026/" aria-label="oh dolly | Aug 26 - Sep 3 2026"></a> 1541 1542</article> <article class="feed post tag-weekly" data-month="August 2026"> 1543 1544 <div class="feed-calendar"> 1545 <div class="feed-calendar-day"> 1546 19 1547 </div> 1548 <div class="feed-calendar-month"> 1549 Aug 1550 </div> 1551 </div> 1552 1553 <div class="feed-image u-placeholder rectangle"> 1554 <img 1555 class="u-object-fit" 1556 srcset="/content/images/size/w400/2026/08/localsdozen-2026-08-19-featured-2-.png 400w, 1557/content/images/size/w750/2026/08/localsdozen-2026-08-19-featured-2-.png 750w, 1558/content/images/size/w960/2026/08/localsdozen-2026-08-19-featured-2-.png 960w, 1559/content/images/size/w1140/2026/08/localsdozen-2026-08-19-featured-2-.png 1140w" 1560 sizes="(min-width: 576px) 160px, 90vw" 1561 src="/content/images/size/w750/2026/08/localsdozen-2026-08-19-featured-2-.png" 1562 alt="exhibition season | Aug 19 - Aug 25 2026" 1563 loading="lazy" 1564 > 1565 </div> 1566 1567 <div class="feed-wrapper"> 1568 <h2 class="feed-title">exhibition season | Aug 19 - Aug 25 2026</h2> 1569 <div class="feed-excerpt">the CNE begins this weekend and if you can get in, all the concerts are free including Shaggy, a large</div> 1570 <div class="feed-right"> 1571 <time class="feed-date" datetime="2026-08-19"> 1572 19 Aug 2026 1573 </time> 1574 <div class="feed-visibility feed-visibility-public"> 1575 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1576 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1577</svg> </div> 1578 <div class="feed-length"> 1579 14 min read 1580 </div> 1581
1581<script 1582 data-ghost-comment-count="6a85e7161a156000011b9689" 1583 data-ghost-comment-count-empty="" 1584 data-ghost-comment-count-singular="comment" 1585 data-ghost-comment-count-plural="comments" 1586 data-ghost-comment-count-tag="div" 1587 data-ghost-comment-count-class-name="feed-comments" 1588 data-ghost-comment-count-autowrap="true" 1589> 1590</script>
1590 1591 <div class="feed-icon"> 1592 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1593 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1594</svg> </div> 1595 </div> 1596 </div> 1597 1598 <a class="u-permalink" href="/exhibition-season-aug-19-aug-25-2026/" aria-label="exhibition season | Aug 19 - Aug 25 2026"></a> 1599 1600</article> <article class="feed post tag-weekly" data-month="August 2026"> 1601 1602 <div class="feed-calendar"> 1603 <div class="feed-calendar-day"> 1604 12 1605 </div> 1606 <div class="feed-calendar-month"> 1607 Aug 1608 </div> 1609 </div> 1610 1611 <div class="feed-image u-placeholder rectangle"> 1612 <img 1613 class="u-object-fit" 1614 srcset="/content/images/size/w400/2026/08/localsdozen-2026-08-12-featured-1-.png 400w, 1615/content/images/size/w750/2026/08/localsdozen-2026-08-12-featured-1-.png 750w, 1616/content/images/size/w960/2026/08/localsdozen-2026-08-12-featured-1-.png 960w, 1617/content/images/size/w1140/2026/08/localsdozen-2026-08-12-featured-1-.png 1140w" 1618 sizes="(min-width: 576px) 160px, 90vw" 1619 src="/content/images/size/w750/2026/08/localsdozen-2026-08-12-featured-1-.png" 1620 alt="this will never end | Aug 12 - Aug 18 2026" 1621 loading="lazy" 1622 > 1623 </div> 1624 1625 <div class="feed-wrapper"> 1626 <h2 class="feed-title">this will never end | Aug 12 - Aug 18 2026</h2> 1627 <div class="feed-excerpt">This is the week I take for granted. The weather has been good for months, the big events on the</div> 1628 <div class="feed-right"> 1629 <time class="feed-date" datetime="2026-08-12"> 1630 12 Aug 2026 1631 </time> 1632 <div class="feed-visibility feed-visibility-public"> 1633 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1634 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1635</svg> </div> 1636 <div class="feed-length"> 1637 9 min read 1638 </div> 1639
1639<script 1640 data-ghost-comment-count="6a7cba497c01b50001348d19" 1641 data-ghost-comment-count-empty="" 1642 data-ghost-comment-count-singular="comment" 1643 data-ghost-comment-count-plural="comments" 1644 data-ghost-comment-count-tag="div" 1645 data-ghost-comment-count-class-name="feed-comments" 1646 data-ghost-comment-count-autowrap="true" 1647> 1648</script>
1648 1649 <div class="feed-icon"> 1650 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1651 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1652</svg> </div> 1653 </div> 1654 </div> 1655 1656 <a class="u-permalink" href="/this-will-never-end-aug-12-aug-18-2026/" aria-label="this will never end | Aug 12 - Aug 18 2026"></a> 1657 1658</article> <article class="feed post tag-weekly" data-month="August 2026"> 1659 1660 <div class="feed-calendar"> 1661 <div class="feed-calendar-day"> 1662 05 1663 </div> 1664 <div class="feed-calendar-month"> 1665 Aug 1666 </div> 1667 </div> 1668 1669 <div class="feed-image u-placeholder rectangle"> 1670 <img 1671 class="u-object-fit" 1672 srcset="/content/images/size/w400/2026/08/localsdozen-2026-08-05-featured-2-.png 400w, 1673/content/images/size/w750/2026/08/localsdozen-2026-08-05-featured-2-.png 750w, 1674/content/images/size/w960/2026/08/localsdozen-2026-08-05-featured-2-.png 960w, 1675/content/images/size/w1140/2026/08/localsdozen-2026-08-05-featured-2-.png 1140w" 1676 sizes="(min-width: 576px) 160px, 90vw" 1677 src="/content/images/size/w750/2026/08/localsdozen-2026-08-05-featured-2-.png"
1678 alt="the second half | Aug 5 - Aug 11 2026" 1679 loading="lazy" 1680 > 1681 </div> 1682 1683 <div class="feed-wrapper"> 1684 <h2 class="feed-title">the second half | Aug 5 - Aug 11 2026</h2> 1685 <div class="feed-excerpt">Welcome to the heart of August. We've got a brief respite from the full on events schedule that&</div> 1686 <div class="feed-right"> 1687 <time class="feed-date" datetime="2026-08-05"> 1688 05 Aug 2026 1689 </time> 1690 <div class="feed-visibility feed-visibility-public"> 1691 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1692 <path d="M16 23.027L24.24 28l-2.187-9.373 7.28-6.307-9.587-.827-3.747-8.827-3.747 8.827-9.587.827 7.267 6.307L7.759 28l8.24-4.973z"></path> 1693</svg> </div> 1694 <div class="feed-length"> 1695 10 min read 1696 </div> 1697
1697<script 1698 data-ghost-comment-count="6a7385213b5ac20001129f64" 1699 data-ghost-comment-count-empty="" 1700 data-ghost-comment-count-singular="comment" 1701 data-ghost-comment-count-plural="comments" 1702 data-ghost-comment-count-tag="div" 1703 data-ghost-comment-count-class-name="feed-comments" 1704 data-ghost-comment-count-autowrap="true" 1705> 1706</script>
1706 1707 <div class="feed-icon"> 1708 <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> 1709 <path d="M11.453 22.107L17.56 16l-6.107-6.12L13.333 8l8 8-8 8-1.88-1.893z"></path> 1710</svg> </div> 1711 </div> 1712 </div> 1713 1714 <a class="u-permalink" href="/the-second-half-aug-5-aug-11-2026/" aria-label="the second half | Aug 5 - Aug 11 2026"></a> 1715 1716</article> </div> 1717 1718 <nav class="load-more"> 1719 <button class="button button-secondary gh-loadmore">Load more</button> 1720</nav> 1721 1722</main> 1723 1724 1725 </div> 1726 1727 <footer class="gh-foot gh-outer"> 1728 <div class="gh-foot-inner gh-inner"> 1729 <div class="gh-copyright"> 1730 The Local's Dozen © 2026 1731 </div> 1732 <div class="gh-foot-center"> 1733 <div class="gh-social-links"> 1734 <a href="https://www.instagram.com/localsdozen" target="_blank" rel="noopener" aria-label="Instagram"> 1735<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> 1736 <path d="M12 2.982C14.937 2.982 15.285 2.993 16.445 3.046C17.1424 3.05412 17.8331 3.18233 18.487 3.425C18.965 3.60111 19.3973 3.88237 19.752 4.248C20.1176 4.60269 20.3989 5.035 20.575 5.513C20.8177 6.16685 20.9459 6.85762 20.954 7.555C21.007 8.715 21.018 9.063 21.018 12C21.018 14.937 21.007 15.285 20.954 16.445C20.9459 17.1424 20.8177 17.8331 20.575 18.487C20.3919 18.9615 20.1116 19.3924 19.752 19.752C19.3924 20.1116 18.9615 20.3919 18.487 20.575C17.8331 20.8177 17.1424 20.9459 16.445 20.954C15.285 21.007 14.937 21.018 12 21.018C9.063 21.018 8.715 21.007 7.555 20.954C6.85762 20.9459 6.16685 20.8177 5.513 20.575C5.035 20.3989 4.60269 20.1176 4.248 19.752C3.88237 19.3973 3.60111 18.965 3.425 18.487C3.18233 17.8331 3.05412 17.1424 3.046 16.445C2.993 15.285 2.982 14.937 2.982 12C2.982 9.063 2.993 8.715 3.046 7.555C3.05412 6.85762 3.18233 6.16685 3.425 5.513C3.60111 5.035 3.88237 4.60269 4.248 4.248C4.60269 3.88237 5.035 3.60111 5.513 3.425C6.16685 3.18233 6.85762 3.05412 7.555 3.046C8.715 2.993 9.063 2.982 12 2.982ZM12 1C9.013 1 8.638 1.013 7.465 1.066C6.55258 1.08486 5.6499 1.25762 4.795 1.577C4.06355 1.86017 3.3994 2.29319 2.84521 2.84824C2.29102 3.40329 1.85904 4.06811 1.577 4.8C1.25762 5.6549 1.08486 6.55758 1.066 7.47C1.013 8.638 1 9.013 1 12C1 14.987 1.013 15.362 1.066 16.535C1.08486 17.4474 1.25762 18.3501 1.577 19.205C1.86017 19.9365 2.29319 20.6006 2.84824 21.1548C3.40329 21.709 4.06811 22.141 4.8 22.423C5.6549 22.7424 6.55758 22.9151 7.47 22.934C8.638 22.987 9.013 23 12 23C14.987 23 15.362 22.987 16.535 22.934C17.4474 22.9151 18.3501 22.7424 19.205 22.423C19.9365 22.1398 20.6006 21.7068 21.1548 21.1518C21.709 20.5967 22.141 19.9319 22.423 19.2C22.7424 18.3451 22.9151 17.4424 22.934 16.53C22.987 15.362 23 14.987 23 12C23 9.013 22.987 8.638 22.934 7.465C22.9151 6.55258 22.7424 5.6499 22.423 4.795C22.1398 4.06355 21.7068 3.3994 21.1518 2.84521C20.5967 2.29102 19.9319 1.85904 19.2 1.577C18.3451 1.25762 17.4424 1.08486 16.53 1.066C15.362 1.013 14.987 1 12 1Z"/> 1737 <path d="M11.9996 6.35107C10.8823 6.35107 9.79015 6.68238 8.86117 7.3031C7.9322 7.92382 7.20815 8.80608 6.78059 9.8383C6.35303 10.8705 6.24116 12.0063 6.45913 13.1021C6.6771 14.1979 7.21512 15.2045 8.00514 15.9945C8.79517 16.7845 9.80172 17.3226 10.8975 17.5405C11.9933 17.7585 13.1291 17.6466 14.1614 17.2191C15.1936 16.7915 16.0758 16.0675 16.6966 15.1385C17.3173 14.2095 17.6486 13.1173 17.6486 12.0001C17.6486 10.5019 17.0534 9.06502 15.994 8.00563C14.9346 6.94624 13.4978 6.35107 11.9996 6.35107ZM11.9996 15.6671C11.2743 15.6671 10.5653 15.452 9.96231 15.0491C9.35928 14.6461 8.88927 14.0734 8.61172 13.4034C8.33418 12.7333 8.26156 11.996 8.40305 11.2847C8.54454 10.5734 8.89379 9.91995 9.40663 9.40711C9.91947 8.89427 10.5729 8.54503 11.2842 8.40353C11.9955 8.26204 12.7328 8.33466 13.4029 8.61221C14.0729 8.88975 14.6457 9.35976 15.0486 9.9628C15.4515 10.5658 15.6666 11.2748 15.6666 12.0001C15.6666 12.9726 15.2802 13.9053 14.5925 14.593C13.9049 15.2807 12.9721 15.6671 11.9996 15.6671Z"/> 1738 <path d="M17.8718 7.44811C18.6008 7.44811 19.1918 6.85712 19.1918 6.12811C19.1918 5.39909 18.6008 4.80811 17.8718 4.80811C17.1427 4.80811 16.5518 5.39909 16.5518 6.12811C16.5518 6.85712 17.1427 7.44811 17.8718 7.44811Z"/> 1739</svg> 1740 </a> 1741 </div> 1742 <nav class="gh-foot-menu"> 1743 <ul class="nav"> 1744 <li class="nav-get-the-locals-dozen nav-current"><a href="#/portal/">get the local's dozen</a></li> 1745 <li class="nav-privacy-policy"><a href="https://www.localsdozen.com/privacy-policy/">Privacy Policy</a></li> 1746 <li class="nav-terms-of-service"><a href="https://www.localsdozen.com/terms-of-service/">Terms of Service</a></li> 1747</ul> 1748 1749 </nav> 1750 </div> 1751 <div class="gh-powered-by"> 1752 Powered by <a href="https://ghost.org/" target="_blank" rel="noopener">Ghost</a> 1753 </div> 1754 </div> 1755 </footer> 1756 1757</div> 1758 1759
1760<script> 1761 if (document.body.classList.contains('with-full-cover') && (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform))) { 1762 document.getElementsByClassName('cover')[0].style.height = window.innerHeight + 'px'; 1763 } 1764</script>
1764 1765
1766<script src="/assets/built/main.min.js?v=2TMHKzwU3AY3IYVp"></script>
1766 1767 1768<!-- CODE FOR MENU DROPDOWN -->
1769<script> 1770document.addEventListener("DOMContentLoaded", function () { 1771 const NAV_SELECTOR = 1772 ".gh-head-menu > .nav, " + 1773 ".gh-head-menu .nav"; 1774 1775 let submenuCounter = 0; 1776 let repairTimer = null; 1777 1778 /* 1779 * --------------------------------------------------------- 1780 * Basic helpers 1781 * --------------------------------------------------------- 1782 */ 1783 1784 function directChild(parent, selector) { 1785 return Array.from(parent.children).find(function (child) { 1786 return child.matches(selector); 1787 }); 1788 } 1789 1790 function directLink(item) { 1791 return directChild(item, "a"); 1792 } 1793 1794 function originalLabel(link) { 1795 return ( 1796 link.dataset.ghOriginalNavLabel || 1797 link.textContent 1798 ).trim(); 1799 } 1800 1801 function isSubmenuLabel(label) { 1802 return /^[-ââ]\s*/.test(label); 1803 } 1804 1805 function cleanSubmenuLabel(label) { 1806 return label.replace(/^[-ââ]\s*/, "").trim(); 1807 } 1808 1809 /* 1810 * --------------------------------------------------------- 1811 * Open / close our dropdowns 1812 * --------------------------------------------------------- 1813 */ 1814 1815 function setOpen(parentItem, open) { 1816 const toggle = directChild( 1817 parentItem, 1818 ".gh-nav-dropdown-toggle" 1819 ); 1820 1821 parentItem.classList.toggle("is-open", open); 1822 1823 if (!toggle) { 1824 return; 1825 } 1826 1827 const parentLink = directLink(parentItem); 1828 1829 const parentName = parentLink 1830 ? parentLink.textContent.trim() 1831 : "this item"; 1832 1833 toggle.setAttribute( 1834 "aria-expanded", 1835 String(open) 1836 ); 1837 1838 toggle.setAttribute( 1839 "aria-label", 1840 (open 1841 ? "Hide submenu for " 1842 : "Show submenu for " 1843 ) + parentName 1844 ); 1845 } 1846 1847 /* 1848 * --------------------------------------------------------- 1849 * Undo Edition's native "..." overflow menu 1850 * --------------------------------------------------------- 1851 * 1852 * Edition may have already moved some of our Ghost 1853 * navigation items into its native gh-dropdown before this 1854 * script gets to organise the dashed submenu items. 1855 * 1856 * We move those LI elements back into the original nav first. 1857 */ 1858 1859 function restoreEditionOverflow(nav) { 1860 const moreToggles = Array.from(nav.children).filter( 1861 function (child) { 1862 return child.matches( 1863 ".nav-more-toggle, .gh-more-toggle" 1864 ); 1865 } 1866 ); 1867 1868 moreToggles.forEach(function (moreToggle) { 1869 const overflow = 1870 moreToggle.querySelector(":scope > .gh-dropdown") || 1871 moreToggle.querySelector(".gh-dropdown"); 1872 1873 if (overflow) { 1874 /* 1875 * Preserve the order Edition gave the items. 1876 */ 1877 Array.from(overflow.children).forEach( 1878 function (item) { 1879 if (item.tagName === "LI") { 1880 nav.insertBefore(item, moreToggle); 1881 } 1882 } 1883 ); 1884 } 1885 1886 /* 1887 * Once its contents are restored, remove the 1888 * three-dot button entirely. 1889 */ 1890 moreToggle.remove(); 1891 }); 1892 1893 /* 1894 * Edition can leave dropdown-state classes behind after 1895 * we remove its native overflow control. 1896 */ 1897 const head = 1898 nav.closest("#gh-head") || 1899 nav.closest(".gh-head") || 1900 nav.closest(".gh-navigation"); 1901 1902 if (head) { 1903 head.classList.remove( 1904 "is-dropdown-open", 1905 "is-dropdown-mega" 1906 ); 1907 } 1908 1909 document.body.classList.remove( 1910 "is-dropdown-open", 1911 "is-dropdown-mega" 1912 ); 1913 } 1914 1915 /* 1916 * --------------------------------------------------------- 1917 * Create one of our custom parent dropdowns 1918 * --------------------------------------------------------- 1919 */ 1920 1921 function ensureDropdown(parentItem, parentLink) { 1922 let toggle = directChild( 1923 parentItem, 1924 ".gh-nav-dropdown-toggle" 1925 ); 1926 1927 let submenu = directChild( 1928 parentItem, 1929 ".gh-nav-submenu" 1930 ); 1931
1932 parentItem.classList.add("gh-nav-dropdown"); 1933 1934 if (!toggle) { 1935 toggle = document.createElement("button"); 1936 toggle.type = "button"; 1937 toggle.className = "gh-nav-dropdown-toggle"; 1938 toggle.setAttribute( 1939 "aria-expanded", 1940 "false" 1941 ); 1942 1943 /* 1944 * Keep the original Ghost anchor exactly where 1945 * Edition expects it and add the arrow beside it. 1946 */ 1947 parentLink.insertAdjacentElement( 1948 "afterend", 1949 toggle 1950 ); 1951 } 1952 1953 if (!submenu) { 1954 submenuCounter += 1; 1955 1956 submenu = document.createElement("ul"); 1957 submenu.className = "gh-nav-submenu"; 1958 submenu.id = 1959 "gh-nav-submenu-" + submenuCounter; 1960 1961 parentItem.appendChild(submenu); 1962 } 1963 1964 if (!submenu.id) { 1965 submenuCounter += 1; 1966 submenu.id = 1967 "gh-nav-submenu-" + submenuCounter; 1968 } 1969 1970 toggle.setAttribute( 1971 "aria-controls", 1972 submenu.id 1973 ); 1974 1975 toggle.setAttribute( 1976 "aria-label", 1977 "Show submenu for " + 1978 parentLink.textContent.trim() 1979 ); 1980 1981 return submenu; 1982 } 1983 1984 /* 1985 * --------------------------------------------------------- 1986 * Convert Ghost's flat navigation into our hierarchy 1987 * --------------------------------------------------------- 1988 */ 1989 1990 function processNavigation(nav) { 1991 if ( 1992 !nav || 1993 !nav.isConnected || 1994 nav.closest(".gh-nav-submenu") 1995 ) { 1996 return; 1997 } 1998 1999 /* 2000 * IMPORTANT: 2001 * First undo whatever Edition did with its native ... 2002 * menu. Only then work out the hierarchy. 2003 */ 2004 restoreEditionOverflow(nav); 2005 2006 const items = Array.from(nav.children).filter( 2007 function (item) { 2008 return item.tagName === "LI"; 2009 } 2010 ); 2011 2012 let currentParent = null; 2013 2014 items.forEach(function (item) { 2015 const link = directLink(item); 2016 2017 if (!link) { 2018 currentParent = null; 2019 return; 2020 } 2021 2022 const label = originalLabel(link); 2023 2024 /* 2025 * Regular item = possible parent. 2026 */ 2027 if (!isSubmenuLabel(label)) { 2028 currentParent = { 2029 item: item, 2030 link: link, 2031 submenu: directChild( 2032 item, 2033 ".gh-nav-submenu" 2034 ) 2035 }; 2036 2037 return; 2038 } 2039 2040 /* 2041 * Don't hide an accidental orphaned dashed item. 2042 */ 2043 if (!currentParent) { 2044 return; 2045 } 2046 2047 if (!currentParent.submenu) { 2048 currentParent.submenu = 2049 ensureDropdown( 2050 currentParent.item, 2051 currentParent.link 2052 ); 2053 } 2054 2055 /* 2056 * Remember the original dashed version. Edition may 2057 * rebuild its navigation during a future resize. 2058 */ 2059 if (!link.dataset.ghOriginalNavLabel) { 2060 link.dataset.ghOriginalNavLabel = label; 2061 } 2062 2063 /* 2064 * Strip the dash from what visitors actually see. 2065 */ 2066 link.textContent = 2067 cleanSubmenuLabel(label); 2068 2069 item.classList.add( 2070 "gh-nav-submenu-item" 2071 ); 2072 2073 currentParent.submenu.appendChild(item); 2074 }); 2075 } 2076 2077 /* 2078 * --------------------------------------------------------- 2079 * Repair all primary navigation instances 2080 * --------------------------------------------------------- 2081 */ 2082 2083 function repairAllNavigations() { 2084 document 2085 .querySelectorAll(NAV_SELECTOR) 2086 .forEach(processNavigation); 2087 } 2088 2089 function scheduleRepair(delay) { 2090 window.clearTimeout(repairTimer); 2091 2092 repairTimer = window.setTimeout( 2093 repairAllNavigations, 2094 delay || 25 2095 ); 2096 } 2097 2098 /* 2099 * Initial pass. 2100 */ 2101 repairAllNavigations(); 2102 2103 /* 2104 * Edition can finish its own header calculations after our 2105 * DOMContentLoaded callback, so check again when everything 2106 * on the page has loaded. 2107 */ 2108 window.addEventListener("load", function () { 2109 scheduleRepair(20); 2110 }); 2111 2112 /* 2113 * --------------------------------------------------------- 2114 * Watch Edition's navigation 2115 * --------------------------------------------------------- 2116 * 2117 * This is the important resize fix. 2118 * 2119 * Edition rebuilds/moves navigation elements when the 2120 * available width changes. Whenever it does, wait until its 2121 * changes finish and then reconstruct our hierarchy. 2122 */ 2123 2124 const headMenu = document.querySelector( 2125 ".gh-head-menu" 2126 ); 2127 2128 if (headMenu) { 2129 const observer = new MutationObserver( 2130 function () { 2131 scheduleRepair(25); 2132 } 2133 ); 2134 2135 observer.observe(headMenu, { 2136 childList: true, 2137 subtree: true 2138 }); 2139 } 2140 2141 /* 2142 * Edition's own resize code may run shortly after the actual 2143 * browser resize event, so our repair deliberately runs 2144 * afterward rather than fighting it simultaneously. 2145 */ 2146 window.addEventListener("resize", function () { 2147 scheduleRepair(75); 2148 }); 2149 2150 /* 2151 * --------------------------------------------------------- 2152 * Dropdown interaction 2153 * --------------------------------------------------------- 2154 */ 2155 2156 document.addEventListener( 2157 "click", 2158 function (event) { 2159 const toggle = event.target.closest( 2160 ".gh-nav-dropdown-toggle" 2161 ); 2162 2163 if (toggle) { 2164 event.preventDefault(); 2165 event.stopPropagation(); 2166 2167 const parentItem = toggle.closest( 2168 ".gh-nav-dropdown" 2169 ); 2170 2171 if (!parentItem) { 2172 return; 2173 } 2174
2175 const nav = parentItem.closest(".nav"); 2176 2177 const shouldOpen = 2178 !parentItem.classList.contains( 2179 "is-open" 2180 ); 2181 2182 /* 2183 * Close sibling dropdowns first. 2184 */ 2185 if (nav) { 2186 Array.from(nav.children).forEach( 2187 function (item) { 2188 if ( 2189 item !== parentItem && 2190 item.classList && 2191 item.classList.contains( 2192 "gh-nav-dropdown" 2193 ) 2194 ) { 2195 setOpen(item, false); 2196 } 2197 } 2198 ); 2199 } 2200 2201 setOpen(parentItem, shouldOpen); 2202 return; 2203 } 2204 2205 /* 2206 * Click outside closes open dropdowns. 2207 */ 2208 document 2209 .querySelectorAll( 2210 ".gh-nav-dropdown.is-open" 2211 ) 2212 .forEach(function (parentItem) { 2213 if ( 2214 !parentItem.contains( 2215 event.target 2216 ) 2217 ) { 2218 setOpen( 2219 parentItem, 2220 false 2221 ); 2222 } 2223 }); 2224 } 2225 ); 2226 2227 /* 2228 * Escape closes the active dropdown. 2229 */ 2230 document.addEventListener( 2231 "keydown", 2232 function (event) { 2233 if (event.key !== "Escape") { 2234 return; 2235 } 2236 2237 document 2238 .querySelectorAll( 2239 ".gh-nav-dropdown.is-open" 2240 ) 2241 .forEach(function (parentItem) { 2242 const toggle = directChild( 2243 parentItem, 2244 ".gh-nav-dropdown-toggle" 2245 ); 2246 2247 setOpen( 2248 parentItem, 2249 false 2250 ); 2251 2252 if (toggle) { 2253 toggle.focus(); 2254 } 2255 }); 2256 } 2257 ); 2258}); 2259</script>
2259 2260 2261</body> 2262</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.