nio-cat 0.9.10 → 0.9.13

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/web/app/style.css CHANGED
@@ -304,6 +304,15 @@ dialog.sheet[open] { animation: pop .22s var(--ease); }
304
304
  #palette li { display: flex; justify-content: space-between; gap: 12px; padding: 10px 12px; border-radius: 10px; cursor: pointer; font-size: 14px; }
305
305
  #palette li[aria-selected="true"] { background: var(--bg-2); }
306
306
  #palette li span { color: var(--fg-muted); font-size: 12px; }
307
+ /* Al mòbil, la paleta és un full de baix com els altres, i es tanca lliscant cap avall. */
308
+ @media (max-width: 820px) {
309
+ #palette { width: 100%; max-width: none; margin: auto 0 0; border-radius: 20px 20px 0 0; padding-bottom: var(--safe-b); max-height: 82dvh; }
310
+ #palette[open] { display: flex; flex-direction: column; animation: sheet-up .3s var(--ease); }
311
+ #palette::before { content: ''; display: block; width: 36px; height: 4px; margin: 8px auto 2px; border-radius: 4px; background: var(--border); flex: none; }
312
+ #palette input { border-radius: 0; flex: none; }
313
+ #palette ul { max-height: none; flex: 1; min-height: 0; }
314
+ #palette li { min-height: 46px; align-items: center; font-size: 15px; }
315
+ }
307
316
 
308
317
  .tour { position: fixed; inset: 0; z-index: 40; pointer-events: none; }
309
318
  .tour-spot { position: fixed; border-radius: 12px; box-shadow: 0 0 0 9999px color-mix(in srgb, var(--fg) 42%, transparent), 0 0 0 2px var(--white) inset; transition: left .35s var(--ease), top .35s var(--ease), width .35s var(--ease), height .35s var(--ease); }
