floatnote 1.0.0 → 1.0.5
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.
- package/bin/floatnote.js +16 -0
- package/package.json +13 -5
- package/.beads/config.json +0 -6
- package/.beads/issues/floatnote-1.md +0 -21
- package/.beads/issues/floatnote-10.md +0 -28
- package/.beads/issues/floatnote-11.md +0 -36
- package/.beads/issues/floatnote-12.md +0 -25
- package/.beads/issues/floatnote-13.md +0 -37
- package/.beads/issues/floatnote-14.md +0 -22
- package/.beads/issues/floatnote-15.md +0 -22
- package/.beads/issues/floatnote-16.md +0 -20
- package/.beads/issues/floatnote-17.md +0 -20
- package/.beads/issues/floatnote-18.md +0 -21
- package/.beads/issues/floatnote-19.md +0 -19
- package/.beads/issues/floatnote-2.md +0 -32
- package/.beads/issues/floatnote-20.md +0 -22
- package/.beads/issues/floatnote-3.md +0 -50
- package/.beads/issues/floatnote-4.md +0 -31
- package/.beads/issues/floatnote-5.md +0 -28
- package/.beads/issues/floatnote-6.md +0 -30
- package/.beads/issues/floatnote-7.md +0 -38
- package/.beads/issues/floatnote-8.md +0 -29
- package/.beads/issues/floatnote-9.md +0 -32
- package/CLAUDE.md +0 -61
- package/coverage/base.css +0 -224
- package/coverage/bin/floatnote.js.html +0 -739
- package/coverage/bin/index.html +0 -116
- package/coverage/block-navigation.js +0 -87
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -131
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/bin/floatnote.js.html +0 -739
- package/coverage/lcov-report/bin/index.html +0 -116
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -131
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -210
- package/coverage/lcov-report/src/index.html +0 -146
- package/coverage/lcov-report/src/main.js.html +0 -1483
- package/coverage/lcov-report/src/preload.js.html +0 -361
- package/coverage/lcov-report/src/renderer.js.html +0 -8767
- package/coverage/lcov.info +0 -3273
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/src/index.html +0 -146
- package/coverage/src/main.js.html +0 -1483
- package/coverage/src/preload.js.html +0 -361
- package/coverage/src/renderer.js.html +0 -8767
- package/jest.config.js +0 -48
- package/src/icon-template.png +0 -0
- package/src/index.html +0 -296
- package/src/main.js +0 -494
- package/src/preload.js +0 -96
- package/src/renderer.js +0 -3203
- package/src/styles.css +0 -1448
- package/tests/cli/floatnote.test.js +0 -167
- package/tests/main/main.test.js +0 -287
- package/tests/mocks/electron.js +0 -126
- package/tests/mocks/fs.js +0 -17
- package/tests/preload/preload.test.js +0 -218
- package/tests/renderer/history.test.js +0 -234
- package/tests/renderer/notes.test.js +0 -262
- package/tests/renderer/settings.test.js +0 -178
package/CLAUDE.md
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
-
|
|
5
|
-
## Project Overview
|
|
6
|
-
|
|
7
|
-
Floatnote is a transparent always-on-top drawing and note-taking overlay for macOS, built with Electron. It provides a floating canvas that stays above all other windows for annotations, drawing, and text notes.
|
|
8
|
-
|
|
9
|
-
## Commands
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm start # Run the app
|
|
13
|
-
npm run dev # Run with logging enabled
|
|
14
|
-
npm run build # Build distributable (electron-builder)
|
|
15
|
-
npm test # Run all tests
|
|
16
|
-
npm run test:watch # Run tests in watch mode
|
|
17
|
-
npm run test:coverage # Run tests with coverage report
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Run a single test file:
|
|
21
|
-
```bash
|
|
22
|
-
npx jest tests/renderer/notes.test.js
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Run tests for a specific project (main, renderer, cli, preload):
|
|
26
|
-
```bash
|
|
27
|
-
npx jest --selectProjects=renderer
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Architecture
|
|
31
|
-
|
|
32
|
-
### Electron Process Model
|
|
33
|
-
|
|
34
|
-
- **Main process** (`src/main.js`): Window management, global shortcuts, IPC handlers, tray menu, data persistence. Single-window architecture with `requestSingleInstanceLock()`.
|
|
35
|
-
|
|
36
|
-
- **Preload** (`src/preload.js`): Exposes `window.glassboard` API via contextBridge. Handles IPC communication, clipboard access, and file operations.
|
|
37
|
-
|
|
38
|
-
- **Renderer** (`src/renderer.js`): The `Glassboard` class manages the entire UI - canvas drawing, text overlays, multi-note system, gestures, undo/redo, and settings.
|
|
39
|
-
|
|
40
|
-
### Key Data Structures
|
|
41
|
-
|
|
42
|
-
Notes are stored as objects with `lines`, `textItems`, `images`, and `attachments` arrays. The current note is accessed via getters that delegate to `this.notes[this.currentNoteIndex]`.
|
|
43
|
-
|
|
44
|
-
Data persists to `~/.config/floatnote/floatnote-data.json` (via Electron's userData path). Notes can also be exported to `~/.floatnote/`.
|
|
45
|
-
|
|
46
|
-
### IPC Communication
|
|
47
|
-
|
|
48
|
-
Main ↔ Renderer communication uses named channels:
|
|
49
|
-
- `close-window`, `hide-window`, `set-pinned`, `set-window-size`, `set-background-mode` (send)
|
|
50
|
-
- `save-data`, `load-data`, `export-to-floatnote`, `export-png` (invoke/handle)
|
|
51
|
-
- `window-focus`, `background-mode-changed`, `window-toggled-open` (events to renderer)
|
|
52
|
-
|
|
53
|
-
### Testing
|
|
54
|
-
|
|
55
|
-
Jest with separate projects for different contexts:
|
|
56
|
-
- `main`: Uses electron mock (`tests/mocks/electron.js`)
|
|
57
|
-
- `renderer`: Uses jsdom environment
|
|
58
|
-
- `preload`: Uses electron mock
|
|
59
|
-
- `cli`: Node environment for CLI tests
|
|
60
|
-
|
|
61
|
-
The electron mock simulates BrowserWindow, app, globalShortcut, and other Electron APIs.
|
package/coverage/base.css
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
body, html {
|
|
2
|
-
margin:0; padding: 0;
|
|
3
|
-
height: 100%;
|
|
4
|
-
}
|
|
5
|
-
body {
|
|
6
|
-
font-family: Helvetica Neue, Helvetica, Arial;
|
|
7
|
-
font-size: 14px;
|
|
8
|
-
color:#333;
|
|
9
|
-
}
|
|
10
|
-
.small { font-size: 12px; }
|
|
11
|
-
*, *:after, *:before {
|
|
12
|
-
-webkit-box-sizing:border-box;
|
|
13
|
-
-moz-box-sizing:border-box;
|
|
14
|
-
box-sizing:border-box;
|
|
15
|
-
}
|
|
16
|
-
h1 { font-size: 20px; margin: 0;}
|
|
17
|
-
h2 { font-size: 14px; }
|
|
18
|
-
pre {
|
|
19
|
-
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
|
20
|
-
margin: 0;
|
|
21
|
-
padding: 0;
|
|
22
|
-
-moz-tab-size: 2;
|
|
23
|
-
-o-tab-size: 2;
|
|
24
|
-
tab-size: 2;
|
|
25
|
-
}
|
|
26
|
-
a { color:#0074D9; text-decoration:none; }
|
|
27
|
-
a:hover { text-decoration:underline; }
|
|
28
|
-
.strong { font-weight: bold; }
|
|
29
|
-
.space-top1 { padding: 10px 0 0 0; }
|
|
30
|
-
.pad2y { padding: 20px 0; }
|
|
31
|
-
.pad1y { padding: 10px 0; }
|
|
32
|
-
.pad2x { padding: 0 20px; }
|
|
33
|
-
.pad2 { padding: 20px; }
|
|
34
|
-
.pad1 { padding: 10px; }
|
|
35
|
-
.space-left2 { padding-left:55px; }
|
|
36
|
-
.space-right2 { padding-right:20px; }
|
|
37
|
-
.center { text-align:center; }
|
|
38
|
-
.clearfix { display:block; }
|
|
39
|
-
.clearfix:after {
|
|
40
|
-
content:'';
|
|
41
|
-
display:block;
|
|
42
|
-
height:0;
|
|
43
|
-
clear:both;
|
|
44
|
-
visibility:hidden;
|
|
45
|
-
}
|
|
46
|
-
.fl { float: left; }
|
|
47
|
-
@media only screen and (max-width:640px) {
|
|
48
|
-
.col3 { width:100%; max-width:100%; }
|
|
49
|
-
.hide-mobile { display:none!important; }
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.quiet {
|
|
53
|
-
color: #7f7f7f;
|
|
54
|
-
color: rgba(0,0,0,0.5);
|
|
55
|
-
}
|
|
56
|
-
.quiet a { opacity: 0.7; }
|
|
57
|
-
|
|
58
|
-
.fraction {
|
|
59
|
-
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
|
|
60
|
-
font-size: 10px;
|
|
61
|
-
color: #555;
|
|
62
|
-
background: #E8E8E8;
|
|
63
|
-
padding: 4px 5px;
|
|
64
|
-
border-radius: 3px;
|
|
65
|
-
vertical-align: middle;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
div.path a:link, div.path a:visited { color: #333; }
|
|
69
|
-
table.coverage {
|
|
70
|
-
border-collapse: collapse;
|
|
71
|
-
margin: 10px 0 0 0;
|
|
72
|
-
padding: 0;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
table.coverage td {
|
|
76
|
-
margin: 0;
|
|
77
|
-
padding: 0;
|
|
78
|
-
vertical-align: top;
|
|
79
|
-
}
|
|
80
|
-
table.coverage td.line-count {
|
|
81
|
-
text-align: right;
|
|
82
|
-
padding: 0 5px 0 20px;
|
|
83
|
-
}
|
|
84
|
-
table.coverage td.line-coverage {
|
|
85
|
-
text-align: right;
|
|
86
|
-
padding-right: 10px;
|
|
87
|
-
min-width:20px;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
table.coverage td span.cline-any {
|
|
91
|
-
display: inline-block;
|
|
92
|
-
padding: 0 5px;
|
|
93
|
-
width: 100%;
|
|
94
|
-
}
|
|
95
|
-
.missing-if-branch {
|
|
96
|
-
display: inline-block;
|
|
97
|
-
margin-right: 5px;
|
|
98
|
-
border-radius: 3px;
|
|
99
|
-
position: relative;
|
|
100
|
-
padding: 0 4px;
|
|
101
|
-
background: #333;
|
|
102
|
-
color: yellow;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.skip-if-branch {
|
|
106
|
-
display: none;
|
|
107
|
-
margin-right: 10px;
|
|
108
|
-
position: relative;
|
|
109
|
-
padding: 0 4px;
|
|
110
|
-
background: #ccc;
|
|
111
|
-
color: white;
|
|
112
|
-
}
|
|
113
|
-
.missing-if-branch .typ, .skip-if-branch .typ {
|
|
114
|
-
color: inherit !important;
|
|
115
|
-
}
|
|
116
|
-
.coverage-summary {
|
|
117
|
-
border-collapse: collapse;
|
|
118
|
-
width: 100%;
|
|
119
|
-
}
|
|
120
|
-
.coverage-summary tr { border-bottom: 1px solid #bbb; }
|
|
121
|
-
.keyline-all { border: 1px solid #ddd; }
|
|
122
|
-
.coverage-summary td, .coverage-summary th { padding: 10px; }
|
|
123
|
-
.coverage-summary tbody { border: 1px solid #bbb; }
|
|
124
|
-
.coverage-summary td { border-right: 1px solid #bbb; }
|
|
125
|
-
.coverage-summary td:last-child { border-right: none; }
|
|
126
|
-
.coverage-summary th {
|
|
127
|
-
text-align: left;
|
|
128
|
-
font-weight: normal;
|
|
129
|
-
white-space: nowrap;
|
|
130
|
-
}
|
|
131
|
-
.coverage-summary th.file { border-right: none !important; }
|
|
132
|
-
.coverage-summary th.pct { }
|
|
133
|
-
.coverage-summary th.pic,
|
|
134
|
-
.coverage-summary th.abs,
|
|
135
|
-
.coverage-summary td.pct,
|
|
136
|
-
.coverage-summary td.abs { text-align: right; }
|
|
137
|
-
.coverage-summary td.file { white-space: nowrap; }
|
|
138
|
-
.coverage-summary td.pic { min-width: 120px !important; }
|
|
139
|
-
.coverage-summary tfoot td { }
|
|
140
|
-
|
|
141
|
-
.coverage-summary .sorter {
|
|
142
|
-
height: 10px;
|
|
143
|
-
width: 7px;
|
|
144
|
-
display: inline-block;
|
|
145
|
-
margin-left: 0.5em;
|
|
146
|
-
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
|
|
147
|
-
}
|
|
148
|
-
.coverage-summary .sorted .sorter {
|
|
149
|
-
background-position: 0 -20px;
|
|
150
|
-
}
|
|
151
|
-
.coverage-summary .sorted-desc .sorter {
|
|
152
|
-
background-position: 0 -10px;
|
|
153
|
-
}
|
|
154
|
-
.status-line { height: 10px; }
|
|
155
|
-
/* yellow */
|
|
156
|
-
.cbranch-no { background: yellow !important; color: #111; }
|
|
157
|
-
/* dark red */
|
|
158
|
-
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
|
|
159
|
-
.low .chart { border:1px solid #C21F39 }
|
|
160
|
-
.highlighted,
|
|
161
|
-
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
|
|
162
|
-
background: #C21F39 !important;
|
|
163
|
-
}
|
|
164
|
-
/* medium red */
|
|
165
|
-
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
|
|
166
|
-
/* light red */
|
|
167
|
-
.low, .cline-no { background:#FCE1E5 }
|
|
168
|
-
/* light green */
|
|
169
|
-
.high, .cline-yes { background:rgb(230,245,208) }
|
|
170
|
-
/* medium green */
|
|
171
|
-
.cstat-yes { background:rgb(161,215,106) }
|
|
172
|
-
/* dark green */
|
|
173
|
-
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
|
|
174
|
-
.high .chart { border:1px solid rgb(77,146,33) }
|
|
175
|
-
/* dark yellow (gold) */
|
|
176
|
-
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
|
|
177
|
-
.medium .chart { border:1px solid #f9cd0b; }
|
|
178
|
-
/* light yellow */
|
|
179
|
-
.medium { background: #fff4c2; }
|
|
180
|
-
|
|
181
|
-
.cstat-skip { background: #ddd; color: #111; }
|
|
182
|
-
.fstat-skip { background: #ddd; color: #111 !important; }
|
|
183
|
-
.cbranch-skip { background: #ddd !important; color: #111; }
|
|
184
|
-
|
|
185
|
-
span.cline-neutral { background: #eaeaea; }
|
|
186
|
-
|
|
187
|
-
.coverage-summary td.empty {
|
|
188
|
-
opacity: .5;
|
|
189
|
-
padding-top: 4px;
|
|
190
|
-
padding-bottom: 4px;
|
|
191
|
-
line-height: 1;
|
|
192
|
-
color: #888;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
.cover-fill, .cover-empty {
|
|
196
|
-
display:inline-block;
|
|
197
|
-
height: 12px;
|
|
198
|
-
}
|
|
199
|
-
.chart {
|
|
200
|
-
line-height: 0;
|
|
201
|
-
}
|
|
202
|
-
.cover-empty {
|
|
203
|
-
background: white;
|
|
204
|
-
}
|
|
205
|
-
.cover-full {
|
|
206
|
-
border-right: none !important;
|
|
207
|
-
}
|
|
208
|
-
pre.prettyprint {
|
|
209
|
-
border: none !important;
|
|
210
|
-
padding: 0 !important;
|
|
211
|
-
margin: 0 !important;
|
|
212
|
-
}
|
|
213
|
-
.com { color: #999 !important; }
|
|
214
|
-
.ignore-none { color: #999; font-weight: normal; }
|
|
215
|
-
|
|
216
|
-
.wrapper {
|
|
217
|
-
min-height: 100%;
|
|
218
|
-
height: auto !important;
|
|
219
|
-
height: 100%;
|
|
220
|
-
margin: 0 auto -48px;
|
|
221
|
-
}
|
|
222
|
-
.footer, .push {
|
|
223
|
-
height: 48px;
|
|
224
|
-
}
|