@quicktvui/naddons 1.0.0-alpha.10 → 1.0.0-alpha.11

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("vue"),S=require("@extscreen/es3-vue"),L=require("@extscreen/es3-core"),ee="QtGridTabs",B=c.defineComponent({__name:"GridTabs",props:{protocolVersion:{},pageSpec:{},tabsData:{},actionPayload:{}},emits:["onTabSelected","onTabNeedsData","onLoadMore","onItemPresence","onTabFocused","onItemClick","onItemFocused","onProtocolMismatch"],setup(o,{expose:s}){const d=c.ref(),p=C(),b=ee+"_Plugin",l=(p.isPluginActive?b:ee).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.glintui");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value},dispatchAction:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"dispatchAction",i)},scrollToTop:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"scrollToTop",i)},getFocusState:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"getFocusState",i)},getItemRect:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"getItemRect",i)}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d,protocolVersion:o.protocolVersion,pageSpec:o.pageSpec,tabsData:o.tabsData,actionPayload:o.actionPayload,onOnTabSelected:a[0]||(a[0]=u=>i.$emit("onTabSelected",u.nativeEvent)),onOnTabNeedsData:a[1]||(a[1]=u=>i.$emit("onTabNeedsData",u.nativeEvent)),onOnLoadMore:a[2]||(a[2]=u=>i.$emit("onLoadMore",u.nativeEvent)),onOnItemPresence:a[3]||(a[3]=u=>i.$emit("onItemPresence",u.nativeEvent)),onOnTabFocused:a[4]||(a[4]=u=>i.$emit("onTabFocused",u.nativeEvent)),onOnItemClick:a[5]||(a[5]=u=>i.$emit("onItemClick",u.nativeEvent)),onOnItemFocused:a[6]||(a[6]=u=>i.$emit("onItemFocused",u.nativeEvent)),onOnProtocolMismatch:a[7]||(a[7]=u=>i.$emit("onProtocolMismatch",u.nativeEvent))},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16,["protocolVersion","pageSpec","tabsData","actionPayload"]))}});let U;var re;try{const o=require("@extscreen/es3-vue");U=o.registerElement||((re=o.default)==null?void 0:re.registerElement)}catch{}const ce={install:o=>{if(!globalThis.__QtGridTabs_registered)if(U){const s=(d,p)=>{U(d,{component:{name:p?"QtGridTabs_Plugin":"QtGridTabs",processEventData(b,m){const l=b.handler||b,y=m||(l==null?void 0:l.nativeParams)||{};return l&&(l.nativeEvent=y),l}}})};s("qt-grid-tabs",!1),s("qt-grid-tabs-plugin",!0),s("QtGridTabs",!1),s("QtGridTabs_Plugin",!0),s("gt-tabs",!1),s("gt-tabs-plugin",!0),globalThis.__QtGridTabs_registered=!0,console.log("[@quicktvui/naddons] Successfully registered Native tag:","QtGridTabs")}else console.warn("[@quicktvui/naddons] Failed to find registerElement from @extscreen/es3-vue");o.component("GridTabs",B),o.component("qt-grid-tabs",B),o.component("gt-tabs",B)}};function ye(o,s){const d=c.ref(""),p=c.shallowRef([]),b=c.shallowRef([]);let m=!1,l=!1;const y="__virtual_single_tab__";let i="";const a=c.ref({}),u=e=>{const t=Array.isArray(e)?e:[e],n=JSON.stringify(t);if(l&&o.value){if(typeof o.value.dispatchAction=="function"){console.log("[useGridTabs] Calling Wrapper dispatchAction directly"),o.value.dispatchAction(n);return}let r=o.value;typeof o.value.getNativeNode=="function"?r=o.value.getNativeNode()||o.value:o.value.nativeRef&&(r=o.value.nativeRef),r?(console.log("[useGridTabs] Calling Native.callUIFunction(dispatchAction)"),S.Native.callUIFunction(r,"dispatchAction",[n])):console.warn("[useGridTabs] Native target is null or undefined, cannot call dispatchAction")}},h=(e,t)=>{if(!e)return!1;let n=!0;return e.id||(console.error(`[useGridTabs] ❌ 数据格式错误 (${t}): 卡片缺失必填字段 'id'。每个卡片必须有唯一标识才能进行后续更新!`,e),n=!1),e.viewType||(console.error(`[useGridTabs] ❌ 数据格式错误 (${t}): 卡片缺失必填字段 'viewType' (id: ${e.id||"未知"})。必须指定 Native 注册的视图类型或 Portal 标识!`,e),n=!1),n},X=(e,t)=>{if(!e)return!1;let n=!0;return e.tabId||(console.error(`[useGridTabs] ❌ 数据格式错误 (${t}): Tab 缺失必填字段 'tabId'。每个 Tab 必须有唯一标识!`,e),n=!1),(e.title===void 0||e.title===null)&&console.warn(`[useGridTabs] ⚠️ 数据格式警告 (${t}): Tab 缺失 'title' 字段 (tabId: ${e.tabId||"未知"}),导航栏可能显示为空。`,e),n},G=(e,t)=>{if(!e||e.length===0)return;N.clear();const n=e[0].hasOwnProperty("tabId")||e[0].hasOwnProperty("items")&&Array.isArray(e[0].items);m=t==="1d",t==="1d"&&n?console.error("[useGridTabs] ❌ 赋值错误: 你正在向 `items.value` (一维瀑布流) 赋值二维 Tabs 数据结构!请改用 `tabs.value = ...`"):t==="2d"&&!n&&console.error("[useGridTabs] ❌ 赋值错误: 你正在向 `tabs.value` (二维导航) 赋值一维卡片列表数据结构!请改用 `items.value = ...`"),t==="1d"?e.forEach((r,v)=>h(r,`items.value[${v}]`)):e.forEach((r,v)=>{X(r,`tabs.value[${v}]`),r.items&&Array.isArray(r.items)&&r.items.forEach((f,g)=>h(f,`tabs.value[${v}].items[${g}]`))}),l=!0,O()},N=new Set,O=(e="unknown")=>{if(!l){console.warn("[useGridTabs] triggerRootUpdate skipped because isInitialized is false");return}let t={protocolVersion:"1.28.0",gridBasis:(s==null?void 0:s.gridBasis)??30,unitType:(s==null?void 0:s.unitType)??"px",contentConfig:(s==null?void 0:s.contentConfig)??(s==null?void 0:s.layoutConfig)??{box:{padding:[0,60,60,60]},navContentGapNormal:0,itemGap:24},navConfig:(s==null?void 0:s.navConfig)??{dock:"left",mode:"fixed",renderType:"smart-hybrid",box:{size:[200,0]},expandedBox:{size:[300,0]}},cacheConfig:(s==null?void 0:s.cacheConfig)??{offscreenPageLimit:1,prefetchOffset:2,preLoadEnabled:!1,strategy:"data_priority"},animationConfig:(s==null?void 0:s.animationConfig)??{duration:300,easing:"ease-out"},interactionStrategy:(s==null?void 0:s.interactionStrategy)??{defaultFocus:"nav",interceptBack:!0,backMode:"home-first",autoScrollToTop:!0,edgeScrollProtection:.5},focusConfig:(s==null?void 0:s.focusConfig)??{boundaryLock:{left:!1,right:!1,top:!1,bottom:!1}},themeConfig:s==null?void 0:s.themeConfig,referenceResolution:(s==null?void 0:s.referenceResolution)??{w:1920,h:1080}},n=[];m?(t.navConfig={...t.navConfig,renderType:"none"},n=[{tabId:y,title:"Virtual Tab",hidden:!0,items:b.value}]):n=p.value;const r=JSON.stringify({page_spec:t,tabs:n});if(d.value==="")console.log(`[useGridTabs] triggerRootUpdate: Initializing tabsDataStr (length=${r.length})`),d.value=r,i=r;else{if(i===r){console.log("[useGridTabs] triggerRootUpdate: Data unchanged, skipping RELOAD_TABS");return}console.log(`[useGridTabs] triggerRootUpdate: Sending RELOAD_TABS action directly to Native (length=${r.length})`),d.value=r,i=r,u({op:"RELOAD_TABS",payload:{pageSpec:t,page_spec:t,tabs:n}})}},R=e=>{if(!e||typeof e!="object"||e.__isGridTabsProxy)return e;e.content&&typeof e.content=="object"&&!e.content.__isGridTabsProxy&&(e.content=new Proxy(e.content,{set(n,r,v,f){const g=Reflect.set(n,r,v,f);return e.id&&l&&u({op:"UPDATE_ITEM",itemId:e.id,payload:e}),g}}),Object.defineProperty(e.content,"__isGridTabsProxy",{value:!0,enumerable:!1}),Object.defineProperty(e.content,"__v_skip",{value:!0,enumerable:!1})),e.subItems&&Array.isArray(e.subItems)&&!e.subItems.__isGridTabsProxy&&(e.subItems=P(e.subItems,e.id),Object.defineProperty(e.subItems,"__isGridTabsProxy",{value:!0,enumerable:!1}),Object.defineProperty(e.subItems,"__v_skip",{value:!0,enumerable:!1}));const t=new Proxy(e,{set(n,r,v,f){const g=Reflect.set(n,r,v,f);return n.id&&l&&u({op:"UPDATE_ITEM",itemId:n.id,payload:n}),g}});return Object.defineProperty(t,"__isGridTabsProxy",{value:!0,enumerable:!1}),Object.defineProperty(t,"__v_skip",{value:!0,enumerable:!1}),t},P=(e,t)=>{for(let n=0;n<e.length;n++)e[n]=R(e[n]);return new Proxy(e,{get(n,r,v){return r==="push"?(...f)=>{f.forEach((q,me)=>h(q,`push(${me})`)),l||console.error("[useGridTabs] ❌ 时机错误: 在底层还未完成初始化时调用了 push()。请先对 items.value 或 tabs.value 进行全量赋值!");const g=f.map(q=>R(q)),k=Array.prototype.push.apply(n,g);return u({op:"APPEND_SUB_ITEMS",itemId:t,payload:{subItems:g}}),k}:r==="splice"?(...f)=>{const g=f.length>=2&&f[0]===0&&f[1]===n.length,k=Array.prototype.splice.apply(n,f);return l&&g&&t!==y?u({op:"UPDATE_TAB_STATE",itemId:t,payload:{action:"clear_items"}}):l&&O("items array spliced"),k}:Reflect.get(n,r,v)},set(n,r,v,f){if(r!=="length"&&!isNaN(Number(r))){l||console.error(`[useGridTabs] ❌ 时机错误: 在底层还未完成初始化时直接修改了索引 [${String(r)}]。请先对 items.value 或 tabs.value 进行全量赋值!`),h(v,`索引赋值 [${String(r)}]`);const g=R(v),k=Reflect.set(n,r,g,f);return g&&g.id&&u({op:"UPDATE_ITEM",itemId:g.id,payload:g}),k}return Reflect.set(n,r,v,f)}})},A=e=>(e.items&&Array.isArray(e.items)&&!e.items.__isGridTabsProxy&&(e.items=P(e.items,e.tabId),Object.defineProperty(e.items,"__isGridTabsProxy",{value:!0,enumerable:!1})),new Proxy(e,{set(t,n,r,v){if(n==="items"){let g=r;return Array.isArray(r)&&!r.__isGridTabsProxy&&(g=P(r,t.tabId),Object.defineProperty(g,"__isGridTabsProxy",{value:!0,enumerable:!1})),Reflect.set(t,n,g,v)}else if(n==="loadState"){const g=Reflect.set(t,n,r,v);return l&&t.tabId&&u({op:"UPDATE_TAB_STATE",itemId:t.tabId,payload:{loadState:r}}),g}return Reflect.set(t,n,r,v)}})),w=e=>{const t=e.map(n=>A(n));return new Proxy(t,{set(n,r,v,f){if(r!=="length"&&!isNaN(Number(r))){let g=v;v.__isGridTabsProxy||(g=A(v),Object.defineProperty(g,"__isGridTabsProxy",{value:!0,enumerable:!1}));const k=Reflect.set(n,r,g,f);return O(),k}return Reflect.set(n,r,v,f)}})};c.watch(p,(e,t)=>{if(console.log("[useGridTabs] watch(tabs) triggered:",{newTabs:e,isInitialized:l}),!e||e.length===0){d.value="",i="",l=!1;return}if(e.__isGridTabsProxy)console.log("[useGridTabs] newTabs is ALREADY a proxy, triggering root update"),O();else{console.log("[useGridTabs] newTabs is NOT a proxy, performing full deduceModeAndInitialize & wrapping");const n=w(e);Object.defineProperty(n,"__isGridTabsProxy",{value:!0,enumerable:!1}),G(n,"2d"),p.value=n}},{flush:"sync",deep:!1}),c.watch(b,(e,t)=>{if(console.log("[useGridTabs] watch(items) triggered:",{newItems:e,isInitialized:l}),!e||e.length===0){d.value="",i="",l=!1;return}if(e.__isGridTabsProxy)console.log("[useGridTabs] newItems is ALREADY a proxy, triggering root update"),O();else{console.log("[useGridTabs] newItems is NOT a proxy, performing full deduceModeAndInitialize & wrapping");const n=P(e,y);Object.defineProperty(n,"__isGridTabsProxy",{value:!0,enumerable:!1}),G(n,"1d"),b.value=n}},{flush:"sync",deep:!1});const T={},_=()=>{console.log("[useGridTabs] resetInitialization called manually"),l=!1,N.clear();for(const e in T)delete T[e]},I=e=>{if(!e||e.length===0){d.value="",l=!1;return}e[0].hasOwnProperty("tabId")||e[0].hasOwnProperty("items")&&Array.isArray(e[0].items)?p.value=e:b.value=e},$=e=>{a.value=e},x=c.computed(()=>({tabsData:d.value,onTabNeedsData:async(...e)=>{let t=e[0];if(t&&t.nativeEvent&&(t=t.nativeEvent),!a.value.onTabNeedsData)return;const{tabId:n,index:r,reason:v}=t;if(N.has(n)){console.log(`[useGridTabs] onTabNeedsData SKIP: tabId=${n} 已经发起过请求,防止死循环`);return}N.add(n);try{const f=await a.value.onTabNeedsData(n,r,v);if(f&&Array.isArray(f))if(T[n]=1,f.length>0){const g=p.value.find(k=>k.tabId===n);g&&(g.items?g.items.length>0&&g.items.splice(0,g.items.length):g.items=[],g.items.push(...f),g.loadState="ready",u({op:"UPDATE_TAB_STATE",itemId:n,payload:{loadState:"ready"}}))}else console.warn(`[useGridTabs] ⚠️ 警告: onTabNeedsData(tabId="${n}") 返回了空数组 []!`),console.warn("👉 如果你已经在此函数内手动调用了 push() 来追加数据,请在最后 return null 或 undefined。"),console.warn("👉 如果该 Tab 确实没有数据,返回 [] 可能会导致底层的 Header 等已有元素被清空,请注意检查。"),console.warn("👉 框架已为您拦截此次空数组覆盖,保留了当前的 DOM 结构。")}catch(f){console.error("[useGridTabs] onTabNeedsData 执行失败:",f),N.delete(n)}},onLoadMore:async(...e)=>{let t=e[0];if(t&&t.nativeEvent&&(t=t.nativeEvent),!a.value.onLoadMore)return;const{tabId:n,itemId:r}=t,f=(T[n]||1)+1;console.log(`[useGridTabs] 拦截到底层 onLoadMore,强行接管页码: tabId=${n}, pageNo=${f}`);try{const g=await a.value.onLoadMore(n,f,r);if(g&&Array.isArray(g))if(g.length>0)if(T[n]=f,m)b.value.push(...g);else{const k=p.value.find(q=>q.tabId===n);k&&k.items&&k.items.push(...g)}else console.warn(`[useGridTabs] ⚠️ 警告: onLoadMore(tabId="${n}", pageNo="${f}") 返回了空数组 []!`),console.warn('👉 如果这是你的最后一页数据,推荐在卡片列表中追加一个 type="no_more" 的 footer 卡片,而不是仅仅返回空。'),console.warn("👉 框架已忽略本次空数据追加,且不会自增页码。")}catch(g){console.error("[useGridTabs] onLoadMore 业务层请求失败:",g)}},onItemPresence:(...e)=>{let t=e[0];if(console.log("[useGridTabs] ⚡️ bindings caught onItemPresence:",t),a.value.onItemPresence)try{let n=typeof t=="string"?t:(t==null?void 0:t.nativeEvent)||t;n&&typeof n.data=="string"&&(n=n.data);const r=typeof n=="string"?JSON.parse(n):n;r&&r.type==="VIEW_PRESENCE_BATCH"&&Array.isArray(r.payload)?r.payload.forEach(v=>{v.itemId&&typeof v.itemId=="string"&&v.itemId.startsWith("fallback_pos_")&&console.warn(`[useGridTabs] ⚠️ 警告:检测到列表项曝光 (index=${v.index}),但未配置 itemId。请检查传入的 items 数组,务必为每个数据项指定唯一的 itemId,否则底层无法准确进行去重与曝光上报。`),a.value.onItemPresence(v)}):a.value.onItemPresence(r)}catch(n){console.error("[useGridTabs] Failed to parse onItemPresence event payload:",n),a.value.onItemPresence(t)}},onTabSelected:(...e)=>{let t=e[0];t&&t.nativeEvent&&(t=t.nativeEvent),a.value.onTabSelected&&a.value.onTabSelected(t)},onItemClick:(...e)=>{let t=e[0];if(console.log("[useGridTabs] RAW onItemClick intercepted from Native:",t),t&&t.nativeEvent&&(t=t.nativeEvent),a.value.onItemClick)try{let n=typeof t=="string"?t:(t==null?void 0:t.data)||t;console.log("[useGridTabs] Parsed eventStr:",n);const r=typeof n=="string"?JSON.parse(n):n;a.value.onItemClick(r)}catch(n){console.error("[useGridTabs] Failed to parse onItemClick event payload:",n),a.value.onItemClick(t)}else console.warn("[useGridTabs] onItemClick triggered but NO callback registered in callbacksRef!")},onItemFocused:(...e)=>{let t=e[0];if(t&&t.nativeEvent&&(t=t.nativeEvent),a.value.onItemFocused)try{let n=typeof t=="string"?t:(t==null?void 0:t.data)||t;const r=typeof n=="string"?JSON.parse(n):n;a.value.onItemFocused(r)}catch(n){console.error("[useGridTabs] Failed to parse onItemFocused event payload:",n),a.value.onItemFocused(t)}},onTabFocused:(...e)=>{let t=e[0];t&&t.nativeEvent&&(t=t.nativeEvent),a.value.onTabFocused&&a.value.onTabFocused(t)}}));return{tabsDataStr:d,bindings:x,tabs:p,items:b,initData:I,setCallbacks:$,updateItem:(e,t)=>{if(!l){console.error("[useGridTabs] ❌ 时机错误: 尚未初始化数据,无法调用 updateItem");return}u({op:"UPDATE_ITEM",itemId:e,payload:t});const n=r=>{for(const v in t)v==="content"&&r.content?Object.assign(r.content,t.content):r[v]=t[v]};if(m){const r=b.value.find(v=>v.id===e);r&&n(r)}else for(const r of p.value)if(r.items){const v=r.items.find(f=>f.id===e);if(v){n(v);break}}},dispatchAction:u,resetInitialization:_,getFocusState:async()=>new Promise((e,t)=>{let n=o.value;typeof o.value.getNativeNode=="function"?n=o.value.getNativeNode()||o.value:o.value.nativeRef&&(n=o.value.nativeRef),S.Native.callUIFunction(n,"getFocusState",[],r=>{try{const v=typeof r=="string"?JSON.parse(r):r;e(v)}catch(v){t(v)}})}),getItemRect:async e=>new Promise((t,n)=>{let r=o.value;typeof o.value.getNativeNode=="function"?r=o.value.getNativeNode()||o.value:o.value.nativeRef&&(r=o.value.nativeRef),S.Native.callUIFunction(r,"getItemRect",[e],v=>{try{const f=typeof v=="string"?JSON.parse(v):v;t(f)}catch(f){n(f)}})})}}const te="QtKeyboard",K=c.defineComponent({__name:"Keyboard",props:{backgroundColor:{},backgroundGradient:{},textColor:{},weakTextColor:{},focusBackgroundColor:{},focusTextColor:{},placeholder:{},textFullKeyboard:{},textT9Keyboard:{},textClear:{},textDelete:{},currentInput:{},autofocus:{type:Boolean},requestFocus:{type:Boolean}},emits:["onInputChanged","onKeyPressed"],setup(o,{expose:s}){const d=c.ref(),p=C(),b=te+"_Plugin",l=(p.isPluginActive?b:te).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.extraui","com.quicktvui.plugin.extraui.ExtraUIPluginApp");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value},requestFocus:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"requestFocus",i)}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d,backgroundColor:o.backgroundColor,backgroundGradient:o.backgroundGradient,textColor:o.textColor,weakTextColor:o.weakTextColor,focusBackgroundColor:o.focusBackgroundColor,focusTextColor:o.focusTextColor,placeholder:o.placeholder,textFullKeyboard:o.textFullKeyboard,textT9Keyboard:o.textT9Keyboard,textClear:o.textClear,textDelete:o.textDelete,currentInput:o.currentInput,autofocus:o.autofocus,requestFocus:o.requestFocus,onOnInputChanged:a[0]||(a[0]=u=>i.$emit("onInputChanged",u.nativeEvent)),onOnKeyPressed:a[1]||(a[1]=u=>i.$emit("onKeyPressed",u.nativeEvent))},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16,["backgroundColor","backgroundGradient","textColor","weakTextColor","focusBackgroundColor","focusTextColor","placeholder","textFullKeyboard","textT9Keyboard","textClear","textDelete","currentInput","autofocus","requestFocus"]))}});let V;var ae;try{const o=require("@extscreen/es3-vue");V=o.registerElement||((ae=o.default)==null?void 0:ae.registerElement)}catch{}const ue={install:o=>{if(!globalThis.__QtKeyboard_registered)if(V){const s=(d,p)=>{V(d,{component:{name:p?"QtKeyboard_Plugin":"QtKeyboard",processEventData(b,m){const l=b.handler||b,y=m||(l==null?void 0:l.nativeParams)||{};return l&&(l.nativeEvent=y),l}}})};s("qt-keyboard",!1),s("qt-keyboard-plugin",!0),s("QtKeyboard",!1),s("QtKeyboard_Plugin",!0),globalThis.__QtKeyboard_registered=!0,console.log("[@quicktvui/naddons] Successfully registered Native tag:","QtKeyboard")}else console.warn("[@quicktvui/naddons] Failed to find registerElement from @extscreen/es3-vue");o.component("Keyboard",K),o.component("qt-keyboard",K)}},ne="QtPortalPool",j=c.defineComponent({__name:"PortalPool",setup(o,{expose:s}){const d=c.ref(),p=C(),b=ne+"_Plugin",l=(p.isPluginActive?b:ne).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.glintui");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16))}});let z;var ie;try{const o=require("@extscreen/es3-vue");z=o.registerElement||((ie=o.default)==null?void 0:ie.registerElement)}catch{}const de={install:o=>{if(!globalThis.__QtPortalPool_registered)if(z){const s=(d,p)=>{z(d,{component:{name:p?"QtPortalPool_Plugin":"QtPortalPool",processEventData(b,m){const l=b.handler||b,y=m||(l==null?void 0:l.nativeParams)||{};return l&&(l.nativeEvent=y),l}}})};s("qt-portal-pool",!1),s("qt-portal-pool-plugin",!0),s("QtPortalPool",!1),s("QtPortalPool_Plugin",!0),globalThis.__QtPortalPool_registered=!0,console.log("[@quicktvui/naddons] Successfully registered Native tag:","QtPortalPool")}else console.warn("[@quicktvui/naddons] Failed to find registerElement from @extscreen/es3-vue");o.component("PortalPool",j),o.component("qt-portal-pool",j)}},oe="QtPortalItem",W=c.defineComponent({__name:"PortalItem",props:{portalId:{}},setup(o,{expose:s}){const d=c.ref(),p=C(),b=oe+"_Plugin",l=(p.isPluginActive?b:oe).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.glintui");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d,portalId:o.portalId},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16,["portalId"]))}});let Z;var le;try{const o=require("@extscreen/es3-vue");Z=o.registerElement||((le=o.default)==null?void 0:le.registerElement)}catch{}const ve={install:o=>{if(!globalThis.__QtPortalItem_registered)if(Z){const s=(d,p)=>{Z(d,{component:{name:p?"QtPortalItem_Plugin":"QtPortalItem",processEventData(b,m){const l=b.handler||b,y=m||(l==null?void 0:l.nativeParams)||{};return l&&(l.nativeEvent=y),l}}})};s("qt-portal-item",!1),s("qt-portal-item-plugin",!0),s("QtPortalItem",!1),s("QtPortalItem_Plugin",!0),globalThis.__QtPortalItem_registered=!0,console.log("[@quicktvui/naddons] Successfully registered Native tag:","QtPortalItem")}else console.warn("[@quicktvui/naddons] Failed to find registerElement from @extscreen/es3-vue");o.component("PortalItem",W),o.component("qt-portal-item",W)}},se="QtHsvBackground",H=c.defineComponent({__name:"HsvBackground",props:{hue:{default:-2}},setup(o,{expose:s}){const d=c.ref(),p=C(),b=se+"_Plugin",l=(p.isPluginActive?b:se).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.glintui");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d,hue:o.hue},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16,["hue"]))}}),ge={install(o){o.component("qt-hsv-background",H),o.component("HsvBackground",H)}},fe={skipPluginCheck:!1},Q=new Set;function F(o,s,d){return c.defineComponent({name:`${o}AsyncWrapper`,inheritAttrs:!1,props:{skipPluginCheck:{type:Boolean,default:!1}},setup(p,{slots:b,attrs:m,expose:l}){const y=c.ref("loading"),i=c.ref(""),a=c.ref(),u=globalThis.__VUE_INSTANCE__;l({getNativeNode:()=>{let P=a.value;return!P&&u&&u.vnode&&u.vnode.el&&(P=u.vnode.el,P.childNodes&&P.childNodes.length>0&&(P=P.childNodes[0])),P},nativeRef:a});let G=null,N=null;try{G=L.useES(),N=L.useESPlugin()}catch(P){console.warn("[withAsyncPlugin] 获取 useES 或 useESPlugin 失败,可能处于非 ES 环境。",P)}const O=async()=>{if(!G||typeof G.isComponentRegistered!="function")return console.log("[withAsyncPlugin] es.isComponentRegistered 不可用"),!1;try{const P=await G.isComponentRegistered(o);if(console.log(`[withAsyncPlugin] isComponentRegistered('${o}') 返回:`,P),P===!0||P&&typeof P=="object"&&(P.registered===!0||P.isRegistered===!0))return!0;try{const A=await S.Native.callNativeWithPromise("ExtendModule","getCoreSDKInfo");if(A&&A.core_version){const w=A.core_version;console.log(`[withAsyncPlugin] 当前引擎核心版本: ${w}`);const T=w.split(".").map(_=>parseInt(_,10));if(T.length>=3&&!isNaN(T[0])&&!isNaN(T[1])&&!isNaN(T[2]))if(T[0]*1e6+T[1]*1e3+T[2]>=1011205){console.log(`[withAsyncPlugin] 引擎 >= 1.11.205,使用 ExtendModule 检查 Controller: ${o}`);const I=o.split("-").map(E=>E.charAt(0).toUpperCase()+E.slice(1)).join("");console.log(`[withAsyncPlugin] 同时检查原名和驼峰名: ${o}, ${I}`);const[$,x]=await Promise.all([S.Native.callNativeWithPromise("ExtendModule","isComponentRegistered",o).catch(()=>!1),S.Native.callNativeWithPromise("ExtendModule","isComponentRegistered",I).catch(()=>!1)]);if(console.log(`[withAsyncPlugin] ExtendModule.isComponentRegistered 返回: [${$}, ${x}]`),$===!0||x===!0)return!0}else console.log(`[withAsyncPlugin] 引擎版本 ${w} < 1.11.205,跳过 ExtendModule 检查`);else console.log(`[withAsyncPlugin] 无法解析引擎版本号: ${w}`)}}catch(A){console.log("[withAsyncPlugin] 获取引擎版本或检查 Controller 失败:",A)}return!1}catch(P){return console.warn("[withAsyncPlugin] 检查组件注册状态异常:",P),!1}},R=async()=>{if(fe.skipPluginCheck||p.skipPluginCheck){console.log(`[withAsyncPlugin] 跳过 ${o} 插件检查 (skipPluginCheck = true)`),y.value="ready";return}if(!s){y.value="ready";return}const P=await O();if(console.log(`[withAsyncPlugin] 拦截检查 - ${o} 是否已注册:`,P),P||Q.has(s)){y.value="ready",Q.add(s),console.log("[withAsyncPlugin] 组件已注册,跳过安装流程");return}if(!N){console.warn(`[withAsyncPlugin] 无法获取 useESPlugin 实例,可能处于内置 AAR 环境或非插件环境,尝试直接渲染 ${o}`),y.value="ready";return}console.log(`[withAsyncPlugin] 开始动态安装插件: ${s}`);try{await new Promise((A,w)=>{let T;const _={onPluginInstallSuccess(I,$,x){I===s&&(clearTimeout(T),N.removeListener(_),console.log(`[withAsyncPlugin] 安装成功 pkg=${I} 状态码=${$}`),$==1003||$==1001?(d?(console.log(`[withAsyncPlugin] 触发反射初始化: ${d}`),S.Native.callNative("EsNativeModule","callReflect",{entry:{from:d,method:"setup"}})):console.log("[withAsyncPlugin] 安装成功,跳过反射初始化(无 pluginInitClass)"),A()):w(new Error(`安装失败 pkg=${I} status=${$} msg=${x}`)))},onPluginInstallError(I,$,x){I===s&&(clearTimeout(T),N.removeListener(_),w(new Error(`安装失败 pkg=${I} status=${$} msg=${x}`)))}};N.addListener({pkg:s},_),T=setTimeout(()=>{N.removeListener(_),w(new Error(`插件安装超时: ${s}`))},8e3),typeof N.installPlugin=="function"?N.installPlugin({pkg:s}):typeof N.install=="function"?N.install(s):w(new Error("当前运行时不支持 install / installPlugin"))}),await c.nextTick(),Q.add(s),y.value="ready"}catch(A){console.error("[withAsyncPlugin] 插件加载失败:",A),i.value=(A==null?void 0:A.message)||String(A),y.value="error"}};return c.onMounted(()=>{R()}),()=>{const P={display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",...m.style||{}};m.width!==void 0&&!P.width&&(P.width=typeof m.width=="number"?`${m.width}px`:m.width),m.height!==void 0&&!P.height&&(P.height=typeof m.height=="number"?`${m.height}px`:m.height);const A=m.class?`qt-plugin-container ${m.class}`:"qt-plugin-container",w={class:A,style:P,clipChildren:!1,clipPadding:!1,clipToPadding:!1};if(y.value==="loading")return c.h("div",w,[c.h("div",{style:{color:"white",fontSize:"30px"}},"插件加载中...")]);if(y.value==="error")return c.h("div",w,[c.h("div",{style:{color:"white",fontSize:"30px",backgroundColor:"rgba(255,0,0,0.5)"}},`插件加载失败: ${i.value}`)]);const T={},_={};for(const[E,D]of Object.entries(m))if(E.startsWith("on")&&typeof D=="function"){let M=E;E.startsWith("onOn")&&(M="on"+E.slice(4)),_[M]=D}else if(E.startsWith("on")&&Array.isArray(D)){let M=E;E.startsWith("onOn")&&(M="on"+E.slice(4)),_[M]=D}else E.startsWith("onOn")||(T[E]=D);const I={...T,..._,class:A,style:P,ref:E=>{a.value=E}},$=I.tabsData||"",x=I.actionPayload||"";return console.log("[withAsyncPlugin] 最终准备传递给 h() 的属性键集合:",Object.keys(I),"tabsData.length=",$.length,"actionPayload.length=",x.length),c.h(o,I,b.default?b.default():[])}}})}const Y=Symbol("AddonEnvContext"),pe={isPluginActive:!1,nameSuffix:"",pluginPackageName:"com.quicktvui.plugin.glintui",builtInVersions:{}};async function Pe(o="com.quicktvui.plugin.glintui",s="_Plugin"){const d=L.useES();let p={};try{const i=await S.Native.callNativeModule("AddonEnvModule","getBuiltInVersions",[]);i&&typeof i=="object"&&(p=i)}catch(i){console.warn("[AddonProvider] Failed to fetch built-in versions from AddonEnvModule",i)}const b=`QtGridTabs${s}`,m=d.isComponentRegistered(b),l=m instanceof Promise?await m:m,y={isPluginActive:l,nameSuffix:l?s:"",pluginPackageName:l?`${o}.ext`:o,builtInVersions:p};return console.info("[AddonProvider] Environment initialized:",y),y}let J=c.ref(pe);function he(o){J.value=o,c.provide(Y,J)}function C(){var o;return((o=c.inject(Y,J))==null?void 0:o.value)||pe}const be={install:o=>{o.use(ce),o.use(ue),o.use(de),o.use(ve),o.use(ge)}};exports.ADDON_ENV_CONTEXT_KEY=Y;exports.GridTabs=B;exports.GridTabsPlugin=ce;exports.HsvBackground=H;exports.HsvBackgroundPlugin=ge;exports.Keyboard=K;exports.KeyboardPlugin=ue;exports.PortalItem=W;exports.PortalItemPlugin=ve;exports.PortalPool=j;exports.PortalPoolPlugin=de;exports.QuickTVUINAddons=be;exports.QuickTVUINAddonsConfig=fe;exports.default=be;exports.initAddonEnv=Pe;exports.provideAddonEnv=he;exports.useAddonEnv=C;exports.useGridTabs=ye;exports.withAsyncPlugin=F;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("vue"),S=require("@extscreen/es3-vue"),L=require("@extscreen/es3-core"),ee="QtGridTabs",B=c.defineComponent({__name:"GridTabs",props:{protocolVersion:{},pageSpec:{},tabsData:{},actionPayload:{}},emits:["onTabSelected","onTabNeedsData","onLoadMore","onItemPresence","onTabFocused","onItemClick","onItemFocused","onProtocolMismatch"],setup(o,{expose:s}){const d=c.ref(),p=C(),b=ee+"_Plugin",l=(p.isPluginActive?b:ee).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.glintui");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value},dispatchAction:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"dispatchAction",i)},scrollToTop:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"scrollToTop",i)},getFocusState:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"getFocusState",i)},getItemRect:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"getItemRect",i)}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d,protocolVersion:o.protocolVersion,pageSpec:o.pageSpec,tabsData:o.tabsData,actionPayload:o.actionPayload,onOnTabSelected:a[0]||(a[0]=u=>i.$emit("onTabSelected",u.nativeEvent)),onOnTabNeedsData:a[1]||(a[1]=u=>i.$emit("onTabNeedsData",u.nativeEvent)),onOnLoadMore:a[2]||(a[2]=u=>i.$emit("onLoadMore",u.nativeEvent)),onOnItemPresence:a[3]||(a[3]=u=>i.$emit("onItemPresence",u.nativeEvent)),onOnTabFocused:a[4]||(a[4]=u=>i.$emit("onTabFocused",u.nativeEvent)),onOnItemClick:a[5]||(a[5]=u=>i.$emit("onItemClick",u.nativeEvent)),onOnItemFocused:a[6]||(a[6]=u=>i.$emit("onItemFocused",u.nativeEvent)),onOnProtocolMismatch:a[7]||(a[7]=u=>i.$emit("onProtocolMismatch",u.nativeEvent))},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16,["protocolVersion","pageSpec","tabsData","actionPayload"]))}});let U;var re;try{const o=require("@extscreen/es3-vue");U=o.registerElement||((re=o.default)==null?void 0:re.registerElement)}catch{}const ce={install:o=>{if(!globalThis.__QtGridTabs_registered)if(U){const s=(d,p)=>{U(d,{component:{name:p?"QtGridTabs_Plugin":"QtGridTabs",processEventData(b,m){const l=b.handler||b,y=m||(l==null?void 0:l.nativeParams)||{};return l&&(l.nativeEvent=y),l}}})};s("qt-grid-tabs",!1),s("qt-grid-tabs-plugin",!0),s("QtGridTabs",!1),s("QtGridTabs_Plugin",!0),s("gt-tabs",!1),s("gt-tabs-plugin",!0),globalThis.__QtGridTabs_registered=!0,console.log("[@quicktvui/naddons] Successfully registered Native tag:","QtGridTabs")}else console.warn("[@quicktvui/naddons] Failed to find registerElement from @extscreen/es3-vue");o.component("GridTabs",B),o.component("qt-grid-tabs",B),o.component("gt-tabs",B)}};function ye(o,s){const d=c.ref(""),p=c.shallowRef([]),b=c.shallowRef([]);let m=!1,l=!1;const y="__virtual_single_tab__";let i="";const a=c.ref({}),u=e=>{const t=Array.isArray(e)?e:[e],n=JSON.stringify(t);if(l&&o.value){if(typeof o.value.dispatchAction=="function"){console.log("[useGridTabs] Calling Wrapper dispatchAction directly"),o.value.dispatchAction(n);return}let r=o.value;typeof o.value.getNativeNode=="function"?r=o.value.getNativeNode()||o.value:o.value.nativeRef&&(r=o.value.nativeRef),r?(console.log("[useGridTabs] Calling Native.callUIFunction(dispatchAction)"),S.Native.callUIFunction(r,"dispatchAction",[n])):console.warn("[useGridTabs] Native target is null or undefined, cannot call dispatchAction")}},h=(e,t)=>{if(!e)return!1;let n=!0;return e.id||(console.error(`[useGridTabs] ❌ 数据格式错误 (${t}): 卡片缺失必填字段 'id'。每个卡片必须有唯一标识才能进行后续更新!`,e),n=!1),e.viewType||(console.error(`[useGridTabs] ❌ 数据格式错误 (${t}): 卡片缺失必填字段 'viewType' (id: ${e.id||"未知"})。必须指定 Native 注册的视图类型或 Portal 标识!`,e),n=!1),n},X=(e,t)=>{if(!e)return!1;let n=!0;return e.tabId||(console.error(`[useGridTabs] ❌ 数据格式错误 (${t}): Tab 缺失必填字段 'tabId'。每个 Tab 必须有唯一标识!`,e),n=!1),(e.title===void 0||e.title===null)&&console.warn(`[useGridTabs] ⚠️ 数据格式警告 (${t}): Tab 缺失 'title' 字段 (tabId: ${e.tabId||"未知"}),导航栏可能显示为空。`,e),n},x=(e,t)=>{if(!e||e.length===0)return;N.clear();const n=e[0].hasOwnProperty("tabId")||e[0].hasOwnProperty("items")&&Array.isArray(e[0].items);m=t==="1d",t==="1d"&&n?console.error("[useGridTabs] ❌ 赋值错误: 你正在向 `items.value` (一维瀑布流) 赋值二维 Tabs 数据结构!请改用 `tabs.value = ...`"):t==="2d"&&!n&&console.error("[useGridTabs] ❌ 赋值错误: 你正在向 `tabs.value` (二维导航) 赋值一维卡片列表数据结构!请改用 `items.value = ...`"),t==="1d"?e.forEach((r,v)=>h(r,`items.value[${v}]`)):e.forEach((r,v)=>{X(r,`tabs.value[${v}]`),r.items&&Array.isArray(r.items)&&r.items.forEach((f,g)=>h(f,`tabs.value[${v}].items[${g}]`))}),l=!0,O()},N=new Set,O=(e="unknown")=>{if(!l){console.warn("[useGridTabs] triggerRootUpdate skipped because isInitialized is false");return}let t={protocolVersion:"1.28.0",gridBasis:(s==null?void 0:s.gridBasis)??30,unitType:(s==null?void 0:s.unitType)??"px",contentConfig:(s==null?void 0:s.contentConfig)??(s==null?void 0:s.layoutConfig)??{box:{padding:[0,60,60,60]},navContentGapNormal:0,itemGap:24},navConfig:(s==null?void 0:s.navConfig)??{dock:"left",mode:"fixed",renderType:"smart-hybrid",box:{size:[200,0]},expandedBox:{size:[300,0]}},cacheConfig:(s==null?void 0:s.cacheConfig)??{offscreenPageLimit:1,prefetchOffset:2,preLoadEnabled:!1,strategy:"data_priority"},animationConfig:(s==null?void 0:s.animationConfig)??{duration:300,easing:"ease-out"},interactionStrategy:(s==null?void 0:s.interactionStrategy)??{defaultFocus:"nav",interceptBack:!0,backMode:"home-first",autoScrollToTop:!0,edgeScrollProtection:.5},focusConfig:(s==null?void 0:s.focusConfig)??{boundaryLock:{left:!1,right:!1,top:!1,bottom:!1}},themeConfig:s==null?void 0:s.themeConfig,referenceResolution:(s==null?void 0:s.referenceResolution)??{w:1920,h:1080}},n=[];m?(t.navConfig={...t.navConfig,renderType:"none"},n=[{tabId:y,title:"Virtual Tab",hidden:!0,items:b.value}]):n=p.value;const r=JSON.stringify({page_spec:t,tabs:n});if(d.value==="")console.log(`[useGridTabs] triggerRootUpdate: Initializing tabsDataStr (length=${r.length})`),d.value=r,i=r;else{if(i===r){console.log("[useGridTabs] triggerRootUpdate: Data unchanged, skipping RELOAD_TABS");return}console.log(`[useGridTabs] triggerRootUpdate: Sending RELOAD_TABS action directly to Native (length=${r.length})`),d.value=r,i=r,u({op:"RELOAD_TABS",payload:{pageSpec:t,page_spec:t,tabs:n}})}},R=e=>{if(!e||typeof e!="object"||e.__isGridTabsProxy)return e;e.content&&typeof e.content=="object"&&!e.content.__isGridTabsProxy&&(e.content=new Proxy(e.content,{set(n,r,v,f){const g=Reflect.set(n,r,v,f);return e.id&&l&&u({op:"UPDATE_ITEM",itemId:e.id,payload:e}),g}}),Object.defineProperty(e.content,"__isGridTabsProxy",{value:!0,enumerable:!1}),Object.defineProperty(e.content,"__v_skip",{value:!0,enumerable:!1})),e.subItems&&Array.isArray(e.subItems)&&!e.subItems.__isGridTabsProxy&&(e.subItems=P(e.subItems,e.id),Object.defineProperty(e.subItems,"__isGridTabsProxy",{value:!0,enumerable:!1}),Object.defineProperty(e.subItems,"__v_skip",{value:!0,enumerable:!1}));const t=new Proxy(e,{set(n,r,v,f){const g=Reflect.set(n,r,v,f);return n.id&&l&&u({op:"UPDATE_ITEM",itemId:n.id,payload:n}),g}});return Object.defineProperty(t,"__isGridTabsProxy",{value:!0,enumerable:!1}),Object.defineProperty(t,"__v_skip",{value:!0,enumerable:!1}),t},P=(e,t)=>{for(let n=0;n<e.length;n++)e[n]=R(e[n]);return new Proxy(e,{get(n,r,v){return r==="push"?(...f)=>{f.forEach((q,me)=>h(q,`push(${me})`)),l||console.error("[useGridTabs] ❌ 时机错误: 在底层还未完成初始化时调用了 push()。请先对 items.value 或 tabs.value 进行全量赋值!");const g=f.map(q=>R(q)),k=Array.prototype.push.apply(n,g);return u({op:"APPEND_SUB_ITEMS",itemId:t,payload:{subItems:g}}),k}:r==="splice"?(...f)=>{const g=f.length>=2&&f[0]===0&&f[1]===n.length,k=Array.prototype.splice.apply(n,f);return l&&g&&t!==y?u({op:"UPDATE_TAB_STATE",itemId:t,payload:{action:"clear_items"}}):l&&O("items array spliced"),k}:Reflect.get(n,r,v)},set(n,r,v,f){if(r!=="length"&&!isNaN(Number(r))){l||console.error(`[useGridTabs] ❌ 时机错误: 在底层还未完成初始化时直接修改了索引 [${String(r)}]。请先对 items.value 或 tabs.value 进行全量赋值!`),h(v,`索引赋值 [${String(r)}]`);const g=R(v),k=Reflect.set(n,r,g,f);return g&&g.id&&u({op:"UPDATE_ITEM",itemId:g.id,payload:g}),k}return Reflect.set(n,r,v,f)}})},A=e=>(e.items&&Array.isArray(e.items)&&!e.items.__isGridTabsProxy&&(e.items=P(e.items,e.tabId),Object.defineProperty(e.items,"__isGridTabsProxy",{value:!0,enumerable:!1})),new Proxy(e,{set(t,n,r,v){if(n==="items"){let g=r;return Array.isArray(r)&&!r.__isGridTabsProxy&&(g=P(r,t.tabId),Object.defineProperty(g,"__isGridTabsProxy",{value:!0,enumerable:!1})),Reflect.set(t,n,g,v)}else if(n==="loadState"){const g=Reflect.set(t,n,r,v);return l&&t.tabId&&u({op:"UPDATE_TAB_STATE",itemId:t.tabId,payload:{loadState:r}}),g}return Reflect.set(t,n,r,v)}})),w=e=>{const t=e.map(n=>A(n));return new Proxy(t,{set(n,r,v,f){if(r!=="length"&&!isNaN(Number(r))){let g=v;v.__isGridTabsProxy||(g=A(v),Object.defineProperty(g,"__isGridTabsProxy",{value:!0,enumerable:!1}));const k=Reflect.set(n,r,g,f);return O(),k}return Reflect.set(n,r,v,f)}})};c.watch(p,(e,t)=>{if(console.log("[useGridTabs] watch(tabs) triggered:",{newTabs:e,isInitialized:l}),!e||e.length===0){d.value="",i="",l=!1;return}if(e.__isGridTabsProxy)console.log("[useGridTabs] newTabs is ALREADY a proxy, triggering root update"),O();else{console.log("[useGridTabs] newTabs is NOT a proxy, performing full deduceModeAndInitialize & wrapping");const n=w(e);Object.defineProperty(n,"__isGridTabsProxy",{value:!0,enumerable:!1}),x(n,"2d"),p.value=n}},{flush:"sync",deep:!1}),c.watch(b,(e,t)=>{if(console.log("[useGridTabs] watch(items) triggered:",{newItems:e,isInitialized:l}),!e||e.length===0){d.value="",i="",l=!1;return}if(e.__isGridTabsProxy)console.log("[useGridTabs] newItems is ALREADY a proxy, triggering root update"),O();else{console.log("[useGridTabs] newItems is NOT a proxy, performing full deduceModeAndInitialize & wrapping");const n=P(e,y);Object.defineProperty(n,"__isGridTabsProxy",{value:!0,enumerable:!1}),x(n,"1d"),b.value=n}},{flush:"sync",deep:!1});const T={},_=()=>{console.log("[useGridTabs] resetInitialization called manually"),l=!1,N.clear();for(const e in T)delete T[e]},I=e=>{if(!e||e.length===0){d.value="",l=!1;return}e[0].hasOwnProperty("tabId")||e[0].hasOwnProperty("items")&&Array.isArray(e[0].items)?p.value=e:b.value=e},$=e=>{a.value=e},G=c.computed(()=>({tabsData:d.value,onTabNeedsData:async(...e)=>{let t=e[0];if(t&&t.nativeEvent&&(t=t.nativeEvent),!a.value.onTabNeedsData)return;const{tabId:n,index:r,reason:v}=t;if(N.has(n)){console.log(`[useGridTabs] onTabNeedsData SKIP: tabId=${n} 已经发起过请求,防止死循环`);return}N.add(n);try{const f=await a.value.onTabNeedsData(n,r,v);if(f&&Array.isArray(f))if(T[n]=1,f.length>0){const g=p.value.find(k=>k.tabId===n);g&&(g.items?g.items.length>0&&g.items.splice(0,g.items.length):g.items=[],g.items.push(...f),g.loadState="ready",u({op:"UPDATE_TAB_STATE",itemId:n,payload:{loadState:"ready"}}))}else console.warn(`[useGridTabs] ⚠️ 警告: onTabNeedsData(tabId="${n}") 返回了空数组 []!`),console.warn("👉 如果你已经在此函数内手动调用了 push() 来追加数据,请在最后 return null 或 undefined。"),console.warn("👉 如果该 Tab 确实没有数据,返回 [] 可能会导致底层的 Header 等已有元素被清空,请注意检查。"),console.warn("👉 框架已为您拦截此次空数组覆盖,保留了当前的 DOM 结构。")}catch(f){console.error("[useGridTabs] onTabNeedsData 执行失败:",f),N.delete(n)}},onLoadMore:async(...e)=>{let t=e[0];if(t&&t.nativeEvent&&(t=t.nativeEvent),!a.value.onLoadMore)return;const{tabId:n,itemId:r}=t,f=(T[n]||1)+1;console.log(`[useGridTabs] 拦截到底层 onLoadMore,强行接管页码: tabId=${n}, pageNo=${f}`);try{const g=await a.value.onLoadMore(n,f,r);if(g&&Array.isArray(g))if(g.length>0)if(T[n]=f,m)b.value.push(...g);else{const k=p.value.find(q=>q.tabId===n);k&&k.items&&k.items.push(...g)}else console.warn(`[useGridTabs] ⚠️ 警告: onLoadMore(tabId="${n}", pageNo="${f}") 返回了空数组 []!`),console.warn('👉 如果这是你的最后一页数据,推荐在卡片列表中追加一个 type="no_more" 的 footer 卡片,而不是仅仅返回空。'),console.warn("👉 框架已忽略本次空数据追加,且不会自增页码。")}catch(g){console.error("[useGridTabs] onLoadMore 业务层请求失败:",g)}},onItemPresence:(...e)=>{let t=e[0];if(console.log("[useGridTabs] ⚡️ bindings caught onItemPresence:",t),a.value.onItemPresence)try{let n=typeof t=="string"?t:(t==null?void 0:t.nativeEvent)||t;n&&typeof n.data=="string"&&(n=n.data);const r=typeof n=="string"?JSON.parse(n):n;r&&r.type==="VIEW_PRESENCE_BATCH"&&Array.isArray(r.payload)?r.payload.forEach(v=>{v.itemId&&typeof v.itemId=="string"&&v.itemId.startsWith("fallback_pos_")&&console.warn(`[useGridTabs] ⚠️ 警告:检测到列表项曝光 (index=${v.index}),但未配置 itemId。请检查传入的 items 数组,务必为每个数据项指定唯一的 itemId,否则底层无法准确进行去重与曝光上报。`),a.value.onItemPresence(v)}):a.value.onItemPresence(r)}catch(n){console.error("[useGridTabs] Failed to parse onItemPresence event payload:",n),a.value.onItemPresence(t)}},onTabSelected:(...e)=>{let t=e[0];t&&t.nativeEvent&&(t=t.nativeEvent),a.value.onTabSelected&&a.value.onTabSelected(t)},onItemClick:(...e)=>{let t=e[0];if(console.log("[useGridTabs] RAW onItemClick intercepted from Native:",t),t&&t.nativeEvent&&(t=t.nativeEvent),a.value.onItemClick)try{let n=typeof t=="string"?t:(t==null?void 0:t.data)||t;console.log("[useGridTabs] Parsed eventStr:",n);const r=typeof n=="string"?JSON.parse(n):n;a.value.onItemClick(r)}catch(n){console.error("[useGridTabs] Failed to parse onItemClick event payload:",n),a.value.onItemClick(t)}else console.warn("[useGridTabs] onItemClick triggered but NO callback registered in callbacksRef!")},onItemFocused:(...e)=>{let t=e[0];if(t&&t.nativeEvent&&(t=t.nativeEvent),a.value.onItemFocused)try{let n=typeof t=="string"?t:(t==null?void 0:t.data)||t;const r=typeof n=="string"?JSON.parse(n):n;a.value.onItemFocused(r)}catch(n){console.error("[useGridTabs] Failed to parse onItemFocused event payload:",n),a.value.onItemFocused(t)}},onTabFocused:(...e)=>{let t=e[0];t&&t.nativeEvent&&(t=t.nativeEvent),a.value.onTabFocused&&a.value.onTabFocused(t)}}));return{tabsDataStr:d,bindings:G,tabs:p,items:b,initData:I,setCallbacks:$,updateItem:(e,t)=>{if(!l){console.error("[useGridTabs] ❌ 时机错误: 尚未初始化数据,无法调用 updateItem");return}u({op:"UPDATE_ITEM",itemId:e,payload:t});const n=r=>{for(const v in t)v==="content"&&r.content?Object.assign(r.content,t.content):r[v]=t[v]};if(m){const r=b.value.find(v=>v.id===e);r&&n(r)}else for(const r of p.value)if(r.items){const v=r.items.find(f=>f.id===e);if(v){n(v);break}}},dispatchAction:u,resetInitialization:_,getFocusState:async()=>new Promise((e,t)=>{let n=o.value;typeof o.value.getNativeNode=="function"?n=o.value.getNativeNode()||o.value:o.value.nativeRef&&(n=o.value.nativeRef),S.Native.callUIFunction(n,"getFocusState",[],r=>{try{const v=typeof r=="string"?JSON.parse(r):r;e(v)}catch(v){t(v)}})}),getItemRect:async e=>new Promise((t,n)=>{let r=o.value;typeof o.value.getNativeNode=="function"?r=o.value.getNativeNode()||o.value:o.value.nativeRef&&(r=o.value.nativeRef),S.Native.callUIFunction(r,"getItemRect",[e],v=>{try{const f=typeof v=="string"?JSON.parse(v):v;t(f)}catch(f){n(f)}})})}}const te="QtKeyboard",K=c.defineComponent({__name:"Keyboard",props:{backgroundColor:{},backgroundGradient:{},textColor:{},weakTextColor:{},focusBackgroundColor:{},focusTextColor:{},placeholder:{},textFullKeyboard:{},textT9Keyboard:{},textClear:{},textDelete:{},currentInput:{},autofocus:{type:Boolean},requestFocus:{type:Boolean}},emits:["onInputChanged","onKeyPressed"],setup(o,{expose:s}){const d=c.ref(),p=C(),b=te+"_Plugin",l=(p.isPluginActive?b:te).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.extraui","com.quicktvui.plugin.extraui.ExtraUIPluginApp");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value},requestFocus:(...i)=>{var u,h;const a=((h=(u=d.value)==null?void 0:u.getNativeNode)==null?void 0:h.call(u))||d.value;a&&S.Native.callUIFunction(a,"requestFocus",i)}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d,backgroundColor:o.backgroundColor,backgroundGradient:o.backgroundGradient,textColor:o.textColor,weakTextColor:o.weakTextColor,focusBackgroundColor:o.focusBackgroundColor,focusTextColor:o.focusTextColor,placeholder:o.placeholder,textFullKeyboard:o.textFullKeyboard,textT9Keyboard:o.textT9Keyboard,textClear:o.textClear,textDelete:o.textDelete,currentInput:o.currentInput,autofocus:o.autofocus,requestFocus:o.requestFocus,onOnInputChanged:a[0]||(a[0]=u=>i.$emit("onInputChanged",u.nativeEvent)),onOnKeyPressed:a[1]||(a[1]=u=>i.$emit("onKeyPressed",u.nativeEvent))},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16,["backgroundColor","backgroundGradient","textColor","weakTextColor","focusBackgroundColor","focusTextColor","placeholder","textFullKeyboard","textT9Keyboard","textClear","textDelete","currentInput","autofocus","requestFocus"]))}});let V;var ae;try{const o=require("@extscreen/es3-vue");V=o.registerElement||((ae=o.default)==null?void 0:ae.registerElement)}catch{}const ue={install:o=>{if(!globalThis.__QtKeyboard_registered)if(V){const s=(d,p)=>{V(d,{component:{name:p?"QtKeyboard_Plugin":"QtKeyboard",processEventData(b,m){const l=b.handler||b,y=m||(l==null?void 0:l.nativeParams)||{};return l&&(l.nativeEvent=y),l}}})};s("qt-keyboard",!1),s("qt-keyboard-plugin",!0),s("QtKeyboard",!1),s("QtKeyboard_Plugin",!0),globalThis.__QtKeyboard_registered=!0,console.log("[@quicktvui/naddons] Successfully registered Native tag:","QtKeyboard")}else console.warn("[@quicktvui/naddons] Failed to find registerElement from @extscreen/es3-vue");o.component("Keyboard",K),o.component("qt-keyboard",K)}},ne="QtPortalPool",j=c.defineComponent({__name:"PortalPool",setup(o,{expose:s}){const d=c.ref(),p=C(),b=ne+"_Plugin",l=(p.isPluginActive?b:ne).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.glintui");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16))}});let z;var ie;try{const o=require("@extscreen/es3-vue");z=o.registerElement||((ie=o.default)==null?void 0:ie.registerElement)}catch{}const de={install:o=>{if(!globalThis.__QtPortalPool_registered)if(z){const s=(d,p)=>{z(d,{component:{name:p?"QtPortalPool_Plugin":"QtPortalPool",processEventData(b,m){const l=b.handler||b,y=m||(l==null?void 0:l.nativeParams)||{};return l&&(l.nativeEvent=y),l}}})};s("qt-portal-pool",!1),s("qt-portal-pool-plugin",!0),s("QtPortalPool",!1),s("QtPortalPool_Plugin",!0),globalThis.__QtPortalPool_registered=!0,console.log("[@quicktvui/naddons] Successfully registered Native tag:","QtPortalPool")}else console.warn("[@quicktvui/naddons] Failed to find registerElement from @extscreen/es3-vue");o.component("PortalPool",j),o.component("qt-portal-pool",j)}},oe="QtPortalItem",W=c.defineComponent({__name:"PortalItem",props:{portalId:{}},setup(o,{expose:s}){const d=c.ref(),p=C(),b=oe+"_Plugin",l=(p.isPluginActive?b:oe).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.glintui");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d,portalId:o.portalId},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16,["portalId"]))}});let Z;var le;try{const o=require("@extscreen/es3-vue");Z=o.registerElement||((le=o.default)==null?void 0:le.registerElement)}catch{}const ve={install:o=>{if(!globalThis.__QtPortalItem_registered)if(Z){const s=(d,p)=>{Z(d,{component:{name:p?"QtPortalItem_Plugin":"QtPortalItem",processEventData(b,m){const l=b.handler||b,y=m||(l==null?void 0:l.nativeParams)||{};return l&&(l.nativeEvent=y),l}}})};s("qt-portal-item",!1),s("qt-portal-item-plugin",!0),s("QtPortalItem",!1),s("QtPortalItem_Plugin",!0),globalThis.__QtPortalItem_registered=!0,console.log("[@quicktvui/naddons] Successfully registered Native tag:","QtPortalItem")}else console.warn("[@quicktvui/naddons] Failed to find registerElement from @extscreen/es3-vue");o.component("PortalItem",W),o.component("qt-portal-item",W)}},se="QtHsvBackground",H=c.defineComponent({__name:"HsvBackground",props:{hue:{default:-2}},setup(o,{expose:s}){const d=c.ref(),p=C(),b=se+"_Plugin",l=(p.isPluginActive?b:se).replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase().replace(/^-/,""),y=F(l,p.pluginPackageName||"com.quicktvui.plugin.glintui");return s({getNativeNode:()=>{var i,a;return((a=(i=d.value)==null?void 0:i.getNativeNode)==null?void 0:a.call(i))||d.value}}),(i,a)=>(c.openBlock(),c.createBlock(c.unref(y),c.mergeProps({ref_key:"nativeRef",ref:d,hue:o.hue},i.$attrs),{default:c.withCtx(()=>[c.renderSlot(i.$slots,"default")]),_:3},16,["hue"]))}}),ge={install(o){o.component("qt-hsv-background",H),o.component("HsvBackground",H)}},fe={skipPluginCheck:!1},Q=new Set;function F(o,s,d){return c.defineComponent({name:`${o}AsyncWrapper`,inheritAttrs:!1,props:{skipPluginCheck:{type:Boolean,default:!1}},setup(p,{slots:b,attrs:m,expose:l}){const y=c.ref("loading"),i=c.ref(""),a=c.ref(),u=globalThis.__VUE_INSTANCE__;l({getNativeNode:()=>{let P=a.value;return!P&&u&&u.vnode&&u.vnode.el&&(P=u.vnode.el,P.childNodes&&P.childNodes.length>0&&(P=P.childNodes[0])),P},nativeRef:a});let x=null,N=null;try{x=L.useES(),N=L.useESPlugin()}catch(P){console.warn("[withAsyncPlugin] 获取 useES 或 useESPlugin 失败,可能处于非 ES 环境。",P)}const O=async()=>{if(!x||typeof x.isComponentRegistered!="function")return console.log("[withAsyncPlugin] es.isComponentRegistered 不可用"),!1;try{const P=await x.isComponentRegistered(o);if(console.log(`[withAsyncPlugin] isComponentRegistered('${o}') 返回:`,P),P===!0||P&&typeof P=="object"&&(P.registered===!0||P.isRegistered===!0))return!0;try{const A=await S.Native.callNativeWithPromise("ExtendModule","getCoreSDKInfo");if(A&&A.core_version){const w=A.core_version;console.log(`[withAsyncPlugin] 当前引擎核心版本: ${w}`);const T=w.split(".").map(_=>parseInt(_,10));if(T.length>=3&&!isNaN(T[0])&&!isNaN(T[1])&&!isNaN(T[2]))if(T[0]*1e6+T[1]*1e3+T[2]>=1011205){console.log(`[withAsyncPlugin] 引擎 >= 1.11.205,使用 ExtendModule 检查 Controller: ${o}`);const I=o.split("-").map(E=>E.charAt(0).toUpperCase()+E.slice(1)).join("");console.log(`[withAsyncPlugin] 同时检查原名和驼峰名: ${o}, ${I}`);const[$,G]=await Promise.all([S.Native.callNativeWithPromise("ExtendModule","isComponentRegistered",o).catch(()=>!1),S.Native.callNativeWithPromise("ExtendModule","isComponentRegistered",I).catch(()=>!1)]);if(console.log(`[withAsyncPlugin] ExtendModule.isComponentRegistered 返回: [${$}, ${G}]`),$===!0||G===!0)return!0}else console.log(`[withAsyncPlugin] 引擎版本 ${w} < 1.11.205,跳过 ExtendModule 检查`);else console.log(`[withAsyncPlugin] 无法解析引擎版本号: ${w}`)}}catch(A){console.log("[withAsyncPlugin] 获取引擎版本或检查 Controller 失败:",A)}return!1}catch(P){return console.warn("[withAsyncPlugin] 检查组件注册状态异常:",P),!1}},R=async()=>{if(fe.skipPluginCheck||p.skipPluginCheck){console.log(`[withAsyncPlugin] 跳过 ${o} 插件检查 (skipPluginCheck = true)`),y.value="ready";return}if(!s){y.value="ready";return}const P=await O();if(console.log(`[withAsyncPlugin] 拦截检查 - ${o} 是否已注册:`,P),P||Q.has(s)){y.value="ready",Q.add(s),console.log("[withAsyncPlugin] 组件已注册,跳过安装流程");return}if(!N){console.warn(`[withAsyncPlugin] 无法获取 useESPlugin 实例,可能处于内置 AAR 环境或非插件环境,尝试直接渲染 ${o}`),y.value="ready";return}console.log(`[withAsyncPlugin] 开始动态安装插件: ${s}`);try{await new Promise((A,w)=>{let T;const _={onPluginInstallSuccess(I,$,G){I===s&&(clearTimeout(T),N.removeListener(_),console.log(`[withAsyncPlugin] 安装成功 pkg=${I} 状态码=${$}`),$==1003||$==1001?(d?(console.log(`[withAsyncPlugin] 触发反射初始化: ${d}`),S.Native.callNative("EsNativeModule","callReflect",{entry:{from:d,method:"setup"}})):console.log("[withAsyncPlugin] 安装成功,跳过反射初始化(无 pluginInitClass)"),A()):w(new Error(`安装失败 pkg=${I} status=${$} msg=${G}`)))},onPluginInstallError(I,$,G){I===s&&(clearTimeout(T),N.removeListener(_),w(new Error(`安装失败 pkg=${I} status=${$} msg=${G}`)))}};N.addListener({pkg:s},_),T=setTimeout(()=>{N.removeListener(_),w(new Error(`插件安装超时: ${s}`))},8e3),typeof N.installPlugin=="function"?N.installPlugin({pkg:s}):typeof N.install=="function"?N.install(s):w(new Error("当前运行时不支持 install / installPlugin"))}),await c.nextTick(),Q.add(s),y.value="ready"}catch(A){console.error("[withAsyncPlugin] 插件加载失败:",A),i.value=(A==null?void 0:A.message)||String(A),y.value="error"}};return c.onMounted(()=>{R()}),()=>{const P={...m.style||{}};m.width!==void 0&&!P.width&&(P.width=typeof m.width=="number"?`${m.width}px`:m.width),m.height!==void 0&&!P.height&&(P.height=typeof m.height=="number"?`${m.height}px`:m.height);const A=m.class?`qt-plugin-container ${m.class}`:"qt-plugin-container",w={class:A,style:P,clipChildren:!1,clipPadding:!1,clipToPadding:!1};if(y.value==="loading")return c.h("div",w,[c.h("div",{style:{color:"white",fontSize:"30px"}},"插件加载中...")]);if(y.value==="error")return c.h("div",w,[c.h("div",{style:{color:"white",fontSize:"30px",backgroundColor:"rgba(255,0,0,0.5)"}},`插件加载失败: ${i.value}`)]);const T={},_={};for(const[E,D]of Object.entries(m))if(E.startsWith("on")&&typeof D=="function"){let M=E;E.startsWith("onOn")&&(M="on"+E.slice(4)),_[M]=D}else if(E.startsWith("on")&&Array.isArray(D)){let M=E;E.startsWith("onOn")&&(M="on"+E.slice(4)),_[M]=D}else E.startsWith("onOn")||(T[E]=D);const I={...T,..._,class:A,style:P,ref:E=>{a.value=E}},$=I.tabsData||"",G=I.actionPayload||"";return console.log("[withAsyncPlugin] 最终准备传递给 h() 的属性键集合:",Object.keys(I),"tabsData.length=",$.length,"actionPayload.length=",G.length),c.h(o,I,b.default?b.default():[])}}})}const Y=Symbol("AddonEnvContext"),pe={isPluginActive:!1,nameSuffix:"",pluginPackageName:"com.quicktvui.plugin.glintui",builtInVersions:{}};async function Pe(o="com.quicktvui.plugin.glintui",s="_Plugin"){const d=L.useES();let p={};try{const i=await S.Native.callNativeModule("AddonEnvModule","getBuiltInVersions",[]);i&&typeof i=="object"&&(p=i)}catch(i){console.warn("[AddonProvider] Failed to fetch built-in versions from AddonEnvModule",i)}const b=`QtGridTabs${s}`,m=d.isComponentRegistered(b),l=m instanceof Promise?await m:m,y={isPluginActive:l,nameSuffix:l?s:"",pluginPackageName:l?`${o}.ext`:o,builtInVersions:p};return console.info("[AddonProvider] Environment initialized:",y),y}let J=c.ref(pe);function he(o){J.value=o,c.provide(Y,J)}function C(){var o;return((o=c.inject(Y,J))==null?void 0:o.value)||pe}const be={install:o=>{o.use(ce),o.use(ue),o.use(de),o.use(ve),o.use(ge)}};exports.ADDON_ENV_CONTEXT_KEY=Y;exports.GridTabs=B;exports.GridTabsPlugin=ce;exports.HsvBackground=H;exports.HsvBackgroundPlugin=ge;exports.Keyboard=K;exports.KeyboardPlugin=ue;exports.PortalItem=W;exports.PortalItemPlugin=ve;exports.PortalPool=j;exports.PortalPoolPlugin=de;exports.QuickTVUINAddons=be;exports.QuickTVUINAddonsConfig=fe;exports.default=be;exports.initAddonEnv=Pe;exports.provideAddonEnv=he;exports.useAddonEnv=C;exports.useGridTabs=ye;exports.withAsyncPlugin=F;
@@ -116,7 +116,7 @@ function Me(o, s) {
116
116
  return !1;
117
117
  let n = !0;
118
118
  return e.tabId || (console.error(`[useGridTabs] ❌ 数据格式错误 (${t}): Tab 缺失必填字段 'tabId'。每个 Tab 必须有唯一标识!`, e), n = !1), (e.title === void 0 || e.title === null) && console.warn(`[useGridTabs] ⚠️ 数据格式警告 (${t}): Tab 缺失 'title' 字段 (tabId: ${e.tabId || "未知"}),导航栏可能显示为空。`, e), n;
119
- }, G = (e, t) => {
119
+ }, x = (e, t) => {
120
120
  if (!e || e.length === 0)
121
121
  return;
122
122
  A.clear();
@@ -297,7 +297,7 @@ function Me(o, s) {
297
297
  else {
298
298
  console.log("[useGridTabs] newTabs is NOT a proxy, performing full deduceModeAndInitialize & wrapping");
299
299
  const n = E(e);
300
- Object.defineProperty(n, "__isGridTabsProxy", { value: !0, enumerable: !1 }), G(n, "2d"), f.value = n;
300
+ Object.defineProperty(n, "__isGridTabsProxy", { value: !0, enumerable: !1 }), x(n, "2d"), f.value = n;
301
301
  }
302
302
  }, { flush: "sync", deep: !1 }), oe(p, (e, t) => {
303
303
  if (console.log("[useGridTabs] watch(items) triggered:", { newItems: e, isInitialized: l }), !e || e.length === 0) {
@@ -309,7 +309,7 @@ function Me(o, s) {
309
309
  else {
310
310
  console.log("[useGridTabs] newItems is NOT a proxy, performing full deduceModeAndInitialize & wrapping");
311
311
  const n = y(e, m);
312
- Object.defineProperty(n, "__isGridTabsProxy", { value: !0, enumerable: !1 }), G(n, "1d"), p.value = n;
312
+ Object.defineProperty(n, "__isGridTabsProxy", { value: !0, enumerable: !1 }), x(n, "1d"), p.value = n;
313
313
  }
314
314
  }, { flush: "sync", deep: !1 });
315
315
  const T = {}, k = () => {
@@ -324,7 +324,7 @@ function Me(o, s) {
324
324
  e[0].hasOwnProperty("tabId") || e[0].hasOwnProperty("items") && Array.isArray(e[0].items) ? f.value = e : p.value = e;
325
325
  }, _ = (e) => {
326
326
  r.value = e;
327
- }, x = he(() => ({
327
+ }, G = he(() => ({
328
328
  tabsData: u.value,
329
329
  // 不再绑定 actionPayload 属性,完全走命令式 API,防止触发无意义的 Vue 节点更新
330
330
  onTabNeedsData: async (...e) => {
@@ -425,7 +425,7 @@ function Me(o, s) {
425
425
  }));
426
426
  return {
427
427
  tabsDataStr: u,
428
- bindings: x,
428
+ bindings: G,
429
429
  tabs: f,
430
430
  items: p,
431
431
  initData: I,
@@ -698,11 +698,11 @@ const Se = {
698
698
  _: 3
699
699
  }, 16, ["hue"]));
700
700
  }
701
- }), xe = {
701
+ }), Ge = {
702
702
  install(o) {
703
703
  o.component("qt-hsv-background", ve), o.component("HsvBackground", ve);
704
704
  }
705
- }, Ge = {
705
+ }, xe = {
706
706
  // 如果设置为 true,则全局跳过所有组件的原生插件安装检查,直接渲染
707
707
  skipPluginCheck: !1
708
708
  }, Z = /* @__PURE__ */ new Set();
@@ -726,17 +726,17 @@ function V(o, s, u) {
726
726
  },
727
727
  nativeRef: r
728
728
  });
