@junerver/vue-touch-ime 1.0.0 → 1.1.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
@@ -75,12 +75,29 @@ const weight = ref<number | null>(null)
75
75
 
76
76
  ## 主题定制
77
77
 
78
- 覆盖 `.vti-kb` 上的 CSS 变量即可换肤:
78
+ ### 快捷换肤:`accent` / `background` prop
79
+
80
+ ```vue
81
+ <!-- 主色调换成橙色:完成键 / 高亮 / 派生色自动跟随 -->
82
+ <SoftKeyboard accent="#ff5500" background="rgba(20, 16, 12, 0.97)" />
83
+ ```
84
+
85
+ | Prop | 类型 | 默认值 | 说明 |
86
+ | --- | --- | --- | --- |
87
+ | `instance` | `SoftKeyboardInstance` | 模块单例 | 自定义键盘实例(多键盘并存时用 `createSoftKeyboard()` 创建) |
88
+ | `accent` | `string` | `#3ef2c0` | 主色调(完成键 / 高亮 / 派生色自动跟随) |
89
+ | `background` | `string` | `rgba(7,20,24,0.97)` | 面板背景色 |
90
+
91
+ ### 细粒度:CSS 变量
92
+
93
+ 覆盖 `.vti-kb` 上的 CSS 变量即可(`--vti-accent-strong` 默认由 `--vti-accent`
94
+ 自动派生,一般无需单独覆盖):
79
95
 
80
96
  ```css
81
97
  .vti-kb {
82
98
  --vti-accent: #3ef2c0; /* 主色(高亮 / 完成键) */
83
- --vti-accent-strong: #1d8a6e; /* 主色渐变暗端 */
99
+ --vti-accent-strong: color-mix(in srgb, var(--vti-accent) 72%, #000); /* 派生暗端 */
100
+ --vti-on-accent: #06241c; /* 主色按键上的文字色 */
84
101
  --vti-bg: rgba(7, 20, 24, 0.97); /* 面板背景 */
85
102
  --vti-key-bg: linear-gradient(180deg, rgba(24, 56, 60, 0.95), rgba(13, 34, 38, 0.95));
86
103
  --vti-key-fg: #d7e2e0; /* 按键文字 */
@@ -92,12 +109,6 @@ const weight = ref<number | null>(null)
92
109
 
93
110
  ## API
94
111
 
95
- ### 组件 `<SoftKeyboard />`
96
-
97
- | Prop | 类型 | 默认值 | 说明 |
98
- | --- | --- | --- | --- |
99
- | `instance` | `SoftKeyboardInstance` | 模块单例 | 自定义键盘实例(多键盘并存时用 `createSoftKeyboard()` 创建) |
100
-
101
112
  ### 组合式
102
113
 
103
114
  ```ts
@@ -2,6 +2,10 @@ import { type SoftKeyboard } from './useSoftKeyboard';
2
2
  type __VLS_Props = {
3
3
  /** 自定义键盘实例(缺省用模块单例;多键盘并存时传入 createSoftKeyboard() 的产物) */
4
4
  instance?: SoftKeyboard;
5
+ /** 主色调(覆盖 --vti-accent,完成键/高亮/派生色自动跟随) */
6
+ accent?: string;
7
+ /** 面板背景色(覆盖 --vti-bg) */
8
+ background?: string;
5
9
  };
6
10
  declare const __VLS_export: 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
