privateboard 0.1.37 → 0.1.40

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 (76) hide show
  1. package/dist/boot.js +1415 -91
  2. package/dist/boot.js.map +1 -1
  3. package/dist/cli.js +1415 -91
  4. package/dist/cli.js.map +1 -1
  5. package/dist/server.js +1271 -81
  6. package/dist/server.js.map +1 -1
  7. package/dist/version.d.ts +1 -1
  8. package/dist/version.js +1 -1
  9. package/dist/version.js.map +1 -1
  10. package/package.json +1 -1
  11. package/public/__avatar3d_test.html +156 -0
  12. package/public/adjourn-overlay.css +2 -2
  13. package/public/agent-overlay.css +27 -15
  14. package/public/agent-overlay.js +3 -1
  15. package/public/agent-profile.css +331 -41
  16. package/public/agent-profile.js +499 -75
  17. package/public/app-updater.css +1 -1
  18. package/public/app.js +2090 -547
  19. package/public/avatar-3d-snap.js +205 -0
  20. package/public/avatar-3d.js +792 -0
  21. package/public/avatar-customizer.html +274 -0
  22. package/public/avatar3d-editor.css +240 -0
  23. package/public/avatar3d-editor.js +481 -0
  24. package/public/avatars/3d/chair.png +0 -0
  25. package/public/avatars/3d/first-principles.png +0 -0
  26. package/public/avatars/3d/historian.png +0 -0
  27. package/public/avatars/3d/long-horizon.png +0 -0
  28. package/public/avatars/3d/phenomenologist.png +0 -0
  29. package/public/avatars/3d/socrates.png +0 -0
  30. package/public/avatars/3d/user-empathy.png +0 -0
  31. package/public/avatars/3d/value-investor.png +0 -0
  32. package/public/core-avatars.js +86 -0
  33. package/public/home-3d-loader.js +15 -4
  34. package/public/home-3d-mock.js +18 -7
  35. package/public/home.html +80 -18
  36. package/public/i18n.js +279 -4
  37. package/public/icons/avatar_1779855104027.glb +0 -0
  38. package/public/icons/logo.png +0 -0
  39. package/public/icons/new-style.glb +0 -0
  40. package/public/icons/new-style2.glb +0 -0
  41. package/public/icons/new-style3.glb +0 -0
  42. package/public/icons/new-style4.glb +0 -0
  43. package/public/icons/new-style5.glb +0 -0
  44. package/public/icons/office.glb +0 -0
  45. package/public/icons/stuff.glb +0 -0
  46. package/public/index.html +203 -182
  47. package/public/mention-picker.js +1 -1
  48. package/public/new-agent.css +7 -7
  49. package/public/new-agent.js +46 -20
  50. package/public/office-viewer.html +340 -0
  51. package/public/onboarding.css +5 -5
  52. package/public/quote-cta.css +5 -4
  53. package/public/quote-cta.js +50 -5
  54. package/public/room-settings.css +24 -9
  55. package/public/stuff-viewer.html +330 -0
  56. package/public/thread.css +1211 -0
  57. package/public/user-settings.css +16 -19
  58. package/public/user-settings.js +86 -78
  59. package/public/vendor/BufferGeometryUtils.js +1434 -0
  60. package/public/vendor/DRACOLoader.js +739 -0
  61. package/public/vendor/GLTFLoader.js +4860 -0
  62. package/public/vendor/RoomEnvironment.js +185 -0
  63. package/public/vendor/SkeletonUtils.js +496 -0
  64. package/public/vendor/draco/draco_decoder.js +34 -0
  65. package/public/vendor/draco/draco_decoder.wasm +0 -0
  66. package/public/vendor/draco/draco_encoder.js +33 -0
  67. package/public/vendor/draco/draco_wasm_wrapper.js +117 -0
  68. package/public/vendor/meshopt_decoder.module.js +196 -0
  69. package/public/voice-3d-banner.js +12 -0
  70. package/public/voice-3d.js +1407 -432
  71. package/public/voice-clone.css +875 -0
  72. package/public/voice-clone.js +1351 -0
  73. package/public/voice-replay.css +3 -3
  74. package/public/voice-replay.js +21 -0
  75. package/public/avatar-skill.js +0 -629
  76. package/public/icons/folded-sidebar.png +0 -0
