[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69B8HQSV3VRVNBCBAKTVZFT":3,"skill-same:01M69B8HQSV3VRVNBCBAKTVZFT":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M69B8HQSV3VRVNBCBAKTVZFT","reactor-docking",null,"Reactor docking windows — `DockManager`, `DockSplit`\u002F`DockTabGroup`\u002F`Document`\u002F`ToolWindow`, drag-to-float\u002Fredock, roles (`DocumentArea`\u002F`ToolWindowStrip`), persistence. Use when building IDE-\u002FOffice-shaped layouts with dockable, tear-out tool windows and document wells. READ THIS BEFORE wiring `DockManager` — the content-vs-shape ownership model is the #1 thing people get wrong.","microsoft\u002Fmicrosoft-ui-reactor","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69B6EF21X2GHARCXN2BH1K1",885,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor\u002Fblob\u002Fmain\u002Fplugins\u002Freactor\u002Fskills\u002Freactor-docking\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"reactor docking","docking","when","windows","wiring","float","with","ownership","drag","people","roles","get","document","shape","use","read","model","tool","ide","office","2026-11-10 10:12:30",false,"---\nname: reactor-docking\ndescription: \"Reactor docking windows — `DockManager`, `DockSplit`\u002F`DockTabGroup`\u002F`Document`\u002F`ToolWindow`, drag-to-float\u002Fredock, roles (`DocumentArea`\u002F`ToolWindowStrip`), persistence. Use when building IDE-\u002FOffice-shaped layouts with dockable, tear-out tool windows and document wells. READ THIS BEFORE wiring `DockManager` — the content-vs-shape ownership model is the #1 thing people get wrong.\"\n---\n\n# Docking in Reactor\n\n`DockManager` hosts a tree of dockable panes that the user can drag, split,\ntear out into floating windows, re-dock, pin to a side, and persist. It is the\nfoundation for IDE-\u002FOffice-shaped apps (solution explorer + editor well +\ntool panes).\n\n```csharp\nconfigure: host => DockingNativeInterop.Register(host.Reconciler)  \u002F\u002F required once at startup\n```\n\n## The ownership model — READ THIS FIRST\n\nThis is the single most important rule, and the easiest to get wrong:\n\n> **The app owns CONTENT. The host owns SHAPE.**\n\n- **Content** = which panes exist, their `Title`\u002F`Content`\u002F`Key`, which document\n  is active. The app declares this via `manager.Layout`, fresh every render,\n  derived from its own `UseState`.\n- **Shape** = the user's drag-modified arrangement: split orientations\u002Fratios,\n  which group a tab lives in, floating windows. The **host owns this\n  internally** (spec 045 §2.30) and resolves the effective layout each render\n  by matching your content to its shape *by `Key`*.\n\n### ❌ The anti-pattern that breaks everything\n\nDo **NOT** round-trip the host's live layout back into your own state:\n\n```csharp\n\u002F\u002F ❌ WRONG — feeds the host's shape back into the content prop.\nvar (layout, setLayout) = UseState\u003CDockNode?>(BuildLayout());\nnew DockManager {\n    Layout = layout,\n    OnLiveLayoutChanged = next => setLayout(next),   \u002F\u002F ⛔ double-owns the shape\n};\n```\n\nThis double-owns the shape. Symptoms (all of these at once):\n- **Drag-out-to-float works, but you can't drag back to re-dock.**\n- **Clicking tabs doesn't switch** \u002F selection resets.\n- Splitter drags snap back.\n\n`OnLiveLayoutChanged` is for **observation only** (e.g. a layout inspector). It\nis never a setter for `manager.Layout`.\n\n### ✅ The correct pattern\n\nThe app holds *which documents are open* (content), not the live tree. Opening\nor closing a pane changes the **set of `Key`s** in `manager.Layout`; the host\ndetects the key-set change and merges it into its shape. Reset is a\n`.WithKey(...)` remount.\n\n```csharp\nvar (openDocs, setOpenDocs) = UseState(ImmutableList.Create(File.AppCs));\nvar (activeKey, setActiveKey) = UseState\u003Cobject?>(File.AppCs.Key);\nvar (epoch, bumpEpoch) = UseReducer(0);\n\nvoid Open(ProjectFile f) {\n    if (!openDocs.Any(d => Equals(d.Key, f.Key))) setOpenDocs(openDocs.Add(f));\n    setActiveKey(f.Key);                       \u002F\u002F focus it (drives SelectedIndex)\n}\n\nvar editorWell = new DockTabGroup(\n    openDocs.Select(MakeDoc).ToArray(),\n    SelectedIndex: openDocs.FindIndex(d => Equals(d.Key, activeKey)),\n    ShowWhenEmpty: true,\n    Role: DockGroupRole.DocumentArea);\n\nnew DockManager {\n    Layout = BuildLayout(editorWell),\n    \u002F\u002F Sync state when the host closes a tab via its X button. The host already\n    \u002F\u002F removed it from its shape; drop it from openDocs so the key sets converge.\n    OnDocumentClosing = args =>\n        setOpenDocs(openDocs.RemoveAll(d => Equals(d.Key, args.Document.Key))),\n}.WithKey($\"dock-{epoch}\");   \u002F\u002F View ▸ Reset Layout: bumpEpoch + reset openDocs\n```\n\nRules of thumb:\n- Derive `manager.Layout` from app state every render. Never store the host's tree.\n- Add\u002Fremove a pane ⇒ the `Key` set changes ⇒ the host picks it up.\n- Model-mutator additions (drag, `DockHostModel.Dock`) keep the same app key set,\n  so the host preserves them. That's why round-tripping is both unnecessary and harmful.\n- Reset \u002F discard drag state ⇒ `.WithKey($\"dock-{epoch}\")` bump remounts the host.\n- Layout persistence across launches ⇒ `PersistenceId`, not `OnLiveLayoutChanged`.\n\n\n> **Controlled prop note:** `SelectedIndex`-style element properties are\n> `Optional\u003Cint>` under the hood. Factory parameters such as `SelectedIndex:`\n> still accept `int`, but if you read an element record directly use\n> `.Value` or `.GetValueOrDefault(-1)`. See\n> [`migration\u002F050-optional-t.md`](..\u002F..\u002F..\u002F..\u002Fdocs\u002Fguide\u002Fmigration\u002F050-optional-t.md).\n\n## Building a layout\n\n```csharp\nnew DockSplit(Orientation.Vertical, new DockNode[] {\n    new DockSplit(Orientation.Horizontal, new DockNode[] {\n        new DockTabGroup(new DockableContent[]{ solutionTool }, Width: 260,\n            Role: DockGroupRole.ToolWindowStrip),\n        editorWell,                                              \u002F\u002F DocumentArea\n        new DockTabGroup(new DockableContent[]{ propsTool, gitTool }, Width: 300,\n            TabPosition: TabPosition.Bottom, CompactTabs: true,\n            Role: DockGroupRole.ToolWindowStrip),\n    }),\n    new DockTabGroup(new DockableContent[]{ output, terminal, errors },\n        Height: 220, TabPosition: TabPosition.Bottom, CompactTabs: true,\n        Role: DockGroupRole.ToolWindowStrip),\n});\n```\n\n- `Document` (closable, not pinnable) vs `ToolWindow` (hideable, side-pinnable,\n  `AllowedSides` mask). Both reconcile through `DockableContent`.\n- **Roles** (spec 046): `DocumentArea` is the preferred `Dock(Center)` target and\n  **survives empty** (the well stays a visible drop target). `ToolWindowStrip` is\n  the preferred target for tool-window drops. Use object-initializer syntax for\n  `Document`\u002F`ToolWindow` so you opt into permission flags additively.\n- Every pane needs a **stable, equatable `Key`** — it's how the host preserves\n  pane state across reorders, tear-out, and re-dock. No fallback to title-keying.\n\n## Pane content gotchas\n\n### Make pane bodies fill the pane\n\nA docked pane body is **content-sized** by default — a plain `Border`\u002F`TextBox`\ncollapses to its desired height at the top of the pane. To fill, put it in a\nflex container with `grow`:\n\n```csharp\nFlexColumn(\n    editorTextBox.Flex(grow: 1, basis: 0)\n).Flex(grow: 1);\n```\n\n### Multi-line TextBox: `AcceptsReturn` must be an element prop, not `.Set`\n\nThe `TextBox` descriptor applies `AcceptsReturn`\u002F`TextWrapping` **before** `Text`\non purpose — single-line mode truncates `Text` at the first newline. A\n`.Set(tb => tb.AcceptsReturn = true)` lambda runs *after* `Text` is assigned, so\nthe body collapses to one line. Use the first-class modifiers:\n\n```csharp\n\u002F\u002F ✅ ordered before Text by the descriptor\nTextBox(text, setText).AcceptsReturn().TextWrapping(TextWrapping.NoWrap)\n\n\u002F\u002F ❌ runs after Text → multi-line content truncated to the first line\nTextBox(text, setText).Set(tb => tb.AcceptsReturn = true)\n```\n\nGenerally: any prop whose *ordering relative to another prop matters* belongs on\nthe element (`.AcceptsReturn()`, `.TextWrapping()`), not in a `.Set(...)` escape\nhatch — `.Set` always runs last.\n\n## Key APIs\n\n| API | Purpose |\n|-----|---------|\n| `DockManager { Layout, PersistenceId, ... }` | The host element |\n| `DockSplit(Orientation, children)` | Resizable split (ratios owned by host) |\n| `DockTabGroup(docs, TabPosition, CompactTabs, SelectedIndex, Width\u002FHeight, Role)` | A tab group |\n| `Document { Title, Key, Content, CanClose }` | Closable document pane |\n| `ToolWindow { Title, Key, Content, CanPin, AllowedSides, ... }` | Hideable\u002Fpinnable tool pane |\n| `.WithKey($\"dock-{epoch}\")` | Remount to reset\u002Fdiscard drag shape |\n| `OnDocumentClosing` | Sync app state when the host closes a tab |\n| `OnLiveLayoutChanged` | **Observe** the resolved layout (never feed back to `Layout`) |\n| `DockingNativeInterop.Register(host.Reconciler)` | One-time startup registration |\n\nSee `samples\u002Fapps\u002Freactor-ide` for a complete IDE-shaped app exercising all of this.\n","# Docking in Reactor\n\n`DockManager` hosts a tree of dockable panes that the user can drag, split,\ntear out into floating windows, re-dock, pin to a side, and persist. It is the\nfoundation for IDE-\u002FOffice-shaped apps (solution explorer + editor well +\ntool panes).\n\n```csharp\nconfigure: host => DockingNativeInterop.Register(host.Reconciler)  \u002F\u002F required once at startup\n```\n\n## The ownership model — READ THIS FIRST\n\nThis is the single most important rule, and the easiest to get wrong:\n\n> **The app owns CONTENT. The host owns SHAPE.**\n\n- **Content** = which panes exist, their `Title`\u002F`Content`\u002F`Key`, which document\n  is active. The app declares this via `manager.Layout`, fresh every render,\n  derived from its own `UseState`.\n- **Shape** = the user's drag-modified arrangement: split orientations\u002Fratios,\n  which group a tab lives in, floating windows. The **host owns this\n  internally** (spec 045 §2.30) and resolves the effective layout each render\n  by matching your content to its shape *by `Key`*.\n\n### ❌ The anti-pattern that breaks everything\n\nDo **NOT** round-trip the host's live layout back into your own state:\n\n```csharp\n\u002F\u002F ❌ WRONG — feeds the host's shape back into the content prop.\nvar (layout, setLayout) = UseState\u003CDockNode?>(BuildLayout());\nnew DockManager {\n    Layout = layout,\n    OnLiveLayoutChanged = next => setLayout(next),   \u002F\u002F ⛔ double-owns the shape\n};\n```\n\nThis double-owns the shape. Symptoms (all of these at once):\n- **Drag-out-to-float works, but you can't drag back to re-dock.**\n- **Clicking tabs doesn't switch** \u002F selection resets.\n- Splitter drags snap back.\n\n`OnLiveLayoutChanged` is for **observation only** (e.g. a layout inspector). It\nis never a setter for `manager.Layout`.\n\n### ✅ The correct pattern\n\nThe app holds *which documents are open* (content), not the live tree. Opening\nor closing a pane changes the **set of `Key`s** in `manager.Layout`; the host\ndetects the key-set change and merges it into its shape. Reset is a\n`.WithKey(...)` remount.\n\n```csharp\nvar (openDocs, setOpenDocs) = UseState(ImmutableList.Create(File.AppCs));\nvar (activeKey, setActiveKey) = UseState\u003Cobject?>(File.AppCs.Key);\nvar (epoch, bumpEpoch) = UseReducer(0);\n\nvoid Open(ProjectFile f) {\n    if (!openDocs.Any(d => Equals(d.Key, f.Key))) setOpenDocs(openDocs.Add(f));\n    setActiveKey(f.Key);                       \u002F\u002F focus it (drives SelectedIndex)\n}\n\nvar editorWell = new DockTabGroup(\n    openDocs.Select(MakeDoc).ToArray(),\n    SelectedIndex: openDocs.FindIndex(d => Equals(d.Key, activeKey)),\n    ShowWhenEmpty: true,\n    Role: DockGroupRole.DocumentArea);\n\nnew DockManager {\n    Layout = BuildLayout(editorWell),\n    \u002F\u002F Sync state when the host closes a tab via its X button. The host already\n    \u002F\u002F removed it from its shape; drop it from openDocs so the key sets converge.\n    OnDocumentClosing = args =>\n        setOpenDocs(openDocs.RemoveAll(d => Equals(d.Key, args.Document.Key))),\n}.WithKey($\"dock-{epoch}\");   \u002F\u002F View ▸ Reset Layout: bumpEpoch + reset openDocs\n```\n\nRules of thumb:\n- Derive `manager.Layout` from app state every render. Never store the host's tree.\n- Add\u002Fremove a pane ⇒ the `Key` set changes ⇒ the host picks it up.\n- Model-mutator additions (drag, `DockHostModel.Dock`) keep the same app key set,\n  so the host preserves them. That's why round-tripping is both unnecessary and harmful.\n- Reset \u002F discard drag state ⇒ `.WithKey($\"dock-{epoch}\")` bump remounts the host.\n- Layout persistence across launches ⇒ `PersistenceId`, not `OnLiveLayoutChanged`.\n\n\n> **Controlled prop note:** `SelectedIndex`-style element properties are\n> `Optional\u003Cint>` under the hood. Factory parameters such as `SelectedIndex:`\n> still accept `int`, but if you read an element record directly use\n> `.Value` or `.GetValueOrDefault(-1)`. See\n> [`migration\u002F050-optional-t.md`](..\u002F..\u002F..\u002F..\u002Fdocs\u002Fguide\u002Fmigration\u002F050-optional-t.md).\n\n## Building a layout\n\n```csharp\nnew DockSplit(Orientation.Vertical, new DockNode[] {\n    new DockSplit(Orientation.Horizontal, new DockNode[] {\n        new DockTabGroup(new DockableContent[]{ solutionTool }, Width: 260,\n            Role: DockGroupRole.ToolWindowStrip),\n        editorWell,                                              \u002F\u002F DocumentArea\n        new DockTabGroup(new DockableContent[]{ propsTool, gitTool }, Width: 300,\n            TabPosition: TabPosition.Bottom, CompactTabs: true,\n            Role: DockGroupRole.ToolWindowStrip),\n    }),\n    new DockTabGroup(new DockableContent[]{ output, terminal, errors },\n        Height: 220, TabPosition: TabPosition.Bottom, CompactTabs: true,\n        Role: DockGroupRole.ToolWindowStrip),\n});\n```\n\n- `Document` (closable, not pinnable) vs `ToolWindow` (hideable, side-pinnable,\n  `AllowedSides` mask). Both reconcile through `DockableContent`.\n- **Roles** (spec 046): `DocumentArea` is the preferred `Dock(Center)` target and\n  **survives empty** (the well stays a visible drop target). `ToolWindowStrip` is\n  the preferred target for tool-window drops. Use object-initializer syntax for\n  `Document`\u002F`ToolWindow` so you opt into permission flags additively.\n- Every pane needs a **stable, equatable `Key`** — it's how the host preserves\n  pane state across reorders, tear-out, and re-dock. No fallback to title-keying.\n\n## Pane content gotchas\n\n### Make pane bodies fill the pane\n\nA docked pane body is **content-sized** by default — a plain `Border`\u002F`TextBox`\ncollapses to its desired height at the top of the pane. To fill, put it in a\nflex container with `grow`:\n\n```csharp\nFlexColumn(\n    editorTextBox.Flex(grow: 1, basis: 0)\n).Flex(grow: 1);\n```\n\n### Multi-line TextBox: `AcceptsReturn` must be an element prop, not `.Set`\n\nThe `TextBox` descriptor applies `AcceptsReturn`\u002F`TextWrapping` **before** `Text`\non purpose — single-line mode truncates `Text` at the first newline. A\n`.Set(tb => tb.AcceptsReturn = true)` lambda runs *after* `Text` is assigned, so\nthe body collapses to one line. Use the first-class modifiers:\n\n```csharp\n\u002F\u002F ✅ ordered before Text by the descriptor\nTextBox(text, setText).AcceptsReturn().TextWrapping(TextWrapping.NoWrap)\n\n\u002F\u002F ❌ runs after Text → multi-line content truncated to the first line\nTextBox(text, setText).Set(tb => tb.AcceptsReturn = true)\n```\n\nGenerally: any prop whose *ordering relative to another prop matters* belongs on\nthe element (`.AcceptsReturn()`, `.TextWrapping()`), not in a `.Set(...)` escape\nhatch — `.Set` always runs last.\n\n## Key APIs\n\n| API | Purpose |\n|-----|---------|\n| `DockManager { Layout, PersistenceId, ... }` | The host element |\n| `DockSplit(Orientation, children)` | Resizable split (ratios owned by host) |\n| `DockTabGroup(docs, TabPosition, CompactTabs, SelectedIndex, Width\u002FHeight, Role)` | A tab group |\n| `Document { Title, Key, Content, CanClose }` | Closable document pane |\n| `ToolWindow { Title, Key, Content, CanPin, AllowedSides, ... }` | Hideable\u002Fpinnable tool pane |\n| `.WithKey($\"dock-{epoch}\")` | Remount to reset\u002Fdiscard drag shape |\n| `OnDocumentClosing` | Sync app state when the host closes a tab |\n| `OnLiveLayoutChanged` | **Observe** the resolved layout (never feed back to `Layout`) |\n| `DockingNativeInterop.Register(host.Reconciler)` | One-time startup registration |\n\nSee `samples\u002Fapps\u002Freactor-ide` for a complete IDE-shaped app exercising all of this.\n",{"name":5,"description":7},"main","74791562c11792f7c0e2dd875f1e82b94d70b397","plugins\u002Freactor\u002Fskills\u002Freactor-docking",67,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-14 02:51:08",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add microsoft\u002Fmicrosoft-ui-reactor --skill reactor-docking",{"tool":59,"command":60},"bunx","bunx skills add microsoft\u002Fmicrosoft-ui-reactor --skill reactor-docking",{"tool":62,"command":63},"pnpm","pnpm dlx skills add microsoft\u002Fmicrosoft-ui-reactor --skill reactor-docking","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor\u002Fblob\u002Fmain\u002Fplugins\u002Freactor\u002Fskills\u002Freactor-docking\u002FSKILL.md",true,[],[68,74,100,124,148,170],{"skillNo":69,"name":70,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":39},"01M69B94E15PYYWXAGFV832MRK","Charting","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor\u002Fblob\u002Fmain\u002Fsrc\u002FReactor.Advanced\u002FCharting\u002Fskill.md",[],[70],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":39},"01M69B92C846XMSNJ4PZGVYY3C","reactor-wrapping","Turn ANY WinUI control — a vendor\u002Fthird-party control, your own custom Control, or a Windows Community Toolkit one — into a first-class declarative Reactor element with the [GenerateReactorWrapper] source generator, zero hand-written wrapper code. Covers auto-inference (props, content, two-way pairs, panel\u002Fitems children, events), the [Wrap*] annotation cheat-sheet, imperative-lifecycle controls, diagnostics, and when to fall back to a hand-written ControlDescriptor.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor\u002Fblob\u002Fmain\u002Fplugins\u002Freactor\u002Fskills\u002Freactor-wrapping\u002FSKILL.md",[],[81,82,25,83,84,85,86,21,87,88,89,90,91,92,93,94,95,96,97,98,99,22],"reactor wrapping","declarative","hand","code","cheat","generator","auto","controls","custom","element","lifecycle","winui","ZeRO","panel","community","back","inference","diagnostics","toolkit",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":39},"01M69B90PW92BQ4YNZYTP4SERB","reactor-windowing","Reactor top-level windowing cookbook: WindowSpec, OpenWindow, draggable windows, borderless\u002Ftool windows, placement persistence, taskbar visibility, z-order, aspect ratio, SizeToContent, displays, taskbar integration, and owner-window file\u002Ffolder pickers.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor\u002Fblob\u002Fmain\u002Fplugins\u002Freactor\u002Fskills\u002Freactor-windowing\u002FSKILL.md",[],[107,108,109,110,111,112,113,114,115,116,117,118,119,120,36,22,121,122,123],"reactor windowing","progress","persistence","cookbook","integration","folder","command","command palette","top","window","palette","file","restore","open","remember","position","make",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":39},"01M69B8Y5Y0VKXADXCN3W1NK89","reactor-recipes","Paste-ready single-file Reactor recipes indexed by intent — list with add\u002Fdelete\u002Ftoggle, sidebar navigation between pages, form with validation + submit gating, async fetch with loading\u002Ferror\u002Fdata states, themed Win11 card surface. Use a recipe instead of synthesizing from prose: copy, adjust, ship.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor\u002Fblob\u002Fmain\u002Fplugins\u002Freactor\u002Fskills\u002Freactor-recipes\u002FSKILL.md",[],[131,132,118,133,25,134,33,135,136,137,138,139,140,141,142,143,144,145,146,147],"reactor recipes","recipes","recipe","form","adjust","single","pages","async","card","submit","loading","states","fetch","gating","single-file","ready","error",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":39},"01M69B8WNYS31M4P012P2QTX6R","reactor-navigation","Reactor navigation — `UseNavigation` hook, `NavigationHost` renderer, `NavigationView` sidebar, `TabView` tabs, route params, stack operations, page lifecycle, deep linking, transitions, caching. Use when building multi-page apps or wiring sidebar\u002Ftab navigation.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor\u002Fblob\u002Fmain\u002Fplugins\u002Freactor\u002Fskills\u002Freactor-navigation\u002FSKILL.md",[],[155,156,157,21,158,33,91,159,160,161,162,23,163,164,165,166,167,168,169],"navigation","reactor navigation","caching","apps","renderer","multi-page","page","deep","hook","operations","transitions","linking","stack","route","multi",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":39},"01M69B8TGJA43N8X6BFVWTXC1H","reactor-input","Reactor input — gestures (`OnPan`, `OnPinch`, `OnRotate`), pointer events, drag-and-drop (`OnDragStarting`), focus management (`UseElementFocus`, `UseFocus`, `UseFocusTrap`). Use when implementing direct manipulation or custom focus behavior.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmicrosoft-ui-reactor\u002Fblob\u002Fmain\u002Fplugins\u002Freactor\u002Fskills\u002Freactor-input\u002FSKILL.md",[],[177,178,179,180,181,182,183,184,21,33,89,185,27,186],"input","reactor input","direct","events","management","behavior","focus","drop","implementing","gestures"]