@aicut/vue 0.2.0 → 0.4.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/README.md CHANGED
@@ -137,37 +137,43 @@ A 3D lighting director for AI relighting flows — separate sub-entry; three.js
137
137
  ```vue
138
138
  <script setup lang="ts">
139
139
  import { ref } from "vue";
140
- import { LightingEditor, type LightingConfig } from "@aicut/vue/lighting";
140
+ import {
141
+ LightingEditor,
142
+ type LightingConfig,
143
+ } from "@aicut/vue/lighting";
144
+ import type { LightingEditor as CoreLightingEditor } from "@aicut/core/lighting";
141
145
  import "@aicut/core/styles.css";
142
146
 
143
- const editor = ref<{ api(): any } | null>(null);
147
+ const editor = ref<{ api(): CoreLightingEditor | null } | null>(null);
144
148
 
145
149
  function onChange(cfg: LightingConfig) {
146
150
  console.log(cfg);
147
151
  }
148
152
 
149
- function onGenerate(cfg: LightingConfig) {
150
- fetch("/relight", { method: "POST", body: JSON.stringify(cfg) });
153
+ function onGenerate() {
154
+ const cfg = editor.value?.api()?.getConfig();
155
+ if (cfg) fetch("/relight", { method: "POST", body: JSON.stringify(cfg) });
151
156
  }
152
157
  </script>
153
158
 
154
159
  <template>
155
- <LightingEditor
156
- ref="editor"
157
- subject-image-url="/frames/subject.jpg"
158
- smart-enabled
159
- @change="onChange"
160
- @generate="onGenerate"
161
- >
162
- <template #smart>
160
+ <!-- Library renders ONLY the picker; the Smart panel beside it is
161
+ host code in your own template. -->
162
+ <div style="display: flex; gap: 16px">
163
+ <LightingEditor
164
+ ref="editor"
165
+ subject-image-url="/frames/subject.jpg"
166
+ @change="onChange"
167
+ />
168
+ <aside>
163
169
  <textarea placeholder="Describe the mood…" />
164
- <button @click="editor?.api()?.requestGenerate()">Generate</button>
165
- </template>
166
- </LightingEditor>
170
+ <button @click="onGenerate">Generate</button>
171
+ </aside>
172
+ </div>
167
173
  </template>
168
174
  ```
169
175
 
170
- Props: `subjectImageUrl`, `defaultConfig`, `defaultView`, `theme`, `locale`, `smartEnabled`, `smartOpen`. Events: `ready`, `change`, `generate`. Use the named `<slot name="smart">` for the smart-mode panel content.
176
+ Props: `subjectImageUrl`, `defaultConfig`, `defaultView`, `theme`, `locale`. Events: `ready`, `change`. The library is intentionally scoped to the picker — Smart mode UI / Generate buttons / layout live in host code.
171
177
 
172
178
  ## Standalone `<Timeline>`
173
179
 
@@ -1,11 +1,5 @@
1
1
  import { LightingEditor as CoreLightingEditor, type LightingConfig, type LightingEditorOptions, type LightingView } from "@aicut/core/lighting";
2
2
  import type { Theme } from "@aicut/core";
