@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.
Files changed (112) hide show
  1. package/client/bootstrap.ts +16 -0
  2. package/client/graphql/index.ts +209 -0
  3. package/client/index.ts +2 -0
  4. package/client/modeller/figure-ask.ts +247 -0
  5. package/client/modeller/figure-canvas.ts +482 -0
  6. package/client/modeller/figure-inspector.ts +1054 -0
  7. package/client/modeller/figure-parts.ts +479 -0
  8. package/client/modeller/figure-preview.ts +381 -0
  9. package/client/modeller/figure-report.ts +895 -0
  10. package/client/modeller/figure-settings.ts +285 -0
  11. package/client/modeller/figure-side.ts +162 -0
  12. package/client/modeller/figure-source.test.ts +336 -0
  13. package/client/modeller/figure-source.ts +338 -0
  14. package/client/modeller/figure-view.ts +79 -0
  15. package/client/modeller/maturity.ts +288 -0
  16. package/client/modeller/part-edits.test.ts +252 -0
  17. package/client/modeller/part-edits.ts +246 -0
  18. package/client/modeller/proposal.ts +142 -0
  19. package/client/modeller/scene-budget.ts +102 -0
  20. package/client/pages/figure-list-page.ts +274 -0
  21. package/client/pages/figure-modeller-page.ts +1067 -0
  22. package/client/route.ts +11 -0
  23. package/client/themes/brand.css +51 -0
  24. package/client/themes/dark.css +64 -0
  25. package/client/themes/light.css +95 -0
  26. package/client/tsconfig.json +19 -0
  27. package/client/types.ts +96 -0
  28. package/client/viewparts/figure-card.ts +226 -0
  29. package/dist-client/bootstrap.d.ts +14 -0
  30. package/dist-client/bootstrap.js +17 -0
  31. package/dist-client/bootstrap.js.map +1 -0
  32. package/dist-client/graphql/index.d.ts +41 -0
  33. package/dist-client/graphql/index.js +173 -0
  34. package/dist-client/graphql/index.js.map +1 -0
  35. package/dist-client/index.d.ts +2 -0
  36. package/dist-client/index.js +3 -0
  37. package/dist-client/index.js.map +1 -0
  38. package/dist-client/modeller/figure-ask.d.ts +36 -0
  39. package/dist-client/modeller/figure-ask.js +256 -0
  40. package/dist-client/modeller/figure-ask.js.map +1 -0
  41. package/dist-client/modeller/figure-canvas.d.ts +128 -0
  42. package/dist-client/modeller/figure-canvas.js +431 -0
  43. package/dist-client/modeller/figure-canvas.js.map +1 -0
  44. package/dist-client/modeller/figure-inspector.d.ts +149 -0
  45. package/dist-client/modeller/figure-inspector.js +991 -0
  46. package/dist-client/modeller/figure-inspector.js.map +1 -0
  47. package/dist-client/modeller/figure-parts.d.ts +64 -0
  48. package/dist-client/modeller/figure-parts.js +478 -0
  49. package/dist-client/modeller/figure-parts.js.map +1 -0
  50. package/dist-client/modeller/figure-preview.d.ts +62 -0
  51. package/dist-client/modeller/figure-preview.js +360 -0
  52. package/dist-client/modeller/figure-preview.js.map +1 -0
  53. package/dist-client/modeller/figure-report.d.ts +134 -0
  54. package/dist-client/modeller/figure-report.js +881 -0
  55. package/dist-client/modeller/figure-report.js.map +1 -0
  56. package/dist-client/modeller/figure-settings.d.ts +39 -0
  57. package/dist-client/modeller/figure-settings.js +277 -0
  58. package/dist-client/modeller/figure-settings.js.map +1 -0
  59. package/dist-client/modeller/figure-side.d.ts +41 -0
  60. package/dist-client/modeller/figure-side.js +175 -0
  61. package/dist-client/modeller/figure-side.js.map +1 -0
  62. package/dist-client/modeller/figure-source.d.ts +196 -0
  63. package/dist-client/modeller/figure-source.js +153 -0
  64. package/dist-client/modeller/figure-source.js.map +1 -0
  65. package/dist-client/modeller/figure-view.d.ts +57 -0
  66. package/dist-client/modeller/figure-view.js +36 -0
  67. package/dist-client/modeller/figure-view.js.map +1 -0
  68. package/dist-client/modeller/maturity.d.ts +55 -0
  69. package/dist-client/modeller/maturity.js +212 -0
  70. package/dist-client/modeller/maturity.js.map +1 -0
  71. package/dist-client/modeller/part-edits.d.ts +64 -0
  72. package/dist-client/modeller/part-edits.js +218 -0
  73. package/dist-client/modeller/part-edits.js.map +1 -0
  74. package/dist-client/modeller/proposal.d.ts +45 -0
  75. package/dist-client/modeller/proposal.js +96 -0
  76. package/dist-client/modeller/proposal.js.map +1 -0
  77. package/dist-client/modeller/scene-budget.d.ts +78 -0
  78. package/dist-client/modeller/scene-budget.js +80 -0
  79. package/dist-client/modeller/scene-budget.js.map +1 -0
  80. package/dist-client/pages/figure-list-page.d.ts +40 -0
  81. package/dist-client/pages/figure-list-page.js +280 -0
  82. package/dist-client/pages/figure-list-page.js.map +1 -0
  83. package/dist-client/pages/figure-modeller-page.d.ts +219 -0
  84. package/dist-client/pages/figure-modeller-page.js +1045 -0
  85. package/dist-client/pages/figure-modeller-page.js.map +1 -0
  86. package/dist-client/route.d.ts +1 -0
  87. package/dist-client/route.js +11 -0
  88. package/dist-client/route.js.map +1 -0
  89. package/dist-client/themes/brand.css +51 -0
  90. package/dist-client/themes/dark.css +64 -0
  91. package/dist-client/themes/light.css +95 -0
  92. package/dist-client/types.d.ts +93 -0
  93. package/dist-client/types.js +2 -0
  94. package/dist-client/types.js.map +1 -0
  95. package/dist-client/viewparts/figure-card.d.ts +24 -0
  96. package/dist-client/viewparts/figure-card.js +221 -0
  97. package/dist-client/viewparts/figure-card.js.map +1 -0
  98. package/dist-server/index.d.ts +7 -0
  99. package/dist-server/index.js +3 -0
  100. package/dist-server/index.js.map +1 -0
  101. package/package.json +41 -0
  102. package/server/index.ts +7 -0
  103. package/server/tsconfig.json +18 -0
  104. package/test/brand-palette.test.ts +188 -0
  105. package/test/heading-scale-guard.test.ts +144 -0
  106. package/test/resolve-ts-siblings.mjs +67 -0
  107. package/things-factory.config.js +11 -0
  108. package/translations/en.json +247 -0
  109. package/translations/ja.json +247 -0
  110. package/translations/ko.json +247 -0
  111. package/translations/ms.json +247 -0
  112. 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 {};