@meddleware/ui 0.1.35 → 0.1.37

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 (202) hide show
  1. package/README.md +49 -13
  2. package/dist/_virtual/_plugin-vue_export-helper.js +8 -0
  3. package/dist/base.css +48 -2
  4. package/dist/components/AppFooter.css +1 -0
  5. package/dist/components/AppFooter.js +7 -0
  6. package/dist/components/AppFooter.vue_vue_type_script_setup_true_lang.js +42 -0
  7. package/dist/components/AppHeader.css +1 -0
  8. package/dist/components/AppHeader.js +7 -0
  9. package/dist/components/AppHeader.vue.d.ts +8 -0
  10. package/dist/components/AppHeader.vue_vue_type_script_setup_true_lang.js +68 -0
  11. package/dist/components/AppSidebar.css +1 -0
  12. package/dist/components/AppSidebar.js +7 -0
  13. package/dist/components/AppSidebar.vue.d.ts +3 -0
  14. package/dist/components/AppSidebar.vue_vue_type_script_setup_true_lang.js +37 -0
  15. package/dist/components/AppTabNav.css +1 -0
  16. package/dist/components/AppTabNav.js +7 -0
  17. package/dist/components/AppTabNav.vue.d.ts +3 -0
  18. package/dist/components/AppTabNav.vue_vue_type_script_setup_true_lang.js +70 -0
  19. package/dist/components/ColorModeControl.css +1 -0
  20. package/dist/components/ColorModeControl.js +7 -0
  21. package/dist/components/ColorModeControl.vue_vue_type_script_setup_true_lang.js +58 -0
  22. package/dist/components/CopyableAddress.css +1 -0
  23. package/dist/components/CopyableAddress.js +7 -0
  24. package/dist/components/CopyableAddress.vue_vue_type_script_setup_true_lang.js +28 -0
  25. package/dist/components/CopyrightLine.css +1 -0
  26. package/dist/components/CopyrightLine.js +7 -0
  27. package/dist/components/CopyrightLine.vue.d.ts +6 -0
  28. package/dist/components/CopyrightLine.vue_vue_type_script_setup_true_lang.js +80 -0
  29. package/dist/components/ExplorerLink.css +1 -0
  30. package/dist/components/ExplorerLink.js +7 -0
  31. package/dist/components/ExplorerLink.vue_vue_type_script_setup_true_lang.js +27 -0
  32. package/dist/components/SidebarGroup.css +1 -0
  33. package/dist/components/SidebarGroup.js +7 -0
  34. package/dist/components/SidebarGroup.vue_vue_type_script_setup_true_lang.js +14 -0
  35. package/dist/components/SidebarItem.css +1 -0
  36. package/dist/components/SidebarItem.js +7 -0
  37. package/dist/components/SidebarItem.vue.d.ts +3 -0
  38. package/dist/components/SidebarItem.vue_vue_type_script_setup_true_lang.js +43 -0
  39. package/dist/components/StatusWidget.css +1 -0
  40. package/dist/components/StatusWidget.js +7 -0
  41. package/dist/components/StatusWidget.vue_vue_type_script_setup_true_lang.js +33 -0
  42. package/dist/components/UiActivityFeed.css +1 -0
  43. package/dist/components/UiActivityFeed.js +7 -0
  44. package/dist/components/UiActivityFeed.vue_vue_type_script_setup_true_lang.js +13 -0
  45. package/dist/components/UiActivityItem.css +1 -0
  46. package/dist/components/UiActivityItem.js +7 -0
  47. package/dist/components/UiActivityItem.vue_vue_type_script_setup_true_lang.js +22 -0
  48. package/dist/components/UiAmount.css +1 -0
  49. package/dist/components/UiAmount.js +7 -0
  50. package/dist/components/UiAmount.vue.d.ts +12 -0
  51. package/dist/components/UiAmount.vue_vue_type_script_setup_true_lang.js +31 -0
  52. package/dist/components/UiAppShell.css +1 -0
  53. package/dist/components/UiAppShell.js +7 -0
  54. package/dist/components/UiAppShell.vue.d.ts +26 -0
  55. package/dist/components/UiAppShell.vue_vue_type_script_setup_true_lang.js +27 -0
  56. package/dist/components/UiBadge.css +1 -0
  57. package/dist/components/UiBadge.js +7 -0
  58. package/dist/components/UiBadge.vue.d.ts +10 -1
  59. package/dist/components/UiBadge.vue_vue_type_script_setup_true_lang.js +35 -0
  60. package/dist/components/UiButton.css +1 -0
  61. package/dist/components/UiButton.js +7 -0
  62. package/dist/components/UiButton.vue.d.ts +17 -7
  63. package/dist/components/UiButton.vue_vue_type_script_setup_true_lang.js +60 -0
  64. package/dist/components/UiCard.css +1 -0
  65. package/dist/components/UiCard.js +7 -0
  66. package/dist/components/UiCard.vue.d.ts +20 -6
  67. package/dist/components/UiCard.vue_vue_type_script_setup_true_lang.js +51 -0
  68. package/dist/components/UiCheckField.css +1 -0
  69. package/dist/components/UiCheckField.js +7 -0
  70. package/dist/components/UiCheckField.vue.d.ts +26 -0
  71. package/dist/components/UiCheckField.vue_vue_type_script_setup_true_lang.js +31 -0
  72. package/dist/components/UiCodeBlock.css +1 -0
  73. package/dist/components/UiCodeBlock.js +7 -0
  74. package/dist/components/UiCodeBlock.vue.d.ts +21 -0
  75. package/dist/components/UiCodeBlock.vue_vue_type_script_setup_true_lang.js +21 -0
  76. package/dist/components/UiCopyButton.css +1 -0
  77. package/dist/components/UiCopyButton.js +7 -0
  78. package/dist/components/UiCopyButton.vue.d.ts +11 -0
  79. package/dist/components/UiCopyButton.vue_vue_type_script_setup_true_lang.js +64 -0
  80. package/dist/components/UiDataTable.css +1 -0
  81. package/dist/components/UiDataTable.js +7 -0
  82. package/dist/components/UiDataTable.vue.d.ts +5 -0
  83. package/dist/components/UiDataTable.vue_vue_type_script_setup_true_lang.js +56 -0
  84. package/dist/components/UiDateTimeField.js +5 -0
  85. package/dist/components/UiDateTimeField.vue.d.ts +18 -0
  86. package/dist/components/UiDateTimeField.vue_vue_type_script_setup_true_lang.js +51 -0
  87. package/dist/components/UiDialog.css +1 -0
  88. package/dist/components/UiDialog.js +7 -0
  89. package/dist/components/UiDialog.vue.d.ts +8 -5
  90. package/dist/components/UiDialog.vue_vue_type_script_setup_true_lang.js +78 -0
  91. package/dist/components/UiEmptyState.css +1 -0
  92. package/dist/components/UiEmptyState.js +7 -0
  93. package/dist/components/UiEmptyState.vue.d.ts +15 -0
  94. package/dist/components/UiEmptyState.vue_vue_type_script_setup_true_lang.js +10 -0
  95. package/dist/components/UiFieldHint.css +1 -0
  96. package/dist/components/UiFieldHint.js +7 -0
  97. package/dist/components/UiFieldHint.vue_vue_type_script_setup_true_lang.js +24 -0
  98. package/dist/components/UiFileField.css +1 -0
  99. package/dist/components/UiFileField.js +7 -0
  100. package/dist/components/UiFileField.vue.d.ts +17 -0
  101. package/dist/components/UiFileField.vue_vue_type_script_setup_true_lang.js +55 -0
  102. package/dist/components/UiFormField.css +1 -0
  103. package/dist/components/UiFormField.js +7 -0
  104. package/dist/components/UiFormField.vue_vue_type_script_setup_true_lang.js +38 -0
  105. package/dist/components/UiInput.css +1 -0
  106. package/dist/components/UiInput.js +7 -0
  107. package/dist/components/UiInput.vue.d.ts +10 -0
  108. package/dist/components/UiInput.vue_vue_type_script_setup_true_lang.js +20 -0
  109. package/dist/components/UiLiveStatus.css +1 -0
  110. package/dist/components/UiLiveStatus.js +7 -0
  111. package/dist/components/UiLiveStatus.vue.d.ts +19 -0
  112. package/dist/components/UiLiveStatus.vue_vue_type_script_setup_true_lang.js +17 -0
  113. package/dist/components/UiMeter.css +1 -0
  114. package/dist/components/UiMeter.js +7 -0
  115. package/dist/components/UiMeter.vue.d.ts +11 -0
  116. package/dist/components/UiMeter.vue_vue_type_script_setup_true_lang.js +41 -0
  117. package/dist/components/UiNotice.css +1 -0
  118. package/dist/components/UiNotice.js +7 -0
  119. package/dist/components/UiNotice.vue.d.ts +16 -8
  120. package/dist/components/UiNotice.vue_vue_type_script_setup_true_lang.js +22 -0
  121. package/dist/components/UiPager.css +1 -0
  122. package/dist/components/UiPager.js +7 -0
  123. package/dist/components/UiPager.vue.d.ts +23 -0
  124. package/dist/components/UiPager.vue_vue_type_script_setup_true_lang.js +46 -0
  125. package/dist/components/UiPanel.css +1 -0
  126. package/dist/components/UiPanel.js +7 -0
  127. package/dist/components/UiPanel.vue_vue_type_script_setup_true_lang.js +21 -0
  128. package/dist/components/UiSegmentedControl.css +1 -0
  129. package/dist/components/UiSegmentedControl.js +7 -0
  130. package/dist/components/UiSegmentedControl.vue.d.ts +11 -1
  131. package/dist/components/UiSegmentedControl.vue_vue_type_script_setup_true_lang.js +57 -0
  132. package/dist/components/UiSelect.css +1 -0
  133. package/dist/components/UiSelect.js +7 -0
  134. package/dist/components/UiSelect.vue.d.ts +2 -1
  135. package/dist/components/UiSelect.vue_vue_type_script_setup_true_lang.js +19 -0
  136. package/dist/components/UiSelectField.js +5 -0
  137. package/dist/components/UiSelectField.vue.d.ts +29 -0
  138. package/dist/components/UiSelectField.vue_vue_type_script_setup_true_lang.js +58 -0
  139. package/dist/components/UiSkipLink.css +1 -0
  140. package/dist/components/UiSkipLink.js +7 -0
  141. package/dist/components/UiSkipLink.vue.d.ts +8 -0
  142. package/dist/components/UiSkipLink.vue_vue_type_script_setup_true_lang.js +14 -0
  143. package/dist/components/UiStatGrid.css +1 -0
  144. package/dist/components/UiStatGrid.js +7 -0
  145. package/dist/components/UiStatGrid.vue_vue_type_script_setup_true_lang.js +10 -0
  146. package/dist/components/UiStatRow.css +1 -0
  147. package/dist/components/UiStatRow.js +7 -0
  148. package/dist/components/UiStatRow.vue_vue_type_script_setup_true_lang.js +19 -0
  149. package/dist/components/UiStatusBar.css +1 -0
  150. package/dist/components/UiStatusBar.js +7 -0
  151. package/dist/components/UiStatusBar.vue_vue_type_script_setup_true_lang.js +45 -0
  152. package/dist/components/UiStatusDot.css +1 -0
  153. package/dist/components/UiStatusDot.js +7 -0
  154. package/dist/components/UiStatusDot.vue.d.ts +6 -2
  155. package/dist/components/UiStatusDot.vue_vue_type_script_setup_true_lang.js +26 -0
  156. package/dist/components/UiStepper.css +1 -0
  157. package/dist/components/UiStepper.js +7 -0
  158. package/dist/components/UiStepper.vue.d.ts +10 -2
  159. package/dist/components/UiStepper.vue_vue_type_script_setup_true_lang.js +55 -0
  160. package/dist/components/UiTabPanel.css +1 -0
  161. package/dist/components/UiTabPanel.js +7 -0
  162. package/dist/components/UiTabPanel.vue_vue_type_script_setup_true_lang.js +22 -0
  163. package/dist/components/UiTextField.js +5 -0
  164. package/dist/components/UiTextField.vue.d.ts +35 -0
  165. package/dist/components/UiTextField.vue_vue_type_script_setup_true_lang.js +59 -0
  166. package/dist/components/UiTextarea.css +1 -0
  167. package/dist/components/UiTextarea.js +7 -0
  168. package/dist/components/UiTextarea.vue.d.ts +10 -0
  169. package/dist/components/UiTextarea.vue_vue_type_script_setup_true_lang.js +19 -0
  170. package/dist/components/UiToolIntro.css +1 -0
  171. package/dist/components/UiToolIntro.js +7 -0
  172. package/dist/components/UiToolIntro.vue_vue_type_script_setup_true_lang.js +10 -0
  173. package/dist/components/UiToolbar.css +1 -0
  174. package/dist/components/UiToolbar.js +7 -0
  175. package/dist/components/UiToolbar.vue.d.ts +5 -2
  176. package/dist/components/UiToolbar.vue_vue_type_script_setup_true_lang.js +49 -0
  177. package/dist/components/UiToolbarButton.css +1 -0
  178. package/dist/components/UiToolbarButton.js +7 -0
  179. package/dist/components/UiToolbarButton.vue_vue_type_script_setup_true_lang.js +13 -0
  180. package/dist/composables/useColorMode.js +46 -0
  181. package/dist/composables/useNow.d.ts +6 -0
  182. package/dist/composables/useNow.js +12 -0
  183. package/dist/composables/usePager.d.ts +28 -0
  184. package/dist/composables/usePager.js +36 -0
  185. package/dist/composables/useSeason.js +8 -0
  186. package/dist/composables/useStatusSnapshot.d.ts +28 -0
  187. package/dist/composables/useStatusSnapshot.js +38 -0
  188. package/dist/index.d.ts +28 -8
  189. package/dist/index.js +58 -0
  190. package/dist/internal/panel.d.ts +8 -2
  191. package/dist/internal/panel.js +29 -0
  192. package/dist/reset.css +1 -0
  193. package/dist/runtime-config.js +73 -0
  194. package/dist/styles/reset.d.ts +1 -0
  195. package/dist/tabs.js +9 -0
  196. package/dist/theme-init.js +26 -0
  197. package/package.json +14 -10
  198. package/dist/explorer.d.ts +0 -13
  199. package/dist/safe-href.d.ts +0 -20
  200. package/dist/status.d.ts +0 -29
  201. package/dist/truncate.d.ts +0 -14
  202. package/dist/ui.js +0 -1086
package/README.md CHANGED
@@ -20,13 +20,25 @@ Import the CSS once at your application entry point:
20
20
  // src/main.ts (or equivalent)
21
21
  import '@meddleware/design-tokens/tokens.css' // required — registers CSS custom properties