3
- /**
4
- * Vue 3 wrapper around the core `LightingEditor`. Same shape as the
5
- * React component: `defaultConfig` is read once on mount, `theme` /
6
- * `locale` / `subjectImageUrl` are reactive, the host AI UI goes into
7
- * a `<slot name="smart">` that Vue teleports into the smart slot DOM.
8
- */
9
3
  type __VLS_Props = {
10
4
  subjectImageUrl?: string;
11
5
  defaultConfig?: Partial<LightingConfig>;
@@ -15,18 +9,16 @@ type __VLS_Props = {
15
9
  };
16
10
  declare var __VLS_5: {};
17
11
  type __VLS_Slots = {} & {
18
- smart?: (props: typeof __VLS_5) => any;
12
+ controlsFooter?: (props: typeof __VLS_5) => any;
19
13
  };
20
14
  declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
21
15
  api: () => CoreLightingEditor | null;
22
16
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
23
17
  ready: (api: CoreLightingEditor) => any;
24
18
  change: (cfg: LightingConfig) => any;
25
- generate: (cfg: LightingConfig) => any;
26
19
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
27
20
  onReady?: ((api: CoreLightingEditor) => any) | undefined;
28
21
  onChange?: ((cfg: LightingConfig) => any) | undefined;
29
- onGenerate?: ((cfg: LightingConfig) => any) | undefined;
30
22
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
31
23
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
32
24
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"LightingEditor.vue.d.ts","sourceRoot":"","sources":["../src/LightingEditor.vue"],"names":[],"mappings":"AA0FA,OAAO,EACL,cAAc,IAAI,kBAAkB,EACpC,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,KAAK,WAAW,GAAG;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CAC1C,CAAC;AAyFF,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAuB7C,QAAA,MAAM,eAAe;eA1DV,kBAAkB,GAAG,IAAI;;;;;;;;;kFAkElC,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAQ1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"LightingEditor.vue.d.ts","sourceRoot":"","sources":["../src/LightingEditor.vue"],"names":[],"mappings":"AAsFA,OAAO,EACL,cAAc,IAAI,kBAAkB,EACpC,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,KAAK,WAAW,GAAG;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CAC1C,CAAC;AA2FF,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAuBtD,QAAA,MAAM,eAAe;eA1DV,kBAAkB,GAAG,IAAI;;;;;;;kFAkElC,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAQ1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
package/dist/lighting.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),o=require("@aicut/core/lighting"),s=e.defineComponent({__name:"LightingEditor",props:{subjectImageUrl:{},defaultConfig:{},defaultView:{},theme:{},locale:{}},emits:["ready","change","generate"],setup(c,{expose:g,emit:u}){const r=c,l=u,i=e.useTemplateRef("host");let t=null;const a=e.ref(null);return e.onMounted(()=>{i.value&&(t=o.LightingEditor.create({container:i.value,subjectImageUrl:r.subjectImageUrl,config:r.defaultConfig,view:r.defaultView,theme:r.theme,locale:r.locale,onChange:n=>l("change",n),onGenerate:n=>l("generate",n)}),a.value=t.smartSlot,l("ready",t))}),e.watch(()=>r.theme,n=>{n&&t&&t.setTheme(n)}),e.watch(()=>r.locale,n=>{n&&t&&t.setLocale(n)}),e.watch(()=>r.subjectImageUrl,n=>{n&&t&&t.setSubjectImage(n)}),e.onBeforeUnmount(()=>{t==null||t.destroy(),t=null,a.value=null}),g({api:()=>t}),(n,m)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"host",ref:i,"data-aicut-lighting-host":""},[a.value?(e.openBlock(),e.createBlock(e.Teleport,{key:0,to:a.value},[e.renderSlot(n.$slots,"smart")],8,["to"])):e.createCommentVNode("",!0)],512))}});Object.defineProperty(exports,"DEFAULT_LIGHTING_CONFIG",{enumerable:!0,get:()=>o.DEFAULT_LIGHTING_CONFIG});Object.defineProperty(exports,"PRESET_DIRECTIONS",{enumerable:!0,get:()=>o.PRESET_DIRECTIONS});Object.defineProperty(exports,"lightingLocaleEn",{enumerable:!0,get:()=>o.lightingLocaleEn});Object.defineProperty(exports,"lightingLocaleZh",{enumerable:!0,get:()=>o.lightingLocaleZh});Object.defineProperty(exports,"mergeLightingLocale",{enumerable:!0,get:()=>o.mergeLightingLocale});Object.defineProperty(exports,"snapToPreset",{enumerable:!0,get:()=>o.snapToPreset});exports.LightingEditor=s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),n=require("@aicut/core/lighting"),s=e.defineComponent({__name:"LightingEditor",props:{subjectImageUrl:{},defaultConfig:{},defaultView:{},theme:{},locale:{}},emits:["ready","change"],setup(c,{expose:u,emit:g}){const r=c,i=g,a=e.useTemplateRef("host");let t=null;const l=e.ref(null);return e.onMounted(()=>{a.value&&(t=n.LightingEditor.create({container:a.value,subjectImageUrl:r.subjectImageUrl,config:r.defaultConfig,view:r.defaultView,theme:r.theme,locale:r.locale,onChange:o=>i("change",o)}),l.value=t.controlsFooter,i("ready",t))}),e.watch(()=>r.theme,o=>{o&&t&&t.setTheme(o)}),e.watch(()=>r.locale,o=>{t&&t.setLocale(o??{})}),e.watch(()=>r.subjectImageUrl,o=>{o&&t&&t.setSubjectImage(o)}),e.onBeforeUnmount(()=>{t==null||t.destroy(),t=null,l.value=null}),u({api:()=>t}),(o,m)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"host",ref:a,"data-aicut-lighting-host":""},[l.value?(e.openBlock(),e.createBlock(e.Teleport,{key:0,to:l.value},[e.renderSlot(o.$slots,"controlsFooter")],8,["to"])):e.createCommentVNode("",!0)],512))}});Object.defineProperty(exports,"DEFAULT_LIGHTING_CONFIG",{enumerable:!0,get:()=>n.DEFAULT_LIGHTING_CONFIG});Object.defineProperty(exports,"PRESET_DIRECTIONS",{enumerable:!0,get:()=>n.PRESET_DIRECTIONS});Object.defineProperty(exports,"lightingLocaleEn",{enumerable:!0,get:()=>n.lightingLocaleEn});Object.defineProperty(exports,"lightingLocaleZh",{enumerable:!0,get:()=>n.lightingLocaleZh});Object.defineProperty(exports,"mergeLightingLocale",{enumerable:!0,get:()=>n.mergeLightingLocale});Object.defineProperty(exports,"snapToPreset",{enumerable:!0,get:()=>n.snapToPreset});exports.LightingEditor=s;
2
2
  //# sourceMappingURL=lighting.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"lighting.cjs","sources":["../src/LightingEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from \"vue\";\nimport {\n LightingEditor as CoreLightingEditor,\n type LightingConfig,\n type LightingEditorOptions,\n type LightingView,\n} from \"@aicut/core/lighting\";\nimport type { Theme } from \"@aicut/core\";\n\n/**\n * Vue 3 wrapper around the core `LightingEditor`. Same shape as the\n * React component: `defaultConfig` is read once on mount, `theme` /\n * `locale` / `subjectImageUrl` are reactive, the host AI UI goes into\n * a `<slot name=\"smart\">` that Vue teleports into the smart slot DOM.\n */\nconst props = defineProps<{\n subjectImageUrl?: string;\n defaultConfig?: Partial<LightingConfig>;\n defaultView?: LightingView;\n theme?: Theme;\n locale?: LightingEditorOptions[\"locale\"];\n}>();\n\nconst emit = defineEmits<{\n (e: \"ready\", api: CoreLightingEditor): void;\n (e: \"change\", cfg: LightingConfig): void;\n (e: \"generate\", cfg: LightingConfig): void;\n}>();\n\nconst host = useTemplateRef<HTMLDivElement>(\"host\");\nlet editor: CoreLightingEditor | null = null;\nconst smartSlot = ref<HTMLElement | null>(null);\n\nonMounted(() => {\n if (!host.value) return;\n editor = CoreLightingEditor.create({\n container: host.value,\n subjectImageUrl: props.subjectImageUrl,\n config: props.defaultConfig,\n view: props.defaultView,\n theme: props.theme,\n locale: props.locale,\n onChange: (cfg) => emit(\"change\", cfg),\n onGenerate: (cfg) => emit(\"generate\", cfg),\n });\n smartSlot.value = editor.smartSlot;\n emit(\"ready\", editor);\n});\n\nwatch(\n () => props.theme,\n (theme) => {\n if (theme && editor) editor.setTheme(theme);\n },\n);\nwatch(\n () => props.locale,\n (locale) => {\n if (locale && editor) editor.setLocale(locale);\n },\n);\nwatch(\n () => props.subjectImageUrl,\n (url) => {\n if (url && editor) editor.setSubjectImage(url);\n },\n);\n\nonBeforeUnmount(() => {\n editor?.destroy();\n editor = null;\n smartSlot.value = null;\n});\n\ndefineExpose({\n api: (): CoreLightingEditor | null => editor,\n});\n</script>\n\n<template>\n <div ref=\"host\" data-aicut-lighting-host=\"\">\n <Teleport v-if=\"smartSlot\" :to=\"smartSlot\">\n <slot name=\"smart\" />\n </Teleport>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","host","useTemplateRef","editor","smartSlot","ref","onMounted","CoreLightingEditor","cfg","watch","theme","locale","url","onBeforeUnmount","__expose","_createElementBlock","_createBlock","_Teleport","_renderSlot","_ctx"],"mappings":"mUAgBA,MAAMA,EAAQC,EAQRC,EAAOC,EAMPC,EAAOC,EAAAA,eAA+B,MAAM,EAClD,IAAIC,EAAoC,KACxC,MAAMC,EAAYC,EAAAA,IAAwB,IAAI,EAE9CC,OAAAA,EAAAA,UAAU,IAAM,CACTL,EAAK,QACVE,EAASI,EAAAA,eAAmB,OAAO,CACjC,UAAWN,EAAK,MAChB,gBAAiBJ,EAAM,gBACvB,OAAQA,EAAM,cACd,KAAMA,EAAM,YACZ,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,SAAWW,GAAQT,EAAK,SAAUS,CAAG,EACrC,WAAaA,GAAQT,EAAK,WAAYS,CAAG,CAAA,CAC1C,EACDJ,EAAU,MAAQD,EAAO,UACzBJ,EAAK,QAASI,CAAM,EACtB,CAAC,EAEDM,EAAAA,MACE,IAAMZ,EAAM,MACXa,GAAU,CACLA,GAASP,GAAQA,EAAO,SAASO,CAAK,CAC5C,CAAA,EAEFD,EAAAA,MACE,IAAMZ,EAAM,OACXc,GAAW,CACNA,GAAUR,GAAQA,EAAO,UAAUQ,CAAM,CAC/C,CAAA,EAEFF,EAAAA,MACE,IAAMZ,EAAM,gBACXe,GAAQ,CACHA,GAAOT,GAAQA,EAAO,gBAAgBS,CAAG,CAC/C,CAAA,EAGFC,EAAAA,gBAAgB,IAAM,CACpBV,GAAA,MAAAA,EAAQ,UACRA,EAAS,KACTC,EAAU,MAAQ,IACpB,CAAC,EAEDU,EAAa,CACX,IAAK,IAAiCX,CAAA,CACvC,wBAICY,EAAAA,mBAIM,MAAA,SAJG,OAAJ,IAAId,EAAO,2BAAyB,EAAA,GACvBG,EAAA,qBAAhBY,EAAAA,YAEWC,EAAAA,SAAA,OAFiB,GAAIb,EAAA,KAAA,GAC9Bc,aAAqBC,EAAA,OAAA,OAAA,CAAA"}
