@wssto2/vue-core 0.4.23 → 0.4.25

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 (43) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/{Activity-Cu_mAn_m.js → Activity-CI-l_OFl.js} +1 -1
  3. package/dist/{Changes-DW_3-MwX.js → Changes-BdR0R20V.js} +1 -1
  4. package/dist/{DeadLetters-CpcMccCc.js → DeadLetters-CRTeoZS1.js} +1 -1
  5. package/dist/FormErrors.vue_vue_type_script_setup_true_lang-DGOSc-PS.js +295 -0
  6. package/dist/{FormView.vue_vue_type_script_setup_true_lang-CbvMRBOc.js → FormView.vue_vue_type_script_setup_true_lang-BUrYkjmF.js} +1 -1
  7. package/dist/{General-Dbc3qDRz.js → General-hdmVP72B.js} +3 -3
  8. package/dist/{NewRolePage-DPHFJ0I8.js → NewRolePage-BPeKasOp.js} +2 -2
  9. package/dist/PhotoViewer.vue_vue_type_script_setup_true_lang-CY5EZiyK.js +433 -0
  10. package/dist/{ProfilePage-Cc7eiyV2.js → ProfilePage-Dq9lcO5O.js} +3 -3
  11. package/dist/{RoleEditor.vue_vue_type_script_setup_true_lang-2fpYYCXj.js → RoleEditor.vue_vue_type_script_setup_true_lang-B6g2760V.js} +3 -3
  12. package/dist/{RolePage-C0jmkQkO.js → RolePage-BYH-0fVI.js} +3 -3
  13. package/dist/{RolesPage-eb4gqxdW.js → RolesPage-BRm5xDw7.js} +1 -1
  14. package/dist/{Sessions-DSDcj8Yd.js → Sessions-B1eKG_I2.js} +1 -1
  15. package/dist/{SettingsPage-BF7MW1GH.js → SettingsPage-0P38Ty4w.js} +3 -3
  16. package/dist/{SignIn-BR8-RVIk.js → SignIn-Dp8Ji0_r.js} +1 -1
  17. package/dist/{SignInPage-Dcws582A.js → SignInPage-CiStJboK.js} +2 -2
  18. package/dist/{SignIns-3u7YgKqh.js → SignIns-Bo7R2Coi.js} +1 -1
  19. package/dist/{UserRecord-AtZIwCO9.js → UserRecord-DGq_PPy1.js} +3 -3
  20. package/dist/{UsersList-1IeQnvOL.js → UsersList-BulNu4aE.js} +3 -3
  21. package/dist/access/index.js +1 -1
  22. package/dist/form/CommandDialog.vue.d.ts +6 -0
  23. package/dist/form/index.js +9 -9
  24. package/dist/form/useForm.d.ts +5 -1
  25. package/dist/form/useRecordDialog.d.ts +2 -2
  26. package/dist/identity/index.js +1 -1
  27. package/dist/{index--CxZ33h0.js → index-BmowiT1y.js} +12 -12
  28. package/dist/{index-Du3Ti2Zp.js → index-Yy28omu6.js} +4 -4
  29. package/dist/{index-DBTK_iMB.js → index-tnSTp0cM.js} +2 -2
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/notifications/index.js +1 -1
  33. package/dist/overlay/PhotoViewer.vue.d.ts +4 -3
  34. package/dist/overlay/PhotoViewerAction.vue.d.ts +22 -0
  35. package/dist/overlay/index.d.ts +1 -0
  36. package/dist/overlay/index.js +47 -23
  37. package/dist/{status-QOGPjIHu.js → status-Bh3-Cg7o.js} +1 -1
  38. package/dist/styles.css +1 -1
  39. package/dist/{useCommand-CT1RF_IB.js → useCommand-Cj-APj-P.js} +53 -50
  40. package/dist/{useResourceForm-CQuniKhd.js → useResourceForm-tGYTfKhH.js} +1 -1
  41. package/package.json +1 -1
  42. package/dist/FormErrors.vue_vue_type_script_setup_true_lang-4WQz-TYS.js +0 -286
  43. package/dist/PhotoViewer.vue_vue_type_script_setup_true_lang-QPCW3Xi6.js +0 -411
