@meddleware/ui 0.1.34 → 0.1.36

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 +15 -11
  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/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import './styles/base.css';
2
1
  export { default as AppHeader } from './components/AppHeader.vue';
3
2
  export { default as AppSidebar } from './components/AppSidebar.vue';
4
3
  export { default as AppFooter } from './components/AppFooter.vue';
@@ -19,14 +18,31 @@ export { default as CopyableAddress } from './components/CopyableAddress.vue';
19
18
  export { default as ExplorerLink } from './components/ExplorerLink.vue';
20
19
  export { default as CopyrightLine } from './components/CopyrightLine.vue';
21
20
  export { default as UiStepper } from './components/UiStepper.vue';
22
- export type { StepperStep } from './components/UiStepper.vue';
21
+ export type { StepperStep, StepStatus } from './components/UiStepper.vue';
23
22
  export { default as UiSegmentedControl } from './components/UiSegmentedControl.vue';
24
23
  export type { SegmentedOption } from './components/UiSegmentedControl.vue';
25
24
  export { default as UiFieldHint } from './components/UiFieldHint.vue';
26
25
  export { default as UiFormField } from './components/UiFormField.vue';
27
26
  export { default as UiToolIntro } from './components/UiToolIntro.vue';
27
+ export { default as UiInput } from './components/UiInput.vue';
28
+ export { default as UiTextarea } from './components/UiTextarea.vue';
29
+ export { default as UiFileField } from './components/UiFileField.vue';
30
+ export { default as UiTextField } from './components/UiTextField.vue';
31
+ export { default as UiSelectField } from './components/UiSelectField.vue';
32
+ export { default as UiCheckField } from './components/UiCheckField.vue';
33
+ export { default as UiDateTimeField } from './components/UiDateTimeField.vue';
34
+ export { default as UiMeter } from './components/UiMeter.vue';
35
+ export { default as UiPager } from './components/UiPager.vue';
36
+ export { default as UiLiveStatus } from './components/UiLiveStatus.vue';
37
+ export { default as UiEmptyState } from './components/UiEmptyState.vue';
38
+ export { default as UiCopyButton } from './components/UiCopyButton.vue';
39
+ export { default as UiCodeBlock } from './components/UiCodeBlock.vue';
40
+ export { default as UiSkipLink } from './components/UiSkipLink.vue';
41
+ export { default as UiAmount } from './components/UiAmount.vue';
42
+ export { default as UiAppShell } from './components/UiAppShell.vue';
28
43
  export { default as UiPanel } from './components/UiPanel.vue';
29
44
  export { default as UiBadge } from './components/UiBadge.vue';
45
+ export type { BadgeTone } from './components/UiBadge.vue';
30
46
  export { default as UiToolbar } from './components/UiToolbar.vue';
31
47
  export type { ToolbarAction } from './components/UiToolbar.vue';
32
48
  export { default as UiToolbarButton } from './components/UiToolbarButton.vue';
@@ -35,18 +51,22 @@ export { default as UiStatRow } from './components/UiStatRow.vue';
35
51
  export { default as UiDataTable } from './components/UiDataTable.vue';
36
52
  export { default as UiStatusBar } from './components/UiStatusBar.vue';
37
53
  export { default as UiStatusDot } from './components/UiStatusDot.vue';
54
+ export type { StatusDotStatus } from './components/UiStatusDot.vue';
38
55
  export { default as UiActivityFeed } from './components/UiActivityFeed.vue';
39
56
  export { default as UiActivityItem } from './components/UiActivityItem.vue';
40
57
  export { default as StatusWidget } from './components/StatusWidget.vue';