1
+ {"version":3,"file":"lighting.cjs","sources":["../src/LightingEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from \"vue\";\nimport {\n LightingEditor as CoreLightingEditor,\n type LightingConfig,\n type LightingEditorOptions,\n type LightingView,\n} from \"@aicut/core/lighting\";\nimport type { Theme } from \"@aicut/core\";\n\nconst props = defineProps<{\n subjectImageUrl?: string;\n defaultConfig?: Partial<LightingConfig>;\n defaultView?: LightingView;\n theme?: Theme;\n locale?: LightingEditorOptions[\"locale\"];\n}>();\n\nconst emit = defineEmits<{\n (e: \"ready\", api: CoreLightingEditor): void;\n (e: \"change\", cfg: LightingConfig): void;\n}>();\n\nconst host = useTemplateRef<HTMLDivElement>(\"host\");\nlet editor: CoreLightingEditor | null = null;\n/**\n * Footer slot DOM node — set after mount so the Teleport target\n * exists before Vue tries to portal slot content into it.\n */\nconst footerSlot = ref<HTMLElement | null>(null);\n\nonMounted(() => {\n if (!host.value) return;\n editor = CoreLightingEditor.create({\n container: host.value,\n subjectImageUrl: props.subjectImageUrl,\n config: props.defaultConfig,\n view: props.defaultView,\n theme: props.theme,\n locale: props.locale,\n onChange: (cfg) => emit(\"change\", cfg),\n });\n footerSlot.value = editor.controlsFooter;\n emit(\"ready\", editor);\n});\n\nwatch(\n () => props.theme,\n (theme) => {\n if (theme && editor) editor.setTheme(theme);\n },\n);\nwatch(\n () => props.locale,\n (locale) => {\n if (editor) editor.setLocale(locale ?? {});\n },\n);\nwatch(\n () => props.subjectImageUrl,\n (url) => {\n if (url && editor) editor.setSubjectImage(url);\n },\n);\n\nonBeforeUnmount(() => {\n editor?.destroy();\n editor = null;\n footerSlot.value = null;\n});\n\ndefineExpose({\n api: (): CoreLightingEditor | null => editor,\n});\n</script>\n\n<template>\n <div ref=\"host\" data-aicut-lighting-host=\"\">\n <Teleport v-if=\"footerSlot\" :to=\"footerSlot\">\n <slot name=\"controlsFooter\" />\n </Teleport>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","host","useTemplateRef","editor","footerSlot","ref","onMounted","CoreLightingEditor","cfg","watch","theme","locale","url","onBeforeUnmount","__expose","_createElementBlock","_createBlock","_Teleport","_renderSlot","_ctx"],"mappings":"wTAUA,MAAMA,EAAQC,EAQRC,EAAOC,EAKPC,EAAOC,EAAAA,eAA+B,MAAM,EAClD,IAAIC,EAAoC,KAKxC,MAAMC,EAAaC,EAAAA,IAAwB,IAAI,EAE/CC,OAAAA,EAAAA,UAAU,IAAM,CACTL,EAAK,QACVE,EAASI,EAAAA,eAAmB,OAAO,CACjC,UAAWN,EAAK,MAChB,gBAAiBJ,EAAM,gBACvB,OAAQA,EAAM,cACd,KAAMA,EAAM,YACZ,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,SAAWW,GAAQT,EAAK,SAAUS,CAAG,CAAA,CACtC,EACDJ,EAAW,MAAQD,EAAO,eAC1BJ,EAAK,QAASI,CAAM,EACtB,CAAC,EAEDM,EAAAA,MACE,IAAMZ,EAAM,MACXa,GAAU,CACLA,GAASP,GAAQA,EAAO,SAASO,CAAK,CAC5C,CAAA,EAEFD,EAAAA,MACE,IAAMZ,EAAM,OACXc,GAAW,CACNR,GAAQA,EAAO,UAAUQ,GAAU,CAAA,CAAE,CAC3C,CAAA,EAEFF,EAAAA,MACE,IAAMZ,EAAM,gBACXe,GAAQ,CACHA,GAAOT,GAAQA,EAAO,gBAAgBS,CAAG,CAC/C,CAAA,EAGFC,EAAAA,gBAAgB,IAAM,CACpBV,GAAA,MAAAA,EAAQ,UACRA,EAAS,KACTC,EAAW,MAAQ,IACrB,CAAC,EAEDU,EAAa,CACX,IAAK,IAAiCX,CAAA,CACvC,wBAICY,EAAAA,mBAIM,MAAA,SAJG,OAAJ,IAAId,EAAO,2BAAyB,EAAA,GACvBG,EAAA,qBAAhBY,EAAAA,YAEWC,EAAAA,SAAA,OAFkB,GAAIb,EAAA,KAAA,GAC/Bc,aAA8BC,EAAA,OAAA,gBAAA,CAAA"}
package/dist/lighting.js CHANGED
@@ -1,7 +1,7 @@
1
- import { defineComponent as g, useTemplateRef as u, ref as f, onMounted as h, watch as r, onBeforeUnmount as p, openBlock as i, createElementBlock as d, createBlock as I, Teleport as L, renderSlot as E, createCommentVNode as _ } from "vue";
1
+ import { defineComponent as g, useTemplateRef as m, ref as f, onMounted as h, watch as a, onBeforeUnmount as p, openBlock as i, createElementBlock as d, createBlock as I, Teleport as L, renderSlot as E, createCommentVNode as _ } from "vue";
2
2
  import { LightingEditor as v } from "@aicut/core/lighting";
