@things-factory/figure-ui 10.1.3
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.
- package/client/bootstrap.ts +16 -0
- package/client/graphql/index.ts +209 -0
- package/client/index.ts +2 -0
- package/client/modeller/figure-ask.ts +247 -0
- package/client/modeller/figure-canvas.ts +482 -0
- package/client/modeller/figure-inspector.ts +1054 -0
- package/client/modeller/figure-parts.ts +479 -0
- package/client/modeller/figure-preview.ts +381 -0
- package/client/modeller/figure-report.ts +895 -0
- package/client/modeller/figure-settings.ts +285 -0
- package/client/modeller/figure-side.ts +162 -0
- package/client/modeller/figure-source.test.ts +336 -0
- package/client/modeller/figure-source.ts +338 -0
- package/client/modeller/figure-view.ts +79 -0
- package/client/modeller/maturity.ts +288 -0
- package/client/modeller/part-edits.test.ts +252 -0
- package/client/modeller/part-edits.ts +246 -0
- package/client/modeller/proposal.ts +142 -0
- package/client/modeller/scene-budget.ts +102 -0
- package/client/pages/figure-list-page.ts +274 -0
- package/client/pages/figure-modeller-page.ts +1067 -0
- package/client/route.ts +11 -0
- package/client/themes/brand.css +51 -0
- package/client/themes/dark.css +64 -0
- package/client/themes/light.css +95 -0
- package/client/tsconfig.json +19 -0
- package/client/types.ts +96 -0
- package/client/viewparts/figure-card.ts +226 -0
- package/dist-client/bootstrap.d.ts +14 -0
- package/dist-client/bootstrap.js +17 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/graphql/index.d.ts +41 -0
- package/dist-client/graphql/index.js +173 -0
- package/dist-client/graphql/index.js.map +1 -0
- package/dist-client/index.d.ts +2 -0
- package/dist-client/index.js +3 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/modeller/figure-ask.d.ts +36 -0
- package/dist-client/modeller/figure-ask.js +256 -0
- package/dist-client/modeller/figure-ask.js.map +1 -0
- package/dist-client/modeller/figure-canvas.d.ts +128 -0
- package/dist-client/modeller/figure-canvas.js +431 -0
- package/dist-client/modeller/figure-canvas.js.map +1 -0
- package/dist-client/modeller/figure-inspector.d.ts +149 -0
- package/dist-client/modeller/figure-inspector.js +991 -0
- package/dist-client/modeller/figure-inspector.js.map +1 -0
- package/dist-client/modeller/figure-parts.d.ts +64 -0
- package/dist-client/modeller/figure-parts.js +478 -0
- package/dist-client/modeller/figure-parts.js.map +1 -0
- package/dist-client/modeller/figure-preview.d.ts +62 -0
- package/dist-client/modeller/figure-preview.js +360 -0
- package/dist-client/modeller/figure-preview.js.map +1 -0
- package/dist-client/modeller/figure-report.d.ts +134 -0
- package/dist-client/modeller/figure-report.js +881 -0
- package/dist-client/modeller/figure-report.js.map +1 -0
- package/dist-client/modeller/figure-settings.d.ts +39 -0
- package/dist-client/modeller/figure-settings.js +277 -0
- package/dist-client/modeller/figure-settings.js.map +1 -0
- package/dist-client/modeller/figure-side.d.ts +41 -0
- package/dist-client/modeller/figure-side.js +175 -0
- package/dist-client/modeller/figure-side.js.map +1 -0
- package/dist-client/modeller/figure-source.d.ts +196 -0
- package/dist-client/modeller/figure-source.js +153 -0
- package/dist-client/modeller/figure-source.js.map +1 -0
- package/dist-client/modeller/figure-view.d.ts +57 -0
- package/dist-client/modeller/figure-view.js +36 -0
- package/dist-client/modeller/figure-view.js.map +1 -0
- package/dist-client/modeller/maturity.d.ts +55 -0
- package/dist-client/modeller/maturity.js +212 -0
- package/dist-client/modeller/maturity.js.map +1 -0
- package/dist-client/modeller/part-edits.d.ts +64 -0
- package/dist-client/modeller/part-edits.js +218 -0
- package/dist-client/modeller/part-edits.js.map +1 -0
- package/dist-client/modeller/proposal.d.ts +45 -0
- package/dist-client/modeller/proposal.js +96 -0
- package/dist-client/modeller/proposal.js.map +1 -0
- package/dist-client/modeller/scene-budget.d.ts +78 -0
- package/dist-client/modeller/scene-budget.js +80 -0
- package/dist-client/modeller/scene-budget.js.map +1 -0
- package/dist-client/pages/figure-list-page.d.ts +40 -0
- package/dist-client/pages/figure-list-page.js +280 -0
- package/dist-client/pages/figure-list-page.js.map +1 -0
- package/dist-client/pages/figure-modeller-page.d.ts +219 -0
- package/dist-client/pages/figure-modeller-page.js +1045 -0
- package/dist-client/pages/figure-modeller-page.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +11 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/themes/brand.css +51 -0
- package/dist-client/themes/dark.css +64 -0
- package/dist-client/themes/light.css +95 -0
- package/dist-client/types.d.ts +93 -0
- package/dist-client/types.js +2 -0
- package/dist-client/types.js.map +1 -0
- package/dist-client/viewparts/figure-card.d.ts +24 -0
- package/dist-client/viewparts/figure-card.js +221 -0
- package/dist-client/viewparts/figure-card.js.map +1 -0
- package/dist-server/index.d.ts +7 -0
- package/dist-server/index.js +3 -0
- package/dist-server/index.js.map +1 -0
- package/package.json +41 -0
- package/server/index.ts +7 -0
- package/server/tsconfig.json +18 -0
- package/test/brand-palette.test.ts +188 -0
- package/test/heading-scale-guard.test.ts +144 -0
- package/test/resolve-ts-siblings.mjs +67 -0
- package/things-factory.config.js +11 -0
- package/translations/en.json +247 -0
- package/translations/ja.json +247 -0
- package/translations/ko.json +247 -0
- package/translations/ms.json +247 -0
- package/translations/zh.json +247 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figure-parts.js","sourceRoot":"","sources":["../../client/modeller/figure-parts.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { DETAIL_LEVELS, PART_LIMIT, PRIMITIVE_KINDS } from '@hatiolab/figure-model'\nimport type { DetailLevel, PrimitiveKind } from '@hatiolab/figure-model'\n\nimport type { PartModel } from './figure-source.js'\n\n/** ๋ํ๋ง๋ค์ ์์ด์ฝ. Material Symbols ์ด๋ฆ์ด๋ค. */\nconst SHAPE_ICON: Record<PrimitiveKind, string> = {\n cube: 'deployed_code',\n wall: 'rectangle',\n cylinder: 'database',\n sphere: 'circle',\n rect: 'crop_square',\n polygon: 'pentagon'\n}\n\n/**\n * ๋ํ ํ๋ ํธ์ ๋ถํ ๋ชฉ๋ก.\n *\n * ## ํ๋ ํธ๋ฅผ ๋ชฉ๋ก ์์ ๋๋ค\n *\n * ์ฒ์ ์จ ์ฌ๋์ ใ๋ฌด์์ ๋์ ์ ์๋ใ๋ฅผ ๋จผ์ ์์์ผ ํ๋ค. ๋น ๋ชฉ๋ก ์๋์ ํ๋ ํธ๋ฅผ\n * ๋๋ฉด ์๋ฌด๊ฒ๋ ์๋ ํ๋ฉด์์ ๋ค์ ๋์์ด ์ ๋ณด์ธ๋ค.\n *\n * ## ํ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ณด์ฌ ์ค๋ค\n *\n * ๋ถํ ์ ํ๋๋ ๋ํ
์ผ ๋ฑ๊ธ์ด ์ ํ๋ค(`PART_LIMIT`). ๋๊ธด ๋ค์ ํ์ ํจ๋์ด\n * ๋๋ฌด๋ผ๋ ๊ฒ๋ณด๋ค, **๋ฃ๊ธฐ ์ ์ ๋ช ๊ฐ ๋จ์๋์ง** ๋ณด์ด๋ ๊ฒ์ด ๋ซ๋ค.\n *\n * ## ๊ณ ์น์ง ์๋๋ค\n *\n * ์ด ์ปดํฌ๋ํธ๋ ์ ๋ณธ์ ๋ง์ง์ง ์๋๋ค. ๋ฌด์์ ํ๊ฒ ๋ค๋ ๊ฒ๋ง ์๋ฆฐ๋ค โ ์ ๋ณธ ํ ๋ฒ์\n * ์ ์๋ฉด์ด ๊ฐ๊ณ , ๊ฑฐ๊ธฐ์๋ง ๋ฐ๋๋ค.\n */\n@customElement('figure-parts')\nexport class FigureParts extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n background-color: var(--md-sys-color-surface-container-lowest);\n border-right: 1px solid var(--md-sys-color-outline-variant);\n color: var(--md-sys-color-on-surface);\n font: var(--label-font, inherit);\n /*\n ์ด ํจ๋์ ๋ณธ๋ฌธ ํฌ๊ธฐ๋ฅผ ์ฌ๊ธฐ์ ํ ๋ฒ ์ ํ๋ค.\n\n ์ ์๋ ๊ท์น๋ง๋ค ๋ฐ๋ก ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ๋น ๋จ๋ฆฐ ๊ท์น์ด ๋ณธ๋ฌธ ๊ธฐ๋ณธ ํฌ๊ธฐ(1rem)๋ฅผ\n ๋ฌผ๋ ค๋ฐ์ ๊ทธ ์ค๋ง ์ ๋ชฉ์ฒ๋ผ ์ปค์ง๋ค. ์ค๋ฅ๊ฐ ์๋๋ผ์ ํ๋ฉด์ ๋์ ๋ด์ผ ์๋ค.\n ์ด ํ์ผ์์๋ง ๋ ๋ฒ ๋ฌ๋ค.\n\n form ์์(input ยท select ยท button)๋ ๊ธ๊ผด์ ๋ฌผ๋ ค๋ฐ์ง ์์ผ๋ฏ๋ก ๊ฐ์ ์ ์ด์ผ ํ๋ค.\n ๊ทธ๊ฒ ๋ง๊ณ ๋ ์ฌ๊ธฐ ๊ฐ์ ๋ฐ๋ฅธ๋ค.\n */\n font-size: 0.76rem;\n }\n\n section {\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n }\n section[list] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n h3 {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 6px;\n margin: 0 0 6px 0;\n font-size: var(--ui-t-micro, 11px);\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));\n }\n /*\n ๋ถํ ์์ ํ๋.\n\n ์ ์๋ ์ด ์ซ์๊ฐ ใ๋ํใ ์ ์ ๋ชฉ์ ๋ถ์ด ์์๋ค. ๋ถํ ์์ธ๋ฐ ๋ํ ์์ ์์ผ๋\n ใ๋ํ 8์ข
์ค 2์ข
ใ์ผ๋ก ์ฝํ๋ค โ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ์ฝํ๋ค. ์ธ๋ ๋์์ด ์๋ ์ ๋ก\n ์ฎ๊ธฐ๊ณ , ํ๋๊ฐ ์ด๋์ ๋์จ ๊ฐ์ธ์ง(๋ํ
์ผ ๋ฑ๊ธ)๋ฅผ ํจ๊ป ์ ๋๋ค.\n */\n span[room] {\n font-size: 0.7rem;\n font-weight: 400;\n letter-spacing: 0;\n text-transform: none;\n }\n span[room][full] {\n color: var(--md-sys-color-error);\n }\n\n /* โโ ํ๋ ํธ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ */\n div[palette] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 4px;\n }\n button[shape] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n padding: 7px 2px 5px 2px;\n font: var(--label-font, inherit);\n font-size: 0.66rem;\n color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));\n background: none;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 6px;\n cursor: pointer;\n }\n button[shape]:hover:not([disabled]) {\n color: var(--md-sys-color-on-primary-container);\n background-color: var(--md-sys-color-primary-container);\n border-color: transparent;\n }\n button[shape][disabled] {\n opacity: 0.35;\n cursor: default;\n }\n button[shape] md-icon {\n --md-icon-size: 20px;\n }\n\n /* โโ ๋ถํ ๋ชฉ๋ก โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ */\n ol {\n margin: 0;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n li {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 6px;\n border-radius: 6px;\n cursor: pointer;\n }\n li:hover {\n background-color: var(--md-sys-color-surface-container);\n }\n li[selected] {\n color: var(--md-sys-color-on-primary-container);\n background-color: var(--md-sys-color-primary-container);\n }\n li md-icon {\n --md-icon-size: 16px;\n flex: none;\n color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));\n }\n\n /*\n ์จ๊น ๋จ์ถ.\n\n ๊ณ ๋ฅธ ์ค์์๋ง ๋ณด์ด๋ ์กฐ์(div[ops])๊ณผ ๋ฌ๋ฆฌ **๋ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๋ค.** ๋ฌด์์ด ์จ๊ฒจ์ ธ\n ์๋์ง๋ ๋ชฉ๋ก์ ํ์ ๋ ํ๋์ ๋ณด์ฌ์ผ ํ๋ค โ ๋๋ฌ ๋ด์ผ ์๋ฉด ์จ๊ฒจ ๋ ๊ฒ์ ์๋๋ค.\n ๋ค๋ง ์ผ์ง์ง ์์ ๋์ ์ค์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ธ์ ๋๋ง ๋ณด์ธ๋ค. ์ฌ๋ ๊ฐ ์ค์ ํ์ ๋์ด\n ์ฌ๋ ๊ฐ ๋ ์์ผ๋ฉด ๋ชฉ๋ก์ด ์๋๋ฝ๋ค.\n */\n /* ๋จธ๋ฆฌ์ค์ ๊ฒ์ ๋ ๋ณด์ธ๋ค โ ์ค์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค์ผ ๋ํ๋๋ ๊ฒ์ด ์๋๋ค */\n button[eye][all] {\n margin-left: auto;\n opacity: 0.75;\n }\n button[eye][all]:hover {\n opacity: 1;\n }\n button[eye] {\n display: flex;\n flex: none;\n padding: 1px;\n color: inherit;\n background: none;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n opacity: 0;\n }\n li:hover button[eye],\n li[selected] button[eye],\n button[eye][off] {\n opacity: 1;\n }\n button[eye][off] {\n color: var(--md-sys-color-tertiary);\n }\n button[eye] md-icon {\n --md-icon-size: 15px;\n color: inherit;\n }\n\n /* ์จ๊ธด ์ค์ ๋ชฉ๋ก์์๋ ์
๊ฒ โ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์์ faint ๋ก ๋ณด์ด๋ ๊ฒ๊ณผ ๊ฐ์ ๋ป์ด์ด์ผ ํ๋ค */\n li[off] span[label],\n li[off] > md-icon {\n opacity: 0.45;\n }\n li[selected] md-icon {\n color: inherit;\n }\n span[label] {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.78rem;\n }\n\n /* ์กฐ์์ ๊ณ ๋ฅธ ์ค์์๋ง ๋ณด์ธ๋ค โ ๋ ๋ณด์ด๋ฉด ๋ชฉ๋ก์ด ์๋๋ฝ๋ค */\n div[ops] {\n display: none;\n gap: 1px;\n }\n li[selected] div[ops] {\n display: flex;\n }\n div[ops] button {\n display: flex;\n padding: 2px;\n color: inherit;\n background: none;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n }\n div[ops] button:hover:not([disabled]) {\n background-color: var(--md-sys-color-surface-container-lowest);\n }\n div[ops] button[disabled] {\n opacity: 0.3;\n cursor: default;\n }\n div[ops] md-icon {\n --md-icon-size: 15px;\n color: inherit;\n }\n\n /*\n ๋ํ
์ผ ๋ฑ๊ธ ์ ํ.\n\n ์ ์๋ ๋ฑ๊ธ์ด \"16 / 20 ยท L ๋ฑ๊ธ\" ์์ ๊ธ์ ํ๋๋ก๋ง ์์๋ค. SยทMยทL ์ด ๋ฌด์์ธ์ง\n ์ด๋์๋ ์์๊ณ , ํ๋๋ฅผ ๋ค ์ฐ๋ฉด \"๋ฑ๊ธ์ ์ฌ๋ฆฌ์ธ์\" ๋ผ๊ณ ํด ๋๊ณ ์ฌ๋ฆด ์นธ์ด ์์๋ค.\n\n ๋ถํ ๋ชฉ๋ก ์์ ๋๋ค. ๋ฑ๊ธ์ด ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ์๋ ๋ชฉ๋ก์ ํ๋์ด๊ณ , ํ๋ ํธ๊ฐ\n ์ ๊ธฐ๋ ๊ฒ๋ ์ด ๊ฐ ๋๋ฌธ์ด๋ค. ๊ฒฐ๊ณผ๊ฐ ๋ณด์ด๋ ์๋ฆฌ์์ ๊ณ ์น๊ฒ ํ๋ค.\n */\n div[level] {\n display: flex;\n align-items: center;\n gap: 6px;\n margin: 0 0 7px 0;\n }\n div[level] label {\n flex: none;\n margin: 0;\n font-size: 0.68rem;\n color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));\n }\n div[level] select {\n flex: 1;\n min-width: 0;\n padding: 3px 5px;\n font: var(--input-field-font, inherit);\n font-size: 0.72rem;\n color: var(--md-sys-color-on-surface);\n background-color: var(--md-sys-color-surface-container-lowest);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 6px;\n }\n\n /* ํ๋ ํธ๊ฐ ์ ๊ธด ์ด์ ๋ฅผ ๋งํ๋ค. ํ๋ฆฐ ๋จ์ถ๋ง ๋๋ฉด ์ ์ ๋๋ฆฌ๋์ง ๋ชจ๋ฅธ๋ค */\n p[full] {\n margin: 6px 0 0 0;\n font-size: 0.72rem;\n line-height: 1.5;\n color: var(--md-sys-color-error);\n }\n\n p[quiet] {\n margin: 0;\n font-size: 0.76rem;\n line-height: 1.6;\n color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));\n }\n `\n ]\n\n /**\n * ๋ณด๋ ์์ ๋ถํ๋ค. **์ฌ ๋ชจ๋ธ ๊ทธ๋๋ก ๋ฐ๋๋ค.**\n *\n * ์ด ํจ๋์ ์ด๋ฆ๊ณผ ๋ํ๋ง ์ฝ์ผ๋ฏ๋ก ์ด๋ ์ชฝ ํํ๋ก ๋ฐ์๋ ํ๋ฉด์ ๊ฐ๋ค. ๊ทธ๋๋ ์ฌ\n * ๋ชจ๋ธ๋ก ๋ฐ๋ ๊ฒ์ ๋ชจ๋ธ๋ฌ ํ์ด์ง๊ฐ ๋ฐ์ดํฐ๋ฅผ **ํ ๋ฒ๋ง** ๊ฐ๊ฒ ํ๊ธฐ ์ํด์๋ค. ์ฌ๊ธฐ๋ง\n * FigureSource ๋ก ๋ฐ์ผ๋ฉด ํ์ด์ง๊ฐ ์ด ํจ๋์ ์ํด ๋ณํ๋ณธ์ ๋ฐ๋ก ๋ค๊ณ ์์ด์ผ ํ๊ณ ,\n * ๊ทธ ๋ณํ๋ณธ์ด ์ธ์ ๋ก๋์ง๋ฅผ ๋ ๊ด๋ฆฌํด์ผ ํ๋ค.\n */\n @property({ type: Array }) parts: PartModel[] = []\n /** ๋ํ
์ผ ๋ฑ๊ธ. ๋ถํ ์ ํ๋๊ฐ ์ฌ๊ธฐ์ ๊ฒฐ์ ๋๋ค. */\n @property({ type: String }) level: DetailLevel = 'M'\n /** ๊ณ ๋ฅธ ๋ถํ์ ์๋ฆฌ. ๊ณ ๋ฅด์ง ์์์ผ๋ฉด -1. */\n @property({ type: Number }) selected = -1\n\n render() {\n const parts = this.parts ?? []\n const level = this.level\n const limit = PART_LIMIT[level]\n const full = parts.length >= limit\n\n return html`\n <section>\n <h3>${i18next.t('label.shapes')}</h3>\n <div palette>\n ${PRIMITIVE_KINDS.map(\n kind => html`\n <button\n shape\n ?disabled=${full}\n title=${full ? i18next.t('text.part-limit-reached') : i18next.t('text.add-a-shape')}\n @click=${() => this.ask('add-part', { primitive: kind })}\n >\n <md-icon>${SHAPE_ICON[kind]}</md-icon>\n ${i18next.t('label.primitive-' + kind)}\n </button>\n `\n )}\n </div>\n ${full\n ? html`<p full>${i18next.t('text.part-limit-reached-short', { level, limit })}</p>`\n : ''}\n </section>\n\n <section list>\n <h3>\n ${i18next.t('label.parts')}\n <span room ?full=${full} title=${i18next.t('text.limit-comes-from-level')}>\n ${i18next.t('text.n-of-limit', { used: parts.length, limit })}\n </span>\n ${this.renderShowAll(parts)}\n </h3>\n\n <div level>\n <label for=\"detail-level\">${i18next.t('label.detail-level')}</label>\n <select\n id=\"detail-level\"\n title=${i18next.t('text.detail-level-explained')}\n @change=${(e: Event) =>\n this.ask('change-detail-level', { level: (e.target as HTMLSelectElement).value })}\n >\n ${DETAIL_LEVELS.map(\n one => html`\n <option value=${one} ?selected=${one === level}>\n ${one} ${i18next.t('label.detail-' + one)} ยท\n ${i18next.t('text.n-parts-at-most', { limit: PART_LIMIT[one] })}\n </option>\n `\n )}\n </select>\n </div>\n\n ${parts.length === 0\n ? html`<p quiet>${i18next.t('text.pick-a-shape-above-to-start')}</p>`\n : html`\n <ol>\n ${parts.map((part, index) => this.renderRow(part, index, parts.length))}\n </ol>\n `}\n </section>\n `\n }\n\n /**\n * ํ๊บผ๋ฒ์ ๊ฐ์ถ๊ณ ํ๊บผ๋ฒ์ ๋๋๋ฆฐ๋ค.\n *\n * ๋ถํ ์ค๋ฌผ์ง๋ฆฌ๋ฅผ ๋ค์ฌ๋ค๋ณผ ๋ ํ๋๋ง ๋จ๊ธฐ๋ ค๋ฉด ์ด์ํ์ ๋๋ฌ์ผ ํ๋ค. ์์ชฝ์ ์๋ ๊ฒ์\n * ๋ณด๋ ค๊ณ ๊ฒ์ ๊ฑท์ด๋ด๋ ์ผ์ ์ ์ ์ค์ ๋ ํ๋ ์ผ์ด๋ค.\n *\n * ๋ฌด์์ ํ ์ง๋ **์ง๊ธ ์ํ๊ฐ ์ ํ๋ค** โ ํ๋๋ผ๋ ๊ฐ์ถฐ์ ธ ์์ผ๋ฉด ๋ค ๋๋๋ฆฌ๊ณ , ๋ค\n * ๋ณด์ด๊ณ ์์ผ๋ฉด ๋ค ๊ฐ์ถ๋ค. ๋จ์ถ ํ๋๋ก ์ค๊ฐ๋ ๊ฒ์ด ๋ ๊ฐ๋ณด๋ค ๋ซ๋ค.\n */\n private renderShowAll(parts: PartModel[]) {\n if (parts.length === 0) return nothing\n\n const anyHidden = parts.some(part => part.hidden)\n\n return html`\n <button\n eye\n all\n ?off=${!anyHidden}\n title=${i18next.t(anyHidden ? 'text.show-all-parts' : 'text.hide-all-parts')}\n @click=${(e: Event) => {\n e.stopPropagation()\n this.ask('set-all-parts-hidden', { hidden: !anyHidden })\n }}\n >\n <md-icon>${anyHidden ? 'visibility' : 'visibility_off'}</md-icon>\n </button>\n `\n }\n\n private renderRow(part: PartModel, index: number, count: number) {\n const selected = index === this.selected\n const off = !!part.hidden\n\n return html`\n <li ?selected=${selected} ?off=${off} @click=${() => this.ask('select-part', { index })}>\n <button\n eye\n ?off=${off}\n title=${i18next.t(off ? 'text.show-this-part' : 'text.hide-this-part')}\n @click=${(e: Event) => {\n // ๋๋ ์ ๋ ์ค ๊ณ ๋ฅด๊ธฐ๊ฐ ํจ๊ป ์ผ์ด๋์ง ์๊ฒ ๋ง๋๋ค โ ๊ฐ๋ฆฌ๋ ค๋ ๊ฒ์ด์ง ๊ณ ๋ฅด๋ ค๋ ๊ฒ์ด ์๋๋ค\n e.stopPropagation()\n this.ask('toggle-part-hidden', { index })\n }}\n >\n <md-icon>${off ? 'visibility_off' : 'visibility'}</md-icon>\n </button>\n <md-icon>${SHAPE_ICON[part.primitive]}</md-icon>\n <span label title=${part.name}>${part.name}</span>\n ${selected ? this.renderOps(index, count) : nothing}\n </li>\n `\n }\n\n /**\n * ๊ณ ๋ฅธ ์ค์ ์กฐ์.\n *\n * ๋ชป ํ๋ ๊ฒ์ **๋นผ์ง ์๊ณ ํ๋ฆฌ๊ฒ ๋๋ค.** ๋นผ๋ฉด ๋จ์ ๋จ์ถ๊ฐ ๊ทธ ์๋ฆฌ๋ก ๋ฐ๋ ค์, ์ฒซ\n * ์ค๊ณผ ๋ง์ง๋ง ์ค์์ ใ์ง์ฐ๊ธฐใ๊ฐ ๋ค๋ฅธ ์๋ฆฌ์ ์จ๋ค โ ์ฐ๋ฌ์ ์ง์ฐ๋ค ์๋ฑํ ๊ฒ์\n * ๋๋ฅด๊ฒ ๋๋ค.\n *\n * ๋๋ ์ ๋ ์ค ๊ณ ๋ฅด๊ธฐ๊ฐ ๋ค์ ์ผ์ด๋์ง ์๊ฒ ์ ํ๋ฅผ ๋ฉ์ถ๋ค.\n */\n private renderOps(index: number, count: number) {\n const op = (name: string, icon: string, detail: object, enabled = true) => html`\n <button\n op=${name}\n ?disabled=${!enabled}\n title=${i18next.t('button.' + name)}\n @click=${(e: Event) => {\n e.stopPropagation()\n if (enabled) this.ask(name, detail)\n }}\n >\n <md-icon>${icon}</md-icon>\n </button>\n `\n\n return html`\n <div ops>\n ${op('move-part-up', 'arrow_upward', { index, to: index - 1 }, index > 0)}\n ${op('move-part-down', 'arrow_downward', { index, to: index + 1 }, index < count - 1)}\n ${op('duplicate-part', 'content_copy', { index })} ${op('remove-part', 'delete', { index })}\n </div>\n `\n }\n\n /** ์ ๋ณธ์ ๊ณ ์น์ง ์๋๋ค โ ๋ฌด์์ ํ๊ฒ ๋ค๋ ๊ฒ๋ง ์๋ฆฐ๋ค. */\n private ask(what: string, detail: object) {\n this.dispatchEvent(new CustomEvent(what, { detail, bubbles: true, composed: true }))\n }\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import type { FigureSource } from '@hatiolab/figure-model';
|
|
3
|
+
/** ์ผ๋ง๋ ํค์ ๋ณด๋. */
|
|
4
|
+
export declare const PREVIEW_FACTOR = 2;
|
|
5
|
+
/**
|
|
6
|
+
* ์ด๋ ์ถ์ ํค์ ๋์ ๋ณด๋ โ **์ผ๊ณฑ ์กฐํฉ ์ ๋ถ.**
|
|
7
|
+
*
|
|
8
|
+
* 1 ๋ฐฐ ยท 2 ๋ฐฐ ยท 3 ๋ฐฐ๋ฅผ ๋๋ํ ๋๋ ์๋ฆฌ๋ค. ๊ทธ๋ฌ๋ฉด ์ธ ์ถ์ด ๋ ๊ฐ์ด ๋์ด๋๋ฏ๋ก, ์ถ๋ง๋ค
|
|
9
|
+
* ๋ฐ๋ก ๊ฑธ๋ฆฌ๋ ๊ท์น์ ๋์ผ๋ก ๋ณผ ์๊ฐ ์์๋ค. ์ค์ ๋ก ๋ชป ๋ณด๊ณ ๋์ด๊ฐ ๊ฒ๋ค์ด ์๋ค โ ์ปจ๋ฒ ์ด์ด์
|
|
10
|
+
* ๋กค๋ฌ๊ฐ ํญ์ ์ ๋ฐ๋ผ๊ฐ๋ ๊ฒ, ๋ฌธ์ ํญ์ด ๋์ด๋ฅผ ์ ๋ฐ๋ผ๊ฐ๋ ๊ฒ์ด ๋ค ํ ์ถ๋ง ๋๋ ธ์ ๋
|
|
11
|
+
* ๋๋ฌ๋๋ ๊ฒ์ด์๋ค.
|
|
12
|
+
*
|
|
13
|
+
* ์ฌ๋์ด๋ค. ์ฒซ์งธ๊ฐ ์ ์ํ ํฌ๊ธฐ์ด๊ณ ๋๋จธ์ง ์ผ๊ณฑ์ด ์กฐํฉ์ด๋ค. ํ ์ค๋ก ๋์ด๋์ผ๋ฉด ํ๋ฉด์
|
|
14
|
+
* ์ ๋ด๊ฒจ์ **๋ค ์นธ์ฉ ๋ ์ค**๋ก ๋๋๋ค.
|
|
15
|
+
*/
|
|
16
|
+
export declare const PREVIEW_WAYS: readonly {
|
|
17
|
+
name: string;
|
|
18
|
+
axes: readonly ('x' | 'y' | 'z')[];
|
|
19
|
+
}[];
|
|
20
|
+
declare const FigurePreview_base: (new (...args: any[]) => LitElement) & typeof LitElement;
|
|
21
|
+
export declare class FigurePreview extends FigurePreview_base {
|
|
22
|
+
static styles: import("lit").CSSResult;
|
|
23
|
+
/** ์ ์ ์ค์ธ ๊ฒ. ์ ์ฅ ํ์์ผ๋ก ๋ฐ๋๋ค โ ๋ณด๋๊ฐ ์๋นํ๋ ๊ฒ์ด ์ด ํ์์ด๋ค. */
|
|
24
|
+
source?: FigureSource;
|
|
25
|
+
private stage;
|
|
26
|
+
/** ์ธ์ธ ์ ์๋ ์ฌ์ . ์์ผ๋ฉด ์ธ์ด ๊ฒ์ด๋ค. */
|
|
27
|
+
private cannot;
|
|
28
|
+
private scene?;
|
|
29
|
+
/** ์ง๊ธ ์ธ์ ๋ ๊ฒ์ ๊ฐ. ๊ฐ์ผ๋ฉด ๋ค์ ์ธ์ฐ์ง ์๋๋ค. */
|
|
30
|
+
private standing?;
|
|
31
|
+
private watcher?;
|
|
32
|
+
/** ์ง๊ธ ๋ฏผ clip ๊ฐ. clip ์ด๋ฆ โ ์. **์ ์ฅ๋์ง ์๋๋ค.** */
|
|
33
|
+
private driving;
|
|
34
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
35
|
+
/**
|
|
36
|
+
* Clip ํ๋์ ์์ก์ด ํ๋.
|
|
37
|
+
*
|
|
38
|
+
* ์์ ๋ป์ด `drive` ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฏ๋ก ๊ทธ๊ฒ์ ์ด๋ฆ ์์ ์ ๋๋ค. `loop` ๋ ๋ฐฐ์์ด๋ผ 0 ์ด
|
|
39
|
+
* ๋ฉ์ถค์ด๊ณ , `hold` ๋ 0~1 ์์น๋ผ 0 ์ด ์ฒ์์ด๋ค. ๋์ ๊ฐ์ ๋๊ธ์ผ๋ก ๋๋ฉด ใ1ใ์ด ๋ฌด์จ
|
|
40
|
+
* ๋ป์ธ์ง ๋งค๋ฒ ํท๊ฐ๋ฆฐ๋ค.
|
|
41
|
+
*/
|
|
42
|
+
private renderClips;
|
|
43
|
+
/**
|
|
44
|
+
* ์ธ์ ๋ ์ธ์คํด์ค ์ ๋ถ์ ๊ฐ์ ๊ฐ์ ์ค๋ค.
|
|
45
|
+
*
|
|
46
|
+
* ํ๋๋ง ๋ชฐ๋ฉด ์ธ ๋ฐฐ์จ์ด ์๋ก ๋ค๋ฅธ ์์ธ๋ก ์์, ํฌ๊ธฐ ๋ฐ์์ ๋ณด๋ ค๊ณ ๋๋ํ ๋์ ๋ป์ด
|
|
47
|
+
* ์ฌ๋ผ์ง๋ค.
|
|
48
|
+
*/
|
|
49
|
+
private drive;
|
|
50
|
+
willUpdate(changed: Map<string, unknown>): void;
|
|
51
|
+
firstUpdated(): void;
|
|
52
|
+
disconnectedCallback(): void;
|
|
53
|
+
/**
|
|
54
|
+
* ์ ์ํ ๊ฒ์ ์ปดํ์ผํด ์ธ์ด๋ค.
|
|
55
|
+
*
|
|
56
|
+
* **ํ์์ ์ด๊ฒผ์ผ๋ฉด ์ธ์ฐ์ง ์๋๋ค.** ๋ฐ์ฏค ์ธ์ด ๊ฒ์ ๋ณด์ฌ ์ฃผ๋ฉด ๋ฌด์์ด ์๋ชป๋๋์ง ์ ์
|
|
57
|
+
* ์๋ค. ํ์ ํจ๋์ด ์ด๋ฏธ ์ฌ์ ๋ฅผ ๋งํ๊ณ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์๋ ์ธ์ธ ์ ์๋ค๊ณ ๋ง ํ๋ค.
|
|
58
|
+
*/
|
|
59
|
+
private standUp;
|
|
60
|
+
private teardown;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { css, html, LitElement, unsafeCSS } from 'lit';
|
|
3
|
+
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
4
|
+
import { i18next, localize } from '@operato/i18n';
|
|
5
|
+
import { compile, validate } from '@hatiolab/figure-model';
|
|
6
|
+
import { create, registerFigure } from '@hatiolab/things-scene';
|
|
7
|
+
/**
|
|
8
|
+
* ์ ์ ์ค์ธ ๊ฒ์ **๋ณด๋์ ๋์์ ๋**์ ๋ชจ์ต.
|
|
9
|
+
*
|
|
10
|
+
* ## ํธ์ง ์บ๋ฒ์ค๋ก๋ ๋ณผ ์ ์๋ค
|
|
11
|
+
*
|
|
12
|
+
* ํธ์ง ์บ๋ฒ์ค๋ ๋ถํ์ ์ปดํฌ๋ํธ๋ก ๋์ด๋๋๋ค. ๊ทธ๋์ ๋ ๊ธฐ์ค ํฌ๊ธฐ๋ค. ๊ทธ๋ฐ๋ฐ ์ด ํ์์
|
|
13
|
+
* ๊ฐ ์ ๋ฐ์ **ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ก์ ๋ ์ด๋ป๊ฒ ๋ฐ์ํ๋๊ฐ**์ ์๋ค. ๊ธฐ๋ฅ๋ง ๋์ด๋๋ ์๊ทธ๋ํ์,
|
|
14
|
+
* ๋กค๋ฌ ๊ฐ์๊ฐ ๋๋ ์ปจ๋ฒ ์ด์ด๋ ๊ธฐ์ค ํฌ๊ธฐ์์๋ ์๋ฌด๊ฒ๋ ๋ณด์ฌ ์ฃผ์ง ๋ชปํ๋ค.
|
|
15
|
+
*
|
|
16
|
+
* ๊ทธ๋์ ์ฌ๊ธฐ์๋ ์ ์ํ ๊ฒ์ ์ค์ ๋ก ์ปดํ์ผํด `FigureInstance` ๋ก ์ธ์ด๋ค. ๋ณด๋๊ฐ ํ๋
|
|
17
|
+
* ์ผ์ ๊ทธ๋๋ก ํ๋ค โ ์ฒญ์ฌ์ง์ ๋ฑ๋กํ๊ณ , ํ์
์ด๋ฆ๋ง ์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋๋๋ค.
|
|
18
|
+
*
|
|
19
|
+
* ## ์ฌ๋ฌ ํฌ๊ธฐ๋ฅผ ํ ๋ฒ์ ๋๋๋ค
|
|
20
|
+
*
|
|
21
|
+
* ํ๋๋ง ๋์ผ๋ฉด "์ด ํฌ๊ธฐ์์๋ ์ด๋ ๋ค" ๋ฐ์ ์ ์ ์๋ค. ๊ธฐ์ค ํฌ๊ธฐ์ ๋๋ฆฐ ๊ฒ์ ๋๋ํ
|
|
22
|
+
* ๋์์ผ ๋ฌด์์ด ๋ฐ๋ผ ๋๊ณ ๋ฌด์์ด ๊ทธ๋๋ก์ธ์ง ๋ณด์ธ๋ค.
|
|
23
|
+
*
|
|
24
|
+
* ## ํธ์งํ์ง ์๋๋ค
|
|
25
|
+
*
|
|
26
|
+
* ์ฌ๊ธฐ์ ์ง๊ฑฐ๋ ๋ ์ ์๋ค. ํธ์ง์ ์บ๋ฒ์ค์์ ํ๋ค. ๋ณด์ฌ ์ฃผ๊ธฐ๋ง ํ๋ ์๋ฆฌ๋ผ ์ฌ์
|
|
27
|
+
* ๋ทฐ ๋ชจ๋๋ก ์ธ์ด๋ค.
|
|
28
|
+
*/
|
|
29
|
+
/** ๋ฐฐ๊ฒฝ. ํธ์ง ์บ๋ฒ์ค์ ๊ฐ์ ๊ฐ์ ์ด๋ค โ ๊ฐ๋ฆฌ๋ฉด ๋ ํ๋ฉด์ด ๋ค๋ฅธ ๋๊ตฌ์ฒ๋ผ ๋ณด์ธ๋ค. */
|
|
30
|
+
const WORKBENCH = '#7c7c7c';
|
|
31
|
+
/** ์ผ๋ง๋ ํค์ ๋ณด๋. */
|
|
32
|
+
export const PREVIEW_FACTOR = 2;
|
|
33
|
+
/**
|
|
34
|
+
* ์ด๋ ์ถ์ ํค์ ๋์ ๋ณด๋ โ **์ผ๊ณฑ ์กฐํฉ ์ ๋ถ.**
|
|
35
|
+
*
|
|
36
|
+
* 1 ๋ฐฐ ยท 2 ๋ฐฐ ยท 3 ๋ฐฐ๋ฅผ ๋๋ํ ๋๋ ์๋ฆฌ๋ค. ๊ทธ๋ฌ๋ฉด ์ธ ์ถ์ด ๋ ๊ฐ์ด ๋์ด๋๋ฏ๋ก, ์ถ๋ง๋ค
|
|
37
|
+
* ๋ฐ๋ก ๊ฑธ๋ฆฌ๋ ๊ท์น์ ๋์ผ๋ก ๋ณผ ์๊ฐ ์์๋ค. ์ค์ ๋ก ๋ชป ๋ณด๊ณ ๋์ด๊ฐ ๊ฒ๋ค์ด ์๋ค โ ์ปจ๋ฒ ์ด์ด์
|
|
38
|
+
* ๋กค๋ฌ๊ฐ ํญ์ ์ ๋ฐ๋ผ๊ฐ๋ ๊ฒ, ๋ฌธ์ ํญ์ด ๋์ด๋ฅผ ์ ๋ฐ๋ผ๊ฐ๋ ๊ฒ์ด ๋ค ํ ์ถ๋ง ๋๋ ธ์ ๋
|
|
39
|
+
* ๋๋ฌ๋๋ ๊ฒ์ด์๋ค.
|
|
40
|
+
*
|
|
41
|
+
* ์ฌ๋์ด๋ค. ์ฒซ์งธ๊ฐ ์ ์ํ ํฌ๊ธฐ์ด๊ณ ๋๋จธ์ง ์ผ๊ณฑ์ด ์กฐํฉ์ด๋ค. ํ ์ค๋ก ๋์ด๋์ผ๋ฉด ํ๋ฉด์
|
|
42
|
+
* ์ ๋ด๊ฒจ์ **๋ค ์นธ์ฉ ๋ ์ค**๋ก ๋๋๋ค.
|
|
43
|
+
*/
|
|
44
|
+
export const PREVIEW_WAYS = [
|
|
45
|
+
{ name: '๊ธฐ์ค', axes: [] },
|
|
46
|
+
{ name: 'x', axes: ['x'] },
|
|
47
|
+
{ name: 'y', axes: ['y'] },
|
|
48
|
+
{ name: 'z', axes: ['z'] },
|
|
49
|
+
{ name: 'xยทy', axes: ['x', 'y'] },
|
|
50
|
+
{ name: 'xยทz', axes: ['x', 'z'] },
|
|
51
|
+
{ name: 'yยทz', axes: ['y', 'z'] },
|
|
52
|
+
{ name: 'xยทyยทz', axes: ['x', 'y', 'z'] }
|
|
53
|
+
];
|
|
54
|
+
let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
|
|
55
|
+
constructor() {
|
|
56
|
+
super(...arguments);
|
|
57
|
+
/** ์ธ์ธ ์ ์๋ ์ฌ์ . ์์ผ๋ฉด ์ธ์ด ๊ฒ์ด๋ค. */
|
|
58
|
+
this.cannot = '';
|
|
59
|
+
/** ์ง๊ธ ๋ฏผ clip ๊ฐ. clip ์ด๋ฆ โ ์. **์ ์ฅ๋์ง ์๋๋ค.** */
|
|
60
|
+
this.driving = {};
|
|
61
|
+
}
|
|
62
|
+
static { this.styles = css `
|
|
63
|
+
:host {
|
|
64
|
+
position: relative;
|
|
65
|
+
display: flex;
|
|
66
|
+
overflow: hidden;
|
|
67
|
+
background-color: ${unsafeCSS(WORKBENCH)};
|
|
68
|
+
font: var(--label-font, inherit);
|
|
69
|
+
font-size: 0.76rem;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
div[stage] {
|
|
73
|
+
position: absolute;
|
|
74
|
+
inset: 0;
|
|
75
|
+
width: 100%;
|
|
76
|
+
height: 100%;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ์ด๋ ๊ฒ์ด ๋ช ๋ฐฐ์ธ์ง โ ๋๋ํ ๋์๋ ํ๊ฐ ์์ผ๋ฉด ์ฝ์ ์ ์๋ค */
|
|
80
|
+
div[legend] {
|
|
81
|
+
position: absolute;
|
|
82
|
+
top: 8px;
|
|
83
|
+
left: 8px;
|
|
84
|
+
display: flex;
|
|
85
|
+
gap: 6px;
|
|
86
|
+
padding: 4px 8px;
|
|
87
|
+
color: rgba(255, 255, 255, 0.9);
|
|
88
|
+
background-color: rgba(28, 28, 30, 0.6);
|
|
89
|
+
border-radius: 6px;
|
|
90
|
+
font-size: 0.72rem;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/*
|
|
94
|
+
Clip ์กฐ์. **์ ์์๊ฐ ์ ์ ๋๋ฉ์ด์
์ ๋ง์ ธ ๋ณผ ์ ์ผํ ์๋ฆฌ๋ค.**
|
|
95
|
+
|
|
96
|
+
๋ณด๋์์๋ ํธ์์ด clip ์ ๋ชฌ๋ค โ ใ๋์ด 40% ์ด๋ ธ๋คใ๋ ์ฌ์ค์ด ์ด๋์ ๊ฐ ์จ๋ค. ์ ์
|
|
97
|
+
์ค์๋ ๊ทธ ์ฌ์ค์ ์ฃผ๋ ๊ฒ์ด ์์ด์, ์๋์ง ์์ผ๋ฉด hold ์ธ clip ์ 0 ์ ๋จธ๋ฌธ ์ฑ
|
|
98
|
+
์์ ์ ์์ง์ธ๋ค. ํฌํฌ๊ฐ ์ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ์ ์์๊ฐ ใ์ ๋๋๊ตฌ๋ใ๋ก ์ฝ๊ฒ ๋๋ค.
|
|
99
|
+
|
|
100
|
+
**๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ฒ์ด์ง ์์ฐ์ ๊ฒ์ด ์๋๋ค.** ์ฌ๊ธฐ์ ๋ฏผ ๊ฐ์ ์ ์ฅ๋์ง ์๋๋ค.
|
|
101
|
+
*/
|
|
102
|
+
div[clips] {
|
|
103
|
+
position: absolute;
|
|
104
|
+
right: 8px;
|
|
105
|
+
bottom: 8px;
|
|
106
|
+
display: flex;
|
|
107
|
+
flex-direction: column;
|
|
108
|
+
gap: 6px;
|
|
109
|
+
padding: 8px 10px;
|
|
110
|
+
color: rgba(255, 255, 255, 0.92);
|
|
111
|
+
background-color: rgba(28, 28, 30, 0.72);
|
|
112
|
+
border-radius: 8px;
|
|
113
|
+
font-size: 0.72rem;
|
|
114
|
+
}
|
|
115
|
+
div[clips] label {
|
|
116
|
+
display: grid;
|
|
117
|
+
grid-template-columns: auto 96px 34px;
|
|
118
|
+
align-items: center;
|
|
119
|
+
gap: 8px;
|
|
120
|
+
}
|
|
121
|
+
div[clips] span[drive] {
|
|
122
|
+
opacity: 0.6;
|
|
123
|
+
font-size: 0.66rem;
|
|
124
|
+
}
|
|
125
|
+
div[clips] input {
|
|
126
|
+
width: 96px;
|
|
127
|
+
accent-color: var(--md-sys-color-primary);
|
|
128
|
+
}
|
|
129
|
+
div[clips] output {
|
|
130
|
+
font-variant-numeric: tabular-nums;
|
|
131
|
+
text-align: right;
|
|
132
|
+
opacity: 0.85;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* ์ธ์ธ ์ ์๋ ์ํ๋ฅผ ๋น ํ๋ฉด์ผ๋ก ๋์ง ์๋๋ค โ ์ ์ ๋ณด์ด๋์ง ๋งํ๋ค */
|
|
136
|
+
div[cannot] {
|
|
137
|
+
position: absolute;
|
|
138
|
+
inset: 0;
|
|
139
|
+
display: flex;
|
|
140
|
+
align-items: center;
|
|
141
|
+
justify-content: center;
|
|
142
|
+
padding: var(--spacing-large, 12px);
|
|
143
|
+
text-align: center;
|
|
144
|
+
line-height: 1.6;
|
|
145
|
+
color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));
|
|
146
|
+
background-color: ${unsafeCSS(WORKBENCH)};
|
|
147
|
+
}
|
|
148
|
+
`; }
|
|
149
|
+
render() {
|
|
150
|
+
const clips = this.source?.animations ?? [];
|
|
151
|
+
return html `
|
|
152
|
+
<div stage></div>
|
|
153
|
+
${this.cannot
|
|
154
|
+
? html `<div cannot>${this.cannot}</div>`
|
|
155
|
+
: html `<div legend>
|
|
156
|
+
${PREVIEW_WAYS.map(way => html `<span>${way.name}</span>`)}
|
|
157
|
+
</div>
|
|
158
|
+
${clips.length > 0 ? this.renderClips(clips) : ''}`}
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Clip ํ๋์ ์์ก์ด ํ๋.
|
|
163
|
+
*
|
|
164
|
+
* ์์ ๋ป์ด `drive` ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฏ๋ก ๊ทธ๊ฒ์ ์ด๋ฆ ์์ ์ ๋๋ค. `loop` ๋ ๋ฐฐ์์ด๋ผ 0 ์ด
|
|
165
|
+
* ๋ฉ์ถค์ด๊ณ , `hold` ๋ 0~1 ์์น๋ผ 0 ์ด ์ฒ์์ด๋ค. ๋์ ๊ฐ์ ๋๊ธ์ผ๋ก ๋๋ฉด ใ1ใ์ด ๋ฌด์จ
|
|
166
|
+
* ๋ป์ธ์ง ๋งค๋ฒ ํท๊ฐ๋ฆฐ๋ค.
|
|
167
|
+
*/
|
|
168
|
+
renderClips(clips) {
|
|
169
|
+
return html `
|
|
170
|
+
<div clips>
|
|
171
|
+
${clips.map(clip => {
|
|
172
|
+
const loop = (clip.drive ?? 'loop') === 'loop';
|
|
173
|
+
const value = this.driving[clip.name] ?? (loop ? 1 : 0);
|
|
174
|
+
return html `
|
|
175
|
+
<label>
|
|
176
|
+
<span>${clip.name} <span drive>${loop ? '๋ฐฐ์' : '์์น'}</span></span>
|
|
177
|
+
<input
|
|
178
|
+
type="range"
|
|
179
|
+
min="0"
|
|
180
|
+
max=${loop ? 3 : 1}
|
|
181
|
+
step="0.05"
|
|
182
|
+
.value=${String(value)}
|
|
183
|
+
@input=${(e) => this.drive(clip.name, Number(e.target.value))}
|
|
184
|
+
/>
|
|
185
|
+
<output>${value.toFixed(2)}</output>
|
|
186
|
+
</label>
|
|
187
|
+
`;
|
|
188
|
+
})}
|
|
189
|
+
</div>
|
|
190
|
+
`;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* ์ธ์ ๋ ์ธ์คํด์ค ์ ๋ถ์ ๊ฐ์ ๊ฐ์ ์ค๋ค.
|
|
194
|
+
*
|
|
195
|
+
* ํ๋๋ง ๋ชฐ๋ฉด ์ธ ๋ฐฐ์จ์ด ์๋ก ๋ค๋ฅธ ์์ธ๋ก ์์, ํฌ๊ธฐ ๋ฐ์์ ๋ณด๋ ค๊ณ ๋๋ํ ๋์ ๋ป์ด
|
|
196
|
+
* ์ฌ๋ผ์ง๋ค.
|
|
197
|
+
*/
|
|
198
|
+
drive(name, value) {
|
|
199
|
+
this.driving = { ...this.driving, [name]: value };
|
|
200
|
+
for (const component of this.scene?.root?.components ?? []) {
|
|
201
|
+
component.set?.('clips', { ...this.driving });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
willUpdate(changed) {
|
|
205
|
+
if (!this.hasUpdated)
|
|
206
|
+
return;
|
|
207
|
+
if (changed.has('source'))
|
|
208
|
+
this.standUp();
|
|
209
|
+
}
|
|
210
|
+
firstUpdated() {
|
|
211
|
+
this.standUp();
|
|
212
|
+
this.watcher = new ResizeObserver(() => this.scene?.resize?.());
|
|
213
|
+
this.watcher.observe(this);
|
|
214
|
+
}
|
|
215
|
+
disconnectedCallback() {
|
|
216
|
+
super.disconnectedCallback();
|
|
217
|
+
this.watcher?.disconnect();
|
|
218
|
+
this.watcher = undefined;
|
|
219
|
+
this.teardown();
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* ์ ์ํ ๊ฒ์ ์ปดํ์ผํด ์ธ์ด๋ค.
|
|
223
|
+
*
|
|
224
|
+
* **ํ์์ ์ด๊ฒผ์ผ๋ฉด ์ธ์ฐ์ง ์๋๋ค.** ๋ฐ์ฏค ์ธ์ด ๊ฒ์ ๋ณด์ฌ ์ฃผ๋ฉด ๋ฌด์์ด ์๋ชป๋๋์ง ์ ์
|
|
225
|
+
* ์๋ค. ํ์ ํจ๋์ด ์ด๋ฏธ ์ฌ์ ๋ฅผ ๋งํ๊ณ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์๋ ์ธ์ธ ์ ์๋ค๊ณ ๋ง ํ๋ค.
|
|
226
|
+
*/
|
|
227
|
+
standUp() {
|
|
228
|
+
const source = this.source;
|
|
229
|
+
if (!source || source.parts.length === 0) {
|
|
230
|
+
this.cannot = i18next.t('text.preview-needs-a-part');
|
|
231
|
+
this.teardown();
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const signature = JSON.stringify(source);
|
|
235
|
+
if (this.scene && this.standing === signature)
|
|
236
|
+
return;
|
|
237
|
+
const { errors } = validate(source);
|
|
238
|
+
if (errors.length > 0) {
|
|
239
|
+
this.cannot = i18next.t('text.preview-blocked-by-errors');
|
|
240
|
+
this.teardown();
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
this.teardown();
|
|
244
|
+
// ํ๋ณธ์ด ๋ฐ๋๋ฉด ๋ฏผ ๊ฐ๋ ์ฒ์์ผ๋ก ๋๋ฆฐ๋ค โ ๋ค๋ฅธ ์์ฐ์ clip ์ด๋ฆ์ด ๋จ์ผ๋ฉด ์ ๋๋ค.
|
|
245
|
+
this.driving = {};
|
|
246
|
+
try {
|
|
247
|
+
registerFigure(compile(source));
|
|
248
|
+
/*
|
|
249
|
+
๋ณด๋๊ฐ ํ๋ ์ผ์ ๊ทธ๋๋ก ํ๋ค. ์ปดํฌ๋ํธ์๋ ํ์
์ด๋ฆ๊ณผ ์๋ฆฌยทํฌ๊ธฐ๋ง ์ ๋๋ค โ
|
|
250
|
+
์ฒญ์ฌ์ง๋ ์๋ณธ๋ ๋ณด๋์ ๋ค์ด๊ฐ์ง ์๋๋ค.
|
|
251
|
+
|
|
252
|
+
๊ฐ์ฅ ํฐ ๊ฒ์ด ๋ค์ด๊ฐ ๋งํผ ํ์ ์ก๊ณ , ์ธ๋ก๋ก ์ค์ ๋๋ ๋๋ํ ๋๋๋ค.
|
|
253
|
+
*/
|
|
254
|
+
const { base } = source;
|
|
255
|
+
const biggest = PREVIEW_FACTOR;
|
|
256
|
+
/** ์ด ์กฐํฉ์์ ์ถ๋ณ ๋ฐฐ์จ. ์กฐํฉ์ ๋ ์ถ๋ง ํค์ด๋ค. */
|
|
257
|
+
const growth = (way) => ({
|
|
258
|
+
x: way.axes.includes('x') ? PREVIEW_FACTOR : 1,
|
|
259
|
+
y: way.axes.includes('y') ? PREVIEW_FACTOR : 1,
|
|
260
|
+
z: way.axes.includes('z') ? PREVIEW_FACTOR : 1
|
|
261
|
+
});
|
|
262
|
+
// ์ฌ๋ฐฑ์ ๋๋ํ ๋๋ฉด ํ๋ฉด์์ ํ์์ด ์์์ง๋ค. ๊ฐ์ฅ ํฐ ๊ฒ์ด ๊ฒจ์ฐ ๋ค์ด๊ฐ ๋งํผ๋ง ์ก๋๋ค.
|
|
263
|
+
/** ๋ค ์นธ์ฉ ๋ ์ค. */
|
|
264
|
+
const COLUMNS = 4;
|
|
265
|
+
const cell = { x: base.x * biggest * 1.25, z: base.z * biggest * 1.25 };
|
|
266
|
+
const rows = Math.ceil(PREVIEW_WAYS.length / COLUMNS);
|
|
267
|
+
const board = {
|
|
268
|
+
width: Math.round(cell.x * COLUMNS),
|
|
269
|
+
height: Math.round(cell.z * rows),
|
|
270
|
+
/*
|
|
271
|
+
ํ์ ๋์ด๋ ๊ฐ์ฅ ํฐ ์ธ์คํด์ค๋ฅผ ๋ด์์ผ ํ๋ค.
|
|
272
|
+
|
|
273
|
+
์ ์ฃผ๋ฉด ์นด๋ฉ๋ผ๊ฐ ํ๋ฉด๋ง ๋ณด๊ณ ์๋ฆฌ๋ฅผ ์ก์์, ํค๊ฐ ํฐ ๋ชจ๋ธ์ ๋ฐ๋๋ง ๋ณด์ธ๋ค.
|
|
274
|
+
์๊ทธ๋ํ์๋ฅผ 2 ๋ฐฐ๋ก ๋์ผ๋ฉด 2200 ์ธ๋ฐ ํ์ด ๊ทธ๊ฒ์ ๋ชจ๋ฅด๋ฉด ๋ฐ์นจ๋ง ํ๋ฉด์ ๋ ๋ค.
|
|
275
|
+
*/
|
|
276
|
+
depth: Math.round(base.y * biggest * 1.1)
|
|
277
|
+
};
|
|
278
|
+
/*
|
|
279
|
+
์ฌ์ ๋ฑ๋ง์ด ํ์๊ณผ ๋ค๋ฅด๋ค โ `width` ๊ฐ ํ์์ x, `height` ๊ฐ z, `depth` ๊ฐ y ๋ค.
|
|
280
|
+
์ฎ๊ธฐ๋ ์ผ์ ์ฌ๊ธฐ ํ ์ค์ ๋ชจ์ ๋๋ค.
|
|
281
|
+
|
|
282
|
+
`depth` ๋ฅผ ๋ ์ ๋ ์ด์ ๊ฐ ์๋ค. ์ ์ ์ผ๋ฉด ํ๋ฉด ๋ ์ถ์ ๊ธฐํํ๊ท ์ผ๋ก ์กํ์,
|
|
283
|
+
ใy ๋ง ํค์ด๋คใ๊ฐ xยทz ๋ฅผ ์ ๊ฑด๋๋ฆฌ๋๋ฐ๋ ๋์ด๊ฐ ์ ์ค๋ฅธ๋ค.
|
|
284
|
+
*/
|
|
285
|
+
const components = PREVIEW_WAYS.map((way, at) => {
|
|
286
|
+
const grow = growth(way);
|
|
287
|
+
const column = at % COLUMNS;
|
|
288
|
+
const row = Math.floor(at / COLUMNS);
|
|
289
|
+
const width = Math.round(base.x * grow.x);
|
|
290
|
+
const height = Math.round(base.z * grow.z);
|
|
291
|
+
return {
|
|
292
|
+
type: source.type,
|
|
293
|
+
id: `at-${way.name}`,
|
|
294
|
+
// ์นธ ๊ฐ์ด๋ฐ์ ๋๋๋ค โ ํฌ๊ธฐ๊ฐ ์ ๋ง๋ค ๋ฌ๋ผ ์ผ์ชฝ์ ๋ง์ถ๋ฉด ์ค์ด ์ ์ฝํ๋ค.
|
|
295
|
+
left: Math.round(column * cell.x + (cell.x - width) / 2),
|
|
296
|
+
top: Math.round(row * cell.z + (cell.z - height) / 2),
|
|
297
|
+
width,
|
|
298
|
+
height,
|
|
299
|
+
depth: Math.round(base.y * grow.y)
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
this.scene = create({
|
|
303
|
+
target: this.stage,
|
|
304
|
+
model: {
|
|
305
|
+
type: 'model-layer',
|
|
306
|
+
width: board.width,
|
|
307
|
+
height: board.height,
|
|
308
|
+
depth: board.depth,
|
|
309
|
+
threed: true,
|
|
310
|
+
environment: 'studio',
|
|
311
|
+
grid: true,
|
|
312
|
+
sky: 'color',
|
|
313
|
+
skyColor: WORKBENCH,
|
|
314
|
+
floor: false,
|
|
315
|
+
pixelRatio: Math.min(3, (window.devicePixelRatio || 1) * 2),
|
|
316
|
+
components
|
|
317
|
+
},
|
|
318
|
+
// ๋ณด๊ธฐ๋ง ํ๋ ์๋ฆฌ๋ค. ์ง๊ฑฐ๋ ๋ ์ ์์ด์ผ ํ๋ค.
|
|
319
|
+
mode: 0
|
|
320
|
+
});
|
|
321
|
+
this.standing = signature;
|
|
322
|
+
this.scene.resize?.();
|
|
323
|
+
this.scene.fit?.('ratio');
|
|
324
|
+
this.scene.root?.fitCameraToModel?.();
|
|
325
|
+
this.cannot = '';
|
|
326
|
+
}
|
|
327
|
+
catch (e) {
|
|
328
|
+
// ์์ธ์ ์ง์ด๋ด์ง ์๋๋ค โ ๋์ง ๋ง์ ๊ทธ๋๋ก ๋ณด์ฌ ์ค๋ค.
|
|
329
|
+
this.cannot = e.message;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
teardown() {
|
|
333
|
+
this.scene?.dispose?.();
|
|
334
|
+
this.scene = undefined;
|
|
335
|
+
this.standing = undefined;
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
__decorate([
|
|
339
|
+
property({ type: Object }),
|
|
340
|
+
__metadata("design:type", Object)
|
|
341
|
+
], FigurePreview.prototype, "source", void 0);
|
|
342
|
+
__decorate([
|
|
343
|
+
query('div[stage]'),
|
|
344
|
+
__metadata("design:type", HTMLDivElement
|
|
345
|
+
/** ์ธ์ธ ์ ์๋ ์ฌ์ . ์์ผ๋ฉด ์ธ์ด ๊ฒ์ด๋ค. */
|
|
346
|
+
)
|
|
347
|
+
], FigurePreview.prototype, "stage", void 0);
|
|
348
|
+
__decorate([
|
|
349
|
+
state(),
|
|
350
|
+
__metadata("design:type", Object)
|
|
351
|
+
], FigurePreview.prototype, "cannot", void 0);
|
|
352
|
+
__decorate([
|
|
353
|
+
state(),
|
|
354
|
+
__metadata("design:type", Object)
|
|
355
|
+
], FigurePreview.prototype, "driving", void 0);
|
|
356
|
+
FigurePreview = __decorate([
|
|
357
|
+
customElement('figure-preview')
|
|
358
|
+
], FigurePreview);
|
|
359
|
+
export { FigurePreview };
|
|
360
|
+
//# sourceMappingURL=figure-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figure-preview.js","sourceRoot":"","sources":["../../client/modeller/figure-preview.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { compile, validate } from '@hatiolab/figure-model'\nimport type { FigureSource } from '@hatiolab/figure-model'\nimport { create, registerFigure } from '@hatiolab/things-scene'\n\n/**\n * ์ ์ ์ค์ธ ๊ฒ์ **๋ณด๋์ ๋์์ ๋**์ ๋ชจ์ต.\n *\n * ## ํธ์ง ์บ๋ฒ์ค๋ก๋ ๋ณผ ์ ์๋ค\n *\n * ํธ์ง ์บ๋ฒ์ค๋ ๋ถํ์ ์ปดํฌ๋ํธ๋ก ๋์ด๋๋๋ค. ๊ทธ๋์ ๋ ๊ธฐ์ค ํฌ๊ธฐ๋ค. ๊ทธ๋ฐ๋ฐ ์ด ํ์์\n * ๊ฐ ์ ๋ฐ์ **ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ก์ ๋ ์ด๋ป๊ฒ ๋ฐ์ํ๋๊ฐ**์ ์๋ค. ๊ธฐ๋ฅ๋ง ๋์ด๋๋ ์๊ทธ๋ํ์,\n * ๋กค๋ฌ ๊ฐ์๊ฐ ๋๋ ์ปจ๋ฒ ์ด์ด๋ ๊ธฐ์ค ํฌ๊ธฐ์์๋ ์๋ฌด๊ฒ๋ ๋ณด์ฌ ์ฃผ์ง ๋ชปํ๋ค.\n *\n * ๊ทธ๋์ ์ฌ๊ธฐ์๋ ์ ์ํ ๊ฒ์ ์ค์ ๋ก ์ปดํ์ผํด `FigureInstance` ๋ก ์ธ์ด๋ค. ๋ณด๋๊ฐ ํ๋\n * ์ผ์ ๊ทธ๋๋ก ํ๋ค โ ์ฒญ์ฌ์ง์ ๋ฑ๋กํ๊ณ , ํ์
์ด๋ฆ๋ง ์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋๋๋ค.\n *\n * ## ์ฌ๋ฌ ํฌ๊ธฐ๋ฅผ ํ ๋ฒ์ ๋๋๋ค\n *\n * ํ๋๋ง ๋์ผ๋ฉด \"์ด ํฌ๊ธฐ์์๋ ์ด๋ ๋ค\" ๋ฐ์ ์ ์ ์๋ค. ๊ธฐ์ค ํฌ๊ธฐ์ ๋๋ฆฐ ๊ฒ์ ๋๋ํ\n * ๋์์ผ ๋ฌด์์ด ๋ฐ๋ผ ๋๊ณ ๋ฌด์์ด ๊ทธ๋๋ก์ธ์ง ๋ณด์ธ๋ค.\n *\n * ## ํธ์งํ์ง ์๋๋ค\n *\n * ์ฌ๊ธฐ์ ์ง๊ฑฐ๋ ๋ ์ ์๋ค. ํธ์ง์ ์บ๋ฒ์ค์์ ํ๋ค. ๋ณด์ฌ ์ฃผ๊ธฐ๋ง ํ๋ ์๋ฆฌ๋ผ ์ฌ์\n * ๋ทฐ ๋ชจ๋๋ก ์ธ์ด๋ค.\n */\n\n/** ๋ฐฐ๊ฒฝ. ํธ์ง ์บ๋ฒ์ค์ ๊ฐ์ ๊ฐ์ ์ด๋ค โ ๊ฐ๋ฆฌ๋ฉด ๋ ํ๋ฉด์ด ๋ค๋ฅธ ๋๊ตฌ์ฒ๋ผ ๋ณด์ธ๋ค. */\nconst WORKBENCH = '#7c7c7c'\n\n/** ์ผ๋ง๋ ํค์ ๋ณด๋. */\nexport const PREVIEW_FACTOR = 2\n\n/**\n * ์ด๋ ์ถ์ ํค์ ๋์ ๋ณด๋ โ **์ผ๊ณฑ ์กฐํฉ ์ ๋ถ.**\n *\n * 1 ๋ฐฐ ยท 2 ๋ฐฐ ยท 3 ๋ฐฐ๋ฅผ ๋๋ํ ๋๋ ์๋ฆฌ๋ค. ๊ทธ๋ฌ๋ฉด ์ธ ์ถ์ด ๋ ๊ฐ์ด ๋์ด๋๋ฏ๋ก, ์ถ๋ง๋ค\n * ๋ฐ๋ก ๊ฑธ๋ฆฌ๋ ๊ท์น์ ๋์ผ๋ก ๋ณผ ์๊ฐ ์์๋ค. ์ค์ ๋ก ๋ชป ๋ณด๊ณ ๋์ด๊ฐ ๊ฒ๋ค์ด ์๋ค โ ์ปจ๋ฒ ์ด์ด์\n * ๋กค๋ฌ๊ฐ ํญ์ ์ ๋ฐ๋ผ๊ฐ๋ ๊ฒ, ๋ฌธ์ ํญ์ด ๋์ด๋ฅผ ์ ๋ฐ๋ผ๊ฐ๋ ๊ฒ์ด ๋ค ํ ์ถ๋ง ๋๋ ธ์ ๋\n * ๋๋ฌ๋๋ ๊ฒ์ด์๋ค.\n *\n * ์ฌ๋์ด๋ค. ์ฒซ์งธ๊ฐ ์ ์ํ ํฌ๊ธฐ์ด๊ณ ๋๋จธ์ง ์ผ๊ณฑ์ด ์กฐํฉ์ด๋ค. ํ ์ค๋ก ๋์ด๋์ผ๋ฉด ํ๋ฉด์\n * ์ ๋ด๊ฒจ์ **๋ค ์นธ์ฉ ๋ ์ค**๋ก ๋๋๋ค.\n */\nexport const PREVIEW_WAYS: readonly { name: string; axes: readonly ('x' | 'y' | 'z')[] }[] = [\n { name: '๊ธฐ์ค', axes: [] },\n { name: 'x', axes: ['x'] },\n { name: 'y', axes: ['y'] },\n { name: 'z', axes: ['z'] },\n { name: 'xยทy', axes: ['x', 'y'] },\n { name: 'xยทz', axes: ['x', 'z'] },\n { name: 'yยทz', axes: ['y', 'z'] },\n { name: 'xยทyยทz', axes: ['x', 'y', 'z'] }\n]\n\ninterface SceneHandle {\n dispose?: () => void\n resize?: () => void\n fit?: (type?: string) => void\n root?: {\n invalidate?: () => void\n fitCameraToModel?: (margin?: number) => void\n /** ์ธ์ ๋ ์ธ์คํด์ค๋ค. clip ์ ๋ชฐ ๋ ์ ๋ถ์ ๊ฐ์ ๊ฐ์ ์ค๋ค. */\n components?: { set?: (property: string, value: unknown) => void }[]\n }\n}\n\n@customElement('figure-preview')\nexport class FigurePreview extends localize(i18next)(LitElement) {\n static styles = css`\n :host {\n position: relative;\n display: flex;\n overflow: hidden;\n background-color: ${unsafeCSS(WORKBENCH)};\n font: var(--label-font, inherit);\n font-size: 0.76rem;\n }\n\n div[stage] {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n }\n\n /* ์ด๋ ๊ฒ์ด ๋ช ๋ฐฐ์ธ์ง โ ๋๋ํ ๋์๋ ํ๊ฐ ์์ผ๋ฉด ์ฝ์ ์ ์๋ค */\n div[legend] {\n position: absolute;\n top: 8px;\n left: 8px;\n display: flex;\n gap: 6px;\n padding: 4px 8px;\n color: rgba(255, 255, 255, 0.9);\n background-color: rgba(28, 28, 30, 0.6);\n border-radius: 6px;\n font-size: 0.72rem;\n }\n\n /*\n Clip ์กฐ์. **์ ์์๊ฐ ์ ์ ๋๋ฉ์ด์
์ ๋ง์ ธ ๋ณผ ์ ์ผํ ์๋ฆฌ๋ค.**\n\n ๋ณด๋์์๋ ํธ์์ด clip ์ ๋ชฌ๋ค โ ใ๋์ด 40% ์ด๋ ธ๋คใ๋ ์ฌ์ค์ด ์ด๋์ ๊ฐ ์จ๋ค. ์ ์\n ์ค์๋ ๊ทธ ์ฌ์ค์ ์ฃผ๋ ๊ฒ์ด ์์ด์, ์๋์ง ์์ผ๋ฉด hold ์ธ clip ์ 0 ์ ๋จธ๋ฌธ ์ฑ\n ์์ ์ ์์ง์ธ๋ค. ํฌํฌ๊ฐ ์ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ์ ์์๊ฐ ใ์ ๋๋๊ตฌ๋ใ๋ก ์ฝ๊ฒ ๋๋ค.\n\n **๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ฒ์ด์ง ์์ฐ์ ๊ฒ์ด ์๋๋ค.** ์ฌ๊ธฐ์ ๋ฏผ ๊ฐ์ ์ ์ฅ๋์ง ์๋๋ค.\n */\n div[clips] {\n position: absolute;\n right: 8px;\n bottom: 8px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px 10px;\n color: rgba(255, 255, 255, 0.92);\n background-color: rgba(28, 28, 30, 0.72);\n border-radius: 8px;\n font-size: 0.72rem;\n }\n div[clips] label {\n display: grid;\n grid-template-columns: auto 96px 34px;\n align-items: center;\n gap: 8px;\n }\n div[clips] span[drive] {\n opacity: 0.6;\n font-size: 0.66rem;\n }\n div[clips] input {\n width: 96px;\n accent-color: var(--md-sys-color-primary);\n }\n div[clips] output {\n font-variant-numeric: tabular-nums;\n text-align: right;\n opacity: 0.85;\n }\n\n /* ์ธ์ธ ์ ์๋ ์ํ๋ฅผ ๋น ํ๋ฉด์ผ๋ก ๋์ง ์๋๋ค โ ์ ์ ๋ณด์ด๋์ง ๋งํ๋ค */\n div[cannot] {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-large, 12px);\n text-align: center;\n line-height: 1.6;\n color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));\n background-color: ${unsafeCSS(WORKBENCH)};\n }\n `\n\n /** ์ ์ ์ค์ธ ๊ฒ. ์ ์ฅ ํ์์ผ๋ก ๋ฐ๋๋ค โ ๋ณด๋๊ฐ ์๋นํ๋ ๊ฒ์ด ์ด ํ์์ด๋ค. */\n @property({ type: Object }) source?: FigureSource\n\n @query('div[stage]') private stage!: HTMLDivElement\n\n /** ์ธ์ธ ์ ์๋ ์ฌ์ . ์์ผ๋ฉด ์ธ์ด ๊ฒ์ด๋ค. */\n @state() private cannot = ''\n\n private scene?: SceneHandle\n /** ์ง๊ธ ์ธ์ ๋ ๊ฒ์ ๊ฐ. ๊ฐ์ผ๋ฉด ๋ค์ ์ธ์ฐ์ง ์๋๋ค. */\n private standing?: string\n private watcher?: ResizeObserver\n\n /** ์ง๊ธ ๋ฏผ clip ๊ฐ. clip ์ด๋ฆ โ ์. **์ ์ฅ๋์ง ์๋๋ค.** */\n @state() private driving: Record<string, number> = {}\n\n render() {\n const clips = this.source?.animations ?? []\n\n return html`\n <div stage></div>\n ${this.cannot\n ? html`<div cannot>${this.cannot}</div>`\n : html`<div legend>\n ${PREVIEW_WAYS.map(way => html`<span>${way.name}</span>`)}\n </div>\n ${clips.length > 0 ? this.renderClips(clips) : ''}`}\n `\n }\n\n /**\n * Clip ํ๋์ ์์ก์ด ํ๋.\n *\n * ์์ ๋ป์ด `drive` ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฏ๋ก ๊ทธ๊ฒ์ ์ด๋ฆ ์์ ์ ๋๋ค. `loop` ๋ ๋ฐฐ์์ด๋ผ 0 ์ด\n * ๋ฉ์ถค์ด๊ณ , `hold` ๋ 0~1 ์์น๋ผ 0 ์ด ์ฒ์์ด๋ค. ๋์ ๊ฐ์ ๋๊ธ์ผ๋ก ๋๋ฉด ใ1ใ์ด ๋ฌด์จ\n * ๋ป์ธ์ง ๋งค๋ฒ ํท๊ฐ๋ฆฐ๋ค.\n */\n private renderClips(clips: NonNullable<FigureSource['animations']>) {\n return html`\n <div clips>\n ${clips.map(clip => {\n const loop = (clip.drive ?? 'loop') === 'loop'\n const value = this.driving[clip.name] ?? (loop ? 1 : 0)\n\n return html`\n <label>\n <span>${clip.name} <span drive>${loop ? '๋ฐฐ์' : '์์น'}</span></span>\n <input\n type=\"range\"\n min=\"0\"\n max=${loop ? 3 : 1}\n step=\"0.05\"\n .value=${String(value)}\n @input=${(e: Event) => this.drive(clip.name, Number((e.target as HTMLInputElement).value))}\n />\n <output>${value.toFixed(2)}</output>\n </label>\n `\n })}\n </div>\n `\n }\n\n /**\n * ์ธ์ ๋ ์ธ์คํด์ค ์ ๋ถ์ ๊ฐ์ ๊ฐ์ ์ค๋ค.\n *\n * ํ๋๋ง ๋ชฐ๋ฉด ์ธ ๋ฐฐ์จ์ด ์๋ก ๋ค๋ฅธ ์์ธ๋ก ์์, ํฌ๊ธฐ ๋ฐ์์ ๋ณด๋ ค๊ณ ๋๋ํ ๋์ ๋ป์ด\n * ์ฌ๋ผ์ง๋ค.\n */\n private drive(name: string, value: number): void {\n this.driving = { ...this.driving, [name]: value }\n\n for (const component of this.scene?.root?.components ?? []) {\n component.set?.('clips', { ...this.driving })\n }\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (!this.hasUpdated) return\n if (changed.has('source')) this.standUp()\n }\n\n firstUpdated() {\n this.standUp()\n this.watcher = new ResizeObserver(() => this.scene?.resize?.())\n this.watcher.observe(this)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.watcher?.disconnect()\n this.watcher = undefined\n this.teardown()\n }\n\n /**\n * ์ ์ํ ๊ฒ์ ์ปดํ์ผํด ์ธ์ด๋ค.\n *\n * **ํ์์ ์ด๊ฒผ์ผ๋ฉด ์ธ์ฐ์ง ์๋๋ค.** ๋ฐ์ฏค ์ธ์ด ๊ฒ์ ๋ณด์ฌ ์ฃผ๋ฉด ๋ฌด์์ด ์๋ชป๋๋์ง ์ ์\n * ์๋ค. ํ์ ํจ๋์ด ์ด๋ฏธ ์ฌ์ ๋ฅผ ๋งํ๊ณ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์๋ ์ธ์ธ ์ ์๋ค๊ณ ๋ง ํ๋ค.\n */\n private standUp() {\n const source = this.source\n if (!source || source.parts.length === 0) {\n this.cannot = i18next.t('text.preview-needs-a-part')\n this.teardown()\n return\n }\n\n const signature = JSON.stringify(source)\n if (this.scene && this.standing === signature) return\n\n const { errors } = validate(source)\n if (errors.length > 0) {\n this.cannot = i18next.t('text.preview-blocked-by-errors')\n this.teardown()\n return\n }\n\n this.teardown()\n // ํ๋ณธ์ด ๋ฐ๋๋ฉด ๋ฏผ ๊ฐ๋ ์ฒ์์ผ๋ก ๋๋ฆฐ๋ค โ ๋ค๋ฅธ ์์ฐ์ clip ์ด๋ฆ์ด ๋จ์ผ๋ฉด ์ ๋๋ค.\n this.driving = {}\n\n try {\n registerFigure(compile(source) as never)\n\n /*\n ๋ณด๋๊ฐ ํ๋ ์ผ์ ๊ทธ๋๋ก ํ๋ค. ์ปดํฌ๋ํธ์๋ ํ์
์ด๋ฆ๊ณผ ์๋ฆฌยทํฌ๊ธฐ๋ง ์ ๋๋ค โ\n ์ฒญ์ฌ์ง๋ ์๋ณธ๋ ๋ณด๋์ ๋ค์ด๊ฐ์ง ์๋๋ค.\n\n ๊ฐ์ฅ ํฐ ๊ฒ์ด ๋ค์ด๊ฐ ๋งํผ ํ์ ์ก๊ณ , ์ธ๋ก๋ก ์ค์ ๋๋ ๋๋ํ ๋๋๋ค.\n */\n const { base } = source\n const biggest = PREVIEW_FACTOR\n /** ์ด ์กฐํฉ์์ ์ถ๋ณ ๋ฐฐ์จ. ์กฐํฉ์ ๋ ์ถ๋ง ํค์ด๋ค. */\n const growth = (way: (typeof PREVIEW_WAYS)[number]) => ({\n x: way.axes.includes('x') ? PREVIEW_FACTOR : 1,\n y: way.axes.includes('y') ? PREVIEW_FACTOR : 1,\n z: way.axes.includes('z') ? PREVIEW_FACTOR : 1\n })\n // ์ฌ๋ฐฑ์ ๋๋ํ ๋๋ฉด ํ๋ฉด์์ ํ์์ด ์์์ง๋ค. ๊ฐ์ฅ ํฐ ๊ฒ์ด ๊ฒจ์ฐ ๋ค์ด๊ฐ ๋งํผ๋ง ์ก๋๋ค.\n /** ๋ค ์นธ์ฉ ๋ ์ค. */\n const COLUMNS = 4\n const cell = { x: base.x * biggest * 1.25, z: base.z * biggest * 1.25 }\n const rows = Math.ceil(PREVIEW_WAYS.length / COLUMNS)\n const board = {\n width: Math.round(cell.x * COLUMNS),\n height: Math.round(cell.z * rows),\n /*\n ํ์ ๋์ด๋ ๊ฐ์ฅ ํฐ ์ธ์คํด์ค๋ฅผ ๋ด์์ผ ํ๋ค.\n\n ์ ์ฃผ๋ฉด ์นด๋ฉ๋ผ๊ฐ ํ๋ฉด๋ง ๋ณด๊ณ ์๋ฆฌ๋ฅผ ์ก์์, ํค๊ฐ ํฐ ๋ชจ๋ธ์ ๋ฐ๋๋ง ๋ณด์ธ๋ค.\n ์๊ทธ๋ํ์๋ฅผ 2 ๋ฐฐ๋ก ๋์ผ๋ฉด 2200 ์ธ๋ฐ ํ์ด ๊ทธ๊ฒ์ ๋ชจ๋ฅด๋ฉด ๋ฐ์นจ๋ง ํ๋ฉด์ ๋ ๋ค.\n */\n depth: Math.round(base.y * biggest * 1.1)\n }\n\n /*\n ์ฌ์ ๋ฑ๋ง์ด ํ์๊ณผ ๋ค๋ฅด๋ค โ `width` ๊ฐ ํ์์ x, `height` ๊ฐ z, `depth` ๊ฐ y ๋ค.\n ์ฎ๊ธฐ๋ ์ผ์ ์ฌ๊ธฐ ํ ์ค์ ๋ชจ์ ๋๋ค.\n\n `depth` ๋ฅผ ๋ ์ ๋ ์ด์ ๊ฐ ์๋ค. ์ ์ ์ผ๋ฉด ํ๋ฉด ๋ ์ถ์ ๊ธฐํํ๊ท ์ผ๋ก ์กํ์,\n ใy ๋ง ํค์ด๋คใ๊ฐ xยทz ๋ฅผ ์ ๊ฑด๋๋ฆฌ๋๋ฐ๋ ๋์ด๊ฐ ์ ์ค๋ฅธ๋ค.\n */\n const components = PREVIEW_WAYS.map((way, at) => {\n const grow = growth(way)\n const column = at % COLUMNS\n const row = Math.floor(at / COLUMNS)\n const width = Math.round(base.x * grow.x)\n const height = Math.round(base.z * grow.z)\n\n return {\n type: source.type,\n id: `at-${way.name}`,\n // ์นธ ๊ฐ์ด๋ฐ์ ๋๋๋ค โ ํฌ๊ธฐ๊ฐ ์ ๋ง๋ค ๋ฌ๋ผ ์ผ์ชฝ์ ๋ง์ถ๋ฉด ์ค์ด ์ ์ฝํ๋ค.\n left: Math.round(column * cell.x + (cell.x - width) / 2),\n top: Math.round(row * cell.z + (cell.z - height) / 2),\n width,\n height,\n depth: Math.round(base.y * grow.y)\n }\n })\n\n this.scene = create({\n target: this.stage,\n model: {\n type: 'model-layer',\n width: board.width,\n height: board.height,\n depth: board.depth,\n threed: true,\n environment: 'studio',\n grid: true,\n sky: 'color',\n skyColor: WORKBENCH,\n floor: false,\n pixelRatio: Math.min(3, (window.devicePixelRatio || 1) * 2),\n components\n },\n // ๋ณด๊ธฐ๋ง ํ๋ ์๋ฆฌ๋ค. ์ง๊ฑฐ๋ ๋ ์ ์์ด์ผ ํ๋ค.\n mode: 0\n }) as SceneHandle\n\n this.standing = signature\n this.scene.resize?.()\n this.scene.fit?.('ratio')\n this.scene.root?.fitCameraToModel?.()\n this.cannot = ''\n } catch (e) {\n // ์์ธ์ ์ง์ด๋ด์ง ์๋๋ค โ ๋์ง ๋ง์ ๊ทธ๋๋ก ๋ณด์ฌ ์ค๋ค.\n this.cannot = (e as Error).message\n }\n }\n\n private teardown() {\n this.scene?.dispose?.()\n this.scene = undefined\n this.standing = undefined\n }\n}\n"]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import '@material/web/icon/icon.js';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
import type { FigureSource } from '@hatiolab/figure-model';
|
|
4
|
+
declare const FigureReport_base: (new (...args: any[]) => LitElement) & typeof LitElement;
|
|
5
|
+
/**
|
|
6
|
+
* ํ๋จ ํจ๋. ๋ชจ๋ธ๋ฌ ํ๋ฉด์ **๋ ๋ ์๋ค.**
|
|
7
|
+
*
|
|
8
|
+
* ์ ์ฅ์ ์ ํํด์ผ ์๋ ๊ฒ์ด ์๋๋ค. ๋ถํ์ ํ๋ ๋์ ๋๋ง๋ค ๋ฌด๊ฒ์ ์ ์๊ฐ ์์ง์ด๊ณ ,
|
|
9
|
+
* ๊ทธ๊ฒ์ด ๋ณด์ฌ์ผ ์ ์์๊ฐ ๊ณ ์น ์ ์๋ค. ใ๋ฌด์ ๋๋ฌธ์ ์ ์๊ฐ ๋ฎ์๊ฐใ๋ฅผ ๋งํด ์ฃผ์ง
|
|
10
|
+
* ์์ผ๋ฉด ์ ์๋ ์์๋ฆฌ์ผ ๋ฟ์ด๋ค.
|
|
11
|
+
*
|
|
12
|
+
* ## ์
์ ์ฌ๊ธฐ์ ํ์ง ์๋๋ค
|
|
13
|
+
*
|
|
14
|
+
* ๊ฒ์ฆยท์๊ฐยท์ ์๋ ์ ๋ถ `@hatiolab/figure-model` ์ด ํ๋ค. ํ๋ฉด์ **๋ถ๋ฅด๊ณ ๋ณด์ฌ ์ค
|
|
15
|
+
* ๋ฟ**์ด๋ค. ํ๋๋ ๋ฑ๊ธ ๊ฒฝ๊ณ๋ฅผ ํ๋ฉด์ด ๋ค์ ์ ํ๋ฉด ์๋ฒ๊ฐ ๊ฑฐ์ ํ ๊ฒ์ ํ๋ฉด์ด
|
|
16
|
+
* ํต๊ณผ์ํค๊ฒ ๋๋ค.
|
|
17
|
+
*/
|
|
18
|
+
export declare class FigureReport extends FigureReport_base {
|
|
19
|
+
static styles: import("lit").CSSResult[];
|
|
20
|
+
/** ์ ์ ์ค์ธ ์๋ณธ ๋ฐ์ดํฐ. ๋ฐ๋๋ฉด ๋ค์ ์ธก์ ํ๋ค. */
|
|
21
|
+
source?: FigureSource;
|
|
22
|
+
private cost?;
|
|
23
|
+
private score?;
|
|
24
|
+
private curve;
|
|
25
|
+
/** 1๋ง ๊ฐ๋ฅผ ๋์์ ๋. ์ ์์๊ฐ ์ค์ ๋ก ๊ถ๊ธํ ์ซ์๋ค. */
|
|
26
|
+
private many?;
|
|
27
|
+
/** ๋ช ๊ฐ๊น์ง ๋์ ์ ์๋. ์ด ํจ๋์ ๋จธ๋ฆฌ๋ค. */
|
|
28
|
+
private capacity?;
|
|
29
|
+
/** ์ถ์ด ๊ทธ๋ฆผ์ ์ ํฌ๊ธฐ๋ก ํผ์ณค๋. */
|
|
30
|
+
private expanded;
|
|
31
|
+
private errors;
|
|
32
|
+
private violations;
|
|
33
|
+
willUpdate(changed: Map<string, unknown>): void;
|
|
34
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
35
|
+
/**
|
|
36
|
+
* ๋จธ๋ฆฌ โ ๋ช ๊ฐ๊น์ง ํธํ๊ฐ.
|
|
37
|
+
*
|
|
38
|
+
* ๋ก์ฐํด๋ฆฌ์ ๊ฐ์ ใ์ผ๋ง๋ ๋ง์ด ํธํ๊ฒ ๋์ ์ ์๋ใ์ ์๋ค. ๋ฑ๊ธ B ๋ ๊ทธ ๋ฌผ์์
|
|
39
|
+
* ์ง์ ๋ตํ์ง ์๋๋ค โ ํ์์ด ์ ์ธ๋ ํ๋ ์์ธ์ง๋ฅผ ๋งํ ๋ฟ์ด๋ค. ๊ทธ๋์ ๊ฐ์๋ฅผ
|
|
40
|
+
* ๋จธ๋ฆฌ์ ์ฌ๋ฆฌ๊ณ ๋ฑ๊ธ์ ์์ badge ๋ก ๋ด๋ฆฐ๋ค.
|
|
41
|
+
*
|
|
42
|
+
* ๊ทผ๊ฑฐ๋ฅผ ํจ๊ป ๋ธ๋ค. ์ด ๊ฐ์์ ๋ถ๋ชจ๋ ์ค์ธก์ด ์๋๋ผ ์ค๊ณ ๋ฌธ์์ ๋ชฉํ์น์ด๊ณ (๋ฏธ๊ฒฐ
|
|
43
|
+
* D-20), ๊ทธ ์ฌ์ค์ด ํ๋ฉด์ ์์ผ๋ฉด ์ฌ ๋ณธ ๊ฐ์ฒ๋ผ ์ฝํ๋ค.
|
|
44
|
+
*/
|
|
45
|
+
private renderVerdict;
|
|
46
|
+
/**
|
|
47
|
+
* ๋ฑ๊ธ ๋๊ธ.
|
|
48
|
+
*
|
|
49
|
+
* AยทBยทCยทD ๊ฐ ๋ฌด์์ ๋ปํ๋์ง ํ๋ฉด ์ด๋์๋ ์์๋ค. badge ๋ง ๋ณด๊ณ ๋ ์ข์์ง ๋์์ง๋,
|
|
50
|
+
* ๋ฌด์์ ๊ณ ์ณ์ผ ์ค๋ฅด๋์ง๋ ์ ์ ์๋ค. ๋๊ธ์ ๋ ๊ณ์ ๋๊ณ ์ง๊ธ ์ด๋์ ์๋์ง๋ฅผ
|
|
51
|
+
* ํ์ํ๋ค.
|
|
52
|
+
*
|
|
53
|
+
* ์ ์ด ๋์ง ์๋๋ค. ํ ๋ฒ ๋ฐฐ์ฐ๊ณ ๋ง๋ ๊ฐ์ด ์๋๋ผ ๋ณผ ๋๋ง๋ค ๋์กฐํ๋ ๊ฐ์ด๋ค.
|
|
54
|
+
*/
|
|
55
|
+
private renderGradeScale;
|
|
56
|
+
/**
|
|
57
|
+
* ์ฑ์๋ โ ์ฌ๋ฌ ์ถ์ผ๋ก ๋ณธ๋ค.
|
|
58
|
+
*
|
|
59
|
+
* ใ๋ช ๊ฐ๊น์ง ํธํ๊ฐใ ํ๋๋ก๋ ์ข์ ํ์๊ณผ ๋์ ํ์์ด ๊ตฌ๋ถ๋์ง ์๋๋ค. ๋ถํ ํ๋์ง๋ฆฌ
|
|
60
|
+
* ์์๋ ๊ทธ ์ถ์์๋ ๋ง์ ์ด๋ค.
|
|
61
|
+
*
|
|
62
|
+
* **๋ชป ์ฌ๋ ์ถ์ 0 ์ผ๋ก ๋์ง ์๋๋ค.** 0 ์ ใ๋์๋คใ๋ ๋ป์ด ๋๋๋ฐ, ์ฌ์ค์ ์์ง
|
|
63
|
+
* ์ธก์ ํ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ด๋ค. ์ธก์ ํ์ง ๋ชปํ๋ค๊ณ ์๋ฆฌ๊ณ ์ด์ ๋ฅผ ๋ถ์ธ๋ค. ์ง์ด๋ธ ์ ์๋ณด๋ค ๊ทธ๊ฒ์ด
|
|
64
|
+
* ์ด ๋ฆฌํฌํธ๋ฅผ ๋ฏฟ์ ๋งํ๊ฒ ๋ง๋ ๋ค.
|
|
65
|
+
*/
|
|
66
|
+
private renderAxes;
|
|
67
|
+
/**
|
|
68
|
+
* ์ฑ์๋ radar. **์ธก์ ํ ์ถ๋ง ๊ทธ๋ฆฐ๋ค.**
|
|
69
|
+
*
|
|
70
|
+
* ์ธก์ ํ์ง ๋ชปํ๋ ์ถ๋ spoke ๋ฅผ ๊ทธ๋ ค ๋๊ณ ๋ํ๋ง ๊ฑด๋๋ฐ๋ ๋๊ฐ ์์๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ ๋ฐฉํฅ์ ๊ฐ๋ก์ง๋ฅด๋
|
|
71
|
+
* ์ง์ ์ด ์๊ฒจ์ ๋ํ์ด ๊ทธ์ชฝ์ผ๋ก ์ํน ๋ค์ด๊ฐ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. 0 ์ผ๋ก ์ฐ์ง ์์ผ๋ ค๊ณ ํ
|
|
72
|
+
* ์ผ์ธ๋ฐ ๊ฒฐ๊ณผ๋ 0 ์ผ๋ก ์ฐ์ ๊ฒ๊ณผ ๋๊ฐ์ด ์ฝํ๋ค. ์ ์ ์ด๊ณผ ๋ฌผ์ํ๋ก๋ ๊ทธ ์ธ์์ด
|
|
73
|
+
* ์ง์์ง์ง ์์๋ค.
|
|
74
|
+
*
|
|
75
|
+
* ๊ทธ๋์ ์์ ๋นผ๊ณ , ๋ชป ์ฌ๋ ์ถ์ ๊ทธ๋ฆผ ์๋์ ๊ธ๋ก ์ ๋๋ค. ์ด ์ ์๋ ๊ฒ์ ๊ทธ๋ฆผ์
|
|
76
|
+
* ์๋ฆฌ๋ฅผ ์ฃผ์ง ์๋ ํธ์ด ์ ์งํ๋ค.
|
|
77
|
+
*/
|
|
78
|
+
private renderRadar;
|
|
79
|
+
/**
|
|
80
|
+
* ๊ทธ๋ฆผ์ ์๋ ์ถ์ ๊ธ๋ก ๋ฐํ๋ค.
|
|
81
|
+
*
|
|
82
|
+
* ๋นผ๊ธฐ๋ง ํ๋ฉด ์ถ์ด ์ฌ์ฏ์ธ์ง ๋ค์ฏ์ธ์ง ์ ์ ์๊ณ , ์๋ ๊ฒ์ ์๋ค๊ณ ๋งํ์ง ์์ ์
์ด
|
|
83
|
+
* ๋๋ค. ๋ฌด์์ ์์ง ๋ชป ์ฌ๋์ง ํ ์ค๋ก ์ ๋๋ค. ์ ๋ชป ์ฌ๋์ง๋ ์๋ ๋ชฉ๋ก์ ๊ทธ ํญ๋ชฉ์
|
|
84
|
+
* ๊ทธ๋๋ก ์๋ค.
|
|
85
|
+
*/
|
|
86
|
+
private renderUnmeasured;
|
|
87
|
+
private renderAxis;
|
|
88
|
+
/**
|
|
89
|
+
* ์์ฐ ๋ง๋.
|
|
90
|
+
*
|
|
91
|
+
* ์ซ์๋ง ๋์ด๋์ผ๋ฉด ์ด๋ ๊ฒ์ด ๊ฝ ์ฐผ๋์ง ๋์ ์ ๋ค์ด์จ๋ค. ํ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋๋ฅผ ์์ผ๋ก
|
|
92
|
+
* ๊ตฌ๋ถํ๋ค. ๊ทธ๊ฒ์ด ์ ์๋ฅผ ์ ํ ํญ๋ชฉ์ด๋ค.
|
|
93
|
+
*
|
|
94
|
+
* ## `use.label` ์ ์ฐ์ง ์๋ ์ด์
|
|
95
|
+
*
|
|
96
|
+
* `FigureBudgetUse` ์ `label` ๊ณผ `why` ๊ฐ ์๊ณ ใ์ ์์์๊ฒ ๊ทธ๋๋ก ๋ณด์ฌ ์ค๋คใ๊ณ
|
|
97
|
+
* ์ ํ ์๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ๋ฌธ๊ตฌ๊ฐ **ํ๊ตญ์ด๋ก ๊ตฌ์์ ธ** ์๋ค. ์ด ์ ํ์ 5์ธ์ด๋ฅผ ์ฐ๋ฏ๋ก
|
|
98
|
+
* ๊ทธ๊ฒ์ ๊ทธ๋๋ก ์ค์ผ๋ฉด ๋ค๋ฅธ ์ธ์ด ์ฌ์ฉ์์๊ฒ ํ๊ตญ์ด๊ฐ ๋์จ๋ค.
|
|
99
|
+
*
|
|
100
|
+
* `budgets` ๋ **๋ฐฐ์ด**์ด๋ค. `Object.entries` ๋ก ๋๋ฉด ํค๊ฐ ์ธ๋ฑ์ค(0ยท1ยท2โฆ)๊ฐ ๋์ด
|
|
101
|
+
* `label.budget-0` ๊ฐ์ ์๋ ํค๋ฅผ ์ฐพ๋๋ค โ ํ๋ฉด์ ๋์ ๋ณด๊ณ ์์ผ ๋๋ฌ๋ฌ๋ค.
|
|
102
|
+
* ๋ฐฐ์ด์ ๊ทธ๋๋ก ๋๊ณ `use.key` ๋ฅผ ์ด๋ค.
|
|
103
|
+
*
|
|
104
|
+
* ๊ทธ๋์ **์์ ๋ `key`** ๋ก ์ด ํ๋ฉด์ i18n ์ ์ฐพ๋๋ค. `key` ๋ ์ด๊ฑฐํ์ด๋ผ ํ์์
|
|
105
|
+
* ์ผ๋ถ์ด๊ณ , ๋ฌธ๊ตฌ๋ ํ๋ฉด์ ๋ชซ์ด๋ค. figure-model ์ด ๋ฌธ๊ตฌ๋ฅผ ์ธ์ด ์ค๋ฆฝ์ผ๋ก ๋ฐ๊พธ๋ฉด
|
|
106
|
+
* ๊ทธ๋ `label` ์ ์ธ ์ ์๋ค.
|
|
107
|
+
*/
|
|
108
|
+
private renderBudgets;
|
|
109
|
+
private renderMetrics;
|
|
110
|
+
/**
|
|
111
|
+
* ์ฌํ์ฉ ์ถ์ด โ ใ๋ง์ด ๋์ผ๋ฉด ์ด๋ป๊ฒ ๋๋ใ์ ๋ตํ๋ค.
|
|
112
|
+
*
|
|
113
|
+
* ## ๊ทธ๋ฆผ์ ์ฌ์ด๋๋ฐ์ ๋ฐ์ด ๋ฃ์ง ์๋๋ค
|
|
114
|
+
*
|
|
115
|
+
* `costCurveSvg` ์ ์์ฐ ํฌ๊ธฐ๋ 680x380 ์ด๊ณ ๊ธ์๊ฐ 11px ๋ค. 300px ์นธ์์
|
|
116
|
+
* width:100% ๋ก ์ค์ด๋ฉด ๊ธ์๊ฐ 4px ์ด ๋์ด **์๋ฌด๊ฒ๋ ์ฝ์ ์ ์๋ค** โ ํ๋ฉด์ ๋์
|
|
117
|
+
* ๋ณด๊ณ ์์ผ ๋๋ฌ๋ฌ๋ค. ์ฝ์ ์ ์๋ ๊ทธ๋ฆผ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก, ์ฌ์ด๋๋ฐ์๋ ์ ์์๊ฐ
|
|
118
|
+
* ์ค์ ๋ก ๊ถ๊ธํ ์ซ์(1๋ง ๊ฐ์ผ ๋)๋ฅผ ๋๊ณ ๊ทธ๋ฆผ์ ์ ํํด์ ์ ํฌ๊ธฐ๋ก ๋ณธ๋ค.
|
|
119
|
+
*/
|
|
120
|
+
private renderCurve;
|
|
121
|
+
/** ๊ทธ๋ฆผ์ ์ ํฌ๊ธฐ๋ก ๋ณด์ฌ ์ค๋ค. ์ข์ผ๋ฉด ์ค์ด์ง ์๊ณ ๋๊ฒจ ๋ณด๊ฒ ๋๋ค. */
|
|
122
|
+
private renderSheet;
|
|
123
|
+
/**
|
|
124
|
+
* ๋ฐ๊ฒฌ.
|
|
125
|
+
*
|
|
126
|
+
* ์ค๋ฅ(๋ง๋ ๊ฒ)์ ์๋ฐ(์๋ฆฌ๋ ๊ฒ)์ **๊ฐ๋ ค์** ๋ณด์ฌ ์ค๋ค. ์์ผ๋ฉด ์ ์์๊ฐ ๋ฌด์์
|
|
127
|
+
* ๋ฐ๋์ ๊ณ ์ณ์ผ ํ๋์ง ๋ชจ๋ฅธ๋ค. ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ใ์๋คใ๊ณ ๋งํ๋ค โ ๋น ์๋ฆฌ๋ก ๋๋ฉด
|
|
128
|
+
* ๊ฒ์ฌ๊ฐ ๋์๋์ง ์ ์ ์๋ค.
|
|
129
|
+
*/
|
|
130
|
+
private renderFindings;
|
|
131
|
+
/** ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ธก์ ํด ๊ฒฐ๊ณผ๋ฅผ ์ํ์ ๋ด๋๋ค. ์
์ ์ ๋ถ figure-model ์ด ํ๋ค. */
|
|
132
|
+
private measure;
|
|
133
|
+
}
|
|
134
|
+
export {};
|