@meddleware/dashboard-ui 0.1.98 → 0.1.100

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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,29 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version
5
5
  [Semantic Versioning](https://semver.org/). Before 0.2.0, breaking changes ship as patch releases.
6
6
  Releases before 0.1.85 are recorded in the git history only.
7
7
 
8
+ ## [0.1.100] - 2026-11-13
9
+
10
+ ### Changed
11
+
12
+ - The network selector reads each network's availability from the deployment records (`networkAvailability` over the Access Gate and Sealed Storage records): a network without records for every hosted product is listed disabled as "Mainnet (not available yet)" (plain, naming no product), and one that has them is selectable. Testnet follows the same rule as mainnet.
13
+ - Takes `@meddleware/ui` ^0.1.43 and `@meddleware/frontend-config` ^0.0.9; the embedded tools are unchanged (access-gate-ui 0.1.49, sealed-storage-ui 0.0.49, token-issuance-ui 0.0.47, treasury-ui 0.0.28, walrus-storage-ui 0.1.70).
14
+
15
+ ### Internal
16
+
17
+ - Tests: both states of the selector (not available yet; selectable) with the records mocked, for testnet and mainnet.
18
+
19
+ ## [0.1.99] - 2026-11-12
20
+
21
+ ### Changed
22
+
23
+ - The header shows the Meddleware mark (`BrandMark` from `@meddleware/ui` ^0.1.42) in place of the `◆` placeholder, and the browser tab, home-screen and web-manifest icons are the shared brand icon set. The app keeps no icon of its own: `public/favicon.svg` and the `<link rel="icon">` in `index.html` are removed, and `meddlewareApp` (`@meddleware/frontend-config` ^0.0.8, `name: 'Meddleware'`) emits `favicon.svg`, `favicon.ico`, `apple-touch-icon.png`, `icon-192.png`, `icon-512.png` and `site.webmanifest` and injects the links. The footer's copyright symbol is unchanged.
24
+ - No third-party fonts, scripts, styles, images or analytics: the only outside calls are the Sui node, the status page and the read-index the tools exist to use. CI workflows set `DO_NOT_TRACK=1`.
25
+ - Takes the embedded tools' releases (access-gate-ui 0.1.49, sealed-storage-ui 0.0.49, token-issuance-ui 0.0.47, treasury-ui 0.0.28, walrus-storage-ui 0.1.70), `@meddleware/wallet-adapter` ^0.0.23 and `@meddleware/ui` ^0.1.42. The installed tree now has one copy of `@meddleware/web-utils` (^0.0.4; the lock takes `@meddleware/walrus-storage-kit` 0.1.40).
26
+
27
+ ### Internal
28
+
29
+ - New tests: the mark in the header (decorative) and no icon of the app's own, and, over the built `dist/` (run in CI after the build with `REQUIRE_DIST=1`), the icon set once per page, the mark in the bundle and no `◆`, no font file or font host, no third-party load and no origin beyond this site, the explorers and the protocol endpoints.
30
+
8
31
  ## [0.1.98] - 2026-11-08
9
32
 
10
33
  ### Changed
package/index.html CHANGED
@@ -2,7 +2,6 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
- <link rel="icon" type="image/svg+xml" href="/favicon.svg">
6
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
6
  <title>Meddleware</title>
8
7
  <meta name="description" content="The Meddleware dashboard: the treasury and the Sui tools (Walrus storage, sealed storage, access gates, token issuance) in one place, with one wallet connection for all of them." />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meddleware/dashboard-ui",
3
- "version": "0.1.98",
3
+ "version": "0.1.100",
4
4
  "homepage": "https://docs.meddleware.co.uk/",
5
5
  "description": "The Meddleware dashboard: the treasury, Walrus storage, sealed storage, access gates and token issuance in one place, with one wallet connection for all five tools. Vue 3 single-page app.",
6
6
  "author": "Meddleware <dev@meddleware.co.uk>",
@@ -43,15 +43,15 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@meddleware/access-gate-client": "^0.0.13",
46
- "@meddleware/access-gate-ui": "^0.1.48",
46
+ "@meddleware/access-gate-ui": "^0.1.49",
47
47
  "@meddleware/design-tokens": "^0.1.13",
48
48
  "@meddleware/sealed-storage-client": "^0.0.26",
49
- "@meddleware/sealed-storage-ui": "^0.0.48",
50
- "@meddleware/token-issuance-ui": "^0.0.46",
51
- "@meddleware/treasury-ui": "^0.0.27",
52
- "@meddleware/ui": "^0.1.40",
53
- "@meddleware/wallet-adapter": "^0.0.22",
54
- "@meddleware/walrus-storage-ui": "^0.1.69",
49
+ "@meddleware/sealed-storage-ui": "^0.0.49",
50
+ "@meddleware/token-issuance-ui": "^0.0.47",
51
+ "@meddleware/treasury-ui": "^0.0.28",
52
+ "@meddleware/ui": "^0.1.43",
53
+ "@meddleware/wallet-adapter": "^0.0.23",
54
+ "@meddleware/walrus-storage-ui": "^0.1.70",
55
55
  "@meddleware/web-utils": "^0.0.4",
56
56
  "@mysten/sui": "^2.36.0",
57
57
  "vue": "^3.5.44",
@@ -59,7 +59,7 @@
59
59
  },
