@wssto2/vue-core 0.4.0 → 0.4.2

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 (63) hide show
  1. package/dist/{Activity-2gGxQn7v.js → Activity-Dn4TGnZE.js} +1 -1
  2. package/dist/{AdaptivePageShell.vue_vue_type_script_setup_true_lang-BoinCY93.js → AdaptivePageShell.vue_vue_type_script_setup_true_lang-bxYKlHB7.js} +2 -2
  3. package/dist/{Changes-Bm8xvagD.js → Changes-vnJKoY8t.js} +1 -1
  4. package/dist/{CollectionPage.vue_vue_type_script_setup_true_lang-DCBVw2Qd.js → CollectionPage.vue_vue_type_script_setup_true_lang-21lc-EE4.js} +3 -3
  5. package/dist/{DataTable.vue_vue_type_script_setup_true_lang-UH6f9puS.js → DataTable.vue_vue_type_script_setup_true_lang-DBtMgcW6.js} +1 -1
  6. package/dist/{DeadLetters-CMRtXn_N.js → DeadLetters-hVaoctMw.js} +2 -2
  7. package/dist/{General-CTqd0SLK.js → General-BS8GFldj.js} +2 -2
  8. package/dist/{Menu.vue_vue_type_script_setup_true_lang-DTbAcDzL.js → Menu.vue_vue_type_script_setup_true_lang-ClsOlOSr.js} +64 -57
  9. package/dist/{NewRolePage-DTOWIxxC.js → NewRolePage-Bz4AfDbT.js} +3 -3
  10. package/dist/{ProfilePage-BlpiWH_W.js → ProfilePage-DD0yQ8bd.js} +3 -3
  11. package/dist/{RecordHeader.vue_vue_type_script_setup_true_lang-C_ymvhHU.js → RecordHeader.vue_vue_type_script_setup_true_lang-BCTNrzBb.js} +1 -1
  12. package/dist/{ResourcePage.vue_vue_type_script_setup_true_lang-CwI_sROp.js → ResourcePage.vue_vue_type_script_setup_true_lang-C_tQTUyN.js} +1 -1
  13. package/dist/{RoleEditor.vue_vue_type_script_setup_true_lang-CmwvSytD.js → RoleEditor.vue_vue_type_script_setup_true_lang-P6MOBLbC.js} +2 -2
  14. package/dist/{RolePage-DZk7BZOc.js → RolePage-B9NAwbl1.js} +4 -4
  15. package/dist/{RolesPage-DzGGCMnm.js → RolesPage-BRSmWTD0.js} +2 -2
  16. package/dist/{SectionList.vue_vue_type_script_setup_true_lang-BFYls8fR.js → SectionList.vue_vue_type_script_setup_true_lang-BtQjHjd4.js} +2 -2
  17. package/dist/{SectionNavigator.vue_vue_type_script_setup_true_lang-DSMXEaCs.js → SectionNavigator.vue_vue_type_script_setup_true_lang-BGc8A9AQ.js} +4 -4
  18. package/dist/{Sessions-CWqjjTr1.js → Sessions-DVhVtiEg.js} +1 -1
  19. package/dist/{SettingsPage-C4s0IdkW.js → SettingsPage-CDE4ucf0.js} +2 -2
  20. package/dist/{SignIn-zzKY__df.js → SignIn-tQ67Acwu.js} +1 -1
  21. package/dist/{SignInPage-Rqnus_s-.js → SignInPage-saEqF2jO.js} +1 -1
  22. package/dist/{SignInTable.vue_vue_type_script_setup_true_lang-CEbAvZ_C.js → SignInTable.vue_vue_type_script_setup_true_lang-CifEaH7c.js} +1 -1
  23. package/dist/{SignIns-Cnf9BVR0.js → SignIns-DlAyzaD2.js} +2 -2
  24. package/dist/{UserRecord-DqigxVxH.js → UserRecord-DcTnTZDJ.js} +5 -5
  25. package/dist/{UsersList-DNlZsI9J.js → UsersList-BPPMKPqX.js} +3 -3
  26. package/dist/access/index.js +1 -1
  27. package/dist/access-DmAceEo5.js +42 -0
  28. package/dist/app/feature.d.ts +2 -0
  29. package/dist/app/index.js +2 -2
  30. package/dist/{chrome-BS3xJcad.js → chrome-nUcmVu8G.js} +2 -2
  31. package/dist/collection/index.js +3 -3
  32. package/dist/form/index.js +3 -3
  33. package/dist/identity/index.js +1 -1
  34. package/dist/{index-BsJ92eub.js → index-CeZgHDOM.js} +2 -2
  35. package/dist/{index-GcLnFF-z.js → index-DCsIT4ib.js} +3 -3
  36. package/dist/{index-CGv-u1Ws.js → index-DhePSl1J.js} +10 -10
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.js +1 -1
  39. package/dist/notifications/index.js +1 -1
  40. package/dist/overlay/Menu.vue.d.ts +2 -1
  41. package/dist/overlay/index.js +1 -1
  42. package/dist/page/chrome.d.ts +4 -1
  43. package/dist/page/index.d.ts +1 -1
  44. package/dist/page/index.js +23 -22
  45. package/dist/resource/index.js +1 -1
  46. package/dist/router/access.d.ts +1 -1
  47. package/dist/router/index.js +2 -2
  48. package/dist/router/pageRefresh.d.ts +6 -0
  49. package/dist/{rowLayout-BqTEhEuy.js → rowLayout-CZ7uZFnE.js} +1 -1
  50. package/dist/{sections-CntvUTxn.js → sections-D-kD98vu.js} +1 -1
  51. package/dist/shell/BackofficeShell.vue.d.ts +4 -1
  52. package/dist/shell/NavigationDrawer.vue.d.ts +1 -1
  53. package/dist/shell/PullToRefresh.vue.d.ts +2 -0
  54. package/dist/shell/ShellSidebar.vue.d.ts +2 -1
  55. package/dist/shell/backofficeShell.d.ts +3 -1
  56. package/dist/shell/index.js +644 -554
  57. package/dist/shell/pullToRefresh.d.ts +16 -0
  58. package/dist/shell/search.d.ts +3 -0
  59. package/dist/{status-BuP3ULjH.js → status-DmjQ1O3o.js} +1 -1
  60. package/dist/styles.css +1 -1
  61. package/dist/{useSaveChrome-chi6D3HY.js → useSaveChrome-DuWm0Czf.js} +1 -1
  62. package/package.json +3 -3
  63. package/dist/access-DdRFrVV1.js +0 -40
