Installed Neutralino.js base template

This commit is contained in:
2026-01-12 12:38:54 +01:00
commit 01e382bb87
12 changed files with 819 additions and 0 deletions

BIN
resources/icons/appIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
resources/icons/logo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 965 B

27
resources/index.html Normal file
View File

@@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>NeutralinoJs sample app</title>
<link rel="stylesheet" href="/styles.css">
</head>
<body>
<div id="neutralinoapp">
<h1>NeutralinoJs</h1>
<div id="info"></div>
<br/>
<img src="/icons/logo.gif" alt="Neutralinojs" />
<div>
<a href="#" onclick="openDocs();">Docs</a> &middot;
<a href="#" onclick="openTutorial();">Video tutorial</a>
</div>
</div>
<!-- Neutralino.js client. This file is gitignored,
because `neu update` typically downloads it.
Avoid copy-pasting it.
-->
<script src="/js/neutralino.js"></script>
<!-- Your app's source files -->
<script src="/js/main.js"></script>
</body>
</html>

99
resources/js/main.js Normal file
View File

@@ -0,0 +1,99 @@
// This is just a sample app. You can structure your Neutralinojs app code as you wish.
// This example app is written with vanilla JavaScript and HTML.
// Feel free to use any frontend framework you like :)
// See more details: https://neutralino.js.org/docs/how-to/use-a-frontend-library
/*
Function to display information about the Neutralino app.
This function updates the content of the 'info' element in the HTML
with details regarding the running Neutralino application, including
its ID, port, operating system, and version information.
*/
function showInfo() {
document.getElementById('info').innerHTML = `
${NL_APPID} is running on port ${NL_PORT} inside ${NL_OS}
<br/><br/>
<span>server: v${NL_VERSION} . client: v${NL_CVERSION}</span>
`;
}
/*
Function to open the official Neutralino documentation in the default web browser.
*/
function openDocs() {
Neutralino.os.open("https://neutralino.js.org/docs");
}
/*
Function to open a tutorial video on Neutralino's official YouTube channel in the default web browser.
*/
function openTutorial() {
Neutralino.os.open("https://www.youtube.com/c/CodeZri");
}
/*
Function to set up a system tray menu with options specific to the window mode.
This function checks if the application is running in window mode, and if so,
it defines the tray menu items and sets up the tray accordingly.
*/
function setTray() {
// Tray menu is only available in window mode
if(NL_MODE != "window") {
console.log("INFO: Tray menu is only available in the window mode.");
return;
}
// Define tray menu items
let tray = {
icon: "/resources/icons/trayIcon.png",
menuItems: [
{id: "VERSION", text: "Get version"},
{id: "SEP", text: "-"},
{id: "QUIT", text: "Quit"}
]
};
// Set the tray menu
Neutralino.os.setTray(tray);
}
/*
Function to handle click events on the tray menu items.
This function performs different actions based on the clicked item's ID,
such as displaying version information or exiting the application.
*/
function onTrayMenuItemClicked(event) {
switch(event.detail.id) {
case "VERSION":
// Display version information
Neutralino.os.showMessageBox("Version information",
`Neutralinojs server: v${NL_VERSION} | Neutralinojs client: v${NL_CVERSION}`);
break;
case "QUIT":
// Exit the application
Neutralino.app.exit();
break;
}
}
/*
Function to handle the window close event by gracefully exiting the Neutralino application.
*/
function onWindowClose() {
Neutralino.app.exit();
}
// Initialize Neutralino
Neutralino.init();
// Register event listeners
Neutralino.events.on("trayMenuItemClicked", onTrayMenuItemClicked);
Neutralino.events.on("windowClose", onWindowClose);
// Conditional initialization: Set up system tray if not running on macOS
if(NL_OS != "Darwin") { // TODO: Fix https://github.com/neutralinojs/neutralinojs/issues/615
setTray();
}
// Display app information
showInfo();