729
- let G = null, A = null;
729
+ let x = null, A = null;
730
730
  try {
731
- G = me(), A = we();
731
+ x = me(), A = we();
732
732
  } catch (y) {
733
733
  console.warn("[withAsyncPlugin] 获取 useES 或 useESPlugin 失败,可能处于非 ES 环境。", y);
734
734
  }
735
735
  const O = async () => {
736
- if (!G || typeof G.isComponentRegistered != "function")
736
+ if (!x || typeof x.isComponentRegistered != "function")
737
737
  return console.log("[withAsyncPlugin] es.isComponentRegistered 不可用"), !1;
738
738
  try {
739
- const y = await G.isComponentRegistered(o);
739
+ const y = await x.isComponentRegistered(o);
740
740
  if (console.log(`[withAsyncPlugin] isComponentRegistered('${o}') 返回:`, y), y === !0 || y && typeof y == "object" && (y.registered === !0 || y.isRegistered === !0))
741
741
  return !0;
742
742
  try {
@@ -750,11 +750,11 @@ function V(o, s, u) {
750
750
  console.log(`[withAsyncPlugin] 引擎 >= 1.11.205,使用 ExtendModule 检查 Controller: ${o}`);
751
751
  const I = o.split("-").map((N) => N.charAt(0).toUpperCase() + N.slice(1)).join("");
752
752
  console.log(`[withAsyncPlugin] 同时检查原名和驼峰名: ${o}, ${I}`);
753
- const [_, x] = await Promise.all([
753
+ const [_, G] = await Promise.all([
754
754
  $.callNativeWithPromise("ExtendModule", "isComponentRegistered", o).catch(() => !1),
755
755
  $.callNativeWithPromise("ExtendModule", "isComponentRegistered", I).catch(() => !1)
756
756
  ]);
757
- if (console.log(`[withAsyncPlugin] ExtendModule.isComponentRegistered 返回: [${_}, ${x}]`), _ === !0 || x === !0)
757
+ if (console.log(`[withAsyncPlugin] ExtendModule.isComponentRegistered 返回: [${_}, ${G}]`), _ === !0 || G === !0)
758
758
  return !0;
759
759
  } else
760
760
  console.log(`[withAsyncPlugin] 引擎版本 ${E} < 1.11.205,跳过 ExtendModule 检查`);
@@ -769,7 +769,7 @@ function V(o, s, u) {
769
769
  return console.warn("[withAsyncPlugin] 检查组件注册状态异常:", y), !1;
770
770
  }
771
771
  }, R = async () => {
772
- if (Ge.skipPluginCheck || f.skipPluginCheck) {
772
+ if (xe.skipPluginCheck || f.skipPluginCheck) {
773
773
  console.log(`[withAsyncPlugin] 跳过 ${o} 插件检查 (skipPluginCheck = true)`), m.value = "ready";
774
774
  return;
775
775
  }
@@ -791,16 +791,16 @@ function V(o, s, u) {
791
791
  await new Promise((h, E) => {
792
792
  let T;
793
793
  const k = {
794
- onPluginInstallSuccess(I, _, x) {
794
+ onPluginInstallSuccess(I, _, G) {
795
795
  I === s && (clearTimeout(T), A.removeListener(k), console.log(`[withAsyncPlugin] 安装成功 pkg=${I} 状态码=${_}`), _ == 1003 || _ == 1001 ? (u ? (console.log(`[withAsyncPlugin] 触发反射初始化: ${u}`), $.callNative("EsNativeModule", "callReflect", {
796
796
  entry: {
797
797
  from: u,
798
798
  method: "setup"
799
799
  }
800
- })) : console.log("[withAsyncPlugin] 安装成功,跳过反射初始化(无 pluginInitClass)"), h()) : E(new Error(`安装失败 pkg=${I} status=${_} msg=${x}`)));
800
+ })) : console.log("[withAsyncPlugin] 安装成功,跳过反射初始化(无 pluginInitClass)"), h()) : E(new Error(`安装失败 pkg=${I} status=${_} msg=${G}`)));
801
801
  },
802
- onPluginInstallError(I, _, x) {
803
- I === s && (clearTimeout(T), A.removeListener(k), E(new Error(`安装失败 pkg=${I} status=${_} msg=${x}`)));
802
+ onPluginInstallError(I, _, G) {
803
+ I === s && (clearTimeout(T), A.removeListener(k), E(new Error(`安装失败 pkg=${I} status=${_} msg=${G}`)));
804
804
  }
805
805
  };
806
806
  A.addListener({ pkg: s }, k), T = setTimeout(() => {
@@ -815,10 +815,6 @@ function V(o, s, u) {
815
815
  R();
816
816
  }), () => {
817
817
  const y = {
818
- display: "flex",
819
- flexDirection: "column",
820
- justifyContent: "center",
821
- alignItems: "center",
822
818
  ...b.style || {}
823
819
  };
824
820
  b.width !== void 0 && !y.width && (y.width = typeof b.width == "number" ? `${b.width}px` : b.width), b.height !== void 0 && !y.height && (y.height = typeof b.height == "number" ? `${b.height}px` : b.height);
@@ -858,8 +854,8 @@ function V(o, s, u) {
858
854
  ref: (N) => {
859
855
  r.value = N;
860
856
  }
861
- }, _ = I.tabsData || "", x = I.actionPayload || "";
862
- return console.log("[withAsyncPlugin] 最终准备传递给 h() 的属性键集合:", Object.keys(I), "tabsData.length=", _.length, "actionPayload.length=", x.length), L(o, I, p.default ? p.default() : []);
857
+ }, _ = I.tabsData || "", G = I.actionPayload || "";
858
+ return console.log("[withAsyncPlugin] 最终准备传递给 h() 的属性键集合:", Object.keys(I), "tabsData.length=", _.length, "actionPayload.length=", G.length), L(o, I, p.default ? p.default() : []);
863
859
  };
864
860
  }
865
861
  });
@@ -898,7 +894,7 @@ function z() {
898
894
  }
899
895
  const Le = {
900
896
  install: (o) => {
901
- o.use(ke), o.use(_e), o.use($e), o.use(Se), o.use(xe);
897
+ o.use(ke), o.use(_e), o.use($e), o.use(Se), o.use(Ge);
902
898
  }
903
899
  };
904
900
  export {
@@ -906,7 +902,7 @@ export {
906
902
  W as GridTabs,
907
903
  ke as GridTabsPlugin,
908
904
  ve as HsvBackground,
909
- xe as HsvBackgroundPlugin,
905
+ Ge as HsvBackgroundPlugin,
910
906
  re as Keyboard,
911
907
  _e as KeyboardPlugin,
912
908
  ue as PortalItem,
@@ -914,7 +910,7 @@ export {
914
910
  le as PortalPool,
915
911
  $e as PortalPoolPlugin,
916
912
  Le as QuickTVUINAddons,
917
- Ge as QuickTVUINAddonsConfig,
913
+ xe as QuickTVUINAddonsConfig,
918
914
  Le as default,
919
915
  Re as initAddonEnv,
920
916
  qe as provideAddonEnv,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quicktvui/naddons",
3
- "version": "1.0.0-alpha.10",
3
+ "version": "1.0.0-alpha.11",
4
4
  "description": "Vue 3 wrappers for QuickTVUI Native Addons",
5
5
  "main": "dist/naddons.cjs.js",
6
6
  "module": "dist/naddons.es.js",