@@ -458,7 +467,9 @@ dialog.sheet.wiz .sheet-in { padding: 0; gap: 0; flex: 1; min-height: 0; display
458
467
  .fs-pick b { overflow-wrap: anywhere; }
459
468
  .fs-list { max-height: none; }
460
469
  @media (max-width: 820px) {
461
- dialog.sheet.wiz { height: min(92dvh, calc(var(--vvh, 100dvh) - 8px)); }
470
+ /* Al mòbil, els assistents (Nova sessió, Afegeix ordinador…) fan l'alçada del contingut, no la de tota la pantalla. */
471
+ dialog.sheet.wiz { height: auto; max-height: min(92dvh, calc(var(--vvh, 100dvh) - 8px - var(--safe-t))); }
472
+ dialog.sheet.wiz .sheet-in, dialog.sheet.wiz .wiz-body { flex: 0 1 auto; }
462
473
  .wiz-head { padding: 10px 18px 8px; }
463
474
  .wiz-body { padding: 4px 18px 14px; }
464
475
  .wiz-foot { padding: 12px 18px calc(14px + var(--safe-b)); }
@@ -550,7 +561,14 @@ a.kbd { text-decoration: none; color: inherit; }
550
561
  .composer .mic.wait { opacity: .5; }
551
562
 
552
563
  /* ---------- Ordre i text net ---------- */
553
- .grid2.one { grid-template-columns: minmax(0, 1fr); max-width: 640px; }
564
+ .grid2.one { grid-template-columns: minmax(0, 1fr); max-width: 760px; }
565
+ .cols { max-width: 760px; }
566
+ /* Pantalla ampla: els panells d'una sola columna (Ajustos, Ordinadors, Pantalla) es reparteixen en dues, sense forats. */
567
+ @media (min-width: 1180px) {
568
+ .grid2.one, .cols { max-width: none; }
569
+ .cols, .grid2.one > .stack { display: block; columns: 2; column-gap: 16px; }
570
+ .cols > *, .grid2.one > .stack > * { break-inside: avoid; margin: 0 0 16px; }
571
+ }
554
572
  .top h1, .top p, .panel.empty h2, .panel.empty p, .stepper p, .stepper b, .help-body p, .card p, .sheet h2, .sheet p, .tour-card h3, .tour-card p, .muted.small { text-wrap: balance; }
555
573
  @media (max-width: 820px) {
556
574
  .side nav a[href="#/models"] { display: none; }
@@ -717,7 +735,7 @@ html.rd-open, html.rd-open body { overflow: hidden; }
717
735
  @media (max-width: 560px) { .rd-bar { padding: 8px 10px; gap: 8px; } .rd-stat, #rdFull { display: none; } .rd-seg button { padding: 9px 11px; } }
718
736
 
719
737
  .rd-stage img { transform-origin: center; will-change: transform; }
720
- .rd-tools { position: absolute; left: 50%; bottom: calc(14px + env(safe-area-inset-bottom, 0px)); transform: translateX(-50%); display: flex; align-items: center; gap: 6px; padding: 6px; border-radius: 14px; background: rgba(22, 22, 23, .86); border: 1px solid #36363a; backdrop-filter: blur(8px); z-index: 2; max-width: calc(100% - 20px); }
738
+ .rd-tools { position: absolute; left: 50%; bottom: calc(14px + var(--safe-b, 0px)); transform: translateX(-50%); display: flex; align-items: center; gap: 6px; padding: 6px; border-radius: 14px; background: rgba(22, 22, 23, .86); border: 1px solid #36363a; backdrop-filter: blur(8px); z-index: 2; max-width: calc(100% - 20px); }
721
739
  .rd-tools .rd-btn { padding: 10px 12px; min-width: 40px; }
722
740
  .rd-pct { min-width: 56px !important; font-variant-numeric: tabular-nums; }
723
741
  .rd-sep { width: 1px; align-self: stretch; background: #36363a; }
@@ -732,7 +750,7 @@ html.rd-open, html.rd-open body { overflow: hidden; }
732
750
  #jobMinsU { flex: 1; }
733
751
 
734
752
  /* Demo: avís d'ordinador simulat */
735
- .demo-bar { display: flex; align-items: center; justify-content: space-between; gap: 8px 16px; flex-wrap: wrap; margin: 16px 40px 0; padding: 10px 12px 10px 16px; border: 1px dashed var(--accent); border-radius: var(--radius); background: var(--panel); font-size: 13px; }
753
+ .demo-bar { display: flex; align-items: center; justify-content: space-between; gap: 8px 16px; flex-wrap: wrap; margin: 16px 40px 0; max-width: 1000px; padding: 10px 12px 10px 16px; border: 1px dashed var(--accent); border-radius: var(--radius); background: var(--panel); font-size: 13px; }
736
754
  .demo-bar b { color: var(--accent); }
737
755
  body.chat-mode .demo-bar, body.board-mode .demo-bar { display: none; }
738
756
  @media (max-width: 820px) { .demo-bar { margin: 12px 16px 0; } }
@@ -814,3 +832,15 @@ dialog.sheet:has(#memForm) { width: min(780px, calc(100% - 32px)); }
814
832
  .term-card { width: 100%; text-align: left; font: inherit; color: inherit; cursor: pointer; border-style: dashed; }
815
833
  .term-card:disabled { opacity: .6; cursor: progress; }
816
834
  .term-go { margin-left: auto; display: inline-flex; align-items: center; gap: 2px; font-weight: 600; color: var(--fg); }
835
+
836
+ /* Pas a pas de la clau d'ElevenLabs */
837
+ .el-guide { margin: -4px 0 4px; padding: 10px 12px; border-radius: 10px; background: var(--bg-2); font-size: 13.5px; }
838
+ .el-guide summary { cursor: pointer; font-weight: 600; }
839
+ .el-guide ol { margin: 10px 0 6px; padding-left: 20px; display: grid; gap: 8px; line-height: 1.45; }
840
+ .el-guide ul { margin: 6px 0 0; padding-left: 16px; display: grid; gap: 4px; }
841
+ .el-guide a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
842
+ .el-on, .el-off { display: inline-block; padding: 0 6px; border-radius: 6px; font-size: 12px; font-weight: 600; }
843
+ .el-on { background: color-mix(in srgb, var(--moss) 18%, transparent); color: var(--moss); }
844
+ .el-off { background: color-mix(in srgb, var(--fg) 8%, transparent); color: var(--fg-muted); }
845
+ .linkish { border: 0; background: none; padding: 0; font: inherit; color: inherit; text-decoration: underline; text-underline-offset: 2px; cursor: pointer; }
846
+ .main:has(.nt) .demo-bar { max-width: 1160px; }
package/web/board.css CHANGED
@@ -109,7 +109,7 @@
109
109
  .bd-chat .chips::-webkit-scrollbar { display: none; }
110
110
  .bd-chat .chip-s { flex: none; scroll-snap-align: start; max-width: 260px; box-sizing: border-box; height: 32px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 0 12px; line-height: 30px; text-align: center; border: 1px solid var(--border); border-radius: 999px; background: var(--white); font-size: 12px; font-weight: 500; cursor: pointer; }
111
111
  .bd-chat .chip-s:hover { border-color: var(--fg); }
112
- .bd-chat .cin { display: flex; gap: 8px; align-items: flex-end; padding: 12px 14px calc(14px + env(safe-area-inset-bottom)); border-top: 1px solid var(--border); }
112
+ .bd-chat .cin { display: flex; gap: 8px; align-items: flex-end; padding: 12px 14px calc(14px + var(--safe-b, 0px)); border-top: 1px solid var(--border); }
113
113
  .bd-chat .cin textarea { flex: 1; min-height: 42px; max-height: 140px; padding: 10px 12px; border: 1px solid var(--border); border-radius: 12px; background: var(--white); resize: none; font: inherit; font-size: 14px; line-height: 1.4; outline: none; }
114
114
  .bd-chat .cin textarea:focus { border-color: var(--fg); }
115
115
  .bd-chat .send { display: grid; place-items: center; width: 42px; height: 42px; flex: none; border: 0; border-radius: 12px; background: var(--fg); color: var(--bg); cursor: pointer; }
@@ -118,9 +118,9 @@
118
118
 
119
119
  @media (max-width: 1100px) { .board-root { --chat-w: 320px; } }
120
120
  @media (max-width: 820px) {
121
- .board-root { height: calc(100dvh - 56px - env(safe-area-inset-top)); }
121
+ .board-root { height: calc(100dvh - 56px - var(--safe-t, 0px)); }
122
122
  .chat-open .bd-tools, .chat-open .bd-right { transform: none; }
123
- .bd-tools { top: auto; bottom: calc(12px + env(safe-area-inset-bottom)); left: 10px; right: 10px; transform: none; overflow-x: auto; scrollbar-width: none; }
123
+ .bd-tools { top: auto; bottom: calc(12px + var(--safe-b, 0px)); left: 10px; right: 10px; transform: none; overflow-x: auto; scrollbar-width: none; }
124
124
  .bd-tools::-webkit-scrollbar { display: none; }
125
125
  .bd .tb { width: 40px; height: 40px; flex: none; }
126
126
  .bd .tb small { display: none; }
@@ -131,7 +131,7 @@
131
131
  .bd .chat-t > span:not(.bot) { display: none; }
132
132
  .only-m { display: grid !important; }
133
133
  .bd-style { display: none; }
134
- .style-open .bd-style:not([hidden]) { display: grid; left: 10px; right: 10px; top: auto; bottom: calc(70px + env(safe-area-inset-bottom)); width: auto; grid-template-columns: 1fr 1fr; }
134
+ .style-open .bd-style:not([hidden]) { display: grid; left: 10px; right: 10px; top: auto; bottom: calc(70px + var(--safe-b, 0px)); width: auto; grid-template-columns: 1fr 1fr; }
135
135
  .bd-help .cols { grid-template-columns: 1fr; }
136
136
  .bd-chat { position: absolute; top: auto; left: 0; right: 0; bottom: 0; z-index: 9; width: auto; height: min(78%, 600px); border: 0; border-top: 1px solid var(--border); border-radius: 20px 20px 0 0; transform: translateY(105%); transition: transform .34s var(--bd-ease), visibility 0s linear .34s; box-shadow: 0 -20px 50px -30px color-mix(in srgb, var(--fg) 55%, transparent); }
137
137
  .chat-open .bd-chat { transform: none; transition: transform .34s var(--bd-ease), visibility 0s; }
@@ -145,7 +145,7 @@
145
145
  .chat-open .bd-chat { transform: none; transition: transform .34s var(--bd-ease), visibility 0s; }
146
146
  .bd-chat header::before { content: ""; position: absolute; top: 6px; left: 50%; width: 36px; height: 4px; margin-left: -18px; border-radius: 4px; background: var(--border); }
147
147
  .chat-open .bd-tools, .chat-open .bd-right { transform: none; }
148
- .bd-tools { top: auto; bottom: calc(12px + env(safe-area-inset-bottom)); left: 10px; right: 10px; transform: none; overflow-x: auto; scrollbar-width: none; justify-content: flex-start; }
148
+ .bd-tools { top: auto; bottom: calc(12px + var(--safe-b, 0px)); left: 10px; right: 10px; transform: none; overflow-x: auto; scrollbar-width: none; justify-content: flex-start; }
149
149
  .bd-tools::-webkit-scrollbar { display: none; }
150
150
  .bd .tb { flex: none; }
151
151
  .bd .tb small { display: none; }
@@ -156,7 +156,7 @@
156
156
  .bd .chat-t > span:not(.bot) { display: none; }
157
157
  .bd .tb.only-m { display: grid !important; }
158
158
  .bd-style { display: none; }
159
- .style-open .bd-style:not([hidden]) { display: grid; left: 10px; right: 10px; top: auto; bottom: calc(70px + env(safe-area-inset-bottom)); width: auto; grid-template-columns: 1fr 1fr; }
159
+ .style-open .bd-style:not([hidden]) { display: grid; left: 10px; right: 10px; top: auto; bottom: calc(70px + var(--safe-b, 0px)); width: auto; grid-template-columns: 1fr 1fr; }
160
160
  }
161
161
  @container stage (max-width: 440px) {
162
162
  .bd .tb[data-tool="hand"], .bd .tb[data-tool="line"], .bd .tb[data-bd="lock"] { display: none; }
@@ -181,7 +181,7 @@
181
181
  .bd-chat header { padding-top: 22px; }
182
182
  .bd-chat .msgs { overscroll-behavior: contain; }
183
183
  .bd-chat .cin textarea { font-size: 16px; }
184
- .bd-chat .cin { padding-bottom: calc(12px + env(safe-area-inset-bottom)); }
184
+ .bd-chat .cin { padding-bottom: calc(12px + var(--safe-b, 0px)); }
185
185
  }
186
186
  @container stage (max-width: 720px) {
187
187
  .bd-scrim { display: block; position: absolute; inset: 0; z-index: 8; border: 0; background: color-mix(in srgb, var(--fg) 30%, transparent); opacity: 0; visibility: hidden; transition: opacity .3s, visibility 0s linear .3s; }
@@ -232,10 +232,10 @@
232
232
  /* Mòbil en horitzontal: poc d'alçada */
233
233
  @media (max-height: 480px) and (max-width: 940px) {
234
234
  .bd-chat { height: min(92%, 600px); }
235
- .bd-tools { bottom: calc(6px + env(safe-area-inset-bottom)); left: auto; right: auto; max-width: calc(100% - 20px); }
235
+ .bd-tools { bottom: calc(6px + var(--safe-b, 0px)); left: auto; right: auto; max-width: calc(100% - 20px); }
236
236
  .bd-tools { left: 50%; transform: translateX(-50%); }
237
237
  .bd .tb { height: 40px; }
238
- .style-open .bd-style:not([hidden]) { bottom: calc(58px + env(safe-area-inset-bottom)); max-height: calc(100% - 130px); overflow-y: auto; grid-template-columns: repeat(2, 1fr); }
238
+ .style-open .bd-style:not([hidden]) { bottom: calc(58px + var(--safe-b, 0px)); max-height: calc(100% - 130px); overflow-y: auto; grid-template-columns: repeat(2, 1fr); }
239
239
  .bd-help-in { padding: 14px; }
240
240
  .bd-empty { display: none; }
241
241
  }
package/web/index.html CHANGED
@@ -218,6 +218,7 @@ main { padding-bottom: 8px; }
218
218
  <section aria-labelledby="que">
219
219
  <div class="sec-head"><span class="eyebrow">Què hi pots fer</span><h2 id="que">Tot el que necessites per treballar amb agents</h2></div>
220
220
  <div class="grid">
221
+ <article class="card big c-lemon"><div class="big-l"><span class="tag">Notes</span><h3>Classe o reunió, apuntada sola</h3><p>Grava amb el micròfon del mòbil o de l’ordinador i Whisper ho transcriu a l’ordinador mentre es parla. Cada 4 o 5 minuts, un model en fa apunts; quan acabes, surt el resum de tot.</p><p class="muted">Tries l’idioma (català, castellà o anglès) i el model. L’àudio no surt dels teus ordinadors.</p></div><dl class="rows stack"><div><dt><strong>En directe</strong></dt><dd>La transcripció apareix cada 20 segons, al costat dels apunts.</dd></div><div><dt><strong>Classe</strong></dt><dd>Conceptes clau, punts importants i preguntes per repassar.</dd></div><div><dt><strong>Reunió</strong></dt><dd>Resum, decisions, tasques amb qui se’n fa càrrec i temes oberts.</dd></div><div><dt><strong>App d’Android</strong></dt><dd>Continua gravant amb la pantalla bloquejada, i si es talla la connexió guarda els trossos fins que torna.</dd></div></dl></article>
221
222
  <article class="card c-blue"><span class="tag">Agents</span><h3>Sessions en directe</h3><p>Claude Code, Codex, Grok i Antigravity a qualsevol dels teus ordinadors. Tries la carpeta i els permisos, i la resposta arriba mentre treballa.</p></article>
222
223
  <article class="card c-rose"><span class="tag">Seguretat</span><h3>Aprovacions</h3><p>Abans d’editar, executar o clicar res, te’n demana permís amb el motiu. Ho aproves o ho rebutges amb un toc, i tot queda registrat.</p></article>
223
224
  <article class="card c-lilac"><span class="tag">Connexió</span><h3>Avisos al mòbil</h3><p>Una notificació quan un agent et demana permís o acaba. Arriba buida: el detall el demana el mòbil directament a l’ordinador.</p></article>
@@ -230,6 +231,9 @@ main { padding-bottom: 8px; }
230
231
  <article class="card c-blue"><span class="tag">Agents</span><h3>Git i GitHub</h3><p>Clona un repositori, mira els canvis, fes commit i crea un PR des del mòbil, amb el <code>git</code> i el <code>gh</code> de l’ordinador.</p></article>
231
232
  <article class="card c-lilac"><span class="tag">Connexió</span><h3>Telegram i veu</h3><p>Parla amb el teu bot o amb notes de veu, aprova amb un botó i escolta les respostes. Dictes gratis amb Whisper, que funciona a l’ordinador: l’àudio no en surt.</p></article>
232
233
  <article class="card c-green"><span class="tag">Xat local</span><h3>Ollama i xat local</h3><p>Fes servir models gratuïts a l’ordinador, o un model petit dins del navegador del mòbil, sense connexió.</p></article>
234
+ <article class="card c-peach"><span class="tag">Notes</span><h3>Notes i veu</h3><p>Notes amb llistes, colors i etiquetes, guardades a l’ordinador. Dicta-les o adjunta-hi àudio i es transcriu; llisca una nota per arxivar-la. Des de l’ordinador, pots fer servir el mòbil com a micròfon.</p></article>
235
+ <article class="card c-rose"><span class="tag">Agents</span><h3>Truca a en Nio</h3><p>Parla amb en Nio en temps real (ElevenLabs, amb la teva clau): et diu com van les sessions, li encarregues feina i aproves de paraula. La conversa surt en directe, paraula per paraula.</p></article>
236
+ <article class="card c-blue"><span class="tag">Agents</span><h3>Continua les sessions del terminal</h3><p>Les converses de Claude Code obertes al terminal de l’ordinador surten a Sessions. Toca’n una i continua-la des del mòbil amb tot l’historial.</p></article>
233
237
  </div>
234
238
  </section>
235
239
 
package/web/sw.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // nio · service worker: obre l'app encara que no hi hagi connexió i mostra els avisos.
2
- const SHELL = 'nio-shell-v51';
3
- const FILES = ['/app', '/app/style.css', '/app/notes.css', '/app/call.css', '/app/app.js', '/app/notes.js', '/app/call.js', '/app/demo.js', '/bot.css', '/bot.js', '/board.css', '/board.js', '/favicon.svg', '/manifest.webmanifest'];
2
+ const SHELL = 'nio-shell-v59';
3
+ const FILES = ['/app', '/app/style.css', '/app/notes.css', '/app/call.css', '/app/app.js', '/app/notes.js', '/app/notes-live.js', '/app/call.js', '/app/demo.js', '/bot.css', '/bot.js', '/board.css', '/board.js', '/favicon.svg', '/manifest.webmanifest'];
4
4
 
5
5
  self.addEventListener('install', (e) => {
6
6
  e.waitUntil(caches.open(SHELL).then((c) => c.addAll(FILES)).catch(() => {}));