vintage-frames 0.5.5 → 0.5.6

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.
@@ -17285,10 +17285,46 @@
17285
17285
  "text": "boolean"
17286
17286
  },
17287
17287
  "default": "false",
17288
- "description": "Show a grow box at the bottom-right corner for resizing.",
17288
+ "description": "Show a grow box at the bottom-right corner for resizing. The drag is\nbounded per axis by the sizeRect below.",
17289
17289
  "attribute": "resizable",
17290
17290
  "reflects": true
17291
17291
  },
17292
+ {
17293
+ "kind": "field",
17294
+ "name": "minWidth",
17295
+ "type": {
17296
+ "text": "number | null | undefined"
17297
+ },
17298
+ "description": "The sizeRect: the range of sizes the grow box can drag the window to,\nper axis, in whole system px — GrowWindow's, where the app stated the\nrectangle and the Window Manager clamped the drag to it. `minWidth` and\n`minHeight` default to the 80×54 floor a window can still be worked at;\nthe maxes are unbounded. A min equal to its max locks that axis —\n`min-height=\"67\" max-height=\"67\"` on a strip that scrolls sideways and\nnever grows taller, so the grow box changes the width alone.\n\nBounds the gesture only: an authored `width`/`height` outside the rect\nrenders as declared, and the first grow-box move brings it inside. The\nclamp runs after the drag's lattice snap, so a bound lands exactly the\nway an authored size does, even off the lattice (an odd height at 2×);\nwhere a min and max cross, the max wins, so a window held under the\nfloor stays put instead of jumping to it.",
17299
+ "attribute": "min-width"
17300
+ },
17301
+ {
17302
+ "kind": "field",
17303
+ "name": "minHeight",
17304
+ "type": {
17305
+ "text": "number | null | undefined"
17306
+ },
17307
+ "description": "See minWidth. Default 54.",
17308
+ "attribute": "min-height"
17309
+ },
17310
+ {
17311
+ "kind": "field",
17312
+ "name": "maxWidth",
17313
+ "type": {
17314
+ "text": "number | null | undefined"
17315
+ },
17316
+ "description": "See minWidth. Unbounded by default.",
17317
+ "attribute": "max-width"
17318
+ },
17319
+ {
17320
+ "kind": "field",
17321
+ "name": "maxHeight",
17322
+ "type": {
17323
+ "text": "number | null | undefined"
17324
+ },
17325
+ "description": "See minWidth. Unbounded by default.",
17326
+ "attribute": "max-height"
17327
+ },
17292
17328
  {
17293
17329
  "kind": "field",
17294
17330
  "name": "flush",
@@ -17667,9 +17703,41 @@
17667
17703
  "text": "boolean"
17668
17704
  },
17669
17705
  "default": "false",
17670
- "description": "Show a grow box at the bottom-right corner for resizing.",
17706
+ "description": "Show a grow box at the bottom-right corner for resizing. The drag is\nbounded per axis by the sizeRect below.",
17671
17707
  "fieldName": "resizable"
17672
17708
  },