41
- export { suiExplorerUrl } from './explorer.js';
42
- export type { SuiNetwork, SuiExplorerKind } from './explorer.js';
58
+ export { suiExplorerUrl, walruscanBlobUrl, safeHref, safePath, safeIcon, truncateMiddle, DEFAULT_TRUNCATE_CHARS } from '@meddleware/web-utils';
59
+ export type { SuiNetwork, SuiExplorerKind } from '@meddleware/web-utils';
60
+ export { isStatusLevel, parseSnapshot, STATUS_LABEL, STATUS_HEADLINE } from '@meddleware/web-utils';
61
+ export type { StatusLevel, StatusComponent, StatusGroup, StatusSnapshot } from '@meddleware/web-utils';
43
62
  export { useColorMode } from './composables/useColorMode.js';
44
63
  export type { ColorMode } from './composables/useColorMode.js';
45
64
  export { useSeason } from './composables/useSeason.js';
65
+ export { useNow } from './composables/useNow.js';
66
+ export { useStatusSnapshot, MIN_STATUS_POLL_MS } from './composables/useStatusSnapshot.js';
67
+ export type { UseStatusSnapshotOptions, StatusSnapshotState } from './composables/useStatusSnapshot.js';
68
+ export { usePager } from './composables/usePager.js';
69
+ export type { Pager, PageOf } from './composables/usePager.js';
46
70
  export type { PanelVariant, PanelColors } from './internal/panel.js';
47
- export { isStatusLevel, parseSnapshot } from './status.js';
48
- export { safeHref, safePath } from './safe-href.js';
49
- export { truncateMiddle, DEFAULT_TRUNCATE_CHARS } from './truncate.js';
50
- export type { StatusLevel, StatusComponent, StatusGroup, StatusSnapshot } from './status.js';
51
71
  export { loadRuntimeConfig, runtimeEndpoints, withRuntimeEnv, parseRuntimeConfig, parseEndpoint, resetRuntimeConfigForTesting, RUNTIME_ENDPOINT_KEYS, RUNTIME_CONFIG_PATH, } from './runtime-config.js';
52
72
  export type { RuntimeEndpointKey, RuntimeEndpoints } from './runtime-config.js';
