diff --git a/public/service-worker.js b/public/service-worker.js index 5bcb4d7..4d044da 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -4,7 +4,7 @@ var self = /** @type { ServiceWorkerGlobalScope } */ (/** @type { unknown } */ (globalThis)); const NAME = "Smart Text Editor"; -const VERSION = "v4.25.0"; +const VERSION = "v4.27.1"; const CACHE_NAME = /** @type { const } */ (`${NAME} ${VERSION}`); const IS_MACOS_DEVICE = (/(macOS|Mac)/i.test(navigator.userAgentData?.platform ?? navigator.platform) && navigator.standalone === undefined); diff --git a/src/Editor.ts b/src/Editor.ts index 9317c15..be897b3 100644 --- a/src/Editor.ts +++ b/src/Editor.ts @@ -173,12 +173,10 @@ export class Editor extends NumTextElement { return editorRename.blur(); } - Object.assign(editorRename,{ - type: "text", - placeholder: this.#name, - tabIndex: -1, - value: this.#name - }); + editorRename.type = "text"; + editorRename.placeholder = this.#name; + editorRename.tabIndex = -1; + editorRename.value = this.#name; editorRename.setAttribute("data-editor-rename",""); editorRename.style.setProperty("--editor-name-width",`${this.editorName.offsetWidth}px`); diff --git a/src/STE.ts b/src/STE.ts index 7a30299..9322f84 100644 --- a/src/STE.ts +++ b/src/STE.ts @@ -76,7 +76,7 @@ export class STE { * Gets the inset values for the screen Safe Area. */ get safeAreaInsets(): SafeAreaInsets { - function getSafeAreaInset(section: string){ + function getSafeAreaInset(section: string): number { return parseInt(getComputedStyle(document.documentElement).getPropertyValue(`--safe-area-inset-${section}`),10); } return { diff --git a/src/Workspace.ts b/src/Workspace.ts index be3a592..b67df36 100644 --- a/src/Workspace.ts +++ b/src/Workspace.ts @@ -3,6 +3,8 @@ import Editor from "./Editor.js"; import { workspace, view_menu, scaler, preview, preview_menu, workspace_tabs, header, getElementStyle } from "./dom.js"; import { read, stringify } from "nbtify"; +import type { EditorOptions } from "./Editor.js"; + declare global { interface Window { setView: typeof setView; @@ -34,7 +36,7 @@ export interface SetViewOptions { /** * Sets the View state of the app. If a View change is already in progress, and the force option is not set to `true`, the call will be skipped. */ -export function setView(type: View, { force = false }: SetViewOptions = {}){ +export function setView(type: View, { force = false }: SetViewOptions = {}): void { if ((STE.orientationChange && !force) || STE.scalingChange) return; const changeIdentifier = Math.random().toString(); document.body.setAttribute("data-view-change",changeIdentifier); @@ -58,7 +60,7 @@ export type Orientation = "horizontal" | "vertical"; * * @param orientation If an Orientation type is not provided, the current state will be toggled to the other option. */ -export function setOrientation(orientation?: Orientation){ +export function setOrientation(orientation?: Orientation): void { if (STE.orientationChange || STE.scalingChange) return; document.body.setAttribute("data-orientation-change",""); const param = (orientation), transitionDuration = ((STE.view != "split") ? 0 : parseInt(`${Number(getElementStyle({ element: workspace, property: "transition-duration" }).split(",")[0].replace(/s/g,"")) * 1000}`)); @@ -78,7 +80,7 @@ export function setOrientation(orientation?: Orientation){ window.setTimeout(() => document.body.removeAttribute("data-orientation-change"),transitionDuration); },transitionDuration); - function setTransitionDurations(state: "on" | "off"){ + function setTransitionDurations(state: "on" | "off"): void { if (state == "on"){ workspace.style.removeProperty("transition-duration"); scaler.style.removeProperty("transition-duration"); @@ -99,7 +101,7 @@ export type SetPreviewSourceOptions = /** * Sets the source for the Preview to a given Editor. */ -export function setPreviewSource(options: SetPreviewSourceOptions){ +export function setPreviewSource(options: SetPreviewSourceOptions): void { if ("activeEditor" in options || STE.previewEditor === options.identifier){ STE.previewEditor = "active-editor"; preview_menu.select("active-editor"); @@ -113,7 +115,7 @@ export function setPreviewSource(options: SetPreviewSourceOptions){ /** * Creates a new Smart Text Editor window. */ -export function createWindow(){ +export function createWindow(): void { const features = (STE.appearance.standalone || STE.appearance.fullscreen) ? "popup" : "", win = window.open(window.location.href,"_blank",features); @@ -132,12 +134,11 @@ export function createWindow(){ * * If the File System Access API is supported in the user's browser, it will use that. If not, it will fall back to using an `` element. */ -export async function openFiles(){ +export async function openFiles(): Promise { if (!STE.support.fileSystem){ - const input = Object.assign(document.createElement("input"),{ - type: "file", - multiple: true - }); + const input = document.createElement("input"); + input.type = "file"; + input.multiple = true; await new Promise(resolve => { input.addEventListener("change",resolve,{ once: true }); @@ -146,15 +147,15 @@ export async function openFiles(){ if (input.files === null) return; - const results = await Promise.allSettled([...input.files].map(async file => { + const results: PromiseSettledResult[] = await Promise.allSettled([...input.files].map(async file => { const { name } = file; const value = (name.match(/.(nbt|dat)$/)) ? await file.arrayBuffer().then(read).then(({ data }) => stringify(data,{ space: 2 })) : await file.text(); return { name, value }; })); - const files = results - .filter(/** @returns { result is PromiseFulfilledResult<{ name: string; value: string; }> } */ - (result): result is PromiseFulfilledResult<{ name: string; value: string; }> => result.status === "fulfilled") + const files: EditorOptions[] = results + .filter( + (result): result is PromiseFulfilledResult => result.status === "fulfilled") .map(result => result.value); for (const file of files){ @@ -179,7 +180,7 @@ export async function openFiles(){ * * If the File System Access API is not supported, or if a custom file extension is provided for the current file, a Save As dialog will be shown using an `` element. */ -export async function saveFile(extension?: string){ +export async function saveFile(extension?: string): Promise { if (extension || !STE.support.fileSystem){ if (!extension) extension = STE.query().getName("extension") ?? ""; const anchor = document.createElement("a"), link = window.URL.createObjectURL(new Blob([STE.query().textarea?.value ?? ""])); @@ -216,7 +217,7 @@ export async function saveFile(extension?: string){ /** * Creates a new Display window for the active Editor. */ -export function createDisplay(){ +export function createDisplay(): void { const width = window.screen.availWidth * 2/3, height = window.screen.availHeight * 2/3, left = window.screen.availWidth / 2 + window.screen.availLeft - width / 2, @@ -246,7 +247,7 @@ export interface RefreshPreviewOptions { /** * Refreshes the Preview with the latest source from the source Editor. */ -export function refreshPreview({ force = false }: RefreshPreviewOptions = {}){ +export function refreshPreview({ force = false }: RefreshPreviewOptions = {}): void { if (STE.view == "code") return; const editor = (STE.previewEditor == "active-editor") ? STE.query() : STE.query(STE.previewEditor); if (!editor.tab || !editor.textarea) return; @@ -267,7 +268,7 @@ export function refreshPreview({ force = false }: RefreshPreviewOptions = {}){ /** * Sets the Split mode scaling when called from the Scaler's moving event listeners. */ -export function setScaling(event: MouseEvent | TouchEvent){ +export function setScaling(event: MouseEvent | TouchEvent): void { const { safeAreaInsets } = STE.appearance; let scalingOffset = 0; const scalingRange = { @@ -289,7 +290,7 @@ export function setScaling(event: MouseEvent | TouchEvent){ /** * Removes the Split mode scale handling when the user finishes moving the Scaler. */ -export function disableScaling(event: MouseEvent | TouchEvent){ +export function disableScaling(event: MouseEvent | TouchEvent): void { const touchEvent = (STE.environment.touchDevice && event instanceof TouchEvent); document.removeEventListener((!touchEvent) ? "mousemove" : "touchmove",setScaling); document.removeEventListener((!touchEvent) ? "mouseup" : "touchend",disableScaling); @@ -299,7 +300,7 @@ export function disableScaling(event: MouseEvent | TouchEvent){ /** * Resets the Split mode scaling offsets, making the Workspace responsive again. */ -function removeScaling(){ +function removeScaling(): void { if (!document.body.hasAttribute("data-scaling-active")) return; document.body.removeAttribute("data-scaling-active"); workspace.style.removeProperty("--scaling-offset");