@things-factory/board-ai 10.0.0-beta.80 → 10.0.0-beta.81

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,12 +1,19 @@
1
1
  const ASPECT_TO_PATCH = {
2
2
  fill: { fillStyle: { type: 'none' } },
3
- stroke: { strokeStyle: { width: 0 } },
3
+ // stroke: strokeStyle 색상 문자열 (top-level), 굵기는 lineWidth (top-level).
4
+ // 굵기 0 으로 윤곽선 시각 제거 (색은 유지). 완전 제거는 strokeStyle: null 동시 set.
5
+ stroke: { lineWidth: 0 },
4
6
  shadow: { shadow: { blur: 0, color: 'transparent' } },
5
7
  material: { material3d: { preset: 'default' } },
6
- // font: 폰트는 reset 의도가 모호 — fontSize 같은 핵심 키만 unset 하고 나머지
7
- // 실제 reset deleteKey 필요한데 patch 시스템이 그걸 어떻게 표현할지 별도 결정.
8
- // 일단 placeholder 로 빈 객체 (의미 없음 — 향후 dispatch 에서 deleteKey 추가)
9
- font: {},
8
+ // font: null = delete 시맨틱 (apply-patch.ts:233-243). 핵심 폰트 모두 제거
9
+ // component 기본 폰트 동작으로 복귀. 보존이 의도라면 font aspect 미선택.
10
+ font: {
11
+ fontSize: null,
12
+ fontFamily: null,
13
+ fontColor: null,
14
+ fontWeight: null,
15
+ fontStyle: null
16
+ },
10
17
  opacity: { alpha: 1 }
11
18
  };
