@omnipad/vue 0.1.1-alpha.0 → 0.2.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ import { ComponentProvideOptions } from 'vue';
9
9
  import { ComponentPublicInstance } from 'vue';
10
10
  import { ComputedRef } from 'vue';
11
11
  import { ConfigTreeNode } from '@omnipad/core';
12
+ import { CursorState } from '@omnipad/core';
12
13
  import { DebuggerEvent } from 'vue';
13
14
  import { DefineComponent } from 'vue';
14
15
  import { GlobalComponents } from 'vue';
@@ -20,6 +21,7 @@ import { OnCleanup } from '@vue/reactivity';
20
21
  import { PublicProps } from 'vue';
21
22
  import { ShallowUnwrapRef } from 'vue';
22
23
  import { Slot } from 'vue';
24
+ import { Vec2 } from '@omnipad/core';
23
25
  import { VNodeProps } from 'vue';
24
26
  import { WatchOptions } from 'vue';
25
27
  import { WatchStopHandle } from 'vue';
@@ -32,6 +34,10 @@ declare const __VLS_component_2: DefineComponent<__VLS_Props, {}, {}, {}, {}, Co
32
34
  elementRef: HTMLDivElement;
33
35
  }, HTMLDivElement>;
34
36
 
37
+ declare const __VLS_component_3: DefineComponent<TargetZoneProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<TargetZoneProps> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
38
+ elementRef: HTMLDivElement;
39
+ }, HTMLDivElement>;
40
+
35
41
  declare type __VLS_Props = {
36
42
  /** The runtime tree node for auto-configuration. */
37
43
  treeNode?: ConfigTreeNode;
@@ -61,10 +67,32 @@ declare function __VLS_template_2(): {
61
67
  rootEl: HTMLDivElement;
62
68
  };
63
69
 
70
+ declare function __VLS_template_3(): {
71
+ attrs: Partial<{}>;
72
+ slots: {
73
+ 'focus-feedback'?(_: {
74
+ state: CursorState | undefined;
75
+ isReturning: boolean | undefined;
76
+ cursorPos: Vec2 | undefined;
77
+ }): any;
78
+ cursor?(_: {
79
+ state: CursorState | undefined;
80
+ isDown: boolean | undefined;
81
+ cursorPos: Vec2 | undefined;
82
+ }): any;
83
+ };
84
+ refs: {
85
+ elementRef: HTMLDivElement;
86
+ };
87
+ rootEl: HTMLDivElement;
88
+ };
89
+
64
90
  declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
65
91
 
66
92
  declare type __VLS_TemplateResult_2 = ReturnType<typeof __VLS_template_2>;
67
93
 
94
+ declare type __VLS_TemplateResult_3 = ReturnType<typeof __VLS_template_3>;
95
+
68
96
  declare type __VLS_WithTemplateSlots<T, S> = T & {
69
97
  new (): {
70
98
  $slots: S;
@@ -77,6 +105,12 @@ declare type __VLS_WithTemplateSlots_2<T, S> = T & {
77
105
  };
78
106
  };
79
107
 
108
+ declare type __VLS_WithTemplateSlots_3<T, S> = T & {
109
+ new (): {
110
+ $slots: S;
111
+ };
112
+ };
113
+
80
114
  export declare const InputZone: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
81
115
 
82
116
  declare interface InputZoneProps {
@@ -97,9 +131,7 @@ export declare function registerComponent(type: string, component: Component): v
97
131
 
98
132
  export declare const RootLayer: __VLS_WithTemplateSlots_2<typeof __VLS_component_2, __VLS_TemplateResult_2["slots"]>;
99
133
 
100
- export declare const TargetZone: DefineComponent<TargetZoneProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<TargetZoneProps> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
101
- elementRef: HTMLDivElement;
102
- }, HTMLDivElement>;
134
+ export declare const TargetZone: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
103
135
 
104
136
  declare interface TargetZoneProps {
105
137
  /** The runtime tree node for automatic setup. */
@@ -114,11 +146,12 @@ declare interface TargetZoneProps {
114
146
  layout?: LayoutBox;
115
147
  }
116
148
 
117
- export declare const VirtualKeyboardButton: DefineComponent<VirtualKeyButtonButtonProps, {
149
+ export declare const VirtualKeyboardButton: DefineComponent<VirtualKeyButtonProps, {
118
150
  uid: ComputedRef<any>;
119
151
  onPointerDown: (e: PointerEvent) => void | undefined;
120
152
  onPointerUp: (e: PointerEvent) => void | undefined;
121
- }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<VirtualKeyButtonButtonProps> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
153
+ onPointerCancel: (e: PointerEvent) => void | undefined;
154
+ }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<VirtualKeyButtonProps> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
122
155
  elementRef: ({
123
156
  $: ComponentInternalInstance;
124
157
  $data: {};
@@ -176,10 +209,10 @@ default?(_: {}): any;
176
209
  }) | null;
177
210
  }, HTMLDivElement>;
178
211
 
179
- declare interface VirtualKeyButtonButtonProps {
212
+ declare interface VirtualKeyButtonProps {
180
213
  /** The runtime tree node for automatic setup. */
181
214
  treeNode?: ConfigTreeNode;
182
- /** Unique configuration ID (CID) for this zone. Used for profile serialization. */
215
+ /** Unique configuration ID (CID) for this button. Used for profile serialization. */
183
216
  widgetId?: string;
184
217
  /** The text or symbol displayed on the button surface. */
185
218
  label?: string;
@@ -194,4 +227,166 @@ declare interface VirtualKeyButtonButtonProps {
194
227
  layout?: LayoutBox;
195
228
  }
196
229
 
230
+ export declare const VirtualMouseButton: DefineComponent<VirtualMouseButtonProps, {
231
+ uid: ComputedRef<any>;
232
+ onPointerDown: (e: PointerEvent) => void | undefined;
233
+ onPointerUp: (e: PointerEvent) => void | undefined;
234
+ onPointerCancel: (e: PointerEvent) => void | undefined;
235
+ }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<VirtualMouseButtonProps> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
236
+ elementRef: ({
237
+ $: ComponentInternalInstance;
238
+ $data: {};
239
+ $props: {
240
+ readonly layout?: LayoutBox | undefined;
241
+ readonly isActive?: boolean | undefined;
242
+ readonly label?: string | undefined;
243
+ } & VNodeProps & AllowedComponentProps & ComponentCustomProps;
244
+ $attrs: {
245
+ [x: string]: unknown;
246
+ };
247
+ $refs: {
248
+ [x: string]: unknown;
249
+ };
250
+ $slots: Readonly<{
251
+ [name: string]: Slot<any> | undefined;
252
+ }>;
253
+ $root: ComponentPublicInstance | null;
254
+ $parent: ComponentPublicInstance | null;
255
+ $host: Element | null;
256
+ $emit: (event: string, ...args: any[]) => void;
257
+ $el: HTMLDivElement;
258
+ $options: ComponentOptionsBase<Readonly<{
259
+ layout?: LayoutBox;
260
+ isActive?: boolean;
261
+ label?: string;
262
+ }> & Readonly<{}>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, {}, {}, string, {}, GlobalComponents, GlobalDirectives, string, ComponentProvideOptions> & {
263
+ beforeCreate?: (() => void) | (() => void)[];
264
+ created?: (() => void) | (() => void)[];
265
+ beforeMount?: (() => void) | (() => void)[];
266
+ mounted?: (() => void) | (() => void)[];
267
+ beforeUpdate?: (() => void) | (() => void)[];
268
+ updated?: (() => void) | (() => void)[];
269
+ activated?: (() => void) | (() => void)[];
270
+ deactivated?: (() => void) | (() => void)[];
271
+ beforeDestroy?: (() => void) | (() => void)[];
272
+ beforeUnmount?: (() => void) | (() => void)[];
273
+ destroyed?: (() => void) | (() => void)[];
274
+ unmounted?: (() => void) | (() => void)[];
275
+ renderTracked?: ((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[];
276
+ renderTriggered?: ((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[];
277
+ errorCaptured?: ((err: unknown, instance: ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: ComponentPublicInstance | null, info: string) => boolean | void)[];
278
+ };
279
+ $forceUpdate: () => void;
280
+ $nextTick: nextTick;
281
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, OnCleanup]) => any : (...args: [any, any, OnCleanup]) => any, options?: WatchOptions): WatchStopHandle;
282
+ } & Readonly<{}> & Omit<Readonly<{
283
+ layout?: LayoutBox;
284
+ isActive?: boolean;
285
+ label?: string;
286
+ }> & Readonly<{}>, never> & ShallowUnwrapRef< {}> & {} & ComponentCustomProperties & {} & {
287
+ $slots: {
288
+ default?(_: {}): any;
289
+ };
290
+ }) | null;
291
+ }, HTMLDivElement>;
292
+
293
+ declare interface VirtualMouseButtonProps {
294
+ /** The runtime tree node for automatic setup. */
295
+ treeNode?: ConfigTreeNode;
296
+ /** Unique configuration ID (CID) for this button. Used for profile serialization. */
297
+ widgetId?: string;
298
+ /** The text or symbol displayed on the button surface. */
299
+ label?: string;
300
+ /** The ID (CID) of the TargetZone this button sends signals to. */
301
+ targetStageId?: string;
302
+ /** 0: Left, 1: Middle, 2: Right */
303
+ button?: 0 | 1 | 2;
304
+ /**
305
+ * Fixed coordinate to click on (0-100 percentage).
306
+ * Example: { x: 95, y: 5 } for a pause button in the corner.
307
+ */
308
+ fixedPoint?: Vec2;
309
+ /** Spatial layout configuration relative to its parent zone. */
310
+ layout?: LayoutBox;
311
+ }
312
+
313
+ export declare const VirtualTrackpad: DefineComponent<VirtualTrackpadProps, {
314
+ uid: ComputedRef<any>;
315
+ onPointerDown: (e: PointerEvent) => void | undefined;
316
+ onPointerMove: (e: PointerEvent) => void | undefined;
317
+ onPointerUp: (e: PointerEvent) => void | undefined;
318
+ onPointerCancel: (e: PointerEvent) => void | undefined;
319
+ }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<VirtualTrackpadProps> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
320
+ elementRef: ({
321
+ $: ComponentInternalInstance;
322
+ $data: {};
323
+ $props: {
324
+ readonly layout?: LayoutBox | undefined;
325
+ readonly isActive?: boolean | undefined;
326
+ readonly label?: string | undefined;
327
+ } & VNodeProps & AllowedComponentProps & ComponentCustomProps;
328
+ $attrs: {
329
+ [x: string]: unknown;
330
+ };
331
+ $refs: {
332
+ [x: string]: unknown;
333
+ };
334
+ $slots: Readonly<{
335
+ [name: string]: Slot<any> | undefined;
336
+ }>;
337
+ $root: ComponentPublicInstance | null;
338
+ $parent: ComponentPublicInstance | null;
339
+ $host: Element | null;
340
+ $emit: (event: string, ...args: any[]) => void;
341
+ $el: HTMLDivElement;
342
+ $options: ComponentOptionsBase<Readonly<{
343
+ layout?: LayoutBox;
344
+ isActive?: boolean;
345
+ label?: string;
346
+ }> & Readonly<{}>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, {}, {}, string, {}, GlobalComponents, GlobalDirectives, string, ComponentProvideOptions> & {
347
+ beforeCreate?: (() => void) | (() => void)[];
348
+ created?: (() => void) | (() => void)[];
349
+ beforeMount?: (() => void) | (() => void)[];
350
+ mounted?: (() => void) | (() => void)[];
351
+ beforeUpdate?: (() => void) | (() => void)[];
352
+ updated?: (() => void) | (() => void)[];
353
+ activated?: (() => void) | (() => void)[];
354
+ deactivated?: (() => void) | (() => void)[];
355
+ beforeDestroy?: (() => void) | (() => void)[];
356
+ beforeUnmount?: (() => void) | (() => void)[];
357
+ destroyed?: (() => void) | (() => void)[];
358
+ unmounted?: (() => void) | (() => void)[];
359
+ renderTracked?: ((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[];
360
+ renderTriggered?: ((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[];
361
+ errorCaptured?: ((err: unknown, instance: ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: ComponentPublicInstance | null, info: string) => boolean | void)[];
362
+ };
363
+ $forceUpdate: () => void;
364
+ $nextTick: nextTick;
365
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, OnCleanup]) => any : (...args: [any, any, OnCleanup]) => any, options?: WatchOptions): WatchStopHandle;
366
+ } & Readonly<{}> & Omit<Readonly<{
367
+ layout?: LayoutBox;
368
+ isActive?: boolean;
369
+ label?: string;
370
+ }> & Readonly<{}>, never> & ShallowUnwrapRef< {}> & {} & ComponentCustomProperties & {} & {
371
+ $slots: {
372
+ default?(_: {}): any;
373
+ };
374
+ }) | null;
375
+ }, HTMLDivElement>;
376
+
377
+ declare interface VirtualTrackpadProps {
378
+ /** The runtime tree node for automatic setup. */
379
+ treeNode?: ConfigTreeNode;
380
+ /** Unique configuration ID (CID) for this trackpad. Used for profile serialization. */
381
+ widgetId?: string;
382
+ /** The text or symbol displayed on the trackpad surface. */
383
+ label?: string;
384
+ /** Determines the mapping ratio between the physical displacement of the trackpad and the movement of the screen cursor. */
385
+ sensitivity?: number;
386
+ /** The ID (CID) of the TargetZone this trackpad sends signals to. */
387
+ targetStageId?: string;
388
+ /** Spatial layout configuration relative to its parent zone. */
389
+ layout?: LayoutBox;
390
+ }
391
+
197
392
  export { }
@@ -1 +1 @@
1
- :root{--omnipad-btn-bg: rgba(255, 255, 255, .2);--omnipad-btn-border-color: rgba(255, 255, 255, .4);--omnipad-btn-border-width: 2px;--omnipad-btn-border-style: solid;--omnipad-btn-radius: 8px;--omnipad-btn-label-color: #ffffff;--omnipad-btn-font-family: "Upheaval", "monacoregular", sans-serif;--omnipad-btn-font-size: 18px;--omnipad-btn-font-weight: bold;--omnipad-btn-pressed-bg: rgba(255, 186, 67, .6);--omnipad-btn-pressed-border-color: #ffba43;--omnipad-btn-pressed-scale: .92;--omnipad-btn-pressed-opacity: 1;--omnipad-btn-transition-duration: .1s;--omnipad-btn-transition-timing: ease-out}.omnipad-button-base{background:var(--omnipad-btn-bg);border:var(--omnipad-btn-border-width) var(--omnipad-btn-border-style) var(--omnipad-btn-border-color);border-radius:var(--omnipad-btn-radius);display:flex;align-items:center;justify-content:center;transition:all var(--omnipad-btn-transition-duration) var(--omnipad-btn-transition-timing)}.omnipad-button-label-hollow{font-family:var(--omnipad-btn-font-family);font-size:var(--omnipad-btn-font-size);color:var(--omnipad-btn-label-color);font-weight:var(--omnipad-btn-font-weight);background:inherit;-webkit-background-clip:text;background-clip:text;color:transparent;filter:invert(1) grayscale(1) contrast(9);mix-blend-mode:destination-out}.omnipad-prevent{touch-action:none;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent}.omnipad-virtual-layer-base[data-v-6f1860f6]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000}[data-v-6f1860f6] .omnipad-input-zone,[data-v-6f1860f6] .omnipad-button{pointer-events:auto}.omnipad-input-zone[data-v-02669919]{position:absolute;pointer-events:none}.omnipad-input-zone-trigger[data-v-02669919]{position:absolute;inset:0;pointer-events:auto;background:transparent;touch-action:none}.dynamic-widget-mount[data-v-02669919]{pointer-events:none}.omnipad-virtual-layer[data-v-a509fd6e]{position:relative;height:100%;width:100%;pointer-events:none}.omnipad-target-zone[data-v-b9d49b97]{pointer-events:none;overflow:hidden}.omnipad-virtual-cursor[data-v-b9d49b97]{position:absolute;width:20px;height:20px;transform:translate(-50%,-50%);pointer-events:none;transition:opacity .2s}.cursor-dot[data-v-b9d49b97]{width:100%;height:100%;border:2px solid white;border-radius:50%;background:#ff000080}.cursor-dot.is-down[data-v-b9d49b97]{transform:scale(.8);background:red}.focus-feedback-ring[data-v-b9d49b97]{position:absolute;width:60px;height:60px;transform:translate(-50%,-50%);border:2px solid rgba(100,200,255,.8);border-radius:50%;pointer-events:none;z-index:5}.pulse-enter-active[data-v-b9d49b97]{animation:ripple-out-b9d49b97 .5s ease-out forwards}@keyframes ripple-out-b9d49b97{0%{transform:translate(-50%,-50%) scale(.2);opacity:1}to{transform:translate(-50%,-50%) scale(1.5);opacity:0}}.omnipad-virtual-cursor[data-v-b9d49b97]{z-index:10}.omnipad-button-base[data-v-6cbe805c]{-webkit-user-select:none;user-select:none;touch-action:none;overflow:hidden;box-sizing:border-box;pointer-events:auto}.omnipad-button-base.omnipad-is-active[data-v-6cbe805c]{background:var(--omnipad-btn-pressed-bg);border-color:var(--omnipad-btn-pressed-border-color);opacity:var(--omnipad-btn-pressed-opacity);filter:brightness(1.2)}.omnipad-button-label[data-v-6cbe805c]{font-family:var(--omnipad-btn-font-family);font-size:var(--omnipad-btn-font-size);color:var(--omnipad-btn-label-color);font-weight:var(--omnipad-btn-font-weight)}
1
+ :root{--omnipad-btn-bg: rgba(255, 255, 255, .2);--omnipad-btn-border-color: rgba(255, 255, 255, .4);--omnipad-btn-border-width: 2px;--omnipad-btn-border-style: solid;--omnipad-btn-radius: 8px;--omnipad-btn-label-color: #ffffff;--omnipad-btn-font-family: "Upheaval", "monacoregular", sans-serif;--omnipad-btn-font-size: 18px;--omnipad-btn-font-weight: bold;--omnipad-btn-pressed-bg: rgba(255, 186, 67, .6);--omnipad-btn-pressed-border-color: #ffba43;--omnipad-btn-pressed-scale: .92;--omnipad-btn-pressed-opacity: 1;--omnipad-btn-transition-duration: .1s;--omnipad-btn-transition-timing: ease-out;--omnipad-default-cursor-height: 20px;--omnipad-default-cursor-width: 20px;--omnipad-default-cursor-transition: var(--omnipad-default-cursor-transition-mode) var(--omnipad-default-cursor-transition-time);--omnipad-default-cursor-transition-mode: opacity;--omnipad-default-cursor-transition-time: .2s;--omnipad-default-cursor-dot-background: #ff000080;--omnipad-default-cursor-dot-border-color: #ffffff;--omnipad-default-cursor-dot-border-radius: 50%;--omnipad-default-cursor-dot-border-style: solid;--omnipad-default-cursor-dot-border-width: 2px;--omnipad-default-cursor-dot-down-background: #ff0000;--omnipad-default-cursor-dot-down-scale: .8;--omnipad-focus-color: rgba(100, 200, 255, .8);--omnipad-focus-bg-color: rgba(100, 200, 255, .05);--omnipad-trackpad-bg: rgba(255, 255, 255, .05);--omnipad-trackpad-border-style: dashed;--omnipad-trackpad-cursor: crosshair}.omnipad-button-base{background:var(--omnipad-btn-bg);border:var(--omnipad-btn-border-width) var(--omnipad-btn-border-style) var(--omnipad-btn-border-color);border-radius:var(--omnipad-btn-radius);display:flex;align-items:center;justify-content:center;transition:all var(--omnipad-btn-transition-duration) var(--omnipad-btn-transition-timing)}.omnipad-button-label-hollow{font-family:var(--omnipad-btn-font-family);font-size:var(--omnipad-btn-font-size);color:var(--omnipad-btn-label-color);font-weight:var(--omnipad-btn-font-weight);background:inherit;-webkit-background-clip:text;background-clip:text;color:transparent;filter:invert(1) grayscale(1) contrast(9);mix-blend-mode:destination-out}.omnipad-default-cursor-dot{width:100%;height:100%;border-width:var(--omnipad-default-cursor-dot-border-width);border-style:var(--omnipad-default-cursor-dot-border-style);border-color:var(--omnipad-default-cursor-dot-border-color);border-radius:var(--omnipad-default-cursor-dot-border-radius);background:var(--omnipad-default-cursor-dot-background)}.omnipad-default-cursor-dot.is-down{transform:scale(var(--omnipad-default-cursor-dot-down-scale));background:var(--omnipad-default-cursor-dot-down-background)}.omnipad-default-focus-border-feedback{position:absolute;inset:0;pointer-events:none;z-index:5;border:2px solid var(--omnipad-focus-color);background-color:var(--omnipad-focus-bg-color);box-shadow:inset 0 0 10px var(--omnipad-focus-color);box-sizing:border-box}.omnipad-default-focus-fade-enter-active{transition:opacity .05s ease-in}.omnipad-default-focus-fade-leave-active{transition:opacity .2s ease-out}.omnipad-default-focus-fade-enter-from,.omnipad-default-focus-fade-leave-to{opacity:0}.omnipad-prevent{touch-action:none;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent}.omnipad-trackpad:before{content:"";position:absolute;inset:10px;background-image:radial-gradient(rgba(255,255,255,.1) 1px,transparent 1px);background-size:20px 20px;pointer-events:none}.omnipad-virtual-layer-base[data-v-6f1860f6]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000}[data-v-6f1860f6] .omnipad-input-zone,[data-v-6f1860f6] .omnipad-button{pointer-events:auto}.omnipad-input-zone[data-v-e0c28ebd]{position:absolute;pointer-events:none;-webkit-user-select:none;user-select:none;touch-action:none}.omnipad-input-zone-trigger[data-v-e0c28ebd]{position:absolute;inset:0;pointer-events:auto;background:transparent;touch-action:none}.dynamic-widget-mount[data-v-e0c28ebd]{pointer-events:none}.omnipad-virtual-layer[data-v-9e46ef9c]{position:relative;height:100%;width:100%;pointer-events:none}.omnipad-target-zone[data-v-70b706ac]{-webkit-user-select:none;user-select:none;touch-action:none;pointer-events:auto;overflow:hidden}.omnipad-virtual-cursor[data-v-70b706ac]{position:absolute;width:var(--omnipad-default-cursor-width);height:var(--omnipad-default-cursor-height);transform:translate(-50%,-50%);pointer-events:none;transition:var(--omnipad-default-cursor-transition);z-index:10}.omnipad-button-base[data-v-3db6d4f9]{-webkit-user-select:none;user-select:none;touch-action:none;overflow:hidden;box-sizing:border-box;pointer-events:auto}.omnipad-button-base.is-active[data-v-3db6d4f9]{background:var(--omnipad-btn-pressed-bg);border-color:var(--omnipad-btn-pressed-border-color);opacity:var(--omnipad-btn-pressed-opacity);filter:brightness(1.2)}.omnipad-button-label[data-v-3db6d4f9]{font-family:var(--omnipad-btn-font-family);font-size:var(--omnipad-btn-font-size);color:var(--omnipad-btn-label-color);font-weight:var(--omnipad-btn-font-weight)}.omnipad-trackpad[data-v-c28e3a2e]{-webkit-user-select:none;user-select:none;touch-action:none;overflow:hidden;--omnipad-btn-border-style: var(--omnipad-trackpad-border-style);--omnipad-btn-bg: var(--omnipad-trackpad-bg);cursor:var(--omnipad-trackpad-cursor)}