package/dist/index.js ADDED
@@ -0,0 +1,58 @@
1
+ import e from "./components/AppHeader.js";
2
+ import t from "./components/AppSidebar.js";
3
+ import n from "./components/AppFooter.js";
4
+ import r from "./components/ColorModeControl.js";
5
+ import i from "./components/UiButton.js";
6
+ import a from "./components/UiCard.js";
7
+ import o from "./components/UiSelect.js";
8
+ import s from "./components/UiNotice.js";
9
+ import c from "./components/SidebarItem.js";
10
+ import l from "./components/SidebarGroup.js";
11
+ import { tabIds as u } from "./tabs.js";
12
+ import d from "./components/AppTabNav.js";
13
+ import f from "./components/UiTabPanel.js";
14
+ import p from "./components/UiDialog.js";
15
+ import m from "./components/UiCopyButton.js";
16
+ import h from "./components/CopyableAddress.js";
17
+ import g from "./components/ExplorerLink.js";
18
+ import _ from "./components/CopyrightLine.js";
19
+ import v from "./components/UiStepper.js";
20
+ import y from "./components/UiSegmentedControl.js";
21
+ import b from "./components/UiFieldHint.js";
22
+ import x from "./components/UiFormField.js";
23
+ import S from "./components/UiToolIntro.js";
24
+ import C from "./components/UiInput.js";
25
+ import w from "./components/UiTextarea.js";
26
+ import T from "./components/UiFileField.js";
27
+ import E from "./components/UiTextField.js";
28
+ import D from "./components/UiSelectField.js";
29
+ import O from "./components/UiCheckField.js";
30
+ import k from "./components/UiDateTimeField.js";
31
+ import A from "./components/UiMeter.js";
32
+ import j from "./components/UiPager.js";
33
+ import M from "./components/UiLiveStatus.js";
34
+ import N from "./components/UiEmptyState.js";
35
+ import P from "./components/UiCodeBlock.js";
36
+ import F from "./components/UiSkipLink.js";
37
+ import I from "./components/UiAmount.js";
38
+ import L from "./components/UiAppShell.js";
39
+ import R from "./components/UiPanel.js";
40
+ import z from "./components/UiBadge.js";
41
+ import B from "./components/UiToolbarButton.js";
42
+ import V from "./components/UiToolbar.js";
43
+ import H from "./components/UiStatGrid.js";
44
+ import U from "./components/UiStatRow.js";
45
+ import W from "./components/UiDataTable.js";
46
+ import { useNow as G } from "./composables/useNow.js";
47
+ import K from "./components/UiStatusDot.js";
48
+ import q from "./components/UiStatusBar.js";
49
+ import J from "./components/UiActivityFeed.js";
50
+ import Y from "./components/UiActivityItem.js";
51
+ import { MIN_STATUS_POLL_MS as X, useStatusSnapshot as Z } from "./composables/useStatusSnapshot.js";
52
+ import Q from "./components/StatusWidget.js";
53
+ import { useColorMode as $ } from "./composables/useColorMode.js";
54
+ import { useSeason as ee } from "./composables/useSeason.js";
55
+ import { usePager as te } from "./composables/usePager.js";
56
+ import { RUNTIME_CONFIG_PATH as ne, RUNTIME_ENDPOINT_KEYS as re, loadRuntimeConfig as ie, parseEndpoint as ae, parseRuntimeConfig as oe, resetRuntimeConfigForTesting as se, runtimeEndpoints as ce, withRuntimeEnv as le } from "./runtime-config.js";
57
+ import { DEFAULT_TRUNCATE_CHARS as ue, STATUS_HEADLINE as de, STATUS_LABEL as fe, isStatusLevel as pe, parseSnapshot as me, safeHref as he, safeIcon as ge, safePath as _e, suiExplorerUrl as ve, truncateMiddle as ye, walruscanBlobUrl as be } from "@meddleware/web-utils";
58
+ export { n as AppFooter, e as AppHeader, t as AppSidebar, d as AppTabNav, r as ColorModeControl, h as CopyableAddress, _ as CopyrightLine, ue as DEFAULT_TRUNCATE_CHARS, g as ExplorerLink, X as MIN_STATUS_POLL_MS, ne as RUNTIME_CONFIG_PATH, re as RUNTIME_ENDPOINT_KEYS, de as STATUS_HEADLINE, fe as STATUS_LABEL, l as SidebarGroup, c as SidebarItem, Q as StatusWidget, J as UiActivityFeed, Y as UiActivityItem, I as UiAmount, L as UiAppShell, z as UiBadge, i as UiButton, a as UiCard, O as UiCheckField, P as UiCodeBlock, m as UiCopyButton, W as UiDataTable, k as UiDateTimeField, p as UiDialog, N as UiEmptyState, b as UiFieldHint, T as UiFileField, x as UiFormField, C as UiInput, M as UiLiveStatus, A as UiMeter, s as UiNotice, j as UiPager, R as UiPanel, y as UiSegmentedControl, o as UiSelect, D as UiSelectField, F as UiSkipLink, H as UiStatGrid, U as UiStatRow, q as UiStatusBar, K as UiStatusDot, v as UiStepper, f as UiTabPanel, E as UiTextField, w as UiTextarea, S as UiToolIntro, V as UiToolbar, B as UiToolbarButton, pe as isStatusLevel, ie as loadRuntimeConfig, ae as parseEndpoint, oe as parseRuntimeConfig, me as parseSnapshot, se as resetRuntimeConfigForTesting, ce as runtimeEndpoints, he as safeHref, ge as safeIcon, _e as safePath, ve as suiExplorerUrl, u as tabIds, ye as truncateMiddle, $ as useColorMode, G as useNow, te as usePager, ee as useSeason, Z as useStatusSnapshot, be as walruscanBlobUrl, le as withRuntimeEnv };
@@ -1,4 +1,4 @@
1
- import type { CSSProperties } from 'vue';
1
+ import { type Ref } from 'vue';
2
2
  /** Panel colour scheme: theme-independent `light`/`dark` panel tokens, or `transparent`. */