@@ -0,0 +1,433 @@
1
+ import { defineComponent as Ne, useModel as Xe, ref as k, useTemplateRef as se, watch as Q, computed as g, onBeforeUnmount as Ve, nextTick as ye, onMounted as Ye, openBlock as h, createBlock as Ze, Teleport as je, createElementBlock as m, createVNode as C, Transition as Ee, withCtx as Ke, unref as s, createElementVNode as p, toDisplayString as ee, createCommentVNode as w, renderSlot as be, normalizeClass as M, withModifiers as re, normalizeStyle as te, Fragment as We, renderList as Ue, mergeModels as _e } from "vue";
2
+ import { useI18n as Fe } from "vue-i18n";
3
+ import { _ as I } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
4
+ import { u as He } from "./mediaQuery-CygcXmFW.js";
5
+ import { u as qe } from "./useDialog-CXR3hN0G.js";
6
+ const ke = [1, 1.5, 2, 3, 4, 5], Me = 1, ue = 5, Ge = (a) => Math.min(ue, Math.max(Me, a)), ze = (a, l) => l % 2 === 0 ? a : { width: a.height, height: a.width };
7
+ function Je(a, l, r) {
8
+ const i = ze(a, r);
9
+ if (i.width <= 0 || i.height <= 0 || l.width <= 0 || l.height <= 0) return { width: 0, height: 0 };
10
+ const o = Math.min(l.width / i.width, l.height / i.height);
11
+ return { width: a.width * o, height: a.height * o };
12
+ }
13
+ function Qe(a, l, r) {
14
+ return { x: Math.max(0, (a.width * r - l.width) / 2), y: Math.max(0, (a.height * r - l.height) / 2) };
15
+ }
16
+ function X(a, l, r, i) {
17
+ const o = Qe(l, r, i);
18
+ return { x: Math.min(o.x, Math.max(-o.x, a.x)) + 0, y: Math.min(o.y, Math.max(-o.y, a.y)) + 0 };
19
+ }
20
+ function et(a, l, r, i, o) {
21
+ const z = Ge(l), u = z / a.zoom, $ = { x: r.x - (r.x - a.pan.x) * u, y: r.y - (r.y - a.pan.y) * u };
22
+ return { zoom: z, pan: X($, i, o, z) };
23
+ }
24
+ function tt(a, l) {
25
+ return l === 1 ? ke.find((i) => i > a + 1e-3) ?? ue : [...ke].reverse().find((i) => i < a - 1e-3) ?? Me;
26
+ }
27
+ function at(a, l, r, i, o) {
28
+ const z = Math.min(o.width / a.width, o.height / a.height), u = { width: a.width * z, height: a.height * z }, $ = { width: a.width * r, height: a.height * r }, T = { width: Math.min(1, l.width / $.width), height: Math.min(1, l.height / $.height) }, O = { x: 0.5 - i.x / $.width, y: 0.5 - i.y / $.height };
29
+ return {
30
+ image: u,
31
+ view: { x: (O.x - T.width / 2) * u.width, y: (O.y - T.height / 2) * u.height, width: T.width * u.width, height: T.height * u.height }
32
+ };
33
+ }
34
+ function it(a, l, r, i) {
35
+ return X({ x: (0.5 - a.x) * l.width * i, y: (0.5 - a.y) * l.height * i }, l, r, i);
36
+ }
37
+ const ot = {
38
+ key: 0,
39
+ class: "relative z-9999"
40
+ }, nt = ["aria-label"], lt = {
41
+ "data-test": "photo-header",
42
+ class: "flex items-center gap-2 px-4 pt-[max(0.875rem,var(--app-safe-top))] pb-3.5 md:px-4.5"
43
+ }, st = { class: "flex min-w-0 text-headline font-semibold" }, rt = {
44
+ key: 0,
45
+ class: "truncate"
46
+ }, ut = {
47
+ key: 1,
48
+ class: "shrink-0 whitespace-pre"
49
+ }, ct = {
50
+ class: "shrink-0 whitespace-nowrap",
51
+ "aria-live": "polite",
52
+ "data-test": "photo-counter"
53
+ }, dt = ["aria-label", "aria-disabled"], ht = {
54
+ class: "w-13 text-center text-subheadline tabular-nums compact:hidden",
55
+ "data-test": "zoom-percent"
56
+ }, vt = ["aria-label", "aria-disabled"], mt = ["aria-label"], pt = ["href", "download", "aria-label"], ft = ["aria-label"], gt = { class: "flex min-h-0 grow items-center gap-4 px-4 md:px-4.5" }, wt = ["aria-label", "aria-disabled"], xt = ["src", "alt"], yt = ["src"], bt = ["aria-label", "aria-disabled"], _t = {
57
+ key: 0,
58
+ "data-test": "photo-toolbar",
59
+ class: "flex shrink-0 items-center justify-center gap-2 px-4 pt-3 pb-1"
60
+ }, kt = ["aria-label", "aria-current", "onClick"], Mt = ["src"], zt = {
61
+ key: 2,
62
+ class: "h-[max(1.25rem,var(--app-safe-bottom))] shrink-0"
63
+ }, $t = {
64
+ class: "sr-only",
65
+ "aria-live": "polite"
66
+ }, Pt = 8, Ct = 300, B = "flex size-10 shrink-0 cursor-pointer items-center justify-center rounded-full bg-white/8 text-[#f1f5f3] transition-colors duration-motion-fast hover:bg-white/16 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#6ee7b7] aria-disabled:cursor-default aria-disabled:opacity-30 aria-disabled:hover:bg-white/8", Bt = /* @__PURE__ */ Ne({
67
+ __name: "PhotoViewer",
68
+ props: /* @__PURE__ */ _e({
69
+ items: {},
70
+ title: { default: void 0 }
71
+ }, {
72
+ index: { default: 0 },
73
+ indexModifiers: {}
74
+ }),
75
+ emits: /* @__PURE__ */ _e(["presented", "dismissed"], ["update:index"]),
76
+ setup(a, { expose: l, emit: r }) {
77
+ const i = a, o = Xe(a, "index"), z = r, { t: u } = Fe(), $ = He(), T = k(null), O = se("stage"), $e = se("image"), ce = se("strip"), E = qe(T, { initialFocus: "panel", onPresented: () => z("presented"), onDismissed: () => z("dismissed") }), { isOpen: K } = E, ae = k(!1);
78
+ Q(K, (e) => {
79
+ e && (ae.value = !0);
80
+ }, { flush: "sync" });
81
+ const Pe = () => {
82
+ K.value || (ae.value = !1);
83
+ }, d = k(1), c = k({ x: 0, y: 0 }), P = k(0), W = k({ width: 0, height: 0 }), x = k({ width: 0, height: 0 }), b = k(0), ie = k(!1), V = k(null), v = g(() => i.items[o.value]), D = g(() => Je(W.value, x.value, P.value)), L = g(() => ze(D.value, P.value)), de = g(() => D.value.width > 0), Ce = g(() => Math.round(d.value * 100)), A = g(() => d.value > 1.001), he = g(() => o.value > 0), ve = g(() => o.value < i.items.length - 1), Te = g(() => ({
84
+ width: `${D.value.width}px`,
85
+ height: `${D.value.height}px`,
86
+ marginLeft: `${-D.value.width / 2}px`,
87
+ marginTop: `${-D.value.height / 2}px`,
88
+ transform: `translate(${c.value.x + b.value}px, ${c.value.y}px) scale(${d.value}) rotate(${P.value * 90}deg)`
89
+ }));
90
+ function U() {
91
+ d.value = 1, c.value = { x: 0, y: 0 }, b.value = 0;
92
+ }
93
+ function F() {
94
+ const e = O.value;
95
+ e && (x.value = { width: e.clientWidth, height: e.clientHeight }), oe();
96
+ }
97
+ function oe() {
98
+ const e = $e.value;
99
+ e && e.naturalWidth > 0 && (W.value = { width: e.naturalWidth, height: e.naturalHeight });
100
+ }
101
+ let H = null;
102
+ Q(O, (e) => {
103
+ H?.disconnect(), e && (F(), typeof ResizeObserver < "u" && (H = new ResizeObserver(() => {
104
+ F(), c.value = X(c.value, L.value, x.value, d.value);
105
+ }), H.observe(e)));
106
+ }), Ve(() => H?.disconnect()), Q(o, () => {
107
+ U(), P.value = 0, W.value = { width: 0, height: 0 }, ye(() => {
108
+ oe(), ce.value?.querySelector("[aria-current=true]")?.scrollIntoView?.({ inline: "center", block: "nearest" });
109
+ });
110
+ }), Q(() => i.items.length, (e) => {
111
+ e === 0 ? E.dismiss() : o.value > e - 1 && (o.value = e - 1);
112
+ });
113
+ function Oe(e = 0) {
114
+ o.value = Math.min(Math.max(0, e), Math.max(0, i.items.length - 1)), U(), P.value = 0, W.value = { width: 0, height: 0 }, V.value = null, E.present(), ye(F);
115
+ }
116
+ const me = () => E.dismiss();
117
+ l({ present: Oe, dismiss: me });
118
+ function Y(e) {
119
+ const t = o.value + e;
120
+ t < 0 || t > i.items.length - 1 || (V.value = e === 1 ? "forward" : "back", o.value = t);
121
+ }
122
+ function R(e) {
123
+ q(tt(d.value, e), { x: 0, y: 0 });
124
+ }
125
+ function q(e, t) {
126
+ const n = et({ zoom: d.value, pan: c.value }, e, t, L.value, x.value);
127
+ d.value = n.zoom, c.value = n.pan;
128
+ }
129
+ function ne() {
130
+ P.value = (P.value + 3) % 4, c.value = X(c.value, L.value, x.value, d.value);
131
+ }
132
+ function Le(e) {
133
+ if (e.altKey || e.ctrlKey || e.metaKey) return;
134
+ const n = {
135
+ ArrowLeft: () => Y(-1),
136
+ ArrowRight: () => Y(1),
137
+ "+": () => R(1),
138
+ "=": () => R(1),
139
+ "-": () => R(-1),
140
+ _: () => R(-1),
141
+ 0: U,
142
+ r: ne,
143
+ R: ne
144
+ }[e.key];
145
+ n && (e.preventDefault(), n());
146
+ }
147
+ const le = (e) => {
148
+ const t = O.value?.getBoundingClientRect();
149
+ return { x: e.clientX - (t ? t.left + t.width / 2 : 0), y: e.clientY - (t ? t.top + t.height / 2 : 0) };
150
+ }, _ = /* @__PURE__ */ new Map();
151
+ let Z = !1, pe = 0, N = { x: 0, y: 0 }, j = null;
152
+ const fe = () => {
153
+ const [e, t] = [..._.values()];
154
+ return { x: (e.x + t.x) / 2, y: (e.y + t.y) / 2 };
155
+ }, ge = () => {
156
+ const [e, t] = [..._.values()];
157
+ return Math.hypot(e.x - t.x, e.y - t.y);
158
+ };
159
+ function Se(e) {
160
+ e.pointerType === "mouse" && e.button !== 0 || (O.value?.setPointerCapture?.(e.pointerId), _.set(e.pointerId, { x: e.clientX, y: e.clientY }), ie.value = !0, _.size === 1 ? (Z = !1, pe = Date.now(), N = { x: 0, y: 0 }) : Z = !0);
161
+ }
162
+ function Ie(e) {
163
+ const t = _.get(e.pointerId);
164
+ if (!t) return;
165
+ const n = { x: e.clientX, y: e.clientY };
166
+ if (_.size === 2) {
167
+ const [G, J] = [ge(), fe()];
168
+ _.set(e.pointerId, n);
169
+ const S = fe();
170
+ q(d.value * (ge() / (G || 1)), le({ clientX: S.x, clientY: S.y })), c.value = X({ x: c.value.x + S.x - J.x, y: c.value.y + S.y - J.y }, L.value, x.value, d.value);
171
+ return;
172
+ }
173
+ _.set(e.pointerId, n);
174
+ const f = { x: n.x - t.x, y: n.y - t.y };
175
+ N = { x: N.x + f.x, y: N.y + f.y }, !(!Z && Math.hypot(N.x, N.y) < Pt) && (Z = !0, A.value ? c.value = X({ x: c.value.x + f.x, y: c.value.y + f.y }, L.value, x.value, d.value) : b.value = (b.value + f.x) * (b.value + f.x < 0 && !ve.value || b.value + f.x > 0 && !he.value ? 0.6 : 1));
176
+ }
177
+ function we(e, t = !1) {
178
+ if (!_.delete(e.pointerId) || _.size > 0) return;
179
+ ie.value = !1;
180
+ const n = le(e);
181
+ if (!Z && !t) {
182
+ const S = j && Date.now() - j.at < Ct && Math.hypot(n.x - j.point.x, n.y - j.point.y) < 32;
183
+ j = S ? null : { at: Date.now(), point: n }, S && (A.value ? U() : q(2, n));
184
+ return;
185
+ }
186
+ const f = Date.now() - pe < 250 && Math.abs(b.value) > 30, G = Math.abs(b.value) > Math.max(50, x.value.width * 0.15), J = b.value;
187
+ b.value = 0, !t && !A.value && (G || f) && Y(J < 0 ? 1 : -1);
188
+ }
189
+ function Be(e) {
190
+ const t = e.deltaMode === 1 ? 16 : 1;
191
+ q(d.value * Math.exp(-e.deltaY * t * (e.ctrlKey ? 0.01 : 15e-4)), le(e));
192
+ }
193
+ const De = { width: 120, height: 80 }, y = g(() => de.value ? at(L.value, x.value, d.value, c.value, De) : null);
194
+ function xe(e) {
195
+ if (e.type === "pointermove" && e.buttons === 0) return;
196
+ const t = e.currentTarget.getBoundingClientRect();
197
+ t.width === 0 || t.height === 0 || (c.value = it({ x: (e.clientX - t.left) / t.width, y: (e.clientY - t.top) / t.height }, L.value, x.value, d.value));
198
+ }
199
+ const Ae = g(() => {
200
+ if (!y.value) return {};
201
+ const { width: e, height: t } = P.value % 2 === 0 ? y.value.image : { width: y.value.image.height, height: y.value.image.width };
202
+ return { width: `${e}px`, height: `${t}px`, marginLeft: `${-e / 2}px`, marginTop: `${-t / 2}px`, transform: `rotate(${P.value * 90}deg)` };
203
+ });
204
+ Ye(() => {
205
+ K.value && F();
206
+ });
207
+ const Re = g(() => i.title ?? u("core.viewer.label"));
208
+ return (e, t) => (h(), Ze(je, { to: "body" }, [
209
+ ae.value ? (h(), m("div", ot, [
210
+ C(Ee, {
211
+ appear: "",
212
+ "enter-active-class": "transition-opacity duration-motion-normal ease-motion-standard",
213
+ "enter-from-class": "opacity-0",
214
+ "leave-active-class": "pointer-events-none transition-opacity duration-motion-normal ease-motion-standard",
215
+ "leave-to-class": "opacity-0",
216
+ onAfterLeave: Pe
217
+ }, {
218
+ default: Ke(() => [
219
+ s(K) ? (h(), m("div", {
220
+ key: 0,
221
+ ref_key: "panel",
222
+ ref: T,
223
+ role: "dialog",
224
+ "aria-modal": "true",
225
+ "aria-label": Re.value,
226
+ tabindex: "-1",
227
+ "data-part": "panel",
228
+ "data-test": "photo-viewer",
229
+ class: "fixed inset-0 flex flex-col bg-[#0b1210] text-[#f1f5f3] outline-none",
230
+ onKeydown: Le
231
+ }, [
232
+ p("div", lt, [
233
+ p("h2", st, [
234
+ i.title ? (h(), m("span", rt, ee(i.title), 1)) : w("", !0),
235
+ i.title ? (h(), m("span", ut, " · ")) : w("", !0),
236
+ p("span", ct, ee(s(u)("core.viewer.counter", { current: o.value + 1, total: i.items.length })), 1)
237
+ ]),
238
+ t[6] || (t[6] = p("div", { class: "grow" }, null, -1)),
239
+ v.value && !s($) ? be(e.$slots, "actions", {
240
+ item: v.value,
241
+ index: o.value
242
+ }, void 0, void 0, 0) : w("", !0),
243
+ p("button", {
244
+ type: "button",
245
+ class: M([B, "compact:hidden"]),
246
+ "aria-label": s(u)("core.viewer.zoom_out"),
247
+ "aria-disabled": !A.value,
248
+ "data-test": "zoom-out",
249
+ onClick: t[0] || (t[0] = (n) => R(-1))
250
+ }, [
251
+ C(s(I), {
252
+ name: "zoomOut",
253
+ size: 18
254
+ })
255
+ ], 10, dt),
256
+ p("p", ht, ee(s(u)("core.viewer.zoom_percent", { percent: Ce.value })), 1),
257
+ p("button", {
258
+ type: "button",
259
+ class: M([B, "compact:hidden"]),
260
+ "aria-label": s(u)("core.viewer.zoom_in"),
261
+ "aria-disabled": d.value >= s(ue),
262
+ "data-test": "zoom-in",
263
+ onClick: t[1] || (t[1] = (n) => R(1))
264
+ }, [
265
+ C(s(I), {
266
+ name: "zoomIn",
267
+ size: 18
268
+ })
269
+ ], 10, vt),
270
+ p("button", {
271
+ type: "button",
272
+ class: M(B),
273
+ "aria-label": s(u)("core.viewer.rotate"),
274
+ "data-test": "rotate",
275
+ onClick: ne
276
+ }, [
277
+ C(s(I), {
278
+ name: "rotateCounterclockwise",
279
+ size: 18
280
+ })
281
+ ], 8, mt),
282
+ v.value ? (h(), m("a", {
283
+ key: 1,
284
+ href: v.value.src,
285
+ download: v.value.downloadName ?? "",
286
+ target: "_blank",
287
+ rel: "noopener",
288
+ class: M(B),
289
+ "aria-label": s(u)("core.viewer.download"),
290
+ "data-test": "download"
291
+ }, [
292
+ C(s(I), {
293
+ name: "download",
294
+ size: 18
295
+ })
296
+ ], 8, pt)) : w("", !0),
297
+ p("button", {
298
+ type: "button",
299
+ class: M([B, "bg-white/16"]),
300
+ "aria-label": s(u)("core.actions.close"),
301
+ "data-test": "close",
302
+ onClick: me
303
+ }, [
304
+ C(s(I), {
305
+ name: "close",
306
+ size: 18
307
+ })
308
+ ], 10, ft)
309
+ ]),
310
+ p("div", gt, [
311
+ i.items.length > 1 ? (h(), m("button", {
312
+ key: 0,
313
+ type: "button",
314
+ class: M([B, "size-12 compact:hidden"]),
315
+ "aria-label": s(u)("core.viewer.previous"),
316
+ "aria-disabled": !he.value,
317
+ "data-test": "previous",
318
+ onClick: t[2] || (t[2] = (n) => Y(-1))
319
+ }, [
320
+ C(s(I), {
321
+ name: "arrowLeftSLine",
322
+ size: 22
323
+ })
324
+ ], 10, wt)) : w("", !0),
325
+ p("div", {
326
+ ref_key: "stage",
327
+ ref: x,
328
+ "data-test": "photo-stage",
329
+ class: M(["relative h-full min-w-0 grow touch-none overflow-hidden rounded-md select-none", A.value ? "cursor-grab active:cursor-grabbing" : ""]),
330
+ onPointerdown: Se,
331
+ onPointermove: Ie,
332
+ onPointerup: t[3] || (t[3] = (n) => we(n)),
333
+ onPointercancel: t[4] || (t[4] = (n) => we(n, !0)),
334
+ onWheel: re(Be, ["prevent"])
335
+ }, [
336
+ v.value ? (h(), m("img", {
337
+ key: v.value.src,
338
+ ref: "image",
339
+ src: v.value.src,
340
+ alt: v.value.alt,
341
+ draggable: "false",
342
+ "data-test": "photo",
343
+ class: M(["absolute top-1/2 left-1/2 max-w-none", [de.value ? "" : "opacity-0", ie.value ? "" : "transition-transform duration-motion-normal ease-motion-standard", V.value === "back" ? "animate-step-back" : V.value === "forward" ? "animate-step-in" : ""]]),
344
+ style: te(Te.value),
345
+ onLoad: oe
346
+ }, null, 46, xt)) : w("", !0),
347
+ A.value && y.value ? (h(), m("div", {
348
+ key: 1,
349
+ "data-test": "mini-map",
350
+ class: "absolute right-3.5 bottom-3.5 overflow-hidden rounded-md bg-black/50 ring-1 ring-white/20",
351
+ style: te({ width: `${y.value.image.width}px`, height: `${y.value.image.height}px` }),
352
+ onPointerdown: re(xe, ["stop"]),
353
+ onPointermove: re(xe, ["stop"])
354
+ }, [
355
+ v.value ? (h(), m("img", {
356
+ key: 0,
357
+ src: v.value.thumb ?? v.value.src,
358
+ alt: "",
359
+ draggable: "false",
360
+ class: "pointer-events-none absolute top-1/2 left-1/2 max-w-none opacity-80",
361
+ style: te(Ae.value)
362
+ }, null, 12, yt)) : w("", !0),
363
+ p("span", {
364
+ class: "pointer-events-none absolute rounded-xs ring-2 ring-[#6ee7b7]",
365
+ "data-test": "mini-map-view",
366
+ style: te({ left: `${y.value.view.x}px`, top: `${y.value.view.y}px`, width: `${y.value.view.width}px`, height: `${y.value.view.height}px` })
367
+ }, null, 4)
368
+ ], 36)) : w("", !0)
369
+ ], 34),
370
+ i.items.length > 1 ? (h(), m("button", {
371
+ key: 1,
372
+ type: "button",
373
+ class: M([B, "size-12 compact:hidden"]),
374
+ "aria-label": s(u)("core.viewer.next"),
375
+ "aria-disabled": !ve.value,
376
+ "data-test": "next",
377
+ onClick: t[5] || (t[5] = (n) => Y(1))
378
+ }, [
379
+ C(s(I), {
380
+ name: "arrowRightSLine",
381
+ size: 22
382
+ })
383
+ ], 10, bt)) : w("", !0)
384
+ ]),
385
+ s($) && v.value && e.$slots.actions ? (h(), m("div", _t, [
386
+ be(e.$slots, "actions", {
387
+ item: v.value,
388
+ index: o.value
389
+ })
390
+ ])) : w("", !0),
391
+ i.items.length > 1 ? (h(), m("ul", {
392
+ key: 1,
393
+ ref_key: "strip",
394
+ ref: ce,
395
+ "data-test": "photo-strip",
396
+ class: "flex shrink-0 justify-start gap-2 overflow-x-auto px-4 pt-4 pb-[max(1.25rem,var(--app-safe-bottom))] scrollbar-hide md:justify-center md:px-4.5"
397
+ }, [
398
+ (h(!0), m(We, null, Ue(i.items, (n, f) => (h(), m("li", {
399
+ key: n.src,
400
+ class: "shrink-0"
401
+ }, [
402
+ p("button", {
403
+ type: "button",
404
+ "aria-label": n.alt,
405
+ "aria-current": f === o.value ? "true" : void 0,
406
+ "data-test": "thumbnail",
407
+ class: M(["block h-11 w-16 cursor-pointer overflow-hidden rounded-[5px] bg-[#2a3431] transition-opacity duration-motion-fast focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#6ee7b7]", f === o.value ? "ring-2 ring-[#6ee7b7]" : "opacity-60 hover:opacity-100"]),
408
+ onClick: (G) => {
409
+ V.value = f > o.value ? "forward" : "back", o.value = f;
410
+ }
411
+ }, [
412
+ p("img", {
413
+ src: n.thumb ?? n.src,
414
+ alt: "",
415
+ loading: "lazy",
416
+ draggable: "false",
417
+ class: "size-full object-cover"
418
+ }, null, 8, Mt)
419
+ ], 10, kt)
420
+ ]))), 128))
421
+ ], 512)) : (h(), m("div", zt)),
422
+ p("span", $t, ee(v.value?.alt), 1)
423
+ ], 40, nt)) : w("", !0)
424
+ ]),
425
+ _: 3
426
+ })
427
+ ])) : w("", !0)
428
+ ]));
429
+ }
430
+ });
431
+ export {
432
+ Bt as _
433
+ };
@@ -4,9 +4,9 @@ import { a as ge } from "./AdaptivePageShell.vue_vue_type_script_setup_true_lang
4
4
  import { u as L } from "./platform-q3cjODLx.js";
