diff --git a/backend/server.js b/backend/server.js index a2a890f..9886926 100644 --- a/backend/server.js +++ b/backend/server.js @@ -2759,7 +2759,6 @@ app.post('/api/daily-bookmarks/import', (req, res) => { notes: '', marker: normalizedMarker }); - upsertDailyBookmarkCheckStmt.run({ bookmarkId: id, dayKey }); const saved = getDailyBookmarkStmt.get({ bookmarkId: id, dayKey }); if (saved) { createdItems.push(saved); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..29f6271 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,98 @@ +{ + "name": "fb", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@babel/parser": "^7.28.5", + "acorn": "^8.15.0", + "acorn-loose": "^8.5.2", + "esprima": "^4.0.1" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-loose": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", + "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fb71ac8 --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "@babel/parser": "^7.28.5", + "acorn": "^8.15.0", + "acorn-loose": "^8.5.2", + "esprima": "^4.0.1" + } +} diff --git a/web/daily-bookmarks.css b/web/daily-bookmarks.css index 1402f3c..13006e5 100644 --- a/web/daily-bookmarks.css +++ b/web/daily-bookmarks.css @@ -120,6 +120,87 @@ a:hover { border: 1px solid rgba(37, 99, 235, 0.15); } +.auto-open-overlay { + position: fixed; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + padding: 24px; + background: + radial-gradient(circle at 20% 20%, rgba(37, 99, 235, 0.12), transparent 42%), + radial-gradient(circle at 80% 30%, rgba(6, 182, 212, 0.12), transparent 38%), + rgba(15, 23, 42, 0.6); + z-index: 30; + opacity: 0; + pointer-events: none; + transition: opacity 0.25s ease; +} + +.auto-open-overlay.visible { + opacity: 1; + pointer-events: auto; +} + +.auto-open-overlay__panel { + width: min(940px, 100%); + background: linear-gradient(150deg, rgba(255, 255, 255, 0.9), rgba(248, 250, 252, 0.96)); + border-radius: 22px; + padding: 38px 42px 40px; + box-shadow: 0 32px 90px rgba(15, 23, 42, 0.4); + border: 1px solid rgba(255, 255, 255, 0.6); + text-align: center; + cursor: pointer; +} + +.auto-open-overlay__badge { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + border-radius: 999px; + background: rgba(37, 99, 235, 0.12); + color: #0f172a; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + font-size: 12px; +} + +.auto-open-overlay__timer { + display: flex; + align-items: baseline; + justify-content: center; + gap: 12px; + margin: 18px 0 8px; + color: #0f172a; +} + +.auto-open-overlay__count { + font-size: clamp(72px, 12vw, 120px); + line-height: 1; + font-weight: 700; + letter-spacing: -0.02em; +} + +.auto-open-overlay__unit { + font-size: 22px; + color: var(--muted); +} + +.auto-open-overlay__text { + margin: 0 auto; + color: #334155; + max-width: 700px; + font-size: 18px; +} + +.auto-open-overlay__hint { + margin: 12px 0 0; + color: #475569; + font-size: 15px; +} + .hero__controls { display: flex; flex-wrap: wrap; @@ -181,6 +262,19 @@ a:hover { font-size: 13px; } +.auto-open-toggle { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 13px; + color: var(--muted); +} + +.auto-open-toggle input { + width: 16px; + height: 16px; +} + .bulk-actions select { background: #fff; border: 1px solid var(--border); @@ -477,6 +571,10 @@ a:hover { width: 180px; } +.bookmark-table th.col-created { + width: 160px; +} + .bookmark-table th.col-last { width: 220px; } @@ -659,6 +757,15 @@ a:hover { color: var(--text); } +.table-filter-row input[type="search"] { + width: 100%; + border-radius: 10px; + border: 1px solid var(--border); + padding: 8px 10px; + background: #fff; + color: var(--text); +} + .filter-hint { font-size: 12px; color: var(--muted); @@ -666,8 +773,7 @@ a:hover { letter-spacing: 0; display: flex; align-items: center; - gap: 8px; - justify-content: space-between; + justify-content: center; } .import-hint { diff --git a/web/daily-bookmarks.html b/web/daily-bookmarks.html index 72284e4..976f614 100644 --- a/web/daily-bookmarks.html +++ b/web/daily-bookmarks.html @@ -35,6 +35,10 @@ + @@ -45,6 +49,20 @@ +
+