3
3
  export type PanelVariant = 'light' | 'dark' | 'transparent';
4
4
  /** Optional per-instance colour overrides (win over the token defaults). */
@@ -22,4 +22,10 @@ export interface PanelColors {
22
22
  * them for their content. Transparent panels keep the page's status roles.
23
23
  * Any supplied `colors` override the defaults — token values are the default.
24
24
  */
25
- export declare function panelVars(variant: PanelVariant, colors?: PanelColors): CSSProperties;
25
+ export declare function panelVars(variant: PanelVariant, colors?: PanelColors): Record<string, string>;
26
+ /**
27
+ * Apply a panel's per-instance `colors` overrides to its root element. The variant's own colours are CLASSES (`mw-panel--dark` …, in the
28
+ * reset), so only an override is ever written, and it is written through the CSSOM (`style.setProperty`) rather than a `style` attribute
29
+ * in the template: nothing inline is rendered, and it needs no `'unsafe-inline'` in a strict `style-src`. Clearing `colors` clears it.
30
+ */
31
+ export declare function usePanelOverrides(el: Ref<HTMLElement | null>, colors: () => PanelColors | undefined): void;
@@ -0,0 +1,29 @@
1
+ import { onBeforeUnmount as e, onMounted as t, watch as n } from "vue";
2
+ //#region src/internal/panel.ts
3
+ var r = [
4
+ "bg",
5
+ "surface",
6
+ "text",
7
+ "muted",
8
+ "border",
9
+ "ok",
10
+ "danger",
11
+ "info"
12
+ ];
13
+ function i(i, a) {
14
+ let o = () => {
15
+ let e = i.value;
16
+ if (!e) return;
17
+ let t = a();
18
+ for (let n of r) {
19
+ let r = t?.[n];
20
+ r ? e.style.setProperty(`--_${n}`, r) : e.style.removeProperty(`--_${n}`);
21
+ }
22
+ };
23
+ t(o), n(a, o, { deep: !0 }), e(() => {
24
+ let e = i.value;
25
+ if (e) for (let t of r) e.style.removeProperty(`--_${t}`);
26
+ });
27
+ }
28
+ //#endregion
29
+ export { i as usePanelOverrides };
package/dist/reset.css ADDED
@@ -0,0 +1 @@
1
+ @layer mw.reset{*,: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}.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){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;
@@ -0,0 +1,73 @@
1
+ //#region src/runtime-config.ts
2
+ var e = [
3
+ "VITE_INDEXER_URL",
4
+ "VITE_WALRUS_RELAY_TESTNET",
5
+ "VITE_WALRUS_RELAY_MAINNET"
6
+ ], t = "/runtime-config.json", n = 16384, r = 3e3, i = Object.freeze({});
7
+ function a(e) {
8
+ if (typeof e != "string" || e.length === 0 || e.length > 2048 || /[\u0000- \u007f\\]/.test(e)) return;
9
+ let t;
10
+ try {
11
+ t = new URL(e);
12
+ } catch {
13
+ return;
14
+ }
15
+ if (t.username || t.password || t.search || t.hash) return;
16
+ let n = t.hostname === "localhost" || t.hostname === "127.0.0.1";
17
+ if (t.protocol === "https:" || t.protocol === "http:" && n) return t.href.replace(/\/+$/, "");
18
+ }
19
+ function o(t) {
20
+ let n = {}, r = [];
21
+ if (typeof t != "object" || !t || Array.isArray(t)) return {
22
+ endpoints: n,
23
+ rejected: ["<root>"]
24
+ };
25
+ for (let [i, o] of Object.entries(t)) {
26
+ if (!e.includes(i)) {
27
+ r.push(i);
28
+ continue;
29
+ }
30
+ let t = a(o);
31
+ t === void 0 ? r.push(i) : n[i] = t;
32
+ }
33
+ return {
34
+ endpoints: n,
35
+ rejected: r
36
+ };
37
+ }
38
+ async function s(e = t, a = globalThis.fetch) {
39
+ if (!e.startsWith("/") || e.startsWith("//")) return i;
40
+ let s = new AbortController(), c = setTimeout(() => s.abort(), r);
41
+ try {
42
+ let t = await a(e, {
43
+ cache: "no-cache",
44
+ credentials: "omit",
45
+ redirect: "error",
46
+ signal: s.signal
47
+ });
48
+ if (!t.ok) return i;
49
+ let r = t.headers.get("content-type") ?? "";
50
+ if (!/^application\/json\b/i.test(r)) return i;
51
+ let c = await t.text();
52
+ if (c.length > n) return i;
53
+ let { endpoints: l, rejected: u } = o(JSON.parse(c));
54
+ u.length && console.warn(`runtime-config: ignored ${u.join(", ")}`), i = Object.freeze({ ...l });
55
+ } catch {} finally {
56
+ clearTimeout(c);
57
+ }
58
+ return i;
59
+ }
60
+ function c() {
61
+ return i;
62
+ }
63
+ function l(e) {
64
+ return {
65
+ ...e,
66
+ ...i
67
+ };
68
+ }
69
+ function u() {
70
+ i = Object.freeze({});
71
+ }
72
+ //#endregion
73
+ export { t as RUNTIME_CONFIG_PATH, e as RUNTIME_ENDPOINT_KEYS, s as loadRuntimeConfig, a as parseEndpoint, o as parseRuntimeConfig, u as resetRuntimeConfigForTesting, c as runtimeEndpoints, l as withRuntimeEnv };
@@ -0,0 +1 @@
1
+ import './reset.css';
package/dist/tabs.js ADDED
@@ -0,0 +1,9 @@
1
+ //#region src/tabs.ts
2
+ function e(e, t) {
3
+ return {
4
+ tab: `${e}-tab-${t}`,
5
+ panel: `${e}-panel-${t}`
6
+ };
7
+ }
8
+ //#endregion
9
+ export { e as tabIds };
@@ -0,0 +1,26 @@
1
+ // Applies the saved (or default) colour mode and the season to <html> BEFORE first paint, so a page never flashes the wrong theme while
2
+ // the app's JavaScript loads. Load it as a plain, render-blocking script at the top of <head> (a same-origin file, so it needs no CSP
3
+ // hash or 'unsafe-inline'):
4
+ // <script src="/theme-init.js" data-default="dark"></script>
5
+ // `data-default` is `light`, `dark` or `system` (default `system`) and only applies when the visitor has not chosen. It reads the same
6
+ // storage key as `useColorMode` and picks the season the way `useSeason` does (a test keeps all three in step). Never throws.
7
+ (function () {
8
+ try {
9
+ var root = document.documentElement
10
+ var script = document.currentScript
11
+ var fallback = (script && script.getAttribute('data-default')) || 'system'
12
+ var stored = null
13
+ try {
14
+ stored = localStorage.getItem('mw-color-mode')
15
+ } catch {
16
+ /* storage blocked: use the default */
17
+ }
18
+ var mode = stored === 'light' || stored === 'dark' || stored === 'system' ? stored : fallback
19
+ var dark = mode === 'dark' || (mode === 'system' && typeof matchMedia === 'function' && matchMedia('(prefers-color-scheme: dark)').matches)
20
+ root.setAttribute('data-theme', dark ? 'dark' : 'light')
21
+ var month = new Date().getMonth()
22
+ root.setAttribute('data-season', month >= 2 && month <= 4 ? 'spring' : month >= 5 && month <= 7 ? 'summer' : month >= 8 && month <= 10 ? 'autumn' : 'winter')
23
+ } catch {
24
+ /* leave the page on the tokens' defaults */
25
+ }
26
+ })()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meddleware/ui",
3
- "version": "0.1.34",
3
+ "version": "0.1.36",
4
4
  "description": "Shared Vue 3 component library for @meddleware UIs — layout shell (header/sidebar/footer), colour-mode control, and primitives. Built on @meddleware/design-tokens.",
5
5
  "homepage": "https://docs.meddleware.co.uk/",
6
6
  "license": "0BSD",
@@ -13,15 +13,17 @@
13
13
  "*.css",
14
14
  "*.vue"
15
15
  ],
