[{"data":1,"prerenderedAt":2268},["ShallowReactive",2],{"cycle-doc-design-c130-research\u002Fgpui.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":22},{"id":5,"title":6},"c130","Native App (program)",{"id":8,"label":9},"design","Design","research\u002Fgpui.md","GPUI: Zed's framework",[13,14,15,16,17,18,19,20,21],"What GPUI is","The programming model","The renderer","The platform layer","Text rendering","What \"native\" means here (D2)","Where to learn GPUI","Open questions","Sources",{"type":23,"children":24},"root",[25,48,54,243,248,258,613,827,832,919,924,943,1491,1509,1514,1658,1663,1668,1758,1763,1825,1830,1981,1986,2023,2028],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30,37,39,46],{"type":26,"tag":31,"props":32,"children":33},"strong",{},[34],{"type":35,"value":36},"text","Use this file to",{"type":35,"value":38}," understand the engine under GPUI Kit before you read the kit's docs: how state, views and elements fit together, what the GPU renderer does and does not do, what each OS gives the app, and what \"native\" means for the screens we will draw (D2). A builder reads the programming model and the platform layer; a designer reads the renderer, text and \"native\" sections. Companion: ",{"type":26,"tag":40,"props":41,"children":43},"a",{"href":42},"\u002Fcycles\u002Fdesign\u002Fc130\u002Fdoc\u002Fresearch\u002Fgpui-kit",[44],{"type":35,"value":45},"gpui-kit.md",{"type":35,"value":47},". Every source below was read on 2026-11-09.",{"type":26,"tag":49,"props":50,"children":52},"h2",{"id":51},"what-gpui-is",[53],{"type":35,"value":13},{"type":26,"tag":55,"props":56,"children":57},"ul",{},[58,138,163,174,226],{"type":26,"tag":59,"props":60,"children":61},"li",{},[62,64,71,73,79,81,87,88,94,95,101,102,108,109,115,116,122,124,131,132],{"type":35,"value":63},"\"A fast, hybrid immediate and retained mode, GPU-accelerated UI framework for Rust\", from the makers of Zed. It lives inside the Zed monorepo at ",{"type":26,"tag":65,"props":66,"children":68},"code",{"className":67},[],[69],{"type":35,"value":70},"crates\u002Fgpui",{"type":35,"value":72},", and since February 2026 the platform code is split into ",{"type":26,"tag":65,"props":74,"children":76},{"className":75},[],[77],{"type":35,"value":78},"gpui_platform",{"type":35,"value":80},", ",{"type":26,"tag":65,"props":82,"children":84},{"className":83},[],[85],{"type":35,"value":86},"gpui_macos",{"type":35,"value":80},{"type":26,"tag":65,"props":89,"children":91},{"className":90},[],[92],{"type":35,"value":93},"gpui_windows",{"type":35,"value":80},{"type":26,"tag":65,"props":96,"children":98},{"className":97},[],[99],{"type":35,"value":100},"gpui_linux",{"type":35,"value":80},{"type":26,"tag":65,"props":103,"children":105},{"className":104},[],[106],{"type":35,"value":107},"gpui_wgpu",{"type":35,"value":80},{"type":26,"tag":65,"props":110,"children":112},{"className":111},[],[113],{"type":35,"value":114},"gpui_web",{"type":35,"value":80},{"type":26,"tag":65,"props":117,"children":119},{"className":118},[],[120],{"type":35,"value":121},"gpui_ios",{"type":35,"value":123},". — ",{"type":26,"tag":40,"props":125,"children":129},{"href":126,"rel":127},"https:\u002F\u002Fwww.gpui.rs\u002F",[128],"nofollow",[130],{"type":35,"value":126},{"type":35,"value":80},{"type":26,"tag":40,"props":133,"children":136},{"href":134,"rel":135},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fpull\u002F49277",[128],[137],{"type":35,"value":134},{"type":26,"tag":59,"props":139,"children":140},{},[141,143,149,150,156,157],{"type":35,"value":142},"Pre-1.0 and honest about it: \"There will often be breaking changes between versions.\" Zed itself reached 1.0 on 2026-04-29 (latest 1.27.0, 2026-11-04) on Mac, Windows and Linux. — ",{"type":26,"tag":40,"props":144,"children":147},{"href":145,"rel":146},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002FREADME.md",[128],[148],{"type":35,"value":145},{"type":35,"value":80},{"type":26,"tag":40,"props":151,"children":154},{"href":152,"rel":153},"https:\u002F\u002Fzed.dev\u002Fblog\u002Fzed-1-0",[128],[155],{"type":35,"value":152},{"type":35,"value":80},{"type":26,"tag":40,"props":158,"children":161},{"href":159,"rel":160},"https:\u002F\u002Fzed.dev\u002Freleases\u002Fstable",[128],[162],{"type":35,"value":159},{"type":26,"tag":59,"props":164,"children":165},{},[166,168],{"type":35,"value":167},"Licence Apache-2.0. — ",{"type":26,"tag":40,"props":169,"children":172},{"href":170,"rel":171},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002FCargo.toml",[128],[173],{"type":35,"value":170},{"type":26,"tag":59,"props":175,"children":176},{},[177,182,184,190,192,198,200,204,206,211,213,219,220],{"type":26,"tag":31,"props":178,"children":179},{},[180],{"type":35,"value":181},"Two version lines.",{"type":35,"value":183}," crates.io ",{"type":26,"tag":65,"props":185,"children":187},{"className":186},[],[188],{"type":35,"value":189},"gpui",{"type":35,"value":191}," stopped at 0.2.2 on 2025-10-22. Everyone outside Zed uses Longbridge's weekly snapshot family ",{"type":26,"tag":65,"props":193,"children":195},{"className":194},[],[196],{"type":35,"value":197},"gpui-pre",{"type":35,"value":199}," (\"snapshot of zed@d2a4fb6\"), 0.3.0 on 2026-09-03 through 0.3.12 on 2026-11-09, published by the kit's author. The kit pins it exactly (see ",{"type":26,"tag":40,"props":201,"children":202},{"href":42},[203],{"type":35,"value":45},{"type":35,"value":205},"). An agent reading docs.rs for ",{"type":26,"tag":65,"props":207,"children":209},{"className":208},[],[210],{"type":35,"value":189},{"type":35,"value":212}," reads an API a year behind. — ",{"type":26,"tag":40,"props":214,"children":217},{"href":215,"rel":216},"https:\u002F\u002Fcrates.io\u002Fapi\u002Fv1\u002Fcrates\u002Fgpui",[128],[218],{"type":35,"value":215},{"type":35,"value":80},{"type":26,"tag":40,"props":221,"children":224},{"href":222,"rel":223},"https:\u002F\u002Fcrates.io\u002Fapi\u002Fv1\u002Fcrates\u002Fgpui-pre",[128],[225],{"type":35,"value":222},{"type":26,"tag":59,"props":227,"children":228},{},[229,231,236,237],{"type":35,"value":230},"On use outside Zed: \"For the near future, GPUI is tied to Zed\"; contributions go to the Zed repo. Zed's blog nonetheless counts \"A growing number of projects… building with the gpui\u002Fgpui-component combination\" and names Longbridge's Electron-to-GPUI rewrite. — ",{"type":26,"tag":40,"props":232,"children":234},{"href":126,"rel":233},[128],[235],{"type":35,"value":126},{"type":35,"value":80},{"type":26,"tag":40,"props":238,"children":241},{"href":239,"rel":240},"https:\u002F\u002Fzed.dev\u002Fblog\u002Fcommunity-champion-jason-lee",[128],[242],{"type":35,"value":239},{"type":26,"tag":49,"props":244,"children":246},{"id":245},"the-programming-model",[247],{"type":35,"value":14},{"type":26,"tag":27,"props":249,"children":250},{},[251,253],{"type":35,"value":252},"Three \"registers\", in the README's words. — ",{"type":26,"tag":40,"props":254,"children":256},{"href":145,"rel":255},[128],[257],{"type":35,"value":145},{"type":26,"tag":259,"props":260,"children":261},"table",{},[262,286],{"type":26,"tag":263,"props":264,"children":265},"thead",{},[266],{"type":26,"tag":267,"props":268,"children":269},"tr",{},[270,276,281],{"type":26,"tag":271,"props":272,"children":273},"th",{},[274],{"type":35,"value":275},"Register",{"type":26,"tag":271,"props":277,"children":278},{},[279],{"type":35,"value":280},"What it is",{"type":26,"tag":271,"props":282,"children":283},{},[284],{"type":35,"value":285},"What a builder does",{"type":26,"tag":287,"props":288,"children":289},"tbody",{},[290,395,547],{"type":26,"tag":267,"props":291,"children":292},{},[293,302,346],{"type":26,"tag":294,"props":295,"children":296},"td",{},[297],{"type":26,"tag":31,"props":298,"children":299},{},[300],{"type":35,"value":301},"State: entities",{"type":26,"tag":294,"props":303,"children":304},{},[305,307,313,315,321,323,329,331,337,339,344],{"type":35,"value":306},"Every model and view is owned by one top-level ",{"type":26,"tag":65,"props":308,"children":310},{"className":309},[],[311],{"type":35,"value":312},"App",{"type":35,"value":314},"; ",{"type":26,"tag":65,"props":316,"children":318},{"className":317},[],[319],{"type":35,"value":320},"cx.new(...)",{"type":35,"value":322}," returns an ",{"type":26,"tag":65,"props":324,"children":326},{"className":325},[],[327],{"type":35,"value":328},"Entity\u003CT>",{"type":35,"value":330},", \"an inert identifier plus a compile-time type tag\". ",{"type":26,"tag":65,"props":332,"children":334},{"className":333},[],[335],{"type":35,"value":336},"Context\u003CT>",{"type":35,"value":338}," is the ",{"type":26,"tag":65,"props":340,"children":342},{"className":341},[],[343],{"type":35,"value":312},{"type":35,"value":345}," seen from one entity.",{"type":26,"tag":294,"props":347,"children":348},{},[349,351,357,359,365,366,372,374,380,381,387,389],{"type":35,"value":350},"Keep state in entities; ",{"type":26,"tag":65,"props":352,"children":354},{"className":353},[],[355],{"type":35,"value":356},"update",{"type":35,"value":358}," \u002F ",{"type":26,"tag":65,"props":360,"children":362},{"className":361},[],[363],{"type":35,"value":364},"read",{"type":35,"value":314},{"type":26,"tag":65,"props":367,"children":369},{"className":368},[],[370],{"type":35,"value":371},"cx.notify()",{"type":35,"value":373}," tells observers; ",{"type":26,"tag":65,"props":375,"children":377},{"className":376},[],[378],{"type":35,"value":379},"emit",{"type":35,"value":358},{"type":26,"tag":65,"props":382,"children":384},{"className":383},[],[385],{"type":35,"value":386},"subscribe",{"type":35,"value":388}," for events. Effects flush at the end of each update, so there is no re-entrancy. — ",{"type":26,"tag":40,"props":390,"children":393},{"href":391,"rel":392},"https:\u002F\u002Fzed.dev\u002Fblog\u002Fgpui-ownership",[128],[394],{"type":35,"value":391},{"type":26,"tag":267,"props":396,"children":397},{},[398,406,435],{"type":26,"tag":294,"props":399,"children":400},{},[401],{"type":26,"tag":31,"props":402,"children":403},{},[404],{"type":35,"value":405},"Declarative UI: views",{"type":26,"tag":294,"props":407,"children":408},{},[409,411,417,419,425,427,433],{"type":35,"value":410},"\"A view is simply an ",{"type":26,"tag":65,"props":412,"children":414},{"className":413},[],[415],{"type":35,"value":416},"Entity",{"type":35,"value":418}," that can be rendered, by implementing the ",{"type":26,"tag":65,"props":420,"children":422},{"className":421},[],[423],{"type":35,"value":424},"Render",{"type":35,"value":426}," trait.\" ",{"type":26,"tag":65,"props":428,"children":430},{"className":429},[],[431],{"type":35,"value":432},"render(&mut self, window, cx) -> impl IntoElement",{"type":35,"value":434}," builds a fresh element tree each pass.",{"type":26,"tag":294,"props":436,"children":437},{},[438,440,446,448,454,456,462,463,469,470,476,477,483,484,490,491,497,498,504,505,511,512,518,519,525,526,532,533,539,541],{"type":35,"value":439},"Compose ",{"type":26,"tag":65,"props":441,"children":443},{"className":442},[],[444],{"type":35,"value":445},"div()",{"type":35,"value":447}," trees with the Tailwind-named ",{"type":26,"tag":65,"props":449,"children":451},{"className":450},[],[452],{"type":35,"value":453},"Styled",{"type":35,"value":455}," methods: ",{"type":26,"tag":65,"props":457,"children":459},{"className":458},[],[460],{"type":35,"value":461},"flex()",{"type":35,"value":80},{"type":26,"tag":65,"props":464,"children":466},{"className":465},[],[467],{"type":35,"value":468},"flex_col()",{"type":35,"value":80},{"type":26,"tag":65,"props":471,"children":473},{"className":472},[],[474],{"type":35,"value":475},"gap_2()",{"type":35,"value":80},{"type":26,"tag":65,"props":478,"children":480},{"className":479},[],[481],{"type":35,"value":482},"p_4()",{"type":35,"value":80},{"type":26,"tag":65,"props":485,"children":487},{"className":486},[],[488],{"type":35,"value":489},"w_64()",{"type":35,"value":80},{"type":26,"tag":65,"props":492,"children":494},{"className":493},[],[495],{"type":35,"value":496},"bg(...)",{"type":35,"value":80},{"type":26,"tag":65,"props":499,"children":501},{"className":500},[],[502],{"type":35,"value":503},"text_color(...)",{"type":35,"value":80},{"type":26,"tag":65,"props":506,"children":508},{"className":507},[],[509],{"type":35,"value":510},"border_1()",{"type":35,"value":80},{"type":26,"tag":65,"props":513,"children":515},{"className":514},[],[516],{"type":35,"value":517},"rounded(...)",{"type":35,"value":80},{"type":26,"tag":65,"props":520,"children":522},{"className":521},[],[523],{"type":35,"value":524},"text_sm()",{"type":35,"value":80},{"type":26,"tag":65,"props":527,"children":529},{"className":528},[],[530],{"type":35,"value":531},".when(cond, ...)",{"type":35,"value":80},{"type":26,"tag":65,"props":534,"children":536},{"className":535},[],[537],{"type":35,"value":538},"hover(...)",{"type":35,"value":540},". Sizes are rem-based. — ",{"type":26,"tag":40,"props":542,"children":545},{"href":543,"rel":544},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Fstyle",[128],[546],{"type":35,"value":543},{"type":26,"tag":267,"props":548,"children":549},{},[550,558,594],{"type":26,"tag":294,"props":551,"children":552},{},[553],{"type":26,"tag":31,"props":554,"children":555},{},[556],{"type":35,"value":557},"Imperative UI: elements",{"type":26,"tag":294,"props":559,"children":560},{},[561,563,569,571,577,579,585,586,592],{"type":35,"value":562},"An ",{"type":26,"tag":65,"props":564,"children":566},{"className":565},[],[567],{"type":35,"value":568},"Element",{"type":35,"value":570}," is one node in the tree GPUI builds for a frame, with three phases: ",{"type":26,"tag":65,"props":572,"children":574},{"className":573},[],[575],{"type":35,"value":576},"request_layout",{"type":35,"value":578}," → ",{"type":26,"tag":65,"props":580,"children":582},{"className":581},[],[583],{"type":35,"value":584},"prepaint",{"type":35,"value":578},{"type":26,"tag":65,"props":587,"children":589},{"className":588},[],[590],{"type":35,"value":591},"paint",{"type":35,"value":593},". Taffy (flexbox and grid) resolves bounds between the first two.",{"type":26,"tag":294,"props":595,"children":596},{},[597,599,605,607],{"type":35,"value":598},"Write a custom element only when nothing composes; ",{"type":26,"tag":65,"props":600,"children":602},{"className":601},[],[603],{"type":35,"value":604},"canvas(prepaint, paint)",{"type":35,"value":606}," for short-lived drawing. — ",{"type":26,"tag":40,"props":608,"children":611},{"href":609,"rel":610},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Felement",[128],[612],{"type":35,"value":609},{"type":26,"tag":55,"props":614,"children":615},{},[616,655,707,746],{"type":26,"tag":59,"props":617,"children":618},{},[619,624,626,632,634,640,642,647,649],{"type":26,"tag":31,"props":620,"children":621},{},[622],{"type":35,"value":623},"Hybrid, in practice.",{"type":35,"value":625}," \"Retained\" describes the entity state and the caches; \"immediate-style\" describes how ",{"type":26,"tag":65,"props":627,"children":629},{"className":628},[],[630],{"type":35,"value":631},"render",{"type":35,"value":633}," rebuilds the description each time it is needed. ",{"type":26,"tag":65,"props":635,"children":637},{"className":636},[],[638],{"type":35,"value":639},"RenderOnce",{"type":35,"value":641}," \"does ",{"type":26,"tag":31,"props":643,"children":644},{},[645],{"type":35,"value":646},"not",{"type":35,"value":648}," mean once per display frame.\" — ",{"type":26,"tag":40,"props":650,"children":653},{"href":651,"rel":652},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Ffps",[128],[654],{"type":35,"value":651},{"type":26,"tag":59,"props":656,"children":657},{},[658,663,665,670,672,678,680,686,688,693,695,701,702],{"type":26,"tag":31,"props":659,"children":660},{},[661],{"type":35,"value":662},"Redraw on demand.",{"type":35,"value":664}," \"An Entity mutation followed by ",{"type":26,"tag":65,"props":666,"children":668},{"className":667},[],[669],{"type":35,"value":371},{"type":35,"value":671}," marks that Entity for rendering… A frame tick alone does not redraw an unchanged window.\" An unconditional ",{"type":26,"tag":65,"props":673,"children":675},{"className":674},[],[676],{"type":35,"value":677},"notify()",{"type":35,"value":679}," or ",{"type":26,"tag":65,"props":681,"children":683},{"className":682},[],[684],{"type":35,"value":685},"request_animation_frame()",{"type":35,"value":687}," inside ",{"type":26,"tag":65,"props":689,"children":691},{"className":690},[],[692],{"type":35,"value":631},{"type":35,"value":694}," \"creates continuous work even when the UI is idle.\" This is the rule that keeps an idle app at zero CPU. — ",{"type":26,"tag":40,"props":696,"children":699},{"href":697,"rel":698},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Fwindow",[128],[700],{"type":35,"value":697},{"type":35,"value":80},{"type":26,"tag":40,"props":703,"children":705},{"href":651,"rel":704},[128],[706],{"type":35,"value":651},{"type":26,"tag":59,"props":708,"children":709},{},[710,715,717,723,725,731,733,739,740],{"type":26,"tag":31,"props":711,"children":712},{},[713],{"type":35,"value":714},"Actions and keys.",{"type":35,"value":716}," ",{"type":26,"tag":65,"props":718,"children":720},{"className":719},[],[721],{"type":35,"value":722},"actions!(ns, [Name])",{"type":35,"value":724}," defines unit actions; ",{"type":26,"tag":65,"props":726,"children":728},{"className":727},[],[729],{"type":35,"value":730},"KeyBinding::new(\"cmd-s\", Save, Some(\"Editor\"))",{"type":35,"value":732}," binds them (static strings since gpui-pre 0.3.10); dispatch follows the focus path; the same action drives a button, a palette entry and a native menu item. — ",{"type":26,"tag":40,"props":734,"children":737},{"href":735,"rel":736},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Faction",[128],[738],{"type":35,"value":735},{"type":35,"value":80},{"type":26,"tag":40,"props":741,"children":744},{"href":742,"rel":743},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Fkeybinding",[128],[745],{"type":35,"value":742},{"type":26,"tag":59,"props":747,"children":748},{},[749,754,755,761,762,768,770,776,777,783,784,790,791,797,799,805,806,812,813,819,821],{"type":26,"tag":31,"props":750,"children":751},{},[752],{"type":35,"value":753},"Testing built in.",{"type":35,"value":716},{"type":26,"tag":65,"props":756,"children":758},{"className":757},[],[759],{"type":35,"value":760},"#[gpui::test]",{"type":35,"value":80},{"type":26,"tag":65,"props":763,"children":765},{"className":764},[],[766],{"type":35,"value":767},"TestAppContext",{"type":35,"value":769}," (",{"type":26,"tag":65,"props":771,"children":773},{"className":772},[],[774],{"type":35,"value":775},"add_window",{"type":35,"value":80},{"type":26,"tag":65,"props":778,"children":780},{"className":779},[],[781],{"type":35,"value":782},"dispatch_action",{"type":35,"value":80},{"type":26,"tag":65,"props":785,"children":787},{"className":786},[],[788],{"type":35,"value":789},"simulate_keystrokes",{"type":35,"value":80},{"type":26,"tag":65,"props":792,"children":794},{"className":793},[],[795],{"type":35,"value":796},"run_until_parked",{"type":35,"value":798},") and ",{"type":26,"tag":65,"props":800,"children":802},{"className":801},[],[803],{"type":35,"value":804},"VisualTestContext",{"type":35,"value":769},{"type":26,"tag":65,"props":807,"children":809},{"className":808},[],[810],{"type":35,"value":811},"simulate_click",{"type":35,"value":80},{"type":26,"tag":65,"props":814,"children":816},{"className":815},[],[817],{"type":35,"value":818},"draw",{"type":35,"value":820},"). The kit wraps these as headless UI tests. — ",{"type":26,"tag":40,"props":822,"children":825},{"href":823,"rel":824},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002Fsrc\u002Fapp\u002Ftest_context.rs",[128],[826],{"type":35,"value":823},{"type":26,"tag":49,"props":828,"children":830},{"id":829},"the-renderer",[831],{"type":35,"value":15},{"type":26,"tag":55,"props":833,"children":834},{},[835,865,888,903],{"type":26,"tag":59,"props":836,"children":837},{},[838,843,845,851,852,858,859],{"type":26,"tag":31,"props":839,"children":840},{},[841],{"type":35,"value":842},"GPU on every OS, a different API each.",{"type":35,"value":844}," macOS and iOS: Metal. Windows: Direct3D 11 with DirectComposition. Linux: wgpu (Vulkan or GLES), which replaced blade in February 2026; \"A headless shell or Vulkan loader without a driver is insufficient.\" Web: wgpu over WebGPU, then WebGL2. — ",{"type":26,"tag":40,"props":846,"children":849},{"href":847,"rel":848},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fpull\u002F46758",[128],[850],{"type":35,"value":847},{"type":35,"value":80},{"type":26,"tag":40,"props":853,"children":856},{"href":854,"rel":855},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Finstallation",[128],[857],{"type":35,"value":854},{"type":35,"value":80},{"type":26,"tag":40,"props":860,"children":863},{"href":861,"rel":862},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui_wgpu\u002FCargo.toml",[128],[864],{"type":35,"value":861},{"type":26,"tag":59,"props":866,"children":867},{},[868,873,875,881,882],{"type":26,"tag":31,"props":869,"children":870},{},[871],{"type":35,"value":872},"Everything is a primitive.",{"type":35,"value":874}," Shadows, quads, paths, underlines, monochrome sprites (glyphs, SVG icons as tintable alpha masks), polychrome sprites (images), surfaces. Rounded rectangles come from a signed-distance function in the fragment shader; glyphs are cached in an atlas on the GPU with 4 horizontal subpixel variants; one instanced draw call per primitive type per layer. — ",{"type":26,"tag":40,"props":876,"children":879},{"href":877,"rel":878},"https:\u002F\u002Fzed.dev\u002Fblog\u002Fvideogame",[128],[880],{"type":35,"value":877},{"type":35,"value":80},{"type":26,"tag":40,"props":883,"children":886},{"href":884,"rel":885},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002Fsrc\u002Fscene.rs",[128],[887],{"type":35,"value":884},{"type":26,"tag":59,"props":889,"children":890},{},[891,896,898],{"type":26,"tag":31,"props":892,"children":893},{},[894],{"type":35,"value":895},"120 Hz is a budget, not a promise",{"type":35,"value":897},": about 8.3 ms per frame; several invalidations collapse into one draw. — ",{"type":26,"tag":40,"props":899,"children":901},{"href":651,"rel":900},[128],[902],{"type":35,"value":651},{"type":26,"tag":59,"props":904,"children":905},{},[906,911,913],{"type":26,"tag":31,"props":907,"children":908},{},[909],{"type":35,"value":910},"GPUI Fast",{"type":35,"value":912}," is Longbridge's fork with a retained mode that \"reuses unchanged views, layout nodes and text measurements\"; its own bench puts a spinner at 11 % of a core against upstream's 85 %. \"The project remains experimental.\" The kit offers it as an optional feature. — ",{"type":26,"tag":40,"props":914,"children":917},{"href":915,"rel":916},"https:\u002F\u002Fraw.githubusercontent.com\u002Flongbridge\u002Fgpui-fast\u002Fmain\u002FREADME.md",[128],[918],{"type":35,"value":915},{"type":26,"tag":49,"props":920,"children":922},{"id":921},"the-platform-layer",[923],{"type":35,"value":16},{"type":26,"tag":27,"props":925,"children":926},{},[927,929,935,937],{"type":35,"value":928},"One crate per OS; ",{"type":26,"tag":65,"props":930,"children":932},{"className":931},[],[933],{"type":35,"value":934},"gpui_platform::application()",{"type":35,"value":936}," \"picks the windowing and text backends for the host OS\". — ",{"type":26,"tag":40,"props":938,"children":941},{"href":939,"rel":940},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui_platform\u002Fsrc\u002Fgpui_platform.rs",[128],[942],{"type":35,"value":939},{"type":26,"tag":259,"props":944,"children":945},{},[946,967],{"type":26,"tag":263,"props":947,"children":948},{},[949],{"type":26,"tag":267,"props":950,"children":951},{},[952,957,962],{"type":26,"tag":271,"props":953,"children":954},{},[955],{"type":35,"value":956},"The OS gives",{"type":26,"tag":271,"props":958,"children":959},{},[960],{"type":35,"value":961},"Through",{"type":26,"tag":271,"props":963,"children":964},{},[965],{"type":35,"value":966},"Notes",{"type":26,"tag":287,"props":968,"children":969},{},[970,1096,1167,1219,1246,1290,1354,1392,1449],{"type":26,"tag":267,"props":971,"children":972},{},[973,978,1029],{"type":26,"tag":294,"props":974,"children":975},{},[976],{"type":35,"value":977},"The window",{"type":26,"tag":294,"props":979,"children":980},{},[981,987,989,995,997,1003,1005,1011,1013,1019,1021,1027],{"type":26,"tag":65,"props":982,"children":984},{"className":983},[],[985],{"type":35,"value":986},"WindowOptions",{"type":35,"value":988},": bounds, ",{"type":26,"tag":65,"props":990,"children":992},{"className":991},[],[993],{"type":35,"value":994},"titlebar",{"type":35,"value":996}," (hidden for a custom-drawn one on macOS and Windows), ",{"type":26,"tag":65,"props":998,"children":1000},{"className":999},[],[1001],{"type":35,"value":1002},"kind",{"type":35,"value":1004}," (Normal, PopUp, Floating, Dialog, LayerShell), ",{"type":26,"tag":65,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":35,"value":1010},"window_background",{"type":35,"value":1012}," (Opaque, Transparent, Blurred, Mica), ",{"type":26,"tag":65,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":35,"value":1018},"window_decorations",{"type":35,"value":1020}," (Server or Client on Linux), ",{"type":26,"tag":65,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":35,"value":1026},"app_id",{"type":35,"value":1028},", min size",{"type":26,"tag":294,"props":1030,"children":1031},{},[1032,1034,1040,1041,1047,1048,1054,1055,1061,1062,1068,1069,1075,1076,1082,1083,1089,1090],{"type":35,"value":1033},"Methods: ",{"type":26,"tag":65,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":35,"value":1039},"set_window_title",{"type":35,"value":80},{"type":26,"tag":65,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":35,"value":1046},"zoom_window",{"type":35,"value":80},{"type":26,"tag":65,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":35,"value":1053},"minimize_window",{"type":35,"value":80},{"type":26,"tag":65,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":35,"value":1060},"toggle_fullscreen",{"type":35,"value":80},{"type":26,"tag":65,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":35,"value":1067},"set_window_edited",{"type":35,"value":80},{"type":26,"tag":65,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":35,"value":1074},"appearance()",{"type":35,"value":80},{"type":26,"tag":65,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":35,"value":1081},"observe_window_appearance",{"type":35,"value":80},{"type":26,"tag":65,"props":1084,"children":1086},{"className":1085},[],[1087],{"type":35,"value":1088},"set_rem_size",{"type":35,"value":123},{"type":26,"tag":40,"props":1091,"children":1094},{"href":1092,"rel":1093},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002Fsrc\u002Fplatform.rs",[128],[1095],{"type":35,"value":1092},{"type":26,"tag":267,"props":1097,"children":1098},{},[1099,1104,1156],{"type":26,"tag":294,"props":1100,"children":1101},{},[1102],{"type":35,"value":1103},"Menus",{"type":26,"tag":294,"props":1105,"children":1106},{},[1107,1113,1114,1120,1121,1127,1128,1134,1136,1142,1143,1149,1150],{"type":26,"tag":65,"props":1108,"children":1110},{"className":1109},[],[1111],{"type":35,"value":1112},"App::set_menus",{"type":35,"value":80},{"type":26,"tag":65,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":35,"value":1119},"set_dock_menu",{"type":35,"value":80},{"type":26,"tag":65,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":35,"value":1126},"add_recent_document",{"type":35,"value":80},{"type":26,"tag":65,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":35,"value":1133},"update_jump_list",{"type":35,"value":1135}," (Windows); ",{"type":26,"tag":65,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":35,"value":1141},"Menu",{"type":35,"value":80},{"type":26,"tag":65,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":35,"value":1148},"MenuItem::{Separator, Submenu, SystemMenu, Action}",{"type":35,"value":80},{"type":26,"tag":65,"props":1151,"children":1153},{"className":1152},[],[1154],{"type":35,"value":1155},"OsAction::{Cut, Copy, Paste, SelectAll, Undo, Redo}",{"type":26,"tag":294,"props":1157,"children":1158},{},[1159,1161],{"type":35,"value":1160},"The macOS menu bar is native. Windows and Linux have no global menu bar; the kit draws one. — ",{"type":26,"tag":40,"props":1162,"children":1165},{"href":1163,"rel":1164},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002Fsrc\u002Fplatform\u002Fapp_menu.rs",[128],[1166],{"type":35,"value":1163},{"type":26,"tag":267,"props":1168,"children":1169},{},[1170,1175,1208],{"type":26,"tag":294,"props":1171,"children":1172},{},[1173],{"type":35,"value":1174},"Dialogs",{"type":26,"tag":294,"props":1176,"children":1177},{},[1178,1184,1185,1191,1193,1199,1200,1206],{"type":26,"tag":65,"props":1179,"children":1181},{"className":1180},[],[1182],{"type":35,"value":1183},"prompt_for_paths",{"type":35,"value":80},{"type":26,"tag":65,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":35,"value":1190},"prompt_for_new_path",{"type":35,"value":1192},"; native alerts via ",{"type":26,"tag":65,"props":1194,"children":1196},{"className":1195},[],[1197],{"type":35,"value":1198},"Window::prompt(PromptLevel, …)",{"type":35,"value":314},{"type":26,"tag":65,"props":1201,"children":1203},{"className":1202},[],[1204],{"type":35,"value":1205},"set_prompt_builder",{"type":35,"value":1207}," to replace them",{"type":26,"tag":294,"props":1209,"children":1210},{},[1211,1213],{"type":35,"value":1212},"— ",{"type":26,"tag":40,"props":1214,"children":1217},{"href":1215,"rel":1216},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002Fsrc\u002Fapp.rs",[128],[1218],{"type":35,"value":1215},{"type":26,"tag":267,"props":1220,"children":1221},{},[1222,1227,1243],{"type":26,"tag":294,"props":1223,"children":1224},{},[1225],{"type":35,"value":1226},"Clipboard",{"type":26,"tag":294,"props":1228,"children":1229},{},[1230,1236,1237],{"type":26,"tag":65,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":35,"value":1235},"read_from_clipboard",{"type":35,"value":80},{"type":26,"tag":65,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":35,"value":1242},"write_to_clipboard",{"type":26,"tag":294,"props":1244,"children":1245},{},[],{"type":26,"tag":267,"props":1247,"children":1248},{},[1249,1254,1277],{"type":26,"tag":294,"props":1250,"children":1251},{},[1252],{"type":35,"value":1253},"URLs",{"type":26,"tag":294,"props":1255,"children":1256},{},[1257,1263,1264,1270,1271],{"type":26,"tag":65,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":35,"value":1262},"Application::on_open_urls",{"type":35,"value":80},{"type":26,"tag":65,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":35,"value":1269},"App::open_url",{"type":35,"value":80},{"type":26,"tag":65,"props":1272,"children":1274},{"className":1273},[],[1275],{"type":35,"value":1276},"App::register_url_scheme(scheme)",{"type":26,"tag":294,"props":1278,"children":1279},{},[1280,1282,1288],{"type":35,"value":1281},"The hooks for a deep link in the Connect flow (",{"type":26,"tag":40,"props":1283,"children":1285},{"href":1284},"\u002Fcycles\u002Fdesign\u002Fc130\u002Fdoc\u002Fresearch\u002Fplatform",[1286],{"type":35,"value":1287},"platform.md",{"type":35,"value":1289},").",{"type":26,"tag":267,"props":1291,"children":1292},{},[1293,1298,1335],{"type":26,"tag":294,"props":1294,"children":1295},{},[1296],{"type":35,"value":1297},"Notifications",{"type":26,"tag":294,"props":1299,"children":1300},{},[1301,1307,1308,1313,1315,1321,1322,1327,1329],{"type":26,"tag":65,"props":1302,"children":1304},{"className":1303},[],[1305],{"type":35,"value":1306},"show_system_notification(SystemNotification { tag, title, body, actions })",{"type":35,"value":314},{"type":26,"tag":65,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":35,"value":86},{"type":35,"value":1314}," links ",{"type":26,"tag":65,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":35,"value":1320},"objc2-user-notifications",{"type":35,"value":80},{"type":26,"tag":65,"props":1323,"children":1325},{"className":1324},[],[1326],{"type":35,"value":100},{"type":35,"value":1328}," uses ",{"type":26,"tag":65,"props":1330,"children":1332},{"className":1331},[],[1333],{"type":35,"value":1334},"notify-rust",{"type":26,"tag":294,"props":1336,"children":1337},{},[1338,1340,1346,1348],{"type":35,"value":1339},"macOS requires a real signed ",{"type":26,"tag":65,"props":1341,"children":1343},{"className":1342},[],[1344],{"type":35,"value":1345},".app",{"type":35,"value":1347}," bundle; Linux needs a session D-Bus and a notification daemon. — ",{"type":26,"tag":40,"props":1349,"children":1352},{"href":1350,"rel":1351},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Fsystem-notification",[128],[1353],{"type":35,"value":1350},{"type":26,"tag":267,"props":1355,"children":1356},{},[1357,1362,1387],{"type":26,"tag":294,"props":1358,"children":1359},{},[1360],{"type":35,"value":1361},"Credentials",{"type":26,"tag":294,"props":1363,"children":1364},{},[1365,1371,1372,1378,1379,1385],{"type":26,"tag":65,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":35,"value":1370},"write_credentials",{"type":35,"value":358},{"type":26,"tag":65,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":35,"value":1377},"read_credentials",{"type":35,"value":358},{"type":26,"tag":65,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":35,"value":1384},"delete_credentials",{"type":35,"value":1386},", keychain-backed",{"type":26,"tag":294,"props":1388,"children":1389},{},[1390],{"type":35,"value":1391},"A home for the plane's connect token.",{"type":26,"tag":267,"props":1393,"children":1394},{},[1395,1400,1446],{"type":26,"tag":294,"props":1396,"children":1397},{},[1398],{"type":35,"value":1399},"Other",{"type":26,"tag":294,"props":1401,"children":1402},{},[1403,1409,1410,1416,1417,1423,1424,1430,1431,1437,1438,1444],{"type":26,"tag":65,"props":1404,"children":1406},{"className":1405},[],[1407],{"type":35,"value":1408},"reveal_path",{"type":35,"value":80},{"type":26,"tag":65,"props":1411,"children":1413},{"className":1412},[],[1414],{"type":35,"value":1415},"open_with_system",{"type":35,"value":80},{"type":26,"tag":65,"props":1418,"children":1420},{"className":1419},[],[1421],{"type":35,"value":1422},"on_quit",{"type":35,"value":80},{"type":26,"tag":65,"props":1425,"children":1427},{"className":1426},[],[1428],{"type":35,"value":1429},"on_reopen",{"type":35,"value":80},{"type":26,"tag":65,"props":1432,"children":1434},{"className":1433},[],[1435],{"type":35,"value":1436},"activate",{"type":35,"value":80},{"type":26,"tag":65,"props":1439,"children":1441},{"className":1440},[],[1442],{"type":35,"value":1443},"hide",{"type":35,"value":1445},", displays, keyboard layout, screen capture (feature)",{"type":26,"tag":294,"props":1447,"children":1448},{},[],{"type":26,"tag":267,"props":1450,"children":1451},{},[1452,1460,1473],{"type":26,"tag":294,"props":1453,"children":1454},{},[1455],{"type":26,"tag":31,"props":1456,"children":1457},{},[1458],{"type":35,"value":1459},"Not a tray",{"type":26,"tag":294,"props":1461,"children":1462},{},[1463,1465,1471],{"type":35,"value":1464},"No tray or status-item API exists in GPUI. A 2024 PR to add Linux tray icons was closed unmerged. A third-party crate ",{"type":26,"tag":65,"props":1466,"children":1468},{"className":1467},[],[1469],{"type":35,"value":1470},"gpui-tray",{"type":35,"value":1472}," 0.3.0 exists (5 stars).",{"type":26,"tag":294,"props":1474,"children":1475},{},[1476,1478,1484,1485],{"type":35,"value":1477},"The spike's first platform question. — ",{"type":26,"tag":40,"props":1479,"children":1482},{"href":1480,"rel":1481},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fpull\u002F13098",[128],[1483],{"type":35,"value":1480},{"type":35,"value":80},{"type":26,"tag":40,"props":1486,"children":1489},{"href":1487,"rel":1488},"https:\u002F\u002Fcrates.io\u002Fapi\u002Fv1\u002Fcrates\u002Fgpui-tray",[128],[1490],{"type":35,"value":1487},{"type":26,"tag":27,"props":1492,"children":1493},{},[1494,1496,1502,1503],{"type":35,"value":1495},"Windows has been a supported Zed platform since 2025-10-15 (\"Windows is now a fully supported platform for Zed\"); Linux since 2024-07-10. — ",{"type":26,"tag":40,"props":1497,"children":1500},{"href":1498,"rel":1499},"https:\u002F\u002Fzed.dev\u002Fblog\u002Fzed-for-windows-is-here",[128],[1501],{"type":35,"value":1498},{"type":35,"value":80},{"type":26,"tag":40,"props":1504,"children":1507},{"href":1505,"rel":1506},"https:\u002F\u002Fzed.dev\u002Fblog\u002Fzed-on-linux",[128],[1508],{"type":35,"value":1505},{"type":26,"tag":49,"props":1510,"children":1512},{"id":1511},"text-rendering",[1513],{"type":35,"value":17},{"type":26,"tag":55,"props":1515,"children":1516},{},[1517,1569,1608,1645],{"type":26,"tag":59,"props":1518,"children":1519},{},[1520,1525,1527,1533,1535,1540,1542,1548,1550,1556,1558,1563,1564],{"type":26,"tag":31,"props":1521,"children":1522},{},[1523],{"type":35,"value":1524},"The OS shapes and rasterises on macOS and Windows; cosmic-text does on Linux and the web.",{"type":35,"value":1526}," macOS: CoreText through ",{"type":26,"tag":65,"props":1528,"children":1530},{"className":1529},[],[1531],{"type":35,"value":1532},"font-kit",{"type":35,"value":1534}," (without the ",{"type":26,"tag":65,"props":1536,"children":1538},{"className":1537},[],[1539],{"type":35,"value":1532},{"type":35,"value":1541}," feature \"GPUI falls back to a placeholder text system that lays text out but renders no glyphs\"). Windows: DirectWrite. Linux and wasm: ",{"type":26,"tag":65,"props":1543,"children":1545},{"className":1544},[],[1546],{"type":35,"value":1547},"cosmic-text",{"type":35,"value":1549}," 0.19 with ",{"type":26,"tag":65,"props":1551,"children":1553},{"className":1552},[],[1554],{"type":35,"value":1555},"swash",{"type":35,"value":1557},", fontconfig for discovery. — ",{"type":26,"tag":40,"props":1559,"children":1561},{"href":145,"rel":1560},[128],[1562],{"type":35,"value":145},{"type":35,"value":80},{"type":26,"tag":40,"props":1565,"children":1567},{"href":861,"rel":1566},[128],[1568],{"type":35,"value":861},{"type":26,"tag":59,"props":1570,"children":1571},{},[1572,1577,1578,1584,1586,1592,1594,1600,1602],{"type":26,"tag":31,"props":1573,"children":1574},{},[1575],{"type":35,"value":1576},"Bundling a font:",{"type":35,"value":716},{"type":26,"tag":65,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":35,"value":1583},"Application::with_assets(...)",{"type":35,"value":1585}," then ",{"type":26,"tag":65,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":35,"value":1591},"cx.text_system().add_fonts(vec![include_bytes!(\"Inter.ttf\").into()])",{"type":35,"value":1593}," at startup; set the family on the theme. ",{"type":26,"tag":65,"props":1595,"children":1597},{"className":1596},[],[1598],{"type":35,"value":1599},".SystemUIFont",{"type":35,"value":1601}," is the alias for the platform UI font. — ",{"type":26,"tag":40,"props":1603,"children":1606},{"href":1604,"rel":1605},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Ffonts",[128],[1607],{"type":35,"value":1604},{"type":26,"tag":59,"props":1609,"children":1610},{},[1611,1616,1618,1623,1625,1630,1632,1638,1639],{"type":26,"tag":31,"props":1612,"children":1613},{},[1614],{"type":35,"value":1615},"Emoji",{"type":35,"value":1617}," render in colour; COLRv1 fixes were still landing in November 2026. ",{"type":26,"tag":31,"props":1619,"children":1620},{},[1621],{"type":35,"value":1622},"RTL and bidi are unsupported",{"type":35,"value":1624},": every RTL PR found was closed unmerged or is still open. ",{"type":26,"tag":31,"props":1626,"children":1627},{},[1628],{"type":35,"value":1629},"CJK",{"type":35,"value":1631}," resolves against the OS font collection on desktop; on the web a font must be embedded. — ",{"type":26,"tag":40,"props":1633,"children":1636},{"href":1634,"rel":1635},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fissues\u002F31102",[128],[1637],{"type":35,"value":1634},{"type":35,"value":80},{"type":26,"tag":40,"props":1640,"children":1643},{"href":1641,"rel":1642},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Ftext-system",[128],[1644],{"type":35,"value":1641},{"type":26,"tag":59,"props":1646,"children":1647},{},[1648,1650,1656],{"type":35,"value":1649},"Hinting and gamma policy per OS is not documented beyond a ",{"type":26,"tag":65,"props":1651,"children":1653},{"className":1652},[],[1654],{"type":35,"value":1655},"TextRenderingMode { PlatformDefault, Subpixel, Grayscale }",{"type":35,"value":1657}," enum. Expect text to look slightly different on each OS; the spike should capture the same screen on all three.",{"type":26,"tag":49,"props":1659,"children":1661},{"id":1660},"what-native-means-here-d2",[1662],{"type":35,"value":18},{"type":26,"tag":27,"props":1664,"children":1665},{},[1666],{"type":35,"value":1667},"GPUI draws every control itself, on the GPU, the way Flutter does. There is no NSButton, no Win32 edit control, no GTK widget behind a kit button. The operating system provides the window and its chrome, the menu bar (macOS), dialogs, the clipboard, notifications, the keychain and URL handling; the app provides the pixels inside the window.",{"type":26,"tag":55,"props":1669,"children":1670},{},[1671,1687,1706,1724],{"type":26,"tag":59,"props":1672,"children":1673},{},[1674,1676,1681,1682],{"type":35,"value":1675},"Zed's own words: \"Zed isn't an Electron app; we integrate directly with the underlying platform for maximal control\", and the editor is organised \"around feeding data to shaders running on the GPU.\" — ",{"type":26,"tag":40,"props":1677,"children":1679},{"href":1498,"rel":1678},[128],[1680],{"type":35,"value":1498},{"type":35,"value":80},{"type":26,"tag":40,"props":1683,"children":1685},{"href":152,"rel":1684},[128],[1686],{"type":35,"value":152},{"type":26,"tag":59,"props":1688,"children":1689},{},[1690,1692,1698,1700],{"type":35,"value":1691},"GPUI's caveat on its web-like API: \"while GPUI mimics web APIs, it doesn't necessarily behave ",{"type":26,"tag":1693,"props":1694,"children":1695},"em",{},[1696],{"type":35,"value":1697},"exactly",{"type":35,"value":1699}," as a web browser would\". — ",{"type":26,"tag":40,"props":1701,"children":1704},{"href":1702,"rel":1703},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002Fsrc\u002F_accessibility.rs",[128],[1705],{"type":35,"value":1702},{"type":26,"tag":59,"props":1707,"children":1708},{},[1709,1711,1717,1718],{"type":35,"value":1710},"The kit's framing: \"Modern controls inspired by macOS and Windows\"; \"Respect platform differences that carry meaning: Command versus Control, native window decorations, system appearance, scrollbar behavior, menus, and notification capabilities.\" — ",{"type":26,"tag":40,"props":1712,"children":1715},{"href":1713,"rel":1714},"https:\u002F\u002Fgithub.com\u002Flongbridge\u002Fgpui-kit",[128],[1716],{"type":35,"value":1713},{"type":35,"value":80},{"type":26,"tag":40,"props":1719,"children":1722},{"href":1720,"rel":1721},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Fdesign-guides",[128],[1723],{"type":35,"value":1720},{"type":26,"tag":59,"props":1725,"children":1726},{},[1727,1729,1735,1736,1742,1744,1750,1752],{"type":35,"value":1728},"Where the kit does reach for OS-drawn parts: ",{"type":26,"tag":65,"props":1730,"children":1732},{"className":1731},[],[1733],{"type":35,"value":1734},"NativeMenu",{"type":35,"value":1328},{"type":26,"tag":65,"props":1737,"children":1739},{"className":1738},[],[1740],{"type":35,"value":1741},"NSMenu",{"type":35,"value":1743}," on macOS and ",{"type":26,"tag":65,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":35,"value":1749},"TrackPopupMenuEx",{"type":35,"value":1751}," on Windows, and falls back to a GPUI-drawn menu on Linux. — ",{"type":26,"tag":40,"props":1753,"children":1756},{"href":1754,"rel":1755},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Fnative-extension",[128],[1757],{"type":35,"value":1754},{"type":26,"tag":27,"props":1759,"children":1760},{},[1761],{"type":35,"value":1762},"What follows for us:",{"type":26,"tag":1764,"props":1765,"children":1766},"ol",{},[1767,1777,1815],{"type":26,"tag":59,"props":1768,"children":1769},{},[1770,1775],{"type":26,"tag":31,"props":1771,"children":1772},{},[1773],{"type":35,"value":1774},"Stakeholders should expect a native binary and a native window, not OS-drawn buttons.",{"type":35,"value":1776}," Say so in the pitch. The upside is that the same screen looks the same on three OSes and every pixel can carry the brand (D5 keeps that subtle).",{"type":26,"tag":59,"props":1778,"children":1779},{},[1780,1785,1787,1793,1795,1801,1802,1808,1809],{"type":26,"tag":31,"props":1781,"children":1782},{},[1783],{"type":35,"value":1784},"Accessibility is published, not inherited.",{"type":35,"value":1786}," A custom-drawn control has no semantics unless the app reports them. GPUI publishes an AccessKit tree since 2026-05-27; a node is reported only when it has an ",{"type":26,"tag":65,"props":1788,"children":1790},{"className":1789},[],[1791],{"type":35,"value":1792},"ElementId",{"type":35,"value":1794}," and a role. Zed keeps it off by default and \"doesn't support screen readers\" today by a maintainer's own words. The kit reports roles on its components and tests them headlessly, but no screen-reader run is reported by anyone. Treat screen-reader usability as unproven and check it on each OS in c131 (D10 there). — ",{"type":26,"tag":40,"props":1796,"children":1799},{"href":1797,"rel":1798},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fpull\u002F56065",[128],[1800],{"type":35,"value":1797},{"type":35,"value":80},{"type":26,"tag":40,"props":1803,"children":1806},{"href":1804,"rel":1805},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fissues\u002F41138",[128],[1807],{"type":35,"value":1804},{"type":35,"value":80},{"type":26,"tag":40,"props":1810,"children":1813},{"href":1811,"rel":1812},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Faccessibility",[128],[1814],{"type":35,"value":1811},{"type":26,"tag":59,"props":1816,"children":1817},{},[1818,1823],{"type":26,"tag":31,"props":1819,"children":1820},{},[1821],{"type":35,"value":1822},"Platform conventions still matter.",{"type":35,"value":1824}," Command vs Control, the menu bar on macOS, window controls on Linux, system light\u002Fdark: the kit's design guide lists these as the places where \"native\" is earned.",{"type":26,"tag":49,"props":1826,"children":1828},{"id":1827},"where-to-learn-gpui",[1829],{"type":35,"value":19},{"type":26,"tag":55,"props":1831,"children":1832},{},[1833,1929,1940,1945,1968],{"type":26,"tag":59,"props":1834,"children":1835},{},[1836,1838,1844,1845,1851,1853,1859,1860,1866,1867,1873,1874,1880,1881,1887,1888,1894,1895,1901,1902,1908,1909,1915,1917,1922,1923],{"type":35,"value":1837},"The README (\"Intro to GPUI\"), ",{"type":26,"tag":65,"props":1839,"children":1841},{"className":1840},[],[1842],{"type":35,"value":1843},"docs\u002Fcontexts.md",{"type":35,"value":80},{"type":26,"tag":65,"props":1846,"children":1848},{"className":1847},[],[1849],{"type":35,"value":1850},"docs\u002Fkey_dispatch.md",{"type":35,"value":1852},", the module docs on ownership and on accessibility, and 46 examples (",{"type":26,"tag":65,"props":1854,"children":1856},{"className":1855},[],[1857],{"type":35,"value":1858},"hello_world",{"type":35,"value":80},{"type":26,"tag":65,"props":1861,"children":1863},{"className":1862},[],[1864],{"type":35,"value":1865},"data_table",{"type":35,"value":80},{"type":26,"tag":65,"props":1868,"children":1870},{"className":1869},[],[1871],{"type":35,"value":1872},"uniform_list",{"type":35,"value":80},{"type":26,"tag":65,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":35,"value":1879},"set_menus",{"type":35,"value":80},{"type":26,"tag":65,"props":1882,"children":1884},{"className":1883},[],[1885],{"type":35,"value":1886},"system_notifications",{"type":35,"value":80},{"type":26,"tag":65,"props":1889,"children":1891},{"className":1890},[],[1892],{"type":35,"value":1893},"a11y",{"type":35,"value":80},{"type":26,"tag":65,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":35,"value":1900},"testing",{"type":35,"value":80},{"type":26,"tag":65,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":35,"value":1907},"drag_drop",{"type":35,"value":80},{"type":26,"tag":65,"props":1910,"children":1912},{"className":1911},[],[1913],{"type":35,"value":1914},"window_positioning",{"type":35,"value":1916},"). — ",{"type":26,"tag":40,"props":1918,"children":1920},{"href":126,"rel":1919},[128],[1921],{"type":35,"value":126},{"type":35,"value":80},{"type":26,"tag":40,"props":1924,"children":1927},{"href":1925,"rel":1926},"https:\u002F\u002Fapi.github.com\u002Frepos\u002Fzed-industries\u002Fzed\u002Fcontents\u002Fcrates\u002Fgpui\u002Fexamples",[128],[1928],{"type":35,"value":1925},{"type":26,"tag":59,"props":1930,"children":1931},{},[1932,1934],{"type":35,"value":1933},"Zed's posts, in reading order: \"Leveraging Rust and the GPU to render user interfaces at 120 FPS\" (2023-03-07), \"Ownership and data flow in GPUI\" (2024-01-25, updated 2025-12-12), \"Optimizing the Metal pipeline to maintain 120 FPS\" (2024-02-07). — ",{"type":26,"tag":40,"props":1935,"children":1938},{"href":1936,"rel":1937},"https:\u002F\u002Fzed.dev\u002Fblog",[128],[1939],{"type":35,"value":1936},{"type":26,"tag":59,"props":1941,"children":1942},{},[1943],{"type":35,"value":1944},"The README's own advice: \"the best way to learn about these APIs is to read the Zed source code or drop a question in the Zed Discord\".",{"type":26,"tag":59,"props":1946,"children":1947},{},[1948,1953,1955,1961,1962],{"type":26,"tag":31,"props":1949,"children":1950},{},[1951],{"type":35,"value":1952},"The most complete GPUI manual today is GPUI Kit's docs",{"type":35,"value":1954},", written against the snapshot the kit pins: Entity, Context, Render, Element, Window, Style, Action, KeyBinding, Focus, Task, Fonts, Animation, Accessibility, Testing, WebAssembly, FPS. — ",{"type":26,"tag":40,"props":1956,"children":1959},{"href":1957,"rel":1958},"https:\u002F\u002Fgpui-kit.com\u002Fdocs",[128],[1960],{"type":35,"value":1957},{"type":35,"value":80},{"type":26,"tag":40,"props":1963,"children":1966},{"href":1964,"rel":1965},"https:\u002F\u002Fgpui-kit.com\u002Fllms-full.txt",[128],[1967],{"type":35,"value":1964},{"type":26,"tag":59,"props":1969,"children":1970},{},[1971,1973,1979],{"type":35,"value":1972},"Community books exist (an \"Unofficial GPUI Cheat Book\", two ",{"type":26,"tag":65,"props":1974,"children":1976},{"className":1975},[],[1977],{"type":35,"value":1978},"gpui-book",{"type":35,"value":1980},"s); their currency is unverified.",{"type":26,"tag":49,"props":1982,"children":1984},{"id":1983},"open-questions",[1985],{"type":35,"value":20},{"type":26,"tag":1764,"props":1987,"children":1988},{},[1989,2008,2013,2018],{"type":26,"tag":59,"props":1990,"children":1991},{},[1992,1994,1999,2001,2006],{"type":35,"value":1993},"Will Zed publish ",{"type":26,"tag":65,"props":1995,"children":1997},{"className":1996},[],[1998],{"type":35,"value":189},{"type":35,"value":2000}," to crates.io again, or is Longbridge's weekly ",{"type":26,"tag":65,"props":2002,"children":2004},{"className":2003},[],[2005],{"type":35,"value":197},{"type":35,"value":2007}," the distribution for everyone else? Nothing from Zed says.",{"type":26,"tag":59,"props":2009,"children":2010},{},[2011],{"type":35,"value":2012},"Is any GPUI app usable with VoiceOver, NVDA or Orca today?",{"type":26,"tag":59,"props":2014,"children":2015},{},[2016],{"type":35,"value":2017},"RTL: no timeline.",{"type":26,"tag":59,"props":2019,"children":2020},{},[2021],{"type":35,"value":2022},"Hinting and subpixel policy per OS, and how the same text differs across them.",{"type":26,"tag":49,"props":2024,"children":2026},{"id":2025},"sources",[2027],{"type":35,"value":21},{"type":26,"tag":27,"props":2029,"children":2030},{},[2031,2036,2038,2043,2044,2049,2050,2055,2056,2062,2063,2068,2069,2074,2075,2080,2081,2086,2087,2093,2094,2099,2100,2105,2106,2111,2112,2117,2118,2123,2124,2129,2130,2135,2136,2141,2142,2147,2148,2153,2155,2161,2162,2168,2169,2175,2176,2182,2183,2189,2190,2196,2197,2203,2204,2210,2211,2217,2218,2224,2225,2230,2231,2236,2237,2242,2243,2248,2249,2254,2256,2261,2263],{"type":26,"tag":40,"props":2032,"children":2034},{"href":126,"rel":2033},[128],[2035],{"type":35,"value":126},{"type":35,"value":2037}," · ",{"type":26,"tag":40,"props":2039,"children":2041},{"href":145,"rel":2040},[128],[2042],{"type":35,"value":145},{"type":35,"value":2037},{"type":26,"tag":40,"props":2045,"children":2047},{"href":391,"rel":2046},[128],[2048],{"type":35,"value":391},{"type":35,"value":2037},{"type":26,"tag":40,"props":2051,"children":2053},{"href":877,"rel":2052},[128],[2054],{"type":35,"value":877},{"type":35,"value":2037},{"type":26,"tag":40,"props":2057,"children":2060},{"href":2058,"rel":2059},"https:\u002F\u002Fzed.dev\u002Fblog\u002F120fps",[128],[2061],{"type":35,"value":2058},{"type":35,"value":2037},{"type":26,"tag":40,"props":2064,"children":2066},{"href":152,"rel":2065},[128],[2067],{"type":35,"value":152},{"type":35,"value":2037},{"type":26,"tag":40,"props":2070,"children":2072},{"href":1498,"rel":2071},[128],[2073],{"type":35,"value":1498},{"type":35,"value":2037},{"type":26,"tag":40,"props":2076,"children":2078},{"href":1505,"rel":2077},[128],[2079],{"type":35,"value":1505},{"type":35,"value":2037},{"type":26,"tag":40,"props":2082,"children":2084},{"href":239,"rel":2083},[128],[2085],{"type":35,"value":239},{"type":35,"value":2037},{"type":26,"tag":40,"props":2088,"children":2091},{"href":2089,"rel":2090},"https:\u002F\u002Fzed.dev\u002Ffaq",[128],[2092],{"type":35,"value":2089},{"type":35,"value":2037},{"type":26,"tag":40,"props":2095,"children":2097},{"href":159,"rel":2096},[128],[2098],{"type":35,"value":159},{"type":35,"value":2037},{"type":26,"tag":40,"props":2101,"children":2103},{"href":215,"rel":2102},[128],[2104],{"type":35,"value":215},{"type":35,"value":2037},{"type":26,"tag":40,"props":2107,"children":2109},{"href":222,"rel":2108},[128],[2110],{"type":35,"value":222},{"type":35,"value":2037},{"type":26,"tag":40,"props":2113,"children":2115},{"href":1487,"rel":2114},[128],[2116],{"type":35,"value":1487},{"type":35,"value":2037},{"type":26,"tag":40,"props":2119,"children":2121},{"href":1480,"rel":2120},[128],[2122],{"type":35,"value":1480},{"type":35,"value":2037},{"type":26,"tag":40,"props":2125,"children":2127},{"href":847,"rel":2126},[128],[2128],{"type":35,"value":847},{"type":35,"value":2037},{"type":26,"tag":40,"props":2131,"children":2133},{"href":134,"rel":2132},[128],[2134],{"type":35,"value":134},{"type":35,"value":2037},{"type":26,"tag":40,"props":2137,"children":2139},{"href":1797,"rel":2138},[128],[2140],{"type":35,"value":1797},{"type":35,"value":2037},{"type":26,"tag":40,"props":2143,"children":2145},{"href":1804,"rel":2144},[128],[2146],{"type":35,"value":1804},{"type":35,"value":2037},{"type":26,"tag":40,"props":2149,"children":2151},{"href":1634,"rel":2150},[128],[2152],{"type":35,"value":1634},{"type":35,"value":2154}," · the gpui crate sources under ",{"type":26,"tag":40,"props":2156,"children":2159},{"href":2157,"rel":2158},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Ftree\u002Fmain\u002Fcrates",[128],[2160],{"type":35,"value":2157},{"type":35,"value":769},{"type":26,"tag":65,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":35,"value":2167},"gpui\u002Fsrc\u002Fplatform.rs",{"type":35,"value":80},{"type":26,"tag":65,"props":2170,"children":2172},{"className":2171},[],[2173],{"type":35,"value":2174},"app.rs",{"type":35,"value":80},{"type":26,"tag":65,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":35,"value":2181},"window.rs",{"type":35,"value":80},{"type":26,"tag":65,"props":2184,"children":2186},{"className":2185},[],[2187],{"type":35,"value":2188},"scene.rs",{"type":35,"value":80},{"type":26,"tag":65,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":35,"value":2195},"text_system.rs",{"type":35,"value":80},{"type":26,"tag":65,"props":2198,"children":2200},{"className":2199},[],[2201],{"type":35,"value":2202},"_accessibility.rs",{"type":35,"value":80},{"type":26,"tag":65,"props":2205,"children":2207},{"className":2206},[],[2208],{"type":35,"value":2209},"_ownership_and_data_flow.rs",{"type":35,"value":80},{"type":26,"tag":65,"props":2212,"children":2214},{"className":2213},[],[2215],{"type":35,"value":2216},"app\u002Ftest_context.rs",{"type":35,"value":80},{"type":26,"tag":65,"props":2219,"children":2221},{"className":2220},[],[2222],{"type":35,"value":2223},"platform\u002Fapp_menu.rs",{"type":35,"value":314},{"type":26,"tag":65,"props":2226,"children":2228},{"className":2227},[],[2229],{"type":35,"value":78},{"type":35,"value":80},{"type":26,"tag":65,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":35,"value":107},{"type":35,"value":80},{"type":26,"tag":65,"props":2238,"children":2240},{"className":2239},[],[2241],{"type":35,"value":93},{"type":35,"value":80},{"type":26,"tag":65,"props":2244,"children":2246},{"className":2245},[],[2247],{"type":35,"value":86},{"type":35,"value":80},{"type":26,"tag":65,"props":2250,"children":2252},{"className":2251},[],[2253],{"type":35,"value":100},{"type":35,"value":2255}," Cargo.toml) · ",{"type":26,"tag":40,"props":2257,"children":2259},{"href":1957,"rel":2258},[128],[2260],{"type":35,"value":1957},{"type":35,"value":2262}," (element, window, fps, style, action, keybinding, fonts, text-system, accessibility, system-notification, native-extension, design-guides, installation) · ",{"type":26,"tag":40,"props":2264,"children":2266},{"href":915,"rel":2265},[128],[2267],{"type":35,"value":915},1794599388882]