3
- import { DEFAULT_LIGHTING_CONFIG as k, PRESET_DIRECTIONS as y, lightingLocaleEn as w, lightingLocaleZh as B, mergeLightingLocale as G, snapToPreset as N } from "@aicut/core/lighting";
4
- const U = /* @__PURE__ */ g({
3
+ import { DEFAULT_LIGHTING_CONFIG as y, PRESET_DIRECTIONS as S, lightingLocaleEn as w, lightingLocaleZh as B, mergeLightingLocale as F, snapToPreset as N } from "@aicut/core/lighting";
4
+ const b = /* @__PURE__ */ g({
5
5
  __name: "LightingEditor",
6
6
  props: {
7
7
  subjectImageUrl: {},
@@ -10,62 +10,61 @@ const U = /* @__PURE__ */ g({
10
10
  theme: {},
11
11
  locale: {}
12
12
  },
13
- emits: ["ready", "change", "generate"],
14
- setup(c, { expose: s, emit: m }) {
15
- const o = c, n = m, l = u("host");
13
+ emits: ["ready", "change"],
14
+ setup(c, { expose: s, emit: u }) {
15
+ const o = c, r = u, n = m("host");
16
16
  let e = null;
17
- const a = f(null);
17
+ const l = f(null);
18
18
  return h(() => {
19
- l.value && (e = v.create({
20
- container: l.value,
19
+ n.value && (e = v.create({
20
+ container: n.value,
21
21
  subjectImageUrl: o.subjectImageUrl,
22
22
  config: o.defaultConfig,
23
23
  view: o.defaultView,
24
24
  theme: o.theme,
25
25
  locale: o.locale,
26
- onChange: (t) => n("change", t),
27
- onGenerate: (t) => n("generate", t)
28
- }), a.value = e.smartSlot, n("ready", e));
29
- }), r(
26
+ onChange: (t) => r("change", t)
27
+ }), l.value = e.controlsFooter, r("ready", e));
28
+ }), a(
30
29
  () => o.theme,
31
30
  (t) => {
32
31
  t && e && e.setTheme(t);
33
32
  }
34
- ), r(
33
+ ), a(
35
34
  () => o.locale,
36
35
  (t) => {
37
- t && e && e.setLocale(t);
36
+ e && e.setLocale(t ?? {});
38
37
  }
39
- ), r(
38
+ ), a(
40
39
  () => o.subjectImageUrl,
41
40
  (t) => {
42
41
  t && e && e.setSubjectImage(t);
43
42
  }
44
43
  ), p(() => {
45
- e == null || e.destroy(), e = null, a.value = null;
44
+ e == null || e.destroy(), e = null, l.value = null;
46
45
  }), s({
47
46
  api: () => e
48
47
  }), (t, T) => (i(), d("div", {
49
48
  ref_key: "host",
50
- ref: l,
49
+ ref: n,
51
50
  "data-aicut-lighting-host": ""
52
51
  }, [
53
- a.value ? (i(), I(L, {
52
+ l.value ? (i(), I(L, {
54
53
  key: 0,
55
- to: a.value
54
+ to: l.value
56
55
  }, [
57
- E(t.$slots, "smart")
56
+ E(t.$slots, "controlsFooter")
58
57
  ], 8, ["to"])) : _("", !0)
59
58
  ], 512));
60
59
  }
61
60
  });
62
61
  export {
63
- k as DEFAULT_LIGHTING_CONFIG,
64
- U as LightingEditor,
65
- y as PRESET_DIRECTIONS,
62
+ y as DEFAULT_LIGHTING_CONFIG,
63
+ b as LightingEditor,
64
+ S as PRESET_DIRECTIONS,
66
65
  w as lightingLocaleEn,
67
66
  B as lightingLocaleZh,
68
- G as mergeLightingLocale,
67
+ F as mergeLightingLocale,
69
68
  N as snapToPreset
70
69
  };
71
70
  //# sourceMappingURL=lighting.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lighting.js","sources":["../src/LightingEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from \"vue\";\nimport {\n LightingEditor as CoreLightingEditor,\n type LightingConfig,\n type LightingEditorOptions,\n type LightingView,\n} from \"@aicut/core/lighting\";\nimport type { Theme } from \"@aicut/core\";\n\n/**\n * Vue 3 wrapper around the core `LightingEditor`. Same shape as the\n * React component: `defaultConfig` is read once on mount, `theme` /\n * `locale` / `subjectImageUrl` are reactive, the host AI UI goes into\n * a `<slot name=\"smart\">` that Vue teleports into the smart slot DOM.\n */\nconst props = defineProps<{\n subjectImageUrl?: string;\n defaultConfig?: Partial<LightingConfig>;\n defaultView?: LightingView;\n theme?: Theme;\n locale?: LightingEditorOptions[\"locale\"];\n}>();\n\nconst emit = defineEmits<{\n (e: \"ready\", api: CoreLightingEditor): void;\n (e: \"change\", cfg: LightingConfig): void;\n (e: \"generate\", cfg: LightingConfig): void;\n}>();\n\nconst host = useTemplateRef<HTMLDivElement>(\"host\");\nlet editor: CoreLightingEditor | null = null;\nconst smartSlot = ref<HTMLElement | null>(null);\n\nonMounted(() => {\n if (!host.value) return;\n editor = CoreLightingEditor.create({\n container: host.value,\n subjectImageUrl: props.subjectImageUrl,\n config: props.defaultConfig,\n view: props.defaultView,\n theme: props.theme,\n locale: props.locale,\n onChange: (cfg) => emit(\"change\", cfg),\n onGenerate: (cfg) => emit(\"generate\", cfg),\n });\n smartSlot.value = editor.smartSlot;\n emit(\"ready\", editor);\n});\n\nwatch(\n () => props.theme,\n (theme) => {\n if (theme && editor) editor.setTheme(theme);\n },\n);\nwatch(\n () => props.locale,\n (locale) => {\n if (locale && editor) editor.setLocale(locale);\n },\n);\nwatch(\n () => props.subjectImageUrl,\n (url) => {\n if (url && editor) editor.setSubjectImage(url);\n },\n);\n\nonBeforeUnmount(() => {\n editor?.destroy();\n editor = null;\n smartSlot.value = null;\n});\n\ndefineExpose({\n api: (): CoreLightingEditor | null => editor,\n});\n</script>\n\n<template>\n <div ref=\"host\" data-aicut-lighting-host=\"\">\n <Teleport v-if=\"smartSlot\" :to=\"smartSlot\">\n <slot name=\"smart\" />\n </Teleport>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","host","useTemplateRef","editor","smartSlot","ref","onMounted","CoreLightingEditor","cfg","watch","theme","locale","url","onBeforeUnmount","__expose","_createElementBlock","_createBlock","_Teleport","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;;;;AAgBA,UAAMA,IAAQC,GAQRC,IAAOC,GAMPC,IAAOC,EAA+B,MAAM;AAClD,QAAIC,IAAoC;AACxC,UAAMC,IAAYC,EAAwB,IAAI;AAE9C,WAAAC,EAAU,MAAM;AACd,MAAKL,EAAK,UACVE,IAASI,EAAmB,OAAO;AAAA,QACjC,WAAWN,EAAK;AAAA,QAChB,iBAAiBJ,EAAM;AAAA,QACvB,QAAQA,EAAM;AAAA,QACd,MAAMA,EAAM;AAAA,QACZ,OAAOA,EAAM;AAAA,QACb,QAAQA,EAAM;AAAA,QACd,UAAU,CAACW,MAAQT,EAAK,UAAUS,CAAG;AAAA,QACrC,YAAY,CAACA,MAAQT,EAAK,YAAYS,CAAG;AAAA,MAAA,CAC1C,GACDJ,EAAU,QAAQD,EAAO,WACzBJ,EAAK,SAASI,CAAM;AAAA,IACtB,CAAC,GAEDM;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,CAACa,MAAU;AACT,QAAIA,KAASP,KAAQA,EAAO,SAASO,CAAK;AAAA,MAC5C;AAAA,IAAA,GAEFD;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,CAACc,MAAW;AACV,QAAIA,KAAUR,KAAQA,EAAO,UAAUQ,CAAM;AAAA,MAC/C;AAAA,IAAA,GAEFF;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,CAACe,MAAQ;AACP,QAAIA,KAAOT,KAAQA,EAAO,gBAAgBS,CAAG;AAAA,MAC/C;AAAA,IAAA,GAGFC,EAAgB,MAAM;AACpB,MAAAV,KAAA,QAAAA,EAAQ,WACRA,IAAS,MACTC,EAAU,QAAQ;AAAA,IACpB,CAAC,GAEDU,EAAa;AAAA,MACX,KAAK,MAAiCX;AAAA,IAAA,CACvC,mBAICY,EAIM,OAAA;AAAA,eAJG;AAAA,MAAJ,KAAId;AAAA,MAAO,4BAAyB;AAAA,IAAA;MACvBG,EAAA,cAAhBY,EAEWC,GAAA;AAAA;QAFiB,IAAIb,EAAA;AAAA,MAAA;QAC9Bc,EAAqBC,EAAA,QAAA,OAAA;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"lighting.js","sources":["../src/LightingEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from \"vue\";\nimport {\n LightingEditor as CoreLightingEditor,\n type LightingConfig,\n type LightingEditorOptions,\n type LightingView,\n} from \"@aicut/core/lighting\";\nimport type { Theme } from \"@aicut/core\";\n\nconst props = defineProps<{\n subjectImageUrl?: string;\n defaultConfig?: Partial<LightingConfig>;\n defaultView?: LightingView;\n theme?: Theme;\n locale?: LightingEditorOptions[\"locale\"];\n}>();\n\nconst emit = defineEmits<{\n (e: \"ready\", api: CoreLightingEditor): void;\n (e: \"change\", cfg: LightingConfig): void;\n}>();\n\nconst host = useTemplateRef<HTMLDivElement>(\"host\");\nlet editor: CoreLightingEditor | null = null;\n/**\n * Footer slot DOM node — set after mount so the Teleport target\n * exists before Vue tries to portal slot content into it.\n */\nconst footerSlot = ref<HTMLElement | null>(null);\n\nonMounted(() => {\n if (!host.value) return;\n editor = CoreLightingEditor.create({\n container: host.value,\n subjectImageUrl: props.subjectImageUrl,\n config: props.defaultConfig,\n view: props.defaultView,\n theme: props.theme,\n locale: props.locale,\n onChange: (cfg) => emit(\"change\", cfg),\n });\n footerSlot.value = editor.controlsFooter;\n emit(\"ready\", editor);\n});\n\nwatch(\n () => props.theme,\n (theme) => {\n if (theme && editor) editor.setTheme(theme);\n },\n);\nwatch(\n () => props.locale,\n (locale) => {\n if (editor) editor.setLocale(locale ?? {});\n },\n);\nwatch(\n () => props.subjectImageUrl,\n (url) => {\n if (url && editor) editor.setSubjectImage(url);\n },\n);\n\nonBeforeUnmount(() => {\n editor?.destroy();\n editor = null;\n footerSlot.value = null;\n});\n\ndefineExpose({\n api: (): CoreLightingEditor | null => editor,\n});\n</script>\n\n<template>\n <div ref=\"host\" data-aicut-lighting-host=\"\">\n <Teleport v-if=\"footerSlot\" :to=\"footerSlot\">\n <slot name=\"controlsFooter\" />\n </Teleport>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","host","useTemplateRef","editor","footerSlot","ref","onMounted","CoreLightingEditor","cfg","watch","theme","locale","url","onBeforeUnmount","__expose","_createElementBlock","_createBlock","_Teleport","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;;;;AAUA,UAAMA,IAAQC,GAQRC,IAAOC,GAKPC,IAAOC,EAA+B,MAAM;AAClD,QAAIC,IAAoC;AAKxC,UAAMC,IAAaC,EAAwB,IAAI;AAE/C,WAAAC,EAAU,MAAM;AACd,MAAKL,EAAK,UACVE,IAASI,EAAmB,OAAO;AAAA,QACjC,WAAWN,EAAK;AAAA,QAChB,iBAAiBJ,EAAM;AAAA,QACvB,QAAQA,EAAM;AAAA,QACd,MAAMA,EAAM;AAAA,QACZ,OAAOA,EAAM;AAAA,QACb,QAAQA,EAAM;AAAA,QACd,UAAU,CAACW,MAAQT,EAAK,UAAUS,CAAG;AAAA,MAAA,CACtC,GACDJ,EAAW,QAAQD,EAAO,gBAC1BJ,EAAK,SAASI,CAAM;AAAA,IACtB,CAAC,GAEDM;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,CAACa,MAAU;AACT,QAAIA,KAASP,KAAQA,EAAO,SAASO,CAAK;AAAA,MAC5C;AAAA,IAAA,GAEFD;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,CAACc,MAAW;AACV,QAAIR,KAAQA,EAAO,UAAUQ,KAAU,CAAA,CAAE;AAAA,MAC3C;AAAA,IAAA,GAEFF;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,CAACe,MAAQ;AACP,QAAIA,KAAOT,KAAQA,EAAO,gBAAgBS,CAAG;AAAA,MAC/C;AAAA,IAAA,GAGFC,EAAgB,MAAM;AACpB,MAAAV,KAAA,QAAAA,EAAQ,WACRA,IAAS,MACTC,EAAW,QAAQ;AAAA,IACrB,CAAC,GAEDU,EAAa;AAAA,MACX,KAAK,MAAiCX;AAAA,IAAA,CACvC,mBAICY,EAIM,OAAA;AAAA,eAJG;AAAA,MAAJ,KAAId;AAAA,MAAO,4BAAyB;AAAA,IAAA;MACvBG,EAAA,cAAhBY,EAEWC,GAAA;AAAA;QAFkB,IAAIb,EAAA;AAAA,MAAA;QAC/Bc,EAA8BC,EAAA,QAAA,gBAAA;AAAA,MAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aicut/vue",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Vue 3 wrapper for the AiCut video editor + lighting picker — thin declarative shells over @aicut/core.",
5
5
  "license": "MIT",
6
6
  "author": "ziqiang <ziqiangytu@gmail.com>",
@@ -60,7 +60,7 @@
60
60
  "README.md"
61
61
  ],
62
62
  "dependencies": {
63
- "@aicut/core": "0.2.0"
63
+ "@aicut/core": "0.4.0"
64
64
  },
65
65
  "peerDependencies": {
66
66
  "vue": "^3.4.0"