@things-factory/figure-ui 10.1.154 → 10.1.155

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.
Files changed (110) hide show
  1. package/client/modeller/canvas.ts +1 -1
  2. package/client/modeller/editor.ts +2 -2
  3. package/client/modeller/figure-capability-panel.ts +6 -24
  4. package/client/modeller/figure-carrier.ts +1 -1
  5. package/client/modeller/figure-clips.ts +1 -1
  6. package/client/modeller/figure-controls.ts +2 -2
  7. package/client/modeller/figure-face-mapping.ts +1 -1
  8. package/client/modeller/figure-links.ts +3 -2
  9. package/client/modeller/figure-material-panel.ts +1 -1
  10. package/client/modeller/figure-preview.ts +2 -2
  11. package/client/modeller/figure-properties.ts +1 -1
  12. package/client/modeller/figure-section-editor.ts +1 -1
  13. package/client/modeller/figure-section-panel.ts +1 -1
  14. package/client/modeller/figure-settings.ts +2 -2
  15. package/client/modeller/figure-verdict.ts +1 -1
  16. package/client/pages/figure-list-page.ts +7 -1
  17. package/client/viewparts/figure-detail-dock.ts +90 -41
  18. package/client/viewparts/figure-thumb.ts +2 -22
  19. package/dist-client/modeller/canvas.d.ts +1 -1
  20. package/dist-client/modeller/canvas.js +1 -1
  21. package/dist-client/modeller/canvas.js.map +1 -1
  22. package/dist-client/modeller/editor.js +2 -2
  23. package/dist-client/modeller/editor.js.map +1 -1
  24. package/dist-client/modeller/figure-capability-panel.d.ts +0 -3
  25. package/dist-client/modeller/figure-capability-panel.js +5 -18
  26. package/dist-client/modeller/figure-capability-panel.js.map +1 -1
  27. package/dist-client/modeller/figure-carrier.js +1 -1
  28. package/dist-client/modeller/figure-carrier.js.map +1 -1
  29. package/dist-client/modeller/figure-clips.js +1 -1
  30. package/dist-client/modeller/figure-clips.js.map +1 -1
  31. package/dist-client/modeller/figure-controls.js +2 -2
  32. package/dist-client/modeller/figure-controls.js.map +1 -1
  33. package/dist-client/modeller/figure-face-mapping.js +1 -1
  34. package/dist-client/modeller/figure-face-mapping.js.map +1 -1
  35. package/dist-client/modeller/figure-links.js +3 -2
  36. package/dist-client/modeller/figure-links.js.map +1 -1
  37. package/dist-client/modeller/figure-material-panel.js +1 -1
  38. package/dist-client/modeller/figure-material-panel.js.map +1 -1
  39. package/dist-client/modeller/figure-preview.d.ts +1 -1
  40. package/dist-client/modeller/figure-preview.js +2 -2
  41. package/dist-client/modeller/figure-preview.js.map +1 -1
  42. package/dist-client/modeller/figure-properties.js +1 -1
  43. package/dist-client/modeller/figure-properties.js.map +1 -1
  44. package/dist-client/modeller/figure-section-editor.js +1 -1
  45. package/dist-client/modeller/figure-section-editor.js.map +1 -1
  46. package/dist-client/modeller/figure-section-panel.js +1 -1
  47. package/dist-client/modeller/figure-section-panel.js.map +1 -1
  48. package/dist-client/modeller/figure-settings.d.ts +1 -1
  49. package/dist-client/modeller/figure-settings.js +1 -1
  50. package/dist-client/modeller/figure-settings.js.map +1 -1
  51. package/dist-client/modeller/figure-verdict.js +1 -1
  52. package/dist-client/modeller/figure-verdict.js.map +1 -1
  53. package/dist-client/pages/figure-list-page.d.ts +1 -0
  54. package/dist-client/pages/figure-list-page.js +11 -1
  55. package/dist-client/pages/figure-list-page.js.map +1 -1
  56. package/dist-client/tsconfig.tsbuildinfo +1 -1
  57. package/dist-client/viewparts/figure-detail-dock.d.ts +10 -1
  58. package/dist-client/viewparts/figure-detail-dock.js +93 -41
  59. package/dist-client/viewparts/figure-detail-dock.js.map +1 -1
  60. package/dist-client/viewparts/figure-thumb.d.ts +1 -0
  61. package/dist-client/viewparts/figure-thumb.js +2 -22
  62. package/dist-client/viewparts/figure-thumb.js.map +1 -1
  63. package/package.json +5 -4
  64. package/test/browser/detail-page.js +10 -2
  65. package/test/browser/product-page.check.mjs +1 -1
  66. package/test/browser/screen-page.js +1 -1
  67. package/test/browser/serve-detail.mjs +7 -2
  68. package/test/figure-controls-keys.test.ts +19 -0
  69. package/test/i18n-prefix-guard.test.ts +4 -1
  70. package/test/layout.test.ts +4 -3
  71. package/test/links.test.ts +5 -4
  72. package/test/properties.test.ts +2 -1
  73. package/test/refusals.test.ts +2 -1
  74. package/test/theme.test.ts +1 -1
  75. package/test/verdict.test.ts +2 -1
  76. package/test/words.ts +20 -0
  77. package/translations/en.json +2 -33
  78. package/translations/es.json +2 -33
  79. package/translations/ja.json +2 -33
  80. package/translations/ko.json +2 -33
  81. package/translations/ms.json +2 -33
  82. package/translations/zh.json +2 -33
  83. package/client/modeller/controls.ts +0 -54
  84. package/client/modeller/figure-view.ts +0 -151
  85. package/client/modeller/preview-model.ts +0 -89
  86. package/client/modeller/side-panel-styles.ts +0 -374
  87. package/client/viewparts/detail-motion.ts +0 -11
  88. package/client/viewparts/figure-asset-viewer.ts +0 -177
  89. package/dist-client/modeller/controls.d.ts +0 -28
  90. package/dist-client/modeller/controls.js +0 -28
  91. package/dist-client/modeller/controls.js.map +0 -1
  92. package/dist-client/modeller/figure-view.d.ts +0 -117
  93. package/dist-client/modeller/figure-view.js +0 -78
  94. package/dist-client/modeller/figure-view.js.map +0 -1
  95. package/dist-client/modeller/preview-model.d.ts +0 -54
  96. package/dist-client/modeller/preview-model.js +0 -79
  97. package/dist-client/modeller/preview-model.js.map +0 -1
  98. package/dist-client/modeller/side-panel-styles.d.ts +0 -27
  99. package/dist-client/modeller/side-panel-styles.js +0 -374
  100. package/dist-client/modeller/side-panel-styles.js.map +0 -1
  101. package/dist-client/viewparts/detail-motion.d.ts +0 -6
  102. package/dist-client/viewparts/detail-motion.js +0 -9
  103. package/dist-client/viewparts/detail-motion.js.map +0 -1
  104. package/dist-client/viewparts/figure-asset-viewer.d.ts +0 -31
  105. package/dist-client/viewparts/figure-asset-viewer.js +0 -198
  106. package/dist-client/viewparts/figure-asset-viewer.js.map +0 -1
  107. package/test/controls.test.ts +0 -60
  108. package/test/detail-motion.test.ts +0 -26
  109. package/test/preview.test.ts +0 -53
  110. package/test/view.test.ts +0 -13