@@ -899,7 +899,7 @@
899
899
  color: var(--text-soft);
900
900
  text-transform: uppercase;
901
901
  background: transparent;
902
- border: 0.5px solid var(--line-bright);
902
+ border: 0.5px solid var(--line-strong);
903
903
  padding: 3px 8px;
904
904
  cursor: pointer;
905
905
  transition: border-color 0.12s, color 0.12s, background 0.12s;
@@ -1167,7 +1167,7 @@
1167
1167
  line-height: 1;
1168
1168
  }
1169
1169
  .dream-z.z1 { left: 14%; font-size: 18px; animation-delay: 0s; }
1170
- .dream-z.z2 { left: 30%; font-size: 13px; animation-delay: 0.6s; }
1170
+ .dream-z.z2 { left: 30%; font-size: 14px; animation-delay: 0.6s; }
1171
1171
  .dream-z.z3 { left: 50%; font-size: 11px; animation-delay: 1.2s; }
1172
1172
  .dream-z.z4 { left: 70%; font-size: 16px; animation-delay: 1.7s; }
1173
1173
  .dream-z.z5 { left: 86%; font-size: 12px; animation-delay: 2.4s; }
@@ -1639,13 +1639,6 @@
1639
1639
  height: 76px;
1640
1640
  margin-top: -46px;
1641
1641
  margin-bottom: 0;
1642
- border-radius: 50%;
1643
- background: var(--panel-2);
1644
- /* Ring color follows the page bg so the avatar reads as separated
1645
- from the cover gradient on every theme · in light themes the ring
1646
- is white against the gray cover; in dark themes the ring is the
1647
- near-black bg against the panel-toned cover. */
1648
- border: 4px solid var(--bg);
1649
1642
  overflow: hidden;
1650
1643
  display: flex;
1651
1644
  align-items: center;
@@ -1657,8 +1650,9 @@
1657
1650
  width: 100%;
1658
1651
  height: 100%;
1659
1652
  object-fit: cover;
1660
- image-rendering: pixelated;
1661
- image-rendering: crisp-edges;
1653
+ /* The 3D-avatar portrait is a smooth downscaled PNG · keep it smooth
1654
+ (pixelated would render it blocky at this size). */
1655
+ image-rendering: auto;
1662
1656
  }
1663
1657
  /* Text column · sits to the right of the avatar in the same row,
1664
1658
  so name + meta read as one tight identifier block. */
@@ -2439,7 +2433,7 @@
2439
2433
  }
2440
2434
  .ap-stat-v {
2441
2435
  font-family: var(--mono);
2442
- font-size: 13px;
2436
+ font-size: 14px;
2443
2437
  font-weight: 700;
2444
2438
  color: var(--text);
2445
2439
  letter-spacing: -0.005em;
@@ -2568,6 +2562,54 @@
2568
2562
  border-top: none;
2569
2563
  padding-top: 5px;
2570
2564
  }
