@jxsuite/starters 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +72 -0
- package/package.json +28 -0
- package/registry.json +178 -0
- package/sites/blog/components/bl-author-bio.json +82 -0
- package/sites/blog/components/bl-contact-form.json +114 -0
- package/sites/blog/components/bl-contact-info.json +54 -0
- package/sites/blog/components/bl-cta.json +62 -0
- package/sites/blog/components/bl-footer.json +145 -0
- package/sites/blog/components/bl-masthead.json +128 -0
- package/sites/blog/components/bl-nav.json +97 -0
- package/sites/blog/components/bl-newsletter-cta.json +120 -0
- package/sites/blog/components/bl-post-card.json +114 -0
- package/sites/blog/components/bl-post-list.json +17 -0
- package/sites/blog/components/bl-prose.json +74 -0
- package/sites/blog/components/bl-section-header.json +53 -0
- package/sites/blog/components/bl-tag-pill.json +26 -0
- package/sites/blog/content/posts/designing-for-slowness.md +25 -0
- package/sites/blog/content/posts/notes-from-a-long-walk.md +27 -0
- package/sites/blog/content/posts/the-city-as-a-text.md +27 -0
- package/sites/blog/content/posts/the-quiet-craft-of-revision.md +27 -0
- package/sites/blog/content/posts/tools-that-disappear.md +27 -0
- package/sites/blog/content/posts/what-i-learned-rereading.md +27 -0
- package/sites/blog/images.json +54 -0
- package/sites/blog/layouts/base.json +22 -0
- package/sites/blog/layouts/post.json +15 -0
- package/sites/blog/package.json +15 -0
- package/sites/blog/pages/[slug].json +148 -0
- package/sites/blog/pages/about.md +32 -0
- package/sites/blog/pages/contact.md +18 -0
- package/sites/blog/pages/index.md +48 -0
- package/sites/blog/project.json +107 -0
- package/sites/blog/public/favicon.svg +6 -0
- package/sites/blog/public/images/author.jpg +0 -0
- package/sites/blog/public/images/hero.jpg +0 -0
- package/sites/blog/public/images/post-1.jpg +0 -0
- package/sites/blog/public/images/post-2.jpg +0 -0
- package/sites/blog/public/images/post-3.jpg +0 -0
- package/sites/blog/public/images/post-4.jpg +0 -0
- package/sites/blog/public/images/post-5.jpg +0 -0
- package/sites/blog/public/images/post-6.jpg +0 -0
- package/sites/course/components/co-application.json +170 -0
- package/sites/course/components/co-cta.json +74 -0
- package/sites/course/components/co-curriculum-accordion.json +1476 -0
- package/sites/course/components/co-faq.json +524 -0
- package/sites/course/components/co-footer.json +145 -0
- package/sites/course/components/co-hero.json +139 -0
- package/sites/course/components/co-instructor-card.json +76 -0
- package/sites/course/components/co-module-card.json +93 -0
- package/sites/course/components/co-nav.json +119 -0
- package/sites/course/components/co-outcome-card.json +58 -0
- package/sites/course/components/co-pricing.json +133 -0
- package/sites/course/components/co-section-header.json +53 -0
- package/sites/course/components/co-stat.json +36 -0
- package/sites/course/components/co-testimonial-card.json +54 -0
- package/sites/course/content/modules/backend.md +8 -0
- package/sites/course/content/modules/capstone.md +8 -0
- package/sites/course/content/modules/foundations.md +8 -0
- package/sites/course/content/modules/frameworks.md +8 -0
- package/sites/course/content/modules/html-css.md +8 -0
- package/sites/course/content/modules/javascript.md +8 -0
- package/sites/course/images.json +24 -0
- package/sites/course/layouts/base.json +22 -0
- package/sites/course/package.json +15 -0
- package/sites/course/pages/about.md +44 -0
- package/sites/course/pages/curriculum.md +31 -0
- package/sites/course/pages/enroll.md +46 -0
- package/sites/course/pages/index.md +86 -0
- package/sites/course/project.json +102 -0
- package/sites/course/public/favicon.svg +5 -0
- package/sites/course/public/images/about.jpg +0 -0
- package/sites/course/public/images/hero.jpg +0 -0
- package/sites/course/public/images/instructor.jpg +0 -0
- package/sites/event/components/ev-agenda-tabs.json +542 -0
- package/sites/event/components/ev-cta.json +97 -0
- package/sites/event/components/ev-feature.json +58 -0
- package/sites/event/components/ev-footer.json +145 -0
- package/sites/event/components/ev-hero.json +196 -0
- package/sites/event/components/ev-nav.json +123 -0
- package/sites/event/components/ev-savedate.json +244 -0
- package/sites/event/components/ev-section-header.json +53 -0
- package/sites/event/components/ev-session-row.json +72 -0
- package/sites/event/components/ev-speaker-card.json +84 -0
- package/sites/event/components/ev-stat.json +42 -0
- package/sites/event/components/ev-ticket-card.json +196 -0
- package/sites/event/components/ev-venue.json +59 -0
- package/sites/event/content/sessions/01-opening-keynote.md +9 -0
- package/sites/event/content/sessions/02-designing-for-trust.md +9 -0
- package/sites/event/content/sessions/03-reactive-islands.md +9 -0
- package/sites/event/content/sessions/04-scaling-systems.md +9 -0
- package/sites/event/content/sessions/05-motion-and-meaning.md +9 -0
- package/sites/event/content/sessions/06-ship-it.md +9 -0
- package/sites/event/images.json +42 -0
- package/sites/event/layouts/base.json +22 -0
- package/sites/event/package.json +15 -0
- package/sites/event/pages/index.md +65 -0
- package/sites/event/pages/schedule.md +89 -0
- package/sites/event/pages/speakers.md +102 -0
- package/sites/event/pages/tickets.md +33 -0
- package/sites/event/project.json +103 -0
- package/sites/event/public/favicon.svg +5 -0
- package/sites/event/public/images/hero.jpg +0 -0
- package/sites/event/public/images/speaker-1.jpg +0 -0
- package/sites/event/public/images/speaker-2.jpg +0 -0
- package/sites/event/public/images/speaker-3.jpg +0 -0
- package/sites/event/public/images/speaker-4.jpg +0 -0
- package/sites/event/public/images/venue.jpg +0 -0
- package/sites/fitness-studio/components/fs-class-card.json +112 -0
- package/sites/fitness-studio/components/fs-class-grid.json +36 -0
- package/sites/fitness-studio/components/fs-cta.json +62 -0
- package/sites/fitness-studio/components/fs-feature.json +42 -0
- package/sites/fitness-studio/components/fs-footer.json +145 -0
- package/sites/fitness-studio/components/fs-hero.json +128 -0
- package/sites/fitness-studio/components/fs-hours.json +90 -0
- package/sites/fitness-studio/components/fs-instructor-card.json +73 -0
- package/sites/fitness-studio/components/fs-intro.json +59 -0
- package/sites/fitness-studio/components/fs-nav.json +97 -0
- package/sites/fitness-studio/components/fs-pricing-card.json +223 -0
- package/sites/fitness-studio/components/fs-pricing-table.json +458 -0
- package/sites/fitness-studio/components/fs-review.json +54 -0
- package/sites/fitness-studio/components/fs-section-header.json +53 -0
- package/sites/fitness-studio/content/classes/hiit-circuit.md +10 -0
- package/sites/fitness-studio/content/classes/pilates-core.md +10 -0
- package/sites/fitness-studio/content/classes/power-yoga.md +10 -0
- package/sites/fitness-studio/content/classes/restorative-yoga.md +10 -0
- package/sites/fitness-studio/content/classes/strength-tone.md +10 -0
- package/sites/fitness-studio/content/classes/vinyasa-flow.md +10 -0
- package/sites/fitness-studio/images.json +48 -0
- package/sites/fitness-studio/layouts/base.json +22 -0
- package/sites/fitness-studio/package.json +15 -0
- package/sites/fitness-studio/pages/classes.md +37 -0
- package/sites/fitness-studio/pages/contact.md +53 -0
- package/sites/fitness-studio/pages/index.md +112 -0
- package/sites/fitness-studio/pages/pricing.md +41 -0
- package/sites/fitness-studio/project.json +104 -0
- package/sites/fitness-studio/public/favicon.svg +5 -0
- package/sites/fitness-studio/public/images/about.jpg +0 -0
- package/sites/fitness-studio/public/images/class-1.jpg +0 -0
- package/sites/fitness-studio/public/images/class-2.jpg +0 -0
- package/sites/fitness-studio/public/images/class-3.jpg +0 -0
- package/sites/fitness-studio/public/images/hero.jpg +0 -0
- package/sites/fitness-studio/public/images/instructor-1.jpg +0 -0
- package/sites/fitness-studio/public/images/instructor-2.jpg +0 -0
- package/sites/home-services/components/hs-cta.json +123 -0
- package/sites/home-services/components/hs-feature.json +43 -0
- package/sites/home-services/components/hs-footer.json +157 -0
- package/sites/home-services/components/hs-gallery.json +53 -0
- package/sites/home-services/components/hs-hero.json +128 -0
- package/sites/home-services/components/hs-intro.json +59 -0
- package/sites/home-services/components/hs-nav.json +113 -0
- package/sites/home-services/components/hs-reservation.json +146 -0
- package/sites/home-services/components/hs-review.json +54 -0
- package/sites/home-services/components/hs-section-header.json +53 -0
- package/sites/home-services/components/hs-service-card.json +79 -0
- package/sites/home-services/components/hs-step.json +53 -0
- package/sites/home-services/components/hs-trust-bar.json +108 -0
- package/sites/home-services/content/services/ac-installation.md +8 -0
- package/sites/home-services/content/services/ac-repair.md +8 -0
- package/sites/home-services/content/services/furnace-installation.md +8 -0
- package/sites/home-services/content/services/furnace-repair.md +8 -0
- package/sites/home-services/content/services/heat-pumps.md +8 -0
- package/sites/home-services/content/services/maintenance-plans.md +8 -0
- package/sites/home-services/images.json +42 -0
- package/sites/home-services/layouts/base.json +22 -0
- package/sites/home-services/package.json +15 -0
- package/sites/home-services/pages/about.md +40 -0
- package/sites/home-services/pages/contact.md +53 -0
- package/sites/home-services/pages/index.md +87 -0
- package/sites/home-services/pages/services.md +39 -0
- package/sites/home-services/project.json +103 -0
- package/sites/home-services/public/favicon.svg +7 -0
- package/sites/home-services/public/images/about.jpg +0 -0
- package/sites/home-services/public/images/cta-bg.jpg +0 -0
- package/sites/home-services/public/images/gallery-1.jpg +0 -0
- package/sites/home-services/public/images/gallery-2.jpg +0 -0
- package/sites/home-services/public/images/gallery-3.jpg +0 -0
- package/sites/home-services/public/images/hero.jpg +0 -0
- package/sites/nonprofit/components/np-contact-form.json +134 -0
- package/sites/nonprofit/components/np-contact-info.json +153 -0
- package/sites/nonprofit/components/np-cta.json +128 -0
- package/sites/nonprofit/components/np-donate-tier.json +89 -0
- package/sites/nonprofit/components/np-feature.json +53 -0
- package/sites/nonprofit/components/np-footer.json +187 -0
- package/sites/nonprofit/components/np-hero.json +132 -0
- package/sites/nonprofit/components/np-intro.json +59 -0
- package/sites/nonprofit/components/np-nav.json +137 -0
- package/sites/nonprofit/components/np-program-card.json +69 -0
- package/sites/nonprofit/components/np-section-header.json +53 -0
- package/sites/nonprofit/components/np-stat.json +48 -0
- package/sites/nonprofit/components/np-step.json +55 -0
- package/sites/nonprofit/components/np-team-member.json +67 -0
- package/sites/nonprofit/components/np-testimonial.json +54 -0
- package/sites/nonprofit/content/programs/community-garden.md +8 -0
- package/sites/nonprofit/content/programs/food-pantry.md +8 -0
- package/sites/nonprofit/content/programs/housing-support.md +8 -0
- package/sites/nonprofit/content/programs/job-training.md +8 -0
- package/sites/nonprofit/content/programs/youth-mentoring.md +8 -0
- package/sites/nonprofit/images.json +54 -0
- package/sites/nonprofit/layouts/base.json +22 -0
- package/sites/nonprofit/package.json +15 -0
- package/sites/nonprofit/pages/about.md +54 -0
- package/sites/nonprofit/pages/contact.md +17 -0
- package/sites/nonprofit/pages/get-involved.md +63 -0
- package/sites/nonprofit/pages/index.md +87 -0
- package/sites/nonprofit/pages/programs.md +39 -0
- package/sites/nonprofit/project.json +103 -0
- package/sites/nonprofit/public/favicon.svg +5 -0
- package/sites/nonprofit/public/images/about.jpg +0 -0
- package/sites/nonprofit/public/images/cta-bg.jpg +0 -0
- package/sites/nonprofit/public/images/hero.jpg +0 -0
- package/sites/nonprofit/public/images/program-1.jpg +0 -0
- package/sites/nonprofit/public/images/program-2.jpg +0 -0
- package/sites/nonprofit/public/images/program-3.jpg +0 -0
- package/sites/nonprofit/public/images/program-4.jpg +0 -0
- package/sites/nonprofit/public/images/program-5.jpg +0 -0
- package/sites/portfolio/components/pv-about-split.json +59 -0
- package/sites/portfolio/components/pv-category-pill.json +24 -0
- package/sites/portfolio/components/pv-contact-form.json +137 -0
- package/sites/portfolio/components/pv-cta.json +64 -0
- package/sites/portfolio/components/pv-feature.json +48 -0
- package/sites/portfolio/components/pv-footer.json +145 -0
- package/sites/portfolio/components/pv-gallery.json +50 -0
- package/sites/portfolio/components/pv-hero.json +132 -0
- package/sites/portfolio/components/pv-nav.json +106 -0
- package/sites/portfolio/components/pv-project-card.json +103 -0
- package/sites/portfolio/components/pv-project-grid.json +22 -0
- package/sites/portfolio/components/pv-section-header.json +53 -0
- package/sites/portfolio/content/projects/architecture.md +12 -0
- package/sites/portfolio/content/projects/editorial.md +12 -0
- package/sites/portfolio/content/projects/food.md +12 -0
- package/sites/portfolio/content/projects/portraits.md +12 -0
- package/sites/portfolio/content/projects/travel.md +12 -0
- package/sites/portfolio/content/projects/weddings.md +12 -0
- package/sites/portfolio/images.json +54 -0
- package/sites/portfolio/layouts/base.json +22 -0
- package/sites/portfolio/package.json +15 -0
- package/sites/portfolio/pages/[slug].json +260 -0
- package/sites/portfolio/pages/about.md +40 -0
- package/sites/portfolio/pages/contact.md +42 -0
- package/sites/portfolio/pages/index.md +45 -0
- package/sites/portfolio/pages/work.md +39 -0
- package/sites/portfolio/project.json +105 -0
- package/sites/portfolio/public/favicon.svg +7 -0
- package/sites/portfolio/public/images/about.jpg +0 -0
- package/sites/portfolio/public/images/hero.jpg +0 -0
- package/sites/portfolio/public/images/project-1.jpg +0 -0
- package/sites/portfolio/public/images/project-2.jpg +0 -0
- package/sites/portfolio/public/images/project-3.jpg +0 -0
- package/sites/portfolio/public/images/project-4.jpg +0 -0
- package/sites/portfolio/public/images/project-5.jpg +0 -0
- package/sites/portfolio/public/images/project-6.jpg +0 -0
- package/sites/professional-firm/components/pf-article-header.json +79 -0
- package/sites/professional-firm/components/pf-contact-form.json +138 -0
- package/sites/professional-firm/components/pf-cta.json +62 -0
- package/sites/professional-firm/components/pf-feature.json +55 -0
- package/sites/professional-firm/components/pf-footer.json +172 -0
- package/sites/professional-firm/components/pf-hero.json +128 -0
- package/sites/professional-firm/components/pf-insight-card.json +99 -0
- package/sites/professional-firm/components/pf-intro.json +59 -0
- package/sites/professional-firm/components/pf-logo-bar.json +112 -0
- package/sites/professional-firm/components/pf-nav.json +110 -0
- package/sites/professional-firm/components/pf-section-header.json +53 -0
- package/sites/professional-firm/components/pf-service-card.json +77 -0
- package/sites/professional-firm/components/pf-stat.json +37 -0
- package/sites/professional-firm/components/pf-team-member.json +70 -0
- package/sites/professional-firm/content/insights/cash-flow-forecasting.md +15 -0
- package/sites/professional-firm/content/insights/choosing-business-entity.md +15 -0
- package/sites/professional-firm/content/insights/r-and-d-tax-credits.md +15 -0
- package/sites/professional-firm/content/insights/when-to-hire-cfo.md +15 -0
- package/sites/professional-firm/content/insights/year-end-tax-moves.md +15 -0
- package/sites/professional-firm/images.json +48 -0
- package/sites/professional-firm/layouts/article.json +48 -0
- package/sites/professional-firm/layouts/base.json +22 -0
- package/sites/professional-firm/package.json +15 -0
- package/sites/professional-firm/pages/contact.md +36 -0
- package/sites/professional-firm/pages/index.md +81 -0
- package/sites/professional-firm/pages/insights/[slug].json +118 -0
- package/sites/professional-firm/pages/insights.md +29 -0
- package/sites/professional-firm/pages/services.md +39 -0
- package/sites/professional-firm/pages/team.md +33 -0
- package/sites/professional-firm/project.json +104 -0
- package/sites/professional-firm/public/favicon.svg +5 -0
- package/sites/professional-firm/public/images/about.jpg +0 -0
- package/sites/professional-firm/public/images/hero.jpg +0 -0
- package/sites/professional-firm/public/images/insight-cover.jpg +0 -0
- package/sites/professional-firm/public/images/team-1.jpg +0 -0
- package/sites/professional-firm/public/images/team-2.jpg +0 -0
- package/sites/professional-firm/public/images/team-3.jpg +0 -0
- package/sites/professional-firm/public/images/team-4.jpg +0 -0
- package/sites/real-estate/components/re-agent-card.json +66 -0
- package/sites/real-estate/components/re-contact-form.json +132 -0
- package/sites/real-estate/components/re-cta.json +63 -0
- package/sites/real-estate/components/re-detail-row.json +26 -0
- package/sites/real-estate/components/re-feature.json +53 -0
- package/sites/real-estate/components/re-footer.json +151 -0
- package/sites/real-estate/components/re-hero.json +183 -0
- package/sites/real-estate/components/re-intro.json +59 -0
- package/sites/real-estate/components/re-listing-card.json +126 -0
- package/sites/real-estate/components/re-listings-filter.json +337 -0
- package/sites/real-estate/components/re-nav.json +117 -0
- package/sites/real-estate/components/re-section-header.json +53 -0
- package/sites/real-estate/components/re-stat.json +36 -0
- package/sites/real-estate/components/re-step.json +55 -0
- package/sites/real-estate/components/re-testimonial.json +54 -0
- package/sites/real-estate/content/listings.csv +7 -0
- package/sites/real-estate/images.json +84 -0
- package/sites/real-estate/layouts/base.json +22 -0
- package/sites/real-estate/package.json +15 -0
- package/sites/real-estate/pages/[slug].json +327 -0
- package/sites/real-estate/pages/about.md +42 -0
- package/sites/real-estate/pages/contact.md +54 -0
- package/sites/real-estate/pages/index.md +77 -0
- package/sites/real-estate/pages/listings.md +13 -0
- package/sites/real-estate/project.json +109 -0
- package/sites/real-estate/public/favicon.svg +5 -0
- package/sites/real-estate/public/images/about.jpg +0 -0
- package/sites/real-estate/public/images/agent-1.jpg +0 -0
- package/sites/real-estate/public/images/agent-2.jpg +0 -0
- package/sites/real-estate/public/images/agent-3.jpg +0 -0
- package/sites/real-estate/public/images/hero.jpg +0 -0
- package/sites/real-estate/public/images/interior-1.jpg +0 -0
- package/sites/real-estate/public/images/interior-2.jpg +0 -0
- package/sites/real-estate/public/images/listing-1.jpg +0 -0
- package/sites/real-estate/public/images/listing-2.jpg +0 -0
- package/sites/real-estate/public/images/listing-3.jpg +0 -0
- package/sites/real-estate/public/images/listing-4.jpg +0 -0
- package/sites/real-estate/public/images/listing-5.jpg +0 -0
- package/sites/real-estate/public/images/listing-6.jpg +0 -0
- package/sites/restaurant/components/bit-cta.json +62 -0
- package/sites/restaurant/components/bit-feature.json +42 -0
- package/sites/restaurant/components/bit-footer.json +145 -0
- package/sites/restaurant/components/bit-gallery.json +65 -0
- package/sites/restaurant/components/bit-hero.json +128 -0
- package/sites/restaurant/components/bit-hours.json +90 -0
- package/sites/restaurant/components/bit-intro.json +59 -0
- package/sites/restaurant/components/bit-menu-group.json +29 -0
- package/sites/restaurant/components/bit-menu-item.json +57 -0
- package/sites/restaurant/components/bit-nav.json +97 -0
- package/sites/restaurant/components/bit-reservation.json +134 -0
- package/sites/restaurant/components/bit-review.json +54 -0
- package/sites/restaurant/components/bit-section-header.json +53 -0
- package/sites/restaurant/content/menu/bruschetta.md +9 -0
- package/sites/restaurant/content/menu/cappuccino.md +9 -0
- package/sites/restaurant/content/menu/chocolate-tart.md +9 -0
- package/sites/restaurant/content/menu/house-coffee.md +9 -0
- package/sites/restaurant/content/menu/mushroom-tagliatelle.md +9 -0
- package/sites/restaurant/content/menu/roast-chicken.md +9 -0
- package/sites/restaurant/content/menu/seared-salmon.md +9 -0
- package/sites/restaurant/content/menu/squash-soup.md +9 -0
- package/sites/restaurant/content/menu/tiramisu.md +9 -0
- package/sites/restaurant/images.json +66 -0
- package/sites/restaurant/layouts/base.json +22 -0
- package/sites/restaurant/package.json +15 -0
- package/sites/restaurant/pages/about.md +30 -0
- package/sites/restaurant/pages/contact.md +28 -0
- package/sites/restaurant/pages/index.md +63 -0
- package/sites/restaurant/pages/menu.md +80 -0
- package/sites/restaurant/project.json +105 -0
- package/sites/restaurant/public/favicon.svg +7 -0
- package/sites/restaurant/public/images/about.jpg +0 -0
- package/sites/restaurant/public/images/dish-desserts.jpg +0 -0
- package/sites/restaurant/public/images/dish-mains.jpg +0 -0
- package/sites/restaurant/public/images/dish-starters.jpg +0 -0
- package/sites/restaurant/public/images/gallery-1.jpg +0 -0
- package/sites/restaurant/public/images/gallery-2.jpg +0 -0
- package/sites/restaurant/public/images/gallery-3.jpg +0 -0
- package/sites/restaurant/public/images/gallery-4.jpg +0 -0
- package/sites/restaurant/public/images/hero.jpg +0 -0
- package/sites/restaurant/public/images/intro.jpg +0 -0
- package/sites/saas/components/sa-check-item.json +40 -0
- package/sites/saas/components/sa-contact-form.json +153 -0
- package/sites/saas/components/sa-cta.json +102 -0
- package/sites/saas/components/sa-faq.json +413 -0
- package/sites/saas/components/sa-feature-card.json +59 -0
- package/sites/saas/components/sa-feature-split.json +60 -0
- package/sites/saas/components/sa-footer.json +145 -0
- package/sites/saas/components/sa-hero.json +160 -0
- package/sites/saas/components/sa-logo-cloud.json +119 -0
- package/sites/saas/components/sa-nav.json +130 -0
- package/sites/saas/components/sa-pricing.json +427 -0
- package/sites/saas/components/sa-section-header.json +55 -0
- package/sites/saas/components/sa-stat.json +40 -0
- package/sites/saas/components/sa-testimonial-card.json +57 -0
- package/sites/saas/content/testimonials/marcus-bell.md +8 -0
- package/sites/saas/content/testimonials/nadia-okafor.md +8 -0
- package/sites/saas/content/testimonials/priya-raman.md +8 -0
- package/sites/saas/content/testimonials/theo-lindqvist.md +8 -0
- package/sites/saas/images.json +30 -0
- package/sites/saas/layouts/base.json +22 -0
- package/sites/saas/package.json +15 -0
- package/sites/saas/pages/contact.md +39 -0
- package/sites/saas/pages/features.md +87 -0
- package/sites/saas/pages/index.md +122 -0
- package/sites/saas/pages/pricing.md +39 -0
- package/sites/saas/project.json +134 -0
- package/sites/saas/public/favicon.svg +5 -0
- package/sites/saas/public/images/feature-1.jpg +0 -0
- package/sites/saas/public/images/feature-2.jpg +0 -0
- package/sites/saas/public/images/feature-3.jpg +0 -0
- package/sites/saas/public/images/hero.jpg +0 -0
- package/sites/shop/components/shp-badge.json +18 -0
- package/sites/shop/components/shp-contact-form.json +156 -0
- package/sites/shop/components/shp-cta.json +63 -0
- package/sites/shop/components/shp-feature.json +55 -0
- package/sites/shop/components/shp-footer.json +145 -0
- package/sites/shop/components/shp-hero.json +128 -0
- package/sites/shop/components/shp-intro.json +59 -0
- package/sites/shop/components/shp-nav.json +104 -0
- package/sites/shop/components/shp-product-card.json +131 -0
- package/sites/shop/components/shp-product-filter.json +184 -0
- package/sites/shop/components/shp-review.json +54 -0
- package/sites/shop/components/shp-section-header.json +53 -0
- package/sites/shop/components/shp-service.json +83 -0
- package/sites/shop/components/shp-stat.json +37 -0
- package/sites/shop/components/shp-visit-info.json +132 -0
- package/sites/shop/content/product/aero-road-helmet.md +10 -0
- package/sites/shop/content/product/apex-carbon-road.md +10 -0
- package/sites/shop/content/product/backroad-gravel-adv.md +10 -0
- package/sites/shop/content/product/boulder-enduro.md +10 -0
- package/sites/shop/content/product/rambler-kids-20.md +10 -0
- package/sites/shop/content/product/summit-trail-29er.md +10 -0
- package/sites/shop/content/product/trailhead-pannier-set.md +10 -0
- package/sites/shop/content/product/velocity-alloy-road.md +10 -0
- package/sites/shop/images.json +54 -0
- package/sites/shop/layouts/base.json +22 -0
- package/sites/shop/package.json +15 -0
- package/sites/shop/pages/about.md +42 -0
- package/sites/shop/pages/contact.md +15 -0
- package/sites/shop/pages/index.md +82 -0
- package/sites/shop/pages/products/[sku].json +191 -0
- package/sites/shop/pages/products.md +29 -0
- package/sites/shop/project.json +105 -0
- package/sites/shop/public/favicon.svg +6 -0
- package/sites/shop/public/images/about.jpg +0 -0
- package/sites/shop/public/images/hero.jpg +0 -0
- package/sites/shop/public/images/product-1.jpg +0 -0
- package/sites/shop/public/images/product-2.jpg +0 -0
- package/sites/shop/public/images/product-3.jpg +0 -0
- package/sites/shop/public/images/product-4.jpg +0 -0
- package/sites/shop/public/images/product-5.jpg +0 -0
- package/sites/shop/public/images/product-6.jpg +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tagName": "bl-newsletter-cta",
|
|
3
|
+
"state": {
|
|
4
|
+
"eyebrow": "The Long Field Letter",
|
|
5
|
+
"heading": "One essay, most Sundays.",
|
|
6
|
+
"text": "Field notes on design, technology, and craft — sent when there's something worth saying. No noise, unsubscribe anytime.",
|
|
7
|
+
"placeholder": "you@example.com",
|
|
8
|
+
"cta": "Subscribe",
|
|
9
|
+
"note": "This is a demo form. Wire it to your email provider in components/bl-newsletter-cta.json."
|
|
10
|
+
},
|
|
11
|
+
"style": {
|
|
12
|
+
"display": "block",
|
|
13
|
+
"backgroundColor": "var(--color-bg-cream)",
|
|
14
|
+
"border": "1px solid var(--color-border)",
|
|
15
|
+
"borderRadius": "var(--radius)",
|
|
16
|
+
"padding": "clamp(2rem, 5vw, 3rem)"
|
|
17
|
+
},
|
|
18
|
+
"children": [
|
|
19
|
+
{
|
|
20
|
+
"tagName": "div",
|
|
21
|
+
"style": { "maxWidth": "var(--max-width-narrow)", "margin": "0 auto", "textAlign": "center" },
|
|
22
|
+
"children": [
|
|
23
|
+
{
|
|
24
|
+
"tagName": "p",
|
|
25
|
+
"style": {
|
|
26
|
+
"display": "${state.eyebrow ? 'block' : 'none'}",
|
|
27
|
+
"textTransform": "uppercase",
|
|
28
|
+
"letterSpacing": "0.16em",
|
|
29
|
+
"fontSize": "0.78rem",
|
|
30
|
+
"fontWeight": "600",
|
|
31
|
+
"color": "var(--color-primary)",
|
|
32
|
+
"margin": "0 0 0.75rem"
|
|
33
|
+
},
|
|
34
|
+
"textContent": "${state.eyebrow}"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"tagName": "h2",
|
|
38
|
+
"style": {
|
|
39
|
+
"fontFamily": "var(--font-heading)",
|
|
40
|
+
"fontSize": "clamp(1.7rem, 3.5vw, 2.3rem)",
|
|
41
|
+
"fontWeight": "600",
|
|
42
|
+
"lineHeight": "1.15",
|
|
43
|
+
"margin": "0 0 0.85rem"
|
|
44
|
+
},
|
|
45
|
+
"textContent": "${state.heading}"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"tagName": "p",
|
|
49
|
+
"style": {
|
|
50
|
+
"fontSize": "1.08rem",
|
|
51
|
+
"lineHeight": "1.65",
|
|
52
|
+
"color": "var(--color-text-muted)",
|
|
53
|
+
"margin": "0 auto 1.75rem",
|
|
54
|
+
"maxWidth": "52ch"
|
|
55
|
+
},
|
|
56
|
+
"textContent": "${state.text}"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"tagName": "form",
|
|
60
|
+
"attributes": { "action": "#", "method": "post" },
|
|
61
|
+
"style": {
|
|
62
|
+
"display": "flex",
|
|
63
|
+
"gap": "0.75rem",
|
|
64
|
+
"maxWidth": "460px",
|
|
65
|
+
"margin": "0 auto",
|
|
66
|
+
"@--sm": { "flexDirection": "column" }
|
|
67
|
+
},
|
|
68
|
+
"children": [
|
|
69
|
+
{
|
|
70
|
+
"tagName": "input",
|
|
71
|
+
"attributes": {
|
|
72
|
+
"type": "email",
|
|
73
|
+
"name": "email",
|
|
74
|
+
"placeholder": "${state.placeholder}",
|
|
75
|
+
"required": "true",
|
|
76
|
+
"aria-label": "Email address"
|
|
77
|
+
},
|
|
78
|
+
"style": {
|
|
79
|
+
"flex": "1",
|
|
80
|
+
"padding": "0.8rem 1rem",
|
|
81
|
+
"border": "1px solid var(--color-border)",
|
|
82
|
+
"borderRadius": "var(--radius)",
|
|
83
|
+
"fontSize": "1rem",
|
|
84
|
+
"fontFamily": "inherit",
|
|
85
|
+
"backgroundColor": "var(--color-bg-white)"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"tagName": "button",
|
|
90
|
+
"attributes": { "type": "submit" },
|
|
91
|
+
"style": {
|
|
92
|
+
"backgroundColor": "var(--color-primary)",
|
|
93
|
+
"color": "var(--color-text-white)",
|
|
94
|
+
"padding": "0.8rem 1.75rem",
|
|
95
|
+
"border": "none",
|
|
96
|
+
"borderRadius": "var(--radius)",
|
|
97
|
+
"fontSize": "1rem",
|
|
98
|
+
"fontWeight": "600",
|
|
99
|
+
"cursor": "pointer",
|
|
100
|
+
"transition": "background-color 0.15s",
|
|
101
|
+
":hover": { "backgroundColor": "var(--color-primary-hover)" }
|
|
102
|
+
},
|
|
103
|
+
"textContent": "${state.cta}"
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"tagName": "p",
|
|
109
|
+
"style": {
|
|
110
|
+
"display": "${state.note ? 'block' : 'none'}",
|
|
111
|
+
"fontSize": "0.8rem",
|
|
112
|
+
"color": "var(--color-text-muted)",
|
|
113
|
+
"margin": "1rem 0 0"
|
|
114
|
+
},
|
|
115
|
+
"textContent": "${state.note}"
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tagName": "bl-post-card",
|
|
3
|
+
"state": {
|
|
4
|
+
"title": "",
|
|
5
|
+
"excerpt": "",
|
|
6
|
+
"date": "",
|
|
7
|
+
"tag": "",
|
|
8
|
+
"href": "#",
|
|
9
|
+
"cover": { "type": "string", "format": "image", "default": "" }
|
|
10
|
+
},
|
|
11
|
+
"style": {
|
|
12
|
+
"display": "block",
|
|
13
|
+
"height": "100%"
|
|
14
|
+
},
|
|
15
|
+
"children": [
|
|
16
|
+
{
|
|
17
|
+
"tagName": "a",
|
|
18
|
+
"attributes": { "href": "${state.href}" },
|
|
19
|
+
"style": {
|
|
20
|
+
"display": "flex",
|
|
21
|
+
"flexDirection": "column",
|
|
22
|
+
"height": "100%",
|
|
23
|
+
"textDecoration": "none",
|
|
24
|
+
"color": "var(--color-text-primary)",
|
|
25
|
+
"backgroundColor": "var(--color-bg-white)",
|
|
26
|
+
"border": "1px solid var(--color-border)",
|
|
27
|
+
"borderRadius": "var(--radius)",
|
|
28
|
+
"overflow": "hidden",
|
|
29
|
+
"transition": "transform 0.15s, box-shadow 0.15s",
|
|
30
|
+
":hover": {
|
|
31
|
+
"transform": "translateY(-3px)",
|
|
32
|
+
"boxShadow": "0 14px 40px rgba(17,17,17,0.12)"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"children": [
|
|
36
|
+
{
|
|
37
|
+
"tagName": "img",
|
|
38
|
+
"attributes": {
|
|
39
|
+
"src": "${state.cover}",
|
|
40
|
+
"alt": "${state.title}",
|
|
41
|
+
"loading": "lazy"
|
|
42
|
+
},
|
|
43
|
+
"style": {
|
|
44
|
+
"display": "${state.cover ? 'block' : 'none'}",
|
|
45
|
+
"width": "100%",
|
|
46
|
+
"aspectRatio": "16 / 10",
|
|
47
|
+
"objectFit": "cover"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"tagName": "div",
|
|
52
|
+
"style": {
|
|
53
|
+
"padding": "1.5rem",
|
|
54
|
+
"display": "flex",
|
|
55
|
+
"flexDirection": "column",
|
|
56
|
+
"flex": "1"
|
|
57
|
+
},
|
|
58
|
+
"children": [
|
|
59
|
+
{
|
|
60
|
+
"tagName": "span",
|
|
61
|
+
"style": {
|
|
62
|
+
"display": "${state.tag ? 'inline-block' : 'none'}",
|
|
63
|
+
"alignSelf": "flex-start",
|
|
64
|
+
"backgroundColor": "rgba(14, 165, 233, 0.1)",
|
|
65
|
+
"color": "var(--color-primary)",
|
|
66
|
+
"padding": "0.25rem 0.65rem",
|
|
67
|
+
"borderRadius": "999px",
|
|
68
|
+
"fontSize": "0.72rem",
|
|
69
|
+
"fontWeight": "600",
|
|
70
|
+
"textTransform": "uppercase",
|
|
71
|
+
"letterSpacing": "0.08em",
|
|
72
|
+
"marginBottom": "0.85rem"
|
|
73
|
+
},
|
|
74
|
+
"textContent": "${state.tag}"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"tagName": "h3",
|
|
78
|
+
"style": {
|
|
79
|
+
"fontFamily": "var(--font-heading)",
|
|
80
|
+
"fontSize": "1.4rem",
|
|
81
|
+
"fontWeight": "600",
|
|
82
|
+
"lineHeight": "1.2",
|
|
83
|
+
"letterSpacing": "-0.01em",
|
|
84
|
+
"margin": "0 0 0.6rem"
|
|
85
|
+
},
|
|
86
|
+
"textContent": "${state.title}"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"tagName": "p",
|
|
90
|
+
"style": {
|
|
91
|
+
"margin": "0 0 1.25rem",
|
|
92
|
+
"color": "var(--color-text-muted)",
|
|
93
|
+
"fontSize": "1rem",
|
|
94
|
+
"lineHeight": "1.6"
|
|
95
|
+
},
|
|
96
|
+
"textContent": "${state.excerpt}"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"tagName": "div",
|
|
100
|
+
"style": {
|
|
101
|
+
"marginTop": "auto",
|
|
102
|
+
"fontSize": "0.8rem",
|
|
103
|
+
"letterSpacing": "0.04em",
|
|
104
|
+
"textTransform": "uppercase",
|
|
105
|
+
"color": "var(--color-text-muted)"
|
|
106
|
+
},
|
|
107
|
+
"textContent": "${state.date}"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tagName": "bl-post-list",
|
|
3
|
+
"state": {
|
|
4
|
+
"columns": "3"
|
|
5
|
+
},
|
|
6
|
+
"style": {
|
|
7
|
+
"display": "grid",
|
|
8
|
+
"gridTemplateColumns": "repeat(3, 1fr)",
|
|
9
|
+
"gap": "1.75rem",
|
|
10
|
+
"maxWidth": "var(--max-width)",
|
|
11
|
+
"margin": "0 auto",
|
|
12
|
+
"padding": "0 1.5rem",
|
|
13
|
+
"@--md": { "gridTemplateColumns": "repeat(2, 1fr)" },
|
|
14
|
+
"@--sm": { "gridTemplateColumns": "1fr" }
|
|
15
|
+
},
|
|
16
|
+
"children": [{ "tagName": "slot" }]
|
|
17
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tagName": "bl-prose",
|
|
3
|
+
"style": {
|
|
4
|
+
"display": "block",
|
|
5
|
+
"fontFamily": "var(--font-body)",
|
|
6
|
+
"fontSize": "1.2rem",
|
|
7
|
+
"lineHeight": "1.8",
|
|
8
|
+
"color": "var(--color-text-primary)",
|
|
9
|
+
"& p": {
|
|
10
|
+
"margin": "0 0 1.5rem"
|
|
11
|
+
},
|
|
12
|
+
"& h2": {
|
|
13
|
+
"fontFamily": "var(--font-heading)",
|
|
14
|
+
"fontSize": "1.7rem",
|
|
15
|
+
"fontWeight": "600",
|
|
16
|
+
"lineHeight": "1.2",
|
|
17
|
+
"letterSpacing": "-0.01em",
|
|
18
|
+
"margin": "2.75rem 0 1rem"
|
|
19
|
+
},
|
|
20
|
+
"& h3": {
|
|
21
|
+
"fontFamily": "var(--font-heading)",
|
|
22
|
+
"fontSize": "1.35rem",
|
|
23
|
+
"fontWeight": "600",
|
|
24
|
+
"margin": "2.25rem 0 0.85rem"
|
|
25
|
+
},
|
|
26
|
+
"& a": {
|
|
27
|
+
"color": "var(--color-primary)",
|
|
28
|
+
"textDecoration": "underline",
|
|
29
|
+
"textUnderlineOffset": "2px"
|
|
30
|
+
},
|
|
31
|
+
"& blockquote": {
|
|
32
|
+
"margin": "2rem 0",
|
|
33
|
+
"padding": "0.5rem 0 0.5rem 1.5rem",
|
|
34
|
+
"borderLeft": "3px solid var(--color-primary)",
|
|
35
|
+
"fontStyle": "italic",
|
|
36
|
+
"fontSize": "1.35rem",
|
|
37
|
+
"lineHeight": "1.5",
|
|
38
|
+
"color": "var(--color-text-primary)"
|
|
39
|
+
},
|
|
40
|
+
"& ul": {
|
|
41
|
+
"margin": "0 0 1.5rem",
|
|
42
|
+
"padding": "0 0 0 1.4rem"
|
|
43
|
+
},
|
|
44
|
+
"& ol": {
|
|
45
|
+
"margin": "0 0 1.5rem",
|
|
46
|
+
"padding": "0 0 0 1.4rem"
|
|
47
|
+
},
|
|
48
|
+
"& li": {
|
|
49
|
+
"margin": "0 0 0.5rem"
|
|
50
|
+
},
|
|
51
|
+
"& img": {
|
|
52
|
+
"width": "100%",
|
|
53
|
+
"height": "auto",
|
|
54
|
+
"borderRadius": "var(--radius)",
|
|
55
|
+
"margin": "2rem 0"
|
|
56
|
+
},
|
|
57
|
+
"& strong": {
|
|
58
|
+
"fontWeight": "600"
|
|
59
|
+
},
|
|
60
|
+
"& code": {
|
|
61
|
+
"fontFamily": "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
|
|
62
|
+
"fontSize": "0.9em",
|
|
63
|
+
"backgroundColor": "var(--color-bg-cream)",
|
|
64
|
+
"padding": "0.15em 0.4em",
|
|
65
|
+
"borderRadius": "4px"
|
|
66
|
+
},
|
|
67
|
+
"& hr": {
|
|
68
|
+
"border": "none",
|
|
69
|
+
"borderTop": "1px solid var(--color-border)",
|
|
70
|
+
"margin": "2.75rem 0"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"children": [{ "tagName": "slot" }]
|
|
74
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tagName": "bl-section-header",
|
|
3
|
+
"state": {
|
|
4
|
+
"eyebrow": "",
|
|
5
|
+
"heading": "",
|
|
6
|
+
"subheading": "",
|
|
7
|
+
"align": "center"
|
|
8
|
+
},
|
|
9
|
+
"style": {
|
|
10
|
+
"display": "block",
|
|
11
|
+
"maxWidth": "var(--max-width-narrow)",
|
|
12
|
+
"margin": "0 auto 2.5rem",
|
|
13
|
+
"textAlign": "${state.align}"
|
|
14
|
+
},
|
|
15
|
+
"children": [
|
|
16
|
+
{
|
|
17
|
+
"tagName": "p",
|
|
18
|
+
"style": {
|
|
19
|
+
"display": "${state.eyebrow ? 'block' : 'none'}",
|
|
20
|
+
"textTransform": "uppercase",
|
|
21
|
+
"letterSpacing": "0.16em",
|
|
22
|
+
"fontSize": "0.8rem",
|
|
23
|
+
"fontWeight": "600",
|
|
24
|
+
"color": "var(--color-primary)",
|
|
25
|
+
"margin": "0 0 0.75rem"
|
|
26
|
+
},
|
|
27
|
+
"textContent": "${state.eyebrow}"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"tagName": "h2",
|
|
31
|
+
"style": {
|
|
32
|
+
"fontFamily": "var(--font-heading)",
|
|
33
|
+
"fontSize": "clamp(1.9rem, 4vw, 2.6rem)",
|
|
34
|
+
"fontWeight": "600",
|
|
35
|
+
"lineHeight": "1.15",
|
|
36
|
+
"letterSpacing": "-0.02em",
|
|
37
|
+
"margin": "0"
|
|
38
|
+
},
|
|
39
|
+
"textContent": "${state.heading}"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"tagName": "p",
|
|
43
|
+
"style": {
|
|
44
|
+
"display": "${state.subheading ? 'block' : 'none'}",
|
|
45
|
+
"fontSize": "1.15rem",
|
|
46
|
+
"lineHeight": "1.7",
|
|
47
|
+
"color": "var(--color-text-muted)",
|
|
48
|
+
"margin": "1rem 0 0"
|
|
49
|
+
},
|
|
50
|
+
"textContent": "${state.subheading}"
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tagName": "bl-tag-pill",
|
|
3
|
+
"state": {
|
|
4
|
+
"label": ""
|
|
5
|
+
},
|
|
6
|
+
"style": {
|
|
7
|
+
"display": "inline-block"
|
|
8
|
+
},
|
|
9
|
+
"children": [
|
|
10
|
+
{
|
|
11
|
+
"tagName": "span",
|
|
12
|
+
"style": {
|
|
13
|
+
"display": "inline-block",
|
|
14
|
+
"backgroundColor": "rgba(14, 165, 233, 0.1)",
|
|
15
|
+
"color": "var(--color-primary)",
|
|
16
|
+
"padding": "0.3rem 0.75rem",
|
|
17
|
+
"borderRadius": "999px",
|
|
18
|
+
"fontSize": "0.75rem",
|
|
19
|
+
"fontWeight": "600",
|
|
20
|
+
"textTransform": "uppercase",
|
|
21
|
+
"letterSpacing": "0.08em"
|
|
22
|
+
},
|
|
23
|
+
"textContent": "${state.label}"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Designing for Slowness
|
|
3
|
+
excerpt: Most interfaces are optimized to be fast. The best ones are optimized to be worth slowing down for. There is a difference.
|
|
4
|
+
date: June 14, 2026
|
|
5
|
+
author: Marren Oda
|
|
6
|
+
tag: Design
|
|
7
|
+
cover: /images/post-2.jpg
|
|
8
|
+
order: 2
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Speed is the default virtue of software. Faster load times, fewer taps, less friction — the whole discipline of interaction design has quietly agreed that the goal is to get the user out of the way of the machine as quickly as possible.
|
|
12
|
+
|
|
13
|
+
But there is a category of experience that speed actively ruins. Reading a long essay. Looking at a photograph. Composing a difficult message to someone you love. For these, friction is not a bug. It is the point.
|
|
14
|
+
|
|
15
|
+
## The tyranny of the frictionless
|
|
16
|
+
|
|
17
|
+
When we remove every pause, we also remove every moment of consideration. The infinite scroll is frictionless by design, and it is frictionless precisely so that you never stop to ask whether you want to keep going. Frictionlessness is not neutral. It has a direction, and the direction is usually _more_.
|
|
18
|
+
|
|
19
|
+
Good design for slowness does the opposite. It builds in the pause. A generous margin is a pause. A single column of text with nothing competing for attention is a pause. Whitespace is not empty; it is the room a reader needs to think.
|
|
20
|
+
|
|
21
|
+
## What slowness asks of us
|
|
22
|
+
|
|
23
|
+
Designing this way is harder, because you cannot measure it with the usual dashboards. Time-on-page goes up, which your analytics may read as failure. Bounce rate is a meaningless number for a page whose entire purpose is to be read slowly and then closed.
|
|
24
|
+
|
|
25
|
+
The work, then, is to decide what an interface is _for_ before deciding how fast it should be. A checkout flow should be quick. An essay should be quiet. Knowing which is which — and having the nerve to design accordingly — is most of the job.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Notes from a Long Walk
|
|
3
|
+
excerpt: I left the phone at home and walked until the noise in my head went quiet. Some things you can only think about at three miles an hour.
|
|
4
|
+
date: May 3, 2026
|
|
5
|
+
author: Marren Oda
|
|
6
|
+
tag: Essays
|
|
7
|
+
cover: /images/post-3.jpg
|
|
8
|
+
order: 5
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
The problem was not that I had run out of ideas. The problem was that I had too many, and they were all shouting at once, and I could not hear any single one of them clearly. So I put on boots and went out the door with nothing in my pockets but a key.
|
|
12
|
+
|
|
13
|
+
Walking is the oldest thinking technology we have. There is something about the pace of it — three miles an hour, roughly the speed of a thought — that lets the mind settle. Faster and you are just moving. Slower and you fidget. But at a walk, the body handles itself and the mind is finally free to wander somewhere useful.
|
|
14
|
+
|
|
15
|
+
## The pace of a thought
|
|
16
|
+
|
|
17
|
+
For the first mile the noise followed me. The unfinished emails, the half-decisions, the small anxieties that fill the gaps in a day. But somewhere in the second mile it began to thin out, and by the third there was only the road, the weather, and one clear question I had been avoiding for weeks.
|
|
18
|
+
|
|
19
|
+
> Solvitur ambulando — it is solved by walking. The Romans knew. So did every philosopher who ever wore out a pair of shoes.
|
|
20
|
+
|
|
21
|
+
I did not solve it, exactly. But I saw its actual shape for the first time, which is most of what solving is. The answer had been buried under all the noise, and it took two hours of moving through the world to dig it out.
|
|
22
|
+
|
|
23
|
+
## What the walk returns
|
|
24
|
+
|
|
25
|
+
I came home tired in the good way, the way that clears rather than depletes. Nothing on my to-do list had changed. But the thing I could not think about at my desk had become thinkable somewhere around the fourth mile, and that was worth more than any hour I have ever spent staring at a screen, waiting for clarity to arrive on its own.
|
|
26
|
+
|
|
27
|
+
It never does. You have to go out and walk it down.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: The City as a Text
|
|
3
|
+
excerpt: A street is written in the same way a paragraph is — in layers, by many hands, with corrections that never quite erase what came before.
|
|
4
|
+
date: May 31, 2026
|
|
5
|
+
author: Marren Oda
|
|
6
|
+
tag: Design
|
|
7
|
+
cover: /images/post-4.jpg
|
|
8
|
+
order: 3
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You can read a city if you slow down enough. Not the map of it — the map is a summary, a table of contents — but the actual surface: the patched asphalt, the ghost sign fading on a brick wall, the doorway bricked over decades ago and still faintly outlined.
|
|
12
|
+
|
|
13
|
+
Every building is a sentence someone wrote and someone else edited. The corner shop was a bank; you can tell from the disproportionate weight of the stone around the door. The wide sidewalk was once a streetcar line. The city is a palimpsest, written over and over, and the earlier drafts show through.
|
|
14
|
+
|
|
15
|
+
## Reading the corrections
|
|
16
|
+
|
|
17
|
+
What I love most are the corrections — the places where the city changed its mind. A grand staircase leading to a wall. A road that bends for no reason a driver can see, because it is still following the shape of a creek that was buried a century ago.
|
|
18
|
+
|
|
19
|
+
> Cities, like dreams, are made of desires and fears, wrote Calvino. So is every design, if you look at it long enough.
|
|
20
|
+
|
|
21
|
+
These are not mistakes. They are the record of a place negotiating with its own history, keeping what still worked and building around what did not. It is exactly how good design accretes: not by grand replacement, but by patient correction.
|
|
22
|
+
|
|
23
|
+
## The lesson for makers
|
|
24
|
+
|
|
25
|
+
If you make things — interfaces, products, essays — the city has a lesson for you. Nothing is written once. Everything you build will be edited by people you will never meet, adapted to uses you did not intend, patched and re-patched until the original draft is only faintly visible underneath.
|
|
26
|
+
|
|
27
|
+
Design as if that is true, because it is. Leave room for the corrections. Build things that can be edited kindly. The best work, like the best streets, is the kind that ages into something richer than what you first drew.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: The Quiet Craft of Revision
|
|
3
|
+
excerpt: First drafts are for finding out what you think. The real work — the craft — happens on the second pass, and the tenth.
|
|
4
|
+
date: June 28, 2026
|
|
5
|
+
author: Marren Oda
|
|
6
|
+
tag: Craft
|
|
7
|
+
cover: /images/post-1.jpg
|
|
8
|
+
order: 1
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
There is a myth that good writers get it right the first time. They do not. What they have is a higher tolerance for looking at their own bad sentences, over and over, until the bad ones are gone.
|
|
12
|
+
|
|
13
|
+
A first draft is a machine for finding out what you actually think. It is allowed to be clumsy. Its only job is to exist. Everything after that — the trimming, the reordering, the merciless cutting of the clever line you were most proud of — is where the writing actually happens.
|
|
14
|
+
|
|
15
|
+
## Cutting is a form of respect
|
|
16
|
+
|
|
17
|
+
The hardest edits are the ones that remove something good. Not something bad; a bad line is easy to delete. A good line that does not belong is the real test. Keeping it is a kindness to yourself and a small cruelty to the reader, who now has to carry a sentence that leads nowhere.
|
|
18
|
+
|
|
19
|
+
> Write drunk, edit sober, the saying goes. I would put it differently: write generously, edit as if every word costs you something.
|
|
20
|
+
|
|
21
|
+
The trick is to read your own work as a stranger would — someone who did not sit through the three hours it took to produce the paragraph, who owes it no loyalty, who will simply stop reading if it stops earning their attention.
|
|
22
|
+
|
|
23
|
+
## Revision is thinking, continued
|
|
24
|
+
|
|
25
|
+
We treat revision as cleanup, as if the ideas were already finished and we are just wiping down the counters. But most of what I believe about a subject, I discover on the fourth read, when the argument I thought I was making turns out to be a smaller, truer argument hiding underneath.
|
|
26
|
+
|
|
27
|
+
So I have stopped rushing to publish. A piece that has only been drafted is a piece that has only been guessed at. Give it a week. Come back a stranger. Cut what you can no longer defend, and keep only what earns its place.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tools That Disappear
|
|
3
|
+
excerpt: The best tool is the one you stop noticing. Here is why so much software insists on being noticed instead — and what it costs us.
|
|
4
|
+
date: May 17, 2026
|
|
5
|
+
author: Marren Oda
|
|
6
|
+
tag: Tech
|
|
7
|
+
cover: /images/post-6.jpg
|
|
8
|
+
order: 4
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
A good hammer disappears. You do not think about the hammer; you think about the nail. The tool becomes an extension of the hand, and all your attention flows through it to the work. This is the highest thing a tool can do — to vanish into the task.
|
|
12
|
+
|
|
13
|
+
Most software cannot resist being noticed. It wants your attention, because attention is what it sells. So it interrupts, it badges, it pulses a red dot in the corner of your eye. The tool has become a rival for the very focus it was supposed to serve.
|
|
14
|
+
|
|
15
|
+
## The economics of the red dot
|
|
16
|
+
|
|
17
|
+
There is a reason for this, and it is not incompetence. A tool that disappears cannot show you an ad. A tool that disappears does not generate engagement metrics. The incentives of much modern software point directly away from the thing that would make it good.
|
|
18
|
+
|
|
19
|
+
> The measure of a tool is not what it can do, but what it lets you forget about.
|
|
20
|
+
|
|
21
|
+
I try to notice which of my tools respect my attention and which of them farm it. The plain text editor that opens instantly and then gets out of the way. The notebook that has never once sent me a notification. These are the tools I return to for years, precisely because they ask for nothing.
|
|
22
|
+
|
|
23
|
+
## Choosing quiet tools
|
|
24
|
+
|
|
25
|
+
You can choose differently. You can prefer the tool that does less and interrupts never over the one that does everything and pings constantly. You can turn off the badges, mute the pulses, and let your software return to being an extension of your hand instead of a claim on your eyes.
|
|
26
|
+
|
|
27
|
+
It is a small rebellion, but a real one. Every tool you teach to disappear is a little more of your attention returned to the work — where it belonged all along.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: What I Learned Rereading
|
|
3
|
+
excerpt: A book does not change, but you do. Returning to the same pages years apart is the closest thing we have to a conversation with our former selves.
|
|
4
|
+
date: April 19, 2026
|
|
5
|
+
author: Marren Oda
|
|
6
|
+
tag: Reading
|
|
7
|
+
cover: /images/post-5.jpg
|
|
8
|
+
order: 6
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
I keep the books I love, and every few years I read one of them again. Not to discover the plot — I know the plot — but to find out what has changed. Because the book has not changed. The words are exactly where I left them. The only variable in the experiment is me.
|
|
12
|
+
|
|
13
|
+
This is the quiet gift of rereading. A first read is about the book. A second read, years later, is about the distance between who you were and who you are. The pages become a fixed point against which you can finally measure your own drift.
|
|
14
|
+
|
|
15
|
+
## The margins remember
|
|
16
|
+
|
|
17
|
+
In my oldest books there are notes in handwriting I barely recognize as mine. A younger person underlined that passage, wrote _yes_ in the margin beside an idea I now find naive, and skipped entirely the paragraph that today seems like the whole point.
|
|
18
|
+
|
|
19
|
+
> We do not read the same book twice, because we are not the same reader twice.
|
|
20
|
+
|
|
21
|
+
It is humbling and a little vertiginous to meet that earlier reader. They were so sure. They missed so much. And of course, the reader I am now is missing things too — passages I skim past that some future self will underline and wonder how I ever overlooked.
|
|
22
|
+
|
|
23
|
+
## Reading as a long conversation
|
|
24
|
+
|
|
25
|
+
So I have come to think of my shelf less as a collection and more as a set of appointments with my future self. Each book I reread is a conversation held across years, with someone who is me and also not me, who understood things I have forgotten and misunderstood things I have since learned.
|
|
26
|
+
|
|
27
|
+
Buy fewer books, maybe. But keep the ones that matter, and go back to them. The best of them will have grown while you were away — which is to say, you will have.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"site": "blog",
|
|
3
|
+
"thumbnail": "hero",
|
|
4
|
+
"images": [
|
|
5
|
+
{
|
|
6
|
+
"role": "hero",
|
|
7
|
+
"query": "writing desk notebook coffee",
|
|
8
|
+
"orientation": "landscape",
|
|
9
|
+
"photoId": 204511
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"role": "author",
|
|
13
|
+
"query": "writer portrait",
|
|
14
|
+
"orientation": "portrait",
|
|
15
|
+
"photoId": 27471474
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"role": "post-1",
|
|
19
|
+
"query": "minimal workspace desk",
|
|
20
|
+
"orientation": "landscape",
|
|
21
|
+
"photoId": 4884116
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"role": "post-2",
|
|
25
|
+
"query": "typography design print",
|
|
26
|
+
"orientation": "landscape",
|
|
27
|
+
"photoId": 5045979
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"role": "post-3",
|
|
31
|
+
"query": "nature landscape misty hills",
|
|
32
|
+
"orientation": "landscape",
|
|
33
|
+
"photoId": 4316213
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"role": "post-4",
|
|
37
|
+
"query": "city architecture street",
|
|
38
|
+
"orientation": "landscape",
|
|
39
|
+
"photoId": 37718865
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"role": "post-5",
|
|
43
|
+
"query": "books reading library",
|
|
44
|
+
"orientation": "landscape",
|
|
45
|
+
"photoId": 8762862
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"role": "post-6",
|
|
49
|
+
"query": "abstract texture paper",
|
|
50
|
+
"orientation": "landscape",
|
|
51
|
+
"photoId": 8749388
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tagName": "div",
|
|
3
|
+
"$elements": [
|
|
4
|
+
{ "$ref": "../components/bl-nav.json" },
|
|
5
|
+
{ "$ref": "../components/bl-footer.json" }
|
|
6
|
+
],
|
|
7
|
+
"style": {
|
|
8
|
+
"minHeight": "100vh",
|
|
9
|
+
"display": "flex",
|
|
10
|
+
"flexDirection": "column",
|
|
11
|
+
"backgroundColor": "var(--color-bg-white)"
|
|
12
|
+
},
|
|
13
|
+
"children": [
|
|
14
|
+
{ "tagName": "bl-nav" },
|
|
15
|
+
{
|
|
16
|
+
"tagName": "main",
|
|
17
|
+
"style": { "flex": "1" },
|
|
18
|
+
"children": [{ "tagName": "slot" }]
|
|
19
|
+
},
|
|
20
|
+
{ "tagName": "bl-footer" }
|
|
21
|
+
]
|
|
22
|
+
}
|