@wssto2/vue-core 0.4.25 → 0.4.27

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 (74) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/{AccessGate.vue_vue_type_script_setup_true_lang-DcbZBINh.js → AccessGate.vue_vue_type_script_setup_true_lang-J5HoyGNJ.js} +1 -1
  3. package/dist/{Activity-CI-l_OFl.js → Activity-xtkZq4vG.js} +3 -3
  4. package/dist/{AdaptivePageShell.vue_vue_type_script_setup_true_lang-CxU9aNRQ.js → AdaptivePageShell.vue_vue_type_script_setup_true_lang-GUTIXuNd.js} +58 -53
  5. package/dist/{AsyncSection.vue_vue_type_script_setup_true_lang-Blj6KgCr.js → AsyncSection.vue_vue_type_script_setup_true_lang-B0NfvG3B.js} +45 -40
  6. package/dist/Avatar.vue_vue_type_script_setup_true_lang-BPj_fkJR.js +50 -0
  7. package/dist/{Changes-BdR0R20V.js → Changes-BPB8h56i.js} +4 -4
  8. package/dist/{CollectionPage.vue_vue_type_script_setup_true_lang-BNM_cbXa.js → CollectionPage.vue_vue_type_script_setup_true_lang-CVEYkb26.js} +3 -3
  9. package/dist/{DataTable.vue_vue_type_script_setup_true_lang-DPuH84I7.js → DataTable.vue_vue_type_script_setup_true_lang-DcQQ-uQS.js} +1 -1
  10. package/dist/{DeadLetters-CRTeoZS1.js → DeadLetters-DeYxkTMh.js} +4 -4
  11. package/dist/{General-hdmVP72B.js → General-BLbn4BCc.js} +2 -2
  12. package/dist/{NewRolePage-BPeKasOp.js → NewRolePage-B7DwFWPk.js} +4 -4
  13. package/dist/{ProfilePage-Dq9lcO5O.js → ProfilePage-CQYHj9Ns.js} +5 -5
  14. package/dist/{RecordHeader.vue_vue_type_script_setup_true_lang-szzWzdDu.js → RecordHeader.vue_vue_type_script_setup_true_lang-fmx0f8xi.js} +1 -1
  15. package/dist/{ResourcePage.vue_vue_type_script_setup_true_lang-BFaaFQSm.js → ResourcePage.vue_vue_type_script_setup_true_lang-BFBGvevP.js} +2 -2
  16. package/dist/{RoleEditor.vue_vue_type_script_setup_true_lang-B6g2760V.js → RoleEditor.vue_vue_type_script_setup_true_lang-DRHmjA9w.js} +2 -2
  17. package/dist/{RolePage-BYH-0fVI.js → RolePage-ODFu68Ce.js} +6 -6
  18. package/dist/{RolesPage-BRm5xDw7.js → RolesPage-B5RwSZ89.js} +4 -4
  19. package/dist/{SectionList.vue_vue_type_script_setup_true_lang-BJnz2ROc.js → SectionList.vue_vue_type_script_setup_true_lang-wyW7n3Uq.js} +1 -1
  20. package/dist/{SectionNavigator.vue_vue_type_script_setup_true_lang-BltrQnrQ.js → SectionNavigator.vue_vue_type_script_setup_true_lang-Dmv6TpCi.js} +3 -3
  21. package/dist/{Sessions-B1eKG_I2.js → Sessions-wEdUsK-U.js} +3 -3
  22. package/dist/{SettingsPage-0P38Ty4w.js → SettingsPage-BVrMihx0.js} +4 -4
  23. package/dist/{SignIn-Dp8Ji0_r.js → SignIn-CK9rq8LQ.js} +2 -2
  24. package/dist/{SignInPage-CiStJboK.js → SignInPage-BORsM1g4.js} +2 -2
  25. package/dist/{SignInTable.vue_vue_type_script_setup_true_lang-ByEAVfjv.js → SignInTable.vue_vue_type_script_setup_true_lang-AakWNvaM.js} +1 -1
  26. package/dist/{SignIns-Bo7R2Coi.js → SignIns-C-8kVf7I.js} +4 -4
  27. package/dist/Timestamp.vue_vue_type_script_setup_true_lang-DRmzPDOP.js +51 -0
  28. package/dist/{UserRecord-DGq_PPy1.js → UserRecord-C1SzdpKu.js} +7 -7
  29. package/dist/{UsersList-BulNu4aE.js → UsersList-B3hc683r.js} +5 -5
  30. package/dist/access/index.js +1 -1
  31. package/dist/app/index.js +5 -5
  32. package/dist/collection/index.js +5 -5
  33. package/dist/content/Avatar.vue.d.ts +6 -0
  34. package/dist/content/Timestamp.vue.d.ts +14 -0
  35. package/dist/content/index.js +2 -2
  36. package/dist/{contributions-DsfmDoRD.js → contributions-BVBZP5Jb.js} +1 -1
  37. package/dist/form/index.js +2 -2
  38. package/dist/{guards-Dve61KjR.js → guards-BJZjc3FZ.js} +1 -1
  39. package/dist/{http-D_D9YbLH.js → http-BFfkA7gN.js} +1 -1
  40. package/dist/identity/index.js +1 -1
  41. package/dist/{index-Yy28omu6.js → index-C3E6DcO0.js} +6 -6
  42. package/dist/{index-BmowiT1y.js → index-LP6NNnow.js} +12 -12
  43. package/dist/{index-tnSTp0cM.js → index-qUaGJ9j2.js} +3 -3
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.js +1 -1
  46. package/dist/{navigation-Cm3iChlR.js → navigation-DpcDF0rX.js} +1 -1
  47. package/dist/{neighbors-DVN_cADL.js → neighbors-RVQ4O3Qv.js} +1 -1
  48. package/dist/notifications/index.js +1 -1
  49. package/dist/overlay/MenuButton.vue.d.ts +23 -0
  50. package/dist/overlay/index.d.ts +1 -0
  51. package/dist/overlay/index.js +59 -35
  52. package/dist/page/index.js +5 -5
  53. package/dist/platform/index.d.ts +25 -1
  54. package/dist/platform/index.js +59 -49
  55. package/dist/platform/platform.d.ts +9 -5
  56. package/dist/platform/session.d.ts +10 -0
  57. package/dist/platform/sessionUser.d.ts +8 -0
  58. package/dist/platform-PZpUkkMS.js +268 -0
  59. package/dist/resource/index.js +1 -1
  60. package/dist/router/index.js +3 -3
  61. package/dist/{rowLayout-D1vrdy0s.js → rowLayout-Dh749umr.js} +1 -1
  62. package/dist/{sections-D-kD98vu.js → sections-CeZl-Jxg.js} +1 -1
  63. package/dist/shell/index.js +6 -4
  64. package/dist/state/async.d.ts +16 -0
  65. package/dist/state/index.d.ts +1 -1
  66. package/dist/state/index.js +38 -37
  67. package/dist/{status-Bh3-Cg7o.js → status-D9iQJJiz.js} +2 -2
  68. package/dist/styles.css +1 -1
  69. package/dist/testing/index.js +1 -1
  70. package/dist/testing/platform.d.ts +10 -7
  71. package/package.json +3 -2
  72. package/dist/Avatar.vue_vue_type_script_setup_true_lang-CFIheaSr.js +0 -35
  73. package/dist/Timestamp.vue_vue_type_script_setup_true_lang-CU2Y5oYl.js +0 -34
  74. package/dist/platform-q3cjODLx.js +0 -255
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.27 — 2026-10-12
4
+
5
+ The gaps ARV lane W found when it moved its twin components onto the library. Four items (plus `Avatar` `src`, which `Timestamp` author needs); no existing default changes.
6
+
7
+ ### Requires
8
+ - go-core unchanged: **`v1.7.0`**; **`vue` 3.5.19 or later**.
9
+
10
+ ### Added
11
+ - **Page chrome spec hooks.** The toolbar root is `data-page-toolbar`, the breadcrumb `nav` `data-page-path` and the actions group `data-page-actions`, beside the existing `data-page-shell`, `-back`, `-action="<id>"`, `-overflow`, `-path-item` and `-status`. The phone nav bar now carries `data-page-back` and `data-page-overflow` on its back and "More" buttons. All are documented as stable spec hooks (testing recipe); each appears once per page. ARV: the 39 specs that select `[data-test="page-toolbar"]`, `page-back`, `page-action-overflow`, `page-shell`, `page-status`, `page-path` and `page-actions` move to `[data-page-*]` when the catalogue screens adopt the library shell.
12
+ - **`Timestamp` `author`** (`@wssto2/vue-core/content`): `{ name: string; avatarUrl?: string | null } | null`. With an author the calendar icon gives way to the smallest `Avatar` and the name (truncated), then the date in muted text, which never shrinks; `precision` still applies, no author is the date alone, and an empty value still reads "No data". `avatarUrl` is the photo's full URL, **built by the app** (no auth or fetching in the library); ARV joins its legacy URL and the photo path. ARV: the 22 non-deferred `Timestamp` users (`:date` becomes `:value`, `with-time` becomes `precision`).
13
+ - **`Avatar` `src`** (`@wssto2/vue-core/content`): `src?: string | null`, a full URL. Draws the photo (round, `object-cover`, `alt` = the name, not draggable); the initials show when `src` is empty, while it loads and if it fails to load (never a broken-image icon), and a changed `src` retries.
14
+ - **`asyncState({ loading, error, value })`** (`@wssto2/vue-core/state`): the `AsyncState` of a region driven by plain flags, for `AsyncSection`'s one `state` prop (no second props surface). `value` is `undefined` until there is an answer (`null` is an answer, shown as empty); loading over a value is `refreshing`, an error over a value is `stale`, loading wins over an error, an empty error is none, and nothing yet is `loading`. ARV: the offer and contract document sections.
15
+ - **`MenuButton`** (`@wssto2/vue-core/overlay`): the round "⋯" button for a `Menu`'s `#trigger` slot. `<MenuButton v-bind="trigger" label="…" />` (props `label` required, `icon` default `moreLine`, plus the slot scope `presented`, `toggle`, `attrs`). It carries the trigger attrs and shows a pressed look (`data-pressed`) while the menu is open. ARV: `FollowUpRow`.
16
+
17
+ ### Changes to existing behaviour
18
+ - None. **Pinned by tests that were updated:** none.
19
+
20
+ ## 0.4.26 — 2026-10-12
21
+
22
+ A typed platform declared once, and the signed-in user changed in place. From ARV cutover g (the step f map, wave 2 step 0). Three items, one commit each.
23
+
24
+ ### Requires
25
+ - go-core unchanged: **`v1.7.0`**; **`vue` 3.5.19 or later**.
26
+
27
+ ### Added
28
+ - **`PlatformRegistry`** (`@wssto2/vue-core/platform`): the app says once what its session user and bootstrap config are, as it does for permissions: `declare module "@wssto2/vue-core/platform" { interface PlatformRegistry { user: ArvUser; config: ArvConfig } }`. Bare `Platform` (what `usePlatform()`, `createApplication({ platform })`, `createTestPlatform()` and `createTestSession()` use) is then `Platform<ArvUser, ArvConfig>`; a key left out falls back to `SessionUser` / `BootstrapConfig` (`RegisteredUser` and `RegisteredConfig` are exported). `createPlatform<U, C>` stays generic. **Moving from explicit generics:** declare the registry once, then drop the casts at every `usePlatform()` read and `Platform<User, Config>` annotations (they still compile: the same type). Checked by `typing.test-d.ts` (not augmented) and `test-data/registry` (augmented; `npm run typecheck:registry`, part of `check`).
29
+ - **`useSessionUser()`**: the signed-in user as a readonly computed ref, typed from the registry, `null` unless authenticated (a held, expired session is not a signed-in user). The impersonator stays on `session.state`. No `useSession()` reader: `usePlatform().session` is enough. ARV: the 39 files reading `useAuthStore().user` can read it.
30
+ - **`session.update(patch)`**: `patch` is `Partial<Pick<SessionSnapshot, "user" | "access" | "navigation">>` (`SessionPatch`). It replaces those parts of a signed-in session and keeps the status, `expiresAt`, impersonator and the rest. It is not a change of who is signed in: nothing in flight is cancelled and no late answer is dropped (a `refresh()` already asked still lands with the server's version). Reactive readers (`useSessionUser`, the access client, the application's locale-from-user) see the new value. A no-op unless authenticated; a `user.id` other than the signed-in one **throws** (a programming error: a different person is `session.establish`). ARV: `useAuthStore.write()` becomes `session.update(...)`, so a language or profile save no longer re-establishes the session.
31
+
32
+ ### Changes to existing behaviour
33
+ - **Bare `Platform` follows the registry.** Without an augmentation nothing changes. With one, a platform built with another user type no longer fits bare `Platform`. `createTestPlatform({ config })` must then give the registered config's own fields (the test has no other source for them). ARV: `frontend/tests/app/features.test.ts` and `frontend/tests/support/arvApp.ts` (`createTestPlatform`) once the registry declares `config`.
34
+ - **Pinned by tests that were updated:** none.
35
+
3
36
  ## 0.4.25 — 2026-10-12