@@ -0,0 +1,42 @@
1
+ import { defineComponent as d, inject as a, provide as l, h as o, computed as p } from "vue";
2
+ import { RouterView as m } from "vue-router";
3
+ import { d as v } from "./context-Ch1r4fdN.js";
4
+ function y(e, r) {
5
+ return e === void 0 ? !0 : typeof e == "string" ? r.can(e) : "any" in e ? e.any.some((t) => r.can(t)) : e.all.every((t) => r.can(t));
6
+ }
7
+ const A = Symbol("vue-core.pageRefresh");
8
+ function h(e, r) {
9
+ return e.matched.findIndex((t) => !y(t.meta.access, r));
10
+ }
11
+ function x(e) {
12
+ return {
13
+ deniedFrom: p(() => h(e.router.currentRoute.value, e.access)),
14
+ noAccess: e.noAccess
15
+ };
16
+ }
17
+ const [F, R] = v("vue-core.routeAccess"), i = Symbol("vue-core.routerViewDepth"), K = d({
18
+ name: "AppRouterView",
19
+ setup() {
20
+ const e = a(i, 0);
21
+ l(i, e + 1);
22
+ const r = R(), t = e === 0 ? a(A, null) : null;
23
+ return () => o(m, null, {
24
+ default: ({ Component: s, route: c }) => {
25
+ const u = r.deniedFrom.value;
26
+ if (u !== -1 && e >= u) return o(r.noAccess);
27
+ if (!s) return null;
28
+ const n = c.meta.remountOnParam, f = [n ? `${n}:${String(c.params[n])}` : "", t?.value ? `refresh:${t.value}` : ""].filter(Boolean).join("|");
29
+ return o(s, { key: f || void 0 });
30
+ }
31
+ });
32
+ }
33
+ });
34
+ export {
35
+ K as A,
36
+ x as c,
37
+ h as f,
38
+ y as i,
39
+ A as p,
40
+ F as r,
41
+ R as u
42
+ };
@@ -19,6 +19,7 @@ export declare function provideContext<T>(key: InjectionKey<T>, value: T): Conte
19
19
  * shell that offers more augments this interface (declaration merging, like `IconRegistry`).
20
20
  *
21
21
  * - `headerActions`: the actions of the top bar (a notification bell, a search button)
22
+ * - `search`: a search field at the top of the sidebar, under the brand, and at the top of the phone drawer (a quick-search trigger that looks like a field)
22
23
  * - `accountMenu`: entries of the signed-in user's menu
23
24
  * - `banner`: a strip across the top of the whole shell, above everything (a notice that must stay in view: signed in as somebody else)
24
25
  * - `host`: components with no place of their own that must be mounted once (a command palette, a dialog host)
@@ -27,6 +28,7 @@ export interface ShellSlots {
27
28
  }
28
29
  interface DocumentedShellSlots {
29
30
  headerActions: true;
31
+ search: true;
30
32
  accountMenu: true;
31
33
  banner: true;
32
34
  host: true;
package/dist/app/index.js CHANGED
@@ -9,9 +9,9 @@ import { c as Fe, i as Te, f as qe } from "../format-B8mJm946.js";
9
9
  import { coreMessages as oe, createMessageRuntime as Pe } from "../i18n/index.js";
10
10
  import { i as We, a as Be } from "../Icon.vue_vue_type_script_lang-D7oC-d-S.js";
11
11
  import { i as De, b as He } from "../bottomDock-BZEiOPYZ.js";
12
- import { i as Ve, p as Ge } from "../chrome-BS3xJcad.js";
12
+ import { i as Ve, p as Ge } from "../chrome-nUcmVu8G.js";
13
13
  import { i as Je, g as ze } from "../platform-q3cjODLx.js";
14
- import { c as Qe, A as Ue, r as re } from "../access-DdRFrVV1.js";
14
+ import { c as Qe, A as Ue, r as re } from "../access-DmAceEo5.js";
15
15
  import { c as Xe, _ as Ye } from "../NoAccess.vue_vue_type_script_setup_true_lang-DWxq-MTM.js";
16
16
  import { i as Ze } from "../guards-Dve61KjR.js";
17
17
  import { b as et, c as tt, n as ne } from "../navigation-Cm3iChlR.js";
@@ -84,8 +84,8 @@ function S(l) {
84
84
  ), M(() => u.clearRegistration());
85
85
  }