2565
+ /* Cloned voices group · lime kicker so user-owned customs stand out
2566
+ from system / premade voices below them. Same density as the
2567
+ regular group header, just colored. */
2568
+ .ap-model-group.ap-model-group-cloned {
2569
+ color: var(--lime);
2570
+ }
2571
+ .ap-model-opt.ap-model-opt-cloned .ap-model-opt-label {
2572
+ color: var(--text);
2573
+ font-weight: 600;
2574
+ }
2575
+ .ap-model-opt.ap-model-opt-cloned::before {
2576
+ content: "✦";
2577
+ color: var(--lime);
2578
+ margin-right: 6px;
2579
+ font-size: 10px;
2580
+ }
2581
+ /* Row wrapper for inline rename · holds the option button + an
2582
+ optional ✎ chip. Hover anywhere on the row reveals the chip. */
2583
+ .ap-model-opt-row {
2584
+ position: relative;
2585
+ display: flex;
2586
+ align-items: stretch;
2587
+ }
2588
+ .ap-model-opt-row .ap-model-opt {
2589
+ flex: 1;
2590
+ min-width: 0;
2591
+ }
2592
+ .ap-model-opt-rename {
2593
+ flex-shrink: 0;
2594
+ width: 28px;
2595
+ background: transparent;
2596
+ border: 0;
2597
+ border-left: 0.5px solid var(--line);
2598
+ color: var(--text-faint);
2599
+ cursor: pointer;
2600
+ font-size: 12px;
2601
+ line-height: 1;
2602
+ opacity: 0;
2603
+ transition: opacity 0.14s, color 0.14s, background 0.14s;
2604
+ }
2605
+ .ap-model-opt-row:hover .ap-model-opt-rename,
2606
+ .ap-model-opt-rename:focus-visible {
2607
+ opacity: 1;
2608
+ }
2609
+ .ap-model-opt-rename:hover {
2610
+ color: var(--lime);
2611
+ background: var(--panel-2);
2612
+ }
2571
2613
 
2572
2614
  /* Row · single-line label + uppercase mono hint, baseline-aligned,
2573
2615
  same vertical rhythm as .cmp-dd-opt. No per-row divider. */
@@ -2920,7 +2962,7 @@
2920
2962
  .ap-instr-view em { color: var(--text-soft); font-style: italic; }
2921
2963
  .ap-instr-view code {
2922
2964
  font-family: var(--mono);
2923
- font-size: 13px;
2965
+ font-size: 14px;
2924
2966
  background: var(--bg);
2925
2967
  border: 0.5px solid var(--line-bright);
2926
2968
  padding: 1px 5px;
@@ -2937,7 +2979,7 @@
2937
2979
  background: transparent;
2938
2980
  border: none;
2939
2981
  padding: 0;
2940
- font-size: 13px;
2982
+ font-size: 14px;
2941
2983
  line-height: 1.5;
2942
2984
  }
2943
2985
 
@@ -3419,7 +3461,7 @@
3419
3461
  }