22
22
  import '@meddleware/design-tokens/seasons.css' // optional — enables data-season theming
23
- import '@meddleware/ui/base.css' // optional — element defaults + scale + utilities
23
+ import '@meddleware/ui/reset.css' // required once — element defaults, focus ring, utilities
24
24
  import { createApp } from 'vue'
25
25
  import App from './App.vue'
26
26
 
27
27
  createApp(App).mount('#app')
28
28
  ```
29
29
 
30
+ Each component brings **its own CSS** when you import it, so a bundler keeps only the styles of the components an app uses (the package
31
+ declares `*.css` as a side effect, and each component's import lives in its own module). `@meddleware/ui/base.css` is the old single
32
+ file (reset + every component) for consumers that want it.
33
+
34
+ **Cascade layers.** The reset is `@layer mw.reset` and every component's CSS is `@layer mw.components`. Layered CSS always loses to your
35
+ unlayered CSS, so you override a component with an ordinary selector and never have to out-specify its internals.
36
+
37
+ **No flash of the wrong theme.** Load `@meddleware/ui/theme-init.js` as a plain script at the top of `<head>`
38
+ (`<script src="/theme-init.js" data-default="dark"></script>`, copied from the package into your public folder). It applies the saved
39
+ colour mode (or `data-default`: `light`, `dark` or `system`) and the season to `<html>` before first paint, with the same rules as
40
+ `useColorMode` and `useSeason`. It is a same-origin file, so it needs no CSP hash.
41
+
30
42
  ## Styling, scales & utilities
31
43
 
32
44
  Components consume the design-token **role** tokens (`--accent`, `--warning`, `--focus-ring`, …) and
@@ -35,7 +47,7 @@ colour-named or magic-number values. Focus states use the dedicated `--focus-rin
35
47
  always visible and never read as an error. Component **props and accessibility are unchanged** by the
36
48
  theming system — only the styling tokens they resolve to.
37
49
 
38
- `base.css` also ships opt-in utilities (respecting `prefers-reduced-motion`):
50
+ `reset.css` also ships utilities (respecting `prefers-reduced-motion`) and gives a bare `<button>` a base look from the tokens:
39
51
 
40
52
  | Utility | Purpose |
41
53
  | --- | --- |
