@cat-factory/app 0.116.3 → 0.116.4

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.
@@ -9,6 +9,37 @@
9
9
  user-select: text;
10
10
  }
11
11
 
12
+ /* Keep the bottom-anchored toaster clear of the home indicator / rounded corner
13
+ * on phones. The toaster viewport is bottom-anchored (Nuxt UI positions it at
14
+ * `bottom-4`), so we add the safe-area inset to that OFFSET rather than to the
15
+ * padding: each toast is `position: absolute; bottom: 0` inside the viewport, so
16
+ * padding-bottom does not lift it (an abs child anchored to `bottom-0` tracks the
17
+ * padding-box edge and ignores the padding). `env(safe-area-inset-bottom)` is 0
18
+ * until the viewport meta carries `viewport-fit=cover` (see nuxt.config.ts), so
19
+ * this collapses to the stock `1rem` on desktop. Assumes the default bottom
20
+ * placement (the app does not configure a top-anchored toaster). */
21
+ [data-slot='viewport'] {
22
+ bottom: calc(1rem + env(safe-area-inset-bottom));
23
+ }
24
+
25
+ /* Input font floor (P-3): iOS Safari auto-zooms the viewport whenever a focused
26
+ * field renders below 16px, which yanks the layout around on every tap into an
27
+ * input. Floor every editable control at 16px on coarse-pointer (touch) devices.
28
+ * This is the app-wide, fix-once guard: it reaches Nuxt UI's rendered
29
+ * `<input>`/`<textarea>` AND every hand-rolled raw field, and — unlike a
30
+ * component-default override — cannot be defeated by a per-instance `size="sm"`.
31
+ * `max(16px, 1em)` floors at 16px while leaving any deliberately larger field
32
+ * (1em resolves against the surrounding font size) untouched. Fine-pointer
33
+ * (desktop) keeps the denser typography. Checkbox/radio/range/color have no
34
+ * text baseline and never trigger the zoom, so they're excluded. */
35
+ @media (pointer: coarse) {
36
+ input:not([type='checkbox']):not([type='radio']):not([type='range']):not([type='color']),
37
+ textarea,
38
+ select {
39
+ font-size: max(16px, 1em);
40
+ }
41
+ }
42
+
12
43
  /* ---- Agent Architecture Board: shared visual language ---------------------- */
13
44
 
14
45
  :root {
@@ -139,7 +139,7 @@ watch(
139
139
  :aria-modal="drawerOpen ? 'true' : undefined"
140
140
  :aria-label="isCompact ? t('nav.menu') : undefined"
141
141
  :inert="isCompact && !ui.mobileNavOpen"
142
- class="fixed inset-y-0 start-0 z-40 flex h-full w-64 shrink-0 flex-col gap-4 overflow-y-auto border-e border-slate-800 bg-slate-900/95 p-3 backdrop-blur transition-transform duration-200 focus:outline-none lg:static lg:z-auto lg:translate-x-0 lg:bg-slate-900/80"
142
+ class="fixed inset-y-0 start-0 z-40 flex h-full w-64 shrink-0 flex-col gap-4 overflow-y-auto border-e border-slate-800 bg-slate-900/95 px-3 pt-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))] backdrop-blur transition-transform duration-200 focus:outline-none lg:static lg:z-auto lg:translate-x-0 lg:bg-slate-900/80"
143
143
  :class="
144
144
  ui.mobileNavOpen ? 'translate-x-0' : '-translate-x-full rtl:translate-x-full lg:translate-x-0'
145
145
  "
@@ -572,7 +572,7 @@ async function copyOutput() {
572
572
  </p>
573
573
  </div>
574
574
 
575
- <div class="flex-1 space-y-3 overflow-auto px-4 py-3">
575
+ <div class="flex-1 space-y-3 overflow-auto overscroll-contain px-4 py-3">
576
576
  <p
577
577
  v-if="editing"
578
578
  class="rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-[12px] leading-relaxed text-amber-200/90"
@@ -659,7 +659,10 @@ async function copyOutput() {
659
659
  </div>
660
660
 
661
661
  <!-- edit-then-approve actions -->
662
- <div v-if="editing" class="space-y-2 border-t border-slate-800 px-4 py-3">
662
+ <div
663
+ v-if="editing"
664
+ class="space-y-2 border-t border-slate-800 px-4 pt-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]"
665
+ >
663
666
  <UButton
664
667
  color="primary"
665
668
  size="sm"
@@ -682,7 +685,10 @@ async function copyOutput() {
682
685
  </UButton>
683
686
  </div>
684
687
 
685
- <div v-else class="space-y-2 border-t border-slate-800 px-4 py-3">
688
+ <div
689
+ v-else
690
+ class="space-y-2 border-t border-slate-800 px-4 pt-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]"
691
+ >
686
692
  <UButton
687
693
  color="primary"
688
694
  data-testid="step-approve"
@@ -269,7 +269,9 @@ const showOriginalDescription = ref(false)
269
269
  (Run / Focus / Delete) stay reachable. The status bar above stays put.
270
270
  On compact viewports the panel is a bottom sheet capped to the visible
271
271
  height (dvh excludes mobile browser chrome). -->
272
- <div class="max-h-[80dvh] space-y-4 overflow-y-auto p-4 lg:max-h-[calc(100vh-5rem)]">
272
+ <div
273
+ class="max-h-[80dvh] space-y-4 overflow-y-auto overscroll-contain px-4 pt-4 pb-[calc(1rem+env(safe-area-inset-bottom))] lg:max-h-[calc(100vh-5rem)]"
274
+ >
273
275
  <!-- header -->
274
276
  <div class="flex items-start justify-between gap-2">
275
277
  <div class="flex items-center gap-2">
package/nuxt.config.ts CHANGED
@@ -115,7 +115,21 @@ export default defineNuxtConfig({
115
115
  app: {
116
116
  head: {
117
117
  title: 'Agent Architecture Board',
118
- meta: [{ name: 'viewport', content: 'width=device-width, initial-scale=1' }],
118
+ meta: [
119
+ // `viewport-fit=cover` is what makes `env(safe-area-inset-*)` resolve to
120
+ // non-zero on notched/rounded phones — the safe-area padding on the
121
+ // bottom-anchored surfaces (inspector sheet, drawer, toaster) is inert
122
+ // without it, so the two ship together.
123
+ {
124
+ name: 'viewport',
125
+ content: 'width=device-width, initial-scale=1, viewport-fit=cover',
126
+ },
127
+ // Tint the mobile browser chrome / iOS Safari address bar to the board
128
+ // surface so the app doesn't sit under a mismatched white bar. Matches
129
+ // `--board-bg`. (Home-screen installability — manifest, standalone status
130
+ // bar, touch icons — is deferred to the initiative's E2/A5-icons follow-up.)
131
+ { name: 'theme-color', content: '#0b1020' },
132
+ ],
119
133
  },
120
134
  },
121
135
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.116.3",
3
+ "version": "0.116.4",
4
4
  "description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
5
5
  "repository": {
6
6
  "type": "git",