From 0f601df74afa29cdc84d6df0c6397baa8a240adf Mon Sep 17 00:00:00 2001 From: Brian Talbot Date: Fri, 31 Oct 2025 14:03:39 -0400 Subject: [PATCH 1/2] removing page title suffixes from search results (#1697) * Use for search indexing but strip trailing site suffix at build time * centralize title logic with shared composePageTitle() and stripSiteTitleSuffix() helpers * introduce single source of truth for site name and separators * keep client search rendering simple; no post-processing in the browser * preserve existing page/OG title behavior while improving search relevance --- packages/webawesome/docs/.eleventy.js | 40 +++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/packages/webawesome/docs/.eleventy.js b/packages/webawesome/docs/.eleventy.js index eda89ac3e..7580daa0c 100644 --- a/packages/webawesome/docs/.eleventy.js +++ b/packages/webawesome/docs/.eleventy.js @@ -102,6 +102,31 @@ export default async function (eleventyConfig) { image: 'https://webawesome.com/assets/images/open-graph/default.png', }; + // Title composition/stripping config - single source of truth + const SITE_NAME = siteMetadata.name; + const SITE_TITLE_SEPARATORS = ['|']; + + // Helper to escape user-provided strings for safe use inside RegExp sources + const escapeRegExp = string => (string + '').replace(/[.*+?^${}()|[\\]\\]/g, '\\$&'); + + // Precompute a reusable regex to strip a trailing site name suffix from titles, e.g. " | Web Awesome" + // Supports configured separators and flexible whitespace. This keeps search titles clean and improves Lunr scoring + const siteNameEscapedForRegex = escapeRegExp(SITE_NAME); + const separatorsEscaped = SITE_TITLE_SEPARATORS.map(s => escapeRegExp(s)).join(''); + const siteTitleSuffixPattern = new RegExp(`\\s*[${separatorsEscaped}]\\s*${siteNameEscapedForRegex}$`); + + // Helper to remove the site suffix from a page title. Keep this in sync with how page titles + // are composed (see eleventyComputed.pageTitle) so search indexing stays consistent + const stripSiteTitleSuffix = title => (title || '').replace(siteTitleSuffixPattern, ''); + + // Helper to compose a full page title with site suffix when appropriate + // Uses the same separator set as the stripping logic for consistency + const composePageTitle = baseTitle => { + const title = baseTitle || SITE_NAME; + const preferredSeparator = SITE_TITLE_SEPARATORS[0] || '|'; + return title !== SITE_NAME ? `${title} ${preferredSeparator} ${SITE_NAME}` : title; + }; + eleventyConfig.addGlobalData('siteMetadata', siteMetadata); // Template filters - {{ content | filter }} @@ -183,15 +208,9 @@ export default async function (eleventyConfig) { eleventyConfig.addGlobalData('eleventyComputed', { lastUpdatedISO: data => getLastModifiedISO(data.page?.inputPath, data.lastUpdated), // Page title with smart + default site name formatting - pageTitle: data => { - const title = data.title || siteMetadata.name; - return title !== siteMetadata.name ? `${title} | ${siteMetadata.name}` : title; - }, + pageTitle: data => composePageTitle(data.title), // Open Graph title with smart + default site name formatting - ogTitle: data => { - const ogTitle = data.ogTitle || data.title || siteMetadata.name; - return ogTitle !== siteMetadata.name ? `${ogTitle} | ${siteMetadata.name}` : ogTitle; - }, + ogTitle: data => composePageTitle(data.ogTitle || data.title), ogDescription: data => data.ogDescription || data.description, ogImage: data => data.ogImage || siteMetadata.image, ogUrl: data => { @@ -354,6 +373,11 @@ export default async function (eleventyConfig) { searchPlugin({ filename: '', selectorsToIgnore: ['code.example'], + // Use <title> but strip a trailing site name suffix for cleaner search results + getTitle: doc => { + const raw = doc.querySelector('title')?.textContent ?? ''; + return stripSiteTitleSuffix(raw); + }, getContent: doc => doc.querySelector('#content')?.textContent ?? '', }), ); From 46812e08c5daa6285cb5cc500bda90a0bab7a877 Mon Sep 17 00:00:00 2001 From: Cory LaViska <cory@abeautifulsite.net> Date: Mon, 3 Nov 2025 09:43:21 -0500 Subject: [PATCH 2/2] fix slider on touch; fixes #1703 (#1709) --- packages/webawesome/docs/docs/resources/changelog.md | 6 +++++- packages/webawesome/src/internal/drag.ts | 12 ++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/webawesome/docs/docs/resources/changelog.md b/packages/webawesome/docs/docs/resources/changelog.md index f6fb18584..e4e2c3847 100644 --- a/packages/webawesome/docs/docs/resources/changelog.md +++ b/packages/webawesome/docs/docs/resources/changelog.md @@ -10,6 +10,10 @@ Web Awesome follows [Semantic Versioning](https://semver.org/). Breaking changes Components with the <wa-badge variant="warning">Experimental</wa-badge> badge should not be used in production. They are made available as release candidates for development and testing purposes. As such, changes to experimental components will not be subject to semantic versioning. +## Next + +- Fixed a bug in `<wa-slider>` that caused some touch devices to end up with the incorrect value [issue:1703] + ## 3.0.0 - 🚨 BREAKING: Changed `appearance="filled outlined"` to `appearance="filled-outlined"` in the following elements [issue:1127] @@ -492,4 +496,4 @@ Many of these changes and improvements were the direct result of feedback from u </details> -Did we miss something? [Let us know!](https://github.com/shoelace-style/webawesome/discussions) \ No newline at end of file +Did we miss something? [Let us know!](https://github.com/shoelace-style/webawesome/discussions) diff --git a/packages/webawesome/src/internal/drag.ts b/packages/webawesome/src/internal/drag.ts index a1fe23e4b..10c249884 100644 --- a/packages/webawesome/src/internal/drag.ts +++ b/packages/webawesome/src/internal/drag.ts @@ -84,8 +84,8 @@ export class DraggableElement { } private handleDragStart = (event: PointerEvent | TouchEvent) => { - const clientX = supportsTouch && 'touches' in event ? event.touches[0].clientX : (event as PointerEvent).clientX; - const clientY = supportsTouch && 'touches' in event ? event.touches[0].clientY : (event as PointerEvent).clientY; + const clientX = 'touches' in event ? event.touches[0].clientX : (event as PointerEvent).clientX; + const clientY = 'touches' in event ? event.touches[0].clientY : (event as PointerEvent).clientY; if ( this.isDragging || @@ -105,8 +105,8 @@ export class DraggableElement { }; private handleDragStop = (event: PointerEvent | TouchEvent) => { - const clientX = supportsTouch && 'touches' in event ? event.touches[0].clientX : (event as PointerEvent).clientX; - const clientY = supportsTouch && 'touches' in event ? event.touches[0].clientY : (event as PointerEvent).clientY; + const clientX = 'touches' in event ? event.touches[0].clientX : (event as PointerEvent).clientX; + const clientY = 'touches' in event ? event.touches[0].clientY : (event as PointerEvent).clientY; this.isDragging = false; document.removeEventListener('pointerup', this.handleDragStop); @@ -117,8 +117,8 @@ export class DraggableElement { }; private handleDragMove = (event: PointerEvent | TouchEvent) => { - const clientX = supportsTouch && 'touches' in event ? event.touches[0].clientX : (event as PointerEvent).clientX; - const clientY = supportsTouch && 'touches' in event ? event.touches[0].clientY : (event as PointerEvent).clientY; + const clientX = 'touches' in event ? event.touches[0].clientX : (event as PointerEvent).clientX; + const clientY = 'touches' in event ? event.touches[0].clientY : (event as PointerEvent).clientY; // Prevent text selection while dragging window.getSelection()?.removeAllRanges();