86
86
  export {
87
- R as a,
88
- b,
87
+ b as a,
88
+ R as b,
89
89
  O as c,
90
90
  P as i,
91
91
  g as p,
@@ -1,8 +1,8 @@
1
1
  import { D as M, L as O, a as V, h as j, l as U, r as G } from "../http-CNcDHSOj.js";
2
- import { _ as Z, a as q, u as H } from "../CollectionPage.vue_vue_type_script_setup_true_lang-DCBVw2Qd.js";
2
+ import { _ as Z, a as q, u as H } from "../CollectionPage.vue_vue_type_script_setup_true_lang-21lc-EE4.js";
3
3
  import { u as K } from "../neighbors-DpaIMQAL.js";
4
- import { a as W, b as Y } from "../rowLayout-BqTEhEuy.js";
5
- import { _ as te } from "../DataTable.vue_vue_type_script_setup_true_lang-UH6f9puS.js";
4
+ import { a as W, b as Y } from "../rowLayout-CZ7uZFnE.js";
5
+ import { _ as te } from "../DataTable.vue_vue_type_script_setup_true_lang-DBtMgcW6.js";
6
6
  import { defineComponent as y, openBlock as c, createElementBlock as d, Fragment as h, renderList as v, createBlock as k, unref as u, withCtx as C, normalizeClass as m, createVNode as p, createCommentVNode as g } from "vue";
7
7
  import { _ } from "../Icon.vue_vue_type_script_lang-D7oC-d-S.js";
8
8
  import { _ as w } from "../Tooltip.vue_vue_type_script_setup_true_lang-OOD_XNWx.js";
@@ -43,10 +43,10 @@ import { _ as Rt } from "../Modal.vue_vue_type_script_setup_true_lang-DpBb8ans.j
43
43
  import { _ as We } from "../Banner.vue_vue_type_script_setup_true_lang-DSStj_5z.js";
44
44
  import { D as Tt } from "../useWaitStatus-fsacMl4W.js";
45
45
  import { t as Et } from "../toast-D9Z5To38.js";
46
- import { a as It } from "../AdaptivePageShell.vue_vue_type_script_setup_true_lang-BoinCY93.js";
47
- import { _ as Gt, a as Nt } from "../SectionList.vue_vue_type_script_setup_true_lang-BFYls8fR.js";
46
+ import { a as It } from "../AdaptivePageShell.vue_vue_type_script_setup_true_lang-bxYKlHB7.js";
47
+ import { _ as Gt, a as Nt } from "../SectionList.vue_vue_type_script_setup_true_lang-BtQjHjd4.js";
48
48
  import { p as Kt } from "../sectionIndex-BS0ic5W7.js";
49
- import { u as Pt } from "../useSaveChrome-chi6D3HY.js";
49
+ import { u as Pt } from "../useSaveChrome-DuWm0Czf.js";
50
50
  import { matchedRouteKey as At, onBeforeRouteLeave as Ut } from "vue-router";
51
51
  function Yt(o) {
52
52
  const t = I(null);
@@ -1,4 +1,4 @@
1
- import { _ as t, h as n, j as a, i, k as o, d as r, l as d, m as u, n as y, r as l, o as I, s as f, q as p, t as A, f as c } from "../index-CGv-u1Ws.js";
1
+ import { _ as t, h as n, j as a, i, k as o, d as r, l as d, m as u, n as y, r as l, o as I, s as f, q as p, t as A, f as c } from "../index-DhePSl1J.js";
2
2
  export {
3
3
  t as SignInAsButton,
4
4
  n as identityFeature,
@@ -31,9 +31,9 @@ const M = {
31
31
  deadLettersRetryAll: y("POST", "/v1/events/dead-letters/retry", { permission: "events.deadletter:retry" }),
32
32
  consumers: y("GET", "/v1/events/consumers", { permission: "events.deadletter:view" })
33
33
  }, [ke, ee] = fe("vue-core.notifications"), we = "events.deadletter:view", bt = "events.deadletter:retry", J = Z({
34
- index: { name: "events.deadletters", path: "/events/dead-letters", component: () => import("./DeadLetters-CMRtXn_N.js"), meta: { access: we, titleKey: "core.notifications.dead_letters.title" } }
34
+ index: { name: "events.deadletters", path: "/events/dead-letters", component: () => import("./DeadLetters-hVaoctMw.js"), meta: { access: we, titleKey: "core.notifications.dead_letters.title" } }
35
35
  }), j = Z({
36
- index: { name: "notifications.settings", path: "/profile/notifications", component: () => import("./SettingsPage-C4s0IdkW.js"), meta: { titleKey: "core.notifications.settings.title" } }
36
+ index: { name: "notifications.settings", path: "/profile/notifications", component: () => import("./SettingsPage-CDE4ucf0.js"), meta: { titleKey: "core.notifications.settings.title" } }
37
37
  }), Te = /* @__PURE__ */ z({
38
38
  __name: "SettingsMenuItem",
39
39
  setup(o) {
@@ -43,12 +43,12 @@ const C = {
43
43
  viewAccess: "iam.user:view",
44
44
  manageBindings: "iam.user:manage"
45
45
  }, re = Ee({
46
- roles: { name: "access.roles", path: "/iam/roles", component: () => import("./RolesPage-DzGGCMnm.js"), meta: { access: F.viewRoles, titleKey: "core.access.title" } },
47
- newRole: { name: "access.roles.new", path: "/iam/roles/new", component: () => import("./NewRolePage-DTOWIxxC.js"), meta: { access: F.manageRoles, titleKey: "core.access.new_title" } },
46
+ roles: { name: "access.roles", path: "/iam/roles", component: () => import("./RolesPage-BRSmWTD0.js"), meta: { access: F.viewRoles, titleKey: "core.access.title" } },
47
+ newRole: { name: "access.roles.new", path: "/iam/roles/new", component: () => import("./NewRolePage-Bz4AfDbT.js"), meta: { access: F.manageRoles, titleKey: "core.access.new_title" } },
48
48
  role: {
49
49
  name: "access.role",
50
50
  path: "/iam/roles/:ref",
51
- component: () => import("./RolePage-DZk7BZOc.js"),
51
+ component: () => import("./RolePage-B9NAwbl1.js"),
52
52
  // A role's ref (its key, or the id of a custom one) swaps in place when a link leads to another role.
53
53
  meta: { access: F.viewRoles, titleKey: "core.access.title", remountOnParam: "ref" }
54
54
  }
@@ -315,7 +315,7 @@ function Cs(e) {
315
315
  const Ye = async (e) => {
316
316
  await B(e.http);
317
317
  }, Je = z({
318
- login: { name: "login", path: "/login", component: () => import("./SignInPage-Rqnus_s-.js"), meta: { public: !0, titleKey: "core.identity.signin.title" } }
318
+ login: { name: "login", path: "/login", component: () => import("./SignInPage-saEqF2jO.js"), meta: { public: !0, titleKey: "core.identity.signin.title" } }
319
319
  });
320
320
  function Os(e = {}) {
321
321
  return H({
@@ -334,7 +334,7 @@ function Os(e = {}) {
334
334
  });
335
335
  }
336
336
  const Z = z({
337
- index: { name: "profile", path: "/profile", component: () => import("./ProfilePage-BlpiWH_W.js"), meta: { titleKey: "core.profile.title" } }
337
+ index: { name: "profile", path: "/profile", component: () => import("./ProfilePage-DD0yQ8bd.js"), meta: { titleKey: "core.profile.title" } }
338
338
  }), Qe = /* @__PURE__ */ E({
339
339
  __name: "ProfileMenuItem",
340
340
  setup(e) {
@@ -358,19 +358,19 @@ function es(e) {
358
358
  return { name: `users.record.${e.path}`, path: e.path, component: s, meta: { ...e.meta } };
359
359
  }
360
360
  const W = "iam.user:view", qs = "iam.user:manage", ss = "iam.user.activity:view", ee = z({
361
- index: { name: "users.index", path: "/users", component: () => import("./UsersList-DNlZsI9J.js"), meta: { access: W, titleKey: "core.users.title" } },
361
+ index: { name: "users.index", path: "/users", component: () => import("./UsersList-BPPMKPqX.js"), meta: { access: W, titleKey: "core.users.title" } },
362
362
  record: {
363
363
  name: "users.record",
364
364
  path: "/users/:id",
365
- component: () => import("./UserRecord-DqigxVxH.js"),
365
+ component: () => import("./UserRecord-DcTnTZDJ.js"),
366
366
  meta: { access: W, titleKey: "core.users.title", remountOnParam: "id" },
367
367
  children: [
368
- { name: "users.record.general", path: "general", component: () => import("./General-CTqd0SLK.js"), meta: { section: { labelKey: "core.users.sections.general", icon: "user3Line", groupKey: "core.users.section_groups.person" } } },
369
- { name: "users.record.signin", path: "signin", component: () => import("./SignIn-zzKY__df.js"), meta: { section: { labelKey: "core.users.sections.signin", icon: "key2Line", groupKey: "core.users.section_groups.access" } } },
370
- { name: "users.record.sessions", path: "sessions", component: () => import("./Sessions-CWqjjTr1.js"), meta: { section: { labelKey: "core.users.sections.sessions", icon: "deviceLine", groupKey: "core.users.section_groups.access" } } },
371
- { name: "users.record.signins", path: "signins", component: () => import("./SignIns-Cnf9BVR0.js"), meta: { section: { labelKey: "core.users.sections.signins", icon: "timeFill", groupKey: "core.users.section_groups.activity" } } },
372
- { name: "users.record.changes", path: "changes", component: () => import("./Changes-Bm8xvagD.js"), meta: { section: { labelKey: "core.users.sections.changes", icon: "edit", groupKey: "core.users.section_groups.activity" } } },
373
- { name: "users.record.activity", path: "activity", component: () => import("./Activity-2gGxQn7v.js"), meta: { access: ss, section: { labelKey: "core.users.sections.activity", icon: "listCheck", groupKey: "core.users.section_groups.activity" } } }
368
+ { name: "users.record.general", path: "general", component: () => import("./General-BS8GFldj.js"), meta: { section: { labelKey: "core.users.sections.general", icon: "user3Line", groupKey: "core.users.section_groups.person" } } },
369
+ { name: "users.record.signin", path: "signin", component: () => import("./SignIn-tQ67Acwu.js"), meta: { section: { labelKey: "core.users.sections.signin", icon: "key2Line", groupKey: "core.users.section_groups.access" } } },
370
+ { name: "users.record.sessions", path: "sessions", component: () => import("./Sessions-DVhVtiEg.js"), meta: { section: { labelKey: "core.users.sections.sessions", icon: "deviceLine", groupKey: "core.users.section_groups.access" } } },
371
+ { name: "users.record.signins", path: "signins", component: () => import("./SignIns-DlAyzaD2.js"), meta: { section: { labelKey: "core.users.sections.signins", icon: "timeFill", groupKey: "core.users.section_groups.activity" } } },
372
+ { name: "users.record.changes", path: "changes", component: () => import("./Changes-vnJKoY8t.js"), meta: { section: { labelKey: "core.users.sections.changes", icon: "edit", groupKey: "core.users.section_groups.activity" } } },
373
+ { name: "users.record.activity", path: "activity", component: () => import("./Activity-Dn4TGnZE.js"), meta: { access: ss, section: { labelKey: "core.users.sections.activity", icon: "listCheck", groupKey: "core.users.section_groups.activity" } } }
374
374
  ]
375
375
  }
376
376
  });
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** The version of @wssto2/vue-core (kept equal to package.json by index.test.ts). */
2
- export declare const version = "0.4.0";
2
+ export declare const version = "0.4.2";
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- const o = "0.4.0";
1
+ const o = "0.4.2";
2
2
  export {
3
3
  o as version
4
4
  };
@@ -1,4 +1,4 @@
1
- import { d as s, e as o, n as a, a as i, b as n } from "../index-BsJ92eub.js";
1
+ import { d as s, e as o, n as a, a as i, b as n } from "../index-CeZgHDOM.js";
2
2
  export {
3
3
  s as deadLettersRoutes,
4
4
  o as eventsRoutes,
@@ -15,7 +15,8 @@ export interface MenuItem {
15
15
  shortcut?: string;
16
16
  /**
17
17
  * A choice among the items (the current location): the item is a `menuitemradio` with
18
- * `aria-checked`, so the current one is not told by a tick icon alone.
18
+ * `aria-checked`, and the current one (`true`) also draws a tick at the trailing end, as the
19
+ * account menu does, so the tick is never the only way it is told. `false` reserves nothing.
19
20
  */
20
21
  checked?: boolean;
21
22
  onSelect: () => void;
@@ -1,5 +1,5 @@
1
1
  import { _ as e } from "../AlertDialog.vue_vue_type_script_setup_true_lang-whA4WLdl.js";
2
- import { _ as a } from "../Menu.vue_vue_type_script_setup_true_lang-DTbAcDzL.js";
2
+ import { _ as a } from "../Menu.vue_vue_type_script_setup_true_lang-ClsOlOSr.js";
3
3
  import { _ as p } from "../Popover.vue_vue_type_script_setup_true_lang-Dx-tDhNE.js";
4
4
  import { _ as m } from "../Toaster.vue_vue_type_script_setup_true_lang-55boRLAj.js";
5
5
  import { _ as x } from "../Tooltip.vue_vue_type_script_setup_true_lang-OOD_XNWx.js";
@@ -64,7 +64,10 @@ export declare function createPageChrome(): PageChrome;
64
64
  export declare const pageChromeKey: import("vue").InjectionKey<PageChrome>, usePageChromeContext: () => PageChrome;
65
65
  /** Creates the page chrome of an app and installs it; returns it for the app's phone header to read. */
66
66
  export declare function installPageChrome(app: App): PageChrome;
67
- /** The chrome of an app that installed one, otherwise null. */
67
+ /**
68
+ * The chrome of an app that installed one, otherwise null. Use it in a component that may be mounted without the
69
+ * application (a unit test, a story); inside an application use `usePageChromeContext`, which names the missing provider.
70
+ */
68
71
  export declare function useOptionalPageChrome(): PageChrome | null;
69
72
  export interface PageChromeOptions {
70
73
  /** Actions for the page's toolbar (desktop) and nav bar (phone). */
@@ -7,7 +7,7 @@ export { default as PageActions } from "./PageActions.vue";
7
7
  export { default as PageToolbar } from "./PageToolbar.vue";
8
8
  export { default as RecordHeader } from "./RecordHeader.vue";
9
9
  export { default as ResourceHeader } from "./ResourceHeader.vue";
10
- export { createPageChrome, installPageChrome, usePageChrome, usePageChromeContext, pageChromeKey, type FocusMemory, type PageChrome, type PageChromeOptions, type PageChromeOwner, type PageChromeRegistration, } from "./chrome";
10
+ export { createPageChrome, installPageChrome, useOptionalPageChrome, usePageChrome, usePageChromeContext, pageChromeKey, type FocusMemory, type PageChrome, type PageChromeOptions, type PageChromeOwner, type PageChromeRegistration, } from "./chrome";
11
11
  export { pageSectionBackKey, usePageSectionBack } from "./sectionBack";
12
12
  export { provideSectionIndex, sectionId, useSectionAnchor, useSectionIndex } from "./sectionIndex";
13
13
  export type { IndexedSection, SectionIndex } from "./sectionIndex";
@@ -1,15 +1,15 @@
1
- import { _ as x } from "../AdaptivePageShell.vue_vue_type_script_setup_true_lang-BoinCY93.js";
2
- import { a as W, b as X, c as Y, d as Z, p as ee, u as te, e as ae } from "../AdaptivePageShell.vue_vue_type_script_setup_true_lang-BoinCY93.js";
1
+ import { _ as x } from "../AdaptivePageShell.vue_vue_type_script_setup_true_lang-bxYKlHB7.js";
2
+ import { a as W, b as X, c as Y, d as Z, p as ee, u as te, e as ae } from "../AdaptivePageShell.vue_vue_type_script_setup_true_lang-bxYKlHB7.js";
3
3
  import { _ as se } from "../BottomDock.vue_vue_type_script_setup_true_lang-CjN7xYEr.js";
4
4
  import { b as ne, i as re, u as ie } from "../bottomDock-BZEiOPYZ.js";
5
- import { defineComponent as v, openBlock as a, createBlock as b, withCtx as c, createElementVNode as s, normalizeStyle as k, createElementBlock as l, Fragment as y, renderList as B, normalizeClass as d, unref as _, createCommentVNode as p, toDisplayString as f, useModel as S, useId as C, useTemplateRef as $, computed as P, mergeProps as w, createSlots as T, renderSlot as m, mergeModels as D } from "vue";
5
+ import { defineComponent as v, openBlock as a, createBlock as b, withCtx as c, createElementVNode as s, normalizeStyle as k, createElementBlock as l, Fragment as y, renderList as B, normalizeClass as d, unref as h, createCommentVNode as p, toDisplayString as f, useModel as S, useId as C, useTemplateRef as P, computed as $, mergeProps as w, createSlots as T, renderSlot as m, mergeModels as D } from "vue";
6
6
  import { _ as L } from "../Icon.vue_vue_type_script_lang-D7oC-d-S.js";
7
- import { _ as ue } from "../RecordHeader.vue_vue_type_script_setup_true_lang-C_ymvhHU.js";
8
- import { c as pe, i as fe, p as me, u as be, a as ge } from "../chrome-BS3xJcad.js";
7
+ import { _ as ue } from "../RecordHeader.vue_vue_type_script_setup_true_lang-BCTNrzBb.js";
8
+ import { c as pe, i as fe, p as me, a as be, u as ge, b as ve } from "../chrome-nUcmVu8G.js";
9
9
  import { s as z, u as I } from "../sectionIndex-BS0ic5W7.js";
10
- import { p as _e, a as he } from "../sectionIndex-BS0ic5W7.js";
11
- import { _ as ke } from "../SectionNavigator.vue_vue_type_script_setup_true_lang-DSMXEaCs.js";
12
- import { a as Be, _ as Se } from "../SectionList.vue_vue_type_script_setup_true_lang-BFYls8fR.js";
10
+ import { p as _e, a as xe } from "../sectionIndex-BS0ic5W7.js";
11
+ import { _ as ye } from "../SectionNavigator.vue_vue_type_script_setup_true_lang-BGc8A9AQ.js";
12
+ import { a as Se, _ as Ce } from "../SectionList.vue_vue_type_script_setup_true_lang-BtQjHjd4.js";
13
13
  import { _ as A } from "../Panel.vue_vue_type_script_setup_true_lang-BA0u_DtS.js";
14
14
  const K = ["aria-label"], M = ["aria-label"], N = ["aria-selected", "tabindex", "onClick"], R = { class: "relative" }, E = {
15
15
  key: 2,
@@ -17,7 +17,7 @@ const K = ["aria-label"], M = ["aria-label"], N = ["aria-selected", "tabindex",
17
17
  }, H = {
18
18
  key: 0,
19
19
  class: "sr-only"
20
- }, q = /* @__PURE__ */ v({
20
+ }, U = /* @__PURE__ */ v({
21
21
  __name: "BottomTabBar",
22
22
  props: {
23
23
  items: {},
@@ -51,7 +51,7 @@ const K = ["aria-label"], M = ["aria-label"], N = ["aria-selected", "tabindex",
51
51
  onClick: (u) => r("select", e.value)
52
52
  }, [
53
53
  s("span", R, [
54
- e.icon ? (a(), b(_(L), {
54
+ e.icon ? (a(), b(h(L), {
55
55
  key: 0,
56
56
  name: e.icon,
57
57
  size: 22
@@ -73,7 +73,7 @@ const K = ["aria-label"], M = ["aria-label"], N = ["aria-selected", "tabindex",
73
73
  _: 1
74
74
  }));
75
75
  }
76
- }), G = /* @__PURE__ */ v({
76
+ }), q = /* @__PURE__ */ v({
77
77
  __name: "SectionPanel",
78
78
  props: /* @__PURE__ */ D({
79
79
  title: {},
@@ -91,13 +91,13 @@ const K = ["aria-label"], M = ["aria-label"], N = ["aria-selected", "tabindex",
91
91
  }),
92
92
  emits: ["update:collapsed"],
93
93
  setup(n) {
94
- const t = n, o = S(n, "collapsed"), r = t.id ?? (z(t.title) || `section-${C()}`), i = $("panel"), g = P(() => i.value?.$el ?? null);
94
+ const t = n, o = S(n, "collapsed"), r = t.id ?? (z(t.title) || `section-${C()}`), i = P("panel"), g = $(() => i.value?.$el ?? null);
95
95
  return I(r, () => t.title, g, { number: () => t.number, reveal: () => i.value?.expand() }), (e, u) => (a(), b(A, w({
96
96
  ref_key: "panel",
97
97
  ref: i,
98
98
  collapsed: o.value,
99
- "onUpdate:collapsed": u[0] || (u[0] = (h) => o.value = h)
100
- }, { id: _(r), tabindex: -1 }, {
99
+ "onUpdate:collapsed": u[0] || (u[0] = (_) => o.value = _)
100
+ }, { id: h(r), tabindex: -1 }, {
101
101
  title: t.title,
102
102
  icon: t.icon,
103
103
  number: t.number,
@@ -134,15 +134,15 @@ export {
134
134
  W as AdaptivePageShell,
135
135
  se as BottomDock,
136
136
  x as BottomDockPortal,
137
- q as BottomTabBar,
137
+ U as BottomTabBar,
138
138
  X as PageActions,
139
139
  Y as PageToolbar,
140
140
  ue as RecordHeader,
141
141
  Z as ResourceHeader,
142
- Be as SectionJumper,
143
- Se as SectionList,
144
- ke as SectionNavigator,
145
- G as SectionPanel,
142
+ Se as SectionJumper,
143
+ Ce as SectionList,
144
+ ye as SectionNavigator,
145
+ q as SectionPanel,
146
146
  ne as bottomDockKey,
147
147
  pe as createPageChrome,
148
148
  re as installBottomDock,
@@ -153,9 +153,10 @@ export {
153
153
  z as sectionId,
154
154
  ie as useBottomDockTarget,
155
155
  te as useLargeTitle,
156
- be as usePageChrome,
157
- ge as usePageChromeContext,
156
+ be as useOptionalPageChrome,
157
+ ge as usePageChrome,
158
+ ve as usePageChromeContext,
158
159
  ae as usePageSectionBack,
159
160
  I as useSectionAnchor,
160
- he as useSectionIndex
161
+ xe as useSectionIndex
161
162
  };
@@ -1,5 +1,5 @@
1
1
  import { p as o, u as r, a, b as u } from "../routeResource-DstM0hvf.js";
2
- import { _ as R, a as c } from "../ResourcePage.vue_vue_type_script_setup_true_lang-CwI_sROp.js";
2
+ import { _ as R, a as c } from "../ResourcePage.vue_vue_type_script_setup_true_lang-C_tQTUyN.js";
3
3
  export {
4
4
  R as RecordPager,
5
5
  c as ResourcePage,
@@ -24,7 +24,7 @@ export declare const routeAccessKey: InjectionKey<RouteAccess>, useRouteAccess:
24
24
  * page's section outlet) is an `AppRouterView`, not a bare `RouterView`: it shows the no-access state
25
25
  * in place of a page the session may not open (parents around it keep rendering, so the layout stays),
26
26
  * and remounts a page when the route parameter named by `meta.remountOnParam` changes (a record pager
27
- * moving to the next record).
27
+ * moving to the next record), or when the shell's pull to refresh reloads the page (the shell's outlet only).
28
28
  *
29
29
  * Denial is shown here, not enforced: the server authorizes every request.
30
30
  */
@@ -1,8 +1,8 @@
1
1
  import { _ as a, c as o, a as r, i as t } from "../NoAccess.vue_vue_type_script_setup_true_lang-DWxq-MTM.js";
2
2
  import { d as c } from "../defineRoutes-BGAdiIrt.js";
3
- import { A as u, f as p, i as f, r as A, u as m } from "../access-DdRFrVV1.js";
3
+ import { A as u, f as p, i as f, r as A, u as m } from "../access-DmAceEo5.js";
4
4
  import { i as l, r as x } from "../guards-Dve61KjR.js";
5
- import { u as y } from "../sections-CntvUTxn.js";
5
+ import { u as y } from "../sections-D-kD98vu.js";
6
6
  import { b as v, c as N, n as H, u as b } from "../navigation-Cm3iChlR.js";
7
7
  export {
8
8
  u as AppRouterView,
@@ -0,0 +1,6 @@
1
+ import { type InjectionKey, type Ref } from "vue";
2
+ /**
3
+ * Bumped by the shell's pull to refresh; the page outlet of the shell (an `AppRouterView` at depth 0) is keyed by it, so
4
+ * the page remounts and reloads its data while everything around it stays. Internal: not exported from `router`.
5
+ */
6
+ export declare const pageRefreshKey: InjectionKey<Ref<number>>;
@@ -3,7 +3,7 @@ import { useI18n as ve } from "vue-i18n";
3
3
  import { RouterLink as ce, useRouter as _e } from "vue-router";
4
4
  import { _ as we } from "./SwipeActions.vue_vue_type_script_setup_true_lang-BJIA2JfI.js";
5
5
  import { _ as K } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
6
- import { _ as xe } from "./Menu.vue_vue_type_script_setup_true_lang-DTbAcDzL.js";
6
+ import { _ as xe } from "./Menu.vue_vue_type_script_setup_true_lang-ClsOlOSr.js";
7
7
  import { _ as Ce } from "./Tooltip.vue_vue_type_script_setup_true_lang-OOD_XNWx.js";
8
8
  import { _ as re } from "./EmptyState.vue_vue_type_script_setup_true_lang-50p-Mp8I.js";
9
9
  import { u as $e } from "./format-B8mJm946.js";
@@ -2,7 +2,7 @@ import { computed as n, watch as h } from "vue";
2
2
  import { useI18n as b } from "vue-i18n";
3
3
  import { useRoute as g, useRouter as p } from "vue-router";
4
4
  import { u as y } from "./platform-q3cjODLx.js";
5
- import { i as w } from "./access-DdRFrVV1.js";
5
+ import { i as w } from "./access-DmAceEo5.js";
6
6
  function j() {
7
7
  const t = g(), u = p(), { access: c } = y(), { t: r } = b(), i = n(() => {
8
8
  for (let e = t.matched.length - 1; e >= 0; e--) {
@@ -5,7 +5,7 @@ import type { NavigationProgress } from "./progress";
5
5
  /**
6
6
  * The layout of a backoffice application: a sidebar with the server's menu on desktop, a top bar
7
7
  * and a push navigation drawer on phones, the page in between, the bottom dock and the toasts, and
8
- * the places features contribute to (`headerActions`, `accountMenu`, `banner`, `host`). Give it to
8
+ * the places features contribute to (`headerActions`, `search`, `accountMenu`, `banner`, `host`). Give it to
9
9
  * `createApplication` through `backofficeShell()`, or render it inside a shell of your own.
10
10
  *
11
11
  * Signed out (the login page) there is only the top bar with the brand and the page.
@@ -21,6 +21,8 @@ type __VLS_Props = {
21
21
  identity?: (user: SessionUser) => ShellIdentity;
22
22
  /** The page-load indicator (`backofficeShell()` supplies it to the router as well). */
23
23
  progress?: NavigationProgress;
24
+ /** Pull down from the top of the page to reload it, while the application runs installed (`display-mode: standalone`). Default on. */
25
+ pullToRefresh?: boolean;
24
26
  };
25
27
  type __VLS_Slots = {
26
28
  /** The logo, for the dark sidebar (`tone` `light`) and the light surfaces (`brand`). Default: the application's name. */
@@ -36,6 +38,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}
36
38
  progress: NavigationProgress;
37
39
  home: RouteLocationRaw;
38
40
  identity: (user: SessionUser) => ShellIdentity;
41
+ pullToRefresh: boolean;
39
42
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
40
43
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
41
44
  export default _default;
@@ -1,7 +1,7 @@
1
1
  import type { RouteLocationRaw } from "vue-router";
2
2
  import type { ShellIdentity } from "./identity";
3
3
  /**
4
- * The phone navigation drawer's content (UI decision D18): the brand (home), the destinations (the
4
+ * The phone navigation drawer's content (UI decision D18): the brand (home), the shell's `search` field, the destinations (the
5
5
  * same model as the desktop rail), a `footer` slot, and the account row pinned at the bottom.
6
6
  * Presentation only: the `ShellStage` around it owns opening, closing, gestures and focus, and the
7
7
  * owner acts on the events:
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -3,7 +3,8 @@ import type { ShellIdentity } from "./identity";
3
3
  /**
4
4
  * The desktop sidebar: an attached, full-height dark rail, the page's one dark surface (the
5
5
  * `anchor` palette), sticky and scrolling on its own when the menu is taller than the window. From
6
- * top to bottom: the brand (home) with the shell's `headerActions`, the server's menu, a `footer`
6
+ * top to bottom: the brand (home) with the shell's `headerActions`, the shell's `search` field,
7
+ * the server's menu, a `footer`
7
8
  * slot, and the account block. It renders from the md breakpoint up and nothing below it (phones use
8
9
  * the navigation drawer), so a header action contributed to the shell is mounted once, never in both.
9
10
  *
@@ -14,10 +14,12 @@ export interface BackofficeShellOptions<U extends SessionUser = SessionUser> {
14
14
  footer?: Component;
15
15
  /** Extra content at the end of the top bar. */
16
16
  topBarEnd?: Component;
17
+ /** Pull down from the top of the page to reload it (the page only; the shell stays), while the application runs installed. Default `true`. */
18
+ pullToRefresh?: boolean;
17
19
  }
18
20
  /**
19
21
  * The backoffice shell as `createApplication` takes it: the layout, the slots it renders
20
- * (`headerActions`, `accountMenu`, `banner`, `host`) and the page-load indicator wired to the router.
22
+ * (`headerActions`, `search`, `accountMenu`, `banner`, `host`) and the page-load indicator wired to the router.
21
23
  *
22
24
  * createApplication({ platform, features, shell: backofficeShell({ brand: MyLogo }) });
23
25
  *