5
5
  import { _ as Q } from "./AsyncSection.vue_vue_type_script_setup_true_lang-Blj6KgCr.js";
6
6
  import { u as Y } from "./useLoad-M7V-AVwR.js";
7
- import { i as k, d as G } from "./index--CxZ33h0.js";
8
- import { u as Z } from "./FormErrors.vue_vue_type_script_setup_true_lang-4WQz-TYS.js";
9
- import { _ as ee } from "./FormView.vue_vue_type_script_setup_true_lang-CbvMRBOc.js";
7
+ import { i as k, d as G } from "./index-BmowiT1y.js";
8
+ import { u as Z } from "./FormErrors.vue_vue_type_script_setup_true_lang-DGOSc-PS.js";
9
+ import { _ as ee } from "./FormView.vue_vue_type_script_setup_true_lang-BUrYkjmF.js";
10
10
  import { _ as U } from "./TextField.vue_vue_type_script_setup_true_lang-CP2WeU36.js";
11
11
  import { _ as H } from "./Panel.vue_vue_type_script_setup_true_lang-BA0u_DtS.js";
12
12
  import { t as C } from "./toast-CqSDTWRX.js";
@@ -1,15 +1,15 @@
1
1
  import { defineComponent as I, computed as h, ref as M, openBlock as l, createElementBlock as v, createElementVNode as w, unref as t, Fragment as B, renderList as N, normalizeClass as K, toDisplayString as d, createVNode as V, withCtx as p, createTextVNode as y, createCommentVNode as $, createBlock as _, createSlots as X, watch as Y, mergeProps as F } from "vue";
