This commit is contained in:
syuilo 2025-08-26 20:17:25 +09:00
parent b186c67767
commit 5e3d8fc9b8
3 changed files with 28 additions and 19 deletions

View File

@ -3,6 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
// TODO: (可能な部分を)sharedに抽出して frontend と共通化
import tinycolor from 'tinycolor2';
import lightTheme from '@@/themes/_light.json5';
import darkTheme from '@@/themes/_dark.json5';

View File

@ -3,6 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
// TODO: (可能な部分を)sharedに抽出して frontend-embed と共通化
import { ref, nextTick } from 'vue';
import tinycolor from 'tinycolor2';
import lightTheme from '@@/themes/_light.json5';
@ -166,16 +168,21 @@ export function compile(theme: Theme): Record<string, string> {
return getColor(theme.props[val]);
} else if (val[0] === ':') { // func
const parts = val.split('<');
const func = parts.shift().substring(1);
const arg = parseFloat(parts.shift());
const color = getColor(parts.join('<'));
const funcTxt = parts.shift();
const argTxt = parts.shift();
switch (func) {
case 'darken': return color.darken(arg);
case 'lighten': return color.lighten(arg);
case 'alpha': return color.setAlpha(arg);
case 'hue': return color.spin(arg);
case 'saturate': return color.saturate(arg);
if (funcTxt && argTxt) {
const func = funcTxt.substring(1);
const arg = parseFloat(argTxt);
const color = getColor(parts.join('<'));
switch (func) {
case 'darken': return color.darken(arg);
case 'lighten': return color.lighten(arg);
case 'alpha': return color.setAlpha(arg);
case 'hue': return color.spin(arg);
case 'saturate': return color.saturate(arg);
}
}
}

View File

@ -29,8 +29,8 @@ export function calcPopupPosition(el: HTMLElement, props: {
left = rect.left + window.scrollX + (props.anchorElement.offsetWidth / 2);
top = (rect.top + window.scrollY - contentHeight) - props.innerMargin;
} else {
left = props.x;
top = (props.y - contentHeight) - props.innerMargin;
left = props.x!;
top = (props.y! - contentHeight) - props.innerMargin;
}
left -= (el.offsetWidth / 2);
@ -54,8 +54,8 @@ export function calcPopupPosition(el: HTMLElement, props: {
left = rect.left + window.scrollX + (props.anchorElement.offsetWidth / 2);
top = (rect.top + window.scrollY + props.anchorElement.offsetHeight) + props.innerMargin;
} else {
left = props.x;
top = (props.y) + props.innerMargin;
left = props.x!;
top = (props.y!) + props.innerMargin;
}
left -= (el.offsetWidth / 2);
@ -79,8 +79,8 @@ export function calcPopupPosition(el: HTMLElement, props: {
left = (rect.left + window.scrollX - contentWidth) - props.innerMargin;
top = rect.top + window.scrollY + (props.anchorElement.offsetHeight / 2);
} else {
left = (props.x - contentWidth) - props.innerMargin;
top = props.y;
left = (props.x! - contentWidth) - props.innerMargin;
top = props.y!;
}
top -= (el.offsetHeight / 2);
@ -97,8 +97,8 @@ export function calcPopupPosition(el: HTMLElement, props: {
};
const calcPosWhenRight = () => {
let left: number;
let top: number;
let left = 0; // TSを黙らすためとりあえず初期値を0に
let top = 0; // TSを黙らすためとりあえず初期値を0に
if (props.anchorElement) {
left = (rect.left + props.anchorElement.offsetWidth + window.scrollX) + props.innerMargin;
@ -113,8 +113,8 @@ export function calcPopupPosition(el: HTMLElement, props: {
top -= (el.offsetHeight / 2);
}
} else {
left = props.x + props.innerMargin;
top = props.y;
left = props.x! + props.innerMargin;
top = props.y!;
top -= (el.offsetHeight / 2);
}