60
60
  "devDependencies": {
61
61
  "@lhci/cli": "^0.16.0",
62
- "@meddleware/frontend-config": "^0.0.7",
62
+ "@meddleware/frontend-config": "^0.0.9",
63
63
  "@playwright/test": "~1.64.1",
64
64
  "@types/node": "~26.6.5",
65
65
  "@vitejs/plugin-vue": "^6.0.10",
package/src/App.vue CHANGED
@@ -7,6 +7,7 @@ import {
7
7
  AppFooter,
8
8
  AppHeader,
9
9
  AppSidebar,
10
+ BrandMark,
10
11
  ColorModeControl,
11
12
  CopyableAddress,
12
13
  CopyrightLine,
@@ -72,7 +73,7 @@ const title = computed(() => (typeof route.meta.title === 'string' ? route.meta.
72
73
  <template #header>
73
74
  <AppHeader variant="dark" sidebar-id="main-nav" menu-label="Open the menu">
74
75
  <template #brand>
75
- <RouterLink to="/" class="brand-link"><span class="brand-mark" aria-hidden="true">◆</span> Meddleware</RouterLink>
76
+ <RouterLink to="/" class="brand-link"><BrandMark class="mark" /> Meddleware</RouterLink>
76
77
  </template>
77
78
  <template #actions>
78
79
  <ColorModeControl v-model="mode" />
@@ -146,7 +147,7 @@ const title = computed(() => (typeof route.meta.title === 'string' ? route.meta.
146
147
  color: inherit;
147
148
  text-decoration: none;
148
149
  }
149
- .brand-mark {
150
+ .mark {
150
151
  color: var(--accent);
151
152
  }
152
153
  .foot {
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  // Network selector for the dashboard sidebar. Reads and writes the shared useNetwork() singleton so every embedded tool view reacts to the
3
3
  // chosen network immediately. Mainnet is selectable only when the deployment records say it is live (`src/network.ts`); until then it is
4
- // listed, disabled, with what is missing.
4
+ // listed, disabled and marked "not available yet".
5
5
  import { ref, watch } from 'vue'
6
6
  import { UiFormField, UiSelect, UiTextField } from '@meddleware/ui'
7
7
  import { useNetwork, type MwNetwork } from '@meddleware/wallet-adapter'
@@ -32,7 +32,7 @@ const options = networkOptions()
32
32
  <UiFormField id="ns-select" label="Network">
33
33
  <template #default="{ attrs }">
34
34
  <UiSelect :id="attrs.id" :model-value="network" @change="onNetworkChange">
35
- <option v-for="o in options" :key="o.value" :value="o.value" :disabled="o.disabled" :title="o.title">{{ o.label }}</option>
35
+ <option v-for="o in options" :key="o.value" :value="o.value" :disabled="o.disabled">{{ o.label }}</option>
36
36
  </UiSelect>
37
37
  </template>
38
38
  </UiFormField>
package/src/network.ts CHANGED
@@ -16,40 +16,38 @@ export const AVAILABILITY = networkAvailability({
16
16
  'sealed storage': Object.keys(SEAL_POLICIES_DEPLOYMENTS),
17
17
  })
18
18
 
19
- export interface MainnetChoice {
20
- /** Mainnet can be selected. */
19
+ export interface NetworkChoice {
20
+ /** The network can be selected. */
21
21
  readonly open: boolean
22
- /** The option's text. */
22
+ /** The option's text: the network's name, and "not available yet" while its records are missing. */
23
23
  readonly label: string
24
- /** The option's tooltip: what is missing, or that mainnet is coming. Absent when mainnet is open. */
25
- readonly title?: string
26
24
  }
27
25
 
28
- /** How the mainnet option reads for the given availability (default: the records). */
29
- export function mainnetChoice(mainnet: NetworkAvailability = AVAILABILITY.mainnet): MainnetChoice {
30
- switch (mainnet.status) {
31
- case 'live':
32
- return { open: true, label: 'Mainnet' }
33
- case 'partial':
34
- return { open: false, label: 'Mainnet (not open yet)', title: `Mainnet is not open yet. Still missing: ${mainnet.missing.join(', ')}.` }
35
- case 'coming':
36
- return { open: false, label: 'Mainnet (not open yet)', title: 'Mainnet is coming' }
37
- }
26
+ const NAMES = { testnet: 'Testnet', mainnet: 'Mainnet' } as const
27
+
28
+ /**
29
+ * How a network's option reads for its availability: selectable once every hosted product has a record there, otherwise listed with
30
+ * "not available yet" (plain: a reader cannot act on which product is missing, so the text names none; D117).
31
+ */
32
+ export function networkChoice(network: keyof typeof NAMES, availability: NetworkAvailability): NetworkChoice {
33
+ return availability.status === 'live'
34
+ ? { open: true, label: NAMES[network] }
35
+ : { open: false, label: `${NAMES[network]} (not available yet)` }
38
36
  }
39
37
 
40
38
  export interface NetworkOption {
41
39
  readonly value: MwNetwork
42
40
  readonly label: string
43
41
  readonly disabled: boolean
44
- readonly title?: string
45
42
  }
46
43
 
47
- /** The options of the network selector: testnet and localnet always, mainnet as the records allow. */
48
- export function networkOptions(mainnet: NetworkAvailability = AVAILABILITY.mainnet): NetworkOption[] {
49
- const choice = mainnetChoice(mainnet)
44
+ /** The options of the network selector: testnet and mainnet as the records allow, localnet always (a developer's own node). */
45
+ export function networkOptions(availability: Pick<typeof AVAILABILITY, 'testnet' | 'mainnet'> = AVAILABILITY): NetworkOption[] {
46
+ const testnet = networkChoice('testnet', availability.testnet)
47
+ const mainnet = networkChoice('mainnet', availability.mainnet)
50
48
  return [
51
- { value: 'testnet', label: 'Testnet', disabled: false },
52
- { value: 'mainnet', label: choice.label, disabled: !choice.open, title: choice.title },
49
+ { value: 'testnet', label: testnet.label, disabled: !testnet.open },
50
+ { value: 'mainnet', label: mainnet.label, disabled: !mainnet.open },
53
51
  { value: 'localnet', label: 'Localnet', disabled: false },
54
52
  ]
55
53
  }
package/vite.config.ts CHANGED
@@ -8,6 +8,7 @@ import { meddlewareApp } from '@meddleware/frontend-config/vite'
8
8
  export default defineConfig(
9
9
  meddlewareApp({
10
10
  plugins: [vue()],
11
+ name: 'Meddleware',
11
12
  config: {
12
13
  optimizeDeps: {
13
14
  // The Walrus wasm client is dynamically imported inside the inline WalrusStorageView upload flow; keep it out of the eager