@synopackageland/ui 0.20.16 → 0.20.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.20.17 (2026-11-06)
6
+
7
+ - On a touch screen, a control at the end edge of its own component no longer makes an App's page scroll sideways. A dismissible `Callout` stretched to full width in an App's own vertical scroller (not inside a `PageContent`) had its close button's 44px tap box reach 2px past the scroller (12px for an inline Callout) at 390px, so the scroller was wider than its view and a sideways drag moved the page. The shared tap box (hit-area.css) now takes `--ui-hit-end-room`, the room between a control and its component's end edge: the box stops at that edge and grows towards the control's start side instead, still 44px, and nothing is drawn differently. The Callout close button, a `Tag`'s remove button, the `SearchField` clear button, the password reveal button, the `PathDisplay` copy button and the `Notification` close button set it. A Tag's remove button drops its own extra 32px tap box, which the shared 44px box already covered. `FileThumbs` and `RichTextEditor` image thumbnails stop the tap box of the last item and its remove button at the row's end edge (the last `FileThumbs` item's box is 34px wide instead of 42px, its remove badge's 30px), and removable `FileThumbs` keep 6px at the end so the remove badge no longer sticks out of the row; the `InputSteppers` presets button's tap box stops at the field's edge and keeps its 32px by reaching further towards the text. Dialog, Drawer (`Sheet`), Toast, RecordPanel and AsidePanel close buttons already fit inside their headers and are unchanged (docs/mobile-native.md, "Hit area")
8
+
5
9
  ## 0.20.16 (2026-11-06)
6
10
 
7
11
  - Dialog, Drawer (`Sheet`, left and right) and `BottomSheet` now really give focus back to their opener on close. Since 0.20.15 they called `focus()` while the closing panel still held the page behind it: inside an `AppRoot` the background stays `inert` until the leave animation ends, so in a browser a `BottomSheet`, and every Dialog on a phone, left focus on `<body>`. Focus now moves once the panel has left the page and the opener is no longer inert, checked frame by frame for up to 120 frames, and only lands if `document.activeElement` is the opener. Focus the user has moved elsewhere in the meantime stays there, reopening the overlay cancels it, and a `closeAutoFocus` listener that prevents the default still places focus itself
package/dist/cli.js CHANGED
File without changes
package/dist/index.js CHANGED
@@ -3234,7 +3234,7 @@ const sw = ["value", "type", "name", "placeholder", "disabled", "readonly"], uw
3234
3234
  disabled: r(n),
3235
3235
  "aria-label": u.value ? r(i)("Hide password") : r(i)("Show password"),
3236
3236
  "aria-pressed": u.value,
3237
- class: "absolute right-1 flex size-6 items-center justify-center rounded-[var(--ui-radius-sm)] border-0 bg-transparent p-0 text-[var(--ui-text-secondary)] outline-none hover:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_2px_var(--ui-focus-ring)] disabled:opacity-40",
3237
+ class: "absolute right-1 flex size-6 [--ui-hit-end-room:4px] items-center justify-center rounded-[var(--ui-radius-sm)] border-0 bg-transparent p-0 text-[var(--ui-text-secondary)] outline-none hover:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_2px_var(--ui-focus-ring)] disabled:opacity-40",
3238
3238
  onClick: C[1] || (C[1] = (_) => u.value = !u.value)
