@dualityinstitute/blink 0.0.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 (31) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +160 -0
  3. package/assets/AppIcon.icns +0 -0
  4. package/assets/tray/iconTemplate-error.png +0 -0
  5. package/assets/tray/iconTemplate-error@2x.png +0 -0
  6. package/assets/tray/iconTemplate-hidden.png +0 -0
  7. package/assets/tray/iconTemplate-hidden@2x.png +0 -0
  8. package/assets/tray/iconTemplate-monitoring.png +0 -0
  9. package/assets/tray/iconTemplate-monitoring@2x.png +0 -0
  10. package/assets/tray/iconTemplate-processing-b.png +0 -0
  11. package/assets/tray/iconTemplate-processing-b@2x.png +0 -0
  12. package/assets/tray/iconTemplate-processing.png +0 -0
  13. package/assets/tray/iconTemplate-processing@2x.png +0 -0
  14. package/assets/tray/iconTemplate.png +0 -0
  15. package/assets/tray/iconTemplate@2x.png +0 -0
  16. package/dist/cli.js +20463 -0
  17. package/dist/electron/fsevents-1bczt1x4.node +0 -0
  18. package/dist/electron/main.js +28529 -0
  19. package/dist/electron/preload.cjs +115 -0
  20. package/dist/electron/renderer/popup.css +815 -0
  21. package/dist/electron/renderer/popup.html +141 -0
  22. package/dist/electron/renderer/popup.js +4087 -0
  23. package/dist/electron/renderer/presenter.css +455 -0
  24. package/dist/electron/renderer/presenter.html +75 -0
  25. package/dist/electron/renderer/presenter.js +3870 -0
  26. package/package.json +76 -0
  27. package/vendor/Blink.app/Contents/Helpers/BlinkAudio +0 -0
  28. package/vendor/Blink.app/Contents/Info.plist +30 -0
  29. package/vendor/Blink.app/Contents/MacOS/Blink +0 -0
  30. package/vendor/Blink.app/Contents/Resources/AppIcon.icns +0 -0
  31. package/vendor/Blink.app/Contents/_CodeSignature/CodeResources +137 -0
