Pear User-Interface Library for Electron
Status: WIP
npm install pear-electron
Instantiate a pear-electron
runtime instance from a Pear Application's entrypoint JavaScript file:
import Runtime from 'pear-electron'
import Bridge from 'pear-bridge'
const runtime = new Runtime()
await runtime.ready()
const bridge = new Bridge()
await bridge.ready()
const pipe = runtime.start(bridge.info())
Pear.teardown(() => pipe.end())
Call runtime.start
to open the UI.
Create the runtime instances with new Runtime()
.
Prepare the runtime, runtime binaries for the runtime version may be bootstrapped peer-to-peer at this point. This only runs once per version and any prior bootstraps can be reused for subsequent versions where state hasn't changed. In a production scenario any bootstrapping would be performed in advance by the application distributable.
Opens the UI. The info
string is passed as a --runtime-info
flag to the UI executable. The pear-api/state
integration library then includes this flag value as state.runtimeInfo
which can then be used by pear-electron
. The info
string by convention is a JSON string, with the shape, { type, data }
.
In the usage example, bridge.info()
is passed to runtime.start()
, pear-electron
later uses this to determine the bridge localhost address to load with electron.
const ui = require('pear-electron')
Media interface
Resolves to: <String>
If access to the microphone is available, resolved value will be 'granted'
.
Any other string indicates lack of permission. Possible values are 'granted'
, 'not-determined'
, 'denied'
, 'restricted'
, 'unknown'
.
Resolves to: <String>
If access to the camera is available, resolved value will be 'granted'
.
Any other string indicates lack of permission. Possible values are 'granted'
, 'not-determined'
, 'denied'
, 'restricted'
, 'unknown'
.
Resolves to: <String>
If access to the screen is available, resolved value will be 'granted'
.
Any other string indicates lack of permission. Possible values are 'granted'
, 'not-determined'
, 'denied'
, 'restricted'
, 'unknown'
.
Resolves to: <Boolean>
Request access to the microphone. Resolves to true
if permission is granted.
Resolves to: <Boolean>
Request access to the camera. Resolves to true
if permission is granted.
Resolves to: <Boolean>
Request access to screen sharing. Resolves to true
if permission is granted.
Captures available desktop sources. Resolves to an array of objects with shape { id <String>, name <String>, thumbnail <NativeImage>, display_id <String>, appIcon <NativeImage> }
. The id
is the window or screen identifier. The name
is the window title or 'Screen <index>'
in multiscreen scenarios or else Entire Screen
. The display_id
identifies the screen. The thumbnail is a scaled down screen capture of the window/screen.
Options
types <Array<String>>
- Default:['screen', 'window']
. Filter by types. Types are'screen'
and'window'
.thumbnailSize <Object>
- Default:{width: 150, height: 150}
. Set thumbnail scaling (pixels)fetchWindowIcons <Boolean>
- Default:false
. PopulateappIcon
with Window icons, or elsenull
.
References
- win.getMediaSourceId()
- view.getMediaSourceId()
- self.getMediaSourceId()
- parent.getMediaSourceId()
- https://www.electronjs.org/docs/latest/api/desktop-capturer#desktopcapturergetsourcesoptions
- https://www.electronjs.org/docs/latest/api/structures/desktop-capturer-source
<NativeImage>
Exits the process with the provided exit code.
Desktop Applications only.
Create a new Window
instance.
Options
show <Boolean>
Default:true
- show the window as soon as it has been openedx <Integer>
- the horizontal position of left side of the window (pixels)y <Integer>
- vertical window position (pixels)width <Integer>
- the width of the window (pixels)height <Integer>
- the height of the window (pixels)animate <Boolean>
Default:false
- animate the dimensional change. MacOS only, ignored on other OS's.center <Boolean
- center the window upon openingminWidth <Integer>
- window minimum width (pixels)minHeight <Integer>
- window minimum height (pixels)maxWidth <Integer>
- window maximum width (pixels)maxHeight <Integer>
- window maximum height (pixels)resizable <Boolean>
- window resizabilitymovable <Boolean>
- window movabilityminimizable <Boolean>
- window minimizabilitymaximizable <Boolean>
- window maximizabilityclosable <Boolean>
- window closabilityfocusable <Boolean>
- window focusabilityalwaysOnTop <Boolean>
- Set window to always be on topfullscreen <Boolean>
- Set window to fullscreen upon openkiosk <Boolean>
- Set window to enter kiosk mode upon openautoHideMenuBar <Boolean>
- Hide menu bar unless Alt key is pressed (Linux, Windows)hasShadow <Boolean>
- Set window shadowopacity <Number>
- Set window opacity (0.0 - 1.0) (Windows, macOS)transparent <Boolean>
- Set window transparencybackgroundColor <String>
Default:'#FFF'
- window default background color. Hex, RGB, RGBA, HSL HSLA, CSS color
Receive a message from the window. The received args
array is deserialized via JSON.parse
.
References
Resolves to: <Boolean>
Open the window.
Options
show
Default:true
- show the window as soon as it has been openedx <Integer>
- the horizontal position of left side of the window (pixels)y <Integer>
- vertical window position (pixels)width <Integer>
- the width of the window (pixels)height <Integer>
- the height of the window (pixels)animate <Boolean>
Default:false
- animate the dimensional change. MacOS only, ignored on other OS's.center <Boolean
- center the window upon openingminWidth <Integer>
- window minimum width (pixels)minHeight <Integer>
- window minimum height (pixels)maxWidth <Integer>
- window maximum width (pixels)maxHeight <Integer>
- window maximum height (pixels)resizable <Boolean>
- window resizabilitymovable <Boolean>
- window movabilityminimizable <Boolean>
- window minimizabilitymaximizable <Boolean>
- window maximizabilityclosable <Boolean>
- window closabilityfocusable <Boolean>
- window focusabilityalwaysOnTop <Boolean>
- Set window to always be on topfullscreen <Boolean>
- Set window to fullscreen upon openkiosk <Boolean>
- Set window to enter kiosk mode upon openautoHideMenuBar <Boolean>
- Hide menu bar unless Alt key is pressed (Linux, Windows)hasShadow <Boolean>
- Set window shadowopacity <Number>
- Set window opacity (0.0 - 1.0) (Windows, macOS)transparent <Boolean>
- Set window transparencybackgroundColor <String>
Default:'#FFF'
- window default background color. Hex, RGB, RGBA, HSL HSLA, CSS color
Resolves to: <Boolean>
Close the window.
Resolves to: <Boolean>
Show the window.
Resolves to: <Boolean>
Hide the window.
Resolves to: <Boolean>
Focus the window.
Resolves to: <Boolean>
Blur the window.
Resolves to: <Boolean>
Minimize the window.
Resolves to: <Boolean>
Maximize the window.
Resolves to: <Boolean>
Unmaximize/unminimize the window if it is currently maximized/minimized.
Send arguments to the window. They will be serialized with JSON.stringify
.
Resolves to: <String>
Correlates to the id
property of objects in the array returned from ui.media.desktopSources.
References
- ui.media.desktopSources
- https://www.electronjs.org/docs/latest/api/browser-window#wingetmediasourceid
Resolves to: {x <Integer>, y <Integer>, width <Integer>, height <Integer>} | null
.
The height, width, horizontal (x
), vertical (y
) position of the window relative to the screen.
All units are (pixels)
If the window is closed this will resolve to null
.
References
const win = new ui.Window('./some.html', {
x: 10,
y: 450,
width: 300,
height: 350
})
await win.open()
await new Promise((resolve) => setTimeout(resolve, 1000))
await win.dimensions({
x: 20,
y: 50,
width: 550,
height: 300,
animate: true // only has an effect on macOS
})
Sets the dimensions of the window.
Options
x <Integer>
- the horizontal position of left side of the window (pixels)y <Integer>
- the vertical position of the top of the window (pixels)width <Integer>
- the width of the window (pixels)height <Integer>
- the height of the window (pixels)animate <Boolean>
Default:false
- animate the dimensional change. MacOS only, ignored on other OS's.position <String>
- may be'center'
to set the window in the center of the screen or elseundefined
.
References
Resolves to: <Boolean>
Whether the window is visible.
Resolves to: <Boolean>
Whether the window is minimized.
Resolves to: <Boolean>
Whether the window is maximized.
Resolves to: <Boolean>
Whether the window is closed.
Desktop Applications only.
Create a new View
instance. Views provide isolated content views. Frameless, chromeless windows that can be embedded inside other windows and views.
Options
x <Integer>
- the horizontal position of left side of the view (pixels)y <Integer>
- vertical view position (pixels)width <Integer>
- the width of the view (pixels)height <Integer>
- the height of the view (pixels)backgroundColor <String>
Default:'#FFF'
- view default background color. Hex, RGB, RGBA, HSL HSLA, CSS colorautoresize <Object>
Default{ width=true, height=true, vertical=false, horizontal=false }
- dimensions for the view to autoresize alongside. For example, ifwidth
istrue
and the view container increases/decreases in width, the view will increase/decrease in width at the same rate.
References
- https://www.electronjs.org/docs/latest/api/browser-view#viewsetautoresizeoptions-experimental
- https://www.electronjs.org/docs/latest/api/browser-view#viewsetbackgroundcolorcolor-experimental
Receive a message from the view. The received args
array is deserialized via JSON.parse
.
References
Resolves to: <Boolean>
Open the view.
Options
x <Integer>
- the horizontal position of left side of the view (pixels)y <Integer>
- vertical view position (pixels)width <Integer>
- the width of the view (pixels)height <Integer>
- the height of the view (pixels)backgroundColor <String>
Default:'#FFF'
- view default background color. Hex, RGB, RGBA, HSL HSLA, CSS colorautoresize <Object>
Default{ width=true, height=true, vertical=false, horizontal=false }
- dimensions for the view to autoresize alongside. For example, ifwidth
istrue
and the view container increases/decreases in width, the view will increase/decrease in width at the same rate.
Resolves to: <Boolean>
Close the view.
Resolves to: <Boolean>
Show the view.
Resolves to: <Boolean>
Hide the view.
Resolves to: <Boolean>
Focus the view.
Resolves to: <Boolean>
Blur the view.
Send arguments to the view. They will be serialized with JSON.stringify
.
Resolves to: <String>
Supplies the id
property of objects in the array returned from ui.media.desktopSources.
References
- ui.media.desktopSources
- https://www.electronjs.org/docs/latest/api/browser-window#wingetmediasourceid
Resolves to: {x <Integer>, y <Integer>, width <Integer>, height <Integer>} | null
.
The height, width, horizontal (x
), vertical (y
) position of the window relative to the screen.
All units are (pixels)
If the Window is closed this will resolve to null
.
References
const view = new ui.View('./some.html', {
x: 10,
y: 450,
width: 300,
height: 350
})
await view.open()
await new Promise((resolve) => setTimeout(resolve, 1000))
await view.dimensions({
x: 20,
y: 50,
width: 550,
height: 300
})
Sets the dimensions of the view.
Options
x <Integer>
- the horizontal position of left side of the window (pixels)y <Integer>
- the vertical position of the top of the window (pixels)width <Integer>
- the width of the window (pixels)height <Integer>
- the height of the window (pixels)
References
Resolves to: <Boolean>
Whether the view is visible.
Resolves to: <Boolean>
Whether the view is closed.
Resolves to: <Boolean>
Focus current view or window.
Resolves to: <Boolean>
Blur current view or window.
Resolves to: <Boolean>
Show current view or window.
Resolves to: <Boolean>
Hide current view or window.
Get the sourceId of the current window or view.
References
Resolves to: <Boolean>
Minimize current window.
Throws a TypeError
if self
is a view.
Resolves to: <Boolean>
Maximize current window.
Throws a TypeError
if self
is a view.
Resolves to: <Boolean>
Unmaximize/unminimize the current window if it is currently maximized/minimized.
Throws a TypeError
if self
is a view.
Resolves to: <Boolean>
Closes the current view or window.
Resolves to: <Boolean>
Whether the current window or view is visible.
Resolves to: <Boolean>
Whether the current window is maximized. Throws a TypeError
if self
is a view.
Resolves to: <Boolean>
Whether the current window is minimized. Throws a TypeError
if self
is a view.
Receive a message from the parent window or view. The received args
array is deserialized via JSON.parse
.
Send arguments to the parent view or window. They will be serialized with JSON.stringify
.
Resolves to: <Boolean>
Focus parent view or window.
Resolves to: <Boolean>
Blur parent view or window.
Resolves to: <Boolean>
Show parent view or window.
Resolves to: <Boolean>
Hide parent view or window.
Get the sourceId of the parent window or view.
References
Resolves to: <Boolean>
Minimize parent window.
Throws a TypeError
if parent
is a view.
Resolves to: <Boolean>
Maximize parent window.
Throws a TypeError
if parent
is a view.
Resolves to: <Boolean>
Unmaximize/unminimize the parent window if it is currently maximized/minimized.
Throws a TypeError
if parent
is a view.
Resolves to: <Boolean>
Closes the parent view or window.
Resolves to: <Boolean>
Whether the parent window or view is visible.
Resolves to: <Boolean>
Whether the parent window is maximized. Throws a TypeError
if parent
is a view.
Resolves to: <Boolean>
Whether the parent window is minimized. Throws a TypeError
if parent
is a view.
Most Web APIs will work as-is.
This section details deviations in behavior from and notable aspects of Web APIs as they relate to pear-electron
.
The window.open
Web API function will ignore all arguments except for the URL parameter.
In browsers, window.open
opens a new browser window. The opened window belongs to the same browser from which window.open
is called.
With pear-electron
UI Library, window.open
loads the URL in the default system browser. It does not create a new application window (use Pear.Window
to create application windows).
Therefore Pear's window.open
only supports a single URL argument. The target
and windowFeatures
parameters that browsers support are discarded.
Like browsers, there is no support for CommonJS (e.g. the require
function as used by Node.js is not supported in Pear Applications).
Like browsers, there is support for native EcmaScript Modules (ESM). A JavaScript Script has no module capabilities. A JavaScript Module has ESM capabilities.
Use <script type="module" src="path/to/my-file.js">
to load a JavaScript Module.
Use <script src="path/to/my-file.js">
to load a JavaScript Script.
GUI options for an application are set in the application package.json
pear.gui
field.
Window width (pixels).
Window height (pixels).
Horizontal window position (pixels).
Vertical window position (pixels).
Window minimum width (pixels).
Window minimum height (pixels).
Window maximum width (pixels).
Window maximum height (pixels).
Center window.
Window resizability.
Window movability.
Window minimizability.
Window maximizability.
Window closability.
Window focusability.
Set window to always be on top.
Set window to fullscreen on start.
Set window to enter kiosk mode on start.
Hide menu bar unless Alt key is pressed (Linux, Windows).
Window shadow.
Set window opacity (0.0 - 1.0) (Windows, macOS).
Enable transparency. Must be set for opacity to work.
Background color (Hex, RGB, RGBA, HSL, HSLA, CSS color).
The pear-electron
library is a Pear User Interface Runtime Library, as such pear-electron
(and any Pear UI Lib.) is multifaceted and behaves differently depending on context.
- When loaded into a UI,
pear-electron
is the UI API - When loaded into non-UI (i.e app entrypoint js file),
pear-electron
is the runtime initializor- When there is no runtime binary on the system,
pear-electron
performs bootstrapping of the UI runtime executable, into<pear-dir>/interfaces/pear-electron/<semver>
- When there is no runtime binary on the system,
- The
pear-electron
repo is also self-bootstrapping and generates the runtime drive (withby-arch
,prebuilds
andboot.bundle
), which can then be staged with Pear. The pear link for the stagedpear-electron
contents inpear-electron
package.json
pear.ui.runtime
field is then set, with fork and length included. This locks runtime builds for a given semver to a specific runtime drive checkout.- This is what
pear-electron
bootstraps from duringruntime.ready()
.
- This is what
Apache 2.0