@cat-factory/app 0.32.0 → 0.32.2

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.
@@ -1,7 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { VueFlow, useVueFlow, type NodeMouseEvent } from '@vue-flow/core'
3
3
  import { Background } from '@vue-flow/background'
4
- import { Controls } from '@vue-flow/controls'
5
4
  import { MiniMap } from '@vue-flow/minimap'
6
5
  import BlockNode from './nodes/BlockNode.vue'
7
6
  import EpicNode from './nodes/EpicNode.vue'
@@ -177,7 +176,6 @@ async function onDrop(event: DragEvent) {
177
176
  >
178
177
  <Background pattern-color="#1e293b" :gap="22" :size="1.4" />
179
178
  <MiniMap pannable zoomable :node-color="minimapColor" class="!bg-slate-900/80" />
180
- <Controls position="bottom-left" />
181
179
 
182
180
  <template #node-block="props">
183
181
  <BlockNode :id="props.id" />
@@ -354,80 +354,90 @@ const ITEM_ICON: Record<string, string> = {
354
354
  <div v-else-if="runFailed && run" class="p-3">
355
355
  <AgentFailureCard :run="run" variant="expanded" />
356
356
  </div>
357
- <div class="space-y-3 p-4">
358
- <!-- frame header: the whole bar is the drag handle for the expanded frame.
359
- `nopan` stops Vue Flow's pane from panning on a left-drag that starts here
360
- (it pans via d3-zoom's mousedown, which our pointerdown stopPropagation
361
- can't intercept), so the grab drives the frame move. The action buttons
362
- on the right opt out via `.nodrag` (onFrameHandle ignores them). -->
357
+ <div class="p-4">
358
+ <!-- frame header: the whole header (the title row AND the stats line below it)
359
+ is the drag handle for the expanded frame. `nopan` stops Vue Flow's pane
360
+ from panning on a left-drag that starts here (it pans via d3-zoom's
361
+ mousedown, which our pointerdown stopPropagation can't intercept), so the
362
+ grab drives the frame move. The action buttons on the right opt out via
363
+ `.nodrag` (onFrameHandle ignores them). `pb-3` provides the gap down to the
364
+ drop zone AND makes that gap part of the grab surface, so no header edge
365
+ falls through to the pane (the parent drops `space-y-3` to avoid doubling
366
+ the gap). -->
363
367
  <div
364
- class="nopan flex cursor-grab items-start justify-between gap-2 active:cursor-grabbing"
368
+ class="nopan cursor-grab space-y-3 pb-3 active:cursor-grabbing"
365
369
  title="Drag service"
366
370
  @pointerdown="onFrameHandle"
367
371
  >
368
- <div class="flex items-center gap-2">
369
- <div
370
- class="flex h-8 w-8 items-center justify-center rounded-lg"
371
- :style="{ backgroundColor: typeMeta!.accent + '22' }"
372
- >
373
- <UIcon :name="typeMeta!.icon" class="h-5 w-5" :style="{ color: typeMeta!.accent }" />
372
+ <div class="flex items-start justify-between gap-2">
373
+ <div class="flex items-center gap-2">
374
+ <div
375
+ class="flex h-8 w-8 items-center justify-center rounded-lg"
376
+ :style="{ backgroundColor: typeMeta!.accent + '22' }"
377
+ >
378
+ <UIcon
379
+ :name="typeMeta!.icon"
380
+ class="h-5 w-5"
381
+ :style="{ color: typeMeta!.accent }"
382
+ />
383
+ </div>
384
+ <div>
385
+ <div class="text-sm font-semibold text-white">{{ block.title }}</div>
386
+ <div class="text-[11px] text-slate-400">{{ typeMeta!.label }}</div>
387
+ </div>
374
388
  </div>
375
- <div>
376
- <div class="text-sm font-semibold text-white">{{ block.title }}</div>
377
- <div class="text-[11px] text-slate-400">{{ typeMeta!.label }}</div>
389
+ <div class="flex items-center gap-1">
390
+ <UBadge :color="statusMeta.chip as any" variant="subtle" size="sm">{{
391
+ statusLabel
392
+ }}</UBadge>
393
+ <UButton
394
+ class="nodrag"
395
+ data-testid="frame-add-task"
396
+ size="xs"
397
+ variant="ghost"
398
+ color="neutral"
399
+ icon="i-lucide-plus"
400
+ title="Add task"
401
+ @click.stop="addTask"
402
+ />
403
+ <UButton
404
+ v-if="tasks.anyOffered"
405
+ class="nodrag"
406
+ size="xs"
407
+ variant="ghost"
408
+ color="neutral"
409
+ icon="i-lucide-ticket"
410
+ title="Create task from issue"
411
+ @click.stop="createTaskFromIssue"
412
+ />
413
+ <UButton
414
+ class="nodrag"
415
+ size="xs"
416
+ variant="ghost"
417
+ color="neutral"
418
+ icon="i-lucide-repeat"
419
+ title="Add recurring pipeline"
420
+ @click.stop="addRecurring"
421
+ />
422
+ <UButton
423
+ class="nodrag"
424
+ size="xs"
425
+ variant="ghost"
426
+ color="neutral"
427
+ icon="i-lucide-chevron-up"
428
+ title="Collapse"
429
+ @click.stop="toggleExpand"
430
+ />
378
431
  </div>
379
432
  </div>
380
- <div class="flex items-center gap-1">
381
- <UBadge :color="statusMeta.chip as any" variant="subtle" size="sm">{{
382
- statusLabel
383
- }}</UBadge>
384
- <UButton
385
- class="nodrag"
386
- data-testid="frame-add-task"
387
- size="xs"
388
- variant="ghost"
389
- color="neutral"
390
- icon="i-lucide-plus"
391
- title="Add task"
392
- @click.stop="addTask"
393
- />
394
- <UButton
395
- v-if="tasks.anyOffered"
396
- class="nodrag"
397
- size="xs"
398
- variant="ghost"
399
- color="neutral"
400
- icon="i-lucide-ticket"
401
- title="Create task from issue"
402
- @click.stop="createTaskFromIssue"
403
- />
404
- <UButton
405
- class="nodrag"
406
- size="xs"
407
- variant="ghost"
408
- color="neutral"
409
- icon="i-lucide-repeat"
410
- title="Add recurring pipeline"
411
- @click.stop="addRecurring"
412
- />
413
- <UButton
414
- class="nodrag"
415
- size="xs"
416
- variant="ghost"
417
- color="neutral"
418
- icon="i-lucide-chevron-up"
419
- title="Collapse"
420
- @click.stop="toggleExpand"
421
- />
422
- </div>
423
- </div>
424
433
 
425
- <div class="flex items-center gap-2 text-[10px] uppercase tracking-wide text-slate-500">
426
- <span>{{ mergedTasks }}/{{ taskCount }} implemented</span>
427
- <span v-if="modules.length"
428
- >· {{ modules.length }} module{{ modules.length === 1 ? '' : 's' }}</span
429
- >
430
- <span v-if="prTasks" class="text-emerald-400">· {{ prTasks }} PR ready</span>
434
+ <div class="flex items-center gap-2 text-[10px] uppercase tracking-wide text-slate-500">
435
+ <span>{{ mergedTasks }}/{{ taskCount }} implemented</span>
436
+ <span v-if="modules.length"
437
+ >· {{ modules.length }} module{{ modules.length === 1 ? '' : 's' }}</span
438
+ >
439
+ <span v-if="prTasks" class="text-emerald-400">· {{ prTasks }} PR ready</span>
440
+ </div>
431
441
  </div>
432
442
 
433
443
  <!-- the 2D drop zone: modules and loose tasks live here, draggable -->
package/nuxt.config.ts CHANGED
@@ -49,7 +49,6 @@ export default defineNuxtConfig({
49
49
  css: [
50
50
  '@vue-flow/core/dist/style.css',
51
51
  '@vue-flow/core/dist/theme-default.css',
52
- '@vue-flow/controls/dist/style.css',
53
52
  '@vue-flow/minimap/dist/style.css',
54
53
  '@vue-flow/node-resizer/dist/style.css',
55
54
  join(layerDir, 'app/assets/css/main.css'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.32.0",
3
+ "version": "0.32.2",
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",
@@ -20,7 +20,6 @@
20
20
  "@nuxt/ui": "^4.9.0",
21
21
  "@pinia/nuxt": "^0.11.3",
22
22
  "@vue-flow/background": "^1.3.2",
23
- "@vue-flow/controls": "^1.1.3",
24
23
  "@vue-flow/core": "^1.48.2",
25
24
  "@vue-flow/minimap": "^1.5.4",
26
25
  "@vue-flow/node-resizer": "^1.5.1",