Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.
Status: Layer1 chrome is a data manifest + closed icon map, not per-clone *-desktop-navigation.tsx variants. There is no config/navigation.config.ts. Packs overwrite lib/navigation/primary-nav.ts. Clones remap existing slot ids in lib/navigation/primary-nav-overlay.ts. Unknown icon ids render the users glyph.
Add a generic id to PRIMARY_NAV_ICONS on Layer1, then reference that id
Overlay a new mobile tab from the clone
Overlay cannot add, hide, or reorder slots — change the pack manifest
Copy desktop-sidebar.tsx onto the clone
Keep chrome on Layer1; remap iconById / labelKeysById / hrefById only
Architecture
Primary nav layers
home.preset does not select the menu. Overflow modules (the [...] catalog) live in lib/navigation/platform-menu.ts plus ring-config.navigation.platformMenu. Packs must not overwrite platform-menu.ts; vertical defaults belong in PACK.json.platformMenu and are copied onto the clone ring-config.
What you can change without forking chrome
Labels — next-intl keys on each slot (labelKeys). Pack pack.json and clone overlay can override leaves. See Localization.
Which Lucide glyph — pick an id that already exists in the closed map (table below). If you need a new glyph, that is a Layer1 change, not a clone file.
Href of an existing slot — L3 hrefById on that slot id (same locale → string contract as pack items).
Mobile bar shape — first two manifest hrefs, center plus (add opportunity), then the rest. A pack that lists three hrefs plus overflow (and omits docs-or-admin) gets that bar from the same chrome slices. Overlay cannot add or hide those slots.
Do not ask an integrator to drop a custom sidebar component into components/navigation/ for brand icons.
Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.
Status: Layer1 chrome is a data manifest + closed icon map, not per-clone *-desktop-navigation.tsx variants. There is no config/navigation.config.ts. Packs overwrite lib/navigation/primary-nav.ts. Clones remap existing slot ids in lib/navigation/primary-nav-overlay.ts. Unknown icon ids render the users glyph.
Add a generic id to PRIMARY_NAV_ICONS on Layer1, then reference that id
Overlay a new mobile tab from the clone
Overlay cannot add, hide, or reorder slots — change the pack manifest
Copy desktop-sidebar.tsx onto the clone
Keep chrome on Layer1; remap iconById / labelKeysById / hrefById only
Architecture
Primary nav layers
home.preset does not select the menu. Overflow modules (the [...] catalog) live in lib/navigation/platform-menu.ts plus ring-config.navigation.platformMenu. Packs must not overwrite platform-menu.ts; vertical defaults belong in PACK.json.platformMenu and are copied onto the clone ring-config.
What you can change without forking chrome
Labels — next-intl keys on each slot (labelKeys). Pack pack.json and clone overlay can override leaves. See Localization.
Which Lucide glyph — pick an id that already exists in the closed map (table below). If you need a new glyph, that is a Layer1 change, not a clone file.
Href of an existing slot — L3 hrefById on that slot id (same locale → string contract as pack items).
Mobile bar shape — first two manifest hrefs, center plus (add opportunity), then the rest. A pack that lists three hrefs plus overflow (and omits docs-or-admin) gets that bar from the same chrome slices. Overlay cannot add or hide those slots.
Do not ask an integrator to drop a custom sidebar component into components/navigation/ for brand icons.
Use Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.
Status: Layer1 chrome is a data manifest + closed icon map, not per-clone *-desktop-navigation.tsx variants. There is no config/navigation.config.ts. Packs overwrite lib/navigation/primary-nav.ts. Clones remap existing slot ids in lib/navigation/primary-nav-overlay.ts. Unknown icon ids render the users glyph.
Add a generic id to PRIMARY_NAV_ICONS on Layer1, then reference that id
Overlay a new mobile tab from the clone
Overlay cannot add, hide, or reorder slots — change the pack manifest
Copy desktop-sidebar.tsx onto the clone
Keep chrome on Layer1; remap iconById / labelKeysById / hrefById only
Architecture
Primary nav layers
home.preset does not select the menu. Overflow modules (the [...] catalog) live in lib/navigation/platform-menu.ts plus ring-config.navigation.platformMenu. Packs must not overwrite platform-menu.ts; vertical defaults belong in PACK.json.platformMenu and are copied onto the clone ring-config.
What you can change without forking chrome
Labels — next-intl keys on each slot (labelKeys). Pack pack.json and clone overlay can override leaves. See Localization.
Which Lucide glyph — pick an id that already exists in the closed map (table below). If you need a new glyph, that is a Layer1 change, not a clone file.
Href of an existing slot — L3 hrefById on that slot id (same locale → string contract as pack items).
Mobile bar shape — first two manifest hrefs, center plus (add opportunity), then the rest. A pack that lists three hrefs plus overflow (and omits docs-or-admin) gets that bar from the same chrome slices. Overlay cannot add or hide those slots.
Do not ask an integrator to drop a custom sidebar component into components/navigation/ for brand icons.
Add a generic glyph here before a pack or overlay references a new id. Do not overlay this file with clone-named icons.
Overlay socket (remap only)
Layer1 ships export const PRIMARY_NAV_OVERLAY = {} in lib/navigation/primary-nav-overlay.ts so webpack always resolves the import. A clone overwrites that file (not primary-nav.ts) with:
getPrimaryNavManifest() maps BASE_MANIFEST through applyHrefOverlay / applyMobileOverlay. Ids that are not in the pack/L1 manifest are ignored.
Mobile chrome
components/navigation/bottom-navigation.tsx renders navItems.slice(0, 2), then the center add control, then navItems.slice(2). Icon components come from getPrimaryNavIcon. Desktop rail: sidebar-rail.tsx and sidebar-synced-layout.tsx use the same helper.
Orchestrator: components/navigation/navigation.tsx dynamically imports desktop-sidebar.tsx and bottom-navigation.tsx. There is no public DesktopNavigation variant registry.
Recommended path
Need a new glyph? Land it on Layer1 first (ring/web/lib/navigation/primary-nav-icons.ts), then point the pack slot at the id. Cursor skill layer2-preset-operator owns pack primary-nav.ts; ringization-implementer owns L3 overlay remap. Neither should copy chrome.
Starter prompt (does not mutate until you approve):
Add generic Lucide id <id> to Layer1 lib/navigation/primary-nav-icons.ts before pack <pack> references it. Do not import vertical-named icons in chrome. Overlay may only remap existing slot ids in primary-nav-overlay.ts.
Manual path
1
Confirm the slot id exists in the composed primary-nav.ts manifest (mobile / desktop arrays). Overlay cannot invent ids.
2
If the icon id is missing from PRIMARY_NAV_ICONS, add the Lucide import and map entry on Layer1. Unknown ids silently fall back to users.
3
Set icon on the pack slot orPRIMARY_NAV_OVERLAY.iconById[slotId] on the clone. Keep platform-menu.ts on Layer1; put vertical overflow defaults in PACK.json.platformMenu.
Locale System
Next-step: locale env used by href builders and next-intl.
shopping-basket
ShoppingBasket
shopping-bag
ShoppingBag
building
Building2
newspaper
Newspaper
tv
Tv
sparkles
Sparkles
gamepad
Gamepad2
hexagon
Hexagon
map
Map
layout-grid
LayoutGrid
wallet
Wallet
bell
Bell
heart
Heart
shopping-cart
ShoppingCart
message-circle
MessageCircle
list-todo
ListTodo
settings
Settings
sun
Sun
orbit
Orbit
calendar
Calendar
scale
Scale
hash
Hash
type
Type
moon
Moon
compass
Compass
Add a generic glyph here before a pack or overlay references a new id. Do not overlay this file with clone-named icons.
Overlay socket (remap only)
Layer1 ships export const PRIMARY_NAV_OVERLAY = {} in lib/navigation/primary-nav-overlay.ts so webpack always resolves the import. A clone overwrites that file (not primary-nav.ts) with:
getPrimaryNavManifest() maps BASE_MANIFEST through applyHrefOverlay / applyMobileOverlay. Ids that are not in the pack/L1 manifest are ignored.
Mobile chrome
components/navigation/bottom-navigation.tsx renders navItems.slice(0, 2), then the center add control, then navItems.slice(2). Icon components come from getPrimaryNavIcon. Desktop rail: sidebar-rail.tsx and sidebar-synced-layout.tsx use the same helper.
Orchestrator: components/navigation/navigation.tsx dynamically imports desktop-sidebar.tsx and bottom-navigation.tsx. There is no public DesktopNavigation variant registry.
Recommended path
Need a new glyph? Land it on Layer1 first (ring/web/lib/navigation/primary-nav-icons.ts), then point the pack slot at the id. Cursor skill layer2-preset-operator owns pack primary-nav.ts; ringization-implementer owns L3 overlay remap. Neither should copy chrome.
Starter prompt (does not mutate until you approve):
Add generic Lucide id <id> to Layer1 lib/navigation/primary-nav-icons.ts before pack <pack> references it. Do not import vertical-named icons in chrome. Overlay may only remap existing slot ids in primary-nav-overlay.ts.
Manual path
1
Confirm the slot id exists in the composed primary-nav.ts manifest (mobile / desktop arrays). Overlay cannot invent ids.
2
If the icon id is missing from PRIMARY_NAV_ICONS, add the Lucide import and map entry on Layer1. Unknown ids silently fall back to users.
3
Set icon on the pack slot orPRIMARY_NAV_OVERLAY.iconById[slotId] on the clone. Keep platform-menu.ts on Layer1; put vertical overflow defaults in PACK.json.platformMenu.
Locale System
Next-step: locale env used by href builders and next-intl.
shopping-basket
ShoppingBasket
shopping-bag
ShoppingBag
building
Building2
newspaper
Newspaper
tv
Tv
sparkles
Sparkles
gamepad
Gamepad2
hexagon
Hexagon
map
Map
layout-grid
LayoutGrid
wallet
Wallet
bell
Bell
heart
Heart
shopping-cart
ShoppingCart
message-circle
MessageCircle
list-todo
ListTodo
settings
Settings
sun
Sun
orbit
Orbit
calendar
Calendar
scale
Scale
hash
Hash
type
Type
moon
Moon
compass
Compass
Add a generic glyph here before a pack or overlay references a new id. Do not overlay this file with clone-named icons.
Overlay socket (remap only)
Layer1 ships export const PRIMARY_NAV_OVERLAY = {} in lib/navigation/primary-nav-overlay.ts so webpack always resolves the import. A clone overwrites that file (not primary-nav.ts) with:
getPrimaryNavManifest() maps BASE_MANIFEST through applyHrefOverlay / applyMobileOverlay. Ids that are not in the pack/L1 manifest are ignored.
Mobile chrome
components/navigation/bottom-navigation.tsx renders navItems.slice(0, 2), then the center add control, then navItems.slice(2). Icon components come from getPrimaryNavIcon. Desktop rail: sidebar-rail.tsx and sidebar-synced-layout.tsx use the same helper.
Orchestrator: components/navigation/navigation.tsx dynamically imports desktop-sidebar.tsx and bottom-navigation.tsx. There is no public DesktopNavigation variant registry.
Recommended path
Need a new glyph? Land it on Layer1 first (ring/web/lib/navigation/primary-nav-icons.ts), then point the pack slot at the id. Cursor skill layer2-preset-operator owns pack primary-nav.ts; ringization-implementer owns L3 overlay remap. Neither should copy chrome.
Starter prompt (does not mutate until you approve):
Add generic Lucide id <id> to Layer1 lib/navigation/primary-nav-icons.ts before pack <pack> references it. Do not import vertical-named icons in chrome. Overlay may only remap existing slot ids in primary-nav-overlay.ts.
Manual path
1
Confirm the slot id exists in the composed primary-nav.ts manifest (mobile / desktop arrays). Overlay cannot invent ids.
2
If the icon id is missing from PRIMARY_NAV_ICONS, add the Lucide import and map entry on Layer1. Unknown ids silently fall back to users.
3
Set icon on the pack slot orPRIMARY_NAV_OVERLAY.iconById[slotId] on the clone. Keep platform-menu.ts on Layer1; put vertical overflow defaults in PACK.json.platformMenu.
Locale System
Next-step: locale env used by href builders and next-intl.