diff --git a/astro.config.mjs b/astro.config.mjs
index af736c673..b5892abbd 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -238,6 +238,7 @@ async function config() {
// Component overrides
components: {
CallToAction: './src/components/overrides/CallToAction.astro',
+ Head: './src/components/overrides/Head.astro',
Footer: './src/components/overrides/Footer.astro',
Icon: './src/components/overrides/Icon.astro',
Header: './src/components/overrides/Header.astro',
@@ -295,6 +296,18 @@ async function config() {
vite: {
plugins: [
+ {
+ name: 'sidebar-topics-custom-icons',
+ enforce: 'pre',
+ resolveId(source, importer) {
+ if (
+ source === '@astrojs/starlight/components' &&
+ importer?.split('?')[0].endsWith('/starlight-sidebar-topics/components/Topics.astro')
+ ) {
+ return path.resolve('./src/components/overrides/SidebarTopicComponents.ts');
+ }
+ },
+ },
{
// Patch the Vite logger after config is resolved so the filter applies
// to all logging paths, including environment-level loggers in Vite 6+.
diff --git a/astro.sidebar.mjs b/astro.sidebar.mjs
index 3035757b9..9ddc3ceb3 100644
--- a/astro.sidebar.mjs
+++ b/astro.sidebar.mjs
@@ -188,7 +188,7 @@ export function generateSidebar() {
{
label: 'Authors',
link: '/merchants/quick-start/',
- icon: 'seti:svg',
+ icon: 'document',
items: [
{
label: 'Getting started',
@@ -501,11 +501,11 @@ export function generateSidebar() {
id: 'how-tos',
label: 'How-tos',
link: '/how-tos/',
- icon: 'pencil',
+ icon: 'lightbulb',
items: [
{ label: 'Overview', link: '/how-tos/' },
{
- label: 'Author how-tos',
+ label: 'Author How-tos',
collapsed: false,
items: [
{ label: 'Browse All', link: '/how-tos/#for-authors' },
@@ -554,7 +554,7 @@ export function generateSidebar() {
],
},
{
- label: 'Developer how-tos',
+ label: 'Developer How-tos',
collapsed: false,
items: [
{ label: 'Browse All', link: '/how-tos/#for-developers' },
diff --git a/package.json b/package.json
index aa0c86a2a..f25b2203b 100644
--- a/package.json
+++ b/package.json
@@ -79,11 +79,11 @@
"prod": "build:prod-fast && preview:prod-fast"
},
"dependencies": {
- "@dropins/ai-tools": "^1.0.0",
"@astrojs/check": "^0.9.8",
"@astrojs/react": "4.4.2",
"@astrojs/starlight": "0.37.7",
"@codesandbox/sandpack-client": "^2.19.8",
+ "@dropins/ai-tools": "^1.0.0",
"@dropins/storefront-account": "~4.2.0",
"@dropins/storefront-auth": "~4.1.0",
"@dropins/storefront-cart": "3.4.0",
@@ -126,6 +126,7 @@
"hastscript": "^9.0.1",
"lodash": "^4.18.1",
"lodash.escaperegexp": "^4.1.2",
+ "lucide": "^1.52.0",
"mermaid": "^11.12.2",
"node-html-parser": "^7.0.1",
"prettier": "^3.7.4",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 00b220218..5278d0e45 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -160,6 +160,9 @@ importers:
lodash.escaperegexp:
specifier: ^4.1.2
version: 4.1.2
+ lucide:
+ specifier: ^1.52.0
+ version: 1.52.0
mermaid:
specifier: ^11.12.2
version: 11.15.0
@@ -4077,6 +4080,9 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ lucide@1.52.0:
+ resolution: {integrity: sha512-XlP0U+m3seobjTPfT0Ybg9YqJeTwSxx1I6R2Ty7vwpA/4HtibMbV28p9tW7AnIwb77YkTboK9x/OPBEqGAzCFg==}
+
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -9939,6 +9945,8 @@ snapshots:
dependencies:
yallist: 3.1.1
+ lucide@1.52.0: {}
+
lz-string@1.5.0: {}
magic-string@0.30.21:
diff --git a/src/components/HomeHero.astro b/src/components/HomeHero.astro
index 9135e6d24..e5a91ed45 100644
--- a/src/components/HomeHero.astro
+++ b/src/components/HomeHero.astro
@@ -1,175 +1,173 @@
---
import HomeSearch from '@components/HomeSearch.astro';
+import Icon from '@components/overrides/Icon.astro';
+import { Icons } from '@components/overrides/Icons';
import { setBasePath } from '@utils/basePath';
+import { generateSidebar } from '../../astro.sidebar.mjs';
-// Developer directory: six task/topic groups that tile as a clean 3x2 grid.
-// Each group title links to that section's overview, so the overview no longer
-// repeats as a list item. setBasePath keeps each link correct under the
-// production base path, the same helper the site's LinkCard uses. Every path is
-// verified in the build.
-const sections = [
- {
- title: 'Getting started',
- link: '/get-started/',
- links: [
- { title: 'Prerequisites', link: '/get-started/before-you-start/' },
- { title: 'Backend options', link: '/get-started/backends/' },
- { title: 'Plan your storefront project', link: '/setup/' },
- { title: 'Create a storefront', link: '/get-started/create-storefront/' },
- ],
- },
+const menuIcons = Object.fromEntries(
+ generateSidebar().map(({ label, icon }) => [label, icon])
+) as Record;
+
+const directories = [
{
- title: 'Architecture',
- link: '/get-started/architecture/',
- links: [
- { title: 'How a page loads', link: '/get-started/architecture/how-a-page-loads/' },
- { title: 'Drop-ins at a glance', link: '/get-started/architecture/drop-ins-at-a-glance/' },
- { title: 'How drop-ins coordinate', link: '/get-started/architecture/drop-ins-on-a-page/' },
+ label: 'For developers',
+ aria: 'Developer documentation',
+ categories: [
{
- title: 'Commerce services at a glance',
- link: '/get-started/architecture/commerce-services-and-backends/',
+ title: 'Getting started',
+ links: [
+ { title: 'Prerequisites', link: '/get-started/before-you-start/' },
+ { title: 'Backend options', link: '/get-started/backends/' },
+ { title: 'Plan your storefront project', link: '/setup/' },
+ { title: 'Create a storefront', link: '/get-started/create-storefront/' },
+ ],
},
- ],
- },
- {
- title: 'Blocks',
- link: '/blocks/',
- links: [
- { title: 'Blocks and drop-ins', link: '/blocks/blocks-and-dropins/' },
- { title: 'Customize blocks', link: '/blocks/customize-blocks/' },
- { title: 'Create commerce blocks', link: '/blocks/create-commerce-blocks/' },
- { title: 'Build custom features', link: '/blocks/build-custom-features/' },
- ],
- },
- {
- title: 'Drop-ins',
- link: '/dropins/all/introduction/',
- links: [
- { title: 'Drop-in containers', link: '/dropins/all/containers/' },
- { title: 'Container slots', link: '/dropins/all/slots/' },
- { title: 'Extend a drop-in', link: '/dropins/all/extending/' },
- { title: 'Event bus', link: '/dropins/all/events/' },
- ],
- },
- {
- title: 'Configuration',
- link: '/setup/configuration/',
- links: [
- { title: 'Storefront configuration', link: '/setup/configuration/commerce-configuration/' },
- { title: 'Compatibility Package', link: '/setup/configuration/storefront-compatibility/' },
- { title: 'AEM Assets integration', link: '/setup/configuration/aem-assets-configuration/' },
- { title: 'CDN configuration', link: '/setup/configuration/content-delivery-network/' },
- ],
- },
- {
- title: 'Production',
- link: '/setup/launch/',
- links: [
- { title: 'Performance best practices', link: '/get-started/performance/' },
- { title: 'Browser compatibility', link: '/get-started/browser-compatibility/' },
- { title: 'Analytics instrumentation', link: '/setup/analytics/instrumentation/' },
- { title: 'SEO overview', link: '/setup/seo/' },
- ],
- },
-] as const;
-
-// Content authors are a co-equal audience, so their links get the same grouped
-// grid as the developer directory rather than a single afterthought row. Group
-// titles link to each section overview; every path is verified in the build.
-const authorSections = [
- {
- title: 'Getting started',
- link: '/merchants/quick-start/',
- links: [
- { title: 'What is a storefront?', link: '/merchants/quick-start/create-content/' },
- { title: 'How a page comes together', link: '/merchants/quick-start/content-model/' },
- { title: 'Your first commerce page', link: '/how-tos/create-commerce-page/' },
- { title: 'Document Authoring', link: '/merchants/quick-start/document-authoring/' },
- ],
- },
- {
- title: 'Authoring',
- link: '/merchants/authoring/',
- links: [
- { title: 'Block types', link: '/merchants/blocks/content-commerce-blocks/' },
- { title: 'Page metadata', link: '/merchants/blocks/page-metadata/' },
- { title: 'Block table structure', link: '/merchants/blocks/block-tables/' },
- { title: 'Labels and placeholders', link: '/how-tos/change-labels-and-placeholders/' },
- ],
- },
- {
- title: 'B2C blocks',
- link: '/merchants/blocks/b2c/',
- links: [
- { title: 'Product Details', link: '/merchants/blocks/product-details/' },
- { title: 'Product List Page', link: '/merchants/blocks/product-list-page/' },
- { title: 'Commerce Cart', link: '/merchants/blocks/commerce-cart/' },
- { title: 'Commerce Checkout', link: '/merchants/blocks/commerce-checkout/' },
- ],
- },
- {
- title: 'B2B blocks',
- link: '/merchants/blocks/b2b/',
- links: [
- { title: 'Company Profile', link: '/merchants/blocks/commerce-company-profile/' },
{
- title: 'Company Purchase Orders',
- link: '/merchants/blocks/commerce-b2b-po-company-purchase-orders/',
+ title: 'Architecture',
+ links: [
+ { title: 'How a page loads', link: '/get-started/architecture/how-a-page-loads/' },
+ {
+ title: 'Drop-ins at a glance',
+ link: '/get-started/architecture/drop-ins-at-a-glance/',
+ },
+ {
+ title: 'How drop-ins coordinate',
+ link: '/get-started/architecture/drop-ins-on-a-page/',
+ },
+ {
+ title: 'Commerce services at a glance',
+ link: '/get-started/architecture/commerce-services-and-backends/',
+ },
+ ],
+ },
+ {
+ title: 'Blocks',
+ links: [
+ { title: 'Blocks and drop-ins', link: '/blocks/blocks-and-dropins/' },
+ { title: 'Customize blocks', link: '/blocks/customize-blocks/' },
+ { title: 'Arrange block layouts', link: '/blocks/arrange-block-layouts/' },
+ { title: 'Create commerce blocks', link: '/blocks/create-commerce-blocks/' },
+ ],
},
- { title: 'Negotiable Quote', link: '/merchants/blocks/commerce-b2b-negotiable-quote/' },
- { title: 'Requisition Lists', link: '/merchants/blocks/commerce-b2b-requisition-list/' },
- ],
- },
- {
- title: 'Customization',
- link: '/merchants/content-customizations/',
- links: [
- { title: 'Enrichment', link: '/merchants/content-customizations/enrichment/' },
{
- title: 'Drop-in experiments',
- link: '/merchants/content-customizations/experiments/',
+ title: 'Drop-ins',
+ links: [
+ { title: 'Drop-in containers', link: '/dropins/all/containers/' },
+ { title: 'Container slots', link: '/dropins/all/slots/' },
+ { title: 'Extend a drop-in', link: '/dropins/all/extending/' },
+ { title: 'Event bus', link: '/dropins/all/events/' },
+ ],
},
{
- title: 'Personalization setup',
- link: '/merchants/content-customizations/personalization/',
+ title: 'Configuration',
+ links: [
+ {
+ title: 'Storefront configuration',
+ link: '/setup/configuration/commerce-configuration/',
+ },
+ {
+ title: 'Compatibility Package',
+ link: '/setup/configuration/storefront-compatibility/',
+ },
+ { title: 'CORS setup', link: '/setup/configuration/cors-setup/' },
+ { title: 'Multistore setup', link: '/setup/configuration/multistore-setup/' },
+ ],
},
{
- title: 'Product recommendations',
- link: '/merchants/content-customizations/product-recommendations/',
+ title: 'Production',
+ links: [
+ { title: 'Launch checklist', link: '/setup/launch/launch-checklist/' },
+ { title: 'Performance best practices', link: '/get-started/performance/' },
+ { title: 'Analytics instrumentation', link: '/setup/analytics/instrumentation/' },
+ { title: 'SEO overview', link: '/setup/seo/' },
+ ],
},
],
},
{
- title: 'Publishing',
- link: '/merchants/edge-delivery-services/',
- links: [
- { title: 'Scheduling options', link: '/merchants/edge-delivery-services/scheduling/' },
- { title: 'Localization', link: '/merchants/quick-start/content-localization/' },
- { title: 'Redirects', link: '/merchants/edge-delivery-services/redirects/' },
- { title: 'Sitemaps', link: '/merchants/edge-delivery-services/sitemaps/' },
+ label: 'For authors',
+ aria: 'Content author documentation',
+ categories: [
+ {
+ title: 'Getting started',
+ links: [
+ { title: 'What is a storefront?', link: '/merchants/quick-start/create-content/' },
+ { title: 'How a page comes together', link: '/merchants/quick-start/content-model/' },
+ { title: 'Your first commerce page', link: '/how-tos/create-commerce-page/' },
+ { title: 'Document Authoring', link: '/merchants/quick-start/document-authoring/' },
+ ],
+ },
+ {
+ title: 'Authoring',
+ links: [
+ { title: 'Add a block to a page', link: '/how-tos/add-block-to-page/' },
+ { title: 'Block table structure', link: '/merchants/blocks/block-tables/' },
+ { title: 'Add page metadata', link: '/how-tos/add-page-metadata/' },
+ {
+ title: 'Labels and placeholders',
+ link: '/how-tos/change-labels-and-placeholders/',
+ },
+ ],
+ },
+ {
+ title: 'B2C blocks',
+ links: [
+ { title: 'Product Details', link: '/merchants/blocks/product-details/' },
+ { title: 'Product List Page', link: '/merchants/blocks/product-list-page/' },
+ { title: 'Commerce Cart', link: '/merchants/blocks/commerce-cart/' },
+ { title: 'Commerce Checkout', link: '/merchants/blocks/commerce-checkout/' },
+ ],
+ },
+ {
+ title: 'B2B blocks',
+ links: [
+ { title: 'Company Profile', link: '/merchants/blocks/commerce-company-profile/' },
+ {
+ title: 'Company Purchase Orders',
+ link: '/merchants/blocks/commerce-b2b-po-company-purchase-orders/',
+ },
+ { title: 'Negotiable Quote', link: '/merchants/blocks/commerce-b2b-negotiable-quote/' },
+ { title: 'Requisition Lists', link: '/merchants/blocks/commerce-b2b-requisition-list/' },
+ ],
+ },
+ {
+ title: 'Customization',
+ links: [
+ { title: 'Show enrichment content', link: '/how-tos/show-enrichment-content/' },
+ { title: 'Create a page experiment', link: '/how-tos/create-page-experiment/' },
+ { title: 'Show targeted content', link: '/how-tos/show-targeted-content/' },
+ { title: 'Product recommendations', link: '/how-tos/add-product-recommendations/' },
+ ],
+ },
+ {
+ title: 'Publishing',
+ links: [
+ { title: 'Scheduling options', link: '/merchants/edge-delivery-services/scheduling/' },
+ { title: 'Translate content', link: '/how-tos/translate-storefront-content/' },
+ { title: 'Redirects', link: '/merchants/edge-delivery-services/redirects/' },
+ { title: 'Submit a sitemap', link: '/how-tos/submit-storefront-sitemap/' },
+ ],
+ },
],
},
] as const;
-// Both audience directories share one render below: developer groups first,
-// author groups second, each shown as an equal labeled band.
-const directories = [
- { label: 'For developers', aria: 'Developer documentation', groups: sections },
- { label: 'For authors', aria: 'Content author documentation', groups: authorSections },
-] as const;
-
-// Two co-equal audience entries. Developers and content authors are peers here,
-// so each gets a matching primary button rather than one funnel favoring a
-// single audience. Both paths are verified in the build.
const audienceActions = [
{ title: 'Developers', link: '/get-started/' },
{ title: 'Authors', link: '/merchants/quick-start/' },
] as const;
-// Secondary destinations that follow the primary audience buttons: reference
-// material and the release notes. Paths verified in the build.
const audiencePaths = [
+ { title: 'How-tos', link: '/how-tos/' },
{ title: 'API Reference', link: '/reference/' },
+ { title: 'Releases', link: '/releases/' },
+] as const;
+
+const sharedPaths = [
+ { title: 'Drop-ins', link: '/dropins/all/introduction/' },
+ { title: 'Storefront SDK', link: '/sdk/' },
+ { title: 'Team responsibilities', link: '/merchants/blocks/author-and-developer-tasks/' },
{ title: 'Release suites', link: '/releases/' },
] as const;
---
@@ -187,17 +185,19 @@ const audiencePaths = [
Commerce drop-in components.
-