@gui-chat-plugin/present3d 0.0.1 → 0.0.2

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/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-BrL881Mh.cjs");exports.TOOL_DEFINITION=e.TOOL_DEFINITION;exports.TOOL_NAME=e.TOOL_NAME;exports.astToThreeJS=e.astToThreeJS;exports.executePresent3D=e.executePresent3D;exports.parseShapeScript=e.parseShapeScript;exports.pluginCore=e.pluginCore;exports.present3D=e.present3D;exports.samples=e.samples;
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from './core/index';
1
+ export * from "./core/index";
2
2
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ import { h as a, j as p, f as r, i as t, p as O, g as T, k as o, s as h } from "./index-BXHIfuts.js";
2
+ export {
3
+ a as TOOL_DEFINITION,
4
+ p as TOOL_NAME,
5
+ r as astToThreeJS,
6
+ t as executePresent3D,
7
+ O as parseShapeScript,
8
+ T as pluginCore,
9
+ o as present3D,
10
+ h as samples
11
+ };
@@ -1,4 +1,4 @@
1
- import { Expression, Vector3, Color } from './types';
1
+ import { Expression, Vector3, Color } from "./types";
2
2
  export type Value = number | boolean | string | Value[];
3
3
  export declare class SymbolTable {
4
4
  private scopes;
@@ -1,4 +1,4 @@
1
- import { Token, SceneNode } from './types';
1
+ import { Token, SceneNode } from "./types";
2
2
  export declare class Parser {
3
3
  private tokens;
4
4
  private pos;
@@ -1,5 +1,5 @@
1
- import { SceneNode } from './types';
2
1
  import * as THREE from "three";
2
+ import { SceneNode } from "./types";
3
3
  export interface ConversionOptions {
4
4
  wireframe?: boolean;
5
5
  }
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-600:oklch(57.7% .245 27.325);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-800:oklch(43.2% .095 166.913);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-white:#fff;--spacing:.25rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--font-weight-medium:500;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;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");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.m-0{margin:calc(var(--spacing)*0)}.mx-auto{margin-inline:auto}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[200px\]{max-width:200px}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-y{resize:vertical}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-emerald-200{border-color:var(--color-emerald-200)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-indigo-200{border-color:var(--color-indigo-200)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-white{background-color:var(--color-white)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.whitespace-pre-wrap{white-space:pre-wrap}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-indigo-700{color:var(--color-indigo-700)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.grayscale{--tw-grayscale:grayscale(100%);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,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.hover\:border-indigo-300:hover{border-color:var(--color-indigo-300)}.hover\:bg-indigo-200:hover{background-color:var(--color-indigo-200)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:ring-\[3px\]:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-indigo-500\/10:focus{--tw-ring-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.focus\:ring-indigo-500\/10:focus{--tw-ring-color:color-mix(in oklab,var(--color-indigo-500)10%,transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}.present3d-container[data-v-daa337a0]{width:100%;height:100%;display:flex;flex-direction:column;background:#1a1a1a;color:#fff}.header[data-v-daa337a0]{padding:1rem;background:#2a2a2a;border-bottom:1px solid #444;display:flex;justify-content:space-between;align-items:center}.header h1[data-v-daa337a0]{margin:0;font-size:1.5rem;font-weight:600}.controls[data-v-daa337a0]{display:flex;gap:.5rem}.control-btn[data-v-daa337a0]{display:flex;align-items:center;gap:.25rem;padding:.5rem 1rem;background:#3a3a3a;color:#fff;border:1px solid #555;border-radius:4px;cursor:pointer;font-size:.9rem;transition:background .2s}.control-btn[data-v-daa337a0]:hover{background:#4a4a4a}.control-btn .material-icons[data-v-daa337a0]{font-size:1.2rem}.viewport[data-v-daa337a0]{flex:1;min-height:0;position:relative}.error[data-v-daa337a0]{padding:1rem;background:#ff000020;color:#f66;font-family:monospace;border-bottom:1px solid #ff000040}.script-source[data-v-daa337a0]{padding:.5rem;background:#00000040;border-top:1px solid #444;font-family:monospace;font-size:.85rem}.script-source summary[data-v-daa337a0]{cursor:pointer;-webkit-user-select:none;user-select:none;padding:.5rem;background:#2a2a2a;border-radius:4px}.script-source[open] summary[data-v-daa337a0]{margin-bottom:.5rem}.script-source summary[data-v-daa337a0]:hover{background:#3a3a3a}.script-editor[data-v-daa337a0]{width:100%;min-height:150px;padding:1rem;background:#1a1a1a;border:1px solid #444;border-radius:4px;color:#aaa;font-family:Courier New,monospace;font-size:.9rem;resize:vertical;margin-bottom:.5rem}.script-editor[data-v-daa337a0]:focus{outline:none;border-color:#666;background:#222}.apply-btn[data-v-daa337a0]{padding:.5rem 1rem;background:#4caf50;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:.9rem;transition:background .2s}.apply-btn[data-v-daa337a0]:hover{background:#45a049}.apply-btn[data-v-daa337a0]:active{background:#3d8b40}.apply-btn[data-v-daa337a0]:disabled{background:#ccc;color:#666;cursor:not-allowed;opacity:.6}.apply-btn[data-v-daa337a0]:disabled:hover{background:#ccc}.preview-container[data-v-75941188]{position:relative;width:100%;height:100%;min-height:150px;background:linear-gradient(135deg,#667eea,#764ba2);border-radius:8px;overflow:hidden}.preview-viewport[data-v-75941188]{width:100%;height:100%}.preview-title[data-v-75941188]{position:absolute;bottom:0;left:0;right:0;padding:.5rem;background:#000000b3;color:#fff;font-size:.75rem;font-weight:500;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@@ -0,0 +1,8 @@
1
+ import type { ToolResult } from "gui-chat-protocol";
2
+ import type { Present3DToolData } from "../core/types";
3
+ type __VLS_Props = {
4
+ result: ToolResult<Present3DToolData>;
5
+ };
6
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=Preview.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Preview.vue.d.ts","sourceRoot":"","sources":["../../src/vue/Preview.vue"],"names":[],"mappings":"AAwKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAIvD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;CACvC,CAAC;;AAoKF,wBAMG"}
@@ -0,0 +1,12 @@
1
+ import type { ToolResult } from "gui-chat-protocol";
2
+ import type { Present3DToolData } from "../core/types";
3
+ type __VLS_Props = {
4
+ selectedResult: ToolResult<Present3DToolData>;
5
+ };
6
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
7
+ updateResult: (result: ToolResult<Present3DToolData, unknown>) => any;
8
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
9
+ onUpdateResult?: ((result: ToolResult<Present3DToolData, unknown>) => any) | undefined;
10
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
+ export default _default;
12
+ //# sourceMappingURL=View.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"View.vue.d.ts","sourceRoot":"","sources":["../../src/vue/View.vue"],"names":[],"mappings":"AA4fA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AASvD,KAAK,WAAW,GAAG;IACjB,cAAc,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;CAC/C,CAAC;;;;;;AAicF,wBAOG"}
@@ -1,19 +1,20 @@
1
- import { ToolPlugin } from 'gui-chat-protocol/vue';
2
- import { Present3DToolData, Present3DArgs } from '../core/types';
3
- import { default as View } from './View.vue';
4
- import { default as Preview } from './Preview.vue';
1
+ import "../style.css";
2
+ import type { ToolPlugin } from "gui-chat-protocol/vue";
3
+ import type { Present3DToolData, Present3DArgs } from "../core/types";
4
+ import View from "./View.vue";
5
+ import Preview from "./Preview.vue";
5
6
  export declare const TOOL_NAME = "present3D";
6
7
  export declare const SYSTEM_PROMPT = "Use the present3D tool to create interactive 3D visualizations when the user requests:\n- 3D models or shapes\n- Mathematical visualizations (surfaces, functions, geometric patterns)\n- Molecular or atomic structures\n- Data visualization in 3D (scatter plots, surface plots)\n- Architectural layouts\n- Game boards or 3D game states\n- Any spatial or geometric concepts\n\n## ShapeScript Language Features (FULL SUPPORT):\n\n### Variables & Expressions:\n- Define variables: define radius 2, define spacing 1.5\n- Use expressions: position (i * 2) 0 0, size (radius * 1.5)\n- Math operators: +, -, *, /, % with proper precedence\n- Parentheses for grouping: (2 + 3) * 4\n\n### Control Flow:\n\nFor loops with variables (use loop variable in calculations):\nfor i in 1 to 5 {\n cube { position (i * 2 - 6) 0 0 size 1 }\n}\n\nFor loops with step:\nfor i in 0 to 10 step 2 {\n sphere { position 0 i 0 }\n}\n\nIf/else conditionals:\nif x > 0 {\n sphere\n} else {\n cube\n}\n\nSwitch statements for multiple cases\n\n### Built-in Functions:\n- Math: round, floor, ceil, abs, sign, sqrt, pow, min, max\n- Trig: sin, cos, tan, asin, acos, atan, atan2 (radians!)\n- Vector: dot, cross, length, normalize, sum\n\nCRITICAL: Function calls require NO space between name and (\n- sin(x) \u2713 correct\n- sin (x) \u2717 wrong - this is NOT a function call!\n\n### Best Practices:\n1. Use variables for repeated values\n2. Use loop variables (i) for positioning and calculations\n3. Use trig functions for circular/spiral patterns\n4. Use conditionals for parametric designs\n5. Keep code readable with meaningful variable names\n\n### Common Patterns:\n\nLinear arrangement:\nfor i in 1 to 5 {\n cube { position (i * 2) 0 0 }\n}\n\nCircular pattern:\ndefine count 12\nfor i in 1 to count {\n define angle ((i / count) * 6.283)\n cube { position (cos(angle) * 3) 0 (sin(angle) * 3) }\n}\n\nParametric surface:\nfor x in -5 to 5 {\n for z in -5 to 5 {\n define y (sin(x * 0.5) * cos(z * 0.5))\n cube { position (x * 0.3) y (z * 0.3) size 0.2 }\n }\n}\n\n### Primitives & CSG:\nShapes: cube, sphere, cylinder, cone, torus\nCSG: union, difference, intersection, xor, stencil\nProperties: position, rotation, size, color, opacity\n\nKeep visualizations clear, well-organized, and leverage the full power of expressions and control flow.";
7
8
  export declare const plugin: ToolPlugin<Present3DToolData, unknown, Present3DArgs>;
8
- export type { Present3DToolData, Present3DArgs, Present3DResult } from '../core/types';
9
- export { TOOL_DEFINITION, executePresent3D, pluginCore, } from '../core/plugin';
10
- export { samples } from '../core/samples';
9
+ export type { Present3DToolData, Present3DArgs, Present3DResult } from "../core/types";
10
+ export { TOOL_DEFINITION, executePresent3D, pluginCore, } from "../core/plugin";
11
+ export { samples } from "../core/samples";
11
12
  export { View, Preview };
12
- export { parseShapeScript } from '../shapescript/parser';
13
- export { astToThreeJS } from '../shapescript/toThreeJS';
14
- export type { SceneNode } from '../shapescript/types';
13
+ export { parseShapeScript } from "../shapescript/parser";
14
+ export { astToThreeJS } from "../shapescript/toThreeJS";
15
+ export type { SceneNode } from "../shapescript/types";
15
16
  declare const _default: {
16
- plugin: ToolPlugin<Present3DToolData, unknown, Present3DArgs, import('gui-chat-protocol/vue').InputHandler, Record<string, unknown>>;
17
+ plugin: ToolPlugin<Present3DToolData, unknown, Present3DArgs, import("gui-chat-protocol/vue").InputHandler, Record<string, unknown>>;
17
18
  };
18
19
  export default _default;
19
20
  //# sourceMappingURL=index.d.ts.map
package/dist/vue.cjs ADDED
@@ -0,0 +1,82 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("./index-BrL881Mh.cjs"),o=require("vue"),z={type:"change"},L={type:"start"},U={type:"end"},O=new i.Ray,V=new i.Plane,it=Math.cos(70*i.MathUtils.DEG2RAD),m=new i.Vector3,g=2*Math.PI,p={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},x=1e-6;class st extends i.Controls{constructor(t,e=null){super(t,e),this.state=p.NONE,this.enabled=!0,this.target=new i.Vector3,this.cursor=new i.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:i.MOUSE.ROTATE,MIDDLE:i.MOUSE.DOLLY,RIGHT:i.MOUSE.PAN},this.touches={ONE:i.TOUCH.ROTATE,TWO:i.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new i.Vector3,this._lastQuaternion=new i.Quaternion,this._lastTargetPosition=new i.Vector3,this._quat=new i.Quaternion().setFromUnitVectors(t.up,new i.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new i.Spherical,this._sphericalDelta=new i.Spherical,this._scale=1,this._panOffset=new i.Vector3,this._rotateStart=new i.Vector2,this._rotateEnd=new i.Vector2,this._rotateDelta=new i.Vector2,this._panStart=new i.Vector2,this._panEnd=new i.Vector2,this._panDelta=new i.Vector2,this._dollyStart=new i.Vector2,this._dollyEnd=new i.Vector2,this._dollyDelta=new i.Vector2,this._dollyDirection=new i.Vector3,this._mouse=new i.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=at.bind(this),this._onPointerDown=ot.bind(this),this._onPointerUp=nt.bind(this),this._onContextMenu=ut.bind(this),this._onMouseWheel=ht.bind(this),this._onKeyDown=ct.bind(this),this._onTouchStart=pt.bind(this),this._onTouchMove=dt.bind(this),this._onMouseDown=rt.bind(this),this._onMouseMove=lt.bind(this),this._interceptControlDown=mt.bind(this),this._interceptControlUp=_t.bind(this),this.domElement!==null&&this.connect(),this.update()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(t){t.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=t}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(z),this.update(),this.state=p.NONE}update(t=null){const e=this.object.position;m.copy(e).sub(this.target),m.applyQuaternion(this._quat),this._spherical.setFromVector3(m),this.autoRotate&&this.state===p.NONE&&this._rotateLeft(this._getAutoRotationAngle(t)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let a=this.minAzimuthAngle,n=this.maxAzimuthAngle;isFinite(a)&&isFinite(n)&&(a<-Math.PI?a+=g:a>Math.PI&&(a-=g),n<-Math.PI?n+=g:n>Math.PI&&(n-=g),a<=n?this._spherical.theta=Math.max(a,Math.min(n,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(a+n)/2?Math.max(a,this._spherical.theta):Math.min(n,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let l=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const d=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),l=d!=this._spherical.radius}if(m.setFromSpherical(this._spherical),m.applyQuaternion(this._quatInverse),e.copy(this.target).add(m),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let d=null;if(this.object.isPerspectiveCamera){const u=m.length();d=this._clampDistance(u*this._scale);const _=u-d;this.object.position.addScaledVector(this._dollyDirection,_),this.object.updateMatrixWorld(),l=!!_}else if(this.object.isOrthographicCamera){const u=new i.Vector3(this._mouse.x,this._mouse.y,0);u.unproject(this.object);const _=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),l=_!==this.object.zoom;const T=new i.Vector3(this._mouse.x,this._mouse.y,0);T.unproject(this.object),this.object.position.sub(T).add(u),this.object.updateMatrixWorld(),d=m.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;d!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(d).add(this.object.position):(O.origin.copy(this.object.position),O.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(O.direction))<it?this.object.lookAt(this.target):(V.setFromNormalAndCoplanarPoint(this.object.up,this.target),O.intersectPlane(V,this.target))))}else if(this.object.isOrthographicCamera){const d=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),d!==this.object.zoom&&(this.object.updateProjectionMatrix(),l=!0)}return this._scale=1,this._performCursorZoom=!1,l||this._lastPosition.distanceToSquared(this.object.position)>x||8*(1-this._lastQuaternion.dot(this.object.quaternion))>x||this._lastTargetPosition.distanceToSquared(this.target)>x?(this.dispatchEvent(z),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(t){return t!==null?g/60*this.autoRotateSpeed*t:g/60/60*this.autoRotateSpeed}_getZoomScale(t){const e=Math.abs(t*.01);return Math.pow(.95,this.zoomSpeed*e)}_rotateLeft(t){this._sphericalDelta.theta-=t}_rotateUp(t){this._sphericalDelta.phi-=t}_panLeft(t,e){m.setFromMatrixColumn(e,0),m.multiplyScalar(-t),this._panOffset.add(m)}_panUp(t,e){this.screenSpacePanning===!0?m.setFromMatrixColumn(e,1):(m.setFromMatrixColumn(e,0),m.crossVectors(this.object.up,m)),m.multiplyScalar(t),this._panOffset.add(m)}_pan(t,e){const a=this.domElement;if(this.object.isPerspectiveCamera){const n=this.object.position;m.copy(n).sub(this.target);let l=m.length();l*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*t*l/a.clientHeight,this.object.matrix),this._panUp(2*e*l/a.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(t*(this.object.right-this.object.left)/this.object.zoom/a.clientWidth,this.object.matrix),this._panUp(e*(this.object.top-this.object.bottom)/this.object.zoom/a.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(t,e){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const a=this.domElement.getBoundingClientRect(),n=t-a.left,l=e-a.top,d=a.width,u=a.height;this._mouse.x=n/d*2-1,this._mouse.y=-(l/u)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(t){return Math.max(this.minDistance,Math.min(this.maxDistance,t))}_handleMouseDownRotate(t){this._rotateStart.set(t.clientX,t.clientY)}_handleMouseDownDolly(t){this._updateZoomParameters(t.clientX,t.clientX),this._dollyStart.set(t.clientX,t.clientY)}_handleMouseDownPan(t){this._panStart.set(t.clientX,t.clientY)}_handleMouseMoveRotate(t){this._rotateEnd.set(t.clientX,t.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(g*this._rotateDelta.x/e.clientHeight),this._rotateUp(g*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(t){this._dollyEnd.set(t.clientX,t.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(t){this._panEnd.set(t.clientX,t.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(t){this._updateZoomParameters(t.clientX,t.clientY),t.deltaY<0?this._dollyIn(this._getZoomScale(t.deltaY)):t.deltaY>0&&this._dollyOut(this._getZoomScale(t.deltaY)),this.update()}_handleKeyDown(t){let e=!1;switch(t.code){case this.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(g*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),e=!0;break;case this.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(-g*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),e=!0;break;case this.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(g*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),e=!0;break;case this.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(-g*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),e=!0;break}e&&(t.preventDefault(),this.update())}_handleTouchStartRotate(t){if(this._pointers.length===1)this._rotateStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),a=.5*(t.pageX+e.x),n=.5*(t.pageY+e.y);this._rotateStart.set(a,n)}}_handleTouchStartPan(t){if(this._pointers.length===1)this._panStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),a=.5*(t.pageX+e.x),n=.5*(t.pageY+e.y);this._panStart.set(a,n)}}_handleTouchStartDolly(t){const e=this._getSecondPointerPosition(t),a=t.pageX-e.x,n=t.pageY-e.y,l=Math.sqrt(a*a+n*n);this._dollyStart.set(0,l)}_handleTouchStartDollyPan(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enablePan&&this._handleTouchStartPan(t)}_handleTouchStartDollyRotate(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enableRotate&&this._handleTouchStartRotate(t)}_handleTouchMoveRotate(t){if(this._pointers.length==1)this._rotateEnd.set(t.pageX,t.pageY);else{const a=this._getSecondPointerPosition(t),n=.5*(t.pageX+a.x),l=.5*(t.pageY+a.y);this._rotateEnd.set(n,l)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(g*this._rotateDelta.x/e.clientHeight),this._rotateUp(g*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(t){if(this._pointers.length===1)this._panEnd.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),a=.5*(t.pageX+e.x),n=.5*(t.pageY+e.y);this._panEnd.set(a,n)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(t){const e=this._getSecondPointerPosition(t),a=t.pageX-e.x,n=t.pageY-e.y,l=Math.sqrt(a*a+n*n);this._dollyEnd.set(0,l),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const d=(t.pageX+e.x)*.5,u=(t.pageY+e.y)*.5;this._updateZoomParameters(d,u)}_handleTouchMoveDollyPan(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enablePan&&this._handleTouchMovePan(t)}_handleTouchMoveDollyRotate(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enableRotate&&this._handleTouchMoveRotate(t)}_addPointer(t){this._pointers.push(t.pointerId)}_removePointer(t){delete this._pointerPositions[t.pointerId];for(let e=0;e<this._pointers.length;e++)if(this._pointers[e]==t.pointerId){this._pointers.splice(e,1);return}}_isTrackingPointer(t){for(let e=0;e<this._pointers.length;e++)if(this._pointers[e]==t.pointerId)return!0;return!1}_trackPointer(t){let e=this._pointerPositions[t.pointerId];e===void 0&&(e=new i.Vector2,this._pointerPositions[t.pointerId]=e),e.set(t.pageX,t.pageY)}_getSecondPointerPosition(t){const e=t.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[e]}_customWheelEvent(t){const e=t.deltaMode,a={clientX:t.clientX,clientY:t.clientY,deltaY:t.deltaY};switch(e){case 1:a.deltaY*=16;break;case 2:a.deltaY*=100;break}return t.ctrlKey&&!this._controlActive&&(a.deltaY*=10),a}}function ot(s){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(s.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.domElement.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(s)&&(this._addPointer(s),s.pointerType==="touch"?this._onTouchStart(s):this._onMouseDown(s)))}function at(s){this.enabled!==!1&&(s.pointerType==="touch"?this._onTouchMove(s):this._onMouseMove(s))}function nt(s){switch(this._removePointer(s),this._pointers.length){case 0:this.domElement.releasePointerCapture(s.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(U),this.state=p.NONE;break;case 1:const t=this._pointers[0],e=this._pointerPositions[t];this._onTouchStart({pointerId:t,pageX:e.x,pageY:e.y});break}}function rt(s){let t;switch(s.button){case 0:t=this.mouseButtons.LEFT;break;case 1:t=this.mouseButtons.MIDDLE;break;case 2:t=this.mouseButtons.RIGHT;break;default:t=-1}switch(t){case i.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(s),this.state=p.DOLLY;break;case i.MOUSE.ROTATE:if(s.ctrlKey||s.metaKey||s.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(s),this.state=p.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(s),this.state=p.ROTATE}break;case i.MOUSE.PAN:if(s.ctrlKey||s.metaKey||s.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(s),this.state=p.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(s),this.state=p.PAN}break;default:this.state=p.NONE}this.state!==p.NONE&&this.dispatchEvent(L)}function lt(s){switch(this.state){case p.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(s);break;case p.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(s);break;case p.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(s);break}}function ht(s){this.enabled===!1||this.enableZoom===!1||this.state!==p.NONE||(s.preventDefault(),this.dispatchEvent(L),this._handleMouseWheel(this._customWheelEvent(s)),this.dispatchEvent(U))}function ct(s){this.enabled!==!1&&this._handleKeyDown(s)}function pt(s){switch(this._trackPointer(s),this._pointers.length){case 1:switch(this.touches.ONE){case i.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(s),this.state=p.TOUCH_ROTATE;break;case i.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(s),this.state=p.TOUCH_PAN;break;default:this.state=p.NONE}break;case 2:switch(this.touches.TWO){case i.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(s),this.state=p.TOUCH_DOLLY_PAN;break;case i.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(s),this.state=p.TOUCH_DOLLY_ROTATE;break;default:this.state=p.NONE}break;default:this.state=p.NONE}this.state!==p.NONE&&this.dispatchEvent(L)}function dt(s){switch(this._trackPointer(s),this.state){case p.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(s),this.update();break;case p.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(s),this.update();break;case p.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(s),this.update();break;case p.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(s),this.update();break;default:this.state=p.NONE}}function ut(s){this.enabled!==!1&&s.preventDefault()}function mt(s){s.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function _t(s){s.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}const ft={class:"present3d-container"},gt={class:"header"},bt={class:"controls"},yt={class:"material-icons"},Et={class:"material-icons"},wt={key:0,class:"error"},Pt={class:"script-source"},St=["disabled"],Tt=o.defineComponent({__name:"View",props:{selectedResult:{}},emits:["updateResult"],setup(s,{emit:t}){var j;const e=s,a=t,n=o.ref(((j=e.selectedResult.data)==null?void 0:j.script)??""),l=o.ref(null),d=o.ref(null),u=o.ref(!1),_=o.ref(!0),T=o.computed(()=>{var r;return n.value!==((r=e.selectedResult.data)==null?void 0:r.script)});let y,f,E,h,b,w,v=[],P=null,D=null;o.onMounted(()=>{W(),C(),k(),o.nextTick(()=>{A()})}),o.onUnmounted(()=>{J()}),o.watch(()=>{var r;return(r=e.selectedResult.data)==null?void 0:r.script},()=>{C()}),o.watch(u,()=>{C()}),o.watch(_,r=>{w&&(w.visible=r)});function W(){if(!l.value)return;y=new i.Scene,y.background=new i.Color(1710618);const r=l.value.clientWidth,c=l.value.clientHeight;f=new i.PerspectiveCamera(50,r/c,.1,1e3),f.position.set(5,5,10),f.lookAt(0,0,0),E=new i.WebGLRenderer({antialias:!0}),E.setSize(r,c),E.setPixelRatio(window.devicePixelRatio),l.value.appendChild(E.domElement),h=new st(f,E.domElement),h.enableDamping=!0,h.dampingFactor=.05,h.addEventListener("change",N);const S=new i.AmbientLight(16777215,.6);y.add(S);const M=new i.DirectionalLight(16777215,.8);M.position.set(10,10,10),y.add(M),w=new i.GridHelper(20,20,4473924,2236962),w.visible=_.value,y.add(w),window.addEventListener("resize",R),D=new ResizeObserver(()=>{R()}),D.observe(l.value)}function R(){if(!l.value)return;const r=l.value.clientWidth,c=l.value.clientHeight;f.aspect=r/c,f.updateProjectionMatrix(),E.setSize(r,c)}function C(){var r;try{v.forEach(et=>y.remove(et)),v=[];const c=(r=e.selectedResult.data)==null?void 0:r.script;if(!c)return;const S=i.parseShapeScript(c),M=i.astToThreeJS(S,{wireframe:u.value});y.add(M),v.push(M),d.value=null}catch(c){d.value=c instanceof Error?c.message:"Unknown error",console.error("ShapeScript parse error:",c)}}function k(){b=requestAnimationFrame(k),h.update(),E.render(y,f)}function X(){f.position.set(5,5,10),f.lookAt(0,0,0),h.reset()}function A(){var c,S;if(!f||!h||!((S=(c=e.selectedResult)==null?void 0:c.viewState)!=null&&S.cameraState))return;const r=e.selectedResult.viewState.cameraState;r.position&&f.position.set(r.position.x,r.position.y,r.position.z),r.target&&h.target.set(r.target.x,r.target.y,r.target.z),f.updateProjectionMatrix(),h.update()}function G(){return{position:{x:f.position.x,y:f.position.y,z:f.position.z},target:{x:h.target.x,y:h.target.y,z:h.target.z}}}function N(){P!==null&&clearTimeout(P),P=window.setTimeout(()=>{q()},500)}function q(){const r={...e.selectedResult,viewState:{cameraState:G()}};a("updateResult",r)}function B(){u.value=!u.value}function Q(){_.value=!_.value}function J(){P!==null&&clearTimeout(P),b&&cancelAnimationFrame(b),E&&E.dispose(),h&&(h.removeEventListener("change",N),h.dispose()),D&&D.disconnect(),window.removeEventListener("resize",R)}function $(){}function tt(){try{i.parseShapeScript(n.value);const r={...e.selectedResult,data:{script:n.value}};a("updateResult",r)}catch(r){d.value=r instanceof Error?r.message:"Invalid ShapeScript",console.error("Script validation failed:",r)}}return o.watch(()=>{var r;return(r=e.selectedResult.data)==null?void 0:r.script},r=>{r&&(n.value=r)}),o.watch(()=>e.selectedResult,()=>{o.nextTick(()=>{A()})}),(r,c)=>(o.openBlock(),o.createElementBlock("div",ft,[o.createElementVNode("div",gt,[o.createElementVNode("h1",null,o.toDisplayString(s.selectedResult.title||"3D Visualization"),1),o.createElementVNode("div",bt,[o.createElementVNode("button",{onClick:X,class:"control-btn"},[...c[1]||(c[1]=[o.createElementVNode("span",{class:"material-icons"},"refresh",-1),o.createTextVNode(" Reset Camera ",-1)])]),o.createElementVNode("button",{onClick:B,class:"control-btn"},[o.createElementVNode("span",yt,o.toDisplayString(u.value?"grid_off":"grid_on"),1),c[2]||(c[2]=o.createTextVNode(" Wireframe ",-1))]),o.createElementVNode("button",{onClick:Q,class:"control-btn"},[o.createElementVNode("span",Et,o.toDisplayString(_.value?"visibility_off":"visibility"),1),c[3]||(c[3]=o.createTextVNode(" Grid ",-1))])])]),d.value?(o.openBlock(),o.createElementBlock("div",wt,[c[4]||(c[4]=o.createElementVNode("strong",null,"Parse Error:",-1)),o.createTextVNode(" "+o.toDisplayString(d.value),1)])):o.createCommentVNode("",!0),o.createElementVNode("div",{class:"viewport",ref_key:"viewport",ref:l},null,512),o.createElementVNode("details",Pt,[c[5]||(c[5]=o.createElementVNode("summary",null,"Edit ShapeScript Source",-1)),o.withDirectives(o.createElementVNode("textarea",{"onUpdate:modelValue":c[0]||(c[0]=S=>n.value=S),onInput:$,class:"script-editor",spellcheck:"false"},null,544),[[o.vModelText,n.value]]),o.createElementVNode("button",{onClick:tt,class:"apply-btn",disabled:!T.value}," Apply Changes ",8,St)])]))}}),I=(s,t)=>{const e=s.__vccOpts||s;for(const[a,n]of t)e[a]=n;return e},Y=I(Tt,[["__scopeId","data-v-daa337a0"]]),Dt={class:"preview-container"},vt={class:"preview-title"},Mt=o.defineComponent({__name:"Preview",props:{result:{}},setup(s){const t=s,e=o.computed(()=>t.result.title||"3D Visualization"),a=o.ref(null);let n,l,d,u,_=null;o.onMounted(()=>{T()}),o.onUnmounted(()=>{E()}),o.watch(()=>{var h;return(h=t.result.data)==null?void 0:h.script},()=>{f()});function T(){var h;if(a.value)try{n=new i.Scene,n.background=new i.Color(2763322);const b=a.value.clientWidth||200,w=a.value.clientHeight||150;l=new i.PerspectiveCamera(50,b/w,.1,1e3),l.position.set(4,4,8),l.lookAt(0,0,0),d=new i.WebGLRenderer({antialias:!0,alpha:!1}),d.setSize(b,w),d.setPixelRatio(Math.min(window.devicePixelRatio,2)),a.value.appendChild(d.domElement);const v=new i.AmbientLight(16777215,.6);n.add(v);const P=new i.DirectionalLight(16777215,.8);if(P.position.set(5,5,5),n.add(P),!((h=t.result.data)!=null&&h.script))return;const D=i.parseShapeScript(t.result.data.script);_=i.astToThreeJS(D,{wireframe:!1}),n.add(_),y()}catch(b){console.error("Preview render error:",b)}}function y(){u=requestAnimationFrame(y);const h=Date.now()*5e-4;l.position.x=Math.cos(h)*8,l.position.z=Math.sin(h)*8,l.lookAt(0,0,0),d.render(n,l)}function f(){var h;if(!(!n||!((h=t.result.data)!=null&&h.script)))try{_&&n.remove(_);const b=i.parseShapeScript(t.result.data.script);_=i.astToThreeJS(b,{wireframe:!1}),n.add(_)}catch(b){console.error("Preview reload error:",b)}}function E(){u&&cancelAnimationFrame(u),d&&d.dispose()}return(h,b)=>(o.openBlock(),o.createElementBlock("div",Dt,[o.createElementVNode("div",{ref_key:"previewViewport",ref:a,class:"preview-viewport"},null,512),o.createElementVNode("div",vt,o.toDisplayString(e.value),1)]))}}),H=I(Mt,[["__scopeId","data-v-75941188"]]),Z="present3D",K=`Use the ${Z} tool to create interactive 3D visualizations when the user requests:
2
+ - 3D models or shapes
3
+ - Mathematical visualizations (surfaces, functions, geometric patterns)
4
+ - Molecular or atomic structures
5
+ - Data visualization in 3D (scatter plots, surface plots)
6
+ - Architectural layouts
7
+ - Game boards or 3D game states
8
+ - Any spatial or geometric concepts
9
+
10
+ ## ShapeScript Language Features (FULL SUPPORT):
11
+
12
+ ### Variables & Expressions:
13
+ - Define variables: define radius 2, define spacing 1.5
14
+ - Use expressions: position (i * 2) 0 0, size (radius * 1.5)
15
+ - Math operators: +, -, *, /, % with proper precedence
16
+ - Parentheses for grouping: (2 + 3) * 4
17
+
18
+ ### Control Flow:
19
+
20
+ For loops with variables (use loop variable in calculations):
21
+ for i in 1 to 5 {
22
+ cube { position (i * 2 - 6) 0 0 size 1 }
23
+ }
24
+
25
+ For loops with step:
26
+ for i in 0 to 10 step 2 {
27
+ sphere { position 0 i 0 }
28
+ }
29
+
30
+ If/else conditionals:
31
+ if x > 0 {
32
+ sphere
33
+ } else {
34
+ cube
35
+ }
36
+
37
+ Switch statements for multiple cases
38
+
39
+ ### Built-in Functions:
40
+ - Math: round, floor, ceil, abs, sign, sqrt, pow, min, max
41
+ - Trig: sin, cos, tan, asin, acos, atan, atan2 (radians!)
42
+ - Vector: dot, cross, length, normalize, sum
43
+
44
+ CRITICAL: Function calls require NO space between name and (
45
+ - sin(x) ✓ correct
46
+ - sin (x) ✗ wrong - this is NOT a function call!
47
+
48
+ ### Best Practices:
49
+ 1. Use variables for repeated values
50
+ 2. Use loop variables (i) for positioning and calculations
51
+ 3. Use trig functions for circular/spiral patterns
52
+ 4. Use conditionals for parametric designs
53
+ 5. Keep code readable with meaningful variable names
54
+
55
+ ### Common Patterns:
56
+
57
+ Linear arrangement:
58
+ for i in 1 to 5 {
59
+ cube { position (i * 2) 0 0 }
60
+ }
61
+
62
+ Circular pattern:
63
+ define count 12
64
+ for i in 1 to count {
65
+ define angle ((i / count) * 6.283)
66
+ cube { position (cos(angle) * 3) 0 (sin(angle) * 3) }
67
+ }
68
+
69
+ Parametric surface:
70
+ for x in -5 to 5 {
71
+ for z in -5 to 5 {
72
+ define y (sin(x * 0.5) * cos(z * 0.5))
73
+ cube { position (x * 0.3) y (z * 0.3) size 0.2 }
74
+ }
75
+ }
76
+
77
+ ### Primitives & CSG:
78
+ Shapes: cube, sphere, cylinder, cone, torus
79
+ CSG: union, difference, intersection, xor, stencil
80
+ Properties: position, rotation, size, color, opacity
81
+
82
+ Keep visualizations clear, well-organized, and leverage the full power of expressions and control flow.`,F={...i.pluginCore,viewComponent:Y,previewComponent:H,samples:i.samples,systemPrompt:K},Ot={plugin:F};exports.TOOL_DEFINITION=i.TOOL_DEFINITION;exports.astToThreeJS=i.astToThreeJS;exports.executePresent3D=i.executePresent3D;exports.parseShapeScript=i.parseShapeScript;exports.pluginCore=i.pluginCore;exports.samples=i.samples;exports.Preview=H;exports.SYSTEM_PROMPT=K;exports.TOOL_NAME=Z;exports.View=Y;exports.default=Ot;exports.plugin=F;