@cesarvenzac/closeup 0.0.0-stage → 0.1.1

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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -2
  3. package/dist/actions.d.ts +27 -0
  4. package/dist/actions.js +13 -0
  5. package/dist/capture.d.ts +28 -0
  6. package/dist/capture.js +33 -0
  7. package/dist/compositor.d.ts +62 -0
  8. package/dist/compositor.js +164 -0
  9. package/dist/cursor.d.ts +49 -0
  10. package/dist/cursor.js +152 -0
  11. package/dist/cursors.d.ts +11 -0
  12. package/dist/cursors.js +24 -0
  13. package/dist/frame.d.ts +86 -0
  14. package/dist/frame.js +78 -0
  15. package/dist/hover.d.ts +23 -0
  16. package/dist/hover.js +89 -0
  17. package/dist/index.d.ts +24 -0
  18. package/dist/index.js +37 -0
  19. package/dist/path.d.ts +41 -0
  20. package/dist/path.js +65 -0
  21. package/dist/player.d.ts +39 -0
  22. package/dist/player.js +140 -0
  23. package/dist/pointer.d.ts +30 -0
  24. package/dist/pointer.js +134 -0
  25. package/dist/script.d.ts +75 -0
  26. package/dist/script.js +94 -0
  27. package/dist/selector.d.ts +22 -0
  28. package/dist/selector.js +83 -0
  29. package/dist/settings.d.ts +61 -0
  30. package/dist/settings.js +59 -0
  31. package/dist/shortcut.d.ts +23 -0
  32. package/dist/shortcut.js +48 -0
  33. package/dist/sounds.d.ts +22 -0
  34. package/dist/sounds.js +94 -0
  35. package/dist/stage.d.ts +12 -0
  36. package/dist/stage.js +53 -0
  37. package/dist/store.d.ts +4 -0
  38. package/dist/store.js +22 -0
  39. package/dist/take.d.ts +69 -0
  40. package/dist/take.js +220 -0
  41. package/dist/ui/editor.d.ts +90 -0
  42. package/dist/ui/editor.js +612 -0
  43. package/dist/ui/icons.d.ts +28 -0
  44. package/dist/ui/icons.js +28 -0
  45. package/dist/ui/panel.d.ts +83 -0
  46. package/dist/ui/panel.js +739 -0
  47. package/dist/ui/styles.d.ts +6 -0
  48. package/dist/ui/styles.js +183 -0
  49. package/package.json +36 -4
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The toolbar's look, inside its own shadow root so no page's styles reach it: dark glass like
3
+ * macOS's own screenshot toolbar, the system's font, quiet controls. Entrances ease out, exits
4
+ * are quicker, and nothing moves under reduced motion.
5
+ */
6
+ export declare const STYLES = "\n:host { all: initial; }\n* { box-sizing: border-box; }\n[hidden] { display: none !important; }\n\n.surface {\n pointer-events: auto;\n --ink: #f5f5f7;\n --muted: rgb(245 245 247 / 0.62);\n --faint: rgb(245 245 247 / 0.38);\n --line: rgb(255 255 255 / 0.12);\n --hover: rgb(255 255 255 / 0.08);\n --on: rgb(255 255 255 / 0.16);\n --accent: #0a84ff;\n --record: #ff453a;\n position: fixed;\n z-index: 2147483647;\n color: var(--ink);\n font: 13px/1.2 -apple-system, BlinkMacSystemFont, \"SF Pro Text\", \"Inter\", system-ui, sans-serif;\n letter-spacing: -0.005em;\n background: rgb(30 30 32 / 0.84);\n backdrop-filter: blur(22px) saturate(1.5);\n -webkit-backdrop-filter: blur(22px) saturate(1.5);\n border: 0.5px solid var(--line);\n border-radius: 14px;\n box-shadow: 0 12px 32px rgb(0 0 0 / 0.32), 0 2px 6px rgb(0 0 0 / 0.18);\n cursor: default;\n -webkit-font-smoothing: antialiased;\n transition: opacity 180ms ease-out, translate 220ms cubic-bezier(0.22, 1, 0.36, 1), scale 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n.surface[data-leaving] { opacity: 0; translate: 0 6px; scale: 0.98; transition-duration: 120ms; }\n@starting-style { .surface { opacity: 0; translate: 0 8px; scale: 0.98; } }\n\nbutton {\n all: unset;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 30px;\n min-width: 30px;\n padding: 0 8px;\n border-radius: 8px;\n color: var(--ink);\n white-space: nowrap;\n cursor: default;\n transition: background-color 120ms ease-out, color 120ms ease-out, scale 120ms ease-out;\n}\nbutton:hover { background: var(--hover); }\nbutton:active { scale: 0.96; }\nbutton[aria-pressed=\"true\"] { background: var(--on); }\nbutton:disabled { color: var(--faint); background: none; scale: 1; }\nbutton:focus-visible, input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }\ninput.text:focus-visible { outline-offset: 0; }\nbutton svg { display: block; flex: none; }\n\n/* The toolbar */\n.bar { left: 50%; bottom: 22px; translate: -50% 0; display: flex; align-items: center; gap: 2px; padding: 5px; }\n.bar[data-leaving] { translate: -50% 6px; }\n@starting-style { .bar { translate: -50% 8px; } }\n.sep { width: 1px; height: 18px; margin: 0 4px; background: var(--line); }\n.go { margin-left: 4px; padding: 0 12px; background: var(--ink); color: #111; font-weight: 500; }\n.go:hover { background: #fff; }\n.go:disabled { background: rgb(255 255 255 / 0.14); color: var(--faint); }\n.label { color: var(--muted); }\n.chevron { color: var(--faint); }\n\n/* What's picked, and what it will make */\n.info {\n left: 50%; bottom: 72px; translate: -50% 0;\n display: flex; align-items: center; gap: 10px; padding: 7px 11px; border-radius: 10px;\n white-space: nowrap; max-width: calc(100vw - 32px);\n}\n@starting-style { .info { translate: -50% 6px; } }\n.info .what { color: var(--muted); overflow: hidden; text-overflow: ellipsis; max-width: 260px; }\n.info .size { font-variant-numeric: tabular-nums; }\n.info .warn { color: #ffd60a; }\n.info .keys { color: var(--faint); }\nkbd { font: inherit; padding: 1px 5px; border-radius: 4px; background: rgb(255 255 255 / 0.1); color: var(--muted); }\n\n/* The pick on the page */\n.outline {\n position: fixed; z-index: 2147483645; pointer-events: none; border-radius: 3px;\n border: 1.5px solid var(--accent, #0a84ff); background: rgb(10 132 255 / 0.08);\n transition: left 70ms ease-out, top 70ms ease-out, width 70ms ease-out, height 70ms ease-out;\n}\n.outline[data-picked] { box-shadow: 0 0 0 100vmax rgb(12 12 14 / 0.28); background: none; }\n.tag {\n position: absolute; left: -1.5px; bottom: calc(100% + 6px); padding: 3px 6px; border-radius: 5px;\n background: #0a84ff; color: white; font: 500 11px/1.2 -apple-system, BlinkMacSystemFont, system-ui, sans-serif;\n white-space: nowrap; max-width: 320px; overflow: hidden; text-overflow: ellipsis;\n}\n.catcher { position: fixed; inset: 0; z-index: 2147483644; cursor: crosshair; pointer-events: auto; }\n\n/* Options */\n.options {\n left: 50%; bottom: 72px; translate: -50% 0; width: 360px; max-height: calc(100vh - 110px); overflow: auto;\n padding: 8px 10px 10px; display: grid; gap: 2px;\n transform-origin: bottom center;\n}\n@starting-style { .options { translate: -50% 6px; scale: 0.98; } }\n.row { display: grid; grid-template-columns: 84px 1fr; align-items: center; gap: 8px; min-height: 36px; }\n.row > .name { color: var(--muted); }\n.row.sub > .name { color: var(--faint); padding-left: 10px; }\n.choices { display: flex; flex-wrap: wrap; align-items: center; gap: 2px; }\n.choices button { height: 26px; padding: 0 7px; }\n.switch { justify-self: start; }\n.switch[aria-checked=\"true\"] { background: var(--on); }\ninput[type=\"range\"] { width: 100%; accent-color: var(--ink); }\n.slider { display: grid; grid-template-columns: 1fr 42px; align-items: center; gap: 8px; }\n.slider output { color: var(--muted); text-align: right; font-variant-numeric: tabular-nums; }\n.swatches { display: flex; gap: 6px; flex-wrap: wrap; }\n.swatch { width: 26px; height: 26px; min-width: 0; padding: 0; border-radius: 999px; box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.18); }\n.swatch[aria-pressed=\"true\"] { box-shadow: 0 0 0 2px rgb(30 30 32), 0 0 0 4px var(--ink); background-clip: padding-box; }\ninput[type=\"color\"] { width: 30px; height: 26px; padding: 0; border: 0; border-radius: 6px; background: none; }\n.note { color: var(--faint); }\n.hint.warn { color: #ffd60a; border-top: 0; margin-top: 0; padding-top: 2px; line-height: 1.35; }\n.hint { color: var(--faint); padding: 8px 2px 0; border-top: 1px solid var(--line); margin-top: 6px; }\n\n/* While recording: above the frame, outside what's filmed, with a shadow too short to reach it */\n.hud { left: 50%; translate: -50% 0; display: flex; align-items: center; gap: 8px; padding: 5px 5px 5px 12px; border-radius: 999px; box-shadow: 0 1px 3px rgb(0 0 0 / 0.24); }\n@starting-style { .hud { translate: -50% -6px; } }\n.dot { width: 8px; height: 8px; border-radius: 999px; background: var(--record); animation: pulse 1.6s ease-in-out infinite; }\n@keyframes pulse { 50% { opacity: 0.45; } }\n.time { font-variant-numeric: tabular-nums; min-width: 34px; }\n.stop { border-radius: 999px; background: rgb(255 255 255 / 0.12); padding: 0 10px; }\n\n/* The result */\n.backdrop { pointer-events: auto; position: fixed; inset: 0; z-index: 2147483646; background: rgb(12 12 14 / 0.55); backdrop-filter: blur(6px); transition: opacity 180ms ease-out; }\n@starting-style { .backdrop { opacity: 0; } }\n.sheet {\n left: 50%; top: 50%; translate: -50% -50%; width: min(880px, calc(100vw - 48px));\n padding: 10px; display: grid; gap: 10px;\n}\n@starting-style { .sheet { translate: -50% calc(-50% + 10px); scale: 0.98; } }\n.media { display: grid; place-items: center; border-radius: 9px; overflow: hidden; background: rgb(0 0 0 / 0.35); max-height: calc(100vh - 160px); }\n.media video, .media img { display: block; max-width: 100%; max-height: calc(100vh - 160px); }\n.footer { display: flex; align-items: center; gap: 4px; padding: 0 2px 0 4px; }\n.footer .meta { color: var(--muted); font-variant-numeric: tabular-nums; margin-right: auto; }\n/* A page's own action counts its progress up in the same width. */\n.footer [data-action=\"take-action\"] span { font-variant-numeric: tabular-nums; }\n.toast { left: 50%; top: 22px; translate: -50% 0; padding: 9px 13px; border-radius: 10px; max-width: calc(100vw - 32px); }\n\n/* The script editor: Figma's pen, over the staged page */\n.paths { position: fixed; inset: 0; width: 100vw; height: 100vh; z-index: 2147483645; pointer-events: auto; cursor: crosshair; overflow: visible; }\n.paths .segment { fill: none; stroke: #0a84ff; stroke-width: 1.5; }\n.paths .node { cursor: move; }\n.paths .node circle { fill: #fff; stroke: #0a84ff; stroke-width: 1.5; }\n.paths .node.selected circle { fill: #0a84ff; }\n.paths .node.start circle { stroke-width: 2; }\n.paths .node .dot { fill: #0a84ff; stroke: none; }\n.paths .node.selected .dot { fill: #fff; }\n.paths .handle-line { stroke: #0a84ff; stroke-width: 1; }\n.paths .handle { fill: #fff; stroke: #0a84ff; stroke-width: 1.5; cursor: grab; }\n.paths .aim { fill: rgb(10 132 255 / 0.06); stroke: rgb(10 132 255 / 0.7); stroke-width: 1; stroke-dasharray: 3 3; pointer-events: none; }\n.labels { position: fixed; inset: 0; z-index: 2147483646; pointer-events: none; }\n.node-label {\n position: absolute; left: 0; top: 0; padding: 2px 6px; border-radius: 5px;\n background: rgb(30 30 32 / 0.84); color: #f5f5f7; font: 500 11px/1.3 -apple-system, BlinkMacSystemFont, system-ui, sans-serif; white-space: nowrap;\n}\n.node-label.selected { background: #0a84ff; color: #fff; }\n/* A point's settings sit in the corner, clear of what's being filmed in the middle. */\n.options.point { left: auto; right: 16px; translate: none; width: 320px; }\n@starting-style { .options.point { translate: 0 6px; } }\n.point .spread { flex-wrap: nowrap; justify-content: space-between; align-items: center; gap: 8px; min-width: 0; }\n.point .what { color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\ninput.text {\n box-sizing: border-box; width: 100%; height: 28px; padding: 0 8px; border-radius: 7px;\n font: inherit; color: var(--ink); background: rgb(255 255 255 / 0.08); border: 0.5px solid var(--line);\n}\ninput.text::placeholder { color: var(--faint); }\n\n@media (prefers-reduced-motion: reduce) {\n .surface, .backdrop, button, .outline { transition: none; }\n .dot { animation: none; }\n}\n";
@@ -0,0 +1,183 @@
1
+ /**
2
+ * The toolbar's look, inside its own shadow root so no page's styles reach it: dark glass like
3
+ * macOS's own screenshot toolbar, the system's font, quiet controls. Entrances ease out, exits
4
+ * are quicker, and nothing moves under reduced motion.
5
+ */
6
+ export const STYLES = /* css */ `
7
+ :host { all: initial; }
8
+ * { box-sizing: border-box; }
9
+ [hidden] { display: none !important; }
10
+
11
+ .surface {
12
+ pointer-events: auto;
13
+ --ink: #f5f5f7;
14
+ --muted: rgb(245 245 247 / 0.62);
15
+ --faint: rgb(245 245 247 / 0.38);
16
+ --line: rgb(255 255 255 / 0.12);
17
+ --hover: rgb(255 255 255 / 0.08);
18
+ --on: rgb(255 255 255 / 0.16);
19
+ --accent: #0a84ff;
20
+ --record: #ff453a;
21
+ position: fixed;
22
+ z-index: 2147483647;
23
+ color: var(--ink);
24
+ font: 13px/1.2 -apple-system, BlinkMacSystemFont, "SF Pro Text", "Inter", system-ui, sans-serif;
25
+ letter-spacing: -0.005em;
26
+ background: rgb(30 30 32 / 0.84);
27
+ backdrop-filter: blur(22px) saturate(1.5);
28
+ -webkit-backdrop-filter: blur(22px) saturate(1.5);
29
+ border: 0.5px solid var(--line);
30
+ border-radius: 14px;
31
+ box-shadow: 0 12px 32px rgb(0 0 0 / 0.32), 0 2px 6px rgb(0 0 0 / 0.18);
32
+ cursor: default;
33
+ -webkit-font-smoothing: antialiased;
34
+ transition: opacity 180ms ease-out, translate 220ms cubic-bezier(0.22, 1, 0.36, 1), scale 220ms cubic-bezier(0.22, 1, 0.36, 1);
35
+ }
36
+ .surface[data-leaving] { opacity: 0; translate: 0 6px; scale: 0.98; transition-duration: 120ms; }
37
+ @starting-style { .surface { opacity: 0; translate: 0 8px; scale: 0.98; } }
38
+
39
+ button {
40
+ all: unset;
41
+ box-sizing: border-box;
42
+ display: inline-flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ gap: 6px;
46
+ height: 30px;
47
+ min-width: 30px;
48
+ padding: 0 8px;
49
+ border-radius: 8px;
50
+ color: var(--ink);
51
+ white-space: nowrap;
52
+ cursor: default;
53
+ transition: background-color 120ms ease-out, color 120ms ease-out, scale 120ms ease-out;
54
+ }
55
+ button:hover { background: var(--hover); }
56
+ button:active { scale: 0.96; }
57
+ button[aria-pressed="true"] { background: var(--on); }
58
+ button:disabled { color: var(--faint); background: none; scale: 1; }
59
+ button:focus-visible, input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
60
+ input.text:focus-visible { outline-offset: 0; }
61
+ button svg { display: block; flex: none; }
62
+
63
+ /* The toolbar */
64
+ .bar { left: 50%; bottom: 22px; translate: -50% 0; display: flex; align-items: center; gap: 2px; padding: 5px; }
65
+ .bar[data-leaving] { translate: -50% 6px; }
66
+ @starting-style { .bar { translate: -50% 8px; } }
67
+ .sep { width: 1px; height: 18px; margin: 0 4px; background: var(--line); }
68
+ .go { margin-left: 4px; padding: 0 12px; background: var(--ink); color: #111; font-weight: 500; }
69
+ .go:hover { background: #fff; }
70
+ .go:disabled { background: rgb(255 255 255 / 0.14); color: var(--faint); }
71
+ .label { color: var(--muted); }
72
+ .chevron { color: var(--faint); }
73
+
74
+ /* What's picked, and what it will make */
75
+ .info {
76
+ left: 50%; bottom: 72px; translate: -50% 0;
77
+ display: flex; align-items: center; gap: 10px; padding: 7px 11px; border-radius: 10px;
78
+ white-space: nowrap; max-width: calc(100vw - 32px);
79
+ }
80
+ @starting-style { .info { translate: -50% 6px; } }
81
+ .info .what { color: var(--muted); overflow: hidden; text-overflow: ellipsis; max-width: 260px; }
82
+ .info .size { font-variant-numeric: tabular-nums; }
83
+ .info .warn { color: #ffd60a; }
84
+ .info .keys { color: var(--faint); }
85
+ kbd { font: inherit; padding: 1px 5px; border-radius: 4px; background: rgb(255 255 255 / 0.1); color: var(--muted); }
86
+
87
+ /* The pick on the page */
88
+ .outline {
89
+ position: fixed; z-index: 2147483645; pointer-events: none; border-radius: 3px;
90
+ border: 1.5px solid var(--accent, #0a84ff); background: rgb(10 132 255 / 0.08);
91
+ transition: left 70ms ease-out, top 70ms ease-out, width 70ms ease-out, height 70ms ease-out;
92
+ }
93
+ .outline[data-picked] { box-shadow: 0 0 0 100vmax rgb(12 12 14 / 0.28); background: none; }
94
+ .tag {
95
+ position: absolute; left: -1.5px; bottom: calc(100% + 6px); padding: 3px 6px; border-radius: 5px;
96
+ background: #0a84ff; color: white; font: 500 11px/1.2 -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
97
+ white-space: nowrap; max-width: 320px; overflow: hidden; text-overflow: ellipsis;
98
+ }
99
+ .catcher { position: fixed; inset: 0; z-index: 2147483644; cursor: crosshair; pointer-events: auto; }
100
+
101
+ /* Options */
102
+ .options {
103
+ left: 50%; bottom: 72px; translate: -50% 0; width: 360px; max-height: calc(100vh - 110px); overflow: auto;
104
+ padding: 8px 10px 10px; display: grid; gap: 2px;
105
+ transform-origin: bottom center;
106
+ }
107
+ @starting-style { .options { translate: -50% 6px; scale: 0.98; } }
108
+ .row { display: grid; grid-template-columns: 84px 1fr; align-items: center; gap: 8px; min-height: 36px; }
109
+ .row > .name { color: var(--muted); }
110
+ .row.sub > .name { color: var(--faint); padding-left: 10px; }
111
+ .choices { display: flex; flex-wrap: wrap; align-items: center; gap: 2px; }
112
+ .choices button { height: 26px; padding: 0 7px; }
113
+ .switch { justify-self: start; }
114
+ .switch[aria-checked="true"] { background: var(--on); }
115
+ input[type="range"] { width: 100%; accent-color: var(--ink); }
116
+ .slider { display: grid; grid-template-columns: 1fr 42px; align-items: center; gap: 8px; }
117
+ .slider output { color: var(--muted); text-align: right; font-variant-numeric: tabular-nums; }
118
+ .swatches { display: flex; gap: 6px; flex-wrap: wrap; }
119
+ .swatch { width: 26px; height: 26px; min-width: 0; padding: 0; border-radius: 999px; box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.18); }
120
+ .swatch[aria-pressed="true"] { box-shadow: 0 0 0 2px rgb(30 30 32), 0 0 0 4px var(--ink); background-clip: padding-box; }
121
+ input[type="color"] { width: 30px; height: 26px; padding: 0; border: 0; border-radius: 6px; background: none; }
122
+ .note { color: var(--faint); }
123
+ .hint.warn { color: #ffd60a; border-top: 0; margin-top: 0; padding-top: 2px; line-height: 1.35; }
124
+ .hint { color: var(--faint); padding: 8px 2px 0; border-top: 1px solid var(--line); margin-top: 6px; }
125
+
126
+ /* While recording: above the frame, outside what's filmed, with a shadow too short to reach it */
127
+ .hud { left: 50%; translate: -50% 0; display: flex; align-items: center; gap: 8px; padding: 5px 5px 5px 12px; border-radius: 999px; box-shadow: 0 1px 3px rgb(0 0 0 / 0.24); }
128
+ @starting-style { .hud { translate: -50% -6px; } }
129
+ .dot { width: 8px; height: 8px; border-radius: 999px; background: var(--record); animation: pulse 1.6s ease-in-out infinite; }
130
+ @keyframes pulse { 50% { opacity: 0.45; } }
131
+ .time { font-variant-numeric: tabular-nums; min-width: 34px; }
132
+ .stop { border-radius: 999px; background: rgb(255 255 255 / 0.12); padding: 0 10px; }
133
+
134
+ /* The result */
135
+ .backdrop { pointer-events: auto; position: fixed; inset: 0; z-index: 2147483646; background: rgb(12 12 14 / 0.55); backdrop-filter: blur(6px); transition: opacity 180ms ease-out; }
136
+ @starting-style { .backdrop { opacity: 0; } }
137
+ .sheet {
138
+ left: 50%; top: 50%; translate: -50% -50%; width: min(880px, calc(100vw - 48px));
139
+ padding: 10px; display: grid; gap: 10px;
140
+ }
141
+ @starting-style { .sheet { translate: -50% calc(-50% + 10px); scale: 0.98; } }
142
+ .media { display: grid; place-items: center; border-radius: 9px; overflow: hidden; background: rgb(0 0 0 / 0.35); max-height: calc(100vh - 160px); }
143
+ .media video, .media img { display: block; max-width: 100%; max-height: calc(100vh - 160px); }
144
+ .footer { display: flex; align-items: center; gap: 4px; padding: 0 2px 0 4px; }
145
+ .footer .meta { color: var(--muted); font-variant-numeric: tabular-nums; margin-right: auto; }
146
+ /* A page's own action counts its progress up in the same width. */
147
+ .footer [data-action="take-action"] span { font-variant-numeric: tabular-nums; }
148
+ .toast { left: 50%; top: 22px; translate: -50% 0; padding: 9px 13px; border-radius: 10px; max-width: calc(100vw - 32px); }
149
+
150
+ /* The script editor: Figma's pen, over the staged page */
151
+ .paths { position: fixed; inset: 0; width: 100vw; height: 100vh; z-index: 2147483645; pointer-events: auto; cursor: crosshair; overflow: visible; }
152
+ .paths .segment { fill: none; stroke: #0a84ff; stroke-width: 1.5; }
153
+ .paths .node { cursor: move; }
154
+ .paths .node circle { fill: #fff; stroke: #0a84ff; stroke-width: 1.5; }
155
+ .paths .node.selected circle { fill: #0a84ff; }
156
+ .paths .node.start circle { stroke-width: 2; }
157
+ .paths .node .dot { fill: #0a84ff; stroke: none; }
158
+ .paths .node.selected .dot { fill: #fff; }
159
+ .paths .handle-line { stroke: #0a84ff; stroke-width: 1; }
160
+ .paths .handle { fill: #fff; stroke: #0a84ff; stroke-width: 1.5; cursor: grab; }
161
+ .paths .aim { fill: rgb(10 132 255 / 0.06); stroke: rgb(10 132 255 / 0.7); stroke-width: 1; stroke-dasharray: 3 3; pointer-events: none; }
162
+ .labels { position: fixed; inset: 0; z-index: 2147483646; pointer-events: none; }
163
+ .node-label {
164
+ position: absolute; left: 0; top: 0; padding: 2px 6px; border-radius: 5px;
165
+ background: rgb(30 30 32 / 0.84); color: #f5f5f7; font: 500 11px/1.3 -apple-system, BlinkMacSystemFont, system-ui, sans-serif; white-space: nowrap;
166
+ }
167
+ .node-label.selected { background: #0a84ff; color: #fff; }
168
+ /* A point's settings sit in the corner, clear of what's being filmed in the middle. */
169
+ .options.point { left: auto; right: 16px; translate: none; width: 320px; }
170
+ @starting-style { .options.point { translate: 0 6px; } }
171
+ .point .spread { flex-wrap: nowrap; justify-content: space-between; align-items: center; gap: 8px; min-width: 0; }
172
+ .point .what { color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
173
+ input.text {
174
+ box-sizing: border-box; width: 100%; height: 28px; padding: 0 8px; border-radius: 7px;
175
+ font: inherit; color: var(--ink); background: rgb(255 255 255 / 0.08); border: 0.5px solid var(--line);
176
+ }
177
+ input.text::placeholder { color: var(--faint); }
178
+
179
+ @media (prefers-reduced-motion: reduce) {
180
+ .surface, .backdrop, button, .outline { transition: none; }
181
+ .dot { animation: none; }
182
+ }
183
+ `;
package/package.json CHANGED
@@ -1,6 +1,38 @@
1
1
  {
2
2
  "name": "@cesarvenzac/closeup",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "Film any part of a web page in close-up, sharp at any size: photos and videos with a drawn cursor, backgrounds and sound.",
5
+ "keywords": ["screen-recording", "screencast", "screenshot", "video", "cursor", "demo", "region-capture", "browser"],
6
+ "homepage": "https://github.com/cesarvenzac/closeup#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/cesarvenzac/closeup.git"
10
+ },
11
+ "bugs": "https://github.com/cesarvenzac/closeup/issues",
12
+ "author": "César Venzac (https://cesarvenzac.com)",
13
+ "license": "MIT",
14
+ "type": "module",
15
+ "sideEffects": false,
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": ["dist"],
24
+ "scripts": {
25
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
26
+ "typecheck": "tsc --noEmit",
27
+ "test": "vitest run",
28
+ "check": "sh check/run.sh",
29
+ "prepublishOnly": "npm run build"
30
+ },
31
+ "devDependencies": {
32
+ "typescript": "^5.9.3",
33
+ "vitest": "^5.0.3"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ }
38
+ }