@@ -0,0 +1,455 @@
1
+ :root {
2
+ color-scheme: light dark;
3
+ --paper: rgba(248, 244, 235, 0.74);
4
+ --paper-strong: #fbf7ee;
5
+ --ink: #26231f;
6
+ --muted: #777068;
7
+ --faint: #6f675f;
8
+ --rule: rgba(58, 49, 40, 0.13);
9
+ --accent: #a84d2a;
10
+ --private: #2c715d;
11
+ --private-soft: rgba(44, 113, 93, 0.13);
12
+ --danger: #aa342e;
13
+ --code: rgba(75, 62, 48, 0.08);
14
+ --shadow: 0 26px 80px rgba(35, 28, 20, 0.24), 0 4px 14px rgba(35, 28, 20, 0.12);
15
+ --font-ui: "Avenir Next", "Helvetica Neue", sans-serif;
16
+ --font-editor: "SF Mono", "IBM Plex Mono", Menlo, monospace;
17
+ --font-stage: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
18
+ }
19
+
20
+ @media (prefers-color-scheme: dark) {
21
+ :root {
22
+ --paper: rgba(28, 27, 25, 0.76);
23
+ --paper-strong: #22211f;
24
+ --ink: #f2ede4;
25
+ --muted: #aca59b;
26
+ --faint: #aaa297;
27
+ --rule: rgba(255, 245, 229, 0.12);
28
+ --accent: #dc815c;
29
+ --private: #76c8ad;
30
+ --private-soft: rgba(118, 200, 173, 0.14);
31
+ --danger: #ff8a82;
32
+ --code: rgba(255, 244, 226, 0.09);
33
+ --shadow: 0 28px 90px rgba(0, 0, 0, 0.55), 0 4px 14px rgba(0, 0, 0, 0.34);
34
+ }
35
+ }
36
+
37
+ * {
38
+ box-sizing: border-box;
39
+ }
40
+
41
+ [hidden] {
42
+ display: none !important;
43
+ }
44
+
45
+ html,
46
+ body {
47
+ width: 100%;
48
+ height: 100%;
49
+ margin: 0;
50
+ background: transparent;
51
+ color: var(--ink);
52
+ font-family: var(--font-ui);
53
+ -webkit-font-smoothing: antialiased;
54
+ overflow: hidden;
55
+ }
56
+
57
+ button,
58
+ textarea,
59
+ input {
60
+ font: inherit;
61
+ }
62
+
63
+ button,
64
+ label {
65
+ -webkit-app-region: no-drag;
66
+ }
67
+
68
+ .shell {
69
+ display: flex;
70
+ flex-direction: column;
71
+ width: 100%;
72
+ height: 100%;
73
+ overflow: hidden;
74
+ background: var(--paper);
75
+ border: 1px solid var(--rule);
76
+ border-radius: 18px;
77
+ box-shadow: var(--shadow);
78
+ backdrop-filter: blur(28px) saturate(130%);
79
+ -webkit-backdrop-filter: blur(28px) saturate(130%);
80
+ }
81
+
82
+ .toolbar {
83
+ -webkit-app-region: drag;
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ gap: 18px;
88
+ min-height: 62px;
89
+ padding: 12px 14px 11px 20px;
90
+ border-bottom: 1px solid var(--rule);
91
+ flex: 0 0 auto;
92
+ }
93
+
94
+ .window-title {
95
+ color: var(--ink);
96
+ font-size: 13px;
97
+ font-weight: 700;
98
+ letter-spacing: 0.035em;
99
+ }
100
+
101
+ .toolbar-actions {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 8px;
105
+ flex: 0 0 auto;
106
+ }
107
+
108
+ .privacy-control {
109
+ display: inline-flex;
110
+ align-items: center;
111
+ gap: 7px;
112
+ height: 30px;
113
+ padding: 0 11px 0 9px;
114
+ border: 1px solid var(--rule);
115
+ border-radius: 999px;
116
+ color: var(--muted);
117
+ background: rgba(255, 255, 255, 0.08);
118
+ font-size: 12px;
119
+ font-weight: 600;
120
+ cursor: default;
121
+ transition: color 140ms ease, background 140ms ease, border-color 140ms ease;
122
+ }
123
+
124
+ .privacy-control input {
125
+ position: absolute;
126
+ opacity: 0;
127
+ pointer-events: none;
128
+ }
129
+
130
+ .privacy-indicator {
131
+ width: 8px;
132
+ height: 8px;
133
+ border: 1.5px solid currentColor;
134
+ border-radius: 50%;
135
+ }
136
+
137
+ .privacy-control.is-private {
138
+ color: var(--private);
139
+ background: var(--private-soft);
140
+ border-color: color-mix(in srgb, var(--private) 35%, transparent);
141
+ }
142
+
143
+ .privacy-control.is-private .privacy-indicator {
144
+ background: currentColor;
145
+ box-shadow: inset 0 0 0 2px var(--paper-strong);
146
+ }
147
+
148
+ .privacy-control:focus-within {
149
+ outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
150
+ outline-offset: 2px;
151
+ }
152
+
153
+ .primary-button,
154
+ .icon-button {
155
+ border: 0;
156
+ color: var(--ink);
157
+ cursor: default;
158
+ }
159
+
160
+ .primary-button {
161
+ display: inline-flex;
162
+ align-items: center;
163
+ height: 32px;
164
+ padding: 0 12px;
165
+ border-radius: 9px;
166
+ background: var(--ink);
167
+ color: var(--paper-strong);
168
+ font-size: 12px;
169
+ font-weight: 700;
170
+ transition: transform 120ms ease, opacity 120ms ease;
171
+ }
172
+
173
+ .primary-button:hover {
174
+ opacity: 0.88;
175
+ }
176
+
177
+ .primary-button:active {
178
+ transform: translateY(1px);
179
+ }
180
+
181
+ kbd {
182
+ font-family: var(--font-editor);
183
+ font-size: 10px;
184
+ font-weight: 500;
185
+ opacity: 0.66;
186
+ }
187
+
188
+ .icon-button {
189
+ display: inline-grid;
190
+ place-items: center;
191
+ width: 30px;
192
+ height: 30px;
193
+ padding: 0;
194
+ border-radius: 9px;
195
+ background: transparent;
196
+ color: var(--muted);
197
+ font-size: 20px;
198
+ line-height: 1;
199
+ }
200
+
201
+ .icon-button:hover,
202
+ .icon-button:focus-visible {
203
+ background: var(--code);
204
+ color: var(--ink);
205
+ outline: none;
206
+ }
207
+
208
+ .editor-view {
209
+ display: grid;
210
+ grid-template-rows: auto minmax(0, 1fr) auto;
211
+ min-height: 0;
212
+ flex: 1 1 auto;
213
+ }
214
+
215
+ .editor-intro {
216
+ padding: 17px 30px 12px;
217
+ }
218
+
219
+ .editor-intro h1 {
220
+ margin: 0;
221
+ color: var(--muted);
222
+ font-family: var(--font-ui);
223
+ font-size: 13px;
224
+ font-weight: 600;
225
+ letter-spacing: 0.025em;
226
+ }
227
+
228
+ .empty-stage h1 {
229
+ margin: 0;
230
+ font-family: var(--font-stage);
231
+ font-size: clamp(22px, 3.4vw, 30px);
232
+ font-weight: 500;
233
+ letter-spacing: -0.025em;
234
+ }
235
+
236
+ #editor {
237
+ width: calc(100% - 60px);
238
+ height: 100%;
239
+ min-height: 0;
240
+ margin: 0 30px;
241
+ padding: 20px 0;
242
+ resize: none;
243
+ border: 0;
244
+ border-top: 1px solid var(--rule);
245
+ border-bottom: 1px solid var(--rule);
246
+ outline: none;
247
+ background: transparent;
248
+ color: var(--ink);
249
+ caret-color: var(--accent);
250
+ font-family: var(--font-editor);
251
+ font-size: 14px;
252
+ line-height: 1.75;
253
+ tab-size: 2;
254
+ }
255
+
256
+ .editor-footer,
257
+ .stage-footer {
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: space-between;
261
+ min-height: 42px;
262
+ padding: 0 30px;
263
+ color: var(--faint);
264
+ font-size: 11px;
265
+ letter-spacing: 0.025em;
266
+ }
267
+
268
+ .save-status.is-error {
269
+ color: var(--danger);
270
+ }
271
+
272
+ .save-status {
273
+ min-width: 0;
274
+ overflow: hidden;
275
+ text-overflow: ellipsis;
276
+ white-space: nowrap;
277
+ }
278
+
279
+ .present-view {
280
+ position: relative;
281
+ display: flex;
282
+ flex-direction: column;
283
+ min-height: 0;
284
+ flex: 1 1 auto;
285
+ overflow-y: auto;
286
+ scrollbar-width: thin;
287
+ scrollbar-color: var(--faint) transparent;
288
+ }
289
+
290
+ .present-view:focus-visible {
291
+ outline: 2px solid color-mix(in srgb, var(--accent) 55%, transparent);
292
+ outline-offset: -3px;
293
+ }
294
+
295
+ .stage {
296
+ width: min(100% - 80px, 900px);
297
+ margin: auto;
298
+ padding: 48px 0 42px;
299
+ font-family: var(--font-stage);
300
+ font-size: clamp(16px, 2.2vw, 20px);
301
+ line-height: 1.62;
302
+ }
303
+
304
+ .empty-stage {
305
+ margin: auto;
306
+ text-align: center;
307
+ }
308
+
309
+ .stage-footer {
310
+ position: sticky;
311
+ bottom: 0;
312
+ min-height: 38px;
313
+ background: linear-gradient(transparent, var(--paper) 45%);
314
+ color: var(--muted);
315
+ flex: 0 0 auto;
316
+ }
317
+
318
+ .stage-footer kbd {
319
+ font-size: 11px;
320
+ opacity: 0.82;
321
+ }
322
+
323
+ .markdown > :first-child {
324
+ margin-top: 0;
325
+ }
326
+
327
+ .markdown {
328
+ overflow-wrap: anywhere;
329
+ word-break: normal;
330
+ }
331
+
332
+ .markdown > :last-child {
333
+ margin-bottom: 0;
334
+ }
335
+
336
+ .markdown h1,
337
+ .markdown h2,
338
+ .markdown h3 {
339
+ color: var(--ink);
340
+ font-weight: 600;
341
+ line-height: 1.14;
342
+ letter-spacing: -0.025em;
343
+ }
344
+
345
+ .markdown h1 {
346
+ margin: 0 0 0.7em;
347
+ font-size: 1.9em;
348
+ }
349
+
350
+ .markdown h2 {
351
+ margin: 1.45em 0 0.55em;
352
+ font-size: 1.35em;
353
+ }
354
+
355
+ .markdown h3 {
356
+ margin: 1.25em 0 0.45em;
357
+ font-family: var(--font-ui);
358
+ font-size: 0.86em;
359
+ letter-spacing: 0.04em;
360
+ text-transform: uppercase;
361
+ }
362
+
363
+ .markdown p,
364
+ .markdown ul,
365
+ .markdown ol,
366
+ .markdown blockquote {
367
+ margin: 0 0 1em;
368
+ }
369
+
370
+ .markdown ul,
371
+ .markdown ol {
372
+ padding-left: 1.35em;
373
+ }
374
+
375
+ .markdown li {
376
+ margin: 0.35em 0;
377
+ padding-left: 0.2em;
378
+ }
379
+
380
+ .markdown li::marker {
381
+ color: var(--accent);
382
+ }
383
+
384
+ .markdown blockquote {
385
+ margin-left: 0;
386
+ padding: 0.1em 0 0.1em 1em;
387
+ border-left: 3px solid var(--accent);
388
+ color: var(--muted);
389
+ font-style: italic;
390
+ }
391
+
392
+ .markdown code {
393
+ padding: 0.12em 0.35em;
394
+ border-radius: 5px;
395
+ background: var(--code);
396
+ font-family: var(--font-editor);
397
+ font-size: 0.72em;
398
+ }
399
+
400
+ .markdown pre {
401
+ overflow-x: auto;
402
+ padding: 16px 18px;
403
+ border: 1px solid var(--rule);
404
+ border-radius: 12px;
405
+ background: var(--code);
406
+ font-family: var(--font-editor);
407
+ font-size: 0.66em;
408
+ line-height: 1.55;
409
+ }
410
+
411
+ .markdown pre code {
412
+ padding: 0;
413
+ background: none;
414
+ font-size: inherit;
415
+ }
416
+
417
+ .markdown hr {
418
+ height: 1px;
419
+ margin: 2em 0;
420
+ border: 0;
421
+ background: var(--rule);
422
+ }
423
+
424
+ @media (max-width: 620px) {
425
+ .toolbar {
426
+ padding-left: 15px;
427
+ }
428
+
429
+ .editor-intro {
430
+ padding: 16px 22px 10px;
431
+ }
432
+
433
+ #editor {
434
+ width: calc(100% - 44px);
435
+ margin: 0 22px;
436
+ }
437
+
438
+ .editor-footer,
439
+ .stage-footer {
440
+ padding-inline: 22px;
441
+ }
442
+
443
+ .stage {
444
+ width: calc(100% - 44px);
445
+ }
446
+ }
447
+
448
+ @media (prefers-reduced-motion: reduce) {
449
+ *,
450
+ *::before,
451
+ *::after {
452
+ scroll-behavior: auto !important;
453
+ transition: none !important;
454
+ }
455
+ }
@@ -0,0 +1,75 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta
6
+ http-equiv="Content-Security-Policy"
7
+ content="default-src 'none'; script-src 'self'; style-src 'self'; img-src data:; font-src 'self'; connect-src 'none';"
8
+ />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
10
+ <title>Blink Presenter Notes</title>
11
+ <link rel="stylesheet" href="./presenter.css" />
12
+ </head>
13
+ <body>
14
+ <main id="app" class="shell" data-mode="edit">
15
+ <header class="toolbar">
16
+ <div class="identity">
17
+ <span class="window-title">Blink / Presenter</span>
18
+ </div>
19
+
20
+ <div class="toolbar-actions">
21
+ <label class="privacy-control" title="Hide all Blink windows from screen capture">
22
+ <input
23
+ id="privacy"
24
+ type="checkbox"
25
+ aria-label="Hide Blink windows from screen capture"
26
+ />
27
+ <span class="privacy-indicator" aria-hidden="true"></span>
28
+ <span id="privacy-label">Visible</span>
29
+ </label>
30
+ <button id="mode-toggle" class="primary-button" type="button">Present</button>
31
+ <button
32
+ id="close"
33
+ class="icon-button"
34
+ type="button"
35
+ title="Hide notes"
36
+ aria-label="Hide presenter notes"
37
+ >×</button>
38
+ </div>
39
+ </header>
40
+
41
+ <section id="editor-view" class="editor-view" aria-label="Markdown editor">
42
+ <div class="editor-intro">
43
+ <h1>Write Markdown Below</h1>
44
+ </div>
45
+ <textarea
46
+ id="editor"
47
+ aria-label="Presenter notes in Markdown"
48
+ spellcheck="true"
49
+ ></textarea>
50
+ <footer class="editor-footer">
51
+ <span id="save-status" class="save-status" role="status" aria-live="polite">Saved locally</span>
52
+ <span id="word-count" class="word-count">0 words</span>
53
+ </footer>
54
+ </section>
55
+
56
+ <section
57
+ id="present-view"
58
+ class="present-view"
59
+ aria-label="Rendered presentation"
60
+ tabindex="0"
61
+ hidden
62
+ >
63
+ <article id="preview" class="stage markdown"></article>
64
+ <div id="empty-stage" class="empty-stage" hidden>
65
+ <h1>No notes yet.</h1>
66
+ </div>
67
+ <footer class="stage-footer">
68
+ <span>Presenter view</span>
69
+ <span><kbd>⌃⌘↑↓</kbd> scroll</span>
70
+ </footer>
71
+ </section>
72
+ </main>
73
+ <script src="./presenter.js"></script>
74
+ </body>
75
+ </html>