4
37
 
5
38
  The photo viewer's actions on a phone. From ARV cutover g (wave 1, the vehicle gallery). Two items, one commit each.
@@ -1,5 +1,5 @@
1
1
  import { defineComponent as t, computed as i, renderSlot as n } from "vue";
2
- import { u as l } from "./platform-q3cjODLx.js";
2
+ import { u as l } from "./platform-PZpUkkMS.js";
3
3
  const m = /* @__PURE__ */ t({
4
4
  __name: "AccessGate",
5
5
  props: {
@@ -6,10 +6,10 @@ import { u as O } from "./format-D8X4zsx6.js";
6
6
  import { _ as U } from "./DateField.vue_vue_type_script_setup_true_lang-CpuH0WTl.js";
7
7
  import { _ as T } from "./FormGroup.vue_vue_type_script_setup_true_lang-DSwSRsA5.js";
8
8
  import { e as z } from "./control-B4SdblL6.js";
9
- import { P as G, c as H, i as J } from "./index-BmowiT1y.js";
10
- import { u as K } from "./platform-q3cjODLx.js";
9
+ import { P as G, c as H, i as J } from "./index-LP6NNnow.js";
10
+ import { u as K } from "./platform-PZpUkkMS.js";
11
11
  import { b as M } from "./routeResource-DlTsGTg_.js";
12
- import { _ as Q } from "./AsyncSection.vue_vue_type_script_setup_true_lang-Blj6KgCr.js";
12
+ import { _ as Q } from "./AsyncSection.vue_vue_type_script_setup_true_lang-B0NfvG3B.js";
13
13
  import { _ as W } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
14
14
  import { u as X } from "./useLoad-M7V-AVwR.js";
15
15
  import { _ as Y } from "./PageBar.vue_vue_type_script_setup_true_lang-B7qdEeej.js";
@@ -12,25 +12,26 @@ import { d as ee } from "./context-Ch1r4fdN.js";
12
12
  const te = /* @__PURE__ */ $({
13
13
  __name: "BottomDockPortal",
14
14
  setup(d) {
15
- const e = D() ? F(U, null) : null, n = k(() => e?.value ?? null);
15
+ const e = D() ? F(U, null) : null, a = k(() => e?.value ?? null);
16
16
  return (c, i) => (r(), _(O, {
17
- to: n.value,
18
- disabled: !n.value
17
+ to: a.value,
18
+ disabled: !a.value
19
19
  }, [
20
20
  v(c.$slots, "default")
21
21
  ], 8, ["to", "disabled"]));
22
22
  }
23
- }), ne = {
23
+ }), ae = {
24
24
  key: 0,
25
+ "data-page-actions": "",
25
26
  class: "flex min-w-0 flex-wrap items-center justify-end gap-2"
26
- }, ae = ["aria-label", "onClick"], E = /* @__PURE__ */ $({
27
+ }, ne = ["aria-label", "onClick"], E = /* @__PURE__ */ $({
27
28
  __name: "PageActions",
28
29
  props: {
29
30
  actions: {},
30
31
  leading: {}
31
32
  },
32
33
  setup(d) {
33
- const e = d, { t: n } = P(), c = k(() => [
34
+ const e = d, { t: a } = P(), c = k(() => [
34
35
  ...e.leading ? [e.leading] : [],
35
36
  ...e.actions.filter((t) => t.placement !== "overflow" && t.tone !== "critical")
36
37
  ]), i = k(() => e.actions.filter((t) => t.placement === "overflow" || t.tone === "critical").map((t) => ({
@@ -45,7 +46,7 @@ const te = /* @__PURE__ */ $({
45
46
  function u(t) {
46
47
  return t === e.leading || t.prominence === "plain" ? "plain" : t.prominence === "standard" ? "standard" : t.placement === "primary" ? "primary" : "standard";
47
48
  }
48
- return (t, o) => c.value.length || i.value.length ? (r(), p("div", ne, [
49
+ return (t, o) => c.value.length || i.value.length ? (r(), p("div", ae, [
49
50
  (r(!0), p(I, null, M(c.value, (s) => (r(), _(W, {
50
51
  key: s.id,
51
52
  prominence: u(s),
@@ -64,23 +65,26 @@ const te = /* @__PURE__ */ $({
64
65
  i.value.length ? (r(), _(Y, {
65
66
  key: 0,
66
67
  items: i.value,
67
- label: l(n)("core.page.more_actions")
68
+ label: l(a)("core.page.more_actions")
68
69
  }, {
69
70
  trigger: x(({ toggle: s, attrs: g }) => [
70
71
  m("button", H({ type: "button" }, g, {
71
- "aria-label": l(n)("core.page.more_actions"),
72
+ "aria-label": l(a)("core.page.more_actions"),
72
73
  "data-page-overflow": "",
73
74
  class: "hit-target flex size-9 cursor-pointer items-center justify-center rounded-button bg-fill text-content-strong transition-colors duration-motion-fast hover:bg-fill-strong focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
74
75
  onClick: s
75
76
  }), [
76
77
  b(l(y), { name: "moreLine" })
77
- ], 16, ae)
78
+ ], 16, ne)
78
79
  ]),
79
80
  _: 1
80
81
  }, 8, ["items", "label"])) : f("", !0)
81
82
  ])) : f("", !0);
82
83
  }
83
- }), oe = { class: "sticky top-[var(--shell-banner-h,0px)] z-20 flex min-h-bar-height min-w-0 flex-wrap items-center gap-2.5 border-b border-border-separator bg-surface-page/85 py-2 pr-6 pl-4 backdrop-blur-xl" }, se = ["aria-label"], le = {
84
+ }), oe = {
85
+ "data-page-toolbar": "",
86
+ class: "sticky top-[var(--shell-banner-h,0px)] z-20 flex min-h-bar-height min-w-0 flex-wrap items-center gap-2.5 border-b border-border-separator bg-surface-page/85 py-2 pr-6 pl-4 backdrop-blur-xl"
87
+ }, se = ["aria-label"], le = {
84
88
  class: "flex shrink-0 text-content-link",
85
89
  "aria-hidden": "true"
86
90
  }, re = { class: "flex min-w-0 items-center" }, ie = {
@@ -101,11 +105,12 @@ const te = /* @__PURE__ */ $({
101
105
  status: {}
102
106
  },
103
107
  setup(d) {
104
- const e = d, { t: n } = P(), c = k(() => e.path && e.path.length >= 2 ? e.path.slice(0, -1) : []), i = k(() => e.path && c.value.length ? e.path[e.path.length - 1] ?? null : e.back ?? null);
108
+ const e = d, { t: a } = P(), c = k(() => e.path && e.path.length >= 2 ? e.path.slice(0, -1) : []), i = k(() => e.path && c.value.length ? e.path[e.path.length - 1] ?? null : e.back ?? null);
105
109
  return (u, t) => (r(), p("div", oe, [
106
110
  c.value.length && i.value ? (r(), p("nav", {
107
111
  key: 0,
108
- "aria-label": l(n)("core.page.breadcrumbs"),
112
+ "data-page-path": "",
113
+ "aria-label": l(a)("core.page.breadcrumbs"),
109
114
  class: "-ml-1 flex min-w-0 items-center"
110
115
  }, [
111
116
  m("span", le, [
@@ -180,9 +185,9 @@ const te = /* @__PURE__ */ $({
180
185
  ]));
181
186
  }
182
187
  });
183
- function me(d, e, n = !0) {
188
+ function me(d, e, a = !0) {
184
189
  const c = N();
185
- if (!c || !z(n)) return;
190
+ if (!c || !z(a)) return;
186
191
  const i = c.claim();
187
192
  let u = null;
188
193
  T(() => z(e), (t) => i.setTitle(t), { immediate: !0 }), R(() => {
@@ -223,7 +228,7 @@ const fe = { class: "flex min-w-0 flex-wrap items-center gap-x-4 gap-y-3" }, ge
223
228
  inlineActions: { type: Boolean, default: !1 }
224
229
  },
225
230
  setup(d) {
226
- const e = d, { locale: n } = P(), c = j("(max-width: 47.999rem)"), i = k(() => e.count == null ? null : new Intl.NumberFormat(J(n.value)).format(e.count)), u = V("titleElement");
231
+ const e = d, { locale: a } = P(), c = j("(max-width: 47.999rem)"), i = k(() => e.count == null ? null : new Intl.NumberFormat(J(a.value)).format(e.count)), u = V("titleElement");
227
232
  return me(u, () => e.title), (t, o) => (r(), p("div", fe, [
228
233
  m("div", ge, [
229
234
  v(t.$slots, "leading", {}, () => [
@@ -264,13 +269,13 @@ const fe = { class: "flex min-w-0 flex-wrap items-center gap-x-4 gap-y-3" }, ge
264
269
  }
265
270
  }), [$e, De] = ee("vue-core.pageSectionBack");
266
271
  function Se(d, e) {
267
- const n = G();
268
- let c = n.fullPath;
269
- const i = n.matched[n.matched.length - 1];
272
+ const a = G();
273
+ let c = a.fullPath;
274
+ const i = a.matched[a.matched.length - 1];
270
275
  T(
271
- () => n.fullPath,
276
+ () => a.fullPath,
272
277
  (s) => {
273
- n.matched[n.matched.length - 1] === i && (c = s);
278
+ a.matched[a.matched.length - 1] === i && (c = s);
274
279
  }
275
280
  );
276
281
  let u, t;
@@ -282,7 +287,7 @@ function Se(d, e) {
282
287
  if (!s || !d.value) return;
283
288
  const g = () => {
284
289
  const S = Array.from(d.value?.querySelectorAll("a[href]") ?? []).find(
285
- (a) => a.getAttribute("href") === s.href
290
+ (n) => n.getAttribute("href") === s.href
286
291
  );
287
292
  S && (S.focus({ preventScroll: !0 }), window.scrollTo({ top: s.top, behavior: "instant" }), o());
288
293
  };
@@ -309,32 +314,32 @@ const Te = { key: 1 }, Le = {
309
314
  width: { default: "full" }
310
315
  },
311
316
  setup(d) {
312
- const e = d, n = N() ?? X();
313
- A(Z, n);
314
- const c = n.claimShell();
317
+ const e = d, a = N() ?? X();
318
+ A(Z, a);
319
+ const c = a.claimShell();
315
320
  L(c);
316
321
  const i = V("root");
317
- Se(i, n);
322
+ Se(i, a);
318
323
  const u = j("(max-width: 47.999rem)"), t = K(null);
319
324
  A($e, t);
320
325
  const o = k(() => {
321
326
  if (t.value) return t.value;
322
327
  if (e.back !== void 0) return e.back;
323
- const a = e.path?.[e.path.length - 1];
324
- return a ? { label: a.label, to: a.to } : null;
328
+ const n = e.path?.[e.path.length - 1];
329
+ return n ? { label: n.label, to: n.to } : null;
325
330
  }), s = k(() => {
326
- const a = t.value;
327
- return a ? a.path ? [...e.path ?? (e.back ? [e.back] : []), ...a.path] : null : e.path;
328
- }), g = n.claim();
331
+ const n = t.value;
332
+ return n ? n.path ? [...e.path ?? (e.back ? [e.back] : []), ...n.path] : null : e.path;
333
+ }), g = a.claim();
329
334
  T(
330
335
  () => [e.actions, e.documentTitle],
331
- ([a, C]) => g.setRegistration({ actions: a, leading: null, status: null, navTitle: null, documentTitle: C ?? null }),
336
+ ([n, C]) => g.setRegistration({ actions: n, leading: null, status: null, navTitle: null, documentTitle: C ?? null }),
332
337
  { immediate: !0 }
333
- ), T(o, (a) => g.setBack(a), { immediate: !0 }), L(() => {
338
+ ), T(o, (n) => g.setBack(n), { immediate: !0 }), L(() => {
334
339
  g.clearRegistration(), g.clearBack();
335
340
  });
336
341
  const S = { full: "", content: "max-w-content", readable: "max-w-readable" };
337
- return (a, C) => (r(), p("div", {
342
+ return (n, C) => (r(), p("div", {
338
343
  ref_key: "root",
339
344
  ref: i,
340
345
  class: "min-w-0 w-full flex-1 bg-surface-page",
@@ -344,14 +349,14 @@ const Te = { key: 1 }, Le = {
344
349
  key: 0,
345
350
  back: o.value,
346
351
  path: s.value,
347
- actions: l(n).actions.value,
348
- leading: l(n).leading.value,
349
- status: l(n).status.value
352
+ actions: l(a).actions.value,
353
+ leading: l(a).leading.value,
354
+ status: l(a).status.value
350
355
  }, q({ _: 2 }, [
351
- a.$slots.pager ? {
356
+ n.$slots.pager ? {
352
357
  name: "pager",
353
358
  fn: x(() => [
354
- v(a.$slots, "pager")
359
+ v(n.$slots, "pager")
355
360
  ]),
356
361
  key: "0"
357
362
  } : void 0
@@ -359,34 +364,34 @@ const Te = { key: 1 }, Le = {
359
364
  m("div", {
360
365
  class: Q(["mx-auto flex min-w-0 flex-col gap-section-gap pt-section-gap pr-[max(var(--app-screen-padding),var(--app-safe-right))] pb-[max(var(--app-screen-padding),var(--app-safe-bottom),calc(var(--bottom-dock-h,0px)+var(--app-screen-padding)))] pl-[max(var(--app-screen-padding),var(--app-safe-left))] lg:pt-[calc(var(--app-section-gap)*1.5)] lg:pr-[max(2.5rem,var(--app-safe-right))] lg:pl-[max(2.5rem,var(--app-safe-left))]", S[e.width]])
361
366
  }, [
362
- v(a.$slots, "header", {}, () => [
367
+ v(n.$slots, "header", {}, () => [
363
368
  b(ye, {
364
369
  title: e.title,
365
370
  description: e.description,
366
371
  icon: e.icon,
367
372
  count: e.count,
368
- actions: o.value ? [] : l(n).actions.value,
369
- leading: o.value ? null : l(n).leading.value,
370
- status: o.value ? null : l(n).status.value
373
+ actions: o.value ? [] : l(a).actions.value,
374
+ leading: o.value ? null : l(a).leading.value,
375
+ status: o.value ? null : l(a).status.value
371
376
  }, null, 8, ["title", "description", "icon", "count", "actions", "leading", "status"])
372
377
  ]),
373
- a.$slots.header && !o.value && !l(u) ? (r(), _(E, {
378
+ n.$slots.header && !o.value && !l(u) ? (r(), _(E, {
374
379
  key: 0,
375
- actions: l(n).actions.value,
376
- leading: l(n).leading.value
380
+ actions: l(a).actions.value,
381
+ leading: l(a).leading.value
377
382
  }, null, 8, ["actions", "leading"])) : f("", !0),
378
- a.$slots.notices ? (r(), p("div", Te, [
379
- v(a.$slots, "notices")
383
+ n.$slots.notices ? (r(), p("div", Te, [
384
+ v(n.$slots, "notices")
380
385
  ])) : f("", !0),
381
- v(a.$slots, "default"),
382
- a.$slots.pager && l(u) ? (r(), p("div", Le, [
383
- v(a.$slots, "pager")
386
+ v(n.$slots, "default"),
387
+ n.$slots.pager && l(u) ? (r(), p("div", Le, [
388
+ v(n.$slots, "pager")
384
389
  ])) : f("", !0)
385
390
  ], 2),
386
- a.$slots.bottom ? (r(), _(te, { key: 1 }, {
391
+ n.$slots.bottom ? (r(), _(te, { key: 1 }, {
387
392
  default: x(() => [
388
393
  m("div", Ce, [
389
- v(a.$slots, "bottom")
394
+ v(n.$slots, "bottom")
390
395
  ])
391
396
  ]),
392
397
  _: 3
@@ -1,8 +1,8 @@
1
- import { defineComponent as h, openBlock as a, createElementBlock as n, computed as $, Fragment as _, unref as o, renderSlot as y, renderList as w, createBlock as v, createVNode as u, withCtx as c, createElementVNode as d, toDisplayString as i, createCommentVNode as m, createTextVNode as g, normalizeClass as b, createSlots as x } from "vue";
1
+ import { defineComponent as k, openBlock as n, createElementBlock as o, computed as $, Fragment as _, unref as i, renderSlot as y, renderList as b, createBlock as v, createVNode as c, withCtx as d, createElementVNode as m, toDisplayString as l, createCommentVNode as f, createTextVNode as g, normalizeClass as w, createSlots as x } from "vue";
2
2
  import { useI18n as C } from "vue-i18n";
3
- import { _ as k } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
4
- import { _ as E } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
5
- import { _ as S } from "./Banner.vue_vue_type_script_setup_true_lang-DSStj_5z.js";
3
+ import { _ as h } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
4
+ import { _ as S } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
5
+ import { _ as E } from "./Banner.vue_vue_type_script_setup_true_lang-DSStj_5z.js";
6
6
  import { _ as V } from "./EmptyState.vue_vue_type_script_setup_true_lang-50p-Mp8I.js";
7
7
  function K(s) {
8
8
  return s.status === "loading" || s.status === "failed" ? void 0 : s.value;
@@ -10,13 +10,17 @@ function K(s) {
10
10
  function z(s) {
11
11
  return s == null || s === "" || Array.isArray(s) && s.length === 0;
12
12
  }
13
+ function M(s) {
14
+ const { loading: t, error: a, value: r } = s, e = r !== void 0;
15
+ return t ? e ? { status: "refreshing", value: r } : { status: "loading" } : a ? e ? { status: "stale", value: r, error: a } : { status: "failed", error: a } : e ? { status: "loaded", value: r } : { status: "loading" };
16
+ }
13
17
  const A = {
14
18
  class: "skeleton-bar animate-pulse rounded-lg bg-fill-strong motion-reduce:animate-none",
15
19
  "aria-hidden": "true"
16
- }, N = /* @__PURE__ */ h({
20
+ }, N = /* @__PURE__ */ k({
17
21
  __name: "Skeleton",
18
22
  setup(s) {
19
- return (t, r) => (a(), n("div", A));
23
+ return (t, a) => (n(), o("div", A));
20
24
  }
21
25
  }), B = ["aria-label"], D = {
22
26
  key: 1,
@@ -24,7 +28,7 @@ const A = {
24
28
  }, I = { class: "flex flex-wrap items-center justify-between gap-3" }, L = { key: 0 }, T = ["aria-busy"], F = { class: "min-w-0" }, R = {
25
29
  key: 3,
26
30
  "data-async": "empty"
27
- }, M = /* @__PURE__ */ h({
31
+ }, P = /* @__PURE__ */ k({
28
32
  inheritAttrs: !1,
29
33
  __name: "AsyncSection",
30
34
  props: {
@@ -37,40 +41,40 @@ const A = {
37
41
  },
38
42
  emits: ["retry"],
39
43
  setup(s) {
40
- const t = s, { t: r } = C(), p = $(() => {
44
+ const t = s, { t: a } = C(), r = $(() => {
41
45
  const e = t.state;
42
46
  return e.status === "loading" || e.status === "failed" || e.status === "loaded" && t.isEmpty(e.value) ? null : { value: e.value };
43
47
  });
44
- return (e, l) => (a(), n(_, null, [
45
- t.state.status === "loading" ? (a(), n("div", {
48
+ return (e, u) => (n(), o(_, null, [
49
+ t.state.status === "loading" ? (n(), o("div", {
46
50
  key: 0,
47
51
  class: "space-y-3",
48
52
  "data-async": "loading",
49
53
  role: "status",
50
54
  "aria-busy": "true",
51
- "aria-label": o(r)("core.state.loading")
55
+ "aria-label": i(a)("core.state.loading")
52
56
  }, [
53
57
  y(e.$slots, "skeleton", {}, () => [
54
- (a(!0), n(_, null, w(t.skeletonRows, (f) => (a(), v(N, { key: f }))), 128))
58
+ (n(!0), o(_, null, b(t.skeletonRows, (p) => (n(), v(N, { key: p }))), 128))
55
59
  ])
56
- ], 8, B)) : t.state.status === "failed" || t.state.status === "stale" && t.state.error ? (a(), n("div", D, [
57
- u(S, {
60
+ ], 8, B)) : t.state.status === "failed" || t.state.status === "stale" && t.state.error ? (n(), o("div", D, [
61
+ c(E, {
58
62
  tone: "warning",
59
63
  role: "alert"
60
64
  }, {
61
- default: c(() => [
62
- d("div", I, [
63
- d("div", null, [
64
- d("p", null, i(t.state.error), 1),
65
- t.state.status === "stale" ? (a(), n("p", L, i(o(r)("core.state.stale")), 1)) : m("", !0)
65
+ default: d(() => [
66
+ m("div", I, [
67
+ m("div", null, [
68
+ m("p", null, l(t.state.error), 1),
69
+ t.state.status === "stale" ? (n(), o("p", L, l(i(a)("core.state.stale")), 1)) : f("", !0)
66
70
  ]),
67
- u(k, {
71
+ c(h, {
68
72
  prominence: "secondary",
69
73
  size: "sm",
70
- onClick: l[0] || (l[0] = (f) => e.$emit("retry"))
74
+ onClick: u[0] || (u[0] = (p) => e.$emit("retry"))
71
75
  }, {
72
- default: c(() => [
73
- g(i(o(r)("core.actions.retry")), 1)
76
+ default: d(() => [
77
+ g(l(i(a)("core.actions.retry")), 1)
74
78
  ]),
75
79
  _: 1
76
80
  })
@@ -78,54 +82,55 @@ const A = {
78
82
  ]),
79
83
  _: 1
80
84
  })
81
- ])) : t.state.status === "refreshing" || t.state.status === "stale" ? (a(), n("div", {
85
+ ])) : t.state.status === "refreshing" || t.state.status === "stale" ? (n(), o("div", {
82
86
  key: 2,
83
87
  "data-async": "stale",
84
88
  role: "status",
85
89
  "aria-busy": t.state.status === "refreshing" || void 0,
86
90
  class: "flex w-fit max-w-full flex-wrap items-center gap-2 rounded-group bg-fill py-1 pr-1 pl-3 text-footnote text-content-muted"
87
91
  }, [
88
- u(o(E), {
92
+ c(i(S), {
89
93
  name: t.state.status === "refreshing" ? "loader4Line" : "refreshLine",
90
94
  size: 14,
91
- class: b(t.state.status === "refreshing" ? "animate-spin" : "")
95
+ class: w(t.state.status === "refreshing" ? "animate-spin" : "")
92
96
  }, null, 8, ["name", "class"]),
93
- d("p", F, i(o(r)(t.state.status === "refreshing" ? "core.state.refreshing" : "core.state.stale")), 1),
94
- t.state.status === "stale" ? (a(), v(k, {
97
+ m("p", F, l(i(a)(t.state.status === "refreshing" ? "core.state.refreshing" : "core.state.stale")), 1),
98
+ t.state.status === "stale" ? (n(), v(h, {
95
99
  key: 0,
96
100
  prominence: "plain",
97
101
  size: "xs",
98
- onClick: l[1] || (l[1] = (f) => e.$emit("retry"))
102
+ onClick: u[1] || (u[1] = (p) => e.$emit("retry"))
99
103
  }, {
100
- default: c(() => [
101
- g(i(o(r)("core.actions.retry")), 1)
104
+ default: d(() => [
105
+ g(l(i(a)("core.actions.retry")), 1)
102
106
  ]),
103
107
  _: 1
104
- })) : m("", !0)
105
- ], 8, T)) : p.value ? m("", !0) : (a(), n("div", R, [
106
- u(V, {
107
- title: t.emptyTitle ?? o(r)("core.state.empty"),
108
+ })) : f("", !0)
109
+ ], 8, T)) : r.value ? f("", !0) : (n(), o("div", R, [
110
+ c(V, {
111
+ title: t.emptyTitle ?? i(a)("core.state.empty"),
108
112
  description: t.emptyDescription,
109
113
  icon: t.emptyIcon
110
114
  }, x({ _: 2 }, [
111
115
  e.$slots["empty-actions"] ? {
112
116
  name: "actions",
113
- fn: c(() => [
117
+ fn: d(() => [
114
118
  y(e.$slots, "empty-actions")
115
119
  ]),
116
120
  key: "0"
117
121
  } : void 0
118
122
  ]), 1032, ["title", "description", "icon"])
119
123
  ])),
120
- p.value ? y(e.$slots, "default", {
121
- value: p.value.value
122
- }, void 0, void 0, 4) : m("", !0)
124
+ r.value ? y(e.$slots, "default", {
125
+ value: r.value.value
126
+ }, void 0, void 0, 4) : f("", !0)
123
127
  ], 64));
124
128
  }
125
129
  });
126
130
  export {
127
- M as _,
131
+ P as _,
128
132
  N as a,
133
+ M as b,
129
134
  z as i,
130
135
  K as v
131
136
  };
@@ -0,0 +1,50 @@
1
+ import { defineComponent as m, computed as x, ref as n, watch as p, openBlock as r, createElementBlock as i, normalizeClass as c, createTextVNode as v, toDisplayString as g, createCommentVNode as z } from "vue";
2
+ function b(a) {
3
+ const e = (a ?? "").trim().split(/\s+/).filter(Boolean);
4
+ return (e.length > 1 ? [e[0]?.[0], e[e.length - 1]?.[0]] : [e[0]?.[0]]).filter(Boolean).join("").toLocaleUpperCase() || "?";
5
+ }
6
+ const h = ["src", "alt", "data-loaded"], k = /* @__PURE__ */ m({
7
+ __name: "Avatar",
8
+ props: {
9
+ name: { default: "" },
10
+ src: { default: null },
11
+ size: { default: "sm" },
12
+ tone: { default: "neutral" }
13
+ },
14
+ setup(a) {
15
+ const e = a, o = {
16
+ xs: "size-5 text-3xs",
17
+ sm: "size-7 text-2xs",
18
+ md: "size-9 text-xs",
19
+ lg: "size-12 text-base",
20
+ // Record header: 72px on wide screens, 96px on compact ones. Square by aspect ratio, so it
21
+ // can shrink in a very narrow column (enlarged text).
22
+ xl: "aspect-square w-18 max-w-full text-2xl compact:w-24 compact:text-3xl"
23
+ }, u = {
24
+ neutral: "bg-fill text-content-muted",
25
+ anchor: "bg-tile-anchor text-tile-anchor-foreground"
26
+ }, d = x(() => b(e.name)), t = n(!1), s = n(!1);
27
+ return p(() => e.src, () => {
28
+ t.value = !1, s.value = !1;
29
+ }), (w, l) => (r(), i("span", {
30
+ "aria-hidden": "true",
31
+ class: c(["relative inline-flex shrink-0 select-none items-center justify-center overflow-hidden rounded-full font-semibold", [o[e.size], u[e.tone]]])
32
+ }, [
33
+ v(g(d.value), 1),
34
+ e.src && !s.value ? (r(), i("img", {
35
+ key: e.src,
36
+ src: e.src,
37
+ alt: e.name ?? "",
38
+ draggable: "false",
39
+ "data-loaded": t.value || void 0,
40
+ class: c(["absolute inset-0 size-full rounded-full object-cover", t.value ? "" : "opacity-0"]),
41
+ onLoad: l[0] || (l[0] = (f) => t.value = !0),
42
+ onError: l[1] || (l[1] = (f) => s.value = !0)
43
+ }, null, 42, h)) : z("", !0)
44
+ ], 2));
45
+ }
46
+ });
47
+ export {
48
+ k as _,
49
+ b as i
50
+ };
@@ -1,11 +1,11 @@
1
1
  import { defineComponent as k, computed as N, openBlock as n, createBlock as u, unref as a, withCtx as g, createElementBlock as p, Fragment as _, renderList as $, createElementVNode as i, toDisplayString as h, createCommentVNode as C, ref as x, watch as b, createVNode as y } from "vue";
2
2
  import { useI18n as E } from "vue-i18n";
3
- import { P as V, i as R } from "./index-BmowiT1y.js";
4
- import { u as S } from "./platform-q3cjODLx.js";
3
+ import { P as V, i as R } from "./index-LP6NNnow.js";
4
+ import { u as S } from "./platform-PZpUkkMS.js";
5
5
  import { b as B } from "./routeResource-DlTsGTg_.js";
6
- import { _ as F } from "./AsyncSection.vue_vue_type_script_setup_true_lang-Blj6KgCr.js";
6
+ import { _ as F } from "./AsyncSection.vue_vue_type_script_setup_true_lang-B0NfvG3B.js";
7
7
  import { u as L } from "./useLoad-M7V-AVwR.js";
8
- import { _ as P } from "./Avatar.vue_vue_type_script_setup_true_lang-CFIheaSr.js";
8
+ import { _ as P } from "./Avatar.vue_vue_type_script_setup_true_lang-BPj_fkJR.js";
9
9
  import { _ as I } from "./IconTile.vue_vue_type_script_setup_true_lang-_FXvaj93.js";
10
10
  import { u as O } from "./format-D8X4zsx6.js";
11
11
  import { _ as T } from "./FormGroup.vue_vue_type_script_setup_true_lang-DSwSRsA5.js";
@@ -1,8 +1,8 @@
1
1
  import { hasInjectionContext as lt, inject as ot, shallowRef as xe, computed as k, watch as Ve, toValue as Se, ref as ie, getCurrentScope as nt, onScopeDispose as st, defineComponent as be, openBlock as u, createElementBlock as y, createVNode as O, unref as t, createElementVNode as i, toDisplayString as g, Fragment as ee, renderList as le, createCommentVNode as F, createBlock as W, mergeProps as ve, withCtx as q, createTextVNode as G, normalizeClass as ue, useTemplateRef as fe, withModifiers as Ke, withDirectives as Le, vModelText as Fe, nextTick as at, onBeforeUnmount as rt, onMounted as it, renderSlot as ge, useSlots as We, createSlots as Qe, normalizeProps as Xe, guardReactiveProps as Je } from "vue";
2
2
  import { routerKey as ct } from "vue-router";
3
3
  import { i as qe, a as ut } from "./error-CD7x0Jrz.js";
4
- import { a as dt, d as Re, o as ft, L as Te, e as je, w as pt, b as vt } from "./http-D_D9YbLH.js";
5
- import { a as mt } from "./AdaptivePageShell.vue_vue_type_script_setup_true_lang-CxU9aNRQ.js";
4
+ import { a as dt, d as Re, o as ft, L as Te, e as je, w as pt, b as vt } from "./http-BFfkA7gN.js";
5
+ import { a as mt } from "./AdaptivePageShell.vue_vue_type_script_setup_true_lang-GUTIXuNd.js";
6
6
  import { useI18n as he } from "vue-i18n";
7
7
  import { _ as ce, u as Ne } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
8
8
  import { _ as Ge } from "./Tabs.vue_vue_type_script_setup_true_lang-CcMcE38r.js";
@@ -10,7 +10,7 @@ import { u as Pe } from "./format-D8X4zsx6.js";
10
10
  import { _ as I } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
11
11
  import { _ as Ae } from "./Banner.vue_vue_type_script_setup_true_lang-DSStj_5z.js";
12
12
  import { _ as Ee } from "./EmptyState.vue_vue_type_script_setup_true_lang-50p-Mp8I.js";
13
- import { u as bt, _ as gt } from "./rowLayout-D1vrdy0s.js";
13
+ import { u as bt, _ as gt } from "./rowLayout-Dh749umr.js";
14
14
  import { _ as Ye } from "./Menu.vue_vue_type_script_setup_true_lang-DsFOeCVe.js";
15
15
  import { _ as Ze } from "./Popover.vue_vue_type_script_setup_true_lang-C70GrCP7.js";
16
16
  import { _ as we } from "./ToneDot.vue_vue_type_script_setup_true_lang-99rNn-L5.js";
@@ -1,5 +1,5 @@
1
1
  import { defineComponent as d, computed as u, useSlots as p, openBlock as w, createElementBlock as y, createVNode as f, unref as k, createSlots as b, renderList as m, withCtx as h, renderSlot as v, normalizeProps as _, guardReactiveProps as g } from "vue";
2
- import { u as R, _ as L } from "./rowLayout-D1vrdy0s.js";
2
+ import { u as R, _ as L } from "./rowLayout-Dh749umr.js";
3
3
  const F = ["aria-busy"], V = /* @__PURE__ */ d({
4
4
  __name: "DataTable",
5
5
  props: {
@@ -1,15 +1,15 @@
1
1
  import { defineComponent as B, useTemplateRef as C, computed as y, ref as v, openBlock as D, createBlock as z, unref as r, withCtx as m, createVNode as F, createElementVNode as b, normalizeClass as $, toDisplayString as h } from "vue";
2
2
  import { useI18n as q } from "vue-i18n";
3
3
  import { a as k } from "./error-CD7x0Jrz.js";
4
- import { u as V, _ as N } from "./CollectionPage.vue_vue_type_script_setup_true_lang-BNM_cbXa.js";
4
+ import { u as V, _ as N } from "./CollectionPage.vue_vue_type_script_setup_true_lang-CVEYkb26.js";
5
5
  import { u as P } from "./describeError-B-NMa--w.js";
6
6
  import { u as I } from "./format-D8X4zsx6.js";
7
- import { e as a, R as O } from "./index-tnSTp0cM.js";
7
+ import { e as a, R as O } from "./index-qUaGJ9j2.js";
8
8
  import { _ as W } from "./AlertDialog.vue_vue_type_script_setup_true_lang-whA4WLdl.js";
9
9
  import { t as i } from "./toast-CqSDTWRX.js";
10
10
  import { u as Y } from "./useLoad-M7V-AVwR.js";
11
- import { u as j } from "./platform-q3cjODLx.js";
12
- import { a as G, r as H } from "./http-D_D9YbLH.js";
11
+ import { u as j } from "./platform-PZpUkkMS.js";
12
+ import { a as G, r as H } from "./http-BFfkA7gN.js";
13
13
  function J(u) {
14
14
  return G({
15
15
  id: "events.deadletters",
@@ -8,9 +8,9 @@ import { _ as F } from "./FormView.vue_vue_type_script_setup_true_lang-BUrYkjmF.
8
8
  import { _ as L } from "./SelectField.vue_vue_type_script_setup_true_lang-C3FbRQW7.js";
9
9
  import { _ as f } from "./TextField.vue_vue_type_script_setup_true_lang-CP2WeU36.js";
10
10
  import { u as A } from "./useSaveChrome-7huA3FzR.js";
11
- import { P as D, b as G, i as I } from "./index-BmowiT1y.js";
11
+ import { P as D, b as G, i as I } from "./index-LP6NNnow.js";
12
12
  import { t as M } from "./toast-CqSDTWRX.js";
13
- import { u as O } from "./platform-q3cjODLx.js";
13
+ import { u as O } from "./platform-PZpUkkMS.js";
14
14
  import { b as U } from "./routeResource-DlTsGTg_.js";
15
15
  import { u as j } from "./fieldMessages-6HVzSDqG.js";
16
16
  import { _ as $ } from "./ActionRow.vue_vue_type_script_setup_true_lang-QPvYudWc.js";
@@ -1,11 +1,11 @@
1
1
  import { defineComponent as _, computed as d, openBlock as y, createBlock as w, unref as e, withCtx as i, createVNode as l } from "vue";
2
2
  import { useI18n as v } from "vue-i18n";
3
3
  import { useRoute as k, useRouter as R } from "vue-router";
4
- import { a as $ } from "./AdaptivePageShell.vue_vue_type_script_setup_true_lang-CxU9aNRQ.js";
5
- import { _ as b } from "./AsyncSection.vue_vue_type_script_setup_true_lang-Blj6KgCr.js";
4
+ import { a as $ } from "./AdaptivePageShell.vue_vue_type_script_setup_true_lang-GUTIXuNd.js";
5
+ import { _ as b } from "./AsyncSection.vue_vue_type_script_setup_true_lang-B0NfvG3B.js";
6
6
  import { u as g } from "./useLoad-M7V-AVwR.js";
7
- import { a as x, c as u } from "./index-Yy28omu6.js";
8
- import { _ as P } from "./RoleEditor.vue_vue_type_script_setup_true_lang-B6g2760V.js";
7
+ import { a as x, c as u } from "./index-C3E6DcO0.js";
8
+ import { _ as P } from "./RoleEditor.vue_vue_type_script_setup_true_lang-DRHmjA9w.js";
9
9
  const V = /* @__PURE__ */ _({
10
10
  __name: "NewRolePage",
11
11
  setup(h) {