11
  declare const _default: typeof __VLS_export;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./pinyinDict.cjs"),t=require("./ime.cjs");let n=require("vue");var r=new Set([`text`,`search`,`tel`,`email`,`url`,`number`,``]);function i(e){return!(e instanceof HTMLInputElement)||e.disabled||e.readOnly?!1:r.has((e.type||`text`).toLowerCase())}function a(){let e=(0,n.reactive)({visible:!1,mode:`zh`,kind:`text`,buffer:``,draft:``,replaceAll:!1,shift:!1,prevTextMode:`zh`}),r=null,a=null,o=!1,s=0,c=(0,n.computed)(()=>e.visible&&e.mode===`zh`?t.candidatesFor(e.buffer):[]);function l(n){if(r===n&&e.visible)return;s+=1,r=n;let i=t.resolveSoftKindWithOverride(n,n.dataset?.vtiKb);e.kind=i,e.mode=i===`text`?`zh`:`num`,e.prevTextMode=`zh`,e.buffer=``,e.shift=!1,e.replaceAll=i===`text`?t.hasFullSelection(n):n.value.length>0,e.draft=i===`text`?``:n.value,e.visible=!0;try{n.scrollIntoView({block:`center`})}catch{}}function u(t=!1){s+=1,e.visible=!1,e.buffer=``,e.shift=!1;let n=r;if(r=null,t&&n)try{n.blur()}catch{}}function d(){return!r||!r.isConnected?(u(!1),null):r}function f(n){let r=d();if(r&&n){if(e.kind===`text`)t.insertIntoTextInput(r,n,e.replaceAll);else if(n.length===1)e.draft=t.applyCharToDraft(e.kind,e.draft,n,e.replaceAll),t.writeDraft(r,e.kind,e.draft);else{let i=e.replaceAll?``:e.draft;e.draft=t.normalizeDraft(e.kind,i+n),t.writeDraft(r,e.kind,e.draft)}e.replaceAll=!1}}function p(){let n=d();n&&(e.kind===`text`?t.backspaceTextInput(n):(e.draft=t.backspaceDraft(e.draft,e.replaceAll),t.writeDraft(n,e.kind,e.draft)),e.replaceAll=!1)}function m(){let n=t.resolveBufferCommit(e.buffer);e.buffer=``,f(n??``)}function h(t){d()&&(e.buffer=e.buffer.slice(t.consumed),f(t.text))}function g(t){e.mode===`zh`&&e.buffer&&m(),t===`num`&&e.mode!==`num`&&(e.prevTextMode=e.mode),e.mode=t,e.shift=!1}function _(n){if(!e.visible||!d())return;if(n===`backspace`){if(e.mode===`zh`&&e.buffer){e.buffer=e.buffer.slice(0,-1);return}p();return}if(n===`space`){if(e.mode===`zh`&&e.buffer){let e=c.value[0];e?h(e):m();return}e.kind===`text`&&f(` `);return}if(n===`done`){m(),u(!0);return}if(n===`shift`){e.shift=!e.shift;return}if(n===`mode:back`){g(e.prevTextMode);return}if(n.startsWith(`mode:`)){g(n.slice(5));return}let r=n;if(r.length===1&&(e.kind===`text`||t.isCharAllowed(e.kind,r))){if(e.mode===`zh`){if(r>=`a`&&r<=`z`){e.buffer+=r;return}if(r>=`A`&&r<=`Z`){e.buffer+=r.toLowerCase();return}m(),f(r)}else e.mode===`en`&&(r>=`a`&&r<=`z`||r>=`A`&&r<=`Z`)&&(r=e.shift?r.toUpperCase():r.toLowerCase(),e.shift=!1),f(r)}}function v(e){let t=e.target;i(t)&&(a&&t instanceof Node&&a.contains(t)||l(t))}function y(e){if(e.target!==r)return;let t=s;window.setTimeout(()=>{s===t&&u(!1)},0)}function b(e){a=e,!o&&(o=!0,document.addEventListener(`focusin`,v),document.addEventListener(`focusout`,y))}function x(){o&&=(document.removeEventListener(`focusin`,v),document.removeEventListener(`focusout`,y),!1),a=null,u(!1)}return{state:e,candidates:c,attach:b,detach:x,openFor:l,close:u,press:_,pickCandidate:h,getTarget:()=>r}}var o=a();function s(){return o}var c={class:`vti-kb__panel`},l={class:`vti-kb__strip`},u={class:`vti-kb__buffer`},d={key:0,class:`vti-kb__cands`},f=[`onPointerdown`],p={key:0,class:`vti-kb__hint`},m={key:1,class:`vti-kb__hint`},h=[`onPointerdown`],g={class:`vti-kb__row vti-kb__row--last`},_={key:0,type:`button`,class:`vti-kb__key vti-kb__key--ghost`,disabled:``},v={key:1,type:`button`,class:`vti-kb__key vti-kb__key--ghost`,disabled:``},y=[`onPointerdown`],b={class:`vti-kb__row vti-kb__row--num`},x=(0,n.defineComponent)({__name:`SoftKeyboard`,props:{instance:{}},setup(e){let t=e.instance??o,r=(0,n.ref)(null),i=t.candidates;(0,n.onMounted)(()=>t.attach(r.value)),(0,n.onBeforeUnmount)(()=>t.detach());function a(e){e.preventDefault(),e.stopPropagation()}function s(e,n){a(e),t.press(n)}function x(e,n){a(e),t.pickCandidate(n)}let S=[[`q`,`w`,`e`,`r`,`t`,`y`,`u`,`i`,`o`,`p`],[`a`,`s`,`d`,`f`,`g`,`h`,`j`,`k`,`l`],[`z`,`x`,`c`,`v`,`b`,`n`,`m`]],C=[[`7`,`8`,`9`,`backspace`],[`4`,`5`,`6`,`.`],[`1`,`2`,`3`,`mode:back`]];function w(e){return t.state.mode===`en`&&t.state.shift?e.toUpperCase():e}function T(){return t.state.prevTextMode===`zh`?`拼音`:`英文`}return(e,o)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{ref_key:`rootRef`,ref:r,class:(0,n.normalizeClass)([`vti-kb`,{show:(0,n.unref)(t).state.visible}]),onPointerdown:a,onMousedown:a,onTouchstart:a,onClick:a,onContextmenu:o[10]||=(0,n.withModifiers)(()=>{},[`prevent`])},[(0,n.createElementVNode)(`div`,c,[(0,n.createElementVNode)(`div`,l,[(0,n.createElementVNode)(`span`,u,(0,n.toDisplayString)((0,n.unref)(t).state.mode===`zh`?(0,n.unref)(t).state.buffer:(0,n.unref)(t).state.draft),1),(0,n.unref)(t).state.mode===`zh`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,d,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(i),(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:`${e.consumed}-${e.text}-${t}`,type:`button`,class:`vti-kb__cand`,onPointerdown:t=>x(t,e)},(0,n.toDisplayString)(e.text),41,f))),128)),(0,n.unref)(i).length===0?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,p,`候选`)):(0,n.createCommentVNode)(``,!0)])):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,m,(0,n.toDisplayString)((0,n.unref)(t).state.kind===`text`?`英文/数字`:(0,n.unref)(t).state.kind===`decimal`?`数字 · 小数`:`数字`),1))]),(0,n.unref)(t).state.mode===`num`?((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:1},[((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(C,(e,r)=>(0,n.createElementVNode)(`div`,{key:`n${r}`,class:`vti-kb__row vti-kb__row--num`},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e,e=>((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:e},[e===`.`&&(0,n.unref)(t).state.kind===`digits`?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,_,` · `)):e===`mode:back`&&(0,n.unref)(t).state.kind!==`text`?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,v,` · `)):((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:2,type:`button`,class:`vti-kb__key`,onPointerdown:t=>s(t,e)},(0,n.toDisplayString)(e===`backspace`?`退格`:e===`mode:back`?T():e),41,y))],64))),128))])),64)),(0,n.createElementVNode)(`div`,b,[(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--zero`,onPointerdown:o[8]||=e=>s(e,`0`)},` 0 `,32),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--done`,onPointerdown:o[9]||=e=>s(e,`done`)},` 完成 `,32)])],64)):((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:0},[((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(S,(e,r)=>(0,n.createElementVNode)(`div`,{key:`l${r}`,class:`vti-kb__row`},[r===2?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:(0,n.normalizeClass)([`vti-kb__key vti-kb__key--fn`,{on:(0,n.unref)(t).state.shift}]),onPointerdown:o[0]||=e=>s(e,`shift`)},` ⇧ `,34)):(0,n.createCommentVNode)(``,!0),((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e,type:`button`,class:`vti-kb__key vti-kb__key--letter`,onPointerdown:t=>s(t,e)},(0,n.toDisplayString)(w(e)),41,h))),128)),r===2?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:1,type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:o[1]||=e=>s(e,`backspace`)},` 退格 `,32)):(0,n.createCommentVNode)(``,!0)])),64)),(0,n.createElementVNode)(`div`,g,[(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:o[2]||=e=>s(e,`mode:num`)},` 123 `,32),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:o[3]||=e=>s(e,(0,n.unref)(t).state.mode===`zh`?`mode:en`:`mode:zh`)},(0,n.toDisplayString)((0,n.unref)(t).state.mode===`zh`?`英`:`拼`),33),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--space`,onPointerdown:o[4]||=e=>s(e,`space`)},` 空格 `,32),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:o[5]||=e=>s(e,(0,n.unref)(t).state.mode===`zh`?`,`:`,`)},(0,n.toDisplayString)((0,n.unref)(t).state.mode===`zh`?`,`:`,`),33),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:o[6]||=e=>s(e,(0,n.unref)(t).state.mode===`zh`?`。`:`.`)},(0,n.toDisplayString)((0,n.unref)(t).state.mode===`zh`?`。`:`.`),33),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--done`,onPointerdown:o[7]||=e=>s(e,`done`)},` 完成 `,32)])],64))])],34))}});exports.KIND_OVERRIDE_VALUES=t.KIND_OVERRIDE_VALUES,exports.PINYIN_CHARS=e.PINYIN_CHARS,exports.PINYIN_PHRASES=e.PINYIN_PHRASES,exports.SoftKeyboard=x,exports.applyCharToDraft=t.applyCharToDraft,exports.backspaceDraft=t.backspaceDraft,exports.backspaceTextInput=t.backspaceTextInput,exports.candidatesFor=t.candidatesFor,exports.createSoftKeyboard=a,exports.draftToDomValue=t.draftToDomValue,exports.hasFullSelection=t.hasFullSelection,exports.insertIntoTextInput=t.insertIntoTextInput,exports.isCharAllowed=t.isCharAllowed,exports.isSoftInput=i,exports.normalizeDraft=t.normalizeDraft,exports.resolveBufferCommit=t.resolveBufferCommit,exports.resolveSoftKind=t.resolveSoftKind,exports.resolveSoftKindWithOverride=t.resolveSoftKindWithOverride,exports.softKeyboard=o,exports.useSoftKeyboard=s,exports.writeDraft=t.writeDraft,exports.writeInputValue=t.writeInputValue;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./pinyinDict.cjs"),t=require("./ime.cjs");let n=require("vue");var r=new Set([`text`,`search`,`tel`,`email`,`url`,`number`,``]);function i(e){return!(e instanceof HTMLInputElement)||e.disabled||e.readOnly?!1:r.has((e.type||`text`).toLowerCase())}function a(){let e=(0,n.reactive)({visible:!1,mode:`zh`,kind:`text`,buffer:``,draft:``,replaceAll:!1,shift:!1,prevTextMode:`zh`}),r=null,a=null,o=!1,s=0,c=(0,n.computed)(()=>e.visible&&e.mode===`zh`?t.candidatesFor(e.buffer):[]);function l(n){if(r===n&&e.visible)return;s+=1,r=n;let i=t.resolveSoftKindWithOverride(n,n.dataset?.vtiKb);e.kind=i,e.mode=i===`text`?`zh`:`num`,e.prevTextMode=`zh`,e.buffer=``,e.shift=!1,e.replaceAll=i===`text`?t.hasFullSelection(n):n.value.length>0,e.draft=i===`text`?``:n.value,e.visible=!0;try{n.scrollIntoView({block:`center`})}catch{}}function u(t=!1){s+=1,e.visible=!1,e.buffer=``,e.shift=!1;let n=r;if(r=null,t&&n)try{n.blur()}catch{}}function d(){return!r||!r.isConnected?(u(!1),null):r}function f(n){let r=d();if(r&&n){if(e.kind===`text`)t.insertIntoTextInput(r,n,e.replaceAll);else if(n.length===1)e.draft=t.applyCharToDraft(e.kind,e.draft,n,e.replaceAll),t.writeDraft(r,e.kind,e.draft);else{let i=e.replaceAll?``:e.draft;e.draft=t.normalizeDraft(e.kind,i+n),t.writeDraft(r,e.kind,e.draft)}e.replaceAll=!1}}function p(){let n=d();n&&(e.kind===`text`?t.backspaceTextInput(n):(e.draft=t.backspaceDraft(e.draft,e.replaceAll),t.writeDraft(n,e.kind,e.draft)),e.replaceAll=!1)}function m(){let n=t.resolveBufferCommit(e.buffer);e.buffer=``,f(n??``)}function h(t){d()&&(e.buffer=e.buffer.slice(t.consumed),f(t.text))}function g(t){e.mode===`zh`&&e.buffer&&m(),t===`num`&&e.mode!==`num`&&(e.prevTextMode=e.mode),e.mode=t,e.shift=!1}function _(n){if(!e.visible||!d())return;if(n===`backspace`){if(e.mode===`zh`&&e.buffer){e.buffer=e.buffer.slice(0,-1);return}p();return}if(n===`space`){if(e.mode===`zh`&&e.buffer){let e=c.value[0];e?h(e):m();return}e.kind===`text`&&f(` `);return}if(n===`done`){m(),u(!0);return}if(n===`shift`){e.shift=!e.shift;return}if(n===`mode:back`){g(e.prevTextMode);return}if(n.startsWith(`mode:`)){g(n.slice(5));return}let r=n;if(r.length===1&&(e.kind===`text`||t.isCharAllowed(e.kind,r))){if(e.mode===`zh`){if(r>=`a`&&r<=`z`){e.buffer+=r;return}if(r>=`A`&&r<=`Z`){e.buffer+=r.toLowerCase();return}m(),f(r)}else e.mode===`en`&&(r>=`a`&&r<=`z`||r>=`A`&&r<=`Z`)&&(r=e.shift?r.toUpperCase():r.toLowerCase(),e.shift=!1),f(r)}}function v(e){let t=e.target;i(t)&&(a&&t instanceof Node&&a.contains(t)||l(t))}function y(e){if(e.target!==r)return;let t=s;window.setTimeout(()=>{s===t&&u(!1)},0)}function b(e){a=e,!o&&(o=!0,document.addEventListener(`focusin`,v),document.addEventListener(`focusout`,y))}function x(){o&&=(document.removeEventListener(`focusin`,v),document.removeEventListener(`focusout`,y),!1),a=null,u(!1)}return{state:e,candidates:c,attach:b,detach:x,openFor:l,close:u,press:_,pickCandidate:h,getTarget:()=>r}}var o=a();function s(){return o}var c={class:`vti-kb__panel`},l={class:`vti-kb__strip`},u={class:`vti-kb__buffer`},d={key:0,class:`vti-kb__cands`},f=[`onPointerdown`],p={key:0,class:`vti-kb__hint`},m={key:1,class:`vti-kb__hint`},h=[`onPointerdown`],g={class:`vti-kb__row vti-kb__row--last`},_={key:0,type:`button`,class:`vti-kb__key vti-kb__key--ghost`,disabled:``},v={key:1,type:`button`,class:`vti-kb__key vti-kb__key--ghost`,disabled:``},y=[`onPointerdown`],b={class:`vti-kb__row vti-kb__row--num`},x=(0,n.defineComponent)({__name:`SoftKeyboard`,props:{instance:{},accent:{},background:{}},setup(e){let t=e,r=t.instance??o,i=(0,n.ref)(null),a=r.candidates,s=(0,n.computed)(()=>{let e={};return t.accent&&(e[`--vti-accent`]=t.accent),t.background&&(e[`--vti-bg`]=t.background),Object.keys(e).length>0?e:void 0});(0,n.onMounted)(()=>r.attach(i.value)),(0,n.onBeforeUnmount)(()=>r.detach());function x(e){e.preventDefault(),e.stopPropagation()}function S(e,t){x(e),r.press(t)}function C(e,t){x(e),r.pickCandidate(t)}let w=[[`q`,`w`,`e`,`r`,`t`,`y`,`u`,`i`,`o`,`p`],[`a`,`s`,`d`,`f`,`g`,`h`,`j`,`k`,`l`],[`z`,`x`,`c`,`v`,`b`,`n`,`m`]],T=[[`7`,`8`,`9`,`backspace`],[`4`,`5`,`6`,`.`],[`1`,`2`,`3`,`mode:back`]];function E(e){return r.state.mode===`en`&&r.state.shift?e.toUpperCase():e}function D(){return r.state.prevTextMode===`zh`?`拼音`:`英文`}return(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{ref_key:`rootRef`,ref:i,class:(0,n.normalizeClass)([`vti-kb`,{show:(0,n.unref)(r).state.visible}]),style:(0,n.normalizeStyle)(s.value),onPointerdown:x,onMousedown:x,onTouchstart:x,onClick:x,onContextmenu:t[10]||=(0,n.withModifiers)(()=>{},[`prevent`])},[(0,n.createElementVNode)(`div`,c,[(0,n.createElementVNode)(`div`,l,[(0,n.createElementVNode)(`span`,u,(0,n.toDisplayString)((0,n.unref)(r).state.mode===`zh`?(0,n.unref)(r).state.buffer:(0,n.unref)(r).state.draft),1),(0,n.unref)(r).state.mode===`zh`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,d,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(a),(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:`${e.consumed}-${e.text}-${t}`,type:`button`,class:`vti-kb__cand`,onPointerdown:t=>C(t,e)},(0,n.toDisplayString)(e.text),41,f))),128)),(0,n.unref)(a).length===0?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,p,`候选`)):(0,n.createCommentVNode)(``,!0)])):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,m,(0,n.toDisplayString)((0,n.unref)(r).state.kind===`text`?`英文/数字`:(0,n.unref)(r).state.kind===`decimal`?`数字 · 小数`:`数字`),1))]),(0,n.unref)(r).state.mode===`num`?((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:1},[((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(T,(e,t)=>(0,n.createElementVNode)(`div`,{key:`n${t}`,class:`vti-kb__row vti-kb__row--num`},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e,e=>((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:e},[e===`.`&&(0,n.unref)(r).state.kind===`digits`?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,_,` · `)):e===`mode:back`&&(0,n.unref)(r).state.kind!==`text`?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,v,` · `)):((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:2,type:`button`,class:`vti-kb__key`,onPointerdown:t=>S(t,e)},(0,n.toDisplayString)(e===`backspace`?`退格`:e===`mode:back`?D():e),41,y))],64))),128))])),64)),(0,n.createElementVNode)(`div`,b,[(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--zero`,onPointerdown:t[8]||=e=>S(e,`0`)},` 0 `,32),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--done`,onPointerdown:t[9]||=e=>S(e,`done`)},` 完成 `,32)])],64)):((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:0},[((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(w,(e,i)=>(0,n.createElementVNode)(`div`,{key:`l${i}`,class:`vti-kb__row`},[i===2?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:(0,n.normalizeClass)([`vti-kb__key vti-kb__key--fn`,{on:(0,n.unref)(r).state.shift}]),onPointerdown:t[0]||=e=>S(e,`shift`)},` ⇧ `,34)):(0,n.createCommentVNode)(``,!0),((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e,type:`button`,class:`vti-kb__key vti-kb__key--letter`,onPointerdown:t=>S(t,e)},(0,n.toDisplayString)(E(e)),41,h))),128)),i===2?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:1,type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:t[1]||=e=>S(e,`backspace`)},` 退格 `,32)):(0,n.createCommentVNode)(``,!0)])),64)),(0,n.createElementVNode)(`div`,g,[(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:t[2]||=e=>S(e,`mode:num`)},` 123 `,32),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:t[3]||=e=>S(e,(0,n.unref)(r).state.mode===`zh`?`mode:en`:`mode:zh`)},(0,n.toDisplayString)((0,n.unref)(r).state.mode===`zh`?`英`:`拼`),33),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--space`,onPointerdown:t[4]||=e=>S(e,`space`)},` 空格 `,32),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:t[5]||=e=>S(e,(0,n.unref)(r).state.mode===`zh`?`,`:`,`)},(0,n.toDisplayString)((0,n.unref)(r).state.mode===`zh`?`,`:`,`),33),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--fn`,onPointerdown:t[6]||=e=>S(e,(0,n.unref)(r).state.mode===`zh`?`。`:`.`)},(0,n.toDisplayString)((0,n.unref)(r).state.mode===`zh`?`。`:`.`),33),(0,n.createElementVNode)(`button`,{type:`button`,class:`vti-kb__key vti-kb__key--done`,onPointerdown:t[7]||=e=>S(e,`done`)},` 完成 `,32)])],64))])],38))}});exports.KIND_OVERRIDE_VALUES=t.KIND_OVERRIDE_VALUES,exports.PINYIN_CHARS=e.PINYIN_CHARS,exports.PINYIN_PHRASES=e.PINYIN_PHRASES,exports.SoftKeyboard=x,exports.applyCharToDraft=t.applyCharToDraft,exports.backspaceDraft=t.backspaceDraft,exports.backspaceTextInput=t.backspaceTextInput,exports.candidatesFor=t.candidatesFor,exports.createSoftKeyboard=a,exports.draftToDomValue=t.draftToDomValue,exports.hasFullSelection=t.hasFullSelection,exports.insertIntoTextInput=t.insertIntoTextInput,exports.isCharAllowed=t.isCharAllowed,exports.isSoftInput=i,exports.normalizeDraft=t.normalizeDraft,exports.resolveBufferCommit=t.resolveBufferCommit,exports.resolveSoftKind=t.resolveSoftKind,exports.resolveSoftKindWithOverride=t.resolveSoftKindWithOverride,exports.softKeyboard=o,exports.useSoftKeyboard=s,exports.writeDraft=t.writeDraft,exports.writeInputValue=t.writeInputValue;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { PINYIN_CHARS as e, PINYIN_PHRASES as t } from "./pinyinDict.js";
