[{"data":1,"prerenderedAt":1520},["ShallowReactive",2],{"$fO8OuUPoSBqagnfSP342AzlMEea01aGDdB-HZzi4by4g":3},{"newThing":4,"project":5,"cycle":9,"sections":24,"threads":1444,"otherDocs":1445,"documents":1446,"images":1450,"archiveItems":1495,"links":1514},"NavVerticalSubmenu: a sidebar row that owns child rows and opens them by URL. In qdash, THE FLEET moves up to second and Inventory lists its 9 listing pages (italic, med 13, 1px gap on a stroke-strong rail) on every \u002Finventory page",{"id":6,"label":7,"liveBase":8},"design","Design",null,{"id":10,"num":11,"dir":12,"name":13,"title":14,"focus":15,"status":16,"statusNote":8,"created":17,"completed":8,"mode":18,"report":8,"recordless":19,"thumbnail":20,"imageCount":21,"artifactCount":22,"lastActivity":17,"hasPickup":19,"hasInitialPrompt":23},"c98",98,"c98.nav-submenu","nav-submenu","Nav Submenu","A layer nav item that owns child items and discloses them by URL. First use: THE FLEET › Inventory in the qcontrol sidebar shows its 9 listing pages whenever `\u002Finventory` is in the URL.","archived","2026-09-26","evolution. This adds one member to the existing `NavVertical` \u002F `NavVerticalItem` family; it does not start a new nav system.",false,"\u002Fcycles\u002Fdesign\u002Fc98-qdash-inventory.png",7,2,true,[25,48,147,377,1136],{"key":26,"title":27,"empty":19,"ast":28},"why","Why",{"type":29,"children":30},"root",[31],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,46],{"type":37,"value":38},"text","Inventory has grown into a hub with 9 listing pages under it: Harnesses, Endpoints, MCP Servers, Models, Providers, Sessions, Skills, Tools, Repos & Workspaces. The qcontrol sidebar lists pages flat, so today those listings are only reachable from the sidebar through the WORKING dev toggle. The sidebar should say where you are without anyone clicking to expand anything. When you're anywhere under ",{"type":32,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":37,"value":45},"\u002Finventory",{"type":37,"value":47},", the Inventory item should open to show its children.",{"key":49,"title":50,"empty":19,"ast":51},"objective","Objective",{"type":29,"children":52},[53,113,118],{"type":32,"tag":54,"props":55,"children":56},"ul",{},[57,85,95],{"type":32,"tag":58,"props":59,"children":60},"li",{},[61,67,69,75,77,83],{"type":32,"tag":62,"props":63,"children":64},"strong",{},[65],{"type":37,"value":66},"Layer:",{"type":37,"value":68}," ",{"type":32,"tag":40,"props":70,"children":72},{"className":71},[],[73],{"type":37,"value":74},"NavVerticalSubmenu",{"type":37,"value":76}," (new) + a non-breaking ",{"type":32,"tag":40,"props":78,"children":80},{"className":79},[],[81],{"type":37,"value":82},"NavVerticalItem",{"type":37,"value":84}," change. Children inside a submenu take the sub treatment: Inter italic (med 13 since 2026-09-26, first specced as bold), tighter rows, a hairline rail at the parent's left edge.",{"type":32,"tag":58,"props":86,"children":87},{},[88,93],{"type":32,"tag":62,"props":89,"children":90},{},[91],{"type":37,"value":92},"Design site:",{"type":37,"value":94}," demo + registry entry with full prop coverage and empty \u002F minimal \u002F typical \u002F overflow scenarios.",{"type":32,"tag":58,"props":96,"children":97},{},[98,103,105,111],{"type":32,"tag":62,"props":99,"children":100},{},[101],{"type":37,"value":102},"qdash:",{"type":37,"value":104}," the Inventory item in ",{"type":32,"tag":40,"props":106,"children":108},{"className":107},[],[109],{"type":37,"value":110},"AppSidebar.vue",{"type":37,"value":112}," becomes a submenu.",{"type":32,"tag":33,"props":114,"children":115},{},[116],{"type":37,"value":117},"Done means:",{"type":32,"tag":54,"props":119,"children":120},{},[121,142],{"type":32,"tag":58,"props":122,"children":123},{},[124,126,132,134,140],{"type":37,"value":125},"The qdash sidebar matches ",{"type":32,"tag":127,"props":128,"children":130},"a",{"href":129},"reference.png",[131],{"type":37,"value":129},{"type":37,"value":133}," on every ",{"type":32,"tag":40,"props":135,"children":137},{"className":136},[],[138],{"type":37,"value":139},"\u002Finventory*",{"type":37,"value":141}," page and stays collapsed elsewhere.",{"type":32,"tag":58,"props":143,"children":144},{},[145],{"type":37,"value":146},"The demo proves every form of the component.",{"key":148,"title":149,"empty":19,"ast":150},"scope","Scope",{"type":29,"children":151},[152,218,237,244,342,347],{"type":32,"tag":54,"props":153,"children":154},{},[155,182,199],{"type":32,"tag":58,"props":156,"children":157},{},[158,164,166,172,174,180],{"type":32,"tag":40,"props":159,"children":161},{"className":160},[],[162],{"type":37,"value":163},"q-nuxt-layer\u002Fcomponents\u002Fnav\u002FVerticalSubmenu.vue",{"type":37,"value":165}," (new), ",{"type":32,"tag":40,"props":167,"children":169},{"className":168},[],[170],{"type":37,"value":171},"nav\u002FVerticalItem.vue",{"type":37,"value":173}," (inject + sub styling), layer ",{"type":32,"tag":40,"props":175,"children":177},{"className":176},[],[178],{"type":37,"value":179},"CLAUDE.md",{"type":37,"value":181}," Nav table",{"type":32,"tag":58,"props":183,"children":184},{},[185,191,193],{"type":32,"tag":40,"props":186,"children":188},{"className":187},[],[189],{"type":37,"value":190},"design\u002Fapp\u002Fpages\u002Fcomponents\u002F_demos\u002FNavVerticalSubmenu.vue",{"type":37,"value":192},", ",{"type":32,"tag":40,"props":194,"children":196},{"className":195},[],[197],{"type":37,"value":198},"design\u002Fapp\u002Fdata\u002Fcomponent-registry.ts",{"type":32,"tag":58,"props":200,"children":201},{},[202,208,210,216],{"type":32,"tag":40,"props":203,"children":205},{"className":204},[],[206],{"type":37,"value":207},"qcontrol\u002Fcrates\u002Fqdash\u002Fui\u002Fapp\u002Fcomponents\u002FAppSidebar.vue",{"type":37,"value":209}," (children derived from ",{"type":32,"tag":40,"props":211,"children":213},{"className":212},[],[214],{"type":37,"value":215},"WORKING_LISTINGS",{"type":37,"value":217},")",{"type":32,"tag":33,"props":219,"children":220},{},[221,223,229,231],{"type":37,"value":222},"Plan: ",{"type":32,"tag":127,"props":224,"children":226},{"href":225},"\u002Fcycles\u002Fdesign\u002Fc98\u002Fdoc\u002Fplan",[227],{"type":37,"value":228},"plan.md",{"type":37,"value":230}," · Prompt: ",{"type":32,"tag":127,"props":232,"children":234},{"href":233},"\u002Fcycles\u002Fdesign\u002Fc98\u002Fdoc\u002Finitial-prompt",[235],{"type":37,"value":236},"initial-prompt.md",{"type":32,"tag":238,"props":239,"children":241},"h3",{"id":240},"decisions-mark-2026-09-26",[242],{"type":37,"value":243},"Decisions (Mark, 2026-09-26)",{"type":32,"tag":245,"props":246,"children":247},"ol",{},[248,305,322,332],{"type":32,"tag":58,"props":249,"children":250},{},[251,256,257,263,265,271,273,279,281,287,289,295,297,303],{"type":32,"tag":62,"props":252,"children":253},{},[254],{"type":37,"value":255},"URL matching lives in the component.",{"type":37,"value":68},{"type":32,"tag":40,"props":258,"children":260},{"className":259},[],[261],{"type":37,"value":262},"match",{"type":37,"value":264}," takes path prefixes and defaults to ",{"type":32,"tag":40,"props":266,"children":268},{"className":267},[],[269],{"type":37,"value":270},"to",{"type":37,"value":272},", and ",{"type":32,"tag":40,"props":274,"children":276},{"className":275},[],[277],{"type":37,"value":278},"v-model:open",{"type":37,"value":280}," overrides it. This follows ",{"type":32,"tag":40,"props":282,"children":284},{"className":283},[],[285],{"type":37,"value":286},"IconNavItem",{"type":37,"value":288},"'s ",{"type":32,"tag":40,"props":290,"children":292},{"className":291},[],[293],{"type":37,"value":294},"basePath",{"type":37,"value":296}," precedent. Row ",{"type":32,"tag":298,"props":299,"children":300},"em",{},[301],{"type":37,"value":302},"active",{"type":37,"value":304}," stays caller-controlled.",{"type":32,"tag":58,"props":306,"children":307},{},[308,313,315,320],{"type":32,"tag":62,"props":309,"children":310},{},[311],{"type":37,"value":312},"The parent row stays default ink on child pages.",{"type":37,"value":314}," It is grape only on ",{"type":32,"tag":40,"props":316,"children":318},{"className":317},[],[319],{"type":37,"value":45},{"type":37,"value":321}," itself.",{"type":32,"tag":58,"props":323,"children":324},{},[325,330],{"type":32,"tag":62,"props":326,"children":327},{},[328],{"type":37,"value":329},"Children prefix-match",{"type":37,"value":331},", so Models stays lit on its detail pages. Top-level items keep exact match.",{"type":32,"tag":58,"props":333,"children":334},{},[335,340],{"type":32,"tag":62,"props":336,"children":337},{},[338],{"type":37,"value":339},"WORKING stays as is.",{"type":37,"value":341}," The 9 listings show in both places for now.",{"type":32,"tag":33,"props":343,"children":344},{},[345],{"type":37,"value":346},"Defaults, unless Mark objects:",{"type":32,"tag":54,"props":348,"children":349},{},[350,362,367,372],{"type":32,"tag":58,"props":351,"children":352},{},[353,355,360],{"type":37,"value":354},"The name is ",{"type":32,"tag":40,"props":356,"children":358},{"className":357},[],[359],{"type":37,"value":74},{"type":37,"value":361},".",{"type":32,"tag":58,"props":363,"children":364},{},[365],{"type":37,"value":366},"No chevron.",{"type":32,"tag":58,"props":368,"children":369},{},[370],{"type":37,"value":371},"A URL-matched list can't be click-collapsed.",{"type":32,"tag":58,"props":373,"children":374},{},[375],{"type":37,"value":376},"It opens instantly, with no animation.",{"key":378,"title":379,"empty":19,"ast":380},"key-changes","Key Changes",{"type":29,"children":381},[382],{"type":32,"tag":54,"props":383,"children":384},{},[385,395,643,745,815,925,1095,1120],{"type":32,"tag":58,"props":386,"children":387},{},[388,393],{"type":32,"tag":62,"props":389,"children":390},{},[391],{"type":37,"value":392},"Kick-off (2026-09-26):",{"type":37,"value":394}," plan drafted, four decisions settled, cycle activated.",{"type":32,"tag":58,"props":396,"children":397},{},[398,403],{"type":32,"tag":62,"props":399,"children":400},{},[401],{"type":37,"value":402},"Layer + demo (2026-09-26):",{"type":32,"tag":54,"props":404,"children":405},{},[406,477,511,556,594],{"type":32,"tag":58,"props":407,"children":408},{},[409,417,419,424,426,431,432,438,440,446,448,454,456,461,463,468,470,475],{"type":32,"tag":62,"props":410,"children":411},{},[412],{"type":32,"tag":40,"props":413,"children":415},{"className":414},[],[416],{"type":37,"value":74},{"type":37,"value":418}," (",{"type":32,"tag":40,"props":420,"children":422},{"className":421},[],[423],{"type":37,"value":163},{"type":37,"value":425},"): the parent row is a ",{"type":32,"tag":40,"props":427,"children":429},{"className":428},[],[430],{"type":37,"value":82},{"type":37,"value":418},{"type":32,"tag":40,"props":433,"children":435},{"className":434},[],[436],{"type":37,"value":437},":sub=\"false\"",{"type":37,"value":439},") or a toggle ",{"type":32,"tag":40,"props":441,"children":443},{"className":442},[],[444],{"type":37,"value":445},"\u003Cbutton>",{"type":37,"value":447},", followed by a ",{"type":32,"tag":40,"props":449,"children":451},{"className":450},[],[452],{"type":37,"value":453},"role=\"group\"",{"type":37,"value":455}," list. Disclosure is segment-aware prefix ",{"type":32,"tag":40,"props":457,"children":459},{"className":458},[],[460],{"type":37,"value":262},{"type":37,"value":462}," (defaults to ",{"type":32,"tag":40,"props":464,"children":466},{"className":465},[],[467],{"type":37,"value":270},{"type":37,"value":469},"), with ",{"type":32,"tag":40,"props":471,"children":473},{"className":472},[],[474],{"type":37,"value":278},{"type":37,"value":476}," as the override.",{"type":32,"tag":58,"props":478,"children":479},{},[480,485,487,493,495,501,503,509],{"type":32,"tag":62,"props":481,"children":482},{},[483],{"type":37,"value":484},"Rail:",{"type":37,"value":486}," a ",{"type":32,"tag":40,"props":488,"children":490},{"className":489},[],[491],{"type":37,"value":492},"::before",{"type":37,"value":494}," pseudo, so the ",{"type":32,"tag":40,"props":496,"children":498},{"className":497},[],[499],{"type":37,"value":500},"top-2 bottom-2",{"type":37,"value":502}," inset doesn't push the children down. It uses ",{"type":32,"tag":40,"props":504,"children":506},{"className":505},[],[507],{"type":37,"value":508},"stroke-strong",{"type":37,"value":510},", which matches the reference pixel for pixel (rgb 212, the same stroke as the section title rule).",{"type":32,"tag":58,"props":512,"children":513},{},[514,522,524,530,532,538,540,546,548,554],{"type":32,"tag":62,"props":515,"children":516},{},[517],{"type":32,"tag":40,"props":518,"children":520},{"className":519},[],[521],{"type":37,"value":82},{"type":37,"value":523}," gains ",{"type":32,"tag":40,"props":525,"children":527},{"className":526},[],[528],{"type":37,"value":529},"sub",{"type":37,"value":531}," (default ",{"type":32,"tag":40,"props":533,"children":535},{"className":534},[],[536],{"type":37,"value":537},"undefined",{"type":37,"value":539},", which inherits via ",{"type":32,"tag":40,"props":541,"children":543},{"className":542},[],[544],{"type":37,"value":545},"inject('navSubmenu')",{"type":37,"value":547},"): bold italic, ",{"type":32,"tag":40,"props":549,"children":551},{"className":550},[],[552],{"type":37,"value":553},"py-0.5",{"type":37,"value":555},". The measured result is 15px\u002F700 italic, 26px rows against the parent's 30px. The reference pitch is ~27.5px.",{"type":32,"tag":58,"props":557,"children":558},{},[559,564,565,571,573,578,580,585,587,592],{"type":32,"tag":62,"props":560,"children":561},{},[562],{"type":37,"value":563},"Demo",{"type":37,"value":68},{"type":32,"tag":40,"props":566,"children":568},{"className":567},[],[569],{"type":37,"value":570},"_demos\u002FNavVerticalSubmenu.vue",{"type":37,"value":572},": interactive sidebar + empty \u002F minimal \u002F typical \u002F unmatched \u002F button \u002F controlled \u002F overflow scenarios. Registry entry added; the ",{"type":32,"tag":40,"props":574,"children":576},{"className":575},[],[577],{"type":37,"value":82},{"type":37,"value":579}," entry and demo gain ",{"type":32,"tag":40,"props":581,"children":583},{"className":582},[],[584],{"type":37,"value":529},{"type":37,"value":586},". Layer ",{"type":32,"tag":40,"props":588,"children":590},{"className":589},[],[591],{"type":37,"value":179},{"type":37,"value":593},": Nav table rows + an unreleased migration note.",{"type":32,"tag":58,"props":595,"children":596},{},[597,602,604,610,612,618,620,626,628,634,636,642],{"type":32,"tag":62,"props":598,"children":599},{},[600],{"type":37,"value":601},"Gotcha:",{"type":37,"value":603}," the button's first class name ",{"type":32,"tag":40,"props":605,"children":607},{"className":606},[],[608],{"type":37,"value":609},"._toggle",{"type":37,"value":611}," collided with ",{"type":32,"tag":40,"props":613,"children":615},{"className":614},[],[616],{"type":37,"value":617},"UxToggle",{"type":37,"value":619},"'s unscoped ",{"type":32,"tag":40,"props":621,"children":623},{"className":622},[],[624],{"type":37,"value":625},"._toggle::after",{"type":37,"value":627}," (a 2px white dot). It was renamed ",{"type":32,"tag":40,"props":629,"children":631},{"className":630},[],[632],{"type":37,"value":633},"._submenu-toggle",{"type":37,"value":635},", and the rail class ",{"type":32,"tag":40,"props":637,"children":639},{"className":638},[],[640],{"type":37,"value":641},"._submenu-rail",{"type":37,"value":361},{"type":32,"tag":58,"props":644,"children":645},{},[646,651,652,657,658,664,665,671,673,679,681,687,689],{"type":32,"tag":62,"props":647,"children":648},{},[649],{"type":37,"value":650},"Sub weight + size props (2026-09-26, Mark):",{"type":37,"value":68},{"type":32,"tag":40,"props":653,"children":655},{"className":654},[],[656],{"type":37,"value":74},{"type":37,"value":523},{"type":32,"tag":40,"props":659,"children":661},{"className":660},[],[662],{"type":37,"value":663},"subWeight",{"type":37,"value":418},{"type":32,"tag":40,"props":666,"children":668},{"className":667},[],[669],{"type":37,"value":670},"reg | med | semi | bold | exbold | black",{"type":37,"value":672},", default ",{"type":32,"tag":40,"props":674,"children":676},{"className":675},[],[677],{"type":37,"value":678},"bold",{"type":37,"value":680},") and ",{"type":32,"tag":40,"props":682,"children":684},{"className":683},[],[685],{"type":37,"value":686},"subSize",{"type":37,"value":688}," (px on the type scale 11–16, default 15).\n",{"type":32,"tag":54,"props":690,"children":691},{},[692,725,735],{"type":32,"tag":58,"props":693,"children":694},{},[695,700,702,708,710,716,718,723],{"type":32,"tag":62,"props":696,"children":697},{},[698],{"type":37,"value":699},"How it reaches the children:",{"type":37,"value":701}," the submenu now provides ",{"type":32,"tag":40,"props":703,"children":705},{"className":704},[],[706],{"type":37,"value":707},"{ weight, size }",{"type":37,"value":709}," instead of ",{"type":32,"tag":40,"props":711,"children":713},{"className":712},[],[714],{"type":37,"value":715},"true",{"type":37,"value":717},". ",{"type":32,"tag":40,"props":719,"children":721},{"className":720},[],[722],{"type":37,"value":82},{"type":37,"value":724}," maps them through literal class tables, so Tailwind sees every class; an off-scale value falls back to bold 15.",{"type":32,"tag":58,"props":726,"children":727},{},[728,733],{"type":32,"tag":62,"props":729,"children":730},{},[731],{"type":37,"value":732},"Demo:",{"type":37,"value":734}," a weight dropdown + a 11–16 size slider. All six weights and six sizes verified in the browser. The parent row stays semi 15.",{"type":32,"tag":58,"props":736,"children":737},{},[738,743],{"type":32,"tag":62,"props":739,"children":740},{},[741],{"type":37,"value":742},"Consistency:",{"type":37,"value":744}," named weight steps + scale-bound sizes keep it inside \"size is constrained\", with no arbitrary px.",{"type":32,"tag":58,"props":746,"children":747},{},[748,761,763,768,770],{"type":32,"tag":62,"props":749,"children":750},{},[751,753,759],{"type":37,"value":752},"Provisional ",{"type":32,"tag":40,"props":754,"children":756},{"className":755},[],[757],{"type":37,"value":758},"subGap",{"type":37,"value":760}," (2026-09-26, Mark):",{"type":37,"value":762}," px of space between child rows (default 4, the old ",{"type":32,"tag":40,"props":764,"children":766},{"className":765},[],[767],{"type":37,"value":553},{"type":37,"value":769},"), split into top\u002Fbottom padding by inline style so the click area stays contiguous. Demo slider 0–16.\n",{"type":32,"tag":54,"props":771,"children":772},{},[773,791],{"type":32,"tag":58,"props":774,"children":775},{},[776,781,783,789],{"type":32,"tag":62,"props":777,"children":778},{},[779],{"type":37,"value":780},"Measured pitch",{"type":37,"value":782}," = line-height + gap − 2 (the link's ",{"type":32,"tag":40,"props":784,"children":786},{"className":785},[],[787],{"type":37,"value":788},"-mb-[2px]",{"type":37,"value":790},"): 0 → 22px, 4 → 26px, 8 → 30px, 16 → 38px at 15px text. The reference's ~27.5px pitch sits at a gap of about 5–6.",{"type":32,"tag":58,"props":792,"children":793},{},[794,799,801,806,807,813],{"type":32,"tag":62,"props":795,"children":796},{},[797],{"type":37,"value":798},"To be removed once dialed:",{"type":37,"value":800}," bake the chosen value into ",{"type":32,"tag":40,"props":802,"children":804},{"className":803},[],[805],{"type":37,"value":82},{"type":37,"value":288},{"type":32,"tag":40,"props":808,"children":810},{"className":809},[],[811],{"type":37,"value":812},"SUB",{"type":37,"value":814}," constant and drop the prop, the provide field and the demo slider.",{"type":32,"tag":58,"props":816,"children":817},{},[818,823,824,829,830,835,836,841,842,847,848,853,854,859,861],{"type":32,"tag":62,"props":819,"children":820},{},[821],{"type":37,"value":822},"Sub defaults dialed (2026-09-26, Mark, from the demo controls):",{"type":37,"value":68},{"type":32,"tag":40,"props":825,"children":827},{"className":826},[],[828],{"type":37,"value":663},{"type":37,"value":68},{"type":32,"tag":62,"props":831,"children":832},{},[833],{"type":37,"value":834},"med",{"type":37,"value":192},{"type":32,"tag":40,"props":837,"children":839},{"className":838},[],[840],{"type":37,"value":686},{"type":37,"value":68},{"type":32,"tag":62,"props":843,"children":844},{},[845],{"type":37,"value":846},"13",{"type":37,"value":192},{"type":32,"tag":40,"props":849,"children":851},{"className":850},[],[852],{"type":37,"value":758},{"type":37,"value":68},{"type":32,"tag":62,"props":855,"children":856},{},[857],{"type":37,"value":858},"1",{"type":37,"value":860}," are now the defaults (were bold \u002F 15 \u002F 4).\n",{"type":32,"tag":54,"props":862,"children":863},{},[864,874],{"type":32,"tag":58,"props":865,"children":866},{},[867,872],{"type":32,"tag":62,"props":868,"children":869},{},[870],{"type":37,"value":871},"Measured:",{"type":37,"value":873}," children render 500 13px italic with 0.5px top\u002Fbottom padding, 23px rows. The parent row is unchanged at semi 15.",{"type":32,"tag":58,"props":875,"children":876},{},[877,882,883,888,889,894,896,901,903,909,911,916,918,923],{"type":32,"tag":62,"props":878,"children":879},{},[880],{"type":37,"value":881},"Scope:",{"type":37,"value":68},{"type":32,"tag":40,"props":884,"children":886},{"className":885},[],[887],{"type":37,"value":82},{"type":37,"value":288},{"type":32,"tag":40,"props":890,"children":892},{"className":891},[],[893],{"type":37,"value":812},{"type":37,"value":895}," constant holds the same values, so ",{"type":32,"tag":40,"props":897,"children":899},{"className":898},[],[900],{"type":37,"value":529},{"type":37,"value":902}," forced outside a submenu matches, and the scoped ",{"type":32,"tag":40,"props":904,"children":906},{"className":905},[],[907],{"type":37,"value":908},".sub py-0.5",{"type":37,"value":910}," rule is gone. ",{"type":32,"tag":40,"props":912,"children":914},{"className":913},[],[915],{"type":37,"value":758},{"type":37,"value":917}," stays provisional until the next look; if 1 holds, bake it into ",{"type":32,"tag":40,"props":919,"children":921},{"className":920},[],[922],{"type":37,"value":812},{"type":37,"value":924}," and drop the prop.",{"type":32,"tag":58,"props":926,"children":927},{},[928,933,935,940,942,948,950,955,957,962,964,969,971,977,979,984,986],{"type":32,"tag":62,"props":929,"children":930},{},[931],{"type":37,"value":932},"qdash wiring (2026-09-26):",{"type":37,"value":934}," in ",{"type":32,"tag":40,"props":936,"children":938},{"className":937},[],[939],{"type":37,"value":207},{"type":37,"value":941},", a nav item listed in a ",{"type":32,"tag":40,"props":943,"children":945},{"className":944},[],[946],{"type":37,"value":947},"SUBMENUS",{"type":37,"value":949}," map renders as a ",{"type":32,"tag":40,"props":951,"children":953},{"className":952},[],[954],{"type":37,"value":74},{"type":37,"value":956},". Today that is only ",{"type":32,"tag":40,"props":958,"children":960},{"className":959},[],[961],{"type":37,"value":45},{"type":37,"value":963},", whose children are ",{"type":32,"tag":40,"props":965,"children":967},{"className":966},[],[968],{"type":37,"value":215},{"type":37,"value":970}," filtered to ",{"type":32,"tag":40,"props":972,"children":974},{"className":973},[],[975],{"type":37,"value":976},"\u002Finventory\u002F*",{"type":37,"value":978},", so they're derived rather than typed a second time. Everything else renders as a ",{"type":32,"tag":40,"props":980,"children":982},{"className":981},[],[983],{"type":37,"value":82},{"type":37,"value":985},", as before.\n",{"type":32,"tag":54,"props":987,"children":988},{},[989,1015],{"type":32,"tag":58,"props":990,"children":991},{},[992,997,999,1005,1007,1013],{"type":32,"tag":62,"props":993,"children":994},{},[995],{"type":37,"value":996},"Active rules:",{"type":37,"value":998}," new ",{"type":32,"tag":40,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":37,"value":1004},"isSubActive",{"type":37,"value":1006}," is a segment-aware prefix match for children. The top-level ",{"type":32,"tag":40,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":37,"value":1012},"isActive",{"type":37,"value":1014}," stays exact. WORKING is untouched.",{"type":32,"tag":58,"props":1016,"children":1017},{},[1018,1023,1025],{"type":32,"tag":62,"props":1019,"children":1020},{},[1021],{"type":37,"value":1022},"Verified on the live :3030 server",{"type":37,"value":1024}," (NUXT_LOCAL_LAYER):\n",{"type":32,"tag":54,"props":1026,"children":1027},{},[1028,1047,1057,1068,1079,1084],{"type":32,"tag":58,"props":1029,"children":1030},{},[1031,1037,1039,1045],{"type":32,"tag":40,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":37,"value":1036},"\u002F",{"type":37,"value":1038}," and ",{"type":32,"tag":40,"props":1040,"children":1042},{"className":1041},[],[1043],{"type":37,"value":1044},"\u002Fusers",{"type":37,"value":1046},": collapsed.",{"type":32,"tag":58,"props":1048,"children":1049},{},[1050,1055],{"type":32,"tag":40,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":37,"value":45},{"type":37,"value":1056},": open, parent grape, no child lit.",{"type":32,"tag":58,"props":1058,"children":1059},{},[1060,1066],{"type":32,"tag":40,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":37,"value":1065},"\u002Finventory\u002Fmodels\u002Fdetail?id=…",{"type":37,"value":1067},": open, parent ink, Models lit.",{"type":32,"tag":58,"props":1069,"children":1070},{},[1071,1077],{"type":32,"tag":40,"props":1072,"children":1074},{"className":1073},[],[1075],{"type":37,"value":1076},"\u002Finventory\u002Fworkspaces",{"type":37,"value":1078},": Repos & Workspaces lit.",{"type":32,"tag":58,"props":1080,"children":1081},{},[1082],{"type":37,"value":1083},"Children render 500 13px italic, 23px rows, rail rgb 212.",{"type":32,"tag":58,"props":1085,"children":1086},{},[1087,1093],{"type":32,"tag":40,"props":1088,"children":1090},{"className":1089},[],[1091],{"type":37,"value":1092},"working-nav.test.ts",{"type":37,"value":1094}," passes (6\u002F6).",{"type":32,"tag":58,"props":1096,"children":1097},{},[1098,1103,1105,1111,1113,1118],{"type":32,"tag":62,"props":1099,"children":1100},{},[1101],{"type":37,"value":1102},"THE FLEET moved up (2026-09-26, Mark):",{"type":37,"value":1104}," qdash ",{"type":32,"tag":40,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":37,"value":1110},"NAV",{"type":37,"value":1112}," now reads WHERE ARE WE → THE FLEET → WHAT GOOD LOOKS LIKE → ACT → PROVE. The groups still follow the Rust dashboard's 5-section IA, but the order now diverges from it; ",{"type":32,"tag":40,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":37,"value":110},{"type":37,"value":1119}," notes this. Verified on :3030.",{"type":32,"tag":58,"props":1121,"children":1122},{},[1123,1128,1129,1134],{"type":32,"tag":62,"props":1124,"children":1125},{},[1126],{"type":37,"value":1127},"Inventory page title (2026-09-26, Mark):",{"type":37,"value":68},{"type":32,"tag":40,"props":1130,"children":1132},{"className":1131},[],[1133],{"type":37,"value":45},{"type":37,"value":1135}," PageHeader \"Harness Inventory\" → \"Inventory\", matching the nav label. That was its only use of the old title in qdash.",{"key":1137,"title":1138,"empty":19,"ast":1139},"outcome","Outcome",{"type":29,"children":1140},[1141,1158],{"type":32,"tag":33,"props":1142,"children":1143},{},[1144,1149,1151,1156],{"type":32,"tag":62,"props":1145,"children":1146},{},[1147],{"type":37,"value":1148},"Completed 2026-09-26.",{"type":37,"value":1150}," The qcontrol sidebar now shows where you are. On every ",{"type":32,"tag":40,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":37,"value":45},{"type":37,"value":1157}," page, Inventory opens to its nine listings: Harnesses, Endpoints, MCP Servers, Models, Providers, Sessions, Skills, Tools, Repos & Workspaces. The current listing is lit, including on its detail pages. Elsewhere the submenu collapses to one row. THE FLEET moved up to second in the rail, and the Inventory page is titled \"Inventory\".",{"type":32,"tag":54,"props":1159,"children":1160},{},[1161,1226,1250,1326],{"type":32,"tag":58,"props":1162,"children":1163},{},[1164,1169,1171],{"type":32,"tag":62,"props":1165,"children":1166},{},[1167],{"type":37,"value":1168},"Layer",{"type":37,"value":1170}," (unreleased; rides the next bump with the queued 0.9.22 work):\n",{"type":32,"tag":54,"props":1172,"children":1173},{},[1174,1210],{"type":32,"tag":58,"props":1175,"children":1176},{},[1177,1182,1184,1189,1190,1195,1197,1202,1204,1209],{"type":32,"tag":40,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":37,"value":74},{"type":37,"value":1183},": parent row + disclosed children; route-aware ",{"type":32,"tag":40,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":37,"value":262},{"type":37,"value":462},{"type":32,"tag":40,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":37,"value":270},{"type":37,"value":1196},", segment-aware) + ",{"type":32,"tag":40,"props":1198,"children":1200},{"className":1199},[],[1201],{"type":37,"value":278},{"type":37,"value":1203},"; a button form when there's no ",{"type":32,"tag":40,"props":1205,"children":1207},{"className":1206},[],[1208],{"type":37,"value":270},{"type":37,"value":361},{"type":32,"tag":58,"props":1211,"children":1212},{},[1213,1218,1219,1224],{"type":32,"tag":40,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":37,"value":82},{"type":37,"value":523},{"type":32,"tag":40,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":37,"value":529},{"type":37,"value":1225},", inherited by injection. Existing call sites are unchanged.",{"type":32,"tag":58,"props":1227,"children":1228},{},[1229,1233,1235,1241,1243,1249],{"type":32,"tag":62,"props":1230,"children":1231},{},[1232],{"type":37,"value":92},{"type":37,"value":1234}," demo with DevCanvas controls and seven scenarios; registry entry; archive entry ",{"type":32,"tag":40,"props":1236,"children":1238},{"className":1237},[],[1239],{"type":37,"value":1240},"content\u002Farchive\u002F2026-q3\u002F2026-09-26-c98-nav-submenu.md",{"type":37,"value":1242},"; six captures in ",{"type":32,"tag":40,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":37,"value":1248},"public\u002Fcycles\u002Fdesign\u002Fc98-*",{"type":37,"value":361},{"type":32,"tag":58,"props":1251,"children":1252},{},[1253,1258],{"type":32,"tag":62,"props":1254,"children":1255},{},[1256],{"type":37,"value":1257},"Learnings:",{"type":32,"tag":54,"props":1259,"children":1260},{},[1261,1271,1296],{"type":32,"tag":58,"props":1262,"children":1263},{},[1264,1269],{"type":32,"tag":62,"props":1265,"children":1266},{},[1267],{"type":37,"value":1268},"Tune in the demo.",{"type":37,"value":1270}," Exposing weight \u002F size \u002F gap as props turned \"a bit less space\" into a two-minute session on the demo's controls. The dialed values (med 13, 1px) became the defaults. Worth repeating for any styling question the reference doesn't settle.",{"type":32,"tag":58,"props":1272,"children":1273},{},[1274,1279,1281,1286,1288,1294],{"type":32,"tag":62,"props":1275,"children":1276},{},[1277],{"type":37,"value":1278},"Measure the reference.",{"type":37,"value":1280}," Sampling the reference PNG (PIL) settled the rail colour exactly: it is ",{"type":32,"tag":40,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":37,"value":508},{"type":37,"value":1287},", the section title rule, not ",{"type":32,"tag":40,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":37,"value":1293},"stroke",{"type":37,"value":1295},". Size and pitch came from the same sampling, not from eyeballing.",{"type":32,"tag":58,"props":1297,"children":1298},{},[1299,1304,1306,1311,1313,1318,1319,1324],{"type":32,"tag":62,"props":1300,"children":1301},{},[1302],{"type":37,"value":1303},"Layer class names can collide.",{"type":37,"value":1305}," An underscore-prefixed class in a layer component can hit another component's ",{"type":32,"tag":298,"props":1307,"children":1308},{},[1309],{"type":37,"value":1310},"unscoped",{"type":37,"value":1312}," rule (",{"type":32,"tag":40,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":37,"value":617},{"type":37,"value":288},{"type":32,"tag":40,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":37,"value":625},{"type":37,"value":1325},"). Prefix with the component's own name.",{"type":32,"tag":58,"props":1327,"children":1328},{},[1329,1334],{"type":32,"tag":62,"props":1330,"children":1331},{},[1332],{"type":37,"value":1333},"Carried forward:",{"type":32,"tag":54,"props":1335,"children":1336},{},[1337,1362,1375,1421,1439],{"type":32,"tag":58,"props":1338,"children":1339},{},[1340,1342,1347,1349,1354,1355,1360],{"type":37,"value":1341},"Remove the provisional ",{"type":32,"tag":40,"props":1343,"children":1345},{"className":1344},[],[1346],{"type":37,"value":758},{"type":37,"value":1348}," once 1px holds: bake it into ",{"type":32,"tag":40,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":37,"value":82},{"type":37,"value":288},{"type":32,"tag":40,"props":1356,"children":1358},{"className":1357},[],[1359],{"type":37,"value":812},{"type":37,"value":1361}," and drop the prop and slider.",{"type":32,"tag":58,"props":1363,"children":1364},{},[1365,1367,1373],{"type":37,"value":1366},"Release the layer; qdash's committed ",{"type":32,"tag":40,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":37,"value":1372},"dist\u002F",{"type":37,"value":1374}," rebuilds on that bump.",{"type":32,"tag":58,"props":1376,"children":1377},{},[1378,1383,1385,1390,1391,1397,1399,1405,1407,1412,1414,1419],{"type":32,"tag":62,"props":1379,"children":1380},{},[1381],{"type":37,"value":1382},"qcontrol is uncommitted (on purpose).",{"type":37,"value":1384}," The qdash edits (",{"type":32,"tag":40,"props":1386,"children":1388},{"className":1387},[],[1389],{"type":37,"value":110},{"type":37,"value":192},{"type":32,"tag":40,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":37,"value":1396},"pages\u002Finventory\u002Findex.vue",{"type":37,"value":1398},") sit in files carrying the uncommitted c92 harness-rename work, on ",{"type":32,"tag":40,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":37,"value":1404},"feat\u002Fnew-pages",{"type":37,"value":1406},". The THE FLEET block that moved is the renamed one, and ",{"type":32,"tag":40,"props":1408,"children":1410},{"className":1409},[],[1411],{"type":37,"value":1004},{"type":37,"value":1413}," sits against the rewritten ",{"type":32,"tag":40,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":37,"value":1012},{"type":37,"value":1420},". Another session also has files staged in that index. They commit together when that work does.",{"type":32,"tag":58,"props":1422,"children":1423},{},[1424,1426,1431,1433,1438],{"type":37,"value":1425},"Other sections could take submenus through the same ",{"type":32,"tag":40,"props":1427,"children":1429},{"className":1428},[],[1430],{"type":37,"value":947},{"type":37,"value":1432}," map in ",{"type":32,"tag":40,"props":1434,"children":1436},{"className":1435},[],[1437],{"type":37,"value":110},{"type":37,"value":361},{"type":32,"tag":58,"props":1440,"children":1441},{},[1442],{"type":37,"value":1443},"WORKING still duplicates the nine listings by choice. Revisit when WORKING is next touched.",[],[236,228],[1447,1448],{"file":236,"title":14},{"file":228,"title":1449},"plan — Nav Submenu",[1451,1459,1466,1473,1477,1484,1490],{"src":20,"kind":1452,"order":1453,"caption":1454,"capturedAt":1455,"subject":1456,"route":45,"evolution":1457},"hero",0,"qdash \u002Finventory: THE FLEET now sits second in the rail, and Inventory (grape, the current page) has its 9 listings open under it on the stroke-strong rail. The page title reads 'Inventory', no longer 'Harness Inventory'","2026-09-26T17:29:17.969Z","page\u002Finventory",{"subject":1456,"moments":1458},6,{"src":1460,"kind":1452,"order":1453,"caption":1461,"capturedAt":1462,"subject":1463,"route":1464,"evolution":1465},"\u002Fcycles\u002Fdesign\u002Fc98-submenu-demo.png","The NavVerticalSubmenu demo at its dialed defaults (italic, med 13, 1px gap): the interactive THE FLEET sidebar opened by a `match` on the demo's own path, then the scenarios: no children (no rail), one child, the 9 inventory listings, an unmatched route (collapsed), the button form, v-model:open, and overflow","2026-09-26T17:29:53.583Z","component\u002Fnav-vertical-submenu","\u002Fcomponents\u002Fnavigation\u002Fnav-vertical-submenu",{"subject":1463,"moments":22},{"src":1467,"kind":1452,"order":1468,"caption":1469,"capturedAt":1455,"subject":1470,"route":1471,"evolution":1472},"\u002Fcycles\u002Fdesign\u002Fc98-qdash-models.png",1,"qdash \u002Finventory\u002Fmodels: the submenu stays open because the route is under \u002Finventory. Models lights up and the Inventory row drops back to ink, so only the current page is grape","page\u002Fmodels","\u002Finventory\u002Fmodels",{"subject":1470,"moments":21},{"src":1474,"kind":1452,"order":1468,"caption":1475,"capturedAt":1462,"subject":1463,"route":1464,"evolution":1476},"\u002Fcycles\u002Fdesign\u002Fc98-submenu-demo-tuned.png","The same demo with the tuning knobs pushed: subWeight black, subSize 16, subGap 8. Only the children change; the parent row stays semi 15. Mark dialed these knobs back to med 13 with a 1px gap, now the defaults. subGap is provisional",{"subject":1463,"moments":22},{"src":1478,"kind":1452,"order":22,"caption":1479,"capturedAt":1455,"subject":1480,"route":1481,"evolution":1482},"\u002Fcycles\u002Fdesign\u002Fc98-qdash-model-detail.png","qdash Model detail (claude-sonnet-4-6): sub-items prefix-match, so Models stays lit on its own detail pages and the open submenu still says which listing you came from. Top-level items keep the exact-match rule","page\u002Fmodel-detail","\u002Finventory\u002Fmodels\u002Fdetail?model=claude-sonnet-4-6",{"subject":1480,"moments":1483},5,{"src":1485,"kind":1452,"order":1486,"caption":1487,"capturedAt":1455,"subject":1488,"route":1036,"evolution":1489},"\u002Fcycles\u002Fdesign\u002Fc98-qdash-overview.png",3,"qdash Fleet Overview: outside \u002Finventory the submenu is collapsed to its parent row, and the rail reads WHERE ARE WE → THE FLEET → WHAT GOOD LOOKS LIKE → PROVE","page\u002Ffleet-overview",{"subject":1488,"moments":1458},{"src":1491,"kind":1492,"order":1493,"capturedAt":1462,"subject":1463,"route":1464,"evolution":1494},"\u002Fcycles\u002Fdesign\u002Fc98-submenu-demo-full.png","full",9000,{"subject":1463,"moments":22},[1496],{"path":1497,"title":1498,"image":1467,"gallery":1499},"archive\u002F2026-q3\u002F2026-09-26-c98-nav-submenu","Nav Submenu — Inventory Opens by URL",[1500,1502,1504,1506,1508,1510,1512],{"src":1467,"alt":1501},"Models listing: the submenu is open because the route is under \u002Finventory. Models is grape and the Inventory row is back to ink.",{"src":20,"alt":1503},"The Inventory page itself, now titled 'Inventory': the parent row is grape and no child is lit.",{"src":1478,"alt":1505},"Model detail for claude-sonnet-4-6: sub-items prefix-match, so Models stays lit on its own detail pages.",{"src":1485,"alt":1507},"Fleet Overview: outside \u002Finventory the submenu collapses to its parent row.",{"src":1460,"alt":1509},"The NavVerticalSubmenu demo at its dialed defaults (italic, med 13, 1px gap), with its DevCanvas controls.",{"src":1491,"alt":1511},"The demo in full: the interactive sidebar, then the empty, minimal, typical, unmatched, button, controlled and overflow scenarios.",{"src":1474,"alt":1513},"The tuning knobs pushed to black, 16px and an 8px gap. Only the children change. These are the controls Mark used to dial the defaults.",[1515,1516,1517,1518,1519],{"route":45,"href":8},{"route":1481,"href":8},{"route":1471,"href":8},{"route":1036,"href":8},{"route":1464,"href":1464},1794599412996]