vintage-frames 0.19.0 → 0.20.0

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 (68) hide show
  1. package/README.md +1 -18
  2. package/custom-elements.json +247 -59
  3. package/dist/components/vf-menu-bar.d.ts +6 -4
  4. package/dist/components/vf-menu-bar.js +26 -56
  5. package/dist/components/vf-menu-item.d.ts +33 -5
  6. package/dist/components/vf-menu-item.js +128 -61
  7. package/dist/components/vf-menu.d.ts +35 -0
  8. package/dist/components/vf-menu.js +171 -111
  9. package/dist/glyphs.d.ts +6 -0
  10. package/dist/glyphs.js +18 -14
  11. package/dist/menu-navigation.d.ts +34 -0
  12. package/dist/menu-navigation.js +53 -0
  13. package/dist/menu-press.d.ts +25 -7
  14. package/dist/menu-press.js +78 -44
  15. package/dist/motion.d.ts +10 -0
  16. package/dist/text-control.d.ts +3 -3
  17. package/docs/SPEC.md +13 -9
  18. package/editor/vscode.html-custom-data.json +13 -8
  19. package/editor/web-types.json +51 -15
  20. package/package.json +4 -34
  21. package/dist/build/app-file.d.ts +0 -21
  22. package/dist/build/app-file.js +0 -42
  23. package/dist/build/box.d.ts +0 -57
  24. package/dist/build/box.js +0 -93
  25. package/dist/build/client.d.ts +0 -12
  26. package/dist/build/frame-picture.d.ts +0 -6
  27. package/dist/build/frame-picture.js +0 -4
  28. package/dist/build/frame.d.ts +0 -11
  29. package/dist/build/frame.js +0 -44
  30. package/dist/build/index.d.ts +0 -14
  31. package/dist/build/index.js +0 -4
  32. package/dist/build/plugins.d.ts +0 -41
  33. package/dist/build/plugins.js +0 -134
  34. package/dist/build/png.d.ts +0 -24
  35. package/dist/build/png.js +0 -116
  36. package/dist/shell/alert.d.ts +0 -40
  37. package/dist/shell/alert.js +0 -41
  38. package/dist/shell/app-file.d.ts +0 -115
  39. package/dist/shell/app-file.js +0 -189
  40. package/dist/shell/catalog.d.ts +0 -212
  41. package/dist/shell/catalog.js +0 -317
  42. package/dist/shell/clock.d.ts +0 -16
  43. package/dist/shell/clock.js +0 -36
  44. package/dist/shell/filing.d.ts +0 -39
  45. package/dist/shell/filing.js +0 -68
  46. package/dist/shell/finder.d.ts +0 -179
  47. package/dist/shell/finder.js +0 -662
  48. package/dist/shell/geometry.d.ts +0 -203
  49. package/dist/shell/geometry.js +0 -257
  50. package/dist/shell/index.d.ts +0 -30
  51. package/dist/shell/index.js +0 -12
  52. package/dist/shell/pure.d.ts +0 -13
  53. package/dist/shell/pure.js +0 -6
  54. package/dist/shell/shell.d.ts +0 -177
  55. package/dist/shell/shell.js +0 -272
  56. package/dist/shell/state.d.ts +0 -88
  57. package/dist/shell/state.js +0 -103
  58. package/dist/shell/storage.d.ts +0 -14
  59. package/dist/shell/storage.js +0 -41
  60. package/dist/shell/version.d.ts +0 -2
  61. package/dist/shell/version.js +0 -4
  62. package/dist/shell/windows.d.ts +0 -278
  63. package/dist/shell/windows.js +0 -447
  64. package/dist/styles/body-strike.d.ts +0 -12
  65. package/dist/styles/body-strike.js +0 -3961
  66. package/dist/styles/display-strike.d.ts +0 -12
  67. package/dist/styles/display-strike.js +0 -4343
  68. package/dist/styles/strike.d.ts +0 -30
@@ -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.19.0",
4
+ "version": "0.20.0",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -1799,7 +1799,7 @@
1799
1799
  },
