Files
wace_rps/frontend/package.json
T
hjjeong 8fdc42df79 PR-C G5-B 일반 견적서 PDF 다운로드 (html2canvas-pro + jspdf)
- frontend deps: html2canvas-pro@^2.0.2, jspdf@^3.0.4
- template1 페이지 "PDF 다운로드" 버튼 → wace fn_generatePdf 1:1 포팅
  · 클라이언트 dynamic import (SSR 회피)
  · html2canvas-pro 캡처 (scale 2, JPEG 0.85) → jsPDF A4 페이지 분할 → save({estimateNo}.pdf)
  · onclone 콜백에서 input/textarea/select → 텍스트 노드로 교체 (글자 잘림 방지)
  · .no-print, .btn-area, 삭제버튼은 클론에서 숨김
- html2canvas-pro 사용 이유: Tailwind 4 oklab/oklch CSS color function 지원
  (기존 html2canvas 1.4.1은 "Attempting to parse an unsupported color function 'oklab'" 에러)

장비 견적서(template2)는 wace 원본부터 PDF 다운로드 버튼이 없어 그대로 유지.
메일 발송용 PDF 합본은 G6 SMTP 묶음에서 처리.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 14:32:29 +09:00

141 lines
4.5 KiB
JSON

{
"name": "frontend",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack -p 9771",
"dev:docker": "next dev -p 3000",
"build": "next build",
"build:no-lint": "DISABLE_ESLINT_PLUGIN=true next build",
"start": "next start",
"lint": "next lint",
"lint:fix": "next lint --fix",
"format": "prettier --write .",
"format:check": "prettier --check .",
"create-layout": "node scripts/create-layout.js",
"performance-test": "tsx scripts/performance-test.ts",
"test:dataflow": "jest lib/services/__tests__/buttonDataflowPerformance.test.ts"
},
"dependencies": {
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@hookform/resolvers": "^5.2.1",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-avatar": "^1.1.0",
"@radix-ui/react-checkbox": "^1.3.3",
"@radix-ui/react-collapsible": "^1.1.12",
"@radix-ui/react-context-menu": "^2.2.16",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-navigation-menu": "^1.2.14",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-radio-group": "^1.3.8",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-separator": "^1.1.7",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-switch": "^1.2.6",
"@radix-ui/react-tabs": "^1.1.13",
"@react-three/drei": "^10.7.6",
"@react-three/fiber": "^9.4.0",
"@swc/helpers": "^0.5.21",
"@tanstack/react-query": "^5.86.0",
"@tanstack/react-table": "^8.21.3",
"@tanstack/react-virtual": "^3.13.23",
"@tiptap/core": "^2.27.1",
"@tiptap/extension-image": "^2.27.1",
"@tiptap/extension-link": "^2.27.1",
"@tiptap/extension-placeholder": "^2.27.1",
"@tiptap/pm": "^2.27.1",
"@tiptap/react": "^2.27.2",
"@tiptap/starter-kit": "^2.27.2",
"@turf/buffer": "^7.2.0",
"@turf/helpers": "^7.2.0",
"@turf/intersect": "^7.2.0",
"@turf/turf": "^7.2.0",
"@turf/union": "^7.2.0",
"@types/d3": "^7.4.3",
"@types/leaflet": "^1.9.21",
"@types/qrcode": "^1.5.6",
"@types/react-grid-layout": "^1.3.6",
"@types/react-window": "^1.8.8",
"@types/three": "^0.180.0",
"@xyflow/react": "^12.8.4",
"@zxing/library": "^0.21.3",
"axios": "^1.11.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"d3": "^7.9.0",
"date-fns": "^4.1.0",
"docx": "^9.5.1",
"docx-preview": "^0.3.6",
"exceljs": "^4.4.0",
"html-to-image": "^1.11.13",
"html2canvas": "^1.4.1",
"html2canvas-pro": "^2.0.2",
"isomorphic-dompurify": "^2.28.0",
"jsbarcode": "^3.12.1",
"jspdf": "^3.0.4",
"leaflet": "^1.9.4",
"lucide-react": "^0.525.0",
"mammoth": "^1.11.0",
"maxrects-packer": "^2.7.3",
"modern-screenshot": "^4.6.8",
"next": "^15.4.8",
"next-themes": "^0.4.6",
"qrcode": "^1.5.4",
"radix-ui": "^1.4.3",
"react": "19.1.0",
"react-day-picker": "^9.11.1",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
"react-dom": "19.1.0",
"react-grid-layout": "^2.2.2",
"react-hook-form": "^7.62.0",
"react-hot-toast": "^2.6.0",
"react-image-crop": "^11.0.10",
"react-is": "^18.3.1",
"react-leaflet": "^5.0.0",
"react-resizable-panels": "^3.0.6",
"react-webcam": "^7.2.0",
"react-window": "^2.1.0",
"react-zoom-pan-pinch": "^3.7.0",
"reactflow": "^11.11.4",
"recharts": "^3.2.1",
"sheetjs-style": "^0.15.8",
"socket.io-client": "^4.8.3",
"sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"three": "^0.180.0",
"uuid": "^13.0.0",
"xlsx": "^0.18.5",
"zod": "^4.1.5",
"zustand": "^5.0.11"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@tailwindcss/postcss": "^4",
"@tanstack/react-query-devtools": "^5.86.0",
"@types/jsbarcode": "^3.11.4",
"@types/node": "^20",
"@types/react": "^19.1.13",
"@types/react-dom": "^19.1.9",
"@types/uuid": "^10.0.0",
"eslint": "^9",
"eslint-config-next": "15.4.4",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"prettier": "^3.6.2",
"prettier-plugin-tailwindcss": "^0.6.14",
"prisma": "^6.14.0",
"tailwindcss": "^4",
"tw-animate-css": "^1.3.6",
"typescript": "^5"
}
}