@@ -54,11 +66,11 @@ Seasonal theming is entirely in `@meddleware/design-tokens` (import `seasons.css
54
66
 
55
67
  | Component | Description |
56
68
  | --- | --- |
57
- | `AppHeader` | Top bar (`<header>`). Slots `brand`, default and `actions` render **directly** in the header — no wrapper elements. The brand slot's single element comes first and takes the brand typography, pushing everything after it to the inline end; default-slot content that should fill the gap sets its own `flex: 1`. |
58
- | `AppSidebar` | Side panel (`<aside>`) around a component-owned `<nav aria-label="Primary">` (default slot). The `head`, `body` and `foot` slots render directly and style themselves; the nav grows, so body/foot content settles at the bottom. |
69
+ | `AppHeader` | Top bar (`<header>`). `sidebarId` shows a menu button below 45em that opens that sidebar as a drawer. Slots `brand`, default and `actions` render **directly** in the header — no wrapper elements. The brand slot's single element comes first and takes the brand typography, pushing everything after it to the inline end; default-slot content that should fill the gap sets its own `flex: 1`. |
70
+ | `AppSidebar` | Side panel (`<aside>`) around a component-owned `<nav>` (default slot; `navLabel`, default "Primary"). Below 45em it becomes a **drawer** on the Popover API, opened by `AppHeader`'s menu button (give the sidebar an `id`, pass it as `sidebar-id`), closed by Escape, a click outside, or choosing an item. The `head`, `body` and `foot` slots render directly and style themselves; the nav grows, so body/foot content settles at the bottom. |
59
71
  | `AppFooter` | Page footer (`<footer>`). Slots `start`, default and `end` render directly; `docsUrl` / `devUrl` render a component-owned `<nav aria-label="Documentation">` at the inline end. |
60
72
 
61
- All three accept a `variant` prop:
73
+ All three accept a `variant` prop (a CSS class, `mw-panel--dark` and so on, defined in the reset; `colors` overrides are written to the element through the CSSOM, never as an inline `style` attribute, so they work under a strict CSP):
62
74
 
63
75
  | Variant | Behaviour |
64
76
  | --- | --- |
@@ -70,14 +82,14 @@ All three accept a `variant` prop:
70
82
 
71
83
  | Component | Description |
72
84
  | --- | --- |
73
- | `UiButton` | Styled button. |
74
- | `UiCard` | Card `<section>`: optional `<header>` (title), body content directly inside, optional `<footer>`. |
85
+ | `UiButton` | Styled button, or a link that looks like one (`href`, checked with `safeHref`). `variant` primary / secondary / ghost / danger / link; `size` md / sm; `busy` shows a spinner, sets `aria-busy` and blocks interaction without losing the label. Hover is an inner ring in the label colour, so the label keeps its contrast. |
86
+ | `UiCard` | Card: optional `<header>` (title), body content directly inside, optional `<footer>`. `as` section / article / li, `level` 2–6 for the heading, `plain` drops the header band, `href` makes the whole card a link through its title (one tab stop). Inside a list item the band and footer are plain elements (a `<header>` there would become a page-level landmark). |
75
87
  | `UiSelect` | Styled native `<select>` (single root; attributes fall through; chevron painted in CSS). Label it with `UiFormField` or an `aria-label`. |
76
88
  | `UiFormField` | A labelled field as a `<p>`: `<label for>` + `label-suffix` slot (e.g. `UiFieldHint`, kept outside the label) + control slot (receives `attrs` with `id` / `aria-*`) + hint/error `<small>`. Slot content must be phrasing content. |
77
- | `UiNotice` | Notice / alert banner. |
78
- | `UiDialog` | Modal on the native `<dialog>`: `<article>` › `<header>` (h2 title + close) · body slot · `<footer>` (`actions` slot, scoped `close(value)`). `v-model:open`, `title`, `dismissible` (Escape/backdrop/close button via native `closedby`), `width`; emits `close(returnValue)`. |
89
+ | `UiNotice` | Notice / alert banner. `type` info / warning / error / ok (roles: `alert` for error, `status` for ok and warning), `message` prop or slot, `as` p / div for block content. The text keeps body colour; the tone is the border and tint. |
90
+ | `UiDialog` | Modal on the native `<dialog>`: `<article>` › `<header>` (title heading, `level` default 2, + close) · body slot · `<footer>` (`actions` slot, scoped `close(value)`). `v-model:open`, `title`, `dismissible` (Escape/backdrop/close button via native `closedby`), `width`; emits `close(returnValue)`. |
79
91
  | `AppTabNav` / `UiTabPanel` | WAI-ARIA tabs: `AppTabNav` is the `tablist` (arrow keys, Home/End, roving tabindex); wrap each view's content in `UiTabPanel` with the same `idPrefix` and the shown `tab` id. Only the selected tab gets `aria-controls` (one panel rendered); pass `all-panels` when every tab's panel stays mounted. `tabIds(prefix, id)` returns the linked ids. |
80
- | `SidebarItem` | Navigation button for use inside `AppSidebar`. Accepts `label`, `icon`, `active`, and `disabled` props. |
92
+ | `SidebarItem` | Sidebar entry: a button by default, a real `<a>` with `href` (checked with `safePath` / `safeHref`). `label`, `icon`, `active` (`aria-current="page"`), `disabled`. |
81
93
  | `SidebarGroup` | Labelled group of sidebar items: a `<fieldset>` whose visible `<legend>` names the group. |
82
94
  | `CopyableAddress` | Shows a value (address/blob id/tx digest) with a dedicated **copy icon** (the value text is not the copy trigger). Put a link in the default slot to make it both linkable and copyable. Props: `address`, `truncate`, `chars`, `label`. |
83
95
  | `ExplorerLink` | External block-explorer link with a truncated label (or slot). Chain-agnostic — pass `href` (build it with `suiExplorerUrl`, or an app helper such as a Walruscan URL). Nest inside `CopyableAddress` for link + copy. |
@@ -97,10 +109,34 @@ icon copies:
97
109
  | --- | --- |
98
110
  | `UiPanel` | Titled surface: `<section>` + heading (`title` prop/slot; `level` 2–6, default 2) + body content directly inside. |
99
111
  | `UiStatGrid` / `UiStatRow` | Key/value readout as a description list (`<dl>` with `<dt>`/`<dd>` pairs). |
100
- | `UiToolbar` | Toolbar as `<menu>` (a list of commands). Props: `actions: ToolbarAction[]` (`{ id, label, disabled? }`); emits `action(id)`. |
112
+ | `UiToolbar` | A WAI-ARIA toolbar (`role="toolbar"`, one tab stop, Left/Right/Home/End between enabled buttons). Props: `actions: ToolbarAction[]` (`{ id, label, disabled? }`), `label`; emits `action(id)`. |
101
113
  | `UiToolbarButton` | Compact console button; also usable standalone (refresh, pagination). |
102
- | `UiStatusBar` | Status bar as a list. Standard items from optional props `network` (+ `healthy`), `epoch`, `lastRefresh`; extra `<li>` items in the default slot. |
103
- | `UiDataTable`, `UiBadge`, `UiStatusDot`, `UiActivityFeed` / `UiActivityItem` | Scrollable table; status pill; health dot; activity list (`UiActivityItem` takes `type`, `time`, optional `datetime` to render a `<time>`). |
114
+ | `UiStatusBar` | Status bar as a list. Standard items from optional props `network` (+ `healthy`), `epoch`, `lastRefresh` (the relative time ticks on its own); extra `<li>` items in the default slot. |
115
+ | `UiDataTable` | Table. `head` slot: `<th>` cells **only** (never a `<tr>`; the component wraps them, and a dev check warns); default slot: rows; `rows` (0 shows `empty`), `caption` (visually hidden accessible name). When wider than its box the scroll area becomes a focusable, labelled region and says so. A `th scope="row"` reads as the row title, not a column header. |
116
+ | `UiBadge` | Status or tag as words + symbol + border: `tone` ok / warn / danger / info / accent / neutral, `symbol` (own glyph, `false`, or the tone's default). The label keeps body colour. (`variant` is the old API.) |
117
+ | `UiStatusDot` | Decorative health dot: `status` operational / degraded / down / unknown (or ok / warn / error), `size` sm / md. Put the state in words beside it. |
118
+ | `UiActivityFeed` / `UiActivityItem` | Activity list (`UiActivityItem` takes `type`, `time`, optional `datetime` to render a `<time>`). |
119
+ | `UiSegmentedControl` | Radio-group choice: `label` names the group (a `<legend>`, visually hidden unless `label-hidden` is false), the chosen option carries a ✓, `layout` inline / wrap / grid. |
120
+ | `UiStepper` | Steps: a wizard (`v-model` index) or a progress list (`status` per step: done / busy / error / pending; `orientation="vertical"`), with the state in words for assistive technology. |
121
+ | `UiMeter` | Labelled native `<meter>` with the state in words (within / close to / over). |
122
+ | `UiPager` + `usePager` | Previous / next for a keyset-paginated list; `usePager(load)` keeps the cursors seen and drops out-of-order answers. |
123
+
124
+ ### Forms and small primitives
125
+
126
+ | Component | Description |
127
+ | --- | --- |
128
+ | `UiInput`, `UiTextarea` | Styled native controls (single root; attributes fall through; `v-model`). Label them with `UiFormField` or an `aria-label`. |
129
+ | `UiFileField` | `UiFormField` around a native file input: `id`, `label`, `hint`, `error`, `accept`, `disabled`, `required`; emits `select` with the chosen `File` (or `null`). |
130
+ | `UiTextField` | `UiFormField` + `UiInput` (or `UiTextarea` with `rows`), association done: `id`, `label`, `hint`, `error`; other attributes go to the control. |
131
+ | `UiSelectField`, `UiCheckField`, `UiDateTimeField` | A labelled select (`[value, label]` options, optional placeholder); a checkbox wrapped in its label (`label` slot for rich text); a date-time that edits wall time in a `zone` and exchanges UTC. |
132
+ | `UiLiveStatus` | A polite live region that is always mounted, so changes are announced. |
133
+ | `UiEmptyState`, `UiCodeBlock`, `UiCopyButton`, `UiAmount`, `UiSkipLink`, `UiAppShell` | "Nothing here yet" with an action slot; a focusable `<figure>`/`<pre>`; a copy icon that announces the result; an exact SUI/WAL amount in a `<data>` element; "Skip to content"; the page frame (skip link, `<main>`, header/sidebar/footer slots). |
134
+
135
+ ### Helpers
136
+
137
+ The framework-free helpers live in [`@meddleware/web-utils`](https://www.npmjs.com/package/@meddleware/web-utils) and are re-exported here
138
+ (`suiExplorerUrl`, `walruscanBlobUrl`, `safeHref`, `safePath`, `truncateMiddle`, the status parser and its `STATUS_LABEL` /
139
+ `STATUS_HEADLINE`). Composables: `useColorMode`, `useSeason`, `useNow`, `useStatusSnapshot`, `usePager`.
104
140
 
105
141
  ### Explorer helper
106
142
 
@@ -0,0 +1,8 @@
1
+ //#region \0plugin-vue:export-helper
2
+ var e = (e, t) => {
3
+ let n = e.__vccOpts || e;
4
+ for (let [e, r] of t) n[e] = r;
5
+ return n;
6
+ };
7
+ //#endregion
8
+ export { e as default };
package/dist/base.css CHANGED
@@ -1,2 +1,48 @@
1
- *,:before,:after{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--bg);min-height:100vh;color:var(--text);font-family:var(--mw-font-sans);font-size:var(--font-size-base);line-height:var(--leading-normal);letter-spacing:var(--tracking-normal);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility}:where(ul,ol):where([role=list],[role=listitem]),:where(menu){margin:0;padding:0;list-style:none}.mw-visually-hidden{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}:where(img,svg,video,canvas){max-width:100%;display:block}:where(fieldset){border:0;min-inline-size:0;margin:0;padding:0}:where(legend){padding:0}a{color:var(--accent);text-underline-offset:.18em;transition:color var(--transition-base);text-decoration:underline;text-decoration-thickness:.08em}a:hover{text-decoration-thickness:.14em}:where(button,input,select,textarea){font-family:inherit}:where(a,button,input,select,textarea):focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.mw-mono{font-family:var(--mw-font-mono)}.mw-noise{isolation:isolate;position:relative}.mw-noise:before{content:"";z-index:-1;background-image:var(--noise-overlay);opacity:var(--noise-opacity);pointer-events:none;background-repeat:repeat;position:absolute;inset:0}.mw-hand-drawn{display:inline-flex;position:relative}.mw-spinner{width:var(--space-sm);height:var(--space-sm);border:2px solid var(--border);border-top-color:var(--accent);animation:mw-spin var(--transition-slow) linear infinite;border-radius:50%;display:inline-block}@keyframes mw-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important}.mw-spinner{border-top-color:var(--accent);animation:none}}.mw-header[data-v-384786e1]{--_bg:var(--fff85088);--_surface:var(--v5048fb2c);--_text:var(--a5a150b8);--_muted:var(--bd016d2c);--_border:var(--v523d383a);--_ok:var(--ffec60da);--_danger:var(--v893937cc);--_info:var(--ca3eca36);align-items:center;gap:var(--space-2xs);height:var(--mw-header-height,56px);padding:0 var(--space-sm);background:var(--_bg);color:var(--_text);border-bottom:1px solid var(--_border);font-family:var(--mw-font-sans);transition:background var(--transition-base), backdrop-filter var(--transition-base), border-color var(--transition-base), box-shadow var(--transition-base);display:flex}.mw-header--sticky[data-v-384786e1]{z-index:50;position:sticky;top:0}.mw-header--scrolled[data-v-384786e1]{background:color-mix(in srgb, var(--_bg-solid,var(--bg)) 82%, transparent);-webkit-backdrop-filter:blur(10px);border-bottom-color:var(--border);box-shadow:0 1px 0 color-mix(in srgb, var(--border) 60%, transparent)}.mw-header>[data-v-384786e1-s]:first-child{align-items:center;gap:var(--space-2xs);letter-spacing:var(--tracking-wide);white-space:nowrap;margin-inline-end:auto;font-weight:650;text-decoration:none;display:flex}.mw-header a[data-v-384786e1-s]{color:inherit}.mw-header[data-v-384786e1]:not(.mw-header--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}.mw-sidebar[data-v-e5506501]{--_bg:var(--v5b5002f5);--_surface:var(--v6623eb93);--_text:var(--v33c4cec6);--_muted:var(--f34db0de);--_border:var(--e5796ac8);--_ok:var(--v5b55facc);--_danger:var(--v71c54ad3);--_info:var(--v58624844);--_width:var(--d1940a6a);height:100%;width:var(--_width);background:var(--_bg);color:var(--_text);border-right:1px solid var(--_border);font-family:var(--mw-font-sans);flex-direction:column;display:flex}.mw-sidebar__nav[data-v-e5506501]{gap:var(--space-3xs);padding:var(--space-xs) 0;flex-direction:column;flex:auto;display:flex;overflow-y:auto}.mw-sidebar a[data-v-e5506501-s]{color:inherit}.mw-sidebar[data-v-e5506501]:not(.mw-sidebar--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}.mw-footer[data-v-42cde159]{--_bg:var(--v331b054e);--_surface:var(--v5a224faf);--_text:var(--v328b0a01);--_muted:var(--v70cc3aa6);--_border:var(--v7419f300);--_ok:var(--v330f15a0);--_danger:var(--v589bf337);--_info:var(--v203c4d42);align-items:center;gap:var(--space-sm);padding:var(--space-xs) var(--space-sm);background:var(--_bg);color:var(--_muted);border-top:1px solid var(--_border);font-family:var(--mw-font-sans);font-size:var(--font-size-sm);flex-wrap:wrap;display:flex}.mw-footer--transparent[data-v-42cde159]{border-top:1px solid var(--border)}.mw-footer__docs[data-v-42cde159]{align-items:center;gap:var(--space-sm);margin-inline-start:auto;display:flex}.mw-footer__docs a[data-v-42cde159]{color:inherit;text-underline-offset:2px;text-decoration:underline}.mw-footer__docs a[data-v-42cde159]:hover{text-decoration-thickness:.14em}.mw-footer a[data-v-42cde159-s]{color:inherit}.mw-footer[data-v-42cde159]:not(.mw-footer--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}.mw-mode[data-v-e5cba7a7]{border:1px solid var(--_border,var(--border));border-radius:var(--radius);background:color-mix(in srgb, var(--_text,var(--text)) 6%, transparent);gap:2px;min-inline-size:0;margin:0;padding:2px;display:inline-flex}.mw-mode__btn[data-v-e5cba7a7]{align-items:center;gap:var(--space-3xs);padding:var(--space-3xs) var(--space-2xs);border-radius:calc(var(--radius) - 3px);color:var(--_text,var(--text));font:inherit;font-size:var(--font-size-sm);cursor:pointer;opacity:.7;transition:opacity var(--transition-base), background var(--transition-base);background:0 0;border:0;display:inline-flex}.mw-mode__btn[data-v-e5cba7a7]:hover{opacity:1}.mw-mode__btn.is-active[data-v-e5cba7a7]{opacity:1;background:color-mix(in srgb, var(--_text,var(--text)) 14%, transparent)}.mw-mode__btn[data-v-e5cba7a7]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}@media (width<=640px){.mw-mode__label[data-v-e5cba7a7]{display:none}}.mw-btn[data-v-bc33cc23]{justify-content:center;align-items:center;gap:var(--space-2xs);padding:var(--space-2xs) var(--space-xs);border-radius:var(--radius);font:inherit;cursor:pointer;transition:filter var(--transition-base), background var(--transition-base);border:1px solid #0000;font-weight:550;display:inline-flex}.mw-btn[data-v-bc33cc23]:disabled{opacity:.55;cursor:not-allowed}.mw-btn[data-v-bc33cc23]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.mw-btn--primary[data-v-bc33cc23]{background:var(--accent);color:var(--accent-contrast)}.mw-btn--primary[data-v-bc33cc23]:not(:disabled):hover{filter:brightness(1.08)}.mw-btn--secondary[data-v-bc33cc23]{background:var(--secondary);color:var(--secondary-contrast)}.mw-btn--secondary[data-v-bc33cc23]:not(:disabled):hover{filter:brightness(1.08)}.mw-btn--ghost[data-v-bc33cc23]{color:var(--text);border-color:var(--border);background:0 0}.mw-btn--ghost[data-v-bc33cc23]:not(:disabled):hover{background:var(--lift)}.mw-btn--danger[data-v-bc33cc23]{background:var(--danger);color:var(--accent-contrast)}.mw-btn--danger[data-v-bc33cc23]:not(:disabled):hover{filter:brightness(1.08)}.mw-card[data-v-384b36cf]{padding:var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);overflow:hidden}.mw-card__header[data-v-384b36cf]{margin:calc(-1 * var(--space-sm)) calc(-1 * var(--space-sm)) var(--space-sm);padding:var(--space-xs) var(--space-sm);border-bottom:1px solid var(--border)}.mw-card__title[data-v-384b36cf]{font-size:var(--font-size-base);margin:0;font-weight:600}.mw-card__footer[data-v-384b36cf]{margin:var(--space-sm) calc(-1 * var(--space-sm)) calc(-1 * var(--space-sm));padding:var(--space-xs) var(--space-sm);border-top:1px solid var(--border);background:var(--lift)}.mw-select[data-v-38fbd9b5]{--_chevron-stroke:var(--muted);--_chevron-arm:6px;appearance:none;width:100%;padding:var(--space-2xs) calc(var(--space-md) + var(--space-2xs)) var(--space-2xs) var(--space-xs);background-color:var(--surface);background-image:linear-gradient(45deg, transparent calc(50% - .75px), var(--_chevron-stroke) calc(50% - .75px), var(--_chevron-stroke) calc(50% + .75px), transparent calc(50% + .75px)), linear-gradient(-45deg, transparent calc(50% - .75px), var(--_chevron-stroke) calc(50% - .75px), var(--_chevron-stroke) calc(50% + .75px), transparent calc(50% + .75px));background-position:right calc(var(--space-xs) + var(--_chevron-arm)) center, right var(--space-xs) center;background-size:var(--_chevron-arm) var(--_chevron-arm);color:var(--text);border:1px solid var(--border);border-radius:var(--radius);font:inherit;background-repeat:no-repeat}.mw-select[data-v-38fbd9b5]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}.mw-notice[data-v-ee7fffb1]{padding:var(--space-2xs) var(--space-xs);border:1px solid var(--border);border-radius:var(--radius);background:var(--lift);color:var(--text);font-size:var(--font-size-sm);border-left-width:3px;margin:0}.mw-notice--error[data-v-ee7fffb1]{border-left-color:var(--danger);color:var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent)}.mw-notice--ok[data-v-ee7fffb1]{border-left-color:var(--ok);color:var(--ok);background:color-mix(in srgb, var(--ok) 8%, transparent)}.sidebar-item[data-v-c8ae7e5f]{align-items:center;gap:var(--space-2xs);width:100%;padding:var(--space-2xs) var(--space-sm);color:inherit;font:inherit;text-align:left;cursor:pointer;opacity:.85;transition:background var(--transition-base), opacity var(--transition-base);background:0 0;border:0;border-radius:0;display:flex}.sidebar-item[data-v-c8ae7e5f]:hover:not(:disabled){background:color-mix(in srgb, currentColor 10%, transparent);opacity:1}.sidebar-item.is-active[data-v-c8ae7e5f]{background:color-mix(in srgb, var(--accent) 26%, transparent);opacity:1}.sidebar-item[data-v-c8ae7e5f]:disabled{cursor:default}.sidebar-item[data-v-c8ae7e5f]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}.sidebar-item__icon[data-v-c8ae7e5f]{text-align:center;width:1.1rem}.sidebar-group[data-v-1ac17bd7]{border:0;min-inline-size:0;margin:0;padding:0}.sidebar-group--l1+.sidebar-group--l1[data-v-1ac17bd7]{margin-block-start:var(--space-2xs)}.sidebar-group__label[data-v-1ac17bd7]{float:inline-start;width:100%;padding:var(--space-3xs) var(--space-xs);font-size:var(--font-size-xs);color:var(--_muted,var(--muted));-webkit-user-select:none;user-select:none;font-weight:600}.sidebar-group__label[data-v-1ac17bd7]+*{clear:both}.sidebar-group--l1>.sidebar-group__label[data-v-1ac17bd7]{text-transform:uppercase;letter-spacing:var(--tracking-wide)}.sidebar-group--l2[data-v-1ac17bd7]{padding-inline-start:var(--space-3xs)}.sidebar-group--l2>.sidebar-group__label[data-v-1ac17bd7]{padding-inline-start:var(--space-xs);font-weight:500}.mw-tab-nav[data-v-fbb7de4c]{gap:var(--space-3xs);border-bottom:2px solid var(--border);margin:0;padding:0;list-style:none;display:flex}.mw-tab-nav__item[data-v-fbb7de4c]{display:contents}.mw-tab-nav__tab[data-v-fbb7de4c]{appearance:none;padding:var(--space-2xs) var(--space-sm);cursor:pointer;font-size:var(--font-size-base);color:var(--muted);transition:color var(--transition-base), border-color var(--transition-base);background:0 0;border:none;border-bottom:2px solid #0000;border-radius:0;margin-bottom:-2px}.mw-tab-nav__tab[data-v-fbb7de4c]:hover{color:var(--text)}.mw-tab-nav__tab--active[data-v-fbb7de4c]{border-bottom-color:var(--accent);color:var(--text);font-weight:600}.mw-tab-nav--raised[data-v-fbb7de4c]{border-bottom:1px solid var(--border);background:var(--surface);scrollbar-width:none;flex-shrink:0;align-items:flex-end;gap:2px;padding:4px 4px 0;overflow-x:auto}.mw-tab-nav--raised[data-v-fbb7de4c]::-webkit-scrollbar{display:none}.mw-tab-nav--raised .mw-tab-nav__tab[data-v-fbb7de4c]{border-bottom:1px solid var(--border);color:var(--muted);background:var(--lift);letter-spacing:.01em;white-space:nowrap;transition:color var(--transition-base), background var(--transition-base), border-color var(--transition-base);border-top:2px solid #0000;border-left:1px solid #0000;border-right:1px solid #0000;margin-bottom:-1px;padding:5px 14px 6px;font-size:.8rem;font-weight:500}.mw-tab-nav--raised .mw-tab-nav__tab[data-v-fbb7de4c]:hover:not(.mw-tab-nav__tab--active){color:var(--text);background:var(--surface)}.mw-tab-nav--raised .mw-tab-nav__tab--active[data-v-fbb7de4c]{color:var(--text);background:var(--bg);border-color:var(--accent) var(--border) var(--bg) var(--border);font-weight:600}.mw-tab-nav--raised.mw-tab-nav--lg[data-v-fbb7de4c]{gap:3px;padding:6px 6px 0}.mw-tab-nav--raised.mw-tab-nav--lg .mw-tab-nav__tab[data-v-fbb7de4c]{padding:9px 20px 10px;font-size:.95rem;font-weight:600}.mw-tab-panel[data-v-add194c8]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}.mw-dialog[data-v-78973168]{--_width:var(--ce627f2e);width:var(--_width);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);max-height:90vh;color:var(--text);padding:0;box-shadow:0 1.25rem 3.75rem #00000073}.mw-dialog[data-v-78973168]::backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#00000080}.mw-dialog__content[data-v-78973168]{gap:var(--space-sm);padding:var(--space-md);flex-direction:column;display:flex}.mw-dialog__header[data-v-78973168]{justify-content:space-between;align-items:center;gap:var(--space-sm);display:flex}.mw-dialog__title[data-v-78973168]{font-size:var(--font-size-base);margin:0;font-weight:600}.mw-dialog__close[data-v-78973168]{padding:0 var(--space-3xs);border-radius:var(--radius);color:var(--muted);font-size:var(--font-size-xl);cursor:pointer;background:0 0;border:0;line-height:1}.mw-dialog__close[data-v-78973168]:hover{color:var(--text)}.mw-dialog__actions[data-v-78973168]{justify-content:flex-end;gap:var(--space-xs);flex-wrap:wrap;display:flex}.ca-root[data-v-ebf9e8c7]{align-items:center;gap:.35em;display:inline-flex}.ca-value[data-v-ebf9e8c7]{font-family:var(--mw-font-mono,monospace);font-size:inherit}.ca-copy[data-v-ebf9e8c7]{color:var(--muted);cursor:pointer;transition:color var(--transition-base);background:0 0;border:none;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}.ca-copy[data-v-ebf9e8c7]:hover{color:var(--text)}.ca-copy--copied[data-v-ebf9e8c7]{color:var(--accent)}.ca-icon[data-v-ebf9e8c7]{display:block}.el-root[data-v-f05cc8ba]{font-family:monospace;font-size:inherit;color:var(--accent);text-underline-offset:2px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;transition:color .15s}.el-root[data-v-f05cc8ba]:hover{color:var(--text);text-decoration-style:solid}.copyright-line[data-v-06282c3d]{white-space:nowrap;text-align:center;display:inline-block}.symbol-link[data-v-06282c3d]{color:inherit;vertical-align:text-top;align-items:center;padding:0 .1rem;text-decoration:none;display:inline-flex}.symbol-link[data-v-06282c3d]:hover{text-decoration:underline}.kopimi-symbol[data-v-06282c3d]{align-items:center;line-height:1;display:inline-flex}.kopimi-mark[data-v-06282c3d]{vertical-align:-.15em;display:inline}.text-content[data-v-06282c3d]{display:inline}.ui-stepper[data-v-38fb837c]{margin:0 0 var(--space-md,1.5rem);padding:0;list-style:none;display:flex}.ui-stepper__step[data-v-38fb837c]{flex-direction:column;flex:1 1 0;align-items:center;gap:.4rem;min-width:0;display:flex;position:relative}.ui-stepper__step[data-v-38fb837c]:not(:first-child):before{content:"";background:var(--border);z-index:0;height:2px;position:absolute;top:1rem;left:-50%;right:50%}.ui-stepper__step.is-done[data-v-38fb837c]:before,.ui-stepper__step.is-active[data-v-38fb837c]:before{background:var(--accent)}.ui-stepper__badge[data-v-38fb837c]{z-index:1;border:2px solid var(--border);background:var(--surface);width:2rem;height:2rem;color:var(--muted);cursor:default;transition:background-color var(--transition-base,.2s), border-color var(--transition-base,.2s);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;padding:0;font-family:inherit;font-size:.8rem;font-weight:600;line-height:1;display:flex;position:relative}button.ui-stepper__badge[data-v-38fb837c]{cursor:pointer}button.ui-stepper__badge[data-v-38fb837c]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.is-done .ui-stepper__badge[data-v-38fb837c]{background:var(--accent);border-color:var(--accent);color:var(--accent-contrast)}.is-active .ui-stepper__badge[data-v-38fb837c]{background:color-mix(in srgb, var(--accent) 12%, var(--surface));border-color:var(--accent);color:var(--accent)}.ui-stepper__label[data-v-38fb837c]{text-align:center;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:.78rem;line-height:1.2;overflow:hidden}.is-done .ui-stepper__label[data-v-38fb837c],.is-active .ui-stepper__label[data-v-38fb837c]{color:var(--text)}.is-active .ui-stepper__label[data-v-38fb837c]{font-weight:600}.mw-seg[data-v-430ffdd6]{border:1px solid var(--border);border-radius:var(--radius);min-inline-size:0;margin:0;padding:0;display:inline-flex;overflow:hidden}.mw-seg__item[data-v-430ffdd6]{height:2rem;padding:0 var(--space-sm);border-right:1px solid var(--border);cursor:pointer;font-size:var(--font-size-sm);color:var(--muted);transition:background var(--transition-base), color var(--transition-base);-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;justify-content:center;align-items:center;margin:0;display:flex}.mw-seg__item[data-v-430ffdd6]:last-child{border-right:none}.mw-seg__item--active[data-v-430ffdd6]{background:var(--accent);color:var(--accent-contrast)}.mw-seg__item[data-v-430ffdd6]:has(input:focus-visible){outline:2px solid var(--focus-ring);outline-offset:-2px}.mw-seg__item--disabled[data-v-430ffdd6]{opacity:.5;pointer-events:none;cursor:not-allowed}.mw-seg__item input[type=radio][data-v-430ffdd6]{opacity:0;pointer-events:none;width:0;height:0;position:absolute}.mw-field-hint[data-v-29d9a629]{margin-left:var(--space-3xs,.35rem);vertical-align:middle;display:inline-block;position:relative}.mw-field-hint__btn[data-v-29d9a629]{border:1px solid var(--muted);width:1.1em;height:1.1em;color:var(--muted);cursor:help;background:0 0;border-radius:50%;justify-content:center;align-items:center;padding:0;font-family:inherit;font-size:.75rem;font-weight:700;line-height:1;display:inline-flex}.mw-field-hint__btn[data-v-29d9a629]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}.mw-field-hint__tip[data-v-29d9a629]{z-index:10;min-width:200px;max-width:min(300px,90vw);padding:var(--space-2xs,.6rem) var(--space-xs,.75rem);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);font-size:var(--font-size-sm,.85rem);color:var(--text);visibility:hidden;opacity:0;transition:opacity var(--transition-base,.15s ease), visibility var(--transition-base,.15s ease);pointer-events:none;font-weight:400;line-height:1.5;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 4px 12px #0000001f}.mw-field-hint:hover .mw-field-hint__tip[data-v-29d9a629],.mw-field-hint:focus-within .mw-field-hint__tip[data-v-29d9a629]{visibility:visible;opacity:1;pointer-events:auto}.mw-form-field[data-v-5aef34d9]{margin:0}.mw-form-field__label[data-v-5aef34d9]{margin:.9rem 0 .3rem;font-weight:600;display:inline-block}.mw-form-field :is(input[data-v-5aef34d9-s],select[data-v-5aef34d9-s],textarea[data-v-5aef34d9-s]){display:block}.mw-form-field__hint[data-v-5aef34d9],.mw-form-field__error[data-v-5aef34d9]{font-size:var(--font-size-sm,.9rem);margin:.25rem 0 0;display:block}.mw-form-field__hint[data-v-5aef34d9]{color:var(--muted);font-weight:400}.mw-form-field__error[data-v-5aef34d9]{color:var(--danger)}.mw-tool-intro[data-v-9a5436b9]{color:var(--muted);margin:.25rem 0 1.25rem}.mw-panel[data-v-62fac524]{border:1px solid var(--border);background:var(--surface);border-radius:2px;padding:10px;overflow:hidden}.mw-panel__title[data-v-62fac524]{letter-spacing:.06em;font-size:.72rem;font-weight:600;line-height:inherit;text-transform:uppercase;color:var(--muted);background:var(--lift);border-bottom:1px solid var(--border);margin:-10px -10px 10px;padding:5px 10px}.mw-badge[data-v-2e33d71a]{letter-spacing:.04em;text-transform:uppercase;border-radius:2px;padding:1px 6px;font-size:.7rem;font-weight:600;display:inline-block}.mw-badge--active[data-v-2e33d71a]{background:color-mix(in srgb, var(--ok) 10%, transparent);color:var(--ok)}.mw-badge--closed[data-v-2e33d71a]{background:color-mix(in srgb, var(--muted) 10%, transparent);color:var(--muted)}.mw-badge--pending[data-v-2e33d71a]{background:color-mix(in srgb, var(--warning) 10%, transparent);color:var(--warning-text)}.mw-badge--neutral[data-v-2e33d71a]{background:var(--lift);color:var(--muted)}.mw-toolbar-btn[data-v-d5f19134]{background:var(--lift);border:1px solid var(--border);height:26px;color:var(--text);cursor:pointer;white-space:nowrap;border-radius:2px;align-items:center;gap:5px;padding:3px 10px;font-size:.8rem;transition:background .1s,border-color .1s;display:inline-flex}.mw-toolbar-btn[data-v-d5f19134]:hover:not(:disabled){background:var(--surface);border-color:var(--accent)}.mw-toolbar-btn[data-v-d5f19134]:disabled{opacity:.5;cursor:not-allowed}.mw-toolbar-btn[data-v-d5f19134]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}.mw-toolbar[data-v-170c8eb5]{border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0;align-items:center;gap:4px;margin:0;padding:4px 8px;list-style:none;display:flex}.mw-stat-grid[data-v-3608575d]{grid-template-columns:auto 1fr;gap:3px 12px;margin:0;font-size:.8rem;display:grid}.mw-stat-grid__label[data-v-829f7772]{color:var(--muted);white-space:nowrap}.mw-stat-grid__value[data-v-829f7772]{font-family:var(--mw-font-mono);color:var(--text);text-align:right;margin:0}.mw-stat-grid__value--left[data-v-829f7772]{text-align:left}.mw-data-table-wrap[data-v-de139c21]{overflow-x:auto}.mw-data-table[data-v-de139c21]{border-collapse:collapse;width:100%;font-size:.8rem}.mw-data-table[data-v-de139c21] th{text-align:left;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--border);white-space:nowrap;padding:5px 8px;font-size:.7rem;font-weight:600}.mw-data-table[data-v-de139c21] td{border-bottom:1px solid var(--border);vertical-align:middle;padding:5px 8px}.mw-data-table[data-v-de139c21] tbody tr:last-child td{border-bottom:none}.mw-data-table[data-v-de139c21] tbody tr:nth-child(2n) td{background:var(--lift)}.mw-data-table__empty[data-v-de139c21]{text-align:center;color:var(--muted);padding:24px 16px;font-size:.8rem}.mw-status-dot[data-v-62e9a7cc]{border-radius:50%;flex-shrink:0;width:7px;height:7px;margin-right:4px;display:inline-block}.mw-status-dot--ok[data-v-62e9a7cc]{background:var(--ok)}.mw-status-dot--warn[data-v-62e9a7cc]{background:var(--warning)}.mw-status-dot--error[data-v-62e9a7cc]{background:var(--danger)}.mw-statusbar[data-v-06a511eb]{color:var(--muted);background:var(--surface);border-top:1px solid var(--border);font-size:.72rem;font-family:var(--mw-font-mono);z-index:1;flex-shrink:0;align-items:center;gap:16px;margin:0;padding:3px 12px;list-style:none;display:flex;position:sticky;bottom:0}.mw-statusbar[data-v-06a511eb]>li{align-items:center;display:flex}.mw-statusbar[data-v-06a511eb]>li+li:before{content:"│" / "";color:var(--border);margin-inline-end:16px}.mw-statusbar__pending[data-v-06a511eb]{font-style:italic}.mw-feed[data-v-9e578c9d]{margin:0;padding:0;font-size:.78rem;list-style:none}.mw-feed__item[data-v-797b66a9]{border-bottom:1px solid var(--border);color:var(--text);white-space:nowrap;align-items:flex-start;gap:8px;padding:4px 0;font-weight:500;display:flex}.mw-feed__item[data-v-797b66a9]:before{content:"";background:var(--accent);border-radius:50%;flex-shrink:0;width:6px;height:6px;margin-top:4px}.mw-feed__item[data-v-797b66a9]:last-child{border-bottom:none}.mw-feed__meta[data-v-797b66a9]{color:var(--muted);font-family:var(--mw-font-mono);margin-left:auto;font-size:.72rem;font-weight:400}.status-widget[data-v-a83de7ee]{align-items:center;gap:var(--space-2xs);color:inherit;font-size:var(--font-size-sm);opacity:.85;transition:opacity var(--transition-base);text-decoration:none;display:inline-flex}.status-widget[data-v-a83de7ee]:hover{opacity:1}.status-widget[data-v-a83de7ee]:before{content:"";width:var(--space-2xs);height:var(--space-2xs);border-radius:50%;flex-shrink:0}.status-widget--checking[data-v-a83de7ee]:before{background:var(--muted)}.status-widget--ok[data-v-a83de7ee]:before{background:var(--ok)}.status-widget--degraded[data-v-a83de7ee]:before{background:var(--warning)}.status-widget--error[data-v-a83de7ee]:before{background:var(--danger)}
2
- /*$vite$:1*/
1
+ @layer mw.reset, mw.components;
2
+ @layer mw.reset{*,:before,:after{box-sizing:border-box}html,body{margin:0;padding:0}html{scroll-padding-block-start:calc(var(--mw-header-height) * 2)}body{background:var(--bg);min-height:100vh;color:var(--text);font-family:var(--mw-font-sans);font-size:var(--font-size-base);line-height:var(--leading-normal);letter-spacing:var(--tracking-normal);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility}:where(ul,ol):where([role=list],[role=listitem]),:where(menu){margin:0;padding:0;list-style:none}.mw-visually-hidden{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.mw-panel--dark{--_bg:var(--mw-panel-dark-bg);--_surface:var(--mw-panel-dark-surface);--_text:var(--mw-panel-dark-text);--_muted:var(--mw-panel-dark-muted);--_border:var(--mw-panel-dark-border);--_ok:var(--mw-panel-dark-ok);--_danger:var(--mw-panel-dark-danger);--_info:var(--mw-panel-dark-info);--text:var(--_text);--muted:var(--_muted);--border:var(--_border);--bg:var(--_bg);--surface:var(--_surface);--lift:var(--_surface);--mw-link:var(--_text)}.mw-panel--light{--_bg:var(--mw-panel-light-bg);--_surface:var(--mw-panel-light-surface);--_text:var(--mw-panel-light-text);--_muted:var(--mw-panel-light-muted);--_border:var(--mw-panel-light-border);--_ok:var(--mw-panel-light-ok);--_danger:var(--mw-panel-light-danger);--_info:var(--mw-panel-light-info);--text:var(--_text);--muted:var(--_muted);--border:var(--_border);--bg:var(--_bg);--surface:var(--_surface);--lift:var(--_surface);--mw-link:var(--_text)}.mw-panel--transparent{--_bg:transparent;--_surface:transparent;--_text:var(--text);--_muted:var(--muted);--_border:transparent;--_ok:var(--ok);--_danger:var(--danger);--_info:var(--info)}:where(img,svg,video,canvas){max-width:100%;display:block}:where(fieldset){border:0;min-inline-size:0;margin:0;padding:0}:where(legend){overflow-wrap:anywhere;max-inline-size:100%;padding:0}a{color:var(--mw-link,var(--accent));text-underline-offset:.18em;transition:color var(--transition-base);text-decoration:underline;text-decoration-thickness:.08em}a:hover{text-decoration-thickness:.14em}:where(button,input,select,textarea){font-family:inherit}:where(button){padding:var(--space-3xs) var(--space-xs);color:var(--text);background-color:var(--lift);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:inherit;cursor:pointer}:where(input[type=file])::file-selector-button{padding:var(--space-3xs) var(--space-xs);color:var(--text);background-color:var(--lift);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:inherit;cursor:pointer}:where(input[type=file])::file-selector-button{margin-inline-end:var(--space-xs)}:where(button:disabled){cursor:not-allowed}:where(a,button,input,select,textarea):focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.mw-mono{font-family:var(--mw-font-mono)}:where(code,kbd,samp){font-family:var(--mw-font-mono);overflow-wrap:anywhere}:where(pre) :where(code,kbd,samp){overflow-wrap:normal}.mw-noise{isolation:isolate;position:relative}.mw-noise:before{content:"";z-index:var(--z-below);background-image:var(--noise-overlay);opacity:var(--noise-opacity);pointer-events:none;background-repeat:repeat;position:absolute;inset:0}.mw-hand-drawn{display:inline-flex;position:relative}.mw-spinner{width:var(--space-sm);height:var(--space-sm);border:2px solid var(--border);border-top-color:var(--accent);animation:mw-spin var(--transition-slow) linear infinite;border-radius:50%;display:inline-block}@keyframes mw-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:0s!important;transition-delay:0s!important;animation-duration:.001ms!important}.mw-spinner{border-top-color:var(--accent);animation:none}}}@layer mw.components;
3
+ @layer mw.reset;@layer mw.components{.mw-footer[data-v-766c24d7]{align-items:center;gap:var(--space-sm);padding:var(--space-xs) var(--space-sm);background:var(--_bg);color:var(--_muted);border-top:1px solid var(--_border);font-family:var(--mw-font-sans);font-size:var(--font-size-sm);flex-wrap:wrap;display:flex}.mw-footer--transparent[data-v-766c24d7]{border-top:1px solid var(--border)}.mw-footer__docs[data-v-766c24d7]{align-items:center;gap:var(--space-2xs) var(--space-sm);flex-wrap:wrap;max-inline-size:100%;margin-inline-start:auto;display:flex}.mw-footer__docs a[data-v-766c24d7]{color:inherit;text-underline-offset:.18em;text-decoration:underline}.mw-footer__docs a[data-v-766c24d7]:hover{text-decoration-thickness:.14em}.mw-footer a[data-v-766c24d7-s]{color:inherit}.mw-footer[data-v-766c24d7]:not(.mw-footer--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}}
4
+ @layer mw.reset;@layer mw.components{.mw-header[data-v-8f38cdd2]{align-items:center;gap:var(--space-2xs);min-height:var(--mw-header-height);padding:var(--space-4xs) var(--space-sm);background:var(--_bg);color:var(--_text);border-bottom:1px solid var(--_border);font-family:var(--mw-font-sans);transition:background var(--transition-base), backdrop-filter var(--transition-base), border-color var(--transition-base), box-shadow var(--transition-base);flex-wrap:wrap;display:flex}.mw-header--sticky[data-v-8f38cdd2]{z-index:var(--z-header);position:sticky;top:0}.mw-header--scrolled[data-v-8f38cdd2]{background:color-mix(in srgb, var(--bg) 82%, transparent);-webkit-backdrop-filter:blur(var(--space-2xs));backdrop-filter:blur(var(--space-2xs));border-bottom-color:var(--border);box-shadow:var(--shadow-1)}.mw-header__brand[data-v-8f38cdd2]{align-items:center;gap:var(--space-2xs);font-weight:var(--font-weight-brand);letter-spacing:var(--tracking-wide);overflow-wrap:anywhere;min-inline-size:0;margin-inline-end:auto;text-decoration:none;display:flex}.mw-header a[data-v-8f38cdd2-s]{color:inherit}.mw-header__menu[data-v-8f38cdd2]{padding:var(--space-3xs);border:1px solid var(--_border);border-radius:var(--radius-sm);color:inherit;cursor:pointer;background:0 0;justify-content:center;align-items:center;display:none}.mw-header__menu[data-v-8f38cdd2]:hover{background:color-mix(in srgb, currentColor 12%, transparent)}@media (width<45em){.mw-header__menu[data-v-8f38cdd2]{display:inline-flex}}.mw-header[data-v-8f38cdd2]:not(.mw-header--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}}
5
+ @layer mw.reset;@layer mw.components{.mw-sidebar[data-v-f5e6df6c]{--_width:var(--v4ba6c322);height:100%;width:var(--_width);background:var(--_bg);color:var(--_text);border:0;border-right:1px solid var(--_border);font-family:var(--mw-font-sans);flex-direction:column;margin:0;padding:0;display:flex;position:static;inset:auto;overflow:visible}.mw-sidebar__nav[data-v-f5e6df6c]{gap:var(--space-3xs);padding:var(--space-xs) 0;flex-direction:column;flex:auto;display:flex;overflow-y:auto}@media (width<45em){.mw-sidebar[data-v-f5e6df6c]:not(:popover-open){display:none}.mw-sidebar[data-v-f5e6df6c]:popover-open{width:min(var(--_width), 85vw);height:100dvh;box-shadow:var(--shadow-3);position:fixed;inset:0 auto 0 0}.mw-sidebar[data-v-f5e6df6c]::backdrop{background:var(--backdrop)}}.mw-sidebar a[data-v-f5e6df6c-s]{color:inherit}.mw-sidebar[data-v-f5e6df6c]:not(.mw-sidebar--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}}
6
+ @layer mw.reset;@layer mw.components{.mw-tab-nav[data-v-004591c8]{gap:var(--space-3xs);border-bottom:var(--space-4xs) solid var(--border);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.mw-tab-nav__item[data-v-004591c8]{display:contents}.mw-tab-nav__tab[data-v-004591c8]{appearance:none;border:none;border-bottom:var(--space-4xs) solid transparent;padding:var(--space-2xs) var(--space-sm);margin-bottom:calc(-1 * var(--space-4xs));cursor:pointer;font-size:var(--font-size-base);color:var(--muted);transition:color var(--transition-base), border-color var(--transition-base);background:0 0;border-radius:0}.mw-tab-nav__tab[data-v-004591c8]:hover{color:var(--text)}.mw-tab-nav__tab--active[data-v-004591c8]{border-bottom-color:var(--accent);color:var(--text);font-weight:var(--font-weight-semibold)}.mw-tab-nav--raised[data-v-004591c8]{border-bottom:1px solid var(--border);background:var(--surface);padding:var(--space-3xs) var(--space-3xs) 0;align-items:flex-end;gap:var(--space-4xs);scrollbar-width:none;flex-shrink:0;overflow-x:auto}.mw-tab-nav--raised[data-v-004591c8]::-webkit-scrollbar{display:none}.mw-tab-nav--raised .mw-tab-nav__tab[data-v-004591c8]{border-bottom:1px solid var(--border);padding:var(--space-3xs) var(--space-xs) var(--space-3xs);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--muted);background:var(--lift);border-top:var(--space-4xs) solid transparent;white-space:nowrap;transition:color var(--transition-base), background var(--transition-base), border-color var(--transition-base);border-left:1px solid #0000;border-right:1px solid #0000;margin-bottom:-1px}.mw-tab-nav--raised .mw-tab-nav__tab[data-v-004591c8]:hover:not(.mw-tab-nav__tab--active){color:var(--text);background:var(--surface)}.mw-tab-nav--raised .mw-tab-nav__tab--active[data-v-004591c8]{color:var(--text);background:var(--bg);border-color:var(--accent) var(--border) var(--bg) var(--border);font-weight:var(--font-weight-semibold)}.mw-tab-nav--raised.mw-tab-nav--lg[data-v-004591c8]{gap:var(--space-4xs);padding:var(--space-3xs) var(--space-3xs) 0}.mw-tab-nav--raised.mw-tab-nav--lg .mw-tab-nav__tab[data-v-004591c8]{padding:var(--space-2xs) var(--space-sm);font-size:var(--font-size-base);font-weight:var(--font-weight-semibold)}.mw-tab-nav--flush[data-v-004591c8]{background:0 0;padding-inline:0}}
7
+ @layer mw.reset;@layer mw.components{.mw-mode[data-v-905a9db8]{gap:var(--space-4xs);min-inline-size:0;padding:var(--space-4xs);border:1px solid var(--_border,var(--border));border-radius:var(--radius);margin:0;display:inline-flex}.mw-mode__btn[data-v-905a9db8]{justify-content:center;align-items:center;gap:var(--space-3xs);min-block-size:1.5rem;min-inline-size:1.5rem;padding:var(--space-3xs) var(--space-2xs);border-radius:var(--radius-sm);color:var(--_muted,var(--muted));font:inherit;font-size:var(--font-size-sm);cursor:pointer;transition:color var(--transition-base), background var(--transition-base);background:0 0;border:0;display:inline-flex}.mw-mode__btn[data-v-905a9db8]:hover{color:var(--_text,var(--text))}.mw-mode__btn.is-active[data-v-905a9db8]{color:var(--_text,var(--text));background:color-mix(in srgb, var(--_text,var(--text)) 14%, transparent)}.mw-mode__btn[data-v-905a9db8]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}@media (forced-colors:active){.mw-mode__btn.is-active[data-v-905a9db8]{outline-offset:-2px;outline:2px solid highlight}}@media (width<40em){.mw-mode__label[data-v-905a9db8]{display:none}}}
8
+ @layer mw.reset;@layer mw.components{.ca-root[data-v-60f80445]{align-items:center;gap:.35em;max-width:100%;display:inline-flex}.ca-value[data-v-60f80445]{font-family:var(--mw-font-mono);font-size:inherit;overflow-wrap:anywhere;white-space:normal;min-width:0}}
9
+ @layer mw.reset;@layer mw.components{.copyright-line[data-v-e1afe1f4]{text-align:center;max-width:100%;display:inline-block}.symbol-link[data-v-e1afe1f4]{white-space:nowrap;color:inherit;vertical-align:text-top;padding:0 var(--space-4xs);align-items:center;text-decoration:none;display:inline-flex}.symbol-link[data-v-e1afe1f4]:hover{text-decoration:underline}.symbol-mark[data-v-e1afe1f4]{vertical-align:-.15em;display:inline}}
10
+ @layer mw.reset;@layer mw.components{.el-root[data-v-afd81c09]{min-block-size:calc(var(--space-sm) + var(--space-3xs));font-family:var(--mw-font-mono);font-size:inherit;color:var(--mw-link,var(--accent));text-underline-offset:.18em;transition:color var(--duration-base);-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:inline-block}.el-root[data-v-afd81c09]:hover{color:var(--text);text-decoration-style:solid}}
11
+ @layer mw.reset;@layer mw.components{.sidebar-group[data-v-d2020093]{border:0;min-inline-size:0;margin:0;padding:0}.sidebar-group--l1+.sidebar-group--l1[data-v-d2020093]{margin-block-start:var(--space-2xs)}.sidebar-group__label[data-v-d2020093]{float:inline-start;width:100%;padding:var(--space-3xs) var(--space-xs);font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);color:var(--_muted,var(--muted));-webkit-user-select:none;user-select:none}.sidebar-group__label[data-v-d2020093]+*{clear:both}.sidebar-group--l1>.sidebar-group__label[data-v-d2020093]{text-transform:uppercase;letter-spacing:var(--tracking-wide)}.sidebar-group--l2[data-v-d2020093]{padding-inline-start:var(--space-3xs)}.sidebar-group--l2>.sidebar-group__label[data-v-d2020093]{font-weight:var(--font-weight-medium);padding-inline-start:var(--space-xs)}}
12
+ @layer mw.reset;@layer mw.components{.sidebar-item[data-v-cb0a8084]{align-items:center;gap:var(--space-2xs);width:100%;padding:var(--space-2xs) var(--space-sm);color:var(--_muted,var(--muted));font:inherit;text-align:left;cursor:pointer;transition:background var(--transition-base), color var(--transition-base);background:0 0;border:0;border-radius:0;text-decoration:none;display:flex}.sidebar-item[data-v-cb0a8084]:hover:not(:disabled){background:color-mix(in srgb, currentColor 10%, transparent);color:var(--_text,var(--text))}.sidebar-item.is-active[data-v-cb0a8084]{background:color-mix(in srgb, var(--accent) 26%, transparent);color:var(--_text,var(--text))}.sidebar-item[data-v-cb0a8084]:disabled{cursor:default}@media (forced-colors:active){.sidebar-item.is-active[data-v-cb0a8084]{outline-offset:-2px;outline:2px solid highlight}}.sidebar-item[data-v-cb0a8084]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}.sidebar-item__icon[data-v-cb0a8084]{width:var(--space-sm);text-align:center}}
13
+ @layer mw.reset;@layer mw.components{.status-widget[data-v-faeb23fe]{align-items:center;gap:var(--space-2xs);color:inherit;font-size:var(--font-size-sm);text-decoration:none;display:inline-flex}.status-widget[data-v-faeb23fe]:hover{text-decoration:underline}}
14
+ @layer mw.reset;@layer mw.components{.mw-feed[data-v-bdd1bebd]{font-size:var(--font-size-sm);margin:0;padding:0;list-style:none}}
15
+ @layer mw.reset;@layer mw.components{.mw-feed__item[data-v-402f889f]{align-items:flex-start;gap:var(--space-2xs);padding:var(--space-3xs) 0;border-bottom:1px solid var(--border);color:var(--text);font-weight:var(--font-weight-medium);white-space:nowrap;display:flex}.mw-feed__item[data-v-402f889f]:before{content:"";width:var(--space-2xs);height:var(--space-2xs);background:var(--accent);margin-top:var(--space-3xs);border-radius:50%;flex-shrink:0}.mw-feed__item[data-v-402f889f]:last-child{border-bottom:none}.mw-feed__meta[data-v-402f889f]{color:var(--muted);font-family:var(--mw-font-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-regular);margin-left:auto}}
16
+ @layer mw.reset;@layer mw.components{.mw-amount[data-v-51fb5258]{font-family:var(--mw-font-mono);white-space:nowrap}}
17
+ @layer mw.reset;@layer mw.components{.mw-shell[data-v-23c8caaf]{grid-template-rows:auto 1fr auto;grid-template-columns:minmax(0,1fr);min-height:100dvh;display:grid}.mw-shell--sidebar[data-v-23c8caaf]{grid-template-columns:auto minmax(0,1fr)}.mw-shell>header[data-v-23c8caaf-s],.mw-shell>footer[data-v-23c8caaf-s]{grid-column:1/-1}.mw-shell__main[data-v-23c8caaf]{min-width:0}.mw-shell--sidebar>.mw-shell__main[data-v-23c8caaf]{grid-column:2}@media (width<45em){.mw-shell--sidebar[data-v-23c8caaf]{grid-template-columns:minmax(0,1fr)}.mw-shell--sidebar>.mw-shell__main[data-v-23c8caaf]{grid-column:1}}.mw-shell__main--contained[data-v-23c8caaf]{width:100%;max-width:var(--mw-tool-content-max);padding:var(--space-sm) var(--space-sm) var(--space-lg);margin-inline:auto}}
18
+ @layer mw.reset;@layer mw.components{.mw-badge[data-v-b6857ff4]{--_tone:var(--border);gap:var(--space-3xs);padding:0 var(--space-xs);border:1px solid var(--_tone);border-radius:var(--radius-sm);background:color-mix(in srgb, var(--_tone) 12%, var(--bg));color:var(--text);font-size:var(--font-size-sm);white-space:nowrap;align-items:baseline;display:inline-flex}.mw-badge--ok[data-v-b6857ff4]{--_tone:var(--ok)}.mw-badge--warn[data-v-b6857ff4]{--_tone:var(--warning)}.mw-badge--danger[data-v-b6857ff4]{--_tone:var(--danger)}.mw-badge--info[data-v-b6857ff4]{--_tone:var(--info)}.mw-badge--accent[data-v-b6857ff4]{--_tone:var(--accent)}.mw-badge__symbol[data-v-b6857ff4]{color:var(--_tone)}.mw-badge--warn .mw-badge__symbol[data-v-b6857ff4]{color:var(--warning-text)}}
19
+ @layer mw.reset;@layer mw.components{.mw-btn[data-v-3abef52b]{justify-content:center;align-items:center;gap:var(--space-2xs);padding:var(--space-2xs) var(--space-xs);border-radius:var(--radius);font:inherit;font-weight:var(--font-weight-semibold);cursor:pointer;transition:background var(--transition-base), box-shadow var(--transition-base);border:1px solid #0000;text-decoration:none;display:inline-flex}.mw-btn--sm[data-v-3abef52b]{padding:var(--space-3xs) var(--space-2xs);border-radius:var(--radius-sm);font-size:var(--font-size-sm)}.mw-btn[data-v-3abef52b]:disabled:not([aria-busy=true]),.mw-btn[aria-disabled=true][data-v-3abef52b]:not([aria-busy=true]){filter:grayscale(.6);cursor:not-allowed}.mw-btn[aria-busy=true][data-v-3abef52b]{cursor:progress}.mw-btn .mw-spinner[data-v-3abef52b]{border-color:color-mix(in srgb, currentColor 30%, transparent);border-top-color:currentColor;width:1em;height:1em}.mw-btn--primary[data-v-3abef52b]{background:var(--accent);color:var(--accent-contrast)}.mw-btn--primary[data-v-3abef52b]:not(:disabled,[aria-disabled=true]):hover{box-shadow:inset 0 0 0 var(--space-4xs) var(--accent-contrast)}.mw-btn--secondary[data-v-3abef52b]{background:var(--secondary);color:var(--secondary-contrast)}.mw-btn--secondary[data-v-3abef52b]:not(:disabled,[aria-disabled=true]):hover{box-shadow:inset 0 0 0 var(--space-4xs) var(--secondary-contrast)}.mw-btn--danger[data-v-3abef52b]{background:var(--danger);color:var(--accent-contrast)}.mw-btn--danger[data-v-3abef52b]:not(:disabled,[aria-disabled=true]):hover{box-shadow:inset 0 0 0 var(--space-4xs) var(--accent-contrast)}.mw-btn--ghost[data-v-3abef52b]{color:var(--text);border-color:var(--border);background:0 0}.mw-btn--ghost[data-v-3abef52b]:not(:disabled,[aria-disabled=true]):hover{background:var(--lift)}.mw-btn--link[data-v-3abef52b]{color:var(--mw-link,var(--accent));font-weight:inherit;text-underline-offset:.18em;background:0 0;border:0;border-radius:0;padding:0;text-decoration:underline;text-decoration-thickness:.08em}.mw-btn--link[data-v-3abef52b]:not(:disabled,[aria-disabled=true]):hover{text-decoration-thickness:.14em}}
20
+ @layer mw.reset;@layer mw.components{.mw-card[data-v-2b57e836]{padding:var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);position:relative;overflow:hidden}.mw-card__header[data-v-2b57e836]{margin:calc(-1 * var(--space-sm)) calc(-1 * var(--space-sm)) var(--space-sm);padding:var(--space-xs) var(--space-sm);border-bottom:1px solid var(--border)}.mw-card__title[data-v-2b57e836]{font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);margin:0}.mw-card__footer[data-v-2b57e836]{margin:var(--space-sm) calc(-1 * var(--space-sm)) calc(-1 * var(--space-sm));padding:var(--space-xs) var(--space-sm);border-top:1px solid var(--border);background:var(--lift)}.mw-card--plain .mw-card__header[data-v-2b57e836]{margin:0 0 var(--space-2xs);border-bottom:0;padding:0}.mw-card--plain .mw-card__title[data-v-2b57e836]{font-size:var(--font-size-lg)}.mw-card__link[data-v-2b57e836]{color:inherit;text-decoration:none}.mw-card__link[data-v-2b57e836]:after{content:"";position:absolute;inset:0}.mw-card--link[data-v-2b57e836]{transition:border-color var(--transition-base), box-shadow var(--transition-base)}.mw-card--link[data-v-2b57e836]:hover{border-color:var(--accent);box-shadow:var(--shadow-1)}.mw-card__link[data-v-2b57e836]:focus-visible:after{outline:2px solid var(--focus-ring);outline-offset:-2px;border-radius:var(--radius)}}
21
+ @layer mw.reset;@layer mw.components{.mw-check[data-v-896bf59f]{gap:var(--space-xs);align-items:flex-start;display:flex}.mw-check__box[data-v-896bf59f]{inline-size:calc(var(--space-sm) + var(--space-3xs));block-size:calc(var(--space-sm) + var(--space-3xs));accent-color:var(--accent);flex-shrink:0;margin:0}.mw-check__hint[data-v-896bf59f]{color:var(--muted);font-size:var(--font-size-sm)}}
22
+ @layer mw.reset;@layer mw.components{.mw-code[data-v-4c6bbb22]{margin:0}.mw-code__pre[data-v-4c6bbb22]{padding:var(--space-xs);background:var(--lift);color:var(--text);border:1px solid var(--border);border-radius:var(--radius-sm);font-family:var(--mw-font-mono);font-size:var(--font-size-sm);margin:0;overflow:auto}.mw-code__pre--wrap[data-v-4c6bbb22]{white-space:pre-wrap;overflow-wrap:anywhere}.mw-code__pre[data-v-4c6bbb22]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}}
23
+ @layer mw.reset;@layer mw.components{.mw-copy[data-v-e8bdae3c]{min-width:1.5rem;min-height:1.5rem;color:var(--muted);cursor:pointer;transition:color var(--transition-base);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex;position:relative}.mw-copy[data-v-e8bdae3c]:hover{color:var(--text)}.mw-copy--copied[data-v-e8bdae3c]{color:var(--mw-link,var(--accent))}}
24
+ @layer mw.reset;@layer mw.components{.mw-data-table-wrap[data-v-41de31d6]{scrollbar-width:thin;position:relative;overflow-x:auto}.mw-data-table-wrap[data-v-41de31d6]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}.mw-data-table[data-v-41de31d6]{border-collapse:collapse;width:100%;font-size:var(--font-size-sm)}.mw-data-table[data-v-41de31d6] th{text-align:left;padding:var(--space-3xs) var(--space-2xs);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-wide);text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--border);white-space:nowrap}.mw-data-table[data-v-41de31d6] tbody th[scope=row]{font-size:inherit;letter-spacing:normal;text-transform:none;color:var(--text);white-space:normal;vertical-align:middle}.mw-data-table[data-v-41de31d6] td{padding:var(--space-3xs) var(--space-2xs);border-bottom:1px solid var(--border);vertical-align:middle}.mw-data-table[data-v-41de31d6] tbody tr:last-child td,.mw-data-table[data-v-41de31d6] tbody tr:last-child th{border-bottom:none}.mw-data-table[data-v-41de31d6] tbody tr:nth-child(2n) td,.mw-data-table[data-v-41de31d6] tbody tr:nth-child(2n) th{background:var(--lift)}.mw-data-table__empty[data-v-41de31d6]{padding:var(--space-md) var(--space-sm);text-align:center;color:var(--muted);font-size:var(--font-size-sm);margin:0}.mw-data-table__hint[data-v-41de31d6]{padding:var(--space-3xs) var(--space-2xs);color:var(--muted);font-size:var(--font-size-xs);display:block;position:sticky;left:0}}
25
+ @layer mw.reset;@layer mw.components{.mw-dialog[data-v-f8a5c8ff]{--_width:var(--v532f060d);width:var(--_width);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);max-height:90dvh;color:var(--text);box-shadow:var(--shadow-3);padding:0}.mw-dialog[data-v-f8a5c8ff]::backdrop{background:var(--backdrop);-webkit-backdrop-filter:blur(var(--space-4xs));backdrop-filter:blur(var(--space-4xs))}.mw-dialog__content[data-v-f8a5c8ff]{gap:var(--space-sm);padding:var(--space-md);flex-direction:column;display:flex}.mw-dialog__header[data-v-f8a5c8ff]{justify-content:space-between;align-items:center;gap:var(--space-sm);display:flex}.mw-dialog__title[data-v-f8a5c8ff]{font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);margin:0}.mw-dialog__close[data-v-f8a5c8ff]{padding:0 var(--space-3xs);border-radius:var(--radius);color:var(--muted);font-size:var(--font-size-xl);cursor:pointer;background:0 0;border:0;line-height:1}.mw-dialog__close[data-v-f8a5c8ff]:hover{color:var(--text)}.mw-dialog__actions[data-v-f8a5c8ff]{justify-content:flex-end;gap:var(--space-xs);flex-wrap:wrap;display:flex}}
26
+ @layer mw.reset;@layer mw.components{.mw-empty[data-v-8463293a]{align-items:center;gap:var(--space-xs);padding:var(--space-md) var(--space-sm);text-align:center;flex-direction:column;display:flex}.mw-empty__text[data-v-8463293a]{color:var(--muted);margin:0}}
27
+ @layer mw.reset;@layer mw.components{.mw-field-hint[data-v-4390802c]{vertical-align:middle;margin-inline-start:var(--space-3xs);display:inline-block;position:relative}.mw-field-hint__btn[data-v-4390802c]{inline-size:calc(var(--space-sm) + var(--space-3xs));block-size:calc(var(--space-sm) + var(--space-3xs));font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);border:1px solid var(--muted);color:var(--muted);cursor:help;background:0 0;border-radius:50%;justify-content:center;align-items:center;padding:0;font-family:inherit;line-height:1;display:inline-flex}.mw-field-hint__btn[data-v-4390802c]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}.mw-field-hint__tip[data-v-4390802c]{top:calc(100% + var(--space-3xs));z-index:var(--z-popover);min-width:calc(var(--mw-content-narrow) / 2);max-width:min(var(--mw-content-narrow), 90vw);padding:var(--space-2xs) var(--space-xs);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:var(--font-weight-regular);line-height:var(--leading-normal);color:var(--text);box-shadow:var(--shadow-2);display:none;position:absolute;left:0}.mw-field-hint:hover .mw-field-hint__tip[data-v-4390802c],.mw-field-hint:focus-within .mw-field-hint__tip[data-v-4390802c]{display:block}}
28
+ @layer mw.reset;@layer mw.components{.mw-file[data-v-fa50dd32]{max-width:100%;color:var(--text);font:inherit}.mw-file[data-v-fa50dd32]::file-selector-button{padding:var(--space-2xs) var(--space-xs);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--text);font:inherit;cursor:pointer;margin-inline-end:var(--space-xs)}.mw-file[data-v-fa50dd32]:disabled{filter:grayscale(.6);cursor:not-allowed}}
29
+ @layer mw.reset;@layer mw.components{.mw-form-field[data-v-0256284b]{margin:0}.mw-form-field__label[data-v-0256284b]{font-weight:var(--font-weight-semibold);margin:var(--space-xs) 0 var(--space-3xs);display:inline-block}.mw-form-field :is(input[data-v-0256284b-s],select[data-v-0256284b-s],textarea[data-v-0256284b-s]){display:block}.mw-form-field__hint[data-v-0256284b],.mw-form-field__error[data-v-0256284b]{margin:var(--space-3xs) 0 0;font-size:var(--font-size-sm);display:block}.mw-form-field__hint[data-v-0256284b]{color:var(--muted);font-weight:var(--font-weight-regular)}.mw-form-field__error[data-v-0256284b]{color:var(--danger)}}
30
+ @layer mw.reset;@layer mw.components{.mw-input[data-v-de27599b]{width:100%;padding:var(--space-2xs) var(--space-xs);background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius);font:inherit}.mw-input[data-v-de27599b]::placeholder{color:var(--muted)}.mw-input[data-v-de27599b]:is(:focus-visible,:focus-within){outline:2px solid var(--focus-ring);outline-offset:1px}.mw-input[aria-invalid=true][data-v-de27599b]{border-color:var(--danger)}.mw-input[data-v-de27599b]:disabled{filter:grayscale(.6);cursor:not-allowed}}
31
+ @layer mw.reset;@layer mw.components{.mw-live[data-v-83076271]{color:var(--muted);font-size:var(--font-size-sm);display:block}.mw-live[data-v-83076271]:empty{display:none}}
32
+ @layer mw.reset;@layer mw.components{.mw-meter[data-v-3580c9b7]{gap:var(--space-xs);flex-wrap:wrap;align-items:center;display:flex}.mw-meter__label[data-v-3580c9b7]{font-weight:var(--font-weight-semibold)}.mw-meter__text[data-v-3580c9b7]{font-size:var(--font-size-sm);color:var(--muted)}.mw-meter__text--over[data-v-3580c9b7]{color:var(--danger);font-weight:var(--font-weight-semibold)}.mw-meter__bar[data-v-3580c9b7]{width:10rem;height:var(--space-xs);appearance:none;background:var(--lift);border:1px solid var(--border);border-radius:var(--radius-xs)}.mw-meter__bar[data-v-3580c9b7]::-webkit-meter-bar{background:var(--lift);border-radius:var(--radius-xs);border:0}.mw-meter__bar[data-v-3580c9b7]::-webkit-meter-optimum-value{background:var(--ok)}.mw-meter__bar[data-v-3580c9b7]::-webkit-meter-suboptimum-value{background:var(--warning-text)}.mw-meter__bar[data-v-3580c9b7]::-webkit-meter-even-less-good-value{background:var(--danger)}.mw-meter__bar[data-v-3580c9b7]:-moz-meter-optimum::-moz-meter-bar{background:var(--ok)}.mw-meter__bar[data-v-3580c9b7]:-moz-meter-sub-optimum::-moz-meter-bar{background:var(--warning-text)}.mw-meter__bar[data-v-3580c9b7]:-moz-meter-sub-sub-optimum::-moz-meter-bar{background:var(--danger)}}
33
+ @layer mw.reset;@layer mw.components{.mw-notice[data-v-9bed4c15]{padding:var(--space-2xs) var(--space-xs);border:1px solid var(--border);border-left-width:var(--space-4xs);border-radius:var(--radius);background:var(--lift);color:var(--text);font-size:var(--font-size-sm);margin:0}.mw-notice--error[data-v-9bed4c15]{border-left-color:var(--danger);background:color-mix(in srgb, var(--danger) 8%, var(--lift))}.mw-notice--ok[data-v-9bed4c15]{border-left-color:var(--ok);background:color-mix(in srgb, var(--ok) 8%, var(--lift))}.mw-notice--warning[data-v-9bed4c15]{border-left-color:var(--warning);background:color-mix(in srgb, var(--warning) 12%, var(--lift))}}
34
+ @layer mw.reset;@layer mw.components{.mw-pager[data-v-bdf9f25e]{gap:var(--space-sm);margin-top:var(--space-xs);justify-content:flex-end;align-items:center;display:flex}.mw-pager__page[data-v-bdf9f25e]{color:var(--muted);font-size:var(--font-size-sm)}}
35
+ @layer mw.reset;@layer mw.components{.mw-panel[data-v-db89a6f2]{padding:var(--space-xs);border:1px solid var(--border);border-radius:var(--radius-xs);background:var(--surface);overflow:hidden}.mw-panel__title[data-v-db89a6f2]{margin:calc(-1 * var(--space-xs)) calc(-1 * var(--space-xs)) var(--space-xs);padding:var(--space-3xs) var(--space-xs);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-wide);line-height:inherit;text-transform:uppercase;color:var(--muted);background:var(--lift);border-bottom:1px solid var(--border)}}
36
+ @layer mw.reset;@layer mw.components{.mw-seg[data-v-895d43d3]{border:1px solid var(--border);border-radius:var(--radius);min-inline-size:0;margin:0;padding:0;display:inline-flex;overflow:hidden}.mw-seg__legend[data-v-895d43d3]{float:inline-start;width:100%;padding:var(--space-3xs) var(--space-xs);font-size:var(--font-size-sm)}.mw-seg--wrap[data-v-895d43d3]{flex-wrap:wrap}@media (width<36em){.mw-seg--grid[data-v-895d43d3]{grid-template-columns:repeat(auto-fit,minmax(min(100%,7rem),1fr));display:grid}.mw-seg--grid .mw-seg__item[data-v-895d43d3]{white-space:normal;padding-block:var(--space-4xs);text-align:center}}.mw-seg__item[data-v-895d43d3]{justify-content:center;align-items:center;gap:var(--space-3xs);min-height:var(--space-md);padding:0 var(--space-sm);border-right:1px solid var(--border);cursor:pointer;font-size:var(--font-size-sm);color:var(--text);transition:background var(--transition-base), color var(--transition-base);-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;margin:0;display:flex}.mw-seg__item[data-v-895d43d3]:last-child{border-right:none}.mw-seg__item[data-v-895d43d3]:hover:not(.mw-seg__item--active){background:var(--lift)}.mw-seg__item--active[data-v-895d43d3]{background:var(--accent);color:var(--accent-contrast)}.mw-seg__item[data-v-895d43d3]:has(input:focus-visible){outline:2px solid var(--focus-ring);outline-offset:-2px}.mw-seg__item--disabled[data-v-895d43d3]{filter:grayscale(.6);pointer-events:none;cursor:not-allowed}.mw-seg__item input[type=radio][data-v-895d43d3]{opacity:0;pointer-events:none;width:0;height:0;position:absolute}}
37
+ @layer mw.reset;@layer mw.components{.mw-select[data-v-927a9c2d]{--_chevron-stroke:var(--muted);--_chevron-arm:var(--space-2xs);appearance:none;width:100%;padding:var(--space-2xs) calc(var(--space-md) + var(--space-2xs)) var(--space-2xs) var(--space-xs);background-color:var(--surface);background-image:linear-gradient(45deg, transparent calc(50% - var(--space-4xs) / 2), var(--_chevron-stroke) calc(50% - var(--space-4xs) / 2), var(--_chevron-stroke) calc(50% + var(--space-4xs) / 2), transparent calc(50% + var(--space-4xs) / 2)), linear-gradient(-45deg, transparent calc(50% - var(--space-4xs) / 2), var(--_chevron-stroke) calc(50% - var(--space-4xs) / 2), var(--_chevron-stroke) calc(50% + var(--space-4xs) / 2), transparent calc(50% + var(--space-4xs) / 2));background-position:right calc(var(--space-xs) + var(--_chevron-arm)) center, right var(--space-xs) center;background-size:var(--_chevron-arm) var(--_chevron-arm);color:var(--text);border:1px solid var(--border);border-radius:var(--radius);font:inherit;background-repeat:no-repeat}.mw-select[data-v-927a9c2d]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}}
38
+ @layer mw.reset;@layer mw.components{.mw-skip[data-v-ddc3c0de]{z-index:var(--z-skip);padding:var(--space-2xs) var(--space-xs);background:var(--accent);color:var(--accent-contrast);border-radius:var(--radius-sm);font-weight:var(--font-weight-semibold);position:absolute;inset-block-start:var(--space-2xs);inset-inline-start:var(--space-2xs);transform:translateY(-200%)}.mw-skip[data-v-ddc3c0de]:focus{transform:none}}
39
+ @layer mw.reset;@layer mw.components{.mw-stat-grid[data-v-d0a6288d]{gap:var(--space-4xs) var(--space-xs);font-size:var(--font-size-sm);grid-template-columns:fit-content(40%) minmax(0,1fr);margin:0;display:grid}}
40
+ @layer mw.reset;@layer mw.components{.mw-stat-grid__label[data-v-437d86d6]{color:var(--muted);overflow-wrap:anywhere}.mw-stat-grid__value[data-v-437d86d6]{font-family:var(--mw-font-mono);color:var(--text);text-align:right;overflow-wrap:anywhere;margin:0}.mw-stat-grid__value--left[data-v-437d86d6]{text-align:left}}
41
+ @layer mw.reset;@layer mw.components{.mw-statusbar[data-v-df7ff616]{align-items:center;gap:var(--space-4xs) var(--space-sm);padding:var(--space-4xs) var(--space-xs);font-size:var(--font-size-2xs);color:var(--muted);background:var(--surface);border-top:1px solid var(--border);font-family:var(--mw-font-mono);z-index:var(--z-raised);flex-wrap:wrap;flex-shrink:0;margin:0;list-style:none;display:flex;position:sticky;bottom:0}.mw-statusbar[data-v-df7ff616]>li{align-items:center;gap:var(--space-3xs);display:flex}.mw-statusbar[data-v-df7ff616]>li+li:before{content:"│" / "";color:var(--border);margin-inline-end:var(--space-xs)}.mw-statusbar__pending[data-v-df7ff616]{font-style:italic}}
42
+ @layer mw.reset;@layer mw.components{.mw-status-dot[data-v-271bba4b]{border-radius:50%;flex-shrink:0;display:inline-block}.mw-status-dot--sm[data-v-271bba4b]{width:var(--space-2xs);height:var(--space-2xs)}.mw-status-dot--md[data-v-271bba4b]{width:var(--space-xs);height:var(--space-xs)}.mw-status-dot--ok[data-v-271bba4b]{background:var(--ok)}.mw-status-dot--warn[data-v-271bba4b]{background:var(--warning)}.mw-status-dot--error[data-v-271bba4b]{background:var(--danger)}.mw-status-dot--unknown[data-v-271bba4b]{background:var(--muted)}}
43
+ @layer mw.reset;@layer mw.components{.ui-stepper[data-v-8a6485e2]{margin:0 0 var(--space-md);padding:0;list-style:none;display:flex}.ui-stepper--vertical[data-v-8a6485e2]{gap:var(--space-xs);flex-direction:column;margin:0}.ui-stepper__step[data-v-8a6485e2]{align-items:center;gap:var(--space-2xs);flex-direction:column;flex:1 1 0;min-width:0;display:flex;position:relative}.ui-stepper--vertical .ui-stepper__step[data-v-8a6485e2]{align-items:center;gap:var(--space-xs);flex-direction:row}.ui-stepper--horizontal .ui-stepper__step[data-v-8a6485e2]:not(:first-child):before{content:"";top:var(--space-xs);height:var(--space-4xs);background:var(--border);z-index:0;position:absolute;left:-50%;right:50%}.ui-stepper--horizontal .ui-stepper__step.is-done[data-v-8a6485e2]:before,.ui-stepper--horizontal .ui-stepper__step.is-active[data-v-8a6485e2]:before{background:var(--accent)}.ui-stepper__badge[data-v-8a6485e2]{z-index:var(--z-raised);width:var(--space-md);height:var(--space-md);font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);border:var(--space-4xs) solid var(--border);background:var(--surface);color:var(--muted);cursor:default;transition:background-color var(--transition-base), border-color var(--transition-base);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;padding:0;font-family:inherit;line-height:1;display:flex;position:relative}button.ui-stepper__badge[data-v-8a6485e2]{cursor:pointer}button.ui-stepper__badge[data-v-8a6485e2]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.is-done .ui-stepper__badge[data-v-8a6485e2]{background:var(--accent);border-color:var(--accent);color:var(--accent-contrast)}.is-active .ui-stepper__badge[data-v-8a6485e2],.is-busy .ui-stepper__badge[data-v-8a6485e2]{background:color-mix(in srgb, var(--accent) 12%, var(--surface));border-color:var(--accent);color:var(--accent)}.is-error .ui-stepper__badge[data-v-8a6485e2]{background:color-mix(in srgb, var(--danger) 12%, var(--surface));border-color:var(--danger);color:var(--danger)}.ui-stepper__label[data-v-8a6485e2]{font-size:var(--font-size-sm);text-align:center;color:var(--muted);max-width:100%;line-height:var(--leading-tight)}.ui-stepper--horizontal .ui-stepper__label[data-v-8a6485e2]{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.ui-stepper--vertical .ui-stepper__label[data-v-8a6485e2]{text-align:start}.is-done .ui-stepper__label[data-v-8a6485e2],.is-active .ui-stepper__label[data-v-8a6485e2],.is-busy .ui-stepper__label[data-v-8a6485e2],.is-error .ui-stepper__label[data-v-8a6485e2]{color:var(--text)}.is-active .ui-stepper__label[data-v-8a6485e2],.is-busy .ui-stepper__label[data-v-8a6485e2]{font-weight:var(--font-weight-semibold)}}
44
+ @layer mw.reset;@layer mw.components{.mw-tab-panel[data-v-add194c8]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}}
45
+ @layer mw.reset;@layer mw.components{.mw-textarea[data-v-a5067b5e]{width:100%;padding:var(--space-2xs) var(--space-xs);background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius);font:inherit;resize:vertical}.mw-textarea[data-v-a5067b5e]::placeholder{color:var(--muted)}.mw-textarea[data-v-a5067b5e]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}.mw-textarea[aria-invalid=true][data-v-a5067b5e]{border-color:var(--danger)}.mw-textarea[data-v-a5067b5e]:disabled{filter:grayscale(.6);cursor:not-allowed}}
46
+ @layer mw.reset;@layer mw.components{.mw-toolbar[data-v-d09c20c7]{align-items:center;gap:var(--space-3xs);padding:var(--space-3xs) var(--space-2xs);border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0;margin:0;display:flex}}
47
+ @layer mw.reset;@layer mw.components{.mw-toolbar-btn[data-v-c46bd947]{align-items:center;gap:var(--space-3xs);padding:var(--space-3xs) var(--space-2xs);min-height:var(--space-md);font-size:var(--font-size-sm);background:var(--lift);border:1px solid var(--border);border-radius:var(--radius-xs);color:var(--text);cursor:pointer;white-space:nowrap;transition:background var(--duration-fast), border-color var(--duration-fast);display:inline-flex}.mw-toolbar-btn[data-v-c46bd947]:hover:not(:disabled){background:var(--surface);border-color:var(--accent)}.mw-toolbar-btn[data-v-c46bd947]:disabled{filter:grayscale(.6);cursor:not-allowed}.mw-toolbar-btn[data-v-c46bd947]:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}}
48
+ @layer mw.reset;@layer mw.components{.mw-tool-intro[data-v-48ed04fc]{margin:var(--space-3xs) 0 var(--space-sm);color:var(--muted)}}
@@ -0,0 +1 @@
1
+ @layer mw.reset;@layer mw.components{.mw-footer[data-v-766c24d7]{align-items:center;gap:var(--space-sm);padding:var(--space-xs) var(--space-sm);background:var(--_bg);color:var(--_muted);border-top:1px solid var(--_border);font-family:var(--mw-font-sans);font-size:var(--font-size-sm);flex-wrap:wrap;display:flex}.mw-footer--transparent[data-v-766c24d7]{border-top:1px solid var(--border)}.mw-footer__docs[data-v-766c24d7]{align-items:center;gap:var(--space-2xs) var(--space-sm);flex-wrap:wrap;max-inline-size:100%;margin-inline-start:auto;display:flex}.mw-footer__docs a[data-v-766c24d7]{color:inherit;text-underline-offset:.18em;text-decoration:underline}.mw-footer__docs a[data-v-766c24d7]:hover{text-decoration-thickness:.14em}.mw-footer a[data-v-766c24d7-s]{color:inherit}.mw-footer[data-v-766c24d7]:not(.mw-footer--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}}
@@ -0,0 +1,7 @@
1
+ import e from "../_virtual/_plugin-vue_export-helper.js";
2
+ import t from "./AppFooter.vue_vue_type_script_setup_true_lang.js";
3
+ import "./AppFooter.css";
4
+ //#region src/components/AppFooter.vue
5
+ var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-766c24d7"]]);
6
+ //#endregion
7
+ export { n as default };
@@ -0,0 +1,42 @@
1
+ import { usePanelOverrides as e } from "../internal/panel.js";
2
+ import { createCommentVNode as t, createElementBlock as n, defineComponent as r, normalizeClass as i, openBlock as a, ref as o, renderSlot as s, unref as c } from "vue";
3
+ import { safeHref as l } from "@meddleware/web-utils";
4
+ //#region src/components/AppFooter.vue?vue&type=script&setup=true&lang.ts
5
+ var u = {
6
+ key: 0,
7
+ class: "mw-footer__docs",
8
+ "aria-label": "Documentation"
9
+ }, d = ["href"], f = ["href"], p = /*@__PURE__*/ r({
10
+ __name: "AppFooter",
11
+ props: {
12
+ variant: { default: "transparent" },
13
+ colors: {},
14
+ docsUrl: {},
15
+ devUrl: {}
16
+ },
17
+ setup(r) {
18
+ let p = r, m = o(null);
19
+ return e(m, () => p.colors), (e, o) => (a(), n("footer", {
20
+ ref_key: "root",
21
+ ref: m,
22
+ class: i(["mw-footer", `mw-panel--${r.variant} mw-footer--${r.variant}`])
23
+ }, [
24
+ s(e.$slots, "start"),
25
+ s(e.$slots, "default"),
26
+ s(e.$slots, "end"),
27
+ r.docsUrl || r.devUrl ? (a(), n("nav", u, [r.docsUrl ? (a(), n("a", {
28
+ key: 0,
29
+ href: c(l)(r.docsUrl),
30
+ target: "_blank",
31
+ rel: "noopener noreferrer"
32
+ }, "Documentation", 8, d)) : t("", !0), r.devUrl ? (a(), n("a", {
33
+ key: 1,
34
+ href: c(l)(r.devUrl),
35
+ target: "_blank",
36
+ rel: "noopener noreferrer"
37
+ }, "Developer docs", 8, f)) : t("", !0)])) : t("", !0)
38
+ ], 2));
39
+ }
40
+ });
41
+ //#endregion
42
+ export { p as default };
@@ -0,0 +1 @@
1
+ @layer mw.reset;@layer mw.components{.mw-header[data-v-8f38cdd2]{align-items:center;gap:var(--space-2xs);min-height:var(--mw-header-height);padding:var(--space-4xs) var(--space-sm);background:var(--_bg);color:var(--_text);border-bottom:1px solid var(--_border);font-family:var(--mw-font-sans);transition:background var(--transition-base), backdrop-filter var(--transition-base), border-color var(--transition-base), box-shadow var(--transition-base);flex-wrap:wrap;display:flex}.mw-header--sticky[data-v-8f38cdd2]{z-index:var(--z-header);position:sticky;top:0}.mw-header--scrolled[data-v-8f38cdd2]{background:color-mix(in srgb, var(--bg) 82%, transparent);-webkit-backdrop-filter:blur(var(--space-2xs));backdrop-filter:blur(var(--space-2xs));border-bottom-color:var(--border);box-shadow:var(--shadow-1)}.mw-header__brand[data-v-8f38cdd2]{align-items:center;gap:var(--space-2xs);font-weight:var(--font-weight-brand);letter-spacing:var(--tracking-wide);overflow-wrap:anywhere;min-inline-size:0;margin-inline-end:auto;text-decoration:none;display:flex}.mw-header a[data-v-8f38cdd2-s]{color:inherit}.mw-header__menu[data-v-8f38cdd2]{padding:var(--space-3xs);border:1px solid var(--_border);border-radius:var(--radius-sm);color:inherit;cursor:pointer;background:0 0;justify-content:center;align-items:center;display:none}.mw-header__menu[data-v-8f38cdd2]:hover{background:color-mix(in srgb, currentColor 12%, transparent)}@media (width<45em){.mw-header__menu[data-v-8f38cdd2]{display:inline-flex}}.mw-header[data-v-8f38cdd2]:not(.mw-header--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}}
@@ -0,0 +1,7 @@
1
+ import e from "./AppHeader.vue_vue_type_script_setup_true_lang.js";
2
+ import "./AppHeader.css";
3
+ import t from "../_virtual/_plugin-vue_export-helper.js";
4
+ //#region src/components/AppHeader.vue
5
+ var n = /*#__PURE__*/ t(e, [["__scopeId", "data-v-8f38cdd2"]]);
6
+ //#endregion
7
+ export { n as default };
@@ -12,6 +12,13 @@ type __VLS_Props = {
12
12
  * background so the brand/nav stay legible. No-op unless the header scrolls.
13
13
  */
14
14
  solidifyOnScroll?: boolean;
15
+ /**
16
+ * The `id` of an AppSidebar. When set, a menu button appears on narrow screens (below 45em) that opens the sidebar as a drawer;
17
+ * on wide screens the sidebar is always visible and the button is hidden.
18
+ */
19
+ sidebarId?: string;
20
+ /** Accessible name of the menu button. */
21
+ menuLabel?: string;
15
22
  };
16
23
  declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {};
17
24
  type __VLS_Slots = {} & {
@@ -25,6 +32,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
25
32
  variant: PanelVariant;
26
33
  sticky: boolean;
27
34
  solidifyOnScroll: boolean;
35
+ menuLabel: string;
28
36
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
29
37
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
30
38
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,68 @@
1
+ import { usePanelOverrides as e } from "../internal/panel.js";
2
+ import { createCommentVNode as t, createElementBlock as n, createElementVNode as r, defineComponent as i, normalizeClass as a, onBeforeUnmount as o, onMounted as s, openBlock as c, ref as l, renderSlot as u } from "vue";
3
+ //#region src/components/AppHeader.vue?vue&type=script&setup=true&lang.ts
4
+ var d = ["popovertarget", "aria-label"], f = {
5
+ key: 1,
6
+ class: "mw-header__brand"
7
+ }, p = /*@__PURE__*/ i({
8
+ __name: "AppHeader",
9
+ props: {
10
+ variant: { default: "dark" },
11
+ colors: {},
12
+ sticky: {
13
+ type: Boolean,
14
+ default: !0
15
+ },
16
+ solidifyOnScroll: {
17
+ type: Boolean,
18
+ default: !1
19
+ },
20
+ sidebarId: {},
21
+ menuLabel: { default: "Menu" }
22
+ },
23
+ setup(i) {
24
+ let p = i, m = l(null);
25
+ e(m, () => p.colors);
26
+ let h = l(!1), g = null;
27
+ return s(() => {
28
+ p.solidifyOnScroll && typeof window < "u" && (g = () => {
29
+ h.value = window.scrollY > 8;
30
+ }, g(), window.addEventListener("scroll", g, { passive: !0 }));
31
+ }), o(() => {
32
+ g && window.removeEventListener("scroll", g);
33
+ }), (e, o) => (c(), n("header", {
34
+ ref_key: "root",
35
+ ref: m,
36
+ class: a(["mw-header", [
37
+ `mw-panel--${i.variant}`,
38
+ `mw-header--${i.variant}`,
39
+ {
40
+ "mw-header--sticky": i.sticky,
41
+ "mw-header--scrolled": i.solidifyOnScroll && h.value
42
+ }
43
+ ]])
44
+ }, [
45
+ i.sidebarId ? (c(), n("button", {
46
+ key: 0,
47
+ type: "button",
48
+ class: "mw-header__menu",
49
+ popovertarget: i.sidebarId,
50
+ "aria-label": i.menuLabel
51
+ }, [...o[0] ||= [r("svg", {
52
+ viewBox: "0 0 24 24",
53
+ width: "1.25em",
54
+ height: "1.25em",
55
+ fill: "none",
56
+ stroke: "currentColor",
57
+ "stroke-width": "2",
58
+ "stroke-linecap": "round",
59
+ "aria-hidden": "true"
60
+ }, [r("path", { d: "M4 6h16M4 12h16M4 18h16" })], -1)]], 8, d)) : t("", !0),
61
+ e.$slots.brand ? (c(), n("span", f, [u(e.$slots, "brand")])) : t("", !0),
62
+ u(e.$slots, "default"),
63
+ u(e.$slots, "actions")
64
+ ], 2));
65
+ }
66
+ });
67
+ //#endregion
68
+ export { p as default };
@@ -0,0 +1 @@
1
+ @layer mw.reset;@layer mw.components{.mw-sidebar[data-v-f5e6df6c]{--_width:var(--v4ba6c322);height:100%;width:var(--_width);background:var(--_bg);color:var(--_text);border:0;border-right:1px solid var(--_border);font-family:var(--mw-font-sans);flex-direction:column;margin:0;padding:0;display:flex;position:static;inset:auto;overflow:visible}.mw-sidebar__nav[data-v-f5e6df6c]{gap:var(--space-3xs);padding:var(--space-xs) 0;flex-direction:column;flex:auto;display:flex;overflow-y:auto}@media (width<45em){.mw-sidebar[data-v-f5e6df6c]:not(:popover-open){display:none}.mw-sidebar[data-v-f5e6df6c]:popover-open{width:min(var(--_width), 85vw);height:100dvh;box-shadow:var(--shadow-3);position:fixed;inset:0 auto 0 0}.mw-sidebar[data-v-f5e6df6c]::backdrop{background:var(--backdrop)}}.mw-sidebar a[data-v-f5e6df6c-s]{color:inherit}.mw-sidebar[data-v-f5e6df6c]:not(.mw-sidebar--transparent){--ok:var(--_ok);--danger:var(--_danger);--info:var(--_info)}}
@@ -0,0 +1,7 @@
1
+ import e from "../_virtual/_plugin-vue_export-helper.js";
2
+ import t from "./AppSidebar.vue_vue_type_script_setup_true_lang.js";
3
+ import "./AppSidebar.css";
4
+ //#region src/components/AppSidebar.vue
5
+ var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-f5e6df6c"]]);
6
+ //#endregion
7
+ export { n as default };
@@ -6,6 +6,8 @@ type __VLS_Props = {
6
6
  colors?: PanelColors;
7
7
  /** Sidebar width (CSS length, e.g. '280px'). Defaults to `--mw-sidebar-width` (240px). */
8
8
  width?: string;
9
+ /** Accessible name of the navigation landmark. */
10
+ navLabel?: string;
9
11
  };
10
12
  declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {};
11
13
  type __VLS_Slots = {} & {
@@ -19,6 +21,7 @@ type __VLS_Slots = {} & {
19
21
  };
20
22
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
21
23
  variant: PanelVariant;
24
+ navLabel: string;
22
25
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
23
26
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
24
27
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,37 @@
1
+ import { usePanelOverrides as e } from "../internal/panel.js";
2
+ import { computed as t, createElementBlock as n, createElementVNode as r, defineComponent as i, normalizeClass as a, onBeforeUnmount as o, onMounted as s, openBlock as c, ref as l, renderSlot as u, useCssVars as d } from "vue";
3
+ //#region src/components/AppSidebar.vue?vue&type=script&setup=true&lang.ts
4
+ var f = ["aria-label"], p = /*@__PURE__*/ i({
5
+ __name: "AppSidebar",
6
+ props: {
7
+ variant: { default: "dark" },
8
+ colors: {},
9
+ width: {},
10
+ navLabel: { default: "Primary" }
11
+ },
12
+ setup(i) {
13
+ d((e) => ({ v4ba6c322: m.value }));
14
+ let p = i, m = t(() => p.width ?? "var(--mw-sidebar-width)"), h = l(null);
15
+ e(h, () => p.colors);
16
+ function g(e) {
17
+ let t = h.value;
18
+ t && e.target instanceof Element && e.target.closest("button, a[href]") && typeof t.hidePopover == "function" && t.matches(":popover-open") && t.hidePopover();
19
+ }
20
+ return s(() => h.value?.addEventListener("click", g)), o(() => h.value?.removeEventListener("click", g)), (e, t) => (c(), n("aside", {
21
+ ref_key: "aside",
22
+ ref: h,
23
+ class: a(["mw-sidebar", `mw-panel--${i.variant} mw-sidebar--${i.variant}`]),
24
+ popover: "auto"
25
+ }, [
26
+ u(e.$slots, "head"),
27
+ r("nav", {
28
+ class: "mw-sidebar__nav",
29
+ "aria-label": i.navLabel
30
+ }, [u(e.$slots, "default")], 8, f),
31
+ u(e.$slots, "body"),
32
+ u(e.$slots, "foot")
33
+ ], 2));
34
+ }
35
+ });
36
+ //#endregion
37
+ export { p as default };
@@ -0,0 +1 @@
1
+ @layer mw.reset;@layer mw.components{.mw-tab-nav[data-v-004591c8]{gap:var(--space-3xs);border-bottom:var(--space-4xs) solid var(--border);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.mw-tab-nav__item[data-v-004591c8]{display:contents}.mw-tab-nav__tab[data-v-004591c8]{appearance:none;border:none;border-bottom:var(--space-4xs) solid transparent;padding:var(--space-2xs) var(--space-sm);margin-bottom:calc(-1 * var(--space-4xs));cursor:pointer;font-size:var(--font-size-base);color:var(--muted);transition:color var(--transition-base), border-color var(--transition-base);background:0 0;border-radius:0}.mw-tab-nav__tab[data-v-004591c8]:hover{color:var(--text)}.mw-tab-nav__tab--active[data-v-004591c8]{border-bottom-color:var(--accent);color:var(--text);font-weight:var(--font-weight-semibold)}.mw-tab-nav--raised[data-v-004591c8]{border-bottom:1px solid var(--border);background:var(--surface);padding:var(--space-3xs) var(--space-3xs) 0;align-items:flex-end;gap:var(--space-4xs);scrollbar-width:none;flex-shrink:0;overflow-x:auto}.mw-tab-nav--raised[data-v-004591c8]::-webkit-scrollbar{display:none}.mw-tab-nav--raised .mw-tab-nav__tab[data-v-004591c8]{border-bottom:1px solid var(--border);padding:var(--space-3xs) var(--space-xs) var(--space-3xs);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--muted);background:var(--lift);border-top:var(--space-4xs) solid transparent;white-space:nowrap;transition:color var(--transition-base), background var(--transition-base), border-color var(--transition-base);border-left:1px solid #0000;border-right:1px solid #0000;margin-bottom:-1px}.mw-tab-nav--raised .mw-tab-nav__tab[data-v-004591c8]:hover:not(.mw-tab-nav__tab--active){color:var(--text);background:var(--surface)}.mw-tab-nav--raised .mw-tab-nav__tab--active[data-v-004591c8]{color:var(--text);background:var(--bg);border-color:var(--accent) var(--border) var(--bg) var(--border);font-weight:var(--font-weight-semibold)}.mw-tab-nav--raised.mw-tab-nav--lg[data-v-004591c8]{gap:var(--space-4xs);padding:var(--space-3xs) var(--space-3xs) 0}.mw-tab-nav--raised.mw-tab-nav--lg .mw-tab-nav__tab[data-v-004591c8]{padding:var(--space-2xs) var(--space-sm);font-size:var(--font-size-base);font-weight:var(--font-weight-semibold)}.mw-tab-nav--flush[data-v-004591c8]{background:0 0;padding-inline:0}}
@@ -0,0 +1,7 @@
1
+ import e from "../_virtual/_plugin-vue_export-helper.js";
2
+ import t from "./AppTabNav.vue_vue_type_script_setup_true_lang.js";
3
+ import "./AppTabNav.css";
4
+ //#region src/components/AppTabNav.vue
5
+ var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-004591c8"]]);
6
+ //#endregion
7
+ export { n as default };
@@ -13,6 +13,8 @@ type __VLS_Props = {
13
13
  size?: 'md' | 'lg';
14
14
  /** Every tab's UiTabPanel is in the DOM (inactive ones hidden), not only the selected one. */
15
15
  allPanels?: boolean;
16
+ /** Drop the bleed between the tab strip and the content (a strip that sits directly on a page edge rather than in a card). */
17
+ flush?: boolean;
16
18
  };
17
19
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
18
20
  "update:modelValue": (id: string) => any;
@@ -22,6 +24,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
22
24
  variant: "underline" | "raised";
23
25
  size: "md" | "lg";
24
26
  allPanels: boolean;
27
+ flush: boolean;
25
28
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
26
29
  declare const _default: typeof __VLS_export;
27
30
  export default _default;