[{"data":1,"prerenderedAt":25505},["ShallowReactive",2],{"changelog":3},{"data":4,"body":7,"toc":25313},{"title":5,"description":6},"Changelog","All notable changes to tti-ux. Follows Keep a Changelog\nconventions and Semantic Versioning.",{"type":8,"children":9},"root",[10,18,44,55,62,76,210,216,263,269,332,338,350,432,438,527,533,668,679,685,698,1066,1072,1088,1343,1349,1432,1438,1688,1694,1973,1984,1996,2002,2052,2058,2132,2138,2143,2602,2631,2637,2780,2786,2791,3074,3079,3336,3347,3375,3380,3586,3592,4017,4022,4261,4272,4285,4291,4304,4407,4420,4478,4484,4577,4583,4638,4644,4657,4765,4779,4808,4814,4946,4952,5105,5111,5148,5154,5164,5302,5308,5347,5357,5362,5368,5464,5470,5600,5606,5690,5701,5706,5711,5790,5795,5849,5854,5895,5906,5918,5937,5975,5995,6082,6093,6099,6111,6210,6271,6328,6334,6347,6829,6835,6896,6968,6974,6979,7084,7132,7166,7174,7275,7307,7313,7348,7388,7453,7470,7497,7503,7538,7821,7846,7862,7868,7880,7972,8023,8048,8069,8077,8083,8103,8229,8262,8268,8330,8470,8476,8500,8628,8646,8687,8693,8698,8708,8828,8958,9042,9152,9162,9635,9643,9672,9678,9683,9701,9719,9737,9754,9767,9772,9778,9786,9810,9818,9837,9845,9878,9884,9889,9897,9929,9957,10053,10061,10112,10128,10160,10166,10171,10179,10244,10268,10338,10346,10354,10360,10365,10381,10439,10447,10469,10482,10508,10516,10539,10549,10555,10583,10700,10713,10718,10724,10729,10737,10829,10837,10886,10910,10916,10928,10936,10955,10963,11062,11070,11173,11181,11226,11234,11279,11287,11365,11383,11389,11394,11400,11405,11430,11455,11473,11508,11514,11526,11534,11640,11648,11743,11751,11803,11811,11865,11873,11932,11953,11961,12007,12013,12018,12026,12207,12221,12291,12299,12337,12345,12433,12439,12466,12727,12733,12777,12783,12796,13045,13058,13109,13142,13160,13165,13256,13262,13367,13373,13470,13476,13601,13626,13631,13807,13813,13911,13917,13972,13978,14030,14079,14085,14103,14182,14201,14252,14265,14341,14352,14422,14428,14503,14513,14597,14603,14698,14710,14730,14806,14816,14836,14855,14908,14995,15001,15035,15121,15148,15160,15185,15462,15474,15487,15836,15856,15884,16294,16317,16364,16818,16824,16837,17172,17185,17228,17376,17389,17408,17538,17549,17561,17567,17673,17679,17933,17939,17944,18244,18250,18305,18311,18335,18346,18373,18379,18390,18611,18617,18622,18630,18771,18779,18908,18916,19095,19108,19205,19223,19229,19298,19309,19322,19328,19526,19532,19537,19543,19718,19723,19942,19947,20111,20117,20159,20165,20201,20212,20224,20230,20497,20503,20622,20627,20693,20698,20704,20716,20724,20954,20962,21200,21218,21404,21412,21498,21504,22022,22028,22033,22433,22439,22664,22669,22882,22887,22941,22946,23447,23452,23646,23651,24744,24749,24921,24926,25215,25221],{"type":11,"tag":12,"props":13,"children":15},"element","h1",{"id":14},"changelog",[16],{"type":17,"value":5},"text",{"type":11,"tag":19,"props":20,"children":21},"p",{},[22,24,33,35,42],{"type":17,"value":23},"All notable changes to tti-ux. Follows ",{"type":11,"tag":25,"props":26,"children":30},"a",{"href":27,"rel":28},"https:\u002F\u002Fkeepachangelog.com\u002F",[29],"nofollow",[31],{"type":17,"value":32},"Keep a Changelog",{"type":17,"value":34},"\nconventions and ",{"type":11,"tag":25,"props":36,"children":39},{"href":37,"rel":38},"https:\u002F\u002Fsemver.org\u002F",[29],[40],{"type":17,"value":41},"Semantic Versioning",{"type":17,"value":43},".",{"type":11,"tag":45,"props":46,"children":48},"h2",{"id":47},"unreleased",[49],{"type":11,"tag":50,"props":51,"children":52},"span",{},[53],{"type":17,"value":54},"Unreleased",{"type":11,"tag":56,"props":57,"children":59},"h3",{"id":58},"changed-navigation-restructure-9-groups-to-7-2026-09-01",[60],{"type":17,"value":61},"Changed — navigation restructure, 9 groups to 7 (2026-09-01)",{"type":11,"tag":19,"props":63,"children":64},{},[65,67,74],{"type":17,"value":66},"Sprawl pass. Four surfaces were answering two questions, two groups had\nthree entries between them, and ",{"type":11,"tag":68,"props":69,"children":71},"code",{"className":70},[],[72],{"type":17,"value":73},"kit\u002F",{"type":17,"value":75}," — nine shipped framework targets —\nhad no page at all.",{"type":11,"tag":77,"props":78,"children":79},"ul",{},[80,121,138,194],{"type":11,"tag":81,"props":82,"children":83},"li",{},[84,112,114,119],{"type":11,"tag":85,"props":86,"children":87},"strong",{},[88,94,96,102,104,110],{"type":11,"tag":68,"props":89,"children":91},{"className":90},[],[92],{"type":17,"value":93},"Composition",{"type":17,"value":95},", ",{"type":11,"tag":68,"props":97,"children":99},{"className":98},[],[100],{"type":17,"value":101},"Forms",{"type":17,"value":103}," and ",{"type":11,"tag":68,"props":105,"children":107},{"className":106},[],[108],{"type":17,"value":109},"Tooling",{"type":17,"value":111}," are gone as groups.",{"type":17,"value":113}," Their\nentries redistribute: composed pages to ",{"type":11,"tag":85,"props":115,"children":116},{},[117],{"type":17,"value":118},"Kits",{"type":17,"value":120},", Forms to a nested\nbranch under Components, Accessibility and Contrast audit to\nFoundations.",{"type":11,"tag":81,"props":122,"children":123},{},[124,136],{"type":11,"tag":85,"props":125,"children":126},{},[127,129,134],{"type":17,"value":128},"New ",{"type":11,"tag":68,"props":130,"children":132},{"className":131},[],[133],{"type":17,"value":118},{"type":17,"value":135}," group",{"type":17,"value":137}," — \"where do I look for an assembly of things.\"\nComposed examples, Patterns, and the frozen static reference designs.",{"type":11,"tag":81,"props":139,"children":140},{},[141,152,154,160,162,168,170,176,178,184,186,192],{"type":11,"tag":85,"props":142,"children":143},{},[144,150],{"type":11,"tag":68,"props":145,"children":147},{"className":146},[],[148],{"type":17,"value":149},"Design",{"type":17,"value":151}," narrows 11 → 7",{"type":17,"value":153}," by ",{"type":11,"tag":155,"props":156,"children":157},"em",{},[158],{"type":17,"value":159},"re-homing",{"type":17,"value":161},", not hiding. ",{"type":11,"tag":68,"props":163,"children":165},{"className":164},[],[166],{"type":17,"value":167},"components.md",{"type":17,"value":169},"\nnow leads the Components group, ",{"type":11,"tag":68,"props":171,"children":173},{"className":172},[],[174],{"type":17,"value":175},"chart-foundations.md",{"type":17,"value":177}," the\nVisualizations group, ",{"type":11,"tag":68,"props":179,"children":181},{"className":180},[],[182],{"type":17,"value":183},"compositions.md",{"type":17,"value":185}," the Kits group. Every doc keeps\na sidebar home and its ",{"type":11,"tag":68,"props":187,"children":189},{"className":188},[],[190],{"type":17,"value":191},"\u002Fdesign\u002F\u003Cslug>",{"type":17,"value":193}," URL; only ownership moved.",{"type":11,"tag":81,"props":195,"children":196},{},[197,208],{"type":11,"tag":85,"props":198,"children":199},{},[200,206],{"type":11,"tag":68,"props":201,"children":203},{"className":202},[],[204],{"type":17,"value":205},"\u002Fpreview",{"type":17,"value":207}," relabelled Specimens",{"type":17,"value":209}," in the sidebar. Route unchanged.",{"type":11,"tag":56,"props":211,"children":213},{"id":212},"added-install-pages-for-the-kit-tier-2026-09-01",[214],{"type":17,"value":215},"Added — Install pages for the kit\u002F tier (2026-09-01)",{"type":11,"tag":77,"props":217,"children":218},{},[219,241],{"type":11,"tag":81,"props":220,"children":221},{},[222,231,233,239],{"type":11,"tag":85,"props":223,"children":224},{},[225],{"type":11,"tag":68,"props":226,"children":228},{"className":227},[],[229],{"type":17,"value":230},"\u002Finstall",{"type":17,"value":232}," — one page for all nine framework targets, with\n",{"type":11,"tag":68,"props":234,"children":236},{"className":235},[],[237],{"type":17,"value":238},"design\u002Fkit-pipeline.md",{"type":17,"value":240}," as its doctrine body. Deliberately a page, not\na group: a directory listing wearing an intent label is the thing that\nwas already rejected as \"Kit targets\" \u002F \"Platforms\" \u002F \"Integrations\".",{"type":11,"tag":81,"props":242,"children":243},{},[244,253,255,261],{"type":11,"tag":85,"props":245,"children":246},{},[247],{"type":11,"tag":68,"props":248,"children":250},{"className":249},[],[251],{"type":17,"value":252},"\u002Finstall\u002Fpower-bi",{"type":17,"value":254}," — platform-level Power BI setup, rendering\n",{"type":11,"tag":68,"props":256,"children":258},{"className":257},[],[259],{"type":17,"value":260},"kit\u002Fpowerbi\u002FREADME.md",{"type":17,"value":262}," verbatim so the site and the npm package are\nsingle-source.",{"type":11,"tag":56,"props":264,"children":266},{"id":265},"changed-power-bi-moves-out-of-design-2026-09-01",[267],{"type":17,"value":268},"Changed — Power BI moves out of design\u002F (2026-09-01)",{"type":11,"tag":19,"props":270,"children":271},{},[272,278,280,285,287,292,294,300,302,307,309,315,316,322,324,330],{"type":11,"tag":68,"props":273,"children":275},{"className":274},[],[276],{"type":17,"value":277},"design\u002Fpowerbi-kit.md",{"type":17,"value":279}," is ",{"type":11,"tag":85,"props":281,"children":282},{},[283],{"type":17,"value":284},"deleted",{"type":17,"value":286},"; its content merged into\n",{"type":11,"tag":68,"props":288,"children":290},{"className":289},[],[291],{"type":17,"value":260},{"type":17,"value":293},". ",{"type":11,"tag":68,"props":295,"children":297},{"className":296},[],[298],{"type":17,"value":299},"design\u002F",{"type":17,"value":301}," is doctrine about TUX itself — how to\napply TUX to a specific host is a different kind of document. The doc was\nalso the proof: registering a design doc takes ",{"type":11,"tag":85,"props":303,"children":304},{},[305],{"type":17,"value":306},"three",{"type":17,"value":308}," edits\n(",{"type":11,"tag":68,"props":310,"children":312},{"className":311},[],[313],{"type":17,"value":314},"design\u002Findex.vue",{"type":17,"value":95},{"type":11,"tag":68,"props":317,"children":319},{"className":318},[],[320],{"type":17,"value":321},"design\u002F[doc].vue",{"type":17,"value":323},", and ",{"type":11,"tag":68,"props":325,"children":327},{"className":326},[],[328],{"type":17,"value":329},"app.vue",{"type":17,"value":331},"), and it shipped\nwith only two, so it rendered but never appeared in the sidebar.",{"type":11,"tag":56,"props":333,"children":335},{"id":334},"added-power-bi-tabs-on-component-pages-2026-09-01",[336],{"type":17,"value":337},"Added — Power BI tabs on component pages (2026-09-01)",{"type":11,"tag":19,"props":339,"children":340},{},[341,343,348],{"type":17,"value":342},"The seam: ",{"type":11,"tag":85,"props":344,"children":345},{},[346],{"type":17,"value":347},"how to style one chart lives on the chart; how to set up a\nreport lives in the setup page.",{"type":17,"value":349}," Implementations are an attribute of a\ncomponent, not a section of the nav — which is why there is no Power BI\ngroup.",{"type":11,"tag":77,"props":351,"children":352},{},[353,393,422],{"type":11,"tag":81,"props":354,"children":355},{},[356,375,377,383,385,391],{"type":11,"tag":85,"props":357,"children":358},{},[359,365,367,373],{"type":11,"tag":68,"props":360,"children":362},{"className":361},[],[363],{"type":17,"value":364},"TuxExample",{"type":17,"value":366}," gains a ",{"type":11,"tag":68,"props":368,"children":370},{"className":369},[],[371],{"type":17,"value":372},"powerbi",{"type":17,"value":374}," tab",{"type":17,"value":376},", pushed conditionally exactly as\n",{"type":11,"tag":68,"props":378,"children":380},{"className":379},[],[381],{"type":17,"value":382},"source",{"type":17,"value":384}," already was. ",{"type":11,"tag":68,"props":386,"children":388},{"className":387},[],[389],{"type":17,"value":390},"tableau",{"type":17,"value":392}," slots in the same way.",{"type":11,"tag":81,"props":394,"children":395},{},[396,398,404,406,412,414,420],{"type":17,"value":397},"Wired on chart-bar, chart-line, chart-area, chart-scatter (the\n",{"type":11,"tag":68,"props":399,"children":401},{"className":400},[],[402],{"type":17,"value":403},"chart-cartesian",{"type":17,"value":405}," fragment) and data-table (",{"type":11,"tag":68,"props":407,"children":409},{"className":408},[],[410],{"type":17,"value":411},"table-chrome",{"type":17,"value":413},"), imported\nfrom ",{"type":11,"tag":68,"props":415,"children":417},{"className":416},[],[418],{"type":17,"value":419},"kit\u002Fpowerbi\u002F",{"type":17,"value":421}," rather than retyped, so a tab cannot drift from the\nemitter.",{"type":11,"tag":81,"props":423,"children":424},{},[425,430],{"type":11,"tag":85,"props":426,"children":427},{},[428],{"type":17,"value":429},"Coverage is partial and says so.",{"type":17,"value":431}," The kit ships three fragment\ntypes, not one per chart, so a parity table on the Visualizations\noverview names what is covered and what is not — a missing tab reads as\n\"no fragment yet\", not \"Power BI can't render it\".",{"type":11,"tag":56,"props":433,"children":435},{"id":434},"added-power-bi-kit-design-doc-2026-09-01",[436],{"type":17,"value":437},"Added — Power BI kit design doc (2026-09-01)",{"type":11,"tag":77,"props":439,"children":440},{},[441,477],{"type":11,"tag":81,"props":442,"children":443},{},[444,452,454,460,462,468,470,475],{"type":11,"tag":85,"props":445,"children":446},{},[447],{"type":11,"tag":68,"props":448,"children":450},{"className":449},[],[451],{"type":17,"value":277},{"type":17,"value":453},", surfaced at ",{"type":11,"tag":68,"props":455,"children":457},{"className":456},[],[458],{"type":17,"value":459},"\u002Fdesign\u002Fpowerbi-kit",{"type":17,"value":461}," by the\nexisting ",{"type":11,"tag":68,"props":463,"children":465},{"className":464},[],[466],{"type":17,"value":467},"design\u002F*.md",{"type":17,"value":469}," glob. Covers why the kit is shaped the way it\nis: the no-native-dark-mode constraint that splits it into theme vs\nPBIR, the named-theme-colors trap, the version-pinning burden, Fluent\n2, and the known gaps. The consumer procedure stays in\n",{"type":11,"tag":68,"props":471,"children":473},{"className":472},[],[474],{"type":17,"value":260},{"type":17,"value":476},", which ships in the package.",{"type":11,"tag":81,"props":478,"children":479},{},[480,482,488,490,496,497,503,504,510,511,517,519,525],{"type":17,"value":481},"Deliberately a design doc rather than a bespoke page. The whole\nframework-target tier is undocumented on the site — ",{"type":11,"tag":68,"props":483,"children":485},{"className":484},[],[486],{"type":17,"value":487},"kit\u002Fcsharp",{"type":17,"value":489},",\n",{"type":11,"tag":68,"props":491,"children":493},{"className":492},[],[494],{"type":17,"value":495},"kit\u002Freact",{"type":17,"value":95},{"type":11,"tag":68,"props":498,"children":500},{"className":499},[],[501],{"type":17,"value":502},"kit\u002Fwp",{"type":17,"value":95},{"type":11,"tag":68,"props":505,"children":507},{"className":506},[],[508],{"type":17,"value":509},"kit\u002Fcss",{"type":17,"value":95},{"type":11,"tag":68,"props":512,"children":514},{"className":513},[],[515],{"type":17,"value":516},"kit\u002Fscss",{"type":17,"value":518}," have no pages either — so\nthis sets a pattern those can follow instead of being a one-off. Note\n",{"type":11,"tag":68,"props":520,"children":522},{"className":521},[],[523],{"type":17,"value":524},"\u002Freports",{"type":17,"value":526}," would be the wrong home despite the name: that section is\nexplicitly for finished narratives the reader doesn't pivot or filter,\nand a Power BI report is the opposite.",{"type":11,"tag":56,"props":528,"children":530},{"id":529},"changed-chart-foundations-2-settled-2026-09-01",[531],{"type":17,"value":532},"Changed — chart foundations §2 settled (2026-09-01)",{"type":11,"tag":77,"props":534,"children":535},{},[536,560,586],{"type":11,"tag":81,"props":537,"children":538},{},[539,550,552,558],{"type":11,"tag":85,"props":540,"children":541},{},[542,548],{"type":11,"tag":68,"props":543,"children":545},{"className":544},[],[546],{"type":17,"value":547},"design\u002Fchart-foundations.md",{"type":17,"value":549}," §2 is no longer a TODO.",{"type":17,"value":551}," Building the\nPower BI ",{"type":11,"tag":68,"props":553,"children":555},{"className":554},[],[556],{"type":17,"value":557},"visualStyles",{"type":17,"value":559}," emitter forced every axis, gridline and legend\nchoice to become a literal, and two systems now have to agree on them.",{"type":11,"tag":81,"props":561,"children":562},{},[563,576,578,584],{"type":11,"tag":85,"props":564,"children":565},{},[566,568,574],{"type":17,"value":567},"No ",{"type":11,"tag":68,"props":569,"children":571},{"className":570},[],[572],{"type":17,"value":573},"--chart-*",{"type":17,"value":575}," tokens were minted.",{"type":17,"value":577}," The 2026-05 skeleton expected\nfour new anchors; the surface and text ramps already carry those roles,\nand aliasing would create two names for one value — which\n",{"type":11,"tag":68,"props":579,"children":581},{"className":580},[],[582],{"type":17,"value":583},"audit:tokens",{"type":17,"value":585}," flags. §2 now maps each role to the existing token and\nits Power BI counterpart.",{"type":11,"tag":81,"props":587,"children":588},{},[589,591,597,599,605,607,613,615,620,622,628,630,636,638,644,646,652,654,659,661,666],{"type":17,"value":590},"Records one deliberate divergence — web gridlines use\n",{"type":11,"tag":68,"props":592,"children":594},{"className":593},[],[595],{"type":17,"value":596},"--surface-border",{"type":17,"value":598}," at 50% opacity, the Power BI theme uses\n",{"type":11,"tag":68,"props":600,"children":602},{"className":601},[],[603],{"type":17,"value":604},"surface.border-subtle",{"type":17,"value":606},", because a theme's ",{"type":11,"tag":68,"props":608,"children":610},{"className":609},[],[611],{"type":17,"value":612},"gridlineColor",{"type":17,"value":614}," has no alpha\nchannel — and one ",{"type":11,"tag":85,"props":616,"children":617},{},[618],{"type":17,"value":619},"defect",{"type":17,"value":621},": ",{"type":11,"tag":68,"props":623,"children":625},{"className":624},[],[626],{"type":17,"value":627},"TuxChartLine",{"type":17,"value":629}," styles axis ticks\n",{"type":11,"tag":68,"props":631,"children":633},{"className":632},[],[634],{"type":17,"value":635},"--text-muted",{"type":17,"value":637}," while ",{"type":11,"tag":68,"props":639,"children":641},{"className":640},[],[642],{"type":17,"value":643},"TuxChartBar",{"type":17,"value":645}," uses ",{"type":11,"tag":68,"props":647,"children":649},{"className":648},[],[650],{"type":17,"value":651},"--text-secondary",{"type":17,"value":653},". Both clear\nAAA, so it is a consistency bug, not an accessibility one.\n",{"type":11,"tag":68,"props":655,"children":657},{"className":656},[],[658],{"type":17,"value":651},{"type":17,"value":660}," is named canonical; moving ",{"type":11,"tag":68,"props":662,"children":664},{"className":663},[],[665],{"type":17,"value":627},{"type":17,"value":667}," is left to\nits own change, since it is a visible change to a shipped component.",{"type":11,"tag":45,"props":669,"children":671},{"id":670},"_210-2026-09-01",[672,677],{"type":11,"tag":50,"props":673,"children":674},{},[675],{"type":17,"value":676},"2.1.0",{"type":17,"value":678}," — 2026-09-01",{"type":11,"tag":56,"props":680,"children":682},{"id":681},"added-power-bi-kit-v2-pbir-components-2026-09-01",[683],{"type":17,"value":684},"Added — Power BI kit v2: PBIR components (2026-09-01)",{"type":11,"tag":19,"props":686,"children":687},{},[688,690,696],{"type":17,"value":689},"The Power BI target grows from a colours-and-fonts theme file into a\ndrop-in report kit. Ported from the Power BI & Fabric documentation tree\nin ",{"type":11,"tag":68,"props":691,"children":693},{"className":692},[],[694],{"type":17,"value":695},"docs-tti-tamu-edu",{"type":17,"value":697},", re-tokenised to TTI, and re-pinned against the\ncurrent Microsoft schemas (every version below verified live on\n2026-08-31: each URL returns 200 and the next version up 404s).",{"type":11,"tag":77,"props":699,"children":700},{},[701,810,832,846,899,960,1017,1030],{"type":11,"tag":81,"props":702,"children":703},{},[704,713,715,721,723,729,731,737,738,744,745,751,752,758,759,765,767,773,774,779,785,787,793,794,800,802,808],{"type":11,"tag":85,"props":705,"children":706},{},[707],{"type":11,"tag":68,"props":708,"children":710},{"className":709},[],[711],{"type":17,"value":712},"scripts\u002Fpbir-schema-lock.mjs",{"type":17,"value":714}," — single source for every pinned\nPBIR ",{"type":11,"tag":68,"props":716,"children":718},{"className":717},[],[719],{"type":17,"value":720},"$schema",{"type":17,"value":722}," URL and format-version literal, emitted to\n",{"type":11,"tag":68,"props":724,"children":726},{"className":725},[],[727],{"type":17,"value":728},"kit\u002Fpowerbi\u002Fpbir\u002Fschema-lock.json",{"type":17,"value":730},". Current tips: ",{"type":11,"tag":68,"props":732,"children":734},{"className":733},[],[735],{"type":17,"value":736},"report\u002F3.3.0",{"type":17,"value":489},{"type":11,"tag":68,"props":739,"children":741},{"className":740},[],[742],{"type":17,"value":743},"visualContainer\u002F2.9.0",{"type":17,"value":95},{"type":11,"tag":68,"props":746,"children":748},{"className":747},[],[749],{"type":17,"value":750},"page\u002F2.1.0",{"type":17,"value":95},{"type":11,"tag":68,"props":753,"children":755},{"className":754},[],[756],{"type":17,"value":757},"pagesMetadata\u002F1.1.0",{"type":17,"value":489},{"type":11,"tag":68,"props":760,"children":762},{"className":761},[],[763],{"type":17,"value":764},"platformProperties\u002F2.1.0",{"type":17,"value":766}," (under ",{"type":11,"tag":68,"props":768,"children":770},{"className":769},[],[771],{"type":17,"value":772},"gitIntegration\u002F",{"type":17,"value":95},{"type":11,"tag":85,"props":775,"children":776},{},[777],{"type":17,"value":778},"not",{"type":11,"tag":68,"props":780,"children":782},{"className":781},[],[783],{"type":17,"value":784},"item\u002Freport\u002F",{"type":17,"value":786},"), ",{"type":11,"tag":68,"props":788,"children":790},{"className":789},[],[791],{"type":17,"value":792},"definitionProperties\u002F2.0.0",{"type":17,"value":95},{"type":11,"tag":68,"props":795,"children":797},{"className":796},[],[798],{"type":17,"value":799},"versionMetadata\u002F1.0.0",{"type":17,"value":801},".\n",{"type":11,"tag":68,"props":803,"children":805},{"className":804},[],[806],{"type":17,"value":807},"npm run verify:pbir",{"type":17,"value":809}," re-checks all of them against the live endpoints.",{"type":11,"tag":81,"props":811,"children":812},{},[813,822,824,830],{"type":11,"tag":85,"props":814,"children":815},{},[816],{"type":11,"tag":68,"props":817,"children":819},{"className":818},[],[820],{"type":17,"value":821},"kit\u002Fpowerbi\u002Ftti-theme-hc.json",{"type":17,"value":823}," — third emitted theme, from the\nexisting ",{"type":11,"tag":68,"props":825,"children":827},{"className":826},[],[828],{"type":17,"value":829},"tti-hc",{"type":17,"value":831}," tokens. Has no upstream equivalent.",{"type":11,"tag":81,"props":833,"children":834},{},[835,844],{"type":11,"tag":85,"props":836,"children":837},{},[838],{"type":11,"tag":68,"props":839,"children":841},{"className":840},[],[842],{"type":17,"value":843},"kit\u002Fpowerbi\u002Fpbir\u002Fgeometry.json",{"type":17,"value":845}," — report shell layout: chrome\nbands, content area, nav-pill stride, and the z-order scheme\n(content reserved to 9000–15000). Two canvas variants, because Fluent 2\nmoved the default canvas to 1920×1080 while existing reports stay at\n1280×920.",{"type":11,"tag":81,"props":847,"children":848},{},[849,858,860,866,868,874,876,882,884,889,891,897],{"type":11,"tag":85,"props":850,"children":851},{},[852],{"type":11,"tag":68,"props":853,"children":855},{"className":854},[],[856],{"type":17,"value":857},"kit\u002Fpowerbi\u002Fpbir\u002Ffragments\u002F",{"type":17,"value":859}," — card chrome, ",{"type":11,"tag":68,"props":861,"children":863},{"className":862},[],[864],{"type":17,"value":865},"tableEx",{"type":17,"value":867}," chrome and\ncartesian-chart chrome, in four lanes: static ",{"type":11,"tag":68,"props":869,"children":871},{"className":870},[],[872],{"type":17,"value":873},"tti",{"type":17,"value":875}," \u002F ",{"type":11,"tag":68,"props":877,"children":879},{"className":878},[],[880],{"type":17,"value":881},"tti-dark",{"type":17,"value":883}," \u002F\n",{"type":11,"tag":68,"props":885,"children":887},{"className":886},[],[888],{"type":17,"value":829},{"type":17,"value":890},", plus ",{"type":11,"tag":68,"props":892,"children":894},{"className":893},[],[895],{"type":17,"value":896},"themed",{"type":17,"value":898}," whose colours bind to DAX measures.",{"type":11,"tag":81,"props":900,"children":901},{},[902,919,921,927,929,935,937,942,944,950,952,958],{"type":11,"tag":85,"props":903,"children":904},{},[905,911,913],{"type":11,"tag":68,"props":906,"children":908},{"className":907},[],[909],{"type":17,"value":910},"kit\u002Fpowerbi\u002Fpbir\u002Ftmdl\u002F",{"type":17,"value":912}," + ",{"type":11,"tag":68,"props":914,"children":916},{"className":915},[],[917],{"type":17,"value":918},"pbir\u002Fdax\u002F",{"type":17,"value":920}," — the in-report light\u002Fdark\nswitch: a ",{"type":11,"tag":68,"props":922,"children":924},{"className":923},[],[925],{"type":17,"value":926},"ThemeMode",{"type":17,"value":928}," table and 30 ",{"type":11,"tag":68,"props":930,"children":932},{"className":931},[],[933],{"type":17,"value":934},"TuxThemeColors",{"type":17,"value":936}," measures across\neight display folders, as TMDL for PBIP projects and as DAX for\nDesktop. Power BI has ",{"type":11,"tag":85,"props":938,"children":939},{},[940],{"type":17,"value":941},"no",{"type":17,"value":943}," native dark mode for report content in\nDesktop, the service, or mobile, so this is the mechanism, not a\nworkaround. ",{"type":11,"tag":68,"props":945,"children":947},{"className":946},[],[948],{"type":17,"value":949},"Shell*",{"type":17,"value":951}," roles are theme-invariant (the masthead stays\nmaroon); ",{"type":11,"tag":68,"props":953,"children":955},{"className":954},[],[956],{"type":17,"value":957},"Tooltip*",{"type":17,"value":959}," roles invert.",{"type":11,"tag":81,"props":961,"children":962},{},[963,972,974,979,981,987,989,995,997,1002,1008,1010,1016],{"type":11,"tag":85,"props":964,"children":965},{},[966],{"type":11,"tag":68,"props":967,"children":969},{"className":968},[],[970],{"type":17,"value":971},"kit\u002Fpowerbi\u002Fpbir\u002Fshell\u002F{classic,fluent2}\u002F",{"type":17,"value":973}," — 15 drop-in visuals\nper canvas: 10 page-chrome visuals plus 5 nav-pill templates, laid out\none folder per visual to match PBIR on disk. All 30 validated against\nthe live ",{"type":11,"tag":68,"props":975,"children":977},{"className":976},[],[978],{"type":17,"value":743},{"type":17,"value":980}," schema with its five remote ",{"type":11,"tag":68,"props":982,"children":984},{"className":983},[],[985],{"type":17,"value":986},"$ref",{"type":17,"value":988},"s\nresolved. Includes the Dark\u002FLight tile slicer (",{"type":11,"tag":68,"props":990,"children":992},{"className":991},[],[993],{"type":17,"value":994},"mode: 'Basic'",{"type":17,"value":996}," ",{"type":11,"tag":85,"props":998,"children":999},{},[1000],{"type":17,"value":1001},"and",{"type":11,"tag":68,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":17,"value":1007},"orientation: \"1D\"",{"type":17,"value":1009}," — both required) with cross-page ",{"type":11,"tag":68,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":17,"value":1015},"syncGroup",{"type":17,"value":43},{"type":11,"tag":81,"props":1018,"children":1019},{},[1020,1028],{"type":11,"tag":85,"props":1021,"children":1022},{},[1023],{"type":11,"tag":68,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":17,"value":260},{"type":17,"value":1029}," — drop-in procedure, the theme-registration\ntriple, the semantic-model contract, and the calibrated sizing rules.",{"type":11,"tag":81,"props":1031,"children":1032},{},[1033,1049,1051,1057,1059,1065],{"type":11,"tag":85,"props":1034,"children":1035},{},[1036,1042,1043],{"type":11,"tag":68,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":17,"value":1041},"npm run build:pbir",{"type":17,"value":875},{"type":11,"tag":68,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":17,"value":1048},"verify:pbir",{"type":17,"value":1050},", with ",{"type":11,"tag":68,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":17,"value":1056},"build:pbir",{"type":17,"value":1058}," wired into\n",{"type":11,"tag":68,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":17,"value":1064},"build:kit",{"type":17,"value":43},{"type":11,"tag":56,"props":1067,"children":1069},{"id":1068},"changed-power-bi-theme-emitter-2026-09-01",[1070],{"type":17,"value":1071},"Changed — Power BI theme emitter (2026-09-01)",{"type":11,"tag":19,"props":1073,"children":1074},{},[1075,1081,1083],{"type":11,"tag":68,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":17,"value":1080},"scripts\u002Fbuild-powerbi-theme.mjs",{"type":17,"value":1082}," now emits a complete report theme.\n",{"type":11,"tag":85,"props":1084,"children":1085},{},[1086],{"type":17,"value":1087},"Consumers re-vendoring at a pinned tag will see visible differences:",{"type":11,"tag":77,"props":1089,"children":1090},{},[1091,1123,1184,1213,1311],{"type":11,"tag":81,"props":1092,"children":1093},{},[1094,1107,1109,1115,1117,1122],{"type":11,"tag":85,"props":1095,"children":1096},{},[1097,1099,1105],{"type":17,"value":1098},"Removed the ",{"type":11,"tag":68,"props":1100,"children":1102},{"className":1101},[],[1103],{"type":17,"value":1104},"_generated",{"type":17,"value":1106}," key.",{"type":17,"value":1108}," The theme schema is\n",{"type":11,"tag":68,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":17,"value":1114},"additionalProperties: false",{"type":17,"value":1116}," over exactly 42 named properties, so\nevery theme v1 emitted was technically invalid. Provenance moved to\n",{"type":11,"tag":68,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":17,"value":260},{"type":17,"value":43},{"type":11,"tag":81,"props":1124,"children":1125},{},[1126,1152,1154,1160,1162,1167,1169,1174,1176,1182],{"type":11,"tag":85,"props":1127,"children":1128},{},[1129,1135,1137,1143,1145,1151],{"type":11,"tag":68,"props":1130,"children":1132},{"className":1131},[],[1133],{"type":17,"value":1134},"background",{"type":17,"value":1136}," (dark) ",{"type":11,"tag":68,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":17,"value":1142},"#15100F",{"type":17,"value":1144}," → ",{"type":11,"tag":68,"props":1146,"children":1148},{"className":1147},[],[1149],{"type":17,"value":1150},"#221F1F",{"type":17,"value":43},{"type":17,"value":1153}," v1 mapped it to\n",{"type":11,"tag":68,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":17,"value":1159},"surface.page",{"type":17,"value":1161},", but Power BI's ",{"type":11,"tag":68,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":17,"value":1134},{"type":17,"value":1168}," is the ",{"type":11,"tag":155,"props":1170,"children":1171},{},[1172],{"type":17,"value":1173},"visual",{"type":17,"value":1175}," fill; it is\nnow ",{"type":11,"tag":68,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":17,"value":1181},"surface.raised",{"type":17,"value":1183},", so dark cards separate from the canvas.",{"type":11,"tag":81,"props":1185,"children":1186},{},[1187,1211],{"type":11,"tag":85,"props":1188,"children":1189},{},[1190,1196,1197,1203,1204,1210],{"type":11,"tag":68,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":17,"value":1195},"tableAccent",{"type":17,"value":1136},{"type":11,"tag":68,"props":1198,"children":1200},{"className":1199},[],[1201],{"type":17,"value":1202},"#5C0025",{"type":17,"value":1144},{"type":11,"tag":68,"props":1205,"children":1207},{"className":1206},[],[1208],{"type":17,"value":1209},"#6BB4C0",{"type":17,"value":43},{"type":17,"value":1212}," v1 pinned light-theme\nmaroon regardless of theme, which reads poorly on a dark card; it now\nfollows the theme's own brand anchor.",{"type":11,"tag":81,"props":1214,"children":1215},{},[1216,1221,1222,1227,1229,1235,1237,1243,1245,1251,1253,1259,1261,1267,1268,1274,1275,1281,1282,1288,1289,1295,1296,1302,1304,1309],{"type":11,"tag":85,"props":1217,"children":1218},{},[1219],{"type":17,"value":1220},"Added",{"type":17,"value":996},{"type":11,"tag":68,"props":1223,"children":1225},{"className":1224},[],[1226],{"type":17,"value":720},{"type":17,"value":1228},", a ",{"type":11,"tag":68,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":17,"value":1234},"baseTheme",{"type":17,"value":1236}," pin (",{"type":11,"tag":68,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":17,"value":1242},"Fluent2-CY26SU08",{"type":17,"value":1244}," — ",{"type":11,"tag":68,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":17,"value":1250},"CY24SU06",{"type":17,"value":1252},"\nis two generations stale), the structural set\n(",{"type":11,"tag":68,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":17,"value":1258},"firstLevelElements",{"type":17,"value":1260},"…",{"type":11,"tag":68,"props":1262,"children":1264},{"className":1263},[],[1265],{"type":17,"value":1266},"fourthLevelElements",{"type":17,"value":95},{"type":11,"tag":68,"props":1269,"children":1271},{"className":1270},[],[1272],{"type":17,"value":1273},"secondaryBackground",{"type":17,"value":489},{"type":11,"tag":68,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":17,"value":1280},"shapeStroke",{"type":17,"value":95},{"type":11,"tag":68,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":17,"value":1287},"disabledText",{"type":17,"value":95},{"type":11,"tag":68,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":17,"value":1294},"hyperlink",{"type":17,"value":95},{"type":11,"tag":68,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":17,"value":1301},"visitedHyperlink",{"type":17,"value":1303},"), a\nbrand-anchored divergent ramp, and ",{"type":11,"tag":68,"props":1305,"children":1307},{"className":1306},[],[1308],{"type":17,"value":557},{"type":17,"value":1310}," for 26 visual types.",{"type":11,"tag":81,"props":1312,"children":1313},{},[1314,1325,1327,1333,1335,1341],{"type":11,"tag":85,"props":1315,"children":1316},{},[1317,1319],{"type":17,"value":1318},"Exports ",{"type":11,"tag":68,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":17,"value":1324},"generate()",{"type":17,"value":1326},", so ",{"type":11,"tag":68,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":17,"value":1332},"tests\u002Ftux-kit-targets.test.ts",{"type":17,"value":1334}," can\nbyte-lock the output. ",{"type":11,"tag":68,"props":1336,"children":1338},{"className":1337},[],[1339],{"type":17,"value":1340},"build-powerbi-theme.mjs",{"type":17,"value":1342}," was the only Tier-1\nemitter with no lock test — it could drift from tokens silently, which\nis precisely the failure class its own header comment claims to end.",{"type":11,"tag":56,"props":1344,"children":1346},{"id":1345},"added-atlas-portal-tile-2026-08-31",[1347],{"type":17,"value":1348},"Added — Atlas portal tile (2026-08-31)",{"type":11,"tag":77,"props":1350,"children":1351},{},[1352,1402,1419],{"type":11,"tag":81,"props":1353,"children":1354},{},[1355,1364,1365,1371,1372,1378,1379,1385,1387,1393,1395,1400],{"type":11,"tag":85,"props":1356,"children":1357},{},[1358],{"type":11,"tag":68,"props":1359,"children":1361},{"className":1360},[],[1362],{"type":17,"value":1363},"atlas",{"type":17,"value":1244},{"type":11,"tag":68,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":17,"value":1370},"Atlas",{"type":17,"value":95},{"type":11,"tag":68,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":17,"value":1377},"https:\u002F\u002Fatlas.tti.tamu.edu",{"type":17,"value":95},{"type":11,"tag":68,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":17,"value":1384},"audience:\"entitled\"",{"type":17,"value":1386},",\nplaced beside ",{"type":11,"tag":68,"props":1388,"children":1390},{"className":1389},[],[1391],{"type":17,"value":1392},"landscape",{"type":17,"value":1394}," (the two gated portals sit together). The site\nreturns ",{"type":11,"tag":85,"props":1396,"children":1397},{},[1398],{"type":17,"value":1399},"403",{"type":17,"value":1401}," to non-members, so like Landscape it enforces its own access\nand the tile is hidden rather than shown-and-refused.",{"type":11,"tag":81,"props":1403,"children":1404},{},[1405,1411,1413,1418],{"type":11,"tag":68,"props":1406,"children":1408},{"className":1407},[],[1409],{"type":17,"value":1410},"_meta.version",{"type":17,"value":1412}," 2 → 3. Anonymous now sees ",{"type":11,"tag":85,"props":1414,"children":1415},{},[1416],{"type":17,"value":1417},"4 of 6",{"type":17,"value":43},{"type":11,"tag":81,"props":1420,"children":1421},{},[1422,1424,1430],{"type":17,"value":1423},"Entitlement is resolved per-portal server-side; TTI Code gates this tile on\nthe Entra group that governs it today. Nothing about the mapping is in this\nfile — see ",{"type":11,"tag":68,"props":1425,"children":1427},{"className":1426},[],[1428],{"type":17,"value":1429},"design\u002Funification-plan.md",{"type":17,"value":1431}," (Registry doctrine).",{"type":11,"tag":56,"props":1433,"children":1435},{"id":1434},"changed-tti-portals-roster-2026-08-30",[1436],{"type":17,"value":1437},"Changed — TTI Portals roster (2026-08-30)",{"type":11,"tag":77,"props":1439,"children":1440},{},[1441,1497,1537,1590,1628],{"type":11,"tag":81,"props":1442,"children":1443},{},[1444,1461,1463,1469,1470,1476,1477,1483,1484,1489,1490,1496],{"type":11,"tag":85,"props":1445,"children":1446},{},[1447,1453,1454,1459],{"type":11,"tag":68,"props":1448,"children":1450},{"className":1449},[],[1451],{"type":17,"value":1452},"design\u002Fapps.json",{"type":17,"value":996},{"type":11,"tag":68,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":17,"value":1410},{"type":17,"value":1460}," 1 → 2.",{"type":17,"value":1462}," New roster order:\n",{"type":11,"tag":68,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":17,"value":1468},"tti-www",{"type":17,"value":1144},{"type":11,"tag":68,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":17,"value":1475},"tti-my",{"type":17,"value":1144},{"type":11,"tag":68,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":17,"value":1482},"tux",{"type":17,"value":1144},{"type":11,"tag":68,"props":1485,"children":1487},{"className":1486},[],[1488],{"type":17,"value":1392},{"type":17,"value":1144},{"type":11,"tag":68,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":17,"value":1495},"tti-code",{"type":17,"value":43},{"type":11,"tag":81,"props":1498,"children":1499},{},[1500,1511,1513,1519,1521,1527,1529,1535],{"type":11,"tag":85,"props":1501,"children":1502},{},[1503,1509],{"type":11,"tag":68,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":17,"value":1508},"ai-studio",{"type":17,"value":1510}," removed from the roster",{"type":17,"value":1512}," (owner call). The\n",{"type":11,"tag":68,"props":1514,"children":1516},{"className":1515},[],[1517],{"type":17,"value":1518},"\u002Flaunch\u002Fai-studio",{"type":17,"value":1520}," interstitial, the forge's repo-header \"Open in\nAI Studio\" button, and the ratified desktop-link law all survive —\nthe tile is gone, the integration is not. With no ",{"type":11,"tag":68,"props":1522,"children":1524},{"className":1523},[],[1525],{"type":17,"value":1526},"kind:\"desktop\"",{"type":17,"value":1528},"\nentry left, that law is dormant; ",{"type":11,"tag":68,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":17,"value":1534},"tests\u002FuseTuxApps.test.ts",{"type":17,"value":1536}," now\nasserts the zero-count so the dormancy is explicit rather than a\nvacuously green test.",{"type":11,"tag":81,"props":1538,"children":1539},{},[1540,1550,1551,1557,1559,1565,1567,1573,1575,1581,1583,1588],{"type":11,"tag":85,"props":1541,"children":1542},{},[1543,1548],{"type":11,"tag":68,"props":1544,"children":1546},{"className":1545},[],[1547],{"type":17,"value":1475},{"type":17,"value":1549}," added",{"type":17,"value":1244},{"type":11,"tag":68,"props":1552,"children":1554},{"className":1553},[],[1555],{"type":17,"value":1556},"my.TTI",{"type":17,"value":1558},", the internal site at\n",{"type":11,"tag":68,"props":1560,"children":1562},{"className":1561},[],[1563],{"type":17,"value":1564},"https:\u002F\u002Fmy.tti.tamu.edu",{"type":17,"value":1566},". Shipped ",{"type":11,"tag":68,"props":1568,"children":1570},{"className":1569},[],[1571],{"type":17,"value":1572},"audience:\"public\"",{"type":17,"value":1574},": the site\nenforces its own SSO, and ",{"type":11,"tag":68,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":17,"value":1580},"authenticated",{"type":17,"value":1582}," is enforced upstream but\nis a ",{"type":11,"tag":85,"props":1584,"children":1585},{},[1586],{"type":17,"value":1587},"no-op",{"type":17,"value":1589}," in the forge deployment (its waffle renders outside\nthe signed-in guard), so shipping it would create a field that means\none thing here and nothing downstream.",{"type":11,"tag":81,"props":1591,"children":1592},{},[1593,1603,1605,1611,1613,1619,1621,1627],{"type":11,"tag":85,"props":1594,"children":1595},{},[1596,1601],{"type":11,"tag":68,"props":1597,"children":1599},{"className":1598},[],[1600],{"type":17,"value":1468},{"type":17,"value":1602}," repointed",{"type":17,"value":1604}," to the apex ",{"type":11,"tag":68,"props":1606,"children":1608},{"className":1607},[],[1609],{"type":17,"value":1610},"https:\u002F\u002Ftti.tamu.edu",{"type":17,"value":1612}," (verified\nHTTP 200 with zero redirects; ",{"type":11,"tag":68,"props":1614,"children":1616},{"className":1615},[],[1617],{"type":17,"value":1618},"www.",{"type":17,"value":1620}," 301s to it) and renamed ",{"type":11,"tag":68,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":17,"value":1626},"TTI",{"type":17,"value":43},{"type":11,"tag":81,"props":1629,"children":1630},{},[1631,1641,1642,1648,1650,1656,1658,1664,1666,1672,1674,1679,1681,1686],{"type":11,"tag":85,"props":1632,"children":1633},{},[1634,1639],{"type":11,"tag":68,"props":1635,"children":1637},{"className":1636},[],[1638],{"type":17,"value":1384},{"type":17,"value":1640}," remains ADVISORY upstream",{"type":17,"value":1244},{"type":11,"tag":68,"props":1643,"children":1645},{"className":1644},[],[1646],{"type":17,"value":1647},"app\u002Fapp.vue",{"type":17,"value":1649},"\nrenders ",{"type":11,"tag":68,"props":1651,"children":1653},{"className":1652},[],[1654],{"type":17,"value":1655},"\u003CTuxUtilityCluster current=\"tux\" \u002F>",{"type":17,"value":1657}," with no ",{"type":11,"tag":68,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":17,"value":1663},"entitled",{"type":17,"value":1665},"\nprop, so ux.tti.tamu.edu shows ",{"type":11,"tag":68,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":17,"value":1671},"public",{"type":17,"value":1673}," tiles only. Enforcement is a\nper-portal obligation, and ",{"type":11,"tag":85,"props":1675,"children":1676},{},[1677],{"type":17,"value":1678},"TTI Code ships the first resolver",{"type":17,"value":1680},":\nLandscape's tile is never baked and never published, and is added\nper-caller from Entra security-group membership. See\n",{"type":11,"tag":68,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":17,"value":1429},{"type":17,"value":1687}," (Registry doctrine, amended 2026-08-30).",{"type":11,"tag":56,"props":1689,"children":1691},{"id":1690},"added-framework-targets-tier-1-2026-08-19",[1692],{"type":17,"value":1693},"Added — framework targets, tier 1 (2026-08-19)",{"type":11,"tag":77,"props":1695,"children":1696},{},[1697,1741,1763,1784,1835,1893,1911,1960],{"type":11,"tag":81,"props":1698,"children":1699},{},[1700,1709,1711,1717,1718,1724,1725,1731,1733,1739],{"type":11,"tag":85,"props":1701,"children":1702},{},[1703],{"type":11,"tag":68,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":17,"value":1708},"kit\u002Fcsharp\u002FTuxTokens.cs",{"type":17,"value":1710}," — resolved token literals for .NET\nconsumers: one static class per theme (",{"type":11,"tag":68,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":17,"value":1716},"Tti",{"type":17,"value":875},{"type":11,"tag":68,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":17,"value":1723},"TtiDark",{"type":17,"value":875},{"type":11,"tag":68,"props":1726,"children":1728},{"className":1727},[],[1729],{"type":17,"value":1730},"TtiHc",{"type":17,"value":1732},")\nwith PascalCased consts + an ",{"type":11,"tag":68,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":17,"value":1738},"All",{"type":17,"value":1740}," dictionary for dynamic lookup.",{"type":11,"tag":81,"props":1742,"children":1743},{},[1744,1753,1755,1761],{"type":11,"tag":85,"props":1745,"children":1746},{},[1747],{"type":11,"tag":68,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":17,"value":1752},"kit\u002Freact\u002Ftux-tokens.ts",{"type":17,"value":1754}," — per-theme resolved token maps for\nReact\u002FTS apps outside the Nuxt layer, plus ",{"type":11,"tag":68,"props":1756,"children":1758},{"className":1757},[],[1759],{"type":17,"value":1760},"tuxVar()",{"type":17,"value":1762}," for the\nCSS-custom-property spelling when the CSS kit is loaded.",{"type":11,"tag":81,"props":1764,"children":1765},{},[1766,1775,1777,1783],{"type":11,"tag":85,"props":1767,"children":1768},{},[1769],{"type":11,"tag":68,"props":1770,"children":1772},{"className":1771},[],[1773],{"type":17,"value":1774},"kit\u002Fwp\u002Ftheme.json",{"type":17,"value":1776}," — WordPress block-theme settings (v3):\n29-entry TUX palette, the four families + mono as fontFamilies,\nradius\u002Fwash\u002Frhythm under ",{"type":11,"tag":68,"props":1778,"children":1780},{"className":1779},[],[1781],{"type":17,"value":1782},"settings.custom.tux",{"type":17,"value":43},{"type":11,"tag":81,"props":1785,"children":1786},{},[1787,1789,1795,1797,1803,1805,1810,1812,1818,1820,1826,1828,1833],{"type":17,"value":1788},"All three come from ",{"type":11,"tag":68,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":17,"value":1794},"scripts\u002Fbuild-framework-targets.mjs",{"type":17,"value":1796},", which\nshares ",{"type":11,"tag":68,"props":1798,"children":1800},{"className":1799},[],[1801],{"type":17,"value":1802},"build-tokens.mjs",{"type":17,"value":1804},"'s selector builder and ",{"type":11,"tag":85,"props":1806,"children":1807},{},[1808],{"type":17,"value":1809},"resolves",{"type":17,"value":1811}," var()\nchains, aliases, and wash ",{"type":11,"tag":68,"props":1813,"children":1815},{"className":1814},[],[1816],{"type":17,"value":1817},"color-mix",{"type":17,"value":1819}," to literals per theme (dark\nwashes correctly compute over the teal anchor). Wired into\n",{"type":11,"tag":68,"props":1821,"children":1823},{"className":1822},[],[1824],{"type":17,"value":1825},"npm run build:kit",{"type":17,"value":1827},"; ",{"type":11,"tag":68,"props":1829,"children":1831},{"className":1830},[],[1832],{"type":17,"value":1332},{"type":17,"value":1834}," locks the\ncommitted outputs to the generator and pins resolution semantics.",{"type":11,"tag":81,"props":1836,"children":1837},{},[1838,1849,1851,1857,1859,1864,1866,1875,1877,1883,1885,1891],{"type":11,"tag":85,"props":1839,"children":1840},{},[1841,1843],{"type":17,"value":1842},"Multi-language monorepo + ",{"type":11,"tag":68,"props":1844,"children":1846},{"className":1845},[],[1847],{"type":17,"value":1848},"@tti\u002Ftti-ux-react",{"type":17,"value":1850}," (owner-ratified:\nports live in this repo). npm workspaces; ",{"type":11,"tag":68,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":17,"value":1856},"packages\u002Freact",{"type":17,"value":1858}," ships\n",{"type":11,"tag":68,"props":1860,"children":1862},{"className":1861},[],[1863],{"type":17,"value":1848},{"type":17,"value":1865}," (version-locked, same tag train, published by\nthe extended publish workflow). First port as proof:\n",{"type":11,"tag":85,"props":1867,"children":1868},{},[1869],{"type":11,"tag":68,"props":1870,"children":1872},{"className":1871},[],[1873],{"type":17,"value":1874},"TuxBigStat",{"type":17,"value":1876}," — identical props\u002FBEM\u002Ftokens, byte-equivalent CSS,\n4 port-fidelity tests, ledger entry pinned to the source hash.\nRepo ",{"type":11,"tag":68,"props":1878,"children":1880},{"className":1879},[],[1881],{"type":17,"value":1882},".npmrc",{"type":17,"value":1884}," maps the ",{"type":11,"tag":68,"props":1886,"children":1888},{"className":1887},[],[1889],{"type":17,"value":1890},"@tti",{"type":17,"value":1892}," scope to the Forgejo registry (the\nsame line consumers add).",{"type":11,"tag":81,"props":1894,"children":1895},{},[1896,1901,1903,1909],{"type":11,"tag":85,"props":1897,"children":1898},{},[1899],{"type":17,"value":1900},"Port-writer bot specced",{"type":17,"value":1902}," (kit-pipeline.md): ",{"type":11,"tag":68,"props":1904,"children":1906},{"className":1905},[],[1907],{"type":17,"value":1908},"tux-port-bot",{"type":17,"value":1910},"\nservice account leveraging the superPOD models via the BFF like the\nexisting bots (dedicated PAT + actor attribution), writing drafts\ninto the drift-bot's PR shape; degrades to detection-only until the\nowner mints the account. Platform direction recorded for TTI Code:\nper-repo toggleable bots, security review non-optional.",{"type":11,"tag":81,"props":1912,"children":1913},{},[1914,1919,1920,1926,1928,1934,1936,1942,1944,1950,1952,1958],{"type":11,"tag":85,"props":1915,"children":1916},{},[1917],{"type":17,"value":1918},"Port-drift bot (tier 2, detection stage)",{"type":17,"value":1244},{"type":11,"tag":68,"props":1921,"children":1923},{"className":1922},[],[1924],{"type":17,"value":1925},"ports-sync.yml",{"type":17,"value":1927},"\nruns on every merge to main touching ",{"type":11,"tag":68,"props":1929,"children":1931},{"className":1930},[],[1932],{"type":17,"value":1933},"Tux*.vue",{"type":17,"value":1935},": updates the port\nledger (",{"type":11,"tag":68,"props":1937,"children":1939},{"className":1938},[],[1940],{"type":17,"value":1941},"kit\u002Fports\u002Fmanifest.json",{"type":17,"value":1943},", 153 components tracked by\ncontent hash) + ",{"type":11,"tag":68,"props":1945,"children":1947},{"className":1946},[],[1948],{"type":17,"value":1949},"kit\u002Fports\u002FQUEUE.md",{"type":17,"value":1951},", pushes a bot branch, and\nopens a PR that the existing gates — including the ai-review\nsuperPOD panel — judge like any human PR. Built entirely on\nexisting access (job token + the ai-review bot PAT); no new BFF\nendpoints or tokens (owner decision). The ledger's ",{"type":11,"tag":68,"props":1953,"children":1955},{"className":1954},[],[1956],{"type":17,"value":1957},"--check",{"type":17,"value":1959}," mode\nruns in the test suite, so a component can't land without the\nledger following it.",{"type":11,"tag":81,"props":1961,"children":1962},{},[1963,1971],{"type":11,"tag":85,"props":1964,"children":1965},{},[1966],{"type":11,"tag":68,"props":1967,"children":1969},{"className":1968},[],[1970],{"type":17,"value":238},{"type":17,"value":1972}," — the two-tier doctrine: tier 1\n(deterministic emitters, fully automatic, zero AI, publish on tag)\nvs tier 2 (component ports via the TTI AI BFF superPOD panel:\nautomatic generation + mechanical verification + PR-gated\ndelivery; proposed architecture documented, not yet built).",{"type":11,"tag":45,"props":1974,"children":1976},{"id":1975},"_200-2026-08-19",[1977,1982],{"type":11,"tag":50,"props":1978,"children":1979},{},[1980],{"type":17,"value":1981},"2.0.0",{"type":17,"value":1983}," — 2026-08-19",{"type":11,"tag":19,"props":1985,"children":1986},{},[1987,1989,1994],{"type":17,"value":1988},"The language major. Everything a consumer touches — prop words, emit\nnames, token set, package identity — is now the ratified vocabulary,\nreleased as one coordinated break ",{"type":11,"tag":155,"props":1990,"children":1991},{},[1992],{"type":17,"value":1993},"before",{"type":17,"value":1995}," the multi-target token\nexpansion (C# \u002F React \u002F WordPress kits) multiplies the consumer\ncount.",{"type":11,"tag":56,"props":1997,"children":1999},{"id":1998},"fixed",[2000],{"type":17,"value":2001},"Fixed",{"type":11,"tag":77,"props":2003,"children":2004},{},[2005],{"type":11,"tag":81,"props":2006,"children":2007},{},[2008,2013,2015,2020,2021,2027,2029,2035,2037,2043,2045,2050],{"type":11,"tag":85,"props":2009,"children":2010},{},[2011],{"type":17,"value":2012},"Wash tokens resolved to nothing between the language-closeout\nmerge and this release",{"type":17,"value":2014},": the mechanical wash sweep had also\nrewritten the ",{"type":11,"tag":155,"props":2016,"children":2017},{},[2018],{"type":17,"value":2019},"generated",{"type":17,"value":996},{"type":11,"tag":68,"props":2022,"children":2024},{"className":2023},[],[2025],{"type":17,"value":2026},"tokens.css",{"type":17,"value":2028},", turning the ",{"type":11,"tag":68,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":17,"value":2034},"--wash-brand-*",{"type":17,"value":2036},"\ndefinitions into self-references (",{"type":11,"tag":68,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":17,"value":2042},"--wash-brand-4: var(--wash-brand-4)",{"type":17,"value":2044},"), which are invalid at computed-value time.\nRegenerated from source; ",{"type":11,"tag":68,"props":2046,"children":2048},{"className":2047},[],[2049],{"type":17,"value":583},{"type":17,"value":2051}," now hard-fails on any\nself-referential token definition so this bug class can't ship\nagain.",{"type":11,"tag":56,"props":2053,"children":2055},{"id":2054},"breaking-package-identity-distribution",[2056],{"type":17,"value":2057},"Breaking — package identity & distribution",{"type":11,"tag":77,"props":2059,"children":2060},{},[2061],{"type":11,"tag":81,"props":2062,"children":2063},{},[2064,2077,2079,2085,2087,2092,2094,2099,2101,2106,2108,2114,2116,2122,2124,2130],{"type":11,"tag":85,"props":2065,"children":2066},{},[2067,2069,2075],{"type":17,"value":2068},"The package is now ",{"type":11,"tag":68,"props":2070,"children":2072},{"className":2071},[],[2073],{"type":17,"value":2074},"@tti\u002Ftti-ux",{"type":17,"value":2076},", published to the Forgejo npm\nregistry",{"type":17,"value":2078}," (",{"type":11,"tag":68,"props":2080,"children":2082},{"className":2081},[],[2083],{"type":17,"value":2084},"code.tti.tamu.edu\u002Fapi\u002Fpackages\u002Ftti\u002Fnpm\u002F",{"type":17,"value":2086},") on every\nversion tag — Forgejo is the canonical install source. Migration:\nadd the ",{"type":11,"tag":68,"props":2088,"children":2090},{"className":2089},[],[2091],{"type":17,"value":1890},{"type":17,"value":2093}," scope to ",{"type":11,"tag":68,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":17,"value":1882},{"type":17,"value":2100},", depend on ",{"type":11,"tag":68,"props":2102,"children":2104},{"className":2103},[],[2105],{"type":17,"value":2074},{"type":17,"value":2107},", and use\n",{"type":11,"tag":68,"props":2109,"children":2111},{"className":2110},[],[2112],{"type":17,"value":2113},"extends: [\"@tti\u002Ftti-ux\"]",{"type":17,"value":2115}," in ",{"type":11,"tag":68,"props":2117,"children":2119},{"className":2118},[],[2120],{"type":17,"value":2121},"nuxt.config.ts",{"type":17,"value":2123},". The old\n",{"type":11,"tag":68,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":17,"value":2129},"github:ttitamu\u002Ftti-ux#vX.Y.Z",{"type":17,"value":2131}," pin keeps working for existing\nconsumers but is deprecated — the GitHub repo is a mirror whose\njob is the GitHub Pages deploy of ux.tti.tamu.edu, nothing more.\nSee README § Consuming from another app.",{"type":11,"tag":56,"props":2133,"children":2135},{"id":2134},"breaking-v200-vocabulary-batch-2026-08-19",[2136],{"type":17,"value":2137},"Breaking — v2.0.0 vocabulary batch (2026-08-19)",{"type":11,"tag":19,"props":2139,"children":2140},{},[2141],{"type":17,"value":2142},"The canonical prop\u002Femit vocabulary (components.md § \"Prop & emit\nvocabulary\") is now enforced by the APIs themselves. Migration is\nmechanical:",{"type":11,"tag":2144,"props":2145,"children":2146},"table",{},[2147,2171],{"type":11,"tag":2148,"props":2149,"children":2150},"thead",{},[2151],{"type":11,"tag":2152,"props":2153,"children":2154},"tr",{},[2155,2161,2166],{"type":11,"tag":2156,"props":2157,"children":2158},"th",{},[2159],{"type":17,"value":2160},"Component",{"type":11,"tag":2156,"props":2162,"children":2163},{},[2164],{"type":17,"value":2165},"Before",{"type":11,"tag":2156,"props":2167,"children":2168},{},[2169],{"type":17,"value":2170},"After",{"type":11,"tag":2172,"props":2173,"children":2174},"tbody",{},[2175,2206,2238,2269,2304,2351,2382,2414,2454,2492,2529,2567],{"type":11,"tag":2152,"props":2176,"children":2177},{},[2178,2188,2197],{"type":11,"tag":2179,"props":2180,"children":2181},"td",{},[2182],{"type":11,"tag":68,"props":2183,"children":2185},{"className":2184},[],[2186],{"type":17,"value":2187},"TuxFactoid",{"type":11,"tag":2179,"props":2189,"children":2190},{},[2191],{"type":11,"tag":68,"props":2192,"children":2194},{"className":2193},[],[2195],{"type":17,"value":2196},"density: 3|4|5",{"type":11,"tag":2179,"props":2198,"children":2199},{},[2200],{"type":11,"tag":68,"props":2201,"children":2203},{"className":2202},[],[2204],{"type":17,"value":2205},"columns: 3|4|5",{"type":11,"tag":2152,"props":2207,"children":2208},{},[2209,2218,2227],{"type":11,"tag":2179,"props":2210,"children":2211},{},[2212],{"type":11,"tag":68,"props":2213,"children":2215},{"className":2214},[],[2216],{"type":17,"value":2217},"TuxBetaRibbon",{"type":11,"tag":2179,"props":2219,"children":2220},{},[2221],{"type":11,"tag":68,"props":2222,"children":2224},{"className":2223},[],[2225],{"type":17,"value":2226},"tone: preview|beta|dev",{"type":11,"tag":2179,"props":2228,"children":2229},{},[2230,2236],{"type":11,"tag":68,"props":2231,"children":2233},{"className":2232},[],[2234],{"type":17,"value":2235},"kind",{"type":17,"value":2237}," (same values)",{"type":11,"tag":2152,"props":2239,"children":2240},{},[2241,2250,2259],{"type":11,"tag":2179,"props":2242,"children":2243},{},[2244],{"type":11,"tag":68,"props":2245,"children":2247},{"className":2246},[],[2248],{"type":17,"value":2249},"TuxTabs",{"type":11,"tag":2179,"props":2251,"children":2252},{},[2253],{"type":11,"tag":68,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":17,"value":2258},"intent: default|bold",{"type":11,"tag":2179,"props":2260,"children":2261},{},[2262,2268],{"type":11,"tag":68,"props":2263,"children":2265},{"className":2264},[],[2266],{"type":17,"value":2267},"variant",{"type":17,"value":2237},{"type":11,"tag":2152,"props":2270,"children":2271},{},[2272,2281,2292],{"type":11,"tag":2179,"props":2273,"children":2274},{},[2275],{"type":11,"tag":68,"props":2276,"children":2278},{"className":2277},[],[2279],{"type":17,"value":2280},"TuxChartGauge",{"type":11,"tag":2179,"props":2282,"children":2283},{},[2284,2286],{"type":17,"value":2285},"band ",{"type":11,"tag":68,"props":2287,"children":2289},{"className":2288},[],[2290],{"type":17,"value":2291},"intent: ok|warn|alert",{"type":11,"tag":2179,"props":2293,"children":2294},{},[2295,2296,2302],{"type":17,"value":2285},{"type":11,"tag":68,"props":2297,"children":2299},{"className":2298},[],[2300],{"type":17,"value":2301},"tone: success|warning|error",{"type":17,"value":2303}," (band\u002Ffill CSS hooks renamed to match)",{"type":11,"tag":2152,"props":2305,"children":2306},{},[2307,2316,2325],{"type":11,"tag":2179,"props":2308,"children":2309},{},[2310],{"type":11,"tag":68,"props":2311,"children":2313},{"className":2312},[],[2314],{"type":17,"value":2315},"TuxCodeMaroon",{"type":11,"tag":2179,"props":2317,"children":2318},{},[2319],{"type":11,"tag":68,"props":2320,"children":2322},{"className":2321},[],[2323],{"type":17,"value":2324},"severity: alert|warning|info",{"type":11,"tag":2179,"props":2326,"children":2327},{},[2328,2334,2335,2341,2343,2349],{"type":11,"tag":68,"props":2329,"children":2331},{"className":2330},[],[2332],{"type":17,"value":2333},"tone: error|warning|info",{"type":17,"value":2078},{"type":11,"tag":68,"props":2336,"children":2338},{"className":2337},[],[2339],{"type":17,"value":2340},"--alert",{"type":17,"value":2342}," classes now ",{"type":11,"tag":68,"props":2344,"children":2346},{"className":2345},[],[2347],{"type":17,"value":2348},"--error",{"type":17,"value":2350},")",{"type":11,"tag":2152,"props":2352,"children":2353},{},[2354,2363,2372],{"type":11,"tag":2179,"props":2355,"children":2356},{},[2357],{"type":11,"tag":68,"props":2358,"children":2360},{"className":2359},[],[2361],{"type":17,"value":2362},"TuxTestimonial",{"type":11,"tag":2179,"props":2364,"children":2365},{},[2366],{"type":11,"tag":68,"props":2367,"children":2369},{"className":2368},[],[2370],{"type":17,"value":2371},"color",{"type":11,"tag":2179,"props":2373,"children":2374},{},[2375,2381],{"type":11,"tag":68,"props":2376,"children":2378},{"className":2377},[],[2379],{"type":17,"value":2380},"tone",{"type":17,"value":2237},{"type":11,"tag":2152,"props":2383,"children":2384},{},[2385,2394,2403],{"type":11,"tag":2179,"props":2386,"children":2387},{},[2388],{"type":11,"tag":68,"props":2389,"children":2391},{"className":2390},[],[2392],{"type":17,"value":2393},"TuxConfirmDialog",{"type":11,"tag":2179,"props":2395,"children":2396},{},[2397],{"type":11,"tag":68,"props":2398,"children":2400},{"className":2399},[],[2401],{"type":17,"value":2402},"variant: danger",{"type":11,"tag":2179,"props":2404,"children":2405},{},[2406,2408],{"type":17,"value":2407},"removed — use ",{"type":11,"tag":68,"props":2409,"children":2411},{"className":2410},[],[2412],{"type":17,"value":2413},"destructive",{"type":11,"tag":2152,"props":2415,"children":2416},{},[2417,2433,2444],{"type":11,"tag":2179,"props":2418,"children":2419},{},[2420,2426,2427],{"type":11,"tag":68,"props":2421,"children":2423},{"className":2422},[],[2424],{"type":17,"value":2425},"TuxConversationList",{"type":17,"value":875},{"type":11,"tag":68,"props":2428,"children":2430},{"className":2429},[],[2431],{"type":17,"value":2432},"TuxSuggestionChips",{"type":11,"tag":2179,"props":2434,"children":2435},{},[2436,2438],{"type":17,"value":2437},"emit ",{"type":11,"tag":68,"props":2439,"children":2441},{"className":2440},[],[2442],{"type":17,"value":2443},"pick",{"type":11,"tag":2179,"props":2445,"children":2446},{},[2447,2448],{"type":17,"value":2437},{"type":11,"tag":68,"props":2449,"children":2451},{"className":2450},[],[2452],{"type":17,"value":2453},"select",{"type":11,"tag":2152,"props":2455,"children":2456},{},[2457,2473,2483],{"type":11,"tag":2179,"props":2458,"children":2459},{},[2460,2466,2467],{"type":11,"tag":68,"props":2461,"children":2463},{"className":2462},[],[2464],{"type":17,"value":2465},"TuxCitations",{"type":17,"value":875},{"type":11,"tag":68,"props":2468,"children":2470},{"className":2469},[],[2471],{"type":17,"value":2472},"TuxInlineCitation",{"type":11,"tag":2179,"props":2474,"children":2475},{},[2476,2477],{"type":17,"value":2437},{"type":11,"tag":68,"props":2478,"children":2480},{"className":2479},[],[2481],{"type":17,"value":2482},"open",{"type":11,"tag":2179,"props":2484,"children":2485},{},[2486,2487],{"type":17,"value":2437},{"type":11,"tag":68,"props":2488,"children":2490},{"className":2489},[],[2491],{"type":17,"value":2453},{"type":11,"tag":2152,"props":2493,"children":2494},{},[2495,2511,2520],{"type":11,"tag":2179,"props":2496,"children":2497},{},[2498,2504,2505],{"type":11,"tag":68,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":17,"value":2503},"TuxStatComparison",{"type":17,"value":875},{"type":11,"tag":68,"props":2506,"children":2508},{"className":2507},[],[2509],{"type":17,"value":2510},"TuxMapLegend",{"type":11,"tag":2179,"props":2512,"children":2513},{},[2514],{"type":11,"tag":68,"props":2515,"children":2517},{"className":2516},[],[2518],{"type":17,"value":2519},"layout: stack",{"type":11,"tag":2179,"props":2521,"children":2522},{},[2523],{"type":11,"tag":68,"props":2524,"children":2526},{"className":2525},[],[2527],{"type":17,"value":2528},"layout: stacked",{"type":11,"tag":2152,"props":2530,"children":2531},{},[2532,2548,2558],{"type":11,"tag":2179,"props":2533,"children":2534},{},[2535,2541,2542],{"type":11,"tag":68,"props":2536,"children":2538},{"className":2537},[],[2539],{"type":17,"value":2540},"TuxFigureCaption",{"type":17,"value":875},{"type":11,"tag":68,"props":2543,"children":2545},{"className":2544},[],[2546],{"type":17,"value":2547},"TuxTableCaption",{"type":11,"tag":2179,"props":2549,"children":2550},{},[2551,2556],{"type":11,"tag":68,"props":2552,"children":2554},{"className":2553},[],[2555],{"type":17,"value":2235},{"type":17,"value":2557}," (free-form label)",{"type":11,"tag":2179,"props":2559,"children":2560},{},[2561],{"type":11,"tag":68,"props":2562,"children":2564},{"className":2563},[],[2565],{"type":17,"value":2566},"label",{"type":11,"tag":2152,"props":2568,"children":2569},{},[2570,2579,2592],{"type":11,"tag":2179,"props":2571,"children":2572},{},[2573],{"type":11,"tag":68,"props":2574,"children":2576},{"className":2575},[],[2577],{"type":17,"value":2578},"TuxRichTextEditor",{"type":11,"tag":2179,"props":2580,"children":2581},{},[2582,2584,2590],{"type":17,"value":2583},"duplicate bare ",{"type":11,"tag":68,"props":2585,"children":2587},{"className":2586},[],[2588],{"type":17,"value":2589},"update",{"type":17,"value":2591}," emit",{"type":11,"tag":2179,"props":2593,"children":2594},{},[2595,2596],{"type":17,"value":2407},{"type":11,"tag":68,"props":2597,"children":2599},{"className":2598},[],[2600],{"type":17,"value":2601},"update:modelValue",{"type":11,"tag":19,"props":2603,"children":2604},{},[2605,2607,2613,2615,2621,2623,2629],{"type":17,"value":2606},"Added (non-breaking, same batch): ",{"type":11,"tag":68,"props":2608,"children":2610},{"className":2609},[],[2611],{"type":17,"value":2612},"TuxTreemap",{"type":17,"value":2614}," now emits the family\n",{"type":11,"tag":68,"props":2616,"children":2618},{"className":2617},[],[2619],{"type":17,"value":2620},"hover",{"type":17,"value":2622}," payload (",{"type":11,"tag":68,"props":2624,"children":2626},{"className":2625},[],[2627],{"type":17,"value":2628},"{ path, size, depth, childCount } \\| null",{"type":17,"value":2630},").",{"type":11,"tag":56,"props":2632,"children":2634},{"id":2633},"changed-language-closeout-2026-08-19-second-pass",[2635],{"type":17,"value":2636},"Changed — language closeout (2026-08-19, second pass)",{"type":11,"tag":77,"props":2638,"children":2639},{},[2640,2664,2697,2747],{"type":11,"tag":81,"props":2641,"children":2642},{},[2643,2648,2650,2655,2657,2662],{"type":11,"tag":85,"props":2644,"children":2645},{},[2646],{"type":17,"value":2647},"The wash ladder",{"type":17,"value":2649}," (visual-language-evolution.md § Batch L): all\ntransparent-tint washes collapse from 22 eyeballed ",{"type":11,"tag":68,"props":2651,"children":2653},{"className":2652},[],[2654],{"type":17,"value":1817},{"type":17,"value":2656},"\npercentages onto the ratified ladder {4 · 6 · 8 · 12 · 18 · 22 ·\n35 · 50}; maroon washes use new named tokens ",{"type":11,"tag":68,"props":2658,"children":2660},{"className":2659},[],[2661],{"type":17,"value":2034},{"type":17,"value":2663},"\n(theme-aware via the brand anchor). ≥60% scrims exempt.",{"type":11,"tag":81,"props":2665,"children":2666},{},[2667,2672,2674,2680,2681,2687,2689,2695],{"type":11,"tag":85,"props":2668,"children":2669},{},[2670],{"type":17,"value":2671},"Chart tooltip chrome consolidated",{"type":17,"value":2673}," into\n",{"type":11,"tag":68,"props":2675,"children":2677},{"className":2676},[],[2678],{"type":17,"value":2679},"tux-chart-chrome.css",{"type":17,"value":2078},{"type":11,"tag":68,"props":2682,"children":2684},{"className":2683},[],[2685],{"type":17,"value":2686},".tux-chart-tooltip",{"type":17,"value":2688}," shell + ",{"type":11,"tag":68,"props":2690,"children":2692},{"className":2691},[],[2693],{"type":17,"value":2694},"--flip",{"type":17,"value":2696},"),\nremoving nine near-identical scoped blocks; treemap keeps only its\nwider max-width and now shares the family border (was a one-off\nmaroon border).",{"type":11,"tag":81,"props":2698,"children":2699},{},[2700,2705,2707,2713,2715,2721,2723,2729,2731,2737,2739,2745],{"type":11,"tag":85,"props":2701,"children":2702},{},[2703],{"type":17,"value":2704},"On-brand ink correctness in dark mode",{"type":17,"value":2706},": white-on-",{"type":11,"tag":68,"props":2708,"children":2710},{"className":2709},[],[2711],{"type":17,"value":2712},"--brand-primary",{"type":17,"value":2714},"\ncontrols (rich-data-grid selection\u002Fbulk bar, pagination active,\nalpha-nav active) now use ",{"type":11,"tag":68,"props":2716,"children":2718},{"className":2717},[],[2719],{"type":17,"value":2720},"--text-inverse",{"type":17,"value":2722}," — dark ink on the dark\ntheme's light teal anchor instead of broken white-on-teal.\n",{"type":11,"tag":68,"props":2724,"children":2726},{"className":2725},[],[2727],{"type":17,"value":2728},"TuxSignupFeature",{"type":17,"value":2730},"'s maroon panel moves to ",{"type":11,"tag":68,"props":2732,"children":2734},{"className":2733},[],[2735],{"type":17,"value":2736},"--brand-fill",{"type":17,"value":2738}," +\n",{"type":11,"tag":68,"props":2740,"children":2742},{"className":2741},[],[2743],{"type":17,"value":2744},"--text-on-brand",{"type":17,"value":2746}," (stays maroon in every theme, per the\nbrand-fill doctrine); its whites\u002Falphas tokenized.",{"type":11,"tag":81,"props":2748,"children":2749},{},[2750,2755,2756,2762,2764,2770,2772,2778],{"type":11,"tag":85,"props":2751,"children":2752},{},[2753],{"type":17,"value":2754},"Guards",{"type":17,"value":621},{"type":11,"tag":68,"props":2757,"children":2759},{"className":2758},[],[2760],{"type":17,"value":2761},"tests\u002Ftux-color.test.ts",{"type":17,"value":2763}," enforces the wash ladder and\nfreezes raw color literals per component at an exact-budget\nratchet (sanctioned chrome documented inline);\n",{"type":11,"tag":68,"props":2765,"children":2767},{"className":2766},[],[2768],{"type":17,"value":2769},"scripts\u002Faudit-tokens.mjs",{"type":17,"value":2771}," no longer blanket-exempts Tailwind\nprefixes the app also owns (the hole that let ",{"type":11,"tag":68,"props":2773,"children":2775},{"className":2774},[],[2776],{"type":17,"value":2777},"--radius-full",{"type":17,"value":2779}," ship\nundefined).",{"type":11,"tag":56,"props":2781,"children":2783},{"id":2782},"changed-visual-language-unification-pass-2026-08-19-first-pass",[2784],{"type":17,"value":2785},"Changed — visual-language unification pass (2026-08-19, first pass)",{"type":11,"tag":19,"props":2787,"children":2788},{},[2789],{"type":17,"value":2790},"One deep pass to make the whole catalog speak the same language,\ndriven by three full-repo sweeps (typography, color\u002Ftokens, API\nvocabulary) plus a light\u002Fdark browser walk. Fix highlights:",{"type":11,"tag":77,"props":2792,"children":2793},{},[2794,2866,2900,2946,2986,3012,3044,3054],{"type":11,"tag":81,"props":2795,"children":2796},{},[2797,2802,2804,2810,2812,2818,2820,2826,2828,2834,2836,2841,2843,2849,2851,2856,2858,2864],{"type":11,"tag":85,"props":2798,"children":2799},{},[2800],{"type":17,"value":2801},"Typography: the four-family rule is now real.",{"type":17,"value":2803}," All 78 references\nto the deprecated ",{"type":11,"tag":68,"props":2805,"children":2807},{"className":2806},[],[2808],{"type":17,"value":2809},"--font-sans",{"type":17,"value":2811}," (Public Sans) are gone from app\ncode — chart roots and body text moved to ",{"type":11,"tag":68,"props":2813,"children":2815},{"className":2814},[],[2816],{"type":17,"value":2817},"--font-body",{"type":17,"value":2819},"; TabBar \u002F\nMenuBar \u002F FAB label controls moved to ",{"type":11,"tag":68,"props":2821,"children":2823},{"className":2822},[],[2824],{"type":17,"value":2825},"--font-bold",{"type":17,"value":2827},"; the token\nitself now aliases the body stack for legacy consumers. Dead\n",{"type":11,"tag":68,"props":2829,"children":2831},{"className":2830},[],[2832],{"type":17,"value":2833},"var(--font-x, var(--font-y))",{"type":17,"value":2835}," fallback chains stripped. Stat\nvalues that wore Oswald outside its H1–H3 lane (TuxResearcher \u002F\nTuxLab \u002F TuxProgram metrics, TuxStatComparison, donut + gauge\ncenter stats) now use the TuxBigStat numeral face (",{"type":11,"tag":68,"props":2837,"children":2839},{"className":2838},[],[2840],{"type":17,"value":2817},{"type":17,"value":2842},"\n700 + tabular figures). Numeric readouts (chart tooltip values,\nlegend stats, R², code-block line numbers) join the\n",{"type":11,"tag":68,"props":2844,"children":2846},{"className":2845},[],[2847],{"type":17,"value":2848},"--font-mono",{"type":17,"value":2850}," + tabular-nums pattern; counting affordances\n(composer counter, facet counts, sparkline delta, file sizes) gain\ntabular figures. Mermaid diagrams read the live ",{"type":11,"tag":68,"props":2852,"children":2854},{"className":2853},[],[2855],{"type":17,"value":2817},{"type":17,"value":2857},"\ntoken instead of a pasted stack. ",{"type":11,"tag":68,"props":2859,"children":2861},{"className":2860},[],[2862],{"type":17,"value":2863},"tests\u002Ftux-typography.test.ts",{"type":17,"value":2865},"\nnow guards all of it in CI.",{"type":11,"tag":81,"props":2867,"children":2868},{},[2869,2874,2876,2882,2884,2890,2892,2898],{"type":11,"tag":85,"props":2870,"children":2871},{},[2872],{"type":17,"value":2873},"Elevation system actually adopted.",{"type":17,"value":2875}," All hand-rolled box-shadows\nand legacy ",{"type":11,"tag":68,"props":2877,"children":2879},{"className":2878},[],[2880],{"type":17,"value":2881},"--shadow-sm\u002Fmd\u002Flg",{"type":17,"value":2883}," component references migrated to\nthe four-tier ",{"type":11,"tag":68,"props":2885,"children":2887},{"className":2886},[],[2888],{"type":17,"value":2889},"--elevation-*",{"type":17,"value":2891}," tokens (identical values in\nlight\u002Fdark — but the high-contrast theme suppresses blur shadows\nthrough the elevation tokens only, so every migrated site now\nrenders correctly in HC). TuxRichDataGrid's hand-rolled focus ring\nnow uses the universal ",{"type":11,"tag":68,"props":2893,"children":2895},{"className":2894},[],[2896],{"type":17,"value":2897},"--shadow-focus",{"type":17,"value":2899}," two-ring.",{"type":11,"tag":81,"props":2901,"children":2902},{},[2903,2913,2915,2921,2923,2928,2930,2936,2938,2944],{"type":11,"tag":85,"props":2904,"children":2905},{},[2906,2911],{"type":11,"tag":68,"props":2907,"children":2909},{"className":2908},[],[2910],{"type":17,"value":2777},{"type":17,"value":2912}," finally exists.",{"type":17,"value":2914}," Six components referenced it\nbefore it was ever defined — an invalid ",{"type":11,"tag":68,"props":2916,"children":2918},{"className":2917},[],[2919],{"type":17,"value":2920},"var()",{"type":17,"value":2922}," that rendered\nsuggestion chips, removable chips, info labels, and context meters\n",{"type":11,"tag":85,"props":2924,"children":2925},{},[2926],{"type":17,"value":2927},"square",{"type":17,"value":2929}," instead of pill. Token added (9999px), literal ",{"type":11,"tag":68,"props":2931,"children":2933},{"className":2932},[],[2934],{"type":17,"value":2935},"9999px",{"type":17,"value":2937},"\nsites converted, wrong-value radius fallbacks\n(",{"type":11,"tag":68,"props":2939,"children":2941},{"className":2940},[],[2942],{"type":17,"value":2943},"var(--radius-sm, 4px)",{"type":17,"value":2945},") cleaned.",{"type":11,"tag":81,"props":2947,"children":2948},{},[2949,2954,2956,2962,2964,2970,2972,2978,2979,2985],{"type":11,"tag":85,"props":2950,"children":2951},{},[2952],{"type":17,"value":2953},"Gold-surface ink promoted to tokens.",{"type":17,"value":2955}," The 12 pasted ",{"type":11,"tag":68,"props":2957,"children":2959},{"className":2958},[],[2960],{"type":17,"value":2961},"#2A0E15",{"type":17,"value":2963},"\n(\"ink on gold\") and 6 pasted ",{"type":11,"tag":68,"props":2965,"children":2967},{"className":2966},[],[2968],{"type":17,"value":2969},"#A87B1F",{"type":17,"value":2971}," (gold gradient deep stop)\nliterals became ",{"type":11,"tag":68,"props":2973,"children":2975},{"className":2974},[],[2976],{"type":17,"value":2977},"--brand-accent-ink",{"type":17,"value":875},{"type":11,"tag":68,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":17,"value":2984},"--brand-accent-shade",{"type":17,"value":43},{"type":11,"tag":81,"props":2987,"children":2988},{},[2989,2994,2996,3002,3004,3010],{"type":11,"tag":85,"props":2990,"children":2991},{},[2992],{"type":17,"value":2993},"TuxChartHeatmap dark-mode fix.",{"type":17,"value":2995}," The dark theme reverses ramp\nluminance, so the stop-indexed white\u002Fdark label split inverted\nthere; in-cell values now use ",{"type":11,"tag":68,"props":2997,"children":2999},{"className":2998},[],[3000],{"type":17,"value":3001},"--text-primary",{"type":17,"value":3003}," with a\n",{"type":11,"tag":68,"props":3005,"children":3007},{"className":3006},[],[3008],{"type":17,"value":3009},"--surface-page",{"type":17,"value":3011}," paint-order halo — ≥18:1 against the halo in\nevery theme, on every ramp stop.",{"type":11,"tag":81,"props":3013,"children":3014},{},[3015,3020,3022,3027,3029,3035,3037,3043],{"type":11,"tag":85,"props":3016,"children":3017},{},[3018],{"type":17,"value":3019},"TuxActivityTimeline",{"type":17,"value":3021}," marker glyphs use ",{"type":11,"tag":68,"props":3023,"children":3025},{"className":3024},[],[3026],{"type":17,"value":2720},{"type":17,"value":3028}," (theme-\naware) instead of ",{"type":11,"tag":68,"props":3030,"children":3032},{"className":3031},[],[3033],{"type":17,"value":3034},"#fff",{"type":17,"value":3036},"; the Landscape-dashboard example's hand-\nrolled activity rail now dogfoods ",{"type":11,"tag":68,"props":3038,"children":3040},{"className":3039},[],[3041],{"type":17,"value":3042},"TuxActivityTimeline dense",{"type":17,"value":43},{"type":11,"tag":81,"props":3045,"children":3046},{},[3047,3052],{"type":11,"tag":85,"props":3048,"children":3049},{},[3050],{"type":17,"value":3051},"Vocabulary doctrine.",{"type":17,"value":3053}," components.md § Conventions gains \"Prop &\nemit vocabulary\" — canonical meanings for\ntone\u002Fkind\u002Fvariant\u002Fintent\u002Fsize\u002Fdensity\u002Flayout and the\nhover\u002Fselect\u002Fupdate:* emits, with every known deviation listed and\nqueued for v2.0.0 (renames are breaking; they land together, not\npiecemeal).",{"type":11,"tag":81,"props":3055,"children":3056},{},[3057,3059,3064,3066,3072],{"type":17,"value":3058},"Docs truth: tux.md's dark-theme row now matches the ratified teal\nanchor (",{"type":11,"tag":68,"props":3060,"children":3062},{"className":3061},[],[3063],{"type":17,"value":1209},{"type":17,"value":3065},") with the tokens.json rationale; showcase page\ntitles normalized to the 2-part ",{"type":11,"tag":68,"props":3067,"children":3069},{"className":3068},[],[3070],{"type":17,"value":3071},"TuxX · TUX",{"type":17,"value":3073}," form.",{"type":11,"tag":56,"props":3075,"children":3077},{"id":3076},"added",[3078],{"type":17,"value":1220},{"type":11,"tag":77,"props":3080,"children":3081},{},[3082,3134,3187,3246,3311],{"type":11,"tag":81,"props":3083,"children":3084},{},[3085,3094,3096,3102,3104,3110,3112,3118,3120,3125,3127,3133],{"type":11,"tag":85,"props":3086,"children":3087},{},[3088],{"type":11,"tag":68,"props":3089,"children":3091},{"className":3090},[],[3092],{"type":17,"value":3093},"TuxChartHeatmap",{"type":17,"value":3095}," — native SVG matrix heatmap, the top-ranked\nviz gap from the 2026-08 audit (time-of-day patterns: crashes by\nday × hour, corridor demand by month). Cells quantize onto the same\n5-stop sequential ramps the choropleth family uses\n(",{"type":11,"tag":68,"props":3097,"children":3099},{"className":3098},[],[3100],{"type":17,"value":3101},"--map-seq-maroon-*",{"type":17,"value":3103}," default, ",{"type":11,"tag":68,"props":3105,"children":3107},{"className":3106},[],[3108],{"type":17,"value":3109},"slate",{"type":17,"value":3111}," variant), equal-interval\nbins with the ranges printed in the legend, honest hatched ",{"type":11,"tag":68,"props":3113,"children":3115},{"className":3114},[],[3116],{"type":17,"value":3117},"null",{"type":17,"value":3119},"\ncells (\"No data\", never zero), auto-thinned dense column axes, and\nthe family tooltip\u002Fkeyboard contract with a ",{"type":11,"tag":85,"props":3121,"children":3122},{},[3123],{"type":17,"value":3124},"two-dimensional",{"type":17,"value":3126},"\nroving cursor (Left\u002FRight walk columns, Up\u002FDown walk rows —\ndocumented in components.md § Chart tooltips). Demo at\n",{"type":11,"tag":68,"props":3128,"children":3130},{"className":3129},[],[3131],{"type":17,"value":3132},"\u002Fvisualizations\u002Fchart-heatmap",{"type":17,"value":43},{"type":11,"tag":81,"props":3135,"children":3136},{},[3137,3146,3148,3154,3156,3162,3164,3170,3172,3178,3180,3186],{"type":11,"tag":85,"props":3138,"children":3139},{},[3140],{"type":11,"tag":68,"props":3141,"children":3143},{"className":3142},[],[3144],{"type":17,"value":3145},"TuxChartHistogram",{"type":17,"value":3147}," — native SVG distribution chart over raw\nsamples, built for the travel-time-reliability shape. Bin edges\nsnap to 1\u002F2\u002F5 × 10^k (",{"type":11,"tag":68,"props":3149,"children":3151},{"className":3150},[],[3152],{"type":17,"value":3153},"tuxBinEdges",{"type":17,"value":3155},") so ranges read \"10–15 min\";\n",{"type":11,"tag":68,"props":3157,"children":3159},{"className":3158},[],[3160],{"type":17,"value":3161},":percentiles=\"[50, 95]\"",{"type":17,"value":3163}," drops dashed gold rules at interpolated\nquantiles (the planning-time-index pair); ",{"type":11,"tag":68,"props":3165,"children":3167},{"className":3166},[],[3168],{"type":17,"value":3169},"normalize",{"type":17,"value":3171}," switches the\ny axis to share-of-samples for side-by-side comparisons; family\ntooltip\u002Fkeyboard contract (band-mode roving cursor via\n",{"type":11,"tag":68,"props":3173,"children":3175},{"className":3174},[],[3176],{"type":17,"value":3177},"useTuxChartHover",{"type":17,"value":3179},"). Demo at ",{"type":11,"tag":68,"props":3181,"children":3183},{"className":3182},[],[3184],{"type":17,"value":3185},"\u002Fvisualizations\u002Fchart-histogram",{"type":17,"value":43},{"type":11,"tag":81,"props":3188,"children":3189},{},[3190,3198,3200,3206,3208,3214,3216,3222,3224,3230,3231,3237,3239,3245],{"type":11,"tag":85,"props":3191,"children":3192},{},[3193],{"type":11,"tag":68,"props":3194,"children":3196},{"className":3195},[],[3197],{"type":17,"value":3019},{"type":17,"value":3199}," — editorial vertical event timeline (the\naudit's top component gap): maroon spine, mono tabular timestamps,\ngold-ringed ",{"type":11,"tag":68,"props":3201,"children":3203},{"className":3202},[],[3204],{"type":17,"value":3205},"current",{"type":17,"value":3207}," node, eyebrow-weight ",{"type":11,"tag":68,"props":3209,"children":3211},{"className":3210},[],[3212],{"type":17,"value":3213},"heading",{"type":17,"value":3215}," group rows,\nsemantic tones shared with the badge\u002Falert families, ",{"type":11,"tag":68,"props":3217,"children":3219},{"className":3218},[],[3220],{"type":17,"value":3221},"dense",{"type":17,"value":3223}," rail\nposture, ",{"type":11,"tag":68,"props":3225,"children":3227},{"className":3226},[],[3228],{"type":17,"value":3229},"#item",{"type":17,"value":875},{"type":11,"tag":68,"props":3232,"children":3234},{"className":3233},[],[3235],{"type":17,"value":3236},"#trailing",{"type":17,"value":3238}," scoped slots. Stateless — the host\nowns the feed. Demo at ",{"type":11,"tag":68,"props":3240,"children":3242},{"className":3241},[],[3243],{"type":17,"value":3244},"\u002Fcomponents\u002Factivity-timeline",{"type":17,"value":43},{"type":11,"tag":81,"props":3247,"children":3248},{},[3249,3258,3260,3265,3266,3272,3273,3279,3281,3287,3288,3294,3296,3302,3304,3310],{"type":11,"tag":85,"props":3250,"children":3251},{},[3252],{"type":11,"tag":68,"props":3253,"children":3255},{"className":3254},[],[3256],{"type":17,"value":3257},"app\u002Futils\u002FtuxChartBins.ts",{"type":17,"value":3259}," — shared binning + quantile math\nfor the distribution charts (",{"type":11,"tag":68,"props":3261,"children":3263},{"className":3262},[],[3264],{"type":17,"value":3153},{"type":17,"value":95},{"type":11,"tag":68,"props":3267,"children":3269},{"className":3268},[],[3270],{"type":17,"value":3271},"tuxBinCounts",{"type":17,"value":489},{"type":11,"tag":68,"props":3274,"children":3276},{"className":3275},[],[3277],{"type":17,"value":3278},"tuxQuantile",{"type":17,"value":3280},"\u002F",{"type":11,"tag":68,"props":3282,"children":3284},{"className":3283},[],[3285],{"type":17,"value":3286},"tuxQuantileSorted",{"type":17,"value":95},{"type":11,"tag":68,"props":3289,"children":3291},{"className":3290},[],[3292],{"type":17,"value":3293},"tuxQuantizeBin",{"type":17,"value":3295},"), sibling to\n",{"type":11,"tag":68,"props":3297,"children":3299},{"className":3298},[],[3300],{"type":17,"value":3301},"tuxChartScale",{"type":17,"value":3303},", behavior-locked by ",{"type":11,"tag":68,"props":3305,"children":3307},{"className":3306},[],[3308],{"type":17,"value":3309},"tests\u002Ftux-chart-bins.test.ts",{"type":17,"value":43},{"type":11,"tag":81,"props":3312,"children":3313},{},[3314,3319,3321,3327,3329,3335],{"type":11,"tag":85,"props":3315,"children":3316},{},[3317],{"type":17,"value":3318},"Chart motion vocabulary",{"type":17,"value":3320}," extended in ",{"type":11,"tag":68,"props":3322,"children":3324},{"className":3323},[],[3325],{"type":17,"value":3326},"tux-chart-motion.css",{"type":17,"value":3328},":\nheatmap cells fade in column-staggered; histogram bars grow from\nthe baseline like the bar family. Both collapse to instant under\n",{"type":11,"tag":68,"props":3330,"children":3332},{"className":3331},[],[3333],{"type":17,"value":3334},"prefers-reduced-motion: reduce",{"type":17,"value":43},{"type":11,"tag":45,"props":3337,"children":3339},{"id":3338},"_190-2026-08-12",[3340,3345],{"type":11,"tag":50,"props":3341,"children":3342},{},[3343],{"type":17,"value":3344},"1.9.0",{"type":17,"value":3346}," — 2026-08-12",{"type":11,"tag":19,"props":3348,"children":3349},{},[3350,3352,3358,3360,3366,3368,3373],{"type":17,"value":3351},"The chart-engineering minor. One audit-driven day: the geographic\nfamily stops shipping 348KB of Texas to every consumer (per-kind\nasync split), the four cartesian charts trade four drifted copies of\ntheir scale\u002Fhover math for shared modules under behavior-lock tests,\nthe palette collapses ~135 pasted declarations into one file, and the\nsix interaction-less charts join the tooltip\u002Fkeyboard contract —\nincluding the treemap keyboard-drill fix and a scatter roving cursor\nreplacing 500 tab stops. Underneath: the repo's first mounted\ncomponent tests (vitest + @nuxt\u002Ftest-utils), VueUse\u002FTanStack dead\nweight dropped in favor of tux-owned composables,\n",{"type":11,"tag":68,"props":3353,"children":3355},{"className":3354},[],[3356],{"type":17,"value":3357},"TuxRichDataGrid",{"type":17,"value":3359}," gains an opt-in virtualized big-list mode, focus\nrings unify onto the universal two-ring system, and a fix wave closes\nthe tux-audit dependency gate, ",{"type":11,"tag":68,"props":3361,"children":3363},{"className":3362},[],[3364],{"type":17,"value":3365},"Math.random()",{"type":17,"value":3367}," ids, the radial\ncharts' SSR float mismatches, and the ",{"type":11,"tag":68,"props":3369,"children":3371},{"className":3370},[],[3372],{"type":17,"value":364},{"type":17,"value":3374}," formatter crash\nthat had been corrupting hydration on heavy pages.",{"type":11,"tag":56,"props":3376,"children":3378},{"id":3377},"added-1",[3379],{"type":17,"value":1220},{"type":11,"tag":77,"props":3381,"children":3382},{},[3383,3438,3501],{"type":11,"tag":81,"props":3384,"children":3385},{},[3386,3396,3398,3404,3406,3412,3414,3420,3422,3428,3430,3436],{"type":11,"tag":85,"props":3387,"children":3388},{},[3389,3394],{"type":11,"tag":68,"props":3390,"children":3392},{"className":3391},[],[3393],{"type":17,"value":3357},{"type":17,"value":3395}," virtualized big-list mode",{"type":17,"value":3397}," (owner-requested) —\npass ",{"type":11,"tag":68,"props":3399,"children":3401},{"className":3400},[],[3402],{"type":17,"value":3403},"virtualized",{"type":17,"value":3405}," (+ optional ",{"type":11,"tag":68,"props":3407,"children":3409},{"className":3408},[],[3410],{"type":17,"value":3411},"virtualRowHeight",{"type":17,"value":3413},", default 44) and\nthe body windows through ",{"type":11,"tag":68,"props":3415,"children":3417},{"className":3416},[],[3418],{"type":17,"value":3419},"@tanstack\u002Fvue-virtual",{"type":17,"value":3421},": only the visible\nslice of rows renders, bracketed by table-compatible spacer rows\nthat preserve the scroll extent, so sticky header, sorting, and\nkey-based selection keep working (measured live: 17–25 rendered\n",{"type":11,"tag":68,"props":3423,"children":3425},{"className":3424},[],[3426],{"type":17,"value":3427},"\u003Ctr>",{"type":17,"value":3429},"s while scrolling 5,000 rows). Spacers are mounted-gated so\nSSR and the hydrating client agree. Row expansion is disabled while\nvirtualized (variable-height windows need per-row measurement —\nbuild when a consumer needs it). Demo on\n",{"type":11,"tag":68,"props":3431,"children":3433},{"className":3432},[],[3434],{"type":17,"value":3435},"\u002Fcomponents\u002Frich-data-grid",{"type":17,"value":3437},"; mounted tests included.",{"type":11,"tag":81,"props":3439,"children":3440},{},[3441,3446,3447,3453,3455,3461,3463,3469,3471,3477,3478,3484,3486,3492,3494,3499],{"type":11,"tag":85,"props":3442,"children":3443},{},[3444],{"type":17,"value":3445},"Mounted component testing foundation",{"type":17,"value":1244},{"type":11,"tag":68,"props":3448,"children":3450},{"className":3449},[],[3451],{"type":17,"value":3452},"vitest.config.ts",{"type":17,"value":3454}," (the\nfile never existed; ",{"type":11,"tag":68,"props":3456,"children":3458},{"className":3457},[],[3459],{"type":17,"value":3460},"npm test",{"type":17,"value":3462}," ran bare) with a two-tier layout:\npure tests stay in the node environment, mounted tests opt into the\n",{"type":11,"tag":68,"props":3464,"children":3466},{"className":3465},[],[3467],{"type":17,"value":3468},"nuxt",{"type":17,"value":3470}," environment per file (",{"type":11,"tag":68,"props":3472,"children":3474},{"className":3473},[],[3475],{"type":17,"value":3476},"@nuxt\u002Ftest-utils",{"type":17,"value":912},{"type":11,"tag":68,"props":3479,"children":3481},{"className":3480},[],[3482],{"type":17,"value":3483},"@vue\u002Ftest-utils",{"type":17,"value":3485},",\njsdom DOM), so Nuxt auto-imports resolve exactly as in the app.\nFirst five mounted suites (18 tests) lock the hand-rolled behaviors\nnothing exercised before: the donut\u002Fscatter\u002Ftreemap interaction\ncontracts (arrow cycling, Escape, drill-in\u002Fup, roving cursor,\ntooltip cards + emits), TuxFocusView's Escape handling and\n",{"type":11,"tag":68,"props":3487,"children":3489},{"className":3488},[],[3490],{"type":17,"value":3491},"aria-labelledby",{"type":17,"value":3493}," wiring, and TuxAnnouncementBanner's\nlocalStorage-backed dismissal memory. Contributor guidance in\ncomponents.md now lists ",{"type":11,"tag":68,"props":3495,"children":3497},{"className":3496},[],[3498],{"type":17,"value":3460},{"type":17,"value":3500}," among the pre-push guards.",{"type":11,"tag":81,"props":3502,"children":3503},{},[3504,3509,3511],{"type":11,"tag":85,"props":3505,"children":3506},{},[3507],{"type":17,"value":3508},"Chart tooltip contract extended to the interaction-less charts",{"type":17,"value":3510},"\n(per the components.md \"Chart tooltips\" doctrine, which previously\nonly Line\u002FBar\u002FArea\u002FScatter honored):",{"type":11,"tag":77,"props":3512,"children":3513},{},[3514,3535,3572],{"type":11,"tag":81,"props":3515,"children":3516},{},[3517,3525,3527,3533],{"type":11,"tag":85,"props":3518,"children":3519},{},[3520],{"type":11,"tag":68,"props":3521,"children":3523},{"className":3522},[],[3524],{"type":17,"value":2612},{"type":17,"value":3526}," — cells were focusable but bound no key handlers\n(a focus ring with no readout and no way to drill). Cells are now\nreal ",{"type":11,"tag":68,"props":3528,"children":3530},{"className":3529},[],[3531],{"type":17,"value":3532},"role=\"button\"",{"type":17,"value":3534},"s with accessible names; focus shows the\ntooltip anchored to the cell, arrows walk the leaf cells,\nEnter\u002FSpace drills in, Backspace drills up, Escape dismisses.",{"type":11,"tag":81,"props":3536,"children":3537},{},[3538,3547,3549,3555,3557,3562,3564,3570],{"type":11,"tag":85,"props":3539,"children":3540},{},[3541],{"type":11,"tag":68,"props":3542,"children":3544},{"className":3543},[],[3545],{"type":17,"value":3546},"TuxChartDonut",{"type":17,"value":3548}," — per-slice hover + branded tooltip card\n(label, value, % of total), sibling slices dim while one is\nactive, native ",{"type":11,"tag":68,"props":3550,"children":3552},{"className":3551},[],[3553],{"type":17,"value":3554},"\u003Ctitle>",{"type":17,"value":3556}," fallbacks, ",{"type":11,"tag":68,"props":3558,"children":3560},{"className":3559},[],[3561],{"type":17,"value":2620},{"type":17,"value":3563}," emit, ",{"type":11,"tag":68,"props":3565,"children":3567},{"className":3566},[],[3568],{"type":17,"value":3569},"tooltip",{"type":17,"value":3571}," prop,\nand single-tab-stop keyboard access (arrows cycle slices).",{"type":11,"tag":81,"props":3573,"children":3574},{},[3575,3584],{"type":11,"tag":85,"props":3576,"children":3577},{},[3578],{"type":11,"tag":68,"props":3579,"children":3581},{"className":3580},[],[3582],{"type":17,"value":3583},"TuxChartSunburst",{"type":17,"value":3585}," — same treatment; arrows walk segments in\nhierarchical order (group, then its children) and the tooltip\nnames the parent group.",{"type":11,"tag":56,"props":3587,"children":3589},{"id":3588},"changed",[3590],{"type":17,"value":3591},"Changed",{"type":11,"tag":77,"props":3593,"children":3594},{},[3595,3673,3736,3760,3905],{"type":11,"tag":81,"props":3596,"children":3597},{},[3598,3603,3605,3611,3612,3617,3619,3625,3627,3632,3634,3640,3642,3647,3649,3655,3657,3663,3665,3671],{"type":11,"tag":85,"props":3599,"children":3600},{},[3601],{"type":17,"value":3602},"Focus rings: one universal system, ten divergent recipes removed.",{"type":17,"value":3604},"\nThe layer has always shipped a themed two-ring focus affordance\n(",{"type":11,"tag":68,"props":3606,"children":3608},{"className":3607},[],[3609],{"type":17,"value":3610},"*:focus-visible",{"type":17,"value":1144},{"type":11,"tag":68,"props":3613,"children":3615},{"className":3614},[],[3616],{"type":17,"value":2897},{"type":17,"value":3618},", black-on-white in\nhigh-contrast), but ten components had grown their own competing\nrings — four recipes including a non-existent ",{"type":11,"tag":68,"props":3620,"children":3622},{"className":3621},[],[3623],{"type":17,"value":3624},"--focus-ring",{"type":17,"value":3626}," token\n(masked by fallbacks) and a brand-accent ring on ",{"type":11,"tag":68,"props":3628,"children":3630},{"className":3629},[],[3631],{"type":17,"value":2612},{"type":17,"value":3633}," — that\neither double-drew on the universal shadow or suppressed it with\n",{"type":11,"tag":68,"props":3635,"children":3637},{"className":3636},[],[3638],{"type":17,"value":3639},"outline: none",{"type":17,"value":3641},". All removed; components now inherit the universal\nring. Two sanctioned exceptions are documented in components.md\n§\"Focus rings\": SVG child elements (box-shadow can't render there —\n",{"type":11,"tag":68,"props":3643,"children":3645},{"className":3644},[],[3646],{"type":17,"value":2612},{"type":17,"value":3648}," cells now use the themed ",{"type":11,"tag":68,"props":3650,"children":3652},{"className":3651},[],[3653],{"type":17,"value":3654},"--focus-ring-outer",{"type":17,"value":3656}," instead\nof brand-accent) and ",{"type":11,"tag":68,"props":3658,"children":3660},{"className":3659},[],[3661],{"type":17,"value":3662},"forced-colors",{"type":17,"value":3664}," blocks (system colors by\ndesign). Form-control ",{"type":11,"tag":68,"props":3666,"children":3668},{"className":3667},[],[3669],{"type":17,"value":3670},":focus",{"type":17,"value":3672}," border tints are kept — they're\ninput affordances, not rings. Scope note: the reduced-motion blocks\nflagged in the same audit stay colocated per component by design\n(portability beats DRY for 3-line media queries), and small-type\nutilities are deferred until the token question is settled.",{"type":11,"tag":81,"props":3674,"children":3675},{},[3676,3678,3684,3685,3691],{"type":17,"value":3677},"**Dependency hygiene (owner-decided): ",{"type":11,"tag":68,"props":3679,"children":3681},{"className":3680},[],[3682],{"type":17,"value":3683},"@vueuse\u002Fcore",{"type":17,"value":912},{"type":11,"tag":68,"props":3686,"children":3688},{"className":3687},[],[3689],{"type":17,"value":3690},"@vueuse\u002Fnuxt",{"type":11,"tag":77,"props":3692,"children":3693},{},[3694],{"type":11,"tag":81,"props":3695,"children":3696},{},[3697,3703,3705,3711,3713,3719,3721,3727,3729,3734],{"type":11,"tag":68,"props":3698,"children":3700},{"className":3699},[],[3701],{"type":17,"value":3702},"@tanstack\u002Fvue-table",{"type":17,"value":3704}," removed.** All three were declared (VueUse\neven registered as a module) with zero call sites — dead weight in\nevery consumer's dependency graph. The duplicated hand-rolled\npatterns they would have covered are now tux-owned composables:\n",{"type":11,"tag":68,"props":3706,"children":3708},{"className":3707},[],[3709],{"type":17,"value":3710},"useTuxPersistedRef",{"type":17,"value":3712}," (SSR-safe storage-backed ref with a\n",{"type":11,"tag":68,"props":3714,"children":3716},{"className":3715},[],[3717],{"type":17,"value":3718},"serializer",{"type":17,"value":3720}," option so migrated components keep their exact wire\nformat) and ",{"type":11,"tag":68,"props":3722,"children":3724},{"className":3723},[],[3725],{"type":17,"value":3726},"useTuxClipboard",{"type":17,"value":3728}," (copy + \"Copied\" flash, keyed variant,\nclears its reset timer on unmount — the hand-rolled copies leaked\ntheirs). Migrated: TuxAnnouncementBanner (dismissal memory),\nTuxCodeBlock \u002F TuxExample \u002F TuxCitationExport (copy affordances).\n",{"type":11,"tag":68,"props":3730,"children":3732},{"className":3731},[],[3733],{"type":17,"value":3419},{"type":17,"value":3735}," stays — kept deliberately to back\nTuxRichDataGrid's virtualized big-list mode (owner-requested,\nlanding separately).",{"type":11,"tag":81,"props":3737,"children":3738},{},[3739,3750,3752,3758],{"type":11,"tag":85,"props":3740,"children":3741},{},[3742,3748],{"type":11,"tag":68,"props":3743,"children":3745},{"className":3744},[],[3746],{"type":17,"value":3747},"TuxChartScatter",{"type":17,"value":3749}," keyboard model: roving cursor instead of\nper-point tab stops.",{"type":17,"value":3751}," Every dot was previously ",{"type":11,"tag":68,"props":3753,"children":3755},{"className":3754},[],[3756],{"type":17,"value":3757},"tabindex=\"0\"",{"type":17,"value":3759}," — a\n500-point scatter injected 500 tab stops with no Escape. The svg is\nnow the single focusable surface; arrow keys walk points in x order\nwith the active dot ringed, Escape clears, and per-dot pointer hover\nstill works. The components.md contract text was updated to match.",{"type":11,"tag":81,"props":3761,"children":3762},{},[3763,3768,3770,3776,3777,3783,3785,3791,3793,3798,3800,3806,3808,3813,3815,3820,3822,3828,3830,3835,3837,3841,3843,3848,3850,3856,3858,3863,3865,3871,3873,3879,3881,3887,3889,3895,3897,3903],{"type":11,"tag":85,"props":3764,"children":3765},{},[3766],{"type":17,"value":3767},"Chart family: shared scale math + hover model",{"type":17,"value":3769},"\n(",{"type":11,"tag":68,"props":3771,"children":3773},{"className":3772},[],[3774],{"type":17,"value":3775},"app\u002Futils\u002FtuxChartScale.ts",{"type":17,"value":912},{"type":11,"tag":68,"props":3778,"children":3780},{"className":3779},[],[3781],{"type":17,"value":3782},"useTuxChartHover()",{"type":17,"value":3784},", locked by\n",{"type":11,"tag":68,"props":3786,"children":3788},{"className":3787},[],[3789],{"type":17,"value":3790},"tests\u002Ftux-chart-scale.test.ts",{"type":17,"value":3792},"). TuxChartLine \u002F Bar \u002F Area \u002F Scatter\n(plus Sparkline \u002F Treemap \u002F CorridorStrip spot fixes) now share one\nimplementation of nice-ticks, extents, domain padding, series tones,\nmargins, and the roving-cursor hover\u002Fkeyboard contract. Deliberate\nunifications: ",{"type":11,"tag":85,"props":3794,"children":3795},{},[3796],{"type":17,"value":3797},"ticks",{"type":17,"value":3799}," — Bar\u002FArea\u002FScatter adopt Line's algorithm\n(1\u002F2\u002F5-step, in-domain), so the same domain renders the same axis on\nevery chart and Scatter's drifted ",{"type":11,"tag":68,"props":3801,"children":3803},{"className":3802},[],[3804],{"type":17,"value":3805},"ceil",{"type":17,"value":3807}," no longer drops the first\ntick; ",{"type":11,"tag":85,"props":3809,"children":3810},{},[3811],{"type":17,"value":3812},"keyboard",{"type":17,"value":3814}," — arrow navigation seeds at the midpoint\neverywhere (Bar seeded at 0) and Up\u002FDown alias Left\u002FRight everywhere;\n",{"type":11,"tag":85,"props":3816,"children":3817},{},[3818],{"type":17,"value":3819},"tones",{"type":17,"value":3821}," — series 9+ clamps to ",{"type":11,"tag":68,"props":3823,"children":3825},{"className":3824},[],[3826],{"type":17,"value":3827},"--chart-8",{"type":17,"value":3829}," everywhere (Line\npreviously wrapped back to hue 1); ",{"type":11,"tag":85,"props":3831,"children":3832},{},[3833],{"type":17,"value":3834},"margins",{"type":17,"value":3836}," — left\u002Fbottom are\nfamily-standard (48\u002F36) so stacked exhibits baseline-align; ",{"type":11,"tag":85,"props":3838,"children":3839},{},[3840],{"type":17,"value":2620},{"type":17,"value":3842},"\n— pointer over plot padding clamps to the edge index instead of\nBar's old clear-on-padding; ",{"type":11,"tag":85,"props":3844,"children":3845},{},[3846],{"type":17,"value":3847},"robustness",{"type":17,"value":3849}," — extents are loop-based\n(",{"type":11,"tag":68,"props":3851,"children":3853},{"className":3852},[],[3854],{"type":17,"value":3855},"Math.min(...arr)",{"type":17,"value":3857}," overflowed the stack past ~100k points).\n",{"type":11,"tag":85,"props":3859,"children":3860},{},[3861],{"type":17,"value":3862},"Palette",{"type":17,"value":3864},": series colors now flow through one ",{"type":11,"tag":68,"props":3866,"children":3868},{"className":3867},[],[3869],{"type":17,"value":3870},"--tux-chart-tone",{"type":17,"value":3872},"\ncustom property set by shared ",{"type":11,"tag":68,"props":3874,"children":3876},{"className":3875},[],[3877],{"type":17,"value":3878},"tux-chart-tone--c1..8",{"type":17,"value":3880}," classes\n(",{"type":11,"tag":68,"props":3882,"children":3884},{"className":3883},[],[3885],{"type":17,"value":3886},"app\u002Fassets\u002Fcss\u002Ftux-chart-palette.css",{"type":17,"value":3888},") — ~135 duplicated\n",{"type":11,"tag":68,"props":3890,"children":3892},{"className":3891},[],[3893],{"type":17,"value":3894},"var(--chart-N, #hex)",{"type":17,"value":3896}," declarations across six components collapse\nto one file; rendered colors verified computed-identical to the\nchart tokens on every showcase surface. Components keep their\n",{"type":11,"tag":68,"props":3898,"children":3900},{"className":3899},[],[3901],{"type":17,"value":3902},"…__series--cN",{"type":17,"value":3904}," classes as consumer styling hooks.",{"type":11,"tag":81,"props":3906,"children":3907},{},[3908,3919,3921,3926,3928,3934,3935,3941,3942,3948,3949,3955,3956,3962,3964,3970,3972,3978,3979,3985,3986,3992,3993,3999,4001,4007,4009,4015],{"type":11,"tag":85,"props":3909,"children":3910},{},[3911,3917],{"type":11,"tag":68,"props":3912,"children":3914},{"className":3913},[],[3915],{"type":17,"value":3916},"TuxChartGeographic",{"type":17,"value":3918}," per-kind code split",{"type":17,"value":3920}," — the five ",{"type":11,"tag":68,"props":3922,"children":3924},{"className":3923},[],[3925],{"type":17,"value":2235},{"type":17,"value":3927},"s now\nrender through async child components (",{"type":11,"tag":68,"props":3929,"children":3931},{"className":3930},[],[3932],{"type":17,"value":3933},"TuxChartGeoCounty",{"type":17,"value":883},{"type":11,"tag":68,"props":3936,"children":3938},{"className":3937},[],[3939],{"type":17,"value":3940},"Districts",{"type":17,"value":875},{"type":11,"tag":68,"props":3943,"children":3945},{"className":3944},[],[3946],{"type":17,"value":3947},"UsContext",{"type":17,"value":875},{"type":11,"tag":68,"props":3950,"children":3952},{"className":3951},[],[3953],{"type":17,"value":3954},"DotDensity",{"type":17,"value":875},{"type":11,"tag":68,"props":3957,"children":3959},{"className":3958},[],[3960],{"type":17,"value":3961},"Flow",{"type":17,"value":3963},", internal, no\ncatalog entries) that each statically import only their own geo data\nmodule. ",{"type":11,"tag":68,"props":3965,"children":3967},{"className":3966},[],[3968],{"type":17,"value":3969},"app\u002Fassets\u002Fgeo\u002Ftexas.ts",{"type":17,"value":3971}," split into ",{"type":11,"tag":68,"props":3973,"children":3975},{"className":3974},[],[3976],{"type":17,"value":3977},"texas-outline",{"type":17,"value":883},{"type":11,"tag":68,"props":3980,"children":3982},{"className":3981},[],[3983],{"type":17,"value":3984},"texas-outline-polygon",{"type":17,"value":875},{"type":11,"tag":68,"props":3987,"children":3989},{"className":3988},[],[3990],{"type":17,"value":3991},"txdot-districts",{"type":17,"value":875},{"type":11,"tag":68,"props":3994,"children":3996},{"className":3995},[],[3997],{"type":17,"value":3998},"tx-metros",{"type":17,"value":4000}," (data\nbyte-identical; ",{"type":11,"tag":68,"props":4002,"children":4004},{"className":4003},[],[4005],{"type":17,"value":4006},"texas.ts",{"type":17,"value":4008}," remains as a compat re-export barrel) and\n",{"type":11,"tag":68,"props":4010,"children":4012},{"className":4011},[],[4013],{"type":17,"value":4014},"scripts\u002Fbuild-geo.mjs",{"type":17,"value":4016}," now emits that layout. Payload per kind drops\nfrom ~348KB eager to ~12KB (flow) \u002F ~21KB (dot-density) \u002F ~63KB\n(county) \u002F ~119KB (districts) \u002F ~163KB (us-context); the public API,\nrendered SVG, and SSR\u002Fprerender output are unchanged.",{"type":11,"tag":56,"props":4018,"children":4020},{"id":4019},"fixed-1",[4021],{"type":17,"value":2001},{"type":11,"tag":77,"props":4023,"children":4024},{},[4025,4078,4151,4191],{"type":11,"tag":81,"props":4026,"children":4027},{},[4028,4038,4040,4046,4047,4053,4055,4061,4063,4068,4070,4076],{"type":11,"tag":85,"props":4029,"children":4030},{},[4031,4036],{"type":11,"tag":68,"props":4032,"children":4034},{"className":4033},[],[4035],{"type":17,"value":364},{"type":17,"value":4037}," HTML-tab formatter crash + the hydration errors it\ncaused.",{"type":17,"value":4039}," The inline pretty-printer treated Vue's hydration comment\nmarkers (",{"type":11,"tag":68,"props":4041,"children":4043},{"className":4042},[],[4044],{"type":17,"value":4045},"\u003C!--[-->",{"type":17,"value":875},{"type":11,"tag":68,"props":4048,"children":4050},{"className":4049},[],[4051],{"type":17,"value":4052},"\u003C!--]-->",{"type":17,"value":4054},") as open tags — every marker leaked\none indent level forever (a rich-data-grid preview leaked +190,\ninflating 26KB of DOM to 165KB of output), and ",{"type":11,"tag":68,"props":4056,"children":4058},{"className":4057},[],[4059],{"type":17,"value":4060},"\u003Ccol>",{"type":17,"value":4062},"-class void\nelements leaked too. On large, churning previews the quadratic\nrunaway exceeded V8's maximum string length (\"RangeError: Invalid\nstring length\"); because that threw during the hydration mount tick,\nVue's reconciliation corrupted and logged four \"Hydration completed\nbut contains mismatches\" errors on ",{"type":11,"tag":68,"props":4064,"children":4066},{"className":4065},[],[4067],{"type":17,"value":3435},{"type":17,"value":4069},".\nThe formatter now lives in ",{"type":11,"tag":68,"props":4071,"children":4073},{"className":4072},[],[4074],{"type":17,"value":4075},"app\u002Futils\u002FtuxFormatHtml.ts",{"type":17,"value":4077}," (unit\ntested): comments tokenize as single units and are dropped as\nframework plumbing, the void-element list is complete, and input is\nhard-capped with a visible truncation notice so no preview subtree\ncan ever OOM the tab. Verified: the page loads with zero console\nerrors and the HTML tab renders comment-free at true DOM depth.",{"type":11,"tag":81,"props":4079,"children":4080},{},[4081,4086,4091,4092,4097,4098,4103,4105,4111,4112,4118,4120,4126,4128,4134,4136,4141,4143,4149],{"type":11,"tag":85,"props":4082,"children":4083},{},[4084],{"type":17,"value":4085},"Radial charts: SSR hydration mismatch from raw trig floats.",{"type":11,"tag":68,"props":4087,"children":4089},{"className":4088},[],[4090],{"type":17,"value":3583},{"type":17,"value":875},{"type":11,"tag":68,"props":4093,"children":4095},{"className":4094},[],[4096],{"type":17,"value":3546},{"type":17,"value":875},{"type":11,"tag":68,"props":4099,"children":4101},{"className":4100},[],[4102],{"type":17,"value":2280},{"type":17,"value":4104}," serialized\nunrounded ",{"type":11,"tag":68,"props":4106,"children":4108},{"className":4107},[],[4109],{"type":17,"value":4110},"Math.sin",{"type":17,"value":3280},{"type":11,"tag":68,"props":4113,"children":4115},{"className":4114},[],[4116],{"type":17,"value":4117},"Math.cos",{"type":17,"value":4119}," results into arc ",{"type":11,"tag":68,"props":4121,"children":4123},{"className":4122},[],[4124],{"type":17,"value":4125},"d",{"type":17,"value":4127}," and position\nattributes; the server's and browser's V8 can differ in the last\nulp on transcendentals, so hydration flagged mismatched attributes\n(\"Hydration completed but contains mismatches\", data-dependent).\nCoordinates now round to 2dp at the geometry boundary — the same\ndiscipline the cartesian charts already used via ",{"type":11,"tag":68,"props":4129,"children":4131},{"className":4130},[],[4132],{"type":17,"value":4133},"toFixed(2)",{"type":17,"value":4135}," —\nverified byte-identical server-vs-client on every radial showcase\ninstance. Also fixed in passing: ",{"type":11,"tag":68,"props":4137,"children":4139},{"className":4138},[],[4140],{"type":17,"value":3747},{"type":17,"value":4142},"'s tooltip swatch\nlost its color in the palette consolidation (its ",{"type":11,"tag":68,"props":4144,"children":4146},{"className":4145},[],[4147],{"type":17,"value":4148},"hoverToneClass",{"type":17,"value":4150},"\nhelper predated the shared tone classes).",{"type":11,"tag":81,"props":4152,"children":4153},{},[4154,4165,4167,4173,4175,4181,4183,4189],{"type":11,"tag":85,"props":4155,"children":4156},{},[4157,4163],{"type":11,"tag":68,"props":4158,"children":4160},{"className":4159},[],[4161],{"type":17,"value":4162},"tux-audit a11y",{"type":17,"value":4164}," gated on the wrong dependency",{"type":17,"value":4166}," — the dispatcher\nrequired ",{"type":11,"tag":68,"props":4168,"children":4170},{"className":4169},[],[4171],{"type":17,"value":4172},"puppeteer",{"type":17,"value":4174},", but ",{"type":11,"tag":68,"props":4176,"children":4178},{"className":4177},[],[4179],{"type":17,"value":4180},"audit-a11y.mjs",{"type":17,"value":4182}," runs on jsdom + axe-core\n(its header documents why). Consumers with jsdom + axe-core were\nwrongly blocked; consumers with puppeteer but no jsdom were admitted\nand crashed on import. The gate now checks ",{"type":11,"tag":68,"props":4184,"children":4186},{"className":4185},[],[4187],{"type":17,"value":4188},"jsdom",{"type":17,"value":4190},"; help text and\nREADME corrected to state the honest per-command dependency split.",{"type":11,"tag":81,"props":4192,"children":4193},{},[4194,4210,4212,4218,4220,4225,4227,4232,4234,4239,4240,4246,4248,4253,4255,4260],{"type":11,"tag":85,"props":4195,"children":4196},{},[4197,4202,4204],{"type":11,"tag":68,"props":4198,"children":4200},{"className":4199},[],[4201],{"type":17,"value":3365},{"type":17,"value":4203}," element ids replaced with ",{"type":11,"tag":68,"props":4205,"children":4207},{"className":4206},[],[4208],{"type":17,"value":4209},"useId()",{"type":17,"value":4211}," —\n",{"type":11,"tag":68,"props":4213,"children":4215},{"className":4214},[],[4216],{"type":17,"value":4217},"TuxFocusView",{"type":17,"value":4219},"'s ",{"type":11,"tag":68,"props":4221,"children":4223},{"className":4222},[],[4224],{"type":17,"value":3491},{"type":17,"value":4226}," title id was generated by a\n",{"type":11,"tag":68,"props":4228,"children":4230},{"className":4229},[],[4231],{"type":17,"value":3365},{"type":17,"value":4233}," computed (an SSR hydration mismatch when rendered\nopen, and a re-roll risk); now a stable ",{"type":11,"tag":68,"props":4235,"children":4237},{"className":4236},[],[4238],{"type":17,"value":4209},{"type":17,"value":293},{"type":11,"tag":68,"props":4241,"children":4243},{"className":4242},[],[4244],{"type":17,"value":4245},"TuxRuleBuilder",{"type":17,"value":4247},"'s\ninternal group child now derives rule\u002Fgroup ids from a per-instance\n",{"type":11,"tag":68,"props":4249,"children":4251},{"className":4250},[],[4252],{"type":17,"value":4209},{"type":17,"value":4254}," seed + counter instead of ",{"type":11,"tag":68,"props":4256,"children":4258},{"className":4257},[],[4259],{"type":17,"value":3365},{"type":17,"value":43},{"type":11,"tag":45,"props":4262,"children":4264},{"id":4263},"_180-2026-07-30",[4265,4270],{"type":11,"tag":50,"props":4266,"children":4267},{},[4268],{"type":17,"value":4269},"1.8.0",{"type":17,"value":4271}," — 2026-07-30",{"type":11,"tag":19,"props":4273,"children":4274},{},[4275,4277,4283],{"type":17,"value":4276},"The unification minor — semantic tokens for the estate, the toast that\nwas always promised, Nuxt UI theme hardening (hybrid form doctrine),\nconsumer-debt fixes, and the kit as a real distribution surface\n(brand.env, Power BI themes, ",{"type":11,"tag":68,"props":4278,"children":4280},{"className":4279},[],[4281],{"type":17,"value":4282},"tux-audit",{"type":17,"value":4284},"). Estate-visible change: body\ncopy moves Public Sans → Open Sans per the four-family rule.",{"type":11,"tag":56,"props":4286,"children":4288},{"id":4287},"added-distribution-artifacts-for-non-vue-consumers-2026-07-30",[4289],{"type":17,"value":4290},"Added — distribution artifacts for non-Vue consumers (2026-07-30)",{"type":11,"tag":19,"props":4292,"children":4293},{},[4294,4296,4302],{"type":17,"value":4295},"One source (",{"type":11,"tag":68,"props":4297,"children":4299},{"className":4298},[],[4300],{"type":17,"value":4301},"design\u002Ftokens.json",{"type":17,"value":4303},"), five generated artifacts — this is\nhow the Forgejo overlay, compose stacks, and Power BI reporting stop\nhand-vendoring hex:",{"type":11,"tag":77,"props":4305,"children":4306},{},[4307,4335,4364,4392,4402],{"type":11,"tag":81,"props":4308,"children":4309},{},[4310,4333],{"type":11,"tag":85,"props":4311,"children":4312},{},[4313,4318,4319,4325,4327],{"type":11,"tag":68,"props":4314,"children":4316},{"className":4315},[],[4317],{"type":17,"value":73},{"type":17,"value":912},{"type":11,"tag":68,"props":4320,"children":4322},{"className":4321},[],[4323],{"type":17,"value":4324},"scripts\u002F",{"type":17,"value":4326}," now ship in the package ",{"type":11,"tag":68,"props":4328,"children":4330},{"className":4329},[],[4331],{"type":17,"value":4332},"files",{"type":17,"value":4334}," — git-dep\nconsumers previously couldn't even see the kit the README sells.",{"type":11,"tag":81,"props":4336,"children":4337},{},[4338,4347,4348,4354,4356,4362],{"type":11,"tag":85,"props":4339,"children":4340},{},[4341],{"type":11,"tag":68,"props":4342,"children":4344},{"className":4343},[],[4345],{"type":17,"value":4346},"kit\u002Fenv\u002Fbrand.env",{"type":17,"value":2078},{"type":11,"tag":68,"props":4349,"children":4351},{"className":4350},[],[4352],{"type":17,"value":4353},"npm run build:brand-env",{"type":17,"value":4355},") — 71 flat\nresolved ",{"type":11,"tag":68,"props":4357,"children":4359},{"className":4358},[],[4360],{"type":17,"value":4361},"TUX_\u003CTHEME>_\u003CGROUP>_\u003CTOKEN>=#hex",{"type":17,"value":4363}," keys for shell\u002FGo\u002FPython\nconsumers, written with collab-hub's temp-file + atomic-rename\nfail-safety so an interrupted run can never half-theme downstream\napps.",{"type":11,"tag":81,"props":4365,"children":4366},{},[4367,4383,4384,4390],{"type":11,"tag":85,"props":4368,"children":4369},{},[4370,4376,4377],{"type":11,"tag":68,"props":4371,"children":4373},{"className":4372},[],[4374],{"type":17,"value":4375},"kit\u002Fpowerbi\u002Ftti-theme.json",{"type":17,"value":912},{"type":11,"tag":68,"props":4378,"children":4380},{"className":4379},[],[4381],{"type":17,"value":4382},"tti-theme-dark.json",{"type":17,"value":3769},{"type":11,"tag":68,"props":4385,"children":4387},{"className":4386},[],[4388],{"type":17,"value":4389},"npm run build:powerbi",{"type":17,"value":4391},") — Power BI report themes: 10-series\ndataColors from the chart ramp (chart-9\u002F10 added so 10-series\nvalidators are token-sourced, not hand-mixed), tux fonts, and a\ntheme-invariant brand block per the on-brand rule. The reporting\nrepo re-vendors at pin-bump instead of maintaining its v1.1.0-era\nhand snapshot.",{"type":11,"tag":81,"props":4393,"children":4394},{},[4395,4400],{"type":11,"tag":68,"props":4396,"children":4398},{"className":4397},[],[4399],{"type":17,"value":1825},{"type":17,"value":4401}," chains tokens → brand.env → powerbi.",{"type":11,"tag":81,"props":4403,"children":4404},{},[4405],{"type":17,"value":4406},"kit\u002FREADME gains the \"which artifact for which consumer\" matrix.",{"type":11,"tag":56,"props":4408,"children":4410},{"id":4409},"added-tux-audit-bin-guardrails-as-a-consumable-2026-07-30",[4411,4413,4418],{"type":17,"value":4412},"Added — ",{"type":11,"tag":68,"props":4414,"children":4416},{"className":4415},[],[4417],{"type":17,"value":4282},{"type":17,"value":4419}," bin: guardrails as a consumable (2026-07-30)",{"type":11,"tag":77,"props":4421,"children":4422},{},[4423,4461],{"type":11,"tag":81,"props":4424,"children":4425},{},[4426,4435,4437,4443,4445,4451,4453,4459],{"type":11,"tag":85,"props":4427,"children":4428},{},[4429],{"type":11,"tag":68,"props":4430,"children":4432},{"className":4431},[],[4433],{"type":17,"value":4434},"npx tux-audit tokens [dirs…]",{"type":17,"value":4436}," — the zero-dependency\nundefined-token audit, now runnable from any consumer (one CI line,\ndocumented in the README). ",{"type":11,"tag":68,"props":4438,"children":4440},{"className":4439},[],[4441],{"type":17,"value":4442},"audit-tokens.mjs",{"type":17,"value":4444}," generalized: target\ndirs via args\u002F",{"type":11,"tag":68,"props":4446,"children":4448},{"className":4447},[],[4449],{"type":17,"value":4450},"TUX_AUDIT_DIRS",{"type":17,"value":4452},", token definitions harvested from the\nlayer AND the consumer, extra namespaces via\n",{"type":11,"tag":68,"props":4454,"children":4456},{"className":4455},[],[4457],{"type":17,"value":4458},"TUX_AUDIT_EXTERNAL_PREFIXES",{"type":17,"value":4460},". Validated against the estate: the\nLandscape frontend passes clean; the AI Studio tree fails with the\nmigration table printed — exactly the 17-undefined-tokens bug class\nthis exists to catch.",{"type":11,"tag":81,"props":4462,"children":4463},{},[4464,4470,4471,4476],{"type":11,"tag":68,"props":4465,"children":4467},{"className":4466},[],[4468],{"type":17,"value":4469},"tux-audit contrast",{"type":17,"value":875},{"type":11,"tag":68,"props":4472,"children":4474},{"className":4473},[],[4475],{"type":17,"value":4162},{"type":17,"value":4477}," delegate when the consumer\nhas puppeteer\u002Faxe-core and explain honestly when it doesn't.",{"type":11,"tag":56,"props":4479,"children":4481},{"id":4480},"added-tuxstatustoast-usetuxtoast-2026-07-30",[4482],{"type":17,"value":4483},"Added — TuxStatusToast + useTuxToast (2026-07-30)",{"type":11,"tag":77,"props":4485,"children":4486},{},[4487],{"type":11,"tag":81,"props":4488,"children":4489},{},[4490,4492,4501,4503,4512,4514,4520,4522,4528,4530,4536,4537,4543,4545,4551,4553,4559,4561,4567,4569,4575],{"type":17,"value":4491},"The catalog's biggest hole, and a phantom the docs promised since the\nmotion table and tauri-bindings.md first cited it: ",{"type":11,"tag":85,"props":4493,"children":4494},{},[4495],{"type":11,"tag":68,"props":4496,"children":4498},{"className":4497},[],[4499],{"type":17,"value":4500},"TuxStatusToast",{"type":17,"value":4502},"\n(the once-per-shell host) + ",{"type":11,"tag":85,"props":4504,"children":4505},{},[4506],{"type":11,"tag":68,"props":4507,"children":4509},{"className":4508},[],[4510],{"type":17,"value":4511},"useTuxToast()",{"type":17,"value":4513}," (the bus). Polite\n",{"type":11,"tag":68,"props":4515,"children":4517},{"className":4516},[],[4518],{"type":17,"value":4519},"role=\"status\"",{"type":17,"value":4521}," live region; error tones render ",{"type":11,"tag":68,"props":4523,"children":4525},{"className":4524},[],[4526],{"type":17,"value":4527},"role=\"alert\"",{"type":17,"value":4529}," and\nstick until dismissed; slide-from-edge + fade at\n",{"type":11,"tag":68,"props":4531,"children":4533},{"className":4532},[],[4534],{"type":17,"value":4535},"--motion-fast",{"type":17,"value":3280},{"type":11,"tag":68,"props":4538,"children":4540},{"className":4539},[],[4541],{"type":17,"value":4542},"--ease-standard",{"type":17,"value":4544},", collapsing to opacity-only under\nreduced motion; optional action button; ",{"type":11,"tag":68,"props":4546,"children":4548},{"className":4547},[],[4549],{"type":17,"value":4550},"edge=\"top\"",{"type":17,"value":4552}," mount for\nworkbench shells. In Tauri shells an unfocused window ALSO fires an OS\nnotification (guarded dynamic import of ",{"type":11,"tag":68,"props":4554,"children":4556},{"className":4555},[],[4557],{"type":17,"value":4558},"@tauri-apps\u002F plugin-notification",{"type":17,"value":4560},", capability-optional, silent no-op on web) — the\ntauri-bindings.md contract implemented. The docs shell dogfoods the\nhost; ",{"type":11,"tag":68,"props":4562,"children":4564},{"className":4563},[],[4565],{"type":17,"value":4566},"\u002Fcomponents\u002Fstatus-toast",{"type":17,"value":4568}," is the live demo. Owns its own item\nstate rather than piggybacking Nuxt UI's toaster so the semantics and\nmotion are tux-controlled; migration from ",{"type":11,"tag":68,"props":4570,"children":4572},{"className":4571},[],[4573],{"type":17,"value":4574},"useToast()",{"type":17,"value":4576}," is a rename.",{"type":11,"tag":56,"props":4578,"children":4580},{"id":4579},"added-tuxavatar-tuxpagecontainer-2026-07-30",[4581],{"type":17,"value":4582},"Added — TuxAvatar + TuxPageContainer (2026-07-30)",{"type":11,"tag":77,"props":4584,"children":4585},{},[4586,4600],{"type":11,"tag":81,"props":4587,"children":4588},{},[4589,4598],{"type":11,"tag":85,"props":4590,"children":4591},{},[4592],{"type":11,"tag":68,"props":4593,"children":4595},{"className":4594},[],[4596],{"type":17,"value":4597},"TuxAvatar",{"type":17,"value":4599}," — photo\u002Finitials\u002Fstatus-dot identity primitive,\nextracted from TuxUserMenu (which now consumes it; no API change).\nBroken photo URLs fall back to initials; decorative by default.",{"type":11,"tag":81,"props":4601,"children":4602},{},[4603,4612,4614,4620,4622,4628,4630,4636],{"type":11,"tag":85,"props":4604,"children":4605},{},[4606],{"type":11,"tag":68,"props":4607,"children":4609},{"className":4608},[],[4610],{"type":17,"value":4611},"TuxPageContainer",{"type":17,"value":4613}," — content-width primitive over the new\n",{"type":11,"tag":68,"props":4615,"children":4617},{"className":4616},[],[4618],{"type":17,"value":4619},"--layout-content-max",{"type":17,"value":4621}," (80rem) \u002F ",{"type":11,"tag":68,"props":4623,"children":4625},{"className":4624},[],[4626],{"type":17,"value":4627},"--layout-content-wide",{"type":17,"value":4629}," (96rem) \u002F\n",{"type":11,"tag":68,"props":4631,"children":4633},{"className":4632},[],[4634],{"type":17,"value":4635},"--layout-prose-max",{"type":17,"value":4637}," (72ch) tokens. Landscape alone carried three\ndivergent max-widths before this existed.",{"type":11,"tag":56,"props":4639,"children":4641},{"id":4640},"added-nuxt-ui-theme-hardening-batch-k-2026-07-30-owner-ratified",[4642],{"type":17,"value":4643},"Added — Nuxt UI theme hardening, Batch K (2026-07-30, owner-ratified)",{"type":11,"tag":19,"props":4645,"children":4646},{},[4647,4649,4655],{"type":17,"value":4648},"The hybrid form-control doctrine lands: ",{"type":11,"tag":68,"props":4650,"children":4652},{"className":4651},[],[4653],{"type":17,"value":4654},"U*",{"type":17,"value":4656}," primitives are the blessed\napp controls and the layer brands them everywhere —",{"type":11,"tag":77,"props":4658,"children":4659},{},[4660,4707,4735,4747],{"type":11,"tag":81,"props":4661,"children":4662},{},[4663,4665,4671,4672,4678,4679,4684,4685,4691,4692,4698,4700,4705],{"type":17,"value":4664},"Controls (",{"type":11,"tag":68,"props":4666,"children":4668},{"className":4667},[],[4669],{"type":17,"value":4670},"button",{"type":17,"value":3280},{"type":11,"tag":68,"props":4673,"children":4675},{"className":4674},[],[4676],{"type":17,"value":4677},"input",{"type":17,"value":3280},{"type":11,"tag":68,"props":4680,"children":4682},{"className":4681},[],[4683],{"type":17,"value":2453},{"type":17,"value":3280},{"type":11,"tag":68,"props":4686,"children":4688},{"className":4687},[],[4689],{"type":17,"value":4690},"textarea",{"type":17,"value":3280},{"type":11,"tag":68,"props":4693,"children":4695},{"className":4694},[],[4696],{"type":17,"value":4697},"[role=\"button\"]",{"type":17,"value":4699},")\nride ",{"type":11,"tag":68,"props":4701,"children":4703},{"className":4702},[],[4704],{"type":17,"value":2825},{"type":17,"value":4706}," (Work Sans) per the four-family rule.",{"type":11,"tag":81,"props":4708,"children":4709},{},[4710,4712,4718,4720,4726,4728,4733],{"type":17,"value":4711},"Nuxt UI's ",{"type":11,"tag":68,"props":4713,"children":4715},{"className":4714},[],[4716],{"type":17,"value":4717},"--ui-radius",{"type":17,"value":4719}," binds to ",{"type":11,"tag":68,"props":4721,"children":4723},{"className":4722},[],[4724],{"type":17,"value":4725},"--radius-md",{"type":17,"value":4727},", aligning ",{"type":11,"tag":68,"props":4729,"children":4731},{"className":4730},[],[4732],{"type":17,"value":4654},{"type":17,"value":4734}," corner\ngeometry with Tux chrome.",{"type":11,"tag":81,"props":4736,"children":4737},{},[4738,4740,4746],{"type":17,"value":4739},"The four family fonts are now Tailwind utilities\n(",{"type":11,"tag":68,"props":4741,"children":4743},{"className":4742},[],[4744],{"type":17,"value":4745},"font-body\u002Fdisplay\u002Fbold\u002Felegant",{"type":17,"value":2630},{"type":11,"tag":81,"props":4748,"children":4749},{},[4750,4756,4758,4763],{"type":11,"tag":68,"props":4751,"children":4753},{"className":4752},[],[4754],{"type":17,"value":4755},"TuxButton",{"type":17,"value":4757}," re-scoped in doctrine as the ",{"type":11,"tag":155,"props":4759,"children":4760},{},[4761],{"type":17,"value":4762},"editorial",{"type":17,"value":4764}," button;\ncomponents.md's \"Form input\" row rewritten for the hybrid rule.",{"type":11,"tag":56,"props":4766,"children":4768},{"id":4767},"added-tuxbadge-tonecustom-2026-07-30",[4769,4771,4777],{"type":17,"value":4770},"Added — TuxBadge ",{"type":11,"tag":68,"props":4772,"children":4774},{"className":4773},[],[4775],{"type":17,"value":4776},"tone=\"custom\"",{"type":17,"value":4778}," (2026-07-30)",{"type":11,"tag":77,"props":4780,"children":4781},{},[4782],{"type":11,"tag":81,"props":4783,"children":4784},{},[4785,4787,4792,4793,4799,4801,4806],{"type":17,"value":4786},"The open-palette escape hatch docs-tti's StatusPill needed:\n",{"type":11,"tag":68,"props":4788,"children":4790},{"className":4789},[],[4791],{"type":17,"value":4776},{"type":17,"value":912},{"type":11,"tag":68,"props":4794,"children":4796},{"className":4795},[],[4797],{"type":17,"value":4798},"--tux-badge-bg\u002Ffg\u002Fborder",{"type":17,"value":4800}," hooks (which must point\nat tokens — consumer ",{"type":11,"tag":68,"props":4802,"children":4804},{"className":4803},[],[4805],{"type":17,"value":583},{"type":17,"value":4807}," runs keep that honest).",{"type":11,"tag":56,"props":4809,"children":4811},{"id":4810},"fixed-consumer-debt-fixes-2026-07-30",[4812],{"type":17,"value":4813},"Fixed — consumer-debt fixes (2026-07-30)",{"type":11,"tag":77,"props":4815,"children":4816},{},[4817,4834,4858,4892,4933],{"type":11,"tag":81,"props":4818,"children":4819},{},[4820,4825,4827,4832],{"type":11,"tag":85,"props":4821,"children":4822},{},[4823],{"type":17,"value":4824},"TuxMegaMenu",{"type":17,"value":4826}," caps its panel at the viewport below the nav and\nscrolls internally — Landscape deletes its ",{"type":11,"tag":68,"props":4828,"children":4830},{"className":4829},[],[4831],{"type":17,"value":329},{"type":17,"value":4833}," override.",{"type":11,"tag":81,"props":4835,"children":4836},{},[4837,4848,4850,4856],{"type":11,"tag":85,"props":4838,"children":4839},{},[4840,4842],{"type":17,"value":4841},"TuxSiteNav + TuxAppFrame publish ",{"type":11,"tag":68,"props":4843,"children":4845},{"className":4844},[],[4846],{"type":17,"value":4847},"--tux-nav-height",{"type":17,"value":4849}," on ",{"type":11,"tag":68,"props":4851,"children":4853},{"className":4852},[],[4854],{"type":17,"value":4855},"\u003Chtml>",{"type":17,"value":4857},"\n(ResizeObserver-measured) — consumers replace hardcoded 4rem\u002F5rem\nsticky offsets in both shell shapes.",{"type":11,"tag":81,"props":4859,"children":4860},{},[4861,4866,4868,4874,4876,4882,4884,4890],{"type":11,"tag":85,"props":4862,"children":4863},{},[4864],{"type":17,"value":4865},"Layer route stripping",{"type":17,"value":4867},": consumers no longer inherit the style\nguide's 164 showcase routes via ",{"type":11,"tag":68,"props":4869,"children":4871},{"className":4870},[],[4872],{"type":17,"value":4873},"extends",{"type":17,"value":4875}," (opt back in with\n",{"type":11,"tag":68,"props":4877,"children":4879},{"className":4878},[],[4880],{"type":17,"value":4881},"TTI_UX_DEMOS=1",{"type":17,"value":4883},") — docs-tti deletes its ",{"type":11,"tag":68,"props":4885,"children":4887},{"className":4886},[],[4888],{"type":17,"value":4889},"pages:extend",{"type":17,"value":4891}," workaround.",{"type":11,"tag":81,"props":4893,"children":4894},{},[4895,4900,4902,4908,4910,4916,4918,4923,4925,4931],{"type":11,"tag":85,"props":4896,"children":4897},{},[4898],{"type":17,"value":4899},"Dark-bridge tolerance",{"type":17,"value":4901},": the Nuxt UI ",{"type":11,"tag":68,"props":4903,"children":4905},{"className":4904},[],[4906],{"type":17,"value":4907},".dark",{"type":17,"value":4909}," bridge now matches any\n",{"type":11,"tag":68,"props":4911,"children":4913},{"className":4912},[],[4914],{"type":17,"value":4915},"*-dark",{"type":17,"value":4917}," color-mode value (not just ",{"type":11,"tag":68,"props":4919,"children":4921},{"className":4920},[],[4922],{"type":17,"value":881},{"type":17,"value":4924},") and honors a\n",{"type":11,"tag":68,"props":4926,"children":4928},{"className":4927},[],[4929],{"type":17,"value":4930},"tux: { darkBridge: false }",{"type":17,"value":4932}," app.config kill-switch — docs-tti stops\npath-stripping the plugin.",{"type":11,"tag":81,"props":4934,"children":4935},{},[4936,4938,4944],{"type":17,"value":4937},"README documents the reverse-proxy ",{"type":11,"tag":68,"props":4939,"children":4941},{"className":4940},[],[4942],{"type":17,"value":4943},"icon: { mode: \"svg\" }",{"type":17,"value":4945}," guidance\n(the Landscape\u002FCaddy ghost-icon failure).",{"type":11,"tag":56,"props":4947,"children":4949},{"id":4948},"added-semantic-tokens-for-the-estate-2026-07-30",[4950],{"type":17,"value":4951},"Added — semantic tokens for the estate (2026-07-30)",{"type":11,"tag":77,"props":4953,"children":4954},{},[4955,5042,5071,5088],{"type":11,"tag":81,"props":4956,"children":4957},{},[4958,4966,4968,4973,4975,4981,4983,4988,4990,4996,4997,5003,5004,5010,5011,5017,5019,5024,5026,5032,5034,5040],{"type":11,"tag":85,"props":4959,"children":4960},{},[4961],{"type":11,"tag":68,"props":4962,"children":4964},{"className":4963},[],[4965],{"type":17,"value":2744},{"type":17,"value":4967}," — theme-invariant near-white for content on\n",{"type":11,"tag":68,"props":4969,"children":4971},{"className":4970},[],[4972],{"type":17,"value":2736},{"type":17,"value":4974}," surfaces, in all three themes. The collab-stack's\n",{"type":11,"tag":68,"props":4976,"children":4978},{"className":4977},[],[4979],{"type":17,"value":4980},"--tux-on-brand",{"type":17,"value":4982}," insight made canonical: fixed-maroon surfaces must\nnever use ",{"type":11,"tag":68,"props":4984,"children":4986},{"className":4985},[],[4987],{"type":17,"value":2720},{"type":17,"value":4989}," (it flips dark in dark mode). Adopted by\n",{"type":11,"tag":68,"props":4991,"children":4993},{"className":4992},[],[4994],{"type":17,"value":4995},"TuxCTA",{"type":17,"value":95},{"type":11,"tag":68,"props":4998,"children":5000},{"className":4999},[],[5001],{"type":17,"value":5002},"TuxFooter",{"type":17,"value":95},{"type":11,"tag":68,"props":5005,"children":5007},{"className":5006},[],[5008],{"type":17,"value":5009},"TuxPageHeader",{"type":17,"value":95},{"type":11,"tag":68,"props":5012,"children":5014},{"className":5013},[],[5015],{"type":17,"value":5016},"TuxAnnouncementBanner",{"type":17,"value":5018},"\n(replacing 10 hardcoded ",{"type":11,"tag":68,"props":5020,"children":5022},{"className":5021},[],[5023],{"type":17,"value":3034},{"type":17,"value":5025}," declarations) and registered as the\nmeasured pair on ",{"type":11,"tag":68,"props":5027,"children":5029},{"className":5028},[],[5030],{"type":17,"value":5031},"\u002Fcontrast-audit",{"type":17,"value":5033},", so AAA CI now gates the real\ntoken. Tailwind alias ",{"type":11,"tag":68,"props":5035,"children":5037},{"className":5036},[],[5038],{"type":17,"value":5039},"--color-text-on-brand",{"type":17,"value":5041}," added.",{"type":11,"tag":81,"props":5043,"children":5044},{},[5045,5054,5056,5061,5063,5069],{"type":11,"tag":85,"props":5046,"children":5047},{},[5048],{"type":11,"tag":68,"props":5049,"children":5051},{"className":5050},[],[5052],{"type":17,"value":5053},"--surface-border-subtle",{"type":17,"value":5055}," — the hairline-divider step below\n",{"type":11,"tag":68,"props":5057,"children":5059},{"className":5058},[],[5060],{"type":17,"value":596},{"type":17,"value":5062}," consumers kept inventing as ",{"type":11,"tag":68,"props":5064,"children":5066},{"className":5065},[],[5067],{"type":17,"value":5068},"--border-subtle",{"type":17,"value":5070},"\n(light: neutral-150; dark: #2E2B2A; hc: deliberately === border).",{"type":11,"tag":81,"props":5072,"children":5073},{},[5074,5079,5080,5086],{"type":11,"tag":85,"props":5075,"children":5076},{},[5077],{"type":17,"value":5078},"Spacing scale",{"type":17,"value":1244},{"type":11,"tag":68,"props":5081,"children":5083},{"className":5082},[],[5084],{"type":17,"value":5085},"--space-2\u002F8\u002F12\u002F16\u002F24\u002F32\u002F40\u002F48\u002F64",{"type":17,"value":5087}," join the\nexisting 0\u002F4\u002F10, closing the \"spacing is un-tokenized\" gap against\ntux.md principle 4.",{"type":11,"tag":81,"props":5089,"children":5090},{},[5091,5096,5098,5103],{"type":11,"tag":85,"props":5092,"children":5093},{},[5094],{"type":17,"value":5095},"Migration table",{"type":17,"value":5097}," (kit\u002FREADME.md + ",{"type":11,"tag":68,"props":5099,"children":5101},{"className":5100},[],[5102],{"type":17,"value":583},{"type":17,"value":5104}," failure message):\nevery consumer-invented token name observed in the estate mapped to\nits canonical equivalent, plus the documented on-brand recipe and the\n\"rename, don't alias\" doctrine — no compat aliases ship.",{"type":11,"tag":56,"props":5106,"children":5108},{"id":5107},"changed-warning-is-tti-gold-2026-07-30-owner-ratified",[5109],{"type":17,"value":5110},"Changed — warning is TTI gold (2026-07-30, owner-ratified)",{"type":11,"tag":77,"props":5112,"children":5113},{},[5114],{"type":11,"tag":81,"props":5115,"children":5116},{},[5117,5118,5124,5126,5131,5132,5138,5140,5146],{"type":17,"value":4711},{"type":11,"tag":68,"props":5119,"children":5121},{"className":5120},[],[5122],{"type":17,"value":5123},"warning",{"type":17,"value":5125}," alias now maps to the ",{"type":11,"tag":85,"props":5127,"children":5128},{},[5129],{"type":17,"value":5130},"TTI gold ramp",{"type":17,"value":3769},{"type":11,"tag":68,"props":5133,"children":5135},{"className":5134},[],[5136],{"type":17,"value":5137},"--color-gold-*",{"type":17,"value":5139},", #DDAC37 anchor) instead of the amber stand-in the\napp.config self-documented as a follow-up. Landscape's local\n",{"type":11,"tag":68,"props":5141,"children":5143},{"className":5142},[],[5144],{"type":17,"value":5145},"warning: \"gold\"",{"type":17,"value":5147}," override becomes redundant at its next pin-bump.",{"type":11,"tag":56,"props":5149,"children":5151},{"id":5150},"changed-typography-now-matches-the-four-family-doctrine-2026-07-30",[5152],{"type":17,"value":5153},"Changed — typography now matches the four-family doctrine (2026-07-30)",{"type":11,"tag":19,"props":5155,"children":5156},{},[5157,5162],{"type":11,"tag":85,"props":5158,"children":5159},{},[5160],{"type":17,"value":5161},"Estate-visible at pin-bump.",{"type":17,"value":5163}," tux.md's four-family rule was doctrine\nthe CSS didn't follow; now it does:",{"type":11,"tag":77,"props":5165,"children":5166},{},[5167,5215,5254,5271],{"type":11,"tag":81,"props":5168,"children":5169},{},[5170,5172,5178,5180,5186,5187,5193,5195,5200,5201,5206,5208,5213],{"type":17,"value":5171},"Body copy (",{"type":11,"tag":68,"props":5173,"children":5175},{"className":5174},[],[5176],{"type":17,"value":5177},"html, body",{"type":17,"value":5179},") and ",{"type":11,"tag":68,"props":5181,"children":5183},{"className":5182},[],[5184],{"type":17,"value":5185},".eyebrow",{"type":17,"value":3280},{"type":11,"tag":68,"props":5188,"children":5190},{"className":5189},[],[5191],{"type":17,"value":5192},".subhead",{"type":17,"value":5194}," use\n",{"type":11,"tag":68,"props":5196,"children":5198},{"className":5197},[],[5199],{"type":17,"value":2817},{"type":17,"value":2078},{"type":11,"tag":85,"props":5202,"children":5203},{},[5204],{"type":17,"value":5205},"Open Sans",{"type":17,"value":5207},") — previously ",{"type":11,"tag":68,"props":5209,"children":5211},{"className":5210},[],[5212],{"type":17,"value":2809},{"type":17,"value":5214},"\n(Public Sans, the \"legacy\" face per tux.md).",{"type":11,"tag":81,"props":5216,"children":5217},{},[5218,5224,5225,5231,5232,5237,5239,5245,5246,5252],{"type":11,"tag":68,"props":5219,"children":5221},{"className":5220},[],[5222],{"type":17,"value":5223},".heading--display",{"type":17,"value":645},{"type":11,"tag":68,"props":5226,"children":5228},{"className":5227},[],[5229],{"type":17,"value":5230},"--font-display",{"type":17,"value":2078},{"type":11,"tag":85,"props":5233,"children":5234},{},[5235],{"type":17,"value":5236},"Oswald",{"type":17,"value":5238}," in the default\nstyle, re-binding to Work Sans \u002F Georgia under ",{"type":11,"tag":68,"props":5240,"children":5242},{"className":5241},[],[5243],{"type":17,"value":5244},".style--bold",{"type":17,"value":883},{"type":11,"tag":68,"props":5247,"children":5249},{"className":5248},[],[5250],{"type":17,"value":5251},".style--elegant",{"type":17,"value":5253},") — previously Public Sans 800 italic. Italic\ndropped (Oswald ships no italic axis); weight normalized to 700.",{"type":11,"tag":81,"props":5255,"children":5256},{},[5257,5262,5264,5269],{"type":11,"tag":68,"props":5258,"children":5260},{"className":5259},[],[5261],{"type":17,"value":2809},{"type":17,"value":5263}," remains defined (self-hosted) but is ",{"type":11,"tag":85,"props":5265,"children":5266},{},[5267],{"type":17,"value":5268},"deprecated",{"type":17,"value":5270}," —\nmarked in tokens.json, tux.md, and globals.css.",{"type":11,"tag":81,"props":5272,"children":5273},{},[5274,5276,5285,5287,5293,5294,5300],{"type":17,"value":5275},"Dead ",{"type":11,"tag":85,"props":5277,"children":5278},{},[5279],{"type":11,"tag":68,"props":5280,"children":5282},{"className":5281},[],[5283],{"type":17,"value":5284},"@nuxt\u002Ffonts",{"type":17,"value":5286}," dependency removed (module was already out of\nnuxt.config; fonts are self-hosted via ",{"type":11,"tag":68,"props":5288,"children":5290},{"className":5289},[],[5291],{"type":17,"value":5292},"fonts.css",{"type":17,"value":2738},{"type":11,"tag":68,"props":5295,"children":5297},{"className":5296},[],[5298],{"type":17,"value":5299},"sync-fonts.mjs",{"type":17,"value":5301},"); stale comments claiming otherwise fixed in\nglobals.css and tux.md.",{"type":11,"tag":56,"props":5303,"children":5305},{"id":5304},"fixed-layer-no-longer-bleeds-docs-site-build-config-2026-07-30",[5306],{"type":17,"value":5307},"Fixed — layer no longer bleeds docs-site build config (2026-07-30)",{"type":11,"tag":77,"props":5309,"children":5310},{},[5311],{"type":11,"tag":81,"props":5312,"children":5313},{},[5314,5316,5322,5324,5330,5332,5337,5339,5345],{"type":17,"value":5315},"The ",{"type":11,"tag":68,"props":5317,"children":5319},{"className":5318},[],[5320],{"type":17,"value":5321},"$production.nitro.prerender",{"type":17,"value":5323}," block (crawlLinks +\n",{"type":11,"tag":68,"props":5325,"children":5327},{"className":5326},[],[5328],{"type":17,"value":5329},"failOnError: false",{"type":17,"value":5331},") is now fenced behind an is-root-project check,\nso ",{"type":11,"tag":68,"props":5333,"children":5335},{"className":5334},[],[5336],{"type":17,"value":4873},{"type":17,"value":5338}," consumers stop inheriting the style guide's prerender\nbehavior. Landscape can delete its ",{"type":11,"tag":68,"props":5340,"children":5342},{"className":5341},[],[5343],{"type":17,"value":5344},"nitro:config",{"type":17,"value":5346}," reset hook at next\npin-bump.",{"type":11,"tag":45,"props":5348,"children":5350},{"id":5349},"_171-2026-07-30",[5351,5356],{"type":11,"tag":50,"props":5352,"children":5353},{},[5354],{"type":17,"value":5355},"1.7.1",{"type":17,"value":4271},{"type":11,"tag":19,"props":5358,"children":5359},{},[5360],{"type":17,"value":5361},"Doctrine + registry-truth release — docs and CI only, no runtime changes.\nSafe for all consumers to pick up immediately.",{"type":11,"tag":56,"props":5363,"children":5365},{"id":5364},"added-unification-doctrine-committed-2026-07-30",[5366],{"type":17,"value":5367},"Added — unification doctrine committed (2026-07-30)",{"type":11,"tag":77,"props":5369,"children":5370},{},[5371,5408,5438],{"type":11,"tag":81,"props":5372,"children":5373},{},[5374,5382,5384,5390,5392,5398,5400,5406],{"type":11,"tag":85,"props":5375,"children":5376},{},[5377],{"type":11,"tag":68,"props":5378,"children":5380},{"className":5379},[],[5381],{"type":17,"value":1429},{"type":17,"value":5383}," — the portal-unification plan's\npermanent home. The v4 plan document (authored + seven-lens-reviewed\nin-session on 2026-07-28) previously lived only in session state; it\nis now reconstructed as public-safe doctrine: the two-shape identity\nrule, one-chrome-many-voices, registry law, distribution artifacts,\nguardrails, execution log, and the open-decision ledger. Registered\nin the Design sidebar, the design index, and the ",{"type":11,"tag":68,"props":5385,"children":5387},{"className":5386},[],[5388],{"type":17,"value":5389},"[doc].vue",{"type":17,"value":5391}," title\nmap (which also gains the missing ",{"type":11,"tag":68,"props":5393,"children":5395},{"className":5394},[],[5396],{"type":17,"value":5397},"roadmap",{"type":17,"value":5399}," and\n",{"type":11,"tag":68,"props":5401,"children":5403},{"className":5402},[],[5404],{"type":17,"value":5405},"visual-language-evolution",{"type":17,"value":5407}," titles).",{"type":11,"tag":81,"props":5409,"children":5410},{},[5411,5421,5423,5429,5430,5436],{"type":11,"tag":85,"props":5412,"children":5413},{},[5414,5419],{"type":11,"tag":68,"props":5415,"children":5417},{"className":5416},[],[5418],{"type":17,"value":183},{"type":17,"value":5420}," §Suite chrome",{"type":17,"value":5422}," — the section\n",{"type":11,"tag":68,"props":5424,"children":5426},{"className":5425},[],[5427],{"type":17,"value":5428},"TuxUserMenu",{"type":17,"value":3280},{"type":11,"tag":68,"props":5431,"children":5433},{"className":5432},[],[5434],{"type":17,"value":5435},"TuxUtilityCluster",{"type":17,"value":5437}," docblocks have cited since v1.7.0\nbut which was never written: canonical header composition per shell\nshape, the cluster anatomy law, the two-shape identity rule as\ncomposition law, and the don't list.",{"type":11,"tag":81,"props":5439,"children":5440},{},[5441,5443,5448,5450,5455,5457,5462],{"type":17,"value":5442},"Owner decisions ratified 2026-07-30: form controls go ",{"type":11,"tag":85,"props":5444,"children":5445},{},[5446],{"type":17,"value":5447},"hybrid",{"type":17,"value":5449},"\n(harden the layer's Nuxt UI theme; no wrapper set; ",{"type":11,"tag":68,"props":5451,"children":5453},{"className":5452},[],[5454],{"type":17,"value":4755},{"type":17,"value":5456},"\nre-scoped editorial — lands v1.8.0), ",{"type":11,"tag":68,"props":5458,"children":5460},{"className":5459},[],[5461],{"type":17,"value":5123},{"type":17,"value":5463}," → TTI gold (v1.8.0),\ncollab-stack hc-as-light confirmed accidental, docs-platform work\nspun into its own workstream.",{"type":11,"tag":56,"props":5465,"children":5467},{"id":5466},"added-catalog-single-source-registry-test-2026-07-30",[5468],{"type":17,"value":5469},"Added — catalog single source + registry test (2026-07-30)",{"type":11,"tag":77,"props":5471,"children":5472},{},[5473,5534,5585],{"type":11,"tag":81,"props":5474,"children":5475},{},[5476,5485,5487,5493,5495,5500,5501,5506,5508,5513,5515,5521,5522,5527,5528,5533],{"type":11,"tag":85,"props":5477,"children":5478},{},[5479],{"type":11,"tag":68,"props":5480,"children":5482},{"className":5481},[],[5483],{"type":17,"value":5484},"app\u002Futils\u002FtuxCatalog.ts",{"type":17,"value":5486}," — one 139-entry catalog (name, route,\nicon, family, kind, wraps, blurb) now drives the sidebar navTree's\nComponents \u002F Reports \u002F Visualizations groups, the ",{"type":11,"tag":68,"props":5488,"children":5490},{"className":5489},[],[5491],{"type":17,"value":5492},"\u002Fcomponents",{"type":17,"value":5494},"\nindex card grid, and the homepage count. The four hand-maintained\nlists it replaces had drifted: ~30 components missing from the index\ngrid (the entire research-publishing, TTI-identity, geospatial, and\nforms families), 9 from the sidebar (including v1.7.0's own\n",{"type":11,"tag":68,"props":5496,"children":5498},{"className":5497},[],[5499],{"type":17,"value":5428},{"type":17,"value":912},{"type":11,"tag":68,"props":5502,"children":5504},{"className":5503},[],[5505],{"type":17,"value":5435},{"type":17,"value":5507},"), 3 from ",{"type":11,"tag":68,"props":5509,"children":5511},{"className":5510},[],[5512],{"type":17,"value":167},{"type":17,"value":5514},"\n(backfilled: ",{"type":11,"tag":68,"props":5516,"children":5518},{"className":5517},[],[5519],{"type":17,"value":5520},"TuxRailNav",{"type":17,"value":95},{"type":11,"tag":68,"props":5523,"children":5525},{"className":5524},[],[5526],{"type":17,"value":5428},{"type":17,"value":95},{"type":11,"tag":68,"props":5529,"children":5531},{"className":5530},[],[5532],{"type":17,"value":5435},{"type":17,"value":2630},{"type":11,"tag":81,"props":5535,"children":5536},{},[5537,5546,5548,5553,5555,5561,5563,5569,5570,5576,5577,5583],{"type":11,"tag":85,"props":5538,"children":5539},{},[5540],{"type":11,"tag":68,"props":5541,"children":5543},{"className":5542},[],[5544],{"type":17,"value":5545},"tests\u002Ftux-catalog.test.ts",{"type":17,"value":5547}," — catalog ↔ filesystem ↔ routes ↔\n",{"type":11,"tag":68,"props":5549,"children":5551},{"className":5550},[],[5552],{"type":17,"value":167},{"type":17,"value":5554}," invariants in the ",{"type":11,"tag":68,"props":5556,"children":5558},{"className":5557},[],[5559],{"type":17,"value":5560},"useTuxApps.test.ts",{"type":17,"value":5562}," mold. The\nicon check immediately caught 10 deprecated Lucide alias names\n(",{"type":11,"tag":68,"props":5564,"children":5566},{"className":5565},[],[5567],{"type":17,"value":5568},"form-input",{"type":17,"value":95},{"type":11,"tag":68,"props":5571,"children":5573},{"className":5572},[],[5574],{"type":17,"value":5575},"alert-circle",{"type":17,"value":95},{"type":11,"tag":68,"props":5578,"children":5580},{"className":5579},[],[5581],{"type":17,"value":5582},"check-square",{"type":17,"value":5584},", …) that the nav had\ncarried silently — all renamed to canonical.",{"type":11,"tag":81,"props":5586,"children":5587},{},[5588,5598],{"type":11,"tag":85,"props":5589,"children":5590},{},[5591,5596],{"type":11,"tag":68,"props":5592,"children":5594},{"className":5593},[],[5595],{"type":17,"value":3460},{"type":17,"value":5597}," now gates CI",{"type":17,"value":5599}," (quality job) — vitest existed since\nv1.7.0 but ran in no workflow.",{"type":11,"tag":56,"props":5601,"children":5603},{"id":5602},"fixed-doc-truth-pass-2026-07-30",[5604],{"type":17,"value":5605},"Fixed — doc truth pass (2026-07-30)",{"type":11,"tag":77,"props":5607,"children":5608},{},[5609,5644,5649],{"type":11,"tag":81,"props":5610,"children":5611},{},[5612,5614,5620,5621,5627,5629,5634,5636,5642],{"type":17,"value":5613},"README: \"Current release: v1.4.2\" (three releases stale) replaced\nwith a CHANGELOG pointer; pin examples bumped ",{"type":11,"tag":68,"props":5615,"children":5617},{"className":5616},[],[5618],{"type":17,"value":5619},"#v1.4.2",{"type":17,"value":1144},{"type":11,"tag":68,"props":5622,"children":5624},{"className":5623},[],[5625],{"type":17,"value":5626},"#v1.7.0",{"type":17,"value":5628},";\ncomponent census corrected (~130+5 → 140+6, now test-enforced);\nthe \"Landscape — formerly Landscape\" rename artifact fixed; ",{"type":11,"tag":68,"props":5630,"children":5632},{"className":5631},[],[5633],{"type":17,"value":73},{"type":17,"value":5635},"\nand the apps registry documented; ADR count corrected (ten →\ntwelve); ",{"type":11,"tag":68,"props":5637,"children":5639},{"className":5638},[],[5640],{"type":17,"value":5641},"useTuxApps",{"type":17,"value":5643}," added to the composables list.",{"type":11,"tag":81,"props":5645,"children":5646},{},[5647],{"type":17,"value":5648},"Homepage: hardcoded \"70+\" count now computed from the catalog;\nrecent-updates feed gains the missing v1.7.0 suite-chrome entry.",{"type":11,"tag":81,"props":5650,"children":5651},{},[5652,5658,5660,5665,5667,5673,5675,5680,5682,5688],{"type":11,"tag":68,"props":5653,"children":5655},{"className":5654},[],[5656],{"type":17,"value":5657},"getting-started.vue",{"type":17,"value":5659}," counts (~100\u002F~95) corrected; ",{"type":11,"tag":68,"props":5661,"children":5663},{"className":5662},[],[5664],{"type":17,"value":167},{"type":17,"value":5666},"\n\"~70 components\" corrected and phantom references annotated\n(",{"type":11,"tag":68,"props":5668,"children":5670},{"className":5669},[],[5671],{"type":17,"value":5672},"TuxPhotoCard",{"type":17,"value":5674}," → roadmap; ",{"type":11,"tag":68,"props":5676,"children":5678},{"className":5677},[],[5679],{"type":17,"value":4500},{"type":17,"value":5681}," → ships v1.8.0);\n",{"type":11,"tag":68,"props":5683,"children":5685},{"className":5684},[],[5686],{"type":17,"value":5687},"roadmap.md",{"type":17,"value":5689}," ship-checklist now points at the catalog + test\ninstead of four files.",{"type":11,"tag":45,"props":5691,"children":5693},{"id":5692},"_170-2026-07-28",[5694,5699],{"type":11,"tag":50,"props":5695,"children":5696},{},[5697],{"type":17,"value":5698},"1.7.0",{"type":17,"value":5700}," — 2026-07-28",{"type":11,"tag":19,"props":5702,"children":5703},{},[5704],{"type":17,"value":5705},"Suite-chrome release — the portal unification plan's v1.7.0 slice.",{"type":11,"tag":56,"props":5707,"children":5709},{"id":5708},"added-2",[5710],{"type":17,"value":1220},{"type":11,"tag":77,"props":5712,"children":5713},{},[5714,5738,5761,5785],{"type":11,"tag":81,"props":5715,"children":5716},{},[5717,5722,5723,5728,5730,5736],{"type":11,"tag":85,"props":5718,"children":5719},{},[5720],{"type":17,"value":5721},"TTI Portals registry",{"type":17,"value":621},{"type":11,"tag":68,"props":5724,"children":5726},{"className":5725},[],[5727],{"type":17,"value":1452},{"type":17,"value":5729}," (public tile metadata only) + ",{"type":11,"tag":68,"props":5731,"children":5733},{"className":5732},[],[5734],{"type":17,"value":5735},"useTuxApps()",{"type":17,"value":5737}," with audience filtering (public \u002F authenticated \u002F entitled, Tier-0 fail-open) and filtered-count footer text. App lists are never hand-declared in consumers (doctrine).",{"type":11,"tag":81,"props":5739,"children":5740},{},[5741,5745,5747,5753,5755,5760],{"type":11,"tag":85,"props":5742,"children":5743},{},[5744],{"type":17,"value":5435},{"type":17,"value":5746}," — the trailing app-control cluster: ",{"type":11,"tag":68,"props":5748,"children":5750},{"className":5749},[],[5751],{"type":17,"value":5752},"search · notifications · theme · waffle · identity",{"type":17,"value":5754}," in law-fixed DOM order; registry-fed waffle; theme toggle announces via ",{"type":11,"tag":68,"props":5756,"children":5758},{"className":5757},[],[5759],{"type":17,"value":4519},{"type":17,"value":43},{"type":11,"tag":81,"props":5762,"children":5763},{},[5764,5768,5770,5776,5777,5783],{"type":11,"tag":85,"props":5765,"children":5766},{},[5767],{"type":17,"value":5428},{"type":17,"value":5769}," — the suite's one identity affordance: ",{"type":11,"tag":68,"props":5771,"children":5773},{"className":5772},[],[5774],{"type":17,"value":5775},"cluster",{"type":17,"value":912},{"type":11,"tag":68,"props":5778,"children":5780},{"className":5779},[],[5781],{"type":17,"value":5782},"rail-footer",{"type":17,"value":5784}," mounts, state-complete (loading \u002F signed-out \u002F signed-in \u002F local-only \u002F error), law-fixed menu order.",{"type":11,"tag":81,"props":5786,"children":5787},{},[5788],{"type":17,"value":5789},"vitest + registry-invariant unit tests (tile-position constancy, audience filtering, no client-side entitlement mappings).",{"type":11,"tag":56,"props":5791,"children":5793},{"id":5792},"changed-1",[5794],{"type":17,"value":3591},{"type":11,"tag":77,"props":5796,"children":5797},{},[5798,5824,5829],{"type":11,"tag":81,"props":5799,"children":5800},{},[5801,5806,5808,5814,5816,5822],{"type":11,"tag":85,"props":5802,"children":5803},{},[5804],{"type":17,"value":5805},"TuxAppSwitcher A2b pre-flight",{"type":17,"value":5807},": registry order everywhere (current-sorts-last removed), focusable current tile with clean ",{"type":11,"tag":68,"props":5809,"children":5811},{"className":5810},[],[5812],{"type":17,"value":5813},"aria-current",{"type":17,"value":5815},", list semantics, same-tab default, \"Desktop app\" affix, reserved ",{"type":11,"tag":68,"props":5817,"children":5819},{"className":5818},[],[5820],{"type":17,"value":5821},"presentation",{"type":17,"value":5823}," prop (popover|sheet), motion tokens, forced-colors fallbacks, heading \"TTI Portals\".",{"type":11,"tag":81,"props":5825,"children":5826},{},[5827],{"type":17,"value":5828},"Docs site dogfoods the suite chrome: header uses TuxUtilityCluster (waffle + theme; identity seat deliberately absent).",{"type":11,"tag":81,"props":5830,"children":5831},{},[5832,5834,5840,5841,5847],{"type":17,"value":5833},"Live PECAN copy retired (READMEs, examples, demo poster, ",{"type":11,"tag":68,"props":5835,"children":5837},{"className":5836},[],[5838],{"type":17,"value":5839},"PECAN_TOKEN",{"type":17,"value":1144},{"type":11,"tag":68,"props":5842,"children":5844},{"className":5843},[],[5845],{"type":17,"value":5846},"LANDSCAPE_TOKEN",{"type":17,"value":5848},"). Historical records keep the old name.",{"type":11,"tag":56,"props":5850,"children":5852},{"id":5851},"fixed-2",[5853],{"type":17,"value":2001},{"type":11,"tag":77,"props":5855,"children":5856},{},[5857,5874],{"type":11,"tag":81,"props":5858,"children":5859},{},[5860,5865,5867,5872],{"type":11,"tag":85,"props":5861,"children":5862},{},[5863],{"type":17,"value":5864},"TuxSiteNav focus restoration (A2c)",{"type":17,"value":5866},": both ",{"type":11,"tag":68,"props":5868,"children":5870},{"className":5869},[],[5871],{"type":17,"value":3639},{"type":17,"value":5873}," suppressions removed — keyboard focus is distinguishable from hover again (WCAG 2.4.7) and survives forced-colors.",{"type":11,"tag":81,"props":5875,"children":5876},{},[5877,5879,5885,5887,5893],{"type":17,"value":5878},"Five undeclared ",{"type":11,"tag":68,"props":5880,"children":5882},{"className":5881},[],[5883],{"type":17,"value":5884},"@tiptap",{"type":17,"value":5886}," dependencies declared (v1.6.1); ",{"type":11,"tag":68,"props":5888,"children":5890},{"className":5889},[],[5891],{"type":17,"value":5892},"postinstall",{"type":17,"value":5894}," guarded for git-dep consumers; brace-expansion pinned 5.0.8 (CVE-2026-14257).",{"type":11,"tag":45,"props":5896,"children":5898},{"id":5897},"_160-2026-06-05",[5899,5904],{"type":11,"tag":50,"props":5900,"children":5901},{},[5902],{"type":17,"value":5903},"1.6.0",{"type":17,"value":5905}," — 2026-06-05",{"type":11,"tag":19,"props":5907,"children":5908},{},[5909,5911,5917],{"type":17,"value":5910},"Additive release (no breaking changes) — two new component capabilities\nrequested by the docs-tti consumer. Cut from the v1.5.0 tag (does NOT include\nthe in-flight Bootstrap-theme \u002F token-pipeline work on ",{"type":11,"tag":68,"props":5912,"children":5914},{"className":5913},[],[5915],{"type":17,"value":5916},"main",{"type":17,"value":2630},{"type":11,"tag":56,"props":5919,"children":5921},{"id":5920},"added-tuxbadge-tone-prop",[5922,5923,5929,5930,5935],{"type":17,"value":4412},{"type":11,"tag":68,"props":5924,"children":5926},{"className":5925},[],[5927],{"type":17,"value":5928},"TuxBadge",{"type":17,"value":996},{"type":11,"tag":68,"props":5931,"children":5933},{"className":5932},[],[5934],{"type":17,"value":2380},{"type":17,"value":5936}," prop",{"type":11,"tag":77,"props":5938,"children":5939},{},[5940],{"type":11,"tag":81,"props":5941,"children":5942},{},[5943,5951,5952,5958,5960,5966,5967,5973],{"type":11,"tag":85,"props":5944,"children":5945},{},[5946],{"type":11,"tag":68,"props":5947,"children":5949},{"className":5948},[],[5950],{"type":17,"value":2380},{"type":17,"value":2078},{"type":11,"tag":68,"props":5953,"children":5955},{"className":5954},[],[5956],{"type":17,"value":5957},"info | success | warning | error | neutral",{"type":17,"value":5959},") — a generic\nsemantic-color badge, the open-ended sibling of ",{"type":11,"tag":68,"props":5961,"children":5963},{"className":5962},[],[5964],{"type":17,"value":5965},"tier",{"type":17,"value":875},{"type":11,"tag":68,"props":5968,"children":5970},{"className":5969},[],[5971],{"type":17,"value":5972},"status",{"type":17,"value":5974},". No\nlifecycle affordance (no status dot, no spinner). For inline doc labels\nlike \"Work in Progress\", \"Available\", \"Evolving Standard\" where the\nclassification-tier \u002F lifecycle-status semantics don't fit.",{"type":11,"tag":56,"props":5976,"children":5978},{"id":5977},"added-tuxcard-linked-prop-attribute-forwarding",[5979,5980,5986,5987,5993],{"type":17,"value":4412},{"type":11,"tag":68,"props":5981,"children":5983},{"className":5982},[],[5984],{"type":17,"value":5985},"TuxCard",{"type":17,"value":996},{"type":11,"tag":68,"props":5988,"children":5990},{"className":5989},[],[5991],{"type":17,"value":5992},"linked",{"type":17,"value":5994}," prop + attribute forwarding",{"type":11,"tag":77,"props":5996,"children":5997},{},[5998,6035],{"type":11,"tag":81,"props":5999,"children":6000},{},[6001,6009,6011,6017,6019,6025,6027,6033],{"type":11,"tag":85,"props":6002,"children":6003},{},[6004],{"type":11,"tag":68,"props":6005,"children":6007},{"className":6006},[],[6008],{"type":17,"value":5992},{"type":17,"value":6010}," — renders the linked-card chrome (hover-lift + corner arrow)\non a plain ",{"type":11,"tag":68,"props":6012,"children":6014},{"className":6013},[],[6015],{"type":17,"value":6016},"\u003Cdiv>",{"type":17,"value":6018}," instead of an anchor. For cards whose real link lives\non an inner element (a title link with a stretched ",{"type":11,"tag":68,"props":6020,"children":6022},{"className":6021},[],[6023],{"type":17,"value":6024},"::after",{"type":17,"value":6026},"), is EXTERNAL,\nor that contain several interactive children an anchor wrapper would\nswallow. ",{"type":11,"tag":68,"props":6028,"children":6030},{"className":6029},[],[6031],{"type":17,"value":6032},"to",{"type":17,"value":6034}," still wins when both are set.",{"type":11,"tag":81,"props":6036,"children":6037},{},[6038,6043,6044,6049,6051,6057,6059,6065,6067,6073,6074,6080],{"type":11,"tag":85,"props":6039,"children":6040},{},[6041],{"type":17,"value":6042},"Attribute forwarding",{"type":17,"value":1244},{"type":11,"tag":68,"props":6045,"children":6047},{"className":6046},[],[6048],{"type":17,"value":5985},{"type":17,"value":6050}," is a multi-root component (its three\nbranches), so Vue couldn't auto-inherit fallthrough attrs. Added\n",{"type":11,"tag":68,"props":6052,"children":6054},{"className":6053},[],[6055],{"type":17,"value":6056},"inheritAttrs: false",{"type":17,"value":6058}," + explicit ",{"type":11,"tag":68,"props":6060,"children":6062},{"className":6061},[],[6063],{"type":17,"value":6064},"v-bind=\"$attrs\"",{"type":17,"value":6066}," on each root so\nconsumers can reliably pass ",{"type":11,"tag":68,"props":6068,"children":6070},{"className":6069},[],[6071],{"type":17,"value":6072},"class",{"type":17,"value":875},{"type":11,"tag":68,"props":6075,"children":6077},{"className":6076},[],[6078],{"type":17,"value":6079},"id",{"type":17,"value":6081}," \u002F etc.",{"type":11,"tag":45,"props":6083,"children":6085},{"id":6084},"_150-2026-06-02",[6086,6091],{"type":11,"tag":50,"props":6087,"children":6088},{},[6089],{"type":17,"value":6090},"1.5.0",{"type":17,"value":6092}," — 2026-06-02",{"type":11,"tag":56,"props":6094,"children":6096},{"id":6095},"added-tightened-the-authoring-loop-2026-06-02",[6097],{"type":17,"value":6098},"Added — Tightened the authoring loop (2026-06-02)",{"type":11,"tag":19,"props":6100,"children":6101},{},[6102,6104,6109],{"type":17,"value":6103},"Two new guards + a toolchain fix, after a session-state review found\nthat defects were consistently caught in batch audits ",{"type":11,"tag":155,"props":6105,"children":6106},{},[6107],{"type":17,"value":6108},"after",{"type":17,"value":6110}," shipping\nrather than during authoring.",{"type":11,"tag":19,"props":6112,"children":6113},{},[6114,6125,6126,6132,6134,6139,6141,6147,6149,6155,6157,6163,6165,6171,6173,6178,6180,6186,6188,6193,6194,6200,6202,6208],{"type":11,"tag":85,"props":6115,"children":6116},{},[6117,6123],{"type":11,"tag":68,"props":6118,"children":6120},{"className":6119},[],[6121],{"type":17,"value":6122},"vue-tsc",{"type":17,"value":6124}," resolution fixed.",{"type":17,"value":996},{"type":11,"tag":68,"props":6127,"children":6129},{"className":6128},[],[6130],{"type":17,"value":6131},"nuxt typecheck",{"type":17,"value":6133}," was resolving ",{"type":11,"tag":68,"props":6135,"children":6137},{"className":6136},[],[6138],{"type":17,"value":6122},{"type":17,"value":6140},"\nfrom the global npx cache while ",{"type":11,"tag":68,"props":6142,"children":6144},{"className":6143},[],[6145],{"type":17,"value":6146},"vue-router",{"type":17,"value":6148},"'s volar plugin\n(",{"type":11,"tag":68,"props":6150,"children":6152},{"className":6151},[],[6153],{"type":17,"value":6154},"vue-router\u002Fvolar\u002Fsfc-route-blocks",{"type":17,"value":6156},") loaded from local ",{"type":11,"tag":68,"props":6158,"children":6160},{"className":6159},[],[6161],{"type":17,"value":6162},"node_modules",{"type":17,"value":6164},"\nand then failed to ",{"type":11,"tag":68,"props":6166,"children":6168},{"className":6167},[],[6169],{"type":17,"value":6170},"require('@vue\u002Flanguage-core')",{"type":17,"value":6172}," (split dependency\ntrees). The typecheck still exited 0, but the route-block plugin was\nsilently ",{"type":11,"tag":155,"props":6174,"children":6175},{},[6176],{"type":17,"value":6177},"not running",{"type":17,"value":6179}," — so typed ",{"type":11,"tag":68,"props":6181,"children":6183},{"className":6182},[],[6184],{"type":17,"value":6185},"\u003Croute>",{"type":17,"value":6187},"-block checks were skipped.\nAdded ",{"type":11,"tag":68,"props":6189,"children":6191},{"className":6190},[],[6192],{"type":17,"value":6122},{"type":17,"value":912},{"type":11,"tag":68,"props":6195,"children":6197},{"className":6196},[],[6198],{"type":17,"value":6199},"@vue\u002Flanguage-core",{"type":17,"value":6201}," to ",{"type":11,"tag":68,"props":6203,"children":6205},{"className":6204},[],[6206],{"type":17,"value":6207},"devDependencies",{"type":17,"value":6209}," so the\nwhole toolchain resolves from one tree; the plugin now loads.",{"type":11,"tag":19,"props":6211,"children":6212},{},[6213,6222,6224,6229,6231,6237,6239,6245,6247,6253,6255,6261,6263,6269],{"type":11,"tag":85,"props":6214,"children":6215},{},[6216],{"type":11,"tag":68,"props":6217,"children":6219},{"className":6218},[],[6220],{"type":17,"value":6221},"npm run audit:tokens",{"type":17,"value":6223}," (new — ",{"type":11,"tag":68,"props":6225,"children":6227},{"className":6226},[],[6228],{"type":17,"value":2769},{"type":17,"value":6230},"). Static\npass asserting every ",{"type":11,"tag":68,"props":6232,"children":6234},{"className":6233},[],[6235],{"type":17,"value":6236},"var(--token)",{"type":17,"value":6238}," reference in ",{"type":11,"tag":68,"props":6240,"children":6242},{"className":6241},[],[6243],{"type":17,"value":6244},"app\u002F**\u002F*.{vue,css}",{"type":17,"value":6246},"\nresolves to a token defined in the CSS, a ",{"type":11,"tag":68,"props":6248,"children":6250},{"className":6249},[],[6251],{"type":17,"value":6252},"var(--x, fallback)",{"type":17,"value":6254},", or a\nknown external namespace (Tailwind \u002F Nuxt UI). Catches the\n",{"type":11,"tag":68,"props":6256,"children":6258},{"className":6257},[],[6259],{"type":17,"value":6260},"--surface-base",{"type":17,"value":6262}," class of bug (undefined token → transparent render)\nthat's invisible to typecheck (CSS isn't typed) and the contrast audit\n(no color to measure). Now blocking in CI's ",{"type":11,"tag":68,"props":6264,"children":6266},{"className":6265},[],[6267],{"type":17,"value":6268},"quality",{"type":17,"value":6270}," job.",{"type":11,"tag":19,"props":6272,"children":6273},{},[6274,6283,6284,6290,6292,6298,6300,6305,6307,6313,6315,6321,6322,6327],{"type":11,"tag":85,"props":6275,"children":6276},{},[6277],{"type":11,"tag":68,"props":6278,"children":6280},{"className":6279},[],[6281],{"type":17,"value":6282},"npm run audit:a11y",{"type":17,"value":6223},{"type":11,"tag":68,"props":6285,"children":6287},{"className":6286},[],[6288],{"type":17,"value":6289},"scripts\u002Faudit-a11y.mjs",{"type":17,"value":6291},"). Promotes the\nad-hoc \"tested via jsdom + axe-core\" pass into a committed, repeatable\ngate: runs axe-core over every prerendered page (",{"type":11,"tag":68,"props":6293,"children":6295},{"className":6294},[],[6296],{"type":17,"value":6297},"color-contrast",{"type":17,"value":6299},"\ndisabled — that's the contrast audit's job). The first full run found\n",{"type":11,"tag":85,"props":6301,"children":6302},{},[6303],{"type":17,"value":6304},"135 structural violations across 42 pages",{"type":17,"value":6306}," that the per-batch ad-hoc\nchecks had never covered site-wide; all are now fixed (see below). Now\nblocking in CI's ",{"type":11,"tag":68,"props":6308,"children":6310},{"className":6309},[],[6311],{"type":17,"value":6312},"audit",{"type":17,"value":6314}," job. Added ",{"type":11,"tag":68,"props":6316,"children":6318},{"className":6317},[],[6319],{"type":17,"value":6320},"axe-core",{"type":17,"value":6201},{"type":11,"tag":68,"props":6323,"children":6325},{"className":6324},[],[6326],{"type":17,"value":6207},{"type":17,"value":43},{"type":11,"tag":56,"props":6329,"children":6331},{"id":6330},"fixed-site-wide-a11y-remediation-2026-06-02",[6332],{"type":17,"value":6333},"Fixed — Site-wide a11y remediation (2026-06-02)",{"type":11,"tag":19,"props":6335,"children":6336},{},[6337,6339,6345],{"type":17,"value":6338},"Drove ",{"type":11,"tag":68,"props":6340,"children":6342},{"className":6341},[],[6343],{"type":17,"value":6344},"audit:a11y",{"type":17,"value":6346}," to zero across all 164 pages. Highlights:",{"type":11,"tag":77,"props":6348,"children":6349},{},[6350,6439,6497,6533,6641,6671,6727,6753],{"type":11,"tag":81,"props":6351,"children":6352},{},[6353,6358,6359,6365,6366,6372,6373,6379,6380,6386,6387,6393,6395,6401,6403,6409,6410,6416,6418,6424,6426,6431,6433,6438],{"type":11,"tag":85,"props":6354,"children":6355},{},[6356],{"type":17,"value":6357},"Charts",{"type":17,"value":2078},{"type":11,"tag":68,"props":6360,"children":6362},{"className":6361},[],[6363],{"type":17,"value":6364},"TuxChartArea",{"type":17,"value":875},{"type":11,"tag":68,"props":6367,"children":6369},{"className":6368},[],[6370],{"type":17,"value":6371},"Bar",{"type":17,"value":875},{"type":11,"tag":68,"props":6374,"children":6376},{"className":6375},[],[6377],{"type":17,"value":6378},"Line",{"type":17,"value":875},{"type":11,"tag":68,"props":6381,"children":6383},{"className":6382},[],[6384],{"type":17,"value":6385},"Scatter",{"type":17,"value":95},{"type":11,"tag":68,"props":6388,"children":6390},{"className":6389},[],[6391],{"type":17,"value":6392},"TuxDiagram",{"type":17,"value":6394},")\n— ",{"type":11,"tag":68,"props":6396,"children":6398},{"className":6397},[],[6399],{"type":17,"value":6400},"aria-label",{"type":17,"value":6402}," on bare SVG shapes (",{"type":11,"tag":68,"props":6404,"children":6406},{"className":6405},[],[6407],{"type":17,"value":6408},"\u003Crect>",{"type":17,"value":875},{"type":11,"tag":68,"props":6411,"children":6413},{"className":6412},[],[6414],{"type":17,"value":6415},"\u003Ccircle>",{"type":17,"value":6417},") is prohibited\nwithout a name-supporting role; added ",{"type":11,"tag":68,"props":6419,"children":6421},{"className":6420},[],[6422],{"type":17,"value":6423},"role=\"img\"",{"type":17,"value":6425}," to labeled data \u002F\ninteraction shapes. ",{"type":11,"tag":68,"props":6427,"children":6429},{"className":6428},[],[6430],{"type":17,"value":6392},{"type":17,"value":6432}," mermaid output is legalized via a\npost-processor; its loading skeleton got ",{"type":11,"tag":68,"props":6434,"children":6436},{"className":6435},[],[6437],{"type":17,"value":4519},{"type":17,"value":43},{"type":11,"tag":81,"props":6440,"children":6441},{},[6442,6451,6452,6458,6460,6465,6467,6473,6475,6480,6481,6487,6489,6495],{"type":11,"tag":85,"props":6443,"children":6444},{},[6445],{"type":11,"tag":68,"props":6446,"children":6448},{"className":6447},[],[6449],{"type":17,"value":6450},"TuxFileDropzone",{"type":17,"value":912},{"type":11,"tag":68,"props":6453,"children":6455},{"className":6454},[],[6456],{"type":17,"value":6457},"\u002Fforms\u002Ffile-upload",{"type":17,"value":6459}," — converted the\n",{"type":11,"tag":68,"props":6461,"children":6463},{"className":6462},[],[6464],{"type":17,"value":3532},{"type":17,"value":6466}," drop zone wrapping a focusable ",{"type":11,"tag":68,"props":6468,"children":6470},{"className":6469},[],[6471],{"type":17,"value":6472},"\u003Cinput type=\"file\">",{"type":17,"value":6474},"\n(critical ",{"type":11,"tag":68,"props":6476,"children":6478},{"className":6477},[],[6479],{"type":17,"value":2566},{"type":17,"value":912},{"type":11,"tag":68,"props":6482,"children":6484},{"className":6483},[],[6485],{"type":17,"value":6486},"nested-interactive",{"type":17,"value":6488},") to a native ",{"type":11,"tag":68,"props":6490,"children":6492},{"className":6491},[],[6493],{"type":17,"value":6494},"\u003Clabel>",{"type":17,"value":6496},"\nwrapper: one focusable, named control, no nesting.",{"type":11,"tag":81,"props":6498,"children":6499},{},[6500,6508,6510,6516,6518,6524,6526,6532],{"type":11,"tag":85,"props":6501,"children":6502},{},[6503],{"type":11,"tag":68,"props":6504,"children":6506},{"className":6505},[],[6507],{"type":17,"value":2432},{"type":17,"value":6509}," — moved ",{"type":11,"tag":68,"props":6511,"children":6513},{"className":6512},[],[6514],{"type":17,"value":6515},"role=\"listitem\"",{"type":17,"value":6517}," off the ",{"type":11,"tag":68,"props":6519,"children":6521},{"className":6520},[],[6522],{"type":17,"value":6523},"\u003Cbutton>",{"type":17,"value":6525},"\nonto a wrapping element (",{"type":11,"tag":68,"props":6527,"children":6529},{"className":6528},[],[6530],{"type":17,"value":6531},"aria-allowed-role",{"type":17,"value":2630},{"type":11,"tag":81,"props":6534,"children":6535},{},[6536,6544,6545,6551,6552,6558,6560,6569,6571,6577,6578,6584,6586,6594,6596,6602,6604,6613,6614,6623,6625,6631,6633,6639],{"type":11,"tag":85,"props":6537,"children":6538},{},[6539],{"type":11,"tag":68,"props":6540,"children":6542},{"className":6541},[],[6543],{"type":17,"value":2315},{"type":17,"value":996},{"type":11,"tag":68,"props":6546,"children":6548},{"className":6547},[],[6549],{"type":17,"value":6550},"\u003Caside role=\"alert\">",{"type":17,"value":1144},{"type":11,"tag":68,"props":6553,"children":6555},{"className":6554},[],[6556],{"type":17,"value":6557},"\u003Cdiv role=\"alert\">",{"type":17,"value":6559},";\n",{"type":11,"tag":85,"props":6561,"children":6562},{},[6563],{"type":11,"tag":68,"props":6564,"children":6566},{"className":6565},[],[6567],{"type":17,"value":6568},"TuxSplitPane",{"type":17,"value":6570}," detail ",{"type":11,"tag":68,"props":6572,"children":6574},{"className":6573},[],[6575],{"type":17,"value":6576},"\u003Cmain>",{"type":17,"value":1144},{"type":11,"tag":68,"props":6579,"children":6581},{"className":6580},[],[6582],{"type":17,"value":6583},"\u003Csection role=\"region\">",{"type":17,"value":6585}," (no\nduplicate \u002F nested main); ",{"type":11,"tag":85,"props":6587,"children":6588},{},[6589],{"type":11,"tag":68,"props":6590,"children":6592},{"className":6591},[],[6593],{"type":17,"value":3357},{"type":17,"value":6595}," empty ",{"type":11,"tag":68,"props":6597,"children":6599},{"className":6598},[],[6600],{"type":17,"value":6601},"\u003Cth>",{"type":17,"value":6603}," → visually\nhidden text; ",{"type":11,"tag":85,"props":6605,"children":6606},{},[6607],{"type":11,"tag":68,"props":6608,"children":6610},{"className":6609},[],[6611],{"type":17,"value":6612},"TuxAbstract",{"type":17,"value":875},{"type":11,"tag":85,"props":6615,"children":6616},{},[6617],{"type":11,"tag":68,"props":6618,"children":6620},{"className":6619},[],[6621],{"type":17,"value":6622},"TuxAcknowledgments",{"type":17,"value":6624}," hardcoded\n",{"type":11,"tag":68,"props":6626,"children":6628},{"className":6627},[],[6629],{"type":17,"value":6630},"\u003Ch4>",{"type":17,"value":6632}," → configurable ",{"type":11,"tag":68,"props":6634,"children":6636},{"className":6635},[],[6637],{"type":17,"value":6638},"level",{"type":17,"value":6640}," prop (heading-order).",{"type":11,"tag":81,"props":6642,"children":6643},{},[6644,6653,6655,6661,6663,6669],{"type":11,"tag":85,"props":6645,"children":6646},{},[6647],{"type":11,"tag":68,"props":6648,"children":6650},{"className":6649},[],[6651],{"type":17,"value":6652},"TuxCardCarousel",{"type":17,"value":6654}," — dropped the redundant outer ",{"type":11,"tag":68,"props":6656,"children":6658},{"className":6657},[],[6659],{"type":17,"value":6660},"region",{"type":17,"value":6662}," landmark\n(Nuxt UI's ",{"type":11,"tag":68,"props":6664,"children":6666},{"className":6665},[],[6667],{"type":17,"value":6668},"UCarousel",{"type":17,"value":6670}," already is one) and named that region instead.",{"type":11,"tag":81,"props":6672,"children":6673},{},[6674,6683,6685,6691,6693,6699,6701,6706,6708,6713,6714,6719,6720,6726],{"type":11,"tag":85,"props":6675,"children":6676},{},[6677],{"type":11,"tag":68,"props":6678,"children":6680},{"className":6679},[],[6681],{"type":17,"value":6682},"TuxToc",{"type":17,"value":6684}," showcase wrapper ",{"type":11,"tag":68,"props":6686,"children":6688},{"className":6687},[],[6689],{"type":17,"value":6690},"\u003Caside>",{"type":17,"value":6692},"\u002Fover-eager ",{"type":11,"tag":68,"props":6694,"children":6696},{"className":6695},[],[6697],{"type":17,"value":6698},"\u003Cnav>",{"type":17,"value":6700}," → plain\n",{"type":11,"tag":68,"props":6702,"children":6704},{"className":6703},[],[6705],{"type":17,"value":6016},{"type":17,"value":6707},"; tree \u002F sunburst callout ",{"type":11,"tag":68,"props":6709,"children":6711},{"className":6710},[],[6712],{"type":17,"value":6690},{"type":17,"value":1144},{"type":11,"tag":68,"props":6715,"children":6717},{"className":6716},[],[6718],{"type":17,"value":6016},{"type":17,"value":3769},{"type":11,"tag":68,"props":6721,"children":6723},{"className":6722},[],[6724],{"type":17,"value":6725},"landmark-complementary-is-top-level",{"type":17,"value":2630},{"type":11,"tag":81,"props":6728,"children":6729},{},[6730,6735,6737,6743,6745,6751],{"type":11,"tag":85,"props":6731,"children":6732},{},[6733],{"type":17,"value":6734},"Landmark components",{"type":17,"value":6736}," (alpha-nav, branch-nav, breadcrumbs, link-slab,\npagination, site-nav, stepper, tab-bar, treemap) — added optional\n",{"type":11,"tag":68,"props":6738,"children":6740},{"className":6739},[],[6741],{"type":17,"value":6742},"ariaLabel",{"type":17,"value":6744}," props and gave each repeated showcase instance a unique\naccessible name (",{"type":11,"tag":68,"props":6746,"children":6748},{"className":6747},[],[6749],{"type":17,"value":6750},"landmark-unique",{"type":17,"value":6752},", which fired because galleries\nrender a landmark component 5–7×).",{"type":11,"tag":81,"props":6754,"children":6755},{},[6756,6761,6763,6769,6770,6776,6778,6784,6786,6792,6793,6799,6801,6806,6808,6813,6815,6820,6822,6828],{"type":11,"tag":85,"props":6757,"children":6758},{},[6759],{"type":17,"value":6760},"Doc pages",{"type":17,"value":6762}," — index-grid card headings ",{"type":11,"tag":68,"props":6764,"children":6766},{"className":6765},[],[6767],{"type":17,"value":6768},"\u003Ch3>",{"type":17,"value":1144},{"type":11,"tag":68,"props":6771,"children":6773},{"className":6772},[],[6774],{"type":17,"value":6775},"\u003Ch2>",{"type":17,"value":6777}," (no level\nskip under the page ",{"type":11,"tag":68,"props":6779,"children":6781},{"className":6780},[],[6782],{"type":17,"value":6783},"\u003Ch1>",{"type":17,"value":6785},"); ",{"type":11,"tag":68,"props":6787,"children":6789},{"className":6788},[],[6790],{"type":17,"value":6791},"\u002Fkits\u002Fslides",{"type":17,"value":912},{"type":11,"tag":68,"props":6794,"children":6796},{"className":6795},[],[6797],{"type":17,"value":6798},"\u002Fkits\u002Faggieux",{"type":17,"value":6800}," content\nwrapped in a ",{"type":11,"tag":68,"props":6802,"children":6804},{"className":6803},[],[6805],{"type":17,"value":6576},{"type":17,"value":6807}," landmark (",{"type":11,"tag":68,"props":6809,"children":6811},{"className":6810},[],[6812],{"type":17,"value":6660},{"type":17,"value":6814},"); icon-only buttons on\napp-frame \u002F swipe \u002F text-field given ",{"type":11,"tag":68,"props":6816,"children":6818},{"className":6817},[],[6819],{"type":17,"value":6400},{"type":17,"value":6821}," (critical\n",{"type":11,"tag":68,"props":6823,"children":6825},{"className":6824},[],[6826],{"type":17,"value":6827},"button-name",{"type":17,"value":2630},{"type":11,"tag":56,"props":6830,"children":6832},{"id":6831},"added-tuxrailnav-2026-06-02",[6833],{"type":17,"value":6834},"Added — TuxRailNav (2026-06-02)",{"type":11,"tag":19,"props":6836,"children":6837},{},[6838,6840,6846,6847,6853,6855,6861,6863,6869,6871,6876,6878,6883,6885,6895],{"type":17,"value":6839},"Collapsible sidebar\u002Frail navigation built on native\n",{"type":11,"tag":68,"props":6841,"children":6843},{"className":6842},[],[6844],{"type":17,"value":6845},"\u003Cdetails>",{"type":17,"value":3280},{"type":11,"tag":68,"props":6848,"children":6850},{"className":6849},[],[6851],{"type":17,"value":6852},"\u003Csummary>",{"type":17,"value":6854}," (the ",{"type":11,"tag":68,"props":6856,"children":6858},{"className":6857},[],[6859],{"type":17,"value":6860},"TuxFilterPanel",{"type":17,"value":6862}," \"zero-JS, perfect-a11y\"\ndisclosure pattern). Grouped entries with one nesting level, an\nicon-only ",{"type":11,"tag":68,"props":6864,"children":6866},{"className":6865},[],[6867],{"type":17,"value":6868},"collapsed",{"type":17,"value":6870}," mode, and a ",{"type":11,"tag":68,"props":6872,"children":6874},{"className":6873},[],[6875],{"type":17,"value":6698},{"type":17,"value":6877}," landmark named via an\noverridable ",{"type":11,"tag":68,"props":6879,"children":6881},{"className":6880},[],[6882],{"type":17,"value":6742},{"type":17,"value":6884}," prop. Showcase at\n",{"type":11,"tag":25,"props":6886,"children":6888},{"href":6887},"app\u002Fpages\u002Fcomponents\u002Frail-nav.vue",[6889],{"type":11,"tag":68,"props":6890,"children":6892},{"className":6891},[],[6893],{"type":17,"value":6894},"\u002Fcomponents\u002Frail-nav",{"type":17,"value":43},{"type":11,"tag":19,"props":6897,"children":6898},{},[6899,6901,6907,6909,6915,6917,6923,6925,6931,6932,6938,6940,6945,6946,6951,6953,6959,6961,6966],{"type":17,"value":6900},"This is the tux-owned replacement for Nuxt UI's ",{"type":11,"tag":68,"props":6902,"children":6904},{"className":6903},[],[6905],{"type":17,"value":6906},"UNavigationMenu",{"type":17,"value":6908}," in\nvertical mode, which renders a collapsible group's chevron as a\nroleless ",{"type":11,"tag":68,"props":6910,"children":6912},{"className":6911},[],[6913],{"type":17,"value":6914},"\u003Cspan aria-expanded>",{"type":17,"value":6916}," (axe ",{"type":11,"tag":68,"props":6918,"children":6920},{"className":6919},[],[6921],{"type":17,"value":6922},"aria-allowed-attr",{"type":17,"value":6924}," — internal to\nNuxt UI, present in 4.7.0 and still in 4.8.1, not fixable from the\nconsumer side). Swapped into both example shells\n(",{"type":11,"tag":68,"props":6926,"children":6928},{"className":6927},[],[6929],{"type":17,"value":6930},"\u002Fexamples\u002Fsidebar-shell",{"type":17,"value":95},{"type":11,"tag":68,"props":6933,"children":6935},{"className":6934},[],[6936],{"type":17,"value":6937},"\u002Fexamples\u002Flandscape-dashboard",{"type":17,"value":6939},"), which\ncloses the last a11y violation ",{"type":11,"tag":85,"props":6941,"children":6942},{},[6943],{"type":17,"value":6944},"at the source",{"type":17,"value":1244},{"type":11,"tag":68,"props":6947,"children":6949},{"className":6948},[],[6950],{"type":17,"value":6344},{"type":17,"value":6952}," is now\na true zero with no suppressions. (A ",{"type":11,"tag":68,"props":6954,"children":6956},{"className":6955},[],[6957],{"type":17,"value":6958},"KNOWN_UPSTREAM",{"type":17,"value":6960}," allowlist remains\nin ",{"type":11,"tag":68,"props":6962,"children":6964},{"className":6963},[],[6965],{"type":17,"value":6289},{"type":17,"value":6967},", intentionally empty, as the documented\nhome for any future genuine third-party artifact.)",{"type":11,"tag":56,"props":6969,"children":6971},{"id":6970},"fixed-polish-pass-2026-05-26",[6972],{"type":17,"value":6973},"Fixed — Polish pass (2026-05-26)",{"type":11,"tag":19,"props":6975,"children":6976},{},[6977],{"type":17,"value":6978},"After the seven-slice add pass, an audit pass caught a token bug\nand three a11y violations.",{"type":11,"tag":19,"props":6980,"children":6981},{},[6982,6992,6994,7000,7001,7007,7008,7014,7015,7021,7022,7027,7028,7034,7036,7042,7044,7053,7055,7060,7061,7067,7068,7074,7076,7082],{"type":11,"tag":85,"props":6983,"children":6984},{},[6985,6990],{"type":11,"tag":68,"props":6986,"children":6988},{"className":6987},[],[6989],{"type":17,"value":6260},{"type":17,"value":6991}," was undefined",{"type":17,"value":6993}," — every component shipped in\nthis batch (",{"type":11,"tag":68,"props":6995,"children":6997},{"className":6996},[],[6998],{"type":17,"value":6999},"TuxCommentThread",{"type":17,"value":95},{"type":11,"tag":68,"props":7002,"children":7004},{"className":7003},[],[7005],{"type":17,"value":7006},"TuxPopover",{"type":17,"value":95},{"type":11,"tag":68,"props":7009,"children":7011},{"className":7010},[],[7012],{"type":17,"value":7013},"TuxMcpEmbed",{"type":17,"value":489},{"type":11,"tag":68,"props":7016,"children":7018},{"className":7017},[],[7019],{"type":17,"value":7020},"TuxRuleBuilderGroup",{"type":17,"value":95},{"type":11,"tag":68,"props":7023,"children":7025},{"className":7024},[],[7026],{"type":17,"value":2578},{"type":17,"value":95},{"type":11,"tag":68,"props":7029,"children":7031},{"className":7030},[],[7032],{"type":17,"value":7033},"TuxMobileFrame",{"type":17,"value":7035},", plus\ntwo showcase pages) referenced ",{"type":11,"tag":68,"props":7037,"children":7039},{"className":7038},[],[7040],{"type":17,"value":7041},"var(--surface-base)",{"type":17,"value":7043}," as a screen \u002F\ncontent background. That token doesn't exist in\n",{"type":11,"tag":25,"props":7045,"children":7047},{"href":7046},"app\u002Fassets\u002Fcss\u002Ftokens.css",[7048],{"type":11,"tag":68,"props":7049,"children":7051},{"className":7050},[],[7052],{"type":17,"value":2026},{"type":17,"value":7054}," — only ",{"type":11,"tag":68,"props":7056,"children":7058},{"className":7057},[],[7059],{"type":17,"value":3009},{"type":17,"value":489},{"type":11,"tag":68,"props":7062,"children":7064},{"className":7063},[],[7065],{"type":17,"value":7066},"--surface-raised",{"type":17,"value":323},{"type":11,"tag":68,"props":7069,"children":7071},{"className":7070},[],[7072],{"type":17,"value":7073},"--surface-sunken",{"type":17,"value":7075}," do. The undefined token\nfell back to no value, so backgrounds were transparent and whatever\nshowed through looked wrong in both light and dark mode. Swapped to\n",{"type":11,"tag":68,"props":7077,"children":7079},{"className":7078},[],[7080],{"type":17,"value":7081},"var(--surface-raised)",{"type":17,"value":7083}," across all 7 files — that's the equivalent\nTUX token for component-surface backgrounds (cards, modals, popovers,\nartifact bodies). Reported by the user: \"light mode has dark mode\ncolors.\"",{"type":11,"tag":19,"props":7085,"children":7086},{},[7087,7101,7103,7109,7111,7116,7118,7123,7125,7130],{"type":11,"tag":85,"props":7088,"children":7089},{},[7090,7095,7096],{"type":11,"tag":68,"props":7091,"children":7093},{"className":7092},[],[7094],{"type":17,"value":6486},{"type":17,"value":4849},{"type":11,"tag":68,"props":7097,"children":7099},{"className":7098},[],[7100],{"type":17,"value":7033},{"type":17,"value":7102}," — the frame's\n",{"type":11,"tag":68,"props":7104,"children":7106},{"className":7105},[],[7107],{"type":17,"value":7108},"\u003Cfigure>",{"type":17,"value":7110}," carried ",{"type":11,"tag":68,"props":7112,"children":7114},{"className":7113},[],[7115],{"type":17,"value":6423},{"type":17,"value":7117},", but the slot can hold focusable\nchildren (e.g. the demo CTA button). axe's\n",{"type":11,"tag":68,"props":7119,"children":7121},{"className":7120},[],[7122],{"type":17,"value":6486},{"type":17,"value":7124}," flagged it; dropped the role and let ",{"type":11,"tag":68,"props":7126,"children":7128},{"className":7127},[],[7129],{"type":17,"value":7108},{"type":17,"value":7131},"\ncarry its native semantic role instead.",{"type":11,"tag":19,"props":7133,"children":7134},{},[7135,7149,7151,7157,7159,7164],{"type":11,"tag":85,"props":7136,"children":7137},{},[7138,7143,7144],{"type":11,"tag":68,"props":7139,"children":7141},{"className":7140},[],[7142],{"type":17,"value":6750},{"type":17,"value":4849},{"type":11,"tag":68,"props":7145,"children":7147},{"className":7146},[],[7148],{"type":17,"value":4245},{"type":17,"value":7150}," — the top-level wrapper\nwas ",{"type":11,"tag":68,"props":7152,"children":7154},{"className":7153},[],[7155],{"type":17,"value":7156},"\u003Csection aria-label=\"Rule builder\">",{"type":17,"value":7158},", which gives it a landmark\nrole; two builders on one page (flagship + empty demo) collided.\nSwitched to a plain ",{"type":11,"tag":68,"props":7160,"children":7162},{"className":7161},[],[7163],{"type":17,"value":6016},{"type":17,"value":7165}," since the surrounding heading already\nnames the surface.",{"type":11,"tag":19,"props":7167,"children":7168},{},[7169],{"type":11,"tag":85,"props":7170,"children":7171},{},[7172],{"type":17,"value":7173},"Pre-existing TUX-wide fixes — caught while we were here:",{"type":11,"tag":77,"props":7175,"children":7176},{},[7177,7228],{"type":11,"tag":81,"props":7178,"children":7179},{},[7180,7185,7187,7193,7195,7201,7203,7211,7212,7218,7220,7226],{"type":11,"tag":68,"props":7181,"children":7183},{"className":7182},[],[7184],{"type":17,"value":4855},{"type":17,"value":7186}," element was missing ",{"type":11,"tag":68,"props":7188,"children":7190},{"className":7189},[],[7191],{"type":17,"value":7192},"lang",{"type":17,"value":7194}," — added\n",{"type":11,"tag":68,"props":7196,"children":7198},{"className":7197},[],[7199],{"type":17,"value":7200},"htmlAttrs: { lang: \"en\" }",{"type":17,"value":7202}," to\n",{"type":11,"tag":25,"props":7204,"children":7205},{"href":2121},[7206],{"type":11,"tag":68,"props":7207,"children":7209},{"className":7208},[],[7210],{"type":17,"value":2121},{"type":17,"value":996},{"type":11,"tag":68,"props":7213,"children":7215},{"className":7214},[],[7216],{"type":17,"value":7217},"app.head",{"type":17,"value":7219},". axe's ",{"type":11,"tag":68,"props":7221,"children":7223},{"className":7222},[],[7224],{"type":17,"value":7225},"html-has-lang",{"type":17,"value":7227},"\nrule (serious impact) had been failing on every page.",{"type":11,"tag":81,"props":7229,"children":7230},{},[7231,7237,7239,7245,7247,7252,7254,7259,7261,7266,7268,7273],{"type":11,"tag":68,"props":7232,"children":7234},{"className":7233},[],[7235],{"type":17,"value":7236},"TuxDocsSidebar",{"type":17,"value":7238}," was rendering ",{"type":11,"tag":68,"props":7240,"children":7242},{"className":7241},[],[7243],{"type":17,"value":7244},"\u003Caside role=\"navigation\">",{"type":17,"value":7246},", which\naxe's ",{"type":11,"tag":68,"props":7248,"children":7250},{"className":7249},[],[7251],{"type":17,"value":6531},{"type":17,"value":7253}," flags — aside's implicit complementary\nrole can't be overridden to navigation. Switched the outer element\nto native ",{"type":11,"tag":68,"props":7255,"children":7257},{"className":7256},[],[7258],{"type":17,"value":6698},{"type":17,"value":7260}," (carries the navigation landmark natively) and\ncollapsed the now-redundant inner ",{"type":11,"tag":68,"props":7262,"children":7264},{"className":7263},[],[7265],{"type":17,"value":6698},{"type":17,"value":7267}," to a ",{"type":11,"tag":68,"props":7269,"children":7271},{"className":7270},[],[7272],{"type":17,"value":6016},{"type":17,"value":7274}," to avoid\nduplicate landmarks.",{"type":11,"tag":19,"props":7276,"children":7277},{},[7278,7280,7285,7287,7292,7293,7298,7300,7305],{"type":17,"value":7279},"After fixes: ",{"type":11,"tag":85,"props":7281,"children":7282},{},[7283],{"type":17,"value":7284},"zero axe violations",{"type":17,"value":7286}," on all 6 showcase pages from\nthis batch (mobile-frame, comment-thread, popover, mcp-embed,\nrule-builder, rich-text-editor). Tested via ",{"type":11,"tag":68,"props":7288,"children":7290},{"className":7289},[],[7291],{"type":17,"value":4188},{"type":17,"value":912},{"type":11,"tag":68,"props":7294,"children":7296},{"className":7295},[],[7297],{"type":17,"value":6320},{"type":17,"value":7299},"\n(added ",{"type":11,"tag":68,"props":7301,"children":7303},{"className":7302},[],[7304],{"type":17,"value":4188},{"type":17,"value":7306}," to devDeps).",{"type":11,"tag":56,"props":7308,"children":7310},{"id":7309},"added-tuxmobileframe-2026-05-26",[7311],{"type":17,"value":7312},"Added — TuxMobileFrame (2026-05-26)",{"type":11,"tag":19,"props":7314,"children":7315},{},[7316,7318,7323,7325,7331,7333,7339,7340,7346],{"type":17,"value":7317},"Closes the deferred Priority E \"Mobile frames\" entry. Stylized\ndevice chrome for marketing screenshots and stakeholder reviews —\n",{"type":11,"tag":85,"props":7319,"children":7320},{},[7321],{"type":17,"value":7322},"one component, two platforms",{"type":17,"value":7324}," via a ",{"type":11,"tag":68,"props":7326,"children":7328},{"className":7327},[],[7329],{"type":17,"value":7330},"platform=\"ios\" | \"android\"",{"type":17,"value":7332},"\nprop. (Initially shipped as two separate ",{"type":11,"tag":68,"props":7334,"children":7336},{"className":7335},[],[7337],{"type":17,"value":7338},"TuxIosFrame",{"type":17,"value":2738},{"type":11,"tag":68,"props":7341,"children":7343},{"className":7342},[],[7344],{"type":17,"value":7345},"TuxAndroidFrame",{"type":17,"value":7347}," components pointing at one combined showcase\npage; consolidated to a single component when the dual nav entries\nmade the same showcase highlight twice in the sidebar.)",{"type":11,"tag":19,"props":7349,"children":7350},{},[7351,7356,7358,7364,7365,7371,7372,7378,7380,7386],{"type":11,"tag":85,"props":7352,"children":7353},{},[7354],{"type":17,"value":7355},"Explicitly not for runtime use.",{"type":17,"value":7357}," When TTI apps actually need\nmobile chrome, reach for ",{"type":11,"tag":68,"props":7359,"children":7361},{"className":7360},[],[7362],{"type":17,"value":7363},"TuxAppFrame",{"type":17,"value":912},{"type":11,"tag":68,"props":7366,"children":7368},{"className":7367},[],[7369],{"type":17,"value":7370},"TuxTabBar",{"type":17,"value":2738},{"type":11,"tag":68,"props":7373,"children":7375},{"className":7374},[],[7376],{"type":17,"value":7377},"useTuxPlatform()",{"type":17,"value":7379}," per ",{"type":11,"tag":68,"props":7381,"children":7383},{"className":7382},[],[7384],{"type":17,"value":7385},"design\u002Fplatform-awareness.md",{"type":17,"value":7387},". The new\nframe only ships the static device chrome around a slot; the\nscreen doesn't react to safe-area insets, platform APIs, or\norientation. Doctrine is documented in the showcase's \"Frame vs\nruntime chrome\" decision-tree footer.",{"type":11,"tag":77,"props":7389,"children":7390},{},[7391],{"type":11,"tag":81,"props":7392,"children":7393},{},[7394,7406,7407,7413,7415,7421,7423,7429,7430,7436,7437,7443,7445,7451],{"type":11,"tag":85,"props":7395,"children":7396},{},[7397],{"type":11,"tag":25,"props":7398,"children":7400},{"href":7399},"app\u002Fcomponents\u002FTuxMobileFrame.vue",[7401],{"type":11,"tag":68,"props":7402,"children":7404},{"className":7403},[],[7405],{"type":17,"value":7033},{"type":17,"value":4211},{"type":11,"tag":68,"props":7408,"children":7410},{"className":7409},[],[7411],{"type":17,"value":7412},"platform=\"ios\"",{"type":17,"value":7414}," renders realistic iPhone 16 Pro proportions\n(19.5:9 screen, ~46px corner radius scaled, Dynamic Island,\nhome indicator, four finishes: natural \u002F black \u002F white \u002F maroon).\n",{"type":11,"tag":68,"props":7416,"children":7418},{"className":7417},[],[7419],{"type":17,"value":7420},"platform=\"android\"",{"type":17,"value":7422}," renders Pixel 9 proportions (20:9 screen,\n~36px corner radius, center punch-hole camera, three nav-style\noptions: ",{"type":11,"tag":68,"props":7424,"children":7426},{"className":7425},[],[7427],{"type":17,"value":7428},"gesture",{"type":17,"value":875},{"type":11,"tag":68,"props":7431,"children":7433},{"className":7432},[],[7434],{"type":17,"value":7435},"three-button",{"type":17,"value":875},{"type":11,"tag":68,"props":7438,"children":7440},{"className":7439},[],[7441],{"type":17,"value":7442},"none",{"type":17,"value":7444},", four finishes:\nobsidian \u002F porcelain \u002F hazel \u002F maroon). Single ",{"type":11,"tag":68,"props":7446,"children":7448},{"className":7447},[],[7449],{"type":17,"value":7450},":width",{"type":17,"value":7452}," prop\ndrives proportional scaling of all chrome — pass 280 (default),\n160 for thumbnail rows, 360 for hero exhibits. Both platforms\nshare the same width pivot so they sit cleanly side-by-side in\ncross-platform mockups.",{"type":11,"tag":19,"props":7454,"children":7455},{},[7456,7458,7468],{"type":17,"value":7457},"Showcase at\n",{"type":11,"tag":25,"props":7459,"children":7461},{"href":7460},"app\u002Fpages\u002Fcomponents\u002Fmobile-frame.vue",[7462],{"type":11,"tag":68,"props":7463,"children":7465},{"className":7464},[],[7466],{"type":17,"value":7467},"\u002Fcomponents\u002Fmobile-frame",{"type":17,"value":7469}," —\nflagship demo per platform with a realistic Landscape corridor-\nsummary slot; color-variant rows; Android nav-style picker; the\ncanonical side-by-side cross-platform layout; and the\nframe-vs-runtime decision tree.",{"type":11,"tag":19,"props":7471,"children":7472},{},[7473,7475,7480,7482,7488,7490,7495],{"type":17,"value":7474},"Implementation is pure CSS — no SVG, no images, no canvas. The\ndevice body uses a single ",{"type":11,"tag":68,"props":7476,"children":7478},{"className":7477},[],[7479],{"type":17,"value":7108},{"type":17,"value":7481}," with absolutely-positioned\nside-button pills and an inner ",{"type":11,"tag":68,"props":7483,"children":7485},{"className":7484},[],[7486],{"type":17,"value":7487},"\u003Cdiv class=\"…__screen\">",{"type":17,"value":7489}," holding\nthe slot. Everything scales from one numeric ",{"type":11,"tag":68,"props":7491,"children":7493},{"className":7492},[],[7494],{"type":17,"value":7450},{"type":17,"value":7496}," prop.",{"type":11,"tag":56,"props":7498,"children":7500},{"id":7499},"added-tuxrichtexteditor-2026-05-26",[7501],{"type":17,"value":7502},"Added — TuxRichTextEditor (2026-05-26)",{"type":11,"tag":19,"props":7504,"children":7505},{},[7506,7508,7514,7516,7521,7523,7529,7530,7536],{"type":17,"value":7507},"Closes the deferred-with-criterion Priority D carry-forward — Tiptap-\nbased WYSIWYG sister to ",{"type":11,"tag":68,"props":7509,"children":7511},{"className":7510},[],[7512],{"type":17,"value":7513},"TuxMarkdownEditor",{"type":17,"value":7515},". Built to be the\n",{"type":11,"tag":85,"props":7517,"children":7518},{},[7519],{"type":17,"value":7520},"canonical TUX rich-text surface",{"type":17,"value":7522}," — feature set mirrors the\n",{"type":11,"tag":68,"props":7524,"children":7526},{"className":7525},[],[7527],{"type":17,"value":7528},"TipTapEditor",{"type":17,"value":2115},{"type":11,"tag":68,"props":7531,"children":7533},{"className":7532},[],[7534],{"type":17,"value":7535},"docs-tti-tamu-edu\u002Fnuxt-site\u002Fapp\u002Fcomponents\u002F",{"type":17,"value":7537},"\nso the same editor can land in Landscape draft surfaces,\ntti-ai-studio chat composition, and the docs.it.tamu.edu admin\ncenter without each consumer maintaining a separate Tiptap wrapper.",{"type":11,"tag":77,"props":7539,"children":7540},{},[7541],{"type":11,"tag":81,"props":7542,"children":7543},{},[7544,7556,7558,7564,7565,7571,7573,7579,7580,7586,7587,7593,7594,7600,7602,7607,7608,7614,7616,7620,7625,7627,7630,7635,7637,7643,7644,7647,7652,7654,7657,7662,7664,7670,7672,7678,7680,7683,7688,7690,7693,7698,7700,7703,7708,7710,7716,7718,7724,7726,7729,7734,7736,7742,7744,7750,7751,7754,7759,7761,7767,7768,7771,7776,7778,7784,7786,7792,7794,7797,7802,7804,7807,7812,7814,7820],{"type":11,"tag":85,"props":7545,"children":7546},{},[7547],{"type":11,"tag":25,"props":7548,"children":7550},{"href":7549},"app\u002Fcomponents\u002FTuxRichTextEditor.vue",[7551],{"type":11,"tag":68,"props":7552,"children":7554},{"className":7553},[],[7555],{"type":17,"value":2578},{"type":17,"value":7557}," —\nTiptap-based editor with seven toolbar groups (configurable via\n",{"type":11,"tag":68,"props":7559,"children":7561},{"className":7560},[],[7562],{"type":17,"value":7563},":toolbar",{"type":17,"value":1244},{"type":11,"tag":68,"props":7566,"children":7568},{"className":7567},[],[7569],{"type":17,"value":7570},"format",{"type":17,"value":7572}," · ",{"type":11,"tag":68,"props":7574,"children":7576},{"className":7575},[],[7577],{"type":17,"value":7578},"headings",{"type":17,"value":7572},{"type":11,"tag":68,"props":7581,"children":7583},{"className":7582},[],[7584],{"type":17,"value":7585},"lists",{"type":17,"value":7572},{"type":11,"tag":68,"props":7588,"children":7590},{"className":7589},[],[7591],{"type":17,"value":7592},"block",{"type":17,"value":7572},{"type":11,"tag":68,"props":7595,"children":7597},{"className":7596},[],[7598],{"type":17,"value":7599},"media",{"type":17,"value":7601}," ·\n",{"type":11,"tag":68,"props":7603,"children":7605},{"className":7604},[],[7606],{"type":17,"value":2144},{"type":17,"value":7572},{"type":11,"tag":68,"props":7609,"children":7611},{"className":7610},[],[7612],{"type":17,"value":7613},"mode",{"type":17,"value":7615},"). v-modeled as HTML.",{"type":11,"tag":7617,"props":7618,"children":7619},"br",{},[],{"type":11,"tag":85,"props":7621,"children":7622},{},[7623],{"type":17,"value":7624},"Inline marks:",{"type":17,"value":7626}," bold · italic · underline · strikethrough ·\ninline code.",{"type":11,"tag":7617,"props":7628,"children":7629},{},[],{"type":11,"tag":85,"props":7631,"children":7632},{},[7633],{"type":17,"value":7634},"Headings:",{"type":17,"value":7636}," H1 · H2 · H3 · H4 (per-consumer subset via\n",{"type":11,"tag":68,"props":7638,"children":7640},{"className":7639},[],[7641],{"type":17,"value":7642},":heading-levels",{"type":17,"value":2630},{"type":11,"tag":7617,"props":7645,"children":7646},{},[],{"type":11,"tag":85,"props":7648,"children":7649},{},[7650],{"type":17,"value":7651},"Lists:",{"type":17,"value":7653}," bullet · numbered · task (checkable, nestable).",{"type":11,"tag":7617,"props":7655,"children":7656},{},[],{"type":11,"tag":85,"props":7658,"children":7659},{},[7660],{"type":17,"value":7661},"Blocks:",{"type":17,"value":7663}," blockquote · code block with syntax highlighting via\n",{"type":11,"tag":68,"props":7665,"children":7667},{"className":7666},[],[7668],{"type":17,"value":7669},"lowlight",{"type":17,"value":7671}," (covers ~30 popular languages via ",{"type":11,"tag":68,"props":7673,"children":7675},{"className":7674},[],[7676],{"type":17,"value":7677},"common",{"type":17,"value":7679},") ·\nhorizontal rule.",{"type":11,"tag":7617,"props":7681,"children":7682},{},[],{"type":11,"tag":85,"props":7684,"children":7685},{},[7686],{"type":17,"value":7687},"Media:",{"type":17,"value":7689}," link (⌘K prompt) · image (URL + alt-text prompt,\nbase64 allowed).",{"type":11,"tag":7617,"props":7691,"children":7692},{},[],{"type":11,"tag":85,"props":7694,"children":7695},{},[7696],{"type":17,"value":7697},"Tables:",{"type":17,"value":7699}," insert 3×3 with header row · add \u002F remove columns and\nrows · resizable column widths · selection highlight · delete\ntable. Table-specific buttons only appear when cursor is inside\na table.",{"type":11,"tag":7617,"props":7701,"children":7702},{},[],{"type":11,"tag":85,"props":7704,"children":7705},{},[7706],{"type":17,"value":7707},"Mode toggle:",{"type":17,"value":7709}," WYSIWYG ↔ raw HTML source textarea. Round-trips\ncleanly in both directions; toolbar buttons disable in source\nmode; a \"source\" pill appears in the footer to make the mode\nvisible. (Markdown ↔ HTML round-trip via ",{"type":11,"tag":68,"props":7711,"children":7713},{"className":7712},[],[7714],{"type":17,"value":7715},"turndown",{"type":17,"value":7717}," is deferred\nto a follow-on — the ",{"type":11,"tag":68,"props":7719,"children":7721},{"className":7720},[],[7722],{"type":17,"value":7723},":sourceFormat",{"type":17,"value":7725}," prop is the planned\nextension point for when a consumer surface stores markdown.)",{"type":11,"tag":7617,"props":7727,"children":7728},{},[],{"type":11,"tag":85,"props":7730,"children":7731},{},[7732],{"type":17,"value":7733},"Full-screen:",{"type":17,"value":7735}," overlay mode that pins the editor to the viewport\nvia ",{"type":11,"tag":68,"props":7737,"children":7739},{"className":7738},[],[7740],{"type":17,"value":7741},"position: fixed; inset: 0; z-index: 60",{"type":17,"value":7743},"; Esc exits. Emits\n",{"type":11,"tag":68,"props":7745,"children":7747},{"className":7746},[],[7748],{"type":17,"value":7749},"@fullscreen-change",{"type":17,"value":43},{"type":11,"tag":7617,"props":7752,"children":7753},{},[],{"type":11,"tag":85,"props":7755,"children":7756},{},[7757],{"type":17,"value":7758},"Word \u002F character count:",{"type":17,"value":7760}," live footer; pure DOM-text count,\nignores HTML tags. Hide via ",{"type":11,"tag":68,"props":7762,"children":7764},{"className":7763},[],[7765],{"type":17,"value":7766},":show-count=\"false\"",{"type":17,"value":43},{"type":11,"tag":7617,"props":7769,"children":7770},{},[],{"type":11,"tag":85,"props":7772,"children":7773},{},[7774],{"type":17,"value":7775},"Save event:",{"type":17,"value":7777}," ⌘S \u002F Ctrl+S intercepted via Tiptap's\n",{"type":11,"tag":68,"props":7779,"children":7781},{"className":7780},[],[7782],{"type":17,"value":7783},"handleKeyDown",{"type":17,"value":7785}," and emitted as ",{"type":11,"tag":68,"props":7787,"children":7789},{"className":7788},[],[7790],{"type":17,"value":7791},"save",{"type":17,"value":7793},". Host wires to persist.",{"type":11,"tag":7617,"props":7795,"children":7796},{},[],{"type":11,"tag":85,"props":7798,"children":7799},{},[7800],{"type":17,"value":7801},"Typography substitutions:",{"type":17,"value":7803}," smart quotes, em dashes, ellipses\n(Tiptap Typography extension).",{"type":11,"tag":7617,"props":7805,"children":7806},{},[],{"type":11,"tag":85,"props":7808,"children":7809},{},[7810],{"type":17,"value":7811},"Undo \u002F redo:",{"type":17,"value":7813}," disabled-state derived from ",{"type":11,"tag":68,"props":7815,"children":7817},{"className":7816},[],[7818],{"type":17,"value":7819},"editor.can()",{"type":17,"value":43},{"type":11,"tag":19,"props":7822,"children":7823},{},[7824,7829,7831,7837,7839,7844],{"type":11,"tag":85,"props":7825,"children":7826},{},[7827],{"type":17,"value":7828},"Bundle.",{"type":17,"value":7830}," Tiptap core \u002F vue-3 \u002F starter-kit \u002F link \u002F image \u002F\nplaceholder \u002F underline arrive transitively via ",{"type":11,"tag":68,"props":7832,"children":7834},{"className":7833},[],[7835],{"type":17,"value":7836},"@nuxt\u002Fui",{"type":17,"value":7838}," 4.7 (no\npackage.json add). The richer extensions — tables (4 packages),\ntask lists (2 packages), typography, code-block-lowlight, and\n",{"type":11,"tag":68,"props":7840,"children":7842},{"className":7841},[],[7843],{"type":17,"value":7669},{"type":17,"value":7845}," itself — are direct dependencies pinned to NuxtUI's exact\nTiptap version (3.22.4) to avoid peer-dep churn. Total\npackage.json additions: 9 packages, all on the established Tiptap\nline NuxtUI already pulls.",{"type":11,"tag":19,"props":7847,"children":7848},{},[7849,7850,7860],{"type":17,"value":7457},{"type":11,"tag":25,"props":7851,"children":7853},{"href":7852},"app\u002Fpages\u002Fcomponents\u002Frich-text-editor.vue",[7854],{"type":11,"tag":68,"props":7855,"children":7857},{"className":7856},[],[7858],{"type":17,"value":7859},"\u002Fcomponents\u002Frich-text-editor",{"type":17,"value":7861},"\nwith three demos (full feature set with pre-seeded corridor field\nnotes including a table + task list + Python code block · trimmed\ninline-comment field · minimal source-mode-only chrome), the feature\ninventory, and the \"why this is the canonical surface\" reference\nback to the docs-tti-tamu-edu editor.",{"type":11,"tag":56,"props":7863,"children":7865},{"id":7864},"added-tuxrulebuilder-2026-05-26",[7866],{"type":17,"value":7867},"Added — TuxRuleBuilder (2026-05-26)",{"type":11,"tag":19,"props":7869,"children":7870},{},[7871,7873,7878],{"type":17,"value":7872},"Closes the deferred-with-criterion Priority B candidate. Relational\nquery UI — field + operator + value rows, AND\u002FOR groupers, nestable\ngroups. Sister to the existing faceted ",{"type":11,"tag":68,"props":7874,"children":7876},{"className":7875},[],[7877],{"type":17,"value":6860},{"type":17,"value":7879},"; they\ncompose well on the same surface.",{"type":11,"tag":77,"props":7881,"children":7882},{},[7883,7923],{"type":11,"tag":81,"props":7884,"children":7885},{},[7886,7898,7900,7906,7908,7914,7916,7922],{"type":11,"tag":85,"props":7887,"children":7888},{},[7889],{"type":11,"tag":25,"props":7890,"children":7892},{"href":7891},"app\u002Fcomponents\u002FTuxRuleBuilder.vue",[7893],{"type":11,"tag":68,"props":7894,"children":7896},{"className":7895},[],[7897],{"type":17,"value":4245},{"type":17,"value":7899}," —\ntop-level wrapper that owns the field catalog (passed via\n",{"type":11,"tag":68,"props":7901,"children":7903},{"className":7902},[],[7904],{"type":17,"value":7905},":fields",{"type":17,"value":7907},") and footer actions (Apply \u002F Clear). v-modeled as a\nsingle root ",{"type":11,"tag":68,"props":7909,"children":7911},{"className":7910},[],[7912],{"type":17,"value":7913},"Group",{"type":17,"value":7915}," tree. Provides the field catalog + max-depth\nto recursive children via ",{"type":11,"tag":68,"props":7917,"children":7919},{"className":7918},[],[7920],{"type":17,"value":7921},"inject",{"type":17,"value":43},{"type":11,"tag":81,"props":7924,"children":7925},{},[7926,7938,7940,7950,7952,7962,7964,7970],{"type":11,"tag":85,"props":7927,"children":7928},{},[7929],{"type":11,"tag":25,"props":7930,"children":7932},{"href":7931},"app\u002Fcomponents\u002FTuxRuleBuilderGroup.vue",[7933],{"type":11,"tag":68,"props":7934,"children":7936},{"className":7935},[],[7937],{"type":17,"value":7020},{"type":17,"value":7939}," —\nrecursive internal child (same pattern as\n",{"type":11,"tag":25,"props":7941,"children":7943},{"href":7942},"app\u002Fcomponents\u002FTuxTreeNode.vue",[7944],{"type":11,"tag":68,"props":7945,"children":7947},{"className":7946},[],[7948],{"type":17,"value":7949},"TuxTreeNode",{"type":17,"value":7951}," inside\n",{"type":11,"tag":25,"props":7953,"children":7955},{"href":7954},"app\u002Fcomponents\u002FTuxTree.vue",[7956],{"type":11,"tag":68,"props":7957,"children":7959},{"className":7958},[],[7960],{"type":17,"value":7961},"TuxTree",{"type":17,"value":7963},"). Renders one group: a\ncombinator toggle (AND\u002FOR), an ordered list of mixed rules and\nnested groups, \"+ Add rule\" \u002F \"+ Add group\" affordances. Recurses\non itself for nested groups, bounded by the parent's\n",{"type":11,"tag":68,"props":7965,"children":7967},{"className":7966},[],[7968],{"type":17,"value":7969},"maxDepth",{"type":17,"value":7971}," prop (default 3 — deeper trees almost always want to\nbe split into saved views).",{"type":11,"tag":19,"props":7973,"children":7974},{},[7975,7977,7983,7985,7991,7993,7999,8001,8006,8008,8014,8016,8022],{"type":17,"value":7976},"Five operator families ship with defaults: ",{"type":11,"tag":68,"props":7978,"children":7980},{"className":7979},[],[7981],{"type":17,"value":7982},"string",{"type":17,"value":7984}," (contains, equals,\nstarts with, not contains), ",{"type":11,"tag":68,"props":7986,"children":7988},{"className":7987},[],[7989],{"type":17,"value":7990},"number",{"type":17,"value":7992}," (=, ≠, \u003C, ≤, >, ≥,\nbetween), ",{"type":11,"tag":68,"props":7994,"children":7996},{"className":7995},[],[7997],{"type":17,"value":7998},"date",{"type":17,"value":8000}," (on, before, after, between), ",{"type":11,"tag":68,"props":8002,"children":8004},{"className":8003},[],[8005],{"type":17,"value":2453},{"type":17,"value":8007}," (is, is not),\n",{"type":11,"tag":68,"props":8009,"children":8011},{"className":8010},[],[8012],{"type":17,"value":8013},"boolean",{"type":17,"value":8015}," (is true, is false). The value editor switches based on\nfield type + operator: text input · numeric input · date picker ·\nselect · \"between\" pair · no-input for boolean. Per-field operator\noverrides via ",{"type":11,"tag":68,"props":8017,"children":8019},{"className":8018},[],[8020],{"type":17,"value":8021},"FieldDef.operators",{"type":17,"value":43},{"type":11,"tag":19,"props":8024,"children":8025},{},[8026,8028,8038,8040,8046],{"type":17,"value":8027},"Showcase at ",{"type":11,"tag":25,"props":8029,"children":8031},{"href":8030},"app\u002Fpages\u002Fcomponents\u002Frule-builder.vue",[8032],{"type":11,"tag":68,"props":8033,"children":8035},{"className":8034},[],[8036],{"type":17,"value":8037},"\u002Fcomponents\u002Frule-builder",{"type":17,"value":8039},"\nwith a corridor-research demo exercising number ",{"type":11,"tag":68,"props":8041,"children":8043},{"className":8042},[],[8044],{"type":17,"value":8045},"between",{"type":17,"value":8047},", select,\nnested OR group, and a live JSON pretty-print of the applied tree so\nhosts can see exactly what they need to evaluate against.",{"type":11,"tag":19,"props":8049,"children":8050},{},[8051,8056,8058,8067],{"type":11,"tag":85,"props":8052,"children":8053},{},[8054],{"type":17,"value":8055},"Conventions doc updated",{"type":17,"value":8057}," — new\n",{"type":11,"tag":25,"props":8059,"children":8061},{"href":8060},"design\u002Fcomponents.md",[8062],{"type":11,"tag":68,"props":8063,"children":8065},{"className":8064},[],[8066],{"type":17,"value":8060},{"type":17,"value":8068}," §\n\"Faceted vs relational filtering — when to use which\" decision tree",{"type":11,"tag":77,"props":8070,"children":8071},{},[8072],{"type":11,"tag":81,"props":8073,"children":8074},{},[8075],{"type":17,"value":8076},"anti-patterns table. Lives next to \"Empty states\" in the\nConventions section.",{"type":11,"tag":56,"props":8078,"children":8080},{"id":8079},"added-tuxmcpembed-2026-05-26",[8081],{"type":17,"value":8082},"Added — TuxMcpEmbed (2026-05-26)",{"type":11,"tag":19,"props":8084,"children":8085},{},[8086,8088,8094,8096,8101],{"type":17,"value":8087},"Sister to ",{"type":11,"tag":68,"props":8089,"children":8091},{"className":8090},[],[8092],{"type":17,"value":8093},"TuxArtifact",{"type":17,"value":8095}," for the ",{"type":11,"tag":155,"props":8097,"children":8098},{},[8099],{"type":17,"value":8100},"interactive",{"type":17,"value":8102}," MCP shape — when an\nassistant turn hands off to a third-party app (Linear, Notion, Figma,\n…) and renders the app's UI inline. The split:",{"type":11,"tag":77,"props":8104,"children":8105},{},[8106,8116,8126],{"type":11,"tag":81,"props":8107,"children":8108},{},[8109,8114],{"type":11,"tag":68,"props":8110,"children":8112},{"className":8111},[],[8113],{"type":17,"value":8093},{"type":17,"value":8115}," — static AI-generated output (code file, doc, image).\nFile-chrome action set (copy \u002F download \u002F regenerate \u002F share).",{"type":11,"tag":81,"props":8117,"children":8118},{},[8119,8124],{"type":11,"tag":68,"props":8120,"children":8122},{"className":8121},[],[8123],{"type":17,"value":7013},{"type":17,"value":8125}," — interactive third-party app surface. Window-chrome\naction set (collapse \u002F expand \u002F exit). Built-in skeleton.",{"type":11,"tag":81,"props":8127,"children":8128},{},[8129,8141,8143,8148,8150,8156,8157,8163,8164,8170,8172,8178,8179,8185,8186,8192,8194,8200,8202,8207,8209,8219,8221],{"type":11,"tag":85,"props":8130,"children":8131},{},[8132],{"type":11,"tag":25,"props":8133,"children":8135},{"href":8134},"app\u002Fcomponents\u002FTuxMcpEmbed.vue",[8136],{"type":11,"tag":68,"props":8137,"children":8139},{"className":8138},[],[8140],{"type":17,"value":7013},{"type":17,"value":8142}," — app identity\nbar (icon + name + optional ",{"type":11,"tag":68,"props":8144,"children":8146},{"className":8145},[],[8147],{"type":17,"value":382},{"type":17,"value":8149}," line for version\u002Fscope) +\nwindow controls + skeleton + container slot. Three controls,\nindividually toggleable (",{"type":11,"tag":68,"props":8151,"children":8153},{"className":8152},[],[8154],{"type":17,"value":8155},":collapsible",{"type":17,"value":95},{"type":11,"tag":68,"props":8158,"children":8160},{"className":8159},[],[8161],{"type":17,"value":8162},":expandable",{"type":17,"value":489},{"type":11,"tag":68,"props":8165,"children":8167},{"className":8166},[],[8168],{"type":17,"value":8169},":closable",{"type":17,"value":8171},"); each emits a semantic event (",{"type":11,"tag":68,"props":8173,"children":8175},{"className":8174},[],[8176],{"type":17,"value":8177},"collapse",{"type":17,"value":95},{"type":11,"tag":68,"props":8180,"children":8182},{"className":8181},[],[8183],{"type":17,"value":8184},"expand",{"type":17,"value":489},{"type":11,"tag":68,"props":8187,"children":8189},{"className":8188},[],[8190],{"type":17,"value":8191},"exit",{"type":17,"value":8193},") the host wires up. Internal collapsed state syncs from a\nprop so the host can persist + restore. Loading skeleton is three\nshimmer bars + a content block; honors ",{"type":11,"tag":68,"props":8195,"children":8197},{"className":8196},[],[8198],{"type":17,"value":8199},"prefers-reduced-motion",{"type":17,"value":8201},"\nwith a static fill. Visual chrome matches ",{"type":11,"tag":68,"props":8203,"children":8205},{"className":8204},[],[8206],{"type":17,"value":8093},{"type":17,"value":8208}," (same\nborder \u002F radius \u002F head rhythm) so the two read as a family — the\n3px accent strip on the left edge is the only signal that this is\nthird-party, not first-party output. Showcase at\n",{"type":11,"tag":25,"props":8210,"children":8212},{"href":8211},"app\u002Fpages\u002Fcomponents\u002Fmcp-embed.vue",[8213],{"type":11,"tag":68,"props":8214,"children":8216},{"className":8215},[],[8217],{"type":17,"value":8218},"\u002Fcomponents\u002Fmcp-embed",{"type":17,"value":8220}," with\nthree demos (Linear default · Notion loading · Figma fixed-chrome)",{"type":11,"tag":77,"props":8222,"children":8223},{},[8224],{"type":11,"tag":81,"props":8225,"children":8226},{},[8227],{"type":17,"value":8228},"the MCP three-tier display taxonomy reference.",{"type":11,"tag":19,"props":8230,"children":8231},{},[8232,8236,8237,8245,8247,8252,8254,8260],{"type":11,"tag":85,"props":8233,"children":8234},{},[8235],{"type":17,"value":8055},{"type":17,"value":4211},{"type":11,"tag":25,"props":8238,"children":8239},{"href":8060},[8240],{"type":11,"tag":68,"props":8241,"children":8243},{"className":8242},[],[8244],{"type":17,"value":8060},{"type":17,"value":8246}," § \"MCP tool output —\ninline card \u002F inline carousel \u002F full screen\" was promoted from\nsingle-component (",{"type":11,"tag":68,"props":8248,"children":8250},{"className":8249},[],[8251],{"type":17,"value":8093},{"type":17,"value":8253}," everywhere) to the static-vs-\ninteractive split. The inline-card tier now branches on whether the\nMCP result is read-only (TuxArtifact) or app-like (TuxMcpEmbed); the\nfull-screen tier documents the ",{"type":11,"tag":68,"props":8255,"children":8257},{"className":8256},[],[8258],{"type":17,"value":8259},"@expand",{"type":17,"value":8261},"-event → focus-view pattern.",{"type":11,"tag":56,"props":8263,"children":8265},{"id":8264},"added-tuxpopover-2026-05-26",[8266],{"type":17,"value":8267},"Added — TuxPopover (2026-05-26)",{"type":11,"tag":19,"props":8269,"children":8270},{},[8271,8273,8279,8281,8287,8288,8293,8294,8300,8301,8307,8308,8314,8315,8321,8323,8328],{"type":17,"value":8272},"Closes the deferred-with-criterion Priority D entry — the\nricher-than-tooltip floating panel that consumers were composing on\ntop of ",{"type":11,"tag":68,"props":8274,"children":8276},{"className":8275},[],[8277],{"type":17,"value":8278},"UPopover",{"type":17,"value":8280}," directly (~7 surfaces in the catalog by the time\nthis shipped: ",{"type":11,"tag":68,"props":8282,"children":8284},{"className":8283},[],[8285],{"type":17,"value":8286},"TuxFootnote",{"type":17,"value":95},{"type":11,"tag":68,"props":8289,"children":8291},{"className":8290},[],[8292],{"type":17,"value":2472},{"type":17,"value":95},{"type":11,"tag":68,"props":8295,"children":8297},{"className":8296},[],[8298],{"type":17,"value":8299},"TuxContextMeter",{"type":17,"value":489},{"type":11,"tag":68,"props":8302,"children":8304},{"className":8303},[],[8305],{"type":17,"value":8306},"TuxInfoLabel",{"type":17,"value":95},{"type":11,"tag":68,"props":8309,"children":8311},{"className":8310},[],[8312],{"type":17,"value":8313},"TuxFormField",{"type":17,"value":95},{"type":11,"tag":68,"props":8316,"children":8318},{"className":8317},[],[8319],{"type":17,"value":8320},"TuxAppSwitcher",{"type":17,"value":8322},", plus\n",{"type":11,"tag":68,"props":8324,"children":8326},{"className":8325},[],[8327],{"type":17,"value":6860},{"type":17,"value":8329}," chips).",{"type":11,"tag":77,"props":8331,"children":8332},{},[8333],{"type":11,"tag":81,"props":8334,"children":8335},{},[8336,8348,8350,8356,8358,8364,8366,8372,8374,8380,8382,8388,8390,8396,8398,8404,8405,8411,8413,8419,8421,8427,8429,8434,8436,8442,8444,8450,8452,8457,8459,8469],{"type":11,"tag":85,"props":8337,"children":8338},{},[8339],{"type":11,"tag":25,"props":8340,"children":8342},{"href":8341},"app\u002Fcomponents\u002FTuxPopover.vue",[8343],{"type":11,"tag":68,"props":8344,"children":8346},{"className":8345},[],[8347],{"type":17,"value":7006},{"type":17,"value":8349}," — title + body +\noptional actions panel. Default ",{"type":11,"tag":68,"props":8351,"children":8353},{"className":8352},[],[8354],{"type":17,"value":8355},"mode=\"click\"",{"type":17,"value":8357}," because\nhover-with-actions is bad UX (panel dismisses the moment the user\nreaches for a button); ",{"type":11,"tag":68,"props":8359,"children":8361},{"className":8360},[],[8362],{"type":17,"value":8363},"mode=\"hover\"",{"type":17,"value":8365}," available for read-only\ninspect cases. Editorial maroon hairline rule under the title (same\nanchor as ",{"type":11,"tag":68,"props":8367,"children":8369},{"className":8368},[],[8370],{"type":17,"value":8371},"TuxTooltip",{"type":17,"value":8373},"'s title presentation — that's the visual cue\nthat distinguishes a TUX floating panel from a bare UPopover drop).\nThree width tiers: ",{"type":11,"tag":68,"props":8375,"children":8377},{"className":8376},[],[8378],{"type":17,"value":8379},"sm",{"type":17,"value":8381}," (16rem), ",{"type":11,"tag":68,"props":8383,"children":8385},{"className":8384},[],[8386],{"type":17,"value":8387},"md",{"type":17,"value":8389}," (22rem, default), ",{"type":11,"tag":68,"props":8391,"children":8393},{"className":8392},[],[8394],{"type":17,"value":8395},"lg",{"type":17,"value":8397},"\n(28rem), plus ",{"type":11,"tag":68,"props":8399,"children":8401},{"className":8400},[],[8402],{"type":17,"value":8403},"auto",{"type":17,"value":293},{"type":11,"tag":68,"props":8406,"children":8408},{"className":8407},[],[8409],{"type":17,"value":8410},"body",{"type":17,"value":8412}," prop covers prose; ",{"type":11,"tag":68,"props":8414,"children":8416},{"className":8415},[],[8417],{"type":17,"value":8418},"#body",{"type":17,"value":8420}," slot opens\nthe surface to richer markup (lists, data blocks, form fields).\n",{"type":11,"tag":68,"props":8422,"children":8424},{"className":8423},[],[8425],{"type":17,"value":8426},"#actions",{"type":17,"value":8428}," slot renders into a footer with a top border; bare\n",{"type":11,"tag":68,"props":8430,"children":8432},{"className":8431},[],[8433],{"type":17,"value":6523},{"type":17,"value":8435}," elements get compact chrome via ",{"type":11,"tag":68,"props":8437,"children":8439},{"className":8438},[],[8440],{"type":17,"value":8441},":deep(button)",{"type":17,"value":8443},"; add the\n",{"type":11,"tag":68,"props":8445,"children":8447},{"className":8446},[],[8448],{"type":17,"value":8449},"tux-popover__action--primary",{"type":17,"value":8451}," class for a maroon primary action.\nCatalog convention added: the \"which floating-panel component?\"\ndecision tree (tooltip \u002F teaching popover \u002F popover \u002F bare\nUPopover) lives in the showcase page's footer for now; promote to\n",{"type":11,"tag":68,"props":8453,"children":8455},{"className":8454},[],[8456],{"type":17,"value":8060},{"type":17,"value":8458}," Conventions if a third consumer surface\nasks. Showcase at\n",{"type":11,"tag":25,"props":8460,"children":8462},{"href":8461},"app\u002Fpages\u002Fcomponents\u002Fpopover.vue",[8463],{"type":11,"tag":68,"props":8464,"children":8466},{"className":8465},[],[8467],{"type":17,"value":8468},"\u002Fcomponents\u002Fpopover",{"type":17,"value":43},{"type":11,"tag":56,"props":8471,"children":8473},{"id":8472},"added-tuxcommentthread-2026-05-26",[8474],{"type":17,"value":8475},"Added — TuxCommentThread (2026-05-26)",{"type":11,"tag":19,"props":8477,"children":8478},{},[8479,8481,8490,8492,8498],{"type":17,"value":8480},"Closes the only fully-unblocked Priority D entry in\n",{"type":11,"tag":25,"props":8482,"children":8484},{"href":8483},"design\u002Froadmap.md",[8485],{"type":11,"tag":68,"props":8486,"children":8488},{"className":8487},[],[8489],{"type":17,"value":8483},{"type":17,"value":8491}," — peer-review \u002F\neditorial-comment threads. Sister to ",{"type":11,"tag":68,"props":8493,"children":8495},{"className":8494},[],[8496],{"type":17,"value":8497},"TuxReactionBar",{"type":17,"value":8499},": that's\nlight-touch acknowledgement, this is the heavyweight thread\nsurface for actual dialog.",{"type":11,"tag":77,"props":8501,"children":8502},{},[8503],{"type":11,"tag":81,"props":8504,"children":8505},{},[8506,8518,8520,8526,8528,8533,8534,8540,8542,8548,8550,8556,8558,8564,8565,8571,8572,8578,8579,8585,8586,8592,8594,8600,8602,8608,8609,8615,8617,8627],{"type":11,"tag":85,"props":8507,"children":8508},{},[8509],{"type":11,"tag":25,"props":8510,"children":8512},{"href":8511},"app\u002Fcomponents\u002FTuxCommentThread.vue",[8513],{"type":11,"tag":68,"props":8514,"children":8516},{"className":8515},[],[8517],{"type":17,"value":6999},{"type":17,"value":8519}," —\nstateless renderer over a v-modeled ",{"type":11,"tag":68,"props":8521,"children":8523},{"className":8522},[],[8524],{"type":17,"value":8525},"CommentThread[]",{"type":17,"value":8527},". Each thread\ngroups a root comment + replies, has an ",{"type":11,"tag":68,"props":8529,"children":8531},{"className":8530},[],[8532],{"type":17,"value":2482},{"type":17,"value":875},{"type":11,"tag":68,"props":8535,"children":8537},{"className":8536},[],[8538],{"type":17,"value":8539},"resolved",{"type":17,"value":8541}," status,\nand supports ",{"type":11,"tag":68,"props":8543,"children":8545},{"className":8544},[],[8546],{"type":17,"value":8547},"@mention",{"type":17,"value":8549}," tokens (auto-detected on render, brand-\naccent color). Authors are passed in as a ",{"type":11,"tag":68,"props":8551,"children":8553},{"className":8552},[],[8554],{"type":17,"value":8555},"Record\u003Cstring, CommentAuthor>",{"type":17,"value":8557}," directory (name + affiliation + optional avatar;\ninitials fallback when avatar is absent). The host owns\npersistence — mutations emit semantic events (",{"type":11,"tag":68,"props":8559,"children":8561},{"className":8560},[],[8562],{"type":17,"value":8563},"comment:add",{"type":17,"value":489},{"type":11,"tag":68,"props":8566,"children":8568},{"className":8567},[],[8569],{"type":17,"value":8570},"comment:edit",{"type":17,"value":95},{"type":11,"tag":68,"props":8573,"children":8575},{"className":8574},[],[8576],{"type":17,"value":8577},"comment:delete",{"type":17,"value":95},{"type":11,"tag":68,"props":8580,"children":8582},{"className":8581},[],[8583],{"type":17,"value":8584},"thread:resolve",{"type":17,"value":489},{"type":11,"tag":68,"props":8587,"children":8589},{"className":8588},[],[8590],{"type":17,"value":8591},"thread:reopen",{"type":17,"value":8593},"). Container-query density fallback below ~22rem\nfor narrow sidebar slots; explicit ",{"type":11,"tag":68,"props":8595,"children":8597},{"className":8596},[],[8598],{"type":17,"value":8599},"size=\"sm\"",{"type":17,"value":8601}," for the same effect\nvia prop. Resolved threads collapse behind a \"Show resolved (N)\"\ntoggle by default. Edit \u002F delete affordances only render on\ncomments the current viewer authored. ",{"type":11,"tag":68,"props":8603,"children":8605},{"className":8604},[],[8606],{"type":17,"value":8607},"⌘↵",{"type":17,"value":875},{"type":11,"tag":68,"props":8610,"children":8612},{"className":8611},[],[8613],{"type":17,"value":8614},"Ctrl↵",{"type":17,"value":8616}," in the reply\ntextarea submits. Showcase at\n",{"type":11,"tag":25,"props":8618,"children":8620},{"href":8619},"app\u002Fpages\u002Fcomponents\u002Fcomment-thread.vue",[8621],{"type":11,"tag":68,"props":8622,"children":8624},{"className":8623},[],[8625],{"type":17,"value":8626},"\u002Fcomponents\u002Fcomment-thread",{"type":17,"value":43},{"type":11,"tag":19,"props":8629,"children":8630},{},[8631,8633,8639,8640,8645],{"type":17,"value":8632},"Roadmap entry struck through; component table updated; nav slot\nadded between ",{"type":11,"tag":68,"props":8634,"children":8636},{"className":8635},[],[8637],{"type":17,"value":8638},"TuxCommandPalette",{"type":17,"value":103},{"type":11,"tag":68,"props":8641,"children":8643},{"className":8642},[],[8644],{"type":17,"value":2393},{"type":17,"value":43},{"type":11,"tag":19,"props":8647,"children":8648},{},[8649,8654,8655,8665,8667,8677,8679,8685],{"type":11,"tag":85,"props":8650,"children":8651},{},[8652],{"type":17,"value":8653},"Dogfood",{"type":17,"value":1244},{"type":11,"tag":25,"props":8656,"children":8658},{"href":8657},"app\u002Fpages\u002Fexamples\u002Fpaper-page.vue",[8659],{"type":11,"tag":68,"props":8660,"children":8662},{"className":8661},[],[8663],{"type":17,"value":8664},"\u002Fexamples\u002Fpaper-page",{"type":17,"value":8666},"\nnow embeds an \"Open peer-review\" section between Discussion §4 and\nAcknowledgments. Three threads (two open + one resolved) reflect a\nrealistic TRR open-review pass: reviewer raises a methods concern,\nauthor responds; reviewer suggests adding citations; reviewer flags\na reading-grade issue on the plain-language summary, co-author\naddresses it. Typed fixtures live in\n",{"type":11,"tag":25,"props":8668,"children":8670},{"href":8669},"app\u002Fpages\u002Fexamples\u002Fpaper-page.demo-data.ts",[8671],{"type":11,"tag":68,"props":8672,"children":8674},{"className":8673},[],[8675],{"type":17,"value":8676},"paper-page.demo-data.ts",{"type":17,"value":8678},"\nper ADR-0011 since vue-tsc can't narrow string-literal union types\ndeclared inline in page ",{"type":11,"tag":68,"props":8680,"children":8682},{"className":8681},[],[8683],{"type":17,"value":8684},"\u003Cscript setup>",{"type":17,"value":8686}," blocks.",{"type":11,"tag":56,"props":8688,"children":8690},{"id":8689},"added-polish-hygiene-sprint-2026-05-23",[8691],{"type":17,"value":8692},"Added — polish & hygiene sprint (2026-05-23)",{"type":11,"tag":19,"props":8694,"children":8695},{},[8696],{"type":17,"value":8697},"Four-item polish pass closing the catalog + CI + theme gaps that\naccumulated through the four-family expansion. No new components;\nall behavior-preserving except where the typecheck cleanup fixed\nreal bugs.",{"type":11,"tag":19,"props":8699,"children":8700},{},[8701,8706],{"type":11,"tag":85,"props":8702,"children":8703},{},[8704],{"type":17,"value":8705},"Catalog hygiene",{"type":17,"value":8707}," — three orphaned components surfaced:",{"type":11,"tag":77,"props":8709,"children":8710},{},[8711,8788],{"type":11,"tag":81,"props":8712,"children":8713},{},[8714,8720,8722,8730,8732,8741,8743,8751,8753,8763,8765,8770,8772,8778,8780,8786],{"type":11,"tag":68,"props":8715,"children":8717},{"className":8716},[],[8718],{"type":17,"value":8719},"TuxShortcutsHelp",{"type":17,"value":8721}," shipped into the catalog: row added to\n",{"type":11,"tag":25,"props":8723,"children":8724},{"href":8060},[8725],{"type":11,"tag":68,"props":8726,"children":8728},{"className":8727},[],[8729],{"type":17,"value":8060},{"type":17,"value":8731},", entry added to\nthe ",{"type":11,"tag":25,"props":8733,"children":8735},{"href":8734},"app\u002Fpages\u002Fcomponents\u002Findex.vue",[8736],{"type":11,"tag":68,"props":8737,"children":8739},{"className":8738},[],[8740],{"type":17,"value":5492},{"type":17,"value":8742}," card grid and\n",{"type":11,"tag":25,"props":8744,"children":8745},{"href":1647},[8746],{"type":11,"tag":68,"props":8747,"children":8749},{"className":8748},[],[8750],{"type":17,"value":329},{"type":17,"value":8752}," sidebar nav, new showcase page at\n",{"type":11,"tag":25,"props":8754,"children":8756},{"href":8755},"app\u002Fpages\u002Fcomponents\u002Fshortcuts-help.vue",[8757],{"type":11,"tag":68,"props":8758,"children":8760},{"className":8759},[],[8761],{"type":17,"value":8762},"\u002Fcomponents\u002Fshortcuts-help",{"type":17,"value":8764},"\nbuilt on the ",{"type":11,"tag":68,"props":8766,"children":8768},{"className":8767},[],[8769],{"type":17,"value":8638},{"type":17,"value":8771}," showcase template (combos vs\nsequences, native ",{"type":11,"tag":68,"props":8773,"children":8775},{"className":8774},[],[8776],{"type":17,"value":8777},"\u003Cdialog>",{"type":17,"value":8779}," setup, ",{"type":11,"tag":68,"props":8781,"children":8783},{"className":8782},[],[8784],{"type":17,"value":8785},"defineShortcuts",{"type":17,"value":8787}," wiring).",{"type":11,"tag":81,"props":8789,"children":8790},{},[8791,8796,8797,8803,8805,8810,8811,8816,8818,8826],{"type":11,"tag":68,"props":8792,"children":8794},{"className":8793},[],[8795],{"type":17,"value":7949},{"type":17,"value":103},{"type":11,"tag":68,"props":8798,"children":8800},{"className":8799},[],[8801],{"type":17,"value":8802},"TuxDocsSidebarNode",{"type":17,"value":8804}," annotated as internal\nchildren of ",{"type":11,"tag":68,"props":8806,"children":8808},{"className":8807},[],[8809],{"type":17,"value":7961},{"type":17,"value":103},{"type":11,"tag":68,"props":8812,"children":8814},{"className":8813},[],[8815],{"type":17,"value":7236},{"type":17,"value":8817}," in\n",{"type":11,"tag":25,"props":8819,"children":8820},{"href":8060},[8821],{"type":11,"tag":68,"props":8822,"children":8824},{"className":8823},[],[8825],{"type":17,"value":8060},{"type":17,"value":8827}," — they're recursive\nrendering primitives, not standalone consumables.",{"type":11,"tag":19,"props":8829,"children":8830},{},[8831,8836,8838,8843,8845,8851,8853,8861,8863,8871,8873,8879,8881,8890,8892,8898,8900,8906,8908,8914,8916,8921,8923,8929,8930,8936,8937,8943,8945,8950,8951,8956],{"type":11,"tag":85,"props":8832,"children":8833},{},[8834],{"type":17,"value":8835},"Dark theme tokens aligned",{"type":17,"value":8837}," — the ",{"type":11,"tag":68,"props":8839,"children":8841},{"className":8840},[],[8842],{"type":17,"value":881},{"type":17,"value":8844}," runtime palette\n(150-line ",{"type":11,"tag":68,"props":8846,"children":8848},{"className":8847},[],[8849],{"type":17,"value":8850},"[data-theme=\"tti-dark\"]",{"type":17,"value":8852}," block in\n",{"type":11,"tag":25,"props":8854,"children":8855},{"href":7046},[8856],{"type":11,"tag":68,"props":8857,"children":8859},{"className":8858},[],[8860],{"type":17,"value":7046},{"type":17,"value":8862},") is now\nmirrored in ",{"type":11,"tag":25,"props":8864,"children":8865},{"href":4301},[8866],{"type":11,"tag":68,"props":8867,"children":8869},{"className":8868},[],[8870],{"type":17,"value":4301},{"type":17,"value":8872}," under\n",{"type":11,"tag":68,"props":8874,"children":8876},{"className":8875},[],[8877],{"type":17,"value":8878},"themes.tti-dark",{"type":17,"value":8880}," (brand, surface, text, semantic, focus, chart, map\nsections) so the documented single source of truth matches what\nactually renders. New \"Dark theme\" section in\n",{"type":11,"tag":25,"props":8882,"children":8884},{"href":8883},"design\u002Fpalette.md",[8885],{"type":11,"tag":68,"props":8886,"children":8888},{"className":8887},[],[8889],{"type":17,"value":8883},{"type":17,"value":8891}," explains the\nmaroon→lifted-teal shift on small chrome elements, the three channels\nthat preserve maroon brand presence (",{"type":11,"tag":68,"props":8893,"children":8895},{"className":8894},[],[8896],{"type":17,"value":8897},"brand.fill",{"type":17,"value":8899}," for marketing\npanels, ",{"type":11,"tag":68,"props":8901,"children":8903},{"className":8902},[],[8904],{"type":17,"value":8905},"chart.1",{"type":17,"value":8907}," pinned to wine-rose for the primary chart series,\nNuxt UI's ",{"type":11,"tag":68,"props":8909,"children":8911},{"className":8910},[],[8912],{"type":17,"value":8913},"--color-maroon-400",{"type":17,"value":8915}," override for solid buttons), and the\nasymmetry where ",{"type":11,"tag":68,"props":8917,"children":8919},{"className":8918},[],[8920],{"type":17,"value":881},{"type":17,"value":8922}," defines ",{"type":11,"tag":68,"props":8924,"children":8926},{"className":8925},[],[8927],{"type":17,"value":8928},"semantic",{"type":17,"value":3280},{"type":11,"tag":68,"props":8931,"children":8933},{"className":8932},[],[8934],{"type":17,"value":8935},"chart",{"type":17,"value":3280},{"type":11,"tag":68,"props":8938,"children":8940},{"className":8939},[],[8941],{"type":17,"value":8942},"map",{"type":17,"value":8944}," overrides\nthat ",{"type":11,"tag":68,"props":8946,"children":8948},{"className":8947},[],[8949],{"type":17,"value":873},{"type":17,"value":103},{"type":11,"tag":68,"props":8952,"children":8954},{"className":8953},[],[8955],{"type":17,"value":829},{"type":17,"value":8957}," inherit from base.",{"type":11,"tag":19,"props":8959,"children":8960},{},[8961,8966,8967,8973,8975,8980,8982,8991,8993,8999,9001,9007,9009,9014,9016,9022,9024,9030,9031,9040],{"type":11,"tag":85,"props":8962,"children":8963},{},[8964],{"type":17,"value":8965},"CI gates",{"type":17,"value":1244},{"type":11,"tag":68,"props":8968,"children":8970},{"className":8969},[],[8971],{"type":17,"value":8972},"npm run lint",{"type":17,"value":8974}," script added; new ",{"type":11,"tag":68,"props":8976,"children":8978},{"className":8977},[],[8979],{"type":17,"value":6268},{"type":17,"value":8981}," job in\n",{"type":11,"tag":25,"props":8983,"children":8985},{"href":8984},".github\u002Fworkflows\u002Faudit-contrast.yml",[8986],{"type":11,"tag":68,"props":8987,"children":8989},{"className":8988},[],[8990],{"type":17,"value":8984},{"type":17,"value":8992},"\nruns lint + typecheck in parallel with the contrast audit. Both\ngates are blocking after the typecheck cleanup below. Fixed 3\npre-existing lint errors in ",{"type":11,"tag":68,"props":8994,"children":8996},{"className":8995},[],[8997],{"type":17,"value":8998},"scripts\u002Faudit-contrast.mjs",{"type":17,"value":9000}," (duplicate\n",{"type":11,"tag":68,"props":9002,"children":9004},{"className":9003},[],[9005],{"type":17,"value":9006},"node:fs",{"type":17,"value":9008}," import) and ",{"type":11,"tag":68,"props":9010,"children":9012},{"className":9011},[],[9013],{"type":17,"value":4014},{"type":17,"value":9015}," (dead ",{"type":11,"tag":68,"props":9017,"children":9019},{"className":9018},[],[9020],{"type":17,"value":9021},"roundCoords",{"type":17,"value":9023},"\nfunction). Added ",{"type":11,"tag":68,"props":9025,"children":9027},{"className":9026},[],[9028],{"type":17,"value":9029},"reference\u002F**",{"type":17,"value":7202},{"type":11,"tag":25,"props":9032,"children":9034},{"href":9033},"eslint.config.mjs",[9035],{"type":11,"tag":68,"props":9036,"children":9038},{"className":9037},[],[9039],{"type":17,"value":9033},{"type":17,"value":9041}," ignores since that\ndirectory is sync'd from upstream and not ours to lint.",{"type":11,"tag":19,"props":9043,"children":9044},{},[9045,9050,9052,9061,9063,9069,9070,9079,9080,9086,9088,9094,9096,9102,9103,9109,9110,9116,9117,9123,9125,9131,9133,9139,9141,9150],{"type":11,"tag":85,"props":9046,"children":9047},{},[9048],{"type":17,"value":9049},"Pre-commit hook",{"type":17,"value":9051}," — husky + lint-staged installed.\n",{"type":11,"tag":25,"props":9053,"children":9055},{"href":9054},".husky\u002Fpre-commit",[9056],{"type":11,"tag":68,"props":9057,"children":9059},{"className":9058},[],[9060],{"type":17,"value":9054},{"type":17,"value":9062}," runs ",{"type":11,"tag":68,"props":9064,"children":9066},{"className":9065},[],[9067],{"type":17,"value":9068},"npx lint-staged",{"type":17,"value":6559},{"type":11,"tag":25,"props":9071,"children":9073},{"href":9072},"package.json",[9074],{"type":11,"tag":68,"props":9075,"children":9077},{"className":9076},[],[9078],{"type":17,"value":9072},{"type":17,"value":996},{"type":11,"tag":68,"props":9081,"children":9083},{"className":9082},[],[9084],{"type":17,"value":9085},"lint-staged",{"type":17,"value":9087}," config runs\n",{"type":11,"tag":68,"props":9089,"children":9091},{"className":9090},[],[9092],{"type":17,"value":9093},"eslint --fix",{"type":17,"value":9095}," on staged ",{"type":11,"tag":68,"props":9097,"children":9099},{"className":9098},[],[9100],{"type":17,"value":9101},".vue",{"type":17,"value":875},{"type":11,"tag":68,"props":9104,"children":9106},{"className":9105},[],[9107],{"type":17,"value":9108},".ts",{"type":17,"value":875},{"type":11,"tag":68,"props":9111,"children":9113},{"className":9112},[],[9114],{"type":17,"value":9115},".js",{"type":17,"value":875},{"type":11,"tag":68,"props":9118,"children":9120},{"className":9119},[],[9121],{"type":17,"value":9122},".mjs",{"type":17,"value":9124}," files.\nHusky's ",{"type":11,"tag":68,"props":9126,"children":9128},{"className":9127},[],[9129],{"type":17,"value":9130},"prepare",{"type":17,"value":9132}," script auto-installs the hook on ",{"type":11,"tag":68,"props":9134,"children":9136},{"className":9135},[],[9137],{"type":17,"value":9138},"npm install",{"type":17,"value":9140},"\n(documented in ",{"type":11,"tag":25,"props":9142,"children":9144},{"href":9143},"README.md",[9145],{"type":11,"tag":68,"props":9146,"children":9148},{"className":9147},[],[9149],{"type":17,"value":9143},{"type":17,"value":9151}," Run-it section).",{"type":11,"tag":19,"props":9153,"children":9154},{},[9155,9160],{"type":11,"tag":85,"props":9156,"children":9157},{},[9158],{"type":17,"value":9159},"Typecheck cleanup (21 errors → 0)",{"type":17,"value":9161}," — typecheck CI gate flipped\nfrom non-blocking to blocking. Eleven files touched, mix of real\nbug fixes and pre-existing pattern issues:",{"type":11,"tag":77,"props":9163,"children":9164},{},[9165,9207,9234,9291,9317,9360,9394,9451,9492,9518,9544,9570],{"type":11,"tag":81,"props":9166,"children":9167},{},[9168,9174,9175,9181,9183,9189,9191,9197,9199,9205],{"type":11,"tag":68,"props":9169,"children":9171},{"className":9170},[],[9172],{"type":17,"value":9173},"TuxMapEmbed.vue",{"type":17,"value":1244},{"type":11,"tag":68,"props":9176,"children":9178},{"className":9177},[],[9179],{"type":17,"value":9180},"iframeEl.value?.complete",{"type":17,"value":9182}," is an\n",{"type":11,"tag":68,"props":9184,"children":9186},{"className":9185},[],[9187],{"type":17,"value":9188},"HTMLImageElement",{"type":17,"value":9190}," property, not an iframe one. Replaced with\n",{"type":11,"tag":68,"props":9192,"children":9194},{"className":9193},[],[9195],{"type":17,"value":9196},"contentDocument?.readyState === \"complete\"",{"type":17,"value":9198}," (still null for\ncross-origin maps, which fall through to the ",{"type":11,"tag":68,"props":9200,"children":9202},{"className":9201},[],[9203],{"type":17,"value":9204},"load",{"type":17,"value":9206}," event).",{"type":11,"tag":81,"props":9208,"children":9209},{},[9210,9216,9218,9224,9226,9232],{"type":11,"tag":68,"props":9211,"children":9213},{"className":9212},[],[9214],{"type":17,"value":9215},"TuxReactionBar.vue",{"type":17,"value":9217}," — replaced\n",{"type":11,"tag":68,"props":9219,"children":9221},{"className":9220},[],[9222],{"type":17,"value":9223},"counts[r.key] !== undefined && counts[r.key] > 0",{"type":17,"value":9225}," with\n",{"type":11,"tag":68,"props":9227,"children":9229},{"className":9228},[],[9230],{"type":17,"value":9231},"(counts[r.key] ?? 0) > 0",{"type":17,"value":9233}," so TS can narrow through the indexed\naccess.",{"type":11,"tag":81,"props":9235,"children":9236},{},[9237,9243,9245,9251,9253,9259,9260,9266,9268,9274,9275,9281,9283,9289],{"type":11,"tag":68,"props":9238,"children":9240},{"className":9239},[],[9241],{"type":17,"value":9242},"TuxChartLine.vue",{"type":17,"value":9244}," — added ",{"type":11,"tag":68,"props":9246,"children":9248},{"className":9247},[],[9249],{"type":17,"value":9250},"as [number, number]",{"type":17,"value":9252}," cast to the\n",{"type":11,"tag":68,"props":9254,"children":9256},{"className":9255},[],[9257],{"type":17,"value":9258},"yDomain",{"type":17,"value":996},{"type":11,"tag":68,"props":9261,"children":9263},{"className":9262},[],[9264],{"type":17,"value":9265},"[0, 1]",{"type":17,"value":9267}," fallback so the destructured ",{"type":11,"tag":68,"props":9269,"children":9271},{"className":9270},[],[9272],{"type":17,"value":9273},"lo",{"type":17,"value":3280},{"type":11,"tag":68,"props":9276,"children":9278},{"className":9277},[],[9279],{"type":17,"value":9280},"hi",{"type":17,"value":9282}," aren't\n",{"type":11,"tag":68,"props":9284,"children":9286},{"className":9285},[],[9287],{"type":17,"value":9288},"number | undefined",{"type":17,"value":9290}," downstream.",{"type":11,"tag":81,"props":9292,"children":9293},{},[9294,9300,9302,9308,9309,9315],{"type":11,"tag":68,"props":9295,"children":9297},{"className":9296},[],[9298],{"type":17,"value":9299},"TuxChartScatter.vue",{"type":17,"value":9301}," — narrowed type predicate from\n",{"type":11,"tag":68,"props":9303,"children":9305},{"className":9304},[],[9306],{"type":17,"value":9307},"(x): x is string",{"type":17,"value":6201},{"type":11,"tag":68,"props":9310,"children":9312},{"className":9311},[],[9313],{"type":17,"value":9314},"(x): x is \"positive\" | \"negative\" | \"flat\"",{"type":17,"value":9316},"\nto satisfy \"predicate's type must be assignable to parameter's\ntype\".",{"type":11,"tag":81,"props":9318,"children":9319},{},[9320,9326,9328,9334,9336,9342,9344,9350,9352,9358],{"type":11,"tag":68,"props":9321,"children":9323},{"className":9322},[],[9324],{"type":17,"value":9325},"TuxTable.vue",{"type":17,"value":9327}," — relaxed ",{"type":11,"tag":68,"props":9329,"children":9331},{"className":9330},[],[9332],{"type":17,"value":9333},"readStatus",{"type":17,"value":9335}," signature from\n",{"type":11,"tag":68,"props":9337,"children":9339},{"className":9338},[],[9340],{"type":17,"value":9341},"{ original?: Record\u003Cstring, unknown> } & Record\u003Cstring, unknown>",{"type":17,"value":9343},"\nto ",{"type":11,"tag":68,"props":9345,"children":9347},{"className":9346},[],[9348],{"type":17,"value":9349},"{ original?: unknown }",{"type":17,"value":9351}," so it accepts ",{"type":11,"tag":68,"props":9353,"children":9355},{"className":9354},[],[9356],{"type":17,"value":9357},"Row\u003Cunknown>",{"type":17,"value":9359}," from\nUTable's slot.",{"type":11,"tag":81,"props":9361,"children":9362},{},[9363,9369,9371,9377,9379,9385,9386,9392],{"type":11,"tag":68,"props":9364,"children":9366},{"className":9365},[],[9367],{"type":17,"value":9368},"TuxAppFrame.vue",{"type":17,"value":9370}," — replaced ternary ",{"type":11,"tag":68,"props":9372,"children":9374},{"className":9373},[],[9375],{"type":17,"value":9376},"emit(action === … ? … : …)",{"type":17,"value":9378},"\nwith explicit ",{"type":11,"tag":68,"props":9380,"children":9382},{"className":9381},[],[9383],{"type":17,"value":9384},"if",{"type":17,"value":3280},{"type":11,"tag":68,"props":9387,"children":9389},{"className":9388},[],[9390],{"type":17,"value":9391},"else",{"type":17,"value":9393}," branches per emit name so TS can match\nthe discrete tuple overloads.",{"type":11,"tag":81,"props":9395,"children":9396},{},[9397,9403,9404,9410,9412,9418,9420,9426,9428,9434,9436,9442,9444,9449],{"type":11,"tag":68,"props":9398,"children":9400},{"className":9399},[],[9401],{"type":17,"value":9402},"TuxCardCarousel.vue",{"type":17,"value":9244},{"type":11,"tag":68,"props":9405,"children":9407},{"className":9406},[],[9408],{"type":17,"value":9409},"props",{"type":17,"value":9411}," capture + ",{"type":11,"tag":68,"props":9413,"children":9415},{"className":9414},[],[9416],{"type":17,"value":9417},"carouselItems",{"type":17,"value":9419},"\ncomputed that casts through ",{"type":11,"tag":68,"props":9421,"children":9423},{"className":9422},[],[9424],{"type":17,"value":9425},"unknown",{"type":17,"value":9427}," to satisfy UCarousel's\nstrict ",{"type":11,"tag":68,"props":9429,"children":9431},{"className":9430},[],[9432],{"type":17,"value":9433},"CarouselItem[]",{"type":17,"value":9435}," prop without losing the generic ",{"type":11,"tag":68,"props":9437,"children":9439},{"className":9438},[],[9440],{"type":17,"value":9441},"T",{"type":17,"value":9443}," for\nthe ",{"type":11,"tag":68,"props":9445,"children":9447},{"className":9446},[],[9448],{"type":17,"value":3229},{"type":17,"value":9450}," slot.",{"type":11,"tag":81,"props":9452,"children":9453},{},[9454,9460,9462,9468,9470,9476,9478,9483,9484,9490],{"type":11,"tag":68,"props":9455,"children":9457},{"className":9456},[],[9458],{"type":17,"value":9459},"TuxConfirmDialog.vue",{"type":17,"value":9461}," — narrowed ",{"type":11,"tag":68,"props":9463,"children":9465},{"className":9464},[],[9466],{"type":17,"value":9467},"confirmIntent",{"type":17,"value":9469}," return type to\n",{"type":11,"tag":68,"props":9471,"children":9473},{"className":9472},[],[9474],{"type":17,"value":9475},"\"primary\" | \"destructive\"",{"type":17,"value":9477},"; mapped the \"warning\" dialog variant\nto the primary button intent since ",{"type":11,"tag":68,"props":9479,"children":9481},{"className":9480},[],[9482],{"type":17,"value":4755},{"type":17,"value":4219},{"type":11,"tag":68,"props":9485,"children":9487},{"className":9486},[],[9488],{"type":17,"value":9489},"Intent",{"type":17,"value":9491}," doesn't\ninclude \"warning\" and the warning context lives in the dialog\nchrome, not the button.",{"type":11,"tag":81,"props":9493,"children":9494},{},[9495,9501,9503,9509,9511,9517],{"type":11,"tag":68,"props":9496,"children":9498},{"className":9497},[],[9499],{"type":17,"value":9500},"TuxFormField.vue",{"type":17,"value":9502}," — kept kebab-case slot bindings (eslint\n",{"type":11,"tag":68,"props":9504,"children":9506},{"className":9505},[],[9507],{"type":17,"value":9508},"vue\u002Fattribute-hyphenation",{"type":17,"value":9510}," requires it) + added a comment\npointing consumers at the string-key destructure pattern\n(",{"type":11,"tag":68,"props":9512,"children":9514},{"className":9513},[],[9515],{"type":17,"value":9516},"{ 'aria-describedby': x }",{"type":17,"value":2630},{"type":11,"tag":81,"props":9519,"children":9520},{},[9521,9527,9529,9534,9536,9542],{"type":11,"tag":68,"props":9522,"children":9524},{"className":9523},[],[9525],{"type":17,"value":9526},"app\u002Fpages\u002Fcomponents\u002Fforms-wrapper.vue",{"type":17,"value":9528}," — switched the\n",{"type":11,"tag":68,"props":9530,"children":9532},{"className":9531},[],[9533],{"type":17,"value":8313},{"type":17,"value":9535}," slot destructures to string-key syntax to match\nVue's literal type extraction for ",{"type":11,"tag":68,"props":9537,"children":9539},{"className":9538},[],[9540],{"type":17,"value":9541},"aria-*",{"type":17,"value":9543}," props.",{"type":11,"tag":81,"props":9545,"children":9546},{},[9547,9553,9554,9560,9562,9568],{"type":11,"tag":68,"props":9548,"children":9550},{"className":9549},[],[9551],{"type":17,"value":9552},"app\u002Fpages\u002Fcomponents\u002Frich-data-grid.vue",{"type":17,"value":1244},{"type":11,"tag":68,"props":9555,"children":9557},{"className":9556},[],[9558],{"type":17,"value":9559},"rows.slice(0, 5)",{"type":17,"value":9561}," →\n",{"type":11,"tag":68,"props":9563,"children":9565},{"className":9564},[],[9566],{"type":17,"value":9567},"compactRows",{"type":17,"value":9569}," (undefined identifier reference).",{"type":11,"tag":81,"props":9571,"children":9572},{},[9573,9575,9584,9585,9594,9596,9601,9603,9609,9611,9617,9619,9625,9627,9633],{"type":17,"value":9574},"New\n",{"type":11,"tag":25,"props":9576,"children":9578},{"href":9577},"app\u002Fpages\u002Fvisualizations\u002Fchart-gauge.demo-data.ts",[9579],{"type":11,"tag":68,"props":9580,"children":9582},{"className":9581},[],[9583],{"type":17,"value":9577},{"type":17,"value":2738},{"type":11,"tag":25,"props":9586,"children":9588},{"href":9587},"app\u002Fpages\u002Fvisualizations\u002Fchart-line.demo-data.ts",[9589],{"type":11,"tag":68,"props":9590,"children":9592},{"className":9591},[],[9593],{"type":17,"value":9587},{"type":17,"value":9595}," —\nshowcase data extracted from the ",{"type":11,"tag":68,"props":9597,"children":9599},{"className":9598},[],[9600],{"type":17,"value":9101},{"type":17,"value":9602}," pages so we can use real\nTS annotations to narrow ",{"type":11,"tag":68,"props":9604,"children":9606},{"className":9605},[],[9607],{"type":17,"value":9608},"Band.intent",{"type":17,"value":9610}," and tuple-typed ",{"type":11,"tag":68,"props":9612,"children":9614},{"className":9613},[],[9615],{"type":17,"value":9616},"Series.band",{"type":17,"value":9618},"\n\u002F ",{"type":11,"tag":68,"props":9620,"children":9622},{"className":9621},[],[9623],{"type":17,"value":9624},"Ref\u003C[number, number]>",{"type":17,"value":9626}," without violating ADR-0010's macro-extractor\nconstraint. See\n",{"type":11,"tag":25,"props":9628,"children":9630},{"href":9629},"docs\u002Fadr\u002F0011-sibling-demo-data-ts-modules-for-pages.md",[9631],{"type":17,"value":9632},"ADR-0011",{"type":17,"value":9634},"\nfor the prescribed pattern.",{"type":11,"tag":19,"props":9636,"children":9637},{},[9638],{"type":11,"tag":85,"props":9639,"children":9640},{},[9641],{"type":17,"value":9642},"Architecture decision:",{"type":11,"tag":77,"props":9644,"children":9645},{},[9646],{"type":11,"tag":81,"props":9647,"children":9648},{},[9649,9650,9663,9665,9670],{"type":17,"value":9574},{"type":11,"tag":25,"props":9651,"children":9652},{"href":9629},[9653,9655,9661],{"type":17,"value":9654},"ADR-0011 — Sibling ",{"type":11,"tag":68,"props":9656,"children":9658},{"className":9657},[],[9659],{"type":17,"value":9660},"*.demo-data.ts",{"type":17,"value":9662}," modules for typed page data",{"type":17,"value":9664},".\nSupplements ADR-0010 with the escape hatch when type-narrowing\nneeds collide with the macro-extractor constraint — JSDoc workarounds\ndon't suffice for literal narrowing, so extract to a sibling ",{"type":11,"tag":68,"props":9666,"children":9668},{"className":9667},[],[9669],{"type":17,"value":9108},{"type":17,"value":9671},"\nmodule instead.",{"type":11,"tag":56,"props":9673,"children":9675},{"id":9674},"added-four-family-expansion-2026-05-22",[9676],{"type":17,"value":9677},"Added — four-family expansion (2026-05-22)",{"type":11,"tag":19,"props":9679,"children":9680},{},[9681],{"type":17,"value":9682},"22 new components across four families, shipped in 4 focused\ncommits with shared showcase routes:",{"type":11,"tag":19,"props":9684,"children":9685},{},[9686,9691,9693,9699],{"type":11,"tag":85,"props":9687,"children":9688},{},[9689],{"type":17,"value":9690},"Research-publishing cluster",{"type":17,"value":9692}," (8 components,\n",{"type":11,"tag":68,"props":9694,"children":9696},{"className":9695},[],[9697],{"type":17,"value":9698},"\u002Fcomponents\u002Fresearch-publishing",{"type":17,"value":9700},"):\nTuxAbstract, TuxAuthorByline, TuxPaperMeta, TuxFigureCaption,\nTuxTableCaption, TuxFootnote, TuxCitationExport (6 formats),\nTuxAcknowledgments. Makes \"TUX is for research publishing\"\ntangible at the page level.",{"type":11,"tag":19,"props":9702,"children":9703},{},[9704,9709,9711,9717],{"type":11,"tag":85,"props":9705,"children":9706},{},[9707],{"type":17,"value":9708},"TTI identity \u002F brand cluster",{"type":17,"value":9710}," (5 components,\n",{"type":11,"tag":68,"props":9712,"children":9714},{"className":9713},[],[9715],{"type":17,"value":9716},"\u002Fcomponents\u002Ftti-identity",{"type":17,"value":9718},"):\nTuxResearcher (3 layouts), TuxLab, TuxProgram (3 layouts),\nTuxFundingSource (3 sizes), TuxCenterBadge (6 canonical TTI\ncenters). Profile-shaped components for surfacing TTI people,\nlabs, programs, funders.",{"type":11,"tag":19,"props":9720,"children":9721},{},[9722,9727,9729,9735],{"type":11,"tag":85,"props":9723,"children":9724},{},[9725],{"type":17,"value":9726},"Geospatial \u002F map cluster",{"type":17,"value":9728}," (4 components,\n",{"type":11,"tag":68,"props":9730,"children":9732},{"className":9731},[],[9733],{"type":17,"value":9734},"\u002Fcomponents\u002Fgeospatial",{"type":17,"value":9736},"):\nTuxMapEmbed (library-agnostic iframe + slot wrapper),\nTuxCorridorStrip (native SVG 1-D corridor viz with segments +\nevents + value spark), TuxMapLegend (stack\u002Finline\u002Fgradient\nlayouts), TuxMapMarker (5 research-typed SVG markers).\nExtends TuxChartGeographic toward general geospatial.",{"type":11,"tag":19,"props":9738,"children":9739},{},[9740,9745,9746,9752],{"type":11,"tag":85,"props":9741,"children":9742},{},[9743],{"type":17,"value":9744},"Forms wrapper cluster",{"type":17,"value":9710},{"type":11,"tag":68,"props":9747,"children":9749},{"className":9748},[],[9750],{"type":17,"value":9751},"\u002Fcomponents\u002Fforms-wrapper",{"type":17,"value":9753},"):\nTuxFormField (label + help + input + error stack with auto-\ngenerated ids + aria plumbing), TuxMarkdownEditor (no-deps\nmarkdown authoring with toolbar + shortcuts + preview),\nTuxFileDropzone (drag-and-drop uploads with validation),\nTuxValidationSummary (top-of-form error list with jump-to-\nfield links), TuxConfirmDialog (TuxModal preset, 4 variants).",{"type":11,"tag":19,"props":9755,"children":9756},{},[9757,9759,9765],{"type":17,"value":9758},"Showcase convention shift: families share a single combined\nshowcase route rather than 22 individual ",{"type":11,"tag":68,"props":9760,"children":9762},{"className":9761},[],[9763],{"type":17,"value":9764},"\u002Fcomponents\u002F\u003Ckebab>",{"type":17,"value":9766},"\npages. Reads better as a cluster + reduces nav bloat.",{"type":11,"tag":19,"props":9768,"children":9769},{},[9770],{"type":17,"value":9771},"~132 Tux* components + 3 composables total (was ~110).",{"type":11,"tag":56,"props":9773,"children":9775},{"id":9774},"added-composability-doctrine-touchups-2026-05-22",[9776],{"type":17,"value":9777},"Added — composability doctrine + touchups (2026-05-22)",{"type":11,"tag":19,"props":9779,"children":9780},{},[9781],{"type":11,"tag":85,"props":9782,"children":9783},{},[9784],{"type":17,"value":9785},"New doctrine doc:",{"type":11,"tag":77,"props":9787,"children":9788},{},[9789],{"type":11,"tag":81,"props":9790,"children":9791},{},[9792,9801,9803,9808],{"type":11,"tag":25,"props":9793,"children":9795},{"href":9794},"design\u002Fcompositions.md",[9796],{"type":11,"tag":68,"props":9797,"children":9799},{"className":9798},[],[9800],{"type":17,"value":9794},{"type":17,"value":9802}," — \"Compositions\nworth knowing\" doctrine. Captures the ",{"type":11,"tag":85,"props":9804,"children":9805},{},[9806],{"type":17,"value":9807},"\"X + Y composes more value\nthan they do alone\"",{"type":17,"value":9809}," patterns that emerged across the chart-family,\nplatform-aware, and AI-studio sprints. Seven sections (layout\nshells, headlines + summaries, chart surfaces, browse + detail,\nchat, cross-app nav, editorial) with code snippets + in-repo\nconsumer citations + non-obvious gotchas. Three tests for what\nearns a slot. Composability is now a first-class doctrine, not\nscattered hints in component JSDocs.",{"type":11,"tag":19,"props":9811,"children":9812},{},[9813],{"type":11,"tag":85,"props":9814,"children":9815},{},[9816],{"type":17,"value":9817},"Navigation:",{"type":11,"tag":77,"props":9819,"children":9820},{},[9821,9826],{"type":11,"tag":81,"props":9822,"children":9823},{},[9824],{"type":17,"value":9825},"Design-docs nav now lists Compositions, Chart foundations, and\nPlatform awareness alongside Doctrine \u002F Components \u002F Palette \u002F\nRoadmap. Previously these were only reachable via direct URL.",{"type":11,"tag":81,"props":9827,"children":9828},{},[9829,9835],{"type":11,"tag":68,"props":9830,"children":9832},{"className":9831},[],[9833],{"type":17,"value":9834},"app\u002Fpages\u002Fdesign\u002F[doc].vue",{"type":17,"value":9836}," title map extended for all current\ndesign docs so the browser tab + breadcrumb read right.",{"type":11,"tag":19,"props":9838,"children":9839},{},[9840],{"type":11,"tag":85,"props":9841,"children":9842},{},[9843],{"type":17,"value":9844},"Touchups — motion vocabulary aligned in example surfaces:",{"type":11,"tag":77,"props":9846,"children":9847},{},[9848,9867],{"type":11,"tag":81,"props":9849,"children":9850},{},[9851,9857,9859,9865],{"type":11,"tag":68,"props":9852,"children":9854},{"className":9853},[],[9855],{"type":17,"value":9856},"app\u002Fpages\u002Fexamples\u002Fresearch-landing.vue",{"type":17,"value":9858}," — TuxStatComparison\ndelta row gains ",{"type":11,"tag":68,"props":9860,"children":9862},{"className":9861},[],[9863],{"type":17,"value":9864},"tux-mount-in",{"type":17,"value":9866}," stagger so the year-over-year\nnumbers tick in subtly.",{"type":11,"tag":81,"props":9868,"children":9869},{},[9870,9876],{"type":11,"tag":68,"props":9871,"children":9873},{"className":9872},[],[9874],{"type":17,"value":9875},"app\u002Fpages\u002Fexamples\u002Fsidebar-shell.vue",{"type":17,"value":9877}," — Recent-activity rows\nfade up with stagger as the page mounts.",{"type":11,"tag":56,"props":9879,"children":9881},{"id":9880},"added-second-polish-queue-2026-05-22",[9882],{"type":17,"value":9883},"Added — second polish queue (2026-05-22)",{"type":11,"tag":19,"props":9885,"children":9886},{},[9887],{"type":17,"value":9888},"Four-phase polish following the chart-tooltip + entrance-animation\nsprint. Spans dashboard hover hygiene, opt-in component motion,\nai-studio example refresh, and Conventions documentation.",{"type":11,"tag":19,"props":9890,"children":9891},{},[9892],{"type":11,"tag":85,"props":9893,"children":9894},{},[9895],{"type":17,"value":9896},"Dashboard hover state",{"type":11,"tag":77,"props":9898,"children":9899},{},[9900],{"type":11,"tag":81,"props":9901,"children":9902},{},[9903,9905,9910,9911,9916,9917,9922,9927],{"type":17,"value":9904},"Chart tooltips on ",{"type":11,"tag":68,"props":9906,"children":9908},{"className":9907},[],[9909],{"type":17,"value":627},{"type":17,"value":95},{"type":11,"tag":68,"props":9912,"children":9914},{"className":9913},[],[9915],{"type":17,"value":6364},{"type":17,"value":95},{"type":11,"tag":68,"props":9918,"children":9920},{"className":9919},[],[9921],{"type":17,"value":643},{"type":11,"tag":85,"props":9923,"children":9924},{},[9925],{"type":17,"value":9926},"auto-flip",{"type":17,"value":9928}," to the left of the cursor when the active index sits\npast 60% of the chart width. Avoids right-edge overflow in tight\ncard containers (the throughput \u002F tier \u002F health row in\nlandscape-dashboard, for instance).",{"type":11,"tag":19,"props":9930,"children":9931},{},[9932,9937,9938,9947,9949,9955],{"type":11,"tag":85,"props":9933,"children":9934},{},[9935],{"type":17,"value":9936},"Component motion",{"type":17,"value":8057},{"type":11,"tag":25,"props":9939,"children":9941},{"href":9940},"app\u002Fassets\u002Fcss\u002Ftux-component-motion.css",[9942],{"type":11,"tag":68,"props":9943,"children":9945},{"className":9944},[],[9946],{"type":17,"value":9940},{"type":17,"value":9948},"\n(auto-imported via ",{"type":11,"tag":68,"props":9950,"children":9952},{"className":9951},[],[9953],{"type":17,"value":9954},"globals.css",{"type":17,"value":9956},"):",{"type":11,"tag":77,"props":9958,"children":9959},{},[9960,9982,9996,10020,10032],{"type":11,"tag":81,"props":9961,"children":9962},{},[9963,9972,9974,9980],{"type":11,"tag":85,"props":9964,"children":9965},{},[9966],{"type":11,"tag":68,"props":9967,"children":9969},{"className":9968},[],[9970],{"type":17,"value":9971},".tux-mount-in",{"type":17,"value":9973}," opt-in class — immediate children fade + 4px\nslide up on mount (220ms). Stagger via\n",{"type":11,"tag":68,"props":9975,"children":9977},{"className":9976},[],[9978],{"type":17,"value":9979},"--tux-mount-stagger-index",{"type":17,"value":9981}," per child.",{"type":11,"tag":81,"props":9983,"children":9984},{},[9985,9994],{"type":11,"tag":85,"props":9986,"children":9987},{},[9988],{"type":11,"tag":68,"props":9989,"children":9991},{"className":9990},[],[9992],{"type":17,"value":9993},".tux-mount-in--section",{"type":17,"value":9995}," larger variant for section-level\nentrances (320ms).",{"type":11,"tag":81,"props":9997,"children":9998},{},[9999,10008,10009,10018],{"type":11,"tag":85,"props":10000,"children":10001},{},[10002],{"type":11,"tag":68,"props":10003,"children":10005},{"className":10004},[],[10006],{"type":17,"value":10007},".tux-mount-fade",{"type":17,"value":912},{"type":11,"tag":85,"props":10010,"children":10011},{},[10012],{"type":11,"tag":68,"props":10013,"children":10015},{"className":10014},[],[10016],{"type":17,"value":10017},".tux-mount-scale",{"type":17,"value":10019}," for chrome\nelements that shouldn't slide.",{"type":11,"tag":81,"props":10021,"children":10022},{},[10023,10025,10030],{"type":17,"value":10024},"All three respect ",{"type":11,"tag":68,"props":10026,"children":10028},{"className":10027},[],[10029],{"type":17,"value":3334},{"type":17,"value":10031}," (collapse to\ninstant).",{"type":11,"tag":81,"props":10033,"children":10034},{},[10035,10037,10043,10045,10051],{"type":17,"value":10036},"Applied opt-in to ",{"type":11,"tag":68,"props":10038,"children":10040},{"className":10039},[],[10041],{"type":17,"value":10042},"landscape-dashboard.vue",{"type":17,"value":10044}," (KPI strip + 3-card\nhealth row) and ",{"type":11,"tag":68,"props":10046,"children":10048},{"className":10047},[],[10049],{"type":17,"value":10050},"tti-ai-studio-session.vue",{"type":17,"value":10052}," (right rail).",{"type":11,"tag":19,"props":10054,"children":10055},{},[10056],{"type":11,"tag":85,"props":10057,"children":10058},{},[10059],{"type":17,"value":10060},"tti-ai-studio-session.vue refresh:",{"type":11,"tag":77,"props":10062,"children":10063},{},[10064,10073,10090,10099],{"type":11,"tag":81,"props":10065,"children":10066},{},[10067,10071],{"type":11,"tag":85,"props":10068,"children":10069},{},[10070],{"type":17,"value":8320},{"type":17,"value":10072}," added to the page-header actions (AI Studio\n↔ Landscape ↔ TUX docs).",{"type":11,"tag":81,"props":10074,"children":10075},{},[10076,10080,10082,10088],{"type":11,"tag":85,"props":10077,"children":10078},{},[10079],{"type":17,"value":4217},{"type":17,"value":10081}," wraps the ",{"type":11,"tag":68,"props":10083,"children":10085},{"className":10084},[],[10086],{"type":17,"value":10087},"compare.py",{"type":17,"value":10089}," artifact for an \"open in\nfocus mode\" affordance (the natural Artifact + FocusView pairing).",{"type":11,"tag":81,"props":10091,"children":10092},{},[10093,10097],{"type":11,"tag":85,"props":10094,"children":10095},{},[10096],{"type":17,"value":8497},{"type":17,"value":10098}," replaces the inline thumb buttons in the\nassistant turn's footer (less friction than a feedback form).",{"type":11,"tag":81,"props":10100,"children":10101},{},[10102,10110],{"type":11,"tag":85,"props":10103,"children":10104},{},[10105],{"type":11,"tag":68,"props":10106,"children":10108},{"className":10107},[],[10109],{"type":17,"value":9864},{"type":17,"value":10111}," entrance on the right rail.",{"type":11,"tag":19,"props":10113,"children":10114},{},[10115,10120,10122,10127],{"type":11,"tag":85,"props":10116,"children":10117},{},[10118],{"type":17,"value":10119},"Conventions docs",{"type":17,"value":10121}," (in ",{"type":11,"tag":68,"props":10123,"children":10125},{"className":10124},[],[10126],{"type":17,"value":8060},{"type":17,"value":9956},{"type":11,"tag":77,"props":10129,"children":10130},{},[10131,10148],{"type":11,"tag":81,"props":10132,"children":10133},{},[10134,10136,10146],{"type":17,"value":10135},"New \"Motion primitives — six canonical transitions\" subsection\ndocumenting the six existing patterns (Tooltip \u002F Popover,\nDropdown menu, Modal \u002F Dialog, Slideover \u002F Drawer, Toast,\nAccordion) plus the three component-level + six chart-family\nprimitives. ",{"type":11,"tag":85,"props":10137,"children":10138},{},[10139,10141],{"type":17,"value":10140},"All collapse to instant on ",{"type":11,"tag":68,"props":10142,"children":10144},{"className":10143},[],[10145],{"type":17,"value":3334},{"type":17,"value":10147}," — non-negotiable.",{"type":11,"tag":81,"props":10149,"children":10150},{},[10151,10153,10158],{"type":17,"value":10152},"New \"Chart tooltips — consistent pattern across the family\"\nsubsection capturing the 7-point contract every interactive\nchart now follows (focus, highlight, branded card, auto-flip,\nhover emit, tooltip prop, SVG ",{"type":11,"tag":68,"props":10154,"children":10156},{"className":10155},[],[10157],{"type":17,"value":3554},{"type":17,"value":10159}," fallback).",{"type":11,"tag":56,"props":10161,"children":10163},{"id":10162},"added-chart-polish-queue-2026-05-22",[10164],{"type":17,"value":10165},"Added — chart polish queue (2026-05-22)",{"type":11,"tag":19,"props":10167,"children":10168},{},[10169],{"type":17,"value":10170},"Polishes the native chart family for consistency and motion.",{"type":11,"tag":19,"props":10172,"children":10173},{},[10174],{"type":11,"tag":85,"props":10175,"children":10176},{},[10177],{"type":17,"value":10178},"Tooltip parity across the chart family:",{"type":11,"tag":77,"props":10180,"children":10181},{},[10182,10192,10202,10219,10239],{"type":11,"tag":81,"props":10183,"children":10184},{},[10185,10190],{"type":11,"tag":68,"props":10186,"children":10188},{"className":10187},[],[10189],{"type":17,"value":6364},{"type":17,"value":10191}," — vertical guide + per-series focus dots + tooltip\ncard (Line-style pattern, including stacked-total readout).",{"type":11,"tag":81,"props":10193,"children":10194},{},[10195,10200],{"type":11,"tag":68,"props":10196,"children":10198},{"className":10197},[],[10199],{"type":17,"value":643},{"type":17,"value":10201}," — column-wash highlight + tooltip card with per-\nseries values + projection-vs-actual comparison row + total.",{"type":11,"tag":81,"props":10203,"children":10204},{},[10205,10210,10212,10217],{"type":11,"tag":68,"props":10206,"children":10208},{"className":10207},[],[10209],{"type":17,"value":3747},{"type":17,"value":10211}," — per-dot pointer enter \u002F focus reveals a\ntooltip anchored to the active dot. Dot grows +2px on active.\nNative SVG ",{"type":11,"tag":68,"props":10213,"children":10215},{"className":10214},[],[10216],{"type":17,"value":3554},{"type":17,"value":10218}," still present as a fallback for AT.",{"type":11,"tag":81,"props":10220,"children":10221},{},[10222,10224,10230,10232,10237],{"type":17,"value":10223},"All three accept ",{"type":11,"tag":68,"props":10225,"children":10227},{"className":10226},[],[10228],{"type":17,"value":10229},":tooltip=\"false\"",{"type":17,"value":10231}," to disable, and emit a\n",{"type":11,"tag":68,"props":10233,"children":10235},{"className":10234},[],[10236],{"type":17,"value":2620},{"type":17,"value":10238}," event with the active payload (consumer can sync hover\nstate across panels).",{"type":11,"tag":81,"props":10240,"children":10241},{},[10242],{"type":17,"value":10243},"Keyboard-accessible: tab into the plot, arrow keys cycle\nindices on Line\u002FArea\u002FBar; tab into a dot on Scatter.",{"type":11,"tag":19,"props":10245,"children":10246},{},[10247,10252,10254,10260,10262,10267],{"type":11,"tag":85,"props":10248,"children":10249},{},[10250],{"type":17,"value":10251},"Chart entrance animations",{"type":17,"value":10253}," (new\n",{"type":11,"tag":68,"props":10255,"children":10257},{"className":10256},[],[10258],{"type":17,"value":10259},"app\u002Fassets\u002Fcss\u002Ftux-chart-motion.css",{"type":17,"value":10261},", auto-imported via\n",{"type":11,"tag":68,"props":10263,"children":10265},{"className":10264},[],[10266],{"type":17,"value":9954},{"type":17,"value":9956},{"type":11,"tag":77,"props":10269,"children":10270},{},[10271,10284,10289,10294,10299,10304,10316],{"type":11,"tag":81,"props":10272,"children":10273},{},[10274,10276,10282],{"type":17,"value":10275},"Lines draw on via animated ",{"type":11,"tag":68,"props":10277,"children":10279},{"className":10278},[],[10280],{"type":17,"value":10281},"stroke-dashoffset",{"type":17,"value":10283}," (450ms).",{"type":11,"tag":81,"props":10285,"children":10286},{},[10287],{"type":17,"value":10288},"Bars scale-Y from baseline (vertical) \u002F scale-X from edge\n(horizontal), staggered ~12ms per category.",{"type":11,"tag":81,"props":10290,"children":10291},{},[10292],{"type":17,"value":10293},"Areas + top-lines rise from a 0.94 vertical scale (360ms).",{"type":11,"tag":81,"props":10295,"children":10296},{},[10297],{"type":17,"value":10298},"Donut slices spin in (~360ms, staggered 28ms per slice).",{"type":11,"tag":81,"props":10300,"children":10301},{},[10302],{"type":17,"value":10303},"Scatter dots pop from scale(0), staggered 8ms.",{"type":11,"tag":81,"props":10305,"children":10306},{},[10307,10309,10314],{"type":17,"value":10308},"Gauge fill sweeps via ",{"type":11,"tag":68,"props":10310,"children":10312},{"className":10311},[],[10313],{"type":17,"value":10281},{"type":17,"value":10315},"; needle swings from\n-135° to its angle (480ms).",{"type":11,"tag":81,"props":10317,"children":10318},{},[10319,10329,10330,10336],{"type":11,"tag":85,"props":10320,"children":10321},{},[10322,10324],{"type":17,"value":10323},"All keyed off ",{"type":11,"tag":68,"props":10325,"children":10327},{"className":10326},[],[10328],{"type":17,"value":8199},{"type":17,"value":1244},{"type":11,"tag":68,"props":10331,"children":10333},{"className":10332},[],[10334],{"type":17,"value":10335},"reduce",{"type":17,"value":10337}," collapses\nevery animation to instant.",{"type":11,"tag":19,"props":10339,"children":10340},{},[10341],{"type":11,"tag":85,"props":10342,"children":10343},{},[10344],{"type":17,"value":10345},"TuxFocusView + chart composition:",{"type":11,"tag":77,"props":10347,"children":10348},{},[10349],{"type":11,"tag":81,"props":10350,"children":10351},{},[10352],{"type":17,"value":10353},"Chart-line showcase gains an \"Open in focus mode\" demo that\npins the chart full-viewport with brush + tooltip still\nfunctional inside the overlay.",{"type":11,"tag":56,"props":10355,"children":10357},{"id":10356},"added-compositional-sprint-chart-interactions-dashboard-refresh-absorption-closure-2026-05-22",[10358],{"type":17,"value":10359},"Added — compositional sprint: chart interactions + dashboard refresh + absorption closure (2026-05-22)",{"type":11,"tag":19,"props":10361,"children":10362},{},[10363],{"type":17,"value":10364},"Layered onto the chart-family completion: real interactions on the\nmost-used chart, a full Landscape-dashboard dogfood, and the\nabsorption pipeline closed.",{"type":11,"tag":19,"props":10366,"children":10367},{},[10368,10373,10374,10379],{"type":11,"tag":85,"props":10369,"children":10370},{},[10371],{"type":17,"value":10372},"Chart interactions",{"type":17,"value":4849},{"type":11,"tag":68,"props":10375,"children":10377},{"className":10376},[],[10378],{"type":17,"value":627},{"type":17,"value":10380},":",{"type":11,"tag":77,"props":10382,"children":10383},{},[10384,10401],{"type":11,"tag":81,"props":10385,"children":10386},{},[10387,10392,10394,10399],{"type":11,"tag":85,"props":10388,"children":10389},{},[10390],{"type":17,"value":10391},"Hover tooltip",{"type":17,"value":10393}," — on by default. Mouse + keyboard (tab into\nplot area, arrow keys to cycle data points). Tooltip card\npositioned with the active vertical guide line + focus dots on\neach series. Shows current + previous-period readouts together.\nNative SVG ",{"type":11,"tag":68,"props":10395,"children":10397},{"className":10396},[],[10398],{"type":17,"value":3554},{"type":17,"value":10400}," fallback still present for plain screen-\nreader users.",{"type":11,"tag":81,"props":10402,"children":10403},{},[10404,10409,10411,10417,10418,10424,10426,10432,10433,10438],{"type":11,"tag":85,"props":10405,"children":10406},{},[10407],{"type":17,"value":10408},"Brush selector",{"type":17,"value":10410}," — pass ",{"type":11,"tag":68,"props":10412,"children":10414},{"className":10413},[],[10415],{"type":17,"value":10416},"brush",{"type":17,"value":912},{"type":11,"tag":68,"props":10419,"children":10421},{"className":10420},[],[10422],{"type":17,"value":10423},"v-model:range",{"type":17,"value":10425}," to render a\ncompact preview strip beneath the main chart with two draggable\nhandles. Drag handles to resize the visible window; drag the\nwindow itself to pan. Charts UI Kit absorption carry-forward\nfinally lands. Two new emits (",{"type":11,"tag":68,"props":10427,"children":10429},{"className":10428},[],[10430],{"type":17,"value":10431},"update:range",{"type":17,"value":95},{"type":11,"tag":68,"props":10434,"children":10436},{"className":10435},[],[10437],{"type":17,"value":2620},{"type":17,"value":2630},{"type":11,"tag":19,"props":10440,"children":10441},{},[10442],{"type":11,"tag":85,"props":10443,"children":10444},{},[10445],{"type":17,"value":10446},"Showcase refresh:",{"type":11,"tag":77,"props":10448,"children":10449},{},[10450],{"type":11,"tag":81,"props":10451,"children":10452},{},[10453,10459,10461],{"type":11,"tag":68,"props":10454,"children":10456},{"className":10455},[],[10457],{"type":17,"value":10458},"\u002Fvisualizations\u002Fchart-line",{"type":17,"value":10460}," gains two new sections (tooltip\n",{"type":11,"tag":77,"props":10462,"children":10463},{},[10464],{"type":11,"tag":81,"props":10465,"children":10466},{},[10467],{"type":17,"value":10468},"brush) with live demos.",{"type":11,"tag":19,"props":10470,"children":10471},{},[10472],{"type":11,"tag":85,"props":10473,"children":10474},{},[10475,10481],{"type":11,"tag":68,"props":10476,"children":10478},{"className":10477},[],[10479],{"type":17,"value":10480},"app\u002Fpages\u002Fexamples\u002Flandscape-dashboard.vue",{"type":17,"value":10380},{"type":11,"tag":77,"props":10483,"children":10484},{},[10485],{"type":11,"tag":81,"props":10486,"children":10487},{},[10488,10490],{"type":17,"value":10489},"Three new chart sections dogfood the full Priority B chart\nfamily on real-shape Landscape data:\n",{"type":11,"tag":77,"props":10491,"children":10492},{},[10493,10498,10503],{"type":11,"tag":81,"props":10494,"children":10495},{},[10496],{"type":17,"value":10497},"12-month ingest trend with brush selector + previous-period\noverlay (TuxChartLine).",{"type":11,"tag":81,"props":10499,"children":10500},{},[10501],{"type":17,"value":10502},"KPI strip (TuxBigStat × 4) above stacked area chart by file\ntype — the canonical \"summary + trend\" composition from the\nCharts UI Kit absorption.",{"type":11,"tag":81,"props":10504,"children":10505},{},[10506],{"type":17,"value":10507},"Throughput-by-weekday bar + access-tier donut + API-uptime +\nagent-pool gauges in a three-card grid.",{"type":11,"tag":19,"props":10509,"children":10510},{},[10511],{"type":11,"tag":85,"props":10512,"children":10513},{},[10514],{"type":17,"value":10515},"Absorption pipeline closed:",{"type":11,"tag":77,"props":10517,"children":10518},{},[10519,10524],{"type":11,"tag":81,"props":10520,"children":10521},{},[10522],{"type":17,"value":10523},"Three sleeper audits — Accessible Design Toolkit (a11y rubric\nparity confirmed), Omnichart UX Flowchart (TuxDiagram covers\nit), 59 Charts UI Responsive (native SVG architecture\nreaffirmed). All \"no new components\" with documented rationale.",{"type":11,"tag":81,"props":10525,"children":10526},{},[10527,10528,10537],{"type":17,"value":128},{"type":11,"tag":25,"props":10529,"children":10531},{"href":10530},"reference\u002Ffigma-cache\u002FSKIP-RATIONALE.md",[10532],{"type":11,"tag":68,"props":10533,"children":10535},{"className":10534},[],[10536],{"type":17,"value":10530},{"type":17,"value":10538},"\nconsolidates the explicit-skip rationale for the remaining 22\nfiles (other framework systems, mockup tools, single-pattern\nkits). Future contributors don't need to re-litigate.",{"type":11,"tag":19,"props":10540,"children":10541},{},[10542,10547],{"type":11,"tag":85,"props":10543,"children":10544},{},[10545],{"type":17,"value":10546},"Totals after this sprint:",{"type":17,"value":10548}," 46 \u002F 70 absorbed; 22 explicitly\nskipped + 2 known duplicates = full corpus triaged.",{"type":11,"tag":56,"props":10550,"children":10552},{"id":10551},"added-native-chart-family-completion-2026-05-22",[10553],{"type":17,"value":10554},"Added — native chart family completion (2026-05-22)",{"type":11,"tag":19,"props":10556,"children":10557},{},[10558,10560,10565,10567,10573,10575,10581],{"type":17,"value":10559},"Closes the Priority B chart roadmap. Four new native SVG charts\nland in one sprint, all following ",{"type":11,"tag":68,"props":10561,"children":10563},{"className":10562},[],[10564],{"type":17,"value":547},{"type":17,"value":10566},"\ndoctrine: maroon-led ",{"type":11,"tag":68,"props":10568,"children":10570},{"className":10569},[],[10571],{"type":17,"value":10572},"--chart-1..8",{"type":17,"value":10574}," palette, end-of-element value\nlabels colored to series, auto-derived screen-reader summary,\neditorial chrome via optional ",{"type":11,"tag":68,"props":10576,"children":10578},{"className":10577},[],[10579],{"type":17,"value":10580},"TuxChartFrame",{"type":17,"value":10582}," wrap.",{"type":11,"tag":77,"props":10584,"children":10585},{},[10586,10611,10635,10652],{"type":11,"tag":81,"props":10587,"children":10588},{},[10589,10601,10603,10609],{"type":11,"tag":85,"props":10590,"children":10591},{},[10592],{"type":11,"tag":25,"props":10593,"children":10595},{"href":10594},"app\u002Fcomponents\u002FTuxChartDonut.vue",[10596],{"type":11,"tag":68,"props":10597,"children":10599},{"className":10598},[],[10600],{"type":17,"value":3546},{"type":17,"value":10602}," —\nshare-of-total with center stat slot. Slices below ",{"type":11,"tag":68,"props":10604,"children":10606},{"className":10605},[],[10607],{"type":17,"value":10608},"minSlice%",{"type":17,"value":10610},"\nauto-fold into \"Other\" (keeps it legible past 6 categories).\nSlice labels colored to the wedge they point at — color-blind\nusers get identity from text adjacency.",{"type":11,"tag":81,"props":10612,"children":10613},{},[10614,10626,10628,10633],{"type":11,"tag":85,"props":10615,"children":10616},{},[10617],{"type":11,"tag":25,"props":10618,"children":10620},{"href":10619},"app\u002Fcomponents\u002FTuxChartArea.vue",[10621],{"type":11,"tag":68,"props":10622,"children":10624},{"className":10623},[],[10625],{"type":17,"value":6364},{"type":17,"value":10627}," — sibling\nto TuxChartLine; fills the region under each line. Overlay\n(default, 0.22 opacity for multi-series read-through) and stacked\nvariants. End-of-area labels colored to series. Pairs with\n",{"type":11,"tag":68,"props":10629,"children":10631},{"className":10630},[],[10632],{"type":17,"value":1874},{"type":17,"value":10634}," for the canonical \"KPI strip over stacked area\"\ncomposition (Charts UI Kit absorption carry-forward).",{"type":11,"tag":81,"props":10636,"children":10637},{},[10638,10650],{"type":11,"tag":85,"props":10639,"children":10640},{},[10641],{"type":11,"tag":25,"props":10642,"children":10644},{"href":10643},"app\u002Fcomponents\u002FTuxChartScatter.vue",[10645],{"type":11,"tag":68,"props":10646,"children":10648},{"className":10647},[],[10649],{"type":17,"value":3747},{"type":17,"value":10651}," —\ncorrelation plot. Optional linear-regression trendline per series\nwith R² readout in the legend. Variable point sizes for bubble-\nchart mode. The only chart in the family where both axes need\nlabels (since x is no longer ordinal).",{"type":11,"tag":81,"props":10653,"children":10654},{},[10655,10667,10669,10675,10677],{"type":11,"tag":85,"props":10656,"children":10657},{},[10658],{"type":11,"tag":25,"props":10659,"children":10661},{"href":10660},"app\u002Fcomponents\u002FTuxChartGauge.vue",[10662],{"type":11,"tag":68,"props":10663,"children":10665},{"className":10664},[],[10666],{"type":17,"value":2280},{"type":17,"value":10668}," — 270°\narc gauge for single-target metrics. Two variants: ",{"type":11,"tag":68,"props":10670,"children":10672},{"className":10671},[],[10673],{"type":17,"value":10674},"arc",{"type":17,"value":10676}," (needle\n",{"type":11,"tag":77,"props":10678,"children":10679},{},[10680],{"type":11,"tag":81,"props":10681,"children":10682},{},[10683,10685,10691,10693,10698],{"type":17,"value":10684},"optional tone bands using status tokens) and ",{"type":11,"tag":68,"props":10686,"children":10688},{"className":10687},[],[10689],{"type":17,"value":10690},"progress",{"type":17,"value":10692}," (single\nfilled arc, no needle). Use sparingly — research dashboards\nrarely need gauges; the showcase calls out when to reach for\n",{"type":11,"tag":68,"props":10694,"children":10696},{"className":10695},[],[10697],{"type":17,"value":1874},{"type":17,"value":10699}," instead.",{"type":11,"tag":19,"props":10701,"children":10702},{},[10703,10705,10711],{"type":17,"value":10704},"Plus showcase routes under ",{"type":11,"tag":68,"props":10706,"children":10708},{"className":10707},[],[10709],{"type":17,"value":10710},"\u002Fvisualizations\u002F{chart-donut, chart-area, chart-scatter, chart-gauge}",{"type":17,"value":10712},", full 6-step shipping discipline (nav,\nindex cards, components.md rows, roadmap struck through).",{"type":11,"tag":19,"props":10714,"children":10715},{},[10716],{"type":17,"value":10717},"The Priority B chart roadmap is now closed.",{"type":11,"tag":56,"props":10719,"children":10721},{"id":10720},"added-next-sprint-batch-splitpane-appswitcher-chartbar-2026-05-22",[10722],{"type":17,"value":10723},"Added — next-sprint batch: SplitPane + AppSwitcher + ChartBar (2026-05-22)",{"type":11,"tag":19,"props":10725,"children":10726},{},[10727],{"type":17,"value":10728},"Closes 3 of the 4 deferred roadmap candidates from the\nplatform-aware sprint. Tauri-bindings companion doc lands too.",{"type":11,"tag":19,"props":10730,"children":10731},{},[10732],{"type":11,"tag":85,"props":10733,"children":10734},{},[10735],{"type":17,"value":10736},"New components:",{"type":11,"tag":77,"props":10738,"children":10739},{},[10740,10780,10805],{"type":11,"tag":81,"props":10741,"children":10742},{},[10743,10755,10757,10762,10764,10770,10772,10778],{"type":11,"tag":85,"props":10744,"children":10745},{},[10746],{"type":11,"tag":25,"props":10747,"children":10749},{"href":10748},"app\u002Fcomponents\u002FTuxSplitPane.vue",[10750],{"type":11,"tag":68,"props":10751,"children":10753},{"className":10752},[],[10754],{"type":17,"value":6568},{"type":17,"value":10756}," — in-page\nmaster-detail layout with resizable list pane (drag handle, double-\nclick to collapse, sliver-click to expand) and optional bottom pane\nfor related content. Width persists via localStorage when an ",{"type":11,"tag":68,"props":10758,"children":10760},{"className":10759},[],[10761],{"type":17,"value":6079},{"type":17,"value":10763},"\nis provided. Folds to single-column below tablet. Selection is\nURL-bound (consumer's responsibility); empty-state defaults to\n",{"type":11,"tag":68,"props":10765,"children":10767},{"className":10766},[],[10768],{"type":17,"value":10769},"TuxEmptyState",{"type":17,"value":10771}," if ",{"type":11,"tag":68,"props":10773,"children":10775},{"className":10774},[],[10776],{"type":17,"value":10777},"#empty",{"type":17,"value":10779}," slot not provided. Source: Fabric\n\"Multiview\" absorption.",{"type":11,"tag":81,"props":10781,"children":10782},{},[10783,10795,10797,10803],{"type":11,"tag":85,"props":10784,"children":10785},{},[10786],{"type":11,"tag":25,"props":10787,"children":10789},{"href":10788},"app\u002Fcomponents\u002FTuxAppSwitcher.vue",[10790],{"type":11,"tag":68,"props":10791,"children":10793},{"className":10792},[],[10794],{"type":17,"value":8320},{"type":17,"value":10796}," — waffle-\nbutton trigger + popover grid of app tiles for hopping between TTI\nconsumer apps (Landscape ↔ AI Studio ↔ future). Current-app tile\ncarries ",{"type":11,"tag":68,"props":10798,"children":10800},{"className":10799},[],[10801],{"type":17,"value":10802},"aria-current=\"page\"",{"type":17,"value":10804}," + visual disabled state. Source:\nFabric \"Suite header\" absorption.",{"type":11,"tag":81,"props":10806,"children":10807},{},[10808,10820,10822,10827],{"type":11,"tag":85,"props":10809,"children":10810},{},[10811],{"type":11,"tag":25,"props":10812,"children":10814},{"href":10813},"app\u002Fcomponents\u002FTuxChartBar.vue",[10815],{"type":11,"tag":68,"props":10816,"children":10818},{"className":10817},[],[10819],{"type":17,"value":643},{"type":17,"value":10821}," — second\nPriority B chart, sibling to TuxChartLine. Native SVG; vertical\n(default) + horizontal orientations; single \u002F grouped \u002F stacked\nvariants; optional comparison overlay (Snow \"Projections vs\nActuals\" pattern); value labels above-bar or in-bar; auto SR\nsummary. Follows ",{"type":11,"tag":68,"props":10823,"children":10825},{"className":10824},[],[10826],{"type":17,"value":175},{"type":17,"value":10828}," doctrine.",{"type":11,"tag":19,"props":10830,"children":10831},{},[10832],{"type":11,"tag":85,"props":10833,"children":10834},{},[10835],{"type":17,"value":10836},"New doc:",{"type":11,"tag":77,"props":10838,"children":10839},{},[10840],{"type":11,"tag":81,"props":10841,"children":10842},{},[10843,10855,10857,10862,10864,10869,10871,10877,10879,10884],{"type":11,"tag":85,"props":10844,"children":10845},{},[10846],{"type":11,"tag":25,"props":10847,"children":10849},{"href":10848},"design\u002Ftauri-bindings.md",[10850],{"type":11,"tag":68,"props":10851,"children":10853},{"className":10852},[],[10854],{"type":17,"value":10848},{"type":17,"value":10856}," —\ncompanion to platform-awareness. Enumerates which TUX components\ncall which Tauri APIs (window controls in ",{"type":11,"tag":68,"props":10858,"children":10860},{"className":10859},[],[10861],{"type":17,"value":7363},{"type":17,"value":10863},", share\nsheet in ",{"type":11,"tag":68,"props":10865,"children":10867},{"className":10866},[],[10868],{"type":17,"value":8093},{"type":17,"value":10870},", file dialog in ",{"type":11,"tag":68,"props":10872,"children":10874},{"className":10873},[],[10875],{"type":17,"value":10876},"TuxCodeBlock",{"type":17,"value":10878},",\nnotifications in ",{"type":11,"tag":68,"props":10880,"children":10882},{"className":10881},[],[10883],{"type":17,"value":4500},{"type":17,"value":10885},"), the web fallback for each, and\na capability allowlist template for consumer Tauri shells.",{"type":11,"tag":19,"props":10887,"children":10888},{},[10889,10894,10895,10901,10902,10908],{"type":11,"tag":85,"props":10890,"children":10891},{},[10892],{"type":17,"value":10893},"Showcase routes:",{"type":17,"value":996},{"type":11,"tag":68,"props":10896,"children":10898},{"className":10897},[],[10899],{"type":17,"value":10900},"\u002Fcomponents\u002F{split-pane, app-switcher}",{"type":17,"value":2738},{"type":11,"tag":68,"props":10903,"children":10905},{"className":10904},[],[10906],{"type":17,"value":10907},"\u002Fvisualizations\u002Fchart-bar",{"type":17,"value":10909}," — full 6-step shipping discipline\n(routes, nav, index cards, components.md rows, roadmap struck\nthrough).",{"type":11,"tag":56,"props":10911,"children":10913},{"id":10912},"added-platform-aware-tauri-build-sprint-2026-05-22",[10914],{"type":17,"value":10915},"Added — platform-aware Tauri build sprint (2026-05-22)",{"type":11,"tag":19,"props":10917,"children":10918},{},[10919,10921,10926],{"type":17,"value":10920},"Doctrine + 8 components + 2 composables + 1 CSS utility + safe-area\nsupport landed in a single sprint. TUX shifted from web-only to\n",{"type":11,"tag":85,"props":10922,"children":10923},{},[10924],{"type":17,"value":10925},"Tauri desktop shells on Windows \u002F macOS \u002F Linux",{"type":17,"value":10927}," plus future\nTauri Mobile (iOS \u002F Android), which made the previously-skipped\nApple \u002F Material \u002F Windows Figma kits legitimately useful.",{"type":11,"tag":19,"props":10929,"children":10930},{},[10931],{"type":11,"tag":85,"props":10932,"children":10933},{},[10934],{"type":17,"value":10935},"Doctrine (grounds everything else):",{"type":11,"tag":77,"props":10937,"children":10938},{},[10939],{"type":11,"tag":81,"props":10940,"children":10941},{},[10942,10953],{"type":11,"tag":85,"props":10943,"children":10944},{},[10945],{"type":11,"tag":25,"props":10946,"children":10947},{"href":7385},[10948],{"type":11,"tag":68,"props":10949,"children":10951},{"className":10950},[],[10952],{"type":17,"value":7385},{"type":17,"value":10954}," —\n\"TUX is one component tree, platform-adaptive at the chrome layer.\"\nTwo-layer mental model (brand invariant, chrome adapts). 8\ndimensions of variation (window controls, scrollbar, modifier keys,\nfonts, drag regions, menu bar, accent, share\u002Ffile\u002Fnotification\nAPIs). Held 5 visual-language rejections: Liquid Glass as surface,\nMica wholesale, Material tonal palette, elevation-as-color, SF\nSymbols icon family.",{"type":11,"tag":19,"props":10956,"children":10957},{},[10958],{"type":11,"tag":85,"props":10959,"children":10960},{},[10961],{"type":17,"value":10962},"Foundations:",{"type":11,"tag":77,"props":10964,"children":10965},{},[10966,10999,11030],{"type":11,"tag":81,"props":10967,"children":10968},{},[10969,10981,10983],{"type":11,"tag":85,"props":10970,"children":10971},{},[10972],{"type":11,"tag":25,"props":10973,"children":10975},{"href":10974},"app\u002Fcomposables\u002FuseTuxPlatform.ts",[10976],{"type":11,"tag":68,"props":10977,"children":10979},{"className":10978},[],[10980],{"type":17,"value":7377},{"type":17,"value":10982}," —\nmodule-singleton composable that detects host OS + Tauri runtime\n",{"type":11,"tag":77,"props":10984,"children":10985},{},[10986],{"type":11,"tag":81,"props":10987,"children":10988},{},[10989,10991,10997],{"type":17,"value":10990},"primary modifier + system accent post-hydration. Sets\n",{"type":11,"tag":68,"props":10992,"children":10994},{"className":10993},[],[10995],{"type":17,"value":10996},"document.documentElement.dataset.platform",{"type":17,"value":10998}," so CSS branches without\neach component asking JS. SSR-safe defaults.",{"type":11,"tag":81,"props":11000,"children":11001},{},[11002,11014,11016,11021,11023,11029],{"type":11,"tag":85,"props":11003,"children":11004},{},[11005],{"type":11,"tag":25,"props":11006,"children":11008},{"href":11007},"app\u002Fassets\u002Fcss\u002Ftux-scrollbar.css",[11009],{"type":11,"tag":68,"props":11010,"children":11012},{"className":11011},[],[11013],{"type":17,"value":11007},{"type":17,"value":11015}," —\nper-platform scrollbar styling auto-imported via ",{"type":11,"tag":68,"props":11017,"children":11019},{"className":11018},[],[11020],{"type":17,"value":9954},{"type":17,"value":11022},".\nMac overlay auto-hide, Win11 persistent slim (12px), Linux defers\nto GTK\u002FQt, web fallback. Recipes lifted from the scrollbar-kit\nabsorption. Opt-out via ",{"type":11,"tag":68,"props":11024,"children":11026},{"className":11025},[],[11027],{"type":17,"value":11028},".tux-scrollbar-default",{"type":17,"value":43},{"type":11,"tag":81,"props":11031,"children":11032},{},[11033,11038,11039,11045,11046,11052,11054,11060],{"type":11,"tag":85,"props":11034,"children":11035},{},[11036],{"type":17,"value":11037},"Safe-area-inset CSS",{"type":17,"value":4849},{"type":11,"tag":68,"props":11040,"children":11042},{"className":11041},[],[11043],{"type":17,"value":11044},"app\u002Flayouts\u002Fdefault.vue",{"type":17,"value":2738},{"type":11,"tag":68,"props":11047,"children":11049},{"className":11048},[],[11050],{"type":17,"value":11051},"app\u002Flayouts\u002Fsidebar.vue",{"type":17,"value":11053},". Honors ",{"type":11,"tag":68,"props":11055,"children":11057},{"className":11056},[],[11058],{"type":17,"value":11059},"env(safe-area-inset-*)",{"type":17,"value":11061}," so\nTauri Mobile builds get notch \u002F home-indicator \u002F gesture-nav\nclearance. Zero cost on desktop \u002F web.",{"type":11,"tag":19,"props":11063,"children":11064},{},[11065],{"type":11,"tag":85,"props":11066,"children":11067},{},[11068],{"type":17,"value":11069},"Chrome components (desktop \u002F app-shell):",{"type":11,"tag":77,"props":11071,"children":11072},{},[11073,11112,11129,11155],{"type":11,"tag":81,"props":11074,"children":11075},{},[11076,11088,11090,11096,11097,11103,11104,11110],{"type":11,"tag":85,"props":11077,"children":11078},{},[11079],{"type":11,"tag":25,"props":11080,"children":11082},{"href":11081},"app\u002Fcomponents\u002FTuxAppFrame.vue",[11083],{"type":11,"tag":68,"props":11084,"children":11086},{"className":11085},[],[11087],{"type":17,"value":7363},{"type":17,"value":11089}," — custom Tauri\ntitlebar with platform-correct controls. Mac: traffic lights\ntop-left + title-toolbar unification. Win11: min\u002Fmax\u002Fclose\ntop-right with native snap-layouts. Linux: close-only fallback.\nSlots: ",{"type":11,"tag":68,"props":11091,"children":11093},{"className":11092},[],[11094],{"type":17,"value":11095},"#left",{"type":17,"value":875},{"type":11,"tag":68,"props":11098,"children":11100},{"className":11099},[],[11101],{"type":17,"value":11102},"#center",{"type":17,"value":875},{"type":11,"tag":68,"props":11105,"children":11107},{"className":11106},[],[11108],{"type":17,"value":11109},"#right",{"type":17,"value":11111},". Drag regions marked.",{"type":11,"tag":81,"props":11113,"children":11114},{},[11115,11127],{"type":11,"tag":85,"props":11116,"children":11117},{},[11118],{"type":11,"tag":25,"props":11119,"children":11121},{"href":11120},"app\u002Fcomponents\u002FTuxFocusView.vue",[11122],{"type":11,"tag":68,"props":11123,"children":11125},{"className":11124},[],[11126],{"type":17,"value":4217},{"type":17,"value":11128}," — full-\nviewport overlay for inspecting one piece of content (a chart, a\nrecord). Back + title + actions chrome above a content slot. Esc +\nbackdrop dismiss; focus trap; reduced-motion respected. Absorbed\nfrom Teams Stage view \u002F Lightbox view.",{"type":11,"tag":81,"props":11130,"children":11131},{},[11132,11145,11147,11153],{"type":11,"tag":85,"props":11133,"children":11134},{},[11135],{"type":11,"tag":25,"props":11136,"children":11138},{"href":11137},"app\u002Fcomponents\u002FTuxMenuBar.vue",[11139],{"type":11,"tag":68,"props":11140,"children":11142},{"className":11141},[],[11143],{"type":17,"value":11144},"TuxMenuBar",{"type":17,"value":11146}," — in-window\nFile \u002F Edit \u002F View \u002F Help strip for Win \u002F Linux. Composes\n",{"type":11,"tag":68,"props":11148,"children":11150},{"className":11149},[],[11151],{"type":17,"value":11152},"UDropdownMenu",{"type":17,"value":11154},". Skipped on Mac (system menu wins).",{"type":11,"tag":81,"props":11156,"children":11157},{},[11158,11171],{"type":11,"tag":85,"props":11159,"children":11160},{},[11161],{"type":11,"tag":25,"props":11162,"children":11164},{"href":11163},"app\u002Fcomponents\u002FTuxSplashScreen.vue",[11165],{"type":11,"tag":68,"props":11166,"children":11168},{"className":11167},[],[11169],{"type":17,"value":11170},"TuxSplashScreen",{"type":17,"value":11172}," —\nbranded app-launch overlay. Brand mark + maroon hairline + status.\nBridges Tauri window-show → Vue hydrate gap.",{"type":11,"tag":19,"props":11174,"children":11175},{},[11176],{"type":11,"tag":85,"props":11177,"children":11178},{},[11179],{"type":17,"value":11180},"Mobile components (Tauri Mobile target):",{"type":11,"tag":77,"props":11182,"children":11183},{},[11184,11208],{"type":11,"tag":81,"props":11185,"children":11186},{},[11187,11199,11201,11206],{"type":11,"tag":85,"props":11188,"children":11189},{},[11190],{"type":11,"tag":25,"props":11191,"children":11193},{"href":11192},"app\u002Fcomponents\u002FTuxTabBar.vue",[11194],{"type":11,"tag":68,"props":11195,"children":11197},{"className":11196},[],[11198],{"type":17,"value":7370},{"type":17,"value":11200}," — bottom-anchored\n3-5 tab nav. Icon + label + ",{"type":11,"tag":85,"props":11202,"children":11203},{},[11204],{"type":17,"value":11205},"maroon top-edge active rule",{"type":17,"value":11207}," (TUX\nsignature). Safe-area-inset honored. 44px min tap target.",{"type":11,"tag":81,"props":11209,"children":11210},{},[11211,11224],{"type":11,"tag":85,"props":11212,"children":11213},{},[11214],{"type":11,"tag":25,"props":11215,"children":11217},{"href":11216},"app\u002Fcomponents\u002FTuxFAB.vue",[11218],{"type":11,"tag":68,"props":11219,"children":11221},{"className":11220},[],[11222],{"type":17,"value":11223},"TuxFAB",{"type":17,"value":11225}," — Floating Action Button\nfor the single \"compose new\" action per screen. Icon-only circle\n(56 \u002F 40px) or extended pill with label.",{"type":11,"tag":19,"props":11227,"children":11228},{},[11229],{"type":11,"tag":85,"props":11230,"children":11231},{},[11232],{"type":17,"value":11233},"Composables:",{"type":11,"tag":77,"props":11235,"children":11236},{},[11237,11255],{"type":11,"tag":81,"props":11238,"children":11239},{},[11240,11253],{"type":11,"tag":85,"props":11241,"children":11242},{},[11243],{"type":11,"tag":25,"props":11244,"children":11246},{"href":11245},"app\u002Fcomposables\u002FuseTuxSwipe.ts",[11247],{"type":11,"tag":68,"props":11248,"children":11250},{"className":11249},[],[11251],{"type":17,"value":11252},"useTuxSwipe",{"type":17,"value":11254}," — pointer \u002F\ntouch swipe detection with directional callbacks. Accessibility\nrule: any swipe action MUST have a visible alternative.",{"type":11,"tag":81,"props":11256,"children":11257},{},[11258,11271,11273,11278],{"type":11,"tag":85,"props":11259,"children":11260},{},[11261],{"type":11,"tag":25,"props":11262,"children":11264},{"href":11263},"app\u002Fcomposables\u002FuseTuxRipple.ts",[11265],{"type":11,"tag":68,"props":11266,"children":11268},{"className":11267},[],[11269],{"type":17,"value":11270},"useTuxRipple",{"type":17,"value":11272}," — Material-\nstyle tap-feedback ripple. Opt-in only. Honors\n",{"type":11,"tag":68,"props":11274,"children":11276},{"className":11275},[],[11277],{"type":17,"value":8199},{"type":17,"value":43},{"type":11,"tag":19,"props":11280,"children":11281},{},[11282],{"type":11,"tag":85,"props":11283,"children":11284},{},[11285],{"type":17,"value":11286},"Enhancements:",{"type":11,"tag":77,"props":11288,"children":11289},{},[11290,11331],{"type":11,"tag":81,"props":11291,"children":11292},{},[11293,11306,11308,11313,11315,11321,11323,11329],{"type":11,"tag":85,"props":11294,"children":11295},{},[11296],{"type":11,"tag":25,"props":11297,"children":11299},{"href":11298},"app\u002Fcomponents\u002FTuxKbd.vue",[11300],{"type":11,"tag":68,"props":11301,"children":11303},{"className":11302},[],[11304],{"type":17,"value":11305},"TuxKbd",{"type":17,"value":11307}," — reads from\n",{"type":11,"tag":68,"props":11309,"children":11311},{"className":11310},[],[11312],{"type":17,"value":7377},{"type":17,"value":11314}," instead of inline navigator-platform sniff.\nRenders ",{"type":11,"tag":68,"props":11316,"children":11318},{"className":11317},[],[11319],{"type":17,"value":11320},"Super",{"type":17,"value":11322}," on Linux + ",{"type":11,"tag":68,"props":11324,"children":11326},{"className":11325},[],[11327],{"type":17,"value":11328},"Win",{"type":17,"value":11330}," on Windows. Three platform symbol\ntables.",{"type":11,"tag":81,"props":11332,"children":11333},{},[11334,11347,11349,11355,11357,11363],{"type":11,"tag":85,"props":11335,"children":11336},{},[11337],{"type":11,"tag":25,"props":11338,"children":11340},{"href":11339},"app\u002Fcomponents\u002FTuxModal.vue",[11341],{"type":11,"tag":68,"props":11342,"children":11344},{"className":11343},[],[11345],{"type":17,"value":11346},"TuxModal",{"type":17,"value":11348}," — adds ",{"type":11,"tag":68,"props":11350,"children":11352},{"className":11351},[],[11353],{"type":17,"value":11354},"size",{"type":17,"value":11356}," prop\n(sm → 3xl) + ",{"type":11,"tag":68,"props":11358,"children":11360},{"className":11359},[],[11361],{"type":17,"value":11362},"variant: 'standard' | 'sheet' | 'auto'",{"type":17,"value":11364},". Sheet\nvariant is bottom-anchored with drag-handle pill (iOS \u002F Material 3\nmobile pattern). Auto picks sheet on iOS \u002F Android.",{"type":11,"tag":19,"props":11366,"children":11367},{},[11368,11373,11375,11381],{"type":11,"tag":85,"props":11369,"children":11370},{},[11371],{"type":17,"value":11372},"Showcase routes",{"type":17,"value":11374}," (full 6-step ship discipline):\n",{"type":11,"tag":68,"props":11376,"children":11378},{"className":11377},[],[11379],{"type":17,"value":11380},"\u002Fcomponents\u002F{app-frame, focus-view, menu-bar, splash-screen, tab-bar, fab, swipe, ripple}",{"type":17,"value":11382}," — all 8 added to app.vue nav,\ncomponents index cards, design\u002Fcomponents.md rows.",{"type":11,"tag":56,"props":11384,"children":11386},{"id":11385},"platform-aware-figma-absorption-sweep-2026-05-22",[11387],{"type":17,"value":11388},"Platform-aware Figma absorption sweep (2026-05-22)",{"type":11,"tag":19,"props":11390,"children":11391},{},[11392],{"type":17,"value":11393},"The doctrine pass was preceded by a 13-file absorption sweep across\nApple \u002F Google \u002F Windows \u002F cross-platform utility kits (Windows UI\nkit re-read with new lens, macOS 26 Tahoe, iOS 26 Liquid Glass, iOS+\niPadOS 26, macOS Browser, visionOS 26, Apple Widgets, SF Symbol\nCreator, Material 3, Android UI Kit, 50 Mobile Bottom Nav, Tailwind\nHeadless UI Animations, Scrollbar Kit MacOS & Windows, UI Prep Layout\nGrids). 0 new components from absorption alone; recipes + roadmap\ncandidates captured in per-file NOTES.md. 43\u002F70 absorbed total.",{"type":11,"tag":56,"props":11395,"children":11397},{"id":11396},"medium-signal-absorption-sweep-2026-05-22",[11398],{"type":17,"value":11399},"Medium-signal absorption sweep (2026-05-22)",{"type":11,"tag":19,"props":11401,"children":11402},{},[11403],{"type":17,"value":11404},"14 files cleared from the original medium bucket: 7 single-pattern\n(Calendar, Interactive Dropdown ×2, Progress Bar, Order list,\nDashboard ×2) and 7 Microsoft-suite (M365, Fabric ×3, Store, Teams,\nSharePoint). 0 new components; 3 future-component candidates noted\n(TuxSplitPane, TuxAppSwitcher, TuxFocusView — the last shipped this\nsprint).",{"type":11,"tag":19,"props":11406,"children":11407},{},[11408,11410,11420,11422,11428],{"type":17,"value":11409},"A multi-day absorption pass over the Figma project's high-signal\nreference systems (shadcn_ui Jan 2026, Vercel AI Elements, Primer Web,\nMicrosoft Fluent 2 Web, plus the Windows UI kit and Aggie UX). Most\nfindings confirmed TUX's architecture; the rest landed as new\ncomponents, a layout, build-pipeline additions, and one infrastructure\nfix. Triage + per-file findings live under\n",{"type":11,"tag":25,"props":11411,"children":11413},{"href":11412},"reference\u002Ffigma-cache",[11414],{"type":11,"tag":68,"props":11415,"children":11417},{"className":11416},[],[11418],{"type":17,"value":11419},"reference\u002Ffigma-cache\u002F",{"type":17,"value":11421},"; each ",{"type":11,"tag":68,"props":11423,"children":11425},{"className":11424},[],[11426],{"type":17,"value":11427},"NOTES.md",{"type":17,"value":11429},"\nrecords what was absorbed vs skipped vs deliberately deferred.",{"type":11,"tag":19,"props":11431,"children":11432},{},[11433,11435,11440,11442,11447,11448,11453],{"type":17,"value":11434},"A follow-up medium-signal pass on 2026-05-21 absorbed five more files\n(Charts UI Kit, Data Visualization Graphs \u002F Charts Kit, Data Table\ndesign components, Snow Dashboard UI Kit, Empty State Illustration\nKit) — 0 new components, audit-only by design. Findings rolled into\nroadmap carry-forwards (",{"type":11,"tag":68,"props":11436,"children":11438},{"className":11437},[],[11439],{"type":17,"value":8483},{"type":17,"value":11441},") and one doctrine\naddition to ",{"type":11,"tag":68,"props":11443,"children":11445},{"className":11444},[],[11446],{"type":17,"value":10769},{"type":17,"value":875},{"type":11,"tag":68,"props":11449,"children":11451},{"className":11450},[],[11452],{"type":17,"value":8060},{"type":17,"value":11454}," (\"no decorative\nillustrations\").",{"type":11,"tag":19,"props":11456,"children":11457},{},[11458,11460,11465,11467],{"type":17,"value":11459},"A subsequent AI-studio chat-surface cluster pass on 2026-05-21 absorbed\nfour more files (Chat UI kit, Chat Input Box, ChatGPT UI Kit, MCP Apps\nfor Claude). Net new: ",{"type":11,"tag":85,"props":11461,"children":11462},{},[11463],{"type":17,"value":11464},"0 components shipped",{"type":17,"value":11466},". The chat surface was\nalready saturated by the Vercel AI Elements pack + Fluent 2 + Primer\nwork. Most absorption value was confirming ",{"type":11,"tag":68,"props":11468,"children":11470},{"className":11469},[],[11471],{"type":17,"value":11472},"TuxComposer #toolbar-extra",{"type":11,"tag":77,"props":11474,"children":11475},{},[11476],{"type":11,"tag":81,"props":11477,"children":11478},{},[11479,11485,11487,11492,11493,11498,11500,11506],{"type":11,"tag":68,"props":11480,"children":11482},{"className":11481},[],[11483],{"type":17,"value":11484},"TuxChatMessage #header-trailing",{"type":17,"value":11486}," cover the canonical shapes; the\nexception was Anthropic's MCP Apps kit which mapped a three-tier\ndisplay taxonomy (inline card → inline carousel → full screen) that\nwill guide a future ",{"type":11,"tag":68,"props":11488,"children":11490},{"className":11489},[],[11491],{"type":17,"value":7013},{"type":17,"value":912},{"type":11,"tag":68,"props":11494,"children":11496},{"className":11495},[],[11497],{"type":17,"value":6652},{"type":17,"value":11499}," build when\ntti-ai-studio integrates MCP tool output. Findings + carry-forwards\nin ",{"type":11,"tag":68,"props":11501,"children":11503},{"className":11502},[],[11504],{"type":17,"value":11505},"reference\u002Ffigma-cache\u002Fmcp-apps-for-claude\u002FNOTES.md",{"type":17,"value":11507}," and the\nroadmap.",{"type":11,"tag":56,"props":11509,"children":11511},{"id":11510},"added-roadmap-clear-small-wrappers-pagination-first-chart-a11y-docs-2026-05-21",[11512],{"type":17,"value":11513},"Added — roadmap clear: small wrappers + pagination + first chart + a11y docs (2026-05-21)",{"type":11,"tag":19,"props":11515,"children":11516},{},[11517,11519,11524],{"type":17,"value":11518},"Big batch closing the Priority B\u002FC\u002FD items already on the roadmap\nbefore this session started. Net new: ",{"type":11,"tag":85,"props":11520,"children":11521},{},[11522],{"type":17,"value":11523},"8 components shipped + 4\naccessibility doc pages + TuxTOC wiring + TuxStatComparison demo\non research-landing",{"type":17,"value":11525},". Lint clean throughout.",{"type":11,"tag":19,"props":11527,"children":11528},{},[11529],{"type":11,"tag":85,"props":11530,"children":11531},{},[11532],{"type":17,"value":11533},"Easy wrappers (Nuxt UI primitives + TUX chrome):",{"type":11,"tag":77,"props":11535,"children":11536},{},[11537,11593],{"type":11,"tag":81,"props":11538,"children":11539},{},[11540,11552,11554,11560,11562,11568,11570,11576,11578,11584,11585,11591],{"type":11,"tag":85,"props":11541,"children":11542},{},[11543],{"type":11,"tag":25,"props":11544,"children":11546},{"href":11545},"app\u002Fcomponents\u002FTuxTabs.vue",[11547],{"type":11,"tag":68,"props":11548,"children":11550},{"className":11549},[],[11551],{"type":17,"value":2249},{"type":17,"value":11553}," — wraps ",{"type":11,"tag":68,"props":11555,"children":11557},{"className":11556},[],[11558],{"type":17,"value":11559},"UTabs",{"type":17,"value":11561},". 2px\nmaroon active underline replaces the default accent. ",{"type":11,"tag":68,"props":11563,"children":11565},{"className":11564},[],[11566],{"type":17,"value":11567},"intent=\"bold\"",{"type":17,"value":11569},"\nswaps to uppercase tracked labels for eyebrow-rhythm contexts.\n",{"type":11,"tag":68,"props":11571,"children":11573},{"className":11572},[],[11574],{"type":17,"value":11575},"orientation=\"vertical\"",{"type":17,"value":11577}," covers settings panels. Closes both\n",{"type":11,"tag":68,"props":11579,"children":11581},{"className":11580},[],[11582],{"type":17,"value":11583},"TuxTabsHorizontal",{"type":17,"value":103},{"type":11,"tag":68,"props":11586,"children":11588},{"className":11587},[],[11589],{"type":17,"value":11590},"TuxTabsVertical",{"type":17,"value":11592}," roadmap entries (one\ncomponent, prop covers both).",{"type":11,"tag":81,"props":11594,"children":11595},{},[11596,11608,11609,11615,11617,11623,11625,11631,11633,11638],{"type":11,"tag":85,"props":11597,"children":11598},{},[11599],{"type":11,"tag":25,"props":11600,"children":11602},{"href":11601},"app\u002Fcomponents\u002FTuxTooltip.vue",[11603],{"type":11,"tag":68,"props":11604,"children":11606},{"className":11605},[],[11607],{"type":17,"value":8371},{"type":17,"value":11553},{"type":11,"tag":68,"props":11610,"children":11612},{"className":11611},[],[11613],{"type":17,"value":11614},"UTooltip",{"type":17,"value":11616},".\nOptional title + hairline rule; tuned max-width (~22ch); shortcut\nglyphs via ",{"type":11,"tag":68,"props":11618,"children":11620},{"className":11619},[],[11621],{"type":17,"value":11622},"kbds",{"type":17,"value":11624},". For richer panels, consumers use\n",{"type":11,"tag":68,"props":11626,"children":11628},{"className":11627},[],[11629],{"type":17,"value":11630},"TuxTeachingPopover",{"type":17,"value":11632}," (onboarding) or ",{"type":11,"tag":68,"props":11634,"children":11636},{"className":11635},[],[11637],{"type":17,"value":8278},{"type":17,"value":11639}," directly.",{"type":11,"tag":19,"props":11641,"children":11642},{},[11643],{"type":11,"tag":85,"props":11644,"children":11645},{},[11646],{"type":17,"value":11647},"Pagination + result-display family:",{"type":11,"tag":77,"props":11649,"children":11650},{},[11651,11684,11710],{"type":11,"tag":81,"props":11652,"children":11653},{},[11654,11667,11669],{"type":11,"tag":85,"props":11655,"children":11656},{},[11657],{"type":11,"tag":25,"props":11658,"children":11660},{"href":11659},"app\u002Fcomponents\u002FTuxResultCount.vue",[11661],{"type":11,"tag":68,"props":11662,"children":11664},{"className":11663},[],[11665],{"type":17,"value":11666},"TuxResultCount",{"type":17,"value":11668}," —\n\"Showing 1–24 of 412 corridors · 24 per page.\" v-model bound page\n",{"type":11,"tag":77,"props":11670,"children":11671},{},[11672],{"type":11,"tag":81,"props":11673,"children":11674},{},[11675,11677,11683],{"type":17,"value":11676},"pageSize; page-size picker auto-snaps to page 1 on change. Naive\npluralization with ",{"type":11,"tag":68,"props":11678,"children":11680},{"className":11679},[],[11681],{"type":17,"value":11682},"nounPlural",{"type":17,"value":4833},{"type":11,"tag":81,"props":11685,"children":11686},{},[11687,11700,11702,11708],{"type":11,"tag":85,"props":11688,"children":11689},{},[11690],{"type":11,"tag":25,"props":11691,"children":11693},{"href":11692},"app\u002Fcomponents\u002FTuxLoadMore.vue",[11694],{"type":11,"tag":68,"props":11695,"children":11697},{"className":11696},[],[11698],{"type":17,"value":11699},"TuxLoadMore",{"type":17,"value":11701}," — explicit\nbutton with remaining count below + terminal divider on completion\n(",{"type":11,"tag":68,"props":11703,"children":11705},{"className":11704},[],[11706],{"type":17,"value":11707},"loaded >= total",{"type":17,"value":11709},"). SEO-friendly middle ground between paginated\nand infinite.",{"type":11,"tag":81,"props":11711,"children":11712},{},[11713,11726,11728,11733,11735,11741],{"type":11,"tag":85,"props":11714,"children":11715},{},[11716],{"type":11,"tag":25,"props":11717,"children":11719},{"href":11718},"app\u002Fcomponents\u002FTuxInfiniteScroll.vue",[11720],{"type":11,"tag":68,"props":11721,"children":11723},{"className":11722},[],[11724],{"type":17,"value":11725},"TuxInfiniteScroll",{"type":17,"value":11727}," —\nIntersectionObserver sentinel with throttled emit + loading state.\nHonors ",{"type":11,"tag":68,"props":11729,"children":11731},{"className":11730},[],[11732],{"type":17,"value":8199},{"type":17,"value":11734}," automatically (renders explicit\nbutton instead of auto-fetching); ",{"type":11,"tag":68,"props":11736,"children":11738},{"className":11737},[],[11739],{"type":17,"value":11740},"keyboardFallback",{"type":17,"value":11742}," prop forces\nthe button on for accessibility-critical surfaces.",{"type":11,"tag":19,"props":11744,"children":11745},{},[11746],{"type":11,"tag":85,"props":11747,"children":11748},{},[11749],{"type":17,"value":11750},"Feedback + comparison:",{"type":11,"tag":77,"props":11752,"children":11753},{},[11754,11779],{"type":11,"tag":81,"props":11755,"children":11756},{},[11757,11769,11771,11777],{"type":11,"tag":85,"props":11758,"children":11759},{},[11760],{"type":11,"tag":25,"props":11761,"children":11763},{"href":11762},"app\u002Fcomponents\u002FTuxReactionBar.vue",[11764],{"type":11,"tag":68,"props":11765,"children":11767},{"className":11766},[],[11768],{"type":17,"value":8497},{"type":17,"value":11770}," —\nlight-touch acknowledgement strip. Default trio (helpful · question\n· disagree) with full configurability via ",{"type":11,"tag":68,"props":11772,"children":11774},{"className":11773},[],[11775],{"type":17,"value":11776},"reactions",{"type":17,"value":11778}," prop. Counts\ndisplay-only; v-modeled active reactions. Two sizes (sm \u002F md).",{"type":11,"tag":81,"props":11780,"children":11781},{},[11782,11794,11796,11802],{"type":11,"tag":85,"props":11783,"children":11784},{},[11785],{"type":11,"tag":25,"props":11786,"children":11788},{"href":11787},"app\u002Fcomponents\u002FTuxStatComparison.vue",[11789],{"type":11,"tag":68,"props":11790,"children":11792},{"className":11791},[],[11793],{"type":17,"value":2503},{"type":17,"value":11795}," —\nbefore\u002Fafter stat block with delta + tone. Three polarities\n(direct \u002F invert \u002F neutral) for metrics where down-is-good (latency,\nerror rate). Three layouts (row \u002F stack \u002F inline). Demonstrated\nalongside the existing factoid row in ",{"type":11,"tag":68,"props":11797,"children":11799},{"className":11798},[],[11800],{"type":17,"value":11801},"\u002Fexamples\u002Fresearch-landing",{"type":17,"value":43},{"type":11,"tag":19,"props":11804,"children":11805},{},[11806],{"type":11,"tag":85,"props":11807,"children":11808},{},[11809],{"type":17,"value":11810},"First Priority B chart:",{"type":11,"tag":77,"props":11812,"children":11813},{},[11814],{"type":11,"tag":81,"props":11815,"children":11816},{},[11817,11829,11831,11837,11839,11845,11847,11856,11858,11863],{"type":11,"tag":85,"props":11818,"children":11819},{},[11820],{"type":11,"tag":25,"props":11821,"children":11823},{"href":11822},"app\u002Fcomponents\u002FTuxChartLine.vue",[11824],{"type":11,"tag":68,"props":11825,"children":11827},{"className":11826},[],[11828],{"type":17,"value":627},{"type":17,"value":11830}," (~520 LOC) —\nnative SVG line chart following the chart-foundations doctrine.\nEnd-of-line value labels colored to series (default, not opt-in —\nthe accessibility win flagged by the Data Viz Graphs absorption).\nOptional ",{"type":11,"tag":68,"props":11832,"children":11834},{"className":11833},[],[11835],{"type":17,"value":11836},"series[].previous",{"type":17,"value":11838}," for dashed prior-period overlay,\noptional ",{"type":11,"tag":68,"props":11840,"children":11842},{"className":11841},[],[11843],{"type":17,"value":11844},"series[].band",{"type":17,"value":11846}," for confidence bands, optional markers,\nauto-derived screen-reader summary. Showcase at\n",{"type":11,"tag":25,"props":11848,"children":11850},{"href":11849},"app\u002Fpages\u002Fvisualizations\u002Fchart-line.vue",[11851],{"type":11,"tag":68,"props":11852,"children":11854},{"className":11853},[],[11855],{"type":17,"value":10458},{"type":17,"value":11857},"\nwith five examples including a ",{"type":11,"tag":68,"props":11859,"children":11861},{"className":11860},[],[11862],{"type":17,"value":10580},{"type":17,"value":11864},"-wrapped editorial\nvariant.",{"type":11,"tag":19,"props":11866,"children":11867},{},[11868],{"type":11,"tag":85,"props":11869,"children":11870},{},[11871],{"type":17,"value":11872},"Accessibility documentation (4 pages):",{"type":11,"tag":77,"props":11874,"children":11875},{},[11876,11889,11902,11917],{"type":11,"tag":81,"props":11877,"children":11878},{},[11879],{"type":11,"tag":25,"props":11880,"children":11882},{"href":11881},"app\u002Fpages\u002Faccessibility\u002Fskip-to-content.vue",[11883],{"type":11,"tag":68,"props":11884,"children":11886},{"className":11885},[],[11887],{"type":17,"value":11888},"\u002Faccessibility\u002Fskip-to-content",{"type":11,"tag":81,"props":11890,"children":11891},{},[11892],{"type":11,"tag":25,"props":11893,"children":11895},{"href":11894},"app\u002Fpages\u002Faccessibility\u002Ffocus-model.vue",[11896],{"type":11,"tag":68,"props":11897,"children":11899},{"className":11898},[],[11900],{"type":17,"value":11901},"\u002Faccessibility\u002Ffocus-model",{"type":11,"tag":81,"props":11903,"children":11904},{},[11905,11915],{"type":11,"tag":25,"props":11906,"children":11908},{"href":11907},"app\u002Fpages\u002Faccessibility\u002Fcontrast-matrix.vue",[11909],{"type":11,"tag":68,"props":11910,"children":11912},{"className":11911},[],[11913],{"type":17,"value":11914},"\u002Faccessibility\u002Fcontrast-matrix",{"type":17,"value":11916},"\n— USWDS-style top-10 token-pair summary with per-theme ratios",{"type":11,"tag":81,"props":11918,"children":11919},{},[11920,11930],{"type":11,"tag":25,"props":11921,"children":11923},{"href":11922},"app\u002Fpages\u002Faccessibility\u002Fbreakpoints.vue",[11924],{"type":11,"tag":68,"props":11925,"children":11927},{"className":11926},[],[11928],{"type":17,"value":11929},"\u002Faccessibility\u002Fbreakpoints",{"type":17,"value":11931},"\n— six-breakpoint scale + container-query preference + 200% zoom",{"type":11,"tag":19,"props":11933,"children":11934},{},[11935,11937,11943,11945,11951],{"type":17,"value":11936},"Existing ",{"type":11,"tag":68,"props":11938,"children":11940},{"className":11939},[],[11941],{"type":17,"value":11942},"accessibility.vue",{"type":17,"value":11944}," moved to ",{"type":11,"tag":68,"props":11946,"children":11948},{"className":11947},[],[11949],{"type":17,"value":11950},"accessibility\u002Findex.vue",{"type":17,"value":11952}," with\na new \"deep-dive references\" section linking to all four sub-pages\nvia TuxCard tiles.",{"type":11,"tag":19,"props":11954,"children":11955},{},[11956],{"type":11,"tag":85,"props":11957,"children":11958},{},[11959],{"type":17,"value":11960},"Polish queue items:",{"type":11,"tag":77,"props":11962,"children":11963},{},[11964,11997],{"type":11,"tag":81,"props":11965,"children":11966},{},[11967,11980,11981,11987,11989,11995],{"type":11,"tag":85,"props":11968,"children":11969},{},[11970,11972,11978],{"type":17,"value":11971},"TuxTOC wired into TuxReportWebFrame ",{"type":11,"tag":68,"props":11973,"children":11975},{"className":11974},[],[11976],{"type":17,"value":11977},"#toc",{"type":17,"value":11979}," slot",{"type":17,"value":8817},{"type":11,"tag":68,"props":11982,"children":11984},{"className":11983},[],[11985],{"type":17,"value":11986},"\u002Freports\u002Fweb-frame",{"type":17,"value":11988}," showcase. Uses TuxTOC's auto-detect (scans\nh2\u002Fh3 in the article) so the IntersectionObserver scroll-spy\nworks without rebuilding the items array. The fallback (plain\nanchor list from the frame's ",{"type":11,"tag":68,"props":11990,"children":11992},{"className":11991},[],[11993],{"type":17,"value":11994},"toc",{"type":17,"value":11996}," prop) still renders when the\nslot is empty.",{"type":11,"tag":81,"props":11998,"children":11999},{},[12000,12005],{"type":11,"tag":85,"props":12001,"children":12002},{},[12003],{"type":17,"value":12004},"research-landing example refreshed",{"type":17,"value":12006}," with a TuxStatComparison\nyear-over-year delta row beneath the by-the-numbers factoid.\nOne of three uses inverted polarity to show non-compliance going\ndown = success.",{"type":11,"tag":56,"props":12008,"children":12010},{"id":12009},"added-adoption-batch-from-absorption-carry-forwards-2026-05-21",[12011],{"type":17,"value":12012},"Added — adoption batch from absorption carry-forwards (2026-05-21)",{"type":11,"tag":19,"props":12014,"children":12015},{},[12016],{"type":17,"value":12017},"Shipping the small, broadly-useful improvements identified across the\nlast three absorption passes. No speculative builds — each item had\nmultiple absorption files asking for it.",{"type":11,"tag":19,"props":12019,"children":12020},{},[12021],{"type":11,"tag":85,"props":12022,"children":12023},{},[12024],{"type":17,"value":12025},"Tier 1 — slot + prop additions (≤30 LOC each):",{"type":11,"tag":77,"props":12027,"children":12028},{},[12029,12089,12150],{"type":11,"tag":81,"props":12030,"children":12031},{},[12032,12045,12046,12052,12054,12060,12062,12068,12070,12076,12078,12088],{"type":11,"tag":85,"props":12033,"children":12034},{},[12035],{"type":11,"tag":25,"props":12036,"children":12038},{"href":12037},"app\u002Fcomponents\u002FTuxComposer.vue",[12039],{"type":11,"tag":68,"props":12040,"children":12042},{"className":12041},[],[12043],{"type":17,"value":12044},"TuxComposer",{"type":17,"value":1244},{"type":11,"tag":68,"props":12047,"children":12049},{"className":12048},[],[12050],{"type":17,"value":12051},"cancelable",{"type":17,"value":12053},"\nprop + ",{"type":11,"tag":68,"props":12055,"children":12057},{"className":12056},[],[12058],{"type":17,"value":12059},"cancelLabel",{"type":17,"value":12061}," prop + ",{"type":11,"tag":68,"props":12063,"children":12065},{"className":12064},[],[12066],{"type":17,"value":12067},"@cancel",{"type":17,"value":12069}," emit. When the composer is\nwrapped in a modal \u002F slideover \u002F inline edit, surfaces an explicit\n",{"type":11,"tag":68,"props":12071,"children":12073},{"className":12072},[],[12074],{"type":17,"value":12075},"[Cancel] [Send]",{"type":17,"value":12077}," pair. Cancel is ghost-intent; Send stays primary.\nAbsorbed from the Chat Input Box Figma file. New showcase section\non ",{"type":11,"tag":25,"props":12079,"children":12081},{"href":12080},"app\u002Fpages\u002Fcomponents\u002Fcomposer.vue",[12082],{"type":11,"tag":68,"props":12083,"children":12085},{"className":12084},[],[12086],{"type":17,"value":12087},"\u002Fcomponents\u002Fcomposer",{"type":17,"value":43},{"type":11,"tag":81,"props":12090,"children":12091},{},[12092,12104,12105,12111,12113,12119,12121,12126,12127,12132,12134,12139,12141,12149],{"type":11,"tag":85,"props":12093,"children":12094},{},[12095],{"type":11,"tag":25,"props":12096,"children":12098},{"href":12097},"app\u002Fcomponents\u002FTuxRichDataGrid.vue",[12099],{"type":11,"tag":68,"props":12100,"children":12102},{"className":12101},[],[12103],{"type":17,"value":3357},{"type":17,"value":4211},{"type":11,"tag":68,"props":12106,"children":12108},{"className":12107},[],[12109],{"type":17,"value":12110},"#headerMenu",{"type":17,"value":12112}," per-column slot. Consumer-supplied dropdown attached\nto each column header for sort \u002F hide \u002F pin \u002F filter actions. Slot\nscope: ",{"type":11,"tag":68,"props":12114,"children":12116},{"className":12115},[],[12117],{"type":17,"value":12118},"{ column, sortKey, sortDir }",{"type":17,"value":12120},". No default chrome — consumers\ncompose with ",{"type":11,"tag":68,"props":12122,"children":12124},{"className":12123},[],[12125],{"type":17,"value":11152},{"type":17,"value":95},{"type":11,"tag":68,"props":12128,"children":12130},{"className":12129},[],[12131],{"type":17,"value":8278},{"type":17,"value":12133},", or a full ",{"type":11,"tag":68,"props":12135,"children":12137},{"className":12136},[],[12138],{"type":17,"value":6860},{"type":17,"value":12140},".\nAbsorbed from the Data-table-design Figma kit + Snow Dashboard. New\nshowcase section on\n",{"type":11,"tag":25,"props":12142,"children":12143},{"href":9552},[12144],{"type":11,"tag":68,"props":12145,"children":12147},{"className":12146},[],[12148],{"type":17,"value":3435},{"type":17,"value":43},{"type":11,"tag":81,"props":12151,"children":12152},{},[12153,12164,12165,12171,12173,12179,12181,12187,12189,12194,12196,12205],{"type":11,"tag":85,"props":12154,"children":12155},{},[12156],{"type":11,"tag":25,"props":12157,"children":12158},{"href":11051},[12159],{"type":11,"tag":68,"props":12160,"children":12162},{"className":12161},[],[12163],{"type":17,"value":11051},{"type":17,"value":4211},{"type":11,"tag":68,"props":12166,"children":12168},{"className":12167},[],[12169],{"type":17,"value":12170},"#aside",{"type":17,"value":12172}," slot for an optional right rail. Fixed-width\n(",{"type":11,"tag":68,"props":12174,"children":12176},{"className":12175},[],[12177],{"type":17,"value":12178},"asideWidth",{"type":17,"value":12180}," prop, default ",{"type":11,"tag":68,"props":12182,"children":12184},{"className":12183},[],[12185],{"type":17,"value":12186},"18rem",{"type":17,"value":12188},"), sticky-scrolling next to the\nmain panel, hidden under ",{"type":11,"tag":68,"props":12190,"children":12192},{"className":12191},[],[12193],{"type":17,"value":8387},{"type":17,"value":12195}," viewport. Absorbed from Snow\nDashboard's notifications + activities rail. The\n",{"type":11,"tag":25,"props":12197,"children":12198},{"href":10480},[12199],{"type":11,"tag":68,"props":12200,"children":12202},{"className":12201},[],[12203],{"type":17,"value":12204},"landscape-dashboard",{"type":17,"value":12206},"\nexample refactored to use this slot (its Recent-activity + Active-\nagents tiles moved out of the page body into the layout aside —\nthey now stay sticky while main content scrolls).",{"type":11,"tag":19,"props":12208,"children":12209},{},[12210],{"type":11,"tag":85,"props":12211,"children":12212},{},[12213,12215,12220],{"type":17,"value":12214},"Tier 2 — Conventions docs (",{"type":11,"tag":68,"props":12216,"children":12218},{"className":12217},[],[12219],{"type":17,"value":8060},{"type":17,"value":9956},{"type":11,"tag":77,"props":12222,"children":12223},{},[12224,12249],{"type":11,"tag":81,"props":12225,"children":12226},{},[12227,12232,12234,12240,12242,12247],{"type":11,"tag":85,"props":12228,"children":12229},{},[12230],{"type":17,"value":12231},"First-run AI surfaces — Examples \u002F Capabilities \u002F Limitations.",{"type":17,"value":12233},"\nChatGPT's canonical three-column taxonomy for first-run splashes.\nCompose with ",{"type":11,"tag":68,"props":12235,"children":12237},{"className":12236},[],[12238],{"type":17,"value":12239},"TuxFactoid density=\"3\"",{"type":17,"value":12241}," or 3-up ",{"type":11,"tag":68,"props":12243,"children":12245},{"className":12244},[],[12246],{"type":17,"value":5985},{"type":17,"value":12248}," grid; no\nnew component needed.",{"type":11,"tag":81,"props":12250,"children":12251},{},[12252,12257,12259,12264,12265,12270,12271,12276,12278,12284,12285,12290],{"type":11,"tag":85,"props":12253,"children":12254},{},[12255],{"type":17,"value":12256},"MCP tool output — inline card \u002F inline carousel \u002F full screen.",{"type":17,"value":12258},"\nThree-tier display decision tree for MCP tool results. Maps each\ntier to a TUX composition (",{"type":11,"tag":68,"props":12260,"children":12262},{"className":12261},[],[12263],{"type":17,"value":8093},{"type":17,"value":1144},{"type":11,"tag":68,"props":12266,"children":12268},{"className":12267},[],[12269],{"type":17,"value":6652},{"type":17,"value":9561},{"type":11,"tag":68,"props":12272,"children":12274},{"className":12273},[],[12275],{"type":17,"value":8093},{"type":17,"value":12277}," inside ",{"type":11,"tag":68,"props":12279,"children":12281},{"className":12280},[],[12282],{"type":17,"value":12283},"TuxSlideover",{"type":17,"value":3280},{"type":11,"tag":68,"props":12286,"children":12288},{"className":12287},[],[12289],{"type":17,"value":11346},{"type":17,"value":2630},{"type":11,"tag":19,"props":12292,"children":12293},{},[12294],{"type":11,"tag":85,"props":12295,"children":12296},{},[12297],{"type":17,"value":12298},"Tier 2 — new design doc:",{"type":11,"tag":77,"props":12300,"children":12301},{},[12302],{"type":11,"tag":81,"props":12303,"children":12304},{},[12305,12316,12318,12323,12324,12329,12330,12335],{"type":11,"tag":85,"props":12306,"children":12307},{},[12308],{"type":11,"tag":25,"props":12309,"children":12310},{"href":547},[12311],{"type":11,"tag":68,"props":12312,"children":12314},{"className":12313},[],[12315],{"type":17,"value":547},{"type":17,"value":12317},"\nskeleton. Captures the doctrine future ",{"type":11,"tag":68,"props":12319,"children":12321},{"className":12320},[],[12322],{"type":17,"value":627},{"type":17,"value":883},{"type":11,"tag":68,"props":12325,"children":12327},{"className":12326},[],[12328],{"type":17,"value":643},{"type":17,"value":875},{"type":11,"tag":68,"props":12331,"children":12333},{"className":12332},[],[12334],{"type":17,"value":6364},{"type":17,"value":12336}," will follow — palette rules, in-bar\nvs above value labels, end-of-line label default, comparison-series\npatterns, brush\u002Frange selector, KPI strip composition, accessibility.\nLands before the components so they ship in line with the doctrine.",{"type":11,"tag":19,"props":12338,"children":12339},{},[12340],{"type":11,"tag":85,"props":12341,"children":12342},{},[12343],{"type":17,"value":12344},"Tier 3 — new component:",{"type":11,"tag":77,"props":12346,"children":12347},{},[12348],{"type":11,"tag":81,"props":12349,"children":12350},{},[12351,12363,12365,12370,12372,12377,12378,12383,12384,12390,12392,12398,12400,12406,12408,12413,12415,12425],{"type":11,"tag":85,"props":12352,"children":12353},{},[12354],{"type":11,"tag":25,"props":12355,"children":12357},{"href":12356},"app\u002Fcomponents\u002FTuxCardCarousel.vue",[12358],{"type":11,"tag":68,"props":12359,"children":12361},{"className":12360},[],[12362],{"type":17,"value":6652},{"type":17,"value":12364}," —\nhorizontal scroll of cards with editorial chrome (eyebrow + display-\nface title + signature rule + arrows + optional pagination dots).\nThin wrapper around ",{"type":11,"tag":68,"props":12366,"children":12368},{"className":12367},[],[12369],{"type":17,"value":6668},{"type":17,"value":12371}," (embla under the hood); cards are\nthe consumer's responsibility — ",{"type":11,"tag":68,"props":12373,"children":12375},{"className":12374},[],[12376],{"type":17,"value":5985},{"type":17,"value":95},{"type":11,"tag":68,"props":12379,"children":12381},{"className":12380},[],[12382],{"type":17,"value":8093},{"type":17,"value":489},{"type":11,"tag":68,"props":12385,"children":12387},{"className":12386},[],[12388],{"type":17,"value":12389},"TuxContactCard",{"type":17,"value":12391},", or a bare ",{"type":11,"tag":68,"props":12393,"children":12395},{"className":12394},[],[12396],{"type":17,"value":12397},"\u003Carticle>",{"type":17,"value":12399}," all work. Two render modes:\n",{"type":11,"tag":68,"props":12401,"children":12403},{"className":12402},[],[12404],{"type":17,"value":12405},"items",{"type":17,"value":12407}," array + ",{"type":11,"tag":68,"props":12409,"children":12411},{"className":12410},[],[12412],{"type":17,"value":3229},{"type":17,"value":12414}," scoped slot, or direct slide blocks via\nthe default slot. Re-opens the carousel question we deferred in\nthe shadcn absorption — MCP-Apps-for-Claude (inline carousel tier)\nwas the trigger consumer. Full 6-step integration: source +\nshowcase at ",{"type":11,"tag":25,"props":12416,"children":12418},{"href":12417},"app\u002Fpages\u002Fcomponents\u002Fcard-carousel.vue",[12419],{"type":11,"tag":68,"props":12420,"children":12422},{"className":12421},[],[12423],{"type":17,"value":12424},"\u002Fcomponents\u002Fcard-carousel",{"type":11,"tag":77,"props":12426,"children":12427},{},[12428],{"type":11,"tag":81,"props":12429,"children":12430},{},[12431],{"type":17,"value":12432},"nav entry + index card + components-md row + CHANGELOG.",{"type":11,"tag":56,"props":12434,"children":12436},{"id":12435},"changed-pecan-landscape-rebrand-2026-05-21",[12437],{"type":17,"value":12438},"Changed — PECAN → Landscape rebrand (2026-05-21)",{"type":11,"tag":19,"props":12440,"children":12441},{},[12442,12444,12449,12451,12456,12458,12464],{"type":17,"value":12443},"The downstream sensitive-data classifier consumer formerly named\n",{"type":11,"tag":85,"props":12445,"children":12446},{},[12447],{"type":17,"value":12448},"PECAN",{"type":17,"value":12450}," is now ",{"type":11,"tag":85,"props":12452,"children":12453},{},[12454],{"type":17,"value":12455},"Landscape",{"type":17,"value":12457},". The rebrand touched ~50 files across\nTUX; historical record (this CHANGELOG file and the ",{"type":11,"tag":68,"props":12459,"children":12461},{"className":12460},[],[12462],{"type":17,"value":12463},"docs\u002Fadr\u002F*.md",{"type":17,"value":12465},"\nrecords) was deliberately left intact — entries reference the project\nunder its name at the time the entry was written.",{"type":11,"tag":77,"props":12467,"children":12468},{},[12469,12502,12538,12675,12685],{"type":11,"tag":81,"props":12470,"children":12471},{},[12472,12477,12478,12487,12489,12494,12496,12501],{"type":11,"tag":85,"props":12473,"children":12474},{},[12475],{"type":17,"value":12476},"Renamed",{"type":17,"value":996},{"type":11,"tag":25,"props":12479,"children":12480},{"href":10480},[12481],{"type":11,"tag":68,"props":12482,"children":12484},{"className":12483},[],[12485],{"type":17,"value":12486},"app\u002Fpages\u002Fexamples\u002Fpecan-dashboard.vue",{"type":17,"value":12488},"\n→ ",{"type":11,"tag":68,"props":12490,"children":12492},{"className":12491},[],[12493],{"type":17,"value":10042},{"type":17,"value":12495},". Route is now ",{"type":11,"tag":68,"props":12497,"children":12499},{"className":12498},[],[12500],{"type":17,"value":6937},{"type":17,"value":43},{"type":11,"tag":81,"props":12503,"children":12504},{},[12505,12509,12510,12516,12517,12526,12528,12537],{"type":11,"tag":85,"props":12506,"children":12507},{},[12508],{"type":17,"value":12476},{"type":17,"value":996},{"type":11,"tag":68,"props":12511,"children":12513},{"className":12512},[],[12514],{"type":17,"value":12515},"public\u002Fkits\u002Fpecan\u002F",{"type":17,"value":1144},{"type":11,"tag":25,"props":12518,"children":12520},{"href":12519},"public\u002Fkits\u002Flandscape\u002F",[12521],{"type":11,"tag":68,"props":12522,"children":12524},{"className":12523},[],[12525],{"type":17,"value":12519},{"type":17,"value":12527},";\nkit slug + label updated in ",{"type":11,"tag":25,"props":12529,"children":12531},{"href":12530},"app\u002Fpages\u002Fkits.vue",[12532],{"type":11,"tag":68,"props":12533,"children":12535},{"className":12534},[],[12536],{"type":17,"value":12530},{"type":17,"value":43},{"type":11,"tag":81,"props":12539,"children":12540},{},[12541,12546,12548,12553,12554,12559,12560,12565,12567,12573,12575,12581,12582,12587,12588,12593,12594,12600,12601,12606,12607,12612,12613,12619,12620,12626,12627,12632,12633,12638,12640,12645,12646,12651,12652,12657,12659,12665,12667,12673],{"type":11,"tag":85,"props":12542,"children":12543},{},[12544],{"type":17,"value":12545},"Prose updated",{"type":17,"value":12547}," across ",{"type":11,"tag":68,"props":12549,"children":12551},{"className":12550},[],[12552],{"type":17,"value":9143},{"type":17,"value":95},{"type":11,"tag":68,"props":12555,"children":12557},{"className":12556},[],[12558],{"type":17,"value":8060},{"type":17,"value":489},{"type":11,"tag":68,"props":12561,"children":12563},{"className":12562},[],[12564],{"type":17,"value":8483},{"type":17,"value":12566},", ~30 showcase pages under ",{"type":11,"tag":68,"props":12568,"children":12570},{"className":12569},[],[12571],{"type":17,"value":12572},"app\u002Fpages\u002F",{"type":17,"value":12574},", 10\ncomponent JSDoc blocks (",{"type":11,"tag":68,"props":12576,"children":12578},{"className":12577},[],[12579],{"type":17,"value":12580},"TuxDescriptionList",{"type":17,"value":95},{"type":11,"tag":68,"props":12583,"children":12585},{"className":12584},[],[12586],{"type":17,"value":10876},{"type":17,"value":489},{"type":11,"tag":68,"props":12589,"children":12591},{"className":12590},[],[12592],{"type":17,"value":6860},{"type":17,"value":95},{"type":11,"tag":68,"props":12595,"children":12597},{"className":12596},[],[12598],{"type":17,"value":12599},"TuxPagination",{"type":17,"value":95},{"type":11,"tag":68,"props":12602,"children":12604},{"className":12603},[],[12605],{"type":17,"value":11630},{"type":17,"value":489},{"type":11,"tag":68,"props":12608,"children":12610},{"className":12609},[],[12611],{"type":17,"value":2612},{"type":17,"value":95},{"type":11,"tag":68,"props":12614,"children":12616},{"className":12615},[],[12617],{"type":17,"value":12618},"TuxSearch",{"type":17,"value":95},{"type":11,"tag":68,"props":12621,"children":12623},{"className":12622},[],[12624],{"type":17,"value":12625},"TuxSiteNav",{"type":17,"value":95},{"type":11,"tag":68,"props":12628,"children":12630},{"className":12629},[],[12631],{"type":17,"value":3357},{"type":17,"value":489},{"type":11,"tag":68,"props":12634,"children":12636},{"className":12635},[],[12637],{"type":17,"value":5002},{"type":17,"value":12639},"), top-of-file comments in ",{"type":11,"tag":68,"props":12641,"children":12643},{"className":12642},[],[12644],{"type":17,"value":2121},{"type":17,"value":883},{"type":11,"tag":68,"props":12647,"children":12649},{"className":12648},[],[12650],{"type":17,"value":1647},{"type":17,"value":875},{"type":11,"tag":68,"props":12653,"children":12655},{"className":12654},[],[12656],{"type":17,"value":11051},{"type":17,"value":12658},", and the\n",{"type":11,"tag":68,"props":12660,"children":12662},{"className":12661},[],[12663],{"type":17,"value":12664},"public\u002Fkits\u002Faggieux\u002F*.jsx",{"type":17,"value":12666}," reference catalog (default\n",{"type":11,"tag":68,"props":12668,"children":12670},{"className":12669},[],[12671],{"type":17,"value":12672},"productName",{"type":17,"value":12674}," knobs on banners, footer demo strings, breadcrumbs).",{"type":11,"tag":81,"props":12676,"children":12677},{},[12678,12683],{"type":11,"tag":85,"props":12679,"children":12680},{},[12681],{"type":17,"value":12682},"First-mention-per-file",{"type":17,"value":12684}," uses \"Landscape (formerly PECAN)\" for\ncontinuity; later mentions are bare \"Landscape.\"",{"type":11,"tag":81,"props":12686,"children":12687},{},[12688,12693,12694,12702,12704,12710,12712,12717,12719,12725],{"type":11,"tag":85,"props":12689,"children":12690},{},[12691],{"type":17,"value":12692},"Refreshed",{"type":17,"value":996},{"type":11,"tag":25,"props":12695,"children":12696},{"href":10480},[12697],{"type":11,"tag":68,"props":12698,"children":12700},{"className":12699},[],[12701],{"type":17,"value":10480},{"type":17,"value":12703},"\nto use the full sidebar layout + KPI row with delta-vs-previous\nreadings + inline ingest-rate sparkline + two-column main\u002Fright-\nrail grid with Recent-activity + Active-agents tiles. Composition\nreference for the patterns absorbed from the Snow Dashboard\n(",{"type":11,"tag":25,"props":12705,"children":12707},{"href":12706},"reference\u002Ffigma-cache\u002Fsnow-dashboard-ui-kit\u002FNOTES.md",[12708],{"type":17,"value":12709},"NOTES",{"type":17,"value":12711},").\nComposes ~15 Tux* + Nuxt UI 4 primitives. No new components — the\nright rail is a host-driven grid composition, not a layout slot\n(the ",{"type":11,"tag":68,"props":12713,"children":12715},{"className":12714},[],[12716],{"type":17,"value":12170},{"type":17,"value":12718}," slot follow-up on ",{"type":11,"tag":68,"props":12720,"children":12722},{"className":12721},[],[12723],{"type":17,"value":12724},"sidebar.vue",{"type":17,"value":12726}," waits until a second\nconsumer surface needs it).",{"type":11,"tag":56,"props":12728,"children":12730},{"id":12729},"changed-empty-state-stance-documented",[12731],{"type":17,"value":12732},"Changed — empty-state stance documented",{"type":11,"tag":77,"props":12734,"children":12735},{},[12736],{"type":11,"tag":81,"props":12737,"children":12738},{},[12739,12751,12753,12761,12763,12768,12770,12775],{"type":11,"tag":85,"props":12740,"children":12741},{},[12742],{"type":11,"tag":25,"props":12743,"children":12745},{"href":12744},"app\u002Fcomponents\u002FTuxEmptyState.vue",[12746],{"type":11,"tag":68,"props":12747,"children":12749},{"className":12748},[],[12750],{"type":17,"value":10769},{"type":17,"value":12752}," — JSDoc now\nstates the deliberate \"no decorative illustrations\" stance.\nCompanion entry added to\n",{"type":11,"tag":25,"props":12754,"children":12755},{"href":8060},[12756],{"type":11,"tag":68,"props":12757,"children":12759},{"className":12758},[],[12760],{"type":17,"value":8060},{"type":17,"value":12762}," Conventions section.\nReaffirmed against the Empty State Illustration Kit absorption\n(",{"type":11,"tag":25,"props":12764,"children":12766},{"href":12765},"reference\u002Ffigma-cache\u002Fempty-state-illustration-kit\u002FNOTES.md",[12767],{"type":17,"value":12709},{"type":17,"value":12769},");\nthe five ",{"type":11,"tag":68,"props":12771,"children":12773},{"className":12772},[],[12774],{"type":17,"value":2235},{"type":17,"value":12776}," presets remain the canonical taxonomy.",{"type":11,"tag":56,"props":12778,"children":12780},{"id":12779},"added-ai-elements-component-pack-vercel-ai-elements-absorption",[12781],{"type":17,"value":12782},"Added — AI-elements component pack (Vercel AI Elements absorption)",{"type":11,"tag":19,"props":12784,"children":12785},{},[12786,12788,12794],{"type":17,"value":12787},"Five new components and one enhancement, all driven by patterns from\nVercel's AI Elements that nothing in TUX or Nuxt UI 4 covered. Together\nthey let ",{"type":11,"tag":68,"props":12789,"children":12791},{"className":12790},[],[12792],{"type":17,"value":12793},"tti-ai-studio",{"type":17,"value":12795}," surface budget visibility, response\nalternatives, inline-grounded citations, generated artifacts, and\nfollow-up suggestions — the AI-specific affordances real consumer apps\nneed but TUX previously left to ad-hoc composition.",{"type":11,"tag":77,"props":12797,"children":12798},{},[12799,12824,12865,12904,12921,12953,13009],{"type":11,"tag":81,"props":12800,"children":12801},{},[12802,12814,12816,12822],{"type":11,"tag":85,"props":12803,"children":12804},{},[12805],{"type":11,"tag":25,"props":12806,"children":12808},{"href":12807},"app\u002Fcomponents\u002FTuxSuggestionChips.vue",[12809],{"type":11,"tag":68,"props":12810,"children":12812},{"className":12811},[],[12813],{"type":17,"value":2432},{"type":17,"value":12815}," —\nhorizontal row of clickable prompt-suggestion chips. Empty-state\ncomposer or post-response follow-ups. Accepts plain strings or\n",{"type":11,"tag":68,"props":12817,"children":12819},{"className":12818},[],[12820],{"type":17,"value":12821},"{ label, prompt }",{"type":17,"value":12823}," for short-chip \u002F longer-prompt cases.",{"type":11,"tag":81,"props":12825,"children":12826},{},[12827,12840,12841,12847,12849,12855,12857,12863],{"type":11,"tag":85,"props":12828,"children":12829},{},[12830],{"type":11,"tag":25,"props":12831,"children":12833},{"href":12832},"app\u002Fcomponents\u002FTuxBranchNav.vue",[12834],{"type":11,"tag":68,"props":12835,"children":12837},{"className":12836},[],[12838],{"type":17,"value":12839},"TuxBranchNav",{"type":17,"value":1244},{"type":11,"tag":68,"props":12842,"children":12844},{"className":12843},[],[12845],{"type":17,"value":12846},"‹ N of M ›",{"type":17,"value":12848},"\nnavigator for response alternatives. v-modeled 1-indexed position,\n",{"type":11,"tag":68,"props":12850,"children":12852},{"className":12851},[],[12853],{"type":17,"value":12854},"hideSingleton",{"type":17,"value":12856}," defaults true (N=1 renders nothing), optional\n",{"type":11,"tag":68,"props":12858,"children":12860},{"className":12859},[],[12861],{"type":17,"value":12862},"loop",{"type":17,"value":12864},". Position rendered as text for SR announcement.",{"type":11,"tag":81,"props":12866,"children":12867},{},[12868,12880,12882,12888,12890,12895,12897,12902],{"type":11,"tag":85,"props":12869,"children":12870},{},[12871],{"type":11,"tag":25,"props":12872,"children":12874},{"href":12873},"app\u002Fcomponents\u002FTuxInlineCitation.vue",[12875],{"type":11,"tag":68,"props":12876,"children":12878},{"className":12877},[],[12879],{"type":17,"value":2472},{"type":17,"value":12881}," —\nacademic-style superscripted ",{"type":11,"tag":68,"props":12883,"children":12885},{"className":12884},[],[12886],{"type":17,"value":12887},"[N]",{"type":17,"value":12889}," pill in body text. Hover or\nclick reveals ",{"type":11,"tag":68,"props":12891,"children":12893},{"className":12892},[],[12894],{"type":17,"value":8278},{"type":17,"value":12896}," with title + URL + excerpt + score. One\nsource per pill (not Vercel's \"+N\" aggregation); composes with the\nexisting ",{"type":11,"tag":68,"props":12898,"children":12900},{"className":12899},[],[12901],{"type":17,"value":2465},{"type":17,"value":12903}," footer list.",{"type":11,"tag":81,"props":12905,"children":12906},{},[12907,12919],{"type":11,"tag":85,"props":12908,"children":12909},{},[12910],{"type":11,"tag":25,"props":12911,"children":12913},{"href":12912},"app\u002Fcomponents\u002FTuxContextMeter.vue",[12914],{"type":11,"tag":68,"props":12915,"children":12917},{"className":12916},[],[12918],{"type":17,"value":8299},{"type":17,"value":12920}," —\ntoken-utilization meter. Compact pill with conic-gradient ring + %\nused; popover reveals input\u002Foutput token counts + per-side cost +\ntotal. Tone-codes ok \u002F warn \u002F alert at 60% \u002F 85% thresholds —\nvisible signal as long sessions approach the context limit.",{"type":11,"tag":81,"props":12922,"children":12923},{},[12924,12936,12938,12944,12946,12951],{"type":11,"tag":85,"props":12925,"children":12926},{},[12927],{"type":11,"tag":25,"props":12928,"children":12930},{"href":12929},"app\u002Fcomponents\u002FTuxArtifact.vue",[12931],{"type":11,"tag":68,"props":12932,"children":12934},{"className":12933},[],[12935],{"type":17,"value":8093},{"type":17,"value":12937}," — structured\ncontainer for AI-generated output (code file, dataset, document,\nimage). Header (icon + title + meta + actions row) + body slot.\nCommon actions (copy \u002F download \u002F regenerate \u002F share) via the\n",{"type":11,"tag":68,"props":12939,"children":12941},{"className":12940},[],[12942],{"type":17,"value":12943},"actions",{"type":17,"value":12945}," prop emit named events; custom actions via ",{"type":11,"tag":68,"props":12947,"children":12949},{"className":12948},[],[12950],{"type":17,"value":8426},{"type":17,"value":12952},"\nslot. Standalone — consumer wraps in container (inline, sidebar\naside, full-page).",{"type":11,"tag":81,"props":12954,"children":12955},{},[12956,12968,12970,12975,12977,12983,12985,12991,12993,12999,13001,13007],{"type":11,"tag":85,"props":12957,"children":12958},{},[12959],{"type":11,"tag":25,"props":12960,"children":12962},{"href":12961},"app\u002Fcomponents\u002FTuxCodeBlock.vue",[12963],{"type":11,"tag":68,"props":12964,"children":12966},{"className":12965},[],[12967],{"type":17,"value":10876},{"type":17,"value":12969}," gained a\n",{"type":11,"tag":85,"props":12971,"children":12972},{},[12973],{"type":17,"value":12974},"download button",{"type":17,"value":12976}," beside the existing copy. Resolves filename\nfrom a ",{"type":11,"tag":68,"props":12978,"children":12980},{"className":12979},[],[12981],{"type":17,"value":12982},"downloadName",{"type":17,"value":12984}," override → the ",{"type":11,"tag":68,"props":12986,"children":12988},{"className":12987},[],[12989],{"type":17,"value":12990},"filename",{"type":17,"value":12992}," basename →\n",{"type":11,"tag":68,"props":12994,"children":12996},{"className":12995},[],[12997],{"type":17,"value":12998},"code.{ext}",{"type":17,"value":13000}," from a 25-language extension map. Both buttons share a\nhover-revealed ",{"type":11,"tag":68,"props":13002,"children":13004},{"className":13003},[],[13005],{"type":17,"value":13006},"__actions",{"type":17,"value":13008}," container.",{"type":11,"tag":81,"props":13010,"children":13011},{},[13012,13025,13026,13036,13038,13043],{"type":11,"tag":85,"props":13013,"children":13014},{},[13015],{"type":11,"tag":25,"props":13016,"children":13018},{"href":13017},"app\u002Fcomponents\u002FTuxChatMessage.vue",[13019],{"type":11,"tag":68,"props":13020,"children":13022},{"className":13021},[],[13023],{"type":17,"value":13024},"TuxChatMessage",{"type":17,"value":12969},{"type":11,"tag":85,"props":13027,"children":13028},{},[13029,13035],{"type":11,"tag":68,"props":13030,"children":13032},{"className":13031},[],[13033],{"type":17,"value":13034},"#header-trailing",{"type":17,"value":11979},{"type":17,"value":13037}," for right-aligned controls (canonical\nuse: ",{"type":11,"tag":68,"props":13039,"children":13041},{"className":13040},[],[13042],{"type":17,"value":12839},{"type":17,"value":13044},"; also fits per-message model pickers,\nregenerate buttons). Surfaced by dogfooding the refactor of the\nexample page; previously the header had no place for trailing\ncontrols.",{"type":11,"tag":56,"props":13046,"children":13048},{"id":13047},"added-tuxremovablechip-primer-token-absorption",[13049,13050,13056],{"type":17,"value":4412},{"type":11,"tag":68,"props":13051,"children":13053},{"className":13052},[],[13054],{"type":17,"value":13055},"TuxRemovableChip",{"type":17,"value":13057}," (Primer Token absorption)",{"type":11,"tag":19,"props":13059,"children":13060},{},[13061,13063,13072,13074,13080,13082,13088,13090,13096,13098,13107],{"type":17,"value":13062},"Standalone primitive for interactive dismissible pills. Distinct from\n",{"type":11,"tag":25,"props":13064,"children":13066},{"href":13065},"app\u002Fcomponents\u002FTuxBadge.vue",[13067],{"type":11,"tag":68,"props":13068,"children":13070},{"className":13069},[],[13071],{"type":17,"value":5928},{"type":17,"value":13073}," (decorative) — this is\nbutton-shaped, focusable, and emits events: click-toggleable via\n",{"type":11,"tag":68,"props":13075,"children":13077},{"className":13076},[],[13078],{"type":17,"value":13079},"selected",{"type":17,"value":13081},", removable via the ",{"type":11,"tag":68,"props":13083,"children":13085},{"className":13084},[],[13086],{"type":17,"value":13087},"×",{"type":17,"value":13089}," button (or ",{"type":11,"tag":68,"props":13091,"children":13093},{"className":13092},[],[13094],{"type":17,"value":13095},"clickToRemove",{"type":17,"value":13097}," for\nwhole-pill click). Three sizes, optional leading icon, optional\ndisabled state. Pattern was previously hand-rolled inside\n",{"type":11,"tag":25,"props":13099,"children":13101},{"href":13100},"app\u002Fcomponents\u002FTuxFilterPanel.vue",[13102],{"type":11,"tag":68,"props":13103,"children":13105},{"className":13104},[],[13106],{"type":17,"value":6860},{"type":17,"value":13108},"; extraction\ngives a primitive for tag inputs, recipient lists, multi-select\nchips, etc.",{"type":11,"tag":77,"props":13110,"children":13111},{},[13112],{"type":11,"tag":81,"props":13113,"children":13114},{},[13115,13126,13128,13133,13135,13140],{"type":11,"tag":85,"props":13116,"children":13117},{},[13118],{"type":11,"tag":25,"props":13119,"children":13120},{"href":13100},[13121],{"type":11,"tag":68,"props":13122,"children":13124},{"className":13123},[],[13125],{"type":17,"value":6860},{"type":17,"value":13127}," refactored\nto consume ",{"type":11,"tag":68,"props":13129,"children":13131},{"className":13130},[],[13132],{"type":17,"value":13055},{"type":17,"value":13134}," for applied-filter pills at the top\nof the panel. Removes ~30 LOC of hand-rolled chip markup and\nscoped styles; behavior preserved (whole-pill click removes, ",{"type":11,"tag":68,"props":13136,"children":13138},{"className":13137},[],[13139],{"type":17,"value":13087},{"type":17,"value":13141},"\nrendered as decorative affordance).",{"type":11,"tag":56,"props":13143,"children":13145},{"id":13144},"added-tuxinfolabel-tuxteachingpopover-fluent-2-absorption",[13146,13147,13152,13153,13158],{"type":17,"value":4412},{"type":11,"tag":68,"props":13148,"children":13150},{"className":13149},[],[13151],{"type":17,"value":8306},{"type":17,"value":95},{"type":11,"tag":68,"props":13154,"children":13156},{"className":13155},[],[13157],{"type":17,"value":11630},{"type":17,"value":13159}," (Fluent 2 absorption)",{"type":11,"tag":19,"props":13161,"children":13162},{},[13163],{"type":17,"value":13164},"Two small patterns from Microsoft Fluent 2 Web. Both deferred from\nthe initial Fluent pass until the integration sweep landed them with\nshowcase routes and convention.",{"type":11,"tag":77,"props":13166,"children":13167},{},[13168,13216],{"type":11,"tag":81,"props":13169,"children":13170},{},[13171,13183,13185,13191,13193,13199,13201,13207,13209,13215],{"type":11,"tag":85,"props":13172,"children":13173},{},[13174],{"type":11,"tag":25,"props":13175,"children":13177},{"href":13176},"app\u002Fcomponents\u002FTuxInfoLabel.vue",[13178],{"type":11,"tag":68,"props":13179,"children":13181},{"className":13180},[],[13182],{"type":17,"value":8306},{"type":17,"value":13184}," — form-field\nlabel with an ",{"type":11,"tag":68,"props":13186,"children":13188},{"className":13187},[],[13189],{"type":17,"value":13190},"(i)",{"type":17,"value":13192}," info button. Hover or click reveals a popover\nwith extended explanation. For technical research forms where\nfield meanings deserve context (ITAR rubrics, retention classes,\nclassifier metrics). Pairs with form primitives via the standard\n",{"type":11,"tag":68,"props":13194,"children":13196},{"className":13195},[],[13197],{"type":17,"value":13198},"for=",{"type":17,"value":13200}," attribute; optional ",{"type":11,"tag":68,"props":13202,"children":13204},{"className":13203},[],[13205],{"type":17,"value":13206},"required",{"type":17,"value":13208}," shows the maroon ",{"type":11,"tag":68,"props":13210,"children":13212},{"className":13211},[],[13213],{"type":17,"value":13214},"*",{"type":17,"value":43},{"type":11,"tag":81,"props":13217,"children":13218},{},[13219,13231,13233,13238,13240,13246,13248,13254],{"type":11,"tag":85,"props":13220,"children":13221},{},[13222],{"type":11,"tag":25,"props":13223,"children":13225},{"href":13224},"app\u002Fcomponents\u002FTuxTeachingPopover.vue",[13226],{"type":11,"tag":68,"props":13227,"children":13229},{"className":13228},[],[13230],{"type":17,"value":11630},{"type":17,"value":13232}," —\nonboarding \u002F guided-tour tooltip. Distinguished from ",{"type":11,"tag":68,"props":13234,"children":13236},{"className":13235},[],[13237],{"type":17,"value":11614},{"type":17,"value":13239},"\n(passive hover help) by the guided-flow affordances: optional\nheader image, body, Next \u002F Skip footer, step counter\n(",{"type":11,"tag":68,"props":13241,"children":13243},{"className":13242},[],[13244],{"type":17,"value":13245},"{step} of {totalSteps}",{"type":17,"value":13247},"). v-models both open state and current\nstep. ",{"type":11,"tag":68,"props":13249,"children":13251},{"className":13250},[],[13252],{"type":17,"value":13253},"onBrand",{"type":17,"value":13255}," variant for high-emphasis announcements.",{"type":11,"tag":56,"props":13257,"children":13259},{"id":13258},"added-sidebar-app-shell-layout-demo-example",[13260],{"type":17,"value":13261},"Added — Sidebar app-shell layout + demo example",{"type":11,"tag":77,"props":13263,"children":13264},{},[13265,13351],{"type":11,"tag":81,"props":13266,"children":13267},{},[13268,13279,13281,13287,13288,13294,13295,13301,13303,13309,13311,13317,13319,13325,13327,13333,13335,13341,13343,13349],{"type":11,"tag":85,"props":13269,"children":13270},{},[13271],{"type":11,"tag":25,"props":13272,"children":13273},{"href":11051},[13274],{"type":11,"tag":68,"props":13275,"children":13277},{"className":13276},[],[13278],{"type":17,"value":11051},{"type":17,"value":13280}," rewritten\nto compose Nuxt UI 4's ",{"type":11,"tag":68,"props":13282,"children":13284},{"className":13283},[],[13285],{"type":17,"value":13286},"UDashboardGroup",{"type":17,"value":912},{"type":11,"tag":68,"props":13289,"children":13291},{"className":13290},[],[13292],{"type":17,"value":13293},"UDashboardSidebar",{"type":17,"value":2738},{"type":11,"tag":68,"props":13296,"children":13298},{"className":13297},[],[13299],{"type":17,"value":13300},"UDashboardPanel",{"type":17,"value":13302},". Earlier scaffold was hand-rolled CSS; the\nrewrite drops ~70 LOC and inherits collapse-to-icons, mobile\nslideover, resizable handle, and cookie-backed persistence from\nNuxt UI. Opt in per page via\n",{"type":11,"tag":68,"props":13304,"children":13306},{"className":13305},[],[13307],{"type":17,"value":13308},"definePageMeta({ layout: \"sidebar\" })",{"type":17,"value":13310},". Slot surface:\n",{"type":11,"tag":68,"props":13312,"children":13314},{"className":13313},[],[13315],{"type":17,"value":13316},"#header",{"type":17,"value":13318}," (top bar \u002F breadcrumbs), ",{"type":11,"tag":68,"props":13320,"children":13322},{"className":13321},[],[13323],{"type":17,"value":13324},"#rail-header",{"type":17,"value":13326}," (brand),\n",{"type":11,"tag":68,"props":13328,"children":13330},{"className":13329},[],[13331],{"type":17,"value":13332},"#rail",{"type":17,"value":13334}," (nav body), ",{"type":11,"tag":68,"props":13336,"children":13338},{"className":13337},[],[13339],{"type":17,"value":13340},"#rail-footer",{"type":17,"value":13342}," (user), default (main content).\nRail slots receive ",{"type":11,"tag":68,"props":13344,"children":13346},{"className":13345},[],[13347],{"type":17,"value":13348},"{ collapsed, collapse }",{"type":17,"value":13350}," scope vars.",{"type":11,"tag":81,"props":13352,"children":13353},{},[13354,13365],{"type":11,"tag":85,"props":13355,"children":13356},{},[13357],{"type":11,"tag":25,"props":13358,"children":13359},{"href":9875},[13360],{"type":11,"tag":68,"props":13361,"children":13363},{"className":13362},[],[13364],{"type":17,"value":6930},{"type":17,"value":13366}," —\nnew composition example demonstrating the layout's slot surface.\nSample app-shell with TTI brand, hierarchical UNavigationMenu in\nthe rail, user-account footer, and a content surface with\nfactoids + recent-activity list.",{"type":11,"tag":56,"props":13368,"children":13370},{"id":13369},"added-latex-math-in-mdc-pipeline",[13371],{"type":17,"value":13372},"Added — LaTeX math in MDC pipeline",{"type":11,"tag":19,"props":13374,"children":13375},{},[13376,13382,13383,13389,13391,13399,13401,13407,13408,13414,13416,13425,13427,13433,13434,13440,13442,13448,13450,13456,13458,13468],{"type":11,"tag":68,"props":13377,"children":13379},{"className":13378},[],[13380],{"type":17,"value":13381},"remark-math",{"type":17,"value":912},{"type":11,"tag":68,"props":13384,"children":13386},{"className":13385},[],[13387],{"type":17,"value":13388},"rehype-katex",{"type":17,"value":13390}," wired into ",{"type":11,"tag":25,"props":13392,"children":13393},{"href":2121},[13394],{"type":11,"tag":68,"props":13395,"children":13397},{"className":13396},[],[13398],{"type":17,"value":2121},{"type":17,"value":13400},"\nunder ",{"type":11,"tag":68,"props":13402,"children":13404},{"className":13403},[],[13405],{"type":17,"value":13406},"mdc.remarkPlugins",{"type":17,"value":875},{"type":11,"tag":68,"props":13409,"children":13411},{"className":13410},[],[13412],{"type":17,"value":13413},"mdc.rehypePlugins",{"type":17,"value":13415},". KaTeX CSS imported\nglobally in ",{"type":11,"tag":25,"props":13417,"children":13419},{"href":13418},"app\u002Fassets\u002Fcss\u002Fglobals.css",[13420],{"type":11,"tag":68,"props":13421,"children":13423},{"className":13422},[],[13424],{"type":17,"value":9954},{"type":17,"value":13426},". Markdown\nsources can now use ",{"type":11,"tag":68,"props":13428,"children":13430},{"className":13429},[],[13431],{"type":17,"value":13432},"$inline$",{"type":17,"value":103},{"type":11,"tag":68,"props":13435,"children":13437},{"className":13436},[],[13438],{"type":17,"value":13439},"$$display$$",{"type":17,"value":13441}," math; rendered HTML\nincludes both ",{"type":11,"tag":68,"props":13443,"children":13445},{"className":13444},[],[13446],{"type":17,"value":13447},"katex-html",{"type":17,"value":13449}," (visual) and ",{"type":11,"tag":68,"props":13451,"children":13453},{"className":13452},[],[13454],{"type":17,"value":13455},"katex-mathml",{"type":17,"value":13457}," (a11y) trees.\nThe ",{"type":11,"tag":25,"props":13459,"children":13461},{"href":13460},"app\u002Fpages\u002Fmarkdown.vue",[13462],{"type":11,"tag":68,"props":13463,"children":13465},{"className":13464},[],[13466],{"type":17,"value":13467},"\u002Fmarkdown",{"type":17,"value":13469}," demo gains a Math section\nexercising both forms. Bundle-size cost: ~75 KB KaTeX CSS loads on\nevery page (lightweight enough to justify; consumers can swap to a\nmanual per-page import if they want to be strictly lazy).",{"type":11,"tag":56,"props":13471,"children":13473},{"id":13472},"added-breakpoint-tokens-windows-ui-kit-absorption",[13474],{"type":17,"value":13475},"Added — Breakpoint tokens (Windows UI kit absorption)",{"type":11,"tag":77,"props":13477,"children":13478},{},[13479,13570],{"type":11,"tag":81,"props":13480,"children":13481},{},[13482,13493,13494,13500,13502,13508,13510,13515,13517,13522,13524,13529,13531,13537,13539,13545,13547,13553,13555,13561,13562,13568],{"type":11,"tag":85,"props":13483,"children":13484},{},[13485],{"type":11,"tag":25,"props":13486,"children":13487},{"href":4301},[13488],{"type":11,"tag":68,"props":13489,"children":13491},{"className":13490},[],[13492],{"type":17,"value":4301},{"type":17,"value":12969},{"type":11,"tag":68,"props":13495,"children":13497},{"className":13496},[],[13498],{"type":17,"value":13499},"breakpoint",{"type":17,"value":13501}," block: ",{"type":11,"tag":68,"props":13503,"children":13505},{"className":13504},[],[13506],{"type":17,"value":13507},"xs",{"type":17,"value":13509}," (0) \u002F ",{"type":11,"tag":68,"props":13511,"children":13513},{"className":13512},[],[13514],{"type":17,"value":8379},{"type":17,"value":13516}," (640) \u002F ",{"type":11,"tag":68,"props":13518,"children":13520},{"className":13519},[],[13521],{"type":17,"value":8387},{"type":17,"value":13523}," (768) \u002F ",{"type":11,"tag":68,"props":13525,"children":13527},{"className":13526},[],[13528],{"type":17,"value":8395},{"type":17,"value":13530}," (1024)\n\u002F ",{"type":11,"tag":68,"props":13532,"children":13534},{"className":13533},[],[13535],{"type":17,"value":13536},"xl",{"type":17,"value":13538}," (1280) \u002F ",{"type":11,"tag":68,"props":13540,"children":13542},{"className":13541},[],[13543],{"type":17,"value":13544},"2xl",{"type":17,"value":13546}," (1536), with ",{"type":11,"tag":68,"props":13548,"children":13550},{"className":13549},[],[13551],{"type":17,"value":13552},"$description",{"type":17,"value":13554}," per breakpoint\ndocumenting the semantic trigger (what surface state changes at\nthis width). Values match Tailwind v4 defaults so ",{"type":11,"tag":68,"props":13556,"children":13558},{"className":13557},[],[13559],{"type":17,"value":13560},"md:",{"type":17,"value":875},{"type":11,"tag":68,"props":13563,"children":13565},{"className":13564},[],[13566],{"type":17,"value":13567},"lg:",{"type":17,"value":13569},"\nutilities keep their intuitive meaning; the token source is the\ndurable reference. Pulled from a survey of Microsoft's Windows UI\nkit responsive ladder (348 \u002F 660 \u002F 708 \u002F 1020 \u002F 1252), rebased to\nTUX's editorial-first content widths.",{"type":11,"tag":81,"props":13571,"children":13572},{},[13573,13584,13585,13591,13593,13599],{"type":11,"tag":85,"props":13574,"children":13575},{},[13576],{"type":11,"tag":25,"props":13577,"children":13578},{"href":13418},[13579],{"type":11,"tag":68,"props":13580,"children":13582},{"className":13581},[],[13583],{"type":17,"value":9954},{"type":17,"value":996},{"type":11,"tag":68,"props":13586,"children":13588},{"className":13587},[],[13589],{"type":17,"value":13590},"@theme",{"type":17,"value":13592}," block\ngained ",{"type":11,"tag":68,"props":13594,"children":13596},{"className":13595},[],[13597],{"type":17,"value":13598},"--breakpoint-*",{"type":17,"value":13600}," entries mirroring the token source.",{"type":11,"tag":56,"props":13602,"children":13604},{"id":13603},"added-tuxemptystate-compact-prop-kind-preset-library",[13605,13606,13611,13612,13618,13619,13624],{"type":17,"value":4412},{"type":11,"tag":68,"props":13607,"children":13609},{"className":13608},[],[13610],{"type":17,"value":10769},{"type":17,"value":996},{"type":11,"tag":68,"props":13613,"children":13615},{"className":13614},[],[13616],{"type":17,"value":13617},"compact",{"type":17,"value":12061},{"type":11,"tag":68,"props":13620,"children":13622},{"className":13621},[],[13623],{"type":17,"value":2235},{"type":17,"value":13625}," preset library",{"type":11,"tag":19,"props":13627,"children":13628},{},[13629],{"type":17,"value":13630},"Two enhancements to the empty-state component, one from the Primer\npass and one from the Backstage pass:",{"type":11,"tag":77,"props":13632,"children":13633},{},[13634,13649,13761],{"type":11,"tag":81,"props":13635,"children":13636},{},[13637,13647],{"type":11,"tag":85,"props":13638,"children":13639},{},[13640,13645],{"type":11,"tag":68,"props":13641,"children":13643},{"className":13642},[],[13644],{"type":17,"value":13617},{"type":17,"value":13646}," boolean prop",{"type":17,"value":13648}," (Primer pass) — reduces icon, heading,\ndescription, and padding sizes for narrow-column placements (facet\nresults, inline list area, sidebar widget). Confirmed against\nPrimer's Blankslate small variants and again against Backstage's\nEmpty Card use case.",{"type":11,"tag":81,"props":13650,"children":13651},{},[13652,13662,13664,13722,13725,13727,13733,13734,13740,13741,13747,13749,13759],{"type":11,"tag":85,"props":13653,"children":13654},{},[13655,13660],{"type":11,"tag":68,"props":13656,"children":13658},{"className":13657},[],[13659],{"type":17,"value":2235},{"type":17,"value":13661}," preset prop",{"type":17,"value":13663}," (Backstage pass) — five named cases that\npre-fill icon + title + description for the most-reused\nempty-state shapes:",{"type":11,"tag":77,"props":13665,"children":13666},{},[13667,13678,13689,13700,13711],{"type":11,"tag":81,"props":13668,"children":13669},{},[13670,13676],{"type":11,"tag":68,"props":13671,"children":13673},{"className":13672},[],[13674],{"type":17,"value":13675},"no-data",{"type":17,"value":13677}," — empty dataset, nothing created yet",{"type":11,"tag":81,"props":13679,"children":13680},{},[13681,13687],{"type":11,"tag":68,"props":13682,"children":13684},{"className":13683},[],[13685],{"type":17,"value":13686},"no-results",{"type":17,"value":13688}," — query \u002F filter returned nothing",{"type":11,"tag":81,"props":13690,"children":13691},{},[13692,13698],{"type":11,"tag":68,"props":13693,"children":13695},{"className":13694},[],[13696],{"type":17,"value":13697},"not-found",{"type":17,"value":13699}," — resource doesn't exist (or moved)",{"type":11,"tag":81,"props":13701,"children":13702},{},[13703,13709],{"type":11,"tag":68,"props":13704,"children":13706},{"className":13705},[],[13707],{"type":17,"value":13708},"no-permissions",{"type":17,"value":13710}," — auth-gated; user lacks access",{"type":11,"tag":81,"props":13712,"children":13713},{},[13714,13720],{"type":11,"tag":68,"props":13715,"children":13717},{"className":13716},[],[13718],{"type":17,"value":13719},"first-run",{"type":17,"value":13721}," — onboarding; \"welcome, get started\"",{"type":11,"tag":7617,"props":13723,"children":13724},{},[],{"type":17,"value":13726},"Explicit ",{"type":11,"tag":68,"props":13728,"children":13730},{"className":13729},[],[13731],{"type":17,"value":13732},"icon",{"type":17,"value":875},{"type":11,"tag":68,"props":13735,"children":13737},{"className":13736},[],[13738],{"type":17,"value":13739},"title",{"type":17,"value":875},{"type":11,"tag":68,"props":13742,"children":13744},{"className":13743},[],[13745],{"type":17,"value":13746},"description",{"type":17,"value":13748}," props still win per-field,\nso consumers can use a preset as the baseline and override the\nvoice. Surveyed from Backstage's seven dedicated empty-state pages\n(Empty Card \u002F Table \u002F Page \u002F No Builds to Show \u002F Entity Not Found\n\u002F Create a Component); collapsed to the five most-reused shapes for\nTUX. Showcase at ",{"type":11,"tag":25,"props":13750,"children":13752},{"href":13751},"app\u002Fpages\u002Fcomponents\u002Fempty-state.vue",[13753],{"type":11,"tag":68,"props":13754,"children":13756},{"className":13755},[],[13757],{"type":17,"value":13758},"\u002Fcomponents\u002Fempty-state",{"type":17,"value":13760},"\ndemonstrates each preset.",{"type":11,"tag":81,"props":13762,"children":13763},{},[13764,13769,13771,13776,13778,13784,13786,13792,13794,13799,13800,13805],{"type":11,"tag":85,"props":13765,"children":13766},{},[13767],{"type":17,"value":13768},"Template dedup as a side-effect.",{"type":17,"value":13770}," The earlier ",{"type":11,"tag":68,"props":13772,"children":13774},{"className":13773},[],[13775],{"type":17,"value":13617},{"type":17,"value":13777}," addition\nonly worked on the with-card branch — the ",{"type":11,"tag":68,"props":13779,"children":13781},{"className":13780},[],[13782],{"type":17,"value":13783},"no-card",{"type":17,"value":13785}," branch had a\nduplicate template that drifted. Restructured to one template using\n",{"type":11,"tag":68,"props":13787,"children":13789},{"className":13788},[],[13790],{"type":17,"value":13791},"\u003Ccomponent :is=\"noCard ? 'div' : 'TuxCard'\">",{"type":17,"value":13793}," (made possible by the\nglobal Tux component registration this session also shipped); both\nbranches now honor ",{"type":11,"tag":68,"props":13795,"children":13797},{"className":13796},[],[13798],{"type":17,"value":13617},{"type":17,"value":103},{"type":11,"tag":68,"props":13801,"children":13803},{"className":13802},[],[13804],{"type":17,"value":2235},{"type":17,"value":13806}," identically.",{"type":11,"tag":56,"props":13808,"children":13810},{"id":13809},"added-standard-composition-conventions",[13811],{"type":17,"value":13812},"Added — Standard composition conventions",{"type":11,"tag":77,"props":13814,"children":13815},{},[13816],{"type":11,"tag":81,"props":13817,"children":13818},{},[13819,13830,13832,13837,13839],{"type":11,"tag":85,"props":13820,"children":13821},{},[13822],{"type":11,"tag":25,"props":13823,"children":13824},{"href":8060},[13825],{"type":11,"tag":68,"props":13826,"children":13828},{"className":13827},[],[13829],{"type":17,"value":8060},{"type":17,"value":13831}," gained a new\n",{"type":11,"tag":85,"props":13833,"children":13834},{},[13835],{"type":17,"value":13836},"Conventions",{"type":17,"value":13838}," section with two documented standards:\n",{"type":11,"tag":77,"props":13840,"children":13841},{},[13842,13873],{"type":11,"tag":81,"props":13843,"children":13844},{},[13845,13850,13852,13857,13858,13864,13866,13871],{"type":11,"tag":85,"props":13846,"children":13847},{},[13848],{"type":17,"value":13849},"Chat-message actions",{"type":17,"value":13851}," (Vercel AI Elements absorption) — the\nstandard ",{"type":11,"tag":68,"props":13853,"children":13855},{"className":13854},[],[13856],{"type":17,"value":13024},{"type":17,"value":996},{"type":11,"tag":68,"props":13859,"children":13861},{"className":13860},[],[13862],{"type":17,"value":13863},"#tools",{"type":17,"value":13865}," icon set:\n",{"type":11,"tag":85,"props":13867,"children":13868},{},[13869],{"type":17,"value":13870},"Copy · Regenerate · Share · Helpful · Off",{"type":17,"value":13872}," in that order. Icon\nnames, labels, and expected emit-event names all listed so\nconsumers don't reinvent.",{"type":11,"tag":81,"props":13874,"children":13875},{},[13876,13881,13883,13889,13890,13896,13897,13903,13904,13909],{"type":11,"tag":85,"props":13877,"children":13878},{},[13879],{"type":17,"value":13880},"Form validation — when to use which",{"type":17,"value":13882}," (Backstage absorption) —\ndecision tree for four placements: inline field error \u002F inline\nform summary \u002F blocking dialog \u002F page-or-session banner \u002F toast.\nEach placement names the components, the use case, and the\nbehavior expected. Anti-patterns called out explicitly (modal for\na single bad field, banner for a single bad field, etc.).\nBackstage's 38-frame form-validation page surfaced the gap — TUX\nleans on ",{"type":11,"tag":68,"props":13884,"children":13886},{"className":13885},[],[13887],{"type":17,"value":13888},"UFormField",{"type":17,"value":912},{"type":11,"tag":68,"props":13891,"children":13893},{"className":13892},[],[13894],{"type":17,"value":13895},"TuxAlert",{"type":17,"value":912},{"type":11,"tag":68,"props":13898,"children":13900},{"className":13899},[],[13901],{"type":17,"value":13902},"UModal",{"type":17,"value":912},{"type":11,"tag":68,"props":13905,"children":13907},{"className":13906},[],[13908],{"type":17,"value":4574},{"type":17,"value":13910}," for\nprimitives but previously didn't document the decision.",{"type":11,"tag":56,"props":13912,"children":13914},{"id":13913},"added-figma-absorption-cache-scripts",[13915],{"type":17,"value":13916},"Added — Figma absorption cache + scripts",{"type":11,"tag":19,"props":13918,"children":13919},{},[13920,13928,13930,13935,13937,13947,13949,13959,13960,13970],{"type":11,"tag":25,"props":13921,"children":13922},{"href":11419},[13923],{"type":11,"tag":68,"props":13924,"children":13926},{"className":13925},[],[13927],{"type":17,"value":11419},{"type":17,"value":13929}," houses the\ndurable artifacts from the absorption pass: per-file ",{"type":11,"tag":68,"props":13931,"children":13933},{"className":13932},[],[13934],{"type":17,"value":11427},{"type":17,"value":13936},"\n(skip \u002F absorb \u002F tension \u002F decisions framework) with cover thumbnails\nfor all 70 files in the source project. Aggregator at\n",{"type":11,"tag":25,"props":13938,"children":13940},{"href":13939},"reference\u002Ffigma-cache\u002FINDEX.md",[13941],{"type":11,"tag":68,"props":13942,"children":13944},{"className":13943},[],[13945],{"type":17,"value":13946},"INDEX.md",{"type":17,"value":13948},". Helper scripts at\n",{"type":11,"tag":25,"props":13950,"children":13952},{"href":13951},"reference\u002Ffigma-cache\u002F_scripts\u002Fsync.py",[13953],{"type":11,"tag":68,"props":13954,"children":13956},{"className":13955},[],[13957],{"type":17,"value":13958},"_scripts\u002Fsync.py",{"type":17,"value":2738},{"type":11,"tag":25,"props":13961,"children":13963},{"href":13962},"reference\u002Ffigma-cache\u002F_scripts\u002Frebuild-index.py",[13964],{"type":11,"tag":68,"props":13965,"children":13967},{"className":13966},[],[13968],{"type":17,"value":13969},"rebuild-index.py",{"type":17,"value":13971},"\nre-sync from the Figma REST API (rate-limit-aware) and regenerate the\nindex from on-disk state.",{"type":11,"tag":56,"props":13973,"children":13975},{"id":13974},"fixed-mdc-component-resolution",[13976],{"type":17,"value":13977},"Fixed — MDC component resolution",{"type":11,"tag":19,"props":13979,"children":13980},{},[13981,13983,13989,13991,13997,13999,14005,14007,14013,14014,14020,14022,14028],{"type":17,"value":13982},"Nuxt's default component auto-import works via compile-time template\nrewrites; components are not registered via ",{"type":11,"tag":68,"props":13984,"children":13986},{"className":13985},[],[13987],{"type":17,"value":13988},"app.component()",{"type":17,"value":13990},". That\nmade every Tux* invisible to ",{"type":11,"tag":68,"props":13992,"children":13994},{"className":13993},[],[13995],{"type":17,"value":13996},"MDCRenderer",{"type":17,"value":13998},"'s runtime\n",{"type":11,"tag":68,"props":14000,"children":14002},{"className":14001},[],[14003],{"type":17,"value":14004},"resolveComponent()",{"type":17,"value":14006}," call, so markdown like ",{"type":11,"tag":68,"props":14008,"children":14010},{"className":14009},[],[14011],{"type":17,"value":14012},"::tux-alert{...}",{"type":17,"value":883},{"type":11,"tag":68,"props":14015,"children":14017},{"className":14016},[],[14018],{"type":17,"value":14019},"::tux-callout{...}",{"type":17,"value":14021}," rendered as plain text and logged\n",{"type":11,"tag":68,"props":14023,"children":14025},{"className":14024},[],[14026],{"type":17,"value":14027},"[Vue warn]: Failed to resolve component: TuxAlert",{"type":17,"value":14029}," on every render.",{"type":11,"tag":77,"props":14031,"children":14032},{},[14033],{"type":11,"tag":81,"props":14034,"children":14035},{},[14036,14047,14049,14055,14056,14062,14064,14069,14071,14077],{"type":11,"tag":85,"props":14037,"children":14038},{},[14039],{"type":11,"tag":25,"props":14040,"children":14041},{"href":2121},[14042],{"type":11,"tag":68,"props":14043,"children":14045},{"className":14044},[],[14046],{"type":17,"value":2121},{"type":17,"value":14048}," now sets\n",{"type":11,"tag":68,"props":14050,"children":14052},{"className":14051},[],[14053],{"type":17,"value":14054},"components: [{ path: resolve(layerDir, \"app\u002Fcomponents\"), global: true }]",{"type":17,"value":801},{"type":11,"tag":68,"props":14057,"children":14059},{"className":14058},[],[14060],{"type":17,"value":14061},"global: true",{"type":17,"value":14063}," registers each component via ",{"type":11,"tag":68,"props":14065,"children":14067},{"className":14066},[],[14068],{"type":17,"value":13988},{"type":17,"value":14070}," at\nboot so runtime resolvers find them. Bundle cost: Tux* components\nship in the main chunk instead of being lazy-loaded — acceptable\nbecause they're used across virtually every page anyway, and the\nwin (markdown surfaces can use any ",{"type":11,"tag":68,"props":14072,"children":14074},{"className":14073},[],[14075],{"type":17,"value":14076},"::tux-*",{"type":17,"value":14078}," block without explicit\nregistration) is real. Propagates to consumer apps (PECAN,\ntti-ai-studio) when they extend this layer.",{"type":11,"tag":56,"props":14080,"children":14082},{"id":14081},"fixed-typesafe-emit-union-narrowing",[14083],{"type":17,"value":14084},"Fixed — Typesafe emit-union narrowing",{"type":11,"tag":19,"props":14086,"children":14087},{},[14088,14093,14095,14101],{"type":11,"tag":68,"props":14089,"children":14091},{"className":14090},[],[14092],{"type":17,"value":6122},{"type":17,"value":14094}," flagged two new components where ",{"type":11,"tag":68,"props":14096,"children":14098},{"className":14097},[],[14099],{"type":17,"value":14100},"emit(union)",{"type":17,"value":14102}," couldn't\nnarrow to a specific literal:",{"type":11,"tag":77,"props":14104,"children":14105},{},[14106,14152],{"type":11,"tag":81,"props":14107,"children":14108},{},[14109,14120,14121,14126,14128,14134,14136,14142,14144,14150],{"type":11,"tag":85,"props":14110,"children":14111},{},[14112],{"type":11,"tag":25,"props":14113,"children":14114},{"href":12929},[14115],{"type":11,"tag":68,"props":14116,"children":14118},{"className":14117},[],[14119],{"type":17,"value":8093},{"type":17,"value":8837},{"type":11,"tag":68,"props":14122,"children":14124},{"className":14123},[],[14125],{"type":17,"value":12943},{"type":17,"value":14127},"\nprop's loop called ",{"type":11,"tag":68,"props":14129,"children":14131},{"className":14130},[],[14132],{"type":17,"value":14133},"emit(a)",{"type":17,"value":14135}," where ",{"type":11,"tag":68,"props":14137,"children":14139},{"className":14138},[],[14140],{"type":17,"value":14141},"a: ArtifactAction",{"type":17,"value":14143},". Replaced\nwith an ",{"type":11,"tag":68,"props":14145,"children":14147},{"className":14146},[],[14148],{"type":17,"value":14149},"onAction(a)",{"type":17,"value":14151}," switch dispatch over the literals.",{"type":11,"tag":81,"props":14153,"children":14154},{},[14155,14166,14167,14173,14175,14181],{"type":11,"tag":85,"props":14156,"children":14157},{},[14158],{"type":11,"tag":25,"props":14159,"children":14160},{"href":12832},[14161],{"type":11,"tag":68,"props":14162,"children":14164},{"className":14163},[],[14165],{"type":17,"value":12839},{"type":17,"value":1244},{"type":11,"tag":68,"props":14168,"children":14170},{"className":14169},[],[14171],{"type":17,"value":14172},"emit(delta === 1 ? \"next\" : \"prev\")",{"type":17,"value":14174}," couldn't narrow. Replaced with ",{"type":11,"tag":68,"props":14176,"children":14178},{"className":14177},[],[14179],{"type":17,"value":14180},"if (delta === 1) emit(\"next\"); else emit(\"prev\");",{"type":17,"value":43},{"type":11,"tag":56,"props":14183,"children":14185},{"id":14184},"changed-tti-ai-studio-session-example-uses-tuxchatmessage",[14186,14188,14194,14196],{"type":17,"value":14187},"Changed — ",{"type":11,"tag":68,"props":14189,"children":14191},{"className":14190},[],[14192],{"type":17,"value":14193},"tti-ai-studio-session",{"type":17,"value":14195}," example uses ",{"type":11,"tag":68,"props":14197,"children":14199},{"className":14198},[],[14200],{"type":17,"value":13024},{"type":11,"tag":19,"props":14202,"children":14203},{},[14204,14206,14211,14213,14221,14223,14228,14230,14235,14237,14243,14245,14250],{"type":17,"value":14205},"The example page previously used hand-rolled ",{"type":11,"tag":68,"props":14207,"children":14209},{"className":14208},[],[14210],{"type":17,"value":12397},{"type":17,"value":14212}," blocks for\nboth message turns. Refactored to use\n",{"type":11,"tag":25,"props":14214,"children":14215},{"href":13017},[14216],{"type":11,"tag":68,"props":14217,"children":14219},{"className":14218},[],[14220],{"type":17,"value":13024},{"type":17,"value":14222}," — closes a\ndead-code-audit finding (the component had no consumer outside its\nown showcase route) and demonstrates the canonical pattern. The user\nturn becomes a 3-line call; the assistant turn uses four slots\n(",{"type":11,"tag":68,"props":14224,"children":14226},{"className":14225},[],[14227],{"type":17,"value":13034},{"type":17,"value":14229}," for ",{"type":11,"tag":68,"props":14231,"children":14233},{"className":14232},[],[14234],{"type":17,"value":12839},{"type":17,"value":14236},", default for body, ",{"type":11,"tag":68,"props":14238,"children":14240},{"className":14239},[],[14241],{"type":17,"value":14242},"#citations",{"type":17,"value":14244},"\nfor the footer list, ",{"type":11,"tag":68,"props":14246,"children":14248},{"className":14247},[],[14249],{"type":17,"value":13863},{"type":17,"value":14251}," for the standard action set).",{"type":11,"tag":56,"props":14253,"children":14255},{"id":14254},"changed-apppagesexamplestti-ai-studio-sessionvue-composition",[14256,14257,14263],{"type":17,"value":14187},{"type":11,"tag":68,"props":14258,"children":14260},{"className":14259},[],[14261],{"type":17,"value":14262},"app\u002Fpages\u002Fexamples\u002Ftti-ai-studio-session.vue",{"type":17,"value":14264}," composition",{"type":11,"tag":19,"props":14266,"children":14267},{},[14268,14270,14275,14277,14282,14284,14289,14291,14296,14298,14303,14305,14310,14312,14317,14319,14325,14326,14332,14333,14339],{"type":17,"value":14269},"Beyond the ",{"type":11,"tag":68,"props":14271,"children":14273},{"className":14272},[],[14274],{"type":17,"value":13024},{"type":17,"value":14276}," refactor, the example was previously\nheavily updated this session to demonstrate the new AI-elements\ncomponents in their natural composition: ",{"type":11,"tag":68,"props":14278,"children":14280},{"className":14279},[],[14281],{"type":17,"value":8299},{"type":17,"value":14283}," in the\npage header, ",{"type":11,"tag":68,"props":14285,"children":14287},{"className":14286},[],[14288],{"type":17,"value":12839},{"type":17,"value":14290}," in the assistant header,\n",{"type":11,"tag":68,"props":14292,"children":14294},{"className":14293},[],[14295],{"type":17,"value":2472},{"type":17,"value":14297}," inline in the prose, ",{"type":11,"tag":68,"props":14299,"children":14301},{"className":14300},[],[14302],{"type":17,"value":8093},{"type":17,"value":14304}," wrapping a\n",{"type":11,"tag":68,"props":14306,"children":14308},{"className":14307},[],[14309],{"type":17,"value":10876},{"type":17,"value":14311}," after the message, ",{"type":11,"tag":68,"props":14313,"children":14315},{"className":14314},[],[14316],{"type":17,"value":2432},{"type":17,"value":14318}," before the\ncomposer, plus ",{"type":11,"tag":68,"props":14320,"children":14322},{"className":14321},[],[14323],{"type":17,"value":14324},"UChatReasoning",{"type":17,"value":875},{"type":11,"tag":68,"props":14327,"children":14329},{"className":14328},[],[14330],{"type":17,"value":14331},"UChatTool",{"type":17,"value":875},{"type":11,"tag":68,"props":14334,"children":14336},{"className":14335},[],[14337],{"type":17,"value":14338},"UChatShimmer",{"type":17,"value":14340}," from\nthe Nuxt UI 4 Chat suite to show how the two layers compose.",{"type":11,"tag":45,"props":14342,"children":14344},{"id":14343},"_142-2026-05-14",[14345,14350],{"type":11,"tag":50,"props":14346,"children":14347},{},[14348],{"type":17,"value":14349},"1.4.2",{"type":17,"value":14351}," — 2026-05-14",{"type":11,"tag":19,"props":14353,"children":14354},{},[14355,14357,14363,14365,14370,14371,14377,14379,14385,14386,14392,14394,14400,14402,14407,14409,14414,14416,14421],{"type":17,"value":14356},"Patch: align the HC theme's primary palette steps with the brand\nvalue stated in ADR-0005. The HC palette was sampled from TTI's 508-\naccessible PPTX where the maroon anchor is ",{"type":11,"tag":68,"props":14358,"children":14360},{"className":14359},[],[14361],{"type":17,"value":14362},"#500000",{"type":17,"value":14364},", but\n",{"type":11,"tag":68,"props":14366,"children":14368},{"className":14367},[],[14369],{"type":17,"value":8913},{"type":17,"value":103},{"type":11,"tag":68,"props":14372,"children":14374},{"className":14373},[],[14375],{"type":17,"value":14376},"--color-maroon-500",{"type":17,"value":14378}," were inheriting from\n",{"type":11,"tag":68,"props":14380,"children":14382},{"className":14381},[],[14383],{"type":17,"value":14384},":root",{"type":17,"value":2078},{"type":11,"tag":68,"props":14387,"children":14389},{"className":14388},[],[14390],{"type":17,"value":14391},"#b14a6c",{"type":17,"value":14393}," raspberry and ",{"type":11,"tag":68,"props":14395,"children":14397},{"className":14396},[],[14398],{"type":17,"value":14399},"#5c0025",{"type":17,"value":14401}," deep wine respectively),\nwhich leaked a one-color-step deviation into any Nuxt UI primitive\nunder ",{"type":11,"tag":68,"props":14403,"children":14405},{"className":14404},[],[14406],{"type":17,"value":829},{"type":17,"value":14408},". No visual impact on ",{"type":11,"tag":68,"props":14410,"children":14412},{"className":14411},[],[14413],{"type":17,"value":873},{"type":17,"value":14415}," or ",{"type":11,"tag":68,"props":14417,"children":14419},{"className":14418},[],[14420],{"type":17,"value":881},{"type":17,"value":43},{"type":11,"tag":56,"props":14423,"children":14425},{"id":14424},"fixed-hc-primary-palette-aligned-with-adr-0005",[14426],{"type":17,"value":14427},"Fixed — HC primary palette aligned with ADR-0005",{"type":11,"tag":77,"props":14429,"children":14430},{},[14431,14498],{"type":11,"tag":81,"props":14432,"children":14433},{},[14434,14449,14451,14456,14457,14462,14463,14468,14470,14475,14477,14482,14484,14489,14491,14496],{"type":11,"tag":85,"props":14435,"children":14436},{},[14437,14443,14444],{"type":11,"tag":68,"props":14438,"children":14440},{"className":14439},[],[14441],{"type":17,"value":14442},"[data-theme=\"tti-hc\"]",{"type":17,"value":2115},{"type":11,"tag":68,"props":14445,"children":14447},{"className":14446},[],[14448],{"type":17,"value":7046},{"type":17,"value":14450}," now\npins both ",{"type":11,"tag":68,"props":14452,"children":14454},{"className":14453},[],[14455],{"type":17,"value":8913},{"type":17,"value":103},{"type":11,"tag":68,"props":14458,"children":14460},{"className":14459},[],[14461],{"type":17,"value":14376},{"type":17,"value":7202},{"type":11,"tag":68,"props":14464,"children":14466},{"className":14465},[],[14467],{"type":17,"value":14362},{"type":17,"value":14469},". The 500 override is the visible fix — solid Nuxt UI\nprimitives (UButton, UBadge, etc.) in HC mode were rendering\n",{"type":11,"tag":68,"props":14471,"children":14473},{"className":14472},[],[14474],{"type":17,"value":14399},{"type":17,"value":14476}," from ",{"type":11,"tag":68,"props":14478,"children":14480},{"className":14479},[],[14481],{"type":17,"value":14384},{"type":17,"value":14483}," instead of the ADR-stated ",{"type":11,"tag":68,"props":14485,"children":14487},{"className":14486},[],[14488],{"type":17,"value":14362},{"type":17,"value":14490},". The\n400 override is defensive (Nuxt UI's ",{"type":11,"tag":68,"props":14492,"children":14494},{"className":14493},[],[14495],{"type":17,"value":4907},{"type":17,"value":14497}," path doesn't fire\nunder HC, so 400 isn't read in practice) but keeps the \"three\nblocks, each a full override of every semantic token\" discipline\nfrom ADR-0005 intact.",{"type":11,"tag":81,"props":14499,"children":14500},{},[14501],{"type":17,"value":14502},"Pure values throughout, in keeping with HC's \"zero color-mixing\"\nprinciple.",{"type":11,"tag":45,"props":14504,"children":14506},{"id":14505},"_141-2026-05-14",[14507,14512],{"type":11,"tag":50,"props":14508,"children":14509},{},[14510],{"type":17,"value":14511},"1.4.1",{"type":17,"value":14351},{"type":11,"tag":19,"props":14514,"children":14515},{},[14516,14518,14524,14526,14531,14533,14539,14540,14546,14547,14553,14554,14560,14562,14567,14569,14574,14576,14582,14584,14589,14591,14596],{"type":17,"value":14517},"Patch: bridge ",{"type":11,"tag":68,"props":14519,"children":14521},{"className":14520},[],[14522],{"type":17,"value":14523},"@nuxtjs\u002Fcolor-mode",{"type":17,"value":14525}," to Nuxt UI's ",{"type":11,"tag":68,"props":14527,"children":14529},{"className":14528},[],[14530],{"type":17,"value":4907},{"type":17,"value":14532}," class so Nuxt\nUI primitives actually inherit the dark theme. Completes v1.4.0's\ndark-accent retune — without this bridge, ",{"type":11,"tag":68,"props":14534,"children":14536},{"className":14535},[],[14537],{"type":17,"value":14538},"\u003CUButton>",{"type":17,"value":875},{"type":11,"tag":68,"props":14541,"children":14543},{"className":14542},[],[14544],{"type":17,"value":14545},"\u003CUInput>",{"type":17,"value":883},{"type":11,"tag":68,"props":14548,"children":14550},{"className":14549},[],[14551],{"type":17,"value":14552},"\u003CUBadge>",{"type":17,"value":875},{"type":11,"tag":68,"props":14555,"children":14557},{"className":14556},[],[14558],{"type":17,"value":14559},"\u003CUSelect>",{"type":17,"value":14561}," stayed in light mode under ",{"type":11,"tag":68,"props":14563,"children":14565},{"className":14564},[],[14566],{"type":17,"value":881},{"type":17,"value":14568},"\nbecause Nuxt UI's runtime CSS rule is gated on ",{"type":11,"tag":68,"props":14570,"children":14572},{"className":14571},[],[14573],{"type":17,"value":4907},{"type":17,"value":14575},", but our\ncolor-mode is configured with ",{"type":11,"tag":68,"props":14577,"children":14579},{"className":14578},[],[14580],{"type":17,"value":14581},"classSuffix: \"\"",{"type":17,"value":14583}," so it emits\n",{"type":11,"tag":68,"props":14585,"children":14587},{"className":14586},[],[14588],{"type":17,"value":881},{"type":17,"value":14590},", not ",{"type":11,"tag":68,"props":14592,"children":14594},{"className":14593},[],[14595],{"type":17,"value":4907},{"type":17,"value":43},{"type":11,"tag":56,"props":14598,"children":14600},{"id":14599},"fixed-nuxt-ui-primitives-in-dark-theme",[14601],{"type":17,"value":14602},"Fixed — Nuxt UI primitives in dark theme",{"type":11,"tag":77,"props":14604,"children":14605},{},[14606,14671],{"type":11,"tag":81,"props":14607,"children":14608},{},[14609,14618,14619,14628,14630,14636,14638,14643,14644,14649,14651,14656,14657,14662,14664,14669],{"type":11,"tag":85,"props":14610,"children":14611},{},[14612],{"type":11,"tag":68,"props":14613,"children":14615},{"className":14614},[],[14616],{"type":17,"value":14617},"app\u002Fplugins\u002Fnuxt-ui-dark-bridge.client.ts",{"type":17,"value":2078},{"type":11,"tag":25,"props":14620,"children":14621},{"href":14617},[14622],{"type":11,"tag":68,"props":14623,"children":14625},{"className":14624},[],[14626],{"type":17,"value":14627},"view",{"type":17,"value":14629},")\nwatches ",{"type":11,"tag":68,"props":14631,"children":14633},{"className":14632},[],[14634],{"type":17,"value":14635},"colorMode.value",{"type":17,"value":14637}," and toggles ",{"type":11,"tag":68,"props":14639,"children":14641},{"className":14640},[],[14642],{"type":17,"value":4907},{"type":17,"value":4849},{"type":11,"tag":68,"props":14645,"children":14647},{"className":14646},[],[14648],{"type":17,"value":4855},{"type":17,"value":14650}," when the\npreference is ",{"type":11,"tag":68,"props":14652,"children":14654},{"className":14653},[],[14655],{"type":17,"value":881},{"type":17,"value":293},{"type":11,"tag":68,"props":14658,"children":14660},{"className":14659},[],[14661],{"type":17,"value":829},{"type":17,"value":14663}," is light-surfaced per ADR-0005\nso it intentionally stays without ",{"type":11,"tag":68,"props":14665,"children":14667},{"className":14666},[],[14668],{"type":17,"value":4907},{"type":17,"value":14670}," (Nuxt UI's light path is\ncorrect for HC).",{"type":11,"tag":81,"props":14672,"children":14673},{},[14674,14676,14682,14684,14689,14691,14696],{"type":17,"value":14675},"Brief FOUC trade-off: the boot script sets ",{"type":11,"tag":68,"props":14677,"children":14679},{"className":14678},[],[14680],{"type":17,"value":14681},"[data-theme]",{"type":17,"value":14683}," + the\ntheme class before Vue hydrates, but this Vue plugin only runs on\nhydration. On a fresh load in ",{"type":11,"tag":68,"props":14685,"children":14687},{"className":14686},[],[14688],{"type":17,"value":881},{"type":17,"value":14690},", primitives flash light\nbriefly before this plugin adds ",{"type":11,"tag":68,"props":14692,"children":14694},{"className":14693},[],[14695],{"type":17,"value":4907},{"type":17,"value":14697},". The surrounding page is\nalready dark from tokens.css so the flash should be imperceptible;\nthe harder fix (patching the boot script to add both classes at\nonce) is parked for now.",{"type":11,"tag":56,"props":14699,"children":14701},{"id":14700},"changed-color-maroon-400-consolidated-onto-the-dark-mode-teal-accent",[14702,14703,14708],{"type":17,"value":14187},{"type":11,"tag":68,"props":14704,"children":14706},{"className":14705},[],[14707],{"type":17,"value":8913},{"type":17,"value":14709}," consolidated onto the dark-mode teal accent",{"type":11,"tag":19,"props":14711,"children":14712},{},[14713,14715,14720,14722,14728],{"type":17,"value":14714},"With the bridge plugin firing ",{"type":11,"tag":68,"props":14716,"children":14718},{"className":14717},[],[14719],{"type":17,"value":4907},{"type":17,"value":14721},", Nuxt UI's ",{"type":11,"tag":68,"props":14723,"children":14725},{"className":14724},[],[14726],{"type":17,"value":14727},"text-inverted",{"type":17,"value":14729},"\nflips from white to stone-900 in dark mode, which changes the\ncalculus for the primary-button fill (the button now carries dark\ntext on top, conventional inverted-button pattern).",{"type":11,"tag":77,"props":14731,"children":14732},{},[14733,14781],{"type":11,"tag":81,"props":14734,"children":14735},{},[14736,14744,14745,14750,14752,14758,14760,14765,14767,14772,14774,14779],{"type":11,"tag":85,"props":14737,"children":14738},{},[14739],{"type":11,"tag":68,"props":14740,"children":14742},{"className":14741},[],[14743],{"type":17,"value":8913},{"type":17,"value":2115},{"type":11,"tag":68,"props":14746,"children":14748},{"className":14747},[],[14749],{"type":17,"value":8850},{"type":17,"value":14751}," retuned from\nbrick-wine ",{"type":11,"tag":68,"props":14753,"children":14755},{"className":14754},[],[14756],{"type":17,"value":14757},"#702C28",{"type":17,"value":14759}," to lifted TTI teal ",{"type":11,"tag":68,"props":14761,"children":14763},{"className":14762},[],[14764],{"type":17,"value":1209},{"type":17,"value":14766}," — the same value\nas ",{"type":11,"tag":68,"props":14768,"children":14770},{"className":14769},[],[14771],{"type":17,"value":2712},{"type":17,"value":14773},". Consolidates the dark-mode accent system on\na single hue: maroon stays anchored on light surfaces and in\n",{"type":11,"tag":68,"props":14775,"children":14777},{"className":14776},[],[14778],{"type":17,"value":2736},{"type":17,"value":14780}," for marketing panels, but every primary-colored\ncontrol in dark mode reads as TTI teal. Black-on-#6BB4C0 ≈ 7.9:1\nAAA.",{"type":11,"tag":81,"props":14782,"children":14783},{},[14784,14786,14791,14792,14798,14799,14804],{"type":17,"value":14785},"Earlier wine candidates (",{"type":11,"tag":68,"props":14787,"children":14789},{"className":14788},[],[14790],{"type":17,"value":14391},{"type":17,"value":95},{"type":11,"tag":68,"props":14793,"children":14795},{"className":14794},[],[14796],{"type":17,"value":14797},"#7a1233",{"type":17,"value":95},{"type":11,"tag":68,"props":14800,"children":14802},{"className":14801},[],[14803],{"type":17,"value":14757},{"type":17,"value":14805},") all rang\nawkwardly next to the teal accent — either too pink (high\nsaturation) or too dim (deep brown against a near-black sidebar).\nPicking teal unifies the dark-mode accent story.",{"type":11,"tag":45,"props":14807,"children":14809},{"id":14808},"_140-2026-05-14",[14810,14815],{"type":11,"tag":50,"props":14811,"children":14812},{},[14813],{"type":17,"value":14814},"1.4.0",{"type":17,"value":14351},{"type":11,"tag":19,"props":14817,"children":14818},{},[14819,14821,14827,14828,14834],{"type":17,"value":14820},"Nuxt UI gap-analysis batch (five new components covering kbd hints,\nprose typography, hierarchical lists, and edge-anchored drawers,\nplus a global keyboard-shortcut layer), the Batch J visual-language\napplication sweep, and a self-hosted fonts migration. No breaking\nAPI changes — pin bump from ",{"type":11,"tag":68,"props":14822,"children":14824},{"className":14823},[],[14825],{"type":17,"value":14826},"#v1.3.0",{"type":17,"value":6201},{"type":11,"tag":68,"props":14829,"children":14831},{"className":14830},[],[14832],{"type":17,"value":14833},"#v1.4.0",{"type":17,"value":14835}," is additive only.",{"type":11,"tag":56,"props":14837,"children":14839},{"id":14838},"changed-self-hosted-fonts-via-fontsource-scriptssync-fontsmjs",[14840,14842,14848,14849],{"type":17,"value":14841},"Changed — self-hosted fonts via ",{"type":11,"tag":68,"props":14843,"children":14845},{"className":14844},[],[14846],{"type":17,"value":14847},"@fontsource\u002F*",{"type":17,"value":912},{"type":11,"tag":68,"props":14850,"children":14852},{"className":14851},[],[14853],{"type":17,"value":14854},"scripts\u002Fsync-fonts.mjs",{"type":11,"tag":19,"props":14856,"children":14857},{},[14858,14860,14865,14867,14873,14875,14881,14883,14888,14890,14896,14898,14906],{"type":17,"value":14859},"Replaces the ",{"type":11,"tag":68,"props":14861,"children":14863},{"className":14862},[],[14864],{"type":17,"value":5284},{"type":17,"value":14866}," module (Google-provider auto-fetch) with\nexplicit ",{"type":11,"tag":68,"props":14868,"children":14870},{"className":14869},[],[14871],{"type":17,"value":14872},"@font-face",{"type":17,"value":14874}," declarations in ",{"type":11,"tag":68,"props":14876,"children":14878},{"className":14877},[],[14879],{"type":17,"value":14880},"app\u002Fassets\u002Fcss\u002Ffonts.css",{"type":17,"value":14882},",\nsourced from ",{"type":11,"tag":68,"props":14884,"children":14886},{"className":14885},[],[14887],{"type":17,"value":14847},{"type":17,"value":14889}," npm packages and synced into\n",{"type":11,"tag":68,"props":14891,"children":14893},{"className":14892},[],[14894],{"type":17,"value":14895},"public\u002Ffonts\u002F\u003Cfamily>\u002F*.woff2",{"type":17,"value":14897}," via ",{"type":11,"tag":25,"props":14899,"children":14900},{"href":14854},[14901],{"type":11,"tag":68,"props":14902,"children":14904},{"className":14903},[],[14905],{"type":17,"value":14854},{"type":17,"value":14907},".\nAir-gapped-build clean — no CDN dependency at runtime or build time,\nwhich matters for state-agency deploys and consumer apps that ship\nbehind enterprise proxies.",{"type":11,"tag":77,"props":14909,"children":14910},{},[14911,14932,14945],{"type":11,"tag":81,"props":14912,"children":14913},{},[14914,14923,14925,14931],{"type":11,"tag":85,"props":14915,"children":14916},{},[14917],{"type":11,"tag":68,"props":14918,"children":14920},{"className":14919},[],[14921],{"type":17,"value":14922},"@fontsource\u002F{open-sans,oswald,work-sans,public-sans,jetbrains-mono}",{"type":17,"value":14924},"\nadded as devDependencies. Re-sync with ",{"type":11,"tag":68,"props":14926,"children":14928},{"className":14927},[],[14929],{"type":17,"value":14930},"npm run sync:fonts",{"type":17,"value":43},{"type":11,"tag":81,"props":14933,"children":14934},{},[14935,14943],{"type":11,"tag":85,"props":14936,"children":14937},{},[14938],{"type":11,"tag":68,"props":14939,"children":14941},{"className":14940},[],[14942],{"type":17,"value":14880},{"type":17,"value":14944}," declares every face\u002Fweight\u002Fstyle\ncombination the four-family rule uses; loaded first in the CSS\ncascade so subsequent rules can reference the families.",{"type":11,"tag":81,"props":14946,"children":14947},{},[14948,14956,14958,14963,14964,14970,14972,14978,14980,14985,14987,14993],{"type":11,"tag":85,"props":14949,"children":14950},{},[14951],{"type":11,"tag":68,"props":14952,"children":14954},{"className":14953},[],[14955],{"type":17,"value":2121},{"type":17,"value":14957}," drops ",{"type":11,"tag":68,"props":14959,"children":14961},{"className":14960},[],[14962],{"type":17,"value":5284},{"type":17,"value":14476},{"type":11,"tag":68,"props":14965,"children":14967},{"className":14966},[],[14968],{"type":17,"value":14969},"modules",{"type":17,"value":14971}," and its\n",{"type":11,"tag":68,"props":14973,"children":14975},{"className":14974},[],[14976],{"type":17,"value":14977},"fonts",{"type":17,"value":14979}," block; prepends ",{"type":11,"tag":68,"props":14981,"children":14983},{"className":14982},[],[14984],{"type":17,"value":5292},{"type":17,"value":14986}," to the ",{"type":11,"tag":68,"props":14988,"children":14990},{"className":14989},[],[14991],{"type":17,"value":14992},"css",{"type":17,"value":14994}," array.",{"type":11,"tag":56,"props":14996,"children":14998},{"id":14997},"changed-dark-theme-brand-accent-retuned-to-lifted-tti-teal",[14999],{"type":17,"value":15000},"Changed — dark theme brand accent retuned to lifted-TTI-teal",{"type":11,"tag":19,"props":15002,"children":15003},{},[15004,15006,15011,15013,15019,15021,15026,15028,15033],{"type":17,"value":15005},"Dark theme's ",{"type":11,"tag":68,"props":15007,"children":15009},{"className":15008},[],[15010],{"type":17,"value":2712},{"type":17,"value":15012}," switches from lightened maroon\n(",{"type":11,"tag":68,"props":15014,"children":15016},{"className":15015},[],[15017],{"type":17,"value":15018},"#e795a8",{"type":17,"value":15020},") to lifted TTI teal (",{"type":11,"tag":68,"props":15022,"children":15024},{"className":15023},[],[15025],{"type":17,"value":1209},{"type":17,"value":15027}," — the tertiary swatch from\n",{"type":11,"tag":68,"props":15029,"children":15031},{"className":15030},[],[15032],{"type":17,"value":8883},{"type":17,"value":15034},", lifted for dark-page contrast). Earlier values\nread too pink in the studio where most accent points live on small\nchrome elements (composer border, focus rings, active-tab text);\nteal reads more institutional at small sizes.",{"type":11,"tag":77,"props":15036,"children":15037},{},[15038,15078,15107],{"type":11,"tag":81,"props":15039,"children":15040},{},[15041,15056,15058,15063,15064,15069,15070,15076],{"type":11,"tag":85,"props":15042,"children":15043},{},[15044,15049,15050],{"type":11,"tag":68,"props":15045,"children":15047},{"className":15046},[],[15048],{"type":17,"value":2712},{"type":17,"value":875},{"type":11,"tag":68,"props":15051,"children":15053},{"className":15052},[],[15054],{"type":17,"value":15055},"--brand-primary-deep",{"type":17,"value":15057}," retuned in\n",{"type":11,"tag":68,"props":15059,"children":15061},{"className":15060},[],[15062],{"type":17,"value":8850},{"type":17,"value":6201},{"type":11,"tag":68,"props":15065,"children":15067},{"className":15066},[],[15068],{"type":17,"value":1209},{"type":17,"value":875},{"type":11,"tag":68,"props":15071,"children":15073},{"className":15072},[],[15074],{"type":17,"value":15075},"#5B9CA8",{"type":17,"value":15077},". Clears AAA on\nevery dark surface (7.1:1 on raised, ~8.2:1 on page, ~8.7:1 on\nsunken).",{"type":11,"tag":81,"props":15079,"children":15080},{},[15081,15090,15092,15097,15099,15105],{"type":11,"tag":85,"props":15082,"children":15083},{},[15084],{"type":11,"tag":68,"props":15085,"children":15087},{"className":15086},[],[15088],{"type":17,"value":15089},"--color-maroon-400 = #702C28",{"type":17,"value":15091}," override added — Nuxt UI v4's\nsolid-variant button fill uses primary-400 in dark themes; the\nunmodified palette value (#b14a6c) reads as raspberry pink, and an\nintermediate ",{"type":11,"tag":68,"props":15093,"children":15095},{"className":15094},[],[15096],{"type":17,"value":14797},{"type":17,"value":15098}," still rang loud against the teal accent\n(mid-saturation magenta hue). Reuses the existing\n",{"type":11,"tag":68,"props":15100,"children":15102},{"className":15101},[],[15103],{"type":17,"value":15104},"--map-seq-maroon-2",{"type":17,"value":15106}," value — brick-wine, low saturation,\nbrown-leaning — so the button recedes into the dark page surface.\nEdge contrast is ~1.9:1 vs page (below WCAG 1.4.11's 3:1 UI\nthreshold by design); readability comes from the white label\n(clears 10:1 on this fill) and the button's shape \u002F hover state,\nnot from surface contrast.",{"type":11,"tag":81,"props":15108,"children":15109},{},[15110,15119],{"type":11,"tag":85,"props":15111,"children":15112},{},[15113],{"type":11,"tag":68,"props":15114,"children":15116},{"className":15115},[],[15117],{"type":17,"value":15118},"--text-brand",{"type":17,"value":15120}," repointed to the new teal-deep so brand-tinted\ninline text stays coherent with the accent.",{"type":11,"tag":19,"props":15122,"children":15123},{},[15124,15126,15131,15133,15138,15140,15146],{"type":17,"value":15125},"Maroon brand presence preserved via ",{"type":11,"tag":68,"props":15127,"children":15129},{"className":15128},[],[15130],{"type":17,"value":2736},{"type":17,"value":15132}," (always #5C0025)\non marketing panels, the ",{"type":11,"tag":68,"props":15134,"children":15136},{"className":15135},[],[15137],{"type":17,"value":8913},{"type":17,"value":15139}," override on solid\nbuttons, and ",{"type":11,"tag":68,"props":15141,"children":15143},{"className":15142},[],[15144],{"type":17,"value":15145},"--chart-1",{"type":17,"value":15147}," pinned to a wine-leaning value so the brand\nchart series doesn't silently shift to teal.",{"type":11,"tag":56,"props":15149,"children":15151},{"id":15150},"added-tuxslideover-edge-anchored-drawer",[15152,15153,15158],{"type":17,"value":4412},{"type":11,"tag":68,"props":15154,"children":15156},{"className":15155},[],[15157],{"type":17,"value":12283},{"type":17,"value":15159}," (edge-anchored drawer)",{"type":11,"tag":19,"props":15161,"children":15162},{},[15163,15165,15170,15171,15176,15178,15183],{"type":17,"value":15164},"Slice 4 (final) of the Nuxt UI gap-analysis follow-through. Distinct\naffordance from ",{"type":11,"tag":68,"props":15166,"children":15168},{"className":15167},[],[15169],{"type":17,"value":11346},{"type":17,"value":1244},{"type":11,"tag":68,"props":15172,"children":15174},{"className":15173},[],[15175],{"type":17,"value":12283},{"type":17,"value":15177}," slides in from a viewport\nedge and preserves the reading context behind the scrim. Use for row\ndetail (click a ",{"type":11,"tag":68,"props":15179,"children":15181},{"className":15180},[],[15182],{"type":17,"value":3357},{"type":17,"value":15184}," row → slide in field metadata),\nfilter panels, mobile nav reveals, and bottom action sheets.",{"type":11,"tag":77,"props":15186,"children":15187},{},[15188,15261,15306,15410,15435,15452],{"type":11,"tag":81,"props":15189,"children":15190},{},[15191,15199,15200,15209,15210,15220,15222,15227,15229,15235,15237,15243,15245,15251,15253,15259],{"type":11,"tag":85,"props":15192,"children":15193},{},[15194],{"type":11,"tag":68,"props":15195,"children":15197},{"className":15196},[],[15198],{"type":17,"value":12283},{"type":17,"value":2078},{"type":11,"tag":25,"props":15201,"children":15203},{"href":15202},"app\u002Fcomponents\u002FTuxSlideover.vue",[15204],{"type":11,"tag":68,"props":15205,"children":15207},{"className":15206},[],[15208],{"type":17,"value":15202},{"type":17,"value":489},{"type":11,"tag":25,"props":15211,"children":15213},{"href":15212},"app\u002Fpages\u002Fcomponents\u002Fslideover.vue",[15214],{"type":11,"tag":68,"props":15215,"children":15217},{"className":15216},[],[15218],{"type":17,"value":15219},"\u002Fcomponents\u002Fslideover",{"type":17,"value":15221},") —\nedge-anchored panel built on the native ",{"type":11,"tag":68,"props":15223,"children":15225},{"className":15224},[],[15226],{"type":17,"value":8777},{"type":17,"value":15228}," element so focus\ntrap, escape handling, scrim rendering, and ARIA semantics come from\nthe platform. Slide animation rides Batch J's ",{"type":11,"tag":68,"props":15230,"children":15232},{"className":15231},[],[15233],{"type":17,"value":15234},"--ease-corridor",{"type":17,"value":15236},"\ncurve over ",{"type":11,"tag":68,"props":15238,"children":15240},{"className":15239},[],[15241],{"type":17,"value":15242},"--motion-base",{"type":17,"value":15244}," duration. The panel itself opts into\n",{"type":11,"tag":68,"props":15246,"children":15248},{"className":15247},[],[15249],{"type":17,"value":15250},"data-tux-overlay",{"type":17,"value":15252}," (Batch J easing) and ",{"type":11,"tag":68,"props":15254,"children":15256},{"className":15255},[],[15257],{"type":17,"value":15258},"data-tux-elevation=\"overlay\"",{"type":17,"value":15260},"\n(Batch J shadow tier) so it inherits the system's anchored-surface\nrhythm without duplicate CSS.",{"type":11,"tag":81,"props":15262,"children":15263},{},[15264,15269,15270],{"type":11,"tag":85,"props":15265,"children":15266},{},[15267],{"type":17,"value":15268},"Three sides",{"type":17,"value":4211},{"type":11,"tag":77,"props":15271,"children":15272},{},[15273,15284,15295],{"type":11,"tag":81,"props":15274,"children":15275},{},[15276,15282],{"type":11,"tag":68,"props":15277,"children":15279},{"className":15278},[],[15280],{"type":17,"value":15281},"right",{"type":17,"value":15283}," (default) — row detail, filter panel. 28rem wide, full\nviewport height, rounded on the left edge.",{"type":11,"tag":81,"props":15285,"children":15286},{},[15287,15293],{"type":11,"tag":68,"props":15288,"children":15290},{"className":15289},[],[15291],{"type":17,"value":15292},"left",{"type":17,"value":15294}," — mobile nav drawer. Mirror of right.",{"type":11,"tag":81,"props":15296,"children":15297},{},[15298,15304],{"type":11,"tag":68,"props":15299,"children":15301},{"className":15300},[],[15302],{"type":17,"value":15303},"bottom",{"type":17,"value":15305}," — action sheet. Full viewport width, 24rem tall, rounded\non the top edge.",{"type":11,"tag":81,"props":15307,"children":15308},{},[15309,15314,15315],{"type":11,"tag":85,"props":15310,"children":15311},{},[15312],{"type":17,"value":15313},"Props",{"type":17,"value":4211},{"type":11,"tag":77,"props":15316,"children":15317},{},[15318,15329,15347,15358,15375,15393],{"type":11,"tag":81,"props":15319,"children":15320},{},[15321,15327],{"type":11,"tag":68,"props":15322,"children":15324},{"className":15323},[],[15325],{"type":17,"value":15326},"v-model: boolean",{"type":17,"value":15328}," — open \u002F closed",{"type":11,"tag":81,"props":15330,"children":15331},{},[15332,15338,15340,15346],{"type":11,"tag":68,"props":15333,"children":15335},{"className":15334},[],[15336],{"type":17,"value":15337},"side: \"left\" | \"right\" | \"bottom\"",{"type":17,"value":15339}," (default ",{"type":11,"tag":68,"props":15341,"children":15343},{"className":15342},[],[15344],{"type":17,"value":15345},"\"right\"",{"type":17,"value":2350},{"type":11,"tag":81,"props":15348,"children":15349},{},[15350,15356],{"type":11,"tag":68,"props":15351,"children":15353},{"className":15352},[],[15354],{"type":17,"value":15355},"size: string",{"type":17,"value":15357}," — CSS length for width (left\u002Fright) or height (bottom)",{"type":11,"tag":81,"props":15359,"children":15360},{},[15361,15366,15367,15373],{"type":11,"tag":68,"props":15362,"children":15364},{"className":15363},[],[15365],{"type":17,"value":13739},{"type":17,"value":912},{"type":11,"tag":68,"props":15368,"children":15370},{"className":15369},[],[15371],{"type":17,"value":15372},"eyebrow",{"type":17,"value":15374}," — header heading + optional eyebrow above",{"type":11,"tag":81,"props":15376,"children":15377},{},[15378,15384,15386,15392],{"type":11,"tag":68,"props":15379,"children":15381},{"className":15380},[],[15382],{"type":17,"value":15383},"showClose: boolean",{"type":17,"value":15385}," — top-right close button (default ",{"type":11,"tag":68,"props":15387,"children":15389},{"className":15388},[],[15390],{"type":17,"value":15391},"true",{"type":17,"value":2350},{"type":11,"tag":81,"props":15394,"children":15395},{},[15396,15402,15404,15409],{"type":11,"tag":68,"props":15397,"children":15399},{"className":15398},[],[15400],{"type":17,"value":15401},"closeOnBackdrop: boolean",{"type":17,"value":15403}," — dismiss on scrim click (default ",{"type":11,"tag":68,"props":15405,"children":15407},{"className":15406},[],[15408],{"type":17,"value":15391},{"type":17,"value":2350},{"type":11,"tag":81,"props":15411,"children":15412},{},[15413,15418,15420,15425,15427,15433],{"type":11,"tag":85,"props":15414,"children":15415},{},[15416],{"type":17,"value":15417},"Slots",{"type":17,"value":15419}," — default (body), ",{"type":11,"tag":68,"props":15421,"children":15423},{"className":15422},[],[15424],{"type":17,"value":13316},{"type":17,"value":15426}," (replace eyebrow + title region),\n",{"type":11,"tag":68,"props":15428,"children":15430},{"className":15429},[],[15431],{"type":17,"value":15432},"#footer",{"type":17,"value":15434}," (action row with sunken-surface tint).",{"type":11,"tag":81,"props":15436,"children":15437},{},[15438,15443,15444,15450],{"type":11,"tag":85,"props":15439,"children":15440},{},[15441],{"type":17,"value":15442},"Reduced motion",{"type":17,"value":1244},{"type":11,"tag":68,"props":15445,"children":15447},{"className":15446},[],[15448],{"type":17,"value":15449},"@media (prefers-reduced-motion: reduce)",{"type":17,"value":15451},"\nskips the slide animation; the panel appears in place.",{"type":11,"tag":81,"props":15453,"children":15454},{},[15455,15460],{"type":11,"tag":85,"props":15456,"children":15457},{},[15458],{"type":17,"value":15459},"Doctrine note",{"type":17,"value":15461}," — added \"Slideover vs Modal\" section to the demo\npage: choose slideover when the user is drilling into the page\nthey're on (row detail, filter panel, side-by-side editor); choose\nmodal when the underlying page doesn't matter (confirmation, fatal\nerror, full-attention form).",{"type":11,"tag":56,"props":15463,"children":15465},{"id":15464},"added-tuxtree-hierarchical-list",[15466,15467,15472],{"type":17,"value":4412},{"type":11,"tag":68,"props":15468,"children":15470},{"className":15469},[],[15471],{"type":17,"value":7961},{"type":17,"value":15473}," (hierarchical list)",{"type":11,"tag":19,"props":15475,"children":15476},{},[15477,15479,15485],{"type":17,"value":15478},"Slice 3 of the Nuxt UI gap-analysis follow-through. Fills the\nsitemap \u002F corpus \u002F BI-dataset-explorer gap identified in the Nuxt UI\naudit. Native (not a ",{"type":11,"tag":68,"props":15480,"children":15482},{"className":15481},[],[15483],{"type":17,"value":15484},"UTree",{"type":17,"value":15486}," wrapper) since the visual is\nbrand-specific and the keyboard semantics are simple enough to own.",{"type":11,"tag":77,"props":15488,"children":15489},{},[15490,15566,15596,15712,15738,15778,15806],{"type":11,"tag":81,"props":15491,"children":15492},{},[15493,15501,15502,15510,15512,15518,15520,15525,15527,15533,15534,15540,15542,15548,15550,15556,15558,15564],{"type":11,"tag":85,"props":15494,"children":15495},{},[15496],{"type":11,"tag":68,"props":15497,"children":15499},{"className":15498},[],[15500],{"type":17,"value":7961},{"type":17,"value":2078},{"type":11,"tag":25,"props":15503,"children":15504},{"href":7954},[15505],{"type":11,"tag":68,"props":15506,"children":15508},{"className":15507},[],[15509],{"type":17,"value":7954},{"type":17,"value":15511},")\n— recursive hierarchical list. Each node carries\n",{"type":11,"tag":68,"props":15513,"children":15515},{"className":15514},[],[15516],{"type":17,"value":15517},"{ id, label, icon?, description?, mono?, to?, href?, badge?, children? }",{"type":17,"value":15519},".\nPass ",{"type":11,"tag":68,"props":15521,"children":15523},{"className":15522},[],[15524],{"type":17,"value":6032},{"type":17,"value":15526}," for internal nav (renders ",{"type":11,"tag":68,"props":15528,"children":15530},{"className":15529},[],[15531],{"type":17,"value":15532},"\u003CNuxtLink>",{"type":17,"value":786},{"type":11,"tag":68,"props":15535,"children":15537},{"className":15536},[],[15538],{"type":17,"value":15539},"href",{"type":17,"value":15541}," for\nexternal, or leave both off for a pure toggle\u002Fselect row (renders\n",{"type":11,"tag":68,"props":15543,"children":15545},{"className":15544},[],[15546],{"type":17,"value":15547},"\u003Cdiv role=\"button\" tabindex=\"0\">",{"type":17,"value":15549}," to sidestep Tailwind v4's\n",{"type":11,"tag":68,"props":15551,"children":15553},{"className":15552},[],[15554],{"type":17,"value":15555},"@layer base",{"type":17,"value":15557}," button reset, which would otherwise win over scoped\nCSS via layer cascade order). Set ",{"type":11,"tag":68,"props":15559,"children":15561},{"className":15560},[],[15562],{"type":17,"value":15563},"mono: true",{"type":17,"value":15565}," on a node to render\nits label in JetBrains Mono — useful for path \u002F id \u002F hash leaf\nrows.",{"type":11,"tag":81,"props":15567,"children":15568},{},[15569,15577,15578,15586,15588,15594],{"type":11,"tag":85,"props":15570,"children":15571},{},[15572],{"type":11,"tag":68,"props":15573,"children":15575},{"className":15574},[],[15576],{"type":17,"value":7949},{"type":17,"value":2078},{"type":11,"tag":25,"props":15579,"children":15580},{"href":7942},[15581],{"type":11,"tag":68,"props":15582,"children":15584},{"className":15583},[],[15585],{"type":17,"value":7942},{"type":17,"value":15587},")\n— single-row recursive child component. Owns the row chrome\n(chevron, icon, label-block, badge) and indents by depth via\n",{"type":11,"tag":68,"props":15589,"children":15591},{"className":15590},[],[15592],{"type":17,"value":15593},"padding-left",{"type":17,"value":15595},". Expand state lives in the parent tree; this\ncomponent just queries it via a callback prop.",{"type":11,"tag":81,"props":15597,"children":15598},{},[15599,15610,15611],{"type":11,"tag":85,"props":15600,"children":15601},{},[15602,15604,15609],{"type":17,"value":15603},"Props (",{"type":11,"tag":68,"props":15605,"children":15607},{"className":15606},[],[15608],{"type":17,"value":7961},{"type":17,"value":2350},{"type":17,"value":4211},{"type":11,"tag":77,"props":15612,"children":15613},{},[15614,15625,15636,15647,15664,15675,15692],{"type":11,"tag":81,"props":15615,"children":15616},{},[15617,15623],{"type":11,"tag":68,"props":15618,"children":15620},{"className":15619},[],[15621],{"type":17,"value":15622},"items: TreeItem[]",{"type":17,"value":15624}," (required)",{"type":11,"tag":81,"props":15626,"children":15627},{},[15628,15634],{"type":11,"tag":68,"props":15629,"children":15631},{"className":15630},[],[15632],{"type":17,"value":15633},"defaultExpanded?: string[]",{"type":17,"value":15635}," — initial open IDs (defaults to every root node)",{"type":11,"tag":81,"props":15637,"children":15638},{},[15639,15645],{"type":11,"tag":68,"props":15640,"children":15642},{"className":15641},[],[15643],{"type":17,"value":15644},"storageKey?: string",{"type":17,"value":15646}," — sessionStorage key for collapse persistence",{"type":11,"tag":81,"props":15648,"children":15649},{},[15650,15656,15658,15663],{"type":11,"tag":68,"props":15651,"children":15653},{"className":15652},[],[15654],{"type":17,"value":15655},"showGuides: boolean",{"type":17,"value":15657}," — 1px sand guide lines under expanded branches (default ",{"type":11,"tag":68,"props":15659,"children":15661},{"className":15660},[],[15662],{"type":17,"value":15391},{"type":17,"value":2350},{"type":11,"tag":81,"props":15665,"children":15666},{},[15667,15673],{"type":11,"tag":68,"props":15668,"children":15670},{"className":15669},[],[15671],{"type":17,"value":15672},"v-model:selected",{"type":17,"value":15674}," — currently-selected node ID",{"type":11,"tag":81,"props":15676,"children":15677},{},[15678,15684,15686],{"type":11,"tag":68,"props":15679,"children":15681},{"className":15680},[],[15682],{"type":17,"value":15683},"ariaLabel: string",{"type":17,"value":15685}," — passed to ",{"type":11,"tag":68,"props":15687,"children":15689},{"className":15688},[],[15690],{"type":17,"value":15691},"[role=\"tree\"]",{"type":11,"tag":81,"props":15693,"children":15694},{},[15695,15697,15703,15704,15710],{"type":17,"value":15696},"Exposes ",{"type":11,"tag":68,"props":15698,"children":15700},{"className":15699},[],[15701],{"type":17,"value":15702},"expandAll()",{"type":17,"value":875},{"type":11,"tag":68,"props":15705,"children":15707},{"className":15706},[],[15708],{"type":17,"value":15709},"collapseAll()",{"type":17,"value":15711}," via template ref",{"type":11,"tag":81,"props":15713,"children":15714},{},[15715,15720,15722,15728,15730,15736],{"type":11,"tag":85,"props":15716,"children":15717},{},[15718],{"type":17,"value":15719},"Visual rhythm",{"type":17,"value":15721}," — maroon chevron + maroon label tint on the\nselected row (anchored by a 2px maroon left bar, mirroring\n",{"type":11,"tag":68,"props":15723,"children":15725},{"className":15724},[],[15726],{"type":17,"value":15727},".tux-cmd__item--active",{"type":17,"value":15729}," so cross-component selection reads\nconsistently). Sand guide lines under expanded branches help deep\nhierarchies stay scan-able. Container query\n(",{"type":11,"tag":68,"props":15731,"children":15733},{"className":15732},[],[15734],{"type":17,"value":15735},"@container tux-tree (max-width: 280px)",{"type":17,"value":15737},") drops the description\nline and tightens padding at narrow widths — per CLAUDE.md rule 1.",{"type":11,"tag":81,"props":15739,"children":15740},{},[15741,15746,15747,15753,15754,15760,15762,15768,15770,15776],{"type":11,"tag":85,"props":15742,"children":15743},{},[15744],{"type":17,"value":15745},"Keyboard nav",{"type":17,"value":1244},{"type":11,"tag":68,"props":15748,"children":15750},{"className":15749},[],[15751],{"type":17,"value":15752},"Enter",{"type":17,"value":875},{"type":11,"tag":68,"props":15755,"children":15757},{"className":15756},[],[15758],{"type":17,"value":15759},"Space",{"type":17,"value":15761}," toggle+select,\n",{"type":11,"tag":68,"props":15763,"children":15765},{"className":15764},[],[15766],{"type":17,"value":15767},"ArrowRight",{"type":17,"value":15769}," expands a collapsed branch, ",{"type":11,"tag":68,"props":15771,"children":15773},{"className":15772},[],[15774],{"type":17,"value":15775},"ArrowLeft",{"type":17,"value":15777}," collapses an\nexpanded branch. Up\u002Fdown navigation uses native focus order through\nthe row elements (which are all focusable).",{"type":11,"tag":81,"props":15779,"children":15780},{},[15781,15786,15787,15797,15799,15804],{"type":11,"tag":85,"props":15782,"children":15783},{},[15784],{"type":17,"value":15785},"Demo page",{"type":17,"value":996},{"type":11,"tag":25,"props":15788,"children":15790},{"href":15789},"app\u002Fpages\u002Fcomponents\u002Ftree.vue",[15791],{"type":11,"tag":68,"props":15792,"children":15794},{"className":15793},[],[15795],{"type":17,"value":15796},"\u002Fcomponents\u002Ftree",{"type":17,"value":15798},"\nshows three example trees: sitemap (route links + badges), corpus \u002F\nfilesystem browser (mono leaf labels, row-count badges), and a\nBI dataset hierarchy (per ADR-0009) with ",{"type":11,"tag":68,"props":15800,"children":15802},{"className":15801},[],[15803],{"type":17,"value":15672},{"type":17,"value":15805}," driving\na focused-field side panel.",{"type":11,"tag":81,"props":15807,"children":15808},{},[15809,15814,15815,15820,15822,15827,15829,15834],{"type":11,"tag":85,"props":15810,"children":15811},{},[15812],{"type":17,"value":15813},"Nav wiring",{"type":17,"value":1244},{"type":11,"tag":68,"props":15816,"children":15818},{"className":15817},[],[15819],{"type":17,"value":1647},{"type":17,"value":15821}," sidebar, ",{"type":11,"tag":68,"props":15823,"children":15825},{"className":15824},[],[15826],{"type":17,"value":8734},{"type":17,"value":15828},"\ncatalog, and ",{"type":11,"tag":68,"props":15830,"children":15832},{"className":15831},[],[15833],{"type":17,"value":8060},{"type":17,"value":15835}," doctrine table.",{"type":11,"tag":56,"props":15837,"children":15839},{"id":15838},"added-tuxprose-typography-refresh-doc-page-surround-nav",[15840,15841,15847,15848,15854],{"type":17,"value":4412},{"type":11,"tag":68,"props":15842,"children":15844},{"className":15843},[],[15845],{"type":17,"value":15846},"TuxProse",{"type":17,"value":95},{"type":11,"tag":68,"props":15849,"children":15851},{"className":15850},[],[15852],{"type":17,"value":15853},"\u002Ftypography",{"type":17,"value":15855}," refresh, doc-page surround nav",{"type":11,"tag":19,"props":15857,"children":15858},{},[15859,15861,15866,15868,15874,15876,15882],{"type":17,"value":15860},"Slice 2 of the Nuxt UI gap-analysis follow-through. Consolidates the\nprose typography that was duplicated across three pages, refreshes the\n",{"type":11,"tag":68,"props":15862,"children":15864},{"className":15863},[],[15865],{"type":17,"value":15853},{"type":17,"value":15867}," foundation page to reflect the four-family rule from\n",{"type":11,"tag":68,"props":15869,"children":15871},{"className":15870},[],[15872],{"type":17,"value":15873},"design\u002Ftux.md",{"type":17,"value":15875},", and adds a prev\u002Fnext surround at the bottom of every\n",{"type":11,"tag":68,"props":15877,"children":15879},{"className":15878},[],[15880],{"type":17,"value":15881},"\u002Fdesign\u002F[doc]",{"type":17,"value":15883}," page.",{"type":11,"tag":77,"props":15885,"children":15886},{},[15887,15972,16032,16061,16092,16260],{"type":11,"tag":81,"props":15888,"children":15889},{},[15890,15898,15899,15908,15909,15919,15921,15927,15929,15934,15936,15942,15944,15950,15952,15958,15959,15964,15965,15970],{"type":11,"tag":85,"props":15891,"children":15892},{},[15893],{"type":11,"tag":68,"props":15894,"children":15896},{"className":15895},[],[15897],{"type":17,"value":15846},{"type":17,"value":2078},{"type":11,"tag":25,"props":15900,"children":15902},{"href":15901},"app\u002Fcomponents\u002FTuxProse.vue",[15903],{"type":11,"tag":68,"props":15904,"children":15906},{"className":15905},[],[15907],{"type":17,"value":15901},{"type":17,"value":489},{"type":11,"tag":25,"props":15910,"children":15912},{"href":15911},"app\u002Fpages\u002Fcomponents\u002Fprose.vue",[15913],{"type":11,"tag":68,"props":15914,"children":15916},{"className":15915},[],[15917],{"type":17,"value":15918},"\u002Fcomponents\u002Fprose",{"type":17,"value":15920},") — typographic shell for\nlong-form markdown. Single ",{"type":11,"tag":68,"props":15922,"children":15924},{"className":15923},[],[15925],{"type":17,"value":15926},":deep()",{"type":17,"value":15928}," block covering H1\u002FH2\u002FH3\u002FH4\u002Fp\u002Ful\u002Fol\u002Fli\u002F\nstrong\u002Fem\u002Fcode\u002Fpre\u002Fa\u002Ftable\u002Fth\u002Ftd\u002Fhr\u002Fblockquote\u002Fimg. Default wrapper is\n",{"type":11,"tag":68,"props":15930,"children":15932},{"className":15931},[],[15933],{"type":17,"value":12397},{"type":17,"value":15935},"; pass ",{"type":11,"tag":68,"props":15937,"children":15939},{"className":15938},[],[15940],{"type":17,"value":15941},"as=\"div\"",{"type":17,"value":15943}," when the parent already provides the\nlandmark. Replaces three duplicate ~130-line ",{"type":11,"tag":68,"props":15945,"children":15947},{"className":15946},[],[15948],{"type":17,"value":15949},".prose-tux :deep(…)",{"type":17,"value":15951},"\nblocks that lived inline in ",{"type":11,"tag":68,"props":15953,"children":15955},{"className":15954},[],[15956],{"type":17,"value":15957},"app\u002Fpages\u002Fchangelog.vue",{"type":17,"value":489},{"type":11,"tag":68,"props":15960,"children":15962},{"className":15961},[],[15963],{"type":17,"value":9834},{"type":17,"value":323},{"type":11,"tag":68,"props":15966,"children":15968},{"className":15967},[],[15969],{"type":17,"value":13460},{"type":17,"value":15971}," (~400\nlines of duplication eliminated).",{"type":11,"tag":81,"props":15973,"children":15974},{},[15975,15999,16000,16006,16008,16014,16016,16022,16024,16030],{"type":11,"tag":85,"props":15976,"children":15977},{},[15978,15984,15986,15991,15997],{"type":11,"tag":68,"props":15979,"children":15981},{"className":15980},[],[15982],{"type":17,"value":15983},"[",{"type":17,"value":15985},"\u002Fdesign\u002F",{"type":11,"tag":50,"props":15987,"children":15988},{},[15989],{"type":17,"value":15990},"doc",{"type":11,"tag":68,"props":15992,"children":15994},{"className":15993},[],[15995],{"type":17,"value":15996},"](app\u002Fpages\u002Fdesign\u002F[doc].vue)",{"type":17,"value":15998}," rewrite",{"type":17,"value":11553},{"type":11,"tag":68,"props":16001,"children":16003},{"className":16002},[],[16004],{"type":17,"value":16005},"\u003CMDCRenderer>",{"type":17,"value":16007},"\nin ",{"type":11,"tag":68,"props":16009,"children":16011},{"className":16010},[],[16012],{"type":17,"value":16013},"\u003CTuxProse>",{"type":17,"value":16015}," and adds a Nuxt-UI-style ",{"type":11,"tag":68,"props":16017,"children":16019},{"className":16018},[],[16020],{"type":17,"value":16021},"ContentSurround",{"type":17,"value":16023}," at article\nbottom (prev \u002F next sibling design docs, sorted by slug). The\nsurround cards opt into Batch J's ",{"type":11,"tag":68,"props":16025,"children":16027},{"className":16026},[],[16028],{"type":17,"value":16029},"data-tux-elevation=\"rest\"",{"type":17,"value":16031}," for\nconsistent shadow tier.",{"type":11,"tag":81,"props":16033,"children":16034},{},[16035,16047,16048,16053,16054,16059],{"type":11,"tag":85,"props":16036,"children":16037},{},[16038],{"type":11,"tag":25,"props":16039,"children":16040},{"href":15957},[16041],{"type":11,"tag":68,"props":16042,"children":16044},{"className":16043},[],[16045],{"type":17,"value":16046},"\u002Fchangelog",{"type":17,"value":11553},{"type":11,"tag":68,"props":16049,"children":16051},{"className":16050},[],[16052],{"type":17,"value":16005},{"type":17,"value":8817},{"type":11,"tag":68,"props":16055,"children":16057},{"className":16056},[],[16058],{"type":17,"value":16013},{"type":17,"value":16060},". Drops the 90-line scoped prose CSS block.",{"type":11,"tag":81,"props":16062,"children":16063},{},[16064,16075,16077,16083,16085,16090],{"type":11,"tag":85,"props":16065,"children":16066},{},[16067],{"type":11,"tag":25,"props":16068,"children":16069},{"href":13460},[16070],{"type":11,"tag":68,"props":16071,"children":16073},{"className":16072},[],[16074],{"type":17,"value":13467},{"type":17,"value":16076}," — wraps the MDC preview in\n",{"type":11,"tag":68,"props":16078,"children":16080},{"className":16079},[],[16081],{"type":17,"value":16082},"\u003CTuxProse as=\"div\">",{"type":17,"value":16084}," so the prose rhythm renders inside the\ncard without doubling up the ",{"type":11,"tag":68,"props":16086,"children":16088},{"className":16087},[],[16089],{"type":17,"value":12397},{"type":17,"value":16091}," landmark. Drops the\n110-line scoped prose CSS block.",{"type":11,"tag":81,"props":16093,"children":16094},{},[16095,16109,16111],{"type":11,"tag":85,"props":16096,"children":16097},{},[16098,16107],{"type":11,"tag":25,"props":16099,"children":16101},{"href":16100},"app\u002Fpages\u002Ftypography.vue",[16102],{"type":11,"tag":68,"props":16103,"children":16105},{"className":16104},[],[16106],{"type":17,"value":15853},{"type":17,"value":16108}," refresh",{"type":17,"value":16110}," — dek now opens with \"Four families,\nthree style variants, one mono\" instead of the stale Public Sans \u002F\nJetBrains Mono framing. Adds:\n",{"type":11,"tag":77,"props":16112,"children":16113},{},[16114,16162,16176,16206,16221],{"type":11,"tag":81,"props":16115,"children":16116},{},[16117,16122,16124,16129,16130,16135,16136,16141,16142,16148,16149,16154,16156,16161],{"type":11,"tag":85,"props":16118,"children":16119},{},[16120],{"type":17,"value":16121},"Family roster",{"type":17,"value":16123}," — five articles, one per token\n(",{"type":11,"tag":68,"props":16125,"children":16127},{"className":16126},[],[16128],{"type":17,"value":2817},{"type":17,"value":95},{"type":11,"tag":68,"props":16131,"children":16133},{"className":16132},[],[16134],{"type":17,"value":5230},{"type":17,"value":95},{"type":11,"tag":68,"props":16137,"children":16139},{"className":16138},[],[16140],{"type":17,"value":2825},{"type":17,"value":95},{"type":11,"tag":68,"props":16143,"children":16145},{"className":16144},[],[16146],{"type":17,"value":16147},"--font-elegant",{"type":17,"value":489},{"type":11,"tag":68,"props":16150,"children":16152},{"className":16151},[],[16153],{"type":17,"value":2848},{"type":17,"value":16155},"), each showing role + sample. Each card opts into\nBatch J's ",{"type":11,"tag":68,"props":16157,"children":16159},{"className":16158},[],[16160],{"type":17,"value":16029},{"type":17,"value":43},{"type":11,"tag":81,"props":16163,"children":16164},{},[16165,16174],{"type":11,"tag":85,"props":16166,"children":16167},{},[16168],{"type":11,"tag":68,"props":16169,"children":16171},{"className":16170},[],[16172],{"type":17,"value":16173},"heading--elegant",{"type":17,"value":16175}," section with both the upright and italic\nforms (the page mentioned the utility before but never showed it).",{"type":11,"tag":81,"props":16177,"children":16178},{},[16179,16184,16186,16192,16193,16198,16199,16204],{"type":11,"tag":85,"props":16180,"children":16181},{},[16182],{"type":17,"value":16183},"Style variants triptych",{"type":17,"value":16185}," — three side-by-side cards\ndemonstrating ",{"type":11,"tag":68,"props":16187,"children":16189},{"className":16188},[],[16190],{"type":17,"value":16191},"default",{"type":17,"value":875},{"type":11,"tag":68,"props":16194,"children":16196},{"className":16195},[],[16197],{"type":17,"value":5244},{"type":17,"value":875},{"type":11,"tag":68,"props":16200,"children":16202},{"className":16201},[],[16203],{"type":17,"value":5251},{"type":17,"value":16205},"\napplied to the same heading text.",{"type":11,"tag":81,"props":16207,"children":16208},{},[16209,16219],{"type":11,"tag":85,"props":16210,"children":16211},{},[16212,16217],{"type":11,"tag":68,"props":16213,"children":16215},{"className":16214},[],[16216],{"type":17,"value":15846},{"type":17,"value":16218}," wrapper demo",{"type":17,"value":16220}," — renders a sample H1 \u002F p \u002F H2 \u002F list \u002F\nblockquote stack inside the wrapper to make the prose rhythm\nlegible to designers landing on the foundation page.",{"type":11,"tag":81,"props":16222,"children":16223},{},[16224,16226,16232,16233,16239,16240,16246,16247,16253,16254,16259],{"type":17,"value":16225},"Cross-links to ",{"type":11,"tag":68,"props":16227,"children":16229},{"className":16228},[],[16230],{"type":17,"value":16231},"\u002Fdesign\u002Ftux",{"type":17,"value":95},{"type":11,"tag":68,"props":16234,"children":16236},{"className":16235},[],[16237],{"type":17,"value":16238},"\u002Ftokens",{"type":17,"value":95},{"type":11,"tag":68,"props":16241,"children":16243},{"className":16242},[],[16244],{"type":17,"value":16245},"\u002Fcomponents\u002Fkbd",{"type":17,"value":489},{"type":11,"tag":68,"props":16248,"children":16250},{"className":16249},[],[16251],{"type":17,"value":16252},"\u002Fstyle-variants",{"type":17,"value":323},{"type":11,"tag":68,"props":16255,"children":16257},{"className":16256},[],[16258],{"type":17,"value":16046},{"type":17,"value":43},{"type":11,"tag":81,"props":16261,"children":16262},{},[16263,16267,16268,16273,16274,16279,16280,16285,16287,16292],{"type":11,"tag":85,"props":16264,"children":16265},{},[16266],{"type":17,"value":15813},{"type":17,"value":1244},{"type":11,"tag":68,"props":16269,"children":16271},{"className":16270},[],[16272],{"type":17,"value":1647},{"type":17,"value":15821},{"type":11,"tag":68,"props":16275,"children":16277},{"className":16276},[],[16278],{"type":17,"value":8734},{"type":17,"value":15828},{"type":11,"tag":68,"props":16281,"children":16283},{"className":16282},[],[16284],{"type":17,"value":8060},{"type":17,"value":16286}," doctrine table all gain the\n",{"type":11,"tag":68,"props":16288,"children":16290},{"className":16289},[],[16291],{"type":17,"value":15846},{"type":17,"value":16293}," row.",{"type":11,"tag":56,"props":16295,"children":16297},{"id":16296},"added-tuxkbd-tuxshortcutshelp-global-defineshortcuts",[16298,16299,16304,16305,16310,16312],{"type":17,"value":4412},{"type":11,"tag":68,"props":16300,"children":16302},{"className":16301},[],[16303],{"type":17,"value":11305},{"type":17,"value":95},{"type":11,"tag":68,"props":16306,"children":16308},{"className":16307},[],[16309],{"type":17,"value":8719},{"type":17,"value":16311},", global ",{"type":11,"tag":68,"props":16313,"children":16315},{"className":16314},[],[16316],{"type":17,"value":8785},{"type":11,"tag":19,"props":16318,"children":16319},{},[16320,16322,16328,16330,16335,16337,16342,16344,16350,16351,16356,16357,16363],{"type":17,"value":16321},"Slice 1 of the Nuxt UI gap-analysis follow-through. Consolidates the\nthree hand-rolled ",{"type":11,"tag":68,"props":16323,"children":16325},{"className":16324},[],[16326],{"type":17,"value":16327},"\u003Ckbd>",{"type":17,"value":16329}," styling blocks that lived inside\n",{"type":11,"tag":68,"props":16331,"children":16333},{"className":16332},[],[16334],{"type":17,"value":8638},{"type":17,"value":16336}," into one component, leans on Nuxt UI's\n",{"type":11,"tag":68,"props":16338,"children":16340},{"className":16339},[],[16341],{"type":17,"value":8785},{"type":17,"value":16343}," for platform-correct hotkey wiring, and mounts a\nglobal command palette + shortcuts-help overlay at the shell so every\npage benefits from ",{"type":11,"tag":68,"props":16345,"children":16347},{"className":16346},[],[16348],{"type":17,"value":16349},"⌘K",{"type":17,"value":95},{"type":11,"tag":68,"props":16352,"children":16354},{"className":16353},[],[16355],{"type":17,"value":3280},{"type":17,"value":323},{"type":11,"tag":68,"props":16358,"children":16360},{"className":16359},[],[16361],{"type":17,"value":16362},"?",{"type":17,"value":43},{"type":11,"tag":77,"props":16365,"children":16366},{},[16367,16454,16519,16587,16740,16783],{"type":11,"tag":81,"props":16368,"children":16369},{},[16370,16378,16379,16387,16388,16397,16399,16404,16406,16411,16412,16417,16418,16423,16425,16430,16432,16438,16439,16445,16446,16452],{"type":11,"tag":85,"props":16371,"children":16372},{},[16373],{"type":11,"tag":68,"props":16374,"children":16376},{"className":16375},[],[16377],{"type":17,"value":11305},{"type":17,"value":2078},{"type":11,"tag":25,"props":16380,"children":16381},{"href":11298},[16382],{"type":11,"tag":68,"props":16383,"children":16385},{"className":16384},[],[16386],{"type":17,"value":11298},{"type":17,"value":95},{"type":11,"tag":25,"props":16389,"children":16391},{"href":16390},"app\u002Fpages\u002Fcomponents\u002Fkbd.vue",[16392],{"type":11,"tag":68,"props":16393,"children":16395},{"className":16394},[],[16396],{"type":17,"value":16245},{"type":17,"value":16398},") — token-styled ",{"type":11,"tag":68,"props":16400,"children":16402},{"className":16401},[],[16403],{"type":17,"value":16327},{"type":17,"value":16405}," with Mac\nvs PC modifier normalization (post-hydration to avoid SSR mismatch).\nThree sizes (",{"type":11,"tag":68,"props":16407,"children":16409},{"className":16408},[],[16410],{"type":17,"value":13507},{"type":17,"value":3280},{"type":11,"tag":68,"props":16413,"children":16415},{"className":16414},[],[16416],{"type":17,"value":8379},{"type":17,"value":3280},{"type":11,"tag":68,"props":16419,"children":16421},{"className":16420},[],[16422],{"type":17,"value":8395},{"type":17,"value":16424},"), single-key + combo + sequence forms,\nbuilt-in glyphs for arrows \u002F enter \u002F escape \u002F tab \u002F space, default\nslot for custom content (function keys, icons). Uses the same\n",{"type":11,"tag":68,"props":16426,"children":16428},{"className":16427},[],[16429],{"type":17,"value":8785},{"type":17,"value":16431}," key grammar (",{"type":11,"tag":68,"props":16433,"children":16435},{"className":16434},[],[16436],{"type":17,"value":16437},"meta",{"type":17,"value":95},{"type":11,"tag":68,"props":16440,"children":16442},{"className":16441},[],[16443],{"type":17,"value":16444},"ctrl",{"type":17,"value":95},{"type":11,"tag":68,"props":16447,"children":16449},{"className":16448},[],[16450],{"type":17,"value":16451},"shift",{"type":17,"value":16453},", …) so a\nbinding declaration and its rendered hint share a vocabulary.",{"type":11,"tag":81,"props":16455,"children":16456},{},[16457,16465,16466,16475,16477,16482,16484,16490,16492,16497,16499,16504,16506,16511,16512,16517],{"type":11,"tag":85,"props":16458,"children":16459},{},[16460],{"type":11,"tag":68,"props":16461,"children":16463},{"className":16462},[],[16464],{"type":17,"value":8719},{"type":17,"value":2078},{"type":11,"tag":25,"props":16467,"children":16469},{"href":16468},"app\u002Fcomponents\u002FTuxShortcutsHelp.vue",[16470],{"type":11,"tag":68,"props":16471,"children":16473},{"className":16472},[],[16474],{"type":17,"value":16468},{"type":17,"value":16476},") — modal\noverlay listing every wired shortcut, grouped. Auto-classifies items\nas combo (modifier+key, rendered as one ",{"type":11,"tag":68,"props":16478,"children":16480},{"className":16479},[],[16481],{"type":17,"value":11305},{"type":17,"value":16483}," group) or sequence\n(no modifier, rendered as ",{"type":11,"tag":68,"props":16485,"children":16487},{"className":16486},[],[16488],{"type":17,"value":16489},"TuxKbd \"then\" TuxKbd",{"type":17,"value":16491},"). Built on\n",{"type":11,"tag":68,"props":16493,"children":16495},{"className":16494},[],[16496],{"type":17,"value":8777},{"type":17,"value":16498}," for free focus trap + scrim + escape semantics, same\nanatomy as ",{"type":11,"tag":68,"props":16500,"children":16502},{"className":16501},[],[16503],{"type":17,"value":8638},{"type":17,"value":16505},". Opt-in ",{"type":11,"tag":68,"props":16507,"children":16509},{"className":16508},[],[16510],{"type":17,"value":15250},{"type":17,"value":2738},{"type":11,"tag":68,"props":16513,"children":16515},{"className":16514},[],[16516],{"type":17,"value":15258},{"type":17,"value":16518}," so it picks up the Batch J easing\ncurve and shadow.",{"type":11,"tag":81,"props":16520,"children":16521},{},[16522,16532,16534,16540,16542,16548,16550,16555,16557,16563,16565,16571,16572,16578,16579,16585],{"type":11,"tag":85,"props":16523,"children":16524},{},[16525,16530],{"type":11,"tag":68,"props":16526,"children":16528},{"className":16527},[],[16529],{"type":17,"value":8638},{"type":17,"value":16531}," refactor",{"type":17,"value":16533}," — replaces the hand-rolled\n",{"type":11,"tag":68,"props":16535,"children":16537},{"className":16536},[],[16538],{"type":17,"value":16539},"keydown",{"type":17,"value":16541}," listener with ",{"type":11,"tag":68,"props":16543,"children":16545},{"className":16544},[],[16546],{"type":17,"value":16547},"defineShortcuts({ meta_k: …, usingInput: true })",{"type":17,"value":16549},"\nfor platform-correct meta\u002Fctrl handling. Replaces the inline ",{"type":11,"tag":68,"props":16551,"children":16553},{"className":16552},[],[16554],{"type":17,"value":16327},{"type":17,"value":16556},"\nmarkup (esc hint, per-item shortcut, footer hints) with ",{"type":11,"tag":68,"props":16558,"children":16560},{"className":16559},[],[16561],{"type":17,"value":16562},"\u003CTuxKbd>",{"type":17,"value":16564},".\nDrops the now-redundant ",{"type":11,"tag":68,"props":16566,"children":16568},{"className":16567},[],[16569],{"type":17,"value":16570},".tux-cmd__esc-hint",{"type":17,"value":489},{"type":11,"tag":68,"props":16573,"children":16575},{"className":16574},[],[16576],{"type":17,"value":16577},".tux-cmd__item-shortcut",{"type":17,"value":323},{"type":11,"tag":68,"props":16580,"children":16582},{"className":16581},[],[16583],{"type":17,"value":16584},".tux-cmd__footer-hint kbd",{"type":17,"value":16586}," scoped\nCSS blocks. Arrow \u002F enter \u002F escape stay on the dialog's local input\nhandler since they're list-nav, not app-level shortcuts.",{"type":11,"tag":81,"props":16588,"children":16589},{},[16590,16603,16605,16611,16613,16619,16621,16627,16629,16635,16637,16642,16644],{"type":11,"tag":85,"props":16591,"children":16592},{},[16593,16595],{"type":17,"value":16594},"Shell-level wiring in ",{"type":11,"tag":25,"props":16596,"children":16597},{"href":1647},[16598],{"type":11,"tag":68,"props":16599,"children":16601},{"className":16600},[],[16602],{"type":17,"value":1647},{"type":17,"value":16604}," — mounts one\n",{"type":11,"tag":68,"props":16606,"children":16608},{"className":16607},[],[16609],{"type":17,"value":16610},"\u003CTuxCommandPalette>",{"type":17,"value":16612}," and one ",{"type":11,"tag":68,"props":16614,"children":16616},{"className":16615},[],[16617],{"type":17,"value":16618},"\u003CTuxShortcutsHelp>",{"type":17,"value":16620}," globally, with\n",{"type":11,"tag":68,"props":16622,"children":16624},{"className":16623},[],[16625],{"type":17,"value":16626},"paletteGroups",{"type":17,"value":16628}," derived from the existing ",{"type":11,"tag":68,"props":16630,"children":16632},{"className":16631},[],[16633],{"type":17,"value":16634},"navTree",{"type":17,"value":16636}," so a single\nsource of truth drives sidebar nav and palette search.\n",{"type":11,"tag":68,"props":16638,"children":16640},{"className":16639},[],[16641],{"type":17,"value":8785},{"type":17,"value":16643}," at the shell wires:\n",{"type":11,"tag":77,"props":16645,"children":16646},{},[16647,16665,16675,16685],{"type":11,"tag":81,"props":16648,"children":16649},{},[16650,16656,16658,16663],{"type":11,"tag":68,"props":16651,"children":16653},{"className":16652},[],[16654],{"type":17,"value":16655},"meta_k",{"type":17,"value":16657}," — open the global palette (handled by ",{"type":11,"tag":68,"props":16659,"children":16661},{"className":16660},[],[16662],{"type":17,"value":8638},{"type":17,"value":16664}," internally)",{"type":11,"tag":81,"props":16666,"children":16667},{},[16668,16673],{"type":11,"tag":68,"props":16669,"children":16671},{"className":16670},[],[16672],{"type":17,"value":3280},{"type":17,"value":16674}," — open the global palette (GitHub idiom)",{"type":11,"tag":81,"props":16676,"children":16677},{},[16678,16683],{"type":11,"tag":68,"props":16679,"children":16681},{"className":16680},[],[16682],{"type":17,"value":16362},{"type":17,"value":16684}," — toggle the shortcuts-help overlay",{"type":11,"tag":81,"props":16686,"children":16687},{},[16688,16694,16695,16701,16702,16708,16709,16715,16717,16722,16723,16728,16729,16734,16735],{"type":11,"tag":68,"props":16689,"children":16691},{"className":16690},[],[16692],{"type":17,"value":16693},"g-c",{"type":17,"value":875},{"type":11,"tag":68,"props":16696,"children":16698},{"className":16697},[],[16699],{"type":17,"value":16700},"g-t",{"type":17,"value":875},{"type":11,"tag":68,"props":16703,"children":16705},{"className":16704},[],[16706],{"type":17,"value":16707},"g-d",{"type":17,"value":875},{"type":11,"tag":68,"props":16710,"children":16712},{"className":16711},[],[16713],{"type":17,"value":16714},"g-h",{"type":17,"value":16716}," — sequence shortcuts to\n",{"type":11,"tag":68,"props":16718,"children":16720},{"className":16719},[],[16721],{"type":17,"value":5492},{"type":17,"value":95},{"type":11,"tag":68,"props":16724,"children":16726},{"className":16725},[],[16727],{"type":17,"value":16238},{"type":17,"value":95},{"type":11,"tag":68,"props":16730,"children":16732},{"className":16731},[],[16733],{"type":17,"value":16231},{"type":17,"value":95},{"type":11,"tag":68,"props":16736,"children":16738},{"className":16737},[],[16739],{"type":17,"value":3280},{"type":11,"tag":81,"props":16741,"children":16742},{},[16743,16754,16755,16761,16763,16768,16770,16775,16777,16782],{"type":11,"tag":85,"props":16744,"children":16745},{},[16746,16752],{"type":11,"tag":68,"props":16747,"children":16749},{"className":16748},[],[16750],{"type":17,"value":16751},"\u002Fcomponents\u002Fcommand-palette",{"type":17,"value":16753}," demo",{"type":17,"value":11348},{"type":11,"tag":68,"props":16756,"children":16758},{"className":16757},[],[16759],{"type":17,"value":16760},":disable-hotkey=\"true\"",{"type":17,"value":16762},"\non the page's local palette instance so ",{"type":11,"tag":68,"props":16764,"children":16766},{"className":16765},[],[16767],{"type":17,"value":16349},{"type":17,"value":16769}," only fires the global\none. Replaces the page's hand-rolled ",{"type":11,"tag":68,"props":16771,"children":16773},{"className":16772},[],[16774],{"type":17,"value":16327},{"type":17,"value":16776}," markup with ",{"type":11,"tag":68,"props":16778,"children":16780},{"className":16779},[],[16781],{"type":17,"value":16562},{"type":17,"value":43},{"type":11,"tag":81,"props":16784,"children":16785},{},[16786,16790,16791,16796,16798,16803,16805,16810,16812,16817],{"type":11,"tag":85,"props":16787,"children":16788},{},[16789],{"type":17,"value":15813},{"type":17,"value":1244},{"type":11,"tag":68,"props":16792,"children":16794},{"className":16793},[],[16795],{"type":17,"value":1647},{"type":17,"value":16797}," sidebar tree, ",{"type":11,"tag":68,"props":16799,"children":16801},{"className":16800},[],[16802],{"type":17,"value":8734},{"type":17,"value":16804},"\ncatalog table, and ",{"type":11,"tag":68,"props":16806,"children":16808},{"className":16807},[],[16809],{"type":17,"value":8060},{"type":17,"value":16811}," doctrine table all gain\nthe ",{"type":11,"tag":68,"props":16813,"children":16815},{"className":16814},[],[16816],{"type":17,"value":11305},{"type":17,"value":16293},{"type":11,"tag":56,"props":16819,"children":16821},{"id":16820},"added-batch-j-visual-language-application-sweep",[16822],{"type":17,"value":16823},"Added — Batch J: visual-language application sweep",{"type":11,"tag":19,"props":16825,"children":16826},{},[16827,16829,16835],{"type":17,"value":16828},"A surface-level pass that applies the Batch E-prelude tokens (focus,\neasing, elevation, identity primitives) across the existing kit without\ntouching every component file. Pure CSS, additive, opt-in via attribute\nselectors and utility classes. Imported from the standalone\n",{"type":11,"tag":68,"props":16830,"children":16832},{"className":16831},[],[16833],{"type":17,"value":16834},"tti-ux-design",{"type":17,"value":16836}," skill payload (2026-05-14), where the doctrine and\nimplementation were authored alongside.",{"type":11,"tag":77,"props":16838,"children":16839},{},[16840,17082,17119],{"type":11,"tag":81,"props":16841,"children":16842},{},[16843,16852,16853,16859,16861],{"type":11,"tag":85,"props":16844,"children":16845},{},[16846],{"type":11,"tag":68,"props":16847,"children":16849},{"className":16848},[],[16850],{"type":17,"value":16851},"app\u002Fassets\u002Fcss\u002Ftux.css",{"type":17,"value":366},{"type":11,"tag":68,"props":16854,"children":16856},{"className":16855},[],[16857],{"type":17,"value":16858},"BATCH J",{"type":17,"value":16860}," section with six rules:\n",{"type":11,"tag":77,"props":16862,"children":16863},{},[16864,16923,16955,16972,17048,17065],{"type":11,"tag":81,"props":16865,"children":16866},{},[16867,16872,16873,16879,16881,16887,16889,16894,16896,16901,16902,16907,16908,16914,16915,16921],{"type":11,"tag":85,"props":16868,"children":16869},{},[16870],{"type":17,"value":16871},"J.1",{"type":17,"value":1244},{"type":11,"tag":68,"props":16874,"children":16876},{"className":16875},[],[16877],{"type":17,"value":16878},"transition-timing-function: var(--ease-survey)",{"type":17,"value":16880}," default\nfor ",{"type":11,"tag":68,"props":16882,"children":16884},{"className":16883},[],[16885],{"type":17,"value":16886},"button, a, input, select, textarea, [role=\"button\"], [role=\"tab\"], [role=\"option\"], .tux-card, .card-linked*",{"type":17,"value":16888}," (gated by\n",{"type":11,"tag":68,"props":16890,"children":16892},{"className":16891},[],[16893],{"type":17,"value":8199},{"type":17,"value":16895},"). Opt-in ",{"type":11,"tag":68,"props":16897,"children":16899},{"className":16898},[],[16900],{"type":17,"value":15250},{"type":17,"value":9561},{"type":11,"tag":68,"props":16903,"children":16905},{"className":16904},[],[16906],{"type":17,"value":15234},{"type":17,"value":1827},{"type":11,"tag":68,"props":16909,"children":16911},{"className":16910},[],[16912],{"type":17,"value":16913},"data-tux-arrival",{"type":17,"value":1144},{"type":11,"tag":68,"props":16916,"children":16918},{"className":16917},[],[16919],{"type":17,"value":16920},"--ease-arrival",{"type":17,"value":16922},". Inline JS\ntransitions and component-declared curves still win.",{"type":11,"tag":81,"props":16924,"children":16925},{},[16926,16931,16932,16938,16940,16945,16947,16953],{"type":11,"tag":85,"props":16927,"children":16928},{},[16929],{"type":17,"value":16930},"J.2",{"type":17,"value":1244},{"type":11,"tag":68,"props":16933,"children":16935},{"className":16934},[],[16936],{"type":17,"value":16937},"[data-tux-elevation=\"flat|rest|hover|overlay|pinned\"]",{"type":17,"value":16939},"\nmaps the five elevation tiers to a single attribute. The ",{"type":11,"tag":68,"props":16941,"children":16943},{"className":16942},[],[16944],{"type":17,"value":2620},{"type":17,"value":16946},"\nvalue also applies ",{"type":11,"tag":68,"props":16948,"children":16950},{"className":16949},[],[16951],{"type":17,"value":16952},"translateY(-1px)",{"type":17,"value":16954}," for the canonical lift.",{"type":11,"tag":81,"props":16956,"children":16957},{},[16958,16963,16964,16970],{"type":11,"tag":85,"props":16959,"children":16960},{},[16961],{"type":17,"value":16962},"J.3",{"type":17,"value":1244},{"type":11,"tag":68,"props":16965,"children":16967},{"className":16966},[],[16968],{"type":17,"value":16969},".tux-hoverlift",{"type":17,"value":16971}," utility: one-class opt-in for the\nrest → hover transition pairing.",{"type":11,"tag":81,"props":16973,"children":16974},{},[16975,16980,16981,16987,16988,16994,16995,17001,17003,17009,17011,17017,17019,17025,17027,17032,17033,17039,17040,17046],{"type":11,"tag":85,"props":16976,"children":16977},{},[16978],{"type":17,"value":16979},"J.4",{"type":17,"value":1244},{"type":11,"tag":68,"props":16982,"children":16984},{"className":16983},[],[16985],{"type":17,"value":16986},".tux-mark",{"type":17,"value":875},{"type":11,"tag":68,"props":16989,"children":16991},{"className":16990},[],[16992],{"type":17,"value":16993},".tux-mark--lg",{"type":17,"value":875},{"type":11,"tag":68,"props":16996,"children":16998},{"className":16997},[],[16999],{"type":17,"value":17000},".tux-mark--xl",{"type":17,"value":17002}," for sizing\nand tinting identity-primitive ",{"type":11,"tag":68,"props":17004,"children":17006},{"className":17005},[],[17007],{"type":17,"value":17008},"\u003Csymbol>",{"type":17,"value":17010},"s from\n",{"type":11,"tag":68,"props":17012,"children":17014},{"className":17013},[],[17015],{"type":17,"value":17016},"\u002Fidentity-primitives.svg",{"type":17,"value":17018}," (already shipping in ",{"type":11,"tag":68,"props":17020,"children":17022},{"className":17021},[],[17023],{"type":17,"value":17024},"public\u002F",{"type":17,"value":17026},"). Default\n16×16, currentColor = ",{"type":11,"tag":68,"props":17028,"children":17030},{"className":17029},[],[17031],{"type":17,"value":2712},{"type":17,"value":1827},{"type":11,"tag":68,"props":17034,"children":17036},{"className":17035},[],[17037],{"type":17,"value":17038},"--mark-size",{"type":17,"value":5399},{"type":11,"tag":68,"props":17041,"children":17043},{"className":17042},[],[17044],{"type":17,"value":17045},"--mark-color",{"type":17,"value":17047}," are the per-instance hooks.",{"type":11,"tag":81,"props":17049,"children":17050},{},[17051,17056,17057,17063],{"type":11,"tag":85,"props":17052,"children":17053},{},[17054],{"type":17,"value":17055},"J.5",{"type":17,"value":1244},{"type":11,"tag":68,"props":17058,"children":17060},{"className":17059},[],[17061],{"type":17,"value":17062},".tux-section-divider",{"type":17,"value":17064},": eyebrow label + maroon-to-\ntransparent gradient rule packaged as a one-class utility.",{"type":11,"tag":81,"props":17066,"children":17067},{},[17068,17073,17074,17080],{"type":11,"tag":85,"props":17069,"children":17070},{},[17071],{"type":17,"value":17072},"J.6",{"type":17,"value":1244},{"type":11,"tag":68,"props":17075,"children":17077},{"className":17076},[],[17078],{"type":17,"value":17079},"[data-tux-rowgrid]",{"type":17,"value":17081},": subtle 6%-maroon repeating-vertical-\nlines background, opt-in on heroes \u002F empty-state panels \u002F section\nbreaks.",{"type":11,"tag":81,"props":17083,"children":17084},{},[17085,17094,17096,17102,17104,17110,17112,17117],{"type":11,"tag":85,"props":17086,"children":17087},{},[17088],{"type":11,"tag":68,"props":17089,"children":17091},{"className":17090},[],[17092],{"type":17,"value":17093},"design\u002Fvisual-language-evolution.md",{"type":17,"value":17095}," gains the matching ",{"type":11,"tag":68,"props":17097,"children":17099},{"className":17098},[],[17100],{"type":17,"value":17101},"Batch J — 2026-05",{"type":17,"value":17103}," section documenting each rule, the opt-in pattern, and the\nNuxt-vs-skill path note (",{"type":11,"tag":68,"props":17105,"children":17107},{"className":17106},[],[17108],{"type":17,"value":17109},"assets\u002Fidentity-primitives.svg",{"type":17,"value":17111}," in the\nskill payload → ",{"type":11,"tag":68,"props":17113,"children":17115},{"className":17114},[],[17116],{"type":17,"value":17016},{"type":17,"value":17118}," here).",{"type":11,"tag":81,"props":17120,"children":17121},{},[17122,17127,17129,17135,17136,17142,17143,17149,17151,17156,17158,17164,17165,17170],{"type":11,"tag":85,"props":17123,"children":17124},{},[17125],{"type":17,"value":17126},"No new tokens, no new components, no JS changes.",{"type":17,"value":17128}," Batch J consumes\nthe prelude tokens (",{"type":11,"tag":68,"props":17130,"children":17132},{"className":17131},[],[17133],{"type":17,"value":17134},"--ease-survey\u002Fcorridor\u002Farrival",{"type":17,"value":95},{"type":11,"tag":68,"props":17137,"children":17139},{"className":17138},[],[17140],{"type":17,"value":17141},"--motion-base\u002F fast",{"type":17,"value":95},{"type":11,"tag":68,"props":17144,"children":17146},{"className":17145},[],[17147],{"type":17,"value":17148},"--elevation-flat\u002Frest\u002Fhover\u002Foverlay\u002Fpinned",{"type":17,"value":17150},", etc.) already in\n",{"type":11,"tag":68,"props":17152,"children":17154},{"className":17153},[],[17155],{"type":17,"value":7046},{"type":17,"value":17157},". The mapping ",{"type":11,"tag":68,"props":17159,"children":17161},{"className":17160},[],[17162],{"type":17,"value":17163},"--font-body-bold",{"type":17,"value":9561},{"type":11,"tag":68,"props":17166,"children":17168},{"className":17167},[],[17169],{"type":17,"value":2825},{"type":17,"value":17171}," reconciles the skill payload's token name with the\nfour-family typography rule.",{"type":11,"tag":56,"props":17173,"children":17175},{"id":17174},"added-publickitsaggieux-major-expansion",[17176,17177,17183],{"type":17,"value":4412},{"type":11,"tag":68,"props":17178,"children":17180},{"className":17179},[],[17181],{"type":17,"value":17182},"public\u002Fkits\u002Faggieux\u002F",{"type":17,"value":17184}," major expansion",{"type":11,"tag":19,"props":17186,"children":17187},{},[17188,17190,17195,17197,17203,17205,17210,17212,17218,17220,17226],{"type":17,"value":17189},"Refresh of the TTI-curated AggieUX preview catalog at\n",{"type":11,"tag":68,"props":17191,"children":17193},{"className":17192},[],[17194],{"type":17,"value":17182},{"type":17,"value":17196}," from the skill payload (",{"type":11,"tag":68,"props":17198,"children":17200},{"className":17199},[],[17201],{"type":17,"value":17202},"ui_kits\u002Faggieux\u002F",{"type":17,"value":17204},").\n",{"type":11,"tag":85,"props":17206,"children":17207},{},[17208],{"type":17,"value":17209},"Not",{"type":17,"value":17211}," a change to ",{"type":11,"tag":68,"props":17213,"children":17215},{"className":17214},[],[17216],{"type":17,"value":17217},"reference\u002Faggieux\u002Fv2.0.1\u002F",{"type":17,"value":17219}," (the frozen upstream\nCDN snapshot at ",{"type":11,"tag":68,"props":17221,"children":17223},{"className":17222},[],[17224],{"type":17,"value":17225},"aux.tamu.edu",{"type":17,"value":17227},", untouched per CLAUDE.md).",{"type":11,"tag":77,"props":17229,"children":17230},{},[17231,17249,17329,17351],{"type":11,"tag":81,"props":17232,"children":17233},{},[17234,17247],{"type":11,"tag":85,"props":17235,"children":17236},{},[17237,17239,17245],{"type":17,"value":17238},"43 new ",{"type":11,"tag":68,"props":17240,"children":17242},{"className":17241},[],[17243],{"type":17,"value":17244},"Aggie*.jsx",{"type":17,"value":17246}," demo pages",{"type":17,"value":17248}," covering chart foundations,\ncharts\u002Fmaps\u002Ftreatments\u002Fviz, data tables, descriptions, directory,\nforms (core + advanced + field grid + date range + dropdown-\ncombobox), filters, status states, banners, sectioning, templates,\nhover\u002Ffocus disclosures, accessibility, image lightbox, load-more,\nfeedback, toggle\u002Fslider, toolbar, transfer, tree, rate, rich data\ngrid, sidebar banner, specialized patterns, AI-studio surface,\ncorridor strip, collab, descriptions, guidance, map legend, news\ncontact (sectioning, etc.). Net 23 → 66 files in the kit folder.",{"type":11,"tag":81,"props":17250,"children":17251},{},[17252,17257,17258,17264,17266,17272,17273,17279,17280,17286,17287,17293,17294,17300,17301,17307,17308,17314,17315,17321,17322,17328],{"type":11,"tag":85,"props":17253,"children":17254},{},[17255],{"type":17,"value":17256},"10 updated pages",{"type":17,"value":1244},{"type":11,"tag":68,"props":17259,"children":17261},{"className":17260},[],[17262],{"type":17,"value":17263},"AggieCatalog",{"type":17,"value":17265}," (registers every new section),\n",{"type":11,"tag":68,"props":17267,"children":17269},{"className":17268},[],[17270],{"type":17,"value":17271},"AggieButtonsAlerts",{"type":17,"value":95},{"type":11,"tag":68,"props":17274,"children":17276},{"className":17275},[],[17277],{"type":17,"value":17278},"AggieCards",{"type":17,"value":95},{"type":11,"tag":68,"props":17281,"children":17283},{"className":17282},[],[17284],{"type":17,"value":17285},"AggieChrome",{"type":17,"value":95},{"type":11,"tag":68,"props":17288,"children":17290},{"className":17289},[],[17291],{"type":17,"value":17292},"AggieIconLink",{"type":17,"value":489},{"type":11,"tag":68,"props":17295,"children":17297},{"className":17296},[],[17298],{"type":17,"value":17299},"AggieMenus",{"type":17,"value":95},{"type":11,"tag":68,"props":17302,"children":17304},{"className":17303},[],[17305],{"type":17,"value":17306},"AggieNewsContact",{"type":17,"value":95},{"type":11,"tag":68,"props":17309,"children":17311},{"className":17310},[],[17312],{"type":17,"value":17313},"AggiePageHeaders",{"type":17,"value":95},{"type":11,"tag":68,"props":17316,"children":17318},{"className":17317},[],[17319],{"type":17,"value":17320},"AggiePages",{"type":17,"value":489},{"type":11,"tag":68,"props":17323,"children":17325},{"className":17324},[],[17326],{"type":17,"value":17327},"App.jsx",{"type":17,"value":43},{"type":11,"tag":81,"props":17330,"children":17331},{},[17332,17341,17343,17349],{"type":11,"tag":85,"props":17333,"children":17334},{},[17335],{"type":11,"tag":68,"props":17336,"children":17338},{"className":17337},[],[17339],{"type":17,"value":17340},"index.html",{"type":17,"value":17342}," updated to register all 64 JSX modules via\n",{"type":11,"tag":68,"props":17344,"children":17346},{"className":17345},[],[17347],{"type":17,"value":17348},"\u003Cscript type=\"text\u002Fbabel\">",{"type":17,"value":17350}," tags.",{"type":11,"tag":81,"props":17352,"children":17353},{},[17354,17363,17365,17374],{"type":11,"tag":85,"props":17355,"children":17356},{},[17357],{"type":11,"tag":68,"props":17358,"children":17360},{"className":17359},[],[17361],{"type":17,"value":17362},"AggieDisclosure.jsx",{"type":17,"value":17364}," (Batch 10: accordions \u002F publication\naccordion \u002F Q&A) and ",{"type":11,"tag":85,"props":17366,"children":17367},{},[17368],{"type":11,"tag":68,"props":17369,"children":17371},{"className":17370},[],[17372],{"type":17,"value":17373},"AggieDisclosures.jsx",{"type":17,"value":17375}," (Batch A.1: tooltips\nand popovers) are intentionally distinct — both ship.",{"type":11,"tag":56,"props":17377,"children":17379},{"id":17378},"added-structuredoutputjsx-for-tti-ai-chat-kit",[17380,17381,17387],{"type":17,"value":4412},{"type":11,"tag":68,"props":17382,"children":17384},{"className":17383},[],[17385],{"type":17,"value":17386},"StructuredOutput.jsx",{"type":17,"value":17388}," for tti-ai-chat kit",{"type":11,"tag":19,"props":17390,"children":17391},{},[17392,17394,17399,17401,17407],{"type":17,"value":17393},"Imported from the skill payload's ",{"type":11,"tag":68,"props":17395,"children":17397},{"className":17396},[],[17398],{"type":17,"value":12793},{"type":17,"value":17400}," kit (collapsed-naming\nmirror of our ",{"type":11,"tag":68,"props":17402,"children":17404},{"className":17403},[],[17405],{"type":17,"value":17406},"tti-ai-chat",{"type":17,"value":2630},{"type":11,"tag":77,"props":17409,"children":17410},{},[17411,17468],{"type":11,"tag":81,"props":17412,"children":17413},{},[17414,17423,17425,17431,17432,17438,17439,17445,17447,17453,17454,17460,17461,17466],{"type":11,"tag":85,"props":17415,"children":17416},{},[17417],{"type":11,"tag":68,"props":17418,"children":17420},{"className":17419},[],[17421],{"type":17,"value":17422},"public\u002Fkits\u002Ftti-ai-chat\u002FStructuredOutput.jsx",{"type":17,"value":17424}," ships three\nprimitives for AI-generated structured tool output inline in a\nconversation: ",{"type":11,"tag":68,"props":17426,"children":17428},{"className":17427},[],[17429],{"type":17,"value":17430},"InlineCard",{"type":17,"value":95},{"type":11,"tag":68,"props":17433,"children":17435},{"className":17434},[],[17436],{"type":17,"value":17437},"InlineCarousel",{"type":17,"value":95},{"type":11,"tag":68,"props":17440,"children":17442},{"className":17441},[],[17443],{"type":17,"value":17444},"ResponseCard",{"type":17,"value":17446},". Anatomy\nlineage is MCP Apps for Claude; translated to tti-ux's typography,\ncolor, and signature language. Globals: ",{"type":11,"tag":68,"props":17448,"children":17450},{"className":17449},[],[17451],{"type":17,"value":17452},"React",{"type":17,"value":95},{"type":11,"tag":68,"props":17455,"children":17457},{"className":17456},[],[17458],{"type":17,"value":17459},"LucideIcon",{"type":17,"value":489},{"type":11,"tag":68,"props":17462,"children":17464},{"className":17463},[],[17465],{"type":17,"value":5928},{"type":17,"value":17467}," — all already provided by other kit scripts.",{"type":11,"tag":81,"props":17469,"children":17470},{},[17471,17480,17482,17487,17489,17494,17496,17501,17503,17509,17510,17515,17516,17522,17524,17529,17531,17536],{"type":11,"tag":85,"props":17472,"children":17473},{},[17474],{"type":11,"tag":68,"props":17475,"children":17477},{"className":17476},[],[17478],{"type":17,"value":17479},"public\u002Fkits\u002Ftti-ai-chat\u002Findex.html",{"type":17,"value":17481}," rewritten to register\n",{"type":11,"tag":68,"props":17483,"children":17485},{"className":17484},[],[17486],{"type":17,"value":17386},{"type":17,"value":17488}," and to demonstrate the new primitives — the\nassistant Message in the demo conversation now renders an\n",{"type":11,"tag":68,"props":17490,"children":17492},{"className":17491},[],[17493],{"type":17,"value":17437},{"type":17,"value":17495}," of six citation cards, a ",{"type":11,"tag":68,"props":17497,"children":17499},{"className":17498},[],[17500],{"type":17,"value":17444},{"type":17,"value":17502}," for the\nLinear ticket draft (with ",{"type":11,"tag":68,"props":17504,"children":17506},{"className":17505},[],[17507],{"type":17,"value":17508},"toolName",{"type":17,"value":95},{"type":11,"tag":68,"props":17511,"children":17513},{"className":17512},[],[17514],{"type":17,"value":5972},{"type":17,"value":95},{"type":11,"tag":68,"props":17517,"children":17519},{"className":17518},[],[17520],{"type":17,"value":17521},"footer",{"type":17,"value":17523},"), and a\ncompact ",{"type":11,"tag":68,"props":17525,"children":17527},{"className":17526},[],[17528],{"type":17,"value":17430},{"type":17,"value":17530}," for the related runbook. Title kept as\n",{"type":11,"tag":68,"props":17532,"children":17534},{"className":17533},[],[17535],{"type":17,"value":17406},{"type":17,"value":17537}," to match the local kit naming.",{"type":11,"tag":45,"props":17539,"children":17541},{"id":17540},"_130-2026-05-12",[17542,17547],{"type":11,"tag":50,"props":17543,"children":17544},{},[17545],{"type":17,"value":17546},"1.3.0",{"type":17,"value":17548}," — 2026-05-12",{"type":11,"tag":19,"props":17550,"children":17551},{},[17552,17554,17559],{"type":17,"value":17553},"Shell + sidebar + footer alignment batch. The style-guide chrome\nnow dogfoods ",{"type":11,"tag":68,"props":17555,"children":17557},{"className":17556},[],[17558],{"type":17,"value":7236},{"type":17,"value":17560}," (and gets the same exclusive-open\ndisclosure UX as the AggieUX reference kit), the institutional\nfooter is reconciled to the comm-team's Kadence source so we ship\nthe same handles + link inventory as production tti.tamu.edu, and\nthe shell adopts the tapered-hairline pattern from tti-ai-studio\nfor cross-product consistency. No breaking API changes — every\ncomponent prop added below is optional with a sensible default.",{"type":11,"tag":56,"props":17562,"children":17564},{"id":17563},"direction-tti-ux-as-source-of-truth-for-the-bi-design-system",[17565],{"type":17,"value":17566},"Direction — tti-ux as source of truth for the BI design system",{"type":11,"tag":77,"props":17568,"children":17569},{},[17570,17597,17642,17655],{"type":11,"tag":81,"props":17571,"children":17572},{},[17573,17578,17579,17588,17590,17596],{"type":11,"tag":85,"props":17574,"children":17575},{},[17576],{"type":17,"value":17577},"ADR 0009 accepted",{"type":17,"value":2078},{"type":11,"tag":25,"props":17580,"children":17582},{"href":17581},"docs\u002Fadr\u002F0009-bi-design-system-source-of-truth.md",[17583],{"type":11,"tag":68,"props":17584,"children":17586},{"className":17585},[],[17587],{"type":17,"value":17581},{"type":17,"value":17589},"). tti-ux becomes the canonical home for TTI's Power BI \u002F Microsoft Fabric design system: brand tokens (already here), data-viz tokens (already here), Power BI theme JSON (to be generated here from tokens), and the Aggie Viz \u002F Tti Viz shell spec (to be ported here from ",{"type":11,"tag":68,"props":17591,"children":17593},{"className":17592},[],[17594],{"type":17,"value":17595},"docs-it-tamu-edu",{"type":17,"value":2630},{"type":11,"tag":81,"props":17598,"children":17599},{},[17600,17605,17606,17612,17613,17624,17626,17632,17634,17640],{"type":11,"tag":85,"props":17601,"children":17602},{},[17603],{"type":17,"value":17604},"Consumers",{"type":17,"value":621},{"type":11,"tag":68,"props":17607,"children":17609},{"className":17608},[],[17610],{"type":17,"value":17611},"tti-reporting",{"type":17,"value":2078},{"type":11,"tag":25,"props":17614,"children":17617},{"href":17615,"rel":17616},"https:\u002F\u002Fgithub.com\u002Fttitamu\u002Ftti-reporting",[29],[17618],{"type":11,"tag":68,"props":17619,"children":17621},{"className":17620},[],[17622],{"type":17,"value":17623},"ttitamu\u002Ftti-reporting",{"type":17,"value":17625},") currently snapshots tokens into ",{"type":11,"tag":68,"props":17627,"children":17629},{"className":17628},[],[17630],{"type":17,"value":17631},"core\u002Fthemes\u002Ftokens.json",{"type":17,"value":17633}," and ports the Aggie Viz shell into ",{"type":11,"tag":68,"props":17635,"children":17637},{"className":17636},[],[17638],{"type":17,"value":17639},"core\u002Fttiviz\u002FSHELL_SPEC.md",{"type":17,"value":17641},". Once tti-ux owns these, those become reference snapshots that follow tti-ux releases.",{"type":11,"tag":81,"props":17643,"children":17644},{},[17645,17653],{"type":11,"tag":85,"props":17646,"children":17647},{},[17648],{"type":11,"tag":68,"props":17649,"children":17651},{"className":17650},[],[17652],{"type":17,"value":695},{"type":17,"value":17654}," stops being a stale clone of the docs-it-tamu-edu Power BI section and instead links to tti-ux for canonical BI standards.",{"type":11,"tag":81,"props":17656,"children":17657},{},[17658,17663,17665,17671],{"type":11,"tag":85,"props":17659,"children":17660},{},[17661],{"type":17,"value":17662},"Pending port",{"type":17,"value":17664}," (from ",{"type":11,"tag":68,"props":17666,"children":17668},{"className":17667},[],[17669],{"type":17,"value":17670},"docs-it-tamu-edu\u002Fnuxt-site\u002Fcontent\u002Fdocs\u002Ftamu\u002FM365\u002FPower-BI-Fabric\u002F",{"type":17,"value":17672},"): ~12 documents covering AggieBI brand-theme rationale, light\u002Fdark mode architecture, organizational visuals, component\u002Fvisual-type policy, and the Aggie Viz visual spec family (shell, textboxes, nav pills, card styling, PBIP property reference). See ADR 0009 for the full mapping.",{"type":11,"tag":56,"props":17674,"children":17676},{"id":17675},"changed-style-guide-shell-dogfoods-tuxdocssidebar",[17677],{"type":17,"value":17678},"Changed — Style-guide shell dogfoods TuxDocsSidebar",{"type":11,"tag":77,"props":17680,"children":17681},{},[17682,17715,17748,17850,17899],{"type":11,"tag":81,"props":17683,"children":17684},{},[17685,17690,17692,17697,17699,17705,17707,17713],{"type":11,"tag":85,"props":17686,"children":17687},{},[17688],{"type":17,"value":17689},"Shell sidebar collapses",{"type":17,"value":17691}," by group. The flat list in\n",{"type":11,"tag":68,"props":17693,"children":17695},{"className":17694},[],[17696],{"type":17,"value":1647},{"type":17,"value":17698}," is replaced with ",{"type":11,"tag":68,"props":17700,"children":17702},{"className":17701},[],[17703],{"type":17,"value":17704},"\u003CTuxDocsSidebar>",{"type":17,"value":17706}," (the component\nwas already shipping for downstream consumers and even documented\nthe style-guide shell as a TODO migration). Auto-opens the group\ncontaining the active route, persists collapse state in\nsessionStorage under ",{"type":11,"tag":68,"props":17708,"children":17710},{"className":17709},[],[17711],{"type":17,"value":17712},"tti-ux-sidebar",{"type":17,"value":17714},", and exposes the inline\nfilter as \"Filter the system…\". Eliminates the wall-of-69\nproblem when scanning the catalog.",{"type":11,"tag":81,"props":17716,"children":17717},{},[17718,17723,17725,17731,17733,17738,17740,17746],{"type":11,"tag":85,"props":17719,"children":17720},{},[17721],{"type":17,"value":17722},"Exclusive-open root",{"type":17,"value":17724},": a new ",{"type":11,"tag":68,"props":17726,"children":17728},{"className":17727},[],[17729],{"type":17,"value":17730},"exclusiveTopLevel",{"type":17,"value":17732}," prop on\n",{"type":11,"tag":68,"props":17734,"children":17736},{"className":17735},[],[17737],{"type":17,"value":7236},{"type":17,"value":17739}," makes opening any root group explicitly close\nevery other root group. Without this you could expand 5 groups\nand lose the sidebar's \"where am I\" affordance. Opt-in (default\n",{"type":11,"tag":68,"props":17741,"children":17743},{"className":17742},[],[17744],{"type":17,"value":17745},"false",{"type":17,"value":17747},") so existing consumers (PECAN docs shells, etc.) aren't\nsurprised.",{"type":11,"tag":81,"props":17749,"children":17750},{},[17751,17756,17758,17764,17766,17771,17773,17779,17780,17785,17787,17793,17795,17801,17803,17809,17811,17817,17819,17825,17827,17833,17835,17840,17842,17848],{"type":11,"tag":85,"props":17752,"children":17753},{},[17754],{"type":17,"value":17755},"Long-name truncation",{"type":17,"value":17757},": leaf-link labels now share the\n",{"type":11,"tag":68,"props":17759,"children":17761},{"className":17760},[],[17762],{"type":17,"value":17763},"__label",{"type":17,"value":17765}," truncation class with summary rows. Component names\nlike ",{"type":11,"tag":68,"props":17767,"children":17769},{"className":17768},[],[17770],{"type":17,"value":5016},{"type":17,"value":17772}," were blowing past the 240px lane\nand — combined with the CSS spec coercing ",{"type":11,"tag":68,"props":17774,"children":17776},{"className":17775},[],[17777],{"type":17,"value":17778},"overflow-x",{"type":17,"value":6201},{"type":11,"tag":68,"props":17781,"children":17783},{"className":17782},[],[17784],{"type":17,"value":8403},{"type":17,"value":17786},"\nwhenever ",{"type":11,"tag":68,"props":17788,"children":17790},{"className":17789},[],[17791],{"type":17,"value":17792},"overflow-y",{"type":17,"value":17794}," is non-visible — surfaced a horizontal\nscrollbar inside ",{"type":11,"tag":68,"props":17796,"children":17798},{"className":17797},[],[17799],{"type":17,"value":17800},"__nav",{"type":17,"value":17802},". The root cause was ",{"type":11,"tag":68,"props":17804,"children":17806},{"className":17805},[],[17807],{"type":17,"value":17808},"__sublist",{"type":17,"value":17810},"'s\n",{"type":11,"tag":68,"props":17812,"children":17814},{"className":17813},[],[17815],{"type":17,"value":17816},"display: grid",{"type":17,"value":17818}," auto-sizing the column to ",{"type":11,"tag":68,"props":17820,"children":17822},{"className":17821},[],[17823],{"type":17,"value":17824},"max-content",{"type":17,"value":17826},"; pinning\nto ",{"type":11,"tag":68,"props":17828,"children":17830},{"className":17829},[],[17831],{"type":17,"value":17832},"grid-template-columns: minmax(0, 1fr)",{"type":17,"value":17834}," lets the column\nshrink below max-content so the ellipsis actually kicks in.\n",{"type":11,"tag":68,"props":17836,"children":17838},{"className":17837},[],[17839],{"type":17,"value":17800},{"type":17,"value":17841}," also gets an explicit ",{"type":11,"tag":68,"props":17843,"children":17845},{"className":17844},[],[17846],{"type":17,"value":17847},"overflow-x: hidden",{"type":17,"value":17849}," as belt-and-\nbraces against future inner-layout drift.",{"type":11,"tag":81,"props":17851,"children":17852},{},[17853,17858,17860,17865,17867,17873,17875,17881,17883,17889,17891,17897],{"type":11,"tag":85,"props":17854,"children":17855},{},[17856],{"type":17,"value":17857},"Sticky sidebar shell",{"type":17,"value":17859},": the shell wrapper in ",{"type":11,"tag":68,"props":17861,"children":17863},{"className":17862},[],[17864],{"type":17,"value":329},{"type":17,"value":17866}," is now\n",{"type":11,"tag":68,"props":17868,"children":17870},{"className":17869},[],[17871],{"type":17,"value":17872},"md:sticky md:top-[57px] md:self-start md:max-h-[calc(100vh-57px)]",{"type":17,"value":17874},"\non desktop with ",{"type":11,"tag":68,"props":17876,"children":17878},{"className":17877},[],[17879],{"type":17,"value":17880},"overflow-y: auto; overflow-x: hidden",{"type":17,"value":17882},". Before,\nthe wrapper stretched to match the main content's full height,\nso scrolling the page scrolled the sidebar out of view and the\ntapered hairline rode down into the footer. ",{"type":11,"tag":68,"props":17884,"children":17886},{"className":17885},[],[17887],{"type":17,"value":17888},"self-start",{"type":17,"value":17890}," opts\nout of the flex parent's default stretch so sticky can actually\ntake effect; mobile keeps its ",{"type":11,"tag":68,"props":17892,"children":17894},{"className":17893},[],[17895],{"type":17,"value":17896},"fixed inset-y-0 top-[57px]",{"type":17,"value":17898},"\nslide-in shell unchanged.",{"type":11,"tag":81,"props":17900,"children":17901},{},[17902,17907,17909,17915,17917,17923,17925,17931],{"type":11,"tag":85,"props":17903,"children":17904},{},[17905],{"type":17,"value":17906},"Content width",{"type":17,"value":17908},": shell content cap raised from ",{"type":11,"tag":68,"props":17910,"children":17912},{"className":17911},[],[17913],{"type":17,"value":17914},"max-w-5xl",{"type":17,"value":17916},"\n(1024px) to ",{"type":11,"tag":68,"props":17918,"children":17920},{"className":17919},[],[17921],{"type":17,"value":17922},"max-w-6xl",{"type":17,"value":17924}," (1152px). Modest bump — leaves room for\nthe future right-rail ",{"type":11,"tag":68,"props":17926,"children":17928},{"className":17927},[],[17929],{"type":17,"value":17930},"TuxTOC",{"type":17,"value":17932}," and the persistent left sidebar.",{"type":11,"tag":56,"props":17934,"children":17936},{"id":17935},"changed-tuxfooter-aligned-to-the-comm-team-kadence-source",[17937],{"type":17,"value":17938},"Changed — TuxFooter aligned to the comm-team Kadence source",{"type":11,"tag":19,"props":17940,"children":17941},{},[17942],{"type":17,"value":17943},"The comm team's authoritative footer (Kadence block source for\nproduction tti.tamu.edu) now defines the institutional shape. We\nwere close on structure but drifted on handles, URLs, and the\nTAMUS lockup styling. Reconciled in one pass.",{"type":11,"tag":77,"props":17945,"children":17946},{},[17947,18021,18091,18108,18133,18159,18185,18203],{"type":11,"tag":81,"props":17948,"children":17949},{},[17950,17955,17957,17963,17965,17971,17973,17979,17981,17987,17989,17995,17997,18003,18005,18011,18013,18019],{"type":11,"tag":85,"props":17951,"children":17952},{},[17953],{"type":17,"value":17954},"Social handles flipped",{"type":17,"value":17956}," to the canonical ",{"type":11,"tag":68,"props":17958,"children":17960},{"className":17959},[],[17961],{"type":17,"value":17962},"ttitamu",{"type":17,"value":17964}," (no S)\nforms: LinkedIn ",{"type":11,"tag":68,"props":17966,"children":17968},{"className":17967},[],[17969],{"type":17,"value":17970},"linkedin.com\u002Fcompany\u002Ftexasa-mtransportationinstitute",{"type":17,"value":17972},",\nFacebook ",{"type":11,"tag":68,"props":17974,"children":17976},{"className":17975},[],[17977],{"type":17,"value":17978},"facebook.com\u002Fttitamu",{"type":17,"value":17980},", Instagram ",{"type":11,"tag":68,"props":17982,"children":17984},{"className":17983},[],[17985],{"type":17,"value":17986},"instagram.com\u002Fttitamu\u002F",{"type":17,"value":17988},",\nYouTube ",{"type":11,"tag":68,"props":17990,"children":17992},{"className":17991},[],[17993],{"type":17,"value":17994},"youtube.com\u002Fttitamu",{"type":17,"value":17996},", Twitter\u002FX ",{"type":11,"tag":68,"props":17998,"children":18000},{"className":17999},[],[18001],{"type":17,"value":18002},"twitter.com\u002FTTITAMU",{"type":17,"value":18004},".\nPreviously we shipped a stale ",{"type":11,"tag":68,"props":18006,"children":18008},{"className":18007},[],[18009],{"type":17,"value":18010},"TTIVideoChannel",{"type":17,"value":18012}," YouTube link and\n",{"type":11,"tag":68,"props":18014,"children":18016},{"className":18015},[],[18017],{"type":17,"value":18018},"TTITAMUS",{"type":17,"value":18020}," (with S) for several others.",{"type":11,"tag":81,"props":18022,"children":18023},{},[18024,18029,18031,18036,18038,18044,18046,18052,18054,18059,18061,18067,18069,18075,18077,18082,18083,18089],{"type":11,"tag":85,"props":18025,"children":18026},{},[18027],{"type":17,"value":18028},"Threads added",{"type":17,"value":18030}," (sixth social, matching production). Lucide\ndoesn't ship a Threads glyph, so ",{"type":11,"tag":68,"props":18032,"children":18034},{"className":18033},[],[18035],{"type":17,"value":5002},{"type":17,"value":18037}," now accepts an\noptional ",{"type":11,"tag":68,"props":18039,"children":18041},{"className":18040},[],[18042],{"type":17,"value":18043},"svg?: string",{"type":17,"value":18045}," field on ",{"type":11,"tag":68,"props":18047,"children":18049},{"className":18048},[],[18050],{"type":17,"value":18051},"SocialLink",{"type":17,"value":18053}," as an alternative\nto ",{"type":11,"tag":68,"props":18055,"children":18057},{"className":18056},[],[18058],{"type":17,"value":13732},{"type":17,"value":18060}," — pass raw ",{"type":11,"tag":68,"props":18062,"children":18064},{"className":18063},[],[18065],{"type":17,"value":18066},"\u003Csvg>",{"type":17,"value":18068}," markup. Threads renders via the\nSimple Icons path (CC0). Force-set ",{"type":11,"tag":68,"props":18070,"children":18072},{"className":18071},[],[18073],{"type":17,"value":18074},"fill=\"currentColor\"",{"type":17,"value":18076}," on the\n",{"type":11,"tag":68,"props":18078,"children":18080},{"className":18079},[],[18081],{"type":17,"value":18066},{"type":17,"value":103},{"type":11,"tag":68,"props":18084,"children":18086},{"className":18085},[],[18087],{"type":17,"value":18088},"\u003Cpath>",{"type":17,"value":18090}," plus a descendant CSS rule so the icon\npicks up the footer's white color reliably across v-html paths.",{"type":11,"tag":81,"props":18092,"children":18093},{},[18094,18099,18101,18106],{"type":11,"tag":85,"props":18095,"children":18096},{},[18097],{"type":17,"value":18098},"Social-link tap targets",{"type":17,"value":18100}," bumped from 40×40 to ",{"type":11,"tag":85,"props":18102,"children":18103},{},[18104],{"type":17,"value":18105},"44×44px",{"type":17,"value":18107}," —\nWCAG 2.5.5 (AAA) target-size minimum, matching the Kadence 44px\nsetting. Icon glyph scaled from 1.125rem to 1.25rem for\nproportion.",{"type":11,"tag":81,"props":18109,"children":18110},{},[18111,18116,18118,18124,18126,18132],{"type":11,"tag":85,"props":18112,"children":18113},{},[18114],{"type":17,"value":18115},"State Resources URLs",{"type":17,"value":18117}," corrected to match Kadence: Texas\nHomeland Security points at ",{"type":11,"tag":68,"props":18119,"children":18121},{"className":18120},[],[18122],{"type":17,"value":18123},"gov.texas.gov\u002F",{"type":17,"value":18125}," root, Statewide\nSearch at ",{"type":11,"tag":68,"props":18127,"children":18129},{"className":18128},[],[18130],{"type":17,"value":18131},"tsl.texas.gov\u002Ftrail\u002Findex.html",{"type":17,"value":43},{"type":11,"tag":81,"props":18134,"children":18135},{},[18136,18141,18143,18149,18151,18157],{"type":11,"tag":85,"props":18137,"children":18138},{},[18139],{"type":17,"value":18140},"Policies column restructured",{"type":17,"value":18142}," to the 9-item TTI-owned list\n(TAMUS Risk\u002FFraud Hotline → Digital Accessibility → Site\nPolicies → Open Records → Statutorily Required Reports → TTI\nRules → Veterans → Equal Opportunity → Jobs) — all pointing at\n",{"type":11,"tag":68,"props":18144,"children":18146},{"className":18145},[],[18147],{"type":17,"value":18148},"tti.tamu.edu\u002Fnotices-policies\u002F…",{"type":17,"value":18150}," rather than the upstream\n",{"type":11,"tag":68,"props":18152,"children":18154},{"className":18153},[],[18155],{"type":17,"value":18156},"tamus.edu",{"type":17,"value":18158}," URLs we previously linked. The internal WCAG-audit\npage is kept as the column's last entry (style-guide-only extra,\nnot in production).",{"type":11,"tag":81,"props":18160,"children":18161},{},[18162,18167,18169,18175,18177,18183],{"type":11,"tag":85,"props":18163,"children":18164},{},[18165],{"type":17,"value":18166},"Tagline dropped",{"type":17,"value":18168}," from the marketing section. Kadence's\nproduction footer doesn't render the \"Coordinated Statewide\nTransportation Research Program\" tagline — institutional name\ncarries it. The ",{"type":11,"tag":68,"props":18170,"children":18172},{"className":18171},[],[18173],{"type":17,"value":18174},"tagline",{"type":17,"value":18176}," prop still defaults to that string for\nback-compat; the shell passes ",{"type":11,"tag":68,"props":18178,"children":18180},{"className":18179},[],[18181],{"type":17,"value":18182},"tagline=\"\"",{"type":17,"value":18184}," to suppress it.",{"type":11,"tag":81,"props":18186,"children":18187},{},[18188,18193,18195,18201],{"type":11,"tag":85,"props":18189,"children":18190},{},[18191],{"type":17,"value":18192},"TAMUS lockup → plain link",{"type":17,"value":18194},". The black legal strip's left\nside previously rendered as a two-line eyebrow + name lockup.\nKadence ships a single plain \"A member of the Texas A&M\nUniversity System\" link. Lockup CSS removed; replaced with a\nsingle ",{"type":11,"tag":68,"props":18196,"children":18198},{"className":18197},[],[18199],{"type":17,"value":18200},"__tamus-link",{"type":17,"value":18202}," rule.",{"type":11,"tag":81,"props":18204,"children":18205},{},[18206,18211,18213,18218,18220,18226,18228,18234,18236,18242],{"type":11,"tag":85,"props":18207,"children":18208},{},[18209],{"type":17,"value":18210},"© line now linked",{"type":17,"value":18212},". Two new optional props on ",{"type":11,"tag":68,"props":18214,"children":18216},{"className":18215},[],[18217],{"type":17,"value":5002},{"type":17,"value":18219},":\n",{"type":11,"tag":68,"props":18221,"children":18223},{"className":18222},[],[18224],{"type":17,"value":18225},"copyrightText",{"type":17,"value":18227}," (full override of the default \"© {year} {name}\"\nrendering) and ",{"type":11,"tag":68,"props":18229,"children":18231},{"className":18230},[],[18232],{"type":17,"value":18233},"copyrightHref",{"type":17,"value":18235}," (wraps the line in an external\nlink). The shell passes\n",{"type":11,"tag":68,"props":18237,"children":18239},{"className":18238},[],[18240],{"type":17,"value":18241},"© Copyright 2026 Texas A&M Transportation Institute (TTI)",{"type":17,"value":18243},"\npointing at the copyright-statement page, matching production.",{"type":11,"tag":56,"props":18245,"children":18247},{"id":18246},"added-tapered-hairlines-cross-product-shell-pattern",[18248],{"type":17,"value":18249},"Added — Tapered hairlines (cross-product shell pattern)",{"type":11,"tag":77,"props":18251,"children":18252},{},[18253],{"type":11,"tag":81,"props":18254,"children":18255},{},[18256,18272,18274,18280,18281,18287,18289,18295,18297,18303],{"type":11,"tag":85,"props":18257,"children":18258},{},[18259,18265,18266],{"type":11,"tag":68,"props":18260,"children":18262},{"className":18261},[],[18263],{"type":17,"value":18264},".tti-shell-header::after",{"type":17,"value":875},{"type":11,"tag":68,"props":18267,"children":18269},{"className":18268},[],[18270],{"type":17,"value":18271},".tti-shell-sidebar::after",{"type":17,"value":18273}," —\nthe hard ",{"type":11,"tag":68,"props":18275,"children":18277},{"className":18276},[],[18278],{"type":17,"value":18279},"border-b",{"type":17,"value":875},{"type":11,"tag":68,"props":18282,"children":18284},{"className":18283},[],[18285],{"type":17,"value":18286},"border-r",{"type":17,"value":18288}," Tailwind utilities on the shell\nheader and sidebar are replaced with 1px pseudo-elements drawn\nvia ",{"type":11,"tag":68,"props":18290,"children":18292},{"className":18291},[],[18293],{"type":17,"value":18294},"linear-gradient(transparent 0% → var(--surface-border) 18%–82% → transparent 100%)",{"type":17,"value":18296},". Reads as a soft ruled line that\nfades into the surface rather than a hard corner-to-corner\nstroke. Lifted verbatim from tti-ai-studio's ",{"type":11,"tag":68,"props":18298,"children":18300},{"className":18299},[],[18301],{"type":17,"value":18302},"studio-shell",{"type":17,"value":18304},"\n(same 18%\u002F82% stops) so the two products feel like one family\nat the chrome level. Promote to a shared utility when a third\nsurface needs it.",{"type":11,"tag":56,"props":18306,"children":18308},{"id":18307},"removed-home-page-components-grid",[18309],{"type":17,"value":18310},"Removed — Home page Components grid",{"type":11,"tag":77,"props":18312,"children":18313},{},[18314],{"type":11,"tag":81,"props":18315,"children":18316},{},[18317,18319,18325,18327,18333],{"type":17,"value":18318},"The 69-card Components grid on the welcome page is gone. The\nsame inventory is now reachable in one click via the (newly\ncollapsible) sidebar's Components group and the dedicated\n",{"type":11,"tag":68,"props":18320,"children":18322},{"className":18321},[],[18323],{"type":17,"value":18324},"\u002Fcomponents\u002F",{"type":17,"value":18326}," catalog page, both of which already shipped. The\ngrid was duplicating navigation and dominating the home page\nscroll. ",{"type":11,"tag":68,"props":18328,"children":18330},{"className":18329},[],[18331],{"type":17,"value":18332},"catalogCount",{"type":17,"value":18334}," constant added for the hero meta line\n(\"70+ components · 5 foundations\") so we don't have to maintain\na parallel array.",{"type":11,"tag":45,"props":18336,"children":18338},{"id":18337},"_120-2026-05-08",[18339,18344],{"type":11,"tag":50,"props":18340,"children":18341},{},[18342],{"type":17,"value":18343},"1.2.0",{"type":17,"value":18345}," — 2026-05-08",{"type":11,"tag":19,"props":18347,"children":18348},{},[18349,18351,18357,18359,18365,18366,18372],{"type":17,"value":18350},"Cuts the accumulated post-v1.1.0 work into a tagged release. Two\ncomponent batches (data density + geographic charts) recovered from\na worktree wipe, the visual-language evolution prelude that should\nhave shipped before them, and an ",{"type":11,"tag":68,"props":18352,"children":18354},{"className":18353},[],[18355],{"type":17,"value":18356},"npm audit",{"type":17,"value":18358}," cleanup. No breaking\nchanges — pin bump from ",{"type":11,"tag":68,"props":18360,"children":18362},{"className":18361},[],[18363],{"type":17,"value":18364},"#v1.1.0",{"type":17,"value":6201},{"type":11,"tag":68,"props":18367,"children":18369},{"className":18368},[],[18370],{"type":17,"value":18371},"#v1.2.0",{"type":17,"value":14835},{"type":11,"tag":56,"props":18374,"children":18376},{"id":18375},"added-visual-language-evolution-prelude-2026-05",[18377],{"type":17,"value":18378},"Added — Visual-language evolution prelude (2026-05)",{"type":11,"tag":19,"props":18380,"children":18381},{},[18382,18384,18388],{"type":17,"value":18383},"Token-only refresh that should have shipped ",{"type":11,"tag":155,"props":18385,"children":18386},{},[18387],{"type":17,"value":1993},{"type":17,"value":18389}," the data-density\nbatch below. No per-component edits required for the base behavior;\nfamilies inherit the changes automatically.",{"type":11,"tag":77,"props":18391,"children":18392},{},[18393,18417,18456,18488,18506,18545,18598],{"type":11,"tag":81,"props":18394,"children":18395},{},[18396,18401,18403,18408,18409,18415],{"type":11,"tag":85,"props":18397,"children":18398},{},[18399],{"type":17,"value":18400},"Two-ring focus token",{"type":17,"value":18402}," — outer 2px maroon + inner 2px sand halo\nreplaces the prior single 3px maroon-at-35% ring. Reads cleanly on\ndata tables and form rows where a single soft ring gets lost. New\ntokens: ",{"type":11,"tag":68,"props":18404,"children":18406},{"className":18405},[],[18407],{"type":17,"value":3654},{"type":17,"value":95},{"type":11,"tag":68,"props":18410,"children":18412},{"className":18411},[],[18413],{"type":17,"value":18414},"--focus-ring-inner",{"type":17,"value":18416},". Variants: dark\nuses softened maroon + warm-gold inner; HC uses pure black + white\ninner at 5px total width. Lineage: Ant (two-ring concept) and\nFabric (focus discipline on data-rich surfaces); color story is\ntux-original.",{"type":11,"tag":81,"props":18418,"children":18419},{},[18420,18425,18426,18432,18434,18439,18441,18446,18448,18454],{"type":11,"tag":85,"props":18421,"children":18422},{},[18423],{"type":17,"value":18424},"Transportation-tempo easings",{"type":17,"value":1244},{"type":11,"tag":68,"props":18427,"children":18429},{"className":18428},[],[18430],{"type":17,"value":18431},"--ease-survey",{"type":17,"value":18433}," (tables\u002Fforms\u002F\ndisclosures), ",{"type":11,"tag":68,"props":18435,"children":18437},{"className":18436},[],[18438],{"type":17,"value":15234},{"type":17,"value":18440}," (page-level\u002Fsheets\u002Fmodals), and\n",{"type":11,"tag":68,"props":18442,"children":18444},{"className":18443},[],[18445],{"type":17,"value":16920},{"type":17,"value":18447}," (toasts\u002Fbanners\u002Fsnapshots locking in). Three\ndistinct curves giving \"measured \u002F smooth \u002F decelerate-only\"\ncoverage without overshoot. Legacy ",{"type":11,"tag":68,"props":18449,"children":18451},{"className":18450},[],[18452],{"type":17,"value":18453},"--ease-standard\u002Femphasis\u002Fexit",{"type":17,"value":18455},"\nretained as back-compat aliases. Lineage: Material 3\nstandard-effects family.",{"type":11,"tag":81,"props":18457,"children":18458},{},[18459,18464,18465,18471,18473,18478,18480,18486],{"type":11,"tag":85,"props":18460,"children":18461},{},[18462],{"type":17,"value":18463},"Four-tier elevation system",{"type":17,"value":1244},{"type":11,"tag":68,"props":18466,"children":18468},{"className":18467},[],[18469],{"type":17,"value":18470},"--elevation-flat\u002Frest\u002Fhover\u002F overlay\u002Fpinned",{"type":17,"value":18472},", layered on existing ",{"type":11,"tag":68,"props":18474,"children":18476},{"className":18475},[],[18477],{"type":17,"value":2881},{"type":17,"value":18479},". Gives\nevery component a predictable elevation role; old ",{"type":11,"tag":68,"props":18481,"children":18483},{"className":18482},[],[18484],{"type":17,"value":18485},"sm\u002Fmd\u002Flg",{"type":17,"value":18487}," are\nstill available as primitives but new work should use the named\ntiers. Variants: dark bumps overlay alpha so sheets stay readable\non warm charcoal; HC nukes shadows across the board and uses a\n2px border for the overlay tier. Lineage: Microsoft Fabric.",{"type":11,"tag":81,"props":18489,"children":18490},{},[18491,18496,18498,18504],{"type":11,"tag":85,"props":18492,"children":18493},{},[18494],{"type":17,"value":18495},"Warm-neutral ramp extension",{"type":17,"value":18497}," — added intermediate stops at\n",{"type":11,"tag":68,"props":18499,"children":18501},{"className":18500},[],[18502],{"type":17,"value":18503},"--neutral-150\u002F250\u002F450\u002F550\u002F650\u002F750\u002F850",{"type":17,"value":18505},". Sand-leaning tints that\nharmonize with maroon over extended viewing. Use for row-stripe,\nhover, and selected states on data-table surfaces (the original\n6-stop ramp couldn't carry those without compounding transparent\ntints). Lineage: shadcn's stone\u002Fzinc 12-stop ramps; hex values\ntux-original.",{"type":11,"tag":81,"props":18507,"children":18508},{},[18509,18514,18515,18521,18523,18528,18530,18536,18538,18543],{"type":11,"tag":85,"props":18510,"children":18511},{},[18512],{"type":17,"value":18513},"Survey-rhythm density tokens",{"type":17,"value":1244},{"type":11,"tag":68,"props":18516,"children":18518},{"className":18517},[],[18519],{"type":17,"value":18520},"--rhythm-tight\u002Fsnug\u002Fnormal\u002F loose\u002Froomy",{"type":17,"value":18522}," (4\u002F8\u002F12\u002F16\u002F24px). Use ",{"type":11,"tag":155,"props":18524,"children":18525},{},[18526],{"type":17,"value":18527},"instead of",{"type":17,"value":18529}," the general\n",{"type":11,"tag":68,"props":18531,"children":18533},{"className":18532},[],[18534],{"type":17,"value":18535},"--space-*",{"type":17,"value":18537}," ramp inside dense surfaces (tables, forms,\ndescriptions); ",{"type":11,"tag":68,"props":18539,"children":18541},{"className":18540},[],[18542],{"type":17,"value":18535},{"type":17,"value":18544}," stays for section\u002Fpage-level rhythm.\nLineage: Ant Design's 4\u002F8\u002F12\u002F16\u002F24 cadence.",{"type":11,"tag":81,"props":18546,"children":18547},{},[18548,18557,18559,18564,18566,18572,18574,18580,18582,18588,18590,18596],{"type":11,"tag":85,"props":18549,"children":18550},{},[18551],{"type":11,"tag":68,"props":18552,"children":18554},{"className":18553},[],[18555],{"type":17,"value":18556},"public\u002Fidentity-primitives.svg",{"type":17,"value":18558}," — four ",{"type":11,"tag":68,"props":18560,"children":18562},{"className":18561},[],[18563],{"type":17,"value":17008},{"type":17,"value":18565},"s exported\nas a single shared sprite: ",{"type":11,"tag":68,"props":18567,"children":18569},{"className":18568},[],[18570],{"type":17,"value":18571},"#tux-star",{"type":17,"value":18573}," (5-point Lone-star\nreference), ",{"type":11,"tag":68,"props":18575,"children":18577},{"className":18576},[],[18578],{"type":17,"value":18579},"#tux-chevron",{"type":17,"value":18581}," (TAMUS-style downward angle bracket),\n",{"type":11,"tag":68,"props":18583,"children":18585},{"className":18584},[],[18586],{"type":17,"value":18587},"#tux-compass",{"type":17,"value":18589}," (compass rose for map-related families), and\n",{"type":11,"tag":68,"props":18591,"children":18593},{"className":18592},[],[18594],{"type":17,"value":18595},"#tux-row-grid",{"type":17,"value":18597}," (parallel-lines-getting-denser pavement-stripe\npattern). Restraint-grade identity moves for corner accents,\nsection brackets, and map decorators. All draw with currentColor.",{"type":11,"tag":81,"props":18599,"children":18600},{},[18601,18609],{"type":11,"tag":85,"props":18602,"children":18603},{},[18604],{"type":11,"tag":68,"props":18605,"children":18607},{"className":18606},[],[18608],{"type":17,"value":17093},{"type":17,"value":18610}," — running ledger that\ndocuments each entry above (what changed \u002F why \u002F variants \u002F\nlineage). Future token-level changes get appended here.",{"type":11,"tag":56,"props":18612,"children":18614},{"id":18613},"added-data-density-geographic-charts-2026-05",[18615],{"type":17,"value":18616},"Added — Data density + geographic charts (2026-05)",{"type":11,"tag":19,"props":18618,"children":18619},{},[18620],{"type":17,"value":18621},"Two batches recovered after a worktree got wiped by a parallel\nsession before any of its work was committed. Rebuilt verbatim\nfrom chat memory + the official source of truth (us-atlas +\nTxDOT MapServer).",{"type":11,"tag":19,"props":18623,"children":18624},{},[18625],{"type":11,"tag":85,"props":18626,"children":18627},{},[18628],{"type":17,"value":18629},"Data density:",{"type":11,"tag":77,"props":18631,"children":18632},{},[18633,18733],{"type":11,"tag":81,"props":18634,"children":18635},{},[18636,18644,18646,18651,18652,18658,18659,18665,18666,18672,18674,18680,18681,18687,18688,18694,18695,18701,18702,18708,18710,18716,18718,18723,18725,18731],{"type":11,"tag":85,"props":18637,"children":18638},{},[18639],{"type":11,"tag":68,"props":18640,"children":18642},{"className":18641},[],[18643],{"type":17,"value":3357},{"type":17,"value":18645}," — interactive grid for PECAN-class\noperational surfaces. Sticky header, row selection w\u002F\nindeterminate header checkbox, expandable detail rows, sortable\ncolumns, active-filter chip strip, bulk-action bar (visible\nonly when ≥1 row selected), footer pagination strip. State is\nhost-driven via v-models (",{"type":11,"tag":68,"props":18647,"children":18649},{"className":18648},[],[18650],{"type":17,"value":13079},{"type":17,"value":875},{"type":11,"tag":68,"props":18653,"children":18655},{"className":18654},[],[18656],{"type":17,"value":18657},"expanded",{"type":17,"value":875},{"type":11,"tag":68,"props":18660,"children":18662},{"className":18661},[],[18663],{"type":17,"value":18664},"sortKey",{"type":17,"value":883},{"type":11,"tag":68,"props":18667,"children":18669},{"className":18668},[],[18670],{"type":17,"value":18671},"sortDir",{"type":17,"value":18673},") and events (",{"type":11,"tag":68,"props":18675,"children":18677},{"className":18676},[],[18678],{"type":17,"value":18679},"search",{"type":17,"value":95},{"type":11,"tag":68,"props":18682,"children":18684},{"className":18683},[],[18685],{"type":17,"value":18686},"filter-remove",{"type":17,"value":489},{"type":11,"tag":68,"props":18689,"children":18691},{"className":18690},[],[18692],{"type":17,"value":18693},"bulk-action",{"type":17,"value":95},{"type":11,"tag":68,"props":18696,"children":18698},{"className":18697},[],[18699],{"type":17,"value":18700},"page",{"type":17,"value":95},{"type":11,"tag":68,"props":18703,"children":18705},{"className":18704},[],[18706],{"type":17,"value":18707},"toolbar",{"type":17,"value":18709},"). Slots: ",{"type":11,"tag":68,"props":18711,"children":18713},{"className":18712},[],[18714],{"type":17,"value":18715},"cell-\u003Ckey>",{"type":17,"value":18717}," per\ncolumn, ",{"type":11,"tag":68,"props":18719,"children":18721},{"className":18720},[],[18722],{"type":17,"value":18657},{"type":17,"value":18724}," for row body, ",{"type":11,"tag":68,"props":18726,"children":18728},{"className":18727},[],[18729],{"type":17,"value":18730},"bulk-actions",{"type":17,"value":18732}," to override\nthe default action trio.",{"type":11,"tag":81,"props":18734,"children":18735},{},[18736,18745,18747,18753,18755,18761,18763,18769],{"type":11,"tag":85,"props":18737,"children":18738},{},[18739],{"type":11,"tag":68,"props":18740,"children":18742},{"className":18741},[],[18743],{"type":17,"value":18744},"TuxDataTable",{"type":17,"value":18746}," — research-flavored static table for\nfinished deliverables. Numbered caption (",{"type":11,"tag":68,"props":18748,"children":18750},{"className":18749},[],[18751],{"type":17,"value":18752},"Table 4-2",{"type":17,"value":18754},") over an\nOswald display title + optional descriptive lede; tabular-\nfigure body cells; uncertainty cells auto-rendered as\n",{"type":11,"tag":68,"props":18756,"children":18758},{"className":18757},[],[18759],{"type":17,"value":18760},"value ± CI",{"type":17,"value":18762}," when a column declares ",{"type":11,"tag":68,"props":18764,"children":18766},{"className":18765},[],[18767],{"type":17,"value":18768},"ciKey",{"type":17,"value":18770},"; footnote anchors\nwired to a formal note block; optional row groups banded by\ncategory; optional sticky header w\u002F max-height for appendix\ndensity; optional totals row w\u002F maroon top-rule; source\ncitation line. Sort is host-driven.",{"type":11,"tag":19,"props":18772,"children":18773},{},[18774],{"type":11,"tag":85,"props":18775,"children":18776},{},[18777],{"type":17,"value":18778},"Geographic charts (real geometry):",{"type":11,"tag":77,"props":18780,"children":18781},{},[18782,18853,18867,18887],{"type":11,"tag":81,"props":18783,"children":18784},{},[18785,18793,18795],{"type":11,"tag":85,"props":18786,"children":18787},{},[18788],{"type":11,"tag":68,"props":18789,"children":18791},{"className":18790},[],[18792],{"type":17,"value":3916},{"type":17,"value":18794}," — five Texas-flavored map kinds in\none component:",{"type":11,"tag":77,"props":18796,"children":18797},{},[18798,18809,18820,18831,18842],{"type":11,"tag":81,"props":18799,"children":18800},{},[18801,18807],{"type":11,"tag":68,"props":18802,"children":18804},{"className":18803},[],[18805],{"type":17,"value":18806},"county",{"type":17,"value":18808}," — 254 real TIGER\u002FLine counties projected with\nd3-geoAlbers (Texas-centered, parallels 27°N–35°N).",{"type":11,"tag":81,"props":18810,"children":18811},{},[18812,18818],{"type":11,"tag":68,"props":18813,"children":18815},{"className":18814},[],[18816],{"type":17,"value":18817},"districts",{"type":17,"value":18819}," — TxDOT's 25 engineering districts using the\nofficial boundary geometry from the TxDOT MapServer feature\nservice, Visvalingam-simplified at weight 0.05.",{"type":11,"tag":81,"props":18821,"children":18822},{},[18823,18829],{"type":11,"tag":68,"props":18824,"children":18826},{"className":18825},[],[18827],{"type":17,"value":18828},"us-context",{"type":17,"value":18830}," — All 50 US states + DC using the AlbersUsa\ncomposite projection (handles AK \u002F HI as insets natively).\nHighlighted state shifts to maroon.",{"type":11,"tag":81,"props":18832,"children":18833},{},[18834,18840],{"type":11,"tag":68,"props":18835,"children":18837},{"className":18836},[],[18838],{"type":17,"value":18839},"dot-density",{"type":17,"value":18841}," — Dots are rejection-sampled inside the actual\nTexas state outline using a deterministic Mulberry32 RNG so\nSSR + CSR produce the same scatter.",{"type":11,"tag":81,"props":18843,"children":18844},{},[18845,18851],{"type":11,"tag":68,"props":18846,"children":18848},{"className":18847},[],[18849],{"type":17,"value":18850},"flow",{"type":17,"value":18852}," — Origin-destination curved arcs between Texas's\nseven primary metros, projected from real lat\u002Flng.",{"type":11,"tag":81,"props":18854,"children":18855},{},[18856,18865],{"type":11,"tag":85,"props":18857,"children":18858},{},[18859],{"type":11,"tag":68,"props":18860,"children":18862},{"className":18861},[],[18863],{"type":17,"value":18864},"TuxMetroInset",{"type":17,"value":18866}," — single-metro neighborhood-grid companion\nfor 4-up drill-downs (Houston · DFW · Austin · SAT). Cell\npattern seeded by metro name so SSR + CSR match.",{"type":11,"tag":81,"props":18868,"children":18869},{},[18870,18878,18880,18885],{"type":11,"tag":85,"props":18871,"children":18872},{},[18873],{"type":11,"tag":68,"props":18874,"children":18876},{"className":18875},[],[18877],{"type":17,"value":3583},{"type":17,"value":18879}," — two-ring radial breakdown sister to\n",{"type":11,"tag":68,"props":18881,"children":18883},{"className":18882},[],[18884],{"type":17,"value":2612},{"type":17,"value":18886},". Inner ring = top-level groups, outer ring =\nchildren with stepped opacity, center carries total in\ntabular numerals. Container-queried legend collapse below\n36rem.",{"type":11,"tag":81,"props":18888,"children":18889},{},[18890,18898,18900,18906],{"type":11,"tag":85,"props":18891,"children":18892},{},[18893],{"type":11,"tag":68,"props":18894,"children":18896},{"className":18895},[],[18897],{"type":17,"value":10580},{"type":17,"value":18899}," — editorial wrapper (eyebrow + Oswald\ntitle + 2px maroon signature rule + body slot + source\u002Fnotes\nfooter) used by ",{"type":11,"tag":68,"props":18901,"children":18903},{"className":18902},[],[18904],{"type":17,"value":18905},"\u002Fvisualizations\u002F*",{"type":17,"value":18907}," showcase pages so a\nmulti-exhibit report reads as one document.",{"type":11,"tag":19,"props":18909,"children":18910},{},[18911],{"type":11,"tag":85,"props":18912,"children":18913},{},[18914],{"type":17,"value":18915},"Geometry pipeline (build-time only):",{"type":11,"tag":77,"props":18917,"children":18918},{},[18919,18989,19028,19076],{"type":11,"tag":81,"props":18920,"children":18921},{},[18922,18927,18929,18935,18937,18943,18945,18951,18953,18959,18960,18965,18966,18972,18973,18979,18981,18987],{"type":11,"tag":68,"props":18923,"children":18925},{"className":18924},[],[18926],{"type":17,"value":4014},{"type":17,"value":18928}," runs at build time only — pulls\nus-atlas (npm; TIGER\u002FLine 1:10m) and the official TxDOT\nMapServer feature service, simplifies via ",{"type":11,"tag":68,"props":18930,"children":18932},{"className":18931},[],[18933],{"type":17,"value":18934},"topojson-simplify",{"type":17,"value":18936},",\nprojects with ",{"type":11,"tag":68,"props":18938,"children":18940},{"className":18939},[],[18941],{"type":17,"value":18942},"d3-geoAlbers",{"type":17,"value":18944}," (Texas) \u002F ",{"type":11,"tag":68,"props":18946,"children":18948},{"className":18947},[],[18949],{"type":17,"value":18950},"d3-geoAlbersUsa",{"type":17,"value":18952}," (US),\nemits three TS modules under ",{"type":11,"tag":68,"props":18954,"children":18956},{"className":18955},[],[18957],{"type":17,"value":18958},"app\u002Fassets\u002Fgeo\u002F",{"type":17,"value":2078},{"type":11,"tag":68,"props":18961,"children":18963},{"className":18962},[],[18964],{"type":17,"value":4006},{"type":17,"value":489},{"type":11,"tag":68,"props":18967,"children":18969},{"className":18968},[],[18970],{"type":17,"value":18971},"texas-counties.ts",{"type":17,"value":95},{"type":11,"tag":68,"props":18974,"children":18976},{"className":18975},[],[18977],{"type":17,"value":18978},"us-states.ts",{"type":17,"value":18980},"). Outputs are checked in;\nre-run via ",{"type":11,"tag":68,"props":18982,"children":18984},{"className":18983},[],[18985],{"type":17,"value":18986},"npm run build:geo",{"type":17,"value":18988}," when upstream sources change.\nNo runtime projection or topology library — the component\nimports static SVG path strings.",{"type":11,"tag":81,"props":18990,"children":18991},{},[18992,18994,19000,19001,19007,19008,19014,19015,19020,19021,19027],{"type":17,"value":18993},"New devDependencies: ",{"type":11,"tag":68,"props":18995,"children":18997},{"className":18996},[],[18998],{"type":17,"value":18999},"d3-geo",{"type":17,"value":95},{"type":11,"tag":68,"props":19002,"children":19004},{"className":19003},[],[19005],{"type":17,"value":19006},"topojson-client",{"type":17,"value":489},{"type":11,"tag":68,"props":19009,"children":19011},{"className":19010},[],[19012],{"type":17,"value":19013},"topojson-server",{"type":17,"value":95},{"type":11,"tag":68,"props":19016,"children":19018},{"className":19017},[],[19019],{"type":17,"value":18934},{"type":17,"value":95},{"type":11,"tag":68,"props":19022,"children":19024},{"className":19023},[],[19025],{"type":17,"value":19026},"us-atlas",{"type":17,"value":43},{"type":11,"tag":81,"props":19029,"children":19030},{},[19031,19033,19038,19040,19045,19047,19053,19054,19060,19061,19067,19068,19074],{"type":17,"value":19032},"New tokens: ",{"type":11,"tag":68,"props":19034,"children":19036},{"className":19035},[],[19037],{"type":17,"value":15145},{"type":17,"value":19039}," through ",{"type":11,"tag":68,"props":19041,"children":19043},{"className":19042},[],[19044],{"type":17,"value":3827},{"type":17,"value":19046}," (categorical\npalette across light \u002F dark \u002F HC), ",{"type":11,"tag":68,"props":19048,"children":19050},{"className":19049},[],[19051],{"type":17,"value":19052},"--map-seq-maroon-1..5",{"type":17,"value":489},{"type":11,"tag":68,"props":19055,"children":19057},{"className":19056},[],[19058],{"type":17,"value":19059},"--map-seq-slate-1..5",{"type":17,"value":95},{"type":11,"tag":68,"props":19062,"children":19064},{"className":19063},[],[19065],{"type":17,"value":19066},"--map-outline",{"type":17,"value":95},{"type":11,"tag":68,"props":19069,"children":19071},{"className":19070},[],[19072],{"type":17,"value":19073},"--map-flow",{"type":17,"value":19075},". All\nthree theme variants override.",{"type":11,"tag":81,"props":19077,"children":19078},{},[19079,19085,19087,19093],{"type":11,"tag":68,"props":19080,"children":19082},{"className":19081},[],[19083],{"type":17,"value":19084},"data\u002Fsource\u002F",{"type":17,"value":19086}," added to ",{"type":11,"tag":68,"props":19088,"children":19090},{"className":19089},[],[19091],{"type":17,"value":19092},".gitignore",{"type":17,"value":19094}," (raw GeoJSON is 13MB+\nand re-fetchable from the TxDOT MapServer).",{"type":11,"tag":56,"props":19096,"children":19098},{"id":19097},"security-npm-audit-cleanup-8-0-vulnerabilities-2026-05",[19099,19101,19106],{"type":17,"value":19100},"Security — ",{"type":11,"tag":68,"props":19102,"children":19104},{"className":19103},[],[19105],{"type":17,"value":18356},{"type":17,"value":19107}," cleanup, 8 → 0 vulnerabilities (2026-05)",{"type":11,"tag":77,"props":19109,"children":19110},{},[19111,19154],{"type":11,"tag":81,"props":19112,"children":19113},{},[19114,19120,19122,19128,19130,19136,19138,19144,19146,19152],{"type":11,"tag":68,"props":19115,"children":19117},{"className":19116},[],[19118],{"type":17,"value":19119},"npm audit fix",{"type":17,"value":19121}," (no ",{"type":11,"tag":68,"props":19123,"children":19125},{"className":19124},[],[19126],{"type":17,"value":19127},"--force",{"type":17,"value":19129},") applied patch upgrades to\n",{"type":11,"tag":68,"props":19131,"children":19133},{"className":19132},[],[19134],{"type":17,"value":19135},"nitropack",{"type":17,"value":19137}," (open-redirect via wildcard route rules + proxy\nscope bypass), ",{"type":11,"tag":68,"props":19139,"children":19141},{"className":19140},[],[19142],{"type":17,"value":19143},"uuid",{"type":17,"value":19145}," (missing buffer-bounds check in v3\u002Fv5\u002Fv6),\nand ",{"type":11,"tag":68,"props":19147,"children":19149},{"className":19148},[],[19150],{"type":17,"value":19151},"basic-ftp",{"type":17,"value":19153}," (unbounded multiline FTP control buffer DoS,\ntransitive via Puppeteer's proxy-agent chain).",{"type":11,"tag":81,"props":19155,"children":19156},{},[19157,19163,19165,19170,19172,19178,19180,19185,19187,19196,19198,19204],{"type":11,"tag":68,"props":19158,"children":19160},{"className":19159},[],[19161],{"type":17,"value":19162},"potrace",{"type":17,"value":19164}," removed from ",{"type":11,"tag":68,"props":19166,"children":19168},{"className":19167},[],[19169],{"type":17,"value":6207},{"type":17,"value":19171},". The remaining five\nvulns were a single root cause counted across the\n",{"type":11,"tag":68,"props":19173,"children":19175},{"className":19174},[],[19176],{"type":17,"value":19177},"phin@2.x → @jimp\u002Fcore → @jimp\u002Fcustom → jimp → potrace",{"type":17,"value":19179}," chain.\nPotrace was a build-time-only utility (the SVGs it produced\nship in ",{"type":11,"tag":68,"props":19181,"children":19183},{"className":19182},[],[19184],{"type":17,"value":17024},{"type":17,"value":19186},"); the script\n",{"type":11,"tag":25,"props":19188,"children":19190},{"href":19189},"scripts\u002Fpng-to-svg-logo.mjs",[19191],{"type":11,"tag":68,"props":19192,"children":19194},{"className":19193},[],[19195],{"type":17,"value":19189},{"type":17,"value":19197},"\nnow starts with a fail-fast that prints regen instructions\n(",{"type":11,"tag":68,"props":19199,"children":19201},{"className":19200},[],[19202],{"type":17,"value":19203},"npm install --no-save potrace jimp@0.16",{"type":17,"value":2630},{"type":11,"tag":19,"props":19206,"children":19207},{},[19208,19213,19215,19221],{"type":11,"tag":68,"props":19209,"children":19211},{"className":19210},[],[19212],{"type":17,"value":18356},{"type":17,"value":19214}," reports ",{"type":11,"tag":68,"props":19216,"children":19218},{"className":19217},[],[19219],{"type":17,"value":19220},"found 0 vulnerabilities",{"type":17,"value":19222}," on a clean install.",{"type":11,"tag":56,"props":19224,"children":19226},{"id":19225},"docs-doctrine-catch-up",[19227],{"type":17,"value":19228},"Docs — doctrine catch-up",{"type":11,"tag":77,"props":19230,"children":19231},{},[19232,19280],{"type":11,"tag":81,"props":19233,"children":19234},{},[19235,19240,19242,19247,19248,19253,19255,19260,19261,19266,19267,19272,19273,19278],{"type":11,"tag":68,"props":19236,"children":19238},{"className":19237},[],[19239],{"type":17,"value":8060},{"type":17,"value":19241}," — added rows for ",{"type":11,"tag":68,"props":19243,"children":19245},{"className":19244},[],[19246],{"type":17,"value":18744},{"type":17,"value":489},{"type":11,"tag":68,"props":19249,"children":19251},{"className":19250},[],[19252],{"type":17,"value":3357},{"type":17,"value":19254}," (main table) and ",{"type":11,"tag":68,"props":19256,"children":19258},{"className":19257},[],[19259],{"type":17,"value":10580},{"type":17,"value":489},{"type":11,"tag":68,"props":19262,"children":19264},{"className":19263},[],[19265],{"type":17,"value":3916},{"type":17,"value":95},{"type":11,"tag":68,"props":19268,"children":19270},{"className":19269},[],[19271],{"type":17,"value":3583},{"type":17,"value":95},{"type":11,"tag":68,"props":19274,"children":19276},{"className":19275},[],[19277],{"type":17,"value":18864},{"type":17,"value":19279},"\n(Visualizations table). \"Want X? use Y\" pattern map gains\nfive entries (rich data grid, static research table, Texas\nmap, multi-metro inset, two-ring radial). Component count\nbumped ~60 → ~70.",{"type":11,"tag":81,"props":19281,"children":19282},{},[19283,19288,19290,19296],{"type":11,"tag":68,"props":19284,"children":19286},{"className":19285},[],[19287],{"type":17,"value":8483},{"type":17,"value":19289}," — new \"Recently shipped\" section covering\nthe data-density and geographic-charts batches plus the\nvisual-language evolution prelude. Notes that data-density\nwasn't on the original roadmap and the geographic-charts work\nis adjacent to (not a replacement for) the still-aspirational\n",{"type":11,"tag":68,"props":19291,"children":19293},{"className":19292},[],[19294],{"type":17,"value":19295},"TuxMapEmbed",{"type":17,"value":19297}," Mapbox\u002FLeaflet line.",{"type":11,"tag":45,"props":19299,"children":19301},{"id":19300},"_110-2026-05-06",[19302,19307],{"type":11,"tag":50,"props":19303,"children":19304},{},[19305],{"type":17,"value":19306},"1.1.0",{"type":17,"value":19308}," — 2026-05-06",{"type":11,"tag":19,"props":19310,"children":19311},{},[19312,19314,19320],{"type":17,"value":19313},"Cuts the accumulated post-v1.0.0 work into a tagged release so\nconsumers can pin to ",{"type":11,"tag":68,"props":19315,"children":19317},{"className":19316},[],[19318],{"type":17,"value":19319},"github:ttitamu\u002Ftti-ux#v1.1.0",{"type":17,"value":19321}," and upgrade\ndeliberately. Substantial new features in the hybrid-chrome family\n(below) plus packaging changes that make the GitHub-tag consumption\npath real.",{"type":11,"tag":56,"props":19323,"children":19325},{"id":19324},"added-packaging-for-github-tag-consumption",[19326],{"type":17,"value":19327},"Added — packaging for GitHub-tag consumption",{"type":11,"tag":77,"props":19329,"children":19330},{},[19331,19353,19411,19500],{"type":11,"tag":81,"props":19332,"children":19333},{},[19334,19351],{"type":11,"tag":85,"props":19335,"children":19336},{},[19337,19343,19344,19350],{"type":11,"tag":68,"props":19338,"children":19340},{"className":19339},[],[19341],{"type":17,"value":19342},"public\u002FCNAME",{"type":17,"value":14229},{"type":11,"tag":68,"props":19345,"children":19347},{"className":19346},[],[19348],{"type":17,"value":19349},"ux.tti.tamu.edu",{"type":17,"value":43},{"type":17,"value":19352}," Pins the custom domain\nin the Pages artifact so deploys don't drop the Settings → Pages\ncustom-domain value on republish — the source of recent HTTPS\ncert flakiness, since the cert is provisioned per-domain and only\nafter the domain is locked in.",{"type":11,"tag":81,"props":19354,"children":19355},{},[19356,19376,19378,19383,19384,19390,19391,19396,19397,19403,19404,19409],{"type":11,"tag":85,"props":19357,"children":19358},{},[19359,19364,19365,19370,19371],{"type":11,"tag":68,"props":19360,"children":19362},{"className":19361},[],[19363],{"type":17,"value":5916},{"type":17,"value":912},{"type":11,"tag":68,"props":19366,"children":19368},{"className":19367},[],[19369],{"type":17,"value":4332},{"type":17,"value":2115},{"type":11,"tag":68,"props":19372,"children":19374},{"className":19373},[],[19375],{"type":17,"value":9072},{"type":17,"value":19377}," so consumers get a clean\npackage shape: layer config (",{"type":11,"tag":68,"props":19379,"children":19381},{"className":19380},[],[19382],{"type":17,"value":2121},{"type":17,"value":786},{"type":11,"tag":68,"props":19385,"children":19387},{"className":19386},[],[19388],{"type":17,"value":19389},"app\u002F",{"type":17,"value":95},{"type":11,"tag":68,"props":19392,"children":19394},{"className":19393},[],[19395],{"type":17,"value":299},{"type":17,"value":489},{"type":11,"tag":68,"props":19398,"children":19400},{"className":19399},[],[19401],{"type":17,"value":19402},"docs\u002F",{"type":17,"value":95},{"type":11,"tag":68,"props":19405,"children":19407},{"className":19406},[],[19408],{"type":17,"value":17024},{"type":17,"value":19410},", plus README\u002FCHANGELOG\u002Ftsconfig. Everything\nelse (scripts, contrast-report, dist, node_modules) stays out.",{"type":11,"tag":81,"props":19412,"children":19413},{},[19414,19431,19432,19438,19439,19445,19446,19451,19452,19457,19458,19464,19466,19472,19473,19478,19479,19484,19485,19491,19492,19498],{"type":11,"tag":85,"props":19415,"children":19416},{},[19417,19419,19424,19425],{"type":17,"value":19418},"Runtime deps moved from ",{"type":11,"tag":68,"props":19420,"children":19422},{"className":19421},[],[19423],{"type":17,"value":6207},{"type":17,"value":6201},{"type":11,"tag":68,"props":19426,"children":19428},{"className":19427},[],[19429],{"type":17,"value":19430},"dependencies",{"type":17,"value":4211},{"type":11,"tag":68,"props":19433,"children":19435},{"className":19434},[],[19436],{"type":17,"value":19437},"@iconify-json\u002Flucide",{"type":17,"value":95},{"type":11,"tag":68,"props":19440,"children":19442},{"className":19441},[],[19443],{"type":17,"value":19444},"@tailwindcss\u002Fvite",{"type":17,"value":95},{"type":11,"tag":68,"props":19447,"children":19449},{"className":19448},[],[19450],{"type":17,"value":3702},{"type":17,"value":489},{"type":11,"tag":68,"props":19453,"children":19455},{"className":19454},[],[19456],{"type":17,"value":3419},{"type":17,"value":95},{"type":11,"tag":68,"props":19459,"children":19461},{"className":19460},[],[19462],{"type":17,"value":19463},"tailwindcss",{"type":17,"value":19465},". These are needed at build\ntime in any consumer that extends the layer or installs the\npackage, so they have to be runtime deps. (The pure tooling deps\n— ",{"type":11,"tag":68,"props":19467,"children":19469},{"className":19468},[],[19470],{"type":17,"value":19471},"@nuxt\u002Fdevtools",{"type":17,"value":95},{"type":11,"tag":68,"props":19474,"children":19476},{"className":19475},[],[19477],{"type":17,"value":4172},{"type":17,"value":95},{"type":11,"tag":68,"props":19480,"children":19482},{"className":19481},[],[19483],{"type":17,"value":19162},{"type":17,"value":95},{"type":11,"tag":68,"props":19486,"children":19488},{"className":19487},[],[19489],{"type":17,"value":19490},"serve-handler",{"type":17,"value":489},{"type":11,"tag":68,"props":19493,"children":19495},{"className":19494},[],[19496],{"type":17,"value":19497},"typescript",{"type":17,"value":19499}," — stay in devDependencies.)",{"type":11,"tag":81,"props":19501,"children":19502},{},[19503,19508,19510,19516,19518,19524],{"type":11,"tag":85,"props":19504,"children":19505},{},[19506],{"type":17,"value":19507},"README consumption guide",{"type":17,"value":19509}," rewritten around\n",{"type":11,"tag":68,"props":19511,"children":19513},{"className":19512},[],[19514],{"type":17,"value":19515},"extends: [\"github:ttitamu\u002Ftti-ux#v1.1.0\"]",{"type":17,"value":19517}," as the primary path,\nwith ",{"type":11,"tag":68,"props":19519,"children":19521},{"className":19520},[],[19522],{"type":17,"value":19523},"file:..\u002Ftti-ux",{"type":17,"value":19525}," kept as a local-dev fallback.",{"type":11,"tag":56,"props":19527,"children":19529},{"id":19528},"hybrid-chrome-pecan-driven",[19530],{"type":17,"value":19531},"Hybrid chrome (PECAN-driven)",{"type":11,"tag":19,"props":19533,"children":19534},{},[19535],{"type":17,"value":19536},"App-shape consumers (PECAN, tti-ai-studio) need a \"I'm in an\napplication\" chrome that wasn't quite expressible with the current\nTuxSiteNav + TuxDropdown + TuxMegaMenu set. v1.1.0 adds the missing\nhooks so the institutional + docs + app patterns can all share one\ncomponent family. All changes additive; no breaking changes for\nmarketing-surface consumers.",{"type":11,"tag":56,"props":19538,"children":19540},{"id":19539},"added-hybrid-chrome",[19541],{"type":17,"value":19542},"Added — hybrid chrome",{"type":11,"tag":77,"props":19544,"children":19545},{},[19546,19582,19619],{"type":11,"tag":81,"props":19547,"children":19548},{},[19549,19564,19566,19572,19574,19580],{"type":11,"tag":85,"props":19550,"children":19551},{},[19552,19557,19558,19563],{"type":11,"tag":68,"props":19553,"children":19555},{"className":19554},[],[19556],{"type":17,"value":12625},{"type":17,"value":996},{"type":11,"tag":68,"props":19559,"children":19561},{"className":19560},[],[19562],{"type":17,"value":3236},{"type":17,"value":11979},{"type":17,"value":19565}," — renders inside\n",{"type":11,"tag":68,"props":19567,"children":19569},{"className":19568},[],[19570],{"type":17,"value":19571},".tux-site-nav__bar-inner",{"type":17,"value":19573}," after the primary nav, with a\nleft-border separator from the nav. App-shape consumers drop\na utility cluster (search trigger, notifications bell, theme\ntoggle, user dropdown) into the slot; marketing surfaces leave\nit empty and rely on the upper utility bar (",{"type":11,"tag":68,"props":19575,"children":19577},{"className":19576},[],[19578],{"type":17,"value":19579},"utilityNav",{"type":17,"value":19581}," prop).",{"type":11,"tag":81,"props":19583,"children":19584},{},[19585,19594,19596,19602,19603,19609,19611,19617],{"type":11,"tag":85,"props":19586,"children":19587},{},[19588],{"type":11,"tag":68,"props":19589,"children":19591},{"className":19590},[],[19592],{"type":17,"value":19593},"PrimaryNavItem.to",{"type":17,"value":19595}," — now valid alongside ",{"type":11,"tag":68,"props":19597,"children":19599},{"className":19598},[],[19600],{"type":17,"value":19601},"dropdown",{"type":17,"value":883},{"type":11,"tag":68,"props":19604,"children":19606},{"className":19605},[],[19607],{"type":17,"value":19608},"megaMenu",{"type":17,"value":19610},". When set, the trigger LABEL becomes a real\n",{"type":11,"tag":68,"props":19612,"children":19614},{"className":19613},[],[19615],{"type":17,"value":19616},"NuxtLink",{"type":17,"value":19618}," (clicking → navigate; hover\u002Ffocus still opens the\npanel). Use the route the operator most likely wants when\nthey \"just click on the section name\" — typically the area's\noverview\u002Findex.",{"type":11,"tag":81,"props":19620,"children":19621},{},[19622,19627,19629],{"type":11,"tag":85,"props":19623,"children":19624},{},[19625],{"type":17,"value":19626},"Route-aware active states on TuxDropdown + TuxMegaMenu.",{"type":17,"value":19628},"\nEach menu computes:\n",{"type":11,"tag":77,"props":19630,"children":19631},{},[19632,19657,19690],{"type":11,"tag":81,"props":19633,"children":19634},{},[19635,19641,19643,19648,19650,19655],{"type":11,"tag":68,"props":19636,"children":19638},{"className":19637},[],[19639],{"type":17,"value":19640},"isTriggerActive",{"type":17,"value":19642}," — true when the route matches ",{"type":11,"tag":68,"props":19644,"children":19646},{"className":19645},[],[19647],{"type":17,"value":6032},{"type":17,"value":19649}," exactly\nOR is a strict descendant path OR matches any descendant\nitem's ",{"type":11,"tag":68,"props":19651,"children":19653},{"className":19652},[],[19654],{"type":17,"value":6032},{"type":17,"value":19656},". Renders the trigger with a 2px maroon\nbottom-border (with reserved-slot pattern so the active\nstate doesn't shift the label vertically).",{"type":11,"tag":81,"props":19658,"children":19659},{},[19660,19666,19668,19674,19676,19682,19684,19689],{"type":11,"tag":68,"props":19661,"children":19663},{"className":19662},[],[19664],{"type":17,"value":19665},"isItemActive(item)",{"type":17,"value":19667}," — exact-route match. Renders the item\nwith ",{"type":11,"tag":68,"props":19669,"children":19671},{"className":19670},[],[19672],{"type":17,"value":19673},"--active",{"type":17,"value":19675}," modifier: 9% maroon background tint + 2px\nmaroon left rail (via ",{"type":11,"tag":68,"props":19677,"children":19679},{"className":19678},[],[19680],{"type":17,"value":19681},"box-shadow: inset",{"type":17,"value":19683},") + bold label +\n",{"type":11,"tag":68,"props":19685,"children":19687},{"className":19686},[],[19688],{"type":17,"value":10802},{"type":17,"value":43},{"type":11,"tag":81,"props":19691,"children":19692},{},[19693,19695,19701,19703,19708,19710,19716],{"type":17,"value":19694},"Auto-close on navigation via ",{"type":11,"tag":68,"props":19696,"children":19698},{"className":19697},[],[19699],{"type":17,"value":19700},"watch(() => route.fullPath, …)",{"type":17,"value":19702},".\nSame ",{"type":11,"tag":68,"props":19704,"children":19706},{"className":19705},[],[19707],{"type":17,"value":19673},{"type":17,"value":19709}," shape applied to plain primary-nav links via\n",{"type":11,"tag":68,"props":19711,"children":19713},{"className":19712},[],[19714],{"type":17,"value":19715},"TuxSiteNav.isPlainLinkActive",{"type":17,"value":19717}," so all three primary-nav variants\nshare one visual language.",{"type":11,"tag":56,"props":19719,"children":19721},{"id":19720},"fixed-3",[19722],{"type":17,"value":2001},{"type":11,"tag":77,"props":19724,"children":19725},{},[19726,19865],{"type":11,"tag":81,"props":19727,"children":19728},{},[19729,19749,19750,19756,19757,19763,19765,19770,19772,19778,19780,19786,19787,19793,19795,19801,19803,19809,19811],{"type":11,"tag":85,"props":19730,"children":19731},{},[19732,19734,19740,19741,19747],{"type":17,"value":19733},"Active-state on ",{"type":11,"tag":68,"props":19735,"children":19737},{"className":19736},[],[19738],{"type":17,"value":19739},"?query=",{"type":17,"value":103},{"type":11,"tag":68,"props":19742,"children":19744},{"className":19743},[],[19745],{"type":17,"value":19746},"#hash",{"type":17,"value":19748}," routes",{"type":17,"value":4211},{"type":11,"tag":68,"props":19751,"children":19753},{"className":19752},[],[19754],{"type":17,"value":19755},"TuxDropdown.isItemActive",{"type":17,"value":95},{"type":11,"tag":68,"props":19758,"children":19760},{"className":19759},[],[19761],{"type":17,"value":19762},"TuxMegaMenu.isItemActive",{"type":17,"value":19764},", and\n",{"type":11,"tag":68,"props":19766,"children":19768},{"className":19767},[],[19769],{"type":17,"value":19715},{"type":17,"value":19771}," were comparing ",{"type":11,"tag":68,"props":19773,"children":19775},{"className":19774},[],[19776],{"type":17,"value":19777},"route.path === target",{"type":17,"value":19779},"\nwhich strips both the query and hash. Items like\n",{"type":11,"tag":68,"props":19781,"children":19783},{"className":19782},[],[19784],{"type":17,"value":19785},"\u002Fpolicies?tab=approvals",{"type":17,"value":103},{"type":11,"tag":68,"props":19788,"children":19790},{"className":19789},[],[19791],{"type":17,"value":19792},"\u002Fadmin#fleet",{"type":17,"value":19794}," never lit up; worse, on\na query-filtered route the bare-path sibling (",{"type":11,"tag":68,"props":19796,"children":19798},{"className":19797},[],[19799],{"type":17,"value":19800},"\u002Fpolicies",{"type":17,"value":19802},") STAYED\nactive, so two siblings claimed the indicator at once. Extracted the\nmatching rules into a shared ",{"type":11,"tag":68,"props":19804,"children":19806},{"className":19805},[],[19807],{"type":17,"value":19808},"app\u002Futils\u002Fnav-active.ts",{"type":17,"value":19810}," helper with\ntwo functions:\n",{"type":11,"tag":77,"props":19812,"children":19813},{},[19814,19832],{"type":11,"tag":81,"props":19815,"children":19816},{},[19817,19823,19825,19830],{"type":11,"tag":68,"props":19818,"children":19820},{"className":19819},[],[19821],{"type":17,"value":19822},"isExactActive(target, route)",{"type":17,"value":19824}," — segment-aware exact match (path +\nquery + hash). A bare-path target only lights up on a \"neutral\"\nroute (no query, no hash); a query\u002Fhash target requires an exact\nmatch. This is what individual items + ",{"type":11,"tag":68,"props":19826,"children":19828},{"className":19827},[],[19829],{"type":17,"value":10802},{"type":17,"value":19831}," use.",{"type":11,"tag":81,"props":19833,"children":19834},{},[19835,19841,19843,19849,19850,19856,19858,19863],{"type":11,"tag":68,"props":19836,"children":19838},{"className":19837},[],[19839],{"type":17,"value":19840},"isSectionActive(target, route)",{"type":17,"value":19842}," — path-only prefix match. This is\nwhat triggers and section indicators use, since ",{"type":11,"tag":68,"props":19844,"children":19846},{"className":19845},[],[19847],{"type":17,"value":19848},"?tab=",{"type":17,"value":875},{"type":11,"tag":68,"props":19851,"children":19853},{"className":19852},[],[19854],{"type":17,"value":19855},"#anchor",{"type":17,"value":19857},"\ndon't change which section the operator is in.\nAlso picked up by ",{"type":11,"tag":68,"props":19859,"children":19861},{"className":19860},[],[19862],{"type":17,"value":7236},{"type":17,"value":19864}," so doc anchors work the same way.",{"type":11,"tag":81,"props":19866,"children":19867},{},[19868,19873,19874,19880,19881,19886,19887,19892,19893,19898,19900,19906],{"type":11,"tag":85,"props":19869,"children":19870},{},[19871],{"type":17,"value":19872},"Trigger + item clickability under hover-open state",{"type":17,"value":4211},{"type":11,"tag":68,"props":19875,"children":19877},{"className":19876},[],[19878],{"type":17,"value":19879},"TuxDropdown",{"type":17,"value":875},{"type":11,"tag":68,"props":19882,"children":19884},{"className":19883},[],[19885],{"type":17,"value":4824},{"type":17,"value":875},{"type":11,"tag":68,"props":19888,"children":19890},{"className":19889},[],[19891],{"type":17,"value":12625},{"type":17,"value":875},{"type":11,"tag":68,"props":19894,"children":19896},{"className":19895},[],[19897],{"type":17,"value":5002},{"type":17,"value":19899}," were\nrendering navigable elements via ",{"type":11,"tag":68,"props":19901,"children":19903},{"className":19902},[],[19904],{"type":17,"value":19905},"\u003Ccomponent :is=\"triggerComponent\">",{"type":11,"tag":77,"props":19907,"children":19908},{},[19909],{"type":11,"tag":81,"props":19910,"children":19911},{},[19912,19918,19919,19925,19927,19932,19934,19940],{"type":11,"tag":68,"props":19913,"children":19915},{"className":19914},[],[19916],{"type":17,"value":19917},"v-bind=\"linkAttrs(item)\"",{"type":17,"value":14135},{"type":11,"tag":68,"props":19920,"children":19922},{"className":19921},[],[19923],{"type":17,"value":19924},"triggerComponent",{"type":17,"value":19926}," resolved a\n",{"type":11,"tag":68,"props":19928,"children":19930},{"className":19929},[],[19931],{"type":17,"value":19616},{"type":17,"value":19933}," from a string at runtime. Under hover-open state, clicks\non the trigger were being eaten intermittently (vue-router didn't\nalways have the resolved component reference at click-handling time).\nReplaced with explicit ",{"type":11,"tag":68,"props":19935,"children":19937},{"className":19936},[],[19938],{"type":17,"value":19939},"\u003CNuxtLink v-if> \u002F \u003Ca v-else-if> \u002F \u003Cbutton v-else>",{"type":17,"value":19941}," branches across all four components — vue-router gets the\nstatic component reference at compile time and clicks land\nreliably. Verbose, but the cost is cheap and the bug it prevents is\nuser-visible.",{"type":11,"tag":56,"props":19943,"children":19945},{"id":19944},"changed-2",[19946],{"type":17,"value":3591},{"type":11,"tag":77,"props":19948,"children":19949},{},[19950,20029],{"type":11,"tag":81,"props":19951,"children":19952},{},[19953,19963,19965,19971,19973,19979,19981,19987,19989,19995,19997,20003,20005,20011,20013,20019,20021,20027],{"type":11,"tag":85,"props":19954,"children":19955},{},[19956,19961],{"type":11,"tag":68,"props":19957,"children":19959},{"className":19958},[],[19960],{"type":17,"value":4824},{"type":17,"value":19962}," panel sizing",{"type":17,"value":19964}," — was ",{"type":11,"tag":68,"props":19966,"children":19968},{"className":19967},[],[19969],{"type":17,"value":19970},"position: absolute; left: 0; right: 0; max-width: 80rem",{"type":17,"value":19972}," but anchored to the trigger\n",{"type":11,"tag":68,"props":19974,"children":19976},{"className":19975},[],[19977],{"type":17,"value":19978},"\u003Cli>",{"type":17,"value":19980}," (which had ",{"type":11,"tag":68,"props":19982,"children":19984},{"className":19983},[],[19985],{"type":17,"value":19986},"position: relative",{"type":17,"value":19988}," for TuxDropdown's\nper-trigger panels). Result: panel inherited the narrow\ntrigger box; columns stacked vertically because\n",{"type":11,"tag":68,"props":19990,"children":19992},{"className":19991},[],[19993],{"type":17,"value":19994},"auto-fit minmax(11rem, 1fr)",{"type":17,"value":19996}," had no horizontal room. Fixed by\nanchoring the panel right-edge-to-trigger\n(",{"type":11,"tag":68,"props":19998,"children":20000},{"className":19999},[],[20001],{"type":17,"value":20002},"right: 0; left: auto",{"type":17,"value":20004},"), sizing it to its content\n(",{"type":11,"tag":68,"props":20006,"children":20008},{"className":20007},[],[20009],{"type":17,"value":20010},"width: max-content",{"type":17,"value":20012},"), capping at\n",{"type":11,"tag":68,"props":20014,"children":20016},{"className":20015},[],[20017],{"type":17,"value":20018},"min(48rem, calc(100vw - 2rem))",{"type":17,"value":20020}," with a ",{"type":11,"tag":68,"props":20022,"children":20024},{"className":20023},[],[20025],{"type":17,"value":20026},"min-width: 20rem",{"type":17,"value":20028},".\nThree columns now lay out side-by-side; visually consistent\nwith TuxDropdown (same border, shadow, density).",{"type":11,"tag":81,"props":20030,"children":20031},{},[20032,20042,20043,20049,20051,20056,20058,20064,20066,20071,20073,20079,20080,20086,20088,20094,20096,20102,20104,20110],{"type":11,"tag":85,"props":20033,"children":20034},{},[20035,20037],{"type":17,"value":20036},"Layer-rooted CSS paths in ",{"type":11,"tag":68,"props":20038,"children":20040},{"className":20039},[],[20041],{"type":17,"value":2121},{"type":17,"value":1244},{"type":11,"tag":68,"props":20044,"children":20046},{"className":20045},[],[20047],{"type":17,"value":20048},"~\u002F",{"type":17,"value":20050}," resolves\nto the consumer's ",{"type":11,"tag":68,"props":20052,"children":20054},{"className":20053},[],[20055],{"type":17,"value":19389},{"type":17,"value":20057},", not the layer's, so\n",{"type":11,"tag":68,"props":20059,"children":20061},{"className":20060},[],[20062],{"type":17,"value":20063},"~\u002Fassets\u002Fcss\u002Ftokens.css",{"type":17,"value":20065}," in the layer's nuxt.config breaks\nconsumers when they ",{"type":11,"tag":68,"props":20067,"children":20069},{"className":20068},[],[20070],{"type":17,"value":4873},{"type":17,"value":20072}," the layer. Now uses\n",{"type":11,"tag":68,"props":20074,"children":20076},{"className":20075},[],[20077],{"type":17,"value":20078},"dirname(fileURLToPath(globalThis._importMeta_.url))",{"type":17,"value":9561},{"type":11,"tag":68,"props":20081,"children":20083},{"className":20082},[],[20084],{"type":17,"value":20085},"resolve(layerDir, \"app\u002Fassets\u002Fcss\u002F...\")",{"type":17,"value":20087},". Same fix applied\nto ",{"type":11,"tag":68,"props":20089,"children":20091},{"className":20090},[],[20092],{"type":17,"value":20093},"app\u002Fpages\u002Ficons.vue",{"type":17,"value":20095},"'s import (was ",{"type":11,"tag":68,"props":20097,"children":20099},{"className":20098},[],[20100],{"type":17,"value":20101},"~\u002Futils\u002Flucide-names",{"type":17,"value":20103},",\nnow ",{"type":11,"tag":68,"props":20105,"children":20107},{"className":20106},[],[20108],{"type":17,"value":20109},"..\u002Futils\u002Flucide-names",{"type":17,"value":2630},{"type":11,"tag":56,"props":20112,"children":20114},{"id":20113},"token-additions",[20115],{"type":17,"value":20116},"Token additions",{"type":11,"tag":77,"props":20118,"children":20119},{},[20120],{"type":11,"tag":81,"props":20121,"children":20122},{},[20123,20128,20129,20134,20136,20142,20144,20150,20152,20157],{"type":11,"tag":85,"props":20124,"children":20125},{},[20126],{"type":17,"value":20127},"TTI gold palette",{"type":17,"value":19086},{"type":11,"tag":68,"props":20130,"children":20132},{"className":20131},[],[20133],{"type":17,"value":7046},{"type":17,"value":20135},"\n(50→950 anchored at #DDAC37 = 500). Was a planned follow-up\ndocumented in v1.0.0; now upstream so any consumer can flip\n",{"type":11,"tag":68,"props":20137,"children":20139},{"className":20138},[],[20140],{"type":17,"value":20141},"warning: amber → gold",{"type":17,"value":20143}," in their ",{"type":11,"tag":68,"props":20145,"children":20147},{"className":20146},[],[20148],{"type":17,"value":20149},"app.config.ts",{"type":17,"value":20151}," without a\nlocal ",{"type":11,"tag":68,"props":20153,"children":20155},{"className":20154},[],[20156],{"type":17,"value":2026},{"type":17,"value":20158}," shim.",{"type":11,"tag":56,"props":20160,"children":20162},{"id":20161},"documentation",[20163],{"type":17,"value":20164},"Documentation",{"type":11,"tag":77,"props":20166,"children":20167},{},[20168],{"type":11,"tag":81,"props":20169,"children":20170},{},[20171,20176,20178,20184,20185,20191,20193,20199],{"type":11,"tag":85,"props":20172,"children":20173},{},[20174],{"type":17,"value":20175},"Internal-tool footer exception",{"type":17,"value":20177},". The \"one footer component,\nvary content via ",{"type":11,"tag":68,"props":20179,"children":20181},{"className":20180},[],[20182],{"type":17,"value":20183},"columns",{"type":17,"value":103},{"type":11,"tag":68,"props":20186,"children":20188},{"className":20187},[],[20189],{"type":17,"value":20190},"social",{"type":17,"value":20192}," props\" guidance still\napplies to public institutional surfaces. But internal-tool\nconsumers (PECAN, future internal admin tools) should drop\nTuxFooter entirely — the marcom shape (state-resource columns,\nsocial row, TAMUS legal strip) is sized for tti.tamu.edu, not\nfor single-audience tools whose operators already know they\nwork for the institute. PECAN ships its own ",{"type":11,"tag":68,"props":20194,"children":20196},{"className":20195},[],[20197],{"type":17,"value":20198},"PecanOpsFooter",{"type":17,"value":20200},"\n(~40px slim strip with version pill + helpdesk + © anchor)\nas the documented exception.",{"type":11,"tag":45,"props":20202,"children":20204},{"id":20203},"_100-2026-04-27",[20205,20210],{"type":11,"tag":50,"props":20206,"children":20207},{},[20208],{"type":17,"value":20209},"1.0.0",{"type":17,"value":20211}," — 2026-04-27",{"type":11,"tag":19,"props":20213,"children":20214},{},[20215,20217,20222],{"type":17,"value":20216},"First versioned release. The catalog has been stable for three product\nconsumers (PECAN, tti-ai-studio, the style guide itself) for several\nweeks; cutting v1 makes the consumption story (",{"type":11,"tag":68,"props":20218,"children":20220},{"className":20219},[],[20221],{"type":17,"value":19523},{"type":17,"value":20223}," for\nnow, npm package later) explicit instead of implicit.",{"type":11,"tag":56,"props":20225,"children":20227},{"id":20226},"added-accessibility-tooling-aaa-conformance",[20228],{"type":17,"value":20229},"Added — accessibility tooling + AAA conformance",{"type":11,"tag":77,"props":20231,"children":20232},{},[20233,20249,20270,20291,20305,20445],{"type":11,"tag":81,"props":20234,"children":20235},{},[20236,20247],{"type":11,"tag":85,"props":20237,"children":20238},{},[20239,20245],{"type":11,"tag":68,"props":20240,"children":20242},{"className":20241},[],[20243],{"type":17,"value":20244},"\u002Faccessibility",{"type":17,"value":20246}," page",{"type":17,"value":20248}," with the formal conformance statement:\nWCAG 2.2 AA target; color contrast verified at AAA across all\nthree themes (light, dark, high-contrast).",{"type":11,"tag":81,"props":20250,"children":20251},{},[20252,20261,20263,20269],{"type":11,"tag":85,"props":20253,"children":20254},{},[20255,20260],{"type":11,"tag":68,"props":20256,"children":20258},{"className":20257},[],[20259],{"type":17,"value":5031},{"type":17,"value":20246},{"type":17,"value":20262}," renders every contrast-risk surface\nin three themed columns simultaneously (one per ",{"type":11,"tag":68,"props":20264,"children":20266},{"className":20265},[],[20267],{"type":17,"value":20268},"data-theme",{"type":17,"value":2630},{"type":11,"tag":81,"props":20271,"children":20272},{},[20273,20281,20283,20289],{"type":11,"tag":85,"props":20274,"children":20275},{},[20276],{"type":11,"tag":68,"props":20277,"children":20279},{"className":20278},[],[20280],{"type":17,"value":8998},{"type":17,"value":20282}," uses puppeteer + the WCAG 2.1\u002F2.2\ncontrast formula to compute ratios for every text\u002Fbackground\npair on the audit page. Reports both AA and AAA pass counts in\none run; gates on AAA when ",{"type":11,"tag":68,"props":20284,"children":20286},{"className":20285},[],[20287],{"type":17,"value":20288},"AUDIT_LEVEL=AAA",{"type":17,"value":20290}," is set (CI default).",{"type":11,"tag":81,"props":20292,"children":20293},{},[20294,20303],{"type":11,"tag":85,"props":20295,"children":20296},{},[20297],{"type":11,"tag":68,"props":20298,"children":20300},{"className":20299},[],[20301],{"type":17,"value":20302},"audit-contrast.yml",{"type":17,"value":20304}," workflow runs on every push + PR. CI\nfails if any contrast pair drops below AAA.",{"type":11,"tag":81,"props":20306,"children":20307},{},[20308,20313,20315],{"type":11,"tag":85,"props":20309,"children":20310},{},[20311],{"type":17,"value":20312},"Token revisions",{"type":17,"value":20314}," to clear AAA across the board:\n",{"type":11,"tag":77,"props":20316,"children":20317},{},[20318,20330,20341,20369,20381,20414,20433],{"type":11,"tag":81,"props":20319,"children":20320},{},[20321,20323,20328],{"type":17,"value":20322},"light ",{"type":11,"tag":68,"props":20324,"children":20326},{"className":20325},[],[20327],{"type":17,"value":651},{"type":17,"value":20329}," #5d5d5d → #424242 (8.97:1 on white)",{"type":11,"tag":81,"props":20331,"children":20332},{},[20333,20334,20339],{"type":17,"value":20322},{"type":11,"tag":68,"props":20335,"children":20337},{"className":20336},[],[20338],{"type":17,"value":635},{"type":17,"value":20340}," #6F6F6F → #525252 (7.05:1 on white)",{"type":11,"tag":81,"props":20342,"children":20343},{},[20344,20345,20351,20353,20359,20361,20367],{"type":17,"value":20322},{"type":11,"tag":68,"props":20346,"children":20348},{"className":20347},[],[20349],{"type":17,"value":20350},"--color-success",{"type":17,"value":20352}," → #3D5328, ",{"type":11,"tag":68,"props":20354,"children":20356},{"className":20355},[],[20357],{"type":17,"value":20358},"--color-error",{"type":17,"value":20360}," → #A02828,\n",{"type":11,"tag":68,"props":20362,"children":20364},{"className":20363},[],[20365],{"type":17,"value":20366},"--color-info",{"type":17,"value":20368}," → #1F5D66",{"type":11,"tag":81,"props":20370,"children":20371},{},[20372,20374,20379],{"type":17,"value":20373},"dark ",{"type":11,"tag":68,"props":20375,"children":20377},{"className":20376},[],[20378],{"type":17,"value":2712},{"type":17,"value":20380}," #d2718c → #e795a8 (7.92:1 on dark page)",{"type":11,"tag":81,"props":20382,"children":20383},{},[20384,20385,20391,20393,20398,20400,20405,20407,20412],{"type":17,"value":20373},{"type":11,"tag":68,"props":20386,"children":20388},{"className":20387},[],[20389],{"type":17,"value":20390},"--brand-secondary",{"type":17,"value":20392}," → #8ab7e2, ",{"type":11,"tag":68,"props":20394,"children":20396},{"className":20395},[],[20397],{"type":17,"value":20358},{"type":17,"value":20399}," → #F59292,\n",{"type":11,"tag":68,"props":20401,"children":20403},{"className":20402},[],[20404],{"type":17,"value":20350},{"type":17,"value":20406}," → #ABCC8E, ",{"type":11,"tag":68,"props":20408,"children":20410},{"className":20409},[],[20411],{"type":17,"value":20366},{"type":17,"value":20413}," → #9BD4E0",{"type":11,"tag":81,"props":20415,"children":20416},{},[20417,20419,20424,20426,20431],{"type":17,"value":20418},"HC ",{"type":11,"tag":68,"props":20420,"children":20422},{"className":20421},[],[20423],{"type":17,"value":635},{"type":17,"value":20425}," → #4D4D4D, ",{"type":11,"tag":68,"props":20427,"children":20429},{"className":20428},[],[20430],{"type":17,"value":20358},{"type":17,"value":20432}," → #A02828",{"type":11,"tag":81,"props":20434,"children":20435},{},[20436,20438,20443],{"type":17,"value":20437},"new ",{"type":11,"tag":68,"props":20439,"children":20441},{"className":20440},[],[20442],{"type":17,"value":2736},{"type":17,"value":20444}," token for filled maroon panels (always\n#5C0025 in light\u002Fdark, #500000 in HC) so brand-primary can\nlighten in dark mode for text legibility without compromising\npanel contrast.",{"type":11,"tag":81,"props":20446,"children":20447},{},[20448,20460,20462,20468,20470,20475,20476,20481,20483,20488,20490,20495],{"type":11,"tag":85,"props":20449,"children":20450},{},[20451,20453,20458],{"type":17,"value":20452},"Tailwind v4 ",{"type":11,"tag":68,"props":20454,"children":20456},{"className":20455},[],[20457],{"type":17,"value":13590},{"type":17,"value":20459}," cascade workaround",{"type":17,"value":20461},": re-bound every\n",{"type":11,"tag":68,"props":20463,"children":20465},{"className":20464},[],[20466],{"type":17,"value":20467},"--color-*",{"type":17,"value":20469}," alias inside ",{"type":11,"tag":68,"props":20471,"children":20473},{"className":20472},[],[20474],{"type":17,"value":8850},{"type":17,"value":5399},{"type":11,"tag":68,"props":20477,"children":20479},{"className":20478},[],[20480],{"type":17,"value":14442},{"type":17,"value":20482}," because Chrome freezes ",{"type":11,"tag":68,"props":20484,"children":20486},{"className":20485},[],[20487],{"type":17,"value":13590},{"type":17,"value":20489},"\nvariable references at ",{"type":11,"tag":68,"props":20491,"children":20493},{"className":20492},[],[20494],{"type":17,"value":14384},{"type":17,"value":20496}," scope. Without this, theme\noverrides on raw tokens didn't propagate to Tailwind utility\nclasses.",{"type":11,"tag":56,"props":20498,"children":20500},{"id":20499},"changed-breaking",[20501],{"type":17,"value":20502},"Changed — BREAKING",{"type":11,"tag":77,"props":20504,"children":20505},{},[20506],{"type":11,"tag":81,"props":20507,"children":20508},{},[20509,20519,20521,20526,20527,20533,20534,20540,20542,20547,20549],{"type":11,"tag":85,"props":20510,"children":20511},{},[20512,20517],{"type":11,"tag":68,"props":20513,"children":20515},{"className":20514},[],[20516],{"type":17,"value":5002},{"type":17,"value":20518}," is now the unified institutional footer.",{"type":17,"value":20520}," Earlier\nreleases shipped three separate components for the page anchor\n(slim ",{"type":11,"tag":68,"props":20522,"children":20524},{"className":20523},[],[20525],{"type":17,"value":5002},{"type":17,"value":95},{"type":11,"tag":68,"props":20528,"children":20530},{"className":20529},[],[20531],{"type":17,"value":20532},"TuxMarketingFooter",{"type":17,"value":95},{"type":11,"tag":68,"props":20535,"children":20537},{"className":20536},[],[20538],{"type":17,"value":20539},"TuxSubfooter",{"type":17,"value":20541},"); they're\ncollapsed into a single ",{"type":11,"tag":68,"props":20543,"children":20545},{"className":20544},[],[20546],{"type":17,"value":5002},{"type":17,"value":20548}," that renders the maroon\nmarketing block + the mandatory TAMUS legal strip in one\ncomponent. Every shipped TTI surface needs the same anchor —\nhaving three pieces was over-decomposition.\n",{"type":11,"tag":77,"props":20550,"children":20551},{},[20552,20599],{"type":11,"tag":81,"props":20553,"children":20554},{},[20555,20560,20562,20568,20570,20576,20578,20584,20586,20591,20592,20597],{"type":11,"tag":85,"props":20556,"children":20557},{},[20558],{"type":17,"value":20559},"Migration",{"type":17,"value":20561},": replace ",{"type":11,"tag":68,"props":20563,"children":20565},{"className":20564},[],[20566],{"type":17,"value":20567},"\u003CTuxFooter ... \u002F>\u003CTuxSubfooter \u002F>",{"type":17,"value":20569}," (and\nany ",{"type":11,"tag":68,"props":20571,"children":20573},{"className":20572},[],[20574],{"type":17,"value":20575},"\u003CTuxMarketingFooter \u002F>",{"type":17,"value":20577}," usage) with a single\n",{"type":11,"tag":68,"props":20579,"children":20581},{"className":20580},[],[20582],{"type":17,"value":20583},"\u003CTuxFooter :columns=\"...\" :social=\"...\" \u002F>",{"type":17,"value":20585},". Pass empty\narrays for ",{"type":11,"tag":68,"props":20587,"children":20589},{"className":20588},[],[20590],{"type":17,"value":20183},{"type":17,"value":103},{"type":11,"tag":68,"props":20593,"children":20595},{"className":20594},[],[20596],{"type":17,"value":20190},{"type":17,"value":20598}," to get the slim app-shape\n(just identity block + legal strip).",{"type":11,"tag":81,"props":20600,"children":20601},{},[20602,20607,20608,20613,20615,20620],{"type":11,"tag":85,"props":20603,"children":20604},{},[20605],{"type":17,"value":20606},"Removed components",{"type":17,"value":621},{"type":11,"tag":68,"props":20609,"children":20611},{"className":20610},[],[20612],{"type":17,"value":20532},{"type":17,"value":20614}," (lived for one\ncommit), ",{"type":11,"tag":68,"props":20616,"children":20618},{"className":20617},[],[20619],{"type":17,"value":20539},{"type":17,"value":20621}," (replaced by the legal-strip section\nof the new TuxFooter).",{"type":11,"tag":56,"props":20623,"children":20625},{"id":20624},"added-3",[20626],{"type":17,"value":1220},{"type":11,"tag":77,"props":20628,"children":20629},{},[20630,20651,20661,20683],{"type":11,"tag":81,"props":20631,"children":20632},{},[20633,20642,20644,20649],{"type":11,"tag":85,"props":20634,"children":20635},{},[20636,20641],{"type":11,"tag":68,"props":20637,"children":20639},{"className":20638},[],[20640],{"type":17,"value":16046},{"type":17,"value":20246},{"type":17,"value":20643}," — renders this file via the same MDC pipeline\nas ",{"type":11,"tag":68,"props":20645,"children":20647},{"className":20646},[],[20648],{"type":17,"value":15881},{"type":17,"value":20650},". Linked from the welcome page header and the\n\"What's new\" section.",{"type":11,"tag":81,"props":20652,"children":20653},{},[20654,20659],{"type":11,"tag":85,"props":20655,"children":20656},{},[20657],{"type":17,"value":20658},"\"Welcome\" sidebar group",{"type":17,"value":20660}," — Home + Changelog above Foundations.",{"type":11,"tag":81,"props":20662,"children":20663},{},[20664,20675,20677,20682],{"type":11,"tag":85,"props":20665,"children":20666},{},[20667,20673],{"type":11,"tag":68,"props":20668,"children":20670},{"className":20669},[],[20671],{"type":17,"value":20672},"v1.0.0",{"type":17,"value":20674}," version pill",{"type":17,"value":20676}," — surfaced in the header lockup and the\nwelcome eyebrow, sourced from ",{"type":11,"tag":68,"props":20678,"children":20680},{"className":20679},[],[20681],{"type":17,"value":9072},{"type":17,"value":43},{"type":11,"tag":81,"props":20684,"children":20685},{},[20686,20691],{"type":11,"tag":85,"props":20687,"children":20688},{},[20689],{"type":17,"value":20690},"Welcome-page polish",{"type":17,"value":20692}," — \"Recent updates\" timeline, CTA buttons\n(Doctrine \u002F Components \u002F Repo), tighter pitch covering all three\ndownstream consumers.",{"type":11,"tag":45,"props":20694,"children":20696},{"id":20695},"unreleased-1",[20697],{"type":17,"value":54},{"type":11,"tag":56,"props":20699,"children":20701},{"id":20700},"added-priority-a-roadmap-batch-2026-04-29",[20702],{"type":17,"value":20703},"Added — Priority A roadmap batch (2026-04-29)",{"type":11,"tag":19,"props":20705,"children":20706},{},[20707,20709,20714],{"type":17,"value":20708},"Status states, banners & tags, and dedicated form-primitive\nstate-matrix pages. Closes Priority A in ",{"type":11,"tag":68,"props":20710,"children":20712},{"className":20711},[],[20713],{"type":17,"value":8483},{"type":17,"value":20715},";\n~60 Tux* components total now in the catalog.",{"type":11,"tag":19,"props":20717,"children":20718},{},[20719],{"type":11,"tag":85,"props":20720,"children":20721},{},[20722],{"type":17,"value":20723},"Status states (3 new components):",{"type":11,"tag":77,"props":20725,"children":20726},{},[20727,20762,20872],{"type":11,"tag":81,"props":20728,"children":20729},{},[20730,20739,20740,20745,20747,20753,20755,20761],{"type":11,"tag":85,"props":20731,"children":20732},{},[20733],{"type":11,"tag":68,"props":20734,"children":20736},{"className":20735},[],[20737],{"type":17,"value":20738},"TuxErrorPage",{"type":17,"value":2078},{"type":11,"tag":25,"props":20741,"children":20743},{"href":20742},"app\u002Fcomponents\u002FTuxErrorPage.vue",[20744],{"type":17,"value":20742},{"type":17,"value":20746},")\n— full-page 404 \u002F 500 \u002F 403 \u002F 503 template. Editorial display-type\nstatus numeral, icon medallion, title + lede, recovery actions\n(TuxButton row), optional support \u002F status-page slot. Per-code\ndefaults (icons, copy, actions); slots and props override anything.\nUse as Nuxt's ",{"type":11,"tag":68,"props":20748,"children":20750},{"className":20749},[],[20751],{"type":17,"value":20752},"error.vue",{"type":17,"value":20754}," or inline via the ",{"type":11,"tag":68,"props":20756,"children":20758},{"className":20757},[],[20759],{"type":17,"value":20760},"inline",{"type":17,"value":7496},{"type":11,"tag":81,"props":20763,"children":20764},{},[20765,20774,20775,20780,20782,20788,20789,20795,20796,20801,20802,20808,20809,20814,20815,20821,20823,20829,20830,20836,20837,20842,20844,20856,20858,20863,20865,20871],{"type":11,"tag":85,"props":20766,"children":20767},{},[20768],{"type":11,"tag":68,"props":20769,"children":20771},{"className":20770},[],[20772],{"type":17,"value":20773},"TuxSkeleton",{"type":17,"value":2078},{"type":11,"tag":25,"props":20776,"children":20778},{"href":20777},"app\u002Fcomponents\u002FTuxSkeleton.vue",[20779],{"type":17,"value":20777},{"type":17,"value":20781},")\n— placeholder shapes for loading states. Six composed presets\n(",{"type":11,"tag":68,"props":20783,"children":20785},{"className":20784},[],[20786],{"type":17,"value":20787},"card",{"type":17,"value":875},{"type":11,"tag":68,"props":20790,"children":20792},{"className":20791},[],[20793],{"type":17,"value":20794},"list",{"type":17,"value":875},{"type":11,"tag":68,"props":20797,"children":20799},{"className":20798},[],[20800],{"type":17,"value":2144},{"type":17,"value":875},{"type":11,"tag":68,"props":20803,"children":20805},{"className":20804},[],[20806],{"type":17,"value":20807},"article",{"type":17,"value":875},{"type":11,"tag":68,"props":20810,"children":20812},{"className":20811},[],[20813],{"type":17,"value":7599},{"type":17,"value":875},{"type":11,"tag":68,"props":20816,"children":20818},{"className":20817},[],[20819],{"type":17,"value":20820},"stat",{"type":17,"value":20822},") plus\nprimitive mode (",{"type":11,"tag":68,"props":20824,"children":20826},{"className":20825},[],[20827],{"type":17,"value":20828},"width",{"type":17,"value":875},{"type":11,"tag":68,"props":20831,"children":20833},{"className":20832},[],[20834],{"type":17,"value":20835},"height",{"type":17,"value":875},{"type":11,"tag":68,"props":20838,"children":20840},{"className":20839},[],[20841],{"type":17,"value":2267},{"type":17,"value":20843},"). Three animation\nmodes: shimmer (default · 1.6s linear gradient sweep), pulse\n(cheaper opacity oscillation for dense lists), never (opt-out for\nprint \u002F screenshots). ",{"type":11,"tag":85,"props":20845,"children":20846},{},[20847,20849,20854],{"type":17,"value":20848},"Honors ",{"type":11,"tag":68,"props":20850,"children":20852},{"className":20851},[],[20853],{"type":17,"value":3334},{"type":17,"value":20855},"\nautomatically",{"type":17,"value":20857}," — collapses to a static tint, no movement, per\nthe roadmap spec. SR-only \"Loading…\" label on a ",{"type":11,"tag":68,"props":20859,"children":20861},{"className":20860},[],[20862],{"type":17,"value":4519},{"type":17,"value":20864},"\nregion; decorative shapes are ",{"type":11,"tag":68,"props":20866,"children":20868},{"className":20867},[],[20869],{"type":17,"value":20870},"aria-hidden",{"type":17,"value":43},{"type":11,"tag":81,"props":20873,"children":20874},{},[20875,20884,20885,20890,20892,20898,20900,20906,20908,20914,20916,20922,20924,20929,20931,20936,20938,20944,20946,20952],{"type":11,"tag":85,"props":20876,"children":20877},{},[20878],{"type":11,"tag":68,"props":20879,"children":20881},{"className":20880},[],[20882],{"type":17,"value":20883},"TuxStepper",{"type":17,"value":2078},{"type":11,"tag":25,"props":20886,"children":20888},{"href":20887},"app\u002Fcomponents\u002FTuxStepper.vue",[20889],{"type":17,"value":20887},{"type":17,"value":20891},")\n— numbered-circle multi-step indicator. Status auto-derives from\n",{"type":11,"tag":68,"props":20893,"children":20895},{"className":20894},[],[20896],{"type":17,"value":20897},"currentIndex",{"type":17,"value":20899}," (done · active · todo); per-step ",{"type":11,"tag":68,"props":20901,"children":20903},{"className":20902},[],[20904],{"type":17,"value":20905},"error",{"type":17,"value":20907}," override.\nTwo orientations (",{"type":11,"tag":68,"props":20909,"children":20911},{"className":20910},[],[20912],{"type":17,"value":20913},"horizontal",{"type":17,"value":20915}," collapses to ",{"type":11,"tag":68,"props":20917,"children":20919},{"className":20918},[],[20920],{"type":17,"value":20921},"vertical",{"type":17,"value":20923}," below\n~30rem container width via container query, not viewport). Optional\n",{"type":11,"tag":68,"props":20925,"children":20927},{"className":20926},[],[20928],{"type":17,"value":6032},{"type":17,"value":20930}," per step renders the node as ",{"type":11,"tag":68,"props":20932,"children":20934},{"className":20933},[],[20935],{"type":17,"value":19616},{"type":17,"value":20937}," for jump-back\nnavigation. Renders as ",{"type":11,"tag":68,"props":20939,"children":20941},{"className":20940},[],[20942],{"type":17,"value":20943},"\u003Cnav aria-label>",{"type":17,"value":20945}," with ",{"type":11,"tag":68,"props":20947,"children":20949},{"className":20948},[],[20950],{"type":17,"value":20951},"aria-current=\"step\"",{"type":17,"value":20953},"\non the active item. Use for funding applications, IRB\nsubmissions, study onboarding.",{"type":11,"tag":19,"props":20955,"children":20956},{},[20957],{"type":11,"tag":85,"props":20958,"children":20959},{},[20960],{"type":17,"value":20961},"Banners & tags (3 new components):",{"type":11,"tag":77,"props":20963,"children":20964},{},[20965,21045,21125],{"type":11,"tag":81,"props":20966,"children":20967},{},[20968,20976,20977,20982,20984,20989,20991,20997,20999,21004,21006,21012,21014,21020,21022,21028,21030,21035,21037,21043],{"type":11,"tag":85,"props":20969,"children":20970},{},[20971],{"type":11,"tag":68,"props":20972,"children":20974},{"className":20973},[],[20975],{"type":17,"value":5016},{"type":17,"value":2078},{"type":11,"tag":25,"props":20978,"children":20980},{"href":20979},"app\u002Fcomponents\u002FTuxAnnouncementBanner.vue",[20981],{"type":17,"value":20979},{"type":17,"value":20983},")\n— top-of-page dismissable strip for site-wide notices. Distinct\nfrom ",{"type":11,"tag":68,"props":20985,"children":20987},{"className":20986},[],[20988],{"type":17,"value":13895},{"type":17,"value":20990}," (page-body admonition) — this is chrome that sits\nabove the page header, full-width, persists across routes.\nDismissal persists in ",{"type":11,"tag":68,"props":20992,"children":20994},{"className":20993},[],[20995],{"type":17,"value":20996},"localStorage",{"type":17,"value":20998}," keyed by ",{"type":11,"tag":68,"props":21000,"children":21002},{"className":21001},[],[21003],{"type":17,"value":6079},{"type":17,"value":21005}," prop; emits\n",{"type":11,"tag":68,"props":21007,"children":21009},{"className":21008},[],[21010],{"type":17,"value":21011},"dismiss",{"type":17,"value":21013}," for consumers driving their own persistence. Four\ntones: ",{"type":11,"tag":68,"props":21015,"children":21017},{"className":21016},[],[21018],{"type":17,"value":21019},"info",{"type":17,"value":21021}," (blue), ",{"type":11,"tag":68,"props":21023,"children":21025},{"className":21024},[],[21026],{"type":17,"value":21027},"success",{"type":17,"value":21029}," (green), ",{"type":11,"tag":68,"props":21031,"children":21033},{"className":21032},[],[21034],{"type":17,"value":5123},{"type":17,"value":21036}," (gold),\n",{"type":11,"tag":68,"props":21038,"children":21040},{"className":21039},[],[21041],{"type":17,"value":21042},"urgent",{"type":17,"value":21044}," (maroon fill — reserves for service outages, security\nadvisories).",{"type":11,"tag":81,"props":21046,"children":21047},{},[21048,21057,21058,21063,21065,21071,21073,21079,21080,21086,21087,21093,21095,21100,21102,21108,21110,21115,21117,21123],{"type":11,"tag":85,"props":21049,"children":21050},{},[21051],{"type":11,"tag":68,"props":21052,"children":21054},{"className":21053},[],[21055],{"type":17,"value":21056},"TuxCookieConsent",{"type":17,"value":2078},{"type":11,"tag":25,"props":21059,"children":21061},{"href":21060},"app\u002Fcomponents\u002FTuxCookieConsent.vue",[21062],{"type":17,"value":21060},{"type":17,"value":21064},")\n— privacy notice required on public TTI surfaces. Bottom-right\nfloating card or full-width bottom strip (",{"type":11,"tag":68,"props":21066,"children":21068},{"className":21067},[],[21069],{"type":17,"value":21070},"position",{"type":17,"value":21072}," prop).\nDecision (",{"type":11,"tag":68,"props":21074,"children":21076},{"className":21075},[],[21077],{"type":17,"value":21078},"accepted",{"type":17,"value":875},{"type":11,"tag":68,"props":21081,"children":21083},{"className":21082},[],[21084],{"type":17,"value":21085},"rejected",{"type":17,"value":875},{"type":11,"tag":68,"props":21088,"children":21090},{"className":21089},[],[21091],{"type":17,"value":21092},"custom",{"type":17,"value":21094},") persists in\n",{"type":11,"tag":68,"props":21096,"children":21098},{"className":21097},[],[21099],{"type":17,"value":20996},{"type":17,"value":21101}," and emits via ",{"type":11,"tag":68,"props":21103,"children":21105},{"className":21104},[],[21106],{"type":17,"value":21107},"decision",{"type":17,"value":21109}," event so consumers can\ngate analytics. ",{"type":11,"tag":85,"props":21111,"children":21112},{},[21113],{"type":17,"value":21114},"Surface only",{"type":17,"value":21116},"; per-category UI lives in the\n",{"type":11,"tag":68,"props":21118,"children":21120},{"className":21119},[],[21121],{"type":17,"value":21122},"#categories",{"type":17,"value":21124}," slot — the host owns category names and wiring.\nNecessary cookies are implicitly accepted (no toggle).",{"type":11,"tag":81,"props":21126,"children":21127},{},[21128,21136,21137,21142,21144,21150,21152,21158,21160,21166,21168,21174,21176,21182,21184,21190,21192,21198],{"type":11,"tag":85,"props":21129,"children":21130},{},[21131],{"type":11,"tag":68,"props":21132,"children":21134},{"className":21133},[],[21135],{"type":17,"value":2217},{"type":17,"value":2078},{"type":11,"tag":25,"props":21138,"children":21140},{"href":21139},"app\u002Fcomponents\u002FTuxBetaRibbon.vue",[21141],{"type":17,"value":21139},{"type":17,"value":21143},")\n— environment \u002F lifecycle label. Three variants picked by host\ncontext, not aesthetic preference: ",{"type":11,"tag":68,"props":21145,"children":21147},{"className":21146},[],[21148],{"type":17,"value":21149},"corner",{"type":17,"value":21151}," (diagonal ribbon in\nthe page corner — full-deploy preview environments \u002F staging),\n",{"type":11,"tag":68,"props":21153,"children":21155},{"className":21154},[],[21156],{"type":17,"value":21157},"stripe",{"type":17,"value":21159}," (top-of-page horizontal full-width — production-shaped\ndeploys with non-prod data, public betas), ",{"type":11,"tag":68,"props":21161,"children":21163},{"className":21162},[],[21164],{"type":17,"value":21165},"pill",{"type":17,"value":21167}," (inline — feature-\nlevel beta tags, per-page indicators). Three tones: ",{"type":11,"tag":68,"props":21169,"children":21171},{"className":21170},[],[21172],{"type":17,"value":21173},"preview",{"type":17,"value":21175},"\n(gold), ",{"type":11,"tag":68,"props":21177,"children":21179},{"className":21178},[],[21180],{"type":17,"value":21181},"beta",{"type":17,"value":21183}," (navy), ",{"type":11,"tag":68,"props":21185,"children":21187},{"className":21186},[],[21188],{"type":17,"value":21189},"dev",{"type":17,"value":21191}," (warning red). Maintenance windows\nbelong on ",{"type":11,"tag":68,"props":21193,"children":21195},{"className":21194},[],[21196],{"type":17,"value":21197},"TuxAnnouncementBanner tone=\"urgent\"",{"type":17,"value":21199}," — content notice,\nnot chrome label.",{"type":11,"tag":19,"props":21201,"children":21202},{},[21203,21208,21210,21216],{"type":11,"tag":85,"props":21204,"children":21205},{},[21206],{"type":17,"value":21207},"Form primitives — 6 dedicated state-matrix pages, no new\ncomponents:",{"type":17,"value":21209}," the existing ",{"type":11,"tag":68,"props":21211,"children":21213},{"className":21212},[],[21214],{"type":17,"value":21215},"\u002Fforms",{"type":17,"value":21217}," page explicitly stated \"No Tux\nwrappers here yet\" — Nuxt UI's form primitives don't need deviation\nto fit the brand. The roadmap's intent was breaking the inline\ncatch-all into focused per-primitive pages, not new wrappers.",{"type":11,"tag":77,"props":21219,"children":21220},{},[21221,21249,21277,21298,21327,21377,21390],{"type":11,"tag":81,"props":21222,"children":21223},{},[21224,21234,21235,21240,21242,21248],{"type":11,"tag":85,"props":21225,"children":21226},{},[21227,21232],{"type":11,"tag":68,"props":21228,"children":21230},{"className":21229},[],[21231],{"type":17,"value":21215},{"type":17,"value":21233}," is now a landing",{"type":17,"value":2078},{"type":11,"tag":25,"props":21236,"children":21238},{"href":21237},"app\u002Fpages\u002Fforms\u002Findex.vue",[21239],{"type":17,"value":21237},{"type":17,"value":21241},")\nwith 6 tiles + a link to the legacy all-in-one demo (now at\n",{"type":11,"tag":68,"props":21243,"children":21245},{"className":21244},[],[21246],{"type":17,"value":21247},"\u002Fforms\u002Fall-in-one",{"type":17,"value":2630},{"type":11,"tag":81,"props":21250,"children":21251},{},[21252,21261,21262,21268,21269,21275],{"type":11,"tag":85,"props":21253,"children":21254},{},[21255],{"type":11,"tag":68,"props":21256,"children":21258},{"className":21257},[],[21259],{"type":17,"value":21260},"\u002Fforms\u002Ftext-field",{"type":17,"value":1244},{"type":11,"tag":68,"props":21263,"children":21265},{"className":21264},[],[21266],{"type":17,"value":21267},"UInput",{"type":17,"value":912},{"type":11,"tag":68,"props":21270,"children":21272},{"className":21271},[],[21273],{"type":17,"value":21274},"UTextarea",{"type":17,"value":21276}," state matrix:\ndefault · focus · filled · disabled · readonly · error · with\nhelper · with counter · auto-resize · trailing button · leading icon.",{"type":11,"tag":81,"props":21278,"children":21279},{},[21280,21289,21290,21296],{"type":11,"tag":85,"props":21281,"children":21282},{},[21283],{"type":11,"tag":68,"props":21284,"children":21286},{"className":21285},[],[21287],{"type":17,"value":21288},"\u002Fforms\u002Fselect",{"type":17,"value":1244},{"type":11,"tag":68,"props":21291,"children":21293},{"className":21292},[],[21294],{"type":17,"value":21295},"USelectMenu",{"type":17,"value":21297}," with descriptions (TAMUS\nclassification tiers), searchable combobox, creatable values,\nmulti-select.",{"type":11,"tag":81,"props":21299,"children":21300},{},[21301,21310,21311,21317,21319,21325],{"type":11,"tag":85,"props":21302,"children":21303},{},[21304],{"type":11,"tag":68,"props":21305,"children":21307},{"className":21306},[],[21308],{"type":17,"value":21309},"\u002Fforms\u002Fchoice",{"type":17,"value":1244},{"type":11,"tag":68,"props":21312,"children":21314},{"className":21313},[],[21315],{"type":17,"value":21316},"UCheckbox",{"type":17,"value":21318}," group with select-all +\nindeterminate parent; ",{"type":11,"tag":68,"props":21320,"children":21322},{"className":21321},[],[21323],{"type":17,"value":21324},"URadioGroup",{"type":17,"value":21326}," with descriptions and inline\norientation; \"when to reach for which\" decision section.",{"type":11,"tag":81,"props":21328,"children":21329},{},[21330,21339,21341,21347,21349,21355,21356,21362,21363,21369,21370,21376],{"type":11,"tag":85,"props":21331,"children":21332},{},[21333],{"type":11,"tag":68,"props":21334,"children":21336},{"className":21335},[],[21337],{"type":17,"value":21338},"\u002Fforms\u002Fdate-picker",{"type":17,"value":21340}," — native ",{"type":11,"tag":68,"props":21342,"children":21344},{"className":21343},[],[21345],{"type":17,"value":21346},"UInput type=\"date\"",{"type":17,"value":21348}," with\nhelper, min\u002Fmax bounds, range-input pattern, plus\n",{"type":11,"tag":68,"props":21350,"children":21352},{"className":21351},[],[21353],{"type":17,"value":21354},"time",{"type":17,"value":875},{"type":11,"tag":68,"props":21357,"children":21359},{"className":21358},[],[21360],{"type":17,"value":21361},"datetime-local",{"type":17,"value":875},{"type":11,"tag":68,"props":21364,"children":21366},{"className":21365},[],[21367],{"type":17,"value":21368},"month",{"type":17,"value":875},{"type":11,"tag":68,"props":21371,"children":21373},{"className":21372},[],[21374],{"type":17,"value":21375},"week",{"type":17,"value":43},{"type":11,"tag":81,"props":21378,"children":21379},{},[21380,21388],{"type":11,"tag":85,"props":21381,"children":21382},{},[21383],{"type":11,"tag":68,"props":21384,"children":21386},{"className":21385},[],[21387],{"type":17,"value":6457},{"type":17,"value":21389}," — drag-drop dropzone, file list with\nper-file progress + status icons, error and complete states.\nWorking sketch; consuming apps wire the actual upload backend.",{"type":11,"tag":81,"props":21391,"children":21392},{},[21393,21402],{"type":11,"tag":85,"props":21394,"children":21395},{},[21396],{"type":11,"tag":68,"props":21397,"children":21399},{"className":21398},[],[21400],{"type":17,"value":21401},"\u002Fforms\u002Finline-validation",{"type":17,"value":21403}," — live patterns: character counter,\nphone-number mask, NIH grant ID mask, async \"this email is taken\"\nwith debounced check. Inline patterns; \"why no Tux wrapper\"\nrationale.",{"type":11,"tag":19,"props":21405,"children":21406},{},[21407],{"type":11,"tag":85,"props":21408,"children":21409},{},[21410],{"type":17,"value":21411},"Wiring:",{"type":11,"tag":77,"props":21413,"children":21414},{},[21415,21486],{"type":11,"tag":81,"props":21416,"children":21417},{},[21418,21420,21425,21426,21431,21432,21437,21438,21443,21444,21449,21450,21455,21457,21461,21463,21468,21470],{"type":17,"value":21419},"Sidebar nav: 6 new entries in the alpha-sorted Components group\n(",{"type":11,"tag":68,"props":21421,"children":21423},{"className":21422},[],[21424],{"type":17,"value":5016},{"type":17,"value":95},{"type":11,"tag":68,"props":21427,"children":21429},{"className":21428},[],[21430],{"type":17,"value":2217},{"type":17,"value":95},{"type":11,"tag":68,"props":21433,"children":21435},{"className":21434},[],[21436],{"type":17,"value":21056},{"type":17,"value":489},{"type":11,"tag":68,"props":21439,"children":21441},{"className":21440},[],[21442],{"type":17,"value":20738},{"type":17,"value":95},{"type":11,"tag":68,"props":21445,"children":21447},{"className":21446},[],[21448],{"type":17,"value":20773},{"type":17,"value":95},{"type":11,"tag":68,"props":21451,"children":21453},{"className":21452},[],[21454],{"type":17,"value":20883},{"type":17,"value":21456},"); the \"Forms\" entry\nin the Composition group is replaced by a dedicated ",{"type":11,"tag":85,"props":21458,"children":21459},{},[21460],{"type":17,"value":101},{"type":17,"value":21462},"\ngroup with an overview link and 6 sub-pages + the all-in-one\ndemo. Components catalog (",{"type":11,"tag":25,"props":21464,"children":21465},{"href":8734},[21466],{"type":17,"value":21467},"components\u002Findex.vue",{"type":17,"value":21469},")\n",{"type":11,"tag":77,"props":21471,"children":21472},{},[21473],{"type":11,"tag":81,"props":21474,"children":21475},{},[21476,21478,21484],{"type":17,"value":21477},"home grid (",{"type":11,"tag":25,"props":21479,"children":21481},{"href":21480},"app\u002Fpages\u002Findex.vue",[21482],{"type":17,"value":21483},"pages\u002Findex.vue",{"type":17,"value":21485},") + doctrine\ntable + pattern coverage map all updated.",{"type":11,"tag":81,"props":21487,"children":21488},{},[21489,21490,21496],{"type":17,"value":128},{"type":11,"tag":68,"props":21491,"children":21493},{"className":21492},[],[21494],{"type":17,"value":21495},"pattern-coverage",{"type":17,"value":21497}," entries: \"Loading placeholder\" → Skeleton,\n\"404 \u002F 500 page\" → ErrorPage, \"Multi-step flow indicator\" →\nStepper, \"Site-wide notice strip\" → AnnouncementBanner, \"This\nisn't production label\" → BetaRibbon, \"Privacy \u002F cookie consent\" →\nCookieConsent.",{"type":11,"tag":56,"props":21499,"children":21501},{"id":21500},"added-design-kit-port-chat-primitives-reports-section",[21502],{"type":17,"value":21503},"Added — design-kit port (chat primitives + reports section)",{"type":11,"tag":77,"props":21505,"children":21506},{},[21507,21659,21773,21895,21937,21968,21978],{"type":11,"tag":81,"props":21508,"children":21509},{},[21510,21515,21517,21522,21524],{"type":11,"tag":85,"props":21511,"children":21512},{},[21513],{"type":17,"value":21514},"Chat primitives — five components",{"type":17,"value":21516}," ported from the tti-ai-chat\nReact\u002FJSX kit. They were previously demo mocks; now they're real\nVue SFCs in the catalog so a future tti-ai-chat Nuxt project can\nconsume them via the same ",{"type":11,"tag":68,"props":21518,"children":21520},{"className":21519},[],[21521],{"type":17,"value":19523},{"type":17,"value":21523}," link the other consumers\nuse.\n",{"type":11,"tag":77,"props":21525,"children":21526},{},[21527,21567,21586,21620,21639],{"type":11,"tag":81,"props":21528,"children":21529},{},[21530,21538,21539,21543,21545,21551,21552,21558,21560,21565],{"type":11,"tag":85,"props":21531,"children":21532},{},[21533],{"type":11,"tag":68,"props":21534,"children":21536},{"className":21535},[],[21537],{"type":17,"value":13024},{"type":17,"value":2078},{"type":11,"tag":25,"props":21540,"children":21541},{"href":13017},[21542],{"type":17,"value":13017},{"type":17,"value":21544},") —\none conversation turn. ",{"type":11,"tag":68,"props":21546,"children":21548},{"className":21547},[],[21549],{"type":17,"value":21550},"role=\"user\"",{"type":17,"value":14415},{"type":11,"tag":68,"props":21553,"children":21555},{"className":21554},[],[21556],{"type":17,"value":21557},"role=\"assistant\"",{"type":17,"value":21559},"; the\nassistant variant sits on ",{"type":11,"tag":68,"props":21561,"children":21563},{"className":21562},[],[21564],{"type":17,"value":7073},{"type":17,"value":21566}," so model output reads\nas a distinct visual lane. Slots for citations, tools, and\navatar.",{"type":11,"tag":81,"props":21568,"children":21569},{},[21570,21578,21579,21584],{"type":11,"tag":85,"props":21571,"children":21572},{},[21573],{"type":11,"tag":68,"props":21574,"children":21576},{"className":21575},[],[21577],{"type":17,"value":2465},{"type":17,"value":2078},{"type":11,"tag":25,"props":21580,"children":21582},{"href":21581},"app\u002Fcomponents\u002FTuxCitations.vue",[21583],{"type":17,"value":21581},{"type":17,"value":21585},") —\nnumbered source list under an assistant message. Three-column\ngrid (rank · body · score) so paths can ellipsize without\npushing the score off-screen.",{"type":11,"tag":81,"props":21587,"children":21588},{},[21589,21597,21598,21602,21604,21610,21612,21618],{"type":11,"tag":85,"props":21590,"children":21591},{},[21592],{"type":11,"tag":68,"props":21593,"children":21595},{"className":21594},[],[21596],{"type":17,"value":12044},{"type":17,"value":2078},{"type":11,"tag":25,"props":21599,"children":21600},{"href":12037},[21601],{"type":17,"value":12037},{"type":17,"value":21603},") —\nchat input with optional compliance scope banner. Two-zone layout\n(textarea + toolbar). Built-in model picker, corpus-attach,\nchar counter, and ⌘↵-to-send. Slot in a ",{"type":11,"tag":68,"props":21605,"children":21607},{"className":21606},[],[21608],{"type":17,"value":21609},"TuxAlert variant=\"compliance\"",{"type":17,"value":21611},"\nvia the ",{"type":11,"tag":68,"props":21613,"children":21615},{"className":21614},[],[21616],{"type":17,"value":21617},"#scope",{"type":17,"value":21619}," slot for ITAR \u002F restricted-corpus framing.",{"type":11,"tag":81,"props":21621,"children":21622},{},[21623,21631,21632,21637],{"type":11,"tag":85,"props":21624,"children":21625},{},[21626],{"type":11,"tag":68,"props":21627,"children":21629},{"className":21628},[],[21630],{"type":17,"value":2425},{"type":17,"value":2078},{"type":11,"tag":25,"props":21633,"children":21635},{"href":21634},"app\u002Fcomponents\u002FTuxConversationList.vue",[21636],{"type":17,"value":21634},{"type":17,"value":21638},")\n— left-rail history grouped by temporal bucket (TODAY · YESTERDAY\n· THIS WEEK · …). 3px maroon left border + 10%-tint background\non the active item.",{"type":11,"tag":81,"props":21640,"children":21641},{},[21642,21651,21652,21657],{"type":11,"tag":85,"props":21643,"children":21644},{},[21645],{"type":11,"tag":68,"props":21646,"children":21648},{"className":21647},[],[21649],{"type":17,"value":21650},"TuxContextPanel",{"type":17,"value":2078},{"type":11,"tag":25,"props":21653,"children":21655},{"href":21654},"app\u002Fcomponents\u002FTuxContextPanel.vue",[21656],{"type":17,"value":21654},{"type":17,"value":21658},")\n— right-rail surface for grounding context (corpus, retrieval,\nusage). Slot-driven; the panel contributes the chrome (border,\nscroll, width, padding scheme) and the host arranges sections.",{"type":11,"tag":81,"props":21660,"children":21661},{},[21662,21673,21675],{"type":11,"tag":85,"props":21663,"children":21664},{},[21665,21666,21671],{"type":17,"value":128},{"type":11,"tag":68,"props":21667,"children":21669},{"className":21668},[],[21670],{"type":17,"value":524},{"type":17,"value":21672}," section — finished-narrative deliverables.",{"type":17,"value":21674},"\nPaper · PDF · print. The reader reads top-to-bottom.\n",{"type":11,"tag":77,"props":21676,"children":21677},{},[21678,21706,21757],{"type":11,"tag":81,"props":21679,"children":21680},{},[21681,21690,21691,21696,21698,21704],{"type":11,"tag":85,"props":21682,"children":21683},{},[21684],{"type":11,"tag":68,"props":21685,"children":21687},{"className":21686},[],[21688],{"type":17,"value":21689},"TuxReportFrame",{"type":17,"value":2078},{"type":11,"tag":25,"props":21692,"children":21694},{"href":21693},"app\u002Fcomponents\u002FTuxReportFrame.vue",[21695],{"type":17,"value":21693},{"type":17,"value":21697},")\n— page-sized canvas (letter \u002F a4, portrait or landscape) for\nPDF export and print. Editorial or compact density. Draws a\npaper-sheet shadow on screen; goes flush borderless under\n",{"type":11,"tag":68,"props":21699,"children":21701},{"className":21700},[],[21702],{"type":17,"value":21703},"@media print",{"type":17,"value":21705},". Visualizations, stats, and prose go inside.",{"type":11,"tag":81,"props":21707,"children":21708},{},[21709,21718,21719,21724,21726,21732,21734,21740,21742,21748,21750,21756],{"type":11,"tag":85,"props":21710,"children":21711},{},[21712],{"type":11,"tag":68,"props":21713,"children":21715},{"className":21714},[],[21716],{"type":17,"value":21717},"TuxReportPrintSheet",{"type":17,"value":2078},{"type":11,"tag":25,"props":21720,"children":21722},{"href":21721},"app\u002Fcomponents\u002FTuxReportPrintSheet.vue",[21723],{"type":17,"value":21721},{"type":17,"value":21725},")\n— drop-in print stylesheet. Renders nothing on screen; injects\na ",{"type":11,"tag":68,"props":21727,"children":21729},{"className":21728},[],[21730],{"type":17,"value":21731},"\u003Cstyle media=\"print\">",{"type":17,"value":21733}," into the head via ",{"type":11,"tag":68,"props":21735,"children":21737},{"className":21736},[],[21738],{"type":17,"value":21739},"useHead",{"type":17,"value":21741},". Hides\nchrome marked ",{"type":11,"tag":68,"props":21743,"children":21745},{"className":21744},[],[21746],{"type":17,"value":21747},"data-print=\"hide\"",{"type":17,"value":21749},"; paginates with\n",{"type":11,"tag":68,"props":21751,"children":21753},{"className":21752},[],[21754],{"type":17,"value":21755},"data-print-break=\"before|after|avoid\"",{"type":17,"value":43},{"type":11,"tag":81,"props":21758,"children":21759},{},[21760,21765,21766,21771],{"type":11,"tag":85,"props":21761,"children":21762},{},[21763],{"type":17,"value":21764},"Reports landing",{"type":17,"value":2078},{"type":11,"tag":25,"props":21767,"children":21769},{"href":21768},"app\u002Fpages\u002Freports\u002Findex.vue",[21770],{"type":17,"value":21768},{"type":17,"value":21772},")\n— overview tiles, scope explainer (what's a report vs a viz).",{"type":11,"tag":81,"props":21774,"children":21775},{},[21776,21788,21790],{"type":11,"tag":85,"props":21777,"children":21778},{},[21779,21780,21786],{"type":17,"value":128},{"type":11,"tag":68,"props":21781,"children":21783},{"className":21782},[],[21784],{"type":17,"value":21785},"\u002Fvisualizations",{"type":17,"value":21787}," section — interactive data surfaces.",{"type":17,"value":21789},"\nBI dashboards · R artifacts · future native charts. The reader\npivots, filters, drills in. Distinct from Reports because the\nchrome and posture are different (provider chip, sandbox, source\ncaption), and the deliverable lives inside the app, not on paper.\n",{"type":11,"tag":77,"props":21791,"children":21792},{},[21793,21821,21879],{"type":11,"tag":81,"props":21794,"children":21795},{},[21796,21805,21806,21811,21813,21819],{"type":11,"tag":85,"props":21797,"children":21798},{},[21799],{"type":11,"tag":68,"props":21800,"children":21802},{"className":21801},[],[21803],{"type":17,"value":21804},"TuxVizEmbed",{"type":17,"value":2078},{"type":11,"tag":25,"props":21807,"children":21809},{"href":21808},"app\u002Fcomponents\u002FTuxVizEmbed.vue",[21810],{"type":17,"value":21808},{"type":17,"value":21812},")\n— branded chrome around a Tableau \u002F Power BI \u002F Apache Superset\n\u002F Grafana iframe. Provider chip + open-in-new + per-provider\nsandbox + loading\u002Ferror states. New ",{"type":11,"tag":68,"props":21814,"children":21816},{"className":21815},[],[21817],{"type":17,"value":21818},"posterSrc",{"type":17,"value":21820}," prop renders a\nstatic image fallback when the live tenant isn't reachable\n(style-guide demos, air-gapped previews).",{"type":11,"tag":81,"props":21822,"children":21823},{},[21824,21833,21834,21839,21841,21847,21849,21855,21856,21862,21863,21869,21871,21877],{"type":11,"tag":85,"props":21825,"children":21826},{},[21827],{"type":11,"tag":68,"props":21828,"children":21830},{"className":21829},[],[21831],{"type":17,"value":21832},"TuxVizRPlot",{"type":17,"value":2078},{"type":11,"tag":25,"props":21835,"children":21837},{"href":21836},"app\u002Fcomponents\u002FTuxVizRPlot.vue",[21838],{"type":17,"value":21836},{"type":17,"value":21840},")\n— branded chrome around an R-language plot artifact. Three\nkinds (",{"type":11,"tag":68,"props":21842,"children":21844},{"className":21843},[],[21845],{"type":17,"value":21846},"image",{"type":17,"value":21848}," PNG\u002FJPG, ",{"type":11,"tag":68,"props":21850,"children":21852},{"className":21851},[],[21853],{"type":17,"value":21854},"svg",{"type":17,"value":14897},{"type":11,"tag":68,"props":21857,"children":21859},{"className":21858},[],[21860],{"type":17,"value":21861},"\u003Cobject>",{"type":17,"value":95},{"type":11,"tag":68,"props":21864,"children":21866},{"className":21865},[],[21867],{"type":17,"value":21868},"html",{"type":17,"value":21870}," for\nhtmlwidgets in a sandboxed iframe). Source-line caption for\n",{"type":11,"tag":68,"props":21872,"children":21874},{"className":21873},[],[21875],{"type":17,"value":21876},"sessionInfo()",{"type":17,"value":21878}," or script path.",{"type":11,"tag":81,"props":21880,"children":21881},{},[21882,21887,21888,21893],{"type":11,"tag":85,"props":21883,"children":21884},{},[21885],{"type":17,"value":21886},"Visualizations landing",{"type":17,"value":2078},{"type":11,"tag":25,"props":21889,"children":21891},{"href":21890},"app\u002Fpages\u002Fvisualizations\u002Findex.vue",[21892],{"type":17,"value":21890},{"type":17,"value":21894},")\n— overview tiles, reports-vs-viz explainer, link to roadmap\nfor native charts.",{"type":11,"tag":81,"props":21896,"children":21897},{},[21898,21903,21905,21911,21913,21919,21921,21927,21929,21935],{"type":11,"tag":85,"props":21899,"children":21900},{},[21901],{"type":17,"value":21902},"Demo poster artwork",{"type":17,"value":21904}," so visualization demos render even\nwithout a live tenant: ",{"type":11,"tag":68,"props":21906,"children":21908},{"className":21907},[],[21909],{"type":17,"value":21910},"public\u002Fviz-poster-tableau.svg",{"type":17,"value":21912},"\n(TTI-corridor crash-rate bars), ",{"type":11,"tag":68,"props":21914,"children":21916},{"className":21915},[],[21917],{"type":17,"value":21918},"public\u002Fviz-poster-powerbi.svg",{"type":17,"value":21920},"\n(sponsored-research executive overview), ",{"type":11,"tag":68,"props":21922,"children":21924},{"className":21923},[],[21925],{"type":17,"value":21926},"public\u002Fviz-poster-grafana.svg",{"type":17,"value":21928},"\n(PECAN ingestion time-series + heatmap),\n",{"type":11,"tag":68,"props":21930,"children":21932},{"className":21931},[],[21933],{"type":17,"value":21934},"public\u002Fviz-rplot-grants.svg",{"type":17,"value":21936}," (faceted ggplot2 by quarter).",{"type":11,"tag":81,"props":21938,"children":21939},{},[21940,21945,21946,21951,21953,21958,21960,21966],{"type":11,"tag":85,"props":21941,"children":21942},{},[21943],{"type":17,"value":21944},"TTI road-glyph SVG",{"type":17,"value":2078},{"type":11,"tag":25,"props":21947,"children":21949},{"href":21948},"public\u002FTTI-glyph.svg",[21950],{"type":17,"value":21948},{"type":17,"value":21952},")\n— institutional road mark isolated from the full TTI lockup.\nUsed as the ",{"type":11,"tag":68,"props":21954,"children":21956},{"className":21955},[],[21957],{"type":17,"value":13024},{"type":17,"value":21959}," assistant avatar (replaces the\nearlier ",{"type":11,"tag":68,"props":21961,"children":21963},{"className":21962},[],[21964],{"type":17,"value":21965},"tx",{"type":17,"value":21967}," italic placeholder).",{"type":11,"tag":81,"props":21969,"children":21970},{},[21971,21976],{"type":11,"tag":85,"props":21972,"children":21973},{},[21974],{"type":17,"value":21975},"Sidebar nav: new \"Reports\" + \"Visualizations\" groups",{"type":17,"value":21977}," between\n\"Composition\" and \"Tooling\". Reports group has Frame + PrintSheet;\nVisualizations group has Embed + RPlot.",{"type":11,"tag":81,"props":21979,"children":21980},{},[21981,21986,21988,21994,21996,22001,22002,22007,22008,22013,22015,22020],{"type":11,"tag":85,"props":21982,"children":21983},{},[21984],{"type":17,"value":21985},"Sidebar housekeeping",{"type":17,"value":21987},": added \"Roadmap\" link in the Design\ngroup (",{"type":11,"tag":68,"props":21989,"children":21991},{"className":21990},[],[21992],{"type":17,"value":21993},"\u002Fdesign\u002Froadmap",{"type":17,"value":21995}," was reachable but unlinked); collapsed\nthe redundant ",{"type":11,"tag":68,"props":21997,"children":21999},{"className":21998},[],[22000],{"type":17,"value":12625},{"type":17,"value":875},{"type":11,"tag":68,"props":22003,"children":22005},{"className":22004},[],[22006],{"type":17,"value":19879},{"type":17,"value":875},{"type":11,"tag":68,"props":22009,"children":22011},{"className":22010},[],[22012],{"type":17,"value":4824},{"type":17,"value":22014}," trio\n(all three pointed at the same demo page) into a single\n",{"type":11,"tag":68,"props":22016,"children":22018},{"className":22017},[],[22019],{"type":17,"value":12625},{"type":17,"value":22021}," entry.",{"type":11,"tag":56,"props":22023,"children":22025},{"id":22024},"added-reports-visualizations-build-out-2026-04-29",[22026],{"type":17,"value":22027},"Added — reports + visualizations build-out (2026-04-29)",{"type":11,"tag":19,"props":22029,"children":22030},{},[22031],{"type":17,"value":22032},"Rounds out both new sections so they read as more than the\ntwo-component minimum the design-kit port shipped with.",{"type":11,"tag":77,"props":22034,"children":22035},{},[22036,22124,22265,22323,22338,22353,22390],{"type":11,"tag":81,"props":22037,"children":22038},{},[22039,22048,22049,22054,22056,22061,22063,22069,22071,22076,22078,22084,22086],{"type":11,"tag":85,"props":22040,"children":22041},{},[22042],{"type":11,"tag":68,"props":22043,"children":22045},{"className":22044},[],[22046],{"type":17,"value":22047},"TuxReportWebFrame",{"type":17,"value":2078},{"type":11,"tag":25,"props":22050,"children":22052},{"href":22051},"app\u002Fcomponents\u002FTuxReportWebFrame.vue",[22053],{"type":17,"value":22051},{"type":17,"value":22055},")\n— long-form, web-hosted narrative canvas. Same Reports family as\n",{"type":11,"tag":68,"props":22057,"children":22059},{"className":22058},[],[22060],{"type":17,"value":21689},{"type":17,"value":22062}," (finished narrative, read top-to-bottom), but\nrendered as an HTML page rather than an 8.5×11 sheet. Cover\n(eyebrow \u002F title \u002F lede), byline + date + reading-time row,\noptional sticky right-rail TOC, body slot with editorial\ntypography rhythm, footer slot for source \u002F publication line.\nThree measure widths (",{"type":11,"tag":68,"props":22064,"children":22066},{"className":22065},[],[22067],{"type":17,"value":22068},"narrow",{"type":17,"value":22070}," ≈ 56ch, ",{"type":11,"tag":68,"props":22072,"children":22074},{"className":22073},[],[22075],{"type":17,"value":16191},{"type":17,"value":22077}," ≈ 70ch, ",{"type":11,"tag":68,"props":22079,"children":22081},{"className":22080},[],[22082],{"type":17,"value":22083},"wide",{"type":17,"value":22085},"\n≈ 82ch). Sibling sidebar entry under Reports.\n",{"type":11,"tag":77,"props":22087,"children":22088},{},[22089,22102,22112],{"type":11,"tag":81,"props":22090,"children":22091},{},[22092,22094],{"type":17,"value":22093},"**Why a new component instead of just composing TuxPageHeader\n",{"type":11,"tag":77,"props":22095,"children":22096},{},[22097],{"type":11,"tag":81,"props":22098,"children":22099},{},[22100],{"type":17,"value":22101},"free sections:** TTI's web-hosted reports (annual report,\nresearch findings, accreditation summaries) want a deliberately\nbounded reading frame with cover, byline, optional TOC, and\nclosing source line. Composing those primitives ad-hoc per page\ndrifted; the frame canonicalizes the rhythm.",{"type":11,"tag":81,"props":22103,"children":22104},{},[22105,22110],{"type":11,"tag":85,"props":22106,"children":22107},{},[22108],{"type":17,"value":22109},"Why it's a Report, not a Visualization:",{"type":17,"value":22111}," the reader still\nreads top-to-bottom. The web\u002Fpaper distinction is output medium,\nnot posture. A Visualization is something the reader pivots and\nfilters.",{"type":11,"tag":81,"props":22113,"children":22114},{},[22115,22117,22122],{"type":17,"value":22116},"Demo at ",{"type":11,"tag":25,"props":22118,"children":22120},{"href":22119},"app\u002Fpages\u002Freports\u002Fweb-frame.vue",[22121],{"type":17,"value":11986},{"type":17,"value":22123},"\nwith a full sponsored-research example (cover · TOC · summary ·\nfindings with a TuxFactoid · methods · data · what's next).",{"type":11,"tag":81,"props":22125,"children":22126},{},[22127,22136,22137,22142,22144,22150,22151,22156,22157,22162,22163,22168,22169,22175,22177,22183,22185,22191,22193,22198,22200,22205,22207,22213,22215],{"type":11,"tag":85,"props":22128,"children":22129},{},[22130],{"type":11,"tag":68,"props":22131,"children":22133},{"className":22132},[],[22134],{"type":17,"value":22135},"TuxSparkline",{"type":17,"value":2078},{"type":11,"tag":25,"props":22138,"children":22140},{"href":22139},"app\u002Fcomponents\u002FTuxSparkline.vue",[22141],{"type":17,"value":22139},{"type":17,"value":22143},")\n— inline mini trend line. No axes, no legend, no tooltip. Native\nSVG; no chart library. Five tones (",{"type":11,"tag":68,"props":22145,"children":22147},{"className":22146},[],[22148],{"type":17,"value":22149},"brand",{"type":17,"value":875},{"type":11,"tag":68,"props":22152,"children":22154},{"className":22153},[],[22155],{"type":17,"value":21027},{"type":17,"value":875},{"type":11,"tag":68,"props":22158,"children":22160},{"className":22159},[],[22161],{"type":17,"value":20905},{"type":17,"value":9618},{"type":11,"tag":68,"props":22164,"children":22166},{"className":22165},[],[22167],{"type":17,"value":5123},{"type":17,"value":875},{"type":11,"tag":68,"props":22170,"children":22172},{"className":22171},[],[22173],{"type":17,"value":22174},"neutral",{"type":17,"value":22176},"), all theme-aware across light \u002F dark \u002F\nHC. Optional area fill, last-point marker, and right-aligned\ndelta arrow (",{"type":11,"tag":68,"props":22178,"children":22180},{"className":22179},[],[22181],{"type":17,"value":22182},"+12%",{"type":17,"value":22184}," percent or ",{"type":11,"tag":68,"props":22186,"children":22188},{"className":22187},[],[22189],{"type":17,"value":22190},"+4.9",{"type":17,"value":22192}," absolute). The SVG carries\nan auto-derived ",{"type":11,"tag":68,"props":22194,"children":22196},{"className":22195},[],[22197],{"type":17,"value":6400},{"type":17,"value":22199}," and matching ",{"type":11,"tag":68,"props":22201,"children":22203},{"className":22202},[],[22204],{"type":17,"value":3554},{"type":17,"value":22206}," summarizing\nthe trend (\"Trend: 10 points, low 61, high 84, last 84 (+35.5%\nfrom first)\"); pass ",{"type":11,"tag":68,"props":22208,"children":22210},{"className":22209},[],[22211],{"type":17,"value":22212},"units=\"$M awarded\"",{"type":17,"value":22214}," to suffix the summary.\n",{"type":11,"tag":77,"props":22216,"children":22217},{},[22218,22254],{"type":11,"tag":81,"props":22219,"children":22220},{},[22221,22226,22228,22233,22234,22239,22241,22246,22247,22252],{"type":11,"tag":85,"props":22222,"children":22223},{},[22224],{"type":17,"value":22225},"First native chart in the catalog.",{"type":17,"value":22227}," Shipped ahead of the\nfull ",{"type":11,"tag":68,"props":22229,"children":22231},{"className":22230},[],[22232],{"type":17,"value":643},{"type":17,"value":875},{"type":11,"tag":68,"props":22235,"children":22237},{"className":22236},[],[22238],{"type":17,"value":627},{"type":17,"value":22240}," family because it's small\n(no axes, no legend, no library) and the demand was already\nclear: pair with ",{"type":11,"tag":68,"props":22242,"children":22244},{"className":22243},[],[22245],{"type":17,"value":1874},{"type":17,"value":875},{"type":11,"tag":68,"props":22248,"children":22250},{"className":22249},[],[22251],{"type":17,"value":2187},{"type":17,"value":22253}," for KPI rows.",{"type":11,"tag":81,"props":22255,"children":22256},{},[22257,22258,22264],{"type":17,"value":22116},{"type":11,"tag":25,"props":22259,"children":22261},{"href":22260},"app\u002Fpages\u002Fvisualizations\u002Fsparkline.vue",[22262],{"type":17,"value":22263},"\u002Fvisualizations\u002Fsparkline",{"type":17,"value":43},{"type":11,"tag":81,"props":22266,"children":22267},{},[22268,22277,22278,22283,22285,22290,22291,22296,22298],{"type":11,"tag":85,"props":22269,"children":22270},{},[22271],{"type":11,"tag":68,"props":22272,"children":22274},{"className":22273},[],[22275],{"type":17,"value":22276},"TuxVizGrid",{"type":17,"value":2078},{"type":11,"tag":25,"props":22279,"children":22281},{"href":22280},"app\u002Fcomponents\u002FTuxVizGrid.vue",[22282],{"type":17,"value":22280},{"type":17,"value":22284},")\n— small-multiples layout primitive for the Visualizations\nsection. 2-, 3-, or 4-up panes of ",{"type":11,"tag":68,"props":22286,"children":22288},{"className":22287},[],[22289],{"type":17,"value":21804},{"type":17,"value":875},{"type":11,"tag":68,"props":22292,"children":22294},{"className":22293},[],[22295],{"type":17,"value":21832},{"type":17,"value":22297},"\n(or any visualization-shaped child) with shared editorial header\n(eyebrow \u002F title \u002F dek), consistent gap, and optional footer\nslot for source \u002F data-cutoff \u002F caveat copy. Container-queried —\ncollapses to single-column under ~32rem and to 2-up between\n~32rem and ~56rem. Doesn't repaint pane chrome; layout only.\n",{"type":11,"tag":77,"props":22299,"children":22300},{},[22301,22311],{"type":11,"tag":81,"props":22302,"children":22303},{},[22304,22309],{"type":11,"tag":85,"props":22305,"children":22306},{},[22307],{"type":17,"value":22308},"Why a layout primitive instead of just CSS Grid in the host:",{"type":17,"value":22310},"\na shared editorial header above N panes is a recurring pattern\n(an exec dashboard with three Power BI tiles; a regional\nsmall-multiples set of one Tableau viz). The grid implies \"these\nbelong together\" — meaningful editorial signal, worth a\ncomponent.",{"type":11,"tag":81,"props":22312,"children":22313},{},[22314,22315,22321],{"type":17,"value":22116},{"type":11,"tag":25,"props":22316,"children":22318},{"href":22317},"app\u002Fpages\u002Fvisualizations\u002Fgrid.vue",[22319],{"type":17,"value":22320},"\u002Fvisualizations\u002Fgrid",{"type":17,"value":22322},"\nwith two-up Tableau + Power BI and three-up Grafana stages.",{"type":11,"tag":81,"props":22324,"children":22325},{},[22326,22331,22332,22336],{"type":11,"tag":85,"props":22327,"children":22328},{},[22329],{"type":17,"value":22330},"Reports landing rewritten",{"type":17,"value":2078},{"type":11,"tag":25,"props":22333,"children":22334},{"href":21768},[22335],{"type":17,"value":21768},{"type":17,"value":22337},")\n— three tiles instead of two, each tagged with the output medium\n(paper · PDF \u002F print stylesheet \u002F web-hosted). New \"Pick by\noutput medium\" decision section.",{"type":11,"tag":81,"props":22339,"children":22340},{},[22341,22346,22347,22351],{"type":11,"tag":85,"props":22342,"children":22343},{},[22344],{"type":17,"value":22345},"Visualizations landing rewritten",{"type":17,"value":2078},{"type":11,"tag":25,"props":22348,"children":22349},{"href":21890},[22350],{"type":17,"value":21890},{"type":17,"value":22352},")\n— four tiles, each tagged with kind (BI iframe wrapper \u002F R\nartifact wrapper \u002F layout primitive \u002F native mini chart). Scope\nnote now reads \"TuxSparkline ships as the first native chart;\nthe broader family is still on the roadmap\" instead of \"all\nnative charts are pending\".",{"type":11,"tag":81,"props":22354,"children":22355},{},[22356,22361,22362,22366,22368,22374,22375,22381,22382,22388],{"type":11,"tag":85,"props":22357,"children":22358},{},[22359],{"type":17,"value":22360},"Doctrine table updates",{"type":17,"value":2078},{"type":11,"tag":25,"props":22363,"children":22364},{"href":8060},[22365],{"type":17,"value":8060},{"type":17,"value":22367},")\n— Reports table grows an \"Output medium\" column (",{"type":11,"tag":68,"props":22369,"children":22371},{"className":22370},[],[22372],{"type":17,"value":22373},"paper · PDF",{"type":17,"value":883},{"type":11,"tag":68,"props":22376,"children":22378},{"className":22377},[],[22379],{"type":17,"value":22380},"print stylesheet",{"type":17,"value":875},{"type":11,"tag":68,"props":22383,"children":22385},{"className":22384},[],[22386],{"type":17,"value":22387},"web (HTML page)",{"type":17,"value":22389},"). Visualizations table\npicks up TuxVizGrid + TuxSparkline rows. Pattern coverage map\npicks up six new \"want X? use Y\" entries (sparkline, the three\nreport flavors, BI dashboard, R artifact, small-multiples).",{"type":11,"tag":81,"props":22391,"children":22392},{},[22393,22398,22399,22403,22405,22411,22412,22418,22420,22425,22426,22431],{"type":11,"tag":85,"props":22394,"children":22395},{},[22396],{"type":17,"value":22397},"Roadmap reconciled",{"type":17,"value":2078},{"type":11,"tag":25,"props":22400,"children":22401},{"href":8483},[22402],{"type":17,"value":8483},{"type":17,"value":22404},")\n— \"Recently shipped\" block updated to current names\n(",{"type":11,"tag":68,"props":22406,"children":22408},{"className":22407},[],[22409],{"type":17,"value":22410},"TuxReportEmbed",{"type":17,"value":875},{"type":11,"tag":68,"props":22413,"children":22415},{"className":22414},[],[22416],{"type":17,"value":22417},"TuxReportRPlot",{"type":17,"value":22419}," were renamed to\n",{"type":11,"tag":68,"props":22421,"children":22423},{"className":22422},[],[22424],{"type":17,"value":21804},{"type":17,"value":875},{"type":11,"tag":68,"props":22427,"children":22429},{"className":22428},[],[22430],{"type":17,"value":21832},{"type":17,"value":22432}," mid-batch and the roadmap still\ncarried the old names). TuxSparkline crossed off Priority B.",{"type":11,"tag":56,"props":22434,"children":22436},{"id":22435},"renamed-since-100-not-yet-released",[22437],{"type":17,"value":22438},"Renamed (since 1.0.0; not yet released)",{"type":11,"tag":77,"props":22440,"children":22441},{},[22442,22477,22511,22529,22542,22558],{"type":11,"tag":81,"props":22443,"children":22444},{},[22445,22450,22451,22459,22461,22467,22468],{"type":11,"tag":68,"props":22446,"children":22448},{"className":22447},[],[22449],{"type":17,"value":22410},{"type":17,"value":1144},{"type":11,"tag":85,"props":22452,"children":22453},{},[22454],{"type":11,"tag":68,"props":22455,"children":22457},{"className":22456},[],[22458],{"type":17,"value":21804},{"type":17,"value":22460},", demo route\n",{"type":11,"tag":68,"props":22462,"children":22464},{"className":22463},[],[22465],{"type":17,"value":22466},"\u002Freports\u002Fembed",{"type":17,"value":1144},{"type":11,"tag":85,"props":22469,"children":22470},{},[22471],{"type":11,"tag":68,"props":22472,"children":22474},{"className":22473},[],[22475],{"type":17,"value":22476},"\u002Fvisualizations\u002Fembed",{"type":11,"tag":81,"props":22478,"children":22479},{},[22480,22485,22486,22494,22495,22501,22502],{"type":11,"tag":68,"props":22481,"children":22483},{"className":22482},[],[22484],{"type":17,"value":22417},{"type":17,"value":1144},{"type":11,"tag":85,"props":22487,"children":22488},{},[22489],{"type":11,"tag":68,"props":22490,"children":22492},{"className":22491},[],[22493],{"type":17,"value":21832},{"type":17,"value":22460},{"type":11,"tag":68,"props":22496,"children":22498},{"className":22497},[],[22499],{"type":17,"value":22500},"\u002Freports\u002Frplot",{"type":17,"value":1144},{"type":11,"tag":85,"props":22503,"children":22504},{},[22505],{"type":11,"tag":68,"props":22506,"children":22508},{"className":22507},[],[22509],{"type":17,"value":22510},"\u002Fvisualizations\u002Frplot",{"type":11,"tag":81,"props":22512,"children":22513},{},[22514,22516,22521,22522,22527],{"type":17,"value":22515},"Rationale: Tableau \u002F Power BI \u002F Grafana \u002F R artifacts are\n",{"type":11,"tag":155,"props":22517,"children":22518},{},[22519],{"type":17,"value":22520},"visualizations",{"type":17,"value":14590},{"type":11,"tag":155,"props":22523,"children":22524},{},[22525],{"type":17,"value":22526},"reports",{"type":17,"value":22528},". TTI uses both words and they\nmean different things (reports = finished narrative on paper;\nvisualizations = interactive surface in the app). The split\nmakes the IA match the institutional vocabulary.",{"type":11,"tag":81,"props":22530,"children":22531},{},[22532,22540],{"type":11,"tag":85,"props":22533,"children":22534},{},[22535],{"type":11,"tag":68,"props":22536,"children":22538},{"className":22537},[],[22539],{"type":17,"value":8483},{"type":17,"value":22541}," — Vue-shaped backlog adapted from the\naggieux JSX-kit roadmap. Charts, maps, tabs, side-sheet, comments,\ntooltips, and a11y-doc pages organized by priority tier. Replaces\nthe previous \"we know what's missing but it's not written down\" gap.",{"type":11,"tag":81,"props":22543,"children":22544},{},[22545,22550,22551,22556],{"type":11,"tag":85,"props":22546,"children":22547},{},[22548],{"type":17,"value":22549},"ADR-0008 — Data-display components stay flat; reports get their\nown section.",{"type":17,"value":2078},{"type":11,"tag":25,"props":22552,"children":22554},{"href":22553},"docs\u002Fadr\u002F0008-data-display-and-reports-section.md",[22555],{"type":17,"value":22553},{"type":17,"value":22557},")\nDocuments the decision and the criteria for adding a future route\ngroup (chrome, discoverability, mass).",{"type":11,"tag":81,"props":22559,"children":22560},{},[22561,22566,22567,22572,22573],{"type":11,"tag":85,"props":22562,"children":22563},{},[22564],{"type":17,"value":22565},"Motion + spacing tokens",{"type":17,"value":2115},{"type":11,"tag":68,"props":22568,"children":22570},{"className":22569},[],[22571],{"type":17,"value":2026},{"type":17,"value":18219},{"type":11,"tag":77,"props":22574,"children":22575},{},[22576,22599,22625],{"type":11,"tag":81,"props":22577,"children":22578},{},[22579,22585,22586,22592,22593],{"type":11,"tag":68,"props":22580,"children":22582},{"className":22581},[],[22583],{"type":17,"value":22584},"--motion-fast: 0.15s",{"type":17,"value":7572},{"type":11,"tag":68,"props":22587,"children":22589},{"className":22588},[],[22590],{"type":17,"value":22591},"--motion-base: 0.25s",{"type":17,"value":7572},{"type":11,"tag":68,"props":22594,"children":22596},{"className":22595},[],[22597],{"type":17,"value":22598},"--motion-slow: 0.35s",{"type":11,"tag":81,"props":22600,"children":22601},{},[22602,22607,22609,22615,22617,22623],{"type":11,"tag":68,"props":22603,"children":22605},{"className":22604},[],[22606],{"type":17,"value":4542},{"type":17,"value":22608}," (default), ",{"type":11,"tag":68,"props":22610,"children":22612},{"className":22611},[],[22613],{"type":17,"value":22614},"--ease-emphasis",{"type":17,"value":22616}," (overshoot for the\ncorner-drop signature), ",{"type":11,"tag":68,"props":22618,"children":22620},{"className":22619},[],[22621],{"type":17,"value":22622},"--ease-exit",{"type":17,"value":22624}," (symmetric ease-in-out).",{"type":11,"tag":81,"props":22626,"children":22627},{},[22628,22634,22635,22641,22642,22648,22649,22655,22657,22663],{"type":11,"tag":68,"props":22629,"children":22631},{"className":22630},[],[22632],{"type":17,"value":22633},"--space-0",{"type":17,"value":95},{"type":11,"tag":68,"props":22636,"children":22638},{"className":22637},[],[22639],{"type":17,"value":22640},"--space-4",{"type":17,"value":95},{"type":11,"tag":68,"props":22643,"children":22645},{"className":22644},[],[22646],{"type":17,"value":22647},"--space-10",{"type":17,"value":95},{"type":11,"tag":68,"props":22650,"children":22652},{"className":22651},[],[22653],{"type":17,"value":22654},"--radius-none",{"type":17,"value":22656}," —\nsupplements for places Tux components reach into a CSS var\ndirectly (inline styles, ",{"type":11,"tag":68,"props":22658,"children":22660},{"className":22659},[],[22661],{"type":17,"value":22662},"calc()",{"type":17,"value":2630},{"type":11,"tag":56,"props":22665,"children":22667},{"id":22666},"added-4",[22668],{"type":17,"value":1220},{"type":11,"tag":77,"props":22670,"children":22671},{},[22672,22737],{"type":11,"tag":81,"props":22673,"children":22674},{},[22675,22688,22690,22696,22698,22703,22705],{"type":11,"tag":85,"props":22676,"children":22677},{},[22678,22680,22686],{"type":17,"value":22679},"TuxFooter ",{"type":11,"tag":68,"props":22681,"children":22683},{"className":22682},[],[22684],{"type":17,"value":22685},"brandLockup",{"type":17,"value":22687}," prop — official institutional artwork\nbeneath the social row.",{"type":17,"value":22689}," The footer's identity column has the\nsquare glyph + HTML wordmark for chrome-density purposes; the new\nprop layers in the official horizontal lockup PNG (logo + wordmark\nin one piece) so consumers see the canonical institutional artwork\non the maroon marketing ground. Defaults to ",{"type":11,"tag":68,"props":22691,"children":22693},{"className":22692},[],[22694],{"type":17,"value":22695},"\u002FTTI_white.png",{"type":17,"value":22697}," for\nTTI; sibling institutions override with their own white-on-\ntransparent variant; pass ",{"type":11,"tag":68,"props":22699,"children":22701},{"className":22700},[],[22702],{"type":17,"value":3117},{"type":17,"value":22704}," to hide. Capped at 16rem × 2.75rem\nso it doesn't compete with the institution name above it.\n",{"type":11,"tag":77,"props":22706,"children":22707},{},[22708],{"type":11,"tag":81,"props":22709,"children":22710},{},[22711,22713,22719,22721,22727,22729,22735],{"type":17,"value":22712},"Three new public assets: ",{"type":11,"tag":68,"props":22714,"children":22716},{"className":22715},[],[22717],{"type":17,"value":22718},"TTI-Color.png",{"type":17,"value":22720}," (maroon road glyph,\nlight backgrounds), ",{"type":11,"tag":68,"props":22722,"children":22724},{"className":22723},[],[22725],{"type":17,"value":22726},"TTI-black.png",{"type":17,"value":22728}," (mono black, print\u002Flegal),\n",{"type":11,"tag":68,"props":22730,"children":22732},{"className":22731},[],[22733],{"type":17,"value":22734},"TTI_white.png",{"type":17,"value":22736}," (light variant, dark\u002Fmaroon backgrounds).",{"type":11,"tag":81,"props":22738,"children":22739},{},[22740,22745,22747,22753,22755],{"type":11,"tag":85,"props":22741,"children":22742},{},[22743],{"type":17,"value":22744},"Doc-site chrome batch — TuxDocsSidebar, TuxTOC, TuxSiteNav,\nTuxDropdown, TuxMegaMenu.",{"type":17,"value":22746}," Fills the navigation-and-doc-shape gap\nidentified after the previous batch. The catalog had ",{"type":11,"tag":68,"props":22748,"children":22750},{"className":22749},[],[22751],{"type":17,"value":22752},"TuxIdentity",{"type":17,"value":22754},"\n(the lockup) but no actual menu components, and no doc-site\nsidebar \u002F TOC for technical documentation.\n",{"type":11,"tag":77,"props":22756,"children":22757},{},[22758,22791,22825,22844,22863],{"type":11,"tag":81,"props":22759,"children":22760},{},[22761,22769,22770,22775,22777,22782,22784,22789],{"type":11,"tag":85,"props":22762,"children":22763},{},[22764],{"type":11,"tag":68,"props":22765,"children":22767},{"className":22766},[],[22768],{"type":17,"value":7236},{"type":17,"value":2078},{"type":11,"tag":25,"props":22771,"children":22773},{"href":22772},"app\u002Fcomponents\u002FTuxDocsSidebar.vue",[22774],{"type":17,"value":22772},{"type":17,"value":22776},") — hierarchical\nsidebar built on native ",{"type":11,"tag":68,"props":22778,"children":22780},{"className":22779},[],[22781],{"type":17,"value":6845},{"type":17,"value":22783}," + recursive\n",{"type":11,"tag":68,"props":22785,"children":22787},{"className":22786},[],[22788],{"type":17,"value":8802},{"type":17,"value":22790},". Active-route highlighting (including\nancestors), inline search filter with match highlighting,\nsessionStorage-persisted collapse state per consumer.",{"type":11,"tag":81,"props":22792,"children":22793},{},[22794,22802,22803,22808,22810,22816,22818,22823],{"type":11,"tag":85,"props":22795,"children":22796},{},[22797],{"type":11,"tag":68,"props":22798,"children":22800},{"className":22799},[],[22801],{"type":17,"value":17930},{"type":17,"value":2078},{"type":11,"tag":25,"props":22804,"children":22806},{"href":22805},"app\u002Fcomponents\u002FTuxTOC.vue",[22807],{"type":17,"value":22805},{"type":17,"value":22809},") — article table-of-contents.\nAuto-detects H2\u002FH3 from a target element on mount, tracks active\nheading via ",{"type":11,"tag":68,"props":22811,"children":22813},{"className":22812},[],[22814],{"type":17,"value":22815},"IntersectionObserver",{"type":17,"value":22817},", smooth-scrolls on click,\nupdates URL hash without triggering a full navigation. Pairs\nwith ",{"type":11,"tag":68,"props":22819,"children":22821},{"className":22820},[],[22822],{"type":17,"value":7236},{"type":17,"value":22824}," for the canonical three-column doc layout.",{"type":11,"tag":81,"props":22826,"children":22827},{},[22828,22836,22837,22842],{"type":11,"tag":85,"props":22829,"children":22830},{},[22831],{"type":11,"tag":68,"props":22832,"children":22834},{"className":22833},[],[22835],{"type":17,"value":12625},{"type":17,"value":2078},{"type":11,"tag":25,"props":22838,"children":22840},{"href":22839},"app\u002Fcomponents\u002FTuxSiteNav.vue",[22841],{"type":17,"value":22839},{"type":17,"value":22843},") — institutional top-bar\nwith TuxIdentity lockup + optional utility strip + primary nav.\nMobile hamburger drawer included. Five AggieUX site types\n(University \u002F Center \u002F Department \u002F Application+nav \u002F Application-only)\nall expressible via composition.",{"type":11,"tag":81,"props":22845,"children":22846},{},[22847,22855,22856,22861],{"type":11,"tag":85,"props":22848,"children":22849},{},[22850],{"type":11,"tag":68,"props":22851,"children":22853},{"className":22852},[],[22854],{"type":17,"value":19879},{"type":17,"value":2078},{"type":11,"tag":25,"props":22857,"children":22859},{"href":22858},"app\u002Fcomponents\u002FTuxDropdown.vue",[22860],{"type":17,"value":22858},{"type":17,"value":22862},") — single-column\ndropdown panel. Used as a primary-nav item in TuxSiteNav, also\nworks standalone for inline \"more actions\" patterns.\nHover\u002Ffocus open with diagonal-path delay; Escape closes.",{"type":11,"tag":81,"props":22864,"children":22865},{},[22866,22874,22875,22880],{"type":11,"tag":85,"props":22867,"children":22868},{},[22869],{"type":11,"tag":68,"props":22870,"children":22872},{"className":22871},[],[22873],{"type":17,"value":4824},{"type":17,"value":2078},{"type":11,"tag":25,"props":22876,"children":22878},{"href":22877},"app\u002Fcomponents\u002FTuxMegaMenu.vue",[22879],{"type":17,"value":22877},{"type":17,"value":22881},") — full-width\nmulti-column panel from a top-bar item, with optional featured\ntile (eyebrow + title + description + image) on the right.",{"type":11,"tag":56,"props":22883,"children":22885},{"id":22884},"changed-3",[22886],{"type":17,"value":3591},{"type":11,"tag":77,"props":22888,"children":22889},{},[22890,22900],{"type":11,"tag":81,"props":22891,"children":22892},{},[22893,22898],{"type":11,"tag":85,"props":22894,"children":22895},{},[22896],{"type":17,"value":22897},"TuxFooter legal strip drops the gold \"A\" medallion",{"type":17,"value":22899}," next to the\nTAMUS lockup. The medallion was a placeholder glyph standing in\nfor an actual TAMUS-system mark and read as ornament rather than\nsignal; the eyebrow + name lockup carries the affordance on its\nown.",{"type":11,"tag":81,"props":22901,"children":22902},{},[22903,22908,22910,22915,22917,22923,22925,22931,22933,22939],{"type":11,"tag":85,"props":22904,"children":22905},{},[22906],{"type":17,"value":22907},"TuxDiagram styling pass.",{"type":17,"value":22909}," Swapped from Mermaid's ",{"type":11,"tag":68,"props":22911,"children":22913},{"className":22912},[],[22914],{"type":17,"value":16191},{"type":17,"value":22916}," theme\nto ",{"type":11,"tag":68,"props":22918,"children":22920},{"className":22919},[],[22921],{"type":17,"value":22922},"base",{"type":17,"value":22924}," so all themeVariables actually apply; expanded the\nbrand-mapping (primary\u002Fsecondary\u002Ftertiary fills, sequence-actor\nstyling, note styling for both light + dark modes); type sized\ndown from 16px to 13px Open Sans so diagrams don't dominate\neditorial body context. Error surface replaced the raw parser\ndump with a hint about quoting unquoted special characters + a\ncollapsible details for the parser output. Demo source for the\nflowchart fixed (the ",{"type":11,"tag":68,"props":22926,"children":22928},{"className":22927},[],[22929],{"type":17,"value":22930},"\u003Cbr\u002F>",{"type":17,"value":22932}," inside an unquoted node label was\nfailing to parse — wrapped in ",{"type":11,"tag":68,"props":22934,"children":22936},{"className":22935},[],[22937],{"type":17,"value":22938},"\"…\"",{"type":17,"value":22940}," per Mermaid's syntax).",{"type":11,"tag":56,"props":22942,"children":22944},{"id":22943},"added-5",[22945],{"type":17,"value":1220},{"type":11,"tag":77,"props":22947,"children":22948},{},[22949,23058,23088,23171,23319,23408,23431],{"type":11,"tag":81,"props":22950,"children":22951},{},[22952,22957,22959],{"type":11,"tag":85,"props":22953,"children":22954},{},[22955],{"type":17,"value":22956},"Authoring + content batch — TuxCodeBlock, TuxDiagram, MDC integration.",{"type":17,"value":22958},"\nCloses the gap between \"components for app surfaces\" and \"components\nfor prose surfaces\" (docs, blog, ADRs, marcom WordPress migration).",{"type":11,"tag":77,"props":22960,"children":22961},{},[22962,22995,23020],{"type":11,"tag":81,"props":22963,"children":22964},{},[22965,22973,22974,22978,22980,22985,22987],{"type":11,"tag":85,"props":22966,"children":22967},{},[22968],{"type":11,"tag":68,"props":22969,"children":22971},{"className":22970},[],[22972],{"type":17,"value":10876},{"type":17,"value":2078},{"type":11,"tag":25,"props":22975,"children":22976},{"href":12961},[22977],{"type":17,"value":12961},{"type":17,"value":22979},") — standalone\nShiki-backed code block. Distinct from ",{"type":11,"tag":68,"props":22981,"children":22983},{"className":22982},[],[22984],{"type":17,"value":364},{"type":17,"value":22986}," (which is for\ncomponent demos with Vue\u002FHTML reveal tabs) — this one is for\nembedded code samples in docs\u002Fblog\u002FADRs. Lazy-loads the requested\ngrammar on mount so the SSR bundle stays clean. Theme tracks\npage color-mode (light \u002F dark \u002F high-contrast). Filename caption\n",{"type":11,"tag":77,"props":22988,"children":22989},{},[22990],{"type":11,"tag":81,"props":22991,"children":22992},{},[22993],{"type":17,"value":22994},"line numbers + copy button optional.",{"type":11,"tag":81,"props":22996,"children":22997},{},[22998,23006,23007,23012,23014,23019],{"type":11,"tag":85,"props":22999,"children":23000},{},[23001],{"type":11,"tag":68,"props":23002,"children":23004},{"className":23003},[],[23005],{"type":17,"value":6392},{"type":17,"value":2078},{"type":11,"tag":25,"props":23008,"children":23010},{"href":23009},"app\u002Fcomponents\u002FTuxDiagram.vue",[23011],{"type":17,"value":23009},{"type":17,"value":23013},") — Mermaid wrapper for\ndiagrams-as-code (flowcharts, sequence diagrams, ERDs, gantt).\nMermaid is a real ~3MB dep, so the component lazy-imports it on\nmount — pages that don't render a diagram pay nothing. Brand\npalette mapped into Mermaid's themeVariables. Render errors\nsurface inline with the parser message. Pulse + spin animations\nrespect ",{"type":11,"tag":68,"props":23015,"children":23017},{"className":23016},[],[23018],{"type":17,"value":8199},{"type":17,"value":43},{"type":11,"tag":81,"props":23021,"children":23022},{},[23023,23034,23036,23041,23043,23049,23051,23056],{"type":11,"tag":85,"props":23024,"children":23025},{},[23026,23032],{"type":11,"tag":68,"props":23027,"children":23029},{"className":23028},[],[23030],{"type":17,"value":23031},"@nuxtjs\u002Fmdc",{"type":17,"value":23033}," integration",{"type":17,"value":23035}," — markdown rendering with Vue\ncomponents inline. Configured in ",{"type":11,"tag":68,"props":23037,"children":23039},{"className":23038},[],[23040],{"type":17,"value":2121},{"type":17,"value":23042}," with the same\nShiki theme set the rest of the system uses. Tux components are\nauto-imported via Nuxt's existing resolver, so authors can\ninvoke them with the ",{"type":11,"tag":68,"props":23044,"children":23046},{"className":23045},[],[23047],{"type":17,"value":23048},"::tux-alert{variant=\"warning\"}",{"type":17,"value":23050}," block\nsyntax without per-component setup. Live demo + syntax crib\nsheet at ",{"type":11,"tag":68,"props":23052,"children":23054},{"className":23053},[],[23055],{"type":17,"value":13467},{"type":17,"value":23057}," shows source + rendered side-by-side.",{"type":11,"tag":81,"props":23059,"children":23060},{},[23061,23066,23067,23071,23073,23079,23081,23086],{"type":11,"tag":85,"props":23062,"children":23063},{},[23064],{"type":17,"value":23065},"Pattern coverage map",{"type":17,"value":2115},{"type":11,"tag":25,"props":23068,"children":23069},{"href":8060},[23070],{"type":17,"value":8060},{"type":17,"value":23072}," — explicit\n\"want X? use Y\" table covering tags (",{"type":11,"tag":68,"props":23074,"children":23076},{"className":23075},[],[23077],{"type":17,"value":23078},"TuxBadge kind=\"tag\"",{"type":17,"value":23080},"),\nadmonitions (",{"type":11,"tag":68,"props":23082,"children":23084},{"className":23083},[],[23085],{"type":17,"value":13895},{"type":17,"value":23087},"), inline callouts, blockquotes, Q&A, code,\ndiagrams, MDC, forms, tables, search, A–Z nav, sidebar widgets,\nsignups, big stats, factoid rows. Surfaces the catalog's\neasiest-to-miss component names so newcomers don't ship duplicates.",{"type":11,"tag":81,"props":23089,"children":23090},{},[23091,23099,23100,23105,23107,23113,23114,23120,23122,23127,23128,23133,23134,23139,23141,23147,23149,23155,23157,23162,23164,23170],{"type":11,"tag":85,"props":23092,"children":23093},{},[23094],{"type":11,"tag":68,"props":23095,"children":23097},{"className":23096},[],[23098],{"type":17,"value":2315},{"type":17,"value":2078},{"type":11,"tag":25,"props":23101,"children":23103},{"href":23102},"app\u002Fcomponents\u002FTuxCodeMaroon.vue",[23104],{"type":17,"value":23102},{"type":17,"value":23106},") — institutional\nemergency alert banner. TAMUS's Code Maroon is the mandatory\nemergency-notification system; Rellis Campus (where TTI lives)\nroutes through ",{"type":11,"tag":68,"props":23108,"children":23110},{"className":23109},[],[23111],{"type":17,"value":23112},"https:\u002F\u002Frellis.tamus.edu\u002Femergency\u002F",{"type":17,"value":4211},{"type":11,"tag":68,"props":23115,"children":23117},{"className":23116},[],[23118],{"type":17,"value":23119},"detailsUrl",{"type":17,"value":23121}," defaults to that for TTI consumers, override for\nnon-Rellis sites. Three severities (alert\u002Fwarning\u002Finfo) with\nhard-coded colors that ",{"type":11,"tag":85,"props":23123,"children":23124},{},[23125],{"type":17,"value":23126},"don't theme",{"type":17,"value":19121},{"type":11,"tag":68,"props":23129,"children":23131},{"className":23130},[],[23132],{"type":17,"value":881},{"type":17,"value":875},{"type":11,"tag":68,"props":23135,"children":23137},{"className":23136},[],[23138],{"type":17,"value":829},{"type":17,"value":23140},"\noverride — visual recognition matters more than palette\nconsistency during emergencies). Defaults to non-dismissible per\ninstitutional convention; pass ",{"type":11,"tag":68,"props":23142,"children":23144},{"className":23143},[],[23145],{"type":17,"value":23146},"dismissible",{"type":17,"value":23148}," + v-model to allow\ndismissal. Sticky-position support via ",{"type":11,"tag":68,"props":23150,"children":23152},{"className":23151},[],[23153],{"type":17,"value":23154},"sticky",{"type":17,"value":23156}," prop. Pulsing\nsiren icon respects ",{"type":11,"tag":68,"props":23158,"children":23160},{"className":23159},[],[23161],{"type":17,"value":8199},{"type":17,"value":23163},". Demo at\n",{"type":11,"tag":68,"props":23165,"children":23167},{"className":23166},[],[23168],{"type":17,"value":23169},"\u002Fcomponents\u002Fcode-maroon",{"type":17,"value":43},{"type":11,"tag":81,"props":23172,"children":23173},{},[23174,23179,23181,23314,23317],{"type":11,"tag":85,"props":23175,"children":23176},{},[23177],{"type":17,"value":23178},"Catalog mop-up — five last components",{"type":17,"value":23180}," closing out every\nAggieUX catalog entry relevant for the three target consumers.\nShipping these makes the system feature-complete for the marcom\nreveal:",{"type":11,"tag":77,"props":23182,"children":23183},{},[23184,23212,23239,23267,23286],{"type":11,"tag":81,"props":23185,"children":23186},{},[23187,23196,23197,23202,23204,23210],{"type":11,"tag":85,"props":23188,"children":23189},{},[23190],{"type":11,"tag":68,"props":23191,"children":23193},{"className":23192},[],[23194],{"type":17,"value":23195},"TuxLinkSlab",{"type":17,"value":2078},{"type":11,"tag":25,"props":23198,"children":23200},{"href":23199},"app\u002Fcomponents\u002FTuxLinkSlab.vue",[23201],{"type":17,"value":23199},{"type":17,"value":23203},") — full-width\nhorizontal band of prominent links. The \"footer-of-section\nnavigation\" pattern; distinct from ",{"type":11,"tag":68,"props":23205,"children":23207},{"className":23206},[],[23208],{"type":17,"value":23209},"TuxLinkList",{"type":17,"value":23211},"'s multi-column\ngrouped list. Three tones (plain \u002F neutral \u002F maroon).",{"type":11,"tag":81,"props":23213,"children":23214},{},[23215,23224,23225,23230,23232,23237],{"type":11,"tag":85,"props":23216,"children":23217},{},[23218],{"type":11,"tag":68,"props":23219,"children":23221},{"className":23220},[],[23222],{"type":17,"value":23223},"TuxSidebarBlock",{"type":17,"value":2078},{"type":11,"tag":25,"props":23226,"children":23228},{"href":23227},"app\u002Fcomponents\u002FTuxSidebarBlock.vue",[23229],{"type":17,"value":23227},{"type":17,"value":23231},") — generic\nsidebar widget wrapper. Eyebrow + maroon-underline title +\ncontent slot. Three variants (default \u002F bordered \u002F filled).\nCompose any content inside — lists of NuxtLinks (auto-styled),\n",{"type":11,"tag":68,"props":23233,"children":23235},{"className":23234},[],[23236],{"type":17,"value":12580},{"type":17,"value":23238},", prose, etc.",{"type":11,"tag":81,"props":23240,"children":23241},{},[23242,23251,23252,23257,23259,23265],{"type":11,"tag":85,"props":23243,"children":23244},{},[23245],{"type":11,"tag":68,"props":23246,"children":23248},{"className":23247},[],[23249],{"type":17,"value":23250},"TuxQACollection",{"type":17,"value":2078},{"type":11,"tag":25,"props":23253,"children":23255},{"href":23254},"app\u002Fcomponents\u002FTuxQACollection.vue",[23256],{"type":17,"value":23254},{"type":17,"value":23258},") — long-form\nQ&A editorial pattern. Always expanded — designed to be read\ntop-to-bottom. Companion to ",{"type":11,"tag":68,"props":23260,"children":23262},{"className":23261},[],[23263],{"type":17,"value":23264},"TuxAccordion kind=\"faq\"",{"type":17,"value":23266}," (which is\ncollapsible for scanning). Maroon \"Q.\" marker + bold question +\nflowing answer prose, with optional \"see also\" link list per item.",{"type":11,"tag":81,"props":23268,"children":23269},{},[23270,23278,23279,23284],{"type":11,"tag":85,"props":23271,"children":23272},{},[23273],{"type":11,"tag":68,"props":23274,"children":23276},{"className":23275},[],[23277],{"type":17,"value":2728},{"type":17,"value":2078},{"type":11,"tag":25,"props":23280,"children":23282},{"href":23281},"app\u002Fcomponents\u002FTuxSignupFeature.vue",[23283],{"type":17,"value":23281},{"type":17,"value":23285},") —\nnewsletter signup block. Heading + dek + bordered email input +\nuppercase action + consent line. Three tones, three style\nvariants. Self-contained.",{"type":11,"tag":81,"props":23287,"children":23288},{},[23289,23298,23299,23304,23306,23312],{"type":11,"tag":85,"props":23290,"children":23291},{},[23292],{"type":11,"tag":68,"props":23293,"children":23295},{"className":23294},[],[23296],{"type":17,"value":23297},"TuxAlphaNav",{"type":17,"value":2078},{"type":11,"tag":25,"props":23300,"children":23302},{"href":23301},"app\u002Fcomponents\u002FTuxAlphaNav.vue",[23303],{"type":17,"value":23301},{"type":17,"value":23305},") — A–Z jump bar\nfor directory and glossary pages. Two modes: anchor (sets\n",{"type":11,"tag":68,"props":23307,"children":23309},{"className":23308},[],[23310],{"type":17,"value":23311},"window.location.hash",{"type":17,"value":23313}," for in-page jumps) or emit\n(filter-in-place via v-model). Letters not in the dataset\nrender dimmed and disabled.",{"type":11,"tag":7617,"props":23315,"children":23316},{},[],{"type":17,"value":23318},"All five use container queries per ADR 0007. The catalog's\n\"Ideas not yet shipped\" section is now empty — every aspirational\nentry the AggieUX kit catalogued has shipped.",{"type":11,"tag":81,"props":23320,"children":23321},{},[23322,23327,23329],{"type":11,"tag":85,"props":23323,"children":23324},{},[23325],{"type":17,"value":23326},"Composition examples",{"type":17,"value":23328}," — three \"what does this enable\" pages\nassembling 9–13 Tux* components each into real-shape surfaces:",{"type":11,"tag":77,"props":23330,"children":23331},{},[23332,23351,23369,23388],{"type":11,"tag":81,"props":23333,"children":23334},{},[23335,23344,23345,23349],{"type":11,"tag":85,"props":23336,"children":23337},{},[23338],{"type":11,"tag":68,"props":23339,"children":23341},{"className":23340},[],[23342],{"type":17,"value":23343},"\u002Fexamples\u002Fpecan-dashboard",{"type":17,"value":2078},{"type":11,"tag":25,"props":23346,"children":23347},{"href":12486},[23348],{"type":17,"value":12486},{"type":17,"value":23350},") —\nIT-facing index overview. TuxBreadcrumbs, TuxPageHeader (with\nmedia slot), TuxFactoid, TuxAlert, TuxTreemap, TuxFilterPanel,\nTuxSearch, TuxBadge, TuxPagination, TuxDescriptionList,\nTuxSectionHeader, TuxCallout. (13 components.)",{"type":11,"tag":81,"props":23352,"children":23353},{},[23354,23362,23363,23367],{"type":11,"tag":85,"props":23355,"children":23356},{},[23357],{"type":11,"tag":68,"props":23358,"children":23360},{"className":23359},[],[23361],{"type":17,"value":11801},{"type":17,"value":2078},{"type":11,"tag":25,"props":23364,"children":23365},{"href":9856},[23366],{"type":17,"value":9856},{"type":17,"value":23368},") —\npublic-facing program hero. TuxPageHeader (hero + maroon),\nTuxFactoid, TuxBlockquote (drop-cap), TuxMediaSlab (split),\nTuxIconFeature, TuxCardSlab, TuxNewsCollection, TuxTestimonial,\nTuxCTA, TuxLinkList. (10 components.)",{"type":11,"tag":81,"props":23370,"children":23371},{},[23372,23381,23382,23386],{"type":11,"tag":85,"props":23373,"children":23374},{},[23375],{"type":11,"tag":68,"props":23376,"children":23378},{"className":23377},[],[23379],{"type":17,"value":23380},"\u002Fexamples\u002Ftti-ai-studio-session",{"type":17,"value":2078},{"type":11,"tag":25,"props":23383,"children":23384},{"href":14262},[23385],{"type":17,"value":14262},{"type":17,"value":23387},") —\nLLM\u002Fagent session view. TuxBreadcrumbs, TuxPageHeader, TuxAlert\n(compliance), TuxSectionHeader, TuxCallout, TuxDescriptionList,\nTuxFactoid, TuxAccordion, TuxCommandPalette. (9 components.)",{"type":11,"tag":81,"props":23389,"children":23390},{},[23391,23400,23401,23406],{"type":11,"tag":85,"props":23392,"children":23393},{},[23394],{"type":11,"tag":68,"props":23395,"children":23397},{"className":23396},[],[23398],{"type":17,"value":23399},"\u002Fexamples",{"type":17,"value":2078},{"type":11,"tag":25,"props":23402,"children":23404},{"href":23403},"app\u002Fpages\u002Fexamples\u002Findex.vue",[23405],{"type":17,"value":23403},{"type":17,"value":23407},") — the\nindex page. Cards on the landing page promote it.",{"type":11,"tag":81,"props":23409,"children":23410},{},[23411,23416,23417,23422,23424,23429],{"type":11,"tag":85,"props":23412,"children":23413},{},[23414],{"type":17,"value":23415},"ADR 0007",{"type":17,"value":2078},{"type":11,"tag":25,"props":23418,"children":23420},{"href":23419},"docs\u002Fadr\u002F0007-container-queries-over-viewport-media-queries.md",[23421],{"type":17,"value":23419},{"type":17,"value":23423},") —\ncaptures the WHY behind the container-query convention. Cross-\nreferences the gitignored CLAUDE.md and the\n",{"type":11,"tag":68,"props":23425,"children":23427},{"className":23426},[],[23428],{"type":17,"value":8060},{"type":17,"value":23430}," guidance section that enforce it for\nhuman + AI contributors.",{"type":11,"tag":81,"props":23432,"children":23433},{},[23434,23445],{"type":11,"tag":85,"props":23435,"children":23436},{},[23437,23443],{"type":11,"tag":68,"props":23438,"children":23440},{"className":23439},[],[23441],{"type":17,"value":23442},"#extra",{"type":17,"value":23444}," slot on TuxFooter",{"type":17,"value":23446}," — for inline left-side content\nalongside the version + © (high-contrast toggle in the style\nguide; system-status indicators or session counts in product\nconsumers).",{"type":11,"tag":56,"props":23448,"children":23450},{"id":23449},"changed-4",[23451],{"type":17,"value":3591},{"type":11,"tag":77,"props":23453,"children":23454},{},[23455,23503,23576,23609],{"type":11,"tag":81,"props":23456,"children":23457},{},[23458,23463,23465,23470,23472,23478,23480,23486,23488,23494,23496,23501],{"type":11,"tag":85,"props":23459,"children":23460},{},[23461],{"type":17,"value":23462},"Style-guide chrome eats its own dogfood.",{"type":17,"value":23464}," The repo's ",{"type":11,"tag":68,"props":23466,"children":23468},{"className":23467},[],[23469],{"type":17,"value":329},{"type":17,"value":23471},"\nno longer hand-rolls the header lockup or footer — it uses\n",{"type":11,"tag":68,"props":23473,"children":23475},{"className":23474},[],[23476],{"type":17,"value":23477},"\u003CTuxIdentity level=\"center\" superhead=\"Texas A&M Transportation Institute\" name=\"tti-ux\">",{"type":17,"value":23479}," for the header, ",{"type":11,"tag":68,"props":23481,"children":23483},{"className":23482},[],[23484],{"type":17,"value":23485},"\u003CTuxFooter>",{"type":17,"value":23487}," for the\napp-level strip, and ",{"type":11,"tag":68,"props":23489,"children":23491},{"className":23490},[],[23492],{"type":17,"value":23493},"\u003CTuxSubfooter>",{"type":17,"value":23495}," for the mandatory TAMUS\nlegal block. The high-contrast toggle moves into TuxFooter's\nnew ",{"type":11,"tag":68,"props":23497,"children":23499},{"className":23498},[],[23500],{"type":17,"value":23442},{"type":17,"value":23502}," slot. Net effect: the live style guide is now a\nreal example of itself, and any rough edges in the chrome\ncomponents surface in the place they're most visible.",{"type":11,"tag":81,"props":23504,"children":23505},{},[23506,23511,23512,23517,23518,23524,23525,23531,23532,23537,23538,23544,23545,23551,23553,23559,23561,23567,23569,23574],{"type":11,"tag":85,"props":23507,"children":23508},{},[23509],{"type":17,"value":23510},"Container queries replace viewport media queries on layout-shifting\ncomponents",{"type":17,"value":2078},{"type":11,"tag":25,"props":23513,"children":23515},{"href":23514},"app\u002Fcomponents\u002FTuxPageHeader.vue",[23516],{"type":17,"value":5009},{"type":17,"value":489},{"type":11,"tag":25,"props":23519,"children":23521},{"href":23520},"app\u002Fcomponents\u002FTuxMediaSlab.vue",[23522],{"type":17,"value":23523},"TuxMediaSlab",{"type":17,"value":489},{"type":11,"tag":25,"props":23526,"children":23528},{"href":23527},"app\u002Fcomponents\u002FTuxCardSlab.vue",[23529],{"type":17,"value":23530},"TuxCardSlab",{"type":17,"value":489},{"type":11,"tag":25,"props":23533,"children":23535},{"href":23534},"app\u002Fcomponents\u002FTuxCTA.vue",[23536],{"type":17,"value":4995},{"type":17,"value":489},{"type":11,"tag":25,"props":23539,"children":23541},{"href":23540},"app\u002Fcomponents\u002FTuxNewsCollection.vue",[23542],{"type":17,"value":23543},"TuxNewsCollection",{"type":17,"value":489},{"type":11,"tag":25,"props":23546,"children":23548},{"href":23547},"app\u002Fcomponents\u002FTuxBreadcrumbs.vue",[23549],{"type":17,"value":23550},"TuxBreadcrumbs",{"type":17,"value":23552},").\nEach component declares its own ",{"type":11,"tag":68,"props":23554,"children":23556},{"className":23555},[],[23557],{"type":17,"value":23558},"container-type: inline-size",{"type":17,"value":23560}," +\nnamed container, then uses ",{"type":11,"tag":68,"props":23562,"children":23564},{"className":23563},[],[23565],{"type":17,"value":23566},"@container \u003Cname> (min-width: …)",{"type":17,"value":23568}," for\nlayout breakpoints. ",{"type":11,"tag":85,"props":23570,"children":23571},{},[23572],{"type":17,"value":23573},"Why:",{"type":17,"value":23575}," with the old viewport-based queries, a\ncomponent embedded in a 600px demo wrapper inside a 1200px viewport\nwould think it had room for a two-column layout it couldn't fit. With\ncontainer queries, breakpoints fire on the component's own width — so\nthe same component renders correctly whether it's at full page width,\ninside a sidebar tile, or inside a narrow article column.",{"type":11,"tag":81,"props":23577,"children":23578},{},[23579,23599,23601,23607],{"type":11,"tag":85,"props":23580,"children":23581},{},[23582,23584,23590,23591,23597],{"type":17,"value":23583},"Hero typography uses ",{"type":11,"tag":68,"props":23585,"children":23587},{"className":23586},[],[23588],{"type":17,"value":23589},"clamp()",{"type":17,"value":20945},{"type":11,"tag":68,"props":23592,"children":23594},{"className":23593},[],[23595],{"type":17,"value":23596},"cqi",{"type":17,"value":23598}," units",{"type":17,"value":23600}," for fluid scaling.\nHero-rhythm titles, slab titles, news titles, and CTA titles now\nscale smoothly with the container width instead of jumping at a\nbreakpoint. e.g. ",{"type":11,"tag":68,"props":23602,"children":23604},{"className":23603},[],[23605],{"type":17,"value":23606},"font-size: clamp(2rem, 1.2rem + 4.5cqi, 3.5rem)",{"type":17,"value":23608},"\non the hero page-header title.",{"type":11,"tag":81,"props":23610,"children":23611},{},[23612,23617,23619,23624,23625,23630,23632,23637,23638,23644],{"type":11,"tag":85,"props":23613,"children":23614},{},[23615],{"type":17,"value":23616},"TuxTreemap tooltip flips on canvas edges",{"type":17,"value":23618}," instead of overflowing.\nWhen the cursor is past the canvas midpoint, the tooltip anchors to\nthe cursor's opposite side using ",{"type":11,"tag":68,"props":23620,"children":23622},{"className":23621},[],[23623],{"type":17,"value":15281},{"type":17,"value":3280},{"type":11,"tag":68,"props":23626,"children":23628},{"className":23627},[],[23629],{"type":17,"value":15303},{"type":17,"value":23631}," instead of\n",{"type":11,"tag":68,"props":23633,"children":23635},{"className":23634},[],[23636],{"type":17,"value":15292},{"type":17,"value":3280},{"type":11,"tag":68,"props":23639,"children":23641},{"className":23640},[],[23642],{"type":17,"value":23643},"top",{"type":17,"value":23645},". Removes the bug where hovering near a corner sent the\ntooltip off-screen.",{"type":11,"tag":56,"props":23647,"children":23649},{"id":23648},"added-6",[23650],{"type":17,"value":1220},{"type":11,"tag":77,"props":23652,"children":23653},{},[23654,23842,23991,24148,24301,24443,24541,24591,24627,24686],{"type":11,"tag":81,"props":23655,"children":23656},{},[23657,23662,23664],{"type":11,"tag":85,"props":23658,"children":23659},{},[23660],{"type":17,"value":23661},"Catalog completion + tier 2\u002F3 product batch",{"type":17,"value":23663}," — seven components\nclosing out the AggieUX catalog backlog and unblocking the tier 2\u002F3\nproduct surfaces:\n",{"type":11,"tag":77,"props":23665,"children":23666},{},[23667,23701,23742,23760,23778,23797,23823],{"type":11,"tag":81,"props":23668,"children":23669},{},[23670,23678,23679,23684,23686,23692,23693,23699],{"type":11,"tag":85,"props":23671,"children":23672},{},[23673],{"type":11,"tag":68,"props":23674,"children":23676},{"className":23675},[],[23677],{"type":17,"value":12389},{"type":17,"value":2078},{"type":11,"tag":25,"props":23680,"children":23682},{"href":23681},"app\u002Fcomponents\u002FTuxContactCard.vue",[23683],{"type":17,"value":23681},{"type":17,"value":23685},") — faculty \u002F staff\ndirectory card. Portrait + credentials + role + typed contact rows\n(email\u002Fphone\u002Fweb\u002Foffice\u002Flocation, with auto ",{"type":11,"tag":68,"props":23687,"children":23689},{"className":23688},[],[23690],{"type":17,"value":23691},"mailto:",{"type":17,"value":103},{"type":11,"tag":68,"props":23694,"children":23696},{"className":23695},[],[23697],{"type":17,"value":23698},"tel:",{"type":17,"value":23700},").\nVertical or horizontal layout.",{"type":11,"tag":81,"props":23702,"children":23703},{},[23704,23709,23711,23717,23719,23725,23727,23733,23735,23740],{"type":11,"tag":85,"props":23705,"children":23706},{},[23707],{"type":17,"value":23708},"TuxPageHeader extended",{"type":17,"value":23710}," — same component, three new dimensions:\n",{"type":11,"tag":68,"props":23712,"children":23714},{"className":23713},[],[23715],{"type":17,"value":23716},"tone=\"neutral|maroon\"",{"type":17,"value":23718}," for backgrounded panels,\n",{"type":11,"tag":68,"props":23720,"children":23722},{"className":23721},[],[23723],{"type":17,"value":23724},"rhythm=\"hero\"",{"type":17,"value":23726}," for landing-page sized headings,\n",{"type":11,"tag":68,"props":23728,"children":23730},{"className":23729},[],[23731],{"type":17,"value":23732},"#media",{"type":17,"value":23734}," slot for two-column hero treatments,\n",{"type":11,"tag":68,"props":23736,"children":23738},{"className":23737},[],[23739],{"type":17,"value":8426},{"type":17,"value":23741}," slot for trailing CTAs. Existing call sites unchanged.",{"type":11,"tag":81,"props":23743,"children":23744},{},[23745,23753,23754,23758],{"type":11,"tag":85,"props":23746,"children":23747},{},[23748],{"type":11,"tag":68,"props":23749,"children":23751},{"className":23750},[],[23752],{"type":17,"value":23523},{"type":17,"value":2078},{"type":11,"tag":25,"props":23755,"children":23756},{"href":23520},[23757],{"type":17,"value":23520},{"type":17,"value":23759},") — full-bleed hero\nband, \"big photo moment\". Overlay or split layout, three heights,\nthree placeholder tones.",{"type":11,"tag":81,"props":23761,"children":23762},{},[23763,23771,23772,23776],{"type":11,"tag":85,"props":23764,"children":23765},{},[23766],{"type":11,"tag":68,"props":23767,"children":23769},{"className":23768},[],[23770],{"type":17,"value":23530},{"type":17,"value":2078},{"type":11,"tag":25,"props":23773,"children":23774},{"href":23527},[23775],{"type":17,"value":23527},{"type":17,"value":23777},") — full-bleed band of\nmedia-forward cards. The \"browse our programs\" pattern. Three\naspect ratios, 2\u002F3\u002F4-up grid, whole-card click w\u002F corner-drop hover.",{"type":11,"tag":81,"props":23779,"children":23780},{},[23781,23789,23790,23795],{"type":11,"tag":85,"props":23782,"children":23783},{},[23784],{"type":11,"tag":68,"props":23785,"children":23787},{"className":23786},[],[23788],{"type":17,"value":12599},{"type":17,"value":2078},{"type":11,"tag":25,"props":23791,"children":23793},{"href":23792},"app\u002Fcomponents\u002FTuxPagination.vue",[23794],{"type":17,"value":23792},{"type":17,"value":23796},") — page-number\ncontrols. Native Vue (not UPagination) — squarified active page,\nellipsis truncation, optional status line, configurable\nsibling\u002Fboundary count.",{"type":11,"tag":81,"props":23798,"children":23799},{},[23800,23808,23809,23814,23816,23821],{"type":11,"tag":85,"props":23801,"children":23802},{},[23803],{"type":11,"tag":68,"props":23804,"children":23806},{"className":23805},[],[23807],{"type":17,"value":8638},{"type":17,"value":2078},{"type":11,"tag":25,"props":23810,"children":23812},{"href":23811},"app\u002Fcomponents\u002FTuxCommandPalette.vue",[23813],{"type":17,"value":23811},{"type":17,"value":23815},") — global\n⌘K jump bar. Native ",{"type":11,"tag":68,"props":23817,"children":23819},{"className":23818},[],[23820],{"type":17,"value":8777},{"type":17,"value":23822}," (free focus trap + scrim + ESC),\ngrouped commands w\u002F live filter, keyboard navigation, action or\nnavigation per command. Single instance at app root.",{"type":11,"tag":81,"props":23824,"children":23825},{},[23826,23834,23835,23840],{"type":11,"tag":85,"props":23827,"children":23828},{},[23829],{"type":11,"tag":68,"props":23830,"children":23832},{"className":23831},[],[23833],{"type":17,"value":2612},{"type":17,"value":2078},{"type":11,"tag":25,"props":23836,"children":23838},{"href":23837},"app\u002Fcomponents\u002FTuxTreemap.vue",[23839],{"type":17,"value":23837},{"type":17,"value":23841},") — squarified\nhierarchical-size visualization, PECAN's headline chart. Pure SVG\nimplementation of the Bruls-Huijsen-van Wijk algorithm — no viz\nlibrary dependency. Click to drill, breadcrumb to zoom out, log-\nscaled maroon ramp, hover tooltip. 4 unit modes\n(bytes\u002Fcount\u002Fpercent).",{"type":11,"tag":81,"props":23843,"children":23844},{},[23845,23850,23852],{"type":11,"tag":85,"props":23846,"children":23847},{},[23848],{"type":17,"value":23849},"Marketing surface batch",{"type":17,"value":23851}," — five components that round out the\nmarketing\u002Flanding surface coverage. Marcom's eventual review now sees\nevery common content block, not gaps:\n",{"type":11,"tag":77,"props":23853,"children":23854},{},[23855,23891,23918,23944,23964],{"type":11,"tag":81,"props":23856,"children":23857},{},[23858,23867,23868,23873,23875,23881,23883,23889],{"type":11,"tag":85,"props":23859,"children":23860},{},[23861],{"type":11,"tag":68,"props":23862,"children":23864},{"className":23863},[],[23865],{"type":17,"value":23866},"TuxPhotoGrid",{"type":17,"value":2078},{"type":11,"tag":25,"props":23869,"children":23871},{"href":23870},"app\u002Fcomponents\u002FTuxPhotoGrid.vue",[23872],{"type":17,"value":23870},{"type":17,"value":23874},") — uniform image\ngrid. ",{"type":11,"tag":68,"props":23876,"children":23878},{"className":23877},[],[23879],{"type":17,"value":23880},"kind=\"photo\"",{"type":17,"value":23882}," (4:3, captions, full color) or\n",{"type":11,"tag":68,"props":23884,"children":23886},{"className":23885},[],[23887],{"type":17,"value":23888},"kind=\"logo\"",{"type":17,"value":23890}," (1:1, grayscale-on-hover wall). Auto-fits columns,\nplaceholder gradients for design mocks before real assets land.",{"type":11,"tag":81,"props":23892,"children":23893},{},[23894,23903,23904,23909,23911,23916],{"type":11,"tag":85,"props":23895,"children":23896},{},[23897],{"type":11,"tag":68,"props":23898,"children":23900},{"className":23899},[],[23901],{"type":17,"value":23902},"TuxCaptionedMedia",{"type":17,"value":2078},{"type":11,"tag":25,"props":23905,"children":23907},{"href":23906},"app\u002Fcomponents\u002FTuxCaptionedMedia.vue",[23908],{"type":17,"value":23906},{"type":17,"value":23910},") — single\ninline image (or video frame via ",{"type":11,"tag":68,"props":23912,"children":23914},{"className":23913},[],[23915],{"type":17,"value":23732},{"type":17,"value":23917}," slot). Four aspect ratios\n(16:9 \u002F 4:3 \u002F 1:1 \u002F 3:4), three alignment treatments\n(full \u002F wide \u002F right-floated for prose).",{"type":11,"tag":81,"props":23919,"children":23920},{},[23921,23929,23930,23934,23936,23942],{"type":11,"tag":85,"props":23922,"children":23923},{},[23924],{"type":11,"tag":68,"props":23925,"children":23927},{"className":23926},[],[23928],{"type":17,"value":23543},{"type":17,"value":2078},{"type":11,"tag":25,"props":23931,"children":23932},{"href":23540},[23933],{"type":17,"value":23540},{"type":17,"value":23935},") — institutional\nnews-index pattern. Stacked list (thumb left, copy right) for \u002Fnews\nlanding pages, or grid (thumb above, 2 or 3 cols) for hub-page\n\"recent news\" sections. Dates render as ",{"type":11,"tag":68,"props":23937,"children":23939},{"className":23938},[],[23940],{"type":17,"value":23941},"\u003Ctime>",{"type":17,"value":23943}," with ISO datetime.",{"type":11,"tag":81,"props":23945,"children":23946},{},[23947,23956,23957,23962],{"type":11,"tag":85,"props":23948,"children":23949},{},[23950],{"type":11,"tag":68,"props":23951,"children":23953},{"className":23952},[],[23954],{"type":17,"value":23955},"TuxIconFeature",{"type":17,"value":2078},{"type":11,"tag":25,"props":23958,"children":23960},{"href":23959},"app\u002Fcomponents\u002FTuxIconFeature.vue",[23961],{"type":17,"value":23959},{"type":17,"value":23963},") — the classic\n\"our services\" \u002F \"focus areas\" block. Icon-in-tinted-circle +\nheadline + body + CTA. Three tones cycle (maroon\u002Fnavy\u002Fgold). Grid\nor list layout.",{"type":11,"tag":81,"props":23965,"children":23966},{},[23967,23975,23976,23981,23983,23989],{"type":11,"tag":85,"props":23968,"children":23969},{},[23970],{"type":11,"tag":68,"props":23971,"children":23973},{"className":23972},[],[23974],{"type":17,"value":23209},{"type":17,"value":2078},{"type":11,"tag":25,"props":23977,"children":23979},{"href":23978},"app\u002Fcomponents\u002FTuxLinkList.vue",[23980],{"type":17,"value":23978},{"type":17,"value":23982},") — categorized resource\nlist. \"For sponsors \u002F for partners \u002F for students\" footer-of-section\npattern. Optional descriptions per link, auto-detected external\narrows, ",{"type":11,"tag":68,"props":23984,"children":23986},{"className":23985},[],[23987],{"type":17,"value":23988},"featured: true",{"type":17,"value":23990}," for maroon left-bar emphasis.",{"type":11,"tag":81,"props":23992,"children":23993},{},[23994,23999,24001],{"type":11,"tag":85,"props":23995,"children":23996},{},[23997],{"type":17,"value":23998},"Editorial breadth batch",{"type":17,"value":24000}," — four components that round out the\nmarketing\u002Fcontent surface coverage so marcom's eventual review sees a\nfinished system rather than a partial scaffold:\n",{"type":11,"tag":77,"props":24002,"children":24003},{},[24004,24032,24058,24107],{"type":11,"tag":81,"props":24005,"children":24006},{},[24007,24016,24017,24022,24024,24030],{"type":11,"tag":85,"props":24008,"children":24009},{},[24010],{"type":11,"tag":68,"props":24011,"children":24013},{"className":24012},[],[24014],{"type":17,"value":24015},"TuxBlockquote",{"type":17,"value":2078},{"type":11,"tag":25,"props":24018,"children":24020},{"href":24019},"app\u002Fcomponents\u002FTuxBlockquote.vue",[24021],{"type":17,"value":24019},{"type":17,"value":24023},") — standalone\neditorial pull quote. Two layouts (centered with rules above\u002Fbelow;\nmagazine-style drop-cap) and three style variants. Companion to\n",{"type":11,"tag":68,"props":24025,"children":24027},{"className":24026},[],[24028],{"type":17,"value":24029},"TuxCallout",{"type":17,"value":24031}," (which is the inline aside).",{"type":11,"tag":81,"props":24033,"children":24034},{},[24035,24043,24044,24049,24051,24056],{"type":11,"tag":85,"props":24036,"children":24037},{},[24038],{"type":11,"tag":68,"props":24039,"children":24041},{"className":24040},[],[24042],{"type":17,"value":2362},{"type":17,"value":2078},{"type":11,"tag":25,"props":24045,"children":24047},{"href":24046},"app\u002Fcomponents\u002FTuxTestimonial.vue",[24048],{"type":17,"value":24046},{"type":17,"value":24050},") — attributed\nquote collection with portrait + name + role. Grid (cards, 2 or 3\ncols) or row layout. Circular gradient portrait placeholders cycle\nthrough maroon\u002Fnavy\u002Fgold; pass ",{"type":11,"tag":68,"props":24052,"children":24054},{"className":24053},[],[24055],{"type":17,"value":21846},{"type":17,"value":24057}," for real photos.",{"type":11,"tag":81,"props":24059,"children":24060},{},[24061,24070,24071,24076,24078,24083,24084,24089,24091,24097,24099,24105],{"type":11,"tag":85,"props":24062,"children":24063},{},[24064],{"type":11,"tag":68,"props":24065,"children":24067},{"className":24066},[],[24068],{"type":17,"value":24069},"TuxAccordion",{"type":17,"value":2078},{"type":11,"tag":25,"props":24072,"children":24074},{"href":24073},"app\u002Fcomponents\u002FTuxAccordion.vue",[24075],{"type":17,"value":24073},{"type":17,"value":24077},") — FAQ + publication\ndisclosure. Native ",{"type":11,"tag":68,"props":24079,"children":24081},{"className":24080},[],[24082],{"type":17,"value":6845},{"type":17,"value":3280},{"type":11,"tag":68,"props":24085,"children":24087},{"className":24086},[],[24088],{"type":17,"value":6852},{"type":17,"value":24090}," (zero-JS, perfect a11y).\n",{"type":11,"tag":68,"props":24092,"children":24094},{"className":24093},[],[24095],{"type":17,"value":24096},"kind=\"publication\"",{"type":17,"value":24098}," switches to citation rhythm with italic title +\nmeta line. ",{"type":11,"tag":68,"props":24100,"children":24102},{"className":24101},[],[24103],{"type":17,"value":24104},"single",{"type":17,"value":24106}," mode for mutually-exclusive groups.",{"type":11,"tag":81,"props":24108,"children":24109},{},[24110,24118,24119,24124,24126,24132,24133,24138,24140,24146],{"type":11,"tag":85,"props":24111,"children":24112},{},[24113],{"type":11,"tag":68,"props":24114,"children":24116},{"className":24115},[],[24117],{"type":17,"value":12580},{"type":17,"value":2078},{"type":11,"tag":25,"props":24120,"children":24122},{"href":24121},"app\u002Fcomponents\u002FTuxDescriptionList.vue",[24123],{"type":17,"value":24121},{"type":17,"value":24125},") — term \u002F\ndefinition pairs as native ",{"type":11,"tag":68,"props":24127,"children":24129},{"className":24128},[],[24130],{"type":17,"value":24131},"\u003Cdl>",{"type":17,"value":293},{"type":11,"tag":68,"props":24134,"children":24136},{"className":24135},[],[24137],{"type":17,"value":4762},{"type":17,"value":24139}," emphasis for marketing\nsurfaces (event details, exhibit captions); ",{"type":11,"tag":68,"props":24141,"children":24143},{"className":24142},[],[24144],{"type":17,"value":24145},"data",{"type":17,"value":24147}," emphasis for\nproduct metadata (PECAN file detail, classifier specs).",{"type":11,"tag":81,"props":24149,"children":24150},{},[24151,24156,24158],{"type":11,"tag":85,"props":24152,"children":24153},{},[24154],{"type":17,"value":24155},"Tier 1 navigation + chrome batch",{"type":17,"value":24157}," — five components that unblock\nshipping PECAN, tti-ai-studio, and tux's own surfaces:\n",{"type":11,"tag":77,"props":24159,"children":24160},{},[24161,24187,24227,24253],{"type":11,"tag":81,"props":24162,"children":24163},{},[24164,24172,24173,24178,24180,24186],{"type":11,"tag":85,"props":24165,"children":24166},{},[24167],{"type":11,"tag":68,"props":24168,"children":24170},{"className":24169},[],[24171],{"type":17,"value":12618},{"type":17,"value":2078},{"type":11,"tag":25,"props":24174,"children":24176},{"href":24175},"app\u002Fcomponents\u002FTuxSearch.vue",[24177],{"type":17,"value":24175},{"type":17,"value":24179},") — branded inline search bar\nwith attached uppercase action button. Two sizes (regular 60px \u002F slim\n51px), real working v-model, custom action label\u002Ficon. Demos at\n",{"type":11,"tag":68,"props":24181,"children":24183},{"className":24182},[],[24184],{"type":17,"value":24185},"\u002Fcomponents\u002Fsearch",{"type":17,"value":43},{"type":11,"tag":81,"props":24188,"children":24189},{},[24190,24198,24199,24203,24205,24210,24212,24218,24220,24226],{"type":11,"tag":85,"props":24191,"children":24192},{},[24193],{"type":11,"tag":68,"props":24194,"children":24196},{"className":24195},[],[24197],{"type":17,"value":6860},{"type":17,"value":2078},{"type":11,"tag":25,"props":24200,"children":24201},{"href":13100},[24202],{"type":17,"value":13100},{"type":17,"value":24204},") — left-rail\nfacet panel for list pages. Collapsible facet groups via native\n",{"type":11,"tag":68,"props":24206,"children":24208},{"className":24207},[],[24209],{"type":17,"value":6845},{"type":17,"value":24211}," (zero-JS, perfect a11y), checkbox lists with counts,\napplied-filter chips, Clear all. v-modeled as flat\n",{"type":11,"tag":68,"props":24213,"children":24215},{"className":24214},[],[24216],{"type":17,"value":24217},"Record\u003Cstring, string[]>",{"type":17,"value":24219}," for easy wiring to OpenSearch \u002F TanStack.\nDemos at ",{"type":11,"tag":68,"props":24221,"children":24223},{"className":24222},[],[24224],{"type":17,"value":24225},"\u002Fcomponents\u002Ffilter-panel",{"type":17,"value":43},{"type":11,"tag":81,"props":24228,"children":24229},{},[24230,24238,24239,24244,24246,24252],{"type":11,"tag":85,"props":24231,"children":24232},{},[24233],{"type":11,"tag":68,"props":24234,"children":24236},{"className":24235},[],[24237],{"type":17,"value":22752},{"type":17,"value":2078},{"type":11,"tag":25,"props":24240,"children":24242},{"href":24241},"app\u002Fcomponents\u002FTuxIdentity.vue",[24243],{"type":17,"value":24241},{"type":17,"value":24245},") — institutional header\nlockup. Two kinds (lockup \u002F text-only) × two orientations (horizontal \u002F\nstacked) × three hierarchy levels (institution \u002F center \u002F department).\nReplaces the aspirational header rhythm work. Demos at\n",{"type":11,"tag":68,"props":24247,"children":24249},{"className":24248},[],[24250],{"type":17,"value":24251},"\u002Fcomponents\u002Fidentity",{"type":17,"value":43},{"type":11,"tag":81,"props":24254,"children":24255},{},[24256,24264,24265,24273,24274,24279,24280,24285,24287,24292,24294,24300],{"type":11,"tag":85,"props":24257,"children":24258},{},[24259],{"type":11,"tag":68,"props":24260,"children":24262},{"className":24261},[],[24263],{"type":17,"value":5002},{"type":17,"value":912},{"type":11,"tag":85,"props":24266,"children":24267},{},[24268],{"type":11,"tag":68,"props":24269,"children":24271},{"className":24270},[],[24272],{"type":17,"value":20539},{"type":17,"value":2078},{"type":11,"tag":25,"props":24275,"children":24277},{"href":24276},"app\u002Fcomponents\u002FTuxFooter.vue",[24278],{"type":17,"value":24276},{"type":17,"value":489},{"type":11,"tag":25,"props":24281,"children":24283},{"href":24282},"app\u002Fcomponents\u002FTuxSubfooter.vue",[24284],{"type":17,"value":24282},{"type":17,"value":24286},") — paired closer for every TTI surface.\nTuxFooter is the slim app-level compliance strip (version + © +\nutility links); TuxSubfooter is the ",{"type":11,"tag":85,"props":24288,"children":24289},{},[24290],{"type":17,"value":24291},"mandatory TAMUS legal strip",{"type":17,"value":24293},"\n(Texas A&M University System requirement). Per AggieUX guidance the\nsubfooter content is fixed — only the institute name + address +\nyear are configurable. Demos at ",{"type":11,"tag":68,"props":24295,"children":24297},{"className":24296},[],[24298],{"type":17,"value":24299},"\u002Fcomponents\u002Ffooter",{"type":17,"value":43},{"type":11,"tag":81,"props":24302,"children":24303},{},[24304,24309,24311],{"type":11,"tag":85,"props":24305,"children":24306},{},[24307],{"type":17,"value":24308},"Earlier in this Unreleased cycle: four editorial\u002Fdata Tux* components",{"type":17,"value":24310},"\ndriven by the same product needs:\n",{"type":11,"tag":77,"props":24312,"children":24313},{},[24314,24354,24380,24418],{"type":11,"tag":81,"props":24315,"children":24316},{},[24317,24325,24326,24331,24333,24339,24341,24347,24348,24353],{"type":11,"tag":85,"props":24318,"children":24319},{},[24320],{"type":11,"tag":68,"props":24321,"children":24323},{"className":24322},[],[24324],{"type":17,"value":1874},{"type":17,"value":2078},{"type":11,"tag":25,"props":24327,"children":24329},{"href":24328},"app\u002Fcomponents\u002FTuxBigStat.vue",[24330],{"type":17,"value":24328},{"type":17,"value":24332},") — single oversized metric\nwith three sizes (lg\u002Fmd\u002Fsm), three tones (maroon\u002Fgold\u002Fneutral), and\nstyle-variant-aware numeral face. Demos at ",{"type":11,"tag":68,"props":24334,"children":24336},{"className":24335},[],[24337],{"type":17,"value":24338},"\u002Fcomponents\u002Fbig-stat",{"type":17,"value":24340},".\nReplaces the aspirational ",{"type":11,"tag":68,"props":24342,"children":24344},{"className":24343},[],[24345],{"type":17,"value":24346},"BigStat",{"type":17,"value":14476},{"type":11,"tag":68,"props":24349,"children":24351},{"className":24350},[],[24352],{"type":17,"value":8060},{"type":17,"value":43},{"type":11,"tag":81,"props":24355,"children":24356},{},[24357,24365,24366,24371,24373,24379],{"type":11,"tag":85,"props":24358,"children":24359},{},[24360],{"type":11,"tag":68,"props":24361,"children":24363},{"className":24362},[],[24364],{"type":17,"value":24029},{"type":17,"value":2078},{"type":11,"tag":25,"props":24367,"children":24369},{"href":24368},"app\u002Fcomponents\u002FTuxCallout.vue",[24370],{"type":17,"value":24368},{"type":17,"value":24372},") — pulled-aside editorial\naccent (fact \u002F stat \u002F quote) with style-variant left rule (gradient \u002F\nstacked-bars \u002F diagonal-hash). Demos at ",{"type":11,"tag":68,"props":24374,"children":24376},{"className":24375},[],[24377],{"type":17,"value":24378},"\u002Fcomponents\u002Fcallout",{"type":17,"value":43},{"type":11,"tag":81,"props":24381,"children":24382},{},[24383,24391,24392,24396,24398,24404,24405,24411,24412,24417],{"type":11,"tag":85,"props":24384,"children":24385},{},[24386],{"type":11,"tag":68,"props":24387,"children":24389},{"className":24388},[],[24390],{"type":17,"value":23550},{"type":17,"value":2078},{"type":11,"tag":25,"props":24393,"children":24394},{"href":23547},[24395],{"type":17,"value":23547},{"type":17,"value":24397},") — page-depth\nnavigation. Home icon, italic intermediates, pipe-rule separators\nthat collapse to chevron under 35rem. Demos at ",{"type":11,"tag":68,"props":24399,"children":24401},{"className":24400},[],[24402],{"type":17,"value":24403},"\u002Fcomponents\u002Fbreadcrumbs",{"type":17,"value":24340},{"type":11,"tag":68,"props":24406,"children":24408},{"className":24407},[],[24409],{"type":17,"value":24410},"PathCrumbs",{"type":17,"value":14476},{"type":11,"tag":68,"props":24413,"children":24415},{"className":24414},[],[24416],{"type":17,"value":8060},{"type":17,"value":43},{"type":11,"tag":81,"props":24419,"children":24420},{},[24421,24429,24430,24434,24436,24442],{"type":11,"tag":85,"props":24422,"children":24423},{},[24424],{"type":11,"tag":68,"props":24425,"children":24427},{"className":24426},[],[24428],{"type":17,"value":4995},{"type":17,"value":2078},{"type":11,"tag":25,"props":24431,"children":24432},{"href":23534},[24433],{"type":17,"value":23534},{"type":17,"value":24435},") — big promotional block, three tones,\ntwo-column at ≥48rem with action slot. Demos at ",{"type":11,"tag":68,"props":24437,"children":24439},{"className":24438},[],[24440],{"type":17,"value":24441},"\u002Fcomponents\u002Fcta",{"type":17,"value":43},{"type":11,"tag":81,"props":24444,"children":24445},{},[24446,24464,24466,24472,24474,24479,24481,24486,24488,24493,24495,24501,24503,24509,24511,24516,24518,24524,24526,24532,24534,24540],{"type":11,"tag":85,"props":24447,"children":24448},{},[24449,24451,24456,24457,24462],{"type":17,"value":24450},"Three style variants — ",{"type":11,"tag":68,"props":24452,"children":24454},{"className":24453},[],[24455],{"type":17,"value":5244},{"type":17,"value":875},{"type":11,"tag":68,"props":24458,"children":24460},{"className":24459},[],[24461],{"type":17,"value":5251},{"type":17,"value":24463}," \u002F default",{"type":17,"value":24465}," —\nCSS scopes in ",{"type":11,"tag":68,"props":24467,"children":24469},{"className":24468},[],[24470],{"type":17,"value":24471},"tux.css",{"type":17,"value":24473}," plus a live ",{"type":11,"tag":68,"props":24475,"children":24477},{"className":24476},[],[24478],{"type":17,"value":16252},{"type":17,"value":24480}," page demoing\nside-by-side. ",{"type":11,"tag":68,"props":24482,"children":24484},{"className":24483},[],[24485],{"type":17,"value":5244},{"type":17,"value":24487}," rebinds ",{"type":11,"tag":68,"props":24489,"children":24491},{"className":24490},[],[24492],{"type":17,"value":5230},{"type":17,"value":24494}," to Work Sans and\nintroduces the stacked-bar section signature + ",{"type":11,"tag":68,"props":24496,"children":24498},{"className":24497},[],[24499],{"type":17,"value":24500},".dot-grid",{"type":17,"value":24502}," accent +\n",{"type":11,"tag":68,"props":24504,"children":24506},{"className":24505},[],[24507],{"type":17,"value":24508},".card-static--bold",{"type":17,"value":24510}," rectangular top-bar variant. ",{"type":11,"tag":68,"props":24512,"children":24514},{"className":24513},[],[24515],{"type":17,"value":5251},{"type":17,"value":24517},"\nrebinds to Georgia and introduces the diagonal ",{"type":11,"tag":68,"props":24519,"children":24521},{"className":24520},[],[24522],{"type":17,"value":24523},".hash-pattern",{"type":17,"value":24525}," +\ndotted maroon borders + ",{"type":11,"tag":68,"props":24527,"children":24529},{"className":24528},[],[24530],{"type":17,"value":24531},".card-static--elegant",{"type":17,"value":24533},". Default style is\nimplicit (no class needed) and renders the Oswald + maroon-hairline\nrhythm via ",{"type":11,"tag":68,"props":24535,"children":24537},{"className":24536},[],[24538],{"type":17,"value":24539},".section-header",{"type":17,"value":43},{"type":11,"tag":81,"props":24542,"children":24543},{},[24544,24549,24550,24555,24556,24561,24563,24568,24570,24575,24577,24582,24584,24589],{"type":11,"tag":85,"props":24545,"children":24546},{},[24547],{"type":17,"value":24548},"Four-family lane tokens",{"type":17,"value":2115},{"type":11,"tag":68,"props":24551,"children":24553},{"className":24552},[],[24554],{"type":17,"value":2026},{"type":17,"value":1244},{"type":11,"tag":68,"props":24557,"children":24559},{"className":24558},[],[24560],{"type":17,"value":2817},{"type":17,"value":24562}," (Open Sans),\n",{"type":11,"tag":68,"props":24564,"children":24566},{"className":24565},[],[24567],{"type":17,"value":5230},{"type":17,"value":24569}," (Oswald), ",{"type":11,"tag":68,"props":24571,"children":24573},{"className":24572},[],[24574],{"type":17,"value":2825},{"type":17,"value":24576}," (Work Sans),\n",{"type":11,"tag":68,"props":24578,"children":24580},{"className":24579},[],[24581],{"type":17,"value":16147},{"type":17,"value":24583}," (Georgia). Additive — legacy ",{"type":11,"tag":68,"props":24585,"children":24587},{"className":24586},[],[24588],{"type":17,"value":2809},{"type":17,"value":24590},"\n(Public Sans) unchanged.",{"type":11,"tag":81,"props":24592,"children":24593},{},[24594,24612,24614,24620,24621,24626],{"type":11,"tag":85,"props":24595,"children":24596},{},[24597,24602,24604,24610],{"type":11,"tag":68,"props":24598,"children":24600},{"className":24599},[],[24601],{"type":17,"value":2187},{"type":17,"value":24603}," component + ",{"type":11,"tag":68,"props":24605,"children":24607},{"className":24606},[],[24608],{"type":17,"value":24609},"\u002Fcomponents\u002Ffactoid",{"type":17,"value":24611}," demo page",{"type":17,"value":24613}," — the\ninstitutional \"by the numbers\" block. Numeral face changes per\nvariant (Open Sans 700 \u002F Work Sans 800-italic \u002F Georgia italic),\nthree densities (3\u002F4\u002F5-up at 96\u002F72\u002F56px). Replaces the aspirational\n",{"type":11,"tag":68,"props":24615,"children":24617},{"className":24616},[],[24618],{"type":17,"value":24619},"\u003CBigStat>",{"type":17,"value":14476},{"type":11,"tag":68,"props":24622,"children":24624},{"className":24623},[],[24625],{"type":17,"value":8060},{"type":17,"value":43},{"type":11,"tag":81,"props":24628,"children":24629},{},[24630,24646,24648,24654,24656,24662,24664,24670,24671,24677,24679,24684],{"type":11,"tag":85,"props":24631,"children":24632},{},[24633,24638,24640],{"type":11,"tag":68,"props":24634,"children":24636},{"className":24635},[],[24637],{"type":17,"value":205},{"type":17,"value":24639}," page + ",{"type":11,"tag":68,"props":24641,"children":24643},{"className":24642},[],[24644],{"type":17,"value":24645},"public\u002Fpreview\u002F",{"type":17,"value":24647}," — 28 standalone HTML specimen\ncards (typography, color, spacing, components, brand motifs) served\nfrom ",{"type":11,"tag":68,"props":24649,"children":24651},{"className":24650},[],[24652],{"type":17,"value":24653},"\u002Fpreview\u002F*.html",{"type":17,"value":24655}," and indexed via iframe grid. Each loads\n",{"type":11,"tag":68,"props":24657,"children":24659},{"className":24658},[],[24660],{"type":17,"value":24661},"\u002Fcolors_and_type.css",{"type":17,"value":24663}," directly — framework-free — so designers can\nlift one into a deck without pulling Nuxt. ",{"type":11,"tag":68,"props":24665,"children":24667},{"className":24666},[],[24668],{"type":17,"value":24669},"colors_and_type.css",{"type":17,"value":5399},{"type":11,"tag":68,"props":24672,"children":24674},{"className":24673},[],[24675],{"type":17,"value":24676},"fonts\u002F",{"type":17,"value":24678}," mirrored into ",{"type":11,"tag":68,"props":24680,"children":24682},{"className":24681},[],[24683],{"type":17,"value":17024},{"type":17,"value":24685}," for portable use.",{"type":11,"tag":81,"props":24687,"children":24688},{},[24689,24705,24707,24713,24715,24721,24722,24728,24729,24734,24736,24742],{"type":11,"tag":85,"props":24690,"children":24691},{},[24692,24698,24699],{"type":11,"tag":68,"props":24693,"children":24695},{"className":24694},[],[24696],{"type":17,"value":24697},"\u002Fkits",{"type":17,"value":24639},{"type":11,"tag":68,"props":24700,"children":24702},{"className":24701},[],[24703],{"type":17,"value":24704},"public\u002Fkits\u002F",{"type":17,"value":24706}," — five static reference kits carried\nfrom the portable design-system download: ",{"type":11,"tag":68,"props":24708,"children":24710},{"className":24709},[],[24711],{"type":17,"value":24712},"aggieux",{"type":17,"value":24714}," (~57-family\ncomponent catalog), ",{"type":11,"tag":68,"props":24716,"children":24718},{"className":24717},[],[24719],{"type":17,"value":24720},"pecan",{"type":17,"value":875},{"type":11,"tag":68,"props":24723,"children":24725},{"className":24724},[],[24726],{"type":17,"value":24727},"tti-docs",{"type":17,"value":875},{"type":11,"tag":68,"props":24730,"children":24732},{"className":24731},[],[24733],{"type":17,"value":17406},{"type":17,"value":24735}," (three\napplication-shape demos showing tux primitives composed into product\nsurfaces), and ",{"type":11,"tag":68,"props":24737,"children":24739},{"className":24738},[],[24740],{"type":17,"value":24741},"slides",{"type":17,"value":24743}," (deck-stage slide system). All five render in\nvanilla CSS + React via Babel-in-the-browser. Treat as frozen design\nreference — the Tux*.vue components are authoritative when they\ndisagree.",{"type":11,"tag":56,"props":24745,"children":24747},{"id":24746},"changed-5",[24748],{"type":17,"value":3591},{"type":11,"tag":77,"props":24750,"children":24751},{},[24752,24818,24882],{"type":11,"tag":81,"props":24753,"children":24754},{},[24755,24772,24774,24779,24781,24786,24788,24794,24796,24801,24803,24809,24811,24817],{"type":11,"tag":85,"props":24756,"children":24757},{},[24758,24760,24766,24767],{"type":17,"value":24759},"Renamed ",{"type":11,"tag":68,"props":24761,"children":24763},{"className":24762},[],[24764],{"type":17,"value":24765},"app\u002Fassets\u002Fcss\u002Faggieux.css",{"type":17,"value":1144},{"type":11,"tag":68,"props":24768,"children":24770},{"className":24769},[],[24771],{"type":17,"value":24471},{"type":17,"value":24773}," — completes the\naggieux → tux rename. ",{"type":11,"tag":68,"props":24775,"children":24777},{"className":24776},[],[24778],{"type":17,"value":2121},{"type":17,"value":24780}," and all comments\u002Fblurbs in\ncomponents, pages, ADRs, and design docs updated to match. The\n",{"type":11,"tag":68,"props":24782,"children":24784},{"className":24783},[],[24785],{"type":17,"value":24712},{"type":17,"value":24787}," name now refers exclusively to the upstream Texas A&M\nMarCom AggieUX kit (snapshot in ",{"type":11,"tag":68,"props":24789,"children":24791},{"className":24790},[],[24792],{"type":17,"value":24793},"reference\u002Faggieux\u002F",{"type":17,"value":24795},", copy in\n",{"type":11,"tag":68,"props":24797,"children":24799},{"className":24798},[],[24800],{"type":17,"value":17182},{"type":17,"value":24802},", sync scripts in ",{"type":11,"tag":68,"props":24804,"children":24806},{"className":24805},[],[24807],{"type":17,"value":24808},"scripts\u002Fsync-aggieux*.mjs",{"type":17,"value":24810},")\n— not to our own design system. ADR 0004 file renamed to\n",{"type":11,"tag":68,"props":24812,"children":24814},{"className":24813},[],[24815],{"type":17,"value":24816},"0004-tux-tokens-separate-from-nuxt-ui-theme.md",{"type":17,"value":43},{"type":11,"tag":81,"props":24819,"children":24820},{},[24821,24837,24839,24845,24847,24852,24854,24859,24860,24866,24867,24873,24875,24880],{"type":11,"tag":85,"props":24822,"children":24823},{},[24824,24825,24831,24832],{"type":17,"value":24759},{"type":11,"tag":68,"props":24826,"children":24828},{"className":24827},[],[24829],{"type":17,"value":24830},"design\u002Faggieux.md",{"type":17,"value":1144},{"type":11,"tag":68,"props":24833,"children":24835},{"className":24834},[],[24836],{"type":17,"value":15873},{"type":17,"value":24838}," — the system is named\ntux (Aggie + UX); the older ",{"type":11,"tag":68,"props":24840,"children":24842},{"className":24841},[],[24843],{"type":17,"value":24844},"aggieux.md",{"type":17,"value":24846}," filename was a holdover from\nthe initial PECAN extraction. Content also adopts the ",{"type":11,"tag":85,"props":24848,"children":24849},{},[24850],{"type":17,"value":24851},"four-family\ntypography rule",{"type":17,"value":24853}," (Open Sans \u002F Oswald \u002F Work Sans \u002F Georgia +\nJetBrains Mono) and documents the three section styles\n(",{"type":11,"tag":68,"props":24855,"children":24857},{"className":24856},[],[24858],{"type":17,"value":16191},{"type":17,"value":3280},{"type":11,"tag":68,"props":24861,"children":24863},{"className":24862},[],[24864],{"type":17,"value":24865},"bold",{"type":17,"value":3280},{"type":11,"tag":68,"props":24868,"children":24870},{"className":24869},[],[24871],{"type":17,"value":24872},"elegant",{"type":17,"value":24874},") — superseding the earlier Public\nSans-as-default framing. Public Sans remains loaded by ",{"type":11,"tag":68,"props":24876,"children":24878},{"className":24877},[],[24879],{"type":17,"value":5284},{"type":17,"value":24881},"\nfor legacy components.",{"type":11,"tag":81,"props":24883,"children":24884},{},[24885,24890,24892,24897,24898,24904,24906,24911,24913,24919],{"type":11,"tag":85,"props":24886,"children":24887},{},[24888],{"type":17,"value":24889},"Theme toggle split",{"type":17,"value":24891}," — the header toggle is now ",{"type":11,"tag":85,"props":24893,"children":24894},{},[24895],{"type":17,"value":24896},"light ↔ dark only",{"type":17,"value":3769},{"type":11,"tag":68,"props":24899,"children":24901},{"className":24900},[],[24902],{"type":17,"value":24903},"tti ↔ tti-dark",{"type":17,"value":24905},"). High-contrast mode (",{"type":11,"tag":68,"props":24907,"children":24909},{"className":24908},[],[24910],{"type":17,"value":829},{"type":17,"value":24912},") moved to a dedicated\nfooter button, because WCAG AAA's line weights read as \"broken\" in a\ncasual theme cycle and users shouldn't be pushed through an\naccessibility mode as part of aesthetic preference. See\n",{"type":11,"tag":25,"props":24914,"children":24916},{"href":24915},"docs\u002Fadr\u002F0006-separate-hc-from-casual-theme-toggle.md",[24917],{"type":17,"value":24918},"ADR 0006",{"type":17,"value":24920}," —\nsupersedes the three-way cycle from ADR 0005 (the palette itself\nstays).",{"type":11,"tag":56,"props":24922,"children":24924},{"id":24923},"added-7",[24925],{"type":17,"value":1220},{"type":11,"tag":77,"props":24927,"children":24928},{},[24929,24939,25032,25061,25152,25162,25205],{"type":11,"tag":81,"props":24930,"children":24931},{},[24932,24937],{"type":11,"tag":85,"props":24933,"children":24934},{},[24935],{"type":17,"value":24936},"Initial scaffold",{"type":17,"value":24938}," (2026-04-24) — Nuxt 4 runnable style guide, extracted\nfrom PECAN's frontend so tti-ux can serve as the source of truth for\ndownstream Nuxt apps.",{"type":11,"tag":81,"props":24940,"children":24941},{},[24942,24947,24949],{"type":11,"tag":85,"props":24943,"children":24944},{},[24945],{"type":17,"value":24946},"7 Tux* components",{"type":17,"value":24948}," wrapping Nuxt UI primitives where TTI branding\nrequires deviation:\n",{"type":11,"tag":77,"props":24950,"children":24951},{},[24952,24962,24972,24990,25000,25010,25021],{"type":11,"tag":81,"props":24953,"children":24954},{},[24955,24960],{"type":11,"tag":68,"props":24956,"children":24958},{"className":24957},[],[24959],{"type":17,"value":13895},{"type":17,"value":24961}," — 8 admonition variants (note\u002Ftip\u002Finfo\u002Fimportant\u002Fsuccess\u002F\nwarning\u002Fdanger\u002Fcompliance) with left-bar treatment.",{"type":11,"tag":81,"props":24963,"children":24964},{},[24965,24970],{"type":11,"tag":68,"props":24966,"children":24968},{"className":24967},[],[24969],{"type":17,"value":5928},{"type":17,"value":24971}," — 5 shapes (tier\u002Fstatus\u002Ftag\u002Fcount\u002Fdefault).",{"type":11,"tag":81,"props":24973,"children":24974},{},[24975,24980,24982,24988],{"type":11,"tag":68,"props":24976,"children":24978},{"className":24977},[],[24979],{"type":17,"value":4755},{"type":17,"value":24981}," — single ",{"type":11,"tag":68,"props":24983,"children":24985},{"className":24984},[],[24986],{"type":17,"value":24987},"intent",{"type":17,"value":24989}," prop for primary\u002Fsecondary\u002Fghost\u002Fdestructive.",{"type":11,"tag":81,"props":24991,"children":24992},{},[24993,24998],{"type":11,"tag":68,"props":24994,"children":24996},{"className":24995},[],[24997],{"type":17,"value":5985},{"type":17,"value":24999}," — static or linked; linked has corner-drop hover signature.",{"type":11,"tag":81,"props":25001,"children":25002},{},[25003,25008],{"type":11,"tag":68,"props":25004,"children":25006},{"className":25005},[],[25007],{"type":17,"value":11346},{"type":17,"value":25009}," — editorial rhythm (eyebrow + gold-bar title).",{"type":11,"tag":81,"props":25011,"children":25012},{},[25013,25019],{"type":11,"tag":68,"props":25014,"children":25016},{"className":25015},[],[25017],{"type":17,"value":25018},"TuxSectionHeader",{"type":17,"value":25020}," — aggieux ALL-CAPS heading with maroon underline.",{"type":11,"tag":81,"props":25022,"children":25023},{},[25024,25030],{"type":11,"tag":68,"props":25025,"children":25027},{"className":25026},[],[25028],{"type":17,"value":25029},"TuxTable",{"type":17,"value":25031}," — maroon-wash header, auto status-cell rendering via TuxBadge.",{"type":11,"tag":81,"props":25033,"children":25034},{},[25035,25040,25041,25046,25047,25052,25054,25059],{"type":11,"tag":85,"props":25036,"children":25037},{},[25038],{"type":17,"value":25039},"3 themes",{"type":17,"value":1244},{"type":11,"tag":68,"props":25042,"children":25044},{"className":25043},[],[25045],{"type":17,"value":873},{"type":17,"value":22608},{"type":11,"tag":68,"props":25048,"children":25050},{"className":25049},[],[25051],{"type":17,"value":881},{"type":17,"value":25053}," (warm-charcoal dark), ",{"type":11,"tag":68,"props":25055,"children":25057},{"className":25056},[],[25058],{"type":17,"value":829},{"type":17,"value":25060},"\n(WCAG AAA high-contrast). Three-way cycle in the header toggle.",{"type":11,"tag":81,"props":25062,"children":25063},{},[25064,25069,25070],{"type":11,"tag":85,"props":25065,"children":25066},{},[25067],{"type":17,"value":25068},"Style-guide pages",{"type":17,"value":18219},{"type":11,"tag":77,"props":25071,"children":25072},{},[25073,25083,25093,25103,25114,25131,25141],{"type":11,"tag":81,"props":25074,"children":25075},{},[25076,25081],{"type":11,"tag":68,"props":25077,"children":25079},{"className":25078},[],[25080],{"type":17,"value":3280},{"type":17,"value":25082}," — landing with foundations + components grid.",{"type":11,"tag":81,"props":25084,"children":25085},{},[25086,25091],{"type":11,"tag":68,"props":25087,"children":25089},{"className":25088},[],[25090],{"type":17,"value":16238},{"type":17,"value":25092}," — brand palette, semantic roles, status colors, maroon ramp,\nshadows, radii.",{"type":11,"tag":81,"props":25094,"children":25095},{},[25096,25101],{"type":11,"tag":68,"props":25097,"children":25099},{"className":25098},[],[25100],{"type":17,"value":15853},{"type":17,"value":25102}," — heading utilities, type scale, inline treatments.",{"type":11,"tag":81,"props":25104,"children":25105},{},[25106,25112],{"type":11,"tag":68,"props":25107,"children":25109},{"className":25108},[],[25110],{"type":17,"value":25111},"\u002Fmotion",{"type":17,"value":25113}," — spacing ramp, duration tiers, corner-drop demo, Transition\nexample.",{"type":11,"tag":81,"props":25115,"children":25116},{},[25117,25122,25123,25129],{"type":11,"tag":68,"props":25118,"children":25120},{"className":25119},[],[25121],{"type":17,"value":5492},{"type":17,"value":912},{"type":11,"tag":68,"props":25124,"children":25126},{"className":25125},[],[25127],{"type":17,"value":25128},"\u002Fcomponents\u002F{alert,badge,button,card,modal, section-header,table}",{"type":17,"value":25130}," — per-component demos.",{"type":11,"tag":81,"props":25132,"children":25133},{},[25134,25139],{"type":11,"tag":68,"props":25135,"children":25137},{"className":25136},[],[25138],{"type":17,"value":21215},{"type":17,"value":25140}," — inputs, textarea, select, radio, checkboxes, switch, slider,\nchip input, date, validation + focus-ring notes.",{"type":11,"tag":81,"props":25142,"children":25143},{},[25144,25150],{"type":11,"tag":68,"props":25145,"children":25147},{"className":25146},[],[25148],{"type":17,"value":25149},"\u002Fpatterns",{"type":17,"value":25151}," — empty state, loading skeleton, table-state cycle,\nconfirmation flow pointer, admonition stack.",{"type":11,"tag":81,"props":25153,"children":25154},{},[25155,25160],{"type":11,"tag":85,"props":25156,"children":25157},{},[25158],{"type":17,"value":25159},"Placeholder tuxedo SVG logo",{"type":17,"value":25161}," — maroon jacket, gold bow tie, white shirt\nfront, charcoal frame. Needs iteration with a polished mark.",{"type":11,"tag":81,"props":25163,"children":25164},{},[25165,25170,25171,25176,25178,25183,25184,25189,25190,25196,25197,25203],{"type":11,"tag":85,"props":25166,"children":25167},{},[25168],{"type":17,"value":25169},"Design docs",{"type":17,"value":2078},{"type":11,"tag":68,"props":25172,"children":25174},{"className":25173},[],[25175],{"type":17,"value":299},{"type":17,"value":25177},") — ",{"type":11,"tag":68,"props":25179,"children":25181},{"className":25180},[],[25182],{"type":17,"value":24844},{"type":17,"value":95},{"type":11,"tag":68,"props":25185,"children":25187},{"className":25186},[],[25188],{"type":17,"value":167},{"type":17,"value":95},{"type":11,"tag":68,"props":25191,"children":25193},{"className":25192},[],[25194],{"type":17,"value":25195},"palette.md",{"type":17,"value":489},{"type":11,"tag":68,"props":25198,"children":25200},{"className":25199},[],[25201],{"type":17,"value":25202},"tokens.json",{"type":17,"value":25204}," — carried from PECAN.",{"type":11,"tag":81,"props":25206,"children":25207},{},[25208,25213],{"type":11,"tag":85,"props":25209,"children":25210},{},[25211],{"type":17,"value":25212},"Dev server binds :3030",{"type":17,"value":25214}," — avoids collision with PECAN and docs-tti-tamu-edu\non :3000.",{"type":11,"tag":56,"props":25216,"children":25218},{"id":25217},"known-gaps",[25219],{"type":17,"value":25220},"Known gaps",{"type":11,"tag":77,"props":25222,"children":25223},{},[25224,25244,25257,25270,25295],{"type":11,"tag":81,"props":25225,"children":25226},{},[25227,25229,25234,25236,25242],{"type":17,"value":25228},"No npm publish yet — downstream apps must consume via ",{"type":11,"tag":68,"props":25230,"children":25232},{"className":25231},[],[25233],{"type":17,"value":19523},{"type":17,"value":25235},"\nand ",{"type":11,"tag":68,"props":25237,"children":25239},{"className":25238},[],[25240],{"type":17,"value":25241},"extends: ['tti-ux']",{"type":17,"value":25243}," in their nuxt.config.ts.",{"type":11,"tag":81,"props":25245,"children":25246},{},[25247,25249,25255],{"type":17,"value":25248},"No git remote yet — local repo only; will push to ",{"type":11,"tag":68,"props":25250,"children":25252},{"className":25251},[],[25253],{"type":17,"value":25254},"ttitamu\u002Ftti-ux",{"type":17,"value":25256}," when\nthe empty remote exists.",{"type":11,"tag":81,"props":25258,"children":25259},{},[25260,25262,25268],{"type":17,"value":25261},"PECAN still ships its own copies of the 5 ",{"type":11,"tag":68,"props":25263,"children":25265},{"className":25264},[],[25266],{"type":17,"value":25267},"Pecan*",{"type":17,"value":25269}," wrappers. Layer\nconsumption wiring is a separate follow-up.",{"type":11,"tag":81,"props":25271,"children":25272},{},[25273,25275,25280,25281,25286,25288,25293],{"type":17,"value":25274},"Style Dictionary pipeline for ",{"type":11,"tag":68,"props":25276,"children":25278},{"className":25277},[],[25279],{"type":17,"value":4301},{"type":17,"value":1144},{"type":11,"tag":68,"props":25282,"children":25284},{"className":25283},[],[25285],{"type":17,"value":2026},{"type":17,"value":25287}," isn't\nwired; ",{"type":11,"tag":68,"props":25289,"children":25291},{"className":25290},[],[25292],{"type":17,"value":2026},{"type":17,"value":25294}," is hand-maintained for now.",{"type":11,"tag":81,"props":25296,"children":25297},{},[25298,25303,25305,25311],{"type":11,"tag":68,"props":25299,"children":25301},{"className":25300},[],[25302],{"type":17,"value":5123},{"type":17,"value":25304}," Nuxt UI color = Tailwind ",{"type":11,"tag":68,"props":25306,"children":25308},{"className":25307},[],[25309],{"type":17,"value":25310},"amber",{"type":17,"value":25312},"; a TTI-gold-anchored palette\nwould back it properly — inherited TODO from PECAN.",{"title":25314,"searchDepth":25315,"depth":25315,"links":25316},"",2,[25317,25326,25334,25343,25349,25365,25371,25377,25384,25430,25434,25440,25459,25467,25475,25485,25491],{"id":47,"depth":25315,"text":54,"children":25318},[25319,25321,25322,25323,25324,25325],{"id":58,"depth":25320,"text":61},3,{"id":212,"depth":25320,"text":215},{"id":265,"depth":25320,"text":268},{"id":334,"depth":25320,"text":337},{"id":434,"depth":25320,"text":437},{"id":529,"depth":25320,"text":532},{"id":670,"depth":25315,"text":25327,"children":25328},"2.1.0 — 2026-09-01",[25329,25330,25331,25332,25333],{"id":681,"depth":25320,"text":684},{"id":1068,"depth":25320,"text":1071},{"id":1345,"depth":25320,"text":1348},{"id":1434,"depth":25320,"text":1437},{"id":1690,"depth":25320,"text":1693},{"id":1975,"depth":25315,"text":25335,"children":25336},"2.0.0 — 2026-08-19",[25337,25338,25339,25340,25341,25342],{"id":1998,"depth":25320,"text":2001},{"id":2054,"depth":25320,"text":2057},{"id":2134,"depth":25320,"text":2137},{"id":2633,"depth":25320,"text":2636},{"id":2782,"depth":25320,"text":2785},{"id":3076,"depth":25320,"text":1220},{"id":3338,"depth":25315,"text":25344,"children":25345},"1.9.0 — 2026-08-12",[25346,25347,25348],{"id":3377,"depth":25320,"text":1220},{"id":3588,"depth":25320,"text":3591},{"id":4019,"depth":25320,"text":2001},{"id":4263,"depth":25315,"text":25350,"children":25351},"1.8.0 — 2026-07-30",[25352,25353,25355,25356,25357,25358,25360,25361,25362,25363,25364],{"id":4287,"depth":25320,"text":4290},{"id":4409,"depth":25320,"text":25354},"Added — tux-audit bin: guardrails as a consumable (2026-07-30)",{"id":4480,"depth":25320,"text":4483},{"id":4579,"depth":25320,"text":4582},{"id":4640,"depth":25320,"text":4643},{"id":4767,"depth":25320,"text":25359},"Added — TuxBadge tone=\"custom\" (2026-07-30)",{"id":4810,"depth":25320,"text":4813},{"id":4948,"depth":25320,"text":4951},{"id":5107,"depth":25320,"text":5110},{"id":5150,"depth":25320,"text":5153},{"id":5304,"depth":25320,"text":5307},{"id":5349,"depth":25315,"text":25366,"children":25367},"1.7.1 — 2026-07-30",[25368,25369,25370],{"id":5364,"depth":25320,"text":5367},{"id":5466,"depth":25320,"text":5469},{"id":5602,"depth":25320,"text":5605},{"id":5692,"depth":25315,"text":25372,"children":25373},"1.7.0 — 2026-07-28",[25374,25375,25376],{"id":5708,"depth":25320,"text":1220},{"id":5792,"depth":25320,"text":3591},{"id":5851,"depth":25320,"text":2001},{"id":5897,"depth":25315,"text":25378,"children":25379},"1.6.0 — 2026-06-05",[25380,25382],{"id":5920,"depth":25320,"text":25381},"Added — TuxBadge tone prop",{"id":5977,"depth":25320,"text":25383},"Added — TuxCard linked prop + attribute forwarding",{"id":6084,"depth":25315,"text":25385,"children":25386},"1.5.0 — 2026-06-02",[25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25415,25417,25418,25419,25420,25422,25423,25424,25425,25426,25428],{"id":6095,"depth":25320,"text":6098},{"id":6330,"depth":25320,"text":6333},{"id":6831,"depth":25320,"text":6834},{"id":6970,"depth":25320,"text":6973},{"id":7309,"depth":25320,"text":7312},{"id":7499,"depth":25320,"text":7502},{"id":7864,"depth":25320,"text":7867},{"id":8079,"depth":25320,"text":8082},{"id":8264,"depth":25320,"text":8267},{"id":8472,"depth":25320,"text":8475},{"id":8689,"depth":25320,"text":8692},{"id":9674,"depth":25320,"text":9677},{"id":9774,"depth":25320,"text":9777},{"id":9880,"depth":25320,"text":9883},{"id":10162,"depth":25320,"text":10165},{"id":10356,"depth":25320,"text":10359},{"id":10551,"depth":25320,"text":10554},{"id":10720,"depth":25320,"text":10723},{"id":10912,"depth":25320,"text":10915},{"id":11385,"depth":25320,"text":11388},{"id":11396,"depth":25320,"text":11399},{"id":11510,"depth":25320,"text":11513},{"id":12009,"depth":25320,"text":12012},{"id":12435,"depth":25320,"text":12438},{"id":12729,"depth":25320,"text":12732},{"id":12779,"depth":25320,"text":12782},{"id":13047,"depth":25320,"text":25414},"Added — TuxRemovableChip (Primer Token absorption)",{"id":13144,"depth":25320,"text":25416},"Added — TuxInfoLabel, TuxTeachingPopover (Fluent 2 absorption)",{"id":13258,"depth":25320,"text":13261},{"id":13369,"depth":25320,"text":13372},{"id":13472,"depth":25320,"text":13475},{"id":13603,"depth":25320,"text":25421},"Added — TuxEmptyState compact prop + kind preset library",{"id":13809,"depth":25320,"text":13812},{"id":13913,"depth":25320,"text":13916},{"id":13974,"depth":25320,"text":13977},{"id":14081,"depth":25320,"text":14084},{"id":14184,"depth":25320,"text":25427},"Changed — tti-ai-studio-session example uses TuxChatMessage",{"id":14254,"depth":25320,"text":25429},"Changed — app\u002Fpages\u002Fexamples\u002Ftti-ai-studio-session.vue composition",{"id":14343,"depth":25315,"text":25431,"children":25432},"1.4.2 — 2026-05-14",[25433],{"id":14424,"depth":25320,"text":14427},{"id":14505,"depth":25315,"text":25435,"children":25436},"1.4.1 — 2026-05-14",[25437,25438],{"id":14599,"depth":25320,"text":14602},{"id":14700,"depth":25320,"text":25439},"Changed — --color-maroon-400 consolidated onto the dark-mode teal accent",{"id":14808,"depth":25315,"text":25441,"children":25442},"1.4.0 — 2026-05-14",[25443,25445,25446,25448,25450,25452,25454,25455,25457],{"id":14838,"depth":25320,"text":25444},"Changed — self-hosted fonts via @fontsource\u002F* + scripts\u002Fsync-fonts.mjs",{"id":14997,"depth":25320,"text":15000},{"id":15150,"depth":25320,"text":25447},"Added — TuxSlideover (edge-anchored drawer)",{"id":15464,"depth":25320,"text":25449},"Added — TuxTree (hierarchical list)",{"id":15838,"depth":25320,"text":25451},"Added — TuxProse, \u002Ftypography refresh, doc-page surround nav",{"id":16296,"depth":25320,"text":25453},"Added — TuxKbd, TuxShortcutsHelp, global defineShortcuts",{"id":16820,"depth":25320,"text":16823},{"id":17174,"depth":25320,"text":25456},"Added — public\u002Fkits\u002Faggieux\u002F major expansion",{"id":17378,"depth":25320,"text":25458},"Added — StructuredOutput.jsx for tti-ai-chat kit",{"id":17540,"depth":25315,"text":25460,"children":25461},"1.3.0 — 2026-05-12",[25462,25463,25464,25465,25466],{"id":17563,"depth":25320,"text":17566},{"id":17675,"depth":25320,"text":17678},{"id":17935,"depth":25320,"text":17938},{"id":18246,"depth":25320,"text":18249},{"id":18307,"depth":25320,"text":18310},{"id":18337,"depth":25315,"text":25468,"children":25469},"1.2.0 — 2026-05-08",[25470,25471,25472,25474],{"id":18375,"depth":25320,"text":18378},{"id":18613,"depth":25320,"text":18616},{"id":19097,"depth":25320,"text":25473},"Security — npm audit cleanup, 8 → 0 vulnerabilities (2026-05)",{"id":19225,"depth":25320,"text":19228},{"id":19300,"depth":25315,"text":25476,"children":25477},"1.1.0 — 2026-05-06",[25478,25479,25480,25481,25482,25483,25484],{"id":19324,"depth":25320,"text":19327},{"id":19528,"depth":25320,"text":19531},{"id":19539,"depth":25320,"text":19542},{"id":19720,"depth":25320,"text":2001},{"id":19944,"depth":25320,"text":3591},{"id":20113,"depth":25320,"text":20116},{"id":20161,"depth":25320,"text":20164},{"id":20203,"depth":25315,"text":25486,"children":25487},"1.0.0 — 2026-04-27",[25488,25489,25490],{"id":20226,"depth":25320,"text":20229},{"id":20499,"depth":25320,"text":20502},{"id":20624,"depth":25320,"text":1220},{"id":20695,"depth":25315,"text":54,"children":25492},[25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504],{"id":20700,"depth":25320,"text":20703},{"id":21500,"depth":25320,"text":21503},{"id":22024,"depth":25320,"text":22027},{"id":22435,"depth":25320,"text":22438},{"id":22666,"depth":25320,"text":1220},{"id":22884,"depth":25320,"text":3591},{"id":22943,"depth":25320,"text":1220},{"id":23449,"depth":25320,"text":3591},{"id":23648,"depth":25320,"text":1220},{"id":24746,"depth":25320,"text":3591},{"id":24923,"depth":25320,"text":1220},{"id":25217,"depth":25320,"text":25220},1788285286248]