@@ -1 +0,0 @@
1
- {"version":3,"file":"figure-asset-viewer.js","sourceRoot":"","sources":["../../client/viewparts/figure-asset-viewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing, type PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { i18next, localize } from '@operato/i18n'\nimport { compileFigureAsset, FIGURE_INSTANCE_SIZE_INPUTS, type FigureAsset } from '@hatiolab/figure-model'\nimport { create, registerFigure, unregisterFigure } from '@hatiolab/things-scene'\nimport { authoredSizeOf } from '../modeller/preview-model.js'\nimport { controlsOf } from '../modeller/controls.js'\nimport { DEFAULT_VIEW, previewBoardDepth, sceneLook } from '../modeller/figure-view.js'\nimport { clipForControl, parametersForClip } from './detail-motion.js'\n\ntype Axis = 'x' | 'y' | 'z'\ninterface Scene {\n dispose?(): void\n resize?(): void\n fit?(type?: string): void\n root?: {\n fitCameraToModel?(): void\n components?: Array<{ set(key: string, value: unknown): void }>\n }\n}\n\n/** A single board instance. Sizes and poses are transient, and never change the asset or call a mutation. */\n@customElement('figure-asset-viewer')\nexport class FigureAssetViewer extends localize(i18next)(LitElement) {\n static styles = css`\n :host { display: block; min-width: 0; }\n [viewport] { height: 300px; position: relative; background: #858585; }\n [stage] { position: absolute; inset: 0; width: 100%; height: 100%; }\n section { padding: 12px 16px; border-bottom: 1px solid var(--md-sys-color-outline-variant); }\n h3 { margin: 0 0 10px; font-size: var(--ui-t-body, 13px); }\n label { display: grid; grid-template-columns: 72px minmax(0, 1fr) 90px; align-items: center; gap: 8px; margin: 8px 0; }\n input { min-width: 0; width: 100%; box-sizing: border-box; }\n input[type=number] { padding: 6px; }\n input, button { font: inherit; color: inherit; }\n button { padding: 8px 12px; border: 1px solid var(--md-sys-color-outline); border-radius: 8px; background: var(--md-sys-color-surface); cursor: pointer; }\n [clips] { display: flex; flex-wrap: wrap; gap: 8px; }\n p { font-size: 12px; line-height: 1.5; }\n [error] { color: var(--md-sys-color-error); }\n `\n @property({ attribute: false }) asset?: FigureAsset\n @query('[stage]') private stage!: HTMLElement\n @state() private sizes: Record<Axis, number> = { x: 1, y: 1, z: 1 }\n @state() private values: Record<string, number> = {}\n @state() private playing = ''\n @state() private error = ''\n private scene?: Scene\n private registered?: string\n private observer?: ResizeObserver\n private needsScene = false\n private played = new Set<string>()\n\n connectedCallback() {\n super.connectedCallback()\n this.needsScene = true\n if (this.hasUpdated) this.observer?.observe(this.stage)\n this.requestUpdate()\n }\n\n protected updated(changed: PropertyValues) {\n // Reconnection and a new asset can arrive in the same update. Build exactly once.\n if (changed.has('asset') || this.needsScene) {\n this.needsScene = false\n this.standUp()\n }\n }\n firstUpdated() {\n this.observer = new ResizeObserver(() => this.scene?.resize?.())\n this.observer.observe(this.stage)\n }\n disconnectedCallback() {\n super.disconnectedCallback()\n this.observer?.disconnect()\n this.teardown()\n }\n\n render() {\n const asset = this.asset\n return html`<div viewport><div stage></div></div>\n ${this.error ? html`<p error role=\"alert\">${this.error}</p>` : nothing}\n ${asset ? html`<section>\n <h3>${i18next.t('figure.label.detail-size')}</h3>\n ${(['x', 'y', 'z'] as const).map(axis => {\n const input = asset.document.model.inputs.find(input => input.id === FIGURE_INSTANCE_SIZE_INPUTS[axis])\n return html`<label><span>${axis.toUpperCase()} · mm</span>\n <input type=\"range\" aria-label=${`${axis.toUpperCase()} mm`} min=${input?.min ?? this.sizes[axis]} max=${input?.max ?? this.sizes[axis]} step=\"any\"\n .value=${String(this.sizes[axis])} ?disabled=${!input || input.min === input.max}\n @input=${(e: Event) => this.resize(axis, (e.target as HTMLInputElement).valueAsNumber)}>\n <input type=\"number\" aria-label=${`${axis.toUpperCase()} mm value`} min=${input?.min ?? this.sizes[axis]} max=${input?.max ?? this.sizes[axis]} step=\"any\"\n .value=${String(this.sizes[axis])} ?disabled=${!input || input.min === input.max}\n @change=${(e: Event) => this.resize(axis, (e.target as HTMLInputElement).valueAsNumber)}>\n </label>`\n })}\n <button @click=${() => this.reset()}>${i18next.t('figure.button.detail-reset')}</button>\n <p>${i18next.t('figure.text.detail-transient')}</p>\n </section>\n <section><h3>${i18next.t('figure.label.motion')}</h3>\n ${controlsOf(asset, this.values).map(c => html`<label><span>${c.label} · ${c.unit}</span>\n <input type=\"range\" aria-label=${c.label} min=${c.min} max=${c.max} step=${c.step || 'any'} .value=${String(c.value)}\n ?disabled=${!!this.playing && clipForControl(asset, c.id) === this.playing}\n @input=${(e: Event) => this.pose(c.id, (e.target as HTMLInputElement).valueAsNumber)}>\n <output>${this.playing && clipForControl(asset, c.id) === this.playing ? i18next.t('figure.text.detail-playing')\n : this.played.has(clipForControl(asset, c.id) ?? '') && !(c.id in this.values) ? i18next.t('figure.text.detail-paused') : Math.round(c.value * 100) / 100}</output></label>`)}\n <div clips>${[...new Set((asset.drivers ?? []).map(d => d.clip))].map(name => html`<button aria-pressed=${String(this.playing === name)}\n @click=${() => this.play(name)}>${this.playing === name ? '⏸' : '▶'} ${name}</button>`)}</div>\n ${!controlsOf(asset).length && ![...new Set((asset.drivers ?? []).map(d => d.clip))].length ? html`<p>${i18next.t('figure.text.detail-no-motion')}</p>` : nothing}\n </section>` : nothing}`\n }\n\n private tell(key: string, value: unknown) {\n this.scene?.root?.components?.[0]?.set(key, value)\n }\n private resize(axis: Axis, value: number) {\n const input = this.asset?.document.model.inputs.find(input => input.id === FIGURE_INSTANCE_SIZE_INPUTS[axis])\n if (!input || !Number.isFinite(value)) { this.requestUpdate(); return }\n const used = Math.min(input.max, Math.max(input.min, value))\n this.sizes = { ...this.sizes, [axis]: used }\n this.tell(axis === 'x' ? 'width' : axis === 'y' ? 'depth' : 'height', used)\n this.scene?.root?.fitCameraToModel?.()\n }\n private pose(id: string, value: number) {\n if (!Number.isFinite(value)) return\n this.values = { ...this.values, [id]: value }\n this.tell('parameters', this.values)\n }\n private play(name: string) {\n this.playing = this.playing === name ? '' : name\n if (this.playing && this.asset) {\n this.played.add(name)\n this.values = parametersForClip(this.asset, this.values, name)\n this.tell('parameters', this.values)\n }\n this.tell('clips', Object.fromEntries([...new Set((this.asset?.drivers ?? []).map(d => d.clip))].map(key => [key, key === this.playing ? 1 : 0])))\n }\n private reset() {\n if (!this.asset) return\n // A new instance also resets driver clocks. Clearing speeds alone freezes the last pose.\n this.standUp()\n }\n private standUp() {\n this.teardown()\n this.error = ''\n const asset = this.asset\n if (!asset) return\n this.values = {}\n this.playing = ''\n this.played.clear()\n try {\n compileFigureAsset(asset)\n if (!asset.appearance.length) throw Error(i18next.t('figure.text.preview-needs-a-part'))\n this.sizes = authoredSizeOf(asset)\n const type = `figure-detail-${crypto.randomUUID()}`\n registerFigure(type, asset)\n this.registered = type\n const size = this.sizes\n this.scene = create({ target: this.stage, mode: 0, model: {\n type: 'model-layer', width: size.x * 2, height: size.z * 2,\n depth: previewBoardDepth({ placement: asset.placement, base: { y: size.y } }, DEFAULT_VIEW.ceilingHeight, 1),\n threed: true, sky: 'color', ...sceneLook(DEFAULT_VIEW),\n placement: DEFAULT_VIEW.placement, heights: { floor: 0, ceiling: DEFAULT_VIEW.ceilingHeight },\n pixelRatio: Math.min(3, (window.devicePixelRatio || 1) * 2),\n components: [{ type, id: 'detail-instance', left: size.x / 2, top: size.z / 2, width: size.x, height: size.z, depth: size.y }]\n } }) as Scene\n this.scene.resize?.()\n this.scene.fit?.('ratio')\n this.scene.root?.fitCameraToModel?.()\n } catch (error) {\n this.error = (error as Error).message\n this.teardown()\n }\n }\n private teardown() {\n this.scene?.dispose?.()\n this.scene = undefined\n if (this.registered) unregisterFigure(this.registered)\n this.registered = undefined\n }\n}\n"]}
@@ -1,60 +0,0 @@
1
- /*
2
- * **조작값과 자세 도구** (2026-09-24).
3
- *
4
- * 보드가 값을 바꿔 도형을 움직이는 자리다. 화면이 읽는 값을 명령을 실제로 적용한 자산에서 재고, 화면의 배선은
5
- * 소스에서 확인한다.
6
- */
7
- import { test } from 'node:test'
8
- import assert from 'node:assert/strict'
9
- import { readFileSync } from 'node:fs'
10
- import { fileURLToPath } from 'node:url'
11
-
12
- import { addFigureBox, applyFigureAuthoring, createFigureAsset, editFigurePart } from '@hatiolab/figure-model'
13
- import type { FigureAsset } from '@hatiolab/figure-model'
14
-
15
- import { controlsOf, poseAsDefault, poseDiffers } from '../client/modeller/controls.ts'
16
- import { moving } from './joints.ts'
17
-
18
- const read = (path: string) => readFileSync(fileURLToPath(new URL(path, import.meta.url)), 'utf8')
19
-
20
- const slider = (): FigureAsset => {
21
- let asset = createFigureAsset('Slider')
22
- asset = addFigureBox(asset, { id: 'block', size: { x: 100, y: 100, z: 100 }, position: { x: 0, y: 50, z: 0 } })
23
- asset = moving(asset, 'block', { kind: 'slide', axis: 'x', id: 'shift', min: 0, max: 60, start: 20 })
24
- asset = addFigureBox(asset, { id: 'arm', size: { x: 40, y: 200, z: 40 }, position: { x: 0, y: 200, z: 0 } })
25
- return moving(asset, 'arm', { kind: 'turn', axis: 'y', id: 'spin', min: -90, max: 90, start: 0 })
26
- }
27
-
28
- test('조작값마다 이름 · 단위 · 범위 · 지금 값 · 시작 값 · 이동 시간을 읽는다', () => {
29
- let asset = slider()
30
- asset = editFigurePart(asset, { kind: 'set-state-input', input: 'shift', label: '밀기', sweep: 2 })
31
- const [shift, spin] = controlsOf(asset, { shift: 45 })
32
- assert.deepEqual(
33
- { ...shift, step: undefined },
34
- { id: 'shift', label: '밀기', named: true, unit: 'mm', min: 0, max: 60, value: 45, start: 20, sweep: 2, step: undefined }
35
- )
36
- assert.equal(shift!.step, 0.6, '길이는 범위의 백분의 일씩')
37
- assert.equal(spin!.label, 'spin', '이름이 없으면 id')
38
- assert.equal(spin!.named, false)
39
- assert.equal(spin!.step, 1, '각도는 1도씩')
40
- assert.equal(spin!.value, 0, '편집기 값이 없으면 시작 값')
41
- })
42
-
43
- test('지금 자세를 기본으로 — 보고 있는 자세가 시작 자세와 다를 때만, 한 번의 편집으로', () => {
44
- const asset = slider()
45
- assert.equal(poseDiffers(controlsOf(asset)), false)
46
- const looking = controlsOf(asset, { shift: 50, spin: 30 })
47
- assert.equal(poseDiffers(looking), true)
48
- const kept = editFigurePart(asset, poseAsDefault(looking))
49
- assert.deepEqual([kept.stateDefaults['shift'], kept.stateDefaults['spin']], [50, 30])
50
- assert.equal(poseDiffers(controlsOf(kept, { shift: 50, spin: 30 })), false)
51
- })
52
-
53
- test('편집기에 닿는다 — 값 바꾸기는 입력으로, 이름 · 범위 · 시간 · 기본 자세는 부품 편집으로', () => {
54
- const controls = read('../client/modeller/figure-controls.ts')
55
- const keys = [...controls.matchAll(/'(figure\.[a-z.-]*[a-z])'/g)].map(m => m[1])
56
- for (const lang of ['ko', 'en', 'ja', 'zh', 'ms', 'es']) {
57
- const table = JSON.parse(read(`../translations/${lang}.json`))
58
- for (const key of keys) assert.ok(table[key], `${lang}: ${key}`)
59
- }
60
- })
@@ -1,26 +0,0 @@
1
- import { test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
- import { addFigureBox, createFigureAsset, editFigurePart, serializeFigureAsset } from '@hatiolab/figure-model'
4
- import { moving } from './joints.ts'
5
- import { clipForControl, parametersForClip } from '../client/viewparts/detail-motion.ts'
6
-
7
- function machine() {
8
- let asset = addFigureBox(createFigureAsset('Motion probe'), { id: 'block', size: { x: 100, y: 100, z: 100 }, position: { x: 0, y: 50, z: 0 } })
9
- asset = moving(asset, 'block', { kind: 'slide', axis: 'x', id: 'shift', min: 0, max: 200, start: 0 })
10
- return editFigurePart(asset, { kind: 'set-driver', state: 'shift', clip: 'cycle', duration: 4, keys: [{ seconds: 0, value: 0 }, { seconds: 2, value: 200 }, { seconds: 4, value: 0 }] })
11
- }
12
-
13
- test('playing a clip releases manual values that would mask its drivers, retaining unrelated controls and the source', () => {
14
- const asset = machine()
15
- const source = serializeFigureAsset(asset)
16
- const values = { shift: 75, other: 42 }
17
- assert.deepEqual(parametersForClip(asset, values, 'cycle'), { other: 42 })
18
- assert.deepEqual(values, { shift: 75, other: 42 })
19
- assert.equal(serializeFigureAsset(asset), source)
20
- assert.equal(clipForControl(asset, 'shift'), 'cycle')
21
- assert.equal(clipForControl(asset, 'other'), undefined)
22
- })
23
-
24
- test('choosing a different clip cannot clear another clip’s manual control', () => {
25
- assert.deepEqual(parametersForClip(machine(), { shift: 75 }, 'other'), { shift: 75 })
26
- })
@@ -1,53 +0,0 @@
1
- /*
2
- * **미리보기** (사용자 2026-09-24). 저작 중인 도형을 도면처럼 등록하고,
3
- * 기준 크기와 한 · 두 · 세 축을 2배로 늘린 일곱을 나란히 FigureInstance 로 세운다.
4
- */
5
- import { test } from 'node:test'
6
- import assert from 'node:assert/strict'
7
-
8
- import { addFigureBox, createFigureAsset } from '@hatiolab/figure-model'
9
-
10
- import { authoredSizeOf, PREVIEW_WAYS, previewClampsOf, previewInstances, previewTypeOf, setupPartOf } from '../client/modeller/preview-model.ts'
11
-
12
- test('여덟 — 기준과 일곱 조합, 한 줄에 넷, 늘린 축만 두 배 · 높이는 늘 적는다', () => {
13
- assert.deepEqual(PREVIEW_WAYS.map(w => w.name), ['base', 'x', 'y', 'z', 'x·y', 'x·z', 'y·z', 'x·y·z'])
14
- const { components, board } = previewInstances('T', { x: 1000, y: 500, z: 400 })
15
- assert.equal(components.length, 8)
16
- assert.deepEqual(components.map(c => [c.width, c.depth, c.height]), [
17
- [1000, 500, 400], [2000, 500, 400], [1000, 1000, 400], [1000, 500, 800],
18
- [2000, 1000, 400], [2000, 500, 800], [1000, 1000, 800], [2000, 1000, 800]
19
- ])
20
- assert.ok(components.every(c => c.type === 'T'))
21
- assert.deepEqual(board, { width: 10000, height: 2000 }, '가장 큰 것이 들어갈 칸 넷씩 두 줄')
22
- })
23
-
24
- test('크기를 선언하지 않은 도형은 부품이 차지하는 범위를 기준 크기로', () => {
25
- const asset = addFigureBox(createFigureAsset('Fixed'), { id: 'body', size: { x: 300, y: 200, z: 100 }, position: { x: 0, y: 100, z: 0 } })
26
- assert.deepEqual(authoredSizeOf(asset), { x: 300, y: 200, z: 100 })
27
- })
28
-
29
- test('미리보기는 제 타입으로 등록한다 — 남의 도면을 건드리지 않는다', () => {
30
- /* Going to the preview and back, and the registration standing and going with it, are the browser check's (test/browser/screen.check.mjs). */
31
- assert.equal(previewTypeOf(''), 'figure-preview-new', '저장 전 도형')
32
- assert.equal(previewTypeOf('abc'), 'figure-preview-abc')
33
- })
34
-
35
- test('미리보기 — 선언하지 않은 크기를 묻는 변형은 그려지는 크기를 말한다(높이만 따르는 조명탑, 아키텍트 판정 09-25)', async () => {
36
- const fm = await import('@hatiolab/figure-model')
37
- let a = fm.addFigureBox(fm.createFigureAsset('Tower'), { id: 'mast', size: { x: 200, y: 2000, z: 300 }, position: { x: 0, y: 0, z: 0 } })
38
- a = fm.applyFigureAuthoring(a, { kind: 'attach', part: 'mast', face: 'bottom', to: { plane: 'mounting-plane' } })
39
- a = fm.applyFigureAuthoring(a, { kind: 'declare-instance-size', range: { x: { min: 200, max: 200 }, y: { min: 1000, max: 3000 }, z: { min: 300, max: 300 } } })
40
- const clamps = previewClampsOf(a, authoredSizeOf(a))
41
- assert.deepEqual(clamps['base'], [], '기준은 그대로')
42
- assert.deepEqual(clamps['x'], [{ axis: 'x', asked: 400, used: 200 }])
43
- assert.deepEqual(clamps['y'], [{ axis: 'y', asked: 4000, used: 3000 }], '높이도 선언 최대까지')
44
- assert.deepEqual(clamps['x·y·z'].map(c => c.axis), ['x', 'y', 'z'])
45
- })
46
-
47
- test('미리보기 크기 안내는 편집에서 고른 부품부터 — 안내에서 고른 것이 먼저, 없는 부품은 건너뛴다', () => {
48
- assert.equal(setupPartOf('', 'roller', ['frame', 'roller']), 'roller', '편집에서 고른 부품')
49
- assert.equal(setupPartOf('frame', 'roller', ['frame', 'roller']), 'frame', '안내에서 고른 것이 이긴다')
50
- assert.equal(setupPartOf('', 'leg', ['frame', 'roller']), 'frame', '크기 규칙이 없는 부품이면 첫 부품')
51
- assert.equal(setupPartOf('gone', '', ['frame']), 'frame', '사라진 부품은 건너뛴다')
52
- assert.equal(setupPartOf('', '', []), '')
53
- })
package/test/view.test.ts DELETED
@@ -1,13 +0,0 @@
1
- /*
2
- * **보기 — 작업대의 설정** (「환경」 탭). 도형에 저장되지 않고, 보는 사람의 브라우저에 남는다.
3
- * 탭에서 바꾸면 판이 따르고 브라우저에 남으며 도형은 그대로인 것은 브라우저 검사(`test/browser/screen.check.mjs`)가 본다.
4
- */
5
- import { test } from 'node:test'
6
- import assert from 'node:assert/strict'
7
-
8
- import { ENVIRONMENTS } from '../client/modeller/figure-view.ts'
9
-
10
- test('환경 탭 — 씬이 받는 환경 여덟을 모두 고를 수 있다', () => {
11
- assert.equal(ENVIRONMENTS.length, 8, '환경 여덟')
12
- assert.ok(ENVIRONMENTS.includes('studio') && ENVIRONMENTS.includes('rainy'))
13
- })