17709
+ {
17710
+ "name": "min-width",
17711
+ "type": {
17712
+ "text": "number | null | undefined"
17713
+ },
17714
+ "description": "The sizeRect: the range of sizes the grow box can drag the window to,\nper axis, in whole system px — GrowWindow's, where the app stated the\nrectangle and the Window Manager clamped the drag to it. `minWidth` and\n`minHeight` default to the 80×54 floor a window can still be worked at;\nthe maxes are unbounded. A min equal to its max locks that axis —\n`min-height=\"67\" max-height=\"67\"` on a strip that scrolls sideways and\nnever grows taller, so the grow box changes the width alone.\n\nBounds the gesture only: an authored `width`/`height` outside the rect\nrenders as declared, and the first grow-box move brings it inside. The\nclamp runs after the drag's lattice snap, so a bound lands exactly the\nway an authored size does, even off the lattice (an odd height at 2×);\nwhere a min and max cross, the max wins, so a window held under the\nfloor stays put instead of jumping to it.",
17715
+ "fieldName": "minWidth"
17716
+ },
17717
+ {
17718
+ "name": "min-height",
17719
+ "type": {
17720
+ "text": "number | null | undefined"
17721
+ },
17722
+ "description": "See minWidth. Default 54.",
17723
+ "fieldName": "minHeight"
17724
+ },
17725
+ {
17726
+ "name": "max-width",
17727
+ "type": {
17728
+ "text": "number | null | undefined"
17729
+ },
17730
+ "description": "See minWidth. Unbounded by default.",
17731
+ "fieldName": "maxWidth"
17732
+ },
17733
+ {
17734
+ "name": "max-height",
17735
+ "type": {
17736
+ "text": "number | null | undefined"
17737
+ },
17738
+ "description": "See minWidth. Unbounded by default.",
17739
+ "fieldName": "maxHeight"
17740
+ },
17673
17741
  {
17674
17742
  "name": "flush",
17675
17743
  "type": {
@@ -92,8 +92,34 @@ export declare class VfWindow extends VfWindow_base {
92
92
  zoomable: boolean;
93
93
  /** Allow dragging the window by its title bar. */
94
94
  movable: boolean;
95
- /** Show a grow box at the bottom-right corner for resizing. */
95
+ /**
96
+ * Show a grow box at the bottom-right corner for resizing. The drag is
97
+ * bounded per axis by the sizeRect below.
98
+ */
96
99
  resizable: boolean;
100
+ /**
101
+ * The sizeRect: the range of sizes the grow box can drag the window to,
102
+ * per axis, in whole system px — GrowWindow's, where the app stated the
103
+ * rectangle and the Window Manager clamped the drag to it. `minWidth` and
104
+ * `minHeight` default to the 80×54 floor a window can still be worked at;
105
+ * the maxes are unbounded. A min equal to its max locks that axis —
106
+ * `min-height="67" max-height="67"` on a strip that scrolls sideways and
107
+ * never grows taller, so the grow box changes the width alone.
108
+ *
109
+ * Bounds the gesture only: an authored `width`/`height` outside the rect
110
+ * renders as declared, and the first grow-box move brings it inside. The
111
+ * clamp runs after the drag's lattice snap, so a bound lands exactly the
112
+ * way an authored size does, even off the lattice (an odd height at 2×);
113
+ * where a min and max cross, the max wins, so a window held under the
114
+ * floor stays put instead of jumping to it.
115
+ */
116
+ minWidth?: number | null;
117
+ /** See {@link minWidth}. Default 54. */
118
+ minHeight?: number | null;
119
+ /** See {@link minWidth}. Unbounded by default. */
120
+ maxWidth?: number | null;
121
+ /** See {@link minWidth}. Unbounded by default. */
122
+ maxHeight?: number | null;
97
123
  /**
98
124
  * Remove the default 12px body padding. Under `scrollbars` the body has
99
125
  * none to remove, so the flag reaches the built-in scroll area instead
@@ -18,13 +18,18 @@ import "./vf-scroll-area.js";
18
18
  import { LitElement as N, css as P, html as F, nothing as I } from "lit";
19
19
  import { property as L, state as R } from "lit/decorators.js";
20
20
  //#region src/components/vf-window.ts
21
- var z = 80, B = 54, V = 24, H = 8, U = class extends E(c(N)) {
21
+ var z = 80, B = 54;
22
+ function V(e, t, n) {
23
+ let r = Math.max(t, e);
24
+ return n == null ? r : Math.min(n, r);
25
+ }
26
+ var H = 24, U = 8, W = class extends E(c(N)) {
22
27
  constructor(...e) {
23
28
  super(...e), this.heading = "", this.active = !0, this.closable = !0, this.zoomable = !1, this.movable = !1, this.resizable = !1, this.flush = !1, this._hasStatus = !1, this.scale = new n(this), this.gridSnap = new T(this), this.titleCenter = new O(this), this._dotsPattern = "", this.#e = new x(), this.#t = (e, t, n) => {
24
29
  let r = a(this.offsetWidth, this);
25
30
  return {
26
- x: Math.min(Math.max(e, V - r), n.width - V),
27
- y: Math.min(Math.max(t, 0), Math.max(0, n.height - V))
31
+ x: Math.min(Math.max(e, H - r), n.width - H),
32
+ y: Math.min(Math.max(t, 0), Math.max(0, n.height - H))
28
33
  };
29
34
  }, this._placement = new s(this, (e, t, n) => this.#t(e, t, n)), this._drag = new D(this, {
30
35
  onDragStart: (e) => !this.movable || e.button !== 0 || e.composedPath().some((e) => e instanceof HTMLElement && e.classList.contains("box")) ? null : (this.#i(), this._placement.seed()),
@@ -295,7 +300,7 @@ var z = 80, B = 54, V = 24, H = 8, U = class extends E(c(N)) {
295
300
  rows: 1,
296
301
  tile: p
297
302
  });
298
- let t = Math.ceil((e + d) / p) * p, n = H + d;
303
+ let t = Math.ceil((e + d) / p) * p, n = U + d;
299
304
  return F`<div
300
305
  class="vf-tile-raster"
301
306
  style="width:${i(t)};height:${i(n)};background-image:${this.#e.for(d, d, f, t, n)}"
@@ -350,7 +355,7 @@ var z = 80, B = 54, V = 24, H = 8, U = class extends E(c(N)) {
350
355
  _onGrowPointerMove(e) {
351
356
  let t = this._resizeState;
352
357
  if (!t || e.pointerId !== t.pointerId) return;
353
- let n = r(Math.max(z, t.baseWidth + a(e.clientX - t.startX, this)), this), i = r(Math.max(B, t.baseHeight + a(e.clientY - t.startY, this)), this);
358
+ let n = V(r(t.baseWidth + a(e.clientX - t.startX, this), this), this.minWidth ?? z, this.maxWidth), i = V(r(t.baseHeight + a(e.clientY - t.startY, this), this), this.minHeight ?? B, this.maxHeight);
354
359
  (n !== this.width || i !== this.height) && (t.emitPending = !0, t.resized = !0), this.width = n, this.height = i;
355
360
  }
356
361
  _onGrowPointerEnd(t) {
@@ -409,24 +414,36 @@ var z = 80, B = 54, V = 24, H = 8, U = class extends E(c(N)) {
409
414
  `;
410
415
  }
411
416
  };
412
- o([L({ reflect: !0 })], U.prototype, "variant", void 0), o([L()], U.prototype, "heading", void 0), o([L({
417
+ o([L({ reflect: !0 })], W.prototype, "variant", void 0), o([L()], W.prototype, "heading", void 0), o([L({
413
418
  type: Boolean,
414
419
  reflect: !0
415
- })], U.prototype, "active", void 0), o([L({
420
+ })], W.prototype, "active", void 0), o([L({
416
421
  type: Boolean,
417
422
  reflect: !0
418
- })], U.prototype, "closable", void 0), o([L({
423
+ })], W.prototype, "closable", void 0), o([L({
419
424
  type: Boolean,
420
425
  reflect: !0
421
- })], U.prototype, "zoomable", void 0), o([L({
426
+ })], W.prototype, "zoomable", void 0), o([L({
422
427
  type: Boolean,
423
428
  reflect: !0
424
- })], U.prototype, "movable", void 0), o([L({
429
+ })], W.prototype, "movable", void 0), o([L({
425
430
  type: Boolean,
426
431
  reflect: !0
427
- })], U.prototype, "resizable", void 0), o([L({
432
+ })], W.prototype, "resizable", void 0), o([L({
433
+ type: Number,
434
+ attribute: "min-width"
435
+ })], W.prototype, "minWidth", void 0), o([L({
436
+ type: Number,
437
+ attribute: "min-height"
438
+ })], W.prototype, "minHeight", void 0), o([L({
439
+ type: Number,
440
+ attribute: "max-width"
441
+ })], W.prototype, "maxWidth", void 0), o([L({
442
+ type: Number,
443
+ attribute: "max-height"
444
+ })], W.prototype, "maxHeight", void 0), o([L({
428
445
  type: Boolean,
429
446
  reflect: !0
430
- })], U.prototype, "flush", void 0), o([L({ reflect: !0 })], U.prototype, "scrollbars", void 0), o([R()], U.prototype, "_hasStatus", void 0), U = o([t("vf-window")], U);
447
+ })], W.prototype, "flush", void 0), o([L({ reflect: !0 })], W.prototype, "scrollbars", void 0), o([R()], W.prototype, "_hasStatus", void 0), W = o([t("vf-window")], W);
431
448
  //#endregion
432
- export { U as VfWindow };
449
+ export { W as VfWindow };
package/docs/SPEC.md CHANGED
@@ -208,7 +208,7 @@ Full-bleed classic desktop container.
208
208
 
209
209
  #### `vf-window` (`VfWindow`, vf-window.ts)
210
210
  The desktop-window shell: the classic document window (see DragThing screenshot), parameterized down to the windoid (see the Group A recipe table).
211
- - **Attributes/props:** `heading: string` (title text), `width: number` / `height: number` (**declare them both** — whole system px, so the window keeps its proportion to the chrome inside it at every density. A window is a fixed box in both axes, the way a WIND resource was: one that grows with its body is one the user can neither predict nor control via the grow box. Each missing dimension falls back to something different — width to block layout, height to the content — and the window names whichever are missing, once, in the console), `active: boolean` (default **true**; reflect), `closable: boolean` (default true), `zoomable: boolean` (default false), `movable: boolean` (default false), `resizable: boolean` (default false), `flush: boolean` (default false — removes the body padding; under `scrollbars`, the built-in viewport's 8px inset instead), `variant?: 'utility'` (the slim windoid chrome), `scrollbars?: 'vertical' | 'horizontal' | 'both'` (edge scroll rails).
211
+ - **Attributes/props:** `heading: string` (title text), `width: number` / `height: number` (**declare them both** — whole system px, so the window keeps its proportion to the chrome inside it at every density. A window is a fixed box in both axes, the way a WIND resource was: one that grows with its body is one the user can neither predict nor control via the grow box. Each missing dimension falls back to something different — width to block layout, height to the content — and the window names whichever are missing, once, in the console), `active: boolean` (default **true**; reflect), `closable: boolean` (default true), `zoomable: boolean` (default false), `movable: boolean` (default false), `resizable: boolean` (default false), `min-width` / `min-height: number` (default 80 / 54) and `max-width` / `max-height: number` (unbounded) — the grow box's sizeRect, whole system px (see Behavior), `flush: boolean` (default false — removes the body padding; under `scrollbars`, the built-in viewport's 8px inset instead), `variant?: 'utility'` (the slim windoid chrome), `scrollbars?: 'vertical' | 'horizontal' | 'both'` (edge scroll rails).
212
212
  - **Visual:** `vfChromeFrame` + `vfTitleBar` (§4), plus a full-size flex-column layout on the frame. `display: block`. Sets `--vf-surface: var(--vf-white, #fff)` on itself.
213
213
  - Title bar: from `vfTitleBar` — height `var(--vf-titlebar-height, 18px)`, white bg, bottom `1px solid black`, contains `.vf-stripes` layer (only when `active`). `touch-action: none` only when `[movable]`.
214
214
  - Title: centered, bold, on a white patch (`padding: 0 6px`; cap band on interior rows 4..12, 7px of white between ink and stripes — see §4 `vfTitleBar` for the traced geometry and the lattice hold) above the stripes, with `--vf-title-inset: 60px` of clearance so it ellipsizes before reaching the widgets. Inactive: no stripes, widgets undrawn (transparent ink — they keep their tab stops; see A11y below), the grow box's nested squares hidden, and every managed scroll rail inside the window blanked (see "always-a-rail" §5 vf-scroll-area) — but the title text stays black (System 7 never grayed the window title).
@@ -220,7 +220,7 @@ The desktop-window shell: the classic document window (see DragThing screenshot)
220
220
  - Edge scroll rails (if `scrollbars`): the body slot renders inside a shadow `vf-scroll-area` (its `axis` = the attribute's value, `label` = the heading, `viewport` part re-exported) carrying the TeachText composition internally — `calc(100% + 2px·scale)` with `margin: -1px·scale`, one system px under the frame on every side, so the area's own frame border repaints the window's border lines and a `resizable` window's grow box (z-index 1) lands exactly over the rail-corner cell. `flush` passes through to the area (its viewport drops the 8px inset, keeping the border-floor term, so content and the (0,0) of placed children sit at the content region's corner); a `resizable` window sets the area's `corner`, so a single-axis rail stops at the corner cell too — unless the status strip is populated, when the grow box sits in the strip and the rail runs edge to edge onto the strip's rule. Same caveats as the slotted composition (see vf-scroll-area §5), which remains supported for inset wells.
221
221
  - Utility variant (`variant="utility"`): the slim windoid bar traced from `Windows/utility-window.png` — `--vf-titlebar-height-utility` (12px = 11px interior + 1px rule), the `vfDots` dither instead of stripes (flush to the side borders — see §4 vfDots), 7×7 widgets (`top: 2px`; close `left: 7px`, zoom `right: 8px` — the art is asymmetric by that pixel) with a 2px patch ring where the striped bar's is 1px (`--vf-widget-ring`, internal geometry: the windoid sheet clears two px of dither beside its widgets), and the nested zoom square shrunk so its edges land at sprite col/row 3. No title patch: the display face's 16px line box can't sit in an 11px interior, so `.vf-title` is `display: none` under the variant (a retheming consumer can re-show it via `::part(title)`) and the heading names the widgets. A pressed windoid widget inverts whole — black interior under a white (invisible) borderline — rather than flashing the big bar's 9×9 sunburst, which can't land on a 5×5 interior.
222
222
  - **A11y:** the close/zoom `aria-label`s are qualified by the title when there is one (`Close ${heading}` / `Zoom ${heading}`, falling back to bare `Close` / `Zoom`) — several windows are open at once by design, so a bare repeated "Close" gives an AT user no way to tell which window a widget belongs to. The frame is `role="group"`, named by the title patch via `aria-labelledby` when there is a heading (the utility variant's hidden patch still names it — AccName resolves hidden labelledby targets) — `group` rather than `region` deliberately, so a desktop of windows doesn't pollute landmark navigation; the title bar is a `<div>`, never a `<header>`, which would map to an unnamed `banner` landmark even inside the shadow root. An inactive window's widgets stay in the tree and the tab order but paint no ink (transparent border/background/patch ring — the bare System 7 bar): a background window whose body holds nothing focusable is still reachable, activated by `vf-desktop`'s `focusin` raise the moment Tab lands on a widget, and never drops focus to `<body>` when it deactivates. `npm run verify:window-a11y`.
223
- - **Behavior:** close box click → `vf-close` (does NOT remove itself; consumer decides). Zoom box click → `vf-zoom`. If `movable`: dragging the title bar moves the window — the drag seeds its origin from the current offset position (once, converting to system px) and then states `left`/`top` via pointer capture, in whole system px like any authored placement. If `resizable`: dragging the grow box states `width`/`height` the same way, and fires `vf-resize` (detail `{ width, height, commit }`, sizes in whole system px) — one event per size the drag actually writes (`commit: false`), fired *after* the new box is applied so a handler that measures reads the resized layout, then a final `commit: true` as the gesture settles (release or cancel), only when it changed the size. Window content can follow the grow box from this event alone, no ResizeObserver. Fired by the gesture only: a programmatic `width`/`height` write fires nothing, the way a value set fires no `vf-change`.
223
+ - **Behavior:** close box click → `vf-close` (does NOT remove itself; consumer decides). Zoom box click → `vf-zoom`. If `movable`: dragging the title bar moves the window — the drag seeds its origin from the current offset position (once, converting to system px) and then states `left`/`top` via pointer capture, in whole system px like any authored placement. If `resizable`: dragging the grow box states `width`/`height` the same way, each axis clamped into the sizeRect (`min-width`/`max-width`, `min-height`/`max-height` — GrowWindow's: the app stated the rectangle of sizes and the Window Manager clamped the drag to it; the mins default to the 80×54 floor a window can still be worked at, the maxes are unbounded, and a min equal to its max locks the axis — the strip that scrolls sideways and never grows taller). The clamp runs after the lattice snap, so a bound lands exactly the way an authored size does even off the lattice (an odd height at 2×); where a min and max cross the max wins, so a window authored under the floor and held there never jumps to it. The rect bounds the gesture only: a size authored outside it renders as declared, and the first grow-box move brings it inside. The drag fires `vf-resize` (detail `{ width, height, commit }`, sizes in whole system px) — one event per size the drag actually writes (`commit: false`), fired *after* the new box is applied so a handler that measures reads the resized layout, then a final `commit: true` as the gesture settles (release or cancel), only when it changed the size. Window content can follow the grow box from this event alone, no ResizeObserver. Fired by the gesture only: a programmatic `width`/`height` write fires nothing, the way a value set fires no `vf-change`.
224
224
  - **Slots:** default (body content), `status` (the bottom status strip — see Visual).
225
225
  - **Parts:** `frame`, `title-bar`, `title`, `close-box`, `zoom-box`, `body`, `status-bar`, `grow-box`, plus `viewport` re-exported from the built-in scroll area when `scrollbars` is set.
226
226
  - **Events:** `vf-close`, `vf-zoom` (detail `{}`), `vf-resize` (detail `{ width, height, commit }`).
@@ -1361,7 +1361,27 @@
1361
1361
  },
1362
1362
  {
1363
1363
  "name": "resizable",
1364
- "description": "Show a grow box at the bottom-right corner for resizing.",
1364
+ "description": "Show a grow box at the bottom-right corner for resizing. The drag is\nbounded per axis by the sizeRect below.",
1365
+ "values": []
1366
+ },
1367
+ {
1368
+ "name": "min-width",
1369
+ "description": "The sizeRect: the range of sizes the grow box can drag the window to,\nper axis, in whole system px — GrowWindow's, where the app stated the\nrectangle and the Window Manager clamped the drag to it. `minWidth` and\n`minHeight` default to the 80×54 floor a window can still be worked at;\nthe maxes are unbounded. A min equal to its max locks that axis —\n`min-height=\"67\" max-height=\"67\"` on a strip that scrolls sideways and\nnever grows taller, so the grow box changes the width alone.\n\nBounds the gesture only: an authored `width`/`height` outside the rect\nrenders as declared, and the first grow-box move brings it inside. The\nclamp runs after the drag's lattice snap, so a bound lands exactly the\nway an authored size does, even off the lattice (an odd height at 2×);\nwhere a min and max cross, the max wins, so a window held under the\nfloor stays put instead of jumping to it.",
1370
+ "values": []
1371
+ },
1372
+ {
1373
+ "name": "min-height",
1374
+ "description": "See minWidth. Default 54.",
1375
+ "values": []
1376
+ },
1377
+ {
1378
+ "name": "max-width",
1379
+ "description": "See minWidth. Unbounded by default.",
1380
+ "values": []
1381
+ },
1382
+ {
1383
+ "name": "max-height",
1384
+ "description": "See minWidth. Unbounded by default.",
1365
1385
  "values": []
1366
1386
  },
1367
1387
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "vintage-frames",
4
- "version": "0.5.5",
4
+ "version": "0.5.6",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -3290,9 +3290,29 @@
3290
3290
  },
3291
3291
  {
3292
3292
  "name": "resizable",
3293
- "description": "Show a grow box at the bottom-right corner for resizing.",
3293
+ "description": "Show a grow box at the bottom-right corner for resizing. The drag is\nbounded per axis by the sizeRect below.",
3294
3294
  "value": { "type": "boolean", "default": "false" }
3295
3295
  },
3296
+ {
3297
+ "name": "min-width",
3298
+ "description": "The sizeRect: the range of sizes the grow box can drag the window to,\nper axis, in whole system px — GrowWindow's, where the app stated the\nrectangle and the Window Manager clamped the drag to it. `minWidth` and\n`minHeight` default to the 80×54 floor a window can still be worked at;\nthe maxes are unbounded. A min equal to its max locks that axis —\n`min-height=\"67\" max-height=\"67\"` on a strip that scrolls sideways and\nnever grows taller, so the grow box changes the width alone.\n\nBounds the gesture only: an authored `width`/`height` outside the rect\nrenders as declared, and the first grow-box move brings it inside. The\nclamp runs after the drag's lattice snap, so a bound lands exactly the\nway an authored size does, even off the lattice (an odd height at 2×);\nwhere a min and max cross, the max wins, so a window held under the\nfloor stays put instead of jumping to it.",
3299
+ "value": { "type": "number | null | undefined" }
3300
+ },
3301
+ {
3302
+ "name": "min-height",
3303
+ "description": "See minWidth. Default 54.",
3304
+ "value": { "type": "number | null | undefined" }
3305
+ },
3306
+ {
3307
+ "name": "max-width",
3308
+ "description": "See minWidth. Unbounded by default.",
3309
+ "value": { "type": "number | null | undefined" }
3310
+ },
3311
+ {
3312
+ "name": "max-height",
3313
+ "description": "See minWidth. Unbounded by default.",
3314
+ "value": { "type": "number | null | undefined" }
3315
+ },
3296
3316
  {
3297
3317
  "name": "flush",
3298
3318
  "description": "Remove the default 12px body padding. Under `scrollbars` the body has\nnone to remove, so the flag reaches the built-in scroll area instead\nand drops its viewport's 8px inset: content runs to the frame and the\nrails, and the (0,0) of placed children is the content region's corner.",
@@ -3381,9 +3401,29 @@
3381
3401
  },
3382
3402
  {
3383
3403
  "name": "resizable",
3384
- "description": "Show a grow box at the bottom-right corner for resizing.",
3404
+ "description": "Show a grow box at the bottom-right corner for resizing. The drag is\nbounded per axis by the sizeRect below.",
3385
3405
  "type": "boolean"
3386
3406
  },
3407
+ {
3408
+ "name": "minWidth",
3409
+ "description": "The sizeRect: the range of sizes the grow box can drag the window to,\nper axis, in whole system px — GrowWindow's, where the app stated the\nrectangle and the Window Manager clamped the drag to it. `minWidth` and\n`minHeight` default to the 80×54 floor a window can still be worked at;\nthe maxes are unbounded. A min equal to its max locks that axis —\n`min-height=\"67\" max-height=\"67\"` on a strip that scrolls sideways and\nnever grows taller, so the grow box changes the width alone.\n\nBounds the gesture only: an authored `width`/`height` outside the rect\nrenders as declared, and the first grow-box move brings it inside. The\nclamp runs after the drag's lattice snap, so a bound lands exactly the\nway an authored size does, even off the lattice (an odd height at 2×);\nwhere a min and max cross, the max wins, so a window held under the\nfloor stays put instead of jumping to it.",
3410
+ "type": "number | null | undefined"
3411
+ },
3412
+ {
3413
+ "name": "minHeight",
3414
+ "description": "See minWidth. Default 54.",
3415
+ "type": "number | null | undefined"
3416
+ },
3417
+ {
3418
+ "name": "maxWidth",
3419
+ "description": "See minWidth. Unbounded by default.",
3420
+ "type": "number | null | undefined"
3421
+ },
3422
+ {
3423
+ "name": "maxHeight",
3424
+ "description": "See minWidth. Unbounded by default.",
3425
+ "type": "number | null | undefined"
3426
+ },
3387
3427
  {
3388
3428
  "name": "flush",
3389
3429
  "description": "Remove the default 12px body padding. Under `scrollbars` the body has\nnone to remove, so the flag reaches the built-in scroll area instead\nand drops its viewport's 8px inset: content runs to the frame and the\nrails, and the (0,0) of placed children is the content region's corner.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vintage-frames",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
4
  "description": "Lit web components that emulate the look and feel of classic Mac OS System 7",
5
5
  "type": "module",
6
6
  "license": "MIT",