@mborecki/memory-game 0.3.3 → 0.4.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/dist/memory-game/index-Br8RptzJ.js +6135 -0
- package/dist/memory-game/index.esm.js +4 -0
- package/dist/{esm → memory-game}/mb-memory-game.entry.js +17 -8
- package/dist/memory-game/mb-memory-game.entry.js.map +1 -0
- package/dist/memory-game/memory-game.esm.js +50 -1
- package/dist/types/components/sliding-puzzle/memory-game.d.ts +2 -0
- package/dist/types/components.d.ts +8 -0
- package/dist/types/roboczy/mb-puzzle/apps/memory-game/.stencil/shared/grid/src/grid.d.ts +2 -0
- package/package.json +2 -2
- package/dist/cjs/app-globals-V2Kpy_OQ.js +0 -5
- package/dist/cjs/index-D_ddvJ2f.js +0 -3228
- package/dist/cjs/index.cjs.js +0 -2
- package/dist/cjs/loader.cjs.js +0 -13
- package/dist/cjs/mb-memory-game.cjs.entry.js +0 -211
- package/dist/cjs/memory-game.cjs.js +0 -25
- package/dist/collection/collection-manifest.json +0 -12
- package/dist/collection/components/sliding-puzzle/memory-game.css +0 -71
- package/dist/collection/components/sliding-puzzle/memory-game.js +0 -354
- package/dist/collection/components/sliding-puzzle/tile.js +0 -16
- package/dist/collection/components/sliding-puzzle/types.js +0 -1
- package/dist/collection/index.js +0 -1
- package/dist/collection/utils/get-set.js +0 -23
- package/dist/collection/utils/get-set.test.js +0 -31
- package/dist/components/index.js +0 -1
- package/dist/components/mb-memory-game.js +0 -1
- package/dist/esm/app-globals-DQuL1Twl.js +0 -3
- package/dist/esm/index-D2pBOsDL.js +0 -3221
- package/dist/esm/index.js +0 -1
- package/dist/esm/loader.js +0 -11
- package/dist/esm/memory-game.js +0 -21
- package/dist/index.cjs.js +0 -1
- package/dist/index.js +0 -1
- package/dist/memory-game/p-D2pBOsDL.js +0 -2
- package/dist/memory-game/p-DQuL1Twl.js +0 -1
- package/dist/memory-game/p-c3a7e97d.entry.js +0 -1
- package/dist/vitest.config.js +0 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { h, r as registerInstance,
|
|
1
|
+
import { h, r as registerInstance, a as createEvent } from './index-Br8RptzJ.js';
|
|
2
2
|
|
|
3
3
|
function getSet(items, count) {
|
|
4
4
|
console.log('getSet', items, count);
|
|
@@ -25,7 +25,7 @@ function getSet(items, count) {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
function Tile({ tile, selected, matched, uncovered, reversTile }) {
|
|
28
|
-
return h("div", { class: {
|
|
28
|
+
return h("div", { part: "tile", class: {
|
|
29
29
|
'tile-container': true,
|
|
30
30
|
selected,
|
|
31
31
|
matched
|
|
@@ -40,13 +40,13 @@ function TileRender({ tile }) {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
const memoryGameCss = () => `:host{box-sizing:border-box;display:grid;place-content:center;width:100%;height:100%;container-type:size}[part=container]{width:min(100cqw, 100cqh / var(--aspect, 1));height:min(100cqw * var(--aspect, 1), 100cqh);container-type:size}[part=list]{width:100cqw;height:100cqh;display:grid;grid-template-columns:repeat(var(--cols, 4), 1fr);grid-template-rows:repeat(var(--rows, 4), 1fr)}[part=tile-slot]{display:block;aspect-ratio:1;padding:5%}.tile-container{min-width:0;transition:scale 0.3s;width:100%;height:100%}.tile-container:hover{scale:1.05}.tile-container.selected{scale:1.1}.tile-container.matched{scale:0}.tile{border-radius:var(--tile-border-radius, 5px);border:var(--tile-border-width, 2px) solid var(--tile-border-color, black);padding:0;margin:0}.tile-text{width:100%;height:100%;aspect-ratio:1;background:#d9d9d9;display:grid;place-content:center}.tile-image{width:100%;height:100%}.tile-image img{display:block;width:100%;height:100%;object-fit:cover}`;
|
|
43
|
+
const memoryGameCss = () => `:host{box-sizing:border-box;display:grid;place-content:center;width:100%;height:100%;container-type:size}[part=container]{width:min(100cqw, 100cqh / var(--aspect, 1));height:min(100cqw * var(--aspect, 1), 100cqh);container-type:size}[part=list]{width:100cqw;height:100cqh;display:grid;grid-template-columns:repeat(var(--cols, 4), 1fr);grid-template-rows:repeat(var(--rows, 4), 1fr)}[part=tile-slot]{display:block;aspect-ratio:1;padding:5%}.tile-container{min-width:0;transition:scale 0.3s;width:100%;height:100%}.tile-container:hover{scale:1.05}.tile-container.selected{scale:1.1}.tile-container.matched{scale:0}.tile{border-radius:var(--tile-border-radius, 5px);border:var(--tile-border-width, 2px) solid var(--tile-border-color, black);overflow:hidden;padding:0;margin:0}.tile-text{width:100%;height:100%;aspect-ratio:1;background:#d9d9d9;display:grid;place-content:center}.tile-image{width:100%;height:100%}.tile-image img{display:block;width:100%;height:100%;object-fit:cover}`;
|
|
44
44
|
|
|
45
45
|
const MbMemoryGame = class {
|
|
46
46
|
constructor(hostRef) {
|
|
47
47
|
registerInstance(this, hostRef);
|
|
48
|
-
this.completed = createEvent(this, "completed");
|
|
49
|
-
this.matched = createEvent(this, "matched");
|
|
48
|
+
this.completed = createEvent(this, "completed", 7);
|
|
49
|
+
this.matched = createEvent(this, "matched", 7);
|
|
50
50
|
}
|
|
51
51
|
tileGroups = [];
|
|
52
52
|
watchTileGroups() {
|
|
@@ -67,6 +67,7 @@ const MbMemoryGame = class {
|
|
|
67
67
|
}
|
|
68
68
|
cols;
|
|
69
69
|
blockUI = false;
|
|
70
|
+
keepMatched = false;
|
|
70
71
|
completed;
|
|
71
72
|
matched;
|
|
72
73
|
componentWillLoad() {
|
|
@@ -76,6 +77,7 @@ const MbMemoryGame = class {
|
|
|
76
77
|
}
|
|
77
78
|
}
|
|
78
79
|
slots = new Map();
|
|
80
|
+
lastMatched = null;
|
|
79
81
|
get gridCols() {
|
|
80
82
|
if (this.cols) {
|
|
81
83
|
return this.cols;
|
|
@@ -116,6 +118,7 @@ const MbMemoryGame = class {
|
|
|
116
118
|
async onTileClick(id) {
|
|
117
119
|
if (this.blockUI)
|
|
118
120
|
return;
|
|
121
|
+
this.lastMatched = null;
|
|
119
122
|
if (this.selected.includes(id)) {
|
|
120
123
|
this.selected = this.selected.filter(i => i !== id);
|
|
121
124
|
return;
|
|
@@ -133,6 +136,9 @@ const MbMemoryGame = class {
|
|
|
133
136
|
this.markAsMatched(t2.id)
|
|
134
137
|
]);
|
|
135
138
|
this.matched.emit({ t1: t1.data, t2: t2.data, groupId: t1.groupId });
|
|
139
|
+
if (this.keepMatched) {
|
|
140
|
+
this.lastMatched = t1.groupId;
|
|
141
|
+
}
|
|
136
142
|
this.matchedTiles = [
|
|
137
143
|
...this.matchedTiles, t1.id, t2.id
|
|
138
144
|
];
|
|
@@ -186,13 +192,13 @@ const MbMemoryGame = class {
|
|
|
186
192
|
});
|
|
187
193
|
}
|
|
188
194
|
render() {
|
|
189
|
-
return h("div", { key: '
|
|
195
|
+
return h("div", { key: 'c0744288edcde027bb2ec275abe5c5c8f5201545', part: "container", style: {
|
|
190
196
|
'--aspect': `${this.gridAspectRatio}`
|
|
191
|
-
} }, h("div", { key: '
|
|
197
|
+
} }, h("div", { key: 'ba278d3980f1e2278ead7013e97e42931a654a32', part: "list", style: {
|
|
192
198
|
'--cols': `${this.gridCols}`,
|
|
193
199
|
'--rows': `${this.gridRows}`
|
|
194
200
|
} }, this.tiles.map(t => {
|
|
195
|
-
return h("div", { part: "tile-slot", onClick: () => this.onTileClick(t.id), ref: el => this.slots.set(t.id, el) }, h(Tile, { tile: t, selected: this.selected.includes(t.id), matched: this.matchedTiles.includes(t.id), reversTile: this.reverseTile, uncovered: this.selected.includes(t.id) }));
|
|
201
|
+
return h("div", { part: "tile-slot", onClick: () => this.onTileClick(t.id), ref: el => this.slots.set(t.id, el) }, h(Tile, { tile: t, selected: this.selected.includes(t.id) || t.groupId === this.lastMatched, matched: this.matchedTiles.includes(t.id) && t.groupId !== this.lastMatched, reversTile: this.reverseTile, uncovered: this.selected.includes(t.id) || t.groupId === this.lastMatched }));
|
|
196
202
|
})));
|
|
197
203
|
}
|
|
198
204
|
static get watchers() { return {
|
|
@@ -207,3 +213,6 @@ const MbMemoryGame = class {
|
|
|
207
213
|
MbMemoryGame.style = memoryGameCss();
|
|
208
214
|
|
|
209
215
|
export { MbMemoryGame as mb_memory_game };
|
|
216
|
+
//# sourceMappingURL=mb-memory-game.entry.esm.js.map
|
|
217
|
+
|
|
218
|
+
//# sourceMappingURL=mb-memory-game.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"mb-memory-game.entry.js","mappings":"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","names":[],"sources":["src/utils/get-set.ts","src/components/sliding-puzzle/tile.tsx","src/components/sliding-puzzle/memory-game.scss?tag=mb-memory-game&encapsulation=shadow","src/components/sliding-puzzle/memory-game.tsx"],"sourcesContent":["export function getSet<T>(items: T[], count: number): T[] {\r\n console.log('getSet', items, count);\r\n if (items.length <= 0) throw new Error(\"getSet() - no items\");\r\n\r\n if(items.length === count) {\r\n return [...items];\r\n }\r\n\r\n let result: T[] = [];\r\n\r\n while (count - result.length > items.length) {\r\n result = [\r\n ...result,\r\n ...items\r\n ];\r\n }\r\n\r\n const rest = new Set<T>();\r\n\r\n while (rest.size < count - result.length) {\r\n rest.add(items[Math.floor(Math.random() * items.length)]);\r\n }\r\n\r\n return [\r\n ...result,\r\n ...rest\r\n ]\r\n}\r\n","import { h } from \"@stencil/core\";\r\nimport { ITile, TileDefinition } from \"./types\";\r\n\r\ninterface Props {\r\n tile: ITile,\r\n selected: boolean\r\n matched: boolean\r\n uncovered: boolean,\r\n reversTile: TileDefinition\r\n}\r\n\r\nexport function Tile({ tile, selected, matched, uncovered, reversTile }: Props) {\r\n\r\n return <div\r\n part=\"tile\"\r\n class={{\r\n 'tile-container': true,\r\n selected,\r\n matched\r\n }}\r\n >\r\n <TileRender tile={uncovered ? tile.data : reversTile} />\r\n </div>\r\n}\r\n\r\n\r\nfunction TileRender({ tile }: { tile: TileDefinition }) {\r\n if (tile.type === 'text') {\r\n return <button class=\"tile tile-text\">{tile.text}</button>\r\n }\r\n\r\n if (tile.type === 'image') {\r\n return <button class=\"tile tile-image\">\r\n <img src={tile.imageSrc} />\r\n </button>\r\n }\r\n}\r\n",":host {\r\n box-sizing: border-box;\r\n display: grid;\r\n place-content: center;\r\n width: 100%;\r\n height: 100%;\r\n container-type: size;\r\n\r\n}\r\n\r\n[part=container] {\r\n width: min(100cqw, calc(100cqh / var(--aspect, 1)));\r\n height: min(calc(100cqw * var(--aspect, 1)), 100cqh);\r\n\r\n container-type: size;\r\n}\r\n\r\n[part=list] {\r\n width: 100cqw;\r\n height: 100cqh;\r\n display: grid;\r\n grid-template-columns: repeat(var(--cols, 4), 1fr);\r\n grid-template-rows: repeat(var(--rows, 4), 1fr);\r\n}\r\n\r\n[part=tile-slot] {\r\n display: block;\r\n aspect-ratio: 1;\r\n padding: 5%;\r\n}\r\n\r\n.tile-container {\r\n min-width: 0;\r\n transition: scale .3s;\r\n width: 100%;\r\n height: 100%;\r\n\r\n &:hover {\r\n scale: 1.05;\r\n }\r\n\r\n &.selected {\r\n scale: 1.1;\r\n }\r\n\r\n &.matched {\r\n scale: 0;\r\n }\r\n}\r\n\r\n.tile {\r\n border-radius: var(--tile-border-radius, 5px);\r\n border: var(--tile-border-width, 2px) solid var(--tile-border-color, black);\r\n overflow: hidden;\r\n\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n.tile-text {\r\n width: 100%;\r\n height: 100%;\r\n aspect-ratio: 1;\r\n background: #d9d9d9;\r\n\r\n display: grid;\r\n place-content: center;\r\n}\r\n\r\n.tile-image {\r\n width: 100%;\r\n height: 100%;\r\n\r\n img {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n}\r\n","import { Component, EventEmitter, h, Method, Prop, State, Event, Watch } from \"@stencil/core\";\r\nimport { getSet } from \"../../utils/get-set\";\r\nimport { Tile } from \"./tile\";\r\nimport { ITile, MatchedEvent, TileDefinition, TileGroup, TileID } from \"./types\";\r\n\r\n@Component({\r\n tag: 'mb-memory-game',\r\n styleUrl: 'memory-game.scss',\r\n shadow: true,\r\n})\r\nexport class MbMemoryGame {\r\n\r\n @Prop() tileGroups: TileGroup[] = []\r\n @Watch('tileGroups')\r\n watchTileGroups() {\r\n console.log('watchTileGroups');\r\n if (this.init) {\r\n this.initGame();\r\n }\r\n }\r\n @Prop() reverseTile: TileDefinition = { type: 'text', text: '?' }\r\n\r\n @Prop() init: boolean = true;\r\n\r\n @State() tiles: ITile[] = [];\r\n @State() selected: TileID[] = [];\r\n @State() matchedTiles: (string | number | null)[] = [];\r\n\r\n @Watch('matchedTiles')\r\n watchMatchedTiles() {\r\n if (this.matchedTiles.length === this.tiles.length) {\r\n this.completed.emit();\r\n }\r\n }\r\n\r\n @Prop() cols?: number\r\n\r\n blockUI = false;\r\n\r\n @Prop() keepMatched: boolean = false;\r\n\r\n @Event() completed: EventEmitter<void>;\r\n\r\n @Event() matched: EventEmitter<MatchedEvent>;\r\n\r\n componentWillLoad() {\r\n console.log('componentDidLoad', this.init, this.tileGroups, this.reverseTile)\r\n if (this.init && this.tileGroups.length) {\r\n this.initGame();\r\n }\r\n }\r\n\r\n slots = new Map<TileID, HTMLDivElement>();\r\n\r\n @State() lastMatched: string | null = null;\r\n\r\n get gridCols(): number {\r\n if (this.cols) {\r\n return this.cols;\r\n }\r\n\r\n return Math.floor(Math.sqrt(this.tiles.length));\r\n }\r\n\r\n get gridRows(): number {\r\n return Math.ceil(this.tiles.length / this.gridCols);\r\n }\r\n\r\n get gridAspectRatio(): number {\r\n return this.gridRows / this.gridCols;\r\n }\r\n\r\n @Method()\r\n async initGame(tileGroups: TileGroup[] = this.tileGroups, reverseTile: TileDefinition = this.reverseTile) {\r\n console.log('initGame', tileGroups);\r\n this.reverseTile = reverseTile;\r\n this.buildTiles(tileGroups);\r\n }\r\n\r\n private buildTiles(tileGroups: TileGroup[]) {\r\n let result: ITile[] = [];\r\n let index = 0;\r\n\r\n tileGroups.forEach(tg => {\r\n const tiles = getSet(tg.tiles, tg.count);\r\n\r\n result = [\r\n ...result,\r\n ...tiles.map(t => {\r\n return {\r\n id: index++,\r\n data: { ...t },\r\n groupId: tg.id,\r\n uncovered: false,\r\n matched: false\r\n }\r\n })\r\n ]\r\n })\r\n\r\n this.tiles = result.sort(() => Math.random() - .5);\r\n }\r\n\r\n async onTileClick(id: string | number) {\r\n if (this.blockUI) return;\r\n\r\n this.lastMatched = null;\r\n\r\n if (this.selected.includes(id)) {\r\n this.selected = this.selected.filter(i => i !== id);\r\n return;\r\n }\r\n\r\n this.selected = [...this.selected, id];\r\n\r\n if (this.selected.length === 2) {\r\n const t1 = this.tiles.find(t => t.id === this.selected[0]);\r\n const t2 = this.tiles.find(t => t.id === this.selected[1]);\r\n\r\n if (!t1 || !t2) return;\r\n\r\n this.blockUI = true;\r\n\r\n if (t1.groupId === t2.groupId) {\r\n await Promise.all([\r\n this.markAsMatched(t1.id),\r\n this.markAsMatched(t2.id)\r\n ])\r\n this.matched.emit({ t1: t1.data, t2: t2.data, groupId: t1.groupId })\r\n\r\n if (this.keepMatched) {\r\n this.lastMatched = t1.groupId;\r\n }\r\n\r\n this.matchedTiles = [\r\n ...this.matchedTiles, t1.id, t2.id\r\n ]\r\n\r\n } else {\r\n await Promise.all([\r\n this.animateWrongMatch(t1.id),\r\n this.animateWrongMatch(t2.id)\r\n ])\r\n }\r\n this.blockUI = false;\r\n\r\n this.selected = [];\r\n }\r\n\r\n }\r\n\r\n markAsMatched(id: TileID): Promise<void> {\r\n return new Promise(resolve => {\r\n const slot = this.slots.get(id);\r\n if (!slot) return;\r\n\r\n const tile = slot.children[0];\r\n const anim = tile.animate([], { duration: 1000 })\r\n\r\n anim.addEventListener('finish', () => {\r\n resolve();\r\n })\r\n\r\n anim.addEventListener('cancel', () => {\r\n resolve();\r\n })\r\n })\r\n }\r\n\r\n animateWrongMatch(id: TileID): Promise<void> {\r\n return new Promise(resolve => {\r\n const slot = this.slots.get(id);\r\n if (!slot) return;\r\n\r\n const tile = slot.children[0];\r\n const anim = tile.animate([\r\n { rotate: \"0deg\" },\r\n { rotate: \"0deg\" },\r\n { rotate: \"30deg\" },\r\n { rotate: \"0deg\" },\r\n { rotate: \"-30deg\" },\r\n { rotate: \"0deg\" },\r\n { rotate: \"0deg\" },\r\n ], { duration: 1500 })\r\n\r\n anim.addEventListener('finish', () => {\r\n resolve();\r\n })\r\n\r\n anim.addEventListener('cancel', () => {\r\n resolve();\r\n })\r\n })\r\n }\r\n\r\n render() {\r\n return <div part=\"container\" style={{\r\n '--aspect': `${this.gridAspectRatio}`\r\n }}>\r\n <div part=\"list\" style={{\r\n '--cols': `${this.gridCols}`,\r\n '--rows': `${this.gridRows}`\r\n }}>\r\n {this.tiles.map(t => {\r\n return <div part=\"tile-slot\" onClick={() => this.onTileClick(t.id)} ref={el => this.slots.set(t.id, el!)}>\r\n <Tile tile={t}\r\n selected={this.selected.includes(t.id) || t.groupId === this.lastMatched}\r\n matched={this.matchedTiles.includes(t.id) && t.groupId !== this.lastMatched}\r\n reversTile={this.reverseTile}\r\n uncovered={this.selected.includes(t.id) || t.groupId === this.lastMatched}\r\n />\r\n </div>\r\n })}\r\n </div>\r\n </div>\r\n }\r\n}\r\n\r\n"],"version":3}
|
|
@@ -1 +1,50 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import { B as BUILD, c as consoleDevInfo, H, w as win, N as NAMESPACE, p as promiseResolve, g as globalScripts, b as bootstrapLazy } from './index-Br8RptzJ.js';
|
|
2
|
+
export { s as setNonce } from './index-Br8RptzJ.js';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
Stencil Client Patch Browser v4.41.0 | MIT Licensed | https://stenciljs.com
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
var patchBrowser = () => {
|
|
9
|
+
if (BUILD.isDev && !BUILD.isTesting) {
|
|
10
|
+
consoleDevInfo("Running in development mode.");
|
|
11
|
+
}
|
|
12
|
+
if (BUILD.cloneNodeFix) {
|
|
13
|
+
patchCloneNodeFix(H.prototype);
|
|
14
|
+
}
|
|
15
|
+
const scriptElm = BUILD.scriptDataOpts ? win.document && Array.from(win.document.querySelectorAll("script")).find(
|
|
16
|
+
(s) => new RegExp(`/${NAMESPACE}(\\.esm)?\\.js($|\\?|#)`).test(s.src) || s.getAttribute("data-stencil-namespace") === NAMESPACE
|
|
17
|
+
) : null;
|
|
18
|
+
const importMeta = import.meta.url;
|
|
19
|
+
const opts = BUILD.scriptDataOpts ? (scriptElm || {})["data-opts"] || {} : {};
|
|
20
|
+
if (importMeta !== "") {
|
|
21
|
+
opts.resourcesUrl = new URL(".", importMeta).href;
|
|
22
|
+
}
|
|
23
|
+
return promiseResolve(opts);
|
|
24
|
+
};
|
|
25
|
+
var patchCloneNodeFix = (HTMLElementPrototype) => {
|
|
26
|
+
const nativeCloneNodeFn = HTMLElementPrototype.cloneNode;
|
|
27
|
+
HTMLElementPrototype.cloneNode = function(deep) {
|
|
28
|
+
if (this.nodeName === "TEMPLATE") {
|
|
29
|
+
return nativeCloneNodeFn.call(this, deep);
|
|
30
|
+
}
|
|
31
|
+
const clonedNode = nativeCloneNodeFn.call(this, false);
|
|
32
|
+
const srcChildNodes = this.childNodes;
|
|
33
|
+
if (deep) {
|
|
34
|
+
for (let i = 0; i < srcChildNodes.length; i++) {
|
|
35
|
+
if (srcChildNodes[i].nodeType !== 2) {
|
|
36
|
+
clonedNode.appendChild(srcChildNodes[i].cloneNode(true));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return clonedNode;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
patchBrowser().then(async (options) => {
|
|
45
|
+
await globalScripts();
|
|
46
|
+
return bootstrapLazy([["mb-memory-game",[[513,"mb-memory-game",{"tileGroups":[16],"reverseTile":[16],"init":[4],"cols":[2],"keepMatched":[4,"keep-matched"],"tiles":[32],"selected":[32],"matchedTiles":[32],"lastMatched":[32],"initGame":[64]},null,{"tileGroups":[{"watchTileGroups":0}],"matchedTiles":[{"watchMatchedTiles":0}]}]]]], options);
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=memory-game.esm.js.map
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=memory-game.esm.js.map
|
|
@@ -11,10 +11,12 @@ export declare class MbMemoryGame {
|
|
|
11
11
|
watchMatchedTiles(): void;
|
|
12
12
|
cols?: number;
|
|
13
13
|
blockUI: boolean;
|
|
14
|
+
keepMatched: boolean;
|
|
14
15
|
completed: EventEmitter<void>;
|
|
15
16
|
matched: EventEmitter<MatchedEvent>;
|
|
16
17
|
componentWillLoad(): void;
|
|
17
18
|
slots: Map<TileID, HTMLDivElement>;
|
|
19
|
+
lastMatched: string | null;
|
|
18
20
|
get gridCols(): number;
|
|
19
21
|
get gridRows(): number;
|
|
20
22
|
get gridAspectRatio(): number;
|
|
@@ -15,6 +15,10 @@ export namespace Components {
|
|
|
15
15
|
*/
|
|
16
16
|
"init": boolean;
|
|
17
17
|
"initGame": (tileGroups?: TileGroup[], reverseTile?: TileDefinition) => Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* @default false
|
|
20
|
+
*/
|
|
21
|
+
"keepMatched": boolean;
|
|
18
22
|
/**
|
|
19
23
|
* @default { type: 'text', text: '?' }
|
|
20
24
|
*/
|
|
@@ -59,6 +63,10 @@ declare namespace LocalJSX {
|
|
|
59
63
|
* @default true
|
|
60
64
|
*/
|
|
61
65
|
"init"?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* @default false
|
|
68
|
+
*/
|
|
69
|
+
"keepMatched"?: boolean;
|
|
62
70
|
"onCompleted"?: (event: MbMemoryGameCustomEvent<void>) => void;
|
|
63
71
|
"onMatched"?: (event: MbMemoryGameCustomEvent<MatchedEvent>) => void;
|
|
64
72
|
/**
|
|
@@ -16,4 +16,6 @@ export declare class Grid {
|
|
|
16
16
|
static getIndexFromVec(v: Vec2, width: number | Vec2): number;
|
|
17
17
|
static isInGrid(v: Vec2, size: Vec2): boolean;
|
|
18
18
|
static getOrtoSiblings(v: Vec2, size: Vec2): Vec2[];
|
|
19
|
+
static areIndexSiblings(index1: number, index2: number, width: number): boolean;
|
|
20
|
+
static areSiblings(v1: Vec2, v2: Vec2): boolean;
|
|
19
21
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mborecki/memory-game",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Sliding Puzzle",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"typescript": "5.9.3",
|
|
42
42
|
"vitest": "4.0.16",
|
|
43
43
|
"@mb-puzzle/vec2": "0.9.0",
|
|
44
|
-
"@mb-puzzle/grid": "0.
|
|
44
|
+
"@mb-puzzle/grid": "0.3.0"
|
|
45
45
|
},
|
|
46
46
|
"license": "MIT",
|
|
47
47
|
"scripts": {
|