dualsense-ts 5.1.8 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -9
- package/dist/hid/web_hid_provider.d.ts.map +1 -1
- package/dist/hid/web_hid_provider.js +2 -1
- package/dist/hid/web_hid_provider.js.map +1 -1
- package/nodehid_example/debug.ts +66 -0
- package/nodehid_example/node-hid.js +1 -0
- package/package.json +4 -4
- package/src/hid/web_hid_provider.ts +2 -1
- package/webhid_example/README.md +8 -0
- package/webhid_example/build/404.html +39 -0
- package/webhid_example/build/README.md +6 -0
- package/webhid_example/build/asset-manifest.json +23 -0
- package/webhid_example/build/favicon-16x16.png +0 -0
- package/webhid_example/build/favicon-32x32.png +0 -0
- package/webhid_example/build/favicon.ico +0 -0
- package/webhid_example/build/index.html +1 -0
- package/webhid_example/build/logo192.png +0 -0
- package/webhid_example/build/logo512.png +0 -0
- package/webhid_example/build/manifest.json +25 -0
- package/webhid_example/build/robots.txt +3 -0
- package/webhid_example/build/site.webmanifest +1 -0
- package/webhid_example/build/static/css/main.6dc04a6e.css +2 -0
- package/webhid_example/build/static/css/main.6dc04a6e.css.map +1 -0
- package/webhid_example/build/static/js/787.b12b0301.chunk.js +2 -0
- package/webhid_example/build/static/js/787.b12b0301.chunk.js.map +1 -0
- package/webhid_example/build/static/js/main.5428c4b5.js +3 -0
- package/webhid_example/build/static/js/main.5428c4b5.js.LICENSE.txt +95 -0
- package/webhid_example/build/static/js/main.5428c4b5.js.map +1 -0
- package/webhid_example/build/static/media/blueprint-icons-16.14e70b6793c6b84b0760.eot +0 -0
- package/webhid_example/build/static/media/blueprint-icons-16.4fdbe723235ba0fc46fb.ttf +0 -0
- package/webhid_example/build/static/media/blueprint-icons-16.582f87288ff1d1f0dfae.woff2 +0 -0
- package/webhid_example/build/static/media/blueprint-icons-16.f5b1a9d55dd59fe717ab.woff +0 -0
- package/webhid_example/build/static/media/blueprint-icons-20.5e8bcc2fa7b81492f163.ttf +0 -0
- package/webhid_example/build/static/media/blueprint-icons-20.7f441e84a24ef32d88d9.woff +0 -0
- package/webhid_example/build/static/media/blueprint-icons-20.f356a02cac03708c9328.woff2 +0 -0
- package/webhid_example/build/static/media/blueprint-icons-20.f7d18295d5c386a1a9b5.eot +0 -0
- package/webhid_example/package.json +93 -0
- package/webhid_example/public/404.html +39 -0
- package/webhid_example/public/README.md +6 -0
- package/webhid_example/public/favicon-16x16.png +0 -0
- package/webhid_example/public/favicon-32x32.png +0 -0
- package/webhid_example/public/favicon.ico +0 -0
- package/webhid_example/public/index.html +39 -0
- package/webhid_example/public/logo192.png +0 -0
- package/webhid_example/public/logo512.png +0 -0
- package/webhid_example/public/manifest.json +25 -0
- package/webhid_example/public/robots.txt +3 -0
- package/webhid_example/public/site.webmanifest +1 -0
- package/webhid_example/src/App.tsx +26 -0
- package/webhid_example/src/Controller.tsx +32 -0
- package/webhid_example/src/hud/ControllerConnection.tsx +91 -0
- package/webhid_example/src/hud/RenderedElement.tsx +13 -0
- package/webhid_example/src/hud/Reticle.tsx +76 -0
- package/webhid_example/src/hud/Spinner.tsx +53 -0
- package/webhid_example/src/hud/index.tsx +8 -0
- package/webhid_example/src/hud/react-zdog.d.ts +37 -0
- package/webhid_example/src/index.css +6 -0
- package/webhid_example/src/index.tsx +24 -0
- package/webhid_example/src/react-app-env.d.ts +1 -0
- package/webhid_example/src/reportWebVitals.ts +15 -0
- package/webhid_example/src/setupTests.ts +1 -0
- package/webhid_example/tsconfig.json +26 -0
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ import { Dualsense } from "dualsense-ts";
|
|
|
27
27
|
const controller = new Dualsense();
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
If the device
|
|
30
|
+
If the device disconnects, `dualsense-ts` will quietly wait for it to come back. You can monitor the connection status with `controller.connection` using any of the Input APIs listed in the next section.
|
|
31
31
|
|
|
32
32
|
```typescript
|
|
33
33
|
const connected = controller.connection.active
|
|
@@ -37,12 +37,6 @@ controller.connection.on("change", ({ active }) = > {
|
|
|
37
37
|
});
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
### Wired vs Bluetooth
|
|
41
|
-
|
|
42
|
-
In node.js, wired and wireless bluetooth connections are supported.
|
|
43
|
-
|
|
44
|
-
In the browser, only wireless connections are supported.
|
|
45
|
-
|
|
46
40
|
### Input APIs
|
|
47
41
|
|
|
48
42
|
`dualsense-ts` provides several interfaces for reading input:
|
|
@@ -69,7 +63,7 @@ controller.touchpad.right.contact.state; // false
|
|
|
69
63
|
+controller.touchpad.right.x; // -0.44, -1 to 1
|
|
70
64
|
```
|
|
71
65
|
|
|
72
|
-
- _Callbacks_: Each input is an EventEmitter
|
|
66
|
+
- _Callbacks_: Each input is an EventEmitter or EventTarget that provides `input`, `press`, `release`, and `change` events
|
|
73
67
|
|
|
74
68
|
```typescript
|
|
75
69
|
// Change events are triggered only when an input's value changes
|
|
@@ -138,7 +132,7 @@ controller.right.trigger.on("change", (trigger) => {
|
|
|
138
132
|
|
|
139
133
|
### With React
|
|
140
134
|
|
|
141
|
-
|
|
135
|
+
Check out [the example app](./webhid_example/) for more details.
|
|
142
136
|
|
|
143
137
|
```typescript
|
|
144
138
|
// DualsenseContext.tsx
|
|
@@ -148,6 +142,18 @@ import { Dualsense } from "dualsense-ts";
|
|
|
148
142
|
const controller = new Dualsense();
|
|
149
143
|
export const DualsenseContext = createContext(controller);
|
|
150
144
|
DualsenseContext.displayName = "DualsenseContext";
|
|
145
|
+
|
|
146
|
+
controller.connection.on("change", ({ state }) => {
|
|
147
|
+
console.group("dualsense-ts");
|
|
148
|
+
console.log(`Controller ${state ? "" : "dis"}connected`);
|
|
149
|
+
console.groupEnd();
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
controller.hid.on("error", (err) => {
|
|
153
|
+
console.group("dualsense-ts");
|
|
154
|
+
console.log(err);
|
|
155
|
+
console.groupEnd();
|
|
156
|
+
});
|
|
151
157
|
```
|
|
152
158
|
|
|
153
159
|
The user will need to grant permission before we can access new devices using the WebHID API. The `Dualsense` class provides a callback that can be used as a handler for `onClick` or [other user-triggered events](https://developer.mozilla.org/en-US/docs/Web/Security/User_activation):
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web_hid_provider.d.ts","sourceRoot":"","sources":["../../src/hid/web_hid_provider.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,EAIlB,MAAM,gBAAgB,CAAC;AAExB,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAY;IACpB,QAAQ,EAAE,OAAO,CAAQ;;IAehC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAc/B;;;;OAIG;IACH,UAAU,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC;IAsBpC,OAAO,IAAI,IAAI;IAIf,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,UAAU,IAAI,IAAI;IASZ,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,iBAAiB;
|
|
1
|
+
{"version":3,"file":"web_hid_provider.d.ts","sourceRoot":"","sources":["../../src/hid/web_hid_provider.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,EAIlB,MAAM,gBAAgB,CAAC;AAExB,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAY;IACpB,QAAQ,EAAE,OAAO,CAAQ;;IAehC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAc/B;;;;OAIG;IACH,UAAU,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC;IAsBpC,OAAO,IAAI,IAAI;IAIf,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,UAAU,IAAI,IAAI;IASZ,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,iBAAiB;CA4D7C"}
|
|
@@ -77,7 +77,8 @@ class WebHIDProvider extends hid_provider_1.HIDProvider {
|
|
|
77
77
|
}
|
|
78
78
|
process(buffer) {
|
|
79
79
|
// Bluetooth buffer starts with an extra byte
|
|
80
|
-
|
|
80
|
+
this.wireless = buffer.byteLength > 70;
|
|
81
|
+
const report = new DataView(buffer.buffer, this.wireless ? 1 : 0);
|
|
81
82
|
const mainButtons = report.getUint8(7);
|
|
82
83
|
const miscButtons = report.getUint8(8);
|
|
83
84
|
const lastButtons = report.getUint8(9);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web_hid_provider.js","sourceRoot":"","sources":["../../src/hid/web_hid_provider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"web_hid_provider.js","sourceRoot":"","sources":["../../src/hid/web_hid_provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Dualsense } from "../src/dualsense";
|
|
2
|
+
import { TriggerMode } from "../src/hid";
|
|
3
|
+
|
|
4
|
+
function main() {
|
|
5
|
+
try {
|
|
6
|
+
const controller = new Dualsense();
|
|
7
|
+
console.log(`Connected: ${controller.toString()}`);
|
|
8
|
+
|
|
9
|
+
controller.left.trigger.on("change", (trigger) => {
|
|
10
|
+
controller.left.rumble(trigger.magnitude);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
controller.right.trigger.on("change", (trigger) => {
|
|
14
|
+
controller.right.rumble(trigger.magnitude);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
controller.triangle.on("press", () => {
|
|
18
|
+
controller.rumble(0.5);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
controller.triangle.on("release", () => {
|
|
22
|
+
controller.rumble(0);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
controller.left.analog.on("change", (analog) => {
|
|
26
|
+
const { x, y } = analog;
|
|
27
|
+
const state = {
|
|
28
|
+
Analog: {
|
|
29
|
+
Magnitude: analog.magnitude,
|
|
30
|
+
Direction: analog.direction,
|
|
31
|
+
Force: analog.force,
|
|
32
|
+
Threshold: analog.threshold,
|
|
33
|
+
Deadzone: analog.deadzone,
|
|
34
|
+
X: {
|
|
35
|
+
State: x.state,
|
|
36
|
+
Magnitude: x.magnitude,
|
|
37
|
+
Force: x.force,
|
|
38
|
+
Threshold: x.threshold,
|
|
39
|
+
Deadzone: x.deadzone,
|
|
40
|
+
},
|
|
41
|
+
Y: {
|
|
42
|
+
State: y.state,
|
|
43
|
+
Magnitude: y.magnitude,
|
|
44
|
+
Force: y.force,
|
|
45
|
+
Threshold: y.threshold,
|
|
46
|
+
Deadzone: y.deadzone,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
console.log(state);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
controller.cross.on("change", (input) => {
|
|
54
|
+
controller.hid.setRightTriggerFeedback(TriggerMode.Pulse, [
|
|
55
|
+
controller.left.analog.direction * 40.5,
|
|
56
|
+
128,
|
|
57
|
+
controller.right.analog.direction * 40.5,
|
|
58
|
+
]);
|
|
59
|
+
});
|
|
60
|
+
} catch (err) {
|
|
61
|
+
console.log(err);
|
|
62
|
+
setTimeout(main, 100);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dualsense-ts",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.2.0",
|
|
4
4
|
"description": "A natural interface for your DualSense controller, with Typescript",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dualsense",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"coverage": "jest src --coverage --verbose --forceExit",
|
|
46
46
|
"coverage:watch": "jest src --coverage --verbose --watch",
|
|
47
47
|
"barrels": "barrelsby -d src -D -l replace -e 'spec.ts$'",
|
|
48
|
-
"debug": "node --inspect --enable-source-maps --experimental-specifier-resolution=node --loader ts-node/esm ./
|
|
48
|
+
"debug": "node --inspect --enable-source-maps --experimental-specifier-resolution=node --loader ts-node/esm ./nodehid_example/debug.ts"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"node-hid": "^2.1.1"
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@types/jest": "^27.5.0",
|
|
60
|
-
"@types/node": "^
|
|
60
|
+
"@types/node": "^20.1.4",
|
|
61
61
|
"@types/node-hid": "^1.3.1",
|
|
62
62
|
"@types/w3c-web-hid": "^1.0.3",
|
|
63
63
|
"@typescript-eslint/eslint-plugin": "^5.23.0",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"html-webpack-plugin": "^5.5.0",
|
|
70
70
|
"jest": "^27.5.1",
|
|
71
71
|
"node-hid": "^2.1.1",
|
|
72
|
-
"prettier": "^
|
|
72
|
+
"prettier": "^3.0.0",
|
|
73
73
|
"ts-jest": "^27.1.3",
|
|
74
74
|
"ts-loader": "^9.3.1",
|
|
75
75
|
"ts-node": "^10.7.0",
|
|
@@ -88,7 +88,8 @@ export class WebHIDProvider extends HIDProvider {
|
|
|
88
88
|
|
|
89
89
|
process(buffer: DataView): DualsenseHIDState {
|
|
90
90
|
// Bluetooth buffer starts with an extra byte
|
|
91
|
-
|
|
91
|
+
this.wireless = buffer.byteLength > 70;
|
|
92
|
+
const report = new DataView(buffer.buffer, this.wireless ? 1 : 0);
|
|
92
93
|
|
|
93
94
|
const mainButtons = report.getUint8(7);
|
|
94
95
|
const miscButtons = report.getUint8(8);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
## `dualsense-ts` React Example
|
|
2
|
+
|
|
3
|
+
This is a simple example app that uses `dualsense-ts` to build interactive components with React.
|
|
4
|
+
|
|
5
|
+
- [Controller.tsx](./src/Controller.tsx) sets up a context for the controller
|
|
6
|
+
- [App.tsx](./src/App.tsx) provides the controller context to the components
|
|
7
|
+
- [ControllerConnection.tsx](./src/hud/ControllerConnection.tsx) requests permission to use the controller
|
|
8
|
+
- [Reticle.tsx](./src/hud/Reticle.tsx) utilizes inputs from the controller
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>noskop</title>
|
|
6
|
+
<script type="text/javascript">
|
|
7
|
+
// Single Page Apps for GitHub Pages
|
|
8
|
+
// MIT License
|
|
9
|
+
// https://github.com/rafgraph/spa-github-pages
|
|
10
|
+
// This script takes the current url and converts the path and query
|
|
11
|
+
// string into just a query string, and then redirects the browser
|
|
12
|
+
// to the new url with only a query string and hash fragment,
|
|
13
|
+
// e.g. https://www.foo.tld/one/two?a=b&c=d#qwe, becomes
|
|
14
|
+
// https://www.foo.tld/?/one/two&a=b~and~c=d#qwe
|
|
15
|
+
// Note: this 404.html file must be at least 512 bytes for it to work
|
|
16
|
+
// with Internet Explorer (it is currently > 512 bytes)
|
|
17
|
+
|
|
18
|
+
// If you're creating a Project Pages site and NOT using a custom domain,
|
|
19
|
+
// then set pathSegmentsToKeep to 1 (enterprise users may need to set it to > 1).
|
|
20
|
+
// This way the code will only replace the route part of the path, and not
|
|
21
|
+
// the real directory in which the app resides, for example:
|
|
22
|
+
// https://username.github.io/repo-name/one/two?a=b&c=d#qwe becomes
|
|
23
|
+
// https://username.github.io/repo-name/?/one/two&a=b~and~c=d#qwe
|
|
24
|
+
// Otherwise, leave pathSegmentsToKeep as 0.
|
|
25
|
+
var pathSegmentsToKeep = 0;
|
|
26
|
+
|
|
27
|
+
var l = window.location;
|
|
28
|
+
l.replace(
|
|
29
|
+
l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') +
|
|
30
|
+
l.pathname.split('/').slice(0, 1 + pathSegmentsToKeep).join('/') + '/?/' +
|
|
31
|
+
l.pathname.slice(1).split('/').slice(pathSegmentsToKeep).join('/').replace(/&/g, '~and~') +
|
|
32
|
+
(l.search ? '&' + l.search.slice(1).replace(/&/g, '~and~') : '') +
|
|
33
|
+
l.hash
|
|
34
|
+
);
|
|
35
|
+
</script>
|
|
36
|
+
</head>
|
|
37
|
+
<body>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
The favicon was generated using the following graphics from Twitter Twemoji:
|
|
2
|
+
|
|
3
|
+
- Graphics Title: 1f52c.svg
|
|
4
|
+
- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji)
|
|
5
|
+
- Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f52c.svg
|
|
6
|
+
- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": {
|
|
3
|
+
"main.css": "/static/css/main.6dc04a6e.css",
|
|
4
|
+
"main.js": "/static/js/main.5428c4b5.js",
|
|
5
|
+
"static/js/787.b12b0301.chunk.js": "/static/js/787.b12b0301.chunk.js",
|
|
6
|
+
"static/media/blueprint-icons-20.eot?": "/static/media/blueprint-icons-20.f7d18295d5c386a1a9b5.eot",
|
|
7
|
+
"static/media/blueprint-icons-20.ttf?": "/static/media/blueprint-icons-20.5e8bcc2fa7b81492f163.ttf",
|
|
8
|
+
"static/media/blueprint-icons-16.eot?": "/static/media/blueprint-icons-16.14e70b6793c6b84b0760.eot",
|
|
9
|
+
"static/media/blueprint-icons-16.ttf?": "/static/media/blueprint-icons-16.4fdbe723235ba0fc46fb.ttf",
|
|
10
|
+
"static/media/blueprint-icons-20.woff?": "/static/media/blueprint-icons-20.7f441e84a24ef32d88d9.woff",
|
|
11
|
+
"static/media/blueprint-icons-16.woff?": "/static/media/blueprint-icons-16.f5b1a9d55dd59fe717ab.woff",
|
|
12
|
+
"static/media/blueprint-icons-20.woff2?": "/static/media/blueprint-icons-20.f356a02cac03708c9328.woff2",
|
|
13
|
+
"static/media/blueprint-icons-16.woff2?": "/static/media/blueprint-icons-16.582f87288ff1d1f0dfae.woff2",
|
|
14
|
+
"index.html": "/index.html",
|
|
15
|
+
"main.6dc04a6e.css.map": "/static/css/main.6dc04a6e.css.map",
|
|
16
|
+
"main.5428c4b5.js.map": "/static/js/main.5428c4b5.js.map",
|
|
17
|
+
"787.b12b0301.chunk.js.map": "/static/js/787.b12b0301.chunk.js.map"
|
|
18
|
+
},
|
|
19
|
+
"entrypoints": [
|
|
20
|
+
"static/css/main.6dc04a6e.css",
|
|
21
|
+
"static/js/main.5428c4b5.js"
|
|
22
|
+
]
|
|
23
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/manifest.json"/><script type="text/javascript">!function(n){if("/"===n.search[1]){var a=n.search.slice(1).split("&").map((function(n){return n.replace(/~and~/g,"&")})).join("?");window.history.replaceState(null,null,n.pathname.slice(0,-1)+a+n.hash)}}(window.location)</script><title>dualsense-ts</title><script defer="defer" src="/static/js/main.5428c4b5.js"></script><link href="/static/css/main.6dc04a6e.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"short_name": "dualsense-ts",
|
|
3
|
+
"name": "dualsense-ts example app",
|
|
4
|
+
"icons": [
|
|
5
|
+
{
|
|
6
|
+
"src": "favicon.ico",
|
|
7
|
+
"sizes": "64x64 32x32 24x24 16x16",
|
|
8
|
+
"type": "image/x-icon"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"src": "logo192.png",
|
|
12
|
+
"type": "image/png",
|
|
13
|
+
"sizes": "192x192"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"src": "logo512.png",
|
|
17
|
+
"type": "image/png",
|
|
18
|
+
"sizes": "512x512"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"start_url": ".",
|
|
22
|
+
"display": "standalone",
|
|
23
|
+
"theme_color": "#000000",
|
|
24
|
+
"background_color": "#ffffff"
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"noskop","short_name":"noskop","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|