@popaya/pgsg-viewer 0.1.10 → 0.2.0
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/dist/{chunk-OUBHF2NG.js → chunk-LFICZTG7.js} +11 -2
- package/dist/chunk-LFICZTG7.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/{pgsg-three-viewer-LWLUOAKM.js → pgsg-three-viewer-5BUDBGSE.js} +557 -416
- package/dist/pgsg-three-viewer-5BUDBGSE.js.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +253 -76
- package/dist/react/index.js.map +1 -1
- package/package.json +8 -1
- package/dist/chunk-OUBHF2NG.js.map +0 -1
- package/dist/pgsg-three-viewer-LWLUOAKM.js.map +0 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["#style-inject:#style-inject","../../src/styles/viewer.css","../../src/react/PGSGCanvas.tsx","../../src/react/controls/PGSGViewerMode.tsx","../../src/lib/utils.ts","../../src/react/controls/PGSGViewerSettings.tsx","../../src/react/PGSGViewControls.tsx"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */\\n@layer properties;\\n@layer theme, base, components, utilities;\\n@layer theme {\\n :root,\\n :host {\\n --font-sans:\\n ui-sans-serif,\\n system-ui,\\n sans-serif,\\n \\\"Apple Color Emoji\\\",\\n \\\"Segoe UI Emoji\\\",\\n \\\"Segoe UI Symbol\\\",\\n \\\"Noto Color Emoji\\\";\\n --font-mono:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n --color-white: #fff;\\n --spacing: 0.25rem;\\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\\n --blur-2xl: 40px;\\n --default-transition-duration: 150ms;\\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n --default-font-family: var(--font-sans);\\n --default-mono-font-family: var(--font-mono);\\n }\\n}\\n@layer base {\\n *,\\n ::after,\\n ::before,\\n ::backdrop,\\n ::file-selector-button {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n border: 0 solid;\\n }\\n html,\\n :host {\\n line-height: 1.5;\\n -webkit-text-size-adjust: 100%;\\n tab-size: 4;\\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");\\n font-feature-settings: var(--default-font-feature-settings, normal);\\n font-variation-settings: var(--default-font-variation-settings, normal);\\n -webkit-tap-highlight-color: transparent;\\n }\\n hr {\\n height: 0;\\n color: inherit;\\n border-top-width: 1px;\\n }\\n abbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n }\\n h1,\\n h2,\\n h3,\\n h4,\\n h5,\\n h6 {\\n font-size: inherit;\\n font-weight: inherit;\\n }\\n a {\\n color: inherit;\\n -webkit-text-decoration: inherit;\\n text-decoration: inherit;\\n }\\n b,\\n strong {\\n font-weight: bolder;\\n }\\n code,\\n kbd,\\n samp,\\n pre {\\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);\\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\\n font-size: 1em;\\n }\\n small {\\n font-size: 80%;\\n }\\n sub,\\n sup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n }\\n sub {\\n bottom: -0.25em;\\n }\\n sup {\\n top: -0.5em;\\n }\\n table {\\n text-indent: 0;\\n border-color: inherit;\\n border-collapse: collapse;\\n }\\n :-moz-focusring {\\n outline: auto;\\n }\\n progress {\\n vertical-align: baseline;\\n }\\n summary {\\n display: list-item;\\n }\\n ol,\\n ul,\\n menu {\\n list-style: none;\\n }\\n img,\\n svg,\\n video,\\n canvas,\\n audio,\\n iframe,\\n embed,\\n object {\\n display: block;\\n vertical-align: middle;\\n }\\n img,\\n video {\\n max-width: 100%;\\n height: auto;\\n }\\n button,\\n input,\\n select,\\n optgroup,\\n textarea,\\n ::file-selector-button {\\n font: inherit;\\n font-feature-settings: inherit;\\n font-variation-settings: inherit;\\n letter-spacing: inherit;\\n color: inherit;\\n border-radius: 0;\\n background-color: transparent;\\n opacity: 1;\\n }\\n :where(select:is([multiple], [size])) optgroup {\\n font-weight: bolder;\\n }\\n :where(select:is([multiple], [size])) optgroup option {\\n padding-inline-start: 20px;\\n }\\n ::file-selector-button {\\n margin-inline-end: 4px;\\n }\\n ::placeholder {\\n opacity: 1;\\n }\\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\\n ::placeholder {\\n color: currentcolor;\\n @supports (color: color-mix(in lab, red, red)) {\\n color: color-mix(in oklab, currentcolor 50%, transparent);\\n }\\n }\\n }\\n textarea {\\n resize: vertical;\\n }\\n ::-webkit-search-decoration {\\n -webkit-appearance: none;\\n }\\n ::-webkit-date-and-time-value {\\n min-height: 1lh;\\n text-align: inherit;\\n }\\n ::-webkit-datetime-edit {\\n display: inline-flex;\\n }\\n ::-webkit-datetime-edit-fields-wrapper {\\n padding: 0;\\n }\\n ::-webkit-datetime-edit,\\n ::-webkit-datetime-edit-year-field,\\n ::-webkit-datetime-edit-month-field,\\n ::-webkit-datetime-edit-day-field,\\n ::-webkit-datetime-edit-hour-field,\\n ::-webkit-datetime-edit-minute-field,\\n ::-webkit-datetime-edit-second-field,\\n ::-webkit-datetime-edit-millisecond-field,\\n ::-webkit-datetime-edit-meridiem-field {\\n padding-block: 0;\\n }\\n ::-webkit-calendar-picker-indicator {\\n line-height: 1;\\n }\\n :-moz-ui-invalid {\\n box-shadow: none;\\n }\\n button,\\n input:where([type=button], [type=reset], [type=submit]),\\n ::file-selector-button {\\n appearance: button;\\n }\\n ::-webkit-inner-spin-button,\\n ::-webkit-outer-spin-button {\\n height: auto;\\n }\\n [hidden]:where(:not([hidden=until-found])) {\\n display: none !important;\\n }\\n}\\n@layer utilities {\\n .pointer-events-auto {\\n pointer-events: auto;\\n }\\n .pointer-events-none {\\n pointer-events: none;\\n }\\n .invisible {\\n visibility: hidden;\\n }\\n .visible {\\n visibility: visible;\\n }\\n .absolute {\\n position: absolute;\\n }\\n .relative {\\n position: relative;\\n }\\n .static {\\n position: static;\\n }\\n .start {\\n inset-inline-start: var(--spacing);\\n }\\n .end {\\n inset-inline-end: var(--spacing);\\n }\\n .top-6 {\\n top: calc(var(--spacing) * 6);\\n }\\n .right-0 {\\n right: calc(var(--spacing) * 0);\\n }\\n .right-6 {\\n right: calc(var(--spacing) * 6);\\n }\\n .bottom-0 {\\n bottom: calc(var(--spacing) * 0);\\n }\\n .bottom-6 {\\n bottom: calc(var(--spacing) * 6);\\n }\\n .z-50 {\\n z-index: 50;\\n }\\n .z-100 {\\n z-index: 100;\\n }\\n .container {\\n width: 100%;\\n @media (width >= 40rem) {\\n max-width: 40rem;\\n }\\n @media (width >= 48rem) {\\n max-width: 48rem;\\n }\\n @media (width >= 64rem) {\\n max-width: 64rem;\\n }\\n @media (width >= 80rem) {\\n max-width: 80rem;\\n }\\n @media (width >= 96rem) {\\n max-width: 96rem;\\n }\\n }\\n .block {\\n display: block;\\n }\\n .flex {\\n display: flex;\\n }\\n .hidden {\\n display: none;\\n }\\n .size-4 {\\n width: calc(var(--spacing) * 4);\\n height: calc(var(--spacing) * 4);\\n }\\n .size-5 {\\n width: calc(var(--spacing) * 5);\\n height: calc(var(--spacing) * 5);\\n }\\n .h-full {\\n height: 100%;\\n }\\n .w-1\\\\/2 {\\n width: calc(1 / 2 * 100%);\\n }\\n .max-w-0 {\\n max-width: calc(var(--spacing) * 0);\\n }\\n .max-w-\\\\[520px\\\\] {\\n max-width: 520px;\\n }\\n .translate-x-0 {\\n --tw-translate-x: calc(var(--spacing) * 0);\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .translate-x-6 {\\n --tw-translate-x: calc(var(--spacing) * 6);\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .translate-x-full {\\n --tw-translate-x: 100%;\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .scale-95 {\\n --tw-scale-x: 95%;\\n --tw-scale-y: 95%;\\n --tw-scale-z: 95%;\\n scale: var(--tw-scale-x) var(--tw-scale-y);\\n }\\n .scale-100 {\\n --tw-scale-x: 100%;\\n --tw-scale-y: 100%;\\n --tw-scale-z: 100%;\\n scale: var(--tw-scale-x) var(--tw-scale-y);\\n }\\n .transform {\\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\\n }\\n .cursor-default {\\n cursor: default;\\n }\\n .cursor-pointer {\\n cursor: pointer;\\n }\\n .flex-row-reverse {\\n flex-direction: row-reverse;\\n }\\n .items-center {\\n align-items: center;\\n }\\n .gap-1\\\\.5 {\\n gap: calc(var(--spacing) * 1.5);\\n }\\n .overflow-hidden {\\n overflow: hidden;\\n }\\n .rounded-full {\\n border-radius: calc(infinity * 1px);\\n }\\n .border {\\n border-style: var(--tw-border-style);\\n border-width: 1px;\\n }\\n .border-white\\\\/20 {\\n border-color: color-mix(in srgb, #fff 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n border-color: color-mix(in oklab, var(--color-white) 20%, transparent);\\n }\\n }\\n .bg-white\\\\/10 {\\n background-color: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-white) 10%, transparent);\\n }\\n }\\n .bg-gradient-to-br {\\n --tw-gradient-position: to bottom right in oklab;\\n background-image: linear-gradient(var(--tw-gradient-stops));\\n }\\n .from-white\\\\/20 {\\n --tw-gradient-from: color-mix(in srgb, #fff 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-from: color-mix(in oklab, var(--color-white) 20%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n .to-white\\\\/5 {\\n --tw-gradient-to: color-mix(in srgb, #fff 5%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-to: color-mix(in oklab, var(--color-white) 5%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n .p-2\\\\.5 {\\n padding: calc(var(--spacing) * 2.5);\\n }\\n .p-3 {\\n padding: calc(var(--spacing) * 3);\\n }\\n .pr-14 {\\n padding-right: calc(var(--spacing) * 14);\\n }\\n .pl-2 {\\n padding-left: calc(var(--spacing) * 2);\\n }\\n .text-white {\\n color: var(--color-white);\\n }\\n .text-white\\\\/60 {\\n color: color-mix(in srgb, #fff 60%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n color: color-mix(in oklab, var(--color-white) 60%, transparent);\\n }\\n }\\n .opacity-0 {\\n opacity: 0%;\\n }\\n .opacity-100 {\\n opacity: 100%;\\n }\\n .shadow-\\\\[0_8px_32px_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\] {\\n --tw-shadow: 0 8px 32px var(--tw-shadow-color, rgba(0,0,0,0.25));\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-lg {\\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-none {\\n --tw-shadow: 0 0 #0000;\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-white\\\\/10 {\\n --tw-shadow-color: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-white) 10%, transparent) var(--tw-shadow-alpha), transparent);\\n }\\n }\\n .blur {\\n --tw-blur: blur(8px);\\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\\n }\\n .backdrop-blur-2xl {\\n --tw-backdrop-blur: blur(var(--blur-2xl));\\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\\n }\\n .transition-all {\\n transition-property: all;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .transition-opacity {\\n transition-property: opacity;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .delay-200 {\\n transition-delay: 200ms;\\n }\\n .duration-200 {\\n --tw-duration: 200ms;\\n transition-duration: 200ms;\\n }\\n .duration-300 {\\n --tw-duration: 300ms;\\n transition-duration: 300ms;\\n }\\n .ease-out {\\n --tw-ease: var(--ease-out);\\n transition-timing-function: var(--ease-out);\\n }\\n .delay-200 {\\n animation-delay: calc(200*1ms);\\n animation-delay: .2s;\\n --tw-animation-delay: calc(200*1ms);\\n --tw-animation-delay: .2s;\\n }\\n .running {\\n animation-play-state: running;\\n }\\n .hover\\\\:bg-white\\\\/10 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-white) 10%, transparent);\\n }\\n }\\n }\\n }\\n .dark\\\\:from-white\\\\/10 {\\n &:is(.dark *) {\\n --tw-gradient-from: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-from: color-mix(in oklab, var(--color-white) 10%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n }\\n .dark\\\\:to-transparent {\\n &:is(.dark *) {\\n --tw-gradient-to: transparent;\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n }\\n}\\n@property --tw-animation-delay { syntax: \\\"*\\\"; inherits: false; initial-value: 0s; }\\n@property --tw-animation-direction { syntax: \\\"*\\\"; inherits: false; initial-value: normal; }\\n@property --tw-animation-duration { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-animation-fill-mode { syntax: \\\"*\\\"; inherits: false; initial-value: none; }\\n@property --tw-animation-iteration-count { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-enter-blur { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-enter-opacity { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-enter-rotate { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-enter-scale { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-enter-translate-x { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-enter-translate-y { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-exit-blur { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-exit-opacity { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-exit-rotate { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-exit-scale { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-exit-translate-x { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-exit-translate-y { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n:root {\\n --radius: 0.625rem;\\n --background: oklch(1 0 0);\\n --foreground: oklch(0.145 0 0);\\n --card: oklch(1 0 0);\\n --card-foreground: oklch(0.145 0 0);\\n --popover: oklch(1 0 0);\\n --popover-foreground: oklch(0.145 0 0);\\n --primary: oklch(0.205 0 0);\\n --primary-foreground: oklch(0.985 0 0);\\n --secondary: oklch(0.97 0 0);\\n --secondary-foreground: oklch(0.205 0 0);\\n --muted: oklch(0.97 0 0);\\n --muted-foreground: oklch(0.556 0 0);\\n --accent: oklch(0.97 0 0);\\n --accent-foreground: oklch(0.205 0 0);\\n --destructive: oklch(0.577 0.245 27.325);\\n --border: oklch(0.922 0 0);\\n --input: oklch(0.922 0 0);\\n --ring: oklch(0.708 0 0);\\n --chart-1: oklch(0.646 0.222 41.116);\\n --chart-2: oklch(0.6 0.118 184.704);\\n --chart-3: oklch(0.398 0.07 227.392);\\n --chart-4: oklch(0.828 0.189 84.429);\\n --chart-5: oklch(0.769 0.188 70.08);\\n --sidebar: oklch(0.985 0 0);\\n --sidebar-foreground: oklch(0.145 0 0);\\n --sidebar-primary: oklch(0.205 0 0);\\n --sidebar-primary-foreground: oklch(0.985 0 0);\\n --sidebar-accent: oklch(0.97 0 0);\\n --sidebar-accent-foreground: oklch(0.205 0 0);\\n --sidebar-border: oklch(0.922 0 0);\\n --sidebar-ring: oklch(0.708 0 0);\\n}\\n.dark {\\n --background: oklch(0.145 0 0);\\n --foreground: oklch(0.985 0 0);\\n --card: oklch(0.205 0 0);\\n --card-foreground: oklch(0.985 0 0);\\n --popover: oklch(0.205 0 0);\\n --popover-foreground: oklch(0.985 0 0);\\n --primary: oklch(0.922 0 0);\\n --primary-foreground: oklch(0.205 0 0);\\n --secondary: oklch(0.269 0 0);\\n --secondary-foreground: oklch(0.985 0 0);\\n --muted: oklch(0.269 0 0);\\n --muted-foreground: oklch(0.708 0 0);\\n --accent: oklch(0.269 0 0);\\n --accent-foreground: oklch(0.985 0 0);\\n --destructive: oklch(0.704 0.191 22.216);\\n --border: oklch(1 0 0 / 10%);\\n --input: oklch(1 0 0 / 15%);\\n --ring: oklch(0.556 0 0);\\n --chart-1: oklch(0.488 0.243 264.376);\\n --chart-2: oklch(0.696 0.17 162.48);\\n --chart-3: oklch(0.769 0.188 70.08);\\n --chart-4: oklch(0.627 0.265 303.9);\\n --chart-5: oklch(0.645 0.246 16.439);\\n --sidebar: oklch(0.205 0 0);\\n --sidebar-foreground: oklch(0.985 0 0);\\n --sidebar-primary: oklch(0.488 0.243 264.376);\\n --sidebar-primary-foreground: oklch(0.985 0 0);\\n --sidebar-accent: oklch(0.269 0 0);\\n --sidebar-accent-foreground: oklch(0.985 0 0);\\n --sidebar-border: oklch(1 0 0 / 10%);\\n --sidebar-ring: oklch(0.556 0 0);\\n}\\n@layer base {\\n * {\\n border-color: var(--border);\\n outline-color: var(--ring);\\n @supports (color: color-mix(in lab, red, red)) {\\n outline-color: color-mix(in oklab, var(--ring) 50%, transparent);\\n }\\n }\\n body {\\n background-color: var(--background);\\n color: var(--foreground);\\n }\\n}\\n@property --tw-translate-x { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-translate-y { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-translate-z { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-scale-x { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-scale-y { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-scale-z { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-rotate-x { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-rotate-y { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-rotate-z { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-skew-x { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-skew-y { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-border-style { syntax: \\\"*\\\"; inherits: false; initial-value: solid; }\\n@property --tw-gradient-position { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-from { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-via { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-to { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-stops { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-via-stops { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-from-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 0%; }\\n@property --tw-gradient-via-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 50%; }\\n@property --tw-gradient-to-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-inset-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-inset-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-inset-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-ring-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-ring-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-inset-ring-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-inset-ring-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-ring-inset { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-ring-offset-width { syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px; }\\n@property --tw-ring-offset-color { syntax: \\\"*\\\"; inherits: false; initial-value: #fff; }\\n@property --tw-ring-offset-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-blur { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-brightness { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-contrast { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-grayscale { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-hue-rotate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-invert { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-opacity { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-saturate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-sepia { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-drop-shadow-size { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-blur { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-brightness { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-contrast { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-grayscale { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-hue-rotate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-invert { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-opacity { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-saturate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-sepia { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-duration { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-ease { syntax: \\\"*\\\"; inherits: false; }\\n@layer properties {\\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\\n *,\\n ::before,\\n ::after,\\n ::backdrop {\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-translate-z: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-scale-z: 1;\\n --tw-rotate-x: initial;\\n --tw-rotate-y: initial;\\n --tw-rotate-z: initial;\\n --tw-skew-x: initial;\\n --tw-skew-y: initial;\\n --tw-border-style: solid;\\n --tw-gradient-position: initial;\\n --tw-gradient-from: #0000;\\n --tw-gradient-via: #0000;\\n --tw-gradient-to: #0000;\\n --tw-gradient-stops: initial;\\n --tw-gradient-via-stops: initial;\\n --tw-gradient-from-position: 0%;\\n --tw-gradient-via-position: 50%;\\n --tw-gradient-to-position: 100%;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-color: initial;\\n --tw-shadow-alpha: 100%;\\n --tw-inset-shadow: 0 0 #0000;\\n --tw-inset-shadow-color: initial;\\n --tw-inset-shadow-alpha: 100%;\\n --tw-ring-color: initial;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-inset-ring-color: initial;\\n --tw-inset-ring-shadow: 0 0 #0000;\\n --tw-ring-inset: initial;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-blur: initial;\\n --tw-brightness: initial;\\n --tw-contrast: initial;\\n --tw-grayscale: initial;\\n --tw-hue-rotate: initial;\\n --tw-invert: initial;\\n --tw-opacity: initial;\\n --tw-saturate: initial;\\n --tw-sepia: initial;\\n --tw-drop-shadow: initial;\\n --tw-drop-shadow-color: initial;\\n --tw-drop-shadow-alpha: 100%;\\n --tw-drop-shadow-size: initial;\\n --tw-backdrop-blur: initial;\\n --tw-backdrop-brightness: initial;\\n --tw-backdrop-contrast: initial;\\n --tw-backdrop-grayscale: initial;\\n --tw-backdrop-hue-rotate: initial;\\n --tw-backdrop-invert: initial;\\n --tw-backdrop-opacity: initial;\\n --tw-backdrop-saturate: initial;\\n --tw-backdrop-sepia: initial;\\n --tw-duration: initial;\\n --tw-ease: initial;\\n --tw-animation-delay: 0s;\\n --tw-animation-direction: normal;\\n --tw-animation-duration: initial;\\n --tw-animation-fill-mode: none;\\n --tw-animation-iteration-count: 1;\\n --tw-enter-blur: 0;\\n --tw-enter-opacity: 1;\\n --tw-enter-rotate: 0;\\n --tw-enter-scale: 1;\\n --tw-enter-translate-x: 0;\\n --tw-enter-translate-y: 0;\\n --tw-exit-blur: 0;\\n --tw-exit-opacity: 1;\\n --tw-exit-rotate: 0;\\n --tw-exit-scale: 1;\\n --tw-exit-translate-x: 0;\\n --tw-exit-translate-y: 0;\\n }\\n }\\n}\\n\")","\"use client\";\nimport \"../styles/viewer.css\";\n\nimport * as React from \"react\";\n\nimport { PGSGViewer } from \"../viewer/pgsg-viewer\";\nimport PGSGViewerControls from \"./PGSGViewControls\";\n\nexport type PGSGCanvasProps = {\n src: string;\n className?: string;\n onReady?: (viewer: PGSGViewer) => void;\n type?: \"pgsg\" | \"ply\";\n colliderSrc?: string;\n};\n\nexport function PGSGCanvas({\n src,\n type = \"pgsg\",\n className,\n onReady,\n colliderSrc,\n}: PGSGCanvasProps) {\n const ref = React.useRef<HTMLDivElement | null>(null);\n const viewRef = React.useRef<PGSGViewer | null>(null);\n\n React.useEffect(() => {\n if (!ref.current) return;\n\n const viewer = new PGSGViewer({\n container: ref.current,\n source: { type: type, url: src },\n colliderSource: colliderSrc,\n debug: true,\n viewerType: \"three\",\n });\n\n viewRef.current = viewer;\n\n viewer.load().then(() => {\n onReady?.(viewer);\n });\n\n return () => {\n viewer.destroy();\n viewRef.current = null;\n };\n }, [src, type, colliderSrc]);\n\n return (\n <div\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n }}\n >\n <div\n ref={ref}\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n }}\n />\n\n <PGSGViewerControls\n viewer={viewRef.current as any}\n className=\"absolute top-6 right-6\"\n />\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Rotate3D,\n RulerDimensionLine,\n Footprints,\n Icon,\n ChevronLeft,\n X,\n} from \"lucide-react\";\nimport { floorPlan } from \"@lucide/lab\";\n\nimport { PGSGViewer } from \"@/src/viewer/pgsg-viewer\";\nimport { type CameraMode } from \"@/src/viewers/types\";\nimport { cn, glass } from \"@/src/lib/utils\";\n\nexport function PGSGViewerMode({ viewer }: { viewer: PGSGViewer | null }) {\n const [mode, setMode] = React.useState<CameraMode>(\"orbit\");\n const [open, setOpen] = React.useState(false);\n\n const choose = (m: CameraMode) => {\n if (!viewer) return null;\n viewer.setCameraMode(m);\n setMode(m);\n setOpen(false);\n };\n\n React.useEffect(() => {\n if (!open) return;\n\n const onDown = (e: PointerEvent) => {\n const t = e.target as HTMLElement | null;\n if (!t?.closest(\"[data-pgsg-controls]\")) setOpen(false);\n };\n\n window.addEventListener(\"pointerdown\", onDown, { capture: true });\n return () =>\n window.removeEventListener(\"pointerdown\", onDown, {\n capture: true,\n } as any);\n }, [open]);\n\n let icon = null;\n switch (mode) {\n case \"walk\":\n icon = <Footprints className=\"size-5 text-white\" />;\n break;\n case \"orbit\":\n icon = <Rotate3D className=\"size-5 text-white\" />;\n break;\n case \"floorplan\":\n icon = <Icon iconNode={floorPlan} className=\"size-5 text-white\" />;\n break;\n case \"measure\":\n icon = <RulerDimensionLine className=\"size-5 text-white\" />;\n break;\n default:\n icon = <Rotate3D className=\"size-5 text-white\" />;\n break;\n }\n\n return (\n <div className=\"absolute bottom-6 right-6 z-50 pointer-events-none w-1/2\">\n <div\n data-pgsg-controls\n className=\"relative flex items-center flex-row-reverse overflow-hidden pointer-events-auto\"\n >\n <div\n className={cn(\n glass,\n \"p-3 rounded-full pointer-events-auto z-100 shadow-lg shadow-white/10\",\n )}\n >\n {icon}\n </div>\n\n <div\n className={cn(\n \"flex items-center pointer-events-auto h-full overflow-hidden\",\n )}\n >\n <div\n className={cn(\n \"flex items-center h-full transition-all duration-300 ease-out\",\n open\n ? \"opacity-100 translate-x-full scale-95 pointer-events-none\"\n : \"opacity-100 translate-x-0 scale-100\",\n )}\n >\n <button\n onClick={() => setOpen(!open)}\n className=\"p-2.5 rounded-full pointer-events-auto\"\n >\n <ChevronLeft className=\"size-5 text-white\" />\n </button>\n </div>\n <div\n className={cn(\n glass,\n \"flex flex-row-reverse items-center gap-1.5 absolute bottom-0 right-0 h-full rounded-full pointer-events-auto transition-all duration-300 ease-out overflow-hidden pr-14 pl-2 shadow-none\",\n open\n ? \"opacity-100 translate-x-0 scale-100 max-w-[520px]\"\n : \"opacity-0 translate-x-6 scale-95 pointer-events-none max-w-0\",\n )}\n >\n <button\n onClick={() => choose(\"walk\")}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto transition-all duration-300 ease-out\",\n mode === \"walk\"\n ? \"bg-white/10 cursor-default\"\n : \"hover:bg-white/10 cursor-pointer\",\n )}\n >\n <Footprints className=\"size-4 text-white\" />\n </button>\n <button\n onClick={() => choose(\"orbit\")}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto transition-all duration-300 ease-out\",\n mode === \"orbit\"\n ? \"bg-white/10 cursor-default\"\n : \"hover:bg-white/10 cursor-pointer\",\n )}\n >\n <Rotate3D className=\"size-4 text-white\" />\n </button>\n <button\n onClick={() => choose(\"floorplan\")}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto transition-all duration-300 ease-out\",\n mode === \"floorplan\"\n ? \"bg-white/10 cursor-default\"\n : \"hover:bg-white/10 cursor-pointer\",\n )}\n >\n <Icon iconNode={floorPlan} className=\"size-4 text-white\" />\n </button>\n <button\n onClick={() => setMode(\"measure\")}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto transition-all duration-300 ease-out\",\n mode === \"measure\"\n ? \"bg-white/10 cursor-default\"\n : \"hover:bg-white/10 cursor-pointer\",\n )}\n >\n <RulerDimensionLine className=\"size-4 text-white\" />\n </button>\n <button\n onClick={() => setOpen(false)}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto delay-200 transition-opacity duration-200 ease-out cursor-pointer\",\n open ? \"opacity-100\" : \"opacity-0 pointer-events-none\",\n )}\n >\n <X className=\"size-4 text-white/60\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const glass =\n \"bg-gradient-to-br from-white/20 to-white/5 dark:from-white/10 dark:to-transparent backdrop-blur-2xl border border-white/20 shadow-[0_8px_32px_rgba(0,0,0,0.25)]\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Settings } from \"lucide-react\";\n\nimport { PGSGThreeViewer } from \"@/src/viewers/three\";\nimport { cn, glass } from \"@/src/lib/utils\";\n\nexport function PGSGViewerSettings({\n viewer,\n className,\n}: {\n viewer: PGSGThreeViewer | null;\n className?: string;\n}) {\n const [open, setOpen] = React.useState(false);\n const [grid, setGrid] = React.useState(false);\n\n if (!viewer) return null;\n\n return (\n <div className={\"absolute top-6 right-6 z-50 pointer-events-none\"}>\n <button\n onClick={() => setOpen(!open)}\n className={cn(glass, \"p-2.5 rounded-full pointer-events-auto\")}\n >\n <Settings className=\"size-4 text-white\" />\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport { PGSGViewer } from \"../core\";\nimport { PGSGThreeViewer } from \"../viewers/three\";\nimport { PGSGViewerMode } from \"./controls/PGSGViewerMode\";\nimport { PGSGViewerSettings } from \"./controls/PGSGViewerSettings\";\n\nexport default function PGSGViewerControls({\n viewer,\n className,\n}: {\n viewer: PGSGThreeViewer | null;\n className?: string;\n}) {\n if (!viewer) return null;\n\n return (\n <>\n <PGSGViewerMode viewer={viewer as unknown as PGSGViewer} />\n <PGSGViewerSettings viewer={viewer} />\n </>\n );\n}\n"],"mappings":";;;;;AACyB,SAAR,YAA6B,KAAK,EAAE,SAAS,IAAI,CAAC,GAAG;AAC1D,MAAI,CAAC,OAAO,OAAO,aAAa,YAAa;AAE7C,QAAM,OAAO,SAAS,QAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC;AACrE,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,OAAO;AAEb,MAAI,aAAa,OAAO;AACtB,QAAI,KAAK,YAAY;AACnB,WAAK,aAAa,OAAO,KAAK,UAAU;AAAA,IAC1C,OAAO;AACL,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF,OAAO;AACL,SAAK,YAAY,KAAK;AAAA,EACxB;AAEA,MAAI,MAAM,YAAY;AACpB,UAAM,WAAW,UAAU;AAAA,EAC7B,OAAO;AACL,UAAM,YAAY,SAAS,eAAe,GAAG,CAAC;AAAA,EAChD;AACF;;;ACvB8B,YAAY,28xBAA2nyB;;;ACG/qyB,YAAYA,YAAW;;;ACDvB,YAAY,WAAW;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;;;ACX1B,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,IAAM,QACX;AAEK,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADsCa,cAmDH,YAnDG;AA7BN,SAAS,eAAe,EAAE,OAAO,GAAkC;AACxE,QAAM,CAAC,MAAM,OAAO,IAAU,eAAqB,OAAO;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAU,eAAS,KAAK;AAE5C,QAAM,SAAS,CAAC,MAAkB;AAChC,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,cAAc,CAAC;AACtB,YAAQ,CAAC;AACT,YAAQ,KAAK;AAAA,EACf;AAEA,EAAM,gBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AAEX,UAAM,SAAS,CAAC,MAAoB;AAClC,YAAM,IAAI,EAAE;AACZ,UAAI,CAAC,GAAG,QAAQ,sBAAsB,EAAG,SAAQ,KAAK;AAAA,IACxD;AAEA,WAAO,iBAAiB,eAAe,QAAQ,EAAE,SAAS,KAAK,CAAC;AAChE,WAAO,MACL,OAAO,oBAAoB,eAAe,QAAQ;AAAA,MAChD,SAAS;AAAA,IACX,CAAQ;AAAA,EACZ,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,OAAO;AACX,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,oBAAC,cAAW,WAAU,qBAAoB;AACjD;AAAA,IACF,KAAK;AACH,aAAO,oBAAC,YAAS,WAAU,qBAAoB;AAC/C;AAAA,IACF,KAAK;AACH,aAAO,oBAAC,QAAK,UAAU,WAAW,WAAU,qBAAoB;AAChE;AAAA,IACF,KAAK;AACH,aAAO,oBAAC,sBAAmB,WAAU,qBAAoB;AACzD;AAAA,IACF;AACE,aAAO,oBAAC,YAAS,WAAU,qBAAoB;AAC/C;AAAA,EACJ;AAEA,SACE,oBAAC,SAAI,WAAU,4DACb;AAAA,IAAC;AAAA;AAAA,MACC,sBAAkB;AAAA,MAClB,WAAU;AAAA,MAEV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,YACF;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,OACI,8DACA;AAAA,kBACN;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,sBAC5B,WAAU;AAAA,sBAEV,8BAAC,eAAY,WAAU,qBAAoB;AAAA;AAAA,kBAC7C;AAAA;AAAA,cACF;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,oBACA,OACI,sDACA;AAAA,kBACN;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS,MAAM,OAAO,MAAM;AAAA,wBAC5B,WAAW;AAAA,0BACT;AAAA,0BACA,SAAS,SACL,+BACA;AAAA,wBACN;AAAA,wBAEA,8BAAC,cAAW,WAAU,qBAAoB;AAAA;AAAA,oBAC5C;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS,MAAM,OAAO,OAAO;AAAA,wBAC7B,WAAW;AAAA,0BACT;AAAA,0BACA,SAAS,UACL,+BACA;AAAA,wBACN;AAAA,wBAEA,8BAAC,YAAS,WAAU,qBAAoB;AAAA;AAAA,oBAC1C;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS,MAAM,OAAO,WAAW;AAAA,wBACjC,WAAW;AAAA,0BACT;AAAA,0BACA,SAAS,cACL,+BACA;AAAA,wBACN;AAAA,wBAEA,8BAAC,QAAK,UAAU,WAAW,WAAU,qBAAoB;AAAA;AAAA,oBAC3D;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS,MAAM,QAAQ,SAAS;AAAA,wBAChC,WAAW;AAAA,0BACT;AAAA,0BACA,SAAS,YACL,+BACA;AAAA,wBACN;AAAA,wBAEA,8BAAC,sBAAmB,WAAU,qBAAoB;AAAA;AAAA,oBACpD;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS,MAAM,QAAQ,KAAK;AAAA,wBAC5B,WAAW;AAAA,0BACT;AAAA,0BACA,OAAO,gBAAgB;AAAA,wBACzB;AAAA,wBAEA,8BAAC,KAAE,WAAU,wBAAuB;AAAA;AAAA,oBACtC;AAAA;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;AElKA,YAAYC,YAAW;AACvB,SAAS,gBAAgB;AAuBjB,gBAAAC,YAAA;AAlBD,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,KAAK;AAC5C,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,KAAK;AAE5C,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,gBAAAA,KAAC,SAAI,WAAW,mDACd,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,MAC5B,WAAW,GAAG,OAAO,wCAAwC;AAAA,MAE7D,0BAAAA,KAAC,YAAS,WAAU,qBAAoB;AAAA;AAAA,EAC1C,GACF;AAEJ;;;ACbI,mBACE,OAAAC,MADF,QAAAC,aAAA;AAVW,SAAR,mBAAoC;AAAA,EACzC;AAAA,EACA;AACF,GAGG;AACD,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,gBAAAA,MAAA,YACE;AAAA,oBAAAD,KAAC,kBAAe,QAAyC;AAAA,IACzD,gBAAAA,KAAC,sBAAmB,QAAgB;AAAA,KACtC;AAEJ;;;AJ4BI,SAOE,OAAAE,MAPF,QAAAC,aAAA;AAlCG,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,MAAY,cAA8B,IAAI;AACpD,QAAM,UAAgB,cAA0B,IAAI;AAEpD,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,IAAI,QAAS;AAElB,UAAM,SAAS,IAAI,WAAW;AAAA,MAC5B,WAAW,IAAI;AAAA,MACf,QAAQ,EAAE,MAAY,KAAK,IAAI;AAAA,MAC/B,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,YAAY;AAAA,IACd,CAAC;AAED,YAAQ,UAAU;AAElB,WAAO,KAAK,EAAE,KAAK,MAAM;AACvB,gBAAU,MAAM;AAAA,IAClB,CAAC;AAED,WAAO,MAAM;AACX,aAAO,QAAQ;AACf,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,KAAK,MAAM,WAAW,CAAC;AAE3B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,YACV;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,QAAQ;AAAA,YAChB,WAAU;AAAA;AAAA,QACZ;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["React","React","jsx","jsx","jsxs","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["#style-inject:#style-inject","../../src/styles/viewer.css","../../src/react/PGSGCanvas.tsx","../../src/react/PGSGViewControls.tsx","../../src/lib/utils.ts","../../src/react/controls/PGSGViewer3D.tsx","../../src/react/controls/PGSGViewerMode.tsx","../../src/react/controls/PGSGViewerSettings.tsx","../../src/react/controls/PGSGViewer3DSheet.tsx"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */\\n@layer properties;\\n@layer theme, base, components, utilities;\\n@layer theme {\\n :root,\\n :host {\\n --font-sans:\\n ui-sans-serif,\\n system-ui,\\n sans-serif,\\n \\\"Apple Color Emoji\\\",\\n \\\"Segoe UI Emoji\\\",\\n \\\"Segoe UI Symbol\\\",\\n \\\"Noto Color Emoji\\\";\\n --font-mono:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n --color-blue-500: oklch(62.3% 0.214 259.815);\\n --color-blue-600: oklch(54.6% 0.245 262.881);\\n --color-black: #000;\\n --color-white: #fff;\\n --spacing: 0.25rem;\\n --text-sm: 0.875rem;\\n --text-sm--line-height: calc(1.25 / 0.875);\\n --text-base: 1rem;\\n --text-base--line-height: calc(1.5 / 1);\\n --text-lg: 1.125rem;\\n --text-lg--line-height: calc(1.75 / 1.125);\\n --font-weight-normal: 400;\\n --font-weight-medium: 500;\\n --font-weight-semibold: 600;\\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\\n --animate-spin: spin 1s linear infinite;\\n --blur-2xl: 40px;\\n --default-transition-duration: 150ms;\\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n --default-font-family: var(--font-sans);\\n --default-mono-font-family: var(--font-mono);\\n }\\n}\\n@layer base {\\n *,\\n ::after,\\n ::before,\\n ::backdrop,\\n ::file-selector-button {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n border: 0 solid;\\n }\\n html,\\n :host {\\n line-height: 1.5;\\n -webkit-text-size-adjust: 100%;\\n tab-size: 4;\\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");\\n font-feature-settings: var(--default-font-feature-settings, normal);\\n font-variation-settings: var(--default-font-variation-settings, normal);\\n -webkit-tap-highlight-color: transparent;\\n }\\n hr {\\n height: 0;\\n color: inherit;\\n border-top-width: 1px;\\n }\\n abbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n }\\n h1,\\n h2,\\n h3,\\n h4,\\n h5,\\n h6 {\\n font-size: inherit;\\n font-weight: inherit;\\n }\\n a {\\n color: inherit;\\n -webkit-text-decoration: inherit;\\n text-decoration: inherit;\\n }\\n b,\\n strong {\\n font-weight: bolder;\\n }\\n code,\\n kbd,\\n samp,\\n pre {\\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);\\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\\n font-size: 1em;\\n }\\n small {\\n font-size: 80%;\\n }\\n sub,\\n sup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n }\\n sub {\\n bottom: -0.25em;\\n }\\n sup {\\n top: -0.5em;\\n }\\n table {\\n text-indent: 0;\\n border-color: inherit;\\n border-collapse: collapse;\\n }\\n :-moz-focusring {\\n outline: auto;\\n }\\n progress {\\n vertical-align: baseline;\\n }\\n summary {\\n display: list-item;\\n }\\n ol,\\n ul,\\n menu {\\n list-style: none;\\n }\\n img,\\n svg,\\n video,\\n canvas,\\n audio,\\n iframe,\\n embed,\\n object {\\n display: block;\\n vertical-align: middle;\\n }\\n img,\\n video {\\n max-width: 100%;\\n height: auto;\\n }\\n button,\\n input,\\n select,\\n optgroup,\\n textarea,\\n ::file-selector-button {\\n font: inherit;\\n font-feature-settings: inherit;\\n font-variation-settings: inherit;\\n letter-spacing: inherit;\\n color: inherit;\\n border-radius: 0;\\n background-color: transparent;\\n opacity: 1;\\n }\\n :where(select:is([multiple], [size])) optgroup {\\n font-weight: bolder;\\n }\\n :where(select:is([multiple], [size])) optgroup option {\\n padding-inline-start: 20px;\\n }\\n ::file-selector-button {\\n margin-inline-end: 4px;\\n }\\n ::placeholder {\\n opacity: 1;\\n }\\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\\n ::placeholder {\\n color: currentcolor;\\n @supports (color: color-mix(in lab, red, red)) {\\n color: color-mix(in oklab, currentcolor 50%, transparent);\\n }\\n }\\n }\\n textarea {\\n resize: vertical;\\n }\\n ::-webkit-search-decoration {\\n -webkit-appearance: none;\\n }\\n ::-webkit-date-and-time-value {\\n min-height: 1lh;\\n text-align: inherit;\\n }\\n ::-webkit-datetime-edit {\\n display: inline-flex;\\n }\\n ::-webkit-datetime-edit-fields-wrapper {\\n padding: 0;\\n }\\n ::-webkit-datetime-edit,\\n ::-webkit-datetime-edit-year-field,\\n ::-webkit-datetime-edit-month-field,\\n ::-webkit-datetime-edit-day-field,\\n ::-webkit-datetime-edit-hour-field,\\n ::-webkit-datetime-edit-minute-field,\\n ::-webkit-datetime-edit-second-field,\\n ::-webkit-datetime-edit-millisecond-field,\\n ::-webkit-datetime-edit-meridiem-field {\\n padding-block: 0;\\n }\\n ::-webkit-calendar-picker-indicator {\\n line-height: 1;\\n }\\n :-moz-ui-invalid {\\n box-shadow: none;\\n }\\n button,\\n input:where([type=button], [type=reset], [type=submit]),\\n ::file-selector-button {\\n appearance: button;\\n }\\n ::-webkit-inner-spin-button,\\n ::-webkit-outer-spin-button {\\n height: auto;\\n }\\n [hidden]:where(:not([hidden=until-found])) {\\n display: none !important;\\n }\\n}\\n@layer utilities {\\n .pointer-events-auto {\\n pointer-events: auto;\\n }\\n .pointer-events-none {\\n pointer-events: none;\\n }\\n .invisible {\\n visibility: hidden;\\n }\\n .visible {\\n visibility: visible;\\n }\\n .absolute {\\n position: absolute;\\n }\\n .relative {\\n position: relative;\\n }\\n .static {\\n position: static;\\n }\\n .start {\\n inset-inline-start: var(--spacing);\\n }\\n .end {\\n inset-inline-end: var(--spacing);\\n }\\n .top-0 {\\n top: calc(var(--spacing) * 0);\\n }\\n .right-0 {\\n right: calc(var(--spacing) * 0);\\n }\\n .bottom-0 {\\n bottom: calc(var(--spacing) * 0);\\n }\\n .z-50 {\\n z-index: 50;\\n }\\n .z-100 {\\n z-index: 100;\\n }\\n .container {\\n width: 100%;\\n @media (width >= 40rem) {\\n max-width: 40rem;\\n }\\n @media (width >= 48rem) {\\n max-width: 48rem;\\n }\\n @media (width >= 64rem) {\\n max-width: 64rem;\\n }\\n @media (width >= 80rem) {\\n max-width: 80rem;\\n }\\n @media (width >= 96rem) {\\n max-width: 96rem;\\n }\\n }\\n .mt-2 {\\n margin-top: calc(var(--spacing) * 2);\\n }\\n .mt-4 {\\n margin-top: calc(var(--spacing) * 4);\\n }\\n .mb-2 {\\n margin-bottom: calc(var(--spacing) * 2);\\n }\\n .block {\\n display: block;\\n }\\n .flex {\\n display: flex;\\n }\\n .grid {\\n display: grid;\\n }\\n .size-4 {\\n width: calc(var(--spacing) * 4);\\n height: calc(var(--spacing) * 4);\\n }\\n .size-5 {\\n width: calc(var(--spacing) * 5);\\n height: calc(var(--spacing) * 5);\\n }\\n .h-\\\\[320px\\\\] {\\n height: 320px;\\n }\\n .h-full {\\n height: 100%;\\n }\\n .max-h-\\\\[60px\\\\] {\\n max-height: 60px;\\n }\\n .w-0 {\\n width: calc(var(--spacing) * 0);\\n }\\n .w-\\\\[360px\\\\] {\\n width: 360px;\\n }\\n .w-full {\\n width: 100%;\\n }\\n .max-w-0 {\\n max-width: calc(var(--spacing) * 0);\\n }\\n .max-w-\\\\[300px\\\\] {\\n max-width: 300px;\\n }\\n .max-w-\\\\[520px\\\\] {\\n max-width: 520px;\\n }\\n .flex-1 {\\n flex: 1;\\n }\\n .translate-x-0 {\\n --tw-translate-x: calc(var(--spacing) * 0);\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .translate-x-6 {\\n --tw-translate-x: calc(var(--spacing) * 6);\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .translate-x-full {\\n --tw-translate-x: 100%;\\n translate: var(--tw-translate-x) var(--tw-translate-y);\\n }\\n .scale-95 {\\n --tw-scale-x: 95%;\\n --tw-scale-y: 95%;\\n --tw-scale-z: 95%;\\n scale: var(--tw-scale-x) var(--tw-scale-y);\\n }\\n .scale-100 {\\n --tw-scale-x: 100%;\\n --tw-scale-y: 100%;\\n --tw-scale-z: 100%;\\n scale: var(--tw-scale-x) var(--tw-scale-y);\\n }\\n .transform {\\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\\n }\\n .animate-spin {\\n animation: var(--animate-spin);\\n }\\n .cursor-default {\\n cursor: default;\\n }\\n .cursor-pointer {\\n cursor: pointer;\\n }\\n .resize-none {\\n resize: none;\\n }\\n .flex-col {\\n flex-direction: column;\\n }\\n .flex-row {\\n flex-direction: row;\\n }\\n .flex-row-reverse {\\n flex-direction: row-reverse;\\n }\\n .flex-wrap {\\n flex-wrap: wrap;\\n }\\n .items-center {\\n align-items: center;\\n }\\n .items-end {\\n align-items: flex-end;\\n }\\n .items-stretch {\\n align-items: stretch;\\n }\\n .justify-between {\\n justify-content: space-between;\\n }\\n .justify-center {\\n justify-content: center;\\n }\\n .gap-1 {\\n gap: calc(var(--spacing) * 1);\\n }\\n .gap-1\\\\.5 {\\n gap: calc(var(--spacing) * 1.5);\\n }\\n .gap-2 {\\n gap: calc(var(--spacing) * 2);\\n }\\n .gap-3 {\\n gap: calc(var(--spacing) * 3);\\n }\\n .overflow-hidden {\\n overflow: hidden;\\n }\\n .rounded-full {\\n border-radius: calc(infinity * 1px);\\n }\\n .rounded-md {\\n border-radius: calc(var(--radius) - 2px);\\n }\\n .border {\\n border-style: var(--tw-border-style);\\n border-width: 1px;\\n }\\n .border-l {\\n border-left-style: var(--tw-border-style);\\n border-left-width: 1px;\\n }\\n .border-black\\\\/20 {\\n border-color: color-mix(in srgb, #000 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n border-color: color-mix(in oklab, var(--color-black) 20%, transparent);\\n }\\n }\\n .border-white\\\\/10 {\\n border-color: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n border-color: color-mix(in oklab, var(--color-white) 10%, transparent);\\n }\\n }\\n .border-white\\\\/20 {\\n border-color: color-mix(in srgb, #fff 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n border-color: color-mix(in oklab, var(--color-white) 20%, transparent);\\n }\\n }\\n .border-l-white\\\\/1 {\\n border-left-color: color-mix(in srgb, #fff 1%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n border-left-color: color-mix(in oklab, var(--color-white) 1%, transparent);\\n }\\n }\\n .bg-\\\\[rgba\\\\(15\\\\,15\\\\,15\\\\,0\\\\.9\\\\)\\\\] {\\n background-color: rgba(15, 15, 15, 0.9);\\n }\\n .bg-blue-500 {\\n background-color: var(--color-blue-500);\\n }\\n .bg-transparent {\\n background-color: transparent;\\n }\\n .bg-white\\\\/10 {\\n background-color: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-white) 10%, transparent);\\n }\\n }\\n .bg-linear-to-br {\\n --tw-gradient-position: to bottom right;\\n @supports (background-image: linear-gradient(in lab, red, red)) {\\n --tw-gradient-position: to bottom right in oklab;\\n }\\n background-image: linear-gradient(var(--tw-gradient-stops));\\n }\\n .bg-gradient-to-br {\\n --tw-gradient-position: to bottom right in oklab;\\n background-image: linear-gradient(var(--tw-gradient-stops));\\n }\\n .from-black\\\\/20 {\\n --tw-gradient-from: color-mix(in srgb, #000 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-from: color-mix(in oklab, var(--color-black) 20%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n .from-white\\\\/20 {\\n --tw-gradient-from: color-mix(in srgb, #fff 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-from: color-mix(in oklab, var(--color-white) 20%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n .to-transparent {\\n --tw-gradient-to: transparent;\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n .to-white\\\\/5 {\\n --tw-gradient-to: color-mix(in srgb, #fff 5%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-to: color-mix(in oklab, var(--color-white) 5%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n .object-cover {\\n object-fit: cover;\\n }\\n .p-2\\\\.5 {\\n padding: calc(var(--spacing) * 2.5);\\n }\\n .p-3 {\\n padding: calc(var(--spacing) * 3);\\n }\\n .p-3\\\\.5 {\\n padding: calc(var(--spacing) * 3.5);\\n }\\n .px-2 {\\n padding-inline: calc(var(--spacing) * 2);\\n }\\n .px-3 {\\n padding-inline: calc(var(--spacing) * 3);\\n }\\n .py-1 {\\n padding-block: calc(var(--spacing) * 1);\\n }\\n .py-1\\\\.5 {\\n padding-block: calc(var(--spacing) * 1.5);\\n }\\n .py-2 {\\n padding-block: calc(var(--spacing) * 2);\\n }\\n .pr-2 {\\n padding-right: calc(var(--spacing) * 2);\\n }\\n .pr-14 {\\n padding-right: calc(var(--spacing) * 14);\\n }\\n .pb-2\\\\.5 {\\n padding-bottom: calc(var(--spacing) * 2.5);\\n }\\n .pl-2 {\\n padding-left: calc(var(--spacing) * 2);\\n }\\n .text-base {\\n font-size: var(--text-base);\\n line-height: var(--tw-leading, var(--text-base--line-height));\\n }\\n .text-lg {\\n font-size: var(--text-lg);\\n line-height: var(--tw-leading, var(--text-lg--line-height));\\n }\\n .text-sm {\\n font-size: var(--text-sm);\\n line-height: var(--tw-leading, var(--text-sm--line-height));\\n }\\n .font-medium {\\n --tw-font-weight: var(--font-weight-medium);\\n font-weight: var(--font-weight-medium);\\n }\\n .font-normal {\\n --tw-font-weight: var(--font-weight-normal);\\n font-weight: var(--font-weight-normal);\\n }\\n .font-semibold {\\n --tw-font-weight: var(--font-weight-semibold);\\n font-weight: var(--font-weight-semibold);\\n }\\n .text-white {\\n color: var(--color-white);\\n }\\n .text-white\\\\/40 {\\n color: color-mix(in srgb, #fff 40%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n color: color-mix(in oklab, var(--color-white) 40%, transparent);\\n }\\n }\\n .text-white\\\\/60 {\\n color: color-mix(in srgb, #fff 60%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n color: color-mix(in oklab, var(--color-white) 60%, transparent);\\n }\\n }\\n .opacity-0 {\\n opacity: 0%;\\n }\\n .opacity-100 {\\n opacity: 100%;\\n }\\n .shadow-\\\\[0_8px_32px_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\] {\\n --tw-shadow: 0 8px 32px var(--tw-shadow-color, rgba(0,0,0,0.25));\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-lg {\\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-none {\\n --tw-shadow: 0 0 #0000;\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-white\\\\/10 {\\n --tw-shadow-color: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-white) 10%, transparent) var(--tw-shadow-alpha), transparent);\\n }\\n }\\n .blur {\\n --tw-blur: blur(8px);\\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\\n }\\n .filter {\\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\\n }\\n .backdrop-blur-2xl {\\n --tw-backdrop-blur: blur(var(--blur-2xl));\\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\\n }\\n .transition-all {\\n transition-property: all;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .transition-opacity {\\n transition-property: opacity;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .delay-200 {\\n transition-delay: 200ms;\\n }\\n .duration-200 {\\n --tw-duration: 200ms;\\n transition-duration: 200ms;\\n }\\n .duration-300 {\\n --tw-duration: 300ms;\\n transition-duration: 300ms;\\n }\\n .ease-out {\\n --tw-ease: var(--ease-out);\\n transition-timing-function: var(--ease-out);\\n }\\n .delay-200 {\\n animation-delay: calc(200*1ms);\\n animation-delay: .2s;\\n --tw-animation-delay: calc(200*1ms);\\n --tw-animation-delay: .2s;\\n }\\n .outline-none {\\n --tw-outline-style: none;\\n outline-style: none;\\n }\\n .running {\\n animation-play-state: running;\\n }\\n .hover\\\\:border-black\\\\/10 {\\n &:hover {\\n @media (hover: hover) {\\n border-color: color-mix(in srgb, #000 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n border-color: color-mix(in oklab, var(--color-black) 10%, transparent);\\n }\\n }\\n }\\n }\\n .hover\\\\:bg-blue-600 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: var(--color-blue-600);\\n }\\n }\\n }\\n .hover\\\\:bg-white\\\\/10 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-white) 10%, transparent);\\n }\\n }\\n }\\n }\\n .hover\\\\:bg-white\\\\/20 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: color-mix(in srgb, #fff 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-white) 20%, transparent);\\n }\\n }\\n }\\n }\\n .hover\\\\:from-black\\\\/20 {\\n &:hover {\\n @media (hover: hover) {\\n --tw-gradient-from: color-mix(in srgb, #000 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-from: color-mix(in oklab, var(--color-black) 20%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n }\\n }\\n .hover\\\\:to-transparent {\\n &:hover {\\n @media (hover: hover) {\\n --tw-gradient-to: transparent;\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n }\\n }\\n .disabled\\\\:opacity-50 {\\n &:disabled {\\n opacity: 50%;\\n }\\n }\\n .dark\\\\:border-white\\\\/20 {\\n &:is(.dark *) {\\n border-color: color-mix(in srgb, #fff 20%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n border-color: color-mix(in oklab, var(--color-white) 20%, transparent);\\n }\\n }\\n }\\n .dark\\\\:from-white\\\\/10 {\\n &:is(.dark *) {\\n --tw-gradient-from: color-mix(in srgb, #fff 10%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-from: color-mix(in oklab, var(--color-white) 10%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n }\\n .dark\\\\:to-transparent {\\n &:is(.dark *) {\\n --tw-gradient-to: transparent;\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n }\\n .dark\\\\:to-white\\\\/5 {\\n &:is(.dark *) {\\n --tw-gradient-to: color-mix(in srgb, #fff 5%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-gradient-to: color-mix(in oklab, var(--color-white) 5%, transparent);\\n }\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n }\\n}\\n@property --tw-animation-delay { syntax: \\\"*\\\"; inherits: false; initial-value: 0s; }\\n@property --tw-animation-direction { syntax: \\\"*\\\"; inherits: false; initial-value: normal; }\\n@property --tw-animation-duration { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-animation-fill-mode { syntax: \\\"*\\\"; inherits: false; initial-value: none; }\\n@property --tw-animation-iteration-count { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-enter-blur { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-enter-opacity { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-enter-rotate { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-enter-scale { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-enter-translate-x { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-enter-translate-y { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-exit-blur { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-exit-opacity { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-exit-rotate { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-exit-scale { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-exit-translate-x { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-exit-translate-y { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n:root {\\n --radius: 0.625rem;\\n --background: oklch(1 0 0);\\n --foreground: oklch(0.145 0 0);\\n --card: oklch(1 0 0);\\n --card-foreground: oklch(0.145 0 0);\\n --popover: oklch(1 0 0);\\n --popover-foreground: oklch(0.145 0 0);\\n --primary: oklch(0.205 0 0);\\n --primary-foreground: oklch(0.985 0 0);\\n --secondary: oklch(0.97 0 0);\\n --secondary-foreground: oklch(0.205 0 0);\\n --muted: oklch(0.97 0 0);\\n --muted-foreground: oklch(0.556 0 0);\\n --accent: oklch(0.97 0 0);\\n --accent-foreground: oklch(0.205 0 0);\\n --destructive: oklch(0.577 0.245 27.325);\\n --border: oklch(0.922 0 0);\\n --input: oklch(0.922 0 0);\\n --ring: oklch(0.708 0 0);\\n --chart-1: oklch(0.646 0.222 41.116);\\n --chart-2: oklch(0.6 0.118 184.704);\\n --chart-3: oklch(0.398 0.07 227.392);\\n --chart-4: oklch(0.828 0.189 84.429);\\n --chart-5: oklch(0.769 0.188 70.08);\\n --sidebar: oklch(0.985 0 0);\\n --sidebar-foreground: oklch(0.145 0 0);\\n --sidebar-primary: oklch(0.205 0 0);\\n --sidebar-primary-foreground: oklch(0.985 0 0);\\n --sidebar-accent: oklch(0.97 0 0);\\n --sidebar-accent-foreground: oklch(0.205 0 0);\\n --sidebar-border: oklch(0.922 0 0);\\n --sidebar-ring: oklch(0.708 0 0);\\n}\\n.dark {\\n --background: oklch(0.145 0 0);\\n --foreground: oklch(0.985 0 0);\\n --card: oklch(0.205 0 0);\\n --card-foreground: oklch(0.985 0 0);\\n --popover: oklch(0.205 0 0);\\n --popover-foreground: oklch(0.985 0 0);\\n --primary: oklch(0.922 0 0);\\n --primary-foreground: oklch(0.205 0 0);\\n --secondary: oklch(0.269 0 0);\\n --secondary-foreground: oklch(0.985 0 0);\\n --muted: oklch(0.269 0 0);\\n --muted-foreground: oklch(0.708 0 0);\\n --accent: oklch(0.269 0 0);\\n --accent-foreground: oklch(0.985 0 0);\\n --destructive: oklch(0.704 0.191 22.216);\\n --border: oklch(1 0 0 / 10%);\\n --input: oklch(1 0 0 / 15%);\\n --ring: oklch(0.556 0 0);\\n --chart-1: oklch(0.488 0.243 264.376);\\n --chart-2: oklch(0.696 0.17 162.48);\\n --chart-3: oklch(0.769 0.188 70.08);\\n --chart-4: oklch(0.627 0.265 303.9);\\n --chart-5: oklch(0.645 0.246 16.439);\\n --sidebar: oklch(0.205 0 0);\\n --sidebar-foreground: oklch(0.985 0 0);\\n --sidebar-primary: oklch(0.488 0.243 264.376);\\n --sidebar-primary-foreground: oklch(0.985 0 0);\\n --sidebar-accent: oklch(0.269 0 0);\\n --sidebar-accent-foreground: oklch(0.985 0 0);\\n --sidebar-border: oklch(1 0 0 / 10%);\\n --sidebar-ring: oklch(0.556 0 0);\\n}\\n@layer base {\\n * {\\n border-color: var(--border);\\n outline-color: var(--ring);\\n @supports (color: color-mix(in lab, red, red)) {\\n outline-color: color-mix(in oklab, var(--ring) 50%, transparent);\\n }\\n }\\n body {\\n background-color: var(--background);\\n color: var(--foreground);\\n }\\n}\\n@property --tw-translate-x { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-translate-y { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-translate-z { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-scale-x { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-scale-y { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-scale-z { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-rotate-x { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-rotate-y { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-rotate-z { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-skew-x { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-skew-y { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-border-style { syntax: \\\"*\\\"; inherits: false; initial-value: solid; }\\n@property --tw-gradient-position { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-from { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-via { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-to { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-stops { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-via-stops { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-from-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 0%; }\\n@property --tw-gradient-via-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 50%; }\\n@property --tw-gradient-to-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-font-weight { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-inset-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-inset-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-inset-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-ring-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-ring-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-inset-ring-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-inset-ring-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-ring-inset { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-ring-offset-width { syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px; }\\n@property --tw-ring-offset-color { syntax: \\\"*\\\"; inherits: false; initial-value: #fff; }\\n@property --tw-ring-offset-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-blur { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-brightness { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-contrast { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-grayscale { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-hue-rotate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-invert { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-opacity { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-saturate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-sepia { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-drop-shadow-size { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-blur { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-brightness { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-contrast { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-grayscale { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-hue-rotate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-invert { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-opacity { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-saturate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-backdrop-sepia { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-duration { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-ease { syntax: \\\"*\\\"; inherits: false; }\\n@keyframes spin {\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n@layer properties {\\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\\n *,\\n ::before,\\n ::after,\\n ::backdrop {\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-translate-z: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-scale-z: 1;\\n --tw-rotate-x: initial;\\n --tw-rotate-y: initial;\\n --tw-rotate-z: initial;\\n --tw-skew-x: initial;\\n --tw-skew-y: initial;\\n --tw-border-style: solid;\\n --tw-gradient-position: initial;\\n --tw-gradient-from: #0000;\\n --tw-gradient-via: #0000;\\n --tw-gradient-to: #0000;\\n --tw-gradient-stops: initial;\\n --tw-gradient-via-stops: initial;\\n --tw-gradient-from-position: 0%;\\n --tw-gradient-via-position: 50%;\\n --tw-gradient-to-position: 100%;\\n --tw-font-weight: initial;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-color: initial;\\n --tw-shadow-alpha: 100%;\\n --tw-inset-shadow: 0 0 #0000;\\n --tw-inset-shadow-color: initial;\\n --tw-inset-shadow-alpha: 100%;\\n --tw-ring-color: initial;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-inset-ring-color: initial;\\n --tw-inset-ring-shadow: 0 0 #0000;\\n --tw-ring-inset: initial;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-blur: initial;\\n --tw-brightness: initial;\\n --tw-contrast: initial;\\n --tw-grayscale: initial;\\n --tw-hue-rotate: initial;\\n --tw-invert: initial;\\n --tw-opacity: initial;\\n --tw-saturate: initial;\\n --tw-sepia: initial;\\n --tw-drop-shadow: initial;\\n --tw-drop-shadow-color: initial;\\n --tw-drop-shadow-alpha: 100%;\\n --tw-drop-shadow-size: initial;\\n --tw-backdrop-blur: initial;\\n --tw-backdrop-brightness: initial;\\n --tw-backdrop-contrast: initial;\\n --tw-backdrop-grayscale: initial;\\n --tw-backdrop-hue-rotate: initial;\\n --tw-backdrop-invert: initial;\\n --tw-backdrop-opacity: initial;\\n --tw-backdrop-saturate: initial;\\n --tw-backdrop-sepia: initial;\\n --tw-duration: initial;\\n --tw-ease: initial;\\n --tw-animation-delay: 0s;\\n --tw-animation-direction: normal;\\n --tw-animation-duration: initial;\\n --tw-animation-fill-mode: none;\\n --tw-animation-iteration-count: 1;\\n --tw-enter-blur: 0;\\n --tw-enter-opacity: 1;\\n --tw-enter-rotate: 0;\\n --tw-enter-scale: 1;\\n --tw-enter-translate-x: 0;\\n --tw-enter-translate-y: 0;\\n --tw-exit-blur: 0;\\n --tw-exit-opacity: 1;\\n --tw-exit-rotate: 0;\\n --tw-exit-scale: 1;\\n --tw-exit-translate-x: 0;\\n --tw-exit-translate-y: 0;\\n }\\n }\\n}\\n\")","\"use client\";\nimport \"../styles/viewer.css\";\n\nimport * as React from \"react\";\n\nimport { PGSGViewer } from \"../viewer/pgsg-viewer\";\nimport PGSGViewerControls from \"./PGSGViewControls\";\nimport { cn } from \"../lib/utils\";\n\nexport type PGSGCanvasProps = {\n src: string;\n className?: string;\n onReady?: (viewer: PGSGViewer) => void;\n type?: \"pgsg\" | \"ply\";\n colliderSrc?: string;\n};\n\nexport function PGSGCanvas({\n src,\n type = \"pgsg\",\n className,\n onReady,\n colliderSrc,\n}: PGSGCanvasProps) {\n const ref = React.useRef<HTMLDivElement | null>(null);\n const [viewer, setViewer] = React.useState<PGSGViewer | null>(null);\n\n React.useEffect(() => {\n if (!ref.current) return;\n\n const instance = new PGSGViewer({\n container: ref.current,\n source: { type: type, url: src },\n colliderSource: colliderSrc,\n debug: true,\n viewerType: \"three\",\n });\n\n setViewer(instance);\n\n instance.load().then(() => {\n onReady?.(instance);\n });\n\n return () => {\n instance.destroy();\n setViewer(null);\n };\n }, [src, type, colliderSrc]);\n\n return (\n <div\n ref={ref}\n className={cn(\"relative w-full h-full\", className)}\n style={{\n width: \"100%\",\n height: \"100%\",\n }}\n >\n <PGSGViewerControls viewer={viewer as any} />\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { PGSGViewer } from \"../core\";\nimport { PGSGThreeViewer } from \"../viewers/three\";\nimport { PGSGViewer3D } from \"./controls/PGSGViewer3D\";\nimport { PGSGViewerMode } from \"./controls/PGSGViewerMode\";\nimport { PGSGViewerSettings } from \"./controls/PGSGViewerSettings\";\nimport { Sparkles, X } from \"lucide-react\";\nimport { PGSGViewer3DSheet } from \"./controls/PGSGViewer3DSheet\";\n\nexport default function PGSGViewerControls({\n viewer,\n className,\n}: {\n viewer: PGSGThreeViewer | null;\n className?: string;\n}) {\n const [open, setOpen] = React.useState(false);\n\n if (!viewer) return null;\n\n return (\n <div\n className={cn(\n \"absolute top-0 right-0 h-full flex flex-row items-stretch z-50\",\n )}\n >\n <div className=\"flex flex-col justify-between items-end py-2 pr-2\">\n <PGSGViewerSettings viewer={viewer} />\n <div className=\"flex flex-col gap-2\">\n <PGSGViewer3D open={open} setOpen={setOpen} />\n <PGSGViewerMode viewer={viewer as unknown as PGSGViewer} />\n </div>\n </div>\n\n <div\n className={cn(\n \"overflow-hidden transition-all duration-300 ease-out w-0\",\n open && \"w-[360px]\",\n )}\n >\n <PGSGViewer3DSheet\n open={open}\n setOpen={setOpen}\n viewer={viewer as unknown as PGSGViewer}\n />\n </div>\n </div>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const glass =\n \"bg-gradient-to-br from-white/20 to-white/5 dark:from-white/10 dark:to-transparent backdrop-blur-2xl border border-white/20 shadow-[0_8px_32px_rgba(0,0,0,0.25)]\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn, glass } from \"@/src/lib/utils\";\n\nexport function PGSGViewer3D({\n open,\n setOpen,\n}: {\n open: boolean;\n setOpen: (open: boolean) => void;\n}) {\n return (\n <div className=\"relative flex items-center flex-row-reverse overflow-hidden pointer-events-auto\">\n <button\n onClick={() => setOpen(!open)}\n className={cn(\n glass,\n \"p-3 rounded-full pointer-events-auto z-100 shadow-lg shadow-white/10 cursor-pointer\",\n open &&\n \"from-black/20 to-transparent border-black/20 dark:from-white/10 dark:to-white/5 dark:border-white/20\",\n )}\n >\n <span className=\"text-white font-semibold\">3D</span>\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Rotate3D,\n RulerDimensionLine,\n Footprints,\n Icon,\n ChevronLeft,\n X,\n} from \"lucide-react\";\nimport { floorPlan } from \"@lucide/lab\";\n\nimport { PGSGViewer } from \"@/src/viewer/pgsg-viewer\";\nimport { type CameraMode } from \"@/src/viewers/types\";\nimport { cn, glass } from \"@/src/lib/utils\";\n\nexport function PGSGViewerMode({ viewer }: { viewer: PGSGViewer | null }) {\n const [mode, setMode] = React.useState<CameraMode>(\"orbit\");\n const [open, setOpen] = React.useState(false);\n\n const choose = (m: CameraMode) => {\n if (!viewer) return null;\n viewer.setCameraMode(m);\n setMode(m);\n setOpen(false);\n };\n\n React.useEffect(() => {\n if (!open) return;\n\n const onDown = (e: PointerEvent) => {\n const t = e.target as HTMLElement | null;\n if (!t?.closest(\"[data-pgsg-controls]\")) setOpen(false);\n };\n\n window.addEventListener(\"pointerdown\", onDown, { capture: true });\n return () =>\n window.removeEventListener(\"pointerdown\", onDown, {\n capture: true,\n } as any);\n }, [open]);\n\n let icon = null;\n switch (mode) {\n case \"walk\":\n icon = <Footprints className=\"size-5 text-white\" />;\n break;\n case \"orbit\":\n icon = <Rotate3D className=\"size-5 text-white\" />;\n break;\n case \"floorplan\":\n icon = <Icon iconNode={floorPlan} className=\"size-5 text-white\" />;\n break;\n case \"measure\":\n icon = <RulerDimensionLine className=\"size-5 text-white\" />;\n break;\n default:\n icon = <Rotate3D className=\"size-5 text-white\" />;\n break;\n }\n\n return (\n <div\n data-pgsg-controls\n className=\"relative flex items-center flex-row-reverse overflow-hidden pointer-events-auto\"\n >\n <div\n className={cn(\n glass,\n \"p-3 rounded-full pointer-events-auto z-100 shadow-lg shadow-white/10\",\n )}\n >\n {icon}\n </div>\n\n <div\n className={cn(\n \"flex items-center pointer-events-auto h-full overflow-hidden\",\n )}\n >\n <div\n className={cn(\n \"flex items-center h-full transition-all duration-300 ease-out\",\n open\n ? \"opacity-100 translate-x-full scale-95 pointer-events-none\"\n : \"opacity-100 translate-x-0 scale-100\",\n )}\n >\n <button\n onClick={() => setOpen(!open)}\n className=\"p-2.5 rounded-full pointer-events-auto\"\n >\n <ChevronLeft className=\"size-5 text-white\" />\n </button>\n </div>\n <div\n className={cn(\n glass,\n \"flex flex-row-reverse items-center gap-1.5 absolute bottom-0 right-0 h-full rounded-full pointer-events-auto transition-all duration-300 ease-out overflow-hidden pr-14 pl-2 shadow-none\",\n open\n ? \"opacity-100 translate-x-0 scale-100 max-w-[520px]\"\n : \"opacity-0 translate-x-6 scale-95 pointer-events-none max-w-0\",\n )}\n >\n <button\n onClick={() => choose(\"walk\")}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto transition-all duration-300 ease-out\",\n mode === \"walk\"\n ? \"bg-white/10 cursor-default\"\n : \"hover:bg-white/10 cursor-pointer\",\n )}\n >\n <Footprints className=\"size-4 text-white\" />\n </button>\n <button\n onClick={() => choose(\"orbit\")}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto transition-all duration-300 ease-out\",\n mode === \"orbit\"\n ? \"bg-white/10 cursor-default\"\n : \"hover:bg-white/10 cursor-pointer\",\n )}\n >\n <Rotate3D className=\"size-4 text-white\" />\n </button>\n <button\n onClick={() => choose(\"floorplan\")}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto transition-all duration-300 ease-out\",\n mode === \"floorplan\"\n ? \"bg-white/10 cursor-default\"\n : \"hover:bg-white/10 cursor-pointer\",\n )}\n >\n <Icon iconNode={floorPlan} className=\"size-4 text-white\" />\n </button>\n <button\n onClick={() => setMode(\"measure\")}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto transition-all duration-300 ease-out\",\n mode === \"measure\"\n ? \"bg-white/10 cursor-default\"\n : \"hover:bg-white/10 cursor-pointer\",\n )}\n >\n <RulerDimensionLine className=\"size-4 text-white\" />\n </button>\n <button\n onClick={() => setOpen(false)}\n className={cn(\n \"p-2.5 rounded-full pointer-events-auto delay-200 transition-opacity duration-200 ease-out cursor-pointer\",\n open ? \"opacity-100\" : \"opacity-0 pointer-events-none\",\n )}\n >\n <X className=\"size-4 text-white/60\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Settings } from \"lucide-react\";\n\nimport { PGSGThreeViewer } from \"@/src/viewers/three\";\nimport { cn, glass } from \"@/src/lib/utils\";\n\nexport function PGSGViewerSettings({\n viewer,\n className,\n}: {\n viewer: PGSGThreeViewer | null;\n className?: string;\n}) {\n const [open, setOpen] = React.useState(false);\n const [grid, setGrid] = React.useState(false);\n\n if (!viewer) return null;\n\n return (\n <button\n onClick={() => setOpen(!open)}\n className={cn(glass, \"p-2.5 rounded-full pointer-events-auto\")}\n >\n <Settings className=\"size-4 text-white\" />\n </button>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Loader2, Sparkles, X } from \"lucide-react\";\n\nimport { cn, glass } from \"@/src/lib/utils\";\nimport { PGSGViewer } from \"@/src/core\";\n\nexport function PGSGViewer3DSheet({\n open,\n setOpen,\n viewer,\n}: {\n open: boolean;\n setOpen: (open: boolean) => void;\n viewer?: PGSGViewer | null;\n}) {\n const [text, setText] = React.useState(\"\");\n const [loading, setLoading] = React.useState(false);\n const [modelUrl, setModelUrl] = React.useState<string | null>(null);\n const [previewImage, setPreviewImage] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (!viewer) return;\n\n viewer.enableInput(!open);\n }, [open, viewer]);\n\n const handleTextChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value);\n };\n\n const handleGenerateModel = async () => {\n if (!viewer) return;\n\n const prompt = text.trim();\n if (!prompt) return;\n\n setLoading(true);\n\n try {\n const res = await fetch(`http://localhost:9999/v1/mesh/text-to-3d`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prompt }),\n });\n\n const data = await res.json();\n const modelUrl = `http://localhost:9999/v1/mesh/text-to-3d/${data.id}/model`;\n const previewUrl = `http://localhost:9999/v1/mesh/text-to-3d/${data.id}/generated`;\n\n setModelUrl(modelUrl);\n setPreviewImage(previewUrl);\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n }\n };\n\n const handlePlaceModel = () => {\n if (!viewer || !modelUrl) return;\n\n viewer.enablePlacementMode(modelUrl);\n setOpen(false);\n };\n\n return (\n <>\n <div className=\"h-full w-[360px] bg-[rgba(15,15,15,0.9)] border-l border-l-white/1 backdrop-blur-(10px) p-3.5 text-white/60 z-100\">\n {/* Header */}\n <div className=\"flex items-center justify-between pb-2.5\">\n <h4 className=\"text-lg font-semibold\">Text to 3D Model</h4>\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n className=\"p-2.5 rounded-full pointer-events-auto\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n <div className=\"flex items-center px-2 py-1.5 max-h-[60px] rounded-md bg-white/10 text-sm\">\n <div className=\"flex flex-1 h-full items-center relative\">\n <textarea\n rows={1}\n value={text}\n onChange={handleTextChange}\n placeholder=\"Describe your 3D model\"\n className=\"w-full resize-none outline-none bg-transparent text-white/60\"\n />\n </div>\n <button\n type=\"button\"\n onClick={handleGenerateModel}\n className={cn(\n \"bg-linear-to-br from-white/20 to-white/5 border border-white/20 px-2 py-1 rounded-full pointer-events-none transition-all duration-300 ease-out flex items-center gap-1 disabled:opacity-50\",\n text.trim() &&\n !loading &&\n \"pointer-events-auto hover:from-black/20 hover:to-transparent hover:border-black/10 cursor-pointer\",\n )}\n disabled={!text.trim() || loading}\n >\n <Sparkles className=\"size-4 text-white\" />\n <span className=\"text-white text-sm font-medium\">\n {loading ? \"Generating...\" : \"Generate\"}\n </span>\n </button>\n </div>\n {(text || text !== \"\") && (\n <div className=\"max-w-[300px] flex flex-wrap text-sm font-normal mt-2\">\n <strong>Prompt:</strong>\n <br />\n {text}\n </div>\n )}\n\n <div className=\"w-full relative mt-4\">\n <h3 className=\"text-base font-medium text-white mb-2\">Preview</h3>\n\n <div\n className={cn(\n glass,\n \"flex items-center justify-center w-full h-[320px] relative rounded-md overflow-hidden\",\n )}\n >\n {loading && (\n <>\n <Loader2\n className=\"size-4 animate-spin text-white\"\n role=\"status\"\n aria-label=\"loading\"\n />\n <span className=\"text-sm\">Generating AI Model...</span>\n </>\n )}\n\n {!loading && previewImage && (\n <div className=\"flex flex-col gap-3 w-full\">\n {previewImage && (\n <div className=\"rounded-md overflow-hidden border border-white/10\">\n <img src={previewImage} className=\"w-full object-cover\" />\n </div>\n )}\n <div className=\"flex gap-2\">\n <button\n onClick={handleGenerateModel}\n className=\"flex-1 px-3 py-2 rounded-md bg-white/10 hover:bg-white/20 text-sm\"\n >\n Regenerate\n </button>\n <button\n onClick={handlePlaceModel}\n className=\"flex-1 px-3 py-2 rounded-md bg-blue-500 hover:bg-blue-600 text-white text-sm\"\n >\n Place Model\n </button>\n </div>\n </div>\n )}\n\n {/* EMPTY STATE */}\n {!loading && !previewImage && (\n <span className=\"text-white/40 text-sm\">\n Your generated model will appear here\n </span>\n )}\n </div>\n </div>\n </div>\n </>\n );\n}\n"],"mappings":"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","names":["React","React","jsx","React","jsx","React","X","jsx","jsxs","modelUrl","X","jsx","jsxs","jsx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@popaya/pgsg-viewer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"build": "tsup"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
+
"@dimforge/rapier3d-compat": "^0.19.3",
|
|
28
29
|
"@lucide/lab": "^0.1.2",
|
|
29
30
|
"@sparkjsdev/spark": "^0.1.10",
|
|
30
31
|
"@tailwindcss/postcss": "^4.2.1",
|
|
@@ -50,5 +51,11 @@
|
|
|
50
51
|
"peerDependencies": {
|
|
51
52
|
"react": ">=18",
|
|
52
53
|
"react-dom": ">=18"
|
|
54
|
+
},
|
|
55
|
+
"resolutions": {
|
|
56
|
+
"three": "0.182.0"
|
|
57
|
+
},
|
|
58
|
+
"overrides": {
|
|
59
|
+
"three": "0.182.0"
|
|
53
60
|
}
|
|
54
61
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/viewer/pgsg-viewer.ts"],"sourcesContent":["import type {\n ViewerType,\n PGSGViewerEngine,\n CameraMode,\n} from \"../viewers/types\";\nimport type { PGSGViewerOptions } from \"../core/types\";\n\nexport class PGSGViewer {\n private engine!: PGSGViewerEngine;\n\n constructor(\n private options: PGSGViewerOptions & { viewerType?: ViewerType },\n ) {}\n\n async load() {\n const type = this.options.viewerType ?? \"three\";\n\n if (type === \"playcanvas\") {\n const { PGSGPlayCanvasViewer } =\n await import(\"../viewers/playcanvas/pgsg-playcanvas-viewer\");\n this.engine = new PGSGPlayCanvasViewer(this.options);\n } else {\n const { PGSGThreeViewer } =\n await import(\"../viewers/three/pgsg-three-viewer\");\n this.engine = new PGSGThreeViewer(this.options);\n }\n\n await this.engine.load();\n this.engine.start?.();\n }\n\n resize() {\n this.engine?.resize();\n }\n\n destroy() {\n this.engine?.destroy();\n }\n\n setCameraMode(mode: CameraMode) {\n this.engine?.setCameraMode?.(mode);\n }\n\n finalizePolyline() {\n (this.engine as any)?.finalizePolyline?.();\n }\n\n deleteMeasurement(index: number) {\n (this.engine as any)?.deleteMeasurement?.(index);\n }\n}\n"],"mappings":";AAOO,IAAM,aAAN,MAAiB;AAAA,EAGtB,YACU,SACR;AADQ;AAAA,EACP;AAAA,EAJK;AAAA,EAMR,MAAM,OAAO;AACX,UAAM,OAAO,KAAK,QAAQ,cAAc;AAExC,QAAI,SAAS,cAAc;AACzB,YAAM,EAAE,qBAAqB,IAC3B,MAAM,OAAO,sCAA8C;AAC7D,WAAK,SAAS,IAAI,qBAAqB,KAAK,OAAO;AAAA,IACrD,OAAO;AACL,YAAM,EAAE,gBAAgB,IACtB,MAAM,OAAO,iCAAoC;AACnD,WAAK,SAAS,IAAI,gBAAgB,KAAK,OAAO;AAAA,IAChD;AAEA,UAAM,KAAK,OAAO,KAAK;AACvB,SAAK,OAAO,QAAQ;AAAA,EACtB;AAAA,EAEA,SAAS;AACP,SAAK,QAAQ,OAAO;AAAA,EACtB;AAAA,EAEA,UAAU;AACR,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EAEA,cAAc,MAAkB;AAC9B,SAAK,QAAQ,gBAAgB,IAAI;AAAA,EACnC;AAAA,EAEA,mBAAmB;AACjB,IAAC,KAAK,QAAgB,mBAAmB;AAAA,EAC3C;AAAA,EAEA,kBAAkB,OAAe;AAC/B,IAAC,KAAK,QAAgB,oBAAoB,KAAK;AAAA,EACjD;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/viewers/three/pgsg-three-viewer.ts","../src/viewers/spark/SparkSplatRenderer.ts","../src/viewers/three/controls/WalkCapsuleController.ts","../src/viewers/three/controls/OrbitCameraController.ts","../src/viewers/three/controls/MeasurementController.ts","../src/viewers/three/controls/FloorplanController.ts"],"sourcesContent":["import type { PGSGViewerOptions } from \"../../core/types\";\nimport * as THREE from \"three\";\nimport { GLTFLoader } from \"three/examples/jsm/Addons.js\";\nimport nipplejs from \"nipplejs\";\n\nimport { SparkSplatRenderer } from \"../spark/SparkSplatRenderer\";\nimport { WalkCapsuleController } from \"./controls/WalkCapsuleController\";\nimport { OrbitCameraController } from \"./controls/OrbitCameraController\";\nimport { MeasurementController } from \"./controls/MeasurementController\";\nimport { FloorplanController } from \"./controls/FloorplanController\";\nimport { type CameraMode } from \"../types\";\n\nexport class PGSGThreeViewer {\n private scene = new THREE.Scene();\n private camera!: THREE.PerspectiveCamera;\n private renderer!: THREE.WebGLRenderer;\n private splats!: SparkSplatRenderer;\n\n private container: HTMLElement;\n private resizeObserver: ResizeObserver | null = null;\n\n private controls!:\n | WalkCapsuleController\n | OrbitCameraController\n | MeasurementController\n | FloorplanController;\n private running = false;\n\n private orbitTarget = new THREE.Vector3();\n private lastTime = performance.now();\n\n private colliders: THREE.Object3D[] = [];\n private persistentMeasurements: any[] = [];\n private measurementController: MeasurementController | null = null;\n\n private worldRoot = new THREE.Object3D();\n private splatPivot = new THREE.Object3D();\n private colliderMesh?: THREE.Object3D;\n\n private modeButton?: HTMLDivElement;\n private currentMode: CameraMode = \"orbit\";\n\n private camTween: null | {\n t: number;\n dur: number;\n fromPos: THREE.Vector3;\n toPos: THREE.Vector3;\n fromQuat: THREE.Quaternion;\n toQuat: THREE.Quaternion;\n } = null;\n\n constructor(private options: PGSGViewerOptions) {\n this.container = options.container;\n this.options = options;\n if (!this.container) {\n throw new Error(\"[PGSGThreeViewer] Container is required\");\n }\n }\n\n async load() {\n this.initRenderer();\n this.initCamera();\n this.initScene();\n\n // Resize\n this.bindResize();\n this.resize();\n\n this.scene.add(this.worldRoot);\n\n this.splats = new SparkSplatRenderer();\n const { mesh, bounds } = await this.splats.load(this.options.source);\n\n this.splatPivot.clear();\n this.splatPivot.add(mesh);\n this.worldRoot.add(this.splatPivot);\n\n this.worldRoot.rotation.x = Math.PI;\n this.worldRoot.position.y -= bounds.min.y;\n this.worldRoot.updateMatrixWorld(true);\n\n if (this.options.colliderSource) {\n await this.loadCollider(this.options.colliderSource);\n }\n\n // this.scene.updateMatrixWorld(true);\n\n if (this.isMobile()) {\n this.initJoystick();\n this.initModeToggle();\n this.switchToWalk();\n this.updateModeLabel(\"WALK\");\n\n const walk = this.controls as WalkCapsuleController;\n window.addEventListener(\n \"keydown\",\n (e) => {\n if (e.key === \"g\") {\n walk.enableGyro();\n }\n },\n { once: true },\n );\n } else {\n this.switchToMeasure();\n }\n window.addEventListener(\"keydown\", this.onKeyToggle);\n }\n\n start() {\n if (this.running) return;\n this.running = true;\n this.renderer.setAnimationLoop((time) => {\n const now = performance.now();\n const delta = (now - this.lastTime) / 1000;\n this.lastTime = now;\n\n if (this.camTween) {\n this.camTween.t += delta;\n const a = THREE.MathUtils.clamp(\n this.camTween.t / this.camTween.dur,\n 0,\n 1,\n );\n const s = a * a * (3 - 2 * a); // smoothstep\n\n this.camera.position.lerpVectors(\n this.camTween.fromPos,\n this.camTween.toPos,\n s,\n );\n this.camera.quaternion.slerpQuaternions(\n this.camTween.fromQuat,\n this.camTween.toQuat,\n s,\n );\n\n if (a >= 1) this.camTween = null;\n // optional: skip controls while tweening\n // else controls will fight the tween\n // return;\n }\n\n (this.controls as any)?.update?.(delta);\n\n this.renderer.render(this.scene, this.camera);\n });\n }\n\n pause() {\n this.running = false;\n }\n\n resize() {\n if (!this.renderer || !this.camera) return;\n\n const w = Math.max(1, this.container.clientWidth);\n const h = Math.max(1, this.container.clientHeight);\n\n this.renderer.setSize(w, h);\n this.camera.aspect = w / h;\n this.camera.updateProjectionMatrix();\n }\n\n destroy() {\n this.running = false;\n this.renderer.setAnimationLoop(null);\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.controls?.dispose();\n this.renderer.dispose();\n }\n\n setCameraMode(mode: CameraMode) {\n this.currentMode = mode;\n console.log(\"[PGSGThreeViewer] setCameraMode:\", mode);\n\n // Save state from old controller if it was measurement\n if (this.controls instanceof MeasurementController) {\n this.persistentMeasurements = (this.controls as any).measurements;\n this.controls.setVisible(false);\n }\n\n switch (mode) {\n case \"measure\":\n document.exitPointerLock();\n this.switchToMeasure();\n if (this.controls instanceof MeasurementController) {\n this.controls.setVisible(true);\n }\n break;\n case \"orbit\":\n document.exitPointerLock();\n this.switchToOrbit();\n break;\n case \"walk\":\n this.switchToWalk();\n break;\n case \"floorplan\":\n this.switchToFloorplan();\n break;\n default:\n this.switchToOrbit();\n break;\n }\n }\n\n toggleCameraMode() {\n if (this.controls instanceof WalkCapsuleController) {\n this.switchToOrbit();\n this.updateModeLabel(\"ORBIT\");\n } else {\n this.switchToWalk();\n this.updateModeLabel(\"WALK\");\n }\n }\n\n getMeasurements() {\n if (this.measurementController) {\n return this.measurementController.getMeasurements();\n }\n return [];\n }\n\n clearMeasurements() {\n if (this.measurementController) {\n this.measurementController.clearAll();\n this.persistentMeasurements = [];\n }\n }\n\n finalizePolyline() {\n if (this.controls instanceof MeasurementController) {\n this.controls.finalizePolyline();\n }\n }\n\n deleteMeasurement(index: number) {\n if (this.measurementController) {\n this.measurementController.deleteMeasurement(index);\n }\n }\n\n private initRenderer() {\n if (this.renderer) return;\n\n this.renderer = new THREE.WebGLRenderer({\n antialias: this.options.renderer?.antialias ?? false,\n alpha: false,\n powerPreference: \"high-performance\",\n });\n\n this.renderer.setClearColor(0x111111, 1);\n this.renderer.outputColorSpace = THREE.SRGBColorSpace;\n\n this.renderer.setSize(\n this.container.clientWidth,\n this.container.clientHeight,\n );\n\n this.renderer.setPixelRatio(\n this.options.renderer?.pixelRatio ?? window.devicePixelRatio,\n );\n\n this.renderer.localClippingEnabled = true;\n\n this.container.appendChild(this.renderer.domElement);\n\n this.renderer.domElement.addEventListener(\"webglcontextlost\", (e) => {\n e.preventDefault();\n console.log(\"[PGSG Viewer] WebGL context lost\");\n });\n }\n\n private initScene() {\n this.scene = new THREE.Scene();\n this.scene.background = new THREE.Color(0x111111);\n\n const gridHelper = new THREE.GridHelper(10, 10);\n this.scene.add(gridHelper);\n\n const light = new THREE.HemisphereLight(0xffffff, 0x222222, 1.0);\n this.scene.add(light);\n }\n\n private initCamera() {\n this.camera = new THREE.PerspectiveCamera(\n this.options.camera?.fov ?? 60,\n this.container.clientWidth / this.container.clientHeight,\n this.options.camera?.near ?? 0.01,\n this.options.camera?.far ?? 10000,\n );\n\n this.camera.position.set(2, 2, 5);\n this.camera.lookAt(0, 0, 0);\n }\n\n private initJoystick() {\n const zone = document.createElement(\"div\");\n zone.style.position = \"absolute\";\n zone.style.left = \"20px\";\n zone.style.bottom = \"20px\";\n zone.style.width = \"150px\";\n zone.style.height = \"150px\";\n zone.style.zIndex = \"1000\";\n\n this.container.appendChild(zone);\n\n const joystick = nipplejs.create({\n zone,\n mode: \"static\",\n position: { left: \"50px\", bottom: \"50px\" },\n color: \"white\",\n });\n\n joystick.on(\"move\", (_, data) => {\n const angle = data.angle.radian;\n const force = data.force;\n\n if (\n this.controls instanceof WalkCapsuleController ||\n this.controls instanceof OrbitCameraController\n ) {\n (this.controls as any).setMovementVector(\n Math.sin(angle) * force,\n Math.cos(angle) * force,\n );\n }\n });\n\n joystick.on(\"end\", () => {\n if (\n this.controls instanceof WalkCapsuleController ||\n this.controls instanceof OrbitCameraController\n ) {\n (this.controls as any).setMovementVector(0, 0);\n }\n });\n }\n\n private initModeToggle() {\n // Obsolete - using measurement mode only\n }\n\n private updateModeLabel(mode: \"WALK\" | \"ORBIT\" | \"MEASURE\") {\n if (!this.modeButton) return;\n this.modeButton.innerText = mode;\n }\n\n private bindResize() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(this.container);\n }\n\n private async loadCollider(url: string) {\n console.log(\"[PGSG Viewer] Loading collider:\", url);\n const loader = new GLTFLoader();\n const gltf = await loader.loadAsync(url);\n\n this.colliderMesh = gltf.scene;\n this.worldRoot.add(this.colliderMesh);\n\n this.colliders.length = 0;\n\n this.colliderMesh.traverse((child: any) => {\n if ((child as THREE.Mesh).isMesh) {\n // child.material = new THREE.MeshNormalMaterial();\n child.material = new THREE.MeshBasicMaterial({\n visible: false,\n side: THREE.DoubleSide,\n });\n child.updateMatrixWorld(true);\n this.colliders.push(child);\n }\n });\n\n console.log(\"[PGSG Viewer] Colliders loaded:\", this.colliders.length);\n this.worldRoot.updateMatrixWorld(true);\n }\n\n private isMobile(): boolean {\n return (\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0 ||\n window.innerWidth < 768\n );\n }\n\n private onKeyToggle = (e: KeyboardEvent) => {\n if (e.key !== \"v\") return;\n\n if (this.controls instanceof WalkCapsuleController) {\n this.switchToOrbit();\n } else {\n this.switchToWalk();\n }\n };\n\n private switchToMeasure() {\n this.controls?.dispose();\n this.clearCeilingClip();\n\n this.measurementController = new MeasurementController({\n dom: this.renderer.domElement,\n camera: this.camera,\n scene: this.scene,\n colliders: this.colliders,\n });\n // Restore persistent data and re-add to scene\n this.measurementController.restoreMeasurements(this.persistentMeasurements);\n this.controls = this.measurementController;\n }\n\n private switchToWalk() {\n this.controls?.dispose();\n this.clearCeilingClip();\n\n const walk = new WalkCapsuleController({\n camera: this.camera,\n dom: this.renderer.domElement,\n colliders: this.colliders,\n eyeHeight: 1.6,\n radius: 0.35,\n walkSpeed: 2.5,\n runMultiplier: 2.0,\n gravity: 9.8,\n usePointerLock: !this.isMobile(),\n }) as any;\n\n this.controls = walk;\n walk.snapToGround();\n }\n\n private switchToOrbit() {\n this.controls?.dispose();\n this.clearCeilingClip();\n\n const distance = 5; // Math.max(this.camera.position.distanceTo(this.orbitTarget), 0.5);\n\n this.controls = new OrbitCameraController(\n this.camera,\n this.renderer.domElement,\n {\n target: this.orbitTarget.clone(),\n distance: distance,\n usePointerLock: !this.isMobile(),\n },\n );\n }\n\n private switchToFloorplan() {\n this.controls?.dispose();\n\n const box = new THREE.Box3().setFromObject(this.worldRoot);\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n\n // “how high to be” so everything fits roughly\n const height = Math.max(size.x, size.z) * 1.2;\n\n // keep orbitTarget in sync\n this.orbitTarget.copy(center);\n\n this.controls = new FloorplanController({\n dom: this.renderer.domElement,\n camera: this.camera,\n target: center,\n height,\n panSpeed: 0.0015, // tune\n zoomSpeed: 1.15,\n });\n\n const clipY = this.getCeilingClipY();\n this.applyCeilingClip(clipY);\n }\n\n private applyCeilingClip(clipY: number) {\n // Keep geometry with y > clipY hidden (cut from above)\n // plane equation: normal·x + constant = 0\n // With normal (0,-1,0), points ABOVE clipY get clipped.\n const plane = new THREE.Plane(new THREE.Vector3(0, -1, 0), clipY);\n\n this.renderer.clippingPlanes = [plane];\n }\n\n private clearCeilingClip() {\n this.renderer.clippingPlanes = [];\n }\n\n private getCeilingClipY() {\n if (!this.colliderMesh) return 0;\n const box = new THREE.Box3().setFromObject(this.colliderMesh);\n const sizeY = box.max.y - box.min.y;\n\n // Clip ~ top 25% (tune)\n return box.min.y + sizeY * 0.65;\n }\n\n private startCameraTween(\n toPos: THREE.Vector3,\n toLookAt: THREE.Vector3,\n dur = 0.45,\n ) {\n const toQuat = new THREE.Quaternion().setFromRotationMatrix(\n new THREE.Matrix4().lookAt(toPos, toLookAt, new THREE.Vector3(0, 1, 0)),\n );\n\n this.camTween = {\n t: 0,\n dur,\n fromPos: this.camera.position.clone(),\n toPos: toPos.clone(),\n fromQuat: this.camera.quaternion.clone(),\n toQuat,\n };\n }\n}\n","import { SplatMesh } from \"@sparkjsdev/spark\";\nimport * as THREE from \"three\";\nimport type { ViewerSource } from \"../../core/types\";\nimport { computePLYBounds, parsePLYHeader } from \"../three/utils\";\n\nexport class SparkSplatRenderer {\n private mesh!: SplatMesh;\n\n async load(source: ViewerSource) {\n if (source.type !== \"ply\" && source.type !== \"pgsg\") {\n throw new Error(\"SparkJS supports splat-based sources only\");\n }\n\n // const res = await fetch(source.url);\n // const buffer = await res.arrayBuffer();\n\n // const { vertexCount, headerSize } = parsePLYHeader(buffer);\n // const bounds = computePLYBounds(buffer, headerSize, vertexCount);\n\n this.mesh = new SplatMesh({\n url: source.url,\n });\n\n await this.mesh.initialized;\n this.mesh.updateMatrixWorld(true);\n\n const box = this.mesh.getBoundingBox(true);\n\n const min = box.min.clone();\n const max = box.max.clone();\n\n // Match SparkJS doc defaults\n this.mesh.position.set(0, 0, 0);\n this.mesh.quaternion.identity();\n\n return {\n mesh: this.mesh,\n bounds: {\n min,\n max,\n },\n };\n }\n\n addToScene(scene: THREE.Scene) {\n scene.add(this.mesh);\n }\n\n update(dt: number) {\n // optional: rotation / animation\n }\n\n destroy(scene: THREE.Scene) {\n scene.remove(this.mesh);\n this.mesh.dispose?.();\n }\n}\n","import * as THREE from \"three\";\n\nexport type WalkCapsuleOptions = {\n dom: HTMLElement;\n camera: THREE.PerspectiveCamera;\n colliders: THREE.Object3D[];\n\n eyeHeight?: number;\n radius?: number;\n gravity?: number;\n walkSpeed?: number;\n runMultiplier?: number;\n lookSensitivity?: number;\n usePointerLock?: boolean;\n};\n\nexport class WalkCapsuleController {\n private dom: HTMLElement;\n private camera: THREE.PerspectiveCamera;\n private colliders: THREE.Object3D[];\n\n private eyeHeight: number;\n private radius: number;\n\n private gravity: number;\n private walkSpeed: number;\n private runMultiplier: number;\n private lookSensitivity: number;\n\n private yaw = 0;\n private pitch = 0;\n\n private velocity = new THREE.Vector3();\n private onGround = false;\n private lastGroundY: number | null = null;\n\n private keys = new Set<string>();\n private raycaster = new THREE.Raycaster();\n\n private usePointerLock: boolean = false;\n\n private lastTouchX = 0;\n private lastTouchY = 0;\n private externalMove = new THREE.Vector2(0, 0);\n\n private useGyro = false;\n private gyroAlpha = 0;\n private gyroBeta = 0;\n private gyroGamma = 0;\n\n constructor(opts: WalkCapsuleOptions) {\n this.dom = opts.dom;\n this.camera = opts.camera;\n this.colliders = opts.colliders;\n console.log(\"colliders\", this.colliders.length);\n\n this.eyeHeight = opts.eyeHeight ?? 1.6;\n this.radius = opts.radius ?? 0.35;\n this.gravity = opts.gravity ?? 9.8;\n this.walkSpeed = opts.walkSpeed ?? 2.5;\n this.runMultiplier = opts.runMultiplier ?? 2.0;\n this.lookSensitivity = opts.lookSensitivity ?? 0.0022;\n this.usePointerLock = opts.usePointerLock ?? false;\n\n // Init yaw / pitch from camera\n const euler = new THREE.Euler().setFromQuaternion(\n this.camera.quaternion,\n \"YXZ\",\n );\n this.pitch = euler.x;\n this.yaw = euler.y;\n\n if (this.usePointerLock === false) {\n this.bindTouch();\n } else {\n this.bind();\n }\n }\n\n dispose() {\n if (this.usePointerLock === false) {\n this.unbindTouch();\n } else {\n this.unbind();\n if (this.usePointerLock) document.exitPointerLock();\n }\n }\n\n setMovementVector(x: number, y: number) {\n this.externalMove.set(x, y);\n }\n\n enableGyro() {\n if (typeof DeviceOrientationEvent === \"undefined\") return;\n\n // iOS permission\n if ((DeviceOrientationEvent as any).requestPermission) {\n (DeviceOrientationEvent as any)\n .requestPermission()\n .then((response: string) => {\n if (response === \"granted\") {\n this.startGyro();\n }\n })\n .catch(console.error);\n } else {\n this.startGyro();\n }\n }\n\n // --------------------------------------------------\n // Input binding (SAFE for pointer lock)\n // --------------------------------------------------\n\n private bind() {\n // 🔴 IMPORTANT: pointer lock ONLY on click\n this.dom.addEventListener(\"click\", this.onClick);\n\n window.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n window.addEventListener(\"blur\", this.onBlur);\n\n this.dom.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n }\n\n private bindTouch() {\n this.dom.addEventListener(\"touchstart\", this.onTouchStart);\n this.dom.addEventListener(\"touchmove\", this.onTouchMove);\n }\n\n private unbind() {\n this.dom.removeEventListener(\"click\", this.onClick);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n window.removeEventListener(\"blur\", this.onBlur);\n }\n\n private unbindTouch() {\n this.dom.removeEventListener(\"touchstart\", this.onTouchStart);\n this.dom.removeEventListener(\"touchmove\", this.onTouchMove);\n }\n\n private onClick = () => {\n if (this.usePointerLock && document.pointerLockElement !== this.dom) {\n this.dom.requestPointerLock();\n }\n };\n\n private onBlur = () => {\n if (this.usePointerLock) {\n document.exitPointerLock();\n }\n this.keys.clear();\n };\n\n private onMouseMove = (e: MouseEvent) => {\n if (this.usePointerLock && document.pointerLockElement !== this.dom) return;\n\n this.yaw -= e.movementX * this.lookSensitivity;\n this.pitch -= e.movementY * this.lookSensitivity;\n\n this.pitch = THREE.MathUtils.clamp(\n this.pitch,\n -Math.PI / 2 + 0.01,\n Math.PI / 2 - 0.01,\n );\n\n this.camera.quaternion.setFromEuler(\n new THREE.Euler(this.pitch, this.yaw, 0, \"YXZ\"),\n );\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.keys.add(e.key.toLowerCase());\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n this.keys.delete(e.key.toLowerCase());\n };\n\n private onTouchStart = (e: TouchEvent) => {\n const t = e.touches[0];\n this.lastTouchX = t.clientX;\n this.lastTouchY = t.clientY;\n };\n\n private onTouchMove = (e: TouchEvent) => {\n const t = e.touches[0];\n\n const deltaX = t.clientX - this.lastTouchX;\n const deltaY = t.clientY - this.lastTouchY;\n\n this.lastTouchX = t.clientX;\n this.lastTouchY = t.clientY;\n\n this.yaw -= deltaX * 0.002;\n this.pitch -= deltaY * 0.002;\n\n this.pitch = Math.max(-Math.PI / 2, Math.min(Math.PI / 2, this.pitch));\n this.camera.quaternion.setFromEuler(\n new THREE.Euler(this.pitch, this.yaw, 0, \"YXZ\"),\n );\n };\n\n private startGyro() {\n this.useGyro = true;\n\n window.addEventListener(\"deviceorientation\", (e) => {\n if (!e.alpha || !e.beta) return;\n\n this.gyroAlpha = THREE.MathUtils.degToRad(e.alpha);\n this.gyroBeta = THREE.MathUtils.degToRad(e.beta);\n this.gyroGamma = THREE.MathUtils.degToRad(e.gamma ?? 0);\n });\n }\n\n // --------------------------------------------------\n // Update loop\n // --------------------------------------------------\n\n update(dt: number) {\n if (this.useGyro) {\n this.yaw = THREE.MathUtils.lerp(this.yaw, -this.gyroAlpha, 0.1);\n this.pitch = THREE.MathUtils.lerp(\n this.pitch,\n this.gyroBeta - Math.PI / 2,\n 0.1,\n );\n\n this.camera.quaternion.setFromEuler(\n new THREE.Euler(this.pitch, this.yaw, 0, \"YXZ\"),\n );\n }\n if (!Number.isFinite(this.camera.position.y)) return;\n\n dt = Math.min(dt, 0.05);\n\n // Direction vectors (yaw-only)\n const forward = new THREE.Vector3();\n this.camera.getWorldDirection(forward);\n forward.y = 0;\n if (forward.lengthSq() < 0.01) {\n forward.set(0, 0, -1).applyQuaternion(new THREE.Quaternion().setFromEuler(new THREE.Euler(0, this.yaw, 0)));\n }\n forward.normalize();\n\n const right = new THREE.Vector3()\n .crossVectors(forward, new THREE.Vector3(0, 1, 0))\n .normalize();\n\n const wish = new THREE.Vector3();\n\n // Desktop\n if (this.keys.has(\"w\")) wish.add(forward);\n if (this.keys.has(\"s\")) wish.sub(forward);\n if (this.keys.has(\"d\")) wish.add(right);\n if (this.keys.has(\"a\")) wish.sub(right);\n\n // Mobile\n if (this.externalMove.lengthSq() > 0) {\n wish.addScaledVector(forward, this.externalMove.x);\n wish.addScaledVector(right, this.externalMove.y);\n }\n\n if (wish.lengthSq() > 0) wish.normalize();\n\n // if (this.keys.size > 0) {\n // console.log(\"walking\", [...this.keys]);\n // }\n\n const speed =\n this.walkSpeed * (this.keys.has(\"shift\") ? this.runMultiplier : 1);\n\n this.velocity.x = wish.x * speed;\n this.velocity.z = wish.z * speed;\n\n // gravity (once)\n this.velocity.y -= this.gravity * dt;\n\n // integrate position once\n const nextPos = this.camera.position.clone();\n nextPos.x += this.velocity.x * dt;\n nextPos.z += this.velocity.z * dt;\n nextPos.y += this.velocity.y * dt;\n\n const resolved = this.resolveGroundAndCollisions(nextPos);\n this.camera.position.copy(resolved);\n }\n\n snapToGround() {\n const origin = this.camera.position.clone();\n origin.y += 5;\n\n this.raycaster.set(origin, new THREE.Vector3(0, -1, 0));\n this.raycaster.far = 50;\n\n const hits = this.raycaster.intersectObjects(this.colliders, true);\n\n for (const hit of hits) {\n if (!hit.face) continue;\n\n const normalMatrix = new THREE.Matrix3().getNormalMatrix(\n hit.object.matrixWorld,\n );\n\n const worldNormal = hit.face.normal\n .clone()\n .applyMatrix3(normalMatrix)\n .normalize();\n\n if (worldNormal.y > 0.5) {\n this.lastGroundY = hit.point.y;\n this.camera.position.y = this.lastGroundY + this.eyeHeight;\n this.velocity.y = 0;\n this.onGround = true;\n return;\n }\n }\n\n // fallback if no hit\n this.lastGroundY = this.camera.position.y - this.eyeHeight;\n }\n\n // --------------------------------------------------\n // Collision & Ground\n // --------------------------------------------------\n\n private resolveGroundAndCollisions(desiredCamPos: THREE.Vector3) {\n const camPos = desiredCamPos.clone();\n\n // ----- Ground check (robust) -----\n const maxRayDown = 20.0;\n\n const origin = camPos.clone();\n origin.y += 5.0; // Start higher to catch floors above camera\n\n this.raycaster.set(origin, new THREE.Vector3(0, -1, 0));\n this.raycaster.near = 0;\n this.raycaster.far = maxRayDown;\n\n const hits = this.raycaster.intersectObjects(this.colliders, true);\n\n let groundHit: THREE.Intersection | null = null;\n\n for (const hit of hits) {\n if (!hit.face) continue;\n\n // Convert face normal to world space\n const normalMatrix = new THREE.Matrix3().getNormalMatrix(\n hit.object.matrixWorld,\n );\n\n const worldNormal = hit.face.normal\n .clone()\n .applyMatrix3(normalMatrix)\n .normalize();\n\n // Accept only surfaces that face upward\n if (worldNormal.y > 0.5) {\n groundHit = hit;\n break;\n }\n }\n\n if (groundHit) {\n const groundY = groundHit.point.y;\n const targetY = groundY + this.eyeHeight;\n\n this.lastGroundY = groundY;\n\n const falling = this.velocity.y <= 0;\n const maxSnap = 1.0;\n\n if (falling && camPos.y <= targetY + maxSnap) {\n camPos.y = targetY;\n this.velocity.y = 0;\n this.onGround = true;\n } else {\n this.onGround = false;\n }\n } else {\n if (this.lastGroundY !== null) {\n camPos.y = this.lastGroundY + this.eyeHeight;\n this.velocity.y = 0;\n this.onGround = true;\n } else {\n this.onGround = false;\n }\n }\n\n // ----- Wall push -----\n const center = camPos.clone();\n center.y -= this.eyeHeight * 0.9;\n\n const dirs = [\n new THREE.Vector3(1, 0, 0),\n new THREE.Vector3(-1, 0, 0),\n new THREE.Vector3(0, 0, 1),\n new THREE.Vector3(0, 0, -1),\n ];\n\n for (const d of dirs) {\n this.raycaster.set(center, d);\n this.raycaster.far = this.radius + 0.25;\n\n const wallHits = this.raycaster.intersectObjects(this.colliders, true);\n if (!wallHits.length) continue;\n\n const overlap = this.radius + 0.25 - wallHits[0].distance;\n if (overlap > 0) camPos.addScaledVector(d, -overlap);\n }\n\n // console.log({\n // camY: camPos.y.toFixed(2),\n // footY: footY.toFixed(2),\n // groundHit: hits[0]?.point.y.toFixed(2),\n // onGround: this.onGround,\n // });\n\n return camPos;\n }\n}\n","import * as THREE from \"three\";\n\nexport interface OrbitOptions {\n target: THREE.Vector3;\n distance: number;\n minDistance?: number;\n maxDistance?: number;\n rotateSpeed?: number;\n zoomSpeed?: number;\n usePointerLock?: boolean;\n}\n\nexport class OrbitCameraController {\n private camera: THREE.PerspectiveCamera;\n private dom: HTMLElement;\n\n private target: THREE.Vector3;\n private distance: number;\n private minDistance: number;\n private maxDistance: number;\n\n private yaw = 0;\n private pitch = 0;\n\n private rotateSpeed: number;\n private zoomSpeed: number;\n\n private dragging = false;\n private lastX = 0;\n private lastY = 0;\n\n private panning = false;\n private panSpeed = 0.002;\n\n private usePointerLock?: boolean = false;\n private lastTouchX = 0;\n private lastTouchY = 0;\n private externalMove = new THREE.Vector2(0, 0);\n private moveSpeed: number = 5;\n\n constructor(\n camera: THREE.PerspectiveCamera,\n dom: HTMLElement,\n opts: OrbitOptions,\n ) {\n this.camera = camera;\n this.dom = dom;\n\n this.target = opts.target.clone();\n this.distance = opts.distance;\n this.minDistance = opts.minDistance ?? 0.2;\n this.maxDistance = opts.maxDistance ?? 500;\n\n this.rotateSpeed = opts.rotateSpeed ?? 0.005;\n this.zoomSpeed = opts.zoomSpeed ?? 1.1;\n this.usePointerLock = opts.usePointerLock ?? false;\n\n this.syncFromCamera();\n if (this.usePointerLock === false) {\n this.bindTouch();\n } else {\n this.bind();\n this.updateCamera();\n }\n }\n\n update(dt: number) {\n if (this.externalMove.lengthSq() === 0) return;\n\n const forward = new THREE.Vector3();\n this.camera.getWorldDirection(forward);\n forward.y = 0;\n forward.normalize();\n\n const right = new THREE.Vector3()\n .crossVectors(forward, new THREE.Vector3(0, 1, 0))\n .normalize();\n\n const move = new THREE.Vector3()\n .addScaledVector(forward, this.externalMove.x)\n .addScaledVector(right, this.externalMove.y);\n\n if (move.lengthSq() > 0) move.normalize();\n\n move.multiplyScalar(this.moveSpeed * dt);\n\n this.target.add(move);\n\n this.updateCamera();\n }\n\n dispose() {\n if (this.usePointerLock === false) {\n this.unbindTouch();\n } else {\n this.unbind();\n if (this.usePointerLock) document.exitPointerLock();\n }\n }\n\n setMovementVector(x: number, y: number) {\n this.externalMove.set(x, y);\n }\n\n // -----------------------------\n // Setup\n // -----------------------------\n\n private bind() {\n this.dom.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n this.dom.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n window.addEventListener(\"mousemove\", this.onMouseMove);\n this.dom.addEventListener(\"wheel\", this.onWheel, { passive: false });\n }\n\n private bindTouch() {\n this.dom.addEventListener(\"touchstart\", this.onTouchStart);\n this.dom.addEventListener(\"touchmove\", this.onTouchMove);\n }\n\n private unbind() {\n this.dom.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n this.dom.removeEventListener(\"wheel\", this.onWheel);\n }\n\n private unbindTouch() {\n this.dom.removeEventListener(\"touchstart\", this.onTouchStart);\n this.dom.removeEventListener(\"touchmove\", this.onTouchMove);\n }\n\n private syncFromCamera() {\n const offset = this.camera.position.clone().sub(this.target);\n this.distance = offset.length();\n\n const spherical = new THREE.Spherical().setFromVector3(offset);\n this.yaw = spherical.theta;\n this.pitch = spherical.phi;\n }\n\n // -----------------------------\n // Input\n // -----------------------------\n\n private onMouseDown = (e: MouseEvent) => {\n if (e.button === 0) {\n // LEFT = orbit\n this.dragging = true;\n } else if (e.button === 2 || e.button === 1) {\n // RIGHT or MIDDLE = pan\n this.panning = true;\n }\n\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n };\n\n private onMouseUp = () => {\n this.dragging = false;\n this.panning = false;\n };\n\n private onMouseMove = (e: MouseEvent) => {\n if (!this.dragging && !this.panning) return;\n\n const dx = e.clientX - this.lastX;\n const dy = e.clientY - this.lastY;\n\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n\n // -----------------\n // ORBIT ROTATION\n // -----------------\n if (this.dragging) {\n this.yaw -= dx * this.rotateSpeed;\n this.pitch -= dy * this.rotateSpeed;\n\n this.pitch = THREE.MathUtils.clamp(this.pitch, 0.01, Math.PI - 0.01);\n\n this.updateCamera();\n return;\n }\n\n // -----------------\n // PANNING\n // -----------------\n if (this.panning) {\n const panScale = this.distance * this.panSpeed;\n\n const right = new THREE.Vector3();\n const up = new THREE.Vector3();\n\n this.camera.getWorldDirection(up);\n right.crossVectors(this.camera.up, up).normalize();\n up.crossVectors(\n right,\n this.camera.getWorldDirection(new THREE.Vector3()),\n ).normalize();\n\n const panOffset = new THREE.Vector3()\n .addScaledVector(right, dx * panScale)\n .addScaledVector(up, -dy * panScale);\n\n this.target.add(panOffset);\n this.camera.position.add(panOffset);\n\n // no updateCamera() — we already moved both\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n e.preventDefault();\n\n const zoomFactor = Math.pow(this.zoomSpeed, e.deltaY / 100);\n this.distance *= zoomFactor;\n\n this.distance = THREE.MathUtils.clamp(\n this.distance,\n this.minDistance,\n this.maxDistance,\n );\n\n this.updateCamera();\n };\n\n private onTouchStart = (e: TouchEvent) => {\n const t = e.touches[0];\n this.lastTouchX = t.clientX;\n this.lastTouchY = t.clientY;\n };\n\n private onTouchMove = (e: TouchEvent) => {\n const t = e.touches[0];\n\n const deltaX = t.clientX - this.lastTouchX;\n const deltaY = t.clientY - this.lastTouchY;\n\n this.lastTouchX = t.clientX;\n this.lastTouchY = t.clientY;\n\n this.yaw -= deltaX * 0.002;\n this.pitch -= deltaY * 0.002;\n\n this.pitch = Math.max(-Math.PI / 2, Math.min(Math.PI / 2, this.pitch));\n this.camera.quaternion.setFromEuler(\n new THREE.Euler(this.pitch, this.yaw, 0, \"YXZ\"),\n );\n };\n\n // -----------------------------\n // Camera math\n // -----------------------------\n\n private updateCamera() {\n const spherical = new THREE.Spherical(this.distance, this.pitch, this.yaw);\n\n const pos = new THREE.Vector3()\n .setFromSpherical(spherical)\n .add(this.target);\n\n this.camera.position.copy(pos);\n this.camera.lookAt(this.target);\n }\n\n setTarget(v: THREE.Vector3) {\n this.target.copy(v);\n this.updateCamera();\n }\n}\n","import * as THREE from \"three\";\n\nexport type MeasurementOptions = {\n dom: HTMLElement;\n camera: THREE.PerspectiveCamera;\n scene: THREE.Scene;\n colliders: THREE.Object3D[];\n};\n\ninterface Measurement {\n points: THREE.Vector3[];\n markers: THREE.Mesh[];\n lines: THREE.Line[]; // Changed from line: THREE.Line\n labels: HTMLDivElement[]; // Changed from label: HTMLDivElement\n}\n\nexport class MeasurementController {\n private dom: HTMLElement;\n private camera: THREE.PerspectiveCamera;\n private scene: THREE.Scene;\n private colliders: THREE.Object3D[];\n\n private raycaster = new THREE.Raycaster();\n private mouse = new THREE.Vector2();\n\n private measurements: Measurement[] = [];\n private activePoints: THREE.Vector3[] = [];\n private activeMarkers: THREE.Mesh[] = [];\n private activeLines: THREE.Line[] = [];\n private activeLabels: HTMLDivElement[] = [];\n\n // Ghost elements for the *next* potential segment\n private ghostLine: THREE.Line | null = null;\n private ghostLabel: HTMLDivElement | null = null;\n private lastGhostPoint: THREE.Vector3 | null = null;\n\n private yaw = 0;\n private pitch = Math.PI / 4;\n private dragging = false;\n private panning = false;\n private lastX = 0;\n private lastY = 0;\n private rotateSpeed = 0.005;\n private panSpeed = 0.01;\n private keys: Record<string, boolean> = {};\n private moveSpeed: number = 10;\n private isVisible = true;\n\n constructor(opts: MeasurementOptions) {\n this.dom = opts.dom;\n this.camera = opts.camera;\n this.scene = opts.scene;\n this.colliders = opts.colliders;\n\n this.bind();\n this.bindKeyboard();\n }\n\n dispose() {\n this.unbind();\n this.unbindKeyboard();\n this.clearAll();\n }\n\n private bindKeyboard() {\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n private unbindKeyboard() {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.keys[e.code] = true;\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n this.keys[e.code] = false;\n };\n\n public setVisible(visible: boolean) {\n this.isVisible = visible;\n this.measurements.forEach(m => {\n m.markers.forEach(mk => mk.visible = visible);\n m.lines.forEach(l => l.visible = visible);\n if (!visible) m.labels.forEach(lbl => lbl.style.display = \"none\");\n });\n\n this.activeMarkers.forEach(mk => mk.visible = visible);\n this.activeLines.forEach(l => l.visible = visible);\n if (!visible) this.activeLabels.forEach(lbl => lbl.style.display = \"none\");\n\n if (this.ghostLine) this.ghostLine.visible = visible;\n if (this.ghostLabel && !visible) this.ghostLabel.style.display = \"none\";\n }\n\n private bind() {\n this.dom.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n this.dom.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n }\n\n private unbind() {\n this.dom.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n if (e.button === 0) {\n if (!this.isVisible) return;\n if (e.shiftKey) {\n this.dragging = true;\n } else {\n this.handleLeftClick(e);\n }\n } else if (e.button === 2) {\n this.panning = true;\n if (this.isVisible) this.handleRightClick(e);\n } else if (e.button === 1) {\n this.dragging = true;\n }\n\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n };\n\n private onMouseUp = () => {\n this.dragging = false;\n this.panning = false;\n };\n\n private handleLeftClick(e: MouseEvent) {\n const rect = this.dom.getBoundingClientRect();\n this.mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n this.mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n\n this.raycaster.setFromCamera(this.mouse, this.camera);\n const intersects = this.raycaster.intersectObjects(this.colliders, true);\n\n if (intersects.length > 0) {\n const hit = intersects[0].point;\n this.addPoint(hit);\n }\n }\n\n private handleRightClick(e: MouseEvent) {\n console.log(\"[Measure] handleRightClick, activePoints:\", this.activePoints.length);\n if (this.activePoints.length > 0) {\n this.finalizePolyline();\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const dx = e.clientX - this.lastX;\n const dy = e.clientY - this.lastY;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n\n if (!this.isVisible && !this.dragging && !this.panning) return;\n\n if (this.dragging) {\n this.yaw -= dx * this.rotateSpeed;\n this.pitch -= dy * this.rotateSpeed;\n this.pitch = Math.max(0.01, Math.min(Math.PI - 0.01, this.pitch));\n this.camera.quaternion.setFromEuler(new THREE.Euler(this.pitch, this.yaw, 0, 'YXZ'));\n return;\n }\n\n if (this.panning) {\n const right = new THREE.Vector3().set(1, 0, 0).applyQuaternion(this.camera.quaternion);\n const up = new THREE.Vector3().set(0, 1, 0).applyQuaternion(this.camera.quaternion);\n const pan = new THREE.Vector3().addScaledVector(right, -dx * this.panSpeed).addScaledVector(up, dy * this.panSpeed);\n this.camera.position.add(pan);\n return;\n }\n\n if (this.activePoints.length > 0 || true) { // Always update mouse pos for raycasting\n const rect = this.dom.getBoundingClientRect();\n this.mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n this.mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n\n if (this.activePoints.length > 0) {\n this.raycaster.setFromCamera(this.mouse, this.camera);\n const intersects = this.raycaster.intersectObjects(this.colliders, true);\n if (intersects.length > 0) {\n this.lastGhostPoint = intersects[0].point.clone();\n this.updateGhost(this.activePoints[this.activePoints.length - 1], this.lastGhostPoint);\n }\n }\n }\n };\n\n private addPoint(pos: THREE.Vector3) {\n // Add Marker for new point\n const marker = this.createMarker(pos);\n this.scene.add(marker);\n this.activeMarkers.push(marker);\n\n // If this isn't the first point, create a permanent line + label from previous point\n if (this.activePoints.length > 0) {\n const prev = this.activePoints[this.activePoints.length - 1];\n const current = pos.clone();\n\n const line = this.createLine(prev, current, 0.8); // 0.8 opacity for permanent\n this.scene.add(line);\n this.activeLines.push(line);\n\n const label = this.createLabel();\n this.updateLabelPos(label, prev, current);\n this.activeLabels.push(label);\n }\n\n this.activePoints.push(pos.clone());\n }\n\n private updateGhost(p1: THREE.Vector3, p2: THREE.Vector3) {\n // Update Line\n if (this.ghostLine) this.scene.remove(this.ghostLine);\n this.ghostLine = this.createLine(p1, p2, 0.4); // lower opacity for ghost\n this.scene.add(this.ghostLine);\n\n // Update Label\n if (!this.ghostLabel) {\n this.ghostLabel = this.createLabel();\n }\n this.updateLabelPos(this.ghostLabel, p1, p2);\n }\n\n public finalizePolyline() {\n console.log(\"[Measure] finalizePolyline, points:\", this.activePoints.length);\n if (this.activePoints.length === 0) {\n this.clearActiveSession();\n return;\n }\n\n // Bundle everything into a measurement object\n // NOTE: In a real polyline impl, we might want to store all segments. \n // For 'getMeasurements', we'll flatten this or just store lines.\n // For now, let's treat the whole polyline as one \"Measurement\" entry \n // but it holds multiple lines/markers.\n\n // We'll trick the existing structure a bit or assume the consumer handles it,\n // but to keep it compatible with existing types, let's construct a \"Measurement\" \n // that holds arrays of these things.\n\n // Actually, we're better off refactoring `Measurement` interface if we want true polyline support.\n // But to stick to the requested \"add multiple point functionality\" quickly:\n // We will push ONE measurement object per polyline.\n // However, the `Measurement` interface defined previously had `line: THREE.Line` (singular).\n // Let's update `Measurement` interface to support multiple.\n\n // Wait, to avoid breaking too much code, let's just make `Measurement` hold arrays of lines too?\n // Or better: Each segment is a measurement? No, that spams the list.\n // Let's assume a \"Distance\" is total distance? \n\n // Let's assume the user just wants to click-click-click and leave trails.\n // We will group them.\n\n const newMeasurement: Measurement = {\n points: [...this.activePoints],\n markers: [...this.activeMarkers],\n // We need to change the interface to support multiple lines/labels or change how we store them.\n // For this specific 'hack' to work with minimal changes, let's cast or change the type below.\n // See 'createLine' helper.\n lines: [...this.activeLines],\n labels: [...this.activeLabels]\n } as any;\n\n this.measurements.push(newMeasurement);\n\n // Clear active session state WITHOUT removing from scene\n this.activePoints = [];\n this.activeMarkers = [];\n this.activeLines = [];\n this.activeLabels = [];\n\n if (this.ghostLine) {\n this.scene.remove(this.ghostLine);\n this.ghostLine = null;\n }\n if (this.ghostLabel) {\n this.ghostLabel.remove();\n this.ghostLabel = null;\n }\n this.lastGhostPoint = null;\n }\n\n private clearActiveSession() {\n this.activeMarkers.forEach(mk => this.scene.remove(mk));\n this.activeLines.forEach(l => this.scene.remove(l));\n this.activeLabels.forEach(l => l.remove());\n\n this.activePoints = [];\n this.activeMarkers = [];\n this.activeLines = [];\n this.activeLabels = [];\n\n if (this.ghostLine) {\n this.scene.remove(this.ghostLine);\n this.ghostLine = null;\n }\n if (this.ghostLabel) {\n this.ghostLabel.remove();\n this.ghostLabel = null;\n }\n this.lastGhostPoint = null;\n }\n\n private createLine(p1: THREE.Vector3, p2: THREE.Vector3, opacity: number) {\n const geometry = new THREE.BufferGeometry().setFromPoints([p1, p2]);\n const material = new THREE.LineBasicMaterial({\n color: 0xffffff,\n linewidth: 1,\n depthTest: false,\n transparent: true,\n opacity: opacity\n });\n const line = new THREE.Line(geometry, material);\n line.renderOrder = 1000;\n line.frustumCulled = false;\n return line;\n }\n\n private createMarker(pos: THREE.Vector3) {\n const marker = new THREE.Mesh(\n new THREE.SphereGeometry(0.02),\n new THREE.MeshBasicMaterial({\n color: 0xffffff,\n depthTest: false,\n transparent: true,\n opacity: 0.9\n })\n );\n marker.position.copy(pos);\n marker.renderOrder = 1001;\n marker.frustumCulled = false;\n return marker;\n }\n\n private createLabel() {\n const label = document.createElement(\"div\");\n label.style.position = \"absolute\";\n label.style.pointerEvents = \"none\";\n label.style.background = \"rgba(0,0,0,0.6)\";\n label.style.color = \"white\";\n label.style.padding = \"4px 8px\";\n label.style.borderRadius = \"12px\";\n label.style.fontSize = \"11px\";\n label.style.fontFamily = \"sans-serif\";\n label.style.fontWeight = \"500\";\n label.style.zIndex = \"100\";\n label.style.backdropFilter = \"blur(4px)\";\n // label.style.border = \"1px solid rgba(255,255,255,0.2)\";\n this.dom.parentElement?.appendChild(label);\n return label;\n }\n\n private updateLabelPos(label: HTMLDivElement, p1: THREE.Vector3, p2: THREE.Vector3) {\n const distance = p1.distanceTo(p2);\n const midPoint = new THREE.Vector3().lerpVectors(p1, p2, 0.5);\n const vector = midPoint.project(this.camera);\n\n if (vector.z > 1) {\n label.style.display = \"none\";\n return;\n }\n\n const x = (vector.x * 0.5 + 0.5) * this.dom.clientWidth;\n const y = (-(vector.y * 0.5) + 0.5) * this.dom.clientHeight;\n\n label.style.left = `${x}px`;\n label.style.top = `${y}px`;\n label.innerText = `${distance.toFixed(3)}m`;\n label.style.display = (this.isVisible && vector.z <= 1) ? \"block\" : \"none\";\n }\n\n public restoreMeasurements(measurements: Measurement[]) {\n this.measurements = measurements;\n this.measurements.forEach(m => {\n m.markers.forEach(mk => {\n mk.visible = this.isVisible;\n this.scene.add(mk);\n });\n m.lines.forEach(l => {\n l.visible = this.isVisible;\n this.scene.add(l);\n });\n m.labels.forEach((lbl, idx) => {\n this.dom.parentElement?.appendChild(lbl);\n if (idx < m.points.length - 1) {\n this.updateLabelPos(lbl, m.points[idx], m.points[idx + 1]);\n }\n });\n });\n }\n\n public getMeasurements() {\n return this.measurements.map((m, i) => {\n // Calculate total distance for the polyline\n let totalDist = 0;\n for (let j = 0; j < m.points.length - 1; j++) {\n totalDist += m.points[j].distanceTo(m.points[j + 1]);\n }\n\n return {\n id: i,\n distance: totalDist,\n points: m.points.map(p => p.clone()),\n segments: m.points.length - 1\n };\n });\n }\n\n public deleteMeasurement(index: number) {\n if (index < 0 || index >= this.measurements.length) return;\n const m = this.measurements[index];\n m.markers.forEach(mk => this.scene.remove(mk));\n m.lines.forEach(l => this.scene.remove(l));\n m.labels.forEach(lbl => lbl.remove());\n this.measurements.splice(index, 1);\n }\n\n public clearAll() {\n this.measurements.forEach(m => {\n m.markers.forEach(mk => this.scene.remove(mk));\n m.lines.forEach(l => this.scene.remove(l));\n m.labels.forEach(lbl => lbl.remove());\n });\n this.measurements = [];\n this.activePoints = [];\n if (this.ghostLine) this.scene.remove(this.ghostLine);\n\n // Clear any leftover active markers if the session was abandoned\n this.activeMarkers.forEach(mk => this.scene.remove(mk));\n this.activeLines.forEach(l => this.scene.remove(l));\n this.activeLabels.forEach(l => l.remove());\n\n if (this.ghostLabel) this.ghostLabel.remove();\n this.ghostLine = null;\n this.ghostLabel = null;\n this.lastGhostPoint = null;\n }\n\n update(dt: number = 1 / 60) {\n if (!this.isVisible) return;\n const move = new THREE.Vector3(0, 0, 0);\n\n // Keyboard Movement (WASDQE)\n const forward = new THREE.Vector3();\n this.camera.getWorldDirection(forward);\n const orbitForward = forward.clone();\n orbitForward.y = 0;\n orbitForward.normalize();\n\n const right = new THREE.Vector3()\n .crossVectors(orbitForward, new THREE.Vector3(0, 1, 0))\n .normalize();\n\n if (this.keys[\"KeyW\"]) move.add(orbitForward);\n if (this.keys[\"KeyS\"]) move.sub(orbitForward);\n if (this.keys[\"KeyA\"]) move.sub(right);\n if (this.keys[\"KeyD\"]) move.add(right);\n if (this.keys[\"KeyE\"]) move.y += 1;\n if (this.keys[\"KeyQ\"]) move.y -= 1;\n\n if (move.lengthSq() > 0) {\n move.normalize();\n move.multiplyScalar(this.moveSpeed * dt);\n this.camera.position.add(move);\n }\n\n // Update raycasting/ghost even if mouse isn't moving, because camera is moving\n if (this.activePoints.length > 0) {\n this.raycaster.setFromCamera(this.mouse, this.camera);\n const intersects = this.raycaster.intersectObjects(this.colliders, true);\n if (intersects.length > 0) {\n this.lastGhostPoint = intersects[0].point.clone();\n this.updateGhost(this.activePoints[this.activePoints.length - 1], this.lastGhostPoint);\n }\n }\n\n this.measurements.forEach(m => {\n // Update all labels in this measurement\n m.labels.forEach((lbl, idx) => {\n if (idx < m.points.length - 1) {\n this.updateLabelPos(lbl, m.points[idx], m.points[idx + 1]);\n }\n });\n });\n\n // Also update active session labels\n this.activeLabels.forEach((lbl, idx) => {\n if (idx < this.activePoints.length - 1) {\n this.updateLabelPos(lbl, this.activePoints[idx], this.activePoints[idx + 1]);\n }\n });\n\n if (this.ghostLabel && this.activePoints.length > 0 && this.lastGhostPoint) {\n this.updateLabelPos(this.ghostLabel, this.activePoints[this.activePoints.length - 1], this.lastGhostPoint);\n }\n }\n}\n","import * as THREE from \"three\";\n\nexport type FloorplanOptions = {\n dom: HTMLElement;\n camera: THREE.PerspectiveCamera;\n target: THREE.Vector3;\n height: number; // camera y above target\n panSpeed?: number; // world units per pixel\n zoomSpeed?: number; // wheel multiplier\n minHeight?: number;\n maxHeight?: number;\n};\n\nexport class FloorplanController {\n private dom: HTMLElement;\n private camera: THREE.PerspectiveCamera;\n\n private target: THREE.Vector3;\n private height: number;\n\n private panSpeed: number;\n private zoomSpeed: number;\n private minHeight: number;\n private maxHeight: number;\n\n private isDragging = false;\n private lastX = 0;\n private lastY = 0;\n\n // touch\n private touchMode: \"none\" | \"pan\" | \"pinch\" = \"none\";\n private lastDist = 0;\n\n constructor(opts: FloorplanOptions) {\n this.dom = opts.dom;\n this.camera = opts.camera;\n\n this.target = opts.target.clone();\n this.height = opts.height;\n\n this.panSpeed = opts.panSpeed ?? 0.01;\n this.zoomSpeed = opts.zoomSpeed ?? 1.1;\n this.minHeight = opts.minHeight ?? opts.height * 0.25;\n this.maxHeight = opts.maxHeight ?? opts.height * 3.0;\n\n this.applyCamera();\n this.bind();\n }\n\n dispose() {\n this.unbind();\n }\n\n update(_dt: number) {\n // keep camera locked top-down always\n this.applyCamera();\n }\n\n setTarget(t: THREE.Vector3) {\n this.target.copy(t);\n this.applyCamera();\n }\n\n private applyCamera() {\n this.height = THREE.MathUtils.clamp(\n this.height,\n this.minHeight,\n this.maxHeight,\n );\n this.camera.position.set(\n this.target.x,\n this.target.y + this.height,\n this.target.z,\n );\n this.camera.up.set(0, 0, -1); // keeps “north” stable (optional)\n this.camera.lookAt(this.target);\n }\n\n private bind() {\n this.dom.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n this.dom.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n this.dom.addEventListener(\"wheel\", this.onWheel, { passive: false });\n\n this.dom.addEventListener(\"touchstart\", this.onTouchStart, {\n passive: false,\n });\n this.dom.addEventListener(\"touchmove\", this.onTouchMove, {\n passive: false,\n });\n this.dom.addEventListener(\"touchend\", this.onTouchEnd);\n }\n\n private unbind() {\n this.dom.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n this.dom.removeEventListener(\"wheel\", this.onWheel);\n\n this.dom.removeEventListener(\"touchstart\", this.onTouchStart);\n this.dom.removeEventListener(\"touchmove\", this.onTouchMove);\n this.dom.removeEventListener(\"touchend\", this.onTouchEnd);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n this.isDragging = true;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n };\n\n private onMouseUp = () => {\n this.isDragging = false;\n };\n\n private onMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n\n const dx = e.clientX - this.lastX;\n const dy = e.clientY - this.lastY;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n\n // screen -> world: in top-down, x maps to world x, y maps to world z\n this.target.x -= dx * this.panSpeed * this.height;\n this.target.z += dy * this.panSpeed * this.height;\n\n this.applyCamera();\n };\n\n private onWheel = (e: WheelEvent) => {\n e.preventDefault();\n const factor = Math.pow(this.zoomSpeed, e.deltaY / 100);\n this.height *= factor;\n this.applyCamera();\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if (e.touches.length === 1) {\n this.touchMode = \"pan\";\n this.lastX = e.touches[0].clientX;\n this.lastY = e.touches[0].clientY;\n } else if (e.touches.length === 2) {\n this.touchMode = \"pinch\";\n this.lastDist = this.touchDistance(e.touches[0], e.touches[1]);\n }\n };\n\n private onTouchMove = (e: TouchEvent) => {\n e.preventDefault();\n\n if (this.touchMode === \"pan\" && e.touches.length === 1) {\n const x = e.touches[0].clientX;\n const y = e.touches[0].clientY;\n const dx = x - this.lastX;\n const dy = y - this.lastY;\n this.lastX = x;\n this.lastY = y;\n\n this.target.x -= dx * this.panSpeed * this.height;\n this.target.z += dy * this.panSpeed * this.height;\n\n this.applyCamera();\n }\n\n if (this.touchMode === \"pinch\" && e.touches.length === 2) {\n const dist = this.touchDistance(e.touches[0], e.touches[1]);\n const ratio = this.lastDist / Math.max(1e-6, dist);\n this.lastDist = dist;\n\n this.height *= ratio;\n this.applyCamera();\n }\n };\n\n private onTouchEnd = () => {\n this.touchMode = \"none\";\n };\n\n private touchDistance(a: Touch, b: Touch) {\n const dx = a.clientX - b.clientX;\n const dy = a.clientY - b.clientY;\n return Math.sqrt(dx * dx + dy * dy);\n }\n}\n"],"mappings":"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","names":["THREE","THREE","THREE","THREE"]}
|