16
- "main": "./dist/ui.js",
17
- "module": "./dist/ui.js",
16
+ "main": "./dist/index.js",
17
+ "module": "./dist/index.js",
18
18
  "types": "./dist/index.d.ts",
19
19
  "exports": {
20
20
  ".": {
21
21
  "types": "./dist/index.d.ts",
22
- "default": "./dist/ui.js"
22
+ "default": "./dist/index.js"
23
23
  },
24
- "./base.css": "./dist/base.css"
24
+ "./reset.css": "./dist/reset.css",
25
+ "./base.css": "./dist/base.css",
26
+ "./theme-init.js": "./dist/theme-init.js"
25
27
  },
26
28
  "files": [
27
29
  "dist"
@@ -35,17 +37,21 @@
35
37
  "test": "vitest run",
36
38
  "lint:html": "html-validate \"src/**/*.vue\"",
37
39
  "build:gallery": "vite build --config vite.gallery.config.ts",
38
- "test:e2e": "playwright test"
40
+ "test:e2e": "playwright test",
41
+ "shots": "SHOTS=1 playwright test",
42
+ "check:dist": "node scripts/check-dist.mjs"
39
43
  },
40
44
  "peerDependencies": {
41
45
  "vue": "^3.5.0"
42
46
  },
43
47
  "dependencies": {
44
- "@meddleware/design-tokens": "^0.1.9"
48
+ "@meddleware/design-tokens": "^0.1.12",
49
+ "@meddleware/web-utils": "^0.0.1"
45
50
  },