529
resources/js/neutralino.d.ts vendored Normal file
View File

@@ -0,0 +1,529 @@
export declare enum LoggerType {
WARNING = "WARNING",
ERROR = "ERROR",
INFO = "INFO"
}
export declare enum Icon {
WARNING = "WARNING",
ERROR = "ERROR",
INFO = "INFO",
QUESTION = "QUESTION"
}
export declare enum MessageBoxChoice {
OK = "OK",
OK_CANCEL = "OK_CANCEL",
YES_NO = "YES_NO",
YES_NO_CANCEL = "YES_NO_CANCEL",
RETRY_CANCEL = "RETRY_CANCEL",
ABORT_RETRY_IGNORE = "ABORT_RETRY_IGNORE"
}
export declare enum ClipboardFormat {
unknown = "unknown",
text = "text",
image = "image"
}
export declare enum Mode {
window = "window",
browser = "browser",
cloud = "cloud",
chrome = "chrome"
}
export declare enum OperatingSystem {
Linux = "Linux",
Windows = "Windows",
Darwin = "Darwin",
FreeBSD = "FreeBSD",
Unknown = "Unknown"
}
export declare enum Architecture {
x64 = "x64",
arm = "arm",
itanium = "itanium",
ia32 = "ia32",
unknown = "unknown"
}
export interface DirectoryEntry {
entry: string;
path: string;
type: string;
}
export interface FileReaderOptions {
pos: number;
size: number;
}
export interface DirectoryReaderOptions {
recursive: boolean;
}
export interface OpenedFile {
id: number;
eof: boolean;
pos: number;
lastRead: number;
}
export interface Stats {
size: number;
isFile: boolean;
isDirectory: boolean;
createdAt: number;
modifiedAt: number;
}
export interface Watcher {
id: number;
path: string;
}
export interface CopyOptions {
recursive: boolean;
overwrite: boolean;
skip: boolean;
}
export interface PathParts {
rootName: string;
rootDirectory: string;
rootPath: string;
relativePath: string;
parentPath: string;
filename: string;
stem: string;
extension: string;
}
interface Permissions$1 {
all: boolean;
ownerAll: boolean;
ownerRead: boolean;
ownerWrite: boolean;
ownerExec: boolean;
groupAll: boolean;
groupRead: boolean;
groupWrite: boolean;
groupExec: boolean;
othersAll: boolean;
othersRead: boolean;
othersWrite: boolean;
othersExec: boolean;
}
export type PermissionsMode = "ADD" | "REPLACE" | "REMOVE";
declare function createDirectory(path: string): Promise<void>;
declare function remove(path: string): Promise<void>;
declare function writeFile(path: string, data: string): Promise<void>;
declare function appendFile(path: string, data: string): Promise<void>;
declare function writeBinaryFile(path: string, data: ArrayBuffer): Promise<void>;
declare function appendBinaryFile(path: string, data: ArrayBuffer): Promise<void>;
declare function readFile(path: string, options?: FileReaderOptions): Promise<string>;
declare function readBinaryFile(path: string, options?: FileReaderOptions): Promise<ArrayBuffer>;
declare function openFile(path: string): Promise<number>;
declare function createWatcher(path: string): Promise<number>;
declare function removeWatcher(id: number): Promise<number>;
declare function getWatchers(): Promise<Watcher[]>;
declare function updateOpenedFile(id: number, event: string, data?: any): Promise<void>;
declare function getOpenedFileInfo(id: number): Promise<OpenedFile>;
declare function readDirectory(path: string, options?: DirectoryReaderOptions): Promise<DirectoryEntry[]>;
declare function copy(source: string, destination: string, options?: CopyOptions): Promise<void>;
declare function move(source: string, destination: string): Promise<void>;
declare function getStats(path: string): Promise<Stats>;
declare function getAbsolutePath(path: string): Promise<string>;
declare function getRelativePath(path: string, base?: string): Promise<string>;
declare function getPathParts(path: string): Promise<PathParts>;
declare function getPermissions(path: string): Promise<Permissions$1>;
declare function setPermissions(path: string, permissions: Permissions$1, mode: PermissionsMode): Promise<void>;
declare function getJoinedPath(...paths: string[]): Promise<string>;
declare function getNormalizedPath(path: string): Promise<string>;
declare function getUnnormalizedPath(path: string): Promise<string>;
export interface ExecCommandOptions {
stdIn?: string;
background?: boolean;
cwd?: string;
}
export interface ExecCommandResult {
pid: number;
stdOut: string;
stdErr: string;
exitCode: number;
}
export interface SpawnedProcess {
id: number;
pid: number;
}
export interface SpawnedProcessOptions {
cwd?: string;
envs?: Record<string, string>;
}
export interface Envs {
[key: string]: string;
}
export interface OpenDialogOptions {
multiSelections?: boolean;
filters?: Filter[];
defaultPath?: string;
}
export interface FolderDialogOptions {
defaultPath?: string;
}
export interface SaveDialogOptions {
forceOverwrite?: boolean;
filters?: Filter[];
defaultPath?: string;
}
export interface Filter {
name: string;
extensions: string[];
}
export interface TrayOptions {
icon: string;
menuItems: TrayMenuItem[];
}
export interface TrayMenuItem {
id?: string;
text: string;
isDisabled?: boolean;
isChecked?: boolean;
}
export type KnownPath = "config" | "data" | "cache" | "documents" | "pictures" | "music" | "video" | "downloads" | "savedGames1" | "savedGames2" | "temp";
declare function execCommand(command: string, options?: ExecCommandOptions): Promise<ExecCommandResult>;
declare function spawnProcess(command: string, options?: SpawnedProcessOptions): Promise<SpawnedProcess>;
declare function updateSpawnedProcess(id: number, event: string, data?: any): Promise<void>;
declare function getSpawnedProcesses(): Promise<SpawnedProcess[]>;
declare function getEnv(key: string): Promise<string>;
declare function getEnvs(): Promise<Envs>;
declare function showOpenDialog(title?: string, options?: OpenDialogOptions): Promise<string[]>;
declare function showFolderDialog(title?: string, options?: FolderDialogOptions): Promise<string>;
declare function showSaveDialog(title?: string, options?: SaveDialogOptions): Promise<string>;
declare function showNotification(title: string, content: string, icon?: Icon): Promise<void>;
declare function showMessageBox(title: string, content: string, choice?: MessageBoxChoice, icon?: Icon): Promise<string>;
declare function setTray(options: TrayOptions): Promise<void>;
declare function open$1(url: string): Promise<void>;
declare function getPath(name: KnownPath): Promise<string>;
export interface MemoryInfo {
physical: {
total: number;
available: number;
};
virtual: {
total: number;
available: number;
};
}
export interface KernelInfo {
variant: string;
version: string;
}
export interface OSInfo {
name: string;
description: string;
version: string;
}
export interface CPUInfo {
vendor: string;
model: string;
frequency: number;
architecture: string;
logicalThreads: number;
physicalCores: number;
physicalUnits: number;
}
export interface Display {
id: number;
resolution: Resolution;
dpi: number;
bpp: number;
refreshRate: number;
}
export interface Resolution {
width: number;
height: number;
}
export interface MousePosition {
x: number;
y: number;
}
declare function getMemoryInfo(): Promise<MemoryInfo>;
declare function getArch(): Promise<string>;
declare function getKernelInfo(): Promise<KernelInfo>;
declare function getOSInfo(): Promise<OSInfo>;
declare function getCPUInfo(): Promise<CPUInfo>;
declare function getDisplays(): Promise<Display[]>;
declare function getMousePosition(): Promise<MousePosition>;
declare function setData(key: string, data: string | null): Promise<void>;
declare function getData(key: string): Promise<string>;
declare function removeData(key: string): Promise<void>;
declare function getKeys(): Promise<string[]>;
declare function clear(): Promise<void>;
declare function log(message: string, type?: LoggerType): Promise<void>;
export interface OpenActionOptions {
url: string;
}
export interface RestartOptions {
args: string;
}
declare function exit(code?: number): Promise<void>;
declare function killProcess(): Promise<void>;
declare function restartProcess(options?: RestartOptions): Promise<void>;
declare function getConfig(): Promise<any>;
declare function broadcast(event: string, data?: any): Promise<void>;
declare function readProcessInput(readAll?: boolean): Promise<string>;
declare function writeProcessOutput(data: string): Promise<void>;
declare function writeProcessError(data: string): Promise<void>;
export interface WindowOptions extends WindowSizeOptions, WindowPosOptions {
title?: string;
icon?: string;
fullScreen?: boolean;
alwaysOnTop?: boolean;
enableInspector?: boolean;
borderless?: boolean;
maximize?: boolean;
hidden?: boolean;
maximizable?: boolean;
useSavedState?: boolean;
exitProcessOnClose?: boolean;
extendUserAgentWith?: string;
injectGlobals?: boolean;
injectClientLibrary?: boolean;
injectScript?: string;
processArgs?: string;
}
export interface WindowSizeOptions {
width?: number;
height?: number;
minWidth?: number;
minHeight?: number;
maxWidth?: number;
maxHeight?: number;
resizable?: boolean;
}
export interface WindowPosOptions {
x: number;
y: number;
}
export interface WindowMenu extends Array<WindowMenuItem> {
}
export interface WindowMenuItem {
id?: string;
text: string;
action?: string;
shortcut?: string;
isDisabled?: boolean;
isChecked?: boolean;
menuItems?: WindowMenuItem[];
}
declare function setTitle(title: string): Promise<void>;
declare function getTitle(): Promise<string>;
declare function maximize(): Promise<void>;
declare function unmaximize(): Promise<void>;
declare function isMaximized(): Promise<boolean>;
declare function minimize(): Promise<void>;
declare function unminimize(): Promise<void>;
declare function isMinimized(): Promise<boolean>;
declare function setFullScreen(): Promise<void>;
declare function exitFullScreen(): Promise<void>;
declare function isFullScreen(): Promise<boolean>;
declare function show(): Promise<void>;
declare function hide(): Promise<void>;
declare function isVisible(): Promise<boolean>;
declare function focus$1(): Promise<void>;
declare function setIcon(icon: string): Promise<void>;
declare function move$1(x: number, y: number): Promise<void>;
declare function center(): Promise<void>;
declare function beginDrag(screenX?: number, screenY?: number): Promise<void>;
declare function setDraggableRegion(DOMElementOrId: string | HTMLElement, options?: {
exclude?: Array<string | HTMLElement>;
}): Promise<{
success: true;
message: string;
exclusions: {
add(elements: Array<string | HTMLElement>): void;
remove(elements: Array<string | HTMLElement>): void;
removeAll(): void;
};
}>;
declare function unsetDraggableRegion(DOMElementOrId: string | HTMLElement): Promise<{
success: true;
message: string;
}>;
declare function setSize(options: WindowSizeOptions): Promise<void>;
declare function getSize(): Promise<WindowSizeOptions>;
declare function getPosition(): Promise<WindowPosOptions>;
declare function setAlwaysOnTop(onTop: boolean): Promise<void>;
declare function create(url: string, options?: WindowOptions): Promise<void>;
declare function snapshot(path: string): Promise<void>;
declare function setMainMenu(options: WindowMenu): Promise<void>;
declare function print$1(): Promise<void>;
interface Response$1 {
success: boolean;
message: string;
}
export type Builtin = "ready" | "trayMenuItemClicked" | "windowClose" | "serverOffline" | "clientConnect" | "clientDisconnect" | "appClientConnect" | "appClientDisconnect" | "extClientConnect" | "extClientDisconnect" | "extensionReady" | "neuDev_reloadApp";
declare function on(event: string, handler: (ev: CustomEvent) => void): Promise<Response$1>;
declare function off(event: string, handler: (ev: CustomEvent) => void): Promise<Response$1>;
declare function dispatch(event: string, data?: any): Promise<Response$1>;
declare function broadcast$1(event: string, data?: any): Promise<void>;
export interface ExtensionStats {
loaded: string[];
connected: string[];
}
declare function dispatch$1(extensionId: string, event: string, data?: any): Promise<void>;
declare function broadcast$2(event: string, data?: any): Promise<void>;
declare function getStats$1(): Promise<ExtensionStats>;
export interface Manifest {
applicationId: string;
version: string;
resourcesURL: string;
}
declare function checkForUpdates(url: string): Promise<Manifest>;
declare function install(): Promise<void>;
export interface ClipboardImage {
width: number;
height: number;
bpp: number;
bpr: number;
redMask: number;
greenMask: number;
blueMask: number;
redShift: number;
greenShift: number;
blueShift: number;
data: ArrayBuffer;
}
declare function getFormat(): Promise<ClipboardFormat>;
declare function readText(): Promise<string>;
declare function readImage(format?: string): Promise<ClipboardImage | null>;
declare function writeText(data: string): Promise<void>;
declare function writeImage(image: ClipboardImage): Promise<void>;
declare function readHTML(): Promise<string>;
declare function writeHTML(data: string): Promise<void>;
declare function clear$1(): Promise<void>;
interface Stats$1 {
size: number;
isFile: boolean;
isDirectory: boolean;
}
declare function getFiles(): Promise<string[]>;
declare function getStats$2(path: string): Promise<Stats$1>;
declare function extractFile(path: string, destination: string): Promise<void>;
declare function extractDirectory(path: string, destination: string): Promise<void>;
declare function readFile$1(path: string): Promise<string>;
declare function readBinaryFile$1(path: string): Promise<ArrayBuffer>;
declare function mount(path: string, target: string): Promise<void>;
declare function unmount(path: string): Promise<void>;
declare function getMounts(): Promise<void>;
declare function getMethods(): Promise<string[]>;
export interface InitOptions {
exportCustomMethods?: boolean;
}
export declare function init(options?: InitOptions): void;
export type ErrorCode = "NE_FS_DIRCRER" | "NE_FS_RMDIRER" | "NE_FS_FILRDER" | "NE_FS_FILWRER" | "NE_FS_FILRMER" | "NE_FS_NOPATHE" | "NE_FS_COPYFER" | "NE_FS_MOVEFER" | "NE_OS_INVMSGA" | "NE_OS_INVKNPT" | "NE_ST_INVSTKY" | "NE_ST_STKEYWE" | "NE_RT_INVTOKN" | "NE_RT_NATPRME" | "NE_RT_APIPRME" | "NE_RT_NATRTER" | "NE_RT_NATNTIM" | "NE_CL_NSEROFF" | "NE_EX_EXTNOTC" | "NE_UP_CUPDMER" | "NE_UP_CUPDERR" | "NE_UP_UPDNOUF" | "NE_UP_UPDINER";
interface Error$1 {
code: ErrorCode;
message: string;
}
declare global {
interface Window {
/** Mode of the application: window, browser, cloud, or chrome */
NL_MODE: Mode;
/** Application port */
NL_PORT: number;
/** Command-line arguments */
NL_ARGS: string[];
/** Basic authentication token */
NL_TOKEN: string;
/** Neutralinojs client version */
NL_CVERSION: string;
/** Application identifier */
NL_APPID: string;
/** Application version */
NL_APPVERSION: string;
/** Application path */
NL_PATH: string;
/** Application data path */
NL_DATAPATH: string;
/** Returns true if extensions are enabled */
NL_EXTENABLED: boolean;
/** Returns true if the client library is injected */
NL_GINJECTED: boolean;
/** Returns true if globals are injected */
NL_CINJECTED: boolean;
/** Operating system name: Linux, Windows, Darwin, FreeBSD, or Uknown */
NL_OS: OperatingSystem;
/** CPU architecture: x64, arm, itanium, ia32, or unknown */
NL_ARCH: Architecture;
/** Neutralinojs server version */
NL_VERSION: string;
/** Current working directory */
NL_CWD: string;
/** Identifier of the current process */
NL_PID: string;
/** Source of application resources: bundle or directory */
NL_RESMODE: string;
/** Release commit of the client library */
NL_CCOMMIT: string;
/** An array of custom methods */
NL_CMETHODS: string[];
}
/** Neutralino global object for custom methods **/
const Neutralino: any;
}
declare namespace custom {
export { getMethods };
}
declare namespace filesystem {
export { appendBinaryFile, appendFile, copy, createDirectory, createWatcher, getAbsolutePath, getJoinedPath, getNormalizedPath, getOpenedFileInfo, getPathParts, getPermissions, getRelativePath, getStats, getUnnormalizedPath, getWatchers, move, openFile, readBinaryFile, readDirectory, readFile, remove, removeWatcher, setPermissions, updateOpenedFile, writeBinaryFile, writeFile };
}
declare namespace os {
export { execCommand, getEnv, getEnvs, getPath, getSpawnedProcesses, open$1 as open, setTray, showFolderDialog, showMessageBox, showNotification, showOpenDialog, showSaveDialog, spawnProcess, updateSpawnedProcess };
}
declare namespace computer {
export { getArch, getCPUInfo, getDisplays, getKernelInfo, getMemoryInfo, getMousePosition, getOSInfo };
}
declare namespace storage {
export { clear, getData, getKeys, removeData, setData };
}
declare namespace debug {
export { log };
}
declare namespace app {
export { broadcast, exit, getConfig, killProcess, readProcessInput, restartProcess, writeProcessError, writeProcessOutput };
}
declare namespace window$1 {
export { beginDrag, center, create, exitFullScreen, focus$1 as focus, getPosition, getSize, getTitle, hide, isFullScreen, isMaximized, isMinimized, isVisible, maximize, minimize, move$1 as move, print$1 as print, setAlwaysOnTop, setDraggableRegion, setFullScreen, setIcon, setMainMenu, setSize, setTitle, show, snapshot, unmaximize, unminimize, unsetDraggableRegion };
}
declare namespace events {
export { broadcast$1 as broadcast, dispatch, off, on };
}
declare namespace extensions {
export { broadcast$2 as broadcast, dispatch$1 as dispatch, getStats$1 as getStats };
}
declare namespace updater {
export { checkForUpdates, install };
}
declare namespace clipboard {
export { clear$1 as clear, getFormat, readHTML, readImage, readText, writeHTML, writeImage, writeText };
}
declare namespace resources {
export { extractDirectory, extractFile, getFiles, getStats$2 as getStats, readBinaryFile$1 as readBinaryFile, readFile$1 as readFile };
}
declare namespace server {
export { getMounts, mount, unmount };
}
export {
Error$1 as Error,
Permissions$1 as Permissions,
Response$1 as Response,
app,
clipboard,
computer,
custom,
debug,
events,
extensions,
filesystem,
os,
resources,
server,
storage,
updater,
window$1 as window,
};
export as namespace Neutralino;
export {};

20
resources/styles.css Normal file
View File

@@ -0,0 +1,20 @@
body {
background-color: white;
}
#neutralinoapp {
text-align: center;
-webkit-user-select: none;
user-select: none;
cursor: default;
}
#neutralinoapp h1{
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
font-size: 20px;
}
#neutralinoapp > div {
font-size: 16px;
font-weight: normal;
}