3239
3239
  }, [
3240
3240
  u.value ? (d(), A(r(Ey), {
@@ -22775,7 +22775,7 @@ const qA = ["disabled", "aria-label"], FA = { class: "relative min-w-0 flex-1" }
22775
22775
  default: S(() => [
22776
22776
  R("button", {
22777
22777
  type: "button",
22778
- class: "absolute top-1/2 right-0.5 flex size-5 [@media(pointer:coarse)]:after:absolute [@media(pointer:coarse)]:after:-inset-1.5 [@media(pointer:coarse)]:after:content-[''] -translate-y-1/2 items-center justify-center rounded-[var(--ui-radius-sm)] text-[var(--ui-text-muted)] outline-none hover:bg-[var(--ui-surface-hover)] hover:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_2px_var(--ui-focus-ring)] disabled:opacity-40",
22778
+ class: "absolute top-1/2 right-0.5 flex size-5 [@media(pointer:coarse)]:after:absolute [@media(pointer:coarse)]:after:-inset-1.5 [@media(pointer:coarse)]:after:-end-0.5 [@media(pointer:coarse)]:after:-start-2.5 [@media(pointer:coarse)]:after:content-[''] -translate-y-1/2 items-center justify-center rounded-[var(--ui-radius-sm)] text-[var(--ui-text-muted)] outline-none hover:bg-[var(--ui-surface-hover)] hover:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_2px_var(--ui-focus-ring)] disabled:opacity-40",
22779
22779
  disabled: r(o),
22780
22780
  "aria-expanded": x.value,
22781
22781
  "aria-label": Z.value.presets
@@ -30137,7 +30137,7 @@ const nU = /* @__PURE__ */ Ed(ZB, [["render", QB]]), oU = /* @__PURE__ */ U({
30137
30137
  type: "button",
30138
30138
  disabled: e.disabled,
30139
30139
  "aria-label": `${r(o).removeLabel} ${e.label}`,
30140
- class: "relative -mr-0.5 ml-0.5 inline-flex size-4 shrink-0 items-center justify-center rounded-[var(--ui-radius-sm)] text-[var(--ui-text-secondary)] opacity-60 outline-none hover:opacity-100 focus-visible:shadow-[var(--ui-shadow-focus)] disabled:opacity-40 [@media(pointer:coarse)]:after:absolute [@media(pointer:coarse)]:after:-inset-2 [@media(pointer:coarse)]:after:content-['']",
30140
+ class: "relative -mr-0.5 ml-0.5 inline-flex size-4 shrink-0 items-center justify-center rounded-[var(--ui-radius-sm)] text-[var(--ui-text-secondary)] opacity-60 outline-none hover:opacity-100 focus-visible:shadow-[var(--ui-shadow-focus)] disabled:opacity-40 [--ui-hit-end-room:5px]",
30141
30141
  "data-tag-remove": "",
30142
30142
  onClick: Le(P, ["stop"])
30143
30143
  }, [
@@ -31560,7 +31560,7 @@ const tM = ["aria-label", "aria-labelledby", "data-ui-segment-control", "data-ov
31560
31560
  disabled: r(n),
31561
31561
  type: "button",
31562
31562
  "aria-label": r(o).clearLabel,
31563
- class: "absolute top-1/2 right-1.5 flex size-6 border-0 bg-transparent -translate-y-1/2 items-center justify-center rounded-[var(--ui-radius-control)] text-[var(--ui-text-muted)] hover:bg-[var(--ui-surface-hover)] hover:text-[var(--ui-text)] outline-none focus-visible:shadow-[var(--ui-shadow-focus)] disabled:opacity-50",
31563
+ class: "absolute top-1/2 right-1.5 flex size-6 [--ui-hit-end-room:6px] border-0 bg-transparent -translate-y-1/2 items-center justify-center rounded-[var(--ui-radius-control)] text-[var(--ui-text-muted)] hover:bg-[var(--ui-surface-hover)] hover:text-[var(--ui-text)] outline-none focus-visible:shadow-[var(--ui-shadow-focus)] disabled:opacity-50",
31564
31564
  onClick: p[1] || (p[1] = (v) => {
31565
31565
  r(u)(""), i("update:modelValue", "");
31566
31566
  })
@@ -35516,7 +35516,7 @@ const bq = { class: "flex min-h-14 shrink-0 items-center gap-3 px-3 pt-[env(safe
35516
35516
  const p = (g) => Og(g) && g.thumb && (g.state ?? "ready") === "ready" && !c.value.has(g.id), v = h(() => t.size === "sm" ? "size-7 rounded-[var(--ui-radius-sm)]" : "size-16 rounded-[var(--ui-radius-md)]"), m = (g) => g.state === "processing" ? `${g.name}, ${o("Processing")}` : g.state === "missing" ? `${g.name}, ${o("File is missing")}` : g.state === "failed" ? `${g.name}, ${o("Can't show this file")}` : g.name;
35517
35517
  return (g, w) => e.items.length ? (d(), y("div", {
35518
35518
  key: 0,
35519
- class: "flex min-w-0 flex-wrap items-center gap-1",
35519
+ class: ne(["flex min-w-0 flex-wrap items-center gap-1 [&>:last-child]:after:end-0 [&>:last-child>button]:after:end-0", e.removable && "pe-1.5"]),
35520
35520
  "data-size": e.size,
35521
35521
  "data-ui-file-thumbs": "",
35522
35522
  "data-syno-pkg-land-ui": ""
@@ -35597,7 +35597,7 @@ const bq = { class: "flex min-h-14 shrink-0 items-center gap-3 px-3 pt-[env(safe
35597
35597
  "onUpdate:index": w[2] || (w[2] = (x) => u.value = x),
35598
35598
  items: e.items
35599
35599
  }, null, 8, ["open", "index", "items"])) : O("", !0)
35600
- ], 8, aF)) : O("", !0);
35600
+ ], 10, aF)) : O("", !0);
35601
35601
  }
35602
35602
  }), lF = ["aria-label"], sF = { class: "flex min-h-11 items-center gap-1 border-b border-[var(--ui-border-subtle)] ps-3 pe-1.5" }, uF = {
35603
35603
  class: "min-w-0 flex-1 font-semibold",
@@ -38152,9 +38152,9 @@ const UV = ["aria-label", "multiple", "accept", "disabled", "webkitdirectory"],
38152
38152
  type: "button",
38153
38153
  "data-ui-path-copy": "",
38154
38154
  "data-ui-hit": "",
38155
+ class: ne([e.display === "name" ? "[--ui-hit-end-room:0px]" : "[--ui-hit-end-room:5px]", "relative flex size-5 shrink-0 items-center justify-center rounded-[var(--ui-radius-sm)] border-0 bg-transparent p-0 text-[var(--ui-text-secondary)] outline-none transition-colors duration-[var(--ui-motion-fast)] hover:bg-[var(--ui-control-bg-active)] hover:text-[var(--ui-text)] focus-visible:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_2px_var(--ui-focus-ring)]"]),
38155
38156
  "aria-label": i.value ? r(o)("Copied") : r(o)("Copy path"),
38156
38157
  title: i.value ? r(o)("Copied") : r(o)("Copy path"),
38157
- class: "relative flex size-5 shrink-0 items-center justify-center rounded-[var(--ui-radius-sm)] border-0 bg-transparent p-0 text-[var(--ui-text-secondary)] outline-none transition-colors duration-[var(--ui-motion-fast)] hover:bg-[var(--ui-control-bg-active)] hover:text-[var(--ui-text)] focus-visible:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_2px_var(--ui-focus-ring)]",
38158
38158
  onClick: f
38159
38159
  }, [
38160
38160
  i.value ? (d(), A(r(bt), {
@@ -38166,7 +38166,7 @@ const UV = ["aria-label", "multiple", "accept", "disabled", "webkitdirectory"],
38166
38166
  class: "size-3.5",
38167
38167
  "aria-hidden": "true"
38168
38168
  }))
38169
- ], 8, vN)) : O("", !0),
38169
+ ], 10, vN)) : O("", !0),
38170
38170
  T(p.$slots, "actions"),
