From 593de2046eea355d9e8dd89d239f43ab009ddb29 Mon Sep 17 00:00:00 2001 From: DeMineArchiver Date: Sat, 6 Apr 2024 20:45:48 +0300 Subject: [PATCH] Introduce more packages --- .github/workflows/build.yml | 1 + Cargo.lock | 14 + Cargo.toml | 2 + apps/backend/Cargo.toml | 1 + apps/backend/package.json | 2 + apps/backend/src/blender.rs | 4 + apps/backend/src/main.rs | 4 +- apps/backend/src/scraper.rs | 19 ++ apps/backend/src/settings/mod.rs | 0 apps/backend/src/workers/downloader.rs | 0 apps/backend/tauri.conf.json | 5 - apps/docs/package.json | 2 +- apps/frontend/package.json | 4 +- apps/frontend/src/global.css.ts | 8 +- apps/frontend/src/index.tsx | 2 +- package.json | 11 +- packages/common/package.json | 2 +- packages/common/src/css/css.ts | 76 ----- packages/common/src/css/index.ts | 12 - packages/common/src/css/literal.ts | 1 - packages/css/package.json | 19 ++ packages/css/src/color-mix.ts | 51 +++ packages/css/src/font.ts | 46 +++ packages/css/src/index.ts | 21 ++ packages/css/src/linear-gradient.ts | 35 ++ packages/css/src/radial-gradient.ts | 37 +++ packages/css/src/syntax/index.ts | 24 ++ packages/css/tsconfig.json | 5 + packages/material/package.json | 3 +- .../material/src/components/icon/icon.css.ts | 4 +- .../material/src/components/list/index.ts | 1 + .../src/components/list/list-item.css.ts | 16 + .../src/components/list/list-item.tsx | 31 ++ .../src/components/splash/splash.css.ts | 14 +- packages/tauri-plugin-dwm/Cargo.toml | 23 ++ packages/tauri-plugin-dwm/api/extension.d.ts | 7 + packages/tauri-plugin-dwm/api/index.ts | 12 + packages/tauri-plugin-dwm/build.rs | 8 + packages/tauri-plugin-dwm/package.json | 15 + .../commands/set_window_caption_color.toml | 13 + .../permissions/autogenerated/reference.md | 4 + .../permissions/schemas/schema.json | 314 ++++++++++++++++++ packages/tauri-plugin-dwm/src/commands.rs | 30 ++ packages/tauri-plugin-dwm/src/lib.rs | 11 + packages/tauri-plugin-dwm/tsconfig.json | 7 + packages/tauri-plugin-ftp/package.json | 2 +- packages/utils/package.json | 17 + packages/utils/src/index.ts | 7 + packages/utils/tsconfig.json | 5 + yarn.lock | 63 +++- 50 files changed, 881 insertions(+), 134 deletions(-) create mode 100644 apps/backend/src/scraper.rs create mode 100644 apps/backend/src/settings/mod.rs create mode 100644 apps/backend/src/workers/downloader.rs delete mode 100644 packages/common/src/css/css.ts delete mode 100644 packages/common/src/css/literal.ts create mode 100644 packages/css/package.json create mode 100644 packages/css/src/color-mix.ts create mode 100644 packages/css/src/font.ts create mode 100644 packages/css/src/index.ts create mode 100644 packages/css/src/linear-gradient.ts create mode 100644 packages/css/src/radial-gradient.ts create mode 100644 packages/css/src/syntax/index.ts create mode 100644 packages/css/tsconfig.json create mode 100644 packages/material/src/components/list/index.ts create mode 100644 packages/material/src/components/list/list-item.css.ts create mode 100644 packages/material/src/components/list/list-item.tsx create mode 100644 packages/tauri-plugin-dwm/Cargo.toml create mode 100644 packages/tauri-plugin-dwm/api/extension.d.ts create mode 100644 packages/tauri-plugin-dwm/api/index.ts create mode 100644 packages/tauri-plugin-dwm/build.rs create mode 100644 packages/tauri-plugin-dwm/package.json create mode 100644 packages/tauri-plugin-dwm/permissions/autogenerated/commands/set_window_caption_color.toml create mode 100644 packages/tauri-plugin-dwm/permissions/autogenerated/reference.md create mode 100644 packages/tauri-plugin-dwm/permissions/schemas/schema.json create mode 100644 packages/tauri-plugin-dwm/src/commands.rs create mode 100644 packages/tauri-plugin-dwm/src/lib.rs create mode 100644 packages/tauri-plugin-dwm/tsconfig.json create mode 100644 packages/utils/package.json create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/tsconfig.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 611d041..7c58a62 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,6 +39,7 @@ jobs: name: blending-windows-bundle path: target/release/bundle/ build-linux: + name: Build (Linux) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/Cargo.lock b/Cargo.lock index ca88e0e..6e4e4fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -450,6 +450,7 @@ dependencies = [ "tauri-plugin-autostart", "tauri-plugin-cli", "tauri-plugin-dialog", + "tauri-plugin-dwm", "tauri-plugin-ftp", "tauri-plugin-log", "tauri-plugin-shell", @@ -4679,6 +4680,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "tauri-plugin-dwm" +version = "0.0.0" +dependencies = [ + "csscolorparser", + "raw-window-handle 0.6.0", + "serde", + "tauri", + "tauri-plugin", + "thiserror", + "windows-sys 0.52.0", +] + [[package]] name = "tauri-plugin-fs" version = "2.0.0-beta.4" diff --git a/Cargo.toml b/Cargo.toml index 68d1644..a647e92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ resolver = "2" members = [ "apps/backend", "packages/tauri-plugin-ftp", + "packages/tauri-plugin-dwm", ] [workspace.package] @@ -12,3 +13,4 @@ license = "ISC" [workspace.dependencies] tauri-plugin-ftp = { path = "packages/tauri-plugin-ftp" } +tauri-plugin-dwm = { path = "packages/tauri-plugin-dwm" } diff --git a/apps/backend/Cargo.toml b/apps/backend/Cargo.toml index 3c8c8b5..363edf4 100644 --- a/apps/backend/Cargo.toml +++ b/apps/backend/Cargo.toml @@ -31,6 +31,7 @@ url = "2" notify = "6" tauri-plugin-ftp.workspace = true +tauri-plugin-dwm.workspace = true windows-core = "0.54" diff --git a/apps/backend/package.json b/apps/backend/package.json index 08a2769..47ef3b2 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -1,5 +1,7 @@ { + "private": true, "name": "@blending/backend", + "version": "0.0.0", "packageManager": "yarn@4.1.1", "scripts": { "dev": "tauri dev", diff --git a/apps/backend/src/blender.rs b/apps/backend/src/blender.rs index 69a47a2..0122b21 100644 --- a/apps/backend/src/blender.rs +++ b/apps/backend/src/blender.rs @@ -15,3 +15,7 @@ impl> BlenderExt for T { self.state::>().inner() } } + +trait Worker { + +} diff --git a/apps/backend/src/main.rs b/apps/backend/src/main.rs index 238bd6f..64addfa 100644 --- a/apps/backend/src/main.rs +++ b/apps/backend/src/main.rs @@ -13,6 +13,8 @@ use url::Url; mod commands; mod blender; +mod scraper; +mod settings; const BLENDER_ICON: &[u8] = include_bytes!("../resources/blender/blender_icon_32x32.png"); const VISIBILITY_ICON: &[u8] = include_bytes!("../resources/icon_visibility.png"); @@ -89,12 +91,12 @@ fn main() { .plugin(tauri_plugin_autostart::init(MacosLauncher::LaunchAgent, None)) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_window_state::Builder::default().build()) - .plugin(tauri_plugin_cli::init()) .plugin( tauri_plugin_single_instance::init(|app, args, cwd| { }) ) + .plugin(tauri_plugin_dwm::init()) .plugin(tauri_plugin_dialog::init()) .setup(|app| { let _ = app.autolaunch().disable(); diff --git a/apps/backend/src/scraper.rs b/apps/backend/src/scraper.rs new file mode 100644 index 0000000..a1249b6 --- /dev/null +++ b/apps/backend/src/scraper.rs @@ -0,0 +1,19 @@ +use semver::Version; +use suppaftp::FtpStream; + +pub trait Scraper { + +} + +pub struct StableScraper { + +} + +impl StableScraper { + pub fn scrape() { + let mut stream = FtpStream::connect("mirrors.dotsrc.org:21").unwrap(); + stream.login("anonymous", "").unwrap(); + stream.cwd("/blender/blender-release/Blender4.1").unwrap(); + } +} + diff --git a/apps/backend/src/settings/mod.rs b/apps/backend/src/settings/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/apps/backend/src/workers/downloader.rs b/apps/backend/src/workers/downloader.rs new file mode 100644 index 0000000..e69de29 diff --git a/apps/backend/tauri.conf.json b/apps/backend/tauri.conf.json index 9b5e221..9ea21d9 100644 --- a/apps/backend/tauri.conf.json +++ b/apps/backend/tauri.conf.json @@ -25,11 +25,6 @@ "csp": null } }, - "plugins": { - "cli": { - - } - }, "bundle": { "copyright": "Copyright (c) deminearchiver 2024", "active": true, diff --git a/apps/docs/package.json b/apps/docs/package.json index 2a451f9..82b6f52 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -29,7 +29,7 @@ "solid-js": "^1.8.16", "starlight-blog": "^0.5.1", "starlight-image-zoom": "^0.2.0", - "typescript": "^5.4.3", + "typescript": "^5.4.4", "unist-util-visit": "^5.0.0" }, "devDependencies": { diff --git a/apps/frontend/package.json b/apps/frontend/package.json index b614108..b51be4a 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -11,7 +11,9 @@ }, "dependencies": { "@blending/common": "workspace:^", + "@blending/css": "workspace:^", "@blending/material": "workspace:^", + "@blending/tauri-plugin-dwm": "workspace:^", "@blending/tauri-plugin-ftp": "workspace:^", "@material/material-color-utilities": "^0.2.7", "@solid-primitives/context": "^0.2.3", @@ -31,7 +33,7 @@ "@solid-primitives/refs": "^1.0.8", "@types/node": "^20.12.3", "@vanilla-extract/vite-plugin": "^4.0.7", - "typescript": "^5.4.3", + "typescript": "^5.4.4", "vite": "^5.2.7", "vite-plugin-solid": "^2.10.2" } diff --git a/apps/frontend/src/global.css.ts b/apps/frontend/src/global.css.ts index 3e23dae..05f88a4 100644 --- a/apps/frontend/src/global.css.ts +++ b/apps/frontend/src/global.css.ts @@ -1,6 +1,6 @@ -import { colorMix, css } from "@blending/common/css"; +import css from "@blending/css"; import { darkTheme } from "@blending/material/theme/global/dark"; -import { fontFace, globalStyle } from "@vanilla-extract/css"; +import { globalStyle } from "@vanilla-extract/css"; /* // : Use a unique and descriptive class name @@ -107,7 +107,7 @@ globalStyle( globalStyle( "body::-webkit-scrollbar-thumb", { - backgroundColor: colorMix( + backgroundColor: css.colorMix( "srgb", [darkTheme.color.onSurface, "12%"], "transparent", @@ -121,7 +121,7 @@ globalStyle( globalStyle( "body::-webkit-scrollbar-thumb:hover", { - backgroundColor: colorMix( + backgroundColor: css.colorMix( "srgb", [darkTheme.color.onSurface, "38%"], "transparent", diff --git a/apps/frontend/src/index.tsx b/apps/frontend/src/index.tsx index af97417..3685053 100644 --- a/apps/frontend/src/index.tsx +++ b/apps/frontend/src/index.tsx @@ -5,10 +5,10 @@ import { App } from "./App"; import { Router, Route } from "@solidjs/router"; import "./global.css"; +import "@blending/material/theme/global/dark"; import "material-symbols/rounded.css"; import { Test } from "./components/onboarding"; - render( () => , document.getElementById("root")!, diff --git a/package.json b/package.json index 1bb55f1..1bb948d 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,15 @@ ], "scripts": { ":": "yarn workspace", - ":docs": "yarn workspace @blending/docs", - ":backend": "yarn workspace @blending/backend", - ":frontend": "yarn workspace @blending/frontend" + ":docs": "yarn : @blending/docs", + ":backend": "yarn : @blending/backend", + ":frontend": "yarn : @blending/frontend", + "app:dev": "yarn :backend dev", + "app:build": "yarn :backend build", + "docs:dev": "yarn :docs dev", + "docs:build": "yarn :docs build" }, "devDependencies": { - "typescript": "^5.4.3", "wrangler": "^3.44.0" } } diff --git a/packages/common/package.json b/packages/common/package.json index ead4751..51541d7 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -9,7 +9,7 @@ "packageManager": "yarn@4.1.1", "devDependencies": { "@blending/config": "workspace:^", - "typescript": "^5.4.3" + "typescript": "^5.4.4" }, "dependencies": { "@vanilla-extract/css": "^1.14.2", diff --git a/packages/common/src/css/css.ts b/packages/common/src/css/css.ts deleted file mode 100644 index 130030b..0000000 --- a/packages/common/src/css/css.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { merge } from "../utils"; - -interface CSSSyntaxNamespace { - function: (name: TemplateStringsArray, ...values: any[]) => (...args: string[]) => string; - quote: () => string, -} - -interface CSSNamespace { - syntax: CSSSyntaxNamespace; - fontFamily: (...families: string[]) => string; - linearGradient: (options: LinearGradientOptions) => string; - radialGradient: (options: RadialGradientOptions) => string; -} - - - - -interface LinearGradientOptions { - -} - - -type RadialGradientShape = "ellipse" | "circle"; -type RadialGradientSize = - | "closest-side" - | "closest-corner" - | "farthest-side" - | "farthest-corner"; -type RadialGradientPosition = `at ${string}`; - -type RadialGradientStop = [stop: string, percentage: string]; - - -interface RadialGradientOptions { - shape?: RadialGradientShape; - size?: RadialGradientSize; - position?: RadialGradientPosition; - stops: RadialGradientStop[]; -} - - -export const css: CSSNamespace = { - syntax: { - function: (strings, ...values) => { - const name = merge(strings, ...values); - return (...args) => `${name}(${args.join(",")})` - }, - quote: () => `"`, - }, - fontFamily: (...families) => { - return families - .map(family => family.includes(" ") ? `${css.syntax.quote()}${family}${css.syntax.quote()}` : family) - .join(","); - }, - linearGradient: () => { - return LINEAR_GRADIENT(); - }, - radialGradient: ( - { shape, size, position, stops }, - ) => { - const parts: string[] = [ - ...(shape ? [shape] : []), - ...(size ? [size] : []), - ...(position ? [position] : []), - ]; - - return RADIAL_GRADIENT( - parts.join(" "), - ...stops.map(stop => stop.join(" ")), - ); - }, -}; - - -const LINEAR_GRADIENT = css.syntax.function`linear-gradient`; -const RADIAL_GRADIENT = css.syntax.function`radial-gradient`; diff --git a/packages/common/src/css/index.ts b/packages/common/src/css/index.ts index 383a6e7..8732f2d 100644 --- a/packages/common/src/css/index.ts +++ b/packages/common/src/css/index.ts @@ -1,15 +1,5 @@ import { svgPathProperties as SVGPathProperties } from "svg-path-properties"; -export function fontVariationSettings(values: Record) { - return Object.entries(values) - .map( - ([key, value]) => `"${key}" ${value}` - ) - .join(","); -} - -export * from "./functions/color-mix"; - export type LinearPoint = [pos: number, val: number]; @@ -40,5 +30,3 @@ export function processSVGData(data: string, pointsLength: number): LinearPoint[ } return points; } - -export * from "./css"; diff --git a/packages/common/src/css/literal.ts b/packages/common/src/css/literal.ts deleted file mode 100644 index 03e9d6c..0000000 --- a/packages/common/src/css/literal.ts +++ /dev/null @@ -1 +0,0 @@ -export type Percentage = `${number}%`; diff --git a/packages/css/package.json b/packages/css/package.json new file mode 100644 index 0000000..6a39d76 --- /dev/null +++ b/packages/css/package.json @@ -0,0 +1,19 @@ +{ + "private": true, + "name": "@blending/css", + "version": "0.0.0", + "type": "module", + "exports": { + ".": "./src/index.ts", + "./syntax": "./src/syntax/index.ts" + }, + "packageManager": "yarn@4.1.1", + "dependencies": { + "@vanilla-extract/css": "^1.14.2" + }, + "devDependencies": { + "@blending/config": "workspace:^", + "@blending/utils": "workspace:^", + "typescript": "^5.4.4" + } +} diff --git a/packages/css/src/color-mix.ts b/packages/css/src/color-mix.ts new file mode 100644 index 0000000..6954122 --- /dev/null +++ b/packages/css/src/color-mix.ts @@ -0,0 +1,51 @@ +import { syntax } from "./syntax"; + +const COLOR_MIX = syntax.function`color-mix`; + +type RectangularColorSpace = + | "srgb" + | "srgb-linear" + | "display-p3" + | "a98-rgb" + | "prophoto-rgb" + | "rec2020" + | "lab" + | "oklab" + | "xyz" + | "xyz-d50" + | "xyz-d65"; +type PolarColorSpace = + | "hsl" + | "hwb" + | "lch" + | "oklch"; + +type ColorSpace = RectangularColorSpace | PolarColorSpace; + +type HueInterpolationMethod = + | "shorter" + | "longer" + | "decreasing" + | "increasing"; + +type ColorInterpolationMethod = ColorSpace | [ColorSpace, HueInterpolationMethod]; + +type ColorMixColor = string | [string, `${number}%`]; + +export const colorMix = ( + method: ColorInterpolationMethod, + color1: ColorMixColor, + color2: ColorMixColor, +) => { + let parts: string[] = typeof method === "string" ? [method] : method; + + const processColor = (color: ColorMixColor) => { + return typeof color === "string" ? color : color.join(" "); + } + + return COLOR_MIX( + `in ${parts.join(" ")}`, + processColor(color1), + processColor(color2), + ); +} diff --git a/packages/css/src/font.ts b/packages/css/src/font.ts new file mode 100644 index 0000000..0a26763 --- /dev/null +++ b/packages/css/src/font.ts @@ -0,0 +1,46 @@ +import { syntax } from "./syntax"; + +type FontStyle = + | "normal" + | "italic" + | `oblique${string}`; + +type FontVariant = "normal" | "small-caps"; + +interface FontOptions { + style?: FontStyle; + variant?: FontVariant; + weight?: string; + width?: string; + size: string; + lineHeight?: string; + families: string[]; +} + +export const font = (options: FontOptions) => { + const family = fontFamily(...options.families); + const parts = [ + + ]; + if(options.style != null) parts.push(options.style); + if(options.variant != null) parts.push(options.variant); + if(options.weight != null) parts.push(options.weight); + if(options.width != null) parts.push(options.width); + parts.push(`${options.size}${options.lineHeight != null ? `/${options.lineHeight}` : ""}`); + parts.push(family); + return parts.join(" "); +} + +export const fontFamily = (...families: string[]) => { + return families + .map(family => family.includes(" ") ? `"${family}"` : family) + .join(","); +} + +export const fontVariationSettings = (settings: Record) => { + return Object.entries(settings) + .map( + ([key, value]) => `"${key}" ${value}` + ) + .join(","); +} diff --git a/packages/css/src/index.ts b/packages/css/src/index.ts new file mode 100644 index 0000000..e08e968 --- /dev/null +++ b/packages/css/src/index.ts @@ -0,0 +1,21 @@ +import { colorMix } from "./color-mix"; +import { font, fontFamily, fontVariationSettings } from "./font"; +import { linearGradient } from "./linear-gradient"; +import { radialGradient } from "./radial-gradient"; + + +// interface CSSNamespace { +// linearGradient: typeof linearGradient; +// radialGradient: typeof radialGradient; +// } + +const css = { + linearGradient, + radialGradient, + colorMix, + font, + fontFamily, + fontVariationSettings, +}; + +export default css; diff --git a/packages/css/src/linear-gradient.ts b/packages/css/src/linear-gradient.ts new file mode 100644 index 0000000..b8a4dad --- /dev/null +++ b/packages/css/src/linear-gradient.ts @@ -0,0 +1,35 @@ +import { syntax } from "./syntax"; + +const LINEAR_GRADIENT = syntax.function`linear-gradient`; + +type LinearStop = [color: string, position: string, position: string]; + +type Side = "top" | "right" | "bottom" | "left"; +type SideOrCorner = + | Side + | [horizontal: Side, vertical: Side]; +type Angle = number; + +type LinearGradientDirection = SideOrCorner | Angle; + +export const linearGradient = ( + direction?: LinearGradientDirection, + ...stops: LinearStop[] +) => { + let position: string; + if(typeof direction === "number") { + position = `${direction}deg`; + } else if(typeof direction === "string") { + position = `to ${direction}`; + } else if(Array.isArray(direction)) { + position = `to ${direction.join(" ")}`; + } + + + return LINEAR_GRADIENT( + position, + ...stops.map( + stop => stop.join(" "), + ), + ); +} diff --git a/packages/css/src/radial-gradient.ts b/packages/css/src/radial-gradient.ts new file mode 100644 index 0000000..fef0bbc --- /dev/null +++ b/packages/css/src/radial-gradient.ts @@ -0,0 +1,37 @@ +import { syntax } from "./syntax"; + +const RADIAL_GRADIENT = syntax.function`radial-gradient`; + +type RadialStop = string | [color: string, position?: string, position?: string]; + + +type RadialShape = "circle" | "ellipse"; +type RadialExtent = + | "closest-corner" + | "closest-side" + | "farthest-corner" + | "farthest-side"; +type RadialSize = RadialExtent | string; + +interface RadialGradientOptions { + shape?: RadialShape; + size?: RadialSize; + position?: string; +} + +export const radialGradient = ( + options?: RadialGradientOptions, + ...stops: RadialStop[] +) => { + const parts: string[] = []; + if(options.shape != null) parts.push(options.shape); + if(options.size != null) parts.push(options.size); + if(options.position != null) parts.push(options.position); + + return RADIAL_GRADIENT( + parts.join(" "), + ...stops.map( + stop => typeof stop === "string" ? stop : stop.join(" "), + ), + ); +} diff --git a/packages/css/src/syntax/index.ts b/packages/css/src/syntax/index.ts new file mode 100644 index 0000000..3ab0817 --- /dev/null +++ b/packages/css/src/syntax/index.ts @@ -0,0 +1,24 @@ +import { mergeTemplateStrings } from "@blending/utils"; + +interface CSSSyntaxFunction { + (name: string): CSSFunction; + (strings: TemplateStringsArray, ...values: unknown[]): CSSFunction; +} + +export type CSSFunction = (...args: string[]) => string; + +interface CSSSyntaxNamespace { + function: CSSSyntaxFunction; +} + +export const syntax: CSSSyntaxNamespace = { + function: (...args) => { + let name: string; + if(typeof args[0] === "string") { + name = args[0]; + } else { + name = mergeTemplateStrings(args[0], args[1]); + } + return (...args: string[]) => `${name}(${args.join(", ")})`; + } +} diff --git a/packages/css/tsconfig.json b/packages/css/tsconfig.json new file mode 100644 index 0000000..b15e4eb --- /dev/null +++ b/packages/css/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "@blending/config/tsconfigs/base", + ] +} diff --git a/packages/material/package.json b/packages/material/package.json index 58ea062..7347319 100644 --- a/packages/material/package.json +++ b/packages/material/package.json @@ -24,10 +24,11 @@ "@blending/config": "workspace:^", "material-symbols": "^0.17.1", "solid-js": "^1.8.16", - "typescript": "^5.4.3" + "typescript": "^5.4.4" }, "dependencies": { "@blending/common": "workspace:^", + "@blending/css": "workspace:^", "@material/material-color-utilities": "^0.2.7", "@solid-primitives/event-listener": "^2.3.3", "@solid-primitives/jsx-tokenizer": "^1.0.10", diff --git a/packages/material/src/components/icon/icon.css.ts b/packages/material/src/components/icon/icon.css.ts index d5865d4..da0077f 100644 --- a/packages/material/src/components/icon/icon.css.ts +++ b/packages/material/src/components/icon/icon.css.ts @@ -1,5 +1,5 @@ import { globalStyle, style } from "@vanilla-extract/css"; -import { fontVariationSettings } from "@blending/common/css"; +import css from "@blending/css"; // globalStyle( // ".material-symbols-rounded", @@ -12,7 +12,7 @@ export const iconStyle = style({ userSelect: "none", pointerEvents: "none", fontVariationSettings: - fontVariationSettings({ + css.fontVariationSettings({ FILL: 0, wght: 400, GRAD: 0, diff --git a/packages/material/src/components/list/index.ts b/packages/material/src/components/list/index.ts new file mode 100644 index 0000000..24950c4 --- /dev/null +++ b/packages/material/src/components/list/index.ts @@ -0,0 +1 @@ +export * from "./list-item"; diff --git a/packages/material/src/components/list/list-item.css.ts b/packages/material/src/components/list/list-item.css.ts new file mode 100644 index 0000000..c88b8c9 --- /dev/null +++ b/packages/material/src/components/list/list-item.css.ts @@ -0,0 +1,16 @@ +import { style } from "@vanilla-extract/css"; + +export const listItemStyle = style({ + display: "flex", + flexDirection: "row", + width: "100%", + minHeight: 56, + padding: "8px 16px", + gap: "16px", +}); + +export const listItemContentStyle = style({ + display: "flex", + flexDirection: "column", + flexGrow: 1, +}); diff --git a/packages/material/src/components/list/list-item.tsx b/packages/material/src/components/list/list-item.tsx new file mode 100644 index 0000000..6b356bf --- /dev/null +++ b/packages/material/src/components/list/list-item.tsx @@ -0,0 +1,31 @@ +import { JSX, ParentComponent } from "solid-js"; +import { listItemContentStyle, listItemStyle } from "./list-item.css"; +import { Splash } from "../splash"; +import { Focus } from "../focus"; + +export interface ListItemProps { + leading?: JSX.Element; + title: JSX.Element; + subtitle?: JSX.Element; + trailing?: JSX.Element; +} + +export const ListItem: ParentComponent = (props) => { + let ref!: HTMLElement; + return ( +
  • + + + + + {props.leading} +
    + {props.title} + {props.subtitle} +
    + {props.trailing} +
  • + ); +} diff --git a/packages/material/src/components/splash/splash.css.ts b/packages/material/src/components/splash/splash.css.ts index d546f0e..b90ccd7 100644 --- a/packages/material/src/components/splash/splash.css.ts +++ b/packages/material/src/components/splash/splash.css.ts @@ -1,6 +1,6 @@ import { ComplexStyleRule, fallbackVar, style } from "@vanilla-extract/css"; import { splash } from "./css"; -import { css } from "@blending/common/css"; +import css from "@blending/css"; const sharedStyles: ComplexStyleRule = { borderRadius: "inherit", @@ -43,13 +43,11 @@ export const surfaceStyle = style({ // transparent 100% // ) // `, - background: css.radialGradient({ - size: "closest-side", - stops: [ - [`${splash.theme.pressedColor}`, "max(calc(100% - 70px), 65%)"], - ["transparent", "100%"] - ] - }), + background: css.radialGradient( + { size: "closest-side" }, + [`${splash.theme.pressedColor}`, "max(calc(100% - 70px), 65%)"], + ["transparent", "100%"] + ), transformOrigin: "center center", transition: "opacity 375ms linear", }, diff --git a/packages/tauri-plugin-dwm/Cargo.toml b/packages/tauri-plugin-dwm/Cargo.toml new file mode 100644 index 0000000..2d0b3a6 --- /dev/null +++ b/packages/tauri-plugin-dwm/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "tauri-plugin-dwm" +version = "0.0.0" +description = "Desktop Window Manager" +authors.workspace = true +edition.workspace = true +license.workspace = true +links = "tauri-plugin-dwm" + +[build-dependencies] +tauri-plugin = { version = "2.0.0-beta", features = ["build"] } + +[dependencies] +tauri = { version = "2.0.0-beta" } +serde = "1" +thiserror = "1" +raw-window-handle = "0.6" +csscolorparser = { version = "0.6", features = ["named-colors", "serde"] } + + +[dependencies.windows-sys] +version = "0.52" +features = ["Win32_Foundation"] diff --git a/packages/tauri-plugin-dwm/api/extension.d.ts b/packages/tauri-plugin-dwm/api/extension.d.ts new file mode 100644 index 0000000..1171126 --- /dev/null +++ b/packages/tauri-plugin-dwm/api/extension.d.ts @@ -0,0 +1,7 @@ +export * from "@tauri-apps/api/window"; + +declare module "@tauri-apps/api/window" { + declare class Window { + setCaptionColor(color: string): Promise; + } +} diff --git a/packages/tauri-plugin-dwm/api/index.ts b/packages/tauri-plugin-dwm/api/index.ts new file mode 100644 index 0000000..041deeb --- /dev/null +++ b/packages/tauri-plugin-dwm/api/index.ts @@ -0,0 +1,12 @@ +import { invoke } from "@tauri-apps/api/core"; +import { Window } from "@tauri-apps/api/window"; +import { getCurrent } from "@tauri-apps/api/window"; + +Window.prototype.setCaptionColor = async function(color) { + return invoke( + "plugin:dwm|set_window_caption_color", + { + color, + }, + ); +} diff --git a/packages/tauri-plugin-dwm/build.rs b/packages/tauri-plugin-dwm/build.rs new file mode 100644 index 0000000..57b95f2 --- /dev/null +++ b/packages/tauri-plugin-dwm/build.rs @@ -0,0 +1,8 @@ +const COMMANDS: &[&str] = &[ + "set_window_caption_color", +]; + +fn main() { + tauri_plugin::Builder::new(COMMANDS) + .build(); +} diff --git a/packages/tauri-plugin-dwm/package.json b/packages/tauri-plugin-dwm/package.json new file mode 100644 index 0000000..b2bedd1 --- /dev/null +++ b/packages/tauri-plugin-dwm/package.json @@ -0,0 +1,15 @@ +{ + "private": true, + "name": "@blending/tauri-plugin-dwm", + "version": "0.0.0", + "type": "module", + "exports": { + ".": "./api/index.ts" + }, + "packageManager": "yarn@4.1.1", + "devDependencies": { + "@blending/config": "workspace:^", + "@tauri-apps/api": ">=2.0.0-beta", + "typescript": "^5.4.4" + } +} diff --git a/packages/tauri-plugin-dwm/permissions/autogenerated/commands/set_window_caption_color.toml b/packages/tauri-plugin-dwm/permissions/autogenerated/commands/set_window_caption_color.toml new file mode 100644 index 0000000..73e2a7d --- /dev/null +++ b/packages/tauri-plugin-dwm/permissions/autogenerated/commands/set_window_caption_color.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-set-window-caption-color" +description = "Enables the set_window_caption_color command without any pre-configured scope." +commands.allow = ["set_window_caption_color"] + +[[permission]] +identifier = "deny-set-window-caption-color" +description = "Denies the set_window_caption_color command without any pre-configured scope." +commands.deny = ["set_window_caption_color"] diff --git a/packages/tauri-plugin-dwm/permissions/autogenerated/reference.md b/packages/tauri-plugin-dwm/permissions/autogenerated/reference.md new file mode 100644 index 0000000..0d87f1e --- /dev/null +++ b/packages/tauri-plugin-dwm/permissions/autogenerated/reference.md @@ -0,0 +1,4 @@ +| Permission | Description | +|------|-----| +|`allow-set-window-caption-color`|Enables the set_window_caption_color command without any pre-configured scope.| +|`deny-set-window-caption-color`|Denies the set_window_caption_color command without any pre-configured scope.| diff --git a/packages/tauri-plugin-dwm/permissions/schemas/schema.json b/packages/tauri-plugin-dwm/permissions/schemas/schema.json new file mode 100644 index 0000000..319511d --- /dev/null +++ b/packages/tauri-plugin-dwm/permissions/schemas/schema.json @@ -0,0 +1,314 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "PermissionFile", + "description": "Permission file that can define a default permission, a set of permissions or a list of inlined permissions.", + "type": "object", + "properties": { + "default": { + "description": "The default permission set for the plugin", + "anyOf": [ + { + "$ref": "#/definitions/DefaultPermission" + }, + { + "type": "null" + } + ] + }, + "set": { + "description": "A list of permissions sets defined", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionSet" + } + }, + "permission": { + "description": "A list of inlined permissions", + "default": [], + "type": "array", + "items": { + "$ref": "#/definitions/Permission" + } + } + }, + "definitions": { + "DefaultPermission": { + "description": "The default permission set of the plugin.\n\nWorks similarly to a permission with the \"default\" identifier.", + "type": "object", + "required": [ + "permissions" + ], + "properties": { + "version": { + "description": "The version of the permission.", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 1.0 + }, + "description": { + "description": "Human-readable description of what the permission does.", + "type": [ + "string", + "null" + ] + }, + "permissions": { + "description": "All permissions this set contains.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionSet": { + "description": "A set of direct permissions grouped together under a new name.", + "type": "object", + "required": [ + "description", + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "A unique identifier for the permission.", + "type": "string" + }, + "description": { + "description": "Human-readable description of what the permission does.", + "type": "string" + }, + "permissions": { + "description": "All permissions this set contains.", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionKind" + } + } + } + }, + "Permission": { + "description": "Descriptions of explicit privileges of commands.\n\nIt can enable commands to be accessible in the frontend of the application.\n\nIf the scope is defined it can be used to fine grain control the access of individual or multiple commands.", + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "version": { + "description": "The version of the permission.", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 1.0 + }, + "identifier": { + "description": "A unique identifier for the permission.", + "type": "string" + }, + "description": { + "description": "Human-readable description of what the permission does.", + "type": [ + "string", + "null" + ] + }, + "commands": { + "description": "Allowed or denied commands when using this permission.", + "default": { + "allow": [], + "deny": [] + }, + "allOf": [ + { + "$ref": "#/definitions/Commands" + } + ] + }, + "scope": { + "description": "Allowed or denied scoped when using this permission.", + "allOf": [ + { + "$ref": "#/definitions/Scopes" + } + ] + }, + "platforms": { + "description": "Target platforms this permission applies. By default all platforms are affected by this permission.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "Commands": { + "description": "Allowed and denied commands inside a permission.\n\nIf two commands clash inside of `allow` and `deny`, it should be denied by default.", + "type": "object", + "properties": { + "allow": { + "description": "Allowed command.", + "default": [], + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Denied command, which takes priority.", + "default": [], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Scopes": { + "description": "A restriction of the command/endpoint functionality.\n\nIt can be of any serde serializable type and is used for allowing or preventing certain actions inside a Tauri command.\n\nThe scope is passed to the command and handled/enforced by the command itself.", + "type": "object", + "properties": { + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "PermissionKind": { + "type": "string", + "oneOf": [ + { + "description": "allow-set-window-caption-color -> Enables the set_window_caption_color command without any pre-configured scope.", + "type": "string", + "enum": [ + "allow-set-window-caption-color" + ] + }, + { + "description": "deny-set-window-caption-color -> Denies the set_window_caption_color command without any pre-configured scope.", + "type": "string", + "enum": [ + "deny-set-window-caption-color" + ] + } + ] + } + } +} \ No newline at end of file diff --git a/packages/tauri-plugin-dwm/src/commands.rs b/packages/tauri-plugin-dwm/src/commands.rs new file mode 100644 index 0000000..d22c1c1 --- /dev/null +++ b/packages/tauri-plugin-dwm/src/commands.rs @@ -0,0 +1,30 @@ +use csscolorparser::Color; +use raw_window_handle::{HasWindowHandle, RawWindowHandle, Win32WindowHandle}; +use tauri::{command, Runtime, Window}; +use windows_sys::Win32::{Foundation::COLORREF, Graphics::Dwm}; + +#[command] +pub async fn set_window_caption_color( + window: Window, + color: Color, +) { + let handle = window.window_handle().unwrap().as_raw(); + match handle { + RawWindowHandle::Win32(Win32WindowHandle {hwnd, .. }) => { + let rgba = color.to_rgba8(); + unsafe { + let value: COLORREF = + (u32::from(rgba[0])) | + (u32::from(rgba[1]) << 8) | + (u32::from(rgba[2]) << 16); + Dwm::DwmSetWindowAttribute( + hwnd.get(), + Dwm::DWMWA_CAPTION_COLOR as _, + &value as *const _ as _, + std::mem::size_of::() as _, + ); + } + }, + _ => {}, + } +} diff --git a/packages/tauri-plugin-dwm/src/lib.rs b/packages/tauri-plugin-dwm/src/lib.rs new file mode 100644 index 0000000..1ff664e --- /dev/null +++ b/packages/tauri-plugin-dwm/src/lib.rs @@ -0,0 +1,11 @@ +use tauri::{plugin::{self, TauriPlugin}, Runtime}; + +mod commands; + +pub fn init() -> TauriPlugin { + return plugin::Builder::new("dwm") + .invoke_handler(tauri::generate_handler![ + commands::set_window_caption_color, + ]) + .build() +} diff --git a/packages/tauri-plugin-dwm/tsconfig.json b/packages/tauri-plugin-dwm/tsconfig.json new file mode 100644 index 0000000..bb97715 --- /dev/null +++ b/packages/tauri-plugin-dwm/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "@blending/config/tsconfigs/base", + "@blending/config/tsconfigs/strict", + ], + "include": ["api"] +} diff --git a/packages/tauri-plugin-ftp/package.json b/packages/tauri-plugin-ftp/package.json index 688c6b9..b9eb7f9 100644 --- a/packages/tauri-plugin-ftp/package.json +++ b/packages/tauri-plugin-ftp/package.json @@ -7,7 +7,7 @@ }, "devDependencies": { "@tauri-apps/cli": ">=2.0.0-beta.0", - "typescript": "^5.4.3" + "typescript": "^5.4.4" }, "dependencies": { "@tauri-apps/api": ">=2.0.0-beta.0" diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000..8c8a67d --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,17 @@ +{ + "private": true, + "name": "@blending/utils", + "version": "0.0.0", + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "packageManager": "yarn@4.1.1", + "dependencies": { + "@vanilla-extract/css": "^1.14.2" + }, + "devDependencies": { + "@blending/config": "workspace:^", + "typescript": "^5.4.4" + } +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 0000000..5b1c7ec --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,7 @@ +export const mergeTemplateStrings = (strings: TemplateStringsArray, ...values: unknown[]) => { + return strings.reduce( + (previous, current, i) => + `${previous}${current}${values[i] !== undefined ? values[i] : ""}`, + "", + ); +} diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 0000000..b15e4eb --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "@blending/config/tsconfigs/base", + ] +} diff --git a/yarn.lock b/yarn.lock index a9e4935..1c380a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -582,7 +582,7 @@ __metadata: "@blending/config": "workspace:^" "@vanilla-extract/css": "npm:^1.14.2" svg-path-properties: "npm:^1.3.0" - typescript: "npm:^5.4.3" + typescript: "npm:^5.4.4" languageName: unknown linkType: soft @@ -592,6 +592,17 @@ __metadata: languageName: unknown linkType: soft +"@blending/css@workspace:^, @blending/css@workspace:packages/css": + version: 0.0.0-use.local + resolution: "@blending/css@workspace:packages/css" + dependencies: + "@blending/config": "workspace:^" + "@blending/utils": "workspace:^" + "@vanilla-extract/css": "npm:^1.14.2" + typescript: "npm:^5.4.4" + languageName: unknown + linkType: soft + "@blending/docs@workspace:apps/docs": version: 0.0.0-use.local resolution: "@blending/docs@workspace:apps/docs" @@ -615,7 +626,7 @@ __metadata: solid-js: "npm:^1.8.16" starlight-blog: "npm:^0.5.1" starlight-image-zoom: "npm:^0.2.0" - typescript: "npm:^5.4.3" + typescript: "npm:^5.4.4" unist-util-visit: "npm:^5.0.0" wrangler: "npm:^3.44.0" languageName: unknown @@ -627,7 +638,9 @@ __metadata: dependencies: "@blending/common": "workspace:^" "@blending/config": "workspace:^" + "@blending/css": "workspace:^" "@blending/material": "workspace:^" + "@blending/tauri-plugin-dwm": "workspace:^" "@blending/tauri-plugin-ftp": "workspace:^" "@material/material-color-utilities": "npm:^0.2.7" "@solid-primitives/context": "npm:^0.2.3" @@ -644,7 +657,7 @@ __metadata: solid-js: "npm:^1.8.16" solid-motionone: "npm:^1.0.0" solid-transition-group: "npm:^0.2.3" - typescript: "npm:^5.4.3" + typescript: "npm:^5.4.4" vite: "npm:^5.2.7" vite-plugin-solid: "npm:^2.10.2" languageName: unknown @@ -656,6 +669,7 @@ __metadata: dependencies: "@blending/common": "workspace:^" "@blending/config": "workspace:^" + "@blending/css": "workspace:^" "@material/material-color-utilities": "npm:^0.2.7" "@solid-primitives/event-listener": "npm:^2.3.3" "@solid-primitives/jsx-tokenizer": "npm:^1.0.10" @@ -669,20 +683,40 @@ __metadata: material-symbols: "npm:^0.17.1" solid-js: "npm:^1.8.16" svg-path-properties: "npm:^1.3.0" - typescript: "npm:^5.4.3" + typescript: "npm:^5.4.4" peerDependencies: material-symbols: ^0.x solid-js: ^1.8.x languageName: unknown linkType: soft +"@blending/tauri-plugin-dwm@workspace:^, @blending/tauri-plugin-dwm@workspace:packages/tauri-plugin-dwm": + version: 0.0.0-use.local + resolution: "@blending/tauri-plugin-dwm@workspace:packages/tauri-plugin-dwm" + dependencies: + "@blending/config": "workspace:^" + "@tauri-apps/api": "npm:>=2.0.0-beta" + typescript: "npm:^5.4.4" + languageName: unknown + linkType: soft + "@blending/tauri-plugin-ftp@workspace:^, @blending/tauri-plugin-ftp@workspace:packages/tauri-plugin-ftp": version: 0.0.0-use.local resolution: "@blending/tauri-plugin-ftp@workspace:packages/tauri-plugin-ftp" dependencies: "@tauri-apps/api": "npm:>=2.0.0-beta.0" "@tauri-apps/cli": "npm:>=2.0.0-beta.0" - typescript: "npm:^5.4.3" + typescript: "npm:^5.4.4" + languageName: unknown + linkType: soft + +"@blending/utils@workspace:^, @blending/utils@workspace:packages/utils": + version: 0.0.0-use.local + resolution: "@blending/utils@workspace:packages/utils" + dependencies: + "@blending/config": "workspace:^" + "@vanilla-extract/css": "npm:^1.14.2" + typescript: "npm:^5.4.4" languageName: unknown linkType: soft @@ -792,7 +826,6 @@ __metadata: version: 0.0.0-use.local resolution: "@deminearchiver/blending@workspace:." dependencies: - typescript: "npm:^5.4.3" wrangler: "npm:^3.44.0" languageName: unknown linkType: soft @@ -2101,7 +2134,7 @@ __metadata: languageName: node linkType: hard -"@tauri-apps/api@npm:>=2.0.0-beta.0": +"@tauri-apps/api@npm:>=2.0.0-beta, @tauri-apps/api@npm:>=2.0.0-beta.0": version: 2.0.0-beta.7 resolution: "@tauri-apps/api@npm:2.0.0-beta.7" checksum: 10c0/52106eaf0ce13552a22c750024e711a170418d98f7f891ba655e9908e855dedc4f5401f2719a5eba9e865fb096482765bd60342be84fb673add7c3cac80381eb @@ -8024,23 +8057,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.4.3": - version: 5.4.3 - resolution: "typescript@npm:5.4.3" +"typescript@npm:^5.4.4": + version: 5.4.4 + resolution: "typescript@npm:5.4.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/22443a8760c3668e256c0b34b6b45c359ef6cecc10c42558806177a7d500ab1a7d7aac1f976d712e26989ddf6731d2fbdd3212b7c73290a45127c1c43ba2005a + checksum: 10c0/4d8de0291204ed61ca97ad0cba2ce064e09c4988ca1c451c787e4653ba76296ba35177a52694e8a00cf4ef899d0ee83338663b926d8b7d55167ff0ba81549999 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.4.3#optional!builtin": - version: 5.4.3 - resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin::version=5.4.3&hash=5adc0c" +"typescript@patch:typescript@npm%3A^5.4.4#optional!builtin": + version: 5.4.4 + resolution: "typescript@patch:typescript@npm%3A5.4.4#optional!builtin::version=5.4.4&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/6e51f8b7e6ec55b897b9e56b67e864fe8f44e30f4a14357aad5dc0f7432db2f01efc0522df0b6c36d361c51f2dc3dcac5c832efd96a404cfabf884e915d38828 + checksum: 10c0/1fa41b9964a9ff0ed913b339c90b46031b2d2da3cb1a192af516610733f7f1d5f7f9754a8e22b9ac7076d3d8aedd2c4f84db3f113bad060eac3a95962443a1bf languageName: node linkType: hard