2
2
  import { KIND_OVERRIDE_VALUES as n, applyCharToDraft as r, backspaceDraft as i, backspaceTextInput as a, candidatesFor as o, draftToDomValue as s, hasFullSelection as c, insertIntoTextInput as l, isCharAllowed as u, normalizeDraft as d, resolveBufferCommit as f, resolveSoftKind as p, resolveSoftKindWithOverride as m, writeDraft as h, writeInputValue as g } from "./ime.js";
3
- import { Fragment as _, computed as v, createCommentVNode as y, createElementBlock as b, createElementVNode as x, defineComponent as S, normalizeClass as C, onBeforeUnmount as w, onMounted as T, openBlock as E, reactive as D, ref as O, renderList as k, toDisplayString as A, unref as j, withModifiers as M } from "vue";
3
+ import { Fragment as _, computed as v, createCommentVNode as y, createElementBlock as b, createElementVNode as x, defineComponent as S, normalizeClass as C, normalizeStyle as w, onBeforeUnmount as T, onMounted as E, openBlock as D, reactive as O, ref as k, renderList as A, toDisplayString as j, unref as M, withModifiers as N } from "vue";
4
4
  //#region src/useSoftKeyboard.ts
5
- var N = /* @__PURE__ */ new Set([
5
+ var P = /* @__PURE__ */ new Set([
6
6
  "text",
7
7
  "search",
8
8
  "tel",
@@ -11,11 +11,11 @@ var N = /* @__PURE__ */ new Set([
11
11
  "number",
12
12
  ""
13
13
  ]);
14
- function P(e) {
15
- return !(e instanceof HTMLInputElement) || e.disabled || e.readOnly ? !1 : N.has((e.type || "text").toLowerCase());
14
+ function F(e) {
15
+ return !(e instanceof HTMLInputElement) || e.disabled || e.readOnly ? !1 : P.has((e.type || "text").toLowerCase());
16
16
  }
17
- function F() {
18
- let e = D({
17
+ function I() {
18
+ let e = O({
19
19
  visible: !1,
20
20
  mode: "zh",
21
21
  kind: "text",
@@ -120,9 +120,9 @@ function F() {
120
120
  } else e.mode === "en" && (n >= "a" && n <= "z" || n >= "A" && n <= "Z") && (n = e.shift ? n.toUpperCase() : n.toLowerCase(), e.shift = !1), x(n);
121
121
  }
122
122
  }
123
- function O(e) {
123
+ function D(e) {
124
124
  let t = e.target;
125
- P(t) && (n && t instanceof Node && n.contains(t) || _(t));
125
+ F(t) && (n && t instanceof Node && n.contains(t) || _(t));
126
126
  }
127
127
  function k(e) {
128
128
  if (e.target !== t) return;
@@ -132,10 +132,10 @@ function F() {
132
132
  }, 0);
133
133
  }
134
134
  function A(e) {
135
- n = e, !s && (s = !0, document.addEventListener("focusin", O), document.addEventListener("focusout", k));
135
+ n = e, !s && (s = !0, document.addEventListener("focusin", D), document.addEventListener("focusout", k));
136
136
  }
137
137
  function j() {
138
- s &&= (document.removeEventListener("focusin", O), document.removeEventListener("focusout", k), !1), n = null, y(!1);
138
+ s &&= (document.removeEventListener("focusin", D), document.removeEventListener("focusout", k), !1), n = null, y(!1);
139
139
  }
140
140
  return {
141
141
  state: e,
@@ -149,47 +149,54 @@ function F() {
149
149
  getTarget: () => t
150
150
  };
151
151
  }
152
- var I = F();
153
- function L() {
154
- return I;
152
+ var L = I();
153
+ function R() {
154
+ return L;
155
155
  }
156
156
  //#endregion
157
157
  //#region src/SoftKeyboard.vue?vue&type=script&setup=true&lang.ts
158
- var R = { class: "vti-kb__panel" }, z = { class: "vti-kb__strip" }, B = { class: "vti-kb__buffer" }, V = {
158
+ var z = { class: "vti-kb__panel" }, B = { class: "vti-kb__strip" }, V = { class: "vti-kb__buffer" }, H = {
159
159
  key: 0,
160
160
  class: "vti-kb__cands"
161
- }, H = ["onPointerdown"], U = {
161
+ }, U = ["onPointerdown"], W = {
162
162
  key: 0,
163
163
  class: "vti-kb__hint"
164
- }, W = {
164
+ }, G = {
165
165
  key: 1,
166
166
  class: "vti-kb__hint"
167
- }, G = ["onPointerdown"], K = { class: "vti-kb__row vti-kb__row--last" }, q = {
167
+ }, K = ["onPointerdown"], q = { class: "vti-kb__row vti-kb__row--last" }, J = {
168
168
  key: 0,
169
169
  type: "button",
170
170
  class: "vti-kb__key vti-kb__key--ghost",
171
171
  disabled: ""
172
- }, J = {
172
+ }, Y = {
173
173
  key: 1,
174
174
  type: "button",
175
175
  class: "vti-kb__key vti-kb__key--ghost",
176
176
  disabled: ""
177
- }, Y = ["onPointerdown"], X = { class: "vti-kb__row vti-kb__row--num" }, Z = /* @__PURE__ */ S({
177
+ }, X = ["onPointerdown"], Z = { class: "vti-kb__row vti-kb__row--num" }, Q = /* @__PURE__ */ S({
178
178
  __name: "SoftKeyboard",
179
- props: { instance: {} },
179
+ props: {
180
+ instance: {},
181
+ accent: {},
182
+ background: {}
183
+ },
180
184
  setup(e) {
181
- let t = e.instance ?? I, n = O(null), r = t.candidates;
182
- T(() => t.attach(n.value)), w(() => t.detach());
183
- function i(e) {
185
+ let t = e, n = t.instance ?? L, r = k(null), i = n.candidates, a = v(() => {
186
+ let e = {};
187
+ return t.accent && (e["--vti-accent"] = t.accent), t.background && (e["--vti-bg"] = t.background), Object.keys(e).length > 0 ? e : void 0;
188
+ });
189
+ E(() => n.attach(r.value)), T(() => n.detach());
190
+ function o(e) {
184
191
  e.preventDefault(), e.stopPropagation();
185
192
  }
186
- function a(e, n) {
187
- i(e), t.press(n);
193
+ function s(e, t) {
194
+ o(e), n.press(t);
188
195
  }
189
- function o(e, n) {
190
- i(e), t.pickCandidate(n);
196
+ function c(e, t) {
197
+ o(e), n.pickCandidate(t);
191
198
  }
192
- let s = [
199
+ let l = [
193
200
  [
194
201
  "q",
195
202
  "w",
@@ -222,7 +229,7 @@ var R = { class: "vti-kb__panel" }, z = { class: "vti-kb__strip" }, B = { class:
222
229
  "n",
223
230
  "m"
224
231
  ]
225
- ], c = [
232
+ ], u = [
226
233
  [
227
234
  "7",
228
235
  "8",
@@ -242,97 +249,98 @@ var R = { class: "vti-kb__panel" }, z = { class: "vti-kb__strip" }, B = { class:
242
249
  "mode:back"
243
250
  ]
244
251
  ];
245
- function l(e) {
246
- return t.state.mode === "en" && t.state.shift ? e.toUpperCase() : e;
252
+ function d(e) {
253
+ return n.state.mode === "en" && n.state.shift ? e.toUpperCase() : e;
247
254
  }
248
- function u() {
249
- return t.state.prevTextMode === "zh" ? "拼音" : "英文";
255
+ function f() {
256
+ return n.state.prevTextMode === "zh" ? "拼音" : "英文";
250
257
  }
251
- return (e, d) => (E(), b("div", {
258
+ return (e, t) => (D(), b("div", {
252
259
  ref_key: "rootRef",
253
- ref: n,
254
- class: C(["vti-kb", { show: j(t).state.visible }]),
255
- onPointerdown: i,
256
- onMousedown: i,
257
- onTouchstart: i,
258
- onClick: i,
259
- onContextmenu: d[10] ||= M(() => {}, ["prevent"])
260
- }, [x("div", R, [x("div", z, [x("span", B, A(j(t).state.mode === "zh" ? j(t).state.buffer : j(t).state.draft), 1), j(t).state.mode === "zh" ? (E(), b("div", V, [(E(!0), b(_, null, k(j(r), (e, t) => (E(), b("button", {
260
+ ref: r,
261
+ class: C(["vti-kb", { show: M(n).state.visible }]),
262
+ style: w(a.value),
263
+ onPointerdown: o,
264
+ onMousedown: o,
265
+ onTouchstart: o,
266
+ onClick: o,
267
+ onContextmenu: t[10] ||= N(() => {}, ["prevent"])
268
+ }, [x("div", z, [x("div", B, [x("span", V, j(M(n).state.mode === "zh" ? M(n).state.buffer : M(n).state.draft), 1), M(n).state.mode === "zh" ? (D(), b("div", H, [(D(!0), b(_, null, A(M(i), (e, t) => (D(), b("button", {
261
269
  key: `${e.consumed}-${e.text}-${t}`,
262
270
  type: "button",
263
271
  class: "vti-kb__cand",
264
- onPointerdown: (t) => o(t, e)
265
- }, A(e.text), 41, H))), 128)), j(r).length === 0 ? (E(), b("span", U, "候选")) : y("", !0)])) : (E(), b("span", W, A(j(t).state.kind === "text" ? "英文/数字" : j(t).state.kind === "decimal" ? "数字 · 小数" : "数字"), 1))]), j(t).state.mode === "num" ? (E(), b(_, { key: 1 }, [(E(), b(_, null, k(c, (e, n) => x("div", {
266
- key: `n${n}`,
272
+ onPointerdown: (t) => c(t, e)
273
+ }, j(e.text), 41, U))), 128)), M(i).length === 0 ? (D(), b("span", W, "候选")) : y("", !0)])) : (D(), b("span", G, j(M(n).state.kind === "text" ? "英文/数字" : M(n).state.kind === "decimal" ? "数字 · 小数" : "数字"), 1))]), M(n).state.mode === "num" ? (D(), b(_, { key: 1 }, [(D(), b(_, null, A(u, (e, t) => x("div", {
274
+ key: `n${t}`,
267
275
  class: "vti-kb__row vti-kb__row--num"
268
- }, [(E(!0), b(_, null, k(e, (e) => (E(), b(_, { key: e }, [e === "." && j(t).state.kind === "digits" ? (E(), b("button", q, " · ")) : e === "mode:back" && j(t).state.kind !== "text" ? (E(), b("button", J, " · ")) : (E(), b("button", {
276
+ }, [(D(!0), b(_, null, A(e, (e) => (D(), b(_, { key: e }, [e === "." && M(n).state.kind === "digits" ? (D(), b("button", J, " · ")) : e === "mode:back" && M(n).state.kind !== "text" ? (D(), b("button", Y, " · ")) : (D(), b("button", {
269
277
  key: 2,
270
278
  type: "button",
271
279
  class: "vti-kb__key",
272
- onPointerdown: (t) => a(t, e)
273
- }, A(e === "backspace" ? "退格" : e === "mode:back" ? u() : e), 41, Y))], 64))), 128))])), 64)), x("div", X, [x("button", {
280
+ onPointerdown: (t) => s(t, e)
281
+ }, j(e === "backspace" ? "退格" : e === "mode:back" ? f() : e), 41, X))], 64))), 128))])), 64)), x("div", Z, [x("button", {
274
282
  type: "button",
275
283
  class: "vti-kb__key vti-kb__key--zero",
276
- onPointerdown: d[8] ||= (e) => a(e, "0")
284
+ onPointerdown: t[8] ||= (e) => s(e, "0")
277
285
  }, " 0 ", 32), x("button", {
278
286
  type: "button",
279
287
  class: "vti-kb__key vti-kb__key--done",
280
- onPointerdown: d[9] ||= (e) => a(e, "done")
281
- }, " 完成 ", 32)])], 64)) : (E(), b(_, { key: 0 }, [(E(), b(_, null, k(s, (e, n) => x("div", {
282
- key: `l${n}`,
288
+ onPointerdown: t[9] ||= (e) => s(e, "done")
289
+ }, " 完成 ", 32)])], 64)) : (D(), b(_, { key: 0 }, [(D(), b(_, null, A(l, (e, r) => x("div", {
290
+ key: `l${r}`,
283
291
  class: "vti-kb__row"
284
292
  }, [
285
- n === 2 ? (E(), b("button", {
293
+ r === 2 ? (D(), b("button", {
286
294
  key: 0,
287
295
  type: "button",
288
- class: C(["vti-kb__key vti-kb__key--fn", { on: j(t).state.shift }]),
289
- onPointerdown: d[0] ||= (e) => a(e, "shift")
296
+ class: C(["vti-kb__key vti-kb__key--fn", { on: M(n).state.shift }]),
297
+ onPointerdown: t[0] ||= (e) => s(e, "shift")
290
298
  }, " ⇧ ", 34)) : y("", !0),
291
- (E(!0), b(_, null, k(e, (e) => (E(), b("button", {
299
+ (D(!0), b(_, null, A(e, (e) => (D(), b("button", {
292
300
  key: e,
293
301
  type: "button",
294
302
  class: "vti-kb__key vti-kb__key--letter",
295
- onPointerdown: (t) => a(t, e)
296
- }, A(l(e)), 41, G))), 128)),
297
- n === 2 ? (E(), b("button", {
303
+ onPointerdown: (t) => s(t, e)
304
+ }, j(d(e)), 41, K))), 128)),
305
+ r === 2 ? (D(), b("button", {
298
306
  key: 1,
299
307
  type: "button",
300
308
  class: "vti-kb__key vti-kb__key--fn",
301
- onPointerdown: d[1] ||= (e) => a(e, "backspace")
309
+ onPointerdown: t[1] ||= (e) => s(e, "backspace")
302
310
  }, " 退格 ", 32)) : y("", !0)
303
- ])), 64)), x("div", K, [
311
+ ])), 64)), x("div", q, [
304
312
  x("button", {
305
313
  type: "button",
306
314
  class: "vti-kb__key vti-kb__key--fn",
307
- onPointerdown: d[2] ||= (e) => a(e, "mode:num")
315
+ onPointerdown: t[2] ||= (e) => s(e, "mode:num")
308
316
  }, " 123 ", 32),
309
317
  x("button", {
310
318
  type: "button",
311
319
  class: "vti-kb__key vti-kb__key--fn",
312
- onPointerdown: d[3] ||= (e) => a(e, j(t).state.mode === "zh" ? "mode:en" : "mode:zh")
313
- }, A(j(t).state.mode === "zh" ? "英" : "拼"), 33),
320
+ onPointerdown: t[3] ||= (e) => s(e, M(n).state.mode === "zh" ? "mode:en" : "mode:zh")
321
+ }, j(M(n).state.mode === "zh" ? "英" : "拼"), 33),
314
322
  x("button", {
315
323
  type: "button",
316
324
  class: "vti-kb__key vti-kb__key--space",
317
- onPointerdown: d[4] ||= (e) => a(e, "space")
325
+ onPointerdown: t[4] ||= (e) => s(e, "space")
318
326
  }, " 空格 ", 32),
319
327
  x("button", {
320
328
  type: "button",
321
329
  class: "vti-kb__key vti-kb__key--fn",
322
- onPointerdown: d[5] ||= (e) => a(e, j(t).state.mode === "zh" ? "," : ",")
323
- }, A(j(t).state.mode === "zh" ? "," : ","), 33),
330
+ onPointerdown: t[5] ||= (e) => s(e, M(n).state.mode === "zh" ? "," : ",")
331
+ }, j(M(n).state.mode === "zh" ? "," : ","), 33),
324
332
  x("button", {
325
333
  type: "button",
326
334
  class: "vti-kb__key vti-kb__key--fn",
327
- onPointerdown: d[6] ||= (e) => a(e, j(t).state.mode === "zh" ? "。" : ".")
328
- }, A(j(t).state.mode === "zh" ? "。" : "."), 33),
335
+ onPointerdown: t[6] ||= (e) => s(e, M(n).state.mode === "zh" ? "。" : ".")
336
+ }, j(M(n).state.mode === "zh" ? "。" : "."), 33),
329
337
  x("button", {
330
338
  type: "button",
331
339
  class: "vti-kb__key vti-kb__key--done",
332
- onPointerdown: d[7] ||= (e) => a(e, "done")
340
+ onPointerdown: t[7] ||= (e) => s(e, "done")
333
341
  }, " 完成 ", 32)
334
- ])], 64))])], 34));
342
+ ])], 64))])], 38));
335
343
  }
336
344
  });
337
345
  //#endregion
338
- export { n as KIND_OVERRIDE_VALUES, e as PINYIN_CHARS, t as PINYIN_PHRASES, Z as SoftKeyboard, r as applyCharToDraft, i as backspaceDraft, a as backspaceTextInput, o as candidatesFor, F as createSoftKeyboard, s as draftToDomValue, c as hasFullSelection, l as insertIntoTextInput, u as isCharAllowed, P as isSoftInput, d as normalizeDraft, f as resolveBufferCommit, p as resolveSoftKind, m as resolveSoftKindWithOverride, I as softKeyboard, L as useSoftKeyboard, h as writeDraft, g as writeInputValue };
346
+ export { n as KIND_OVERRIDE_VALUES, e as PINYIN_CHARS, t as PINYIN_PHRASES, Q as SoftKeyboard, r as applyCharToDraft, i as backspaceDraft, a as backspaceTextInput, o as candidatesFor, I as createSoftKeyboard, s as draftToDomValue, c as hasFullSelection, l as insertIntoTextInput, u as isCharAllowed, F as isSoftInput, d as normalizeDraft, f as resolveBufferCommit, p as resolveSoftKind, m as resolveSoftKindWithOverride, L as softKeyboard, R as useSoftKeyboard, h as writeDraft, g as writeInputValue };
package/dist/style.css CHANGED
@@ -1,2 +1,2 @@
1
- .vti-kb{--vti-accent:#3ef2c0;--vti-accent-strong:#1d8a6e;--vti-bg:#071418f7;--vti-panel-border:#3ef2c04d;--vti-strip-bg:#040d10d9;--vti-strip-border:#3ef2c038;--vti-key-bg:linear-gradient(180deg, #18383cf2, #0d2226f2);--vti-key-border:#94c0bb47;--vti-key-fg:#d7e2e0;--vti-fn-fg:#9fc3bb;--vti-muted-fg:#5f7d81;--vti-buffer-fg:#8df5cf;--vti-key-h:54px;--vti-key-radius:10px;--vti-font:"Microsoft YaHei", "Noto Sans SC", Arial, sans-serif;z-index:2147483000;pointer-events:none;font-family:var(--vti-font);position:fixed;bottom:0;left:0;right:0}.vti-kb.show{pointer-events:auto}.vti-kb__panel{visibility:hidden;max-width:1120px;padding:10px 12px calc(12px + env(safe-area-inset-bottom,0px));border:1px solid var(--vti-panel-border);background:var(--vti-bg);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation;border-bottom:none;border-radius:14px 14px 0 0;margin:0 auto;transition:transform .18s,visibility 0s linear .18s;transform:translateY(100%);box-shadow:0 -14px 36px #0000008c}.vti-kb.show .vti-kb__panel{visibility:visible;transition:transform .18s,visibility;transform:translateY(0)}.vti-kb__strip{border:1px solid var(--vti-strip-border);background:var(--vti-strip-bg);border-radius:9px;align-items:center;gap:10px;min-height:46px;margin-bottom:8px;padding:4px 10px;display:flex}.vti-kb__buffer{min-width:88px;max-width:220px;color:var(--vti-buffer-fg);letter-spacing:.06em;white-space:nowrap;text-overflow:ellipsis;flex:none;font:600 17px Consolas,monospace;overflow:hidden}.vti-kb__cands{scrollbar-width:thin;scrollbar-color:color-mix(in srgb, var(--vti-accent) 30%, transparent) transparent;flex:1;align-items:center;gap:8px;min-width:0;display:flex;overflow-x:auto}.vti-kb__cand{border:1px solid color-mix(in srgb, var(--vti-accent) 35%, transparent);min-width:52px;height:36px;color:var(--vti-key-fg);background:color-mix(in srgb, var(--vti-bg) 85%, var(--vti-accent));cursor:pointer;border-radius:8px;flex:none;padding:0 14px;font-family:inherit;font-size:19px}.vti-kb__cand:active{border-color:var(--vti-accent);color:var(--vti-bg);background:var(--vti-accent)}.vti-kb__hint{color:var(--vti-muted-fg);white-space:nowrap;font-size:13px}.vti-kb__row{gap:8px;margin-bottom:8px;display:flex}.vti-kb__row--last{margin-bottom:0}.vti-kb__row--num{grid-template-columns:repeat(4,1fr);display:grid}.vti-kb__key{min-width:0;height:var(--vti-key-h);border:1px solid var(--vti-key-border);border-radius:var(--vti-key-radius);color:var(--vti-key-fg);background:var(--vti-key-bg);font:600 21px/1 var(--vti-font);cursor:pointer;flex:1;transition:all 80ms}.vti-kb__key:active{border-color:var(--vti-accent);color:var(--vti-bg);background:var(--vti-accent)}.vti-kb__key--fn{color:var(--vti-fn-fg);flex:1.4;font-size:16px}.vti-kb__key--fn.on{border-color:var(--vti-accent);color:var(--vti-accent)}.vti-kb__key--space{color:var(--vti-fn-fg);flex:3.2;font-size:16px}.vti-kb__key--done{border-color:color-mix(in srgb, var(--vti-accent) 55%, transparent);color:#06241c;background:linear-gradient(180deg, var(--vti-accent), var(--vti-accent-strong));flex:1.8;font-size:18px}.vti-kb__key--done:active{background:var(--vti-buffer-fg)}.vti-kb__key--zero{grid-column:span 2}.vti-kb__key--ghost{opacity:.28;cursor:default}
1
+ .vti-kb{--vti-accent:#3ef2c0;--vti-accent-strong:color-mix(in srgb, var(--vti-accent) 72%, #000);--vti-on-accent:#06241c;--vti-bg:#071418f7;--vti-panel-border:#3ef2c04d;--vti-strip-bg:#040d10d9;--vti-strip-border:#3ef2c038;--vti-key-bg:linear-gradient(180deg, #18383cf2, #0d2226f2);--vti-key-border:#94c0bb47;--vti-key-fg:#d7e2e0;--vti-fn-fg:#9fc3bb;--vti-muted-fg:#5f7d81;--vti-buffer-fg:#8df5cf;--vti-key-h:54px;--vti-key-radius:10px;--vti-font:"Microsoft YaHei", "Noto Sans SC", Arial, sans-serif;z-index:2147483000;pointer-events:none;font-family:var(--vti-font);position:fixed;bottom:0;left:0;right:0}.vti-kb.show{pointer-events:auto}.vti-kb__panel{visibility:hidden;max-width:1120px;padding:10px 12px calc(12px + env(safe-area-inset-bottom,0px));border:1px solid var(--vti-panel-border);background:var(--vti-bg);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation;border-bottom:none;border-radius:14px 14px 0 0;margin:0 auto;transition:transform .18s,visibility 0s linear .18s;transform:translateY(100%);box-shadow:0 -14px 36px #0000008c}.vti-kb.show .vti-kb__panel{visibility:visible;transition:transform .18s,visibility;transform:translateY(0)}.vti-kb__strip{border:1px solid var(--vti-strip-border);background:var(--vti-strip-bg);border-radius:9px;align-items:center;gap:10px;min-height:46px;margin-bottom:8px;padding:4px 10px;display:flex}.vti-kb__buffer{min-width:88px;max-width:220px;color:var(--vti-buffer-fg);letter-spacing:.06em;white-space:nowrap;text-overflow:ellipsis;flex:none;font:600 17px Consolas,monospace;overflow:hidden}.vti-kb__cands{scrollbar-width:thin;scrollbar-color:color-mix(in srgb, var(--vti-accent) 30%, transparent) transparent;flex:1;align-items:center;gap:8px;min-width:0;display:flex;overflow-x:auto}.vti-kb__cand{border:1px solid color-mix(in srgb, var(--vti-accent) 35%, transparent);min-width:52px;height:36px;color:var(--vti-key-fg);background:color-mix(in srgb, var(--vti-bg) 85%, var(--vti-accent));cursor:pointer;border-radius:8px;flex:none;padding:0 14px;font-family:inherit;font-size:19px}.vti-kb__cand:active{border-color:var(--vti-accent);color:var(--vti-bg);background:var(--vti-accent)}.vti-kb__hint{color:var(--vti-muted-fg);white-space:nowrap;font-size:13px}.vti-kb__row{gap:8px;margin-bottom:8px;display:flex}.vti-kb__row--last{margin-bottom:0}.vti-kb__row--num{grid-template-columns:repeat(4,1fr);display:grid}.vti-kb__key{min-width:0;height:var(--vti-key-h);border:1px solid var(--vti-key-border);border-radius:var(--vti-key-radius);color:var(--vti-key-fg);background:var(--vti-key-bg);font:600 21px/1 var(--vti-font);cursor:pointer;flex:1;transition:all 80ms}.vti-kb__key:active{border-color:var(--vti-accent);color:var(--vti-bg);background:var(--vti-accent)}.vti-kb__key--fn{color:var(--vti-fn-fg);flex:1.4;font-size:16px}.vti-kb__key--fn.on{border-color:var(--vti-accent);color:var(--vti-accent)}.vti-kb__key--space{color:var(--vti-fn-fg);flex:3.2;font-size:16px}.vti-kb__key--done{border-color:color-mix(in srgb, var(--vti-accent) 55%, transparent);color:var(--vti-on-accent);background:linear-gradient(180deg, var(--vti-accent), var(--vti-accent-strong));flex:1.8;font-size:18px}.vti-kb__key--done:active{background:var(--vti-buffer-fg)}.vti-kb__key--zero{grid-column:span 2}.vti-kb__key--ghost{opacity:.28;cursor:default}
2
2
  /*$vite$:1*/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@junerver/vue-touch-ime",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Vue 3 触摸屏软键盘(内置中文拼音输入法)- 零接线焦点接管、按输入类型限制(数字/小数/文本)、中英数三模式,适配无物理键盘的触屏工控/车载/自助终端",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -36,7 +36,7 @@
36
36
  "build:types": "vue-tsc --declaration --emitDeclarationOnly --outDir dist -p tsconfig.build.json",
37
37
  "test": "vitest run",
38
38
  "gen:dict": "python scripts/gen-pinyin-dict.py",
39
- "prepublishOnly": "npm run build && npm test"
39
+ "prepublishOnly": "npm run build"
40
40
  },
41
41
  "keywords": [
42
42
  "vue",