[{"data":1,"prerenderedAt":2998},["ShallowReactive",2],{"post-015-design-system-invariants-en":3,"post-og-015-design-system-invariants":1724},{"id":4,"title":5,"bars":6,"blurb":7,"body":8,"color":6,"contacts":6,"date":1710,"dateModified":6,"description":1711,"extension":1712,"featured":1232,"groups":6,"kicker":1713,"meta":1714,"metrics":6,"n":1715,"navigation":1232,"openTabs":6,"path":1716,"progress":6,"readTime":1717,"reading":6,"role":6,"rules":6,"running":6,"seo":1718,"ships":6,"slug":1719,"stack":6,"started":6,"status":6,"stem":1720,"streak":6,"tag":1721,"tagColor":1722,"tagline":6,"tasks":6,"timeline":6,"topics":6,"week":6,"year":6,"__hash__":1723},"en\u002Fwriting\u002F015-design-system-invariants.md","Design systems as invariants: building a token pipeline from scratch",null,"part 1 of the claude-driven monorepo series — a design layer whose rules make the wrong thing impossible, not just discouraged.",{"type":9,"value":10,"toc":1696},"minimark",[11,15,19,24,27,50,55,58,61,73,76,80,87,98,101,105,126,273,276,312,315,346,370,374,385,388,721,728,826,829,832,1002,1009,1030,1047,1061,1081,1085,1096,1099,1105,1112,1291,1298,1309,1316,1328,1332,1338,1344,1441,1451,1457,1482,1489,1503,1509,1521,1525,1528,1560,1567,1571,1574,1610,1614,1625,1664,1668,1675,1687,1692],[12,13,14],"p",{},"▸ featured · long read — № 015 · jun 13 '26 · 12 min · series: claude-driven monorepo · pt.1",[16,17,5],"h2",{"id":18},"design-systems-as-invariants-building-a-token-pipeline-from-scratch",[12,20,21],{},[22,23,7],"em",{},[25,26],"hr",{},[28,29,30],"blockquote",{},[12,31,32,33,40,41,45,46,49],{},"this is the first piece in a series on the principles behind a ",[34,35,39],"a",{"href":36,"rel":37},"https:\u002F\u002Fgithub.com\u002Fevgentus-cy\u002Fclaude-driven-nest-nuxt-flutter-monorepo",[38],"nofollow","claude-driven monorepo",".\nthe repo bills itself as a ",[42,43,44],"strong",{},"\"spec-first, agent-friendly monorepo boilerplate\""," — a production-shaped starter for teams building in the ",[42,47,48],{},"Claude Design → Claude Code"," loop: working backend \u002F web \u002F mobile, one shared design-token pipeline, a single source of truth for every contract, and drift-guards that make agent-driven work safe \"without a human over every keystroke\". today is the design layer — in detail, step by step, so you can build the same pipeline yourself. the stack (NestJS \u002F Nuxt \u002F Flutter) is just a worked example; the approach ports to any of them.",[51,52,54],"h3",{"id":53},"why-invariants-at-all","why invariants at all",[12,56,57],{},"greenfield projects with an AI assistant fail in predictable ways: the agent drops a hardcoded color into a component, renames a field in one client and forgets the other, changes something \"in place\". by the time you review, the diff is already dozens of files deep, and the human catches the drift too late.",[12,59,60],{},"the conclusion the whole approach rests on:",[28,62,63],{},[12,64,65,68,69,72],{},[42,66,67],{},"a design system isn't a component library — it's a set of machine-checkable invariants.","\nyou make the wrong thing ",[22,70,71],{},"impossible",", not \"discouraged\". then it doesn't matter who writes the code — human or agent: the rules hold both the same.",[12,74,75],{},"here's how to build one, step by step.",[51,77,79],{"id":78},"the-whole-picture","the whole picture",[12,81,82,83,86],{},"one neutral format in the center, with ",[42,84,85],{},"both inputs and outputs"," converging on it:",[88,89,94],"pre",{"className":90,"code":92,"language":93},[91],"language-text","  design sources                                     stack targets\n  ──────────────                                     ─────────────\n  Claude Design  ┐                              ┌─►  CSS \u002F SCSS variables\n  Figma          ├─►  [ TOKENS: W3C DTCG ]  ──► emitters ─┼─►  TypeScript constants\n  Penpot         ├─►   single source        (per target)  ├─►  Flutter \u002F Dart constants\n  by hand (JSON) ┘                              └─►  …any other\n                          │\n                          ▼\n                  primitives library on tokens  ──►  product screens\n                          │\n                          ▼\n                  machine rules (linters · audit · CI drift)\n","text",[95,96,92],"code",{"__ignoreMap":97},"",[12,99,100],{},"now each block, one at a time.",[51,102,104],{"id":103},"step-1-the-source-tokens-in-a-neutral-format","step 1 · the source: tokens in a neutral format",[12,106,107,108,111,112,117,118,121,122,125],{},"the source of truth is ",[42,109,110],{},"semantic tokens"," in the ",[34,113,116],{"href":114,"rel":115},"https:\u002F\u002Fwww.designtokens.org\u002F",[38],"W3C Design Tokens (DTCG)"," format. the format deliberately knows nothing about any framework: a leaf is a ",[95,119,120],{},"$value"," \u002F ",[95,123,124],{},"$type"," pair, plus theme pairs.",[88,127,131],{"className":128,"code":129,"language":130,"meta":97,"style":97},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F specs\u002Fdesign\u002Ftokens\u002Fcolor.json\n\"accent\": {\n  \"light\": { \"$value\": \"#635bff\", \"$type\": \"color\" },\n  \"dark\":  { \"$value\": \"#7b75ff\", \"$type\": \"color\" }\n}\n","json",[95,132,133,142,162,218,267],{"__ignoreMap":97},[134,135,138],"span",{"class":136,"line":137},"line",1,[134,139,141],{"class":140},"sHwdD","\u002F\u002F specs\u002Fdesign\u002Ftokens\u002Fcolor.json\n",[134,143,145,149,153,155,159],{"class":136,"line":144},2,[134,146,148],{"class":147},"sMK4o","\"",[134,150,152],{"class":151},"sfazB","accent",[134,154,148],{"class":147},[134,156,158],{"class":157},"sTEyZ",": ",[134,160,161],{"class":147},"{\n",[134,163,165,168,172,174,177,180,183,186,188,190,192,195,197,200,202,204,206,208,210,213,215],{"class":136,"line":164},3,[134,166,167],{"class":147},"  \"",[134,169,171],{"class":170},"spNyl","light",[134,173,148],{"class":147},[134,175,176],{"class":147},":",[134,178,179],{"class":147}," {",[134,181,182],{"class":147}," \"",[134,184,120],{"class":185},"sBMFI",[134,187,148],{"class":147},[134,189,176],{"class":147},[134,191,182],{"class":147},[134,193,194],{"class":151},"#635bff",[134,196,148],{"class":147},[134,198,199],{"class":147},",",[134,201,182],{"class":147},[134,203,124],{"class":185},[134,205,148],{"class":147},[134,207,176],{"class":147},[134,209,182],{"class":147},[134,211,212],{"class":151},"color",[134,214,148],{"class":147},[134,216,217],{"class":147}," },\n",[134,219,221,223,226,228,230,233,235,237,239,241,243,246,248,250,252,254,256,258,260,262,264],{"class":136,"line":220},4,[134,222,167],{"class":147},[134,224,225],{"class":170},"dark",[134,227,148],{"class":147},[134,229,176],{"class":147},[134,231,232],{"class":147},"  {",[134,234,182],{"class":147},[134,236,120],{"class":185},[134,238,148],{"class":147},[134,240,176],{"class":147},[134,242,182],{"class":147},[134,244,245],{"class":151},"#7b75ff",[134,247,148],{"class":147},[134,249,199],{"class":147},[134,251,182],{"class":147},[134,253,124],{"class":185},[134,255,148],{"class":147},[134,257,176],{"class":147},[134,259,182],{"class":147},[134,261,212],{"class":151},[134,263,148],{"class":147},[134,265,266],{"class":147}," }\n",[134,268,270],{"class":136,"line":269},5,[134,271,272],{"class":147},"}\n",[12,274,275],{},"two principles are baked in right here:",[277,278,279,286],"ol",{},[280,281,282,285],"li",{},[42,283,284],{},"single source of truth."," every design decision (color, type, spacing, radii, shadows, motion, z-index) lives in one place — the token files. everything else is either generated from them or references them.",[280,287,288,291,292,294,295,294,298,301,302,121,304,307,308,311],{},[42,289,290],{},"name = intent, not value."," a token is called ",[95,293,152],{},", ",[95,296,297],{},"surface.raised",[95,299,300],{},"radius.xl"," — by its role, not ",[95,303,194],{},[95,305,306],{},"16px",". that's the superpower: a rebrand becomes a one-line edit. that's exactly what happened in this repo — the accent migrated ",[95,309,310],{},"#5c16c5 → #635bff"," and not one component changed, because components reference the role, not the hex.",[12,313,314],{},"where the source itself comes from is up to you, and there are plenty of options (anything that can emit DTCG):",[316,317,318,324,334,340],"ul",{},[280,319,320,323],{},[42,321,322],{},"Claude Design \u002F claude.ai"," — describe the brand in a brief, Claude generates the token JSON and the mockups. the repo ships a ready copy-paste brief for exactly this. this is \"AI as a design source\".",[280,325,326,329,330,333],{},[42,327,328],{},"Figma"," — export a token plugin to JSON, lay it out across ",[95,331,332],{},"*.json",".",[280,335,336,339],{},[42,337,338],{},"Penpot"," (the open-source Figma alternative) — the same plugin export.",[280,341,342,345],{},[42,343,344],{},"by hand"," — just write the JSON.",[28,347,348],{},[12,349,350,351,358,359,362,363,333],{},"→ source and format: ",[34,352,355],{"href":353,"rel":354},"https:\u002F\u002Fgithub.com\u002Fevgentus-cy\u002Fclaude-driven-nest-nuxt-flutter-monorepo\u002Ftree\u002Fmain\u002Fspecs\u002Fdesign",[38],[95,356,357],{},"specs\u002Fdesign"," (its ",[95,360,361],{},"README.md"," documents importing from Claude Design \u002F Figma \u002F Penpot \u002F by hand) · and ",[34,364,367],{"href":365,"rel":366},"https:\u002F\u002Fgithub.com\u002Fevgentus-cy\u002Fclaude-driven-nest-nuxt-flutter-monorepo\u002Ftree\u002Fmain\u002Fspecs\u002Fdesign\u002Ftokens",[38],[95,368,369],{},"specs\u002Fdesign\u002Ftokens",[51,371,373],{"id":372},"step-2-the-emitter-one-source-many-targets","step 2 · the emitter: one source → many targets",[12,375,376,377,380,381,384],{},"this is the heart of portability. take one token model and ",[42,378,379],{},"compile"," it for each platform into that platform's ",[22,382,383],{},"native"," format. no manual \"duplicate the color in three places\" — parity is structural.",[12,386,387],{},"the CSS emitter walks the tokens and lays them out by theme (camelCase names → kebab-case):",[88,389,393],{"className":390,"code":391,"language":392,"meta":97,"style":97},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F simplified from packages\u002Fdesign-tokens\u002Fsrc\u002Femit-scss.ts\nfunction themedBlock(theme, tokens) {\n  const selector = theme === 'light' ? `:root, [data-theme='light']` : `[data-theme='${theme}']`;\n  const lines = [`${selector} {`];\n  for (const [key, leaf] of Object.entries(tokens.color.brand)) {\n    const value = (leaf[theme] ?? leaf.light).$value; \u002F\u002F fall back to light\n    lines.push(`  --brand-${kebab(key)}: ${value};`);\n  }\n  lines.push('}');\n  return lines.join('\\n');\n}\n","ts",[95,394,395,400,427,488,518,572,617,662,668,690,716],{"__ignoreMap":97},[134,396,397],{"class":136,"line":137},[134,398,399],{"class":140},"\u002F\u002F simplified from packages\u002Fdesign-tokens\u002Fsrc\u002Femit-scss.ts\n",[134,401,402,405,409,412,416,418,421,424],{"class":136,"line":144},[134,403,404],{"class":170},"function",[134,406,408],{"class":407},"s2Zo4"," themedBlock",[134,410,411],{"class":147},"(",[134,413,415],{"class":414},"sHdIc","theme",[134,417,199],{"class":147},[134,419,420],{"class":414}," tokens",[134,422,423],{"class":147},")",[134,425,426],{"class":147}," {\n",[134,428,429,432,435,438,441,444,447,449,452,455,458,461,464,467,469,472,475,477,480,483,485],{"class":136,"line":164},[134,430,431],{"class":170},"  const",[134,433,434],{"class":157}," selector",[134,436,437],{"class":147}," =",[134,439,440],{"class":157}," theme",[134,442,443],{"class":147}," ===",[134,445,446],{"class":147}," '",[134,448,171],{"class":151},[134,450,451],{"class":147},"'",[134,453,454],{"class":147}," ?",[134,456,457],{"class":147}," `",[134,459,460],{"class":151},":root, [data-theme='light']",[134,462,463],{"class":147},"`",[134,465,466],{"class":147}," :",[134,468,457],{"class":147},[134,470,471],{"class":151},"[data-theme='",[134,473,474],{"class":147},"${",[134,476,415],{"class":157},[134,478,479],{"class":147},"}",[134,481,482],{"class":151},"']",[134,484,463],{"class":147},[134,486,487],{"class":147},";\n",[134,489,490,492,495,497,501,504,507,509,511,513,516],{"class":136,"line":220},[134,491,431],{"class":170},[134,493,494],{"class":157}," lines",[134,496,437],{"class":147},[134,498,500],{"class":499},"swJcz"," [",[134,502,503],{"class":147},"`${",[134,505,506],{"class":157},"selector",[134,508,479],{"class":147},[134,510,179],{"class":151},[134,512,463],{"class":147},[134,514,515],{"class":499},"]",[134,517,487],{"class":147},[134,519,520,524,527,530,532,535,537,540,542,545,548,550,553,555,558,560,562,564,567,570],{"class":136,"line":269},[134,521,523],{"class":522},"s7zQu","  for",[134,525,526],{"class":499}," (",[134,528,529],{"class":170},"const",[134,531,500],{"class":147},[134,533,534],{"class":157},"key",[134,536,199],{"class":147},[134,538,539],{"class":157}," leaf",[134,541,515],{"class":147},[134,543,544],{"class":147}," of",[134,546,547],{"class":157}," Object",[134,549,333],{"class":147},[134,551,552],{"class":407},"entries",[134,554,411],{"class":499},[134,556,557],{"class":157},"tokens",[134,559,333],{"class":147},[134,561,212],{"class":157},[134,563,333],{"class":147},[134,565,566],{"class":157},"brand",[134,568,569],{"class":499},")) ",[134,571,161],{"class":147},[134,573,575,578,581,583,585,588,591,593,596,599,601,603,605,607,609,611,614],{"class":136,"line":574},6,[134,576,577],{"class":170},"    const",[134,579,580],{"class":157}," value",[134,582,437],{"class":147},[134,584,526],{"class":499},[134,586,587],{"class":157},"leaf",[134,589,590],{"class":499},"[",[134,592,415],{"class":157},[134,594,595],{"class":499},"] ",[134,597,598],{"class":147},"??",[134,600,539],{"class":157},[134,602,333],{"class":147},[134,604,171],{"class":157},[134,606,423],{"class":499},[134,608,333],{"class":147},[134,610,120],{"class":157},[134,612,613],{"class":147},";",[134,615,616],{"class":140}," \u002F\u002F fall back to light\n",[134,618,620,623,625,628,630,632,635,637,640,643,645,647,649,652,654,656,658,660],{"class":136,"line":619},7,[134,621,622],{"class":157},"    lines",[134,624,333],{"class":147},[134,626,627],{"class":407},"push",[134,629,411],{"class":499},[134,631,463],{"class":147},[134,633,634],{"class":151},"  --brand-",[134,636,474],{"class":147},[134,638,639],{"class":407},"kebab",[134,641,642],{"class":157},"(key)",[134,644,479],{"class":147},[134,646,158],{"class":151},[134,648,474],{"class":147},[134,650,651],{"class":157},"value",[134,653,479],{"class":147},[134,655,613],{"class":151},[134,657,463],{"class":147},[134,659,423],{"class":499},[134,661,487],{"class":147},[134,663,665],{"class":136,"line":664},8,[134,666,667],{"class":147},"  }\n",[134,669,671,674,676,678,680,682,684,686,688],{"class":136,"line":670},9,[134,672,673],{"class":157},"  lines",[134,675,333],{"class":147},[134,677,627],{"class":407},[134,679,411],{"class":499},[134,681,451],{"class":147},[134,683,479],{"class":151},[134,685,451],{"class":147},[134,687,423],{"class":499},[134,689,487],{"class":147},[134,691,693,696,698,700,703,705,707,710,712,714],{"class":136,"line":692},10,[134,694,695],{"class":522},"  return",[134,697,494],{"class":157},[134,699,333],{"class":147},[134,701,702],{"class":407},"join",[134,704,411],{"class":499},[134,706,451],{"class":147},[134,708,709],{"class":157},"\\n",[134,711,451],{"class":147},[134,713,423],{"class":499},[134,715,487],{"class":147},[134,717,719],{"class":136,"line":718},11,[134,720,272],{"class":147},[12,722,723,724,727],{},"the result is plain CSS variables with a theme cascade (light is also the ",[95,725,726],{},":root"," default, the rest override):",[88,729,733],{"className":730,"code":731,"language":732,"meta":97,"style":97},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight",":root,\n[data-theme='light'] {\n  --brand-accent: #635bff;\n}\n[data-theme='dark'],\n.dark {\n  --brand-accent: #7b75ff;\n}\n","css",[95,734,735,745,765,780,784,801,809,822],{"__ignoreMap":97},[134,736,737,739,742],{"class":136,"line":137},[134,738,176],{"class":147},[134,740,741],{"class":170},"root",[134,743,744],{"class":147},",\n",[134,746,747,749,752,755,757,759,761,763],{"class":136,"line":144},[134,748,590],{"class":147},[134,750,751],{"class":170},"data-theme",[134,753,754],{"class":147},"=",[134,756,451],{"class":147},[134,758,171],{"class":151},[134,760,451],{"class":147},[134,762,515],{"class":147},[134,764,426],{"class":147},[134,766,767,770,772,775,778],{"class":136,"line":164},[134,768,769],{"class":157},"  --brand-accent",[134,771,176],{"class":147},[134,773,774],{"class":147}," #",[134,776,777],{"class":157},"635bff",[134,779,487],{"class":147},[134,781,782],{"class":136,"line":220},[134,783,272],{"class":147},[134,785,786,788,790,792,794,796,798],{"class":136,"line":269},[134,787,590],{"class":147},[134,789,751],{"class":170},[134,791,754],{"class":147},[134,793,451],{"class":147},[134,795,225],{"class":151},[134,797,451],{"class":147},[134,799,800],{"class":147},"],\n",[134,802,803,805,807],{"class":136,"line":574},[134,804,333],{"class":147},[134,806,225],{"class":185},[134,808,426],{"class":147},[134,810,811,813,815,817,820],{"class":136,"line":619},[134,812,769],{"class":157},[134,814,176],{"class":147},[134,816,774],{"class":147},[134,818,819],{"class":157},"7b75ff",[134,821,487],{"class":147},[134,823,824],{"class":136,"line":664},[134,825,272],{"class":147},[12,827,828],{},"from one source the emitter rolls out every theme at once (here: light \u002F dark \u002F sepia \u002F forest) — so dark mode and rebrand come \"for free\".",[12,830,831],{},"a fan-out build writes the artifacts for each platform in one command:",[88,833,835],{"className":390,"code":834,"language":392,"meta":97,"style":97},"\u002F\u002F simplified from packages\u002Fdesign-tokens\u002Fsrc\u002Fbuild.ts\nconst targets = [\n  { file: 'apps\u002Fweb\u002Fapp\u002Fassets\u002Fcss\u002Ftokens.generated.css', contents: emitScss(tokens) },\n  { file: 'packages\u002Fui\u002Fsrc\u002Ftokens.generated.css', contents: emitScss(tokens) },\n  { file: 'apps\u002Fweb\u002Fapp\u002Fdesign-tokens.generated.ts', contents: emitTypescript(tokens) },\n  { file: 'packages\u002Fui\u002Fsrc\u002Fdesign-tokens.generated.ts', contents: emitTypescript(tokens) },\n  { file: 'packages\u002Fui_flutter\u002Flib\u002Fsrc\u002Ftheme\u002Ftokens.g.dart', contents: emitDart(tokens) },\n];\n",[95,836,837,842,854,886,913,941,968,996],{"__ignoreMap":97},[134,838,839],{"class":136,"line":137},[134,840,841],{"class":140},"\u002F\u002F simplified from packages\u002Fdesign-tokens\u002Fsrc\u002Fbuild.ts\n",[134,843,844,846,849,851],{"class":136,"line":144},[134,845,529],{"class":170},[134,847,848],{"class":157}," targets ",[134,850,754],{"class":147},[134,852,853],{"class":157}," [\n",[134,855,856,858,861,863,865,868,870,872,875,877,880,883],{"class":136,"line":164},[134,857,232],{"class":147},[134,859,860],{"class":499}," file",[134,862,176],{"class":147},[134,864,446],{"class":147},[134,866,867],{"class":151},"apps\u002Fweb\u002Fapp\u002Fassets\u002Fcss\u002Ftokens.generated.css",[134,869,451],{"class":147},[134,871,199],{"class":147},[134,873,874],{"class":499}," contents",[134,876,176],{"class":147},[134,878,879],{"class":407}," emitScss",[134,881,882],{"class":157},"(tokens) ",[134,884,885],{"class":147},"},\n",[134,887,888,890,892,894,896,899,901,903,905,907,909,911],{"class":136,"line":220},[134,889,232],{"class":147},[134,891,860],{"class":499},[134,893,176],{"class":147},[134,895,446],{"class":147},[134,897,898],{"class":151},"packages\u002Fui\u002Fsrc\u002Ftokens.generated.css",[134,900,451],{"class":147},[134,902,199],{"class":147},[134,904,874],{"class":499},[134,906,176],{"class":147},[134,908,879],{"class":407},[134,910,882],{"class":157},[134,912,885],{"class":147},[134,914,915,917,919,921,923,926,928,930,932,934,937,939],{"class":136,"line":269},[134,916,232],{"class":147},[134,918,860],{"class":499},[134,920,176],{"class":147},[134,922,446],{"class":147},[134,924,925],{"class":151},"apps\u002Fweb\u002Fapp\u002Fdesign-tokens.generated.ts",[134,927,451],{"class":147},[134,929,199],{"class":147},[134,931,874],{"class":499},[134,933,176],{"class":147},[134,935,936],{"class":407}," emitTypescript",[134,938,882],{"class":157},[134,940,885],{"class":147},[134,942,943,945,947,949,951,954,956,958,960,962,964,966],{"class":136,"line":574},[134,944,232],{"class":147},[134,946,860],{"class":499},[134,948,176],{"class":147},[134,950,446],{"class":147},[134,952,953],{"class":151},"packages\u002Fui\u002Fsrc\u002Fdesign-tokens.generated.ts",[134,955,451],{"class":147},[134,957,199],{"class":147},[134,959,874],{"class":499},[134,961,176],{"class":147},[134,963,936],{"class":407},[134,965,882],{"class":157},[134,967,885],{"class":147},[134,969,970,972,974,976,978,981,983,985,987,989,992,994],{"class":136,"line":619},[134,971,232],{"class":147},[134,973,860],{"class":499},[134,975,176],{"class":147},[134,977,446],{"class":147},[134,979,980],{"class":151},"packages\u002Fui_flutter\u002Flib\u002Fsrc\u002Ftheme\u002Ftokens.g.dart",[134,982,451],{"class":147},[134,984,199],{"class":147},[134,986,874],{"class":499},[134,988,176],{"class":147},[134,990,991],{"class":407}," emitDart",[134,993,882],{"class":157},[134,995,885],{"class":147},[134,997,998,1000],{"class":136,"line":664},[134,999,515],{"class":157},[134,1001,487],{"class":147},[12,1003,1004,1005,1008],{},"here's the portability proof — ",[42,1006,1007],{},"the same token"," on two unrelated runtimes:",[88,1010,1012],{"className":730,"code":1011,"language":732,"meta":97,"style":97},"\u002F* CSS \u002F SCSS (browser) *\u002F\n--brand-accent: #635bff;\n",[95,1013,1014,1019],{"__ignoreMap":97},[134,1015,1016],{"class":136,"line":137},[134,1017,1018],{"class":140},"\u002F* CSS \u002F SCSS (browser) *\u002F\n",[134,1020,1021,1024,1027],{"class":136,"line":144},[134,1022,1023],{"class":157},"--brand-accent: ",[134,1025,1026],{"class":147},"#",[134,1028,1029],{"class":157},"635bff;\n",[88,1031,1035],{"className":1032,"code":1033,"language":1034,"meta":97,"style":97},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Flutter \u002F Dart (mobile runtime)\nstatic const Color brandAccent = Color(0xFF635BFF);\n","dart",[95,1036,1037,1042],{"__ignoreMap":97},[134,1038,1039],{"class":136,"line":137},[134,1040,1041],{},"\u002F\u002F Flutter \u002F Dart (mobile runtime)\n",[134,1043,1044],{"class":136,"line":144},[134,1045,1046],{},"static const Color brandAccent = Color(0xFF635BFF);\n",[12,1048,1049,1050,1053,1054,1057,1058,333],{},"what ports is the ",[22,1051,1052],{},"approach",": want a new stack? add an emitter for the new target — ",[42,1055,1056],{},"you don't touch the source",". the whole principle: ",[22,1059,1060],{},"generate into each platform's native format",[28,1062,1063],{},[12,1064,1065,1066,1073,1074,333],{},"→ the emitters in full: ",[34,1067,1070],{"href":1068,"rel":1069},"https:\u002F\u002Fgithub.com\u002Fevgentus-cy\u002Fclaude-driven-nest-nuxt-flutter-monorepo\u002Ftree\u002Fmain\u002Fpackages\u002Fdesign-tokens",[38],[95,1071,1072],{},"packages\u002Fdesign-tokens"," · the same tokens after they reach the mobile runtime: ",[34,1075,1078],{"href":1076,"rel":1077},"https:\u002F\u002Fgithub.com\u002Fevgentus-cy\u002Fclaude-driven-nest-nuxt-flutter-monorepo\u002Ftree\u002Fmain\u002Fpackages\u002Fui_flutter",[38],[95,1079,1080],{},"packages\u002Fui_flutter",[51,1082,1084],{"id":1083},"step-3-primitives-on-tokens-not-wrappers-around-someone-elses-kit","step 3 · primitives on tokens, not wrappers around someone else's kit",[12,1086,1087,1088,1091,1092,1095],{},"the temptation is to grab a ready-made UI kit and wrap its button. but then the styles live ",[22,1089,1090],{},"inside"," someone else's code, and you can't pin rules on them. so the base primitives are ",[42,1093,1094],{},"your own",", styled with tokens only.",[12,1097,1098],{},"each component is a folder with the full set (more on that in step 4):",[88,1100,1103],{"className":1101,"code":1102,"language":93},[91],"packages\u002Fui\u002Fsrc\u002Fcomponents\u002FAppButton\u002F\n  AppButton.vue        # markup + token styles\n  AppButton.stories.ts # showcase of every variant\n  AppButton.spec.ts    # render + a11y + variants\n  index.ts\n",[95,1104,1102],{"__ignoreMap":97},[12,1106,1107,1108,1111],{},"styles reference only ",[95,1109,1110],{},"var(--*)",", classes are BEM with a prefix, no raw values:",[88,1113,1117],{"className":1114,"code":1115,"language":1116,"meta":97,"style":97},"language-scss shiki shiki-themes material-theme-lighter material-theme material-theme-palenight",".app-button {\n  height: var(--space-10);\n  padding: 0 var(--space-4);\n  border-radius: var(--radius-lg);\n  font-size: var(--text-md);\n  transition: background var(--dur-base) var(--ease);\n\n  &--primary {\n    \u002F\u002F BEM modifier\n    background: var(--brand-primary);\n    color: var(--brand-primary-fg);\n  }\n}\n","scss",[95,1118,1119,1128,1147,1167,1183,1199,1228,1234,1244,1249,1265,1281,1286],{"__ignoreMap":97},[134,1120,1121,1123,1126],{"class":136,"line":137},[134,1122,333],{"class":147},[134,1124,1125],{"class":185},"app-button",[134,1127,426],{"class":147},[134,1129,1130,1134,1136,1139,1141,1144],{"class":136,"line":144},[134,1131,1133],{"class":1132},"sqsOY","  height",[134,1135,176],{"class":147},[134,1137,1138],{"class":407}," var",[134,1140,411],{"class":147},[134,1142,1143],{"class":157},"--space-10",[134,1145,1146],{"class":147},");\n",[134,1148,1149,1152,1154,1158,1160,1162,1165],{"class":136,"line":164},[134,1150,1151],{"class":1132},"  padding",[134,1153,176],{"class":147},[134,1155,1157],{"class":1156},"sbssI"," 0",[134,1159,1138],{"class":407},[134,1161,411],{"class":147},[134,1163,1164],{"class":157},"--space-4",[134,1166,1146],{"class":147},[134,1168,1169,1172,1174,1176,1178,1181],{"class":136,"line":220},[134,1170,1171],{"class":1132},"  border-radius",[134,1173,176],{"class":147},[134,1175,1138],{"class":407},[134,1177,411],{"class":147},[134,1179,1180],{"class":157},"--radius-lg",[134,1182,1146],{"class":147},[134,1184,1185,1188,1190,1192,1194,1197],{"class":136,"line":269},[134,1186,1187],{"class":1132},"  font-size",[134,1189,176],{"class":147},[134,1191,1138],{"class":407},[134,1193,411],{"class":147},[134,1195,1196],{"class":157},"--text-md",[134,1198,1146],{"class":147},[134,1200,1201,1204,1206,1209,1212,1214,1217,1219,1221,1223,1226],{"class":136,"line":574},[134,1202,1203],{"class":1132},"  transition",[134,1205,176],{"class":147},[134,1207,1208],{"class":157}," background ",[134,1210,1211],{"class":407},"var",[134,1213,411],{"class":147},[134,1215,1216],{"class":157},"--dur-base",[134,1218,423],{"class":147},[134,1220,1138],{"class":407},[134,1222,411],{"class":147},[134,1224,1225],{"class":157},"--ease",[134,1227,1146],{"class":147},[134,1229,1230],{"class":136,"line":619},[134,1231,1233],{"emptyLinePlaceholder":1232},true,"\n",[134,1235,1236,1239,1242],{"class":136,"line":664},[134,1237,1238],{"class":185},"  &",[134,1240,1241],{"class":157},"--primary ",[134,1243,161],{"class":147},[134,1245,1246],{"class":136,"line":670},[134,1247,1248],{"class":140},"    \u002F\u002F BEM modifier\n",[134,1250,1251,1254,1256,1258,1260,1263],{"class":136,"line":692},[134,1252,1253],{"class":1132},"    background",[134,1255,176],{"class":147},[134,1257,1138],{"class":407},[134,1259,411],{"class":147},[134,1261,1262],{"class":157},"--brand-primary",[134,1264,1146],{"class":147},[134,1266,1267,1270,1272,1274,1276,1279],{"class":136,"line":718},[134,1268,1269],{"class":1132},"    color",[134,1271,176],{"class":147},[134,1273,1138],{"class":407},[134,1275,411],{"class":147},[134,1277,1278],{"class":157},"--brand-primary-fg",[134,1280,1146],{"class":147},[134,1282,1284],{"class":136,"line":1283},12,[134,1285,667],{"class":147},[134,1287,1289],{"class":136,"line":1288},13,[134,1290,272],{"class":147},[12,1292,1293,1294,1297],{},"the component API reads as intent: ",[95,1295,1296],{},"color=\"primary\"",", not a color. so the rebrand from step 1 passes through the entire UI without touching a single signature.",[12,1299,1300,1301,1304,1305,1308],{},"you can't fully escape someone else's kit — complex behavioral widgets (modal, dropdown, table, calendar) are cheaper to take ready-made. they're ",[42,1302,1303],{},"not banned",", they're ",[22,1306,1307],{},"isolated",": the foreign symbol is imported in exactly one place — inside its own wrapper-primitive — and only your component faces outward.",[12,1310,1311,1312,1315],{},"the principle: ",[22,1313,1314],{},"own your primitives"," — you can only check rules on code you own.",[28,1317,1318],{},[12,1319,1320,1321,333],{},"→ primitives library: ",[34,1322,1325],{"href":1323,"rel":1324},"https:\u002F\u002Fgithub.com\u002Fevgentus-cy\u002Fclaude-driven-nest-nuxt-flutter-monorepo\u002Ftree\u002Fmain\u002Fpackages\u002Fui",[38],[95,1326,1327],{},"packages\u002Fui",[51,1329,1331],{"id":1330},"step-4-teeth-machine-rules-instead-of-a-guideline","step 4 · teeth: machine rules instead of a guideline",[12,1333,1334,1335,333],{},"this is the step the whole thing was for. the rules aren't lines in a wiki — they're configs that ",[42,1336,1337],{},"fail the build",[12,1339,1340,1343],{},[42,1341,1342],{},"the linter bans hardcoding."," the actual rules:",[88,1345,1349],{"className":1346,"code":1347,"language":1348,"meta":97,"style":97},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F simplified from stylelint.config.mjs\nrules: {\n  'declaration-no-important': true,        \u002F\u002F no !important\n  'color-no-hex': true,                    \u002F\u002F no #635bff — only var(--brand-*)\n  'color-named': 'never',                  \u002F\u002F no red \u002F blue\n  \u002F\u002F plus: z-index only via var(--z-*), durations via var(--dur-*),\n  \u002F\u002F       spacing ≥3px via var(--space-*); classes — BEM with an app-\u002Fhealth-\u002Fbrand- prefix\n}\n","js",[95,1350,1351,1356,1365,1386,1404,1427,1432,1437],{"__ignoreMap":97},[134,1352,1353],{"class":136,"line":137},[134,1354,1355],{"class":140},"\u002F\u002F simplified from stylelint.config.mjs\n",[134,1357,1358,1361,1363],{"class":136,"line":144},[134,1359,1360],{"class":185},"rules",[134,1362,176],{"class":147},[134,1364,426],{"class":147},[134,1366,1367,1370,1373,1375,1377,1381,1383],{"class":136,"line":164},[134,1368,1369],{"class":147},"  '",[134,1371,1372],{"class":151},"declaration-no-important",[134,1374,451],{"class":147},[134,1376,158],{"class":499},[134,1378,1380],{"class":1379},"sfNiH","true",[134,1382,199],{"class":147},[134,1384,1385],{"class":140},"        \u002F\u002F no !important\n",[134,1387,1388,1390,1393,1395,1397,1399,1401],{"class":136,"line":220},[134,1389,1369],{"class":147},[134,1391,1392],{"class":151},"color-no-hex",[134,1394,451],{"class":147},[134,1396,158],{"class":499},[134,1398,1380],{"class":1379},[134,1400,199],{"class":147},[134,1402,1403],{"class":140},"                    \u002F\u002F no #635bff — only var(--brand-*)\n",[134,1405,1406,1408,1411,1413,1415,1417,1420,1422,1424],{"class":136,"line":269},[134,1407,1369],{"class":147},[134,1409,1410],{"class":151},"color-named",[134,1412,451],{"class":147},[134,1414,158],{"class":499},[134,1416,451],{"class":147},[134,1418,1419],{"class":151},"never",[134,1421,451],{"class":147},[134,1423,199],{"class":147},[134,1425,1426],{"class":140},"                  \u002F\u002F no red \u002F blue\n",[134,1428,1429],{"class":136,"line":574},[134,1430,1431],{"class":140},"  \u002F\u002F plus: z-index only via var(--z-*), durations via var(--dur-*),\n",[134,1433,1434],{"class":136,"line":619},[134,1435,1436],{"class":140},"  \u002F\u002F       spacing ≥3px via var(--space-*); classes — BEM with an app-\u002Fhealth-\u002Fbrand- prefix\n",[134,1438,1439],{"class":136,"line":664},[134,1440,272],{"class":147},[12,1442,1443,1444,1447,1448,1450],{},"hardcode ",[95,1445,1446],{},"#F26A1F"," instead of ",[95,1449,152],{}," and lint rejects it. not an abstract agreement — a refusal.",[12,1452,1453,1456],{},[42,1454,1455],{},"the audit demands the full set per component."," a script walks the folders and fails if a component is missing its story or spec:",[88,1458,1460],{"className":390,"code":1459,"language":392,"meta":97,"style":97},"\u002F\u002F the gist of packages\u002Fui\u002Fscripts\u002Faudit-components.ts\n\u002F\u002F every component folder must contain:\n\u002F\u002F   \u003CName>.vue, \u003CName>.stories.ts, \u003CName>.spec.ts, index.ts\n\u002F\u002F otherwise process.exit(1) — \"component audit failed\".\n",[95,1461,1462,1467,1472,1477],{"__ignoreMap":97},[134,1463,1464],{"class":136,"line":137},[134,1465,1466],{"class":140},"\u002F\u002F the gist of packages\u002Fui\u002Fscripts\u002Faudit-components.ts\n",[134,1468,1469],{"class":136,"line":144},[134,1470,1471],{"class":140},"\u002F\u002F every component folder must contain:\n",[134,1473,1474],{"class":136,"line":164},[134,1475,1476],{"class":140},"\u002F\u002F   \u003CName>.vue, \u003CName>.stories.ts, \u003CName>.spec.ts, index.ts\n",[134,1478,1479],{"class":136,"line":220},[134,1480,1481],{"class":140},"\u002F\u002F otherwise process.exit(1) — \"component audit failed\".\n",[12,1483,1484,1485,1488],{},"this audit actually runs in CI (the ",[95,1486,1487],{},"ui-quality"," job), so a \"component with no showcase and no test\" physically can't reach main.",[12,1490,1491,1494,1495,1498,1499,1502],{},[42,1492,1493],{},"CI catches generated-code drift."," the artifacts are committed; CI regenerates them and diffs against the tree — a mismatch fails the PR. in this repo the drift-gate currently sits on the generated API clients (",[95,1496,1497],{},"spec:codegen"," → ",[95,1500,1501],{},"git diff --exit-code","); for design tokens the same trick is the next obvious step (see \"what's next\"). for now the tokens are held by a ban on hand-editing generated files plus regenerating in place.",[12,1504,1311,1505,1508],{},[22,1506,1507],{},"rules are machine-enforced, not in a guideline",". a guideline is hope; a failing pipeline is a guarantee. and that's what turns \"the agent writes features\" from a risk into a managed process.",[28,1510,1511],{},[12,1512,1513,1514,333],{},"→ the real rules config: ",[34,1515,1518],{"href":1516,"rel":1517},"https:\u002F\u002Fgithub.com\u002Fevgentus-cy\u002Fclaude-driven-nest-nuxt-flutter-monorepo\u002Fblob\u002Fmain\u002Fstylelint.config.mjs",[38],[95,1519,1520],{},"stylelint.config.mjs",[51,1522,1524],{"id":1523},"step-5-changes-flow-one-way-only","step 5 · changes flow one way only",[12,1526,1527],{},"tie it all into a loop. any design change runs strictly top-down:",[277,1529,1530,1539,1548,1554],{},[280,1531,1532,1535,1536,333],{},[42,1533,1534],{},"edit a token"," — ",[95,1537,1538],{},"specs\u002Fdesign\u002Ftokens\u002F*.json",[280,1540,1541,1535,1544,1547],{},[42,1542,1543],{},"regenerate",[95,1545,1546],{},"pnpm design:build",". the web \u002F Storybook \u002F mobile artifacts rebuild together.",[280,1549,1550,1553],{},[42,1551,1552],{},"update or create the component"," in the library (with story and spec).",[280,1555,1556,1559],{},[42,1557,1558],{},"consume"," it in the apps — pages stay thin: data, props, routing.",[12,1561,1562,1563,1566],{},"the rule: ",[22,1564,1565],{},"never edit \"downstream\" to fix a value \"upstream\"",". if a component renders the old color, it's using a literal instead of a token; you fix the component, you don't bend the token to match. the reverse edit is a bug, not flexibility.",[51,1568,1570],{"id":1569},"the-honest-trade-offs","the honest trade-offs",[12,1572,1573],{},"the approach isn't free — and that's fine:",[316,1575,1576,1582,1588,1598,1604],{},[280,1577,1578,1581],{},[42,1579,1580],{},"regeneration is a real step, and the artifacts are committed."," forget to rebuild and you get drift. for now a ban on hand-editing generated files holds the tokens; the CI drift-gate (already covering generated clients) doesn't extend to tokens yet — see \"what's next\".",[280,1583,1584,1587],{},[42,1585,1586],{},"a token is a contract."," renaming or deleting one = a breaking change for every consumer on every platform. only deliberately (in this repo — via an ADR).",[280,1589,1590,1593,1594,1597],{},[42,1591,1592],{},"your own primitives cost more up front"," than ",[95,1595,1596],{},"install","-ing a ready kit.",[280,1599,1600,1603],{},[42,1601,1602],{},"you can't fully escape someone else's kit"," — complex widgets still ride on it, just behind a wrapper.",[280,1605,1606,1609],{},[42,1607,1608],{},"a strictness tax."," \"no magic numbers\" slows down \"just throw something together fast\".",[51,1611,1613],{"id":1612},"whats-next-what-could-be-better","what's next \u002F what could be better",[12,1615,1616,1617,1620,1621,1624],{},"one direction: every next step ",[42,1618,1619],{},"narrows the gap between intent and check",", or ",[42,1622,1623],{},"shortens the loop"," from source → product.",[316,1626,1627,1633,1642,1652,1658],{},[280,1628,1629,1632],{},[42,1630,1631],{},"close the designer↔code loop"," — pull tokens straight from the design tool through the same standard (DTCG was built for exactly this), so the source stops being hand-written JSON.",[280,1634,1635,1638,1639,1641],{},[42,1636,1637],{},"make token regeneration un-forgettable"," — a CI drift-gate (as already done for generated clients via ",[95,1640,1497],{},") that regenerates tokens and fails on a mismatch. closes trade-off #1.",[280,1643,1644,1647,1648,1651],{},[42,1645,1646],{},"token aliases"," — semantic tokens reference primitives (",[95,1649,1650],{},"{group.token}"," per DTCG), killing duplication and making rebrands even cheaper.",[280,1653,1654,1657],{},[42,1655,1656],{},"a rename codemod"," — turn the \"token = contract\" cost from manual into mechanical.",[280,1659,1660,1663],{},[42,1661,1662],{},"wider machine checks"," — a contract test for \"every role × every theme has a value\"; visual baseline snapshots per component.",[51,1665,1667],{"id":1666},"the-takeaway","the takeaway",[12,1669,1670,1671,1674],{},"the design layer here isn't a library — it's an ",[42,1672,1673],{},"invariant machine",": one neutral source, generation for any stack, and a set of linters and audits that make breaking the rules technically impossible. many design sources converge on one standard format; out of it, many targets — and the rules keep the system whole no matter who writes the code.",[12,1676,1677,1678,1682,1683,333],{},"→ see it all live: ",[34,1679,1681],{"href":36,"rel":1680},[38],"the showcase repo"," · the token-format standard — ",[34,1684,1686],{"href":114,"rel":1685},[38],"designtokens.org",[12,1688,1689],{},[22,1690,1691],{},"next in the series — the spec-first loop: how OpenAPI + codegen keep the backend and the clients from drifting apart on the contract.",[1693,1694,1695],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":97,"searchDepth":144,"depth":164,"links":1697},[1698],{"id":18,"depth":144,"text":5,"children":1699},[1700,1701,1702,1703,1704,1705,1706,1707,1708,1709],{"id":53,"depth":164,"text":54},{"id":78,"depth":164,"text":79},{"id":103,"depth":164,"text":104},{"id":372,"depth":164,"text":373},{"id":1083,"depth":164,"text":1084},{"id":1330,"depth":164,"text":1331},{"id":1523,"depth":164,"text":1524},{"id":1569,"depth":164,"text":1570},{"id":1612,"depth":164,"text":1613},{"id":1666,"depth":164,"text":1667},"2026-06-13","part 1 of the claude-driven monorepo series: how a neutral token source plus machine-checked rules make a design system's invariants impossible to break — by hand or by agent.","md","long read",{},"015","\u002Fwriting\u002F015-design-system-invariants","12 min",{"title":5,"description":1711},"015-design-system-invariants","writing\u002F015-design-system-invariants",{"label":1713,"color":1722},"var(--red)","li6gAZYMk7D4YMIXL5xq9RuYwQjuQsj2XPoV8G9pV_A",{"id":4,"title":5,"bars":6,"blurb":7,"body":1725,"color":6,"contacts":6,"date":1710,"dateModified":6,"description":1711,"extension":1712,"featured":1232,"groups":6,"kicker":1713,"meta":2995,"metrics":6,"n":1715,"navigation":1232,"openTabs":6,"path":1716,"progress":6,"readTime":1717,"reading":6,"role":6,"rules":6,"running":6,"seo":2996,"ships":6,"slug":1719,"stack":6,"started":6,"status":6,"stem":1720,"streak":6,"tag":2997,"tagColor":1722,"tagline":6,"tasks":6,"timeline":6,"topics":6,"week":6,"year":6,"__hash__":1723},{"type":9,"value":1726,"toc":2981},[1727,1729,1731,1735,1737,1748,1750,1752,1754,1762,1764,1766,1770,1775,1777,1779,1790,1902,1904,1926,1928,1948,1964,1966,1972,1974,2234,2238,2324,2326,2328,2482,2486,2502,2514,2522,2536,2538,2544,2546,2551,2555,2701,2705,2711,2715,2724,2726,2730,2734,2814,2820,2824,2844,2848,2856,2860,2869,2871,2873,2895,2899,2901,2903,2927,2929,2935,2961,2963,2967,2975,2979],[12,1728,14],{},[16,1730,5],{"id":18},[12,1732,1733],{},[22,1734,7],{},[25,1736],{},[28,1738,1739],{},[12,1740,32,1741,40,1744,45,1746,49],{},[34,1742,39],{"href":36,"rel":1743},[38],[42,1745,44],{},[42,1747,48],{},[51,1749,54],{"id":53},[12,1751,57],{},[12,1753,60],{},[28,1755,1756],{},[12,1757,1758,68,1760,72],{},[42,1759,67],{},[22,1761,71],{},[12,1763,75],{},[51,1765,79],{"id":78},[12,1767,82,1768,86],{},[42,1769,85],{},[88,1771,1773],{"className":1772,"code":92,"language":93},[91],[95,1774,92],{"__ignoreMap":97},[12,1776,100],{},[51,1778,104],{"id":103},[12,1780,107,1781,111,1783,117,1786,121,1788,125],{},[42,1782,110],{},[34,1784,116],{"href":114,"rel":1785},[38],[95,1787,120],{},[95,1789,124],{},[88,1791,1792],{"className":128,"code":129,"language":130,"meta":97,"style":97},[95,1793,1794,1798,1810,1854,1898],{"__ignoreMap":97},[134,1795,1796],{"class":136,"line":137},[134,1797,141],{"class":140},[134,1799,1800,1802,1804,1806,1808],{"class":136,"line":144},[134,1801,148],{"class":147},[134,1803,152],{"class":151},[134,1805,148],{"class":147},[134,1807,158],{"class":157},[134,1809,161],{"class":147},[134,1811,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852],{"class":136,"line":164},[134,1813,167],{"class":147},[134,1815,171],{"class":170},[134,1817,148],{"class":147},[134,1819,176],{"class":147},[134,1821,179],{"class":147},[134,1823,182],{"class":147},[134,1825,120],{"class":185},[134,1827,148],{"class":147},[134,1829,176],{"class":147},[134,1831,182],{"class":147},[134,1833,194],{"class":151},[134,1835,148],{"class":147},[134,1837,199],{"class":147},[134,1839,182],{"class":147},[134,1841,124],{"class":185},[134,1843,148],{"class":147},[134,1845,176],{"class":147},[134,1847,182],{"class":147},[134,1849,212],{"class":151},[134,1851,148],{"class":147},[134,1853,217],{"class":147},[134,1855,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896],{"class":136,"line":220},[134,1857,167],{"class":147},[134,1859,225],{"class":170},[134,1861,148],{"class":147},[134,1863,176],{"class":147},[134,1865,232],{"class":147},[134,1867,182],{"class":147},[134,1869,120],{"class":185},[134,1871,148],{"class":147},[134,1873,176],{"class":147},[134,1875,182],{"class":147},[134,1877,245],{"class":151},[134,1879,148],{"class":147},[134,1881,199],{"class":147},[134,1883,182],{"class":147},[134,1885,124],{"class":185},[134,1887,148],{"class":147},[134,1889,176],{"class":147},[134,1891,182],{"class":147},[134,1893,212],{"class":151},[134,1895,148],{"class":147},[134,1897,266],{"class":147},[134,1899,1900],{"class":136,"line":269},[134,1901,272],{"class":147},[12,1903,275],{},[277,1905,1906,1910],{},[280,1907,1908,285],{},[42,1909,284],{},[280,1911,1912,291,1914,294,1916,294,1918,301,1920,121,1922,307,1924,311],{},[42,1913,290],{},[95,1915,152],{},[95,1917,297],{},[95,1919,300],{},[95,1921,194],{},[95,1923,306],{},[95,1925,310],{},[12,1927,314],{},[316,1929,1930,1934,1940,1944],{},[280,1931,1932,323],{},[42,1933,322],{},[280,1935,1936,329,1938,333],{},[42,1937,328],{},[95,1939,332],{},[280,1941,1942,339],{},[42,1943,338],{},[280,1945,1946,345],{},[42,1947,344],{},[28,1949,1950],{},[12,1951,350,1952,358,1957,362,1959,333],{},[34,1953,1955],{"href":353,"rel":1954},[38],[95,1956,357],{},[95,1958,361],{},[34,1960,1962],{"href":365,"rel":1961},[38],[95,1963,369],{},[51,1965,373],{"id":372},[12,1967,376,1968,380,1970,384],{},[42,1969,379],{},[22,1971,383],{},[12,1973,387],{},[88,1975,1976],{"className":390,"code":391,"language":392,"meta":97,"style":97},[95,1977,1978,1982,2000,2044,2068,2110,2146,2184,2188,2208,2230],{"__ignoreMap":97},[134,1979,1980],{"class":136,"line":137},[134,1981,399],{"class":140},[134,1983,1984,1986,1988,1990,1992,1994,1996,1998],{"class":136,"line":144},[134,1985,404],{"class":170},[134,1987,408],{"class":407},[134,1989,411],{"class":147},[134,1991,415],{"class":414},[134,1993,199],{"class":147},[134,1995,420],{"class":414},[134,1997,423],{"class":147},[134,1999,426],{"class":147},[134,2001,2002,2004,2006,2008,2010,2012,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032,2034,2036,2038,2040,2042],{"class":136,"line":164},[134,2003,431],{"class":170},[134,2005,434],{"class":157},[134,2007,437],{"class":147},[134,2009,440],{"class":157},[134,2011,443],{"class":147},[134,2013,446],{"class":147},[134,2015,171],{"class":151},[134,2017,451],{"class":147},[134,2019,454],{"class":147},[134,2021,457],{"class":147},[134,2023,460],{"class":151},[134,2025,463],{"class":147},[134,2027,466],{"class":147},[134,2029,457],{"class":147},[134,2031,471],{"class":151},[134,2033,474],{"class":147},[134,2035,415],{"class":157},[134,2037,479],{"class":147},[134,2039,482],{"class":151},[134,2041,463],{"class":147},[134,2043,487],{"class":147},[134,2045,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066],{"class":136,"line":220},[134,2047,431],{"class":170},[134,2049,494],{"class":157},[134,2051,437],{"class":147},[134,2053,500],{"class":499},[134,2055,503],{"class":147},[134,2057,506],{"class":157},[134,2059,479],{"class":147},[134,2061,179],{"class":151},[134,2063,463],{"class":147},[134,2065,515],{"class":499},[134,2067,487],{"class":147},[134,2069,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104,2106,2108],{"class":136,"line":269},[134,2071,523],{"class":522},[134,2073,526],{"class":499},[134,2075,529],{"class":170},[134,2077,500],{"class":147},[134,2079,534],{"class":157},[134,2081,199],{"class":147},[134,2083,539],{"class":157},[134,2085,515],{"class":147},[134,2087,544],{"class":147},[134,2089,547],{"class":157},[134,2091,333],{"class":147},[134,2093,552],{"class":407},[134,2095,411],{"class":499},[134,2097,557],{"class":157},[134,2099,333],{"class":147},[134,2101,212],{"class":157},[134,2103,333],{"class":147},[134,2105,566],{"class":157},[134,2107,569],{"class":499},[134,2109,161],{"class":147},[134,2111,2112,2114,2116,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144],{"class":136,"line":574},[134,2113,577],{"class":170},[134,2115,580],{"class":157},[134,2117,437],{"class":147},[134,2119,526],{"class":499},[134,2121,587],{"class":157},[134,2123,590],{"class":499},[134,2125,415],{"class":157},[134,2127,595],{"class":499},[134,2129,598],{"class":147},[134,2131,539],{"class":157},[134,2133,333],{"class":147},[134,2135,171],{"class":157},[134,2137,423],{"class":499},[134,2139,333],{"class":147},[134,2141,120],{"class":157},[134,2143,613],{"class":147},[134,2145,616],{"class":140},[134,2147,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182],{"class":136,"line":619},[134,2149,622],{"class":157},[134,2151,333],{"class":147},[134,2153,627],{"class":407},[134,2155,411],{"class":499},[134,2157,463],{"class":147},[134,2159,634],{"class":151},[134,2161,474],{"class":147},[134,2163,639],{"class":407},[134,2165,642],{"class":157},[134,2167,479],{"class":147},[134,2169,158],{"class":151},[134,2171,474],{"class":147},[134,2173,651],{"class":157},[134,2175,479],{"class":147},[134,2177,613],{"class":151},[134,2179,463],{"class":147},[134,2181,423],{"class":499},[134,2183,487],{"class":147},[134,2185,2186],{"class":136,"line":664},[134,2187,667],{"class":147},[134,2189,2190,2192,2194,2196,2198,2200,2202,2204,2206],{"class":136,"line":670},[134,2191,673],{"class":157},[134,2193,333],{"class":147},[134,2195,627],{"class":407},[134,2197,411],{"class":499},[134,2199,451],{"class":147},[134,2201,479],{"class":151},[134,2203,451],{"class":147},[134,2205,423],{"class":499},[134,2207,487],{"class":147},[134,2209,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228],{"class":136,"line":692},[134,2211,695],{"class":522},[134,2213,494],{"class":157},[134,2215,333],{"class":147},[134,2217,702],{"class":407},[134,2219,411],{"class":499},[134,2221,451],{"class":147},[134,2223,709],{"class":157},[134,2225,451],{"class":147},[134,2227,423],{"class":499},[134,2229,487],{"class":147},[134,2231,2232],{"class":136,"line":718},[134,2233,272],{"class":147},[12,2235,723,2236,727],{},[95,2237,726],{},[88,2239,2240],{"className":730,"code":731,"language":732,"meta":97,"style":97},[95,2241,2242,2250,2268,2280,2284,2300,2308,2320],{"__ignoreMap":97},[134,2243,2244,2246,2248],{"class":136,"line":137},[134,2245,176],{"class":147},[134,2247,741],{"class":170},[134,2249,744],{"class":147},[134,2251,2252,2254,2256,2258,2260,2262,2264,2266],{"class":136,"line":144},[134,2253,590],{"class":147},[134,2255,751],{"class":170},[134,2257,754],{"class":147},[134,2259,451],{"class":147},[134,2261,171],{"class":151},[134,2263,451],{"class":147},[134,2265,515],{"class":147},[134,2267,426],{"class":147},[134,2269,2270,2272,2274,2276,2278],{"class":136,"line":164},[134,2271,769],{"class":157},[134,2273,176],{"class":147},[134,2275,774],{"class":147},[134,2277,777],{"class":157},[134,2279,487],{"class":147},[134,2281,2282],{"class":136,"line":220},[134,2283,272],{"class":147},[134,2285,2286,2288,2290,2292,2294,2296,2298],{"class":136,"line":269},[134,2287,590],{"class":147},[134,2289,751],{"class":170},[134,2291,754],{"class":147},[134,2293,451],{"class":147},[134,2295,225],{"class":151},[134,2297,451],{"class":147},[134,2299,800],{"class":147},[134,2301,2302,2304,2306],{"class":136,"line":574},[134,2303,333],{"class":147},[134,2305,225],{"class":185},[134,2307,426],{"class":147},[134,2309,2310,2312,2314,2316,2318],{"class":136,"line":619},[134,2311,769],{"class":157},[134,2313,176],{"class":147},[134,2315,774],{"class":147},[134,2317,819],{"class":157},[134,2319,487],{"class":147},[134,2321,2322],{"class":136,"line":664},[134,2323,272],{"class":147},[12,2325,828],{},[12,2327,831],{},[88,2329,2330],{"className":390,"code":834,"language":392,"meta":97,"style":97},[95,2331,2332,2336,2346,2372,2398,2424,2450,2476],{"__ignoreMap":97},[134,2333,2334],{"class":136,"line":137},[134,2335,841],{"class":140},[134,2337,2338,2340,2342,2344],{"class":136,"line":144},[134,2339,529],{"class":170},[134,2341,848],{"class":157},[134,2343,754],{"class":147},[134,2345,853],{"class":157},[134,2347,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370],{"class":136,"line":164},[134,2349,232],{"class":147},[134,2351,860],{"class":499},[134,2353,176],{"class":147},[134,2355,446],{"class":147},[134,2357,867],{"class":151},[134,2359,451],{"class":147},[134,2361,199],{"class":147},[134,2363,874],{"class":499},[134,2365,176],{"class":147},[134,2367,879],{"class":407},[134,2369,882],{"class":157},[134,2371,885],{"class":147},[134,2373,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392,2394,2396],{"class":136,"line":220},[134,2375,232],{"class":147},[134,2377,860],{"class":499},[134,2379,176],{"class":147},[134,2381,446],{"class":147},[134,2383,898],{"class":151},[134,2385,451],{"class":147},[134,2387,199],{"class":147},[134,2389,874],{"class":499},[134,2391,176],{"class":147},[134,2393,879],{"class":407},[134,2395,882],{"class":157},[134,2397,885],{"class":147},[134,2399,2400,2402,2404,2406,2408,2410,2412,2414,2416,2418,2420,2422],{"class":136,"line":269},[134,2401,232],{"class":147},[134,2403,860],{"class":499},[134,2405,176],{"class":147},[134,2407,446],{"class":147},[134,2409,925],{"class":151},[134,2411,451],{"class":147},[134,2413,199],{"class":147},[134,2415,874],{"class":499},[134,2417,176],{"class":147},[134,2419,936],{"class":407},[134,2421,882],{"class":157},[134,2423,885],{"class":147},[134,2425,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448],{"class":136,"line":574},[134,2427,232],{"class":147},[134,2429,860],{"class":499},[134,2431,176],{"class":147},[134,2433,446],{"class":147},[134,2435,953],{"class":151},[134,2437,451],{"class":147},[134,2439,199],{"class":147},[134,2441,874],{"class":499},[134,2443,176],{"class":147},[134,2445,936],{"class":407},[134,2447,882],{"class":157},[134,2449,885],{"class":147},[134,2451,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474],{"class":136,"line":619},[134,2453,232],{"class":147},[134,2455,860],{"class":499},[134,2457,176],{"class":147},[134,2459,446],{"class":147},[134,2461,980],{"class":151},[134,2463,451],{"class":147},[134,2465,199],{"class":147},[134,2467,874],{"class":499},[134,2469,176],{"class":147},[134,2471,991],{"class":407},[134,2473,882],{"class":157},[134,2475,885],{"class":147},[134,2477,2478,2480],{"class":136,"line":664},[134,2479,515],{"class":157},[134,2481,487],{"class":147},[12,2483,1004,2484,1008],{},[42,2485,1007],{},[88,2487,2488],{"className":730,"code":1011,"language":732,"meta":97,"style":97},[95,2489,2490,2494],{"__ignoreMap":97},[134,2491,2492],{"class":136,"line":137},[134,2493,1018],{"class":140},[134,2495,2496,2498,2500],{"class":136,"line":144},[134,2497,1023],{"class":157},[134,2499,1026],{"class":147},[134,2501,1029],{"class":157},[88,2503,2504],{"className":1032,"code":1033,"language":1034,"meta":97,"style":97},[95,2505,2506,2510],{"__ignoreMap":97},[134,2507,2508],{"class":136,"line":137},[134,2509,1041],{},[134,2511,2512],{"class":136,"line":144},[134,2513,1046],{},[12,2515,1049,2516,1053,2518,1057,2520,333],{},[22,2517,1052],{},[42,2519,1056],{},[22,2521,1060],{},[28,2523,2524],{},[12,2525,1065,2526,1073,2531,333],{},[34,2527,2529],{"href":1068,"rel":2528},[38],[95,2530,1072],{},[34,2532,2534],{"href":1076,"rel":2533},[38],[95,2535,1080],{},[51,2537,1084],{"id":1083},[12,2539,1087,2540,1091,2542,1095],{},[22,2541,1090],{},[42,2543,1094],{},[12,2545,1098],{},[88,2547,2549],{"className":2548,"code":1102,"language":93},[91],[95,2550,1102],{"__ignoreMap":97},[12,2552,1107,2553,1111],{},[95,2554,1110],{},[88,2556,2557],{"className":1114,"code":1115,"language":1116,"meta":97,"style":97},[95,2558,2559,2567,2581,2597,2611,2625,2649,2653,2661,2665,2679,2693,2697],{"__ignoreMap":97},[134,2560,2561,2563,2565],{"class":136,"line":137},[134,2562,333],{"class":147},[134,2564,1125],{"class":185},[134,2566,426],{"class":147},[134,2568,2569,2571,2573,2575,2577,2579],{"class":136,"line":144},[134,2570,1133],{"class":1132},[134,2572,176],{"class":147},[134,2574,1138],{"class":407},[134,2576,411],{"class":147},[134,2578,1143],{"class":157},[134,2580,1146],{"class":147},[134,2582,2583,2585,2587,2589,2591,2593,2595],{"class":136,"line":164},[134,2584,1151],{"class":1132},[134,2586,176],{"class":147},[134,2588,1157],{"class":1156},[134,2590,1138],{"class":407},[134,2592,411],{"class":147},[134,2594,1164],{"class":157},[134,2596,1146],{"class":147},[134,2598,2599,2601,2603,2605,2607,2609],{"class":136,"line":220},[134,2600,1171],{"class":1132},[134,2602,176],{"class":147},[134,2604,1138],{"class":407},[134,2606,411],{"class":147},[134,2608,1180],{"class":157},[134,2610,1146],{"class":147},[134,2612,2613,2615,2617,2619,2621,2623],{"class":136,"line":269},[134,2614,1187],{"class":1132},[134,2616,176],{"class":147},[134,2618,1138],{"class":407},[134,2620,411],{"class":147},[134,2622,1196],{"class":157},[134,2624,1146],{"class":147},[134,2626,2627,2629,2631,2633,2635,2637,2639,2641,2643,2645,2647],{"class":136,"line":574},[134,2628,1203],{"class":1132},[134,2630,176],{"class":147},[134,2632,1208],{"class":157},[134,2634,1211],{"class":407},[134,2636,411],{"class":147},[134,2638,1216],{"class":157},[134,2640,423],{"class":147},[134,2642,1138],{"class":407},[134,2644,411],{"class":147},[134,2646,1225],{"class":157},[134,2648,1146],{"class":147},[134,2650,2651],{"class":136,"line":619},[134,2652,1233],{"emptyLinePlaceholder":1232},[134,2654,2655,2657,2659],{"class":136,"line":664},[134,2656,1238],{"class":185},[134,2658,1241],{"class":157},[134,2660,161],{"class":147},[134,2662,2663],{"class":136,"line":670},[134,2664,1248],{"class":140},[134,2666,2667,2669,2671,2673,2675,2677],{"class":136,"line":692},[134,2668,1253],{"class":1132},[134,2670,176],{"class":147},[134,2672,1138],{"class":407},[134,2674,411],{"class":147},[134,2676,1262],{"class":157},[134,2678,1146],{"class":147},[134,2680,2681,2683,2685,2687,2689,2691],{"class":136,"line":718},[134,2682,1269],{"class":1132},[134,2684,176],{"class":147},[134,2686,1138],{"class":407},[134,2688,411],{"class":147},[134,2690,1278],{"class":157},[134,2692,1146],{"class":147},[134,2694,2695],{"class":136,"line":1283},[134,2696,667],{"class":147},[134,2698,2699],{"class":136,"line":1288},[134,2700,272],{"class":147},[12,2702,1293,2703,1297],{},[95,2704,1296],{},[12,2706,1300,2707,1304,2709,1308],{},[42,2708,1303],{},[22,2710,1307],{},[12,2712,1311,2713,1315],{},[22,2714,1314],{},[28,2716,2717],{},[12,2718,1320,2719,333],{},[34,2720,2722],{"href":1323,"rel":2721},[38],[95,2723,1327],{},[51,2725,1331],{"id":1330},[12,2727,1334,2728,333],{},[42,2729,1337],{},[12,2731,2732,1343],{},[42,2733,1342],{},[88,2735,2736],{"className":1346,"code":1347,"language":1348,"meta":97,"style":97},[95,2737,2738,2742,2750,2766,2782,2802,2806,2810],{"__ignoreMap":97},[134,2739,2740],{"class":136,"line":137},[134,2741,1355],{"class":140},[134,2743,2744,2746,2748],{"class":136,"line":144},[134,2745,1360],{"class":185},[134,2747,176],{"class":147},[134,2749,426],{"class":147},[134,2751,2752,2754,2756,2758,2760,2762,2764],{"class":136,"line":164},[134,2753,1369],{"class":147},[134,2755,1372],{"class":151},[134,2757,451],{"class":147},[134,2759,158],{"class":499},[134,2761,1380],{"class":1379},[134,2763,199],{"class":147},[134,2765,1385],{"class":140},[134,2767,2768,2770,2772,2774,2776,2778,2780],{"class":136,"line":220},[134,2769,1369],{"class":147},[134,2771,1392],{"class":151},[134,2773,451],{"class":147},[134,2775,158],{"class":499},[134,2777,1380],{"class":1379},[134,2779,199],{"class":147},[134,2781,1403],{"class":140},[134,2783,2784,2786,2788,2790,2792,2794,2796,2798,2800],{"class":136,"line":269},[134,2785,1369],{"class":147},[134,2787,1410],{"class":151},[134,2789,451],{"class":147},[134,2791,158],{"class":499},[134,2793,451],{"class":147},[134,2795,1419],{"class":151},[134,2797,451],{"class":147},[134,2799,199],{"class":147},[134,2801,1426],{"class":140},[134,2803,2804],{"class":136,"line":574},[134,2805,1431],{"class":140},[134,2807,2808],{"class":136,"line":619},[134,2809,1436],{"class":140},[134,2811,2812],{"class":136,"line":664},[134,2813,272],{"class":147},[12,2815,1443,2816,1447,2818,1450],{},[95,2817,1446],{},[95,2819,152],{},[12,2821,2822,1456],{},[42,2823,1455],{},[88,2825,2826],{"className":390,"code":1459,"language":392,"meta":97,"style":97},[95,2827,2828,2832,2836,2840],{"__ignoreMap":97},[134,2829,2830],{"class":136,"line":137},[134,2831,1466],{"class":140},[134,2833,2834],{"class":136,"line":144},[134,2835,1471],{"class":140},[134,2837,2838],{"class":136,"line":164},[134,2839,1476],{"class":140},[134,2841,2842],{"class":136,"line":220},[134,2843,1481],{"class":140},[12,2845,1484,2846,1488],{},[95,2847,1487],{},[12,2849,2850,1494,2852,1498,2854,1502],{},[42,2851,1493],{},[95,2853,1497],{},[95,2855,1501],{},[12,2857,1311,2858,1508],{},[22,2859,1507],{},[28,2861,2862],{},[12,2863,1513,2864,333],{},[34,2865,2867],{"href":1516,"rel":2866},[38],[95,2868,1520],{},[51,2870,1524],{"id":1523},[12,2872,1527],{},[277,2874,2875,2881,2887,2891],{},[280,2876,2877,1535,2879,333],{},[42,2878,1534],{},[95,2880,1538],{},[280,2882,2883,1535,2885,1547],{},[42,2884,1543],{},[95,2886,1546],{},[280,2888,2889,1553],{},[42,2890,1552],{},[280,2892,2893,1559],{},[42,2894,1558],{},[12,2896,1562,2897,1566],{},[22,2898,1565],{},[51,2900,1570],{"id":1569},[12,2902,1573],{},[316,2904,2905,2909,2913,2919,2923],{},[280,2906,2907,1581],{},[42,2908,1580],{},[280,2910,2911,1587],{},[42,2912,1586],{},[280,2914,2915,1593,2917,1597],{},[42,2916,1592],{},[95,2918,1596],{},[280,2920,2921,1603],{},[42,2922,1602],{},[280,2924,2925,1609],{},[42,2926,1608],{},[51,2928,1613],{"id":1612},[12,2930,1616,2931,1620,2933,1624],{},[42,2932,1619],{},[42,2934,1623],{},[316,2936,2937,2941,2947,2953,2957],{},[280,2938,2939,1632],{},[42,2940,1631],{},[280,2942,2943,1638,2945,1641],{},[42,2944,1637],{},[95,2946,1497],{},[280,2948,2949,1647,2951,1651],{},[42,2950,1646],{},[95,2952,1650],{},[280,2954,2955,1657],{},[42,2956,1656],{},[280,2958,2959,1663],{},[42,2960,1662],{},[51,2962,1667],{"id":1666},[12,2964,1670,2965,1674],{},[42,2966,1673],{},[12,2968,1677,2969,1682,2972,333],{},[34,2970,1681],{"href":36,"rel":2971},[38],[34,2973,1686],{"href":114,"rel":2974},[38],[12,2976,2977],{},[22,2978,1691],{},[1693,2980,1695],{},{"title":97,"searchDepth":144,"depth":164,"links":2982},[2983],{"id":18,"depth":144,"text":5,"children":2984},[2985,2986,2987,2988,2989,2990,2991,2992,2993,2994],{"id":53,"depth":164,"text":54},{"id":78,"depth":164,"text":79},{"id":103,"depth":164,"text":104},{"id":372,"depth":164,"text":373},{"id":1083,"depth":164,"text":1084},{"id":1330,"depth":164,"text":1331},{"id":1523,"depth":164,"text":1524},{"id":1569,"depth":164,"text":1570},{"id":1612,"depth":164,"text":1613},{"id":1666,"depth":164,"text":1667},{},{"title":5,"description":1711},{"label":1713,"color":1722},1781358081751]