diff --git a/.gitea/workflows/studio.yml b/.gitea/workflows/studio.yml index fcbecdd..ae2b792 100644 --- a/.gitea/workflows/studio.yml +++ b/.gitea/workflows/studio.yml @@ -5,12 +5,18 @@ on: paths: - 'apps/studio/**' - 'scripts/deploy-studio.sh' + - 'scripts/verify-studio-production.sh' + - 'scripts/verify-studio-library.mjs' + - 'scripts/verify-studio-visual.cjs' - '.gitea/workflows/studio.yml' - 'pnpm-workspace.yaml' pull_request: paths: - 'apps/studio/**' - 'scripts/deploy-studio.sh' + - 'scripts/verify-studio-production.sh' + - 'scripts/verify-studio-library.mjs' + - 'scripts/verify-studio-visual.cjs' - '.gitea/workflows/studio.yml' - 'pnpm-workspace.yaml' workflow_dispatch: @@ -28,3 +34,21 @@ jobs: - name: Release studio if: gitea.ref == 'refs/heads/main' && (gitea.event_name == 'push' || gitea.event_name == 'workflow_dispatch') run: bash scripts/deploy-studio.sh "${{ gitea.sha }}" + - name: Capture deployed baseline diagnostics (does not validate PR code) + if: gitea.event_name == 'pull_request' + run: bash scripts/verify-studio-production.sh --diagnose + - name: Verify the deployed Studio API and native pages + if: gitea.ref == 'refs/heads/main' && (gitea.event_name == 'push' || gitea.event_name == 'workflow_dispatch') + run: bash scripts/verify-studio-production.sh + - name: Save server acceptance evidence + id: acceptance_evidence + if: always() + uses: actions/upload-artifact@v3 + with: + name: studio-production-acceptance + path: artifacts/studio-acceptance/ + if-no-files-found: ignore + retention-days: 7 + - name: Remove temporary acceptance output after upload + if: always() && steps.acceptance_evidence.outcome == 'success' + run: rm -rf artifacts/studio-acceptance diff --git a/apps/studio/src/components/LayoutWorkbench.tsx b/apps/studio/src/components/LayoutWorkbench.tsx index 501219b..51ad834 100644 --- a/apps/studio/src/components/LayoutWorkbench.tsx +++ b/apps/studio/src/components/LayoutWorkbench.tsx @@ -1,3 +1,4 @@ +import {CurvedCopy} from './NativeCurvedCopy'; import {useEffect,useRef,useState,type CSSProperties,type KeyboardEvent,type PointerEvent} from 'react'; import {ArrowLeft,MousePointer2,Type,Square,Circle,ImagePlus,Layers,SlidersHorizontal,Undo2,Redo2,Copy,Trash2,Eye,EyeOff,Lock,Unlock,ChevronUp,ChevronDown,Minus,Plus,Scan,Save} from 'lucide-react'; import Head from 'next/head'; @@ -11,10 +12,6 @@ function TextElement({value,editable,onChange,onInvalid,onDirty,...props}:{value useEffect(()=>{if(ref.current&&document.activeElement!==ref.current)ref.current.textContent=value},[value]); return