diff --git a/src/userlib/js/bootstrap/candid/candid.js b/src/userlib/js/bootstrap/candid/candid.js index 8762e71630..dfa9d409e0 100644 --- a/src/userlib/js/bootstrap/candid/candid.js +++ b/src/userlib/js/bootstrap/candid/candid.js @@ -1,13 +1,19 @@ -import * as UI from './candid-ui'; -import './candid.css'; +import * as UI from './wired'; +import { WiredCard, WiredButton } from 'wired-elements'; +import './wired.css'; export function render(id, canister) { + const font = document.createElement('link'); + font.href = 'https://fonts.googleapis.com/css2?family=Gloria+Hallelujah&display=swap'; + font.rel = 'stylesheet'; + document.head.appendChild(font); + document.getElementById('title').innerText = `Service ${id}`; for (const [name, func] of Object.entries(canister.__actorInterface())) { renderMethod(name, func, canister[name]); } - const console = document.createElement("div"); - console.className = 'console'; + const console = document.createElement("wired-card"); + console.classList.add('console'); document.body.appendChild(console); } @@ -26,8 +32,8 @@ function renderMethod(name, idl_func, f) { inputbox.render(item); }); - const button = document.createElement("button"); - button.className = 'btn'; + const button = document.createElement("wired-button"); + button.classList.add('btn'); if (idl_func.annotations.includes('query')) { button.innerText = 'Query'; } else { @@ -35,13 +41,14 @@ function renderMethod(name, idl_func, f) { } item.appendChild(button); - const random = document.createElement("button"); - random.className = 'btn'; + const random = document.createElement("wired-button"); + random.classList.add('btn'); random.innerText = 'Lucky'; item.appendChild(random); - const result = document.createElement("div"); - result.className = 'result'; + const result = document.createElement("wired-card"); + + result.classList.add('result'); const left = document.createElement("span"); left.className = 'left'; const right = document.createElement("span"); diff --git a/src/userlib/js/bootstrap/candid/wired.css b/src/userlib/js/bootstrap/candid/wired.css new file mode 100644 index 0000000000..ca4256bf16 --- /dev/null +++ b/src/userlib/js/bootstrap/candid/wired.css @@ -0,0 +1,66 @@ +.signature { + margin: 5px; +} +.argument, .result, .status, .composite { + font-family: 'Gloria Hallelujah', cursive; + font-weight: 400; + margin-right: 10px; + margin-bottom: 10px; +} +.open { + font-family: 'Gloria Hallelujah', cursive; + margin: 5px; +} +.reject { + color: #cc0000; +} +.result { + display: none; +} +.error { + color: #cc0000; +} +.status { + color: #cc0000; + display: none; +} +.btn { + margin: 5px; +} +.left { + text-align: left; + width: 84%; + display: inline-block; + overflow-wrap: break-word; +} +.right { + text-align: right; + width: 15%; + display: inline-block; +} +.popup-form { + padding-top: 10px; + padding-left: 15px; +} +.console { + display: flex; + flex: 1; + flex-direction: column; + background-color: #F9F9F9; + color: #545454; +} +.console-line { + overflow-wrap: break-word; + flex: 0; + flex-basis: auto; + border: 0; + margin-left: 5px; + margin-bottom: 5px; +} +body { + font-family: 'Gloria Hallelujah', cursive; + font-weight: 400; + font-size: 19px; + letter-spacing: 0.05em; + line-height: 2; +} diff --git a/src/userlib/js/bootstrap/candid/wired.ts b/src/userlib/js/bootstrap/candid/wired.ts new file mode 100644 index 0000000000..32246b1fa4 --- /dev/null +++ b/src/userlib/js/bootstrap/candid/wired.ts @@ -0,0 +1,186 @@ +import { CanisterId, IDL } from '@internet-computer/userlib'; +import BigNumber from 'bignumber.js'; +import { WiredCombo, WiredItem } from 'wired-elements'; +import * as UI from './candid-core'; + +// tslint:disable:max-classes-per-file +type InputBox = UI.InputBox; + +const InputConfig: UI.UIConfig = { parse: parsePrimitive }; +const FormConfig: UI.FormConfig = { render: renderInput, container: 'div' }; + +const inputBox = (t: IDL.Type, config: Partial) => { + return new UI.InputBox(t, {...InputConfig, ...config}); +}; +const recordForm = (fields: Array<[string, IDL.Type]>, config: Partial) => { + return new UI.RecordForm(fields, {...FormConfig, ...config}); +}; +const variantForm = (fields: Array<[string, IDL.Type]>, config: Partial) => { + return new VariantForm(fields, {...FormConfig, ...config}); +}; +const optForm = (ty: IDL.Type, config: Partial) => { + return new UI.OptionForm(ty, {...FormConfig, ...config}); +}; +const vecForm = (ty: IDL.Type, config: Partial) => { + return new UI.VecForm(ty, {...FormConfig, ...config}); +}; + +class Render extends IDL.Visitor { + public visitType(t: IDL.Type, d: null): InputBox { + const input = document.createElement('wired-input') as HTMLInputElement; + input.classList.add('argument'); + input.placeholder = t.display(); + return inputBox(t, { input }); + } + public visitNull(t: IDL.NullClass, d: null): InputBox { + return inputBox(t, {}); + } + public visitRecord(t: IDL.RecordClass, fields: Array<[string, IDL.Type]>, d: null): InputBox { + const form = recordForm(fields, {}); + return inputBox(t, { form }); + } + public visitVariant(t: IDL.VariantClass, fields: Array<[string, IDL.Type]>, d: null): InputBox { + const select = document.createElement('wired-combo'); + for (const [key, type] of fields) { + const option = document.createElement('wired-item') as WiredItem; + option.innerText = key; + option.value = key; + select.appendChild(option); + } + select.classList.add('open'); + const form = variantForm(fields, { open: select, event: 'selected' }); + return inputBox(t, { form }); + } + public visitOpt(t: IDL.OptClass, ty: IDL.Type, d: null): InputBox { + const checkbox = document.createElement('wired-checkbox'); + checkbox.classList.add('open'); + const form = optForm(ty, { open: checkbox, event: 'change' }); + return inputBox(t, { form }); + } + public visitVec(t: IDL.VecClass, ty: IDL.Type, d: null): InputBox { + const len = document.createElement('wired-input') as HTMLInputElement; + len.type = 'number'; + len.min = '0'; + len.max = '100'; + len.style.width = '3em'; + len.placeholder = 'len'; + len.classList.add('open'); + const form = vecForm(ty, { open: len, event: 'change' }); + return inputBox(t, { form }); + } + public visitRec(t: IDL.RecClass, ty: IDL.ConstructType, d: null): InputBox { + return renderInput(ty); + } +} + +class VariantForm extends UI.InputForm { + constructor(public fields: Array<[string, IDL.Type]>, public ui: UI.FormConfig) { + super(ui); + } + public generateForm(): void { + const key = (this.ui.open as WiredCombo).selected; + for (const [k, t] of this.fields) { + if (key === k) { + const variant = this.ui.render(t); + this.form = [variant]; + return; + } + } + } + public parse(config: UI.ParseConfig): Record | undefined { + const select = this.ui.open as WiredCombo; + const selected = select.selected!; + const value = this.form[0].parse(config); + if (value === undefined) { + return undefined; + } + const v: Record = {}; + v[selected] = value; + return v; + } +} + +class Parse extends IDL.Visitor { + public visitNull(t: IDL.NullClass, v: string): null { + return null; + } + public visitBool(t: IDL.BoolClass, v: string): boolean { + if (v === 'true') { + return true; + } + if (v === 'false') { + return false; + } + throw new Error(`Cannot parse ${v} as boolean`); + } + public visitText(t: IDL.TextClass, v: string): string { + return v; + } + public visitInt(t: IDL.IntClass, v: string): BigNumber { + return new BigNumber(v); + } + public visitNat(t: IDL.NatClass, v: string): BigNumber { + return new BigNumber(v); + } + public visitFixedInt(t: IDL.FixedIntClass, v: string): BigNumber { + return new BigNumber(v); + } + public visitFixedNat(t: IDL.FixedNatClass, v: string): BigNumber { + return new BigNumber(v); + } + public visitPrincipal(t: IDL.PrincipalClass, v: string): CanisterId { + return CanisterId.fromText(v); + } + public visitService(t: IDL.ServiceClass, v: string): CanisterId { + return CanisterId.fromText(v); + } + public visitFunc(t: IDL.FuncClass, v: string): [CanisterId, string] { + const x = v.split('.', 2); + return [CanisterId.fromText(x[0]), x[1]]; + } +} + +class Random extends IDL.Visitor { + public visitNull(t: IDL.NullClass, v: string): null { + return null; + } + public visitBool(t: IDL.BoolClass, v: string): boolean { + return Math.random() < 0.5; + } + public visitText(t: IDL.TextClass, v: string): string { + return Math.random().toString(36).substring(6); + } + public visitInt(t: IDL.IntClass, v: string): BigNumber { + return new BigNumber(this.generateNumber(true)); + } + public visitNat(t: IDL.NatClass, v: string): BigNumber { + return new BigNumber(this.generateNumber(false)); + } + public visitFixedInt(t: IDL.FixedIntClass, v: string): BigNumber { + return new BigNumber(this.generateNumber(true)); + } + public visitFixedNat(t: IDL.FixedNatClass, v: string): BigNumber { + return new BigNumber(this.generateNumber(false)); + } + private generateNumber(signed: boolean): number { + const num = Math.floor(Math.random() * 100); + if (signed && Math.random() < 0.5) { + return -num; + } else { + return num; + } + } +} + +export function renderInput(t: IDL.Type): InputBox { + return t.accept(new Render(), null); +} + +function parsePrimitive(t: IDL.Type, config: UI.ParseConfig, d: string) { + if (config.random && d === '') { + return t.accept(new Random(), d); + } else { + return t.accept(new Parse(), d); + } +} + diff --git a/src/userlib/js/package-lock.json b/src/userlib/js/package-lock.json index 0c27cd8b7b..3b82bd89b6 100644 --- a/src/userlib/js/package-lock.json +++ b/src/userlib/js/package-lock.json @@ -4862,6 +4862,19 @@ "type-check": "~0.3.2" } }, + "lit-element": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.2.1.tgz", + "integrity": "sha512-ipDcgQ1EpW6Va2Z6dWm79jYdimVepO5GL0eYkZrFvdr0OD/1N260Q9DH+K5HXHFrRoC7dOg+ZpED2XE0TgGdXw==", + "requires": { + "lit-html": "^1.0.0" + } + }, + "lit-html": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.1.2.tgz", + "integrity": "sha512-FFlUMKHKi+qG1x1iHNZ1hrtc/zHmfYTyrSvs3/wBTvaNtpZjOZGWzU7efGYVpgp6KvWeKF6ql9/KsCq6Z/mEDA==" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -6375,6 +6388,14 @@ "inherits": "^2.0.1" } }, + "roughjs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-3.1.0.tgz", + "integrity": "sha512-WJIKyWxBlEIuMeK0foUZD1KVYzT6Dn62ksawZrlu3BzxUxgtPdnlCMDgX/C3N5gxj/AMRazstKOFm70tqTo5Bw==", + "requires": { + "workly": "^1.2.0" + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -7822,6 +7843,253 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wired-button": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-button/-/wired-button-2.0.0.tgz", + "integrity": "sha512-uIa0yXB6bzGTR1yvkOk4bh1YO2JCNKUIQqESV/KCoOF/c6vhLCLyJYzNz1/li8G1S6LDjNx7Hptd2ZDwYsRMbw==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-calendar": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-calendar/-/wired-calendar-2.0.0.tgz", + "integrity": "sha512-4+ROHviTGIDBNOYo6lqYzsBwzXkY7F+HWMAnMavB0YSUXP3GeD4o3DowMYVr2k+b0EL5QNZ09Ht1n+6mwnCn5g==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-card": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-card/-/wired-card-2.0.0.tgz", + "integrity": "sha512-76X8cDja7xAfk5foqDbibmx8F0VVxKraJoL+Dzmo5zwb0jzF6tO+0gBBTtndmvYllyXbOOcfriuxtgZmZphWQw==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-checkbox": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-checkbox/-/wired-checkbox-2.0.0.tgz", + "integrity": "sha512-xm+g1BEKGXefJbyq4JqD5rpUUt3mBRyHsFIRsISuVsOAao2xCCguewsNntJea7O1IH7Ev8mTcObq6DqIRNGifA==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-combo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-combo/-/wired-combo-2.0.0.tgz", + "integrity": "sha512-dYp7iEk3sNe/tA8fFHtj0u8J5KVrp/aHXalRcw2AW0cyriC3wS0HIspyvCE7NMZELzIVAMUIPh6DC9nAAioLww==", + "requires": { + "wired-card": "^2.0.0", + "wired-lib": "^2.0.0" + } + }, + "wired-dialog": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-dialog/-/wired-dialog-2.0.0.tgz", + "integrity": "sha512-sLzyKE8fDYwSksI5BaHGCxc72lc2ueehBqR9LsFLK7Zur+tT141CGk0d8kuF73ATDoVMEsghFLVnWnqXzx6otg==", + "requires": { + "wired-card": "^2.0.0" + } + }, + "wired-divider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-divider/-/wired-divider-2.0.0.tgz", + "integrity": "sha512-AsUcsuRUthGCMZhPyk32hDd8TngepGaeFrL0OjpoTOycHeJ3GmA2gqQ15ymsNshji959SRGmuBmfBCWTSfEVGA==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-elements": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-elements/-/wired-elements-2.0.0.tgz", + "integrity": "sha512-+GzjdUiZvxKZSiKa7leFZNws0LU7Q2S1srjMunZTbqMW1bJcxo/hMBzv8mwkgsllqtPSTqFVc2RbXXmeCccZzg==", + "requires": { + "wired-button": "^2.0.0", + "wired-calendar": "^2.0.0", + "wired-card": "^2.0.0", + "wired-checkbox": "^2.0.0", + "wired-combo": "^2.0.0", + "wired-dialog": "^2.0.0", + "wired-divider": "^2.0.0", + "wired-fab": "^2.0.0", + "wired-icon-button": "^2.0.0", + "wired-image": "^2.0.0", + "wired-input": "^2.0.0", + "wired-item": "^2.0.0", + "wired-lib": "^2.0.0", + "wired-link": "^2.0.0", + "wired-listbox": "^2.0.0", + "wired-progress": "^2.0.0", + "wired-radio": "^2.0.0", + "wired-radio-group": "^2.0.0", + "wired-search-input": "^2.0.0", + "wired-slider": "^2.0.0", + "wired-spinner": "^2.0.0", + "wired-tab": "^2.0.0", + "wired-tabs": "^2.0.0", + "wired-textarea": "^2.0.0", + "wired-toggle": "^2.0.0", + "wired-video": "^2.0.0" + } + }, + "wired-fab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-fab/-/wired-fab-2.0.0.tgz", + "integrity": "sha512-lAwn5IS0hKHFpxF4H+7Mnv7gPZ+ymbsMG1CBClQX835wnHBJZ0NPjFA8JBHwUGwGFu/LRTWJZTiZwREddrG5hw==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-icon-button": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-icon-button/-/wired-icon-button-2.0.0.tgz", + "integrity": "sha512-9ZyiLZDV5uHrb1Oi3EjR0+sa5hiSqLiqI2aqc/FI3N8geRae4ubUhOVAxCqPBKy8U0lqMHQp+1PHu4PvD2wyyw==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-image": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-image/-/wired-image-2.0.0.tgz", + "integrity": "sha512-87ZiEamHHcnkmqP1IsMf0L2MP9kYyB84sso8/6O3Z1zbS1ECLdHv3Kq3oKr74zuM8BTrv7UPiJAfbpnFPdBc9g==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-input": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-input/-/wired-input-2.0.0.tgz", + "integrity": "sha512-iNjtRFEJO4BUSQAn61EfNaPE3GmgiRL93BjM0wmLmyjCgwipu6M2wPriRqhZbiNnsGPe0r2tmhhdMyTHOmlWTQ==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-item/-/wired-item-2.0.0.tgz", + "integrity": "sha512-ILL8oJuCU5gQMI9vMBRoW+ycqc/fFYnLBboPeExYjETUD/LaEMiDcDZpVGlNpJjwBu73hvfdiDBxN7jeDjZT5w==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-lib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-lib/-/wired-lib-2.0.0.tgz", + "integrity": "sha512-ro8aBzI0GE9h2/aTBU2Pfqbrxi7p+X5xIu2EgxSS/QoYK0QN9r0O5mFKeQOFRlYwn4RE5SdMgJFM/p9xK5XI3w==", + "requires": { + "lit-element": "^2.2.1", + "roughjs": "^3.1.0" + } + }, + "wired-link": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-link/-/wired-link-2.0.0.tgz", + "integrity": "sha512-aLDUxvoF9cGZmIFwEvjDNOzZPb/gdcnBYOeX9Jm2dhqiUWJyMJBNwfIRgIu7A1SZZ9X/NekIZQeko6gcJHf9Tw==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-listbox": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-listbox/-/wired-listbox-2.0.0.tgz", + "integrity": "sha512-VqSsI3VWmv28nkMvSe2YN9V+SWnbOyLN3crKqHUpjEV04ccX6H7w/AHQvYyEkDy+4p4IO78XVtjIwEI4zr4U9g==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-progress/-/wired-progress-2.0.0.tgz", + "integrity": "sha512-wpyCnteuiOwddzaUd7Z2YC45ecEbQ9PmcWASTDipiQudW8C26ynz8Ipiy/owpieQ3RCAo5IppG+sSNL2ykQuTA==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-radio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-radio/-/wired-radio-2.0.0.tgz", + "integrity": "sha512-HOOqVv2ZujdO8eLic3Tm+FtBhxWmzAk44PbyUwjQPZ1kmS9XKnFtJLWxx75+rh42pXuz3SuZWAdSDGnG3WVyPw==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-radio-group": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-radio-group/-/wired-radio-group-2.0.0.tgz", + "integrity": "sha512-2HlbhSBHBbT2nbBYC5e8RHbhW8lPARCxiYqVbcIUdUuOfyP9+Ox6MfRIv1CQR0kjUDJQpFAIb2orUc/FhnyqOg==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-search-input": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-search-input/-/wired-search-input-2.0.0.tgz", + "integrity": "sha512-ybhGraXIS0dvMD2O8+9DVp5+WjTVV86LUAnNm4p7ehKrld+9gQDVdwEtu1r6IeOk1J9hRCRSPeqwC9qXxyne8Q==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-slider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-slider/-/wired-slider-2.0.0.tgz", + "integrity": "sha512-MntrSsDjtPrOtJbX7Mo5dYaOwBo8rcb3NAyGTG3zE4O7nCx+pMz+g0NzXogkreMnaxIM969SDRUG+ksxxE/Rcg==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-spinner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-spinner/-/wired-spinner-2.0.0.tgz", + "integrity": "sha512-mDFAO/hctTrQy4K9pd4jwBci3pT9+oRNxuaUQOIYfG53kdc7U/ZXKv2Oc93k4/xTAw34H9Gmo1m7ihqiHqDPKQ==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-tab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-tab/-/wired-tab-2.0.0.tgz", + "integrity": "sha512-gd0HLQIimhaRYvW5k3sYWr2lDB4vQusgBNyPylW0165JtOHXdbXC/hNHv1qnEB2NgJ3dsmjKXzdsh+41E5xbRg==", + "requires": { + "wired-item": "^2.0.0", + "wired-lib": "^2.0.0" + } + }, + "wired-tabs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-tabs/-/wired-tabs-2.0.0.tgz", + "integrity": "sha512-+q7mBRNp93R8cSr2wiK5utE9hXH2M+98Xtv8bnyfB14zANI4CxC2PHbumk6u0lK/Q1R8M1TjhIbFlLGEXx8TkA==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-textarea": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-textarea/-/wired-textarea-2.0.0.tgz", + "integrity": "sha512-cc63rjFKTYOmK/DCtO7fDLhOELiCYvSDVhkFwOfccOBu+bi6VOe1iHVVkzx7pNrmkofk00bWkGFw1PkoZ/GSKA==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-toggle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-toggle/-/wired-toggle-2.0.0.tgz", + "integrity": "sha512-Cdpg3rksHc7h6mkgSipYQ4yh5xZJURfRZHq3rYq8H9ttZaJR7ng641Yrrof/BE9xaGgQZk+OVl1+FJZ3YRprlw==", + "requires": { + "wired-lib": "^2.0.0" + } + }, + "wired-video": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wired-video/-/wired-video-2.0.0.tgz", + "integrity": "sha512-85X8FEhlAOBvjgcRqRxZqP6JDSfVYSXT+ekc7/pUD09s3fUNlLldzdKVA8wkrXJwE3UIY/J/NfiBQXOxtOQWiA==", + "requires": { + "wired-icon-button": "^2.0.0", + "wired-lib": "^2.0.0", + "wired-progress": "^2.0.0", + "wired-slider": "^2.0.0" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -7843,6 +8111,11 @@ "errno": "~0.1.7" } }, + "workly": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/workly/-/workly-1.3.1.tgz", + "integrity": "sha512-1hI5IvagEAdCj81Vtc9Rn3DZkNJ4o2LexbpFFUJjZWlr8aBbGGm95Nu84ZC2EvzJpfm2j+4s+bVjNFeWAp03/A==" + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", diff --git a/src/userlib/js/package.json b/src/userlib/js/package.json index af884b15ea..0b2589834d 100644 --- a/src/userlib/js/package.json +++ b/src/userlib/js/package.json @@ -21,6 +21,7 @@ "buffer-pipe": "0.0.4", "crc": "3.8.0", "simple-cbor": "^0.2.0", + "wired-elements": "^2.0.0", "tweetnacl": "^1.0.1" }, "devDependencies": {