nio-cat 0.9.6 → 0.9.9

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
@@ -134,6 +134,9 @@ button.chip:hover { border-color: var(--fg); }
134
134
  .chip.running { background: var(--fg); color: var(--bg); border-color: var(--fg); }
135
135
  .chip.waiting { background: var(--lemon); border-color: var(--lemon); }
136
136
  .chip.error { color: var(--red); border-color: color-mix(in srgb, var(--red) 40%, transparent); }
137
+ .chip.usage { gap: 6px; }
138
+ .chip.usage .uw + .uw::before { content: '·'; margin-right: 6px; color: var(--fg-muted); font-weight: 400; }
139
+ .chip.usage .uw[data-hi="1"] { color: var(--red); font-weight: 600; }
137
140
  .chip.beta { height: 20px; padding: 0 7px; font-size: 10px; color: var(--fg-muted); }
138
141
  .pulse { width: 6px; height: 6px; border-radius: 50%; background: currentColor; animation: pulse 1.2s ease-in-out infinite; }
139
142
  @keyframes pulse { 50% { opacity: .3; } }
@@ -188,6 +191,11 @@ button.chip:hover { border-color: var(--fg); }
188
191
  .session-card .last.err { color: var(--red); }
189
192
  .session-card .last { color: var(--fg-muted); font-size: 14px; margin-top: 4px; line-height: 1.45; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
190
193
  .session-card .meta { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 10px; font-size: 12px; color: var(--fg-muted); }
194
+ #termSessions:not(:empty) { margin-bottom: 16px; }
195
+ .old-sessions { margin-top: 8px; }
196
+ .old-sessions > summary { cursor: pointer; padding: 8px 0; list-style: none; }
197
+ .old-sessions > summary::-webkit-details-marker { display: none; }
198
+ .old-sessions > .list { margin-top: 8px; }
191
199
  .fab { position: fixed; right: 24px; bottom: calc(24px + var(--safe-b)); z-index: 15; display: inline-flex; align-items: center; gap: 8px; height: 50px; padding: 0 20px 0 16px; border: 0; border-radius: 16px; background: var(--fg); color: var(--bg); font-weight: 600; box-shadow: 0 14px 30px -14px color-mix(in srgb, var(--fg) 70%, transparent); transition: transform .15s; }
192
200
  .fab:active { transform: scale(.97); }
193
201
 
@@ -718,3 +726,78 @@ html.rd-open, html.rd-open body { overflow: hidden; }
718
726
  .demo-bar b { color: var(--accent); }
719
727
  body.chat-mode .demo-bar, body.board-mode .demo-bar { display: none; }
720
728
  @media (max-width: 820px) { .demo-bar { margin: 12px 16px 0; } }
729
+
730
+ /* Sense ordinador: seccions de mostra desactivades */
731
+ .panel.off { opacity: .55; }
732
+ .panel.off .btn[disabled] { cursor: not-allowed; }
733
+ .card.off-note { display: flex; flex-direction: row; align-items: center; gap: 12px 16px; flex-wrap: wrap; border-style: dashed; }
734
+
735
+ /* Primer ordinador: ordre d'instal·lació, passos i botons alineats a la mateixa amplada */
736
+ .first-run > p:first-of-type { max-width: 34em; margin-inline: auto; }
737
+ .first-run .cmd { width: 100%; max-width: 640px; margin: 18px auto 0; text-align: left; }
738
+ .first-run .stepper { margin: 22px auto 20px; }
739
+ .first-run > .muted.small { margin-top: 12px; }
740
+ .first-run > .muted.small { max-width: none; }
741
+ .first-run .stepper { max-width: 680px; }
742
+ @media (max-width: 820px) { .first-run .cmd.big code { white-space: normal; overflow-wrap: anywhere; } }
743
+
744
+ /* Mòbil: la barra de dalt ja ocupa 56 px, així que la carcassa no ha de fer tota la pantalla (si no, sobra scroll
745
+ i la conversa puja en obrir-la). El camp de text queda enganxat a baix encara que tingui position: relative més amunt. */
746
+ @media (max-width: 820px) {
747
+ .shell { min-height: calc(100dvh - 56px - var(--safe-t)); }
748
+ body.chat-mode .composer { position: sticky; bottom: var(--kb, 0px); }
749
+ }
750
+ /* Referència per mesurar els missatges (offsetTop) dins la conversa. */
751
+ .feed { position: relative; }
752
+
753
+ /* Totes les seccions, amb controls còmodes de tocar. */
754
+ .more-sections { display: grid; gap: 22px; margin-top: 20px; }
755
+ .more-sections h3 { margin: 0 0 6px; font-size: 12px; font-weight: 600; color: var(--fg-muted); }
756
+ .more-sections section > div { display: grid; }
757
+ .more-link { display: flex; align-items: center; gap: 12px; min-height: 48px; padding: 10px 12px; border-radius: 10px; text-decoration: none; }
758
+ .more-link > span:first-of-type { flex: 1; }
759
+ .more-link > .ico:last-child { width: 14px; color: var(--fg-muted); }
760
+ .more-link:hover, .more-link[aria-current="page"] { background: var(--bg-2); }
761
+ .voice-extras { border: 1px solid var(--border); border-radius: 12px; padding: 0 14px; }
762
+ .voice-extras summary { min-height: 48px; padding-block: 13px; cursor: pointer; font-weight: 600; }
763
+ .voice-extras > div { padding: 6px 0 16px; }
764
+ @media (max-width: 820px) { .tabbar > * { min-height: 48px; } .side nav a { min-height: 46px; } }
765
+
766
+ /* Llistes i formularis també han d’encaixar amb text llarg o el teclat obert. */
767
+ .side nav { min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
768
+ .side > .brand, .side > .foot { flex-shrink: 0; }
769
+ :where(.panel, .card, .stack, .stack-lg, .grid-2, .grid-2 > *, label.f) { min-width: 0; }
770
+ :where(.top, .panel .body, .mem-list, .job, .sheet-in h2, .conn span) { overflow-wrap: anywhere; }
771
+ .grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
772
+ .conn span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
773
+ :where(button, a, input, textarea, select, summary):focus-visible { outline: 2px solid var(--fg); outline-offset: 3px; }
774
+ @media (max-width: 820px) {
775
+ dialog.sheet { max-height: min(92dvh, calc(var(--vvh, 100dvh) - 8px)); }
776
+ .btn, .btn.sm, .icon-btn, .seg button { min-height: 44px; }
777
+ input[type="text"], input[type="password"], input[type="url"], input[type="search"], select, textarea.field { font-size: 16px; }
778
+ .sheet-foot { bottom: calc(-22px - var(--safe-b)); }
779
+ }
780
+ @media (max-width: 520px) { .grid-2 { grid-template-columns: minmax(0, 1fr); } }
781
+ .sheet-in { position: relative; }
782
+ .sheet-close { position: absolute; top: 14px; right: 14px; z-index: 1; }
783
+ .sheet-in > h2 { padding-right: 42px; }
784
+ .form-error { color: var(--red); font-size: 13px; overflow-wrap: anywhere; }
785
+ dialog.sheet:has(#memForm) { width: min(780px, calc(100% - 32px)); }
786
+ @media (max-width: 820px) {
787
+ .sheet-close { top: 16px; right: 10px; }
788
+ dialog.sheet:has(#memForm) { width: 100%; }
789
+ }
790
+ @media (max-width: 520px) {
791
+ #jobWhen { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 3px; }
792
+ #jobWhen button { white-space: normal; padding: 6px 8px; }
793
+ }
794
+ @media (max-width: 820px) {
795
+ dialog.sheet { top: auto; bottom: var(--kb, 0px); margin: 0; }
796
+ }
797
+
798
+ /* Sessions obertes al terminal de l'ordinador */
799
+ .term-sessions { margin-bottom: 22px; }
800
+ .term-sessions h2.sec { margin: 0 0 8px; }
801
+ .term-card { width: 100%; text-align: left; font: inherit; color: inherit; cursor: pointer; border-style: dashed; }
802
+ .term-card:disabled { opacity: .6; cursor: progress; }
803
+ .term-go { margin-left: auto; display: inline-flex; align-items: center; gap: 2px; font-weight: 600; color: var(--fg); }
package/web/index.html CHANGED
@@ -20,14 +20,19 @@
20
20
  <meta property="og:url" content="https://www.nio.cat/">
21
21
  <meta property="og:title" content="nio // els teus agents, des del mòbil">
22
22
  <meta property="og:description" content="Claude Code i Codex als teus ordinadors, controlats des del mòbil. Personal, gratuït i amb les teves claus.">
23
- <meta property="og:image" content="https://www.nio.cat/og.png">
23
+ <meta property="og:image" content="https://www.nio.cat/og.jpg">
24
24
  <meta property="og:image:width" content="1200">
25
25
  <meta property="og:image:height" content="630">
26
26
  <meta property="og:image:alt" content="nio">
27
+ <meta property="og:video" content="https://www.nio.cat/og.mp4">
28
+ <meta property="og:video:secure_url" content="https://www.nio.cat/og.mp4">
29
+ <meta property="og:video:type" content="video/mp4">
30
+ <meta property="og:video:width" content="1920">
31
+ <meta property="og:video:height" content="1080">
27
32
  <meta name="twitter:card" content="summary_large_image">
28
33
  <meta name="twitter:title" content="nio // els teus agents, des del mòbil">
29
34
  <meta name="twitter:description" content="Claude Code i Codex als teus ordinadors, controlats des del mòbil. Personal, gratuït i amb les teves claus.">
30
- <meta name="twitter:image" content="https://www.nio.cat/og.png">
35
+ <meta name="twitter:image" content="https://www.nio.cat/og.jpg">
31
36
  <meta name="format-detection" content="telephone=no">
32
37
  <link rel="icon" href="/favicon.svg" type="image/svg+xml">
33
38
  <link rel="apple-touch-icon" href="/apple-touch-icon.png">
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-v38';
3
- const FILES = ['/app', '/app/style.css', '/app/app.js', '/app/demo.js', '/bot.css', '/bot.js', '/board.css', '/board.js', '/favicon.svg', '/manifest.webmanifest'];
2
+ const SHELL = 'nio-shell-v50';
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'];
4
4
 
5
5
  self.addEventListener('install', (e) => {
6
6
  e.waitUntil(caches.open(SHELL).then((c) => c.addAll(FILES)).catch(() => {}));