38171
38171
  s ? (d(), A(Ha, {
38172
38172
  key: 3,
@@ -39451,7 +39451,7 @@ const PN = { class: "mb-3 flex flex-wrap items-start justify-between gap-3" }, D
39451
39451
  R("button", {
39452
39452
  type: "button",
39453
39453
  "data-ui-hit": "",
39454
- class: "-mr-2 -mt-2 flex size-8 shrink-0 items-center justify-center rounded-[var(--ui-radius-sm)] text-[var(--ui-text-secondary)] outline-none hover:bg-[var(--ui-surface-hover)] hover:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_3px_var(--ui-focus-ring)]",
39454
+ class: "-mr-2 -mt-2 flex size-8 [--ui-hit-end-room:5px] shrink-0 items-center justify-center rounded-[var(--ui-radius-sm)] text-[var(--ui-text-secondary)] outline-none hover:bg-[var(--ui-surface-hover)] hover:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_3px_var(--ui-focus-ring)]",
39455
39455
  "aria-label": r(o).closeLabel,
39456
39456
  onClick: V[2] || (V[2] = (X) => i("close"))
39457
39457
  }, [
@@ -15126,7 +15126,7 @@ const gO = {
15126
15126
  disabled: d(o),
15127
15127
  "aria-label": l.value ? d(a)("Hide password") : d(a)("Show password"),
15128
15128
  "aria-pressed": l.value,
15129
- class: "absolute right-1 flex size-6 items-center justify-center rounded-[var(--ui-radius-sm)] border-0 bg-transparent p-0 text-[var(--ui-text-secondary)] outline-none hover:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_2px_var(--ui-focus-ring)] disabled:opacity-40",
15129
+ class: "absolute right-1 flex size-6 [--ui-hit-end-room:4px] items-center justify-center rounded-[var(--ui-radius-sm)] border-0 bg-transparent p-0 text-[var(--ui-text-secondary)] outline-none hover:text-[var(--ui-text)] focus-visible:shadow-[0_0_0_2px_var(--ui-focus-ring)] disabled:opacity-40",
15130
15130
  onClick: E[1] || (E[1] = (b) => l.value = !l.value)
15131
15131
  }, [
15132
15132
  l.value ? (g(), L(d(QP), {
@@ -29562,7 +29562,7 @@ const _z = ["aria-label", "aria-labelledby", "data-ui-segment-control", "data-ov
29562
29562
  disabled: d(o),
29563
29563
  type: "button",
29564
29564
  "aria-label": d(r).clearLabel,
29565
- class: "absolute top-1/2 right-1.5 flex size-6 border-0 bg-transparent -translate-y-1/2 items-center justify-center rounded-[var(--ui-radius-control)] text-[var(--ui-text-muted)] hover:bg-[var(--ui-surface-hover)] hover:text-[var(--ui-text)] outline-none focus-visible:shadow-[var(--ui-shadow-focus)] disabled:opacity-50",
29565
+ class: "absolute top-1/2 right-1.5 flex size-6 [--ui-hit-end-room:6px] border-0 bg-transparent -translate-y-1/2 items-center justify-center rounded-[var(--ui-radius-control)] text-[var(--ui-text-muted)] hover:bg-[var(--ui-surface-hover)] hover:text-[var(--ui-text)] outline-none focus-visible:shadow-[var(--ui-shadow-focus)] disabled:opacity-50",
29566
29566
  onClick: f[1] || (f[1] = (p) => {
29567
29567
  d(l)(""), a("update:modelValue", "");
29568
29568
  })
@@ -3,7 +3,7 @@
3
3
  "version": "2.11.0",
4
4
  "delivery": "bundled-patched-esm",
5
5
  "patchManifestSha256": "9c5b9c9a162fa584b4695a683368a4484b3ac6e70177fd063b77aa618c051627",
6
- "bundleSha256": "eb613b4d73779b8477f413cf3f4d5f1395d35804296c78dc500921fb9f03cc91",
6
+ "bundleSha256": "f1f30ec0f83f82d46859ca387063cec5501a14c637c171d7577a55b97ee51fdb",
7
7
  "sourceHashes": {
8
8
  "shared/useBodyScrollLock.js": "287bfb604318c4202769e4b5191896eaf0e52a952e1de898967cbe09467fcfda",
9
9
  "DismissableLayer/DismissableLayer.js": "3c8d248f0a32e01f89ca1f6202b1bb691bf5d0e4012a92535e161c35e69cdc32",
package/dist/rich-text.js CHANGED
@@ -828,7 +828,7 @@ const La = ["data-variant", "data-over"], Sa = ["aria-label"], Aa = ["aria-label
828
828
  }, 8, ["editor"])) : C("", !0),
829
829
  s.value && c.value.length ? (p(), y("ul", {
830
830
  key: 3,
831
- class: "m-0 flex list-none flex-wrap gap-2 px-2.5 pb-2 pt-0.5",
831
+ class: "m-0 flex list-none flex-wrap gap-2 px-2.5 pb-2 pt-0.5 [&>:last-child>button]:after:-end-1",
832
832
  "aria-label": l(n)("Images"),
833
833
  "data-ui-rich-attachments": ""
834
834
  }, [