Compare commits
3 Commits
8a4985e6a3
...
925a9fdea3
| Author | SHA1 | Date | |
|---|---|---|---|
| 925a9fdea3 | |||
| f0baa6ad67 | |||
| f25749470b |
@ -1,3 +1,5 @@
|
|||||||
|
import { InPlayerUIOptions } from '@src/common/interfaces/SettingsInterface';
|
||||||
|
|
||||||
export interface MenuItemConfig {
|
export interface MenuItemConfig {
|
||||||
label: string;
|
label: string;
|
||||||
subitems?: MenuItemConfig[];
|
subitems?: MenuItemConfig[];
|
||||||
@ -20,7 +22,7 @@ export enum MenuPosition {
|
|||||||
|
|
||||||
export interface MenuConfig {
|
export interface MenuConfig {
|
||||||
isGlobal?: boolean;
|
isGlobal?: boolean;
|
||||||
|
ui: InPlayerUIOptions;
|
||||||
menuPosition: MenuPosition;
|
menuPosition: MenuPosition;
|
||||||
activationRadius?: number;
|
|
||||||
items: MenuItemConfig[];
|
items: MenuItemConfig[];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -308,6 +308,23 @@ interface DevSettings {
|
|||||||
loadFromSnapshot: boolean,
|
loadFromSnapshot: boolean,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface InPlayerUIOptions {
|
||||||
|
activatorAlignment: 'left' | 'right',
|
||||||
|
minEnabledWidth: number, // don't show UI if player is narrower than % of screen width
|
||||||
|
minEnabledHeight: number, // don't show UI if player is narrower than % of screen height
|
||||||
|
activation: 'player' | 'player-ctrl' | 'trigger-zone' | 'distance' | 'none', // what needs to be hovered in order for UI to be visible
|
||||||
|
activationDistance: number,
|
||||||
|
activationDistanceUnits: '%' | 'px',
|
||||||
|
activatorPadding: 10,
|
||||||
|
activatorPaddingUnit: '%' | 'px',
|
||||||
|
triggerZoneDimensions: { // how large the trigger zone is (relative to player size)
|
||||||
|
width: number
|
||||||
|
height: number,
|
||||||
|
offsetX: number, // fed to translateX(offsetX + '%'). Valid range [-100, 0]
|
||||||
|
offsetY: number // fed to translateY(offsetY + '%'). Valid range [-100, 100]
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
interface SettingsInterface {
|
interface SettingsInterface {
|
||||||
_updateFlags?: {
|
_updateFlags?: {
|
||||||
requireReload?: SettingsReloadFlags,
|
requireReload?: SettingsReloadFlags,
|
||||||
@ -319,18 +336,7 @@ interface SettingsInterface {
|
|||||||
aard: AardSettings,
|
aard: AardSettings,
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
inPlayer: {
|
inPlayer: InPlayerUIOptions,
|
||||||
popupAlignment: 'left' | 'right',
|
|
||||||
minEnabledWidth: number, // don't show UI if player is narrower than % of screen width
|
|
||||||
minEnabledHeight: number, // don't show UI if player is narrower than % of screen height
|
|
||||||
activation: 'player' | 'trigger-zone' | 'distance' | 'none', // what needs to be hovered in order for UI to be visible
|
|
||||||
triggerZoneDimensions: { // how large the trigger zone is (relative to player size)
|
|
||||||
width: number
|
|
||||||
height: number,
|
|
||||||
offsetX: number, // fed to translateX(offsetX + '%'). Valid range [-100, 0]
|
|
||||||
offsetY: number // fed to translateY(offsetY + '%'). Valid range [-100, 100]
|
|
||||||
},
|
|
||||||
},
|
|
||||||
devMode?: boolean,
|
devMode?: boolean,
|
||||||
dev: DevUiConfig,
|
dev: DevUiConfig,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -264,7 +264,11 @@ const ExtensionConf: SettingsInterface = {
|
|||||||
minEnabledWidth: 0.75,
|
minEnabledWidth: 0.75,
|
||||||
minEnabledHeight: 0.75,
|
minEnabledHeight: 0.75,
|
||||||
activation: 'player',
|
activation: 'player',
|
||||||
popupAlignment: 'left',
|
activationDistance: 100,
|
||||||
|
activationDistanceUnits: '%',
|
||||||
|
activatorAlignment: 'left',
|
||||||
|
activatorPadding: 10,
|
||||||
|
activatorPaddingUnit: '%',
|
||||||
triggerZoneDimensions: {
|
triggerZoneDimensions: {
|
||||||
width: 0.5,
|
width: 0.5,
|
||||||
height: 0.5,
|
height: 0.5,
|
||||||
|
|||||||
@ -89,6 +89,7 @@ export default class EventBus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
send(command: string, commandData: any, context: EventBusContext = {}) {
|
send(command: string, commandData: any, context: EventBusContext = {}) {
|
||||||
|
context.visitedBusses = [...context.visitedBusses ?? [], this.uuid];
|
||||||
// execute commands we have subscriptions for
|
// execute commands we have subscriptions for
|
||||||
|
|
||||||
if (this.commands?.[command]) {
|
if (this.commands?.[command]) {
|
||||||
@ -111,13 +112,12 @@ export default class EventBus {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (command !== 'reload-required') {
|
if (command !== 'reload-required') {
|
||||||
// We shouldn't let reload-required command to trigger new reload-required commands.
|
// We shouldn't let reload-required command to trigger new reload-required commands.
|
||||||
this.send('reload-required', {});
|
this.send('reload-required', {}, {visitedBusses: [this.uuid]});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// call forwarding functions if they exist
|
// call forwarding functions if they exist
|
||||||
if (!context?.borderCrossings?.iframe) {
|
|
||||||
for (const forwarding of this.iframeForwardingList) {
|
for (const forwarding of this.iframeForwardingList) {
|
||||||
forwarding.fn(
|
forwarding.fn(
|
||||||
command,
|
command,
|
||||||
@ -126,15 +126,12 @@ export default class EventBus {
|
|||||||
...context,
|
...context,
|
||||||
borderCrossings: {
|
borderCrossings: {
|
||||||
...context?.borderCrossings,
|
...context?.borderCrossings,
|
||||||
iframe: true
|
// iframe: true // we actually no longer check this prop, we should instead rely on visitedBusses
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
this.sendToTunnel(command, commandData, context);
|
this.sendToTunnel(command, commandData, context);
|
||||||
} else {
|
|
||||||
console.warn('message was already sent to iframe, doing nothing ...')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (context?.stopPropagation) {
|
if (context?.stopPropagation) {
|
||||||
return;
|
return;
|
||||||
@ -148,6 +145,10 @@ export default class EventBus {
|
|||||||
* @param config
|
* @param config
|
||||||
*/
|
*/
|
||||||
sendToTunnel(command: string, config: any, context: EventBusContext = {}) {
|
sendToTunnel(command: string, config: any, context: EventBusContext = {}) {
|
||||||
|
if (!context.visitedBusses) {
|
||||||
|
console.error('Visited busses is missing from contextn. This is illegal.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
context.visitedBusses = [...context.visitedBusses ?? [], this.uuid];
|
context.visitedBusses = [...context.visitedBusses ?? [], this.uuid];
|
||||||
|
|
||||||
if (!this.disableTunnel && typeof window !== 'undefined') {
|
if (!this.disableTunnel && typeof window !== 'undefined') {
|
||||||
@ -205,7 +206,7 @@ export default class EventBus {
|
|||||||
const payload = event.data.payload as EventBusMessage;
|
const payload = event.data.payload as EventBusMessage;
|
||||||
|
|
||||||
console.info(this.name, 'received message from iframe. command:', payload);
|
console.info(this.name, 'received message from iframe. command:', payload);
|
||||||
if (!payload.context) {
|
if (!payload.context?.visitedBusses) {
|
||||||
console.warn('Received iframe message without context. Doing nothing in order to avoid infinite loop. Event:', event);
|
console.warn('Received iframe message without context. Doing nothing in order to avoid infinite loop. Event:', event);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ export class ClientMenu {
|
|||||||
public get root(): HTMLDivElement {
|
public get root(): HTMLDivElement {
|
||||||
return this._root;
|
return this._root;
|
||||||
}
|
}
|
||||||
|
private trigger: HTMLDivElement;
|
||||||
private visible = false;
|
private visible = false;
|
||||||
|
|
||||||
private menuPositionClasses: string[] = [];
|
private menuPositionClasses: string[] = [];
|
||||||
@ -22,6 +23,8 @@ export class ClientMenu {
|
|||||||
private lastMouseMove = performance.now();
|
private lastMouseMove = performance.now();
|
||||||
private idleTimer?: number;
|
private idleTimer?: number;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private onDocumentMouseMove?: (e: MouseEvent) => void;
|
private onDocumentMouseMove?: (e: MouseEvent) => void;
|
||||||
private onDocumentMouseLeave?: () => void;
|
private onDocumentMouseLeave?: () => void;
|
||||||
private idleIntervalId?: number;
|
private idleIntervalId?: number;
|
||||||
@ -75,16 +78,19 @@ export class ClientMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private getActivationRadius(anchorEl: HTMLElement): number | null {
|
private getActivationRadius(anchorEl: HTMLElement): number | null {
|
||||||
if (this.config.activationRadius == null) return null;
|
if (this.config.ui.activation !== 'distance') {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof this.config.activationRadius === 'number') {
|
if (this.config.ui.activationDistanceUnits === 'px') {
|
||||||
return this.config.activationRadius;
|
return +this.config.ui.activationDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
// percentage string
|
// percentage string
|
||||||
const rect = anchorEl.getBoundingClientRect();
|
const rect = anchorEl.getBoundingClientRect();
|
||||||
const pct = parseFloat(this.config.activationRadius);
|
const percent = +this.config.ui.activationDistance;
|
||||||
return Math.max(rect.width, rect.height) * (pct / 100);
|
|
||||||
|
return Math.max(rect.width, rect.height) * (percent / 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
private injectStyles() {
|
private injectStyles() {
|
||||||
@ -154,8 +160,6 @@ export class ClientMenu {
|
|||||||
pointerEvents: 'none',
|
pointerEvents: 'none',
|
||||||
background: 'transparent',
|
background: 'transparent',
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('UI host created:', this.host);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private createShadow() {
|
private createShadow() {
|
||||||
@ -208,7 +212,9 @@ export class ClientMenu {
|
|||||||
|
|
||||||
const trigger = document.createElement('div');
|
const trigger = document.createElement('div');
|
||||||
trigger.classList = 'uw-menu-trigger uw-trigger';
|
trigger.classList = 'uw-menu-trigger uw-trigger';
|
||||||
|
trigger.style = `margin: ${this.config.ui.activatorPadding ?? 10} ${this.config.ui.activatorPaddingUnit ?? '%'}`;
|
||||||
trigger.textContent = 'Ultrawidify';
|
trigger.textContent = 'Ultrawidify';
|
||||||
|
this.trigger = trigger;
|
||||||
|
|
||||||
const submenu = this.buildSubmenu(this.config.items);
|
const submenu = this.buildSubmenu(this.config.items);
|
||||||
|
|
||||||
@ -281,24 +287,38 @@ export class ClientMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private bindGlobalMouse(anchorEl: HTMLElement) {
|
private bindGlobalMouse(anchorEl: HTMLElement) {
|
||||||
const rect = anchorEl.getBoundingClientRect();
|
const playerRect = anchorEl.getBoundingClientRect();
|
||||||
const cx = rect.left + rect.width / 2;
|
|
||||||
const cy = rect.top + rect.height / 2;
|
let menuActivatorRect, cx, cy;
|
||||||
|
|
||||||
const activationRadius = this.getActivationRadius(anchorEl);
|
const activationRadius = this.getActivationRadius(anchorEl);
|
||||||
|
|
||||||
|
const recalculateActivator = () => {
|
||||||
|
menuActivatorRect = this.trigger.getBoundingClientRect();
|
||||||
|
cx = menuActivatorRect.left + menuActivatorRect.width / 2;
|
||||||
|
cy = menuActivatorRect.top + menuActivatorRect.height / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
recalculateActivator();
|
||||||
|
|
||||||
this.onDocumentMouseMove = (e: MouseEvent) => {
|
this.onDocumentMouseMove = (e: MouseEvent) => {
|
||||||
this.lastMouseMove = performance.now();
|
this.lastMouseMove = performance.now();
|
||||||
|
|
||||||
if (activationRadius != null) {
|
if (activationRadius != null) {
|
||||||
|
if (! menuActivatorRect.width) {
|
||||||
|
recalculateActivator();
|
||||||
|
}
|
||||||
|
|
||||||
const d = Math.hypot(e.clientX - cx, e.clientY - cy);
|
const d = Math.hypot(e.clientX - cx, e.clientY - cy);
|
||||||
this.isWithinActivation = d <= activationRadius;
|
this.isWithinActivation = d <= activationRadius;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this.isWithinActivation =
|
this.isWithinActivation =
|
||||||
e.clientX >= rect.left &&
|
e.clientX >= playerRect.left &&
|
||||||
e.clientX <= rect.right &&
|
e.clientX <= playerRect.right &&
|
||||||
e.clientY >= rect.top &&
|
e.clientY >= playerRect.top &&
|
||||||
e.clientY <= rect.bottom;
|
e.clientY <= playerRect.bottom &&
|
||||||
|
(this.config.ui.activation !== 'player-ctrl' || e.ctrlKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updateVisibility();
|
this.updateVisibility();
|
||||||
@ -319,7 +339,7 @@ export class ClientMenu {
|
|||||||
private startIdleWatcher() {
|
private startIdleWatcher() {
|
||||||
this.idleIntervalId = window.setInterval(() => {
|
this.idleIntervalId = window.setInterval(() => {
|
||||||
const idle = performance.now() - this.lastMouseMove > 1000;
|
const idle = performance.now() - this.lastMouseMove > 1000;
|
||||||
if (idle) {
|
if (idle && !this.isHovered) {
|
||||||
this.hide();
|
this.hide();
|
||||||
}
|
}
|
||||||
}, 200);
|
}, 200);
|
||||||
|
|||||||
@ -184,7 +184,7 @@ class UI {
|
|||||||
if (this.uiConfig.parentElement) {
|
if (this.uiConfig.parentElement) {
|
||||||
const menuConfig = {
|
const menuConfig = {
|
||||||
isGlobal: this.isGlobal,
|
isGlobal: this.isGlobal,
|
||||||
menuPosition: MenuPosition.Left,
|
ui: this.settings.active.ui.inPlayer,
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
customClassList: 'uw-site-info',
|
customClassList: 'uw-site-info',
|
||||||
|
|||||||
@ -88,7 +88,8 @@ export default class IframeManager {
|
|||||||
* @param context
|
* @param context
|
||||||
*/
|
*/
|
||||||
private handleIframeRegister(data, context) {
|
private handleIframeRegister(data, context) {
|
||||||
const existingIndex = this.iframeList.findIndex(x => x.frameId === context.comms.sourceFrame.frameId);
|
console.log('handling iframe register:', {data, context});
|
||||||
|
const existingIndex = this.iframeList.findIndex(x => x.frameId && x.frameId === context.comms?.sourceFrame?.frameId);
|
||||||
|
|
||||||
if (existingIndex !== -1) {
|
if (existingIndex !== -1) {
|
||||||
this.iframeList[existingIndex] = {
|
this.iframeList[existingIndex] = {
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
v-for="suboption of tab.children"
|
v-for="suboption of tab.children"
|
||||||
:key="suboption.id"
|
:key="suboption.id"
|
||||||
class="suboption"
|
class="suboption"
|
||||||
:class="{'active': suboption.id === selectedTab, 'disabled': suboption.disabled }"
|
:class="{'active': suboption.id === selectedTab, 'disabled': suboption.disabled, 'hidden': suboption.visible === false }"
|
||||||
@click="selectTab(suboption.id)"
|
@click="selectTab(suboption.id)"
|
||||||
>
|
>
|
||||||
<div class="label">
|
<div class="label">
|
||||||
@ -60,8 +60,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="grow content flex flex-col overflow-auto pr-4 pb-12">
|
<div class="grow content flex flex-col overflow-auto pr-4 pb-12">
|
||||||
<!-- autodetection warning -->
|
|
||||||
|
|
||||||
|
<!-- autodetection warning -->
|
||||||
<div class="warning-area">
|
<div class="warning-area">
|
||||||
<div
|
<div
|
||||||
v-if="statusFlags.hasDrm"
|
v-if="statusFlags.hasDrm"
|
||||||
@ -72,7 +72,19 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
This site is blocking automatic aspect ratio detection. You will have to adjust aspect ratio manually.<br/>
|
This site is blocking automatic aspect ratio detection. You will have to adjust aspect ratio manually.<br/>
|
||||||
<a>Learn more ...</a>
|
<!-- <a>Learn more ...</a> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
v-if="settings.active.preventReload"
|
||||||
|
class="info-box"
|
||||||
|
>
|
||||||
|
<div class="icon-container">
|
||||||
|
<mdicon name="information" :size="24" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
Some settings will only reply after page reload.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -86,6 +98,19 @@
|
|||||||
:site="site"
|
:site="site"
|
||||||
></VideoSettings>
|
></VideoSettings>
|
||||||
|
|
||||||
|
<template v-if="[
|
||||||
|
'site-extension-settings',
|
||||||
|
'window.site-extension-settings',
|
||||||
|
'embedded-extension-settings',
|
||||||
|
].includes(selectedTab)">
|
||||||
|
<template v-if="!settings || !siteSettings">
|
||||||
|
Loading settings ...
|
||||||
|
|
||||||
|
<pre> site: {{site}}</pre>
|
||||||
|
<pre> settings: {{!!settings}}</pre>
|
||||||
|
<pre>site settings: {{!!siteSettings}}</pre>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
<template v-if="settings && selectedTab === 'site-extension-settings'" >
|
<template v-if="settings && selectedTab === 'site-extension-settings'" >
|
||||||
<h3>Settings for {{site?.host}}</h3>
|
<h3>Settings for {{site?.host}}</h3>
|
||||||
<SiteExtensionSettings
|
<SiteExtensionSettings
|
||||||
@ -112,8 +137,14 @@
|
|||||||
:settings="settings"
|
:settings="settings"
|
||||||
></FrameSiteSettings>
|
></FrameSiteSettings>
|
||||||
</template>
|
</template>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
<template v-if="settings && selectedTab === 'default-extension-settings'" >
|
<template v-if="selectedTab === 'default-extension-settings'" >
|
||||||
|
<template v-if="!settings">
|
||||||
|
Loading settings ...
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
<h3>Default settings</h3>
|
<h3>Default settings</h3>
|
||||||
<SiteExtensionSettings
|
<SiteExtensionSettings
|
||||||
:settings="settings"
|
:settings="settings"
|
||||||
@ -121,6 +152,7 @@
|
|||||||
:isDefaultConfiguration="true"
|
:isDefaultConfiguration="true"
|
||||||
></SiteExtensionSettings>
|
></SiteExtensionSettings>
|
||||||
</template>
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
<OtherSiteSettings
|
<OtherSiteSettings
|
||||||
v-if="selectedTab === 'website-extension-settings'"
|
v-if="selectedTab === 'website-extension-settings'"
|
||||||
@ -236,7 +268,8 @@ const AVAILABLE_TABS = {
|
|||||||
id: 'window.site-extension-settings', label: 'Site and Extension options', icon: 'cogs',
|
id: 'window.site-extension-settings', label: 'Site and Extension options', icon: 'cogs',
|
||||||
children: [
|
children: [
|
||||||
{ id: 'window.site-extension-settings', label: 'For this site', },
|
{ id: 'window.site-extension-settings', label: 'For this site', },
|
||||||
{ id: 'embedded-extension-settings', label: 'For embedded sites', disabled: true, badgeCount: 0, },
|
{ id: 'window.parent-site-extension-settings', label: 'For parent page', visible: false,},
|
||||||
|
{ id: 'embedded-extension-settings', label: 'For embedded sites', disabled: true, visible: true, badgeCount: 0, },
|
||||||
{ id: 'default-extension-settings', label: 'Default settings' },
|
{ id: 'default-extension-settings', label: 'Default settings' },
|
||||||
{ id: 'website-extension-settings', label: 'Website exceptions' },
|
{ id: 'website-extension-settings', label: 'Website exceptions' },
|
||||||
]
|
]
|
||||||
@ -407,7 +440,6 @@ export default defineComponent({
|
|||||||
const tabs = [];
|
const tabs = [];
|
||||||
for (const tab of TAB_LOADOUT[this.role]) {
|
for (const tab of TAB_LOADOUT[this.role]) {
|
||||||
if (!AVAILABLE_TABS[tab]) {
|
if (!AVAILABLE_TABS[tab]) {
|
||||||
console.warn('[uw:SettingsWindowContent] tab', tab, 'is not present in available tabs:', AVAILABLE_TABS, '— tabs for role', this.role, TAB_LOADOUT[this.role]);
|
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
if (tab === 'site-extension-settings') {
|
if (tab === 'site-extension-settings') {
|
||||||
|
|||||||
@ -5,17 +5,32 @@
|
|||||||
<!-- The rest of the tab is under 'edit ratios and shortcuts' row -->
|
<!-- The rest of the tab is under 'edit ratios and shortcuts' row -->
|
||||||
<div v-if="settings" class="flex flex-col" style="width: 100%">
|
<div v-if="settings" class="flex flex-col" style="width: 100%">
|
||||||
|
|
||||||
<div class="flex flex-col compact-form">
|
<div class="flex flex-col gap-2">
|
||||||
<div
|
<div
|
||||||
class="flex flex-col field-group compact-form"
|
class="flex flex-col field-group compact-form gap-2"
|
||||||
>
|
>
|
||||||
<div class="field disabled">
|
<div class="field">
|
||||||
<div class="label">
|
<div class="label">
|
||||||
Popup activator position:
|
Popup activator position:
|
||||||
</div>
|
</div>
|
||||||
<div class="select">
|
<div class="select">
|
||||||
<select
|
<select
|
||||||
v-model="settings.active.ui.inPlayer.popupAlignment"
|
v-model="settings.active.ui.inPlayer.activatorAlignment"
|
||||||
|
@change="saveSettings()"
|
||||||
|
>
|
||||||
|
<option value="left">Left</option>
|
||||||
|
<option value="right">Right</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<div class="label">
|
||||||
|
Popup activator padding:
|
||||||
|
</div>
|
||||||
|
<div class="select">
|
||||||
|
<select
|
||||||
|
v-model="settings.active.ui.inPlayer.activatorAlignment"
|
||||||
@change="saveSettings()"
|
@change="saveSettings()"
|
||||||
>
|
>
|
||||||
<option value="left">Left</option>
|
<option value="left">Left</option>
|
||||||
@ -34,11 +49,47 @@
|
|||||||
@change="saveSettings()"
|
@change="saveSettings()"
|
||||||
>
|
>
|
||||||
<option value="player">
|
<option value="player">
|
||||||
When mouse hovers over player
|
When mouse moves over player, always
|
||||||
</option>
|
</option>
|
||||||
<option value="trigger-zone">
|
<option value="player-ctrl">
|
||||||
When mouse hovers over trigger zone
|
When mouse moves over player, while holding CTRL key
|
||||||
</option>
|
</option>
|
||||||
|
<option value="distance">
|
||||||
|
When mouse is close to the menu activator
|
||||||
|
</option>
|
||||||
|
<!-- <option value="trigger-zone">
|
||||||
|
When mouse moves over trigger zone
|
||||||
|
</option> -->
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-show="settings.active.ui.inPlayer.activation === 'distance'" class="field">
|
||||||
|
<div class="label">
|
||||||
|
Show menu when mouse is closer than:
|
||||||
|
</div>
|
||||||
|
<div class="input range-input">
|
||||||
|
<input
|
||||||
|
v-model="settings.active.ui.inPlayer.activationDistance"
|
||||||
|
class="slider"
|
||||||
|
type="range"
|
||||||
|
min="10"
|
||||||
|
max="100"
|
||||||
|
step="1"
|
||||||
|
@change="(event) => saveSettings()"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
style="margin-right: 0.6rem;"
|
||||||
|
v-model="settings.active.ui.inPlayer.activationDistance"
|
||||||
|
@change="(event) => saveSettings(true)"
|
||||||
|
>
|
||||||
|
<select
|
||||||
|
class="unit-select !min-w-[72px]"
|
||||||
|
v-model="settings.active.ui.inPlayer.activationDistanceUnit"
|
||||||
|
@change="(event) => saveSettings(true)"
|
||||||
|
>
|
||||||
|
<option value="%">%</option>
|
||||||
|
<option value="px">px</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -14,6 +14,16 @@
|
|||||||
class="w-full h-[100dvh] overflow-hidden flex flex-col"
|
class="w-full h-[100dvh] overflow-hidden flex flex-col"
|
||||||
:class="{'max-w-[1920px]': !isDebugging && role !== 'ui'}"
|
:class="{'max-w-[1920px]': !isDebugging && role !== 'ui'}"
|
||||||
>
|
>
|
||||||
|
|
||||||
|
<div class="flex flex-row font-mono text-[0.8rem] text-stone-500 border-stone-500">
|
||||||
|
<!-- <pre>
|
||||||
|
url: {{getUrl}}
|
||||||
|
——
|
||||||
|
site: <pre>{{JSON.stringify(site, null, 2)}}</pre>
|
||||||
|
——
|
||||||
|
</pre> -->
|
||||||
|
</div>
|
||||||
|
|
||||||
<PopupHead
|
<PopupHead
|
||||||
v-if="role === 'popup' && settings && siteSettings && eventBus"
|
v-if="role === 'popup' && settings && siteSettings && eventBus"
|
||||||
:settings="settings"
|
:settings="settings"
|
||||||
@ -22,9 +32,7 @@
|
|||||||
:eventBus="eventBus"
|
:eventBus="eventBus"
|
||||||
>
|
>
|
||||||
</PopupHead>
|
</PopupHead>
|
||||||
<div v-else-if="role === 'ui'" class="flex flex-row font-mono text-[0.8rem] text-stone-500 border-stone-500">
|
|
||||||
url: {{getUrl}}
|
|
||||||
</div>
|
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<h1 class="text-[3em] grow-0 shrink-0">Ultrawidify settings</h1>
|
<h1 class="text-[3em] grow-0 shrink-0">Ultrawidify settings</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -42,6 +42,39 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
transform: translateY(69%);
|
transform: translateY(69%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.unit-select {
|
||||||
|
@apply bg-stone-950 text-white px-4 py-1 border border-transparent border-l-stone-600 border-dotted;
|
||||||
|
|
||||||
|
flex-grow: 1;
|
||||||
|
flex-shrink: 1;
|
||||||
|
|
||||||
|
min-width: 12px;
|
||||||
|
max-width: 24rem;
|
||||||
|
|
||||||
|
outline: none;
|
||||||
|
|
||||||
|
font: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
|
||||||
|
option {
|
||||||
|
@apply bg-stone-950 text-white;
|
||||||
|
|
||||||
|
&:checked {
|
||||||
|
@apply text-primary-400;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: ">";
|
||||||
|
display: none;
|
||||||
|
background-color: #f41 !important;
|
||||||
|
font-size: 5rem;;
|
||||||
|
}
|
||||||
|
&:hover {
|
||||||
|
@apply text-black bg-primary-300;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.range-input {
|
.range-input {
|
||||||
@ -95,6 +128,7 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.select {
|
.select {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
flex-shrink: 1;
|
flex-shrink: 1;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user