@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.
Files changed (36) hide show
  1. package/dist/memory-game/index-Br8RptzJ.js +6135 -0
  2. package/dist/memory-game/index.esm.js +4 -0
  3. package/dist/{esm → memory-game}/mb-memory-game.entry.js +17 -8
  4. package/dist/memory-game/mb-memory-game.entry.js.map +1 -0
  5. package/dist/memory-game/memory-game.esm.js +50 -1
  6. package/dist/types/components/sliding-puzzle/memory-game.d.ts +2 -0
  7. package/dist/types/components.d.ts +8 -0
  8. package/dist/types/roboczy/mb-puzzle/apps/memory-game/.stencil/shared/grid/src/grid.d.ts +2 -0
  9. package/package.json +2 -2
  10. package/dist/cjs/app-globals-V2Kpy_OQ.js +0 -5
  11. package/dist/cjs/index-D_ddvJ2f.js +0 -3228
  12. package/dist/cjs/index.cjs.js +0 -2
  13. package/dist/cjs/loader.cjs.js +0 -13
  14. package/dist/cjs/mb-memory-game.cjs.entry.js +0 -211
  15. package/dist/cjs/memory-game.cjs.js +0 -25
  16. package/dist/collection/collection-manifest.json +0 -12
  17. package/dist/collection/components/sliding-puzzle/memory-game.css +0 -71
  18. package/dist/collection/components/sliding-puzzle/memory-game.js +0 -354
  19. package/dist/collection/components/sliding-puzzle/tile.js +0 -16
  20. package/dist/collection/components/sliding-puzzle/types.js +0 -1
  21. package/dist/collection/index.js +0 -1
  22. package/dist/collection/utils/get-set.js +0 -23
  23. package/dist/collection/utils/get-set.test.js +0 -31
  24. package/dist/components/index.js +0 -1
  25. package/dist/components/mb-memory-game.js +0 -1
  26. package/dist/esm/app-globals-DQuL1Twl.js +0 -3
  27. package/dist/esm/index-D2pBOsDL.js +0 -3221
  28. package/dist/esm/index.js +0 -1
  29. package/dist/esm/loader.js +0 -11
  30. package/dist/esm/memory-game.js +0 -21
  31. package/dist/index.cjs.js +0 -1
  32. package/dist/index.js +0 -1
  33. package/dist/memory-game/p-D2pBOsDL.js +0 -2
  34. package/dist/memory-game/p-DQuL1Twl.js +0 -1
  35. package/dist/memory-game/p-c3a7e97d.entry.js +0 -1
  36. package/dist/vitest.config.js +0 -4
@@ -0,0 +1,4 @@
1
+
2
+ //# sourceMappingURL=index.esm.js.map
3
+
4
+ //# sourceMappingURL=index.esm.js.map
@@ -1,4 +1,4 @@
1
- import { h, r as registerInstance, c as createEvent } from './index-D2pBOsDL.js';
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: '18002b4e8ba84bb065f5ecbff5e1a3cde40065bd', part: "container", style: {
195
+ return h("div", { key: 'c0744288edcde027bb2ec275abe5c5c8f5201545', part: "container", style: {
190
196
  '--aspect': `${this.gridAspectRatio}`
191
- } }, h("div", { key: '2ac6345adfd73b0690d3e5e3fc34e351c9f9bfd4', part: "list", style: {
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{p as e,b as t}from"./p-D2pBOsDL.js";export{s as setNonce}from"./p-D2pBOsDL.js";import{g as a}from"./p-DQuL1Twl.js";(()=>{const s=import.meta.url,t={};return""!==s&&(t.resourcesUrl=new URL(".",s).href),e(t)})().then((async e=>(await a(),t([["p-c3a7e97d",[[513,"mb-memory-game",{tileGroups:[16],reverseTile:[16],init:[4],cols:[2],tiles:[32],selected:[32],matchedTiles:[32],initGame:[64]},null,{tileGroups:[{watchTileGroups:0}],matchedTiles:[{watchMatchedTiles:0}]}]]]],e))));
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.3",
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.2.2"
44
+ "@mb-puzzle/grid": "0.3.0"
45
45
  },
46
46
  "license": "MIT",
47
47
  "scripts": {
@@ -1,5 +0,0 @@
1
- 'use strict';
2
-
3
- const globalScripts = () => {};
4
-
5
- exports.globalScripts = globalScripts;