@wodzik/cubecore 0.1.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/LICENSE +373 -0
- package/README.md +118 -0
- package/analyze/client.d.ts +18 -0
- package/analyze/client.js +42 -0
- package/analyze/index.d.ts +114 -0
- package/analyze/index.js +151 -0
- package/analyze/rotations.d.ts +3 -0
- package/analyze/rotations.js +15 -0
- package/analyze/roux.d.ts +67 -0
- package/analyze/roux.js +95 -0
- package/analyze/worker.d.ts +6 -0
- package/analyze/worker.js +31 -0
- package/analyze/zz.d.ts +47 -0
- package/analyze/zz.js +102 -0
- package/bld/index.d.ts +14 -0
- package/bld/index.js +14 -0
- package/bld/memo.d.ts +66 -0
- package/bld/memo.js +139 -0
- package/bld/scheme.d.ts +30 -0
- package/bld/scheme.js +35 -0
- package/bld/skin.d.ts +26 -0
- package/bld/skin.js +46 -0
- package/bld/tracker.d.ts +68 -0
- package/bld/tracker.js +145 -0
- package/bluetooth/clock.d.ts +22 -0
- package/bluetooth/clock.js +37 -0
- package/bluetooth/cubeSkins.d.ts +31 -0
- package/bluetooth/cubeSkins.js +32 -0
- package/bluetooth/gyro.d.ts +31 -0
- package/bluetooth/gyro.js +46 -0
- package/bluetooth/index.d.ts +5 -0
- package/bluetooth/index.js +5 -0
- package/bluetooth/session.d.ts +140 -0
- package/bluetooth/session.js +201 -0
- package/bluetooth/simulated.d.ts +52 -0
- package/bluetooth/simulated.js +80 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-cube-definitions.d.ts +38 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-cube-definitions.js +51 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-cube-encrypter.d.ts +35 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-cube-encrypter.js +70 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-cube-protocol.d.ts +273 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-cube-protocol.js +846 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-gen1.d.ts +38 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-gen1.js +340 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-gen234-packet-validate.d.ts +11 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-gen234-packet-validate.js +118 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-mac-salt.d.ts +2 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-mac-salt.js +15 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-smart-cube.d.ts +18 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-smart-cube.js +152 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-smart-timer.d.ts +74 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-smart-timer.js +161 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-write-queue.d.ts +7 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gan-write-queue.js +11 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gatt-characteristic-write.d.ts +2 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/gatt-characteristic-write.js +36 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/index.d.ts +4 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/index.js +4 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/address-hints.d.ts +12 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/address-hints.js +122 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/build-picker-options.d.ts +11 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/build-picker-options.js +55 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/default-optional-services.d.ts +21 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/default-optional-services.js +47 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/device-name-scan-filters.d.ts +6 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/device-name-scan-filters.js +24 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/gatt-snapshot.d.ts +6 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/gatt-snapshot.js +57 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/mac-candidates.d.ts +11 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/mac-candidates.js +67 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/mac-probe-moyu32.d.ts +8 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/mac-probe-moyu32.js +98 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/mac-probe-qiyi.d.ts +8 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/mac-probe-qiyi.js +128 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/moyu32-session-crypto.d.ts +5 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/moyu32-session-crypto.js +60 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/normalize-uuid.d.ts +2 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/normalize-uuid.js +8 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/packet-sanity.d.ts +7 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/packet-sanity.js +142 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/profile-rank.d.ts +6 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/profile-rank.js +21 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/types.d.ts +32 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/attachment/types.js +1 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/ble-utils.d.ts +6 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/ble-utils.js +68 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/connect.d.ts +3 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/connect.js +178 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/cubie-cube.d.ts +16 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/cubie-cube.js +141 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/index.d.ts +11 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/index.js +10 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocol.d.ts +26 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocol.js +8 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/gan.d.ts +3 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/gan.js +265 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/giiker.d.ts +3 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/giiker.js +345 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/gocube.d.ts +15 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/gocube.js +382 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/moyu-mhc.d.ts +3 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/moyu-mhc.js +352 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/moyu-v1.d.ts +57 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/moyu-v1.js +243 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/moyu32.d.ts +3 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/moyu32.js +454 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/qiyi.d.ts +3 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/protocols/qiyi.js +424 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/types.d.ts +78 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/smartcube/types.js +1 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/utils.d.ts +45 -0
- package/bluetooth/vendor/smartcube-web-bluetooth/utils.js +150 -0
- package/cfop/caseData.d.ts +16 -0
- package/cfop/caseData.js +88 -0
- package/cfop/cases.d.ts +42 -0
- package/cfop/cases.js +116 -0
- package/cfop/f2l.d.ts +28 -0
- package/cfop/f2l.js +88 -0
- package/cfop/f2lData.d.ts +15 -0
- package/cfop/f2lData.js +49 -0
- package/cfop/index.d.ts +41 -0
- package/cfop/index.js +110 -0
- package/cfop/slots.d.ts +2 -0
- package/cfop/slots.js +1 -0
- package/core/arrows.d.ts +24 -0
- package/core/arrows.js +22 -0
- package/core/bytes.d.ts +27 -0
- package/core/bytes.js +145 -0
- package/core/centers.d.ts +32 -0
- package/core/centers.js +83 -0
- package/core/checks.d.ts +53 -0
- package/core/checks.js +85 -0
- package/core/cubies.d.ts +45 -0
- package/core/cubies.js +169 -0
- package/core/frames.d.ts +61 -0
- package/core/frames.js +126 -0
- package/core/geometry.d.ts +58 -0
- package/core/geometry.js +132 -0
- package/core/index.d.ts +19 -0
- package/core/index.js +19 -0
- package/core/masks.d.ts +32 -0
- package/core/masks.js +39 -0
- package/core/method.d.ts +35 -0
- package/core/method.js +30 -0
- package/core/moves.d.ts +48 -0
- package/core/moves.js +88 -0
- package/core/notation.d.ts +48 -0
- package/core/notation.js +226 -0
- package/core/physical.d.ts +53 -0
- package/core/physical.js +99 -0
- package/core/practice.d.ts +62 -0
- package/core/practice.js +87 -0
- package/core/sequence.d.ts +90 -0
- package/core/sequence.js +157 -0
- package/core/stages.d.ts +90 -0
- package/core/stages.js +21 -0
- package/core/state.d.ts +55 -0
- package/core/state.js +140 -0
- package/core/stateCodec.d.ts +12 -0
- package/core/stateCodec.js +51 -0
- package/core/stream.d.ts +45 -0
- package/core/stream.js +75 -0
- package/core/tracker.d.ts +62 -0
- package/core/tracker.js +121 -0
- package/element/alg.d.ts +45 -0
- package/element/alg.js +150 -0
- package/element/base.d.ts +2 -0
- package/element/base.js +3 -0
- package/element/bld.d.ts +82 -0
- package/element/bld.js +222 -0
- package/element/index.d.ts +8 -0
- package/element/index.js +21 -0
- package/element/model.d.ts +36 -0
- package/element/model.js +64 -0
- package/element/player.d.ts +196 -0
- package/element/player.js +680 -0
- package/element/practice.d.ts +75 -0
- package/element/practice.js +150 -0
- package/element/scramble.d.ts +50 -0
- package/element/scramble.js +107 -0
- package/element/sequence.d.ts +126 -0
- package/element/sequence.js +254 -0
- package/element/styles.d.ts +32 -0
- package/element/styles.js +196 -0
- package/image/cache.d.ts +21 -0
- package/image/cache.js +66 -0
- package/image/index.d.ts +2 -0
- package/image/index.js +2 -0
- package/image/png-node.d.ts +6 -0
- package/image/png-node.js +10 -0
- package/image/svg.d.ts +36 -0
- package/image/svg.js +215 -0
- package/lbl/index.d.ts +10 -0
- package/lbl/index.js +31 -0
- package/methods/index.d.ts +20 -0
- package/methods/index.js +33 -0
- package/package.json +133 -0
- package/petrus/index.d.ts +11 -0
- package/petrus/index.js +27 -0
- package/react/index.d.ts +176 -0
- package/react/index.js +228 -0
- package/render/arrows.d.ts +68 -0
- package/render/arrows.js +190 -0
- package/render/build/attachments.d.ts +35 -0
- package/render/build/attachments.js +94 -0
- package/render/build/models.d.ts +9 -0
- package/render/build/models.js +27 -0
- package/render/build/tiles.d.ts +48 -0
- package/render/build/tiles.js +194 -0
- package/render/gltf.d.ts +10 -0
- package/render/gltf.js +106 -0
- package/render/index.d.ts +12 -0
- package/render/index.js +12 -0
- package/render/layers.d.ts +21 -0
- package/render/layers.js +24 -0
- package/render/pictures.d.ts +46 -0
- package/render/pictures.js +80 -0
- package/render/pieceModels.d.ts +38 -0
- package/render/pieceModels.js +43 -0
- package/render/renderer.d.ts +165 -0
- package/render/renderer.js +647 -0
- package/render/tile.d.ts +114 -0
- package/render/tile.js +390 -0
- package/render/viewports.d.ts +25 -0
- package/render/viewports.js +26 -0
- package/roux/cmll.d.ts +35 -0
- package/roux/cmll.js +121 -0
- package/roux/cmllData.d.ts +12 -0
- package/roux/cmllData.js +49 -0
- package/roux/index.d.ts +52 -0
- package/roux/index.js +175 -0
- package/skin/attachments.d.ts +82 -0
- package/skin/attachments.js +110 -0
- package/skin/index.d.ts +3 -0
- package/skin/index.js +3 -0
- package/skin/shapes.d.ts +112 -0
- package/skin/shapes.js +147 -0
- package/skin/skin.d.ts +911 -0
- package/skin/skin.js +412 -0
- package/solve/client.d.ts +58 -0
- package/solve/client.js +56 -0
- package/solve/handle.d.ts +6 -0
- package/solve/handle.js +38 -0
- package/solve/index.d.ts +8 -0
- package/solve/index.js +7 -0
- package/solve/lse.d.ts +42 -0
- package/solve/lse.js +151 -0
- package/solve/pieces.d.ts +18 -0
- package/solve/pieces.js +24 -0
- package/solve/protocol.d.ts +70 -0
- package/solve/protocol.js +16 -0
- package/solve/scramble.d.ts +76 -0
- package/solve/scramble.js +187 -0
- package/solve/stage.d.ts +108 -0
- package/solve/stage.js +532 -0
- package/solve/twophase.d.ts +36 -0
- package/solve/twophase.js +229 -0
- package/solve/worker.d.ts +6 -0
- package/solve/worker.js +15 -0
- package/timeline/codec.d.ts +23 -0
- package/timeline/codec.js +84 -0
- package/timeline/index.d.ts +7 -0
- package/timeline/index.js +7 -0
- package/timeline/recording.d.ts +19 -0
- package/timeline/recording.js +20 -0
- package/timeline/replay.d.ts +68 -0
- package/timeline/replay.js +145 -0
- package/timeline/segments.d.ts +31 -0
- package/timeline/segments.js +39 -0
- package/timeline/share.d.ts +30 -0
- package/timeline/share.js +62 -0
- package/timeline/stats.d.ts +34 -0
- package/timeline/stats.js +56 -0
- package/timeline/timings.d.ts +30 -0
- package/timeline/timings.js +54 -0
- package/zz/index.d.ts +29 -0
- package/zz/index.js +68 -0
- package/zz/seeds.d.ts +9 -0
- package/zz/seeds.js +29 -0
package/skin/skin.d.ts
ADDED
|
@@ -0,0 +1,911 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skin — how the cube looks, as plain data (serialisable, presets below).
|
|
3
|
+
* Everything the renderer draws comes from here, per theme.
|
|
4
|
+
*/
|
|
5
|
+
import type { MaskState } from "../core/index.js";
|
|
6
|
+
import type { Decal, FeatureUse } from "./attachments.js";
|
|
7
|
+
import type { PieceKind, StickerOverlay, StickerPaths, StickerShape } from "./shapes.js";
|
|
8
|
+
export interface Skin {
|
|
9
|
+
/** Plastic colour. */
|
|
10
|
+
body: string;
|
|
11
|
+
/**
|
|
12
|
+
* Plastic between the tiles in 2D pictures (@cubecore/image); null =
|
|
13
|
+
* see-through (the page shows in the gaps). Default: `body`. Light
|
|
14
|
+
* plastic with light tiles (white on ivory) blurs together in 2D.
|
|
15
|
+
*/
|
|
16
|
+
pictureBody?: string | null;
|
|
17
|
+
/** Cubie size relative to the 1-unit grid (1 = no gap between cubies). */
|
|
18
|
+
cubieSize: number;
|
|
19
|
+
/** Rounding of the cubie edges, 0..0.5. */
|
|
20
|
+
cubieRadius: number;
|
|
21
|
+
/**
|
|
22
|
+
* Shrinks the black body under the tiles (cubie units per side): thick
|
|
23
|
+
* stickerless tiles then form the piece's outside and the core shows only
|
|
24
|
+
* deep in the gaps. Tiles reach down to meet it. Default 0.
|
|
25
|
+
*/
|
|
26
|
+
bodyInset?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Stickerless piece bodies shaped like their tiles instead of a box: under
|
|
29
|
+
* each tile the plastic continues `depth` deep into the cubie, narrowing
|
|
30
|
+
* by `taper` (the front of a piece is larger than its back; a centre piece
|
|
31
|
+
* is as round as its tile), around a rounded core `core` × the cubie size.
|
|
32
|
+
* Cubie units.
|
|
33
|
+
*/
|
|
34
|
+
pieces?: {
|
|
35
|
+
depth: number;
|
|
36
|
+
taper: number;
|
|
37
|
+
core: number;
|
|
38
|
+
/**
|
|
39
|
+
* Coloured plastic: the piece under each tile takes the tile's colour (a
|
|
40
|
+
* corner is three coloured parts, an edge two, a centre one — like
|
|
41
|
+
* stickerless cubes moulded in colour); the core stays `body`.
|
|
42
|
+
*/
|
|
43
|
+
colored?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* "skirt" (default): plastic `depth` deep under each tile; "solid": the
|
|
46
|
+
* same shape run through the whole piece, so the piece is filled with
|
|
47
|
+
* colour — the tapered walls meet inside it, the nearer tile's outermost,
|
|
48
|
+
* so inner faces split along the diagonals (a corner in three colours, an
|
|
49
|
+
* edge in two). Needs `colored`.
|
|
50
|
+
*/
|
|
51
|
+
fill?: "skirt" | "solid";
|
|
52
|
+
/**
|
|
53
|
+
* Straight walls: the plastic first runs straight down along the tile
|
|
54
|
+
* outline to this depth, then narrows (`taper`) — real pieces have a flat
|
|
55
|
+
* bit of wall behind the tile before they narrow. Default: narrows at once.
|
|
56
|
+
*/
|
|
57
|
+
wall?: number;
|
|
58
|
+
/**
|
|
59
|
+
* Corner-cutting relief: behind the tile, the material at the tile's
|
|
60
|
+
* corner(s) next to the face centre is cut away in a cone — `start` wide
|
|
61
|
+
* right under the tile (default 0), `radius` at `depth` below it. The tile's corner
|
|
62
|
+
* overhangs and passes in front of the centre when you cut a corner.
|
|
63
|
+
* `tile`: the cut reaches up into the tile to this height above the face
|
|
64
|
+
* (a thinner overhanging corner; at most where the tile's bevel starts).
|
|
65
|
+
* Corner pieces only, unless `edges`.
|
|
66
|
+
*/
|
|
67
|
+
relief?: {
|
|
68
|
+
radius: number;
|
|
69
|
+
depth: number;
|
|
70
|
+
start?: number;
|
|
71
|
+
tile?: number;
|
|
72
|
+
edges?: boolean;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Radius of the dark mechanism ball in the middle (cubie units, default
|
|
76
|
+
* 1.15). The pieces' insides are cut flat where they would reach it —
|
|
77
|
+
* a corner's inner point, an edge's inner edge, a centre's back.
|
|
78
|
+
*/
|
|
79
|
+
mechanism?: number;
|
|
80
|
+
};
|
|
81
|
+
stickers: {
|
|
82
|
+
/** Colour of each colour class, U R F D L B home-face order. */
|
|
83
|
+
colors: readonly [string, string, string, string, string, string];
|
|
84
|
+
/** Side of a sticker relative to a cubie face, 0..1. */
|
|
85
|
+
size: number;
|
|
86
|
+
/** Corner radius relative to the sticker, 0..0.5 (0.5 = circle) — used when `shape` is not given. */
|
|
87
|
+
radius: number;
|
|
88
|
+
/** Per-piece-kind corner radii (see shapes.ts) — overrides `radius`. */
|
|
89
|
+
shape?: StickerShape;
|
|
90
|
+
/** Custom outlines as SVG path data — override `shape` per piece kind. */
|
|
91
|
+
paths?: StickerPaths;
|
|
92
|
+
/** How far a tile stands out from the plastic (cubie units) — stickerless tiles are thicker. */
|
|
93
|
+
thickness?: number;
|
|
94
|
+
/**
|
|
95
|
+
* Per piece kind: a different tile size / thickness / edge round — e.g. a
|
|
96
|
+
* centre cap that is smaller and stands out more than the other tiles.
|
|
97
|
+
* Unset values fall back to `size` / `thickness` / `bevel`. `dome`: a top
|
|
98
|
+
* that is flat inside a circle (`flat` × the tile's reach) and falls `drop`
|
|
99
|
+
* lower at the corners.
|
|
100
|
+
*/
|
|
101
|
+
kinds?: Partial<Record<PieceKind, {
|
|
102
|
+
size?: number;
|
|
103
|
+
thickness?: number;
|
|
104
|
+
bevel?: number;
|
|
105
|
+
dome?: {
|
|
106
|
+
flat: number;
|
|
107
|
+
drop: number;
|
|
108
|
+
};
|
|
109
|
+
}>>;
|
|
110
|
+
/** Radius of the rounded top edge of a tile (cubie units, ≤ thickness). Default 0 (sharp). */
|
|
111
|
+
bevel?: number;
|
|
112
|
+
/**
|
|
113
|
+
* "flat" — unlit, exact colours (printed-sticker look, default);
|
|
114
|
+
* "plastic" — lit with a soft highlight, so thick bevelled tiles read as moulded plastic.
|
|
115
|
+
*/
|
|
116
|
+
material?: "flat" | "plastic";
|
|
117
|
+
/** Plastic finish: 0 = glossy (UV coated) … 1 = matte. Default 0.4. */
|
|
118
|
+
roughness?: number;
|
|
119
|
+
/**
|
|
120
|
+
* Sticker finish as on real cubes (implies lit plastic):
|
|
121
|
+
* "matte" — soft, diffuse, no sharp highlight;
|
|
122
|
+
* "uv" — UV-coated: a clear glossy coat with sharp reflections.
|
|
123
|
+
* Overrides `roughness`.
|
|
124
|
+
*/
|
|
125
|
+
finish?: "matte" | "uv";
|
|
126
|
+
/**
|
|
127
|
+
* Stickerless: rounding of the cube's outer edges (cubie units). The two
|
|
128
|
+
* tiles meeting there each curve over half of it, so colour runs round
|
|
129
|
+
* the edge. Default 0 (a sharp edge).
|
|
130
|
+
*/
|
|
131
|
+
edgeRadius?: number;
|
|
132
|
+
/**
|
|
133
|
+
* Stickerless: tile sides on the cube's outer edge reach the edge, so two
|
|
134
|
+
* faces' colours meet directly on edges and corners (no black line there);
|
|
135
|
+
* gaps remain only between neighbouring pieces on a face.
|
|
136
|
+
*/
|
|
137
|
+
fillOuter?: boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Stickers on the tiles: the tiles become the body's plastic (a raised
|
|
140
|
+
* black platform, rounded at the cube's edges) and a thin sticker of its
|
|
141
|
+
* own shape lies on each, kept `margin` from the cube's edges — a
|
|
142
|
+
* stickered cube.
|
|
143
|
+
*/
|
|
144
|
+
overlay?: StickerOverlay;
|
|
145
|
+
/**
|
|
146
|
+
* A cube corner rounder than its edges (cubie units): the corner pieces
|
|
147
|
+
* are rounded off by a ball of this radius at the cube's corners.
|
|
148
|
+
*/
|
|
149
|
+
cornerRound?: number;
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* The brand's sticker shapes for its stickered version (`withStickers`):
|
|
153
|
+
* tile size, outlines, and optionally a different centre size.
|
|
154
|
+
*/
|
|
155
|
+
stickerSet?: StickerSet;
|
|
156
|
+
/**
|
|
157
|
+
* Images on stickers — logos, symbols, printed patterns (see
|
|
158
|
+
* attachments.ts). They follow their sticker. Brand logos are trademarks:
|
|
159
|
+
* apps supply their own, the library ships none.
|
|
160
|
+
*/
|
|
161
|
+
decals?: readonly Decal[];
|
|
162
|
+
/** Extra geometry on stickers — holes, charging slots, your own types (see `defineFeature`). */
|
|
163
|
+
features?: readonly FeatureUse[];
|
|
164
|
+
/**
|
|
165
|
+
* Your own 3D pieces (glTF / GLB URLs) instead of the built-in geometry —
|
|
166
|
+
* see @cubecore/render pieceModels.ts for the convention (UFR corner, UF
|
|
167
|
+
* edge, U centre; materials sticker-U / sticker-F / sticker-R are
|
|
168
|
+
* recoloured). Kinds left out keep the built-in pieces; until a model has
|
|
169
|
+
* loaded (or if it fails), the built-in pieces are drawn. Stickers /
|
|
170
|
+
* outlines above still drive the 2D pictures.
|
|
171
|
+
*/
|
|
172
|
+
models?: {
|
|
173
|
+
corner?: string;
|
|
174
|
+
edge?: string;
|
|
175
|
+
center?: string;
|
|
176
|
+
/** Uniform scale if the models aren't in cubie units. Default 1. */
|
|
177
|
+
scale?: number;
|
|
178
|
+
/** Height of the sticker surface above the cubie's face (for decals / features). Default: stickers.thickness. */
|
|
179
|
+
surface?: number;
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* Colours for masked stickers. `dim` fades the sticker colour towards the
|
|
183
|
+
* `ignored` grey by `dimAmount` — faded, but lighter / more coloured than
|
|
184
|
+
* a hidden sticker (towards the black body, white turned into that grey).
|
|
185
|
+
*/
|
|
186
|
+
mask: {
|
|
187
|
+
ignored: string;
|
|
188
|
+
oriented: string;
|
|
189
|
+
dimAmount: number;
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Floating "back" stickers showing the hidden faces. `colors`: a palette of
|
|
193
|
+
* their own (e.g. white hints turned blue-grey so they show on a light page).
|
|
194
|
+
*/
|
|
195
|
+
hints: {
|
|
196
|
+
enabled: boolean;
|
|
197
|
+
distance: number;
|
|
198
|
+
opacity: number;
|
|
199
|
+
ignoredOpacity: number;
|
|
200
|
+
colors?: readonly [string, string, string, string, string, string];
|
|
201
|
+
};
|
|
202
|
+
background: string | null;
|
|
203
|
+
/**
|
|
204
|
+
* Adjustments for light and dark pages — whatever reads badly on one of
|
|
205
|
+
* them (grey masked stickers, white back stickers, the background). Pick
|
|
206
|
+
* one with `themed(skin, theme)`; renderers / pictures / the player take a
|
|
207
|
+
* `theme` option.
|
|
208
|
+
*/
|
|
209
|
+
themes?: {
|
|
210
|
+
light?: SkinTheme;
|
|
211
|
+
dark?: SkinTheme;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* A brand's stickers for its stickered cube (`withStickers`): the sticker's
|
|
216
|
+
* size, margin from the cube's edges and corner radii (see StickerOverlay),
|
|
217
|
+
* and how round the body is at the cube's edges.
|
|
218
|
+
*/
|
|
219
|
+
export interface StickerSet extends Omit<StickerOverlay, "thickness" | "bevel"> {
|
|
220
|
+
/** Rounding of the body at the cube's edges (cubie units). Default 0.1. */
|
|
221
|
+
edgeRadius?: number;
|
|
222
|
+
/** The stickered cube's plastic. Default a soft black (#222222). */
|
|
223
|
+
body?: string;
|
|
224
|
+
/** A cube corner rounder than the edges (cubie units) — see `stickers.cornerRound`. */
|
|
225
|
+
cornerRound?: number;
|
|
226
|
+
/** The centre piece's top under its sticker: flat in a circle, sloping to the corners (see `kinds.dome`). */
|
|
227
|
+
centerDome?: {
|
|
228
|
+
flat: number;
|
|
229
|
+
drop: number;
|
|
230
|
+
};
|
|
231
|
+
/** Corner radii of the plastic tops the stickers lie on (fractions of a face). Default: the stickers' own. */
|
|
232
|
+
base?: StickerShape;
|
|
233
|
+
}
|
|
234
|
+
/** How a stickered version's stickers stand: thick and rounded, thin (a real sticker) or a flat print. */
|
|
235
|
+
export type StickerStyle = "raised" | "thin" | "flat";
|
|
236
|
+
export interface SkinTheme {
|
|
237
|
+
body?: string;
|
|
238
|
+
background?: string | null;
|
|
239
|
+
mask?: Partial<Skin["mask"]>;
|
|
240
|
+
hints?: Partial<Skin["hints"]>;
|
|
241
|
+
}
|
|
242
|
+
export type Theme = "light" | "dark";
|
|
243
|
+
/** The skin as it should look on a `theme` page (its `themes` overrides applied). */
|
|
244
|
+
export declare function themed(skin: Skin, theme: Theme): Skin;
|
|
245
|
+
/** Back-sticker colour: the hint palette if the skin has one, else the sticker's own. */
|
|
246
|
+
export declare function hintColor(skin: Skin, colorClass: number, state: MaskState): string | null;
|
|
247
|
+
/**
|
|
248
|
+
* QiYi SC tile outlines (corner, edge), measured from the plates of the cube
|
|
249
|
+
* model in QiYi's app: rounded corners, a big round towards the face centre
|
|
250
|
+
* and the edge tiles' long curve there. Stickerless — outer sides run to the
|
|
251
|
+
* cube edge.
|
|
252
|
+
*/
|
|
253
|
+
/**
|
|
254
|
+
* QiYi's stickered cubes, measured from the models in QiYi's app ("black
|
|
255
|
+
* rounded" / "black square"): flat stickers on black pedestals, ~0.87–0.89 of
|
|
256
|
+
* a face, kept 0.21 from the cube's edges; a big round on a corner sticker
|
|
257
|
+
* at the cube's corner; round centre stickers on a domed centre. The two
|
|
258
|
+
* differ only in how round the body is: at the edges 0.24 / 0.15, at the
|
|
259
|
+
* corners 0.37 / 0.22.
|
|
260
|
+
*/
|
|
261
|
+
export declare const QIYI_ROUND_STICKERS: StickerSet;
|
|
262
|
+
/** The square one: the same stickers and pieces, only less rounded at the cube's edges and corners. */
|
|
263
|
+
export declare const QIYI_SQUARE_STICKERS: StickerSet;
|
|
264
|
+
/**
|
|
265
|
+
* Earlier skins, kept for reference (not in SKINS): the first GAN look, the
|
|
266
|
+
* i4 (with its holes — `default` is built from it), the GAN 356 M measured
|
|
267
|
+
* from a 3D model (`gan` / `ganStickers` are built from it), and the first
|
|
268
|
+
* generic looks `standard` (black plastic, stickers) and `stickerless`.
|
|
269
|
+
*/
|
|
270
|
+
export declare const ARCHIVED_SKINS: {
|
|
271
|
+
/**
|
|
272
|
+
* GAN-style stickerless: tiles almost fill each cubie face; corner tiles
|
|
273
|
+
* round off the corner facing the centre, edge tiles round their inner side
|
|
274
|
+
* into a tongue, centre tiles are nearly round. Add a logo as a decal.
|
|
275
|
+
*/
|
|
276
|
+
gan: {
|
|
277
|
+
body: string;
|
|
278
|
+
cubieSize: number;
|
|
279
|
+
cubieRadius: number;
|
|
280
|
+
bodyInset: number;
|
|
281
|
+
pieces: {
|
|
282
|
+
depth: number;
|
|
283
|
+
taper: number;
|
|
284
|
+
core: number;
|
|
285
|
+
};
|
|
286
|
+
stickers: {
|
|
287
|
+
colors: [string, string, string, string, string, string];
|
|
288
|
+
size: number;
|
|
289
|
+
radius: number;
|
|
290
|
+
shape: {
|
|
291
|
+
corner: {
|
|
292
|
+
inner: number;
|
|
293
|
+
outer: number;
|
|
294
|
+
};
|
|
295
|
+
edge: {
|
|
296
|
+
inner: number;
|
|
297
|
+
outer: number;
|
|
298
|
+
};
|
|
299
|
+
center: number;
|
|
300
|
+
};
|
|
301
|
+
thickness: number;
|
|
302
|
+
bevel: number;
|
|
303
|
+
edgeRadius: number;
|
|
304
|
+
material: "plastic";
|
|
305
|
+
fillOuter: true;
|
|
306
|
+
};
|
|
307
|
+
mask: {
|
|
308
|
+
ignored: string;
|
|
309
|
+
oriented: string;
|
|
310
|
+
dimAmount: number;
|
|
311
|
+
};
|
|
312
|
+
hints: {
|
|
313
|
+
enabled: false;
|
|
314
|
+
distance: number;
|
|
315
|
+
opacity: number;
|
|
316
|
+
ignoredOpacity: number;
|
|
317
|
+
};
|
|
318
|
+
background: null;
|
|
319
|
+
themes: {
|
|
320
|
+
light: SkinTheme;
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
/**
|
|
324
|
+
* GAN i4-style smart cube (from product photos): light translucent-grey
|
|
325
|
+
* internals showing in minimal gaps, thick matte tiles with soft edges, the
|
|
326
|
+
* cube's edges rounded so colour runs round them, squarish centres with
|
|
327
|
+
* four adjustment holes. The brand logo is up to the app (a decal).
|
|
328
|
+
*/
|
|
329
|
+
ganI4: {
|
|
330
|
+
body: string;
|
|
331
|
+
cubieSize: number;
|
|
332
|
+
cubieRadius: number;
|
|
333
|
+
bodyInset: number;
|
|
334
|
+
pieces: {
|
|
335
|
+
depth: number;
|
|
336
|
+
taper: number;
|
|
337
|
+
core: number;
|
|
338
|
+
};
|
|
339
|
+
stickers: {
|
|
340
|
+
colors: [string, string, string, string, string, string];
|
|
341
|
+
size: number;
|
|
342
|
+
radius: number;
|
|
343
|
+
shape: {
|
|
344
|
+
corner: {
|
|
345
|
+
inner: number;
|
|
346
|
+
outer: number;
|
|
347
|
+
};
|
|
348
|
+
edge: {
|
|
349
|
+
inner: number;
|
|
350
|
+
outer: number;
|
|
351
|
+
};
|
|
352
|
+
center: number;
|
|
353
|
+
};
|
|
354
|
+
thickness: number;
|
|
355
|
+
bevel: number;
|
|
356
|
+
edgeRadius: number;
|
|
357
|
+
material: "plastic";
|
|
358
|
+
roughness: number;
|
|
359
|
+
fillOuter: true;
|
|
360
|
+
};
|
|
361
|
+
features: {
|
|
362
|
+
select: {
|
|
363
|
+
kinds: "center"[];
|
|
364
|
+
};
|
|
365
|
+
type: string;
|
|
366
|
+
params: {
|
|
367
|
+
radius: number;
|
|
368
|
+
at: number[][];
|
|
369
|
+
};
|
|
370
|
+
}[];
|
|
371
|
+
mask: {
|
|
372
|
+
ignored: string;
|
|
373
|
+
oriented: string;
|
|
374
|
+
dimAmount: number;
|
|
375
|
+
};
|
|
376
|
+
hints: {
|
|
377
|
+
enabled: false;
|
|
378
|
+
distance: number;
|
|
379
|
+
opacity: number;
|
|
380
|
+
ignoredOpacity: number;
|
|
381
|
+
};
|
|
382
|
+
background: null;
|
|
383
|
+
themes: {
|
|
384
|
+
light: SkinTheme;
|
|
385
|
+
};
|
|
386
|
+
};
|
|
387
|
+
/**
|
|
388
|
+
* GAN 356 M (stickerless): square corner tiles, edge tiles with a round
|
|
389
|
+
* "tongue" towards the centre, near-round centres; thin glossy tiles.
|
|
390
|
+
* Shapes, sizes and colours measured from "GAN CUBE 356s M air" by Amyyu
|
|
391
|
+
* (https://sketchfab.com/3d-models/gan-cube-356s-m-air-dd4768b8fe2841c78e418230e5d9e192,
|
|
392
|
+
* CC BY 4.0); smoothed after the cube in GAN's app. No logo — that's up to the app (a decal).
|
|
393
|
+
*/
|
|
394
|
+
gan356m: {
|
|
395
|
+
body: string;
|
|
396
|
+
cubieSize: number;
|
|
397
|
+
cubieRadius: number;
|
|
398
|
+
bodyInset: number;
|
|
399
|
+
pieces: {
|
|
400
|
+
depth: number;
|
|
401
|
+
taper: number;
|
|
402
|
+
wall: number;
|
|
403
|
+
relief: {
|
|
404
|
+
radius: number;
|
|
405
|
+
depth: number;
|
|
406
|
+
start: number;
|
|
407
|
+
tile: number;
|
|
408
|
+
};
|
|
409
|
+
mechanism: number;
|
|
410
|
+
core: number;
|
|
411
|
+
fill: "solid";
|
|
412
|
+
};
|
|
413
|
+
stickers: {
|
|
414
|
+
colors: [string, string, string, string, string, string];
|
|
415
|
+
size: number;
|
|
416
|
+
radius: number;
|
|
417
|
+
shape: {
|
|
418
|
+
corner: {
|
|
419
|
+
inner: number;
|
|
420
|
+
outer: number;
|
|
421
|
+
};
|
|
422
|
+
edge: {
|
|
423
|
+
inner: number;
|
|
424
|
+
outer: number;
|
|
425
|
+
};
|
|
426
|
+
center: number;
|
|
427
|
+
};
|
|
428
|
+
thickness: number;
|
|
429
|
+
bevel: number;
|
|
430
|
+
kinds: {
|
|
431
|
+
center: {
|
|
432
|
+
size: number;
|
|
433
|
+
thickness: number;
|
|
434
|
+
bevel: number;
|
|
435
|
+
};
|
|
436
|
+
};
|
|
437
|
+
edgeRadius: number;
|
|
438
|
+
material: "plastic";
|
|
439
|
+
roughness: number;
|
|
440
|
+
fillOuter: true;
|
|
441
|
+
};
|
|
442
|
+
stickerSet: {
|
|
443
|
+
size: number;
|
|
444
|
+
centerSize: number;
|
|
445
|
+
margin: number;
|
|
446
|
+
shape: {
|
|
447
|
+
corner: {
|
|
448
|
+
inner: number;
|
|
449
|
+
outer: number;
|
|
450
|
+
};
|
|
451
|
+
edge: {
|
|
452
|
+
inner: number;
|
|
453
|
+
outer: number;
|
|
454
|
+
};
|
|
455
|
+
center: number;
|
|
456
|
+
};
|
|
457
|
+
edgeRadius: number;
|
|
458
|
+
};
|
|
459
|
+
mask: {
|
|
460
|
+
ignored: string;
|
|
461
|
+
oriented: string;
|
|
462
|
+
dimAmount: number;
|
|
463
|
+
};
|
|
464
|
+
hints: {
|
|
465
|
+
enabled: false;
|
|
466
|
+
distance: number;
|
|
467
|
+
opacity: number;
|
|
468
|
+
ignoredOpacity: number;
|
|
469
|
+
};
|
|
470
|
+
background: null;
|
|
471
|
+
themes: {
|
|
472
|
+
light: SkinTheme;
|
|
473
|
+
};
|
|
474
|
+
};
|
|
475
|
+
/** Black plastic, rounded stickers — a typical modern speed cube. */
|
|
476
|
+
standard: {
|
|
477
|
+
body: string;
|
|
478
|
+
cubieSize: number;
|
|
479
|
+
cubieRadius: number;
|
|
480
|
+
stickers: {
|
|
481
|
+
colors: readonly ["#ffffff", "#e8322f", "#1fb24a", "#ffd500", "#ff8a00", "#1e5eff"];
|
|
482
|
+
size: number;
|
|
483
|
+
radius: number;
|
|
484
|
+
};
|
|
485
|
+
mask: {
|
|
486
|
+
ignored: string;
|
|
487
|
+
oriented: string;
|
|
488
|
+
dimAmount: number;
|
|
489
|
+
};
|
|
490
|
+
hints: {
|
|
491
|
+
enabled: false;
|
|
492
|
+
distance: number;
|
|
493
|
+
opacity: number;
|
|
494
|
+
ignoredOpacity: number;
|
|
495
|
+
};
|
|
496
|
+
background: null;
|
|
497
|
+
themes: {
|
|
498
|
+
light: SkinTheme;
|
|
499
|
+
};
|
|
500
|
+
};
|
|
501
|
+
/** Stickerless look: tiles fill the face, small radius, dark grey core. */
|
|
502
|
+
stickerless: {
|
|
503
|
+
body: string;
|
|
504
|
+
cubieSize: number;
|
|
505
|
+
cubieRadius: number;
|
|
506
|
+
bodyInset: number;
|
|
507
|
+
stickers: {
|
|
508
|
+
colors: readonly ["#ffffff", "#e8322f", "#1fb24a", "#ffd500", "#ff8a00", "#1e5eff"];
|
|
509
|
+
size: number;
|
|
510
|
+
radius: number;
|
|
511
|
+
fillOuter: true;
|
|
512
|
+
thickness: number;
|
|
513
|
+
bevel: number;
|
|
514
|
+
edgeRadius: number;
|
|
515
|
+
material: "plastic";
|
|
516
|
+
};
|
|
517
|
+
mask: {
|
|
518
|
+
ignored: string;
|
|
519
|
+
oriented: string;
|
|
520
|
+
dimAmount: number;
|
|
521
|
+
};
|
|
522
|
+
hints: {
|
|
523
|
+
enabled: false;
|
|
524
|
+
distance: number;
|
|
525
|
+
opacity: number;
|
|
526
|
+
ignoredOpacity: number;
|
|
527
|
+
};
|
|
528
|
+
background: null;
|
|
529
|
+
themes: {
|
|
530
|
+
light: SkinTheme;
|
|
531
|
+
};
|
|
532
|
+
};
|
|
533
|
+
};
|
|
534
|
+
export declare const SKINS: {
|
|
535
|
+
/** GAN, stickered: GAN's stickers (rounded squares, edges with a round tongue, round centres), flat prints on black. */
|
|
536
|
+
ganStickers: Skin;
|
|
537
|
+
/** MoYu, stickered: MoYu's stickers on black. */
|
|
538
|
+
moyuStickers: Skin;
|
|
539
|
+
/** The default look, stickered: its shapes as stickers on black plastic that follows their curves. */
|
|
540
|
+
defaultStickers: Skin;
|
|
541
|
+
/** QiYi, stickered — the round black cube ("black rounded" in QiYi's app). */
|
|
542
|
+
qiyiStickersRounded: Skin;
|
|
543
|
+
/** QiYi, stickered — the square black cube ("black square" in QiYi's app). */
|
|
544
|
+
qiyiStickersSquare: Skin;
|
|
545
|
+
/**
|
|
546
|
+
* The default look: a modern stickerless speed cube, after the GAN i4's
|
|
547
|
+
* pieces (the sample glTF models are exported from it) — thick matte tiles
|
|
548
|
+
* with soft edges, corners towards the centre rounded, squarish centres,
|
|
549
|
+
* pieces moulded in colour. Stickered: `defaultStickers`.
|
|
550
|
+
*/
|
|
551
|
+
default: {
|
|
552
|
+
features: undefined;
|
|
553
|
+
body: string;
|
|
554
|
+
cubieSize: number;
|
|
555
|
+
cubieRadius: number;
|
|
556
|
+
bodyInset: number;
|
|
557
|
+
pieces: {
|
|
558
|
+
depth: number;
|
|
559
|
+
taper: number;
|
|
560
|
+
wall: number;
|
|
561
|
+
relief: {
|
|
562
|
+
radius: number;
|
|
563
|
+
depth: number;
|
|
564
|
+
start: number;
|
|
565
|
+
tile: number;
|
|
566
|
+
};
|
|
567
|
+
mechanism: number;
|
|
568
|
+
core: number;
|
|
569
|
+
colored: true;
|
|
570
|
+
fill: "solid";
|
|
571
|
+
};
|
|
572
|
+
stickerSet: {
|
|
573
|
+
size: number;
|
|
574
|
+
centerSize: number;
|
|
575
|
+
margin: number;
|
|
576
|
+
shape: {
|
|
577
|
+
corner: {
|
|
578
|
+
inner: number;
|
|
579
|
+
outer: number;
|
|
580
|
+
};
|
|
581
|
+
edge: {
|
|
582
|
+
inner: number;
|
|
583
|
+
outer: number;
|
|
584
|
+
};
|
|
585
|
+
center: number;
|
|
586
|
+
};
|
|
587
|
+
edgeRadius: number;
|
|
588
|
+
};
|
|
589
|
+
stickers: {
|
|
590
|
+
colors: [string, string, string, string, string, string];
|
|
591
|
+
size: number;
|
|
592
|
+
radius: number;
|
|
593
|
+
shape: {
|
|
594
|
+
corner: {
|
|
595
|
+
inner: number;
|
|
596
|
+
outer: number;
|
|
597
|
+
};
|
|
598
|
+
edge: {
|
|
599
|
+
inner: number;
|
|
600
|
+
outer: number;
|
|
601
|
+
};
|
|
602
|
+
center: number;
|
|
603
|
+
};
|
|
604
|
+
thickness: number;
|
|
605
|
+
bevel: number;
|
|
606
|
+
edgeRadius: number;
|
|
607
|
+
material: "plastic";
|
|
608
|
+
roughness: number;
|
|
609
|
+
fillOuter: true;
|
|
610
|
+
};
|
|
611
|
+
mask: {
|
|
612
|
+
ignored: string;
|
|
613
|
+
oriented: string;
|
|
614
|
+
dimAmount: number;
|
|
615
|
+
};
|
|
616
|
+
hints: {
|
|
617
|
+
enabled: false;
|
|
618
|
+
distance: number;
|
|
619
|
+
opacity: number;
|
|
620
|
+
ignoredOpacity: number;
|
|
621
|
+
};
|
|
622
|
+
background: null;
|
|
623
|
+
themes: {
|
|
624
|
+
light: SkinTheme;
|
|
625
|
+
};
|
|
626
|
+
};
|
|
627
|
+
/**
|
|
628
|
+
* GAN (stickerless), after the GAN 356 M: square corner tiles, edge tiles
|
|
629
|
+
* with a round tongue towards the centre, near-round centres — thick tiles
|
|
630
|
+
* with soft, well-rounded edges on pieces moulded in colour. No logo —
|
|
631
|
+
* that's up to the app (a decal).
|
|
632
|
+
*/
|
|
633
|
+
gan: {
|
|
634
|
+
body: string;
|
|
635
|
+
pictureBody: null;
|
|
636
|
+
pieces: {
|
|
637
|
+
colored: true;
|
|
638
|
+
depth: number;
|
|
639
|
+
taper: number;
|
|
640
|
+
wall: number;
|
|
641
|
+
relief: {
|
|
642
|
+
radius: number;
|
|
643
|
+
depth: number;
|
|
644
|
+
start: number;
|
|
645
|
+
tile: number;
|
|
646
|
+
};
|
|
647
|
+
mechanism: number;
|
|
648
|
+
core: number;
|
|
649
|
+
fill: "solid";
|
|
650
|
+
};
|
|
651
|
+
stickers: {
|
|
652
|
+
thickness: number;
|
|
653
|
+
bevel: number;
|
|
654
|
+
edgeRadius: number;
|
|
655
|
+
kinds: {
|
|
656
|
+
center: {
|
|
657
|
+
size: number;
|
|
658
|
+
thickness: number;
|
|
659
|
+
bevel: number;
|
|
660
|
+
};
|
|
661
|
+
};
|
|
662
|
+
colors: [string, string, string, string, string, string];
|
|
663
|
+
size: number;
|
|
664
|
+
radius: number;
|
|
665
|
+
shape: {
|
|
666
|
+
corner: {
|
|
667
|
+
inner: number;
|
|
668
|
+
outer: number;
|
|
669
|
+
};
|
|
670
|
+
edge: {
|
|
671
|
+
inner: number;
|
|
672
|
+
outer: number;
|
|
673
|
+
};
|
|
674
|
+
center: number;
|
|
675
|
+
};
|
|
676
|
+
material: "plastic";
|
|
677
|
+
roughness: number;
|
|
678
|
+
fillOuter: true;
|
|
679
|
+
};
|
|
680
|
+
stickerSet: {
|
|
681
|
+
size: number;
|
|
682
|
+
centerSize: number;
|
|
683
|
+
margin: number;
|
|
684
|
+
shape: {
|
|
685
|
+
corner: {
|
|
686
|
+
inner: number;
|
|
687
|
+
outer: number;
|
|
688
|
+
};
|
|
689
|
+
edge: {
|
|
690
|
+
inner: number;
|
|
691
|
+
outer: number;
|
|
692
|
+
};
|
|
693
|
+
center: number;
|
|
694
|
+
};
|
|
695
|
+
edgeRadius: number;
|
|
696
|
+
};
|
|
697
|
+
cubieSize: number;
|
|
698
|
+
cubieRadius: number;
|
|
699
|
+
bodyInset: number;
|
|
700
|
+
mask: {
|
|
701
|
+
ignored: string;
|
|
702
|
+
oriented: string;
|
|
703
|
+
dimAmount: number;
|
|
704
|
+
};
|
|
705
|
+
hints: {
|
|
706
|
+
enabled: false;
|
|
707
|
+
distance: number;
|
|
708
|
+
opacity: number;
|
|
709
|
+
ignoredOpacity: number;
|
|
710
|
+
};
|
|
711
|
+
background: null;
|
|
712
|
+
themes: {
|
|
713
|
+
light: SkinTheme;
|
|
714
|
+
};
|
|
715
|
+
};
|
|
716
|
+
/**
|
|
717
|
+
* QiYi QY-SC smart cube (from photos): stickerless, moulded in colour
|
|
718
|
+
* (a corner is three coloured parts, an edge two) around an ivory core;
|
|
719
|
+
* thick "pillow" tiles with minimal gaps — corner tiles nearly square,
|
|
720
|
+
* edge tiles rounded towards the centre, a smaller raised squircle
|
|
721
|
+
* centre. The brand logo is up to the app (a decal).
|
|
722
|
+
*/
|
|
723
|
+
qiyiSC: {
|
|
724
|
+
body: string;
|
|
725
|
+
pictureBody: null;
|
|
726
|
+
cubieSize: number;
|
|
727
|
+
cubieRadius: number;
|
|
728
|
+
bodyInset: number;
|
|
729
|
+
pieces: {
|
|
730
|
+
depth: number;
|
|
731
|
+
taper: number;
|
|
732
|
+
wall: number;
|
|
733
|
+
relief: {
|
|
734
|
+
radius: number;
|
|
735
|
+
depth: number;
|
|
736
|
+
start: number;
|
|
737
|
+
tile: number;
|
|
738
|
+
};
|
|
739
|
+
mechanism: number;
|
|
740
|
+
core: number;
|
|
741
|
+
colored: true;
|
|
742
|
+
fill: "solid";
|
|
743
|
+
};
|
|
744
|
+
stickers: {
|
|
745
|
+
colors: [string, string, string, string, string, string];
|
|
746
|
+
size: number;
|
|
747
|
+
radius: number;
|
|
748
|
+
shape: {
|
|
749
|
+
corner: {
|
|
750
|
+
inner: number;
|
|
751
|
+
outer: number;
|
|
752
|
+
};
|
|
753
|
+
edge: {
|
|
754
|
+
inner: number;
|
|
755
|
+
outer: number;
|
|
756
|
+
};
|
|
757
|
+
center: number;
|
|
758
|
+
};
|
|
759
|
+
paths: {
|
|
760
|
+
corner: string;
|
|
761
|
+
edge: string;
|
|
762
|
+
};
|
|
763
|
+
thickness: number;
|
|
764
|
+
bevel: number;
|
|
765
|
+
kinds: {
|
|
766
|
+
center: {
|
|
767
|
+
size: number;
|
|
768
|
+
bevel: number;
|
|
769
|
+
dome: {
|
|
770
|
+
flat: number;
|
|
771
|
+
drop: number;
|
|
772
|
+
};
|
|
773
|
+
};
|
|
774
|
+
};
|
|
775
|
+
edgeRadius: number;
|
|
776
|
+
material: "plastic";
|
|
777
|
+
roughness: number;
|
|
778
|
+
fillOuter: true;
|
|
779
|
+
};
|
|
780
|
+
stickerSet: StickerSet;
|
|
781
|
+
mask: {
|
|
782
|
+
ignored: string;
|
|
783
|
+
oriented: string;
|
|
784
|
+
dimAmount: number;
|
|
785
|
+
};
|
|
786
|
+
hints: {
|
|
787
|
+
enabled: false;
|
|
788
|
+
distance: number;
|
|
789
|
+
opacity: number;
|
|
790
|
+
ignoredOpacity: number;
|
|
791
|
+
};
|
|
792
|
+
background: null;
|
|
793
|
+
themes: {
|
|
794
|
+
light: SkinTheme;
|
|
795
|
+
};
|
|
796
|
+
};
|
|
797
|
+
/**
|
|
798
|
+
* MoYu smart cubes (WCU — MY32 and friends): stickerless, moulded in colour;
|
|
799
|
+
* thick tiles, corner tiles nearly square with a rounder corner towards the
|
|
800
|
+
* centre, edge tiles well rounded towards the centre, rounded-square
|
|
801
|
+
* centres. Shapes and colours from the cube model in MoYu's app (WCU CUBE).
|
|
802
|
+
* No logo — that's up to the app (a decal).
|
|
803
|
+
*/
|
|
804
|
+
moyu: {
|
|
805
|
+
body: string;
|
|
806
|
+
pictureBody: null;
|
|
807
|
+
cubieSize: number;
|
|
808
|
+
cubieRadius: number;
|
|
809
|
+
bodyInset: number;
|
|
810
|
+
pieces: {
|
|
811
|
+
depth: number;
|
|
812
|
+
taper: number;
|
|
813
|
+
wall: number;
|
|
814
|
+
relief: {
|
|
815
|
+
radius: number;
|
|
816
|
+
depth: number;
|
|
817
|
+
start: number;
|
|
818
|
+
tile: number;
|
|
819
|
+
};
|
|
820
|
+
mechanism: number;
|
|
821
|
+
core: number;
|
|
822
|
+
colored: true;
|
|
823
|
+
fill: "solid";
|
|
824
|
+
};
|
|
825
|
+
stickers: {
|
|
826
|
+
colors: [string, string, string, string, string, string];
|
|
827
|
+
size: number;
|
|
828
|
+
radius: number;
|
|
829
|
+
shape: {
|
|
830
|
+
corner: {
|
|
831
|
+
inner: number;
|
|
832
|
+
outer: number;
|
|
833
|
+
};
|
|
834
|
+
edge: {
|
|
835
|
+
inner: number;
|
|
836
|
+
outer: number;
|
|
837
|
+
};
|
|
838
|
+
center: number;
|
|
839
|
+
};
|
|
840
|
+
thickness: number;
|
|
841
|
+
bevel: number;
|
|
842
|
+
edgeRadius: number;
|
|
843
|
+
material: "plastic";
|
|
844
|
+
roughness: number;
|
|
845
|
+
fillOuter: true;
|
|
846
|
+
};
|
|
847
|
+
stickerSet: {
|
|
848
|
+
size: number;
|
|
849
|
+
margin: number;
|
|
850
|
+
shape: {
|
|
851
|
+
corner: {
|
|
852
|
+
inner: number;
|
|
853
|
+
outer: number;
|
|
854
|
+
};
|
|
855
|
+
edge: {
|
|
856
|
+
inner: number;
|
|
857
|
+
outer: number;
|
|
858
|
+
};
|
|
859
|
+
center: number;
|
|
860
|
+
};
|
|
861
|
+
base: {
|
|
862
|
+
corner: {
|
|
863
|
+
inner: number;
|
|
864
|
+
outer: number;
|
|
865
|
+
};
|
|
866
|
+
edge: {
|
|
867
|
+
inner: number;
|
|
868
|
+
outer: number;
|
|
869
|
+
};
|
|
870
|
+
center: number;
|
|
871
|
+
};
|
|
872
|
+
edgeRadius: number;
|
|
873
|
+
body: string;
|
|
874
|
+
};
|
|
875
|
+
mask: {
|
|
876
|
+
ignored: string;
|
|
877
|
+
oriented: string;
|
|
878
|
+
dimAmount: number;
|
|
879
|
+
};
|
|
880
|
+
hints: {
|
|
881
|
+
enabled: false;
|
|
882
|
+
distance: number;
|
|
883
|
+
opacity: number;
|
|
884
|
+
ignoredOpacity: number;
|
|
885
|
+
};
|
|
886
|
+
background: null;
|
|
887
|
+
themes: {
|
|
888
|
+
light: SkinTheme;
|
|
889
|
+
};
|
|
890
|
+
};
|
|
891
|
+
};
|
|
892
|
+
/** Tile side of a piece kind, relative to a cubie face (`stickers.kinds` or `stickers.size`). */
|
|
893
|
+
export declare const tileSize: (skin: Skin, kind: PieceKind) => number;
|
|
894
|
+
/** How far a piece kind's tiles stand out (`stickers.kinds` or `stickers.thickness`). */
|
|
895
|
+
export declare const tileThickness: (skin: Skin, kind: PieceKind) => number;
|
|
896
|
+
export declare function stickerColor(skin: Skin, colorClass: number, state: MaskState): string | null;
|
|
897
|
+
export declare function mix(hex: string, towards: string, amount: number): string;
|
|
898
|
+
/** The same skin with other sticker colours (U R F D L B home-face order) — e.g. a Japanese scheme or a custom one. */
|
|
899
|
+
export declare function withColors(skin: Skin, colors: readonly [string, string, string, string, string, string]): Skin;
|
|
900
|
+
/**
|
|
901
|
+
* The stickered version of a skin: a black, rounded body with the brand's
|
|
902
|
+
* stickers (`skin.stickerSet`, else the skin's own shapes, at most 0.88 of a face)
|
|
903
|
+
* on top — `raised` (thick, rounded), `thin` (like a real sticker) or `flat`
|
|
904
|
+
* (a print). `options.set`: another sticker set of the brand (e.g. QiYi's
|
|
905
|
+
* square cube). Colours, logos and the rest stay.
|
|
906
|
+
*/
|
|
907
|
+
export declare function withStickers(skin: Skin, style?: StickerStyle, options?: {
|
|
908
|
+
set?: StickerSet;
|
|
909
|
+
}): Skin;
|
|
910
|
+
/** The same skin with another finish on its tiles / stickers: `matte`, `uv` (a glossy coat) or the skin's own (undefined). */
|
|
911
|
+
export declare function withFinish(skin: Skin, finish: "matte" | "uv" | undefined): Skin;
|