3420
3462
  .ap-ulm-claim {
3421
3463
  font-family: var(--font-human);
3422
- font-size: 13px;
3464
+ font-size: 14px;
3423
3465
  line-height: 1.5;
3424
3466
  color: var(--text);
3425
3467
  letter-spacing: -0.003em;
@@ -3432,7 +3474,7 @@
3432
3474
  border: 0.5px solid var(--text-soft);
3433
3475
  color: var(--text);
3434
3476
  font-family: var(--font-human);
3435
- font-size: 13px;
3477
+ font-size: 14px;
3436
3478
  line-height: 1.5;
3437
3479
  padding: 8px 10px;
3438
3480
  outline: none;
@@ -3988,11 +4030,251 @@
3988
4030
  .ap-skill-info-configure-mark { font-size: 12px; }
3989
4031
 
3990
4032
  /* ── Voice configuration panel ───────────────────────────── */
3991
- /* The wrapping `.ap-voice-config` no longer needs spacing of its
3992
- own — the parent `.ap-block-body` already handles padding now
3993
- that Voice Setup is its own section (was nested inside Track
3994
- Record before, where the inner offset disambiguated it from
3995
- the model row above). */
4033
+ /* The wrapping `.ap-voice-config` no longer needs outer spacing of
4034
+ its own — `.ap-block-body` already handles padding. Inside, each
4035
+ logical group (voice picker / emotion / preview line / clone /
4036
+ advanced) lives in its own `.ap-voice-section`. Sections separate
4037
+ with a hairline divider on top so the user can scan "what knob
4038
+ am I touching" without the panel feeling like a wall of mixed
4039
+ inputs. Each section can optionally carry an `.ap-voice-section-head`
4040
+ mono kicker label naming the group. */
4041
+ .ap-voice-config {
4042
+ display: flex;
4043
+ flex-direction: column;
4044
+ }
4045
+ .ap-voice-section {
4046
+ padding: 14px 0;
4047
+ border-top: 0.5px solid var(--line-bright);
4048
+ }
4049
+ .ap-voice-section:first-child {
4050
+ padding-top: 0;
4051
+ border-top: none;
4052
+ }
4053
+ .ap-voice-section:last-child {
4054
+ padding-bottom: 0;
4055
+ }
4056
+ .ap-voice-section-head {
4057
+ font-family: var(--mono);
4058
+ font-size: 10px;
4059
+ font-weight: 700;
4060
+ letter-spacing: 0.18em;
4061
+ text-transform: uppercase;
4062
+ color: var(--text-faint);
4063
+ margin-bottom: 10px;
4064
+ display: block;
4065
+ }
4066
+ .ap-voice-section-head::before {
4067
+ content: "// ";
4068
+ color: color-mix(in srgb, var(--lime) 60%, var(--text-faint));
4069
+ }
4070
+
4071
+ /* Clone voice trigger · sits below the advanced sliders, reads
4072
+ as a single CTA row (icon + title + hint) rather than a row of
4073
+ chips, mirroring `.ap-skill-info-configure` button gravity.
4074
+ Click opens the boardroomVoiceClone overlay (public/voice-clone.js). */
4075
+ /* Custom preview text row · the wrapping `.ap-voice-section` owns
4076
+ the section header now; this just holds the textarea. */
4077
+ .ap-voice-preview-row {
4078
+ display: flex;
4079
+ flex-direction: column;
4080
+ gap: 6px;
4081
+ }
4082
+ .ap-voice-preview-text {
4083
+ width: 100%;
4084
+ resize: vertical;
4085
+ min-height: 48px;
4086
+ max-height: 140px;
4087
+ padding: 8px 10px;
4088
+ background: var(--panel-2);
4089
+ border: 0.5px solid var(--line-bright);
4090
+ border-radius: 6px;
4091
+ color: var(--text);
4092
+ font-family: var(--sans);
4093
+ font-size: 14px;
4094
+ line-height: 1.5;
4095
+ outline: none;
4096
+ transition: border-color 0.12s;
4097
+ }
4098
+ .ap-voice-preview-text:focus { border-color: var(--lime); }
4099
+ .ap-voice-preview-text::placeholder {
4100
+ color: var(--text-faint);
4101
+ font-style: italic;
4102
+ }
4103
+
4104
+ /* ── "Forge Voice" CTA · HUD-styled trigger ─────────────────────
4105
+ The clone overlay is the most playful surface in the agent
4106
+ profile, so the CTA gets a gamified hardware-HUD look rather
4107
+ than a plain dashed-border card: lime L corners (same vocabulary
4108
+ as the room-settings modal frame), a pulsing mic rune, mono
4109
+ uppercase title with bracketed arrow, a slow horizontal
4110
+ scan-line sweep on hover, and a soft lime glow when focused. */
4111
+ .ap-voice-forge {
4112
+ position: relative;
4113
+ display: grid;
4114
+ grid-template-columns: 1fr;
4115
+ grid-auto-rows: auto;
4116
+ row-gap: 6px;
4117
+ width: 100%;
4118
+ padding: 14px 18px 12px;
4119
+ background: linear-gradient(
4120
+ 180deg,
4121
+ color-mix(in srgb, var(--lime) 6%, var(--panel-2)) 0%,
4122
+ var(--panel-2) 68%
4123
+ );
4124
+ border: 0.5px solid color-mix(in srgb, var(--lime) 36%, var(--line-bright));
4125
+ border-radius: 4px;
4126
+ color: var(--text);
4127
+ text-align: left;
4128
+ cursor: pointer;
4129
+ overflow: hidden;
4130
+ isolation: isolate;
4131
+ transition: border-color 0.18s ease, box-shadow 0.18s ease, transform 0.12s ease;
4132
+ }
4133
+ .ap-voice-forge:hover {
4134
+ border-color: var(--lime);
4135
+ box-shadow:
4136
+ 0 0 0 1px color-mix(in srgb, var(--lime) 24%, transparent),
4137
+ 0 8px 26px -14px color-mix(in srgb, var(--lime) 60%, transparent);
4138
+ }
4139
+ .ap-voice-forge:active { transform: translateY(1px); }
4140
+
4141
+ /* Corner brackets · four lime L shapes pinned to each corner. */
4142
+ .ap-voice-forge-corner {
4143
+ position: absolute;
4144
+ width: 10px;
4145
+ height: 10px;
4146
+ border: 1.5px solid var(--lime);
4147
+ pointer-events: none;
4148
+ z-index: 2;
4149
+ transition: width 0.18s, height 0.18s;
4150
+ }
4151
+ .ap-voice-forge-corner-tl { top: -1px; left: -1px; border-right: none; border-bottom: none; }
4152
+ .ap-voice-forge-corner-tr { top: -1px; right: -1px; border-left: none; border-bottom: none; }
4153
+ .ap-voice-forge-corner-bl { bottom: -1px; left: -1px; border-right: none; border-top: none; }
4154
+ .ap-voice-forge-corner-br { bottom: -1px; right: -1px; border-left: none; border-top: none; }
4155
+ .ap-voice-forge:hover .ap-voice-forge-corner { width: 14px; height: 14px; }
4156
+
4157
+ /* Horizontal scan-line sweep · slow lime gradient slides L→R on
4158
+ hover. Sits behind text. */
4159
+ .ap-voice-forge-scan {
4160
+ position: absolute;
4161
+ inset: 0;
4162
+ pointer-events: none;
4163
+ background: linear-gradient(
4164
+ 90deg,
4165
+ transparent 0%,
4166
+ transparent 38%,
4167
+ color-mix(in srgb, var(--lime) 18%, transparent) 50%,
4168
+ transparent 62%,
4169
+ transparent 100%
4170
+ );
4171
+ background-size: 260% 100%;
4172
+ background-position: -120% 0;
4173
+ z-index: 1;
4174
+ opacity: 0;
4175
+ transition: opacity 0.18s ease;
4176
+ }
4177
+ .ap-voice-forge:hover .ap-voice-forge-scan {
4178
+ opacity: 1;
4179
+ animation: ap-voice-forge-scan-sweep 2.4s linear infinite;
4180
+ }
4181
+ @keyframes ap-voice-forge-scan-sweep {
4182
+ 0% { background-position: -120% 0; }
4183
+ 100% { background-position: 220% 0; }
4184
+ }
4185
+
4186
+ .ap-voice-forge-kicker {
4187
+ position: relative;
4188
+ z-index: 3;
4189
+ font-family: var(--mono);
4190
+ font-size: 10px;
4191
+ font-weight: 700;
4192
+ letter-spacing: 0.22em;
4193
+ text-transform: uppercase;
4194
+ color: color-mix(in srgb, var(--lime) 80%, var(--text));
4195
+ }
4196
+
4197
+ .ap-voice-forge-body {
4198
+ position: relative;
4199
+ z-index: 3;
4200
+ display: flex;
4201
+ align-items: center;
4202
+ gap: 12px;
4203
+ }
4204
+ .ap-voice-forge-rune {
4205
+ position: relative;
4206
+ width: 36px;
4207
+ height: 36px;
4208
+ flex-shrink: 0;
4209
+ display: inline-flex;
4210
+ align-items: center;
4211
+ justify-content: center;
4212
+ color: var(--lime);
4213
+ border: 0.5px solid color-mix(in srgb, var(--lime) 45%, transparent);
4214
+ border-radius: 4px;
4215
+ background: color-mix(in srgb, var(--lime) 8%, transparent);
4216
+ }
4217
+ .ap-voice-forge-rune svg { width: 18px; height: 18px; }
4218
+ .ap-voice-forge-rune::after {
4219
+ content: "";
4220
+ position: absolute;
4221
+ inset: -3px;
4222
+ border-radius: 6px;
4223
+ border: 0.5px solid color-mix(in srgb, var(--lime) 50%, transparent);
4224
+ opacity: 0;
4225
+ transition: opacity 0.18s;
4226
+ pointer-events: none;
4227
+ }
4228
+ .ap-voice-forge:hover .ap-voice-forge-rune::after {
4229
+ opacity: 1;
4230
+ animation: ap-voice-forge-rune-pulse 1.4s ease-in-out infinite;
4231
+ }
4232
+ @keyframes ap-voice-forge-rune-pulse {
4233
+ 0%, 100% { transform: scale(1); opacity: 0.65; }
4234
+ 50% { transform: scale(1.18); opacity: 0; }
4235
+ }
4236
+ .ap-voice-forge-title {
4237
+ flex: 1;
4238
+ min-width: 0;
4239
+ font-family: var(--mono);
4240
+ font-size: 14px;
4241
+ font-weight: 700;
4242
+ letter-spacing: 0.08em;
4243
+ text-transform: uppercase;
4244
+ color: var(--text);
4245
+ white-space: nowrap;
4246
+ overflow: hidden;
4247
+ text-overflow: ellipsis;
4248
+ }
4249
+ .ap-voice-forge-title::before { content: "[ + "; color: var(--text-faint); }
4250
+ .ap-voice-forge-title::after { content: " ]"; color: var(--text-faint); }
4251
+ .ap-voice-forge:hover .ap-voice-forge-title::before,
4252
+ .ap-voice-forge:hover .ap-voice-forge-title::after { color: var(--lime); }
4253
+ .ap-voice-forge-arrow {
4254
+ flex-shrink: 0;
4255
+ font-family: var(--mono);
4256
+ font-size: 18px;
4257
+ line-height: 1;
4258
+ color: var(--lime);
4259
+ transform: translateX(0);
4260
+ transition: transform 0.18s ease;
4261
+ }
4262
+ .ap-voice-forge:hover .ap-voice-forge-arrow { transform: translateX(4px); }
4263
+
4264
+ .ap-voice-forge-hint {
4265
+ position: relative;
4266
+ z-index: 3;
4267
+ font-family: var(--mono);
4268
+ font-size: 11px;
4269
+ color: var(--text-faint);
4270
+ letter-spacing: 0.02em;
4271
+ line-height: 1.55;
4272
+ }
4273
+ .ap-voice-forge-hint::before {
4274
+ content: "// ";
4275
+ color: color-mix(in srgb, var(--lime) 60%, var(--text-faint));
4276
+ }
4277
+
3996
4278
  .ap-voice-picker-row {
3997
4279
  display: flex;
3998
4280
  align-items: center;
@@ -4078,7 +4360,6 @@
4078
4360
  display: flex;
4079
4361
  flex-direction: column;
4080
4362
  gap: 6px;
4081
- margin-top: 8px;
4082
4363
  }
4083
4364
  .ap-voice-emotion-row .ap-voice-emotion-trigger {
4084
4365
  width: 100%;
@@ -4299,45 +4580,54 @@
4299
4580
  pointer-events: none;
4300
4581
  z-index: 0;
4301
4582
  }
4583
+ /* Advanced tuning · sits at the very bottom of the voice block,
4584
+ under the Forge CTA. Plain header row — no chip / no border / no
4585
+ background — so it reads as "extra knobs if you need them" rather
4586
+ than another card vying for attention. Only the top hairline
4587
+ divider remains for section separation; the `+ / −` marker uses
4588
+ lime to stay legible in both light and dark themes. */
4589
+ /* Advanced details wrapper · now lives inside its own
4590
+ .ap-voice-section, which already supplies the top divider +
4591
+ vertical padding. Strip the duplicate spacing/border so the
4592
+ chevron row aligns with neighbouring section headers. */
4302
4593
  .ap-voice-advanced {
4303
- margin-top: 10px;
4304
- border-top: 1px solid var(--line);
4305
- padding-top: 8px;
4594
+ margin: 0;
4595
+ border-top: 0;
4596
+ padding-top: 0;
4306
4597
  }
4307
- /* Header row · label on the left, custom expand/collapse indicator
4308
- on the right. Removes the browser's default ▶ disclosure triangle
4309
- on the left so the row reads as a clean section header rather
4310
- than a list item. The right-edge `+ / −` glyph swaps when
4311
- [open] is set — same hairline mono register the rest of the
4312
- profile uses for header actions. */
4313
4598
  .ap-voice-advanced summary {
4314
4599
  display: flex;
4315
4600
  align-items: center;
4316
4601
  justify-content: space-between;
4317
4602
  gap: 12px;
4603
+ padding: 4px 0;
4318
4604
  font-family: var(--mono, monospace);
4319
- font-size: 10px;
4320
- letter-spacing: 0.04em;
4605
+ font-size: 11px;
4606
+ letter-spacing: 0.14em;
4321
4607
  text-transform: uppercase;
4322
4608
  color: var(--text-soft);
4323
4609
  cursor: pointer;
4324
4610
  user-select: none;
4325
4611
  list-style: none;
4612
+ transition: color 0.12s;
4326
4613
  }
4327
4614
  .ap-voice-advanced summary::-webkit-details-marker { display: none; }
4328
4615
  .ap-voice-advanced summary::marker { display: none; content: ""; }
4329
4616
  .ap-voice-advanced summary::after {
4330
4617
  content: "+";
4331
4618
  font-family: var(--mono, monospace);
4332
- font-size: 14px;
4333
- font-weight: 400;
4619
+ font-size: 16px;
4620
+ font-weight: 700;
4334
4621
  line-height: 1;
4335
- color: var(--text-faint);
4336
- transition: color 0.12s;
4622
+ color: var(--lime);
4623
+ transition: color 0.12s, transform 0.18s ease;
4624
+ }
4625
+ .ap-voice-advanced[open] summary::after {
4626
+ content: "−";
4627
+ transform: rotate(180deg);
4337
4628
  }
4338
- .ap-voice-advanced[open] summary::after { content: "−"; }
4339
4629
  .ap-voice-advanced summary:hover { color: var(--text); }
4340
- .ap-voice-advanced summary:hover::after { color: var(--text); }
4630
+ .ap-voice-advanced summary:hover::after { color: var(--lime); }
4341
4631
 
4342
4632
  /* ────────────────────────────────────────────────────────────
4343
4633
  Persona dossier · Full-mode agents only
@@ -4687,7 +4977,7 @@ html.is-electron-mac .ap-persona-overlay-backdrop {
4687
4977
  }
4688
4978
  .ap-persona-overlay-md h3 {
4689
4979
  font-family: var(--font-human);
4690
- font-size: 13px;
4980
+ font-size: 14px;
4691
4981
  font-weight: 700;
4692
4982
  color: var(--text);
4693
4983
  margin: 18px 0 6px;
@@ -4942,7 +5232,7 @@ body.ap-persona-overlay-open { overflow: hidden; }
4942
5232
  .ap-buildlog-phase-blurb {
4943
5233
  margin: 0;
4944
5234
  font-family: var(--font-human);
4945
- font-size: 13px;
5235
+ font-size: 14px;
4946
5236
  line-height: 1.6;
4947
5237
  color: var(--text-soft);
4948
5238
  padding-left: 34px;