41554 blogs · [ { "id": "01a0b68b-4ce8-73f0-b76f-b1496c9c9908", "title": "Sam Hermes", "url": "https://samhermes.com", "published_at": "2026-09-07T05:20:44+00:00" }, { "id": "01a087da-c288-7238-8661-342ff2e9f2ff", "title": "Web Component styling with custom properties", "url": "https://samhermes.com/posts/web-component-styling-custom-properties/", "published_at": "2026-06-07T18:55:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff3dc46a2", "title": "Why I don’t like utility class CSS frameworks", "url": "https://samhermes.com/posts/why-i-do-not-like-utility-class-css-frameworks/", "published_at": "2026-05-24T18:10:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff4013852", "title": "Adventures in Web Component styling", "url": "https://samhermes.com/posts/adventures-web-component-styling/", "published_at": "2026-04-17T01:47:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff500a981", "title": "Automatic columns in CSS grid", "url": "https://samhermes.com/posts/automatic-columns-css-grid/", "published_at": "2026-04-07T01:05:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff5718d03", "title": "What makes for a good web component?", "url": "https://samhermes.com/posts/what-makes-for-good-web-component/", "published_at": "2026-04-04T17:12:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff590ebed", "title": "Accessible pagination pattern for Astro", "url": "https://samhermes.com/posts/accessible-pagination/", "published_at": "2025-12-03T00:48:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff5bf15d2", "title": "Create a template for paginated collection in Astro", "url": "https://samhermes.com/posts/create-template-for-paginated-collection-astro/", "published_at": "2025-12-02T03:59:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff5d3f9e2", "title": "I love RSS", "url": "https://samhermes.com/posts/i-love-rss/", "published_at": "2025-12-02T01:12:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff6726d0b", "title": "Starting fresh with Stylelint", "url": "https://samhermes.com/posts/starting-fresh-with-stylelint/", "published_at": "2025-11-22T18:25:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff717cac0", "title": "Remove date from slug in Astro", "url": "https://samhermes.com/posts/remove-date-from-slug-astro/", "published_at": "2025-10-11T23:59:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff78b3516", "title": "Share layout files between markdown and astro files in Astro", "url": "https://samhermes.com/posts/share-layout-files-between-markdown-astro-files-astro/", "published_at": "2025-10-11T17:04:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff7de93f3", "title": "Apple Music grievances, in no particular order", "url": "https://samhermes.com/posts/apple-music-grievances-in-no-particular-order/", "published_at": "2025-10-05T17:42:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff8949c52", "title": "Build dynamic meta titles in Astro", "url": "https://samhermes.com/posts/build-dynamic-meta-titles-astro/", "published_at": "2025-09-07T17:09:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff90ce8bf", "title": "Hello, Astro!", "url": "https://samhermes.com/posts/hello-astro/", "published_at": "2025-08-24T17:51:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff98f0f55", "title": "The broken trust of the back button", "url": "https://samhermes.com/posts/broken-trust-back-button/", "published_at": "2025-07-20T17:46:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ff9a950ff", "title": "Creating the Scroll Snap Controls package", "url": "https://samhermes.com/posts/creating-the-scroll-snap-controls-package/", "published_at": "2025-05-17T17:15:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ffa7cc595", "title": "Implementing media controls in custom blocks, revisited", "url": "https://samhermes.com/posts/implementing-media-controls-custom-blocks-revisited/", "published_at": "2025-02-16T18:52:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ffa8b6f02", "title": "Get page content for posts page in WordPress", "url": "https://samhermes.com/posts/get-page-content-posts-page-wordpress/", "published_at": "2024-11-03T17:41:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ffad30946", "title": "What makes a website feel native?", "url": "https://samhermes.com/posts/what-makes-website-feel-native/", "published_at": "2024-08-25T19:17:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ffbcddda9", "title": "The tension between modularity and accessibility", "url": "https://samhermes.com/posts/tension-between-modularity-accessibility/", "published_at": "2024-08-10T17:45:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ffcadb15c", "title": "Halle 1.2.0 Released", "url": "https://samhermes.com/posts/halle-120-released/", "published_at": "2024-07-07T23:55:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ffd97d77f", "title": "Add GitHub repository as npm dependency", "url": "https://samhermes.com/posts/add-github-repository-npm-dependency/", "published_at": "2024-01-11T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-342ffe5f4faa", "title": "Customize default wp-scripts config", "url": "https://samhermes.com/posts/customize-default-wp-scripts-config/", "published_at": "2023-12-28T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-342fff2ac429", "title": "How to use CSS container queries", "url": "https://samhermes.com/posts/how-to-use-css-container-queries/", "published_at": "2023-07-30T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-342fff720e23", "title": "Slowly backing away from theme.json", "url": "https://samhermes.com/posts/slowly-backing-away-from-theme-json/", "published_at": "2023-05-25T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-342fffec36e3", "title": "Giving the dialog element a whirl", "url": "https://samhermes.com/posts/giving-the-dialog-element-a-whirl/", "published_at": "2023-02-25T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343000704d00", "title": "Use button element to toggle parent menu items in WordPress", "url": "https://samhermes.com/posts/use-button-element-toggle-parent-menu-items-wordpress/", "published_at": "2022-09-25T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300150d992", "title": "Getting to know theme.json", "url": "https://samhermes.com/posts/getting-to-know-theme-json/", "published_at": "2022-05-14T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343001effe0c", "title": "Detect when an image has loaded with JavaScript", "url": "https://samhermes.com/posts/detect-when-image-has-loaded-javascript/", "published_at": "2022-01-11T17:36:00+00:00" }, { "id": "01a087da-c288-7238-8661-343002e43e6c", "title": "Returning to Eleventy", "url": "https://samhermes.com/posts/returning-to-eleventy/", "published_at": "2021-11-22T13:02:00+00:00" }, { "id": "01a087da-c288-7238-8661-343002e7047d", "title": "Fade in and out element with CSS transition", "url": "https://samhermes.com/posts/fade-in-and-out-element-with-css-transition/", "published_at": "2021-11-05T11:15:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430038f710a", "title": "My attempt to convert from Jekyll to Eleventy", "url": "https://samhermes.com/posts/my-attempt-to-convert-from-jekyll-to-eleventy/", "published_at": "2021-10-15T11:30:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430041069f7", "title": "The journey to Alexander", "url": "https://samhermes.com/posts/the-journey-to-alexander/", "published_at": "2021-09-29T00:32:00+00:00" }, { "id": "01a087da-c288-7238-8661-343004a0fbea", "title": "How to make accessible accordions", "url": "https://samhermes.com/posts/how-to-make-accessible-accordions/", "published_at": "2021-08-22T20:29:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300586f848", "title": "How the web saved and failed us", "url": "https://samhermes.com/posts/how-the-web-saved-and-failed-us/", "published_at": "2021-08-14T16:50:00+00:00" }, { "id": "01a087da-c288-7238-8661-343005b16a91", "title": "I'm overly optimistic when estimating time", "url": "https://samhermes.com/posts/im-overly-optimistic-when-estimating-time/", "published_at": "2021-05-13T02:23:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430068151d1", "title": "Disable inline image option in Gutenberg", "url": "https://samhermes.com/posts/disable-inline-image-option-in-gutenberg/", "published_at": "2020-12-17T04:53:00+00:00" }, { "id": "01a087da-c288-7238-8661-343007643a90", "title": "Analytics: Where do we go?", "url": "https://samhermes.com/posts/analytics-where-do-we-go/", "published_at": "2020-09-10T21:10:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300765a0cb", "title": "Are progressive web apps important?", "url": "https://samhermes.com/posts/are-progressive-web-apps-important/", "published_at": "2020-09-04T21:37:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300799b857", "title": "My WordPress hosting recommendation", "url": "https://samhermes.com/posts/my-wordpress-hosting-recommendation/", "published_at": "2020-08-28T19:14:00+00:00" }, { "id": "01a087da-c288-7238-8661-343008224155", "title": "What is product management?", "url": "https://samhermes.com/posts/what-is-product-management/", "published_at": "2020-06-06T15:30:00+00:00" }, { "id": "01a087da-c288-7238-8661-343008f64fe6", "title": "Using a single stylesheet for both block and classic editor", "url": "https://samhermes.com/posts/using-a-single-stylesheet-for-both-block-and-classic-editor/", "published_at": "2020-03-25T17:58:00+00:00" }, { "id": "01a087da-c288-7238-8661-343009aa27f3", "title": "Migrate WordPress install from one DigitalOcean droplet to another", "url": "https://samhermes.com/posts/migrate-wordpress-install-from-one-digitalocean-droplet-to-another/", "published_at": "2020-02-22T19:49:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300a5dcd7e", "title": "Using RadioControl in a custom Gutenberg block", "url": "https://samhermes.com/posts/using-radiocontrol-in-a-custom-gutenberg-block/", "published_at": "2020-01-25T21:52:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300b2237a3", "title": "Using Docker for local WordPress development", "url": "https://samhermes.com/posts/using-docker-for-local-wordpress-development/", "published_at": "2020-01-19T23:32:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300bef2532", "title": "What does it mean to be a creator on the web?", "url": "https://samhermes.com/posts/what-does-it-mean-to-be-a-creator-on-the-web/", "published_at": "2019-12-30T18:38:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300c1cf0ce", "title": "From developer to manager", "url": "https://samhermes.com/posts/from-developer-to-manager/", "published_at": "2019-12-18T16:39:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300cc3d21a", "title": "Internet + Dignity", "url": "https://samhermes.com/posts/internet-plus-dignity/", "published_at": "2019-11-11T01:18:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300d447728", "title": "Software is like a city", "url": "https://samhermes.com/posts/software-is-like-a-city/", "published_at": "2019-10-28T16:56:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300d6f9697", "title": "Revisiting my WordPress work from 2013", "url": "https://samhermes.com/posts/revisiting-my-wordpress-work-from-2013/", "published_at": "2019-09-10T21:40:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300e27f73c", "title": "Implementing media controls in custom blocks", "url": "https://samhermes.com/posts/implementing-media-controls-in-custom-blocks/", "published_at": "2019-09-06T22:51:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300ebecaa0", "title": "Adding dark mode support", "url": "https://samhermes.com/posts/adding-dark-mode-support/", "published_at": "2019-06-06T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300f090532", "title": "Controlling scroll position natively", "url": "https://samhermes.com/posts/controlling-scroll-position-natively/", "published_at": "2019-04-22T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34300f3ab965", "title": "Deploying a repository to a subdirectory of GitHub Pages site", "url": "https://samhermes.com/posts/deploying-repository-subdirectory-github-pages-site/", "published_at": "2019-04-20T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343010185790", "title": "Asking for feedback", "url": "https://samhermes.com/posts/asking-for-feedback/", "published_at": "2019-03-28T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301064242e", "title": "Excluding Uncategorized when listing categories in WordPress", "url": "https://samhermes.com/posts/excluding-uncategorized-listing-categories-wordpress/", "published_at": "2019-02-15T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343010c45461", "title": "Notes from WordCamp US 2018", "url": "https://samhermes.com/posts/notes-from-wordcamp-us/", "published_at": "2018-12-13T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301109d21e", "title": "Disabling blocks and block styles in Gutenberg", "url": "https://samhermes.com/posts/disabling-blocks-block-styles-gutenberg/", "published_at": "2018-11-28T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430116425f1", "title": "Replacing Moment.js with date-fns", "url": "https://samhermes.com/posts/replacing-moment-js-date-fns/", "published_at": "2018-11-15T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430123a1ed9", "title": "Upgrading from Gulp 3 to 4", "url": "https://samhermes.com/posts/upgrading-from-gulp-3-to-4/", "published_at": "2018-11-11T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343012a7fad9", "title": "How to add multiple default markers with popups in Mapbox GL JS", "url": "https://samhermes.com/posts/multiple-markers-popups-mapbox/", "published_at": "2018-10-10T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343012e37185", "title": "Preparing a WordPress theme for Gutenberg", "url": "https://samhermes.com/posts/preparing-wordpress-theme-gutenberg/", "published_at": "2018-08-12T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343013099814", "title": "Using pagination with the WordPress API in Vue", "url": "https://samhermes.com/posts/using-pagination-wordpress-api-vue/", "published_at": "2018-07-25T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301327aab2", "title": "How not to use React with Jekyll", "url": "https://samhermes.com/posts/how-not-to-use-react-with-jekyll/", "published_at": "2018-06-24T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430134b1805", "title": "I love overscroll-behavior", "url": "https://samhermes.com/posts/i-love-overscroll-behavior/", "published_at": "2018-06-10T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343013f25991", "title": "How to improve the accessibility of tabs", "url": "https://samhermes.com/posts/how-to-improve-accessibility-tabs/", "published_at": "2018-06-04T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343014d40715", "title": "Closing the gap above sticky elements", "url": "https://samhermes.com/posts/closing-gap-above-sticky-elements/", "published_at": "2018-05-22T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301515247b", "title": "Opening links in a new window", "url": "https://samhermes.com/posts/opening-links-new-window/", "published_at": "2018-05-18T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301563699f", "title": "Submitting an accessibility-ready theme to WordPress", "url": "https://samhermes.com/posts/submitting-accessibility-ready-theme-wordpress/", "published_at": "2018-05-11T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343015b8782e", "title": "Adding pagination in Vue", "url": "https://samhermes.com/posts/adding-pagination-in-vue/", "published_at": "2018-04-19T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301612ca34", "title": "Lazy loading images", "url": "https://samhermes.com/posts/lazy-loading-images/", "published_at": "2018-03-21T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343016644c61", "title": "Adding a loading state to Reading List", "url": "https://samhermes.com/posts/adding-loading-state-reading-list/", "published_at": "2018-02-27T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430171a152f", "title": "A small Vue app - Reading List", "url": "https://samhermes.com/posts/small-vue-app-reading-list/", "published_at": "2018-01-24T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301775460f", "title": "CSS skills should be valued as much as JavaScript skills", "url": "https://samhermes.com/posts/but-what-about-css-skills/", "published_at": "2017-12-20T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430181673a1", "title": "Getting started with CSS grid", "url": "https://samhermes.com/posts/getting-started-with-css-grid/", "published_at": "2017-11-06T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343018a751b8", "title": "Buttons need a declared type", "url": "https://samhermes.com/posts/buttons-need-declared-type/", "published_at": "2017-10-26T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343018e09113", "title": "Append theme version to stylesheet", "url": "https://samhermes.com/posts/append-theme-version-to-stylesheet/", "published_at": "2017-09-25T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430191c4251", "title": "Explaining accessible modals", "url": "https://samhermes.com/posts/explaining-accessible-modals/", "published_at": "2017-08-18T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343019683777", "title": "Omitting optional HTML tags", "url": "https://samhermes.com/posts/omitting-optional-html-tags/", "published_at": "2017-07-24T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301a2b5971", "title": "Unregistering widgets in WordPress", "url": "https://samhermes.com/posts/unregistering-widgets-in-wordpress/", "published_at": "2017-06-03T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301aadd15f", "title": "Adding Ajax search to a WordPress theme", "url": "https://samhermes.com/posts/adding-ajax-search-to-wordpress/", "published_at": "2017-05-20T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301ab2cc2e", "title": "Communicating about the web", "url": "https://samhermes.com/posts/communicating-about-the-web/", "published_at": "2017-05-06T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301bb213a1", "title": "Using next_posts_link() and prev_posts_link() on static front page", "url": "https://samhermes.com/posts/next-posts-link-prev-posts-link-static-front-page/", "published_at": "2017-04-24T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301be62540", "title": "We don’t need AMP", "url": "https://samhermes.com/posts/we-dont-need-amp/", "published_at": "2017-03-16T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301c99418c", "title": "The two worlds of web development", "url": "https://samhermes.com/posts/two-worlds-web-development/", "published_at": "2017-03-13T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301d40ced8", "title": "The long game of web development", "url": "https://samhermes.com/posts/the-long-game-of-web-development/", "published_at": "2017-01-01T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301dbbda95", "title": "High density screens and web performance", "url": "https://samhermes.com/posts/high-density-screens-web-performance/", "published_at": "2016-12-05T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301e48c9a6", "title": "How to configure a sticky header to prevent page jump", "url": "https://samhermes.com/posts/how-to-configure-sticky-header-to-prevent-page-jump/", "published_at": "2016-11-10T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301f0370ab", "title": "Preparing SVG for the web", "url": "https://samhermes.com/posts/preparing-svg-for-the-web/", "published_at": "2016-09-14T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301fe01617", "title": "Adding syntax highlighting to code", "url": "https://samhermes.com/posts/adding-syntax-highlighting-to-code/", "published_at": "2016-08-25T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-34301fe93c43", "title": "What changes on hover should be actionable", "url": "https://samhermes.com/posts/what-changes-on-hover-should-be-actionable/", "published_at": "2016-08-07T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343020cd9aaf", "title": "Sticky elements with Stickyfill", "url": "https://samhermes.com/posts/sticky-elements-with-stickyfill/", "published_at": "2016-07-24T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343020fa89cb", "title": "Maintaining state with sessionStorage", "url": "https://samhermes.com/posts/maintaining-state-with-sessionstorage/", "published_at": "2016-04-24T00:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343021d5aaf7", "title": "Caching a menu in a transient in WordPress", "url": "https://samhermes.com/posts/caching-menu-in-transient-in-wordpress/", "published_at": "2016-03-30T21:38:00+00:00" }, { "id": "01a087da-c288-7238-8661-3430220c068b", "title": "Toggling elements with JavaScript", "url": "https://samhermes.com/posts/toggling-elements-with-javascript/", "published_at": "2016-03-08T20:20:00+00:00" }, { "id": "01a087da-c288-7238-8661-34302236a9f4", "title": "Setting up Jekyll", "url": "https://samhermes.com/posts/setting-up-jekyll/", "published_at": "2016-02-13T07:15:00+00:00" }, { "id": "01a087da-c288-7238-8661-343022e8bc6f", "title": "Output featured image caption in WordPress", "url": "https://samhermes.com/posts/output-featured-image-caption-wordpress/", "published_at": "2016-01-30T18:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343023d0aa89", "title": "Add 1 hour to date & time in PHP", "url": "https://samhermes.com/posts/add-one-hour-to-date-and-time-in-php/", "published_at": "2016-01-04T18:00:00+00:00" }, { "id": "01a087da-c288-7238-8661-343023f3bdd4", "title": "Using vertical height media queries with fixed headers", "url": "https://samhermes.com/posts/using-vertical-height-media-queries-with-fixed-headers/", "published_at": "2016-01-03T18:00:00+00:00" } ] posts Claim your blog
Back to Sam Hermes
Blog · corpus.blog/blogs/samhermes.com/posts

Sam Hermes

samhermes.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016