46
51
  "devDependencies": {
47
52
  "@axe-core/playwright": "^4.13.0",
48
- "@meddleware/eslint-config": "^0.0.3",
53
+ "@meddleware/eslint-config": "^0.0.4",
54
+ "@meddleware/frontend-config": "^0.0.1",
49
55
  "@playwright/test": "~1.64.1",
50
56
  "@vitejs/plugin-vue": "^6.0.9",
51
57
  "@vue/eslint-config-typescript": "^14.9.0",
@@ -71,9 +77,7 @@
71
77
  "vue-tsc": "~3.3.11"
72
78
  },
73
79
  "browserslist": [
74
- "> 0.5%",
75
- "last 2 versions",
76
- "not dead"
80
+ "extends @meddleware/frontend-config/browserslist-config"
77
81
  ],
78
82
  "publishConfig": {
79
83
  "access": "public"
@@ -1,13 +0,0 @@
1
- /** Sui networks SuiVision serves. */
2
- export type SuiNetwork = 'mainnet' | 'testnet' | 'devnet';
3
- /** The kind of Sui entity to link, mapped to SuiVision's URL path segment. */
4
- export type SuiExplorerKind = 'account' | 'object' | 'txblock';
5
- /**
6
- * Build a SuiVision explorer URL for a Sui entity.
7
- *
8
- * @param kind - `account` (address), `object`, or `txblock` (transaction digest).
9
- * @param id - The address / object id / transaction digest.
10
- * @param network - Target network (default `testnet`).
11
- * @returns The full SuiVision URL, e.g. `https://testnet.suivision.xyz/account/0x…`.
12
- */
13
- export declare function suiExplorerUrl(kind: SuiExplorerKind, id: string, network?: SuiNetwork): string;
@@ -1,20 +0,0 @@
1
- /**
2
- * Validate a consumer-supplied URL before binding it to an `href` attribute.
3
- *
4
- * Allows `https:` (all hosts) and `http:` on `localhost`/`127.0.0.1` (dev only). Returns the
5
- * **normalised** `URL.href` (so what is rendered is what was checked), or `undefined` — and Vue then
6
- * renders no `href` — for:
7
- *
8
- * - `javascript:`, `data:` and every other scheme;
9
- * - credentials in the authority (`https://suivision.xyz@evil.com/…` has host `evil.com` but looks like
10
- * `suivision.xyz`);
11
- * - control characters, spaces or backslashes anywhere in the input.
12
- */
13
- export declare function safeHref(url: string | undefined | null): string | undefined;
14
- /**
15
- * Validate a consumer-supplied **root-relative path** (`/legal/x.html`). Returns the normalised
16
- * `pathname + search + hash`, or `undefined` if the value is not a single-slash path that stays on the
17
- * site: `//host`, `/\host`, anything with a control character or space (`/<TAB>/host` would be read as
18
- * `//host`), or a value that resolves to another origin.
19
- */
20
- export declare function safePath(path: string | undefined | null): string | undefined;
package/dist/status.d.ts DELETED
@@ -1,29 +0,0 @@
1
- /** Health state values returned by platform-probe's `/api/status` endpoint. */
2
- export type StatusLevel = 'operational' | 'degraded' | 'down' | 'unknown';
3
- /** A single monitored component within a group. */
4
- export interface StatusComponent {
5
- name: string;
6
- status: StatusLevel;
7
- }
8
- /** A logical capability group containing one or more components. */
9
- export interface StatusGroup {
10
- name: string;
11
- status: StatusLevel;
12
- components: StatusComponent[];
13
- }
14
- /** The full snapshot returned by `GET /api/status`. */
15
- export interface StatusSnapshot {
16
- generated_at: string;
17
- overall: StatusLevel;
18
- groups: StatusGroup[];
19
- }
20
- /** Type guard for `StatusLevel`. Validates that a raw value is one of the known status strings. */
21
- export declare function isStatusLevel(s: unknown): s is StatusLevel;
22
- /**
23
- * Parse and validate a raw API response as a `StatusSnapshot`.
24
- * Returns `null` if the required top-level fields are absent or have unexpected types.
25
- * Per-group and per-component fields are sanitized: unknown status values are coerced to
26
- * `'unknown'`; name fields are stripped of HTML-sensitive characters. Groups or components
27
- * with empty/missing names are dropped.
28
- */
29
- export declare function parseSnapshot(raw: unknown): StatusSnapshot | null;
@@ -1,14 +0,0 @@
1
- /** Default `[prefix, suffix]` character counts: `0x` plus 10 hex characters, then the last 10 (32-byte ids). */
2
- export declare const DEFAULT_TRUNCATE_CHARS: readonly [number, number];
3
- /**
4
- * Shorten the middle of a long value (`0x1234567890…abcdef0123`) for display.
5
- *
6
- * - A value that is not longer than `prefix + suffix` is returned whole: the ellipsis would hide nothing.
7
- * - A zero count drops that side (`[8, 0]` → `0x123456…`), where `slice(-0)` would return the whole value.
8
- * - Counts are clamped to non-negative integers.
9
- *
10
- * Truncation is a convenience for scanning, not for verifying: address-poisoning attacks plant addresses
11
- * that match the first and last few characters. Where a user decides where funds go, show the whole value
12
- * (`:truncate="false"` on `CopyableAddress` / `ExplorerLink`).
13
- */
14
- export declare function truncateMiddle(value: string, chars?: readonly [number, number]): string;