@pstrikez/fluent-winui-theme 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +22 -0
  2. package/NOTICE.md +46 -0
  3. package/README.md +140 -2
  4. package/dist/base.css +9 -0
  5. package/dist/components/nav-selection-indicator.d.ts +7 -0
  6. package/dist/components/ui/back-navigation-button.d.ts +10 -0
  7. package/dist/components/ui/badge-hue.d.ts +21 -0
  8. package/dist/components/ui/chip.d.ts +11 -0
  9. package/dist/components/ui/choice-group.d.ts +25 -0
  10. package/dist/components/ui/code-block.d.ts +13 -0
  11. package/dist/components/ui/confirm-dialog.d.ts +16 -0
  12. package/dist/components/ui/copy-to-clipboard.d.ts +1 -0
  13. package/dist/components/ui/danger.d.ts +4 -0
  14. package/dist/components/ui/dashboard-page-header.d.ts +7 -0
  15. package/dist/components/ui/dialog-shell.d.ts +24 -0
  16. package/dist/components/ui/empty-state.d.ts +17 -0
  17. package/dist/components/ui/error-shell.css.d.ts +1 -0
  18. package/dist/components/ui/error-shell.d.ts +11 -0
  19. package/dist/components/ui/fluent-form-controls.d.ts +27 -0
  20. package/dist/components/ui/http-badge.d.ts +8 -0
  21. package/dist/components/ui/info-label.d.ts +3 -0
  22. package/dist/components/ui/layout.d.ts +9 -0
  23. package/dist/components/ui/loading-screen.css.d.ts +1 -0
  24. package/dist/components/ui/loading-screen.d.ts +6 -0
  25. package/dist/components/ui/masked-icon.d.ts +5 -0
  26. package/dist/components/ui/multiselect-combobox.d.ts +21 -0
  27. package/dist/components/ui/open-link-label.d.ts +4 -0
  28. package/dist/components/ui/outcome-message-bar.d.ts +9 -0
  29. package/dist/components/ui/outcome-toast.d.ts +14 -0
  30. package/dist/components/ui/panel.d.ts +12 -0
  31. package/dist/components/ui/prism.d.ts +30 -0
  32. package/dist/components/ui/progress-ring.d.ts +8 -0
  33. package/dist/components/ui/reorder-list.d.ts +55 -0
  34. package/dist/components/ui/resource-list.d.ts +33 -0
  35. package/dist/components/ui/route-link.d.ts +19 -0
  36. package/dist/components/ui/row-title.d.ts +7 -0
  37. package/dist/components/ui/scroll-area.d.ts +44 -0
  38. package/dist/components/ui/secret-input.d.ts +7 -0
  39. package/dist/components/ui/section-header.d.ts +11 -0
  40. package/dist/components/ui/settings-card.d.ts +36 -0
  41. package/dist/components/ui/status-badge.d.ts +8 -0
  42. package/dist/components/ui/switch-setting.d.ts +7 -0
  43. package/dist/components/ui/table-actions.d.ts +13 -0
  44. package/dist/components/ui/table-columns.d.ts +3 -0
  45. package/dist/components/ui/tooltip-icon-button.d.ts +17 -0
  46. package/dist/components/ui/truncation-tooltip.d.ts +27 -0
  47. package/dist/components/ui/use-copy-to-clipboard.d.ts +13 -0
  48. package/dist/components/ui/use-dialog-invocation.d.ts +11 -0
  49. package/dist/components/ui/use-discard-guard.d.ts +19 -0
  50. package/dist/document.css.d.ts +1 -0
  51. package/dist/fluent.d.ts +2 -0
  52. package/dist/font-stacks.d.ts +2 -0
  53. package/dist/fonts/LICENSE-Meslo-LG.txt +201 -0
  54. package/dist/fonts/meslo-lg-s-400-italic.generated.woff2 +0 -0
  55. package/dist/fonts/meslo-lg-s-400-normal.generated.woff2 +0 -0
  56. package/dist/fonts/meslo-lg-s-700-italic.generated.woff2 +0 -0
  57. package/dist/fonts/meslo-lg-s-700-normal.generated.woff2 +0 -0
  58. package/dist/i18n/translation.d.ts +49 -0
  59. package/dist/index.d.ts +60 -0
  60. package/dist/index.js +8945 -0
  61. package/dist/index.js.map +7 -0
  62. package/dist/lib/color.d.ts +9 -0
  63. package/dist/lib/legacy-css-color.d.ts +1 -0
  64. package/dist/lib/reduced-motion.d.ts +1 -0
  65. package/dist/lib/use-media-query.d.ts +2 -0
  66. package/dist/shell/app-shell.d.ts +30 -0
  67. package/dist/shell/gradient-background.css.d.ts +1 -0
  68. package/dist/shell/gradient-background.d.ts +2 -0
  69. package/dist/shell/navigation-pane.d.ts +42 -0
  70. package/dist/shell/navigation-progress.css.d.ts +1 -0
  71. package/dist/shell/navigation-progress.d.ts +3 -0
  72. package/dist/shell/page-frames.d.ts +24 -0
  73. package/dist/theme-mode.d.ts +17 -0
  74. package/dist/theme.d.ts +938 -0
  75. package/dist/winui/appearance.d.ts +11 -0
  76. package/dist/winui/controls/accordion.css.d.ts +1 -0
  77. package/dist/winui/controls/badge-tag.css.d.ts +1 -0
  78. package/dist/winui/controls/button.css.d.ts +1 -0
  79. package/dist/winui/controls/card.css.d.ts +1 -0
  80. package/dist/winui/controls/checkbox-surface.d.ts +25 -0
  81. package/dist/winui/controls/choice.css.d.ts +4 -0
  82. package/dist/winui/controls/color-picker.css.d.ts +1 -0
  83. package/dist/winui/controls/dialog.css.d.ts +1 -0
  84. package/dist/winui/controls/drawer.css.d.ts +1 -0
  85. package/dist/winui/controls/field.css.d.ts +3 -0
  86. package/dist/winui/controls/list.css.d.ts +1 -0
  87. package/dist/winui/controls/menu.css.d.ts +1 -0
  88. package/dist/winui/controls/message-bar.css.d.ts +1 -0
  89. package/dist/winui/controls/nav.css.d.ts +1 -0
  90. package/dist/winui/controls/popover.css.d.ts +1 -0
  91. package/dist/winui/controls/progress.css.d.ts +1 -0
  92. package/dist/winui/controls/reveal.d.ts +11 -0
  93. package/dist/winui/controls/scrollbar.css.d.ts +1 -0
  94. package/dist/winui/controls/select.css.d.ts +1 -0
  95. package/dist/winui/controls/selection-pill.d.ts +1 -0
  96. package/dist/winui/controls/selectors.d.ts +48 -0
  97. package/dist/winui/controls/severity.d.ts +24 -0
  98. package/dist/winui/controls/switch.css.d.ts +1 -0
  99. package/dist/winui/controls/table.css.d.ts +1 -0
  100. package/dist/winui/controls/tabs.css.d.ts +1 -0
  101. package/dist/winui/controls/text-input.css.d.ts +1 -0
  102. package/dist/winui/controls/text.css.d.ts +1 -0
  103. package/dist/winui/controls/toast.css.d.ts +1 -0
  104. package/dist/winui/controls/toolbar.css.d.ts +1 -0
  105. package/dist/winui/controls/tooltip.css.d.ts +1 -0
  106. package/dist/winui/focus-rect.css.d.ts +2 -0
  107. package/dist/winui/index.d.ts +1 -0
  108. package/dist/winui/motion.d.ts +29 -0
  109. package/dist/winui/page-transition.css.d.ts +2 -0
  110. package/dist/winui/presence.d.ts +3 -0
  111. package/dist/winui/progress-indeterminate.css.d.ts +1 -0
  112. package/dist/winui/reposition.d.ts +8 -0
  113. package/dist/winui/reset.css.d.ts +1 -0
  114. package/dist/winui/switch-drag.d.ts +2 -0
  115. package/dist/winui/theme.d.ts +3 -0
  116. package/dist/winui/toaster.d.ts +2 -0
  117. package/dist/winui/tokens.d.ts +1 -0
  118. package/dist/winui/wrap.d.ts +3 -0
  119. package/dist/winui.css +1 -0
  120. package/package.json +76 -4
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Menci
4
+ Copyright (c) 2026 pStrikeZ
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/NOTICE.md ADDED
@@ -0,0 +1,46 @@
1
+ # Notices
2
+
3
+ ## Floway
4
+
5
+ This package is extracted from the dashboard of [Floway](https://github.com/Menci/Floway)
6
+ (`apps/web`), Copyright (c) 2025 Menci, distributed under the MIT License.
7
+ The full license text is in [LICENSE](./LICENSE). [UPSTREAM.md](./UPSTREAM.md)
8
+ records the exact revision and the paths it was taken from.
9
+
10
+ ## WinUI and Fluent UI
11
+
12
+ Values and behaviours in `src/winui/` are transcribed from
13
+ [microsoft/microsoft-ui-xaml](https://github.com/microsoft/microsoft-ui-xaml)
14
+ (MIT License, Copyright (c) Microsoft Corporation) and restyle
15
+ [microsoft/fluentui](https://github.com/microsoft/fluentui) (MIT License,
16
+ Copyright (c) Microsoft Corporation). Each transcribed value carries a permalink
17
+ to its source beside it. No Microsoft source file is redistributed.
18
+
19
+ "WinUI" and "Fluent" are trademarks of Microsoft Corporation. This package is not
20
+ affiliated with or endorsed by Microsoft.
21
+
22
+ ## Bundled libraries
23
+
24
+ `dist/index.js` bundles:
25
+
26
+ - [Prism](https://github.com/PrismJS/prism) (MIT License, Copyright (c) 2012 Lea Verou),
27
+ for syntax highlighting in `CodeBlock`;
28
+ - [OverlayScrollbars](https://github.com/KingSora/OverlayScrollbars) 2.13.0
29
+ (MIT License, Copyright (c) Rene Haas | KingSora), **modified** by Floway's patch in
30
+ `patches/overlayscrollbars@2.13.0.patch`, for `ScrollArea`.
31
+
32
+ ## Meslo LG
33
+
34
+ `dist/fonts/meslo-lg-s-*.woff2` are **modified** versions of the Meslo LG S
35
+ v1.2.1 faces from [andreberg/Meslo-Font](https://github.com/andreberg/Meslo-Font),
36
+ distributed under the Apache License 2.0. Floway generated them by widening each
37
+ face's advance from 1233 to 1264 units and centring the glyphs in the added
38
+ space; the rationale is in `src/base.css`. The license text ships beside the
39
+ fonts as `dist/fonts/LICENSE-Meslo-LG.txt`.
40
+
41
+ ## Segoe UI Variable
42
+
43
+ Segoe UI Variable is **not** included. `base.css` declares it with `@font-face`
44
+ sources on Microsoft's own hosts (docs.azure.cn and learn.microsoft.com), the
45
+ same files Microsoft Learn serves, so the browser fetches it from Microsoft at
46
+ runtime. Its use is governed by Microsoft's terms.
package/README.md CHANGED
@@ -1,3 +1,141 @@
1
- # Temporary Holding Version
1
+ # @pstrikez/fluent-winui-theme
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ WinUI 3 appearance for [Fluent UI React v9](https://react.fluentui.dev/), extracted from the
4
+ dashboard of [Floway](https://github.com/Menci/Floway).
5
+
6
+ The package has two parts. The first restyles Fluent's own components:
7
+
8
+ - **Stylesheet:** a CSS layer that re-points Fluent's tokens at WinUI 3 values and
9
+ restyles each control's geometry, fills, strokes, focus visuals and motion.
10
+ - **Wrapped components:** a wrapped Fluent namespace that stamps WinUI appearances,
11
+ substitutes WinUI motion, replaces the toaster and adds the Switch drag gesture.
12
+ - **Themes:** light and dark Fluent themes with the WinUI type ramp, radii and
13
+ elevation.
14
+
15
+ The second is the rest of what Floway's dashboard is built from, so a host can
16
+ reproduce that dashboard without Floway's source:
17
+
18
+ - **Components:** settings cards, dialogs, resource lists, reorderable lists,
19
+ badges, code blocks, empty and error states, an OverlayScrollbars scroll area
20
+ and more.
21
+ - **Application shell:** `AppShell`, `NavigationPane`, the page transition, the
22
+ gradient backdrop and the navigation progress bar.
23
+
24
+ > Status: early. The API is unstable before 1.0.
25
+
26
+ ## Install
27
+
28
+ ```sh
29
+ npm install @pstrikez/fluent-winui-theme @fluentui/react-components @fluentui/react-toast @fluentui/react-icons react react-dom
30
+ ```
31
+
32
+ The peer range of `@fluentui/react-components` is deliberately narrow. The
33
+ stylesheet addresses Fluent's DOM and class names, and these can change in a
34
+ minor release. Upgrade Fluent together with this package.
35
+
36
+ ## Use
37
+
38
+ ```tsx
39
+ import '@pstrikez/fluent-winui-theme/base.css';
40
+ import '@pstrikez/fluent-winui-theme/winui.css';
41
+
42
+ import { fluentComponents, useWinuiTheme } from '@pstrikez/fluent-winui-theme';
43
+
44
+ const { FluentProvider, Button, Switch } = fluentComponents;
45
+
46
+ export function App() {
47
+ const { theme } = useWinuiTheme('system'); // or 'light' / 'dark'
48
+ return (
49
+ <FluentProvider theme={theme}>
50
+ <Button appearance="primary">Save</Button>
51
+ <Switch label="Notifications" />
52
+ </FluentProvider>
53
+ );
54
+ }
55
+ ```
56
+
57
+ - **Render components from `fluentComponents`**, not straight from
58
+ `@fluentui/react-components`. The WinUI behaviour only reaches components that
59
+ come from the wrapped namespace.
60
+ - **Load the stylesheets in this order:** `base.css` first, then your own
61
+ utilities, then your own rules, then `winui.css`. Griffel injects its styles
62
+ last at runtime.
63
+ - **`base.css`** declares the fonts, the monospace ramp and the document rules.
64
+ Segoe UI Variable loads from Microsoft's hosts. The bundled Meslo LG S faces
65
+ load from the package.
66
+
67
+ ### Colour scheme
68
+
69
+ Without any configuration, the stylesheets follow `prefers-color-scheme`, as
70
+ Floway does. To force a scheme, set `data-fwt-theme="light"` or `"dark"` on
71
+ `<html>`. `useWinuiTheme(mode)` and `applyThemeMode(mode)` do this for you, and
72
+ `useWinuiTheme` also returns the Fluent theme that matches the resolved scheme.
73
+ Always pass that theme to `FluentProvider`. The token stylesheet and the
74
+ Fluent theme have to agree on the scheme.
75
+
76
+ ### A dashboard like Floway's
77
+
78
+ ```tsx
79
+ import { AppShell, GradientBackground, NavigationPane, WinuiRouterProvider } from '@pstrikez/fluent-winui-theme';
80
+
81
+ <FluentProvider theme={theme}>
82
+ <GradientBackground>
83
+ <WinuiRouterProvider router={{ navigate }}>
84
+ <AppShell
85
+ labels={{ skipToContent: 'Skip to content', openNavigation: 'Open navigation', navigation: 'Navigation' }}
86
+ narrowHeader={<Logo />}
87
+ navigation={({ onNavigate }) => <NavigationPane
88
+ label="Navigation"
89
+ header={<Logo />}
90
+ groups={[{ items: [{ value: '/', label: 'Home', href: '/', icon: <HomeRegular /> }] }]}
91
+ onNavigate={onNavigate}
92
+ selectedValue={pathname}
93
+ />}
94
+ pageKey={pathname}
95
+ >
96
+ <Page />
97
+ </AppShell>
98
+ </WinuiRouterProvider>
99
+ </GradientBackground>
100
+ </FluentProvider>
101
+ ```
102
+
103
+ - **`pageKey`** names the current page. When it changes, the WinUI page
104
+ transition plays. Keep it stable while only the page's query string changes.
105
+ - **`WinuiRouterProvider`** connects in-app links to your router. Pass
106
+ react-router's `useNavigate()` result, or any `(to) => void`. Without the
107
+ provider, links are plain anchors that the browser follows.
108
+ - **`WinuiStringsProvider locale="zh-Hans"`** switches the components' own
109
+ text, such as Cancel, Copy and On/Off, to Simplified Chinese. Pass `strings`
110
+ to override individual entries.
111
+
112
+ ### Server rendering
113
+
114
+ Keep the Fluent family out of SSR externalization so the server sees Fluent's
115
+ ESM entrypoints. In Vite, that is:
116
+
117
+ ```ts
118
+ ssr: { noExternal: [/^@fluentui\//, /^@griffel\//, /^tabster(?:$|\/)/, /^@pstrikez\/fluent-winui-theme$/] }
119
+ ```
120
+
121
+ ## Development
122
+
123
+ ```sh
124
+ pnpm install
125
+ pnpm run typecheck
126
+ pnpm test
127
+ pnpm run build
128
+ ```
129
+
130
+ `demo/` is a gallery of every component inside the shell. Build the package
131
+ first, then run `pnpm run demo:build` and `pnpm run demo:preview`. The query
132
+ parameters `?mode=light|dark|system`, `?page=` and `?locale=en|zh-Hans` pick the
133
+ initial state.
134
+
135
+ [UPSTREAM.md](./UPSTREAM.md) records the Floway revision this package follows
136
+ and how to sync from it.
137
+
138
+ ## License
139
+
140
+ MIT. See [LICENSE](./LICENSE) and [NOTICE.md](./NOTICE.md) for the Floway,
141
+ Microsoft and Meslo LG notices.
package/dist/base.css ADDED
@@ -0,0 +1,9 @@
1
+ body{margin:0}@media(prefers-color-scheme:dark){:root:not([data-fwt-theme=light]){color-scheme:dark}}:root[data-fwt-theme=dark]{color-scheme:dark}*,*:before,*:after{box-sizing:border-box}:root{--fontFamilyBase: "Segoe UI Variable Web", "Segoe UI Variable Text", "Segoe UI Variable Display", "Segoe UI Variable Small", "Segoe UI", system-ui, sans-serif}body{font-family:var(--fontFamilyBase)}.fwt-gradient-background{background-image:radial-gradient(circle at 50% 0%,#ffffff 0%,#f7fbff 36%,transparent 64%),linear-gradient(180deg,#f6f8fb,#eef2f6);height:100dvh;overflow:hidden}@media(prefers-color-scheme:dark){:root:not([data-fwt-theme=light]) .fwt-gradient-background{background-image:radial-gradient(circle at 50% 0%,#2d2d2d 0%,#242424 38%,transparent 68%),linear-gradient(180deg,#202020,#1c1c1c)}}:root[data-fwt-theme=dark] .fwt-gradient-background{background-image:radial-gradient(circle at 50% 0%,#2d2d2d 0%,#242424 38%,transparent 68%),linear-gradient(180deg,#202020,#1c1c1c)}.fwt-loading{box-sizing:border-box;display:grid;height:100%;padding:20px;place-items:center}.fwt-loading-app{min-height:100dvh}.fwt-loading .fui-Spinner{align-items:center;display:flex;gap:8px;justify-content:center;line-height:0;min-width:min-content;overflow:hidden}.fwt-loading .fui-Spinner__spinner{--fui-Spinner--strokeWidth: 25%;animation:fwt-loading-spin 1.5s linear infinite;background-color:rgba(255,255,255,0);color:var(--colorBrandStroke1, #0067c0);flex-shrink:0;height:32px;mask-image:radial-gradient(closest-side,transparent calc(100% - var(--fui-Spinner--strokeWidth) - 1px),white calc(100% - var(--fui-Spinner--strokeWidth)) calc(100% - 1px),transparent 100%);position:relative;width:32px;-webkit-mask-image:radial-gradient(closest-side,transparent calc(100% - var(--fui-Spinner--strokeWidth) - 1px),white calc(100% - var(--fui-Spinner--strokeWidth)) calc(100% - 1px),transparent 100%)}.fwt-loading .fui-Spinner__spinnerTail{animation:fwt-loading-tail 1.5s cubic-bezier(.33,0,.67,1) infinite;display:block;height:100%;mask-image:conic-gradient(transparent 105deg,#fff 105deg);position:absolute;width:100%;-webkit-mask-image:conic-gradient(transparent 105deg,white 105deg)}.fwt-loading .fui-Spinner__spinnerTail:before,.fwt-loading .fui-Spinner__spinnerTail:after{animation-duration:1.5s;animation-iteration-count:infinite;animation-timing-function:cubic-bezier(.33,0,.67,1);background-image:conic-gradient(currentcolor 135deg,transparent 135deg);content:"";display:block;height:100%;position:absolute;width:100%}.fwt-loading .fui-Spinner__spinnerTail:before{animation-name:fwt-loading-tail-before}.fwt-loading .fui-Spinner__spinnerTail:after{animation-name:fwt-loading-tail-after}.fwt-loading .fui-Spinner__label{color:var(--colorNeutralForeground1, rgba(0, 0, 0, .894118));font-family:var(--fontFamilyBase, sans-serif);font-size:var(--fontSizeBase300, 14px);font-weight:var(--fontWeightRegular, 400);line-height:var(--lineHeightBase300, 20px)}@media(prefers-color-scheme:dark){:root:not([data-fwt-theme=light]) .fwt-loading .fui-Spinner__spinner{color:var(--colorBrandStroke1, #4cc2ff)}:root:not([data-fwt-theme=light]) .fwt-loading .fui-Spinner__label{color:var(--colorNeutralForeground1, #ffffff)}}:root[data-fwt-theme=dark] .fwt-loading .fui-Spinner__spinner{color:var(--colorBrandStroke1, #4cc2ff)}:root[data-fwt-theme=dark] .fwt-loading .fui-Spinner__label{color:var(--colorNeutralForeground1, #ffffff)}@keyframes fwt-loading-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes fwt-loading-tail{0%{transform:rotate(-135deg)}50%{transform:rotate(0)}to{transform:rotate(225deg)}}@keyframes fwt-loading-tail-before{0%,to{transform:rotate(0)}50%{transform:rotate(105deg)}}@keyframes fwt-loading-tail-after{0%,to{transform:rotate(0)}50%{transform:rotate(225deg)}}@media screen and (forced-colors:active){.fwt-loading .fui-Spinner__spinner{background-color:HighlightText;color:Highlight;forced-color-adjust:none}}.fwt-error-shell{display:grid;align-content:center;justify-items:center;gap:24px;height:100%;min-height:max-content;margin:0 auto;max-width:720px;padding:64px 24px}.fwt-error-shell>*{min-width:0;max-width:100%}.fwt-error-shell-viewport{height:100dvh}.fwt-error-shell-stack{display:grid;gap:6px}.fwt-error-shell-stack>*{margin:0}.fwt-error-shell-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:8px}.fwt-navigation-progress{height:3px;inset:0 0 auto;opacity:0;overflow:hidden;pointer-events:none;position:fixed;transition:opacity var(--winui-control-fast-animation-duration) var(--winui-control-fast-out-slow-in-easing);z-index:1000001}.fwt-navigation-progress[data-active=true]{opacity:1}.fwt-navigation-progress:before,.fwt-navigation-progress:after{animation-play-state:paused;background-color:var(--winui-accent-fill-default);border-radius:1.5px;content:"";inset:0 auto 0 0;position:absolute}.fwt-navigation-progress:before,.fwt-navigation-progress:after{animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}.fwt-navigation-progress:before{animation-name:winui-progress-indeterminate;width:40%}.fwt-navigation-progress:after{animation-name:winui-progress-indeterminate-2;width:60%}@keyframes winui-progress-indeterminate{0%{animation-timing-function:cubic-bezier(.4,0,.6,1);transform:translate(-100%)}75%{transform:translate(300%)}to{transform:translate(300%)}}@keyframes winui-progress-indeterminate-2{0%{transform:translate(-150%)}37.5%{animation-timing-function:cubic-bezier(.4,0,.6,1);transform:translate(-150%)}to{transform:translate(166%)}}.fwt-navigation-progress[data-active=true]:before,.fwt-navigation-progress[data-active=true]:after{animation-play-state:running}@media(forced-colors:active){.fwt-navigation-progress{border:1px solid CanvasText;box-sizing:content-box}.fwt-navigation-progress:before,.fwt-navigation-progress:after{background-color:Highlight}}@font-face{font-family:Segoe UI Variable Web;src:url(https://docs.azure.cn/static/third-party/SegoeUIVariable/SegoeUI-VF.ttf?fwt-vf=2.02) format("truetype"),url(https://learn.microsoft.com/static/third-party/SegoeUIVariable/SegoeUI-VF.ttf?fwt-vf=2.02) format("truetype");font-style:normal;font-weight:300 700;font-display:swap}@font-face{font-family:Meslo LG S Web;src:url(./fonts/meslo-lg-s-400-normal.generated.woff2) format("woff2");font-style:normal;font-weight:400;font-display:swap;size-adjust:99.9895%;ascent-override:102.0107%;descent-override:30.0032%;line-gap-override:0%}@font-face{font-family:Meslo LG S Web;src:url(./fonts/meslo-lg-s-400-italic.generated.woff2) format("woff2");font-style:italic;font-weight:400;font-display:swap;size-adjust:99.9895%;ascent-override:102.0107%;descent-override:30.0032%;line-gap-override:0%}@font-face{font-family:Meslo LG S Web;src:url(./fonts/meslo-lg-s-700-normal.generated.woff2) format("woff2");font-style:normal;font-weight:600 700;font-display:swap;size-adjust:99.9895%;ascent-override:102.0107%;descent-override:30.0032%;line-gap-override:0%}@font-face{font-family:Meslo LG S Web;src:url(./fonts/meslo-lg-s-700-italic.generated.woff2) format("woff2");font-style:italic;font-weight:600 700;font-display:swap;size-adjust:99.9895%;ascent-override:102.0107%;descent-override:30.0032%;line-gap-override:0%}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.container{width:100%}.border-fui-divider{border-color:var(--colorNeutralStroke3)}.border-fui-stroke1{border-color:var(--colorNeutralStroke1)}.bg-fui-bg1{background-color:var(--colorNeutralBackground1)}.bg-fui-bg2{background-color:var(--colorNeutralBackground2)}.text-fui-fg1{color:var(--colorNeutralForeground1)}.text-fui-fg2{color:var(--colorNeutralForeground2)}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.invisible{visibility:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.left-3{left:.75rem}.top-3{top:.75rem}.z-\[100000\]{z-index:100000}.\!grid{display:grid!important}.grid{display:grid}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.grid-cols-\[clamp\(240px\,18vw\,290px\)_minmax\(0\,1fr\)\]{grid-template-columns:clamp(240px,18vw,290px) minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.grid-rows-\[minmax\(0\,1fr\)\]{grid-template-rows:minmax(0,1fr)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\!m-auto{margin:auto!important}.m-0{margin:0}.\!ml-auto{margin-left:auto!important}.ml-auto{margin-left:auto}.ms{margin-inline-start:1rem}.inline{display:inline}.block{display:block}.hidden{display:none}.\!h-full{height:100%!important}.\!max-w-\[calc\(100vw-16px\)\]{max-width:calc(100vw - 16px)!important}.\!max-w-none{max-width:none!important}.\!min-h-\[34px\]{min-height:34px!important}.\!min-w-\[0px\],.\[\&_input\]\:\!min-w-\[0px\] input{min-width:0px!important}.\!min-w-\[var\(--fui-match-target-size\)\]{min-width:var(--fui-match-target-size)!important}.\!min-w-\[var\(--fwt-select-min-width\,var\(--winui-combo-box-min-width\)\)\]{min-width:var(--fwt-select-min-width,var(--winui-combo-box-min-width))!important}.\!w-\[min\(430px\,calc\(100vw-48px\)\)\]{width:min(430px,calc(100vw - 48px))!important}.\!w-full{width:100%!important}.\!w-max{width:max-content!important}.h-\[100dvh\]{height:100dvh}.h-full{height:100%}.h1{height:.25rem}.h2{height:.5rem}.max-w-\[480px\]{max-width:480px}.max-w-\[760px\]{max-width:760px}.max-w-full{max-width:100%}.min-h-\[180px\]{min-height:180px}.min-h-0{min-height:0}.min-h-10{min-height:2.5rem}.min-h-full{min-height:100%}.min-h-max{min-height:max-content}.min-w-0{min-width:0}.min-w-full{min-width:100%}.w-full{width:100%}.w-max{width:max-content}.flex{display:flex}.inline-flex{display:inline-flex}.flex-none{flex:none}.shrink{flex-shrink:1}.grow{flex-grow:1}.table{display:table}.-translate-y-20{--un-translate-y:-5rem;transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.focus\:translate-y-0:focus{--un-translate-y:0;transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.transform{transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.cursor-pointer{cursor:pointer}.resize{resize:both}.place-items-center{place-items:center}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.justify-items-start{justify-items:start}.justify-items-center{justify-items:center}.\!gap-0{gap:0!important}.\!gap-3{gap:.75rem!important}.gap-\[18px\]{gap:18px}.gap-\[var\(--fwt-page-inset\)\]{gap:var(--fwt-page-inset)}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.\!gap-y-1{row-gap:.25rem!important}.gap-x-2{column-gap:.5rem}.gap-y-1{row-gap:.25rem}.overflow-hidden{overflow:hidden}.\!truncate{overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\!whitespace-nowrap{white-space:nowrap!important}.b,.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.rounded{border-radius:.25rem}.rounded-\[var\(--winui-overlay-corner-radius\,8px\)\]{border-radius:var(--winui-overlay-corner-radius,8px)}.rounded-md{border-radius:.375rem}.border-solid{border-style:solid}.border-b-solid{border-bottom-style:solid}.\!bg-transparent{background-color:transparent!important}.bg-transparent{background-color:transparent}.\!p-\[var\(--fwt-panel-inset\)\]{padding:var(--fwt-panel-inset)!important}.\!p-0{padding:0!important}.p-\[22px_var\(--fwt-page-inset\)_var\(--fwt-page-inset\)\]{padding:22px var(--fwt-page-inset) var(--fwt-page-inset)}.p-\[var\(--fwt-panel-inset\)\]{padding:var(--fwt-panel-inset)}.p-0{padding:0}.p-4{padding:1rem}.\!px-\[10px\]{padding-left:10px!important;padding-right:10px!important}.\!px-5{padding-left:1.25rem!important;padding-right:1.25rem!important}.\!py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.\!py-4{padding-top:1rem!important;padding-bottom:1rem!important}.px,.px-4{padding-left:1rem;padding-right:1rem}.px-\[10px\]{padding-left:10px;padding-right:10px}.px-\[var\(--fwt-panel-inset\)\]{padding-left:var(--fwt-panel-inset);padding-right:var(--fwt-panel-inset)}.px-3{padding-left:.75rem;padding-right:.75rem}.py-\[var\(--spacingVerticalSNudge\)\]{padding-top:var(--spacingVerticalSNudge);padding-bottom:var(--spacingVerticalSNudge)}.py-2{padding-top:.5rem;padding-bottom:.5rem}.text-center{text-align:center}.text-left{text-align:left}.indent{text-indent:1.5rem}.text-fui-base300{font-size:var(--fontSizeBase300);line-height:1}.leading-\[var\(--lineHeightBase300\)\]{line-height:var(--lineHeightBase300)}.underline,.hover\:underline:hover{text-decoration-line:underline}.no-underline{text-decoration:none}.tab{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.shadow{--un-shadow:var(--un-shadow-inset) 0 1px 3px 0 var(--un-shadow-color, rgb(0 0 0 / .1)),var(--un-shadow-inset) 0 1px 2px -1px var(--un-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.shadow-lg{--un-shadow:var(--un-shadow-inset) 0 10px 15px -3px var(--un-shadow-color, rgb(0 0 0 / .1)),var(--un-shadow-inset) 0 4px 6px -4px var(--un-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.outline{outline-style:solid}.ring{--un-ring-width:3px;--un-ring-offset-shadow:var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color);--un-ring-shadow:var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color);box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.blur{--un-blur:blur(8px);filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\@container{container-type:inline-size}@media(max-width:680px){.max-\[680px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[680px\]\:p-4{padding:1rem}}@media(max-width:900px){.max-\[900px\]\:grid-rows-\[58px_minmax\(0\,1fr\)\]{grid-template-rows:58px minmax(0,1fr)}.max-\[900px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[900px\]\:hidden{display:none}.max-\[900px\]\:flex{display:flex}.max-\[900px\]\:flex-col{flex-direction:column}.max-\[900px\]\:items-stretch{align-items:stretch}.max-\[900px\]\:justify-start{justify-content:flex-start}}:root{--fwt-page-inset: 28px;--fwt-panel-inset: 16px}@media(max-width:680px){:root{--fwt-page-inset: 16px}}:root{--fwt-font-size-mono: 13px;--fwt-line-height-mono: 20px;--fwt-font-size-mono-base100: 9px;--fwt-line-height-mono-base100: 14px;--fwt-font-size-mono-base500: 17px;--fwt-line-height-mono-base500: 24px;--fwt-font-size-mono-xs: 11px;--fwt-line-height-mono-xs: 16px}button,input,select,textarea{font:inherit}code,kbd,pre,samp{font-family:var(--fontFamilyMonospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace)}:where(code,kbd,samp){font-size:calc(1em - 1px)!important;background-color:transparent;color:inherit}:where(strong,b){font-weight:var(--fontWeightSemibold)}pre,.font-mono{font-size:var(--fwt-font-size-mono)!important;line-height:var(--fwt-line-height-mono)!important}.font-mono :where(button,input,select,textarea,code,kbd,pre,samp),pre :where(code,kbd,samp){font-size:inherit!important}.mono-size-100{--fwt-font-size-mono: var(--fwt-font-size-mono-base100);--fwt-line-height-mono: var(--fwt-line-height-mono-base100)}.mono-size-xs{--fwt-font-size-mono: var(--fwt-font-size-mono-xs);--fwt-line-height-mono: var(--fwt-line-height-mono-xs)}.mono-display{font-size:var(--fwt-font-size-mono-base500)!important;line-height:var(--fwt-line-height-mono-base500)!important}.font-mono,.font-mono button,.font-mono input,.font-mono select,.font-mono textarea{font-family:var(--fontFamilyMonospace)!important}/*!
2
+ * OverlayScrollbars
3
+ * Version: 2.13.0
4
+ *
5
+ * Copyright (c) Rene Haas | KingSora.
6
+ * https://github.com/KingSora
7
+ *
8
+ * Released under the MIT license.
9
+ */.os-size-observer,.os-size-observer-listener{scroll-behavior:auto!important;direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(.1)}.os-size-observer:before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(10)}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty:before{content:"";width:100%;height:100%}.os-size-observer-listener:empty:before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{0%{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport]),[data-overlayscrollbars-viewport~=scrollbarHidden],html[data-overlayscrollbars-viewport~=scrollbarHidden]>body{scrollbar-width:none!important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar,[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar-corner{-webkit-appearance:none!important;appearance:none!important;display:none!important;width:0!important;height:0!important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars]):not(html):not(body){overflow:auto}html[data-overlayscrollbars-body]{overflow:hidden}html[data-overlayscrollbars-body],html[data-overlayscrollbars-body]>body{width:100%;height:100%;margin:0}html[data-overlayscrollbars-body]>body{overflow:visible;margin:0}[data-overlayscrollbars]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;align-items:stretch!important;flex-direction:row!important;flex-wrap:nowrap!important;scroll-behavior:auto!important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){box-sizing:inherit;position:relative;flex:auto;height:auto;width:100%;min-width:0;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){--os-vaw: 0;--os-vah: 0;outline:none}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]):focus{outline:none}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]:before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{overflow:hidden!important}[data-overlayscrollbars~=host][data-overlayscrollbars~=noClipping],[data-overlayscrollbars-padding~=noClipping]{overflow:visible!important}[data-overlayscrollbars-viewport]{--os-viewport-overflow-x: hidden;--os-viewport-overflow-y: hidden;overflow-x:var(--os-viewport-overflow-x);overflow-y:var(--os-viewport-overflow-y)}[data-overlayscrollbars-viewport~=overflowXVisible]{--os-viewport-overflow-x: visible}[data-overlayscrollbars-viewport~=overflowXHidden]{--os-viewport-overflow-x: hidden}[data-overlayscrollbars-viewport~=overflowXScroll]{--os-viewport-overflow-x: scroll}[data-overlayscrollbars-viewport~=overflowYVisible]{--os-viewport-overflow-y: visible}[data-overlayscrollbars-viewport~=overflowYHidden]{--os-viewport-overflow-y: hidden}[data-overlayscrollbars-viewport~=overflowYScroll]{--os-viewport-overflow-y: scroll}[data-overlayscrollbars-viewport~=overflowImportant]{overflow-x:var(--os-viewport-overflow-x)!important;overflow-y:var(--os-viewport-overflow-y)!important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId){font-size:0!important;line-height:0!important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId):before,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId):after,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)>*{display:none!important;position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border-width:0!important}[data-overlayscrollbars-viewport~=measuring],[data-overlayscrollbars-viewport~=scrolling]{scroll-behavior:auto!important;scroll-snap-type:none!important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowXVisible]{overflow-x:hidden!important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowYVisible]{overflow-y:hidden!important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-contents]:not(#osFakeId):not([data-overlayscrollbars-padding]):not([data-overlayscrollbars-viewport]):not([data-overlayscrollbars-content]){display:contents}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto!important;width:auto!important}@property --os-scroll-percent{syntax: "<number>"; inherits: true; initial-value: 0;}@property --os-viewport-percent{syntax: "<number>"; inherits: true; initial-value: 0;}.os-scrollbar{--os-viewport-percent: 0;--os-scroll-percent: 0;--os-scroll-direction: 0;--os-scroll-percent-directional: calc( var(--os-scroll-percent) - (var(--os-scroll-percent) + (1 - var(--os-scroll-percent)) * -1) * var(--os-scroll-direction) )}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity .15s,visibility .15s,top .15s,right .15s,bottom .15s,left .15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none!important}.os-scrollbar-track{position:relative;padding:0!important;border:none!important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hide.os-scrollbar-auto-hide-hidden{opacity:0;visibility:hidden}.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none!important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important;transition:none!important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0;left:calc(var(--os-scroll-percent-directional) * 100%);transform:translate(calc(var(--os-scroll-percent-directional) * -100%));width:calc(var(--os-viewport-percent) * 100%)}.os-scrollbar-vertical .os-scrollbar-handle{right:0;top:calc(var(--os-scroll-percent-directional) * 100%);transform:translateY(calc(var(--os-scroll-percent-directional) * -100%));height:calc(var(--os-viewport-percent) * 100%)}@supports (container-type: size){.os-scrollbar-track{container-type:size}.os-scrollbar-horizontal .os-scrollbar-handle{left:auto;transform:translate(calc(var(--os-scroll-percent-directional) * 100cqw + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-vertical .os-scrollbar-handle{top:auto;transform:translateY(calc(var(--os-scroll-percent-directional) * 100cqh + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-rtl.os-scrollbar-horizontal .os-scrollbar-handle{right:auto;left:0}}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}@media print{.os-scrollbar{display:none}}.os-scrollbar{--os-size: 0;--os-padding-perpendicular: 0;--os-padding-axis: 0;--os-track-border-radius: 0;--os-track-bg: none;--os-track-bg-hover: none;--os-track-bg-active: none;--os-track-border: none;--os-track-border-hover: none;--os-track-border-active: none;--os-handle-border-radius: 0;--os-handle-bg: none;--os-handle-bg-hover: none;--os-handle-bg-active: none;--os-handle-border: none;--os-handle-border-hover: none;--os-handle-border-active: none;--os-handle-min-size: 33px;--os-handle-max-size: none;--os-handle-perpendicular-size: 100%;--os-handle-perpendicular-size-hover: 100%;--os-handle-perpendicular-size-active: 100%;--os-handle-interactive-area-offset: 0}.os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity .15s,background-color .15s,border-color .15s}.os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-track:before,.os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-track:before{top:calc(var(--os-padding-perpendicular) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,height .15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-track:before{left:calc(var(--os-padding-perpendicular) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,width .15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars-viewport~=measuring]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none!important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size: 10px;--os-padding-perpendicular: 2px;--os-padding-axis: 2px;--os-track-border-radius: 10px;--os-handle-interactive-area-offset: 4px;--os-handle-border-radius: 10px}.os-theme-dark{--os-handle-bg: rgba(0, 0, 0, .44);--os-handle-bg-hover: rgba(0, 0, 0, .55);--os-handle-bg-active: rgba(0, 0, 0, .66)}.os-theme-light{--os-handle-bg: rgba(255, 255, 255, .44);--os-handle-bg-hover: rgba(255, 255, 255, .55);--os-handle-bg-active: rgba(255, 255, 255, .66)}
@@ -0,0 +1,7 @@
1
+ import type { RefObject } from 'react';
2
+ export declare function NavSelectionIndicator({ containerRef, inset, otherListIs, selectedValue, }: {
3
+ containerRef: RefObject<HTMLElement | null>;
4
+ inset: number;
5
+ otherListIs: 'above' | 'below';
6
+ selectedValue: string;
7
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function BackNavigationButton(props: {
3
+ children: ReactNode;
4
+ } & ({
5
+ onClick: () => void;
6
+ to?: never;
7
+ } | {
8
+ onClick?: never;
9
+ to: string;
10
+ })): import("react").JSX.Element;
@@ -0,0 +1,21 @@
1
+ import type { CSSProperties } from 'react';
2
+ /** A hue that reads the same in both schemes, or one stated per scheme. */
3
+ export type BadgeHue = string | {
4
+ light: string;
5
+ dark: string;
6
+ };
7
+ /**
8
+ * A badge painted in an arbitrary hue. The label is resolved against the fill
9
+ * rather than the surface under it, because the wash moves the reading by enough
10
+ * to change the answer. Fill and stroke are fractions of the hue, so they
11
+ * composite over whatever is beneath and follow that surface's pointer and
12
+ * selection states on their own.
13
+ *
14
+ * A hue may differ by scheme -- WinUI states its own success, caution and
15
+ * critical colours twice, because a colour that carries a meaning against white
16
+ * is not the one that carries it against black.
17
+ */
18
+ export declare const useBadgeHue: (hue: BadgeHue) => {
19
+ className: string;
20
+ style: CSSProperties;
21
+ };
@@ -0,0 +1,11 @@
1
+ import type { ComponentProps, CSSProperties, ReactElement, ReactNode, Ref } from 'react';
2
+ declare const Tag: import("@fluentui/react-components").ForwardRefComponent<import("@fluentui/react-components").TagProps<string>>;
3
+ type ChipTriggerProps = Omit<ComponentProps<typeof Tag>, 'appearance' | 'children' | 'className' | 'disabled' | 'dismissIcon' | 'dismissible' | 'icon' | 'media' | 'primaryText' | 'secondaryText' | 'selected' | 'shape' | 'size' | 'style' | 'value'>;
4
+ export declare function Chip({ children, className, icon, style, textRef, ...trigger }: {
5
+ children: ReactNode;
6
+ className?: string;
7
+ icon?: ReactElement;
8
+ style?: CSSProperties;
9
+ textRef?: Ref<HTMLSpanElement>;
10
+ } & ChipTriggerProps): import("react").JSX.Element;
11
+ export {};
@@ -0,0 +1,25 @@
1
+ export interface ChoiceGroupItem {
2
+ value: string;
3
+ label: string;
4
+ disabled?: boolean;
5
+ /**
6
+ * Where this choice's view lives, for a group that picks between views of
7
+ * data rather than between the values of a form field. The choice becomes an
8
+ * anchor and can be opened in a second tab, which is the whole point of
9
+ * addressing it: a range beside another range is a comparison.
10
+ */
11
+ to?: string;
12
+ }
13
+ export declare function ChoiceGroup({ ariaLabel, disabled, items, onChange, readOnly, value, }: {
14
+ ariaLabel: string;
15
+ disabled?: boolean;
16
+ items: ChoiceGroupItem[];
17
+ onChange: (value: string) => void;
18
+ /**
19
+ * The choice is shown but is not this operator's to make -- as distinct from
20
+ * disabled, which says the choice is not available at all. It keeps its own
21
+ * appearance and pointer states, takes focus, and refuses the selection.
22
+ */
23
+ readOnly?: boolean;
24
+ value: string;
25
+ }): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type CopyOutcome } from './use-copy-to-clipboard';
3
+ export declare function CodeBlock({ code, collapsed, copyOutcome, disabled, header, language, onCopy, wrap }: {
4
+ code: string;
5
+ collapsed?: boolean;
6
+ copyOutcome: CopyOutcome;
7
+ disabled?: boolean;
8
+ /** Replaces the language caption in the header bar, for switchers that pick which code this block shows. */
9
+ header?: ReactNode;
10
+ language: string;
11
+ onCopy: () => void;
12
+ wrap?: boolean;
13
+ }): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ export declare function ConfirmDialog({ actionIntent, actionLabel, busy, cancelLabel, error, message, onCancel, onConfirm, onDismissError, onExited, onOpenChange, open, title, }: {
2
+ actionIntent?: 'danger' | 'primary';
3
+ actionLabel: string;
4
+ busy?: boolean;
5
+ cancelLabel?: string;
6
+ error?: string | null;
7
+ message: string;
8
+ onCancel?: () => void;
9
+ onConfirm: () => void;
10
+ onDismissError?: () => void;
11
+ /** See DialogShell: the deed a confirmation does to its own tree goes here. */
12
+ onExited?: () => void;
13
+ onOpenChange: (open: boolean) => void;
14
+ open: boolean;
15
+ title: string;
16
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const copyToClipboard: (text: string) => Promise<boolean>;
@@ -0,0 +1,4 @@
1
+ declare const useStyles: () => Record<"button" | "menuItem", string>;
2
+ export declare const useDangerActionClasses: () => ReturnType<typeof useStyles>;
3
+ export declare const useDangerTextClass: () => string;
4
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function DashboardPageHeader({ actions, className, description, title }: {
3
+ actions?: ReactNode;
4
+ className?: string;
5
+ description?: string;
6
+ title: string;
7
+ }): import("react").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import type { DialogProps } from '@fluentui/react-components';
2
+ import type { ReactNode } from 'react';
3
+ declare const surfaceWidthClasses: {
4
+ standard: string;
5
+ editor: string;
6
+ };
7
+ export declare function DialogShell({ actions, children, onExited, onOpenChange, onSubmit, open, surfaceClassName, title, width }: {
8
+ actions: ReactNode;
9
+ children: ReactNode;
10
+ /**
11
+ * Runs once the surface has finished animating out. A caller whose
12
+ * confirmation destroys the tree the dialog lives in does the deed here:
13
+ * closing and destroying in one handler is one React commit, and the exit
14
+ * never gets to start.
15
+ */
16
+ onExited?: () => void;
17
+ onOpenChange: DialogProps['onOpenChange'];
18
+ onSubmit?: () => void;
19
+ open: boolean;
20
+ surfaceClassName?: string;
21
+ title: ReactNode;
22
+ width?: keyof typeof surfaceWidthClasses;
23
+ }): import("react").JSX.Element;
24
+ export {};
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ declare const ALIGN_CLASS: {
3
+ readonly center: "text-center justify-items-center";
4
+ readonly start: "justify-items-start";
5
+ };
6
+ export declare function EmptyState({ action, align, className, description, title }: {
7
+ action?: ReactNode;
8
+ align?: keyof typeof ALIGN_CLASS;
9
+ className?: string;
10
+ description?: ReactNode;
11
+ title: ReactNode;
12
+ }): import("react").JSX.Element;
13
+ export declare function EmptyStateLine({ children, className }: {
14
+ children: ReactNode;
15
+ className?: string;
16
+ }): import("react").JSX.Element;
17
+ export {};
@@ -0,0 +1 @@
1
+ export declare const errorShellCss = "\n /* 24px is ContentDialogPadding; the measure and the inset are ours, since a\n page that has to hold a stack trace is not a 548px dialog. The shell's own\n min-height of max-content is what keeps a long trace scrolling, where the\n full height beside it would clamp the shell to the viewport.\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/ContentDialog_themeresources.xaml#L18 */\n .fwt-error-shell {\n display: grid;\n align-content: center;\n justify-items: center;\n gap: 24px;\n height: 100%;\n min-height: max-content;\n margin: 0 auto;\n max-width: 720px;\n padding: 64px 24px;\n }\n /* A grid item's automatic minimum is its content, so without these a long\n trace widens the page past the measure above. */\n .fwt-error-shell > * { min-width: 0; max-width: 100%; }\n .fwt-error-shell-viewport { height: 100dvh; }\n /* A page heading, not a dialog title: takes ./dashboard-page-header.tsx's\n step rather than ContentDialogTitleMargin's 12.\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/ContentDialog_themeresources.xaml#L17 */\n .fwt-error-shell-stack { display: grid; gap: 6px; }\n .fwt-error-shell-stack > * { margin: 0; }\n /* ContentDialogButtonSpacing, but content-width instead of WinUI\n CommandSpace's equal star columns: this row sits in an open page and reads\n as two offered commands rather than as a page footer closing a dialog.\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/ContentDialog_themeresources.xaml#L16\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/ContentDialog_themeresources.xaml#L248-L258 */\n .fwt-error-shell-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; }\n";
@@ -0,0 +1,11 @@
1
+ import type { PropsWithChildren, ReactNode } from 'react';
2
+ export declare function ErrorShell({ action, children, message, title }: PropsWithChildren<{
3
+ action?: ReactNode;
4
+ /**
5
+ * Omitted when a trace is shown and it needs nothing said about it: the
6
+ * trace's first line is this sentence.
7
+ */
8
+ message?: ReactNode;
9
+ title: string;
10
+ }>): import("react").JSX.Element;
11
+ export declare function ErrorStack({ children }: PropsWithChildren): import("react").JSX.Element;
@@ -0,0 +1,27 @@
1
+ import type { CheckboxProps, ComboboxProps, DropdownProps, SwitchProps, TextareaProps } from '@fluentui/react-components';
2
+ import type { ForwardRefExoticComponent, MouseEvent, RefAttributes } from 'react';
3
+ declare const FluentInput: import("@fluentui/react-components").ForwardRefComponent<import("@fluentui/react-components").InputProps>;
4
+ interface ReadOnlyProp {
5
+ readOnly?: boolean;
6
+ }
7
+ export declare const LISTBOX_POSITIONING: {
8
+ position: "below";
9
+ align: "start";
10
+ autoSize: "height";
11
+ fallbackPositions: "above"[];
12
+ overflowBoundaryPadding: number;
13
+ };
14
+ interface ListWidthProp {
15
+ listWidth?: 'target' | 'content';
16
+ }
17
+ interface EmptyMessageProp {
18
+ emptyMessage?: string;
19
+ }
20
+ export declare const Input: typeof FluentInput;
21
+ export declare const Combobox: ForwardRefExoticComponent<Omit<ComboboxProps, 'appearance' | 'listbox'> & ListWidthProp & EmptyMessageProp & ReadOnlyProp & RefAttributes<HTMLInputElement>>;
22
+ export declare const Dropdown: ForwardRefExoticComponent<Omit<DropdownProps, 'appearance' | 'listbox'> & ListWidthProp & EmptyMessageProp & ReadOnlyProp & RefAttributes<HTMLButtonElement>>;
23
+ export declare const refuseToggle: (event: MouseEvent<HTMLInputElement>) => void;
24
+ export declare const Checkbox: ForwardRefExoticComponent<Omit<CheckboxProps, 'shape' | 'size'> & ReadOnlyProp & RefAttributes<HTMLInputElement>>;
25
+ export declare const Switch: ForwardRefExoticComponent<SwitchProps & ReadOnlyProp & RefAttributes<HTMLInputElement>>;
26
+ export declare const Textarea: ForwardRefExoticComponent<Omit<TextareaProps, 'resize'> & RefAttributes<HTMLTextAreaElement>>;
27
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function HttpMethodBadge({ method }: {
3
+ method: string;
4
+ }): import("react").JSX.Element;
5
+ export declare function HttpStatusBadge({ children, severity }: {
6
+ children: ReactNode;
7
+ severity: 'success' | 'warning' | 'error';
8
+ }): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { InfoLabelProps, LabelProps } from '@fluentui/react-components';
2
+ import type { ReactNode } from 'react';
3
+ export declare const infoLabelSlot: (label: ReactNode, info: InfoLabelProps["info"]) => (_: unknown, slotProps: LabelProps) => import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ export declare const TIGHT_STACK_CLASS = "grid gap-1";
2
+ export declare const HEADER_ROW_CLASS = "flex items-center justify-between min-w-0 max-[900px]:flex-col max-[900px]:items-stretch";
3
+ export declare const SECTION_STACK_CLASS = "grid gap-2";
4
+ export declare const PANEL_STACK_CLASS = "!grid !gap-3";
5
+ export declare const TWO_COLUMN_FORM_CLASS = "grid grid-cols-2 max-[680px]:grid-cols-1";
6
+ export declare const PANE_GAP_CLASS = "gap-[var(--fwt-page-inset)]";
7
+ export declare const SCROLLPORT_FILL_CLASS = "h-full min-h-max";
8
+ export declare const CONTROL_ROW_CLASS = "!min-h-[34px]";
9
+ export declare const CHECKBOX_LIST_CLASS = "gap-x-2 gap-y-1";
@@ -0,0 +1 @@
1
+ export declare const loadingCss = "\n .fwt-loading {\n box-sizing: border-box;\n display: grid;\n height: 100%;\n padding: 20px;\n place-items: center;\n }\n /* Only the boot screen owns the viewport; a content region is sized by the\n layout it waits inside. */\n .fwt-loading-app {\n min-height: 100dvh;\n }\n .fwt-loading .fui-Spinner {\n align-items: center;\n display: flex;\n gap: 8px;\n justify-content: center;\n line-height: 0;\n min-width: min-content;\n overflow: hidden;\n }\n /* WinUI's ProgressRingStrokeThickness is 4 on a 32-square ring, but Fluent\n carries the width into a radial-gradient stop where a percentage resolves\n against the closest-side radius, so an eighth of the diameter is written as\n a quarter. The circle behind the arc stays transparent.\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/ProgressRing/ProgressRing_themeresources.xaml#L5-L6\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/ProgressRing/ProgressRing_themeresources.xaml#L17\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/ProgressRing/ProgressRing.xaml#L12-L13\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/Common_themeresources_any.xaml#L219-L225\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/Common_themeresources_any.xaml#L125-L127 */\n .fwt-loading .fui-Spinner__spinner {\n --fui-Spinner--strokeWidth: 25%;\n animation: fwt-loading-spin 1.5s linear infinite;\n background-color: rgba(255, 255, 255, 0);\n color: var(--colorBrandStroke1, #0067c0);\n flex-shrink: 0;\n height: 32px;\n mask-image: radial-gradient(closest-side, transparent calc(100% - var(--fui-Spinner--strokeWidth) - 1px), white calc(100% - var(--fui-Spinner--strokeWidth)) calc(100% - 1px), transparent 100%);\n position: relative;\n width: 32px;\n -webkit-mask-image: radial-gradient(closest-side, transparent calc(100% - var(--fui-Spinner--strokeWidth) - 1px), white calc(100% - var(--fui-Spinner--strokeWidth)) calc(100% - 1px), transparent 100%);\n }\n .fwt-loading .fui-Spinner__spinnerTail {\n animation: fwt-loading-tail 1.5s cubic-bezier(0.33, 0, 0.67, 1) infinite;\n display: block;\n height: 100%;\n mask-image: conic-gradient(transparent 105deg, white 105deg);\n position: absolute;\n width: 100%;\n -webkit-mask-image: conic-gradient(transparent 105deg, white 105deg);\n }\n .fwt-loading .fui-Spinner__spinnerTail::before,\n .fwt-loading .fui-Spinner__spinnerTail::after {\n animation-duration: 1.5s;\n animation-iteration-count: infinite;\n animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n background-image: conic-gradient(currentcolor 135deg, transparent 135deg);\n content: '';\n display: block;\n height: 100%;\n position: absolute;\n width: 100%;\n }\n .fwt-loading .fui-Spinner__spinnerTail::before {\n animation-name: fwt-loading-tail-before;\n }\n .fwt-loading .fui-Spinner__spinnerTail::after {\n animation-name: fwt-loading-tail-after;\n }\n /* WinUI's ProgressRing has no label slot, so the label takes\n BodyTextBlockStyle rather than the subtitle2 Fluent gives a medium Spinner,\n which would read as a heading of the screen or region it is waiting in.\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/TextBlock_themeresources.xaml#L4\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/TextBlock_themeresources.xaml#L23-L25 */\n .fwt-loading .fui-Spinner__label {\n color: var(--colorNeutralForeground1, rgba(0, 0, 0, 0.894118));\n font-family: var(--fontFamilyBase, sans-serif);\n font-size: var(--fontSizeBase300, 14px);\n font-weight: var(--fontWeightRegular, 400);\n line-height: var(--lineHeightBase300, 20px);\n }\n /* Dark-dictionary literals for the same two tokens.\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/Common_themeresources_any.xaml#L329-L331\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/CommonStyles/Common_themeresources_any.xaml#L5-L9 */\n @media (prefers-color-scheme: dark) {\n .fwt-loading .fui-Spinner__spinner {\n color: var(--colorBrandStroke1, #4cc2ff);\n }\n .fwt-loading .fui-Spinner__label {\n color: var(--colorNeutralForeground1, #ffffff);\n }\n }\n @keyframes fwt-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes fwt-loading-tail {\n 0% { transform: rotate(-135deg); }\n 50% { transform: rotate(0deg); }\n 100% { transform: rotate(225deg); }\n }\n @keyframes fwt-loading-tail-before {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(105deg); }\n }\n @keyframes fwt-loading-tail-after {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(225deg); }\n }\n /* Highlight is the accent WinUI's HighContrast dictionary names for the arc.\n https://github.com/microsoft/microsoft-ui-xaml/blob/188f602b27cdb47572b28c380e9c087b02e1ccee/controls/dev/ProgressRing/ProgressRing_themeresources.xaml#L12-L15 */\n @media screen and (forced-colors: active) {\n .fwt-loading .fui-Spinner__spinner {\n background-color: HighlightText;\n color: Highlight;\n forced-color-adjust: none;\n }\n }\n";
@@ -0,0 +1,6 @@
1
+ export declare function AppLoadingScreen({ label }: {
2
+ label: string;
3
+ }): import("react").JSX.Element;
4
+ export declare function ContentLoadingScreen({ label }: {
5
+ label: string;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ export declare function MaskedIcon({ className, maskSize, url }: {
2
+ className?: string;
3
+ maskSize?: string;
4
+ url: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,21 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface MultiselectOption {
3
+ value: string;
4
+ label: string;
5
+ }
6
+ export declare function MultiselectCombobox({ ariaLabel, className, clearLabel, closedLabel, disabled, freeform, normalizeValue, onChange, options, placeholder, readOnly, renderOption, value, }: {
7
+ ariaLabel?: string;
8
+ className?: string;
9
+ clearLabel?: string;
10
+ closedLabel?: string;
11
+ disabled?: boolean;
12
+ freeform?: boolean;
13
+ normalizeValue?: (entry: string) => string;
14
+ onChange: (value: string[]) => void;
15
+ options: readonly MultiselectOption[];
16
+ placeholder: string;
17
+ readOnly?: boolean;
18
+ renderOption?: (option: MultiselectOption) => ReactNode;
19
+ value: readonly string[];
20
+ }): import("react").JSX.Element;
21
+ export declare const valuesAsOptions: (values: readonly string[]) => MultiselectOption[];
@@ -0,0 +1,4 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function OpenLinkLabel({ children }: {
3
+ children: ReactNode;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function OutcomeMessageBar({ action, children, className, intent, onDismiss, title, }: {
3
+ action?: ReactNode;
4
+ children: ReactNode;
5
+ className?: string;
6
+ intent?: 'error' | 'warning' | 'success' | 'info';
7
+ onDismiss?: () => void;
8
+ title?: string;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import type { PropsWithChildren } from 'react';
2
+ interface OutcomeHandle {
3
+ succeed: (message: string) => void;
4
+ /** Drops the pending toast. For a failure, which is reported in place. */
5
+ settle: () => void;
6
+ }
7
+ export interface OutcomeToasts {
8
+ /** Announces work in flight; the toast stays until the handle settles it. */
9
+ start: (pending: string) => OutcomeHandle;
10
+ succeed: (message: string) => void;
11
+ }
12
+ export declare function OutcomeToastProvider({ children }: PropsWithChildren): import("react").JSX.Element;
13
+ export declare const useOutcomeToasts: () => OutcomeToasts;
14
+ export {};