1800
1800
  {
1801
1801
  "name": "vf-menu-bar",
1802
- "description": "`<vf-menu-bar>` — the System 7 menu bar: white strip, 1px black bottom\nrule, slotted `<vf-menu>` children laid out from the left. `rounded` adds\nthe classic screen-corner mask to the top corners.\n\nCoordinates its menus: pressing a label opens that menu (and inverts the\nlabel); while any menu is open, hovering another label switches to it;\nEscape, an outside click, or item selection closes. ArrowLeft/ArrowRight\nmove between menus while one is open; ArrowDown/ArrowUp move focus through\nthe open menu's items, Home/End jump to its first/last, and typed letters\nrun the shared Finder first-letter type-ahead (src/type-ahead.ts).\n\nThe bar also owns the **press-drag-release** gesture (see src/menu-press.ts)\n— press a title, slide onto a command, release over it — because one press\nmay travel across several of its menus. `vf-select` drives its popup by the\nsame mechanic.\n---\n\n\n### **Slots:**\n - _default_ - `vf-menu` elements.\n- **end** - The bar's right end: a clock, say. Held 9px in from the end, and a `vf-label` there rides the bar's line, so its baseline is the menu titles'.\n\n### **CSS Properties:**\n - **--vf-menubar-height** - `vf-menu-bar` _(default: 20px)_\n\n### **CSS Parts:**\n - **bar** - The horizontal layout container.",
1802
+ "description": "`<vf-menu-bar>` — the System 7 menu bar: white strip, 1px black bottom\nrule, slotted `<vf-menu>` children laid out from the left. `rounded` adds\nthe classic screen-corner mask to the top corners.\n\nCoordinates its menus: pressing a label opens that menu (and inverts the\nlabel); while any menu is open, hovering another label switches to it;\nEscape, an outside click, or item selection closes. While a menu is open\nthe keyboard is src/menu-navigation.ts's: ArrowDown/ArrowUp move focus\nthrough the open menu's items, Home/End jump to its first/last, typed\nletters run the shared Finder first-letter type-ahead (src/type-ahead.ts),\nArrowRight opens an item's submenu and ArrowLeft closes it, and at the top\nlevel ArrowLeft/ArrowRight move between menus.\n\nThe bar also owns the **press-drag-release** gesture (see src/menu-press.ts)\n— press a title, slide onto a command, release over it — because one press\nmay travel across several of its menus. `vf-select` drives its popup by the\nsame mechanic.\n---\n\n\n### **Slots:**\n - _default_ - `vf-menu` elements.\n- **end** - The bar's right end: a clock, say. Held 9px in from the end, and a `vf-label` there rides the bar's line, so its baseline is the menu titles'.\n\n### **CSS Properties:**\n - **--vf-menubar-height** - `vf-menu-bar` _(default: 20px)_\n\n### **CSS Parts:**\n - **bar** - The horizontal layout container.",
1803
1803
  "doc-url": "",
1804
1804
  "attributes": [
1805
1805
  {
@@ -1889,7 +1889,7 @@
1889
1889
  },
1890
1890
  {
1891
1891
  "name": "vf-menu-item",
1892
- "description": "`<vf-menu-item>` — a single command inside a `<vf-menu>` panel.\n\nRenders the classic System 7 menu row: optional ✓ check in the\n`--vf-select-gutter` left column (16px, shared with vf-select/vf-option),\nlabel, and the keyboard shortcut left-aligned in a right-anchored column,\nso every ⌘ lands at the same x. On activation the item performs the classic\n3-blink inversion (~250ms), then dispatches `vf-menu-select` and asks its\nancestors to close the menu.\n\nTakes `top`/`left` like every other element (VfPositioned), for the\nconsumer who wants a row somewhere other than a pulldown. Inside its parent\n`<vf-menu>` the panel is as wide as its widest row and stacks them in flow,\nso stating an origin takes that row out of both: it no longer contributes to\nthe panel's width and the rows below close the gap. The placement doing what\nit says — but not how a pulldown is laid out.\n---\n\n\n### **Events:**\n - **vf-menu-select** - After the blink completes. `detail: { value, item }`. Named for the menu rather than plain `vf-select`, which would collide with the `<vf-select>` popup on any delegated ancestor listener (that component commits with `vf-change`).\n\n### **Slots:**\n - _default_ - The item label.\n\n### **CSS Properties:**\n - **--vf-menu-row-height** - `vf-menu-item` row pitch (`Menus.png`; kept separate from `--vf-popup-height` so re-theming the popup pill doesn't move pulldown rows) _(default: 16px)_\n- **--vf-menu-shortcut-column** - `vf-menu-item` shortcut slot, right-anchored with the text left-aligned in it so every ⌘ lands at the same x (`Menus.png`) — the MDEF reserve, ⌘'s 11px advance + the face's widest letter (M/W, 12px); widen it to line up longer shortcuts (\"⌘⇧S\") _(default: 23px)_\n- **--vf-select-gutter** - checkmark column: `vf-select` left inset / `vf-option` + `vf-menu-item` ✓ column (shared so the value doesn't shift on open) _(default: 16px)_\n\n### **CSS Parts:**\n - **item** - The row container.\n- **check** - The ✓ checkmark glyph (rendered when `checked`).\n- **label** - The label wrapper around the default slot.\n- **shortcut** - The shortcut text, left-aligned in the shared column.",
1892
+ "description": "`<vf-menu-item>` — a single command inside a `<vf-menu>` panel.\n\nRenders the classic System 7 menu row: optional ✓ check in the\n`--vf-select-gutter` left column (16px, shared with vf-select/vf-option),\nlabel, and the keyboard shortcut left-aligned in a right-anchored column,\nso every ⌘ lands at the same x. On activation the item performs the classic\n3-blink inversion (~250ms), then dispatches `vf-menu-select` and asks its\nancestors to close the menu.\n\nA `<vf-menu>` in the `submenu` slot makes the item open a submenu: it ends\nin ▶ where a shortcut would go, and choosing it opens the submenu beside\nit rather than firing `vf-menu-select`. The item stays highlighted while\nits submenu is open.\n\nTakes `top`/`left` like every other element (VfPositioned), for the\nconsumer who wants a row somewhere other than a pulldown. Inside its parent\n`<vf-menu>` the panel is as wide as its widest row and stacks them in flow,\nso stating an origin takes that row out of both: it no longer contributes to\nthe panel's width and the rows below close the gap. The placement doing what\nit says — but not how a pulldown is laid out.\n---\n\n\n### **Events:**\n - **vf-menu-select** - After the blink completes. `detail: { value, item }`. Named for the menu rather than plain `vf-select`, which would collide with the `<vf-select>` popup on any delegated ancestor listener (that component commits with `vf-change`).\n\n### **Slots:**\n - _default_ - The item label.\n- **submenu** - A `vf-menu`, the submenu the item opens.\n\n### **CSS Properties:**\n - **--vf-menu-row-height** - `vf-menu-item` row pitch (`Menus.png`; kept separate from `--vf-popup-height` so re-theming the popup pill doesn't move pulldown rows) _(default: 16px)_\n- **--vf-menu-shortcut-column** - `vf-menu-item` shortcut slot, right-anchored with the text left-aligned in it so every ⌘ lands at the same x (`Menus.png`) — the MDEF reserve, ⌘'s 11px advance + the face's widest letter (M/W, 12px); widen it to line up longer shortcuts (\"⌘⇧S\") _(default: 23px)_\n- **--vf-select-gutter** - checkmark column: `vf-select` left inset / `vf-option` + `vf-menu-item` ✓ column (shared so the value doesn't shift on open) _(default: 16px)_\n\n### **CSS Parts:**\n - **item** - The row container.\n- **check** - The ✓ checkmark glyph (rendered when `checked`).\n- **label** - The label wrapper around the default slot.\n- **shortcut** - The shortcut text, left-aligned in the shared column.\n- **arrow** - The ▶ of an item that opens a submenu.",
1893
1893
  "doc-url": "",
1894
1894
  "attributes": [
1895
1895
  {
@@ -1904,7 +1904,12 @@
1904
1904
  },
1905
1905
  {
1906
1906
  "name": "active",
1907
- "description": "Transient highlight — the full-row inversion the press-drag gesture paints\non the row under the pointer (`:hover` can't: under touch the pointer is\ncaptured by the title the press started on). Managed by the menu, mirroring\n`vf-option[active]`; not part of the authoring API.",
1907
+ "description": "Transient highlight — the full-row inversion on the row under the pointer\nwhile its menu is open, button down or not (`:hover` can't: under touch\nthe pointer is captured by the title the press started on), or on the\nitem whose submenu is open while the pointer is elsewhere. Managed by the\nmenu, mirroring `vf-option[active]`; not part of the authoring API.",
1908
+ "value": { "type": "boolean", "default": "false" }
1909
+ },
1910
+ {
1911
+ "name": "expanded",
1912
+ "description": "Whether this item's submenu is open. Reflected, and announced as\n`aria-expanded`. Managed by the menu (VfMenu.expand), like\nactive; not part of the authoring API.",
1908
1913
  "value": { "type": "boolean", "default": "false" }
1909
1914
  },
1910
1915
  {
@@ -1919,7 +1924,7 @@
1919
1924
  },
1920
1925
  {
1921
1926
  "name": "value",
1922
- "description": "Value reported in the `vf-menu-select` event detail. Defaults to the item's\ntrimmed text content when unset.",
1927
+ "description": "Value reported in the `vf-menu-select` event detail. Defaults to the item's\nlabelText when unset.",
1923
1928
  "value": { "type": "string | undefined" }
1924
1929
  },
1925
1930
  {
@@ -1943,7 +1948,13 @@
1943
1948
  "value": { "type": "PlacementOrigin | null | undefined" }
1944
1949
  }
1945
1950
  ],
1946
- "slots": [{ "name": "", "description": "The item label." }],
1951
+ "slots": [
1952
+ { "name": "", "description": "The item label." },
1953
+ {
1954
+ "name": "submenu",
1955
+ "description": "A `vf-menu`, the submenu the item opens."
1956
+ }
1957
+ ],
1947
1958
  "events": [
1948
1959
  {
1949
1960
  "name": "vf-menu-select",
@@ -1964,7 +1975,12 @@
1964
1975
  },
1965
1976
  {
1966
1977
  "name": "active",
1967
- "description": "Transient highlight — the full-row inversion the press-drag gesture paints\non the row under the pointer (`:hover` can't: under touch the pointer is\ncaptured by the title the press started on). Managed by the menu, mirroring\n`vf-option[active]`; not part of the authoring API.",
1978
+ "description": "Transient highlight — the full-row inversion on the row under the pointer\nwhile its menu is open, button down or not (`:hover` can't: under touch\nthe pointer is captured by the title the press started on), or on the\nitem whose submenu is open while the pointer is elsewhere. Managed by the\nmenu, mirroring `vf-option[active]`; not part of the authoring API.",
1979
+ "type": "boolean"
1980
+ },
1981
+ {
1982
+ "name": "expanded",
1983
+ "description": "Whether this item's submenu is open. Reflected, and announced as\n`aria-expanded`. Managed by the menu (VfMenu.expand), like\nactive; not part of the authoring API.",
1968
1984
  "type": "boolean"
1969
1985
  },
1970
1986
  {
@@ -1979,9 +1995,19 @@
1979
1995
  },
1980
1996
  {
1981
1997
  "name": "value",
1982
- "description": "Value reported in the `vf-menu-select` event detail. Defaults to the item's\ntrimmed text content when unset.",
1998
+ "description": "Value reported in the `vf-menu-select` event detail. Defaults to the item's\nlabelText when unset.",
1983
1999
  "type": "string | undefined"
1984
2000
  },
2001
+ {
2002
+ "name": "submenu",
2003
+ "description": "The submenu this item opens: the `vf-menu` in its `submenu` slot, or null.",
2004
+ "type": "VfMenu | null"
2005
+ },
2006
+ {
2007
+ "name": "labelText",
2008
+ "description": "The item's label as text: what its default slot holds, trimmed, without\nthe rows of a submenu. The default value and the menus'\ntype-ahead read it, and it names an item that opens a submenu.",
2009
+ "type": "string"
2010
+ },
1985
2011
  {
1986
2012
  "name": "top",
1987
2013
  "description": "Offset from the top of the positioning parent, in whole system px.\nSetting this (or `left`) absolutely positions the element within its\nparent; the coordinate left unset is 0. Remove both to return the\nelement to normal flow.",
@@ -2013,7 +2039,7 @@
2013
2039
  },
2014
2040
  {
2015
2041
  "name": "vf-menu",
2016
- "description": "`<vf-menu>` — a pull-down menu: a bar label plus a dropped panel of\n`<vf-menu-item>` / `<vf-separator>` children.\n\nInside a `<vf-menu-bar>` the bar coordinates open state (only one menu open,\nhover-switching, outside-click/Escape dismissal) and owns the pointer\ngesture, which may travel between its menus. Used standalone, the menu\ntoggles itself on label click and manages its own dismissal, its own press\ngesture and item keyboard navigation (ArrowUp/ArrowDown, Home/End, and the\nshared first-letter type-ahead — src/type-ahead.ts) while open.\n\nPointer — the two styles `vf-select` supports, on the same terms (see\nsrc/menu-press.ts): the System 7 press-drag-release (press the title, slide\nonto a command, release over it) and a modern quick tap that leaves the menu\ndropped for a second click.\n\nTakes `top`/`left` like every other element (VfPositioned) — the\nnatural fit being a standalone menu, which is a free-standing menu button and\nplaces like any other control. The panel is anchored to the host's own box\n(`top: 100%`), so it follows a placed menu down without any further work.\nInside a `<vf-menu-bar>`, the bar lays its titles out in flow — placing one\nlifts it off the bar and the titles beside it close the gap. Slotted straight\ninto a `<vf-desktop>`, a free-standing menu sits on the desktop's menu tier\nabove every window, palettes included, as a bar does.\n---\n\n\n### **Slots:**\n - _default_ - Menu contents: `vf-menu-item` and `vf-separator` elements.\n- **label** - Replaces the `label` text in the bar — e.g. a `vf-img` apple icon for the Apple menu. An icon (`vf-img`, `img`, `svg`, `picture` or `canvas`) is drawn in a 16×16 cell and placed for one: 6 system px into its plate, 6 short of the plate's end, on the plate's top row. Text keeps the text title's place. Keep the `label` attribute set too: it stays the menu's accessible name (the bar item's `aria-label` and the panel's) when the visible title is an image.\n\n### **CSS Properties:**\n - **--vf-menubar-height** - `vf-menu-bar` _(default: 20px)_\n- **--vf-menu-row-height** - `vf-menu-item` row pitch; the panel also spends one of these on every slotted `vf-separator`, the full row the MDEF gave a divider (rule 8px into it — see the panel CSS) _(default: 16px)_\n\n### **CSS Parts:**\n - **label** - The menu title in the bar (inverts while open; flashes when a closed menu's item is activated by its key equivalent).\n- **panel** - The dropped `.vf-panel` containing the items.",
2042
+ "description": "`<vf-menu>` — a pull-down menu: a bar label plus a dropped panel of\n`<vf-menu-item>` / `<vf-separator>` children.\n\nInside a `<vf-menu-bar>` the bar coordinates open state (only one menu open,\nhover-switching, outside-click/Escape dismissal) and owns the pointer\ngesture, which may travel between its menus. Used standalone, the menu\ntoggles itself on label click and manages its own dismissal, its own press\ngesture and item keyboard navigation (ArrowUp/ArrowDown, Home/End, and the\nshared first-letter type-ahead — src/type-ahead.ts) while open.\n\nPointer — the two styles `vf-select` supports, on the same terms (see\nsrc/menu-press.ts): the System 7 press-drag-release (press the title, slide\nonto a command, release over it) and a modern quick tap that leaves the menu\ndropped for a second click.\n\nA `vf-menu` in a `vf-menu-item`'s `submenu` slot is a **submenu**: no title,\nonly its panel, opened beside its item by the menu holding the item\n(expand). The pointer resting on the item opens it in either style,\nand so do a click or tap on the item, →, Enter and Space. It overlaps its\nparent as System 7.5's did: its first row level with its item, its frame\n5px inside the parent's right edge, covering the parent's frame and\nshadow. It opens on the side its parent opened toward, the right first,\nflips where that side has no room, and moves up to fit the screen. Menus\nnest to any depth.\n\nTakes `top`/`left` like every other element (VfPositioned) — the\nnatural fit being a standalone menu, which is a free-standing menu button and\nplaces like any other control. The panel is anchored to the host's own box\n(`top: 100%`), so it follows a placed menu down without any further work.\nInside a `<vf-menu-bar>`, the bar lays its titles out in flow — placing one\nlifts it off the bar and the titles beside it close the gap. Slotted straight\ninto a `<vf-desktop>`, a free-standing menu sits on the desktop's menu tier\nabove every window, palettes included, as a bar does.\n---\n\n\n### **Slots:**\n - _default_ - Menu contents: `vf-menu-item` and `vf-separator` elements.\n- **label** - Replaces the `label` text in the bar — e.g. a `vf-img` apple icon for the Apple menu. An icon (`vf-img`, `img`, `svg`, `picture` or `canvas`) is drawn in a 16×16 cell and placed for one: 6 system px into its plate, 6 short of the plate's end, on the plate's top row. Text keeps the text title's place. Keep the `label` attribute set too: it stays the menu's accessible name (the bar item's `aria-label` and the panel's) when the visible title is an image.\n\n### **CSS Properties:**\n - **--vf-menubar-height** - `vf-menu-bar` _(default: 20px)_\n- **--vf-menu-row-height** - `vf-menu-item` row pitch; the panel also spends one of these on every slotted `vf-separator`, the full row the MDEF gave a divider (rule 8px into it — see the panel CSS) _(default: 16px)_\n\n### **CSS Parts:**\n - **label** - The menu title in the bar (inverts while open; flashes when a closed menu's item is activated by its key equivalent).\n- **panel** - The dropped `.vf-panel` containing the items.",
2017
2043
  "doc-url": "",
2018
2044
  "attributes": [
2019
2045
  {
@@ -2100,6 +2126,16 @@
2100
2126
  "description": "Viewport rect of the bar title, or `null` before the first render. The\npress gesture hit-tests by coordinates rather than by event target (see\nsrc/menu-press.ts), so it wants the box, not the element.",
2101
2127
  "type": "DOMRect | null"
2102
2128
  },
2129
+ {
2130
+ "name": "panelRect",
2131
+ "description": "Viewport rect of the dropped panel, or `null` while closed. The press\ngesture hit-tests the open menus by their panels, deepest first.",
2132
+ "type": "DOMRect | null"
2133
+ },
2134
+ {
2135
+ "name": "expandedItem",
2136
+ "description": "The item in this menu whose submenu is open, or `null`.",
2137
+ "type": "VfMenuItem | null"
2138
+ },
2103
2139
  {
2104
2140
  "name": "top",
2105
2141
  "description": "Offset from the top of the positioning parent, in whole system px.\nSetting this (or `left`) absolutely positions the element within its\nparent; the coordinate left unset is 0. Remove both to return the\nelement to normal flow.",
@@ -2181,7 +2217,7 @@
2181
2217
  },
2182
2218
  {
2183
2219
  "name": "autoselect",
2184
- "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window the shell's window manager opens. A dialog\nselects the text on every open, a window on its first open only. A click\nstill places the caret.",
2220
+ "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window system-online-sdk's window manager opens.\nA dialog selects the text on every open, a window on its first open only.\nA click still places the caret.",
2185
2221
  "value": { "type": "boolean", "default": "false" }
2186
2222
  },
2187
2223
  {
@@ -2282,7 +2318,7 @@
2282
2318
  },
2283
2319
  {
2284
2320
  "name": "autoselect",
2285
- "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window the shell's window manager opens. A dialog\nselects the text on every open, a window on its first open only. A click\nstill places the caret.",
2321
+ "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window system-online-sdk's window manager opens.\nA dialog selects the text on every open, a window on its first open only.\nA click still places the caret.",
2286
2322
  "type": "boolean"
2287
2323
  },
2288
2324
  {
@@ -3754,7 +3790,7 @@
3754
3790
  },
3755
3791
  {
3756
3792
  "name": "autoselect",
3757
- "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window the shell's window manager opens. A dialog\nselects the text on every open, a window on its first open only. A click\nstill places the caret.",
3793
+ "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window system-online-sdk's window manager opens.\nA dialog selects the text on every open, a window on its first open only.\nA click still places the caret.",
3758
3794
  "value": { "type": "boolean", "default": "false" }
3759
3795
  },
3760
3796
  {
@@ -3845,7 +3881,7 @@
3845
3881
  },
3846
3882
  {
3847
3883
  "name": "autoselect",
3848
- "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window the shell's window manager opens. A dialog\nselects the text on every open, a window on its first open only. A click\nstill places the caret.",
3884
+ "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window system-online-sdk's window manager opens.\nA dialog selects the text on every open, a window on its first open only.\nA click still places the caret.",
3849
3885
  "type": "boolean"
3850
3886
  },
3851
3887
  {
@@ -3961,7 +3997,7 @@
3961
3997
  },
3962
3998
  {
3963
3999
  "name": "autoselect",
3964
- "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window the shell's window manager opens. A dialog\nselects the text on every open, a window on its first open only. A click\nstill places the caret.",
4000
+ "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window system-online-sdk's window manager opens.\nA dialog selects the text on every open, a window on its first open only.\nA click still places the caret.",
3965
4001
  "value": { "type": "boolean", "default": "false" }
3966
4002
  },
3967
4003
  {
@@ -4052,7 +4088,7 @@
4052
4088
  },
4053
4089
  {
4054
4090
  "name": "autoselect",
4055
- "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window the shell's window manager opens. A dialog\nselects the text on every open, a window on its first open only. A click\nstill places the caret.",
4091
+ "description": "Opens with the whole text selected, so typing replaces it. Implies\n`autofocus`: the first control carrying either takes the opening focus of\nits `vf-dialog`, or of a window system-online-sdk's window manager opens.\nA dialog selects the text on every open, a window on its first open only.\nA click still places the caret.",
4056
4092
  "type": "boolean"
4057
4093
  },
4058
4094
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vintage-frames",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
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",
@@ -38,21 +38,6 @@
38
38
  "types": "./dist/components/vf-*.d.ts",
39
39
  "import": "./dist/components/vf-*.js"
40
40
  },
41
- "./shell": {
42
- "types": "./dist/shell/index.d.ts",
43
- "import": "./dist/shell/index.js"
44
- },
45
- "./shell/pure": {
46
- "types": "./dist/shell/pure.d.ts",
47
- "import": "./dist/shell/pure.js"
48
- },
49
- "./build": {
50
- "types": "./dist/build/index.d.ts",
51
- "import": "./dist/build/index.js"
52
- },
53
- "./build/client": {
54
- "types": "./dist/build/client.d.ts"
55
- },
56
41
  "./package.json": "./package.json"
57
42
  },
58
43
  "files": [
@@ -76,15 +61,12 @@
76
61
  "build:pages": "vite build --config vite.pages.config.ts",
77
62
  "preview:pages": "vite preview --config vite.pages.config.ts",
78
63
  "prepack": "npm run build && npm run verify:manifest",
79
- "preversion": "npm run check:app-api",
80
- "version": "npm run analyze && node scripts/write-version.mjs && git add custom-elements.json editor app-api.json src/shell/version.ts",
81
- "analyze": "cem analyze && node scripts/app-api.mjs",
82
- "check:app-api": "npm run analyze && node scripts/check-app-api.mjs",
64
+ "version": "npm run analyze && git add custom-elements.json editor",
65
+ "analyze": "cem analyze",
83
66
  "verify:manifest": "node scripts/verify-manifest.mjs",
84
67
  "typecheck": "tsc --noEmit",
85
68
  "preview": "vite preview",
86
69
  "embed:cursors": "node scripts/embed-cursor-art.mjs",
87
- "embed:frame": "node scripts/embed-frame.mjs",
88
70
  "verify:buttons": "tsc src/pixel-frame.ts --outDir scripts/.tmp --target es2022 --module esnext --moduleResolution bundler --skipLibCheck && node scripts/emit-clips.mjs && python3 scripts/verify-button-clips.py",
89
71
  "shot:buttons": "npx playwright screenshot --wait-for-timeout=2000 http://localhost:5173/pixel-test.html shots/buttons.png",
90
72
  "shot:verify": "python3 scripts/verify-button-screenshot.py shots/buttons.png",
@@ -128,23 +110,11 @@
128
110
  "verify:snap": "node scripts/verify-snap.mjs",
129
111
  "verify:contract": "node scripts/verify-contract.mjs",
130
112
  "verify:names": "node scripts/verify-names.mjs",
131
- "verify:forced-colors": "node scripts/verify-forced-colors.mjs",
132
- "verify:shell-unit": "tsc -p tsconfig.unit.json && node --test --test-reporter=tap \"test/*.test.mjs\"",
133
- "verify:shell-front": "node scripts/verify-shell-front.mjs",
134
- "verify:shell-windows": "node scripts/verify-shell-windows.mjs",
135
- "verify:shell-finder": "node scripts/verify-shell-finder.mjs"
113
+ "verify:forced-colors": "node scripts/verify-forced-colors.mjs"
136
114
  },
137
115
  "dependencies": {
138
116
  "lit": "^3.2.0"
139
117
  },
140
- "peerDependencies": {
141
- "vite": ">=8.0.0"
142
- },
143
- "peerDependenciesMeta": {
144
- "vite": {
145
- "optional": true
146
- }
147
- },
148
118
  "devDependencies": {
149
119
  "@custom-elements-manifest/analyzer": "^0.11.0",
150
120
  "@types/node": "^24.19.1",
@@ -1,21 +0,0 @@
1
- /**
2
- * Writing app files. The box's own chunks are copied as they are, so the
3
- * picture is never re-encoded; any app chunks already there are dropped,
4
- * and the manifest's and the code's go in before IEND.
5
- */
6
- import type { AppManifest } from '../shell/app-file.js';
7
- /** What {@link packApp} packs. */
8
- export interface PackAppInput {
9
- /** The manifest's fields but its format, app API and icon, which the packer fills in. */
10
- manifest: Omit<AppManifest, 'format' | 'api' | 'icon'>;
11
- /** The icon's PNG, 32 × 32. */
12
- icon: Uint8Array;
13
- /** The application's code: one ES module whose default export is its factory. */
14
- code: string;
15
- /** The artwork's PNG, for the box. Without it the icon is stamped there. */
16
- artwork?: Uint8Array;
17
- }
18
- /** `box` with `manifest` and `code` in its chunks. */
19
- export declare function writeAppFile(box: Uint8Array, manifest: AppManifest, code: string): Promise<Uint8Array>;
20
- /** The whole app file: the box in the kit's frame, then the manifest and the code. */
21
- export declare function packApp({ manifest, icon, code, artwork }: PackAppInput): Promise<Uint8Array>;
@@ -1,42 +0,0 @@
1
- import { CODE_KEYWORD as e, MANIFEST_KEYWORD as t, PNG_SIGNATURE as n, deflate as r, itxtKeyword as i, manifestOf as a, pngChunks as o } from "../shell/app-file.js";
2
- import { concat as s, pngChunk as c } from "./png.js";
3
- import { composeBox as l } from "./box.js";
4
- //#region src/build/app-file.ts
5
- var u = new TextEncoder();
6
- function d(e, t, n) {
7
- let r = Uint8Array.from([...e].map((e) => e.charCodeAt(0)));
8
- return c("iTXt", s([
9
- r,
10
- Uint8Array.of(0, +!!n, 0, 0, 0),
11
- t
12
- ]));
13
- }
14
- async function f(c, l, f) {
15
- let p = o(c);
16
- if (!p) throw Error("vintage-frames/build: the box is not a whole PNG");
17
- let m = a(l);
18
- if (typeof m == "string") throw Error(`vintage-frames/build: the manifest won't read back: ${m}`);
19
- let h = [d(t, u.encode(JSON.stringify(m)), !1), d(e, await r(u.encode(f)), !0)], g = [n];
20
- for (let e of p) e.type === "iTXt" && ["vintage-frames.app", "vintage-frames.code"].includes(i(e.data)) || (e.type === "IEND" && g.push(...h), g.push(c.subarray(e.start, e.end)));
21
- return s(g);
22
- }
23
- async function p({ manifest: e, icon: t, code: n, artwork: r }) {
24
- let i = {
25
- ...e,
26
- format: 1,
27
- api: 2,
28
- icon: `data:image/png;base64,${m(t)}`
29
- };
30
- return f(await l({
31
- manifest: i,
32
- icon: t,
33
- artwork: r
34
- }), i, n);
35
- }
36
- function m(e) {
37
- let t = "";
38
- for (let n = 0; n < e.length; n += 32768) t += String.fromCharCode(...e.subarray(n, n + 32768));
39
- return btoa(t);
40
- }
41
- //#endregion
42
- export { p as packApp, f as writeAppFile };
@@ -1,57 +0,0 @@
1
- /**
2
- * The box: the picture an app file shows. The kit's frame, with the
3
- * application's artwork in the artwork slot, or its icon stamped large on
4
- * the slot's backdrop when there is none, and lines of text set from the
5
- * kit's strikes with the manifest's fields in them. Artwork and the stamp
6
- * are pasted by their alpha. Nothing is drawn outside the slots.
7
- */
8
- import type { AppManifest } from '../shell/app-file.js';
9
- import type { Strike } from '../styles/strike.js';
10
- import type { Pixels } from './png.js';
11
- /** A box in a frame's picture, in its px. */
12
- export interface Slot {
13
- left: number;
14
- top: number;
15
- width: number;
16
- height: number;
17
- }
18
- /** A frame: a picture with everything fixed drawn in, and its slots. */
19
- export interface BoxFrame {
20
- /** The picture, a PNG. */
21
- picture: Uint8Array;
22
- /** One system px, in the picture's px. Each of the artwork's px is a whole number of them. */
23
- scale: number;
24
- /** Where the artwork goes. Without artwork the icon goes there, `stamp` times its size and centered. */
25
- artwork: Slot & {
26
- stamp: number;
27
- };
28
- /** The lines of text. */
29
- text: readonly TextSlot[];
30
- }
31
- /** A line of text on the box. */
32
- export interface TextSlot {
33
- /** The top-left of its em box, and the width it fits in. */
34
- left: number;
35
- top: number;
36
- width: number;
37
- strike: Strike;
38
- /** Picture px per design px. */
39
- scale: number;
40
- /** `#rrggbb`. */
41
- ink: string;
42
- align?: 'left' | 'center' | 'right';
43
- /** The line, with manifest fields in braces: `{name}`, `Version {version}`, `by {author}`, or fixed text. */
44
- text: string;
45
- }
46
- /** What a box is composed from. */
47
- export interface BoxInput {
48
- manifest: AppManifest;
49
- /** The icon's PNG, 32 × 32. */
50
- icon: Uint8Array;
51
- /** The artwork's PNG: the artwork slot's size in system px, or that divided by a whole number. */
52
- artwork?: Uint8Array;
53
- }
54
- /** The box in the kit's frame, as a PNG. */
55
- export declare function composeBox(input: BoxInput): Promise<Uint8Array>;
56
- /** The box in `frame`, as pixels. */
57
- export declare function drawBox(frame: BoxFrame, { manifest, icon, artwork }: BoxInput): Promise<Pixels>;
package/dist/build/box.js DELETED
@@ -1,93 +0,0 @@
1
- import { FRAME as e } from "./frame.js";
2
- import { decodePng as t, encodePng as n } from "./png.js";
3
- //#region src/build/box.ts
4
- var r = [
5
- "id",
6
- "name",
7
- "version",
8
- "requires",
9
- "author"
10
- ];
11
- async function i(t) {
12
- return n(await a(e, t));
13
- }
14
- async function a(e, { manifest: n, icon: r, artwork: i }) {
15
- let a = await t(e.picture, "the frame"), c = await t(r, "the icon");
16
- if (c.width !== 32 || c.height !== 32) throw Error(`the icon is ${c.width} × ${c.height}, and an icon is 32 × 32`);
17
- let u = e.artwork;
18
- if (i) {
19
- let n = await t(i, "the artwork"), r = {
20
- width: u.width / e.scale,
21
- height: u.height / e.scale
22
- }, c = r.width / n.width;
23
- if (!Number.isInteger(c) || n.height * c !== r.height) throw Error(`the artwork is ${n.width} × ${n.height}: draw it at ${r.width} × ${r.height}, or that divided by a whole number (${o(r)})`);
24
- s(a, n, u.left, u.top, c * e.scale, u);
25
- } else {
26
- let e = 32 * u.stamp;
27
- s(a, c, u.left + Math.floor((u.width - e) / 2), u.top + Math.floor((u.height - e) / 2), u.stamp, u);
28
- }
29
- for (let t of e.text) p(a, t, l(t.text, n));
30
- return a;
31
- }
32
- function o({ width: e, height: t }) {
33
- let n = [];
34
- for (let r = 2; r <= e && n.length < 3; r++) e % r === 0 && t % r === 0 && n.push(`${e / r} × ${t / r}`);
35
- return [...n, "…"].join(", ");
36
- }
37
- function s(e, t, n, r, i, a) {
38
- let o = Math.max(n, a.left, 0), s = Math.max(r, a.top, 0), l = Math.min(n + t.width * i, a.left + a.width, e.width), u = Math.min(r + t.height * i, a.top + a.height, e.height);
39
- for (let a = s; a < u; a++) for (let s = o; s < l; s++) {
40
- let o = (Math.floor((a - r) / i) * t.width + Math.floor((s - n) / i)) * 4;
41
- c(e, s, a, t.data.subarray(o, o + 4));
42
- }
43
- }
44
- function c(e, t, n, [r, i, a, o]) {
45
- if (!o) return;
46
- let s = e.data, c = (n * e.width + t) * 4;
47
- if (o === 255) {
48
- s[c] = r, s[c + 1] = i, s[c + 2] = a, s[c + 3] = 255;
49
- return;
50
- }
51
- let l = s[c + 3] * (255 - o) / 255, u = o + l;
52
- s[c] = Math.round((r * o + s[c] * l) / u), s[c + 1] = Math.round((i * o + s[c + 1] * l) / u), s[c + 2] = Math.round((a * o + s[c + 2] * l) / u), s[c + 3] = Math.round(u);
53
- }
54
- function l(e, t) {
55
- return e.replace(/\{(\w+)\}/g, (n, i) => {
56
- let a = r.find((e) => e === i);
57
- if (!a) throw Error(`the frame's line "${e}" names {${i}}, which a manifest doesn't have`);
58
- return t[a];
59
- });
60
- }
61
- var u = (e) => `"${e}" (U+${e.codePointAt(0).toString(16).toUpperCase().padStart(4, "0")})`, d = (e, t) => [...t].reduce((t, n) => t + e.glyphs[n].advance, 0);
62
- function f(e, t, n) {
63
- if (d(e, t) <= n) return t;
64
- if (!e.glyphs["…"]) throw Error(`${e.family} has no ${u("…")} to shorten "${t}" with`);
65
- let r = [...t];
66
- for (; r.length && d(e, r.join("").trimEnd() + "…") > n;) r.pop();
67
- return r.join("").trimEnd() + "…";
68
- }
69
- function p(e, t, n) {
70
- let { strike: r, scale: i } = t;
71
- for (let e of n) if (!r.glyphs[e]) throw Error(`${r.family} has no ${u(e)}, in "${n}"`);
72
- let a = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(t.ink);
73
- if (!a) throw Error(`the frame's ink "${t.ink}" is not #rrggbb`);
74
- let o = Uint8Array.of(parseInt(a[1], 16), parseInt(a[2], 16), parseInt(a[3], 16), 255), s = f(r, n, t.width / i), l = d(r, s) * i, p = t.align === "center" ? Math.floor((t.width - l) / 2 / i) * i : t.align === "right" ? t.width - l : 0, m = {
75
- left: t.left,
76
- top: t.top,
77
- width: t.width,
78
- height: (r.ascent + r.descent) * i
79
- }, h = t.top + r.ascent * i, g = t.left + p;
80
- for (let t of s) {
81
- let n = r.glyphs[t];
82
- n.rows.forEach((t, r) => {
83
- let a = h - (n.y0 + n.height - r) * i;
84
- for (let r = 0; r < t.length; r++) {
85
- if (t[r] !== "#") continue;
86
- let s = g + (n.x0 + r) * i;
87
- for (let t = Math.max(a, m.top, 0); t < Math.min(a + i, m.top + m.height, e.height); t++) for (let n = Math.max(s, m.left, 0); n < Math.min(s + i, m.left + m.width, e.width); n++) c(e, n, t, o);
88
- }
89
- }), g += n.advance * i;
90
- }
91
- }
92
- //#endregion
93
- export { i as composeBox, a as drawBox };
@@ -1,12 +0,0 @@
1
- /**
2
- * `vintage-frames/build/client`: the types of a `*.png?app` import, which
3
- * `appFiles()` serves. A site adds it to tsconfig's `types` beside
4
- * `vite/client`.
5
- */
6
- declare module '*.png?app' {
7
- /** The application's factory: its definition, given the manifest's icon. */
8
- const app: (...args: any[]) => import('../shell/index.js').AppDefinition<any>;
9
- export default app;
10
- /** The app file's manifest. */
11
- export const manifest: import('../shell/pure.js').AppManifest;
12
- }
@@ -1,6 +0,0 @@
1
- /**
2
- * The kit's frame's picture: box/frame.png, 480 × 615, 3095 bytes.
3
- * GENERATED by `npm run embed:frame`: redraw box/frame.png and re-run rather
4
- * than editing this file. Its slots are src/build/frame.ts's.
5
- */
6
- export declare const FRAME_PNG: Uint8Array;
@@ -1,4 +0,0 @@
1
- //#region src/build/frame-picture.ts
2
- var e = Uint8Array.from(atob("iVBORw0KGgoAAAANSUhEUgAAAeAAAAJnCAYAAABPiYBoAAAL3klEQVR42u3VwQkAIAwEwfRfW3rSBnwJBuFmYQpQAldVtQCAcT4BAAwwAKQNsCRJepcBliTJAEuSZIAlSZIBliTJAEuSJAMsSZIBliRJBliSJAMsSZIMsCRJBliSJAMsSZIMsCRJBliSJBlgSZIMsCRJMsCSJBlgSZJkgCVJMsCSJBlgAyxJkgGWJMkAS5IkAyxJkgGWJEkGWJIkAyxJkgywJEkGWJIkA2yAJUkywJIkGWBJkmSAJUkywJIkyQBLkmSAJUmSAZYkyQBLkmSADbAkSQZYkiQDLEmSDPDxAQCEM8AGGAADbIABMMAG+NEDuhuAQAbYAANggA0wAAbYABtgAAywAQbAABtgAwyAATbAABhgA2yAATDABhgAA2yADTAABtgAA2CADTAABtgAG2AADLABBsAAG2ADDIABNsAAGGADbIABMMAGGAADbIANMAAG2AADYIANMAAG2AAbYAAMsAEGwAAbYAMMgAE2wAAYYANsgAEwwAYYAANsgA0wAAbYAANggA0wAAbYABtgAAywAQbAABtgAwyAATbAABhgA2yAATDABhgAA2yADTAABtgAA2CADTAABtgAG2AADLABBsAAG2ADDIABNsAAGGADbIABMMAGGAADbIANMAAG2AADYIANsCMEMMAG2AADYIANMAAG2AAbYAAMsAEGwAAbYAMMgAE2wAAYYANsgAEwwAYYAANsgA0wgAE2wAYYAANsgAEwwAbYAANggA0wAAbYABtgAAywAQbAABtgAwyAATbAABhgA2yAAQywATbAABhgAwyAATbABhgAA2yAATDABtgAA2CADTAABtgAG2AADLABBsAAG2ADDGCADbABBsAAG2AADLABNsAAGGADDIABNsAGGAADbIABMMAG2AADYIANMAAG2AAbYAADbIANMAAG2AADYIANsAEGwAAbYAAMsAE2wAAYYAMMgAE2wAYYAANsgAEwwAbYAANggA0wAAbYAANggA2wAQbAABtgAAywATbAABhgAwyAATbABhgAA2yAATDABtgAA2CADTAABtgAA2CADbABBsAAG2AADLABNsAAGGADDIABNsAGGAADbIABMMAG2AADYIANMAAG2AADYIANsAEGwAAbYAAMsAE2wAAYYAMMgAE2wAYYAANsgAEwwAbYAANggA0wAAbYAANggA2wAQbAABtgAAywATbAABhgAwyAATbABhgAA2yAATDABtgAA2CADTAABtgAO0IAA2yADTAABtgAA2CADbABBsAAG2AADLABNsAAGGADDIABNsAGGAADbIABMMAG2BECGGADbIABMMAGGAADbIANMAAG2AADYIANsAEGwAAbYAAMsAE2wAAYYAMMgAE2wAYYwAAbYAMMgAE2wAAYYANsgAEwwAYYAANsgA0wAAbYAANggA2wAQbAABtgAAywATbAAAbYABtgAAywAQbAABtgAwyAATbAABhgA2yAATDABhgAA2yADTAABtgAA2CADbABBjDABtgAA2CADTAABtgAG2AADLABBsAAG2ADDIABNsAAGGADbIABMMAGGAADbIANMAAG2AADYIANMAAG2AAbYAAMsAEGwAAbYAMMgAE2wAAYYANsgAEwwAYYAANsgA0wAAbYAANggA0wAAbYABtgAAywAQbAABtgAwyAATbAABhgA2yAATDABhgAA2yADTAABtgAA2CADTAABtgAG2AADLABBsAAG2ADDIABNsAAGGADbIABMMAGGAADbIANMAAG2AADYIANMAAG2AAbYAAMsAEGwAAbYAMMgAE2wAAYYANsgAEwwAYYAANsgA0wAAbYAANggA0wAAbYABtgAAywAQbAABtgAwyAATbAABhgA2yAATDABhgAA2yADTAABtgAA2CADbAjBDDABtgAA2CADTAABtgAG2AADLABBsAAG2ADDIABNsAAGGADbIABMMAGGAADbIANMIABNsAGGAADbIABMMAG2AADYIANMAAG2AAbYAAMsAEGwAAbYAMMgAE2wAAYYANsgAEMsAE2wAAYYAMMgAE2wAYYAANsgAEwwAbYAANggA0wAAbYABtgAAywAQbAABtgAwxggA2wAQbAABtgAAywATbAABhgAwyAATbABhgAA2yAATDABtgAA2CADTAABtgAG2AADLABBsAAG2AADLABNsAAGGADDIABNsAGGAADbIABMMAG2AADYIANMAAG2AAbYAAMsAEGwAAbYAAMsAE2wAAYYAMMgAE2wAYYAANsgAEwwAbYAANggA0wAAbYABtgAAywAQbAABtgAAywATbAABhgAwyAATbABhgAA2yAATDABtgAA2CADTAABtgAG2AADLABBsAAG2AADLABNsAAGGADDIABNsAGGAADbIABMMAG2AADYIANMAAG2AAbYAAMsAEGwAAbYAAMsAE2wAAYYAMMgAE2wAYYAANsgAEwwAbYAANggA0wAAbYABtgAAywAQbAABtgRwhggA2wAQbAABtgAAywATbAABhgAwyAATbABhgAA2yAATDABtgAA2CADTAABtgAG2AAA2yADTAABtgAA2CADbABBsAAG2AADLABNsAAGGADDIABNsAGGAADbIABMMAG2AADGGADbIABMMAGGAADbIANMAAG2AADYIANsAEGwAAbYAAMsAE2wAAYYAMMgAE2wAYYwAAbYAMMgAE2wAAYYANsgAEwwAYYAANsgA0wAAbYAANggA2wAQbAABtgAAywATbAAAbYABtgAAywAQbAABtgAwyAATbAABhgA2yAATDABhgAA2yADTAABtgAA2CADbABBsAAG2AADLABBsAAG2ADDIABNsAAGGADbIABMMAGGAADbIANMAAG2AADYIANsAEGwAAbYAAMsAEGwAAbYAMMgAE2wAAYYANsgAEwwAYYAANsgA0wAAbYAANggA2wAQbAABtgAAywAQbAABtgAwyAATbAABhgA2yAATDABhgAA2yADTAABtgAA2CADbABBsAAG2AADLABBsAAG2ADDIABNsAAGGADbIABMMAGGAADbICvHwBAOANsgAEwwAYYAANsgCVJCs8AS5JkgCVJMsCSJMkAS5JkgCVJkgGWJMkAS5IkAyxJkgGWJEkGWJIkAyxJkgGWJEkGWJIkAyxJkgywJEkGWJIkGWBJkgywJEkywJIkGWBJkgywAZYkyQBLkmSAJUmSAZYkyQBLkiQDLEmSAZYkSQZYkiQDLEmSATbAkiQZYEmSDLAkSTLAkiQZYEmSZIAlSTLAkiTJAEuSZIAlSTLABliSJAMsSZIBliRJBliSJAMsSZIMsCRJBliSJBlgSZIMsCRJBtgAS5JkgCVJMsCSJMkAS5JkgCVJkgGWJMkAS5IkAyxJkgGWJMkAG2BJkgywJEkGWJIkGWBJkgywJEkywJIkGWBJkmSAJUkywJIkGWADLEmSAZYkyQBLkiQDLEmSAZYkSQZYkiQDLEmSDLAkSQZYkiQDbIAlSTLAkiQZYEmSZIAlSTLAkiTJAEuSZIAlSZIBliTJAEuSZIANsCRJBliSJAMsSZIMsCRJBliSJBlgSZIMsCRJMsCSJBlgSZJkgCVJMsCSJBlgSZJkgCVJMsCSJMkAS5JkgCVJkgGWJMkAS5IkAyxJkgGWJMkAG2BJkgywJEkGWJIkGWBJkgywJEkywJIkGWBJkmSAJUkywJIkGWADLEmSAZYkyQBLkiQDLEmSAZYkSQZYkiQDLEmSDLAkSQZYkiQDbIAlSTLAkiQZYEmSZIAlSTLAkiTJAEuSZIAlSZIBliTJAEuSZIANsCRJBliSJAMsSZIMsCRJBliSJBlgSZIMsCRJMsCSJBlgSZIMsAGWJMkAS5JkgCVJkgGWJMkAS5IkAyxJkgGWJEkGWJIkAyxJkgE2wJIkGWBJkgywJEkywJIkGWBJkmSAJUkywJIkyQBLkmSAJUkywAZYkiQDLEmSAZYkSQZYkiQDLEmSDLAkSQZYkiQZYEmSDLAkSQbYAEuSZIAlSTLAkiTJAEuSZIAlSZIBliTJAEuSJAMsSZIBliRJBliSpK8GGAAY4xMAwAADQIANOM+x56UXUawAAAAASUVORK5CYII="), (e) => e.charCodeAt(0));
3
- //#endregion
4
- export { e as FRAME_PNG };
@@ -1,11 +0,0 @@
1
- /**
2
- * The kit's frame: the picture every app file's box is drawn on, and its
3
- * slots, in the picture's px. A placeholder: a white card on 160 × 205
4
- * system px drawn at 3×, the artwork's slot on a gray backdrop inside a
5
- * black rule, then the name, the version and the author, centered.
6
- *
7
- * The picture is box/frame.png (`npm run embed:frame`). A redrawn picture
8
- * moves its slots here.
9
- */
10
- import type { BoxFrame } from './box.js';
11
- export declare const FRAME: BoxFrame;
@@ -1,44 +0,0 @@
1
- import "../shell/app-file.js";
2
- import { VF_BODY_STRIKE as e } from "../styles/body-strike.js";
3
- import { VF_DISPLAY_STRIKE as t } from "../styles/display-strike.js";
4
- import { FRAME_PNG as n } from "./frame-picture.js";
5
- //#region src/build/frame.ts
6
- var r = 3, i = {
7
- left: 16 * r,
8
- width: 128 * r,
9
- scale: r,
10
- ink: "#000000",
11
- align: "center"
12
- }, a = {
13
- picture: n,
14
- scale: r,
15
- artwork: {
16
- left: 16 * r,
17
- top: 16 * r,
18
- width: 128 * r,
19
- height: 128 * r,
20
- stamp: 3 * r
21
- },
22
- text: [
23
- {
24
- ...i,
25
- top: 152 * r,
26
- strike: t,
27
- text: "{name}"
28
- },
29
- {
30
- ...i,
31
- top: 170 * r,
32
- strike: e,
33
- text: "Version {version}"
34
- },
35
- {
36
- ...i,
37
- top: 182 * r,
38
- strike: e,
39
- text: "by {author}"
40
- }
41
- ]
42
- };
43
- //#endregion
44
- export { a as FRAME };
@@ -1,14 +0,0 @@
1
- /**
2
- * `vintage-frames/build` — app files, written: the Vite plugin that makes an
3
- * application's build write its app file, the one that builds app files
4
- * into a site, and the pieces under them: the packer, the writer and the box
5
- * in the kit's frame. Build-only: it runs under Node, and no page imports
6
- * it. Reading an app file is `vintage-frames/shell/pure`'s.
7
- * docs/APP-FILES.md is the guide.
8
- */
9
- export { appFile, appFiles } from './plugins.js';
10
- export type { AppFileOptions } from './plugins.js';
11
- export { packApp, writeAppFile } from './app-file.js';
12
- export type { PackAppInput } from './app-file.js';
13
- export { composeBox } from './box.js';
14
- export type { BoxInput } from './box.js';
@@ -1,4 +0,0 @@
1
- import { composeBox as e } from "./box.js";
2
- import { packApp as t, writeAppFile as n } from "./app-file.js";
3
- import { appFile as r, appFiles as i } from "./plugins.js";
4
- export { r as appFile, i as appFiles, e as composeBox, t as packApp, n as writeAppFile };