@hraness/peopleblade 0.3.0 → 0.3.3

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/README.md CHANGED
@@ -15,7 +15,7 @@ Installation includes the pinned runtime dependencies Zod 4.4.3 and Effect 3.22.
15
15
  ## Install
16
16
 
17
17
  ```bash
18
- bun add --global @hraness/peopleblade@0.3.0
18
+ bun add --global @hraness/peopleblade@0.3.3
19
19
  peopleblade --version
20
20
  peopleblade init
21
21
  peopleblade stats --json
@@ -51,7 +51,7 @@ execution runtime.
51
51
  path. When both variables are set, they must name the same executable. The
52
52
  bridge still requires exact Ghostget 0.17.3 before invoking a provider operation.
53
53
 
54
- PeopleBlade 0.3.0 contains the reviewed Ghostget-backed Beeper, Google, and WhatsApp
54
+ PeopleBlade 0.3.3 contains the reviewed Ghostget-backed Beeper, Google, and WhatsApp
55
55
  live sync commands. Running them requires the separately installed public
56
56
  `@hraness/ghostget` 0.17.3 package. Beeper support is bounded to account-aware
57
57
  `contacts.list@3` reads, `contacts.search@1`, `messaging.search@2`, and the separate
@@ -28,3 +28,11 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
28
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
29
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
30
  SOFTWARE.
31
+
32
+ ## Hraness Paper theme
33
+
34
+ The local workspace embeds the portable Paper theme from `@hraness/design-kit`.
35
+ Its reviewed source identity and file hashes are recorded in the source repository at
36
+ `styles/vendor/hraness-paper/provenance.json`. The theme is copyright (c) 2026 Hraness
37
+ and distributed under the MIT license reproduced in this package’s `LICENSE`.
38
+ It contains no fonts, scripts, or runtime dependencies.
@@ -6420,9 +6420,208 @@ function parseGranolaImportJson(raw) {
6420
6420
  }
6421
6421
  }
6422
6422
 
6423
+ // styles/vendor/hraness-paper/paper-theme.css
6424
+ var paper_theme_default = `/* @hraness/design-kit paper-theme.css, portable contract 1.
6425
+ * Generated by scripts/generate-paper-theme.ts from src/palettes.ts.
6426
+ * Opt in with data-hraness-theme="paper". Import after existing theme rules.
6427
+ * No imports, asset requests, resets, component recipes, or runtime dependencies.
6428
+ * Appearance uses inherited color-scheme; set data-theme on the boundary for
6429
+ * an explicit island. A root without a mode follows the operating system.
6430
+ * A non-paper data-palette on the boundary retains its selected colors.
6431
+ * Requires CSS light-dark() (Chrome 123+, Firefox 120+, Safari 17.5+).
6432
+ */
6433
+
6434
+ [data-hraness-theme="paper"] {
6435
+ --font-text: "Nebula Sans", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
6436
+ --font-heading: var(--font-text);
6437
+ --font-sans: var(--font-text);
6438
+ --font-mono: ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, monospace;
6439
+ --ui-font-sans: var(--font-text);
6440
+ --ui-font-heading: var(--font-heading);
6441
+ --ui-font-mono: var(--font-mono);
6442
+ --text-body: 1rem;
6443
+ --text-caption: .75rem;
6444
+ --text-label: .875rem;
6445
+ --font-weight-regular: 400;
6446
+ --font-weight-medium: 550;
6447
+ --font-weight-bold: 700;
6448
+ --radius-sm: .375rem;
6449
+ --radius-md: .625rem;
6450
+ --radius-lg: .875rem;
6451
+ --ui-radius: .875rem;
6452
+ --control-radius: .625rem;
6453
+ --hraness-paper-heading-size: clamp(1.75rem, 3vw, 2.375rem);
6454
+ --hraness-paper-section-heading-size: clamp(1.25rem, 2.2vw, 1.75rem);
6455
+ --hraness-paper-summary-size: 1rem;
6456
+ --hraness-paper-heading-leading: 1.15;
6457
+ --hraness-paper-heading-tracking: -.035em;
6458
+ --hraness-marketing-measure: 80rem;
6459
+ --hraness-marketing-copy-measure: 40rem;
6460
+ --hraness-marketing-prose-measure: 68ch;
6461
+ --hraness-marketing-gutter: clamp(1.25rem, 4vw, 3rem);
6462
+ --hraness-marketing-radius: .625rem;
6463
+ --hraness-marketing-frame-radius: .875rem;
6464
+ --hraness-marketing-heading-weight: 550;
6465
+ --hraness-marketing-heading-tracking: -.025em;
6466
+ --hraness-marketing-section-space: clamp(3rem, 7vw, 6rem);
6467
+ --hraness-marketing-action-height: 2.75rem;
6468
+ font-family: var(--font-text);
6469
+ }
6470
+
6471
+ /* Existing marketing roles declare defaults directly, so inherit this
6472
+ * opt-in rhythm at each role boundary without replacing component recipes. */
6473
+ [data-hraness-theme="paper"] :where(.hraness-marketing-page, .hraness-marketing-header, .hraness-marketing-hero, .hraness-marketing-pillars, .hraness-marketing-install, .hraness-marketing-section, .hraness-marketing-primitives, .hraness-marketing-stats, .hraness-marketing-interfaces, .hraness-marketing-trust, .hraness-marketing-quotes, .hraness-marketing-pricing, .hraness-marketing-questions, .hraness-marketing-maker, .hraness-marketing-cta, .hraness-marketing-proof-frame) {
6474
+ --hraness-marketing-measure: inherit;
6475
+ --hraness-marketing-copy-measure: inherit;
6476
+ --hraness-marketing-prose-measure: inherit;
6477
+ --hraness-marketing-gutter: inherit;
6478
+ --hraness-marketing-radius: inherit;
6479
+ --hraness-marketing-frame-radius: inherit;
6480
+ --hraness-marketing-heading-weight: inherit;
6481
+ --hraness-marketing-heading-tracking: inherit;
6482
+ --hraness-marketing-section-space: inherit;
6483
+ --hraness-marketing-action-height: inherit;
6484
+ }
6485
+
6486
+ :root[data-hraness-theme="paper"]:where(:not([data-theme]):not(.dark), [data-theme="system"]) { color-scheme: light dark; }
6487
+ [data-hraness-theme="paper"]:where([data-theme="dark"], .dark:not([data-theme="light"])) { color-scheme: dark; }
6488
+ [data-hraness-theme="paper"][data-theme="light"] { color-scheme: light; }
6489
+
6490
+ :root[data-hraness-theme="paper"]:where(:not([data-palette]), [data-palette="paper"]),
6491
+ [data-hraness-theme="paper"]:where(:not([data-palette]), [data-palette="paper"]) {
6492
+ --background: light-dark(#f8f7f4, #12100f);
6493
+ --foreground: light-dark(#1c1917, #f5f2ed);
6494
+ --muted: light-dark(#6c665f, #aaa29a);
6495
+ --faint: light-dark(#6c665f, #aaa29a);
6496
+ --grid: light-dark(#dfdcd6, #302b27);
6497
+ --line: light-dark(#b9b3ab, #514a44);
6498
+ --control-border: light-dark(#8a8177, #827a72);
6499
+ --surface: light-dark(#fffefa, #1d1a18);
6500
+ --surface-raised: light-dark(#fffefa, #211d1a);
6501
+ --surface-hover: light-dark(#ebe8e3, #292522);
6502
+ --card: light-dark(#fffefa, #1d1a18);
6503
+ --card-foreground: light-dark(#1c1917, #f5f2ed);
6504
+ --popover: light-dark(#fffefa, #211d1a);
6505
+ --popover-foreground: light-dark(#1c1917, #f5f2ed);
6506
+ --primary: light-dark(#1e5ae1, #8fb0ff);
6507
+ --primary-foreground: light-dark(#f8f7f4, #12100f);
6508
+ --primary-soft: light-dark(#dee5f3, #21232c);
6509
+ --secondary: light-dark(#ebe8e3, #292522);
6510
+ --secondary-foreground: light-dark(#1c1917, #f5f2ed);
6511
+ --accent: light-dark(#dee5f3, #21232c);
6512
+ --accent-foreground: light-dark(#1c1917, #f5f2ed);
6513
+ --focus: light-dark(#1e5ae1, #8fb0ff);
6514
+ --scrim: light-dark(#00000070, #000000b8);
6515
+ --disabled: light-dark(#fffefa, #211d1a);
6516
+ --disabled-foreground: light-dark(#6c665f, #aaa29a);
6517
+ --inverse: light-dark(#1c1917, #f5f2ed);
6518
+ --inverse-foreground: light-dark(#f8f7f4, #12100f);
6519
+ --danger: light-dark(#b23c34, #ef8c82);
6520
+ --danger-foreground: light-dark(#f8f7f4, #12100f);
6521
+ --danger-soft: light-dark(#f0e1dd, #2d1f1d);
6522
+ --warning: light-dark(#975600, #efae55);
6523
+ --warning-foreground: light-dark(#f8f7f4, #12100f);
6524
+ --warning-soft: light-dark(#eee5d7, #2d2317);
6525
+ --success: light-dark(#227445, #5fc98b);
6526
+ --success-foreground: light-dark(#f8f7f4, #12100f);
6527
+ --success-soft: light-dark(#dfe9e0, #1b261e);
6528
+ --info: light-dark(#1e5ae1, #8fb0ff);
6529
+ --info-foreground: light-dark(#f8f7f4, #12100f);
6530
+ --info-soft: light-dark(#dee5f3, #21232c);
6531
+ --chart1: light-dark(#a24a64, #db91aa);
6532
+ --chart2: light-dark(#227445, #5fc98b);
6533
+ --chart3: light-dark(#1e5ae1, #8fb0ff);
6534
+ --chart4: light-dark(#975600, #efae55);
6535
+ --chart5: light-dark(#7858a3, #b7a0dc);
6536
+ --ui-background: var(--background);
6537
+ --ui-foreground: var(--foreground);
6538
+ --ui-card: var(--card);
6539
+ --ui-card-foreground: var(--card-foreground);
6540
+ --ui-popover: var(--popover);
6541
+ --ui-popover-foreground: var(--popover-foreground);
6542
+ --ui-primary: var(--primary);
6543
+ --ui-primary-foreground: var(--primary-foreground);
6544
+ --ui-secondary: var(--secondary);
6545
+ --ui-secondary-foreground: var(--secondary-foreground);
6546
+ --ui-muted: var(--secondary);
6547
+ --ui-muted-foreground: var(--muted);
6548
+ --ui-accent: var(--accent);
6549
+ --ui-accent-foreground: var(--accent-foreground);
6550
+ --ui-destructive: var(--danger);
6551
+ --ui-destructive-foreground: var(--danger-foreground);
6552
+ --ui-destructive-soft: var(--danger-soft);
6553
+ --ui-border: var(--line);
6554
+ --ui-input: var(--control-border);
6555
+ --ui-ring: var(--focus);
6556
+ --ui-success: var(--success);
6557
+ --ui-success-foreground: var(--success-foreground);
6558
+ --ui-success-soft: var(--success-soft);
6559
+ --ui-warning: var(--warning);
6560
+ --ui-warning-foreground: var(--warning-foreground);
6561
+ --ui-warning-soft: var(--warning-soft);
6562
+ --ui-info: var(--info);
6563
+ --ui-info-foreground: var(--info-foreground);
6564
+ --ui-info-soft: var(--info-soft);
6565
+ --ui-chart-1: var(--chart1);
6566
+ --ui-chart-2: var(--chart2);
6567
+ --ui-chart-3: var(--chart3);
6568
+ --ui-chart-4: var(--chart4);
6569
+ --ui-chart-5: var(--chart5);
6570
+ --hraness-site-accent: var(--primary);
6571
+ --hraness-site-accent-ink: var(--primary-foreground);
6572
+ --plain-background: var(--background);
6573
+ --plain-foreground: var(--foreground);
6574
+ --plain-muted: var(--muted);
6575
+ --plain-line: var(--grid);
6576
+ --plain-surface: var(--secondary);
6577
+ --plain-link: var(--primary);
6578
+ --plain-syntax-keyword: var(--warning);
6579
+ --plain-syntax-string: var(--success);
6580
+ --plain-syntax-number: var(--danger);
6581
+ --plain-syntax-name: var(--info);
6582
+ --elevation-low: 0 1px 2px light-dark(rgb(33 25 18 / 8%), rgb(0 0 0 / 24%));
6583
+ --elevation-raised: 0 8px 24px -12px light-dark(rgb(33 25 18 / 22%), rgb(0 0 0 / 48%));
6584
+ --elevation-overlay: 0 18px 54px light-dark(rgb(33 25 18 / 20%), rgb(0 0 0 / 58%));
6585
+ }
6586
+
6587
+ @media (forced-colors: active) {
6588
+ :root[data-hraness-theme="paper"]:where(:not([data-palette]), [data-palette="paper"]),
6589
+ [data-hraness-theme="paper"]:where(:not([data-palette]), [data-palette="paper"]) {
6590
+ --background: Canvas;
6591
+ --foreground: CanvasText;
6592
+ --muted: CanvasText;
6593
+ --faint: CanvasText;
6594
+ --surface: Canvas;
6595
+ --surface-raised: Canvas;
6596
+ --surface-hover: Canvas;
6597
+ --card: Canvas;
6598
+ --card-foreground: CanvasText;
6599
+ --popover: Canvas;
6600
+ --popover-foreground: CanvasText;
6601
+ --secondary: Canvas;
6602
+ --secondary-foreground: CanvasText;
6603
+ --grid: CanvasText;
6604
+ --line: CanvasText;
6605
+ --control-border: ButtonText;
6606
+ --primary: Highlight;
6607
+ --primary-foreground: HighlightText;
6608
+ --accent: Highlight;
6609
+ --accent-foreground: HighlightText;
6610
+ --focus: Highlight;
6611
+ --inverse: CanvasText;
6612
+ --inverse-foreground: Canvas;
6613
+ --disabled: Canvas;
6614
+ --disabled-foreground: GrayText;
6615
+ --elevation-low: none;
6616
+ --elevation-raised: none;
6617
+ --elevation-overlay: none;
6618
+ }
6619
+ }
6620
+ `;
6621
+
6423
6622
  // src/local/workspace-assets.ts
6424
6623
  var workspaceHtml = `<!doctype html>
6425
- <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
6624
+ <html lang="en" data-hraness-theme="paper"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
6426
6625
  <title>PeopleBlade \xB7 Local workspace</title><link rel="stylesheet" href="/workspace.css"><script src="/workspace.js" defer></script></head>
6427
6626
  <body><a class="skip" href="#workspace">Skip to contacts</a><header><a class="brand" href="/">PeopleBlade<span>LOCAL WORKSPACE</span></a><p>Your people. Your machine.</p><span class="privacy">No cloud sync \xB7 no enrichment calls</span></header>
6428
6627
  <main id="workspace"><section id="unlock" class="unlock"><span class="eyebrow">PRIVATE BY DEFAULT</span><h1>Open your local contact book.</h1><p>Select the access file printed by <code>peopleblade ui</code>. It connects this tab to that running process only. The file is not uploaded to a remote service.</p><label class="file-label">Workspace access file<input id="access-file" type="file" accept="application/json,.json"></label><p class="muted">Keep the terminal running. Closing it locks the workspace. Notes never leave this machine.</p></section>
@@ -6431,9 +6630,8 @@ var workspaceHtml = `<!doctype html>
6431
6630
  <div class="workspace-grid"><section class="records" aria-label="Contacts"><div class="table-toolbar"><span id="range" aria-live="polite"></span><div><label>Sort <select id="sort"><option value="interactions">Interactions</option><option value="name">Name</option><option value="organization">Company</option><option value="last-contact">Last interaction</option></select></label><button id="direction" type="button" aria-label="Toggle sort direction">Descending \u2193</button></div></div><div class="table-scroll" tabindex="0" aria-label="Scrollable contacts"><table><caption class="sr-only">Local contacts; open a person to inspect details and notes.</caption><thead><tr><th scope="col">Person</th><th scope="col">Company</th><th scope="col">Interactions</th></tr></thead><tbody id="rows"></tbody></table></div><div id="empty" class="empty" hidden>No matches. Try another search or import a source with the CLI.</div><nav class="pagination" aria-label="Contact pages"><button id="previous" type="button">\u2190 Previous</button><span id="page"></span><button id="next" type="button">Next \u2192</button></nav><p class="live-note">Live view: imports and identity reviews can move rows between pages. Refresh after changes.</p></section>
6432
6631
  <aside id="detail" class="detail" aria-label="Contact details"><div class="empty"><h2>A little context goes a long way.</h2><p>Open a person to see their contact methods, sources and private notes.</p></div></aside></div></section>
6433
6632
  <p id="status" role="status" aria-live="polite"></p></main><footer>PeopleBlade \xB7 Local authority, reviewable identity, private notes.</footer></body></html>`;
6434
- var workspaceCss = `
6435
- :root{color-scheme:light dark;--bg:#f6f5f1;--panel:#fffefa;--text:#232721;--muted:#647064;--line:#dedfd6;--accent:#375a42;--soft:#edf1e8;--danger:#9c342d}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.55 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}button,input,select,textarea{font:inherit;color:inherit}button,input,select,textarea{border:1px solid var(--line);border-radius:7px;background:var(--panel);padding:9px 12px}button{cursor:pointer;font-weight:550}button:hover{border-color:var(--accent);background:var(--soft)}button:disabled{opacity:.45;cursor:default}a{color:var(--accent)}:focus-visible{outline:3px solid var(--accent);outline-offset:3px}header{display:flex;align-items:center;gap:30px;padding:22px 32px;border-bottom:1px solid var(--line);background:var(--panel)}header p{color:var(--muted);margin:0}.brand{color:var(--text);font-size:22px;line-height:1.1;text-decoration:none;font-weight:650;letter-spacing:-.7px}.brand span{display:block;font-size:9px;letter-spacing:1.8px;color:var(--muted);margin-top:8px}.privacy{margin-left:auto;border:1px solid var(--line);border-radius:99px;padding:6px 12px;font-size:11px;color:var(--muted)}main{max-width:1600px;margin:auto;padding:36px 32px}h1{font-size:34px;line-height:1.2;letter-spacing:-1px;font-weight:550;margin:8px 0 24px}h2{font-size:21px;line-height:1.3;letter-spacing:-.5px;margin:0 0 12px}.eyebrow{font-size:10px;letter-spacing:2px;color:var(--muted);font-weight:650}.unlock{max-width:600px;margin:7vh auto;padding:36px;background:var(--panel);border:1px solid var(--line);border-radius:12px}.unlock p{color:var(--muted)}.file-label{display:grid;gap:8px;margin:25px 0}.page-heading{display:flex;align-items:center;justify-content:space-between}.page-heading button{margin-bottom:20px}.filters{display:flex;gap:10px;align-items:end;margin-bottom:20px;flex-wrap:wrap}.filters label{display:grid;gap:5px;font-size:11px;color:var(--muted)}.filters input,.filters select{font-size:13px;color:var(--text);min-height:42px}.filters .search{flex:1;min-width:220px}.workspace-grid{display:grid;grid-template-columns:minmax(420px,1.4fr) minmax(320px,1fr);gap:20px;align-items:start}.records,.detail{border:1px solid var(--line);background:var(--panel);border-radius:10px;overflow:hidden}.table-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:13px 16px;border-bottom:1px solid var(--line);color:var(--muted);font-size:12px;flex-wrap:wrap}.table-toolbar>div{display:flex;align-items:center;gap:6px}.table-toolbar select,.table-toolbar button{padding:5px 8px;font-size:12px}.table-scroll{overflow:auto;max-height:65vh}table{width:100%;border-collapse:collapse;text-align:left}th{position:sticky;top:0;background:var(--soft);font-size:10px;text-transform:uppercase;letter-spacing:1px;color:var(--muted);z-index:1}th,td{padding:11px 16px;border-bottom:1px solid var(--line);vertical-align:top}td{font-size:12px}td small{display:block;color:var(--muted);margin-top:2px}td button{padding:0;border:0;background:none;text-align:left;font-size:13px;color:var(--text)}tr.selected{background:var(--soft)}tr:hover{background:var(--soft)}.pagination{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;font-size:12px}.pagination button{font-size:12px;padding:6px 10px}.live-note{font-size:10px;color:var(--muted);padding:0 16px 12px;margin:0}.detail{padding:24px;position:sticky;top:20px;max-height:83vh;overflow:auto}.detail h2{font-size:25px}.detail dl{display:grid;grid-template-columns:90px 1fr;gap:8px;margin:22px 0}.detail dt{font-size:11px;color:var(--muted)}.detail dd{margin:0;font-size:12px;overflow-wrap:anywhere}.detail dd span{display:block}.pill{display:inline-block;border:1px solid var(--line);border-radius:99px;padding:2px 8px;margin:0 4px 5px 0;color:var(--muted);font-size:10px}.notes-heading{border-top:1px solid var(--line);padding-top:22px;margin-top:24px;display:flex;justify-content:space-between;align-items:center}.notes-heading h3{margin:0;font-weight:550}.note-card{border-bottom:1px solid var(--line);padding:16px 0}.note-card>button{font-size:12px;padding:5px 9px;margin:8px 6px 0 0}.note-meta{font-size:10px;color:var(--muted);margin:4px 0 10px}.note-title{font-size:14px;font-weight:600;margin:0}.markdown{font-size:13px;overflow-wrap:anywhere}.markdown h1,.markdown h2,.markdown h3{font-size:17px;margin:12px 0}.markdown pre{overflow:auto;background:var(--soft);padding:12px;border-radius:6px}.markdown img{display:none}.markdown blockquote{margin-left:0;padding-left:12px;border-left:3px solid var(--line);color:var(--muted)}.markdown p{margin:8px 0}.markdown td,.markdown th{padding:5px;position:static}.editor{display:grid;gap:10px}.editor label{display:grid;gap:4px;font-size:11px;color:var(--muted)}.editor textarea{min-height:230px;resize:vertical;font-family:ui-monospace,SFMono-Regular,monospace;font-size:12px;tab-size:2}.editor-actions{display:flex;gap:6px;flex-wrap:wrap}.editor-actions button{font-size:12px}.primary{background:var(--accent);color:var(--panel)}.primary:hover{background:var(--accent);color:var(--panel)}.empty{padding:44px 22px;color:var(--muted);text-align:center}.empty h2{font-size:21px}.muted{color:var(--muted);font-size:12px}.danger{color:var(--danger)}#status{background:var(--panel);border:1px solid var(--line);padding:12px 16px;border-radius:8px}#status:empty{display:none}footer{color:var(--muted);font-size:11px;text-align:center;padding:20px}.skip{position:absolute;left:12px;top:-100px;padding:8px;background:var(--panel);z-index:5}.skip:focus{top:8px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}[hidden]{display:none!important}
6436
- @media(prefers-color-scheme:dark){:root{--bg:#151a17;--panel:#1c231e;--text:#e1e7dc;--muted:#a3b19e;--line:#354136;--accent:#a9c4a3;--soft:#28342b;--danger:#ffb4a9}.primary{color:#182019}}
6633
+ var workspaceCss = paper_theme_default + `
6634
+ :root{--bg:var(--background);--panel:var(--surface);--text:var(--foreground);--soft:var(--secondary)}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.55 var(--font-text)}button,input,select,textarea{font:inherit;color:inherit}button,input,select,textarea{border:1px solid var(--line);border-radius:7px;background:var(--panel);padding:9px 12px}button{cursor:pointer;font-weight:550}button:hover{border-color:var(--primary);background:var(--soft)}button:disabled{opacity:.45;cursor:default}a{color:var(--primary)}:focus-visible{outline:3px solid var(--primary);outline-offset:3px}header{display:flex;align-items:center;gap:30px;padding:22px 32px;border-bottom:1px solid var(--line);background:var(--panel)}header p{color:var(--muted);margin:0}.brand{color:var(--text);font-size:22px;line-height:1.1;text-decoration:none;font-weight:650;letter-spacing:-.7px}.brand span{display:block;font-size:9px;letter-spacing:1.8px;color:var(--muted);margin-top:8px}.privacy{margin-left:auto;border:1px solid var(--line);border-radius:99px;padding:6px 12px;font-size:11px;color:var(--muted)}main{max-width:1600px;margin:auto;padding:36px 32px}h1{font-size:34px;line-height:1.2;letter-spacing:-1px;font-weight:550;margin:8px 0 24px}h2{font-size:21px;line-height:1.3;letter-spacing:-.5px;margin:0 0 12px}.eyebrow{font-size:10px;letter-spacing:2px;color:var(--muted);font-weight:650}.unlock{max-width:600px;margin:7vh auto;padding:36px;background:var(--panel);border:1px solid var(--line);border-radius:12px}.unlock p{color:var(--muted)}.file-label{display:grid;gap:8px;margin:25px 0}.page-heading{display:flex;align-items:center;justify-content:space-between}.page-heading button{margin-bottom:20px}.filters{display:flex;gap:10px;align-items:end;margin-bottom:20px;flex-wrap:wrap}.filters label{display:grid;gap:5px;font-size:11px;color:var(--muted)}.filters input,.filters select{font-size:13px;color:var(--text);min-height:42px}.filters .search{flex:1;min-width:220px}.workspace-grid{display:grid;grid-template-columns:minmax(420px,1.4fr) minmax(320px,1fr);gap:20px;align-items:start}.records,.detail{border:1px solid var(--line);background:var(--panel);border-radius:10px;overflow:hidden}.table-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:13px 16px;border-bottom:1px solid var(--line);color:var(--muted);font-size:12px;flex-wrap:wrap}.table-toolbar>div{display:flex;align-items:center;gap:6px}.table-toolbar select,.table-toolbar button{padding:5px 8px;font-size:12px}.table-scroll{overflow:auto;max-height:65vh}table{width:100%;border-collapse:collapse;text-align:left}th{position:sticky;top:0;background:var(--soft);font-size:10px;text-transform:uppercase;letter-spacing:1px;color:var(--muted);z-index:1}th,td{padding:11px 16px;border-bottom:1px solid var(--line);vertical-align:top}td{font-size:12px}td small{display:block;color:var(--muted);margin-top:2px}td button{padding:0;border:0;background:none;text-align:left;font-size:13px;color:var(--text)}tr.selected{background:var(--soft)}tr:hover{background:var(--soft)}.pagination{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;font-size:12px}.pagination button{font-size:12px;padding:6px 10px}.live-note{font-size:10px;color:var(--muted);padding:0 16px 12px;margin:0}.detail{padding:24px;position:sticky;top:20px;max-height:83vh;overflow:auto}.detail h2{font-size:25px}.detail dl{display:grid;grid-template-columns:90px 1fr;gap:8px;margin:22px 0}.detail dt{font-size:11px;color:var(--muted)}.detail dd{margin:0;font-size:12px;overflow-wrap:anywhere}.detail dd span{display:block}.pill{display:inline-block;border:1px solid var(--line);border-radius:99px;padding:2px 8px;margin:0 4px 5px 0;color:var(--muted);font-size:10px}.notes-heading{border-top:1px solid var(--line);padding-top:22px;margin-top:24px;display:flex;justify-content:space-between;align-items:center}.notes-heading h3{margin:0;font-weight:550}.note-card{border-bottom:1px solid var(--line);padding:16px 0}.note-card>button{font-size:12px;padding:5px 9px;margin:8px 6px 0 0}.note-meta{font-size:10px;color:var(--muted);margin:4px 0 10px}.note-title{font-size:14px;font-weight:600;margin:0}.markdown{font-size:13px;overflow-wrap:anywhere}.markdown h1,.markdown h2,.markdown h3{font-size:17px;margin:12px 0}.markdown pre{overflow:auto;background:var(--soft);padding:12px;border-radius:6px}.markdown img{display:none}.markdown blockquote{margin-left:0;padding-left:12px;border-left:3px solid var(--line);color:var(--muted)}.markdown p{margin:8px 0}.markdown td,.markdown th{padding:5px;position:static}.editor{display:grid;gap:10px}.editor label{display:grid;gap:4px;font-size:11px;color:var(--muted)}.editor textarea{min-height:230px;resize:vertical;font-family:ui-monospace,SFMono-Regular,monospace;font-size:12px;tab-size:2}.editor-actions{display:flex;gap:6px;flex-wrap:wrap}.editor-actions button{font-size:12px}.primary{background:var(--primary);color:var(--primary-foreground)}.primary:hover{background:var(--primary);color:var(--primary-foreground)}.empty{padding:44px 22px;color:var(--muted);text-align:center}.empty h2{font-size:21px}.muted{color:var(--muted);font-size:12px}.danger{color:var(--danger)}#status{background:var(--panel);border:1px solid var(--line);padding:12px 16px;border-radius:8px}#status:empty{display:none}footer{color:var(--muted);font-size:11px;text-align:center;padding:20px}.skip{position:absolute;left:12px;top:-100px;padding:8px;background:var(--panel);z-index:5}.skip:focus{top:8px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}[hidden]{display:none!important}
6437
6635
  @media(max-width:1000px){.workspace-grid{grid-template-columns:1fr}.detail{position:static;max-height:none}.privacy{display:none}}@media(max-width:600px){header{padding:18px;gap:18px}header p{font-size:11px}main{padding:26px 14px}.unlock{padding:22px;margin:25px 0}h1{font-size:28px}.filters{gap:8px}.filters label{flex:1;min-width:125px}.filters .search{flex-basis:100%}th,td{padding:10px}.detail{padding:18px}.table-toolbar{padding:10px}.page-heading{align-items:start}.page-heading button{font-size:11px}.table-scroll{max-height:50vh}}
6438
6636
  `;
6439
6637
  function workspaceClient() {
@@ -26057,7 +26255,7 @@ function syncWhatsAppRelationships(database, options = {}) {
26057
26255
  }
26058
26256
 
26059
26257
  // src/cli/version.ts
26060
- var peoplebladeVersion = "0.3.0";
26258
+ var peoplebladeVersion = "0.3.3";
26061
26259
 
26062
26260
  // src/cli/main.ts
26063
26261
  var usage = `PeopleBlade \u2014 local-first contact intelligence
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hraness/peopleblade",
3
- "version": "0.3.0",
3
+ "version": "0.3.3",
4
4
  "description": "Local-first, source-aware contact intelligence for people and agents",
5
5
  "type": "module",
6
6
  "bin": {