mevebu 1.4.0 → 1.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.
@@ -130,7 +130,7 @@ function masthead() {
130
130
  el(
131
131
  "div",
132
132
  { class: "mx-[var(--margin)] flex h-[var(--bar)] items-center gap-[clamp(14px,3vw,32px)]" },
133
- el("a", { class: "inline-flex flex-none items-center gap-2.5 text-lg font-bold tracking-[-0.01em] text-ink no-underline", href: "#/" },
133
+ el("a", { class: "inline-flex min-h-11 flex-none items-center gap-2.5 text-lg font-bold tracking-[-0.01em] text-ink no-underline", href: "#/" },
134
134
  el("img", { class: "block size-[30px] rounded-[9px] shadow-[0_0_0_1px_var(--orbit)]", src: "./icon.png", alt: "", width: "30", height: "30" }), "mevebu"),
135
135
  nav,
136
136
  el("div", { class: "flex items-center gap-0.5 max-[45rem]:ms-auto" }, searchButton(), themeBtn, menuBtn)
@@ -259,12 +259,14 @@ function footer() {
259
259
  },
260
260
  });
261
261
 
262
- const FOOT_LINK = "text-sm text-ink-2 no-underline hover:text-jade";
262
+ // A finger needs 44px on a phone, so the whole list is a comfortable target
263
+ // there. The desktop row stays as it was, at text height.
264
+ const FOOT_LINK = "inline-flex items-center text-sm text-ink-2 no-underline hover:text-jade max-[45rem]:min-h-11";
263
265
  const group = (title, links) =>
264
266
  el(
265
267
  "div",
266
268
  {},
267
- el("h4", { class: "m-0 mb-2.5 text-2xs font-bold tracking-[0.08em] text-ink-3 uppercase" }, title),
269
+ el("h4", { class: "mb-2.5 text-2xs font-bold tracking-[0.08em] text-ink-3 uppercase" }, title),
268
270
  el("ul", { class: "m-0 grid list-none gap-1.5 p-0" }, ...links.map((link) => el("li", {}, link)))
269
271
  );
270
272
 
@@ -280,7 +282,7 @@ function footer() {
280
282
  el(
281
283
  "div",
282
284
  { class: "grid gap-1.5" },
283
- el("a", { class: "inline-flex items-center gap-[9px] text-md font-bold tracking-[-0.01em] text-ink no-underline", href: "#/" },
285
+ el("a", { class: "inline-flex min-h-11 items-center gap-[9px] text-md font-bold tracking-[-0.01em] text-ink no-underline", href: "#/" },
284
286
  el("img", { class: "block size-[34px] rounded-[11px] shadow-[0_0_0_1px_var(--orbit)]", src: "./icon.png", alt: "", width: "34", height: "34" }), "mevebu"),
285
287
  el("p", { class: "m-0 max-w-[30ch] text-sm leading-[1.5] text-ink-3" }, "Small tools that run in your browser. No accounts, no uploads, no tracking.")
286
288
  ),
@@ -315,7 +317,7 @@ function footer() {
315
317
  { class: "m-0 flex items-center gap-2" },
316
318
  el("button", {
317
319
  class:
318
- "inline-flex min-h-7 cursor-pointer items-center gap-1.5 rounded-full border border-orbit bg-transparent px-2.5 py-[3px] font-sans text-2xs tabular-nums text-ink-3 transition-colors duration-150 hover:border-orbit-hard hover:text-ink data-[new]:border-jade data-[new]:bg-jade-soft data-[new]:font-semibold data-[new]:text-jade data-[new]:hover:bg-jade data-[new]:hover:text-on-jade",
320
+ "inline-flex min-h-7 cursor-pointer items-center gap-1.5 rounded-full border border-orbit bg-transparent px-2.5 py-[3px] font-sans text-2xs tabular-nums text-ink-3 transition-colors duration-150 hover:border-orbit-hard hover:text-ink data-[new]:border-jade data-[new]:bg-jade-soft data-[new]:font-semibold data-[new]:text-jade data-[new]:hover:bg-jade data-[new]:hover:text-on-jade max-[45rem]:min-h-11",
319
321
  id: "version",
320
322
  type: "button",
321
323
  title: "Check for updates",
@@ -1558,6 +1558,9 @@
1558
1558
  .max-\[45rem\]\:inline-flex {
1559
1559
  display: inline-flex;
1560
1560
  }
1561
+ .max-\[45rem\]\:min-h-11 {
1562
+ min-height: calc(var(--spacing) * 11);
1563
+ }
1561
1564
  .max-\[45rem\]\:\[grid-template-columns\:minmax\(0\,1fr\)_62px\] {
1562
1565
  grid-template-columns: minmax(0,1fr) 62px;
1563
1566
  }
@@ -1579,6 +1582,18 @@
1579
1582
  }
1580
1583
  }
1581
1584
  @media (width >= 60rem) {
1585
+ .min-\[60rem\]\:sticky {
1586
+ position: sticky;
1587
+ }
1588
+ .min-\[60rem\]\:top-\[var\(--stick\)\] {
1589
+ top: var(--stick);
1590
+ }
1591
+ .min-\[60rem\]\:-mx-1 {
1592
+ margin-inline: calc(var(--spacing) * -1);
1593
+ }
1594
+ .min-\[60rem\]\:max-h-\[var\(--stick-max\)\] {
1595
+ max-height: var(--stick-max);
1596
+ }
1582
1597
  .min-\[60rem\]\:grid-cols-\[minmax\(0\,1fr\)_auto\] {
1583
1598
  grid-template-columns: minmax(0,1fr) auto;
1584
1599
  }
@@ -1588,6 +1603,15 @@
1588
1603
  .min-\[60rem\]\:gap-6 {
1589
1604
  gap: calc(var(--spacing) * 6);
1590
1605
  }
1606
+ .min-\[60rem\]\:overflow-y-auto {
1607
+ overflow-y: auto;
1608
+ }
1609
+ .min-\[60rem\]\:overscroll-contain {
1610
+ overscroll-behavior: contain;
1611
+ }
1612
+ .min-\[60rem\]\:px-1 {
1613
+ padding-inline: var(--spacing);
1614
+ }
1591
1615
  }
1592
1616
  @media (width >= 64rem) {
1593
1617
  .lg\:grid-cols-3 {
@@ -1955,6 +1979,8 @@
1955
1979
  --ctl: 40px;
1956
1980
  --card-pad: clamp(20px, 3vw, 32px);
1957
1981
  --band-pad: clamp(12px, 2vw, 16px);
1982
+ --stick: calc(var(--bar) + 1rem);
1983
+ --stick-max: calc(100dvh - var(--bar) - 3rem);
1958
1984
  --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
1959
1985
  --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
1960
1986
  --t: 150ms;
@@ -75,6 +75,12 @@
75
75
  --card-pad: clamp(20px, 3vw, 32px);
76
76
  --band-pad: clamp(12px, 2vw, 16px);
77
77
 
78
+ /* Where a short controls column pins while a long result scrolls past it:
79
+ just under the header, and never taller than the room left below it, so the
80
+ bottom of a long form stays reachable instead of being pushed off screen. */
81
+ --stick: calc(var(--bar) + 1rem);
82
+ --stick-max: calc(100dvh - var(--bar) - 3rem);
83
+
78
84
  --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
79
85
  --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
80
86
 
@@ -280,7 +280,7 @@ export function openPalette({ onPick } = {}) {
280
280
  autocomplete: "off",
281
281
  spellcheck: "false",
282
282
  });
283
- const list = el("ul", { class: "m-0 mt-1.5 max-h-[min(60vh,360px)] overflow-y-auto px-2 pb-2", role: "listbox" });
283
+ const list = el("ul", { class: "mt-1.5 max-h-[min(60vh,360px)] overflow-y-auto px-2 pb-2", role: "listbox" });
284
284
  const count = el("p", { class: "m-0 px-[18px] pt-2 text-2xs text-ink-3" });
285
285
  const footer = el(
286
286
  "p",
@@ -415,12 +415,21 @@ export function debounce(fn, ms = 120) {
415
415
 
416
416
  // ---------- bench layout ----------
417
417
 
418
- /** Two column bench: controls on the left, the result on the right. */
418
+ /** Two column bench: controls on the left, the result on the right.
419
+ * Above 60rem the controls pin under the header, so a long result can be read
420
+ * and scrolled without the controls leaving the screen. The cap keeps the
421
+ * bottom of a tall form reachable instead of pinning it out of view.
422
+ * The negative margin plus the matching padding give the focus halo room to
423
+ * paint: a scroll container clips its children's ink, and the fields sit flush
424
+ * with the column edges, so without the 4px gutter every ring loses its sides.
425
+ * The pair cancels out, so the fields keep their width and stay on the anchor line. */
419
426
  export function bench(side, main) {
427
+ const sideColumn =
428
+ "min-w-0 min-[60rem]:sticky min-[60rem]:top-[var(--stick)] min-[60rem]:max-h-[var(--stick-max)] min-[60rem]:overflow-y-auto min-[60rem]:overscroll-contain min-[60rem]:-mx-1 min-[60rem]:px-1";
420
429
  return el(
421
430
  "div",
422
431
  { class: "grid items-start gap-5 min-[60rem]:grid-cols-[minmax(0,21rem)_minmax(0,1fr)] min-[60rem]:gap-6" },
423
- el("div", { class: "min-w-0" }, side),
432
+ el("div", { class: sideColumn }, side),
424
433
  el("div", { class: "min-w-0" }, main)
425
434
  );
426
435
  }
@@ -733,7 +742,7 @@ export function blank(iconName, text) {
733
742
  // ---------- version ----------
734
743
 
735
744
  // Kept in one place. The CLI reads the same value from package.json.
736
- export const VERSION = "1.4.0";
745
+ export const VERSION = "1.4.2";
737
746
  export const PACKAGE_NAME = "mevebu";
738
747
  export const REPO_SLUG = "mevebu/mevebu";
739
748
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mevebu",
3
- "version": "1.4.0",
3
+ "version": "1.4.2",
4
4
  "description": "Small tools that run in your browser. No accounts, no uploads, no tracking.",
5
5
  "license": "MIT",
6
6
  "type": "module",