2
2
  import { useI18n as Q } from "vue-i18n";
3
- import { u as Z } from "./FormErrors.vue_vue_type_script_setup_true_lang-4WQz-TYS.js";
3
+ import { u as Z } from "./FormErrors.vue_vue_type_script_setup_true_lang-DGOSc-PS.js";
4
4
  import { _ as W } from "./FormGroup.vue_vue_type_script_setup_true_lang-DSwSRsA5.js";
5
- import { _ as ee } from "./FormView.vue_vue_type_script_setup_true_lang-CbvMRBOc.js";
5
+ import { _ as ee } from "./FormView.vue_vue_type_script_setup_true_lang-BUrYkjmF.js";
6
6
  import { _ as te } from "./TextareaField.vue_vue_type_script_setup_true_lang-BJ4__cvJ.js";
7
7
  import { _ as se } from "./TextField.vue_vue_type_script_setup_true_lang-CP2WeU36.js";
8
8
  import { u as ae } from "./useSaveChrome-7huA3FzR.js";
9
9
  import { t as oe } from "./toast-CqSDTWRX.js";
10
10
  import { _ as S } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
11
11
  import { _ as E } from "./Banner.vue_vue_type_script_setup_true_lang-DSStj_5z.js";
12
- import { d as G, u as J, p as ne, o as R, r as D, g as H, s as le, e as re, a as ie, f as ce, b as ue, h as de } from "./index-Du3Ti2Zp.js";
12
+ import { d as G, u as J, p as ne, o as R, r as D, g as H, s as le, e as re, a as ie, f as ce, b as ue, h as de } from "./index-Yy28omu6.js";
13
13
  import { _ as me } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
14
14
  import { _ as fe } from "./Tabs.vue_vue_type_script_setup_true_lang-CcMcE38r.js";
15
15
  import { _ as pe } from "./SegmentedField.vue_vue_type_script_setup_true_lang-Dg-_ZjgR.js";
@@ -13,11 +13,11 @@ import { a as ae, u as le } from "./routeResource-DlTsGTg_.js";
13
13
  import { a as se } from "./ResourcePage.vue_vue_type_script_setup_true_lang-BFaaFQSm.js";
14
14
  import { _ as re } from "./AsyncSection.vue_vue_type_script_setup_true_lang-Blj6KgCr.js";
15
15
  import { _ as H } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
16
- import { u as O, a as U, f as ce, d as ne, b as M, c as T } from "./index-Du3Ti2Zp.js";
16
+ import { u as O, a as U, f as ce, d as ne, b as M, c as T } from "./index-Yy28omu6.js";
17
17
  import { _ as J } from "./SelectField.vue_vue_type_script_setup_true_lang-C3FbRQW7.js";
18
- import { u as ie, _ as ue } from "./useCommand-CT1RF_IB.js";
18
+ import { u as ie, _ as ue } from "./useCommand-Cj-APj-P.js";
19
19
  import { _ as me } from "./Modal.vue_vue_type_script_setup_true_lang-DpBb8ans.js";
20
- import { _ as pe } from "./RoleEditor.vue_vue_type_script_setup_true_lang-2fpYYCXj.js";
20
+ import { _ as pe } from "./RoleEditor.vue_vue_type_script_setup_true_lang-B6g2760V.js";
21
21
  const de = { "data-test": "role-replace" }, fe = /* @__PURE__ */ I({
22
22
  __name: "ReplaceRoleDialog",
23
23
  props: {
@@ -11,7 +11,7 @@ import { u as K } from "./platform-q3cjODLx.js";
11
11
  import { _ as T } from "./AsyncSection.vue_vue_type_script_setup_true_lang-Blj6KgCr.js";
12
12
  import { _ as q } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
13
13
  import { u as z } from "./useLoad-M7V-AVwR.js";
14
- import { u as G, a as H, b as J, c as x } from "./index-Du3Ti2Zp.js";
14
+ import { u as G, a as H, b as J, c as x } from "./index-Yy28omu6.js";
15
15
  const M = {
16
16
  class: "flex min-w-0 flex-col gap-group-gap",
17
17
  "data-test": "roles-index"
@@ -2,7 +2,7 @@ import { defineComponent as x, useTemplateRef as v, computed as w, ref as $, ope
2
2
  import { useI18n as N } from "vue-i18n";
3
3
  import { _ as q } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
4
4
  import { u as A } from "./describeError-B-NMa--w.js";
5
- import { P as D, b as L, e as O, i as g, d as T } from "./index--CxZ33h0.js";
5
+ import { P as D, b as L, e as O, i as g, d as T } from "./index-BmowiT1y.js";
6
6
  import { _ as k } from "./AlertDialog.vue_vue_type_script_setup_true_lang-whA4WLdl.js";
7
7
  import { t as b } from "./toast-CqSDTWRX.js";
8
8
  import { u as V } from "./platform-q3cjODLx.js";
@@ -10,12 +10,12 @@ import { _ as R } from "./FormGroup.vue_vue_type_script_setup_true_lang-DSwSRsA5
10
10
  import { e as G } from "./control-B4SdblL6.js";
11
11
  import { _ as Z } from "./SwitchField.vue_vue_type_script_setup_true_lang-ALvJisiP.js";
12
12
  import { _ as J } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
13
- import { u as K } from "./FormErrors.vue_vue_type_script_setup_true_lang-4WQz-TYS.js";
14
- import { _ as W } from "./FormView.vue_vue_type_script_setup_true_lang-CbvMRBOc.js";
13
+ import { u as K } from "./FormErrors.vue_vue_type_script_setup_true_lang-DGOSc-PS.js";
14
+ import { _ as W } from "./FormView.vue_vue_type_script_setup_true_lang-BUrYkjmF.js";
15
15
  import { _ as E } from "./TimeField.vue_vue_type_script_setup_true_lang-DBxKAWRo.js";
16
16
  import { a as k, n as X } from "./useTypedEntry-C7k7Dyl-.js";
17
17
  import { _ as Y } from "./PanelActions.vue_vue_type_script_setup_true_lang-E9VdIGkf.js";
18
- import { n as q } from "./index-DBTK_iMB.js";
18
+ import { n as q } from "./index-tnSTp0cM.js";
19
19
  import { u as ee } from "./platform-q3cjODLx.js";
20
20
  import { u as te } from "./useLoad-M7V-AVwR.js";
21
21
  function ne() {
@@ -6,7 +6,7 @@ import { u as D } from "./format-D8X4zsx6.js";
6
6
  import { _ as p } from "./FormGroup.vue_vue_type_script_setup_true_lang-DSwSRsA5.js";
7
7
  import { e as b } from "./control-B4SdblL6.js";
8
8
  import { u as U } from "./describeError-B-NMa--w.js";
9
- import { c as q, P as z, b as F, _ as L, i as O, d as T } from "./index--CxZ33h0.js";
9
+ import { c as q, P as z, b as F, _ as L, i as O, d as T } from "./index-BmowiT1y.js";
10
10
  import { t as h } from "./toast-CqSDTWRX.js";
11
11
  import { u as j, h as G } from "./platform-q3cjODLx.js";
12
12
  import { b as H } from "./routeResource-DlTsGTg_.js";
@@ -3,10 +3,10 @@ import { useI18n as x } from "vue-i18n";
3
3
  import { useRoute as y, useRouter as h } from "vue-router";
4
4
  import { _ as I } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
5
5
  import { _ as N } from "./Panel.vue_vue_type_script_setup_true_lang-BA0u_DtS.js";
6
- import { _ as S } from "./FormView.vue_vue_type_script_setup_true_lang-CbvMRBOc.js";
6
+ import { _ as S } from "./FormView.vue_vue_type_script_setup_true_lang-BUrYkjmF.js";
7
7
  import { _ as a } from "./TextField.vue_vue_type_script_setup_true_lang-CP2WeU36.js";
8
8
  import { r as $ } from "./guards-Dve61KjR.js";
9
- import { u as C, a as E } from "./index--CxZ33h0.js";
9
+ import { u as C, a as E } from "./index-BmowiT1y.js";
10
10
  const V = { class: "flex flex-1 flex-col items-center justify-center gap-8" }, k = { class: "text-xl font-semibold text-content-strong" }, H = /* @__PURE__ */ d({
11
11
  __name: "SignInPage",
12
12
  setup(q) {
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as g, ref as m, watch as p, openBlock as c, createElementBlock as v, createVNode as i, unref as e, withCtx as w, createBlock as x, createCommentVNode as y, createElementVNode as V, toDisplayString as $ } from "vue";
2
2
  import { useI18n as N } from "vue-i18n";
3
- import { P as S, i as b } from "./index--CxZ33h0.js";
3
+ import { P as S, i as b } from "./index-BmowiT1y.js";
4
4
  import { u as k } from "./platform-q3cjODLx.js";
5
5
  import { b as I } from "./routeResource-DlTsGTg_.js";
6
6
  import { _ as R } from "./AsyncSection.vue_vue_type_script_setup_true_lang-Blj6KgCr.js";
@@ -3,7 +3,7 @@ import { useI18n as A } from "vue-i18n";
3
3
  import { a as F } from "./neighbors-DVN_cADL.js";
4
4
  import { _ as H } from "./Avatar.vue_vue_type_script_setup_true_lang-CFIheaSr.js";
5
5
  import { u as J } from "./describeError-B-NMa--w.js";
6
- import { i as w, P as Q, p as W, f as X, M as Y, g as Z, d as ee } from "./index--CxZ33h0.js";
6
+ import { i as w, P as Q, p as W, f as X, M as Y, g as Z, d as ee } from "./index-BmowiT1y.js";
7
7
  import { _ as se } from "./AlertDialog.vue_vue_type_script_setup_true_lang-whA4WLdl.js";
8
8
  import { t as k } from "./toast-CqSDTWRX.js";
9
9
  import { _ as ae } from "./SectionNavigator.vue_vue_type_script_setup_true_lang-BltrQnrQ.js";
@@ -16,9 +16,9 @@ import { u as ie } from "./useLoad-M7V-AVwR.js";
16
16
  import { _ as V } from "./IconTile.vue_vue_type_script_setup_true_lang-_FXvaj93.js";
17
17
  import { _ as T } from "./FormGroup.vue_vue_type_script_setup_true_lang-DSwSRsA5.js";
18
18
  import { e as B } from "./control-B4SdblL6.js";
19
- import { u as z, _ as K } from "./useCommand-CT1RF_IB.js";
19
+ import { u as z, _ as K } from "./useCommand-Cj-APj-P.js";
20
20
  import { u as U } from "./fieldMessages-6HVzSDqG.js";
21
- import { u as ce, s as le } from "./status-QOGPjIHu.js";
21
+ import { u as ce, s as le } from "./status-Bh3-Cg7o.js";
22
22
  import { _ as M } from "./TextField.vue_vue_type_script_setup_true_lang-CP2WeU36.js";
23
23
  const ue = /* @__PURE__ */ R({
24
24
  __name: "DeactivateDialog",
@@ -6,14 +6,14 @@ import { _ as I } from "./Avatar.vue_vue_type_script_setup_true_lang-CFIheaSr.js
6
6
  import { u as F } from "./format-D8X4zsx6.js";
7
7
  import { u as L } from "./platform-q3cjODLx.js";
8
8
  import { _ as G } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
9
- import { i as K, f as E, M as W } from "./index--CxZ33h0.js";
10
- import { U as j, u as H, s as J } from "./status-QOGPjIHu.js";
9
+ import { i as K, f as E, M as W } from "./index-BmowiT1y.js";
10
+ import { U as j, u as H, s as J } from "./status-Bh3-Cg7o.js";
11
11
  import { u as O } from "./environment-Dva-SG8D.js";
12
12
  import { u as Q } from "./languages-BShG9LpE.js";
13
13
  import { _ as X } from "./FormGroup.vue_vue_type_script_setup_true_lang-DSwSRsA5.js";
14
14
  import { _ as Y } from "./SelectField.vue_vue_type_script_setup_true_lang-C3FbRQW7.js";
15
15
  import { _ as d } from "./TextField.vue_vue_type_script_setup_true_lang-CP2WeU36.js";
16
- import { u as Z, _ as ee } from "./useCommand-CT1RF_IB.js";
16
+ import { u as Z, _ as ee } from "./useCommand-Cj-APj-P.js";
17
17
  import { t as se } from "./toast-CqSDTWRX.js";
18
18
  import { u as te } from "./fieldMessages-6HVzSDqG.js";
19
19
  const oe = /* @__PURE__ */ U({
@@ -1,4 +1,4 @@
1
- import { _ as a, i as c, j as o, c as r, b as n, k as i, l as u, p as l, m as p, n as t, u as d, f as m } from "../index-Du3Ti2Zp.js";
1
+ import { _ as a, i as c, j as o, c as r, b as n, k as i, l as u, p as l, m as p, n as t, u as d, f as m } from "../index-Yy28omu6.js";
2
2
  export {
3
3
  a as BindingRow,
4
4
  c as PersonAccess,
@@ -13,6 +13,9 @@ import type { Form } from "./useForm";
13
13
  * instead of closing, opens the dialog again with fresh inputs (the command's defaults), so the next record can be entered
14
14
  * (the add-a-record recipe, `docs/recipes/forms.md`).
15
15
  *
16
+ * `:editable="false"` is the same dialog for someone who may only look: the fields read (like `FormGroup :editable="false"`), there is no
17
+ * primary action (nor `#actions`), the dismiss button says "Close", and closing never asks. Give the same body to both; do not write a second dialog.
18
+ *
16
19
  * A command with `ask` puts its question here, in an `AlertDialog` over the filled form, once the inputs check out: Cancel
17
20
  * returns to the form untouched and nothing is sent; the action runs the command, and a refusal then lands on the form like any other.
18
21
  */
@@ -24,6 +27,8 @@ type __VLS_Props = {
24
27
  subtitle?: string;
25
28
  /** What the primary action says: exactly what it does ("Assign"). */
26
29
  confirmLabel: string;
30
+ /** `false`: the record is shown, not edited: fields read, no primary action, "Close" instead of Cancel, no discard question. */
31
+ editable?: boolean;
27
32
  /** Disables the primary action while true (a proposal still loading). The inputs, Cancel and the leave guard work as before, and `run()` does nothing. */
28
33
  confirmDisabled?: boolean;
29
34
  /** What it says once done; by default "Saved". */
@@ -54,6 +59,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}
54
59
  message: string;
55
60
  size: "sm" | "md" | "lg";
56
61
  subtitle: string;
62
+ editable: boolean;
57
63
  fieldLabel: (field: string) => string;
58
64
  doneLabel: string;
59
65
  confirmDisabled: boolean;