12
19
  export function buildClearStyleOps(input) {
@@ -1 +1 @@
1
- {"version":3,"file":"clear-tools.js","sourceRoot":"","sources":["../../../../server/service/styling/clear-tools.ts"],"names":[],"mappings":"AAiBA,MAAM,eAAe,GAAwB;IAC3C,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IACrC,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACrC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;IACrD,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAC/C,8DAA8D;IAC9D,4DAA4D;IAC5D,8DAA8D;IAC9D,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CACtB,CAAA;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,kCAAkC,CAAC,EAAE,CAAA;IAClE,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACpF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAA;IAEhF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,mCAAmC,CAAC,EAAE,CAAA;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IACzE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,GAAG,EAAE,EAAE;YACP,MAAM,EAAE,CAAC,sBAAsB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;SAChF,CAAA;IACH,CAAC;IAED,uDAAuD;IACvD,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,wCAAwC,CAAC,EAAE,CAAA;IACxE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC","sourcesContent":["/**\n * clearStyle — 특정 styling aspect 들을 초기화 (제거).\n *\n * preset 적용 전 / 데이터 바인딩 적용 전 깨끗한 상태로 돌리기 위한 helper.\n */\nimport type { BoardEditOp } from '../types'\n\nexport interface ClearStyleInput {\n refids: number[]\n aspects: Array<'fill' | 'stroke' | 'shadow' | 'material' | 'font' | 'opacity'>\n}\n\nexport interface OpsResult {\n ops: BoardEditOp[]\n errors: string[]\n}\n\nconst ASPECT_TO_PATCH: Record<string, any> = {\n fill: { fillStyle: { type: 'none' } },\n stroke: { strokeStyle: { width: 0 } },\n shadow: { shadow: { blur: 0, color: 'transparent' } },\n material: { material3d: { preset: 'default' } },\n // font: 폰트는 reset 의도가 모호 — fontSize 같은 핵심 키만 unset 하고 나머지 둠\n // 실제 reset deleteKey 필요한데 patch 시스템이 그걸 어떻게 표현할지 별도 결정.\n // 일단 placeholder 객체 (의미 없음 — 향후 dispatch 에서 deleteKey 추가)\n font: {},\n opacity: { alpha: 1 }\n}\n\nexport function buildClearStyleOps(input: ClearStyleInput): OpsResult {\n if (!Array.isArray(input.refids) || input.refids.length === 0) {\n return { ops: [], errors: ['refids must be a non-empty array'] }\n }\n const refids = input.refids.filter(n => typeof n === 'number' && Number.isFinite(n))\n if (refids.length === 0) return { ops: [], errors: ['No valid numeric refids'] }\n\n if (!Array.isArray(input.aspects) || input.aspects.length === 0) {\n return { ops: [], errors: ['aspects must be a non-empty array'] }\n }\n const valid = ['fill', 'stroke', 'shadow', 'material', 'font', 'opacity']\n const unknown = input.aspects.filter(a => !valid.includes(a))\n if (unknown.length > 0) {\n return {\n ops: [],\n errors: [`Unknown aspect(s): ${unknown.join(', ')}. Valid: ${valid.join('/')}`]\n }\n }\n\n // 모든 aspect 의 patch 를 하나로 병합 (한 refid 당 하나의 modify op)\n const merged: any = {}\n for (const a of input.aspects) {\n Object.assign(merged, ASPECT_TO_PATCH[a])\n }\n if (Object.keys(merged).length === 0) {\n return { ops: [], errors: ['No effective patch — try other aspects'] }\n }\n\n return {\n ops: refids.map(refid => ({ op: 'modify', refid, patch: merged })),\n errors: []\n }\n}\n"]}
1
+ {"version":3,"file":"clear-tools.js","sourceRoot":"","sources":["../../../../server/service/styling/clear-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * clearStyle — 특정 styling aspect 들을 초기화 (제거).\n *\n * preset 적용 전 / 데이터 바인딩 적용 전 깨끗한 상태로 돌리기 위한 helper.\n */\nimport type { BoardEditOp } from '../types'\n\nexport interface ClearStyleInput {\n refids: number[]\n aspects: Array<'fill' | 'stroke' | 'shadow' | 'material' | 'font' | 'opacity'>\n}\n\nexport interface OpsResult {\n ops: BoardEditOp[]\n errors: string[]\n}\n\nconst ASPECT_TO_PATCH: Record<string, any> = {\n fill: { fillStyle: { type: 'none' } },\n // stroke: strokeStyle 는 색상 문자열 (top-level), 굵기는 lineWidth (top-level).\n // 굵기 0 으로 윤곽선 시각 제거 (색은 유지). 완전 제거는 strokeStyle: null 동시 set.\n stroke: { lineWidth: 0 },\n shadow: { shadow: { blur: 0, color: 'transparent' } },\n material: { material3d: { preset: 'default' } },\n // font: null = delete 시맨틱 (apply-patch.ts:233-243). 핵심 폰트 모두 제거 →\n // component 기본 폰트 동작으로 복귀. 보존이 의도라면 font aspect 미선택.\n font: {\n fontSize: null,\n fontFamily: null,\n fontColor: null,\n fontWeight: null,\n fontStyle: null\n },\n opacity: { alpha: 1 }\n}\n\nexport function buildClearStyleOps(input: ClearStyleInput): OpsResult {\n if (!Array.isArray(input.refids) || input.refids.length === 0) {\n return { ops: [], errors: ['refids must be a non-empty array'] }\n }\n const refids = input.refids.filter(n => typeof n === 'number' && Number.isFinite(n))\n if (refids.length === 0) return { ops: [], errors: ['No valid numeric refids'] }\n\n if (!Array.isArray(input.aspects) || input.aspects.length === 0) {\n return { ops: [], errors: ['aspects must be a non-empty array'] }\n }\n const valid = ['fill', 'stroke', 'shadow', 'material', 'font', 'opacity']\n const unknown = input.aspects.filter(a => !valid.includes(a))\n if (unknown.length > 0) {\n return {\n ops: [],\n errors: [`Unknown aspect(s): ${unknown.join(', ')}. Valid: ${valid.join('/')}`]\n }\n }\n\n // 모든 aspect 의 patch 를 하나로 병합 (한 refid 당 하나의 modify op)\n const merged: any = {}\n for (const a of input.aspects) {\n Object.assign(merged, ASPECT_TO_PATCH[a])\n }\n if (Object.keys(merged).length === 0) {\n return { ops: [], errors: ['No effective patch — try other aspects'] }\n }\n\n return {\n ops: refids.map(refid => ({ op: 'modify', refid, patch: merged })),\n errors: []\n }\n}\n"]}