@dxos/plugin-chess 0.8.4-main.5ea62a8 → 0.8.4-main.72ec0f3

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 (107) hide show
  1. package/dist/lib/browser/{ChessboardContainer-HBHUXBG3.mjs → ChessboardContainer-5YXEM4VR.mjs} +20 -20
  2. package/dist/lib/browser/ChessboardContainer-5YXEM4VR.mjs.map +7 -0
  3. package/dist/lib/browser/blueprint-definition-FD4TL5EE.mjs +11 -0
  4. package/dist/lib/browser/{chunk-UDWRTBWA.mjs → chunk-5DOZV3PW.mjs} +113 -143
  5. package/dist/lib/browser/chunk-5DOZV3PW.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-PE3IWOFR.mjs → chunk-DUO4WTAM.mjs} +5 -5
  7. package/dist/lib/browser/chunk-DUO4WTAM.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-T275KG4U.mjs → chunk-FBLAVAMY.mjs} +12 -12
  9. package/dist/lib/browser/chunk-FBLAVAMY.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-H65TQTPW.mjs → chunk-Q5TZCIH7.mjs} +2 -2
  11. package/dist/lib/browser/{chunk-VTIITHYS.mjs → chunk-TIIGNOGK.mjs} +30 -14
  12. package/dist/lib/browser/chunk-TIIGNOGK.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +22 -21
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/{intent-resolver-DA5H5633.mjs → intent-resolver-GXZN2EBT.mjs} +5 -5
  16. package/dist/lib/browser/{intent-resolver-DA5H5633.mjs.map → intent-resolver-GXZN2EBT.mjs.map} +1 -1
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{react-surface-FSDNVKZN.mjs → react-surface-KTTAUHAA.mjs} +7 -7
  19. package/dist/lib/browser/{react-surface-FSDNVKZN.mjs.map → react-surface-KTTAUHAA.mjs.map} +1 -1
  20. package/dist/lib/browser/types/index.mjs +2 -2
  21. package/dist/lib/node-esm/{ChessboardContainer-PF75AEMW.mjs → ChessboardContainer-7OQ6TOKB.mjs} +20 -20
  22. package/dist/lib/node-esm/ChessboardContainer-7OQ6TOKB.mjs.map +7 -0
  23. package/dist/lib/node-esm/blueprint-definition-O7ZM3HUF.mjs +12 -0
  24. package/dist/lib/node-esm/{chunk-PIRITYWV.mjs → chunk-F4C2HVZL.mjs} +113 -143
  25. package/dist/lib/node-esm/chunk-F4C2HVZL.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-6OWCPDUA.mjs → chunk-KNOOJFIR.mjs} +5 -5
  27. package/dist/lib/node-esm/chunk-KNOOJFIR.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-5DYLCQBR.mjs → chunk-MP3A3AGA.mjs} +12 -12
  29. package/dist/lib/node-esm/chunk-MP3A3AGA.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-3NZRGOSV.mjs → chunk-RTCAAOLF.mjs} +30 -14
  31. package/dist/lib/node-esm/chunk-RTCAAOLF.mjs.map +7 -0
  32. package/dist/lib/node-esm/{chunk-IFDV434X.mjs → chunk-VVXTAVIS.mjs} +2 -2
  33. package/dist/lib/node-esm/index.mjs +22 -21
  34. package/dist/lib/node-esm/index.mjs.map +3 -3
  35. package/dist/lib/node-esm/{intent-resolver-PODONUD3.mjs → intent-resolver-HK5L6P6Z.mjs} +5 -5
  36. package/dist/lib/node-esm/{intent-resolver-PODONUD3.mjs.map → intent-resolver-HK5L6P6Z.mjs.map} +1 -1
  37. package/dist/lib/node-esm/meta.json +1 -1
  38. package/dist/lib/node-esm/{react-surface-2TW3PIGQ.mjs → react-surface-VO4PSY6O.mjs} +7 -7
  39. package/dist/lib/node-esm/{react-surface-2TW3PIGQ.mjs.map → react-surface-VO4PSY6O.mjs.map} +1 -1
  40. package/dist/lib/node-esm/types/index.mjs +2 -2
  41. package/dist/types/src/ChessPlugin.d.ts +1 -1
  42. package/dist/types/src/ChessPlugin.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  44. package/dist/types/src/capabilities/blueprint-definition.d.ts +2 -2
  45. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  46. package/dist/types/src/components/Card.stories.d.ts +11 -3
  47. package/dist/types/src/components/Card.stories.d.ts.map +1 -1
  48. package/dist/types/src/components/Chessboard.d.ts +11 -12
  49. package/dist/types/src/components/Chessboard.d.ts.map +1 -1
  50. package/dist/types/src/components/Chessboard.stories.d.ts +11 -8
  51. package/dist/types/src/components/Chessboard.stories.d.ts.map +1 -1
  52. package/dist/types/src/components/ChessboardArticle.d.ts +2 -1
  53. package/dist/types/src/components/ChessboardArticle.d.ts.map +1 -1
  54. package/dist/types/src/components/{ChessboardInfo.d.ts → Info.d.ts} +5 -5
  55. package/dist/types/src/components/Info.d.ts.map +1 -0
  56. package/dist/types/src/functions/create.d.ts +2 -2
  57. package/dist/types/src/functions/create.d.ts.map +1 -1
  58. package/dist/types/src/functions/move.d.ts +1 -1
  59. package/dist/types/src/functions/move.d.ts.map +1 -1
  60. package/dist/types/src/functions/play.d.ts +2 -1
  61. package/dist/types/src/functions/play.d.ts.map +1 -1
  62. package/dist/types/src/meta.d.ts +0 -1
  63. package/dist/types/src/meta.d.ts.map +1 -1
  64. package/dist/types/src/translations.d.ts +8 -6
  65. package/dist/types/src/translations.d.ts.map +1 -1
  66. package/dist/types/src/types/Chess.d.ts +2 -2
  67. package/dist/types/src/types/Chess.d.ts.map +1 -1
  68. package/dist/types/src/types/ChessAction.d.ts +1 -1
  69. package/dist/types/src/types/ChessAction.d.ts.map +1 -1
  70. package/dist/types/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +42 -36
  72. package/src/ChessPlugin.tsx +47 -47
  73. package/src/capabilities/artifact-definition.ts +3 -2
  74. package/src/capabilities/blueprint-definition.ts +3 -3
  75. package/src/components/Card.stories.tsx +3 -5
  76. package/src/components/Chessboard.stories.tsx +3 -4
  77. package/src/components/Chessboard.tsx +79 -55
  78. package/src/components/ChessboardArticle.tsx +22 -18
  79. package/src/components/ChessboardContainer.tsx +1 -1
  80. package/src/components/{ChessboardInfo.tsx → Info.tsx} +103 -40
  81. package/src/functions/create.ts +4 -2
  82. package/src/functions/move.ts +4 -2
  83. package/src/functions/play.ts +13 -3
  84. package/src/meta.ts +4 -4
  85. package/src/translations.ts +8 -6
  86. package/src/types/Chess.ts +20 -26
  87. package/src/types/ChessAction.ts +1 -1
  88. package/dist/lib/browser/ChessboardContainer-HBHUXBG3.mjs.map +0 -7
  89. package/dist/lib/browser/blueprint-definition-W5PLLXPP.mjs +0 -11
  90. package/dist/lib/browser/chunk-PE3IWOFR.mjs.map +0 -7
  91. package/dist/lib/browser/chunk-T275KG4U.mjs.map +0 -7
  92. package/dist/lib/browser/chunk-UDWRTBWA.mjs.map +0 -7
  93. package/dist/lib/browser/chunk-VTIITHYS.mjs.map +0 -7
  94. package/dist/lib/node-esm/ChessboardContainer-PF75AEMW.mjs.map +0 -7
  95. package/dist/lib/node-esm/blueprint-definition-PR5YZC6M.mjs +0 -12
  96. package/dist/lib/node-esm/chunk-3NZRGOSV.mjs.map +0 -7
  97. package/dist/lib/node-esm/chunk-5DYLCQBR.mjs.map +0 -7
  98. package/dist/lib/node-esm/chunk-6OWCPDUA.mjs.map +0 -7
  99. package/dist/lib/node-esm/chunk-PIRITYWV.mjs.map +0 -7
  100. package/dist/types/src/components/ChessboardInfo.d.ts.map +0 -1
  101. package/dist/types/src/components/ChessboardPlayers.d.ts +0 -8
  102. package/dist/types/src/components/ChessboardPlayers.d.ts.map +0 -1
  103. package/src/components/ChessboardPlayers.tsx +0 -98
  104. /package/dist/lib/browser/{blueprint-definition-W5PLLXPP.mjs.map → blueprint-definition-FD4TL5EE.mjs.map} +0 -0
  105. /package/dist/lib/browser/{chunk-H65TQTPW.mjs.map → chunk-Q5TZCIH7.mjs.map} +0 -0
  106. /package/dist/lib/node-esm/{blueprint-definition-PR5YZC6M.mjs.map → blueprint-definition-O7ZM3HUF.mjs.map} +0 -0
  107. /package/dist/lib/node-esm/{chunk-IFDV434X.mjs.map → chunk-VVXTAVIS.mjs.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Chessboard
3
- } from "./chunk-UDWRTBWA.mjs";
3
+ } from "./chunk-5DOZV3PW.mjs";
4
4
  import {
5
5
  meta
6
- } from "./chunk-PE3IWOFR.mjs";
6
+ } from "./chunk-DUO4WTAM.mjs";
7
7
 
8
8
  // src/components/ChessboardContainer.tsx
9
9
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
@@ -13,10 +13,10 @@ import { getSpace } from "@dxos/react-client/echo";
13
13
  // src/components/ChessboardArticle.tsx
14
14
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
15
15
  import React, { useCallback, useRef, useState } from "react";
16
- import { IconButton, useTranslation } from "@dxos/react-ui";
16
+ import { Toolbar, useTranslation } from "@dxos/react-ui";
17
17
  import { StackItem } from "@dxos/react-ui-stack";
18
18
  import { mx } from "@dxos/react-ui-theme";
19
- var ChessboardArticle = ({ game }) => {
19
+ var ChessboardArticle = ({ game, role }) => {
20
20
  var _effect = _useSignals();
21
21
  try {
22
22
  const { t } = useTranslation(meta.id);
@@ -27,13 +27,22 @@ var ChessboardArticle = ({ game }) => {
27
27
  controller.current?.setMoveNumber(index);
28
28
  }, []);
29
29
  return /* @__PURE__ */ React.createElement(StackItem.Content, {
30
- classNames: "@container bs-full is-full overflow-hidden"
30
+ toolbar: true,
31
+ classNames: "@container"
31
32
  }, /* @__PURE__ */ React.createElement(Chessboard.Root, {
32
33
  game,
33
34
  ref: controller
34
- }, /* @__PURE__ */ React.createElement("div", {
35
- className: mx("grid grid-rows-[1fr_4rem] bs-full is-full gap-2", open && "@3xl:grid-cols-[1fr_320px]")
35
+ }, /* @__PURE__ */ React.createElement(Toolbar.Root, null, /* @__PURE__ */ React.createElement(Toolbar.IconButton, {
36
+ icon: "ph--info--regular",
37
+ iconOnly: true,
38
+ label: t("toggle info button"),
39
+ disabled: open,
40
+ classNames: mx("invisible @3xl:visible"),
41
+ onClick: () => setOpen((open2) => !open2)
42
+ })), /* @__PURE__ */ React.createElement("div", {
43
+ className: mx("grid bs-full is-full gap-2", open && "@3xl:grid-cols-[1fr_320px]", role === "section" && "aspect-square", role === "section" && open && "@3xl:aspect-auto")
36
44
  }, /* @__PURE__ */ React.createElement(Chessboard.Content, null, /* @__PURE__ */ React.createElement(Chessboard.Board, {
45
+ classNames: "m-4 rounded-sm overflow-hidden",
37
46
  orientation
38
47
  })), open && /* @__PURE__ */ React.createElement("div", {
39
48
  className: "hidden @3xl:flex flex-col p-8 justify-center items-center overflow-hidden"
@@ -44,17 +53,7 @@ var ChessboardArticle = ({ game }) => {
44
53
  onOrientationChange: setOrientation,
45
54
  onClose: () => setOpen(false),
46
55
  onSelect: handleSelect
47
- })), /* @__PURE__ */ React.createElement("div", {
48
- className: "flex justify-center items-center"
49
- }, /* @__PURE__ */ React.createElement(Chessboard.Players, null, /* @__PURE__ */ React.createElement(IconButton, {
50
- variant: "ghost",
51
- icon: "ph--info--regular",
52
- iconOnly: true,
53
- label: t("button toggle info"),
54
- size: 6,
55
- classNames: mx("invisible", !open && "@3xl:visible"),
56
- onClick: () => setOpen((open2) => !open2)
57
- }))))));
56
+ })))));
58
57
  } finally {
59
58
  _effect.f();
60
59
  }
@@ -80,7 +79,8 @@ var ChessboardContainer = ({ game, role }) => {
80
79
  }
81
80
  default: {
82
81
  return /* @__PURE__ */ React2.createElement(ChessboardArticle, {
83
- game
82
+ game,
83
+ role
84
84
  });
85
85
  }
86
86
  }
@@ -93,4 +93,4 @@ export {
93
93
  ChessboardContainer,
94
94
  ChessboardContainer_default as default
95
95
  };
96
- //# sourceMappingURL=ChessboardContainer-HBHUXBG3.mjs.map
96
+ //# sourceMappingURL=ChessboardContainer-5YXEM4VR.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ChessboardContainer.tsx", "../../../src/components/ChessboardArticle.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { getSpace } from '@dxos/react-client/echo';\n\nimport { type Chess } from '../types';\n\nimport { Chessboard } from './Chessboard';\nimport { ChessboardArticle } from './ChessboardArticle';\n\nexport type ChessboardContainerProps = {\n game: Chess.Game;\n role?: string;\n};\n\nexport const ChessboardContainer = ({ game, role }: ChessboardContainerProps) => {\n const space = getSpace(game);\n if (!space) {\n return null;\n }\n\n switch (role) {\n case 'card--popover':\n case 'card--intrinsic':\n case 'card--extrinsic': {\n return (\n <Chessboard.Root game={game}>\n <Chessboard.Content role={role}>\n <Chessboard.Board />\n </Chessboard.Content>\n </Chessboard.Root>\n );\n }\n\n default: {\n return <ChessboardArticle game={game} role={role} />;\n }\n }\n};\n\nexport default ChessboardContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useRef, useState } from 'react';\n\nimport { Toolbar, useTranslation } from '@dxos/react-ui';\nimport { type Player } from '@dxos/react-ui-gameboard';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { meta } from '../meta';\nimport { type Chess } from '../types';\n\nimport { Chessboard, type ChessboardController, type ChessboardInfoProps } from './Chessboard';\n\nexport const ChessboardArticle = ({ game, role }: { game: Chess.Game; role?: string }) => {\n const { t } = useTranslation(meta.id);\n const [orientation, setOrientation] = useState<Player>('white');\n const [open, setOpen] = useState(true);\n const controller = useRef<ChessboardController>(null);\n\n // TODO(burdon): Keyboard handler.\n const handleSelect = useCallback<NonNullable<ChessboardInfoProps['onSelect']>>((index) => {\n controller.current?.setMoveNumber(index);\n }, []);\n\n return (\n <StackItem.Content toolbar classNames='@container'>\n <Chessboard.Root game={game} ref={controller}>\n <Toolbar.Root>\n <Toolbar.IconButton\n icon='ph--info--regular'\n iconOnly\n label={t('toggle info button')}\n disabled={open}\n classNames={mx('invisible @3xl:visible')}\n onClick={() => setOpen((open) => !open)}\n />\n </Toolbar.Root>\n <div\n className={mx(\n 'grid bs-full is-full gap-2',\n open && '@3xl:grid-cols-[1fr_320px]',\n role === 'section' && 'aspect-square',\n role === 'section' && open && '@3xl:aspect-auto',\n )}\n >\n <Chessboard.Content>\n <Chessboard.Board classNames='m-4 rounded-sm overflow-hidden' orientation={orientation} />\n </Chessboard.Content>\n {open && (\n <div className='hidden @3xl:flex flex-col p-8 justify-center items-center overflow-hidden'>\n <Chessboard.Info\n orientation={orientation}\n min={8}\n max={8}\n onOrientationChange={setOrientation}\n onClose={() => setOpen(false)}\n onSelect={handleSelect}\n />\n </div>\n )}\n </div>\n </Chessboard.Root>\n </StackItem.Content>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;AAIA,OAAOA,YAAW;AAElB,SAASC,gBAAgB;;;;ACFzB,OAAOC,SAASC,aAAaC,QAAQC,gBAAgB;AAErD,SAASC,SAASC,sBAAsB;AAExC,SAASC,iBAAiB;AAC1B,SAASC,UAAU;AAOZ,IAAMC,oBAAoB,CAAC,EAAEC,MAAMC,KAAI,MAAuC;;;AACnF,UAAM,EAAEC,EAAC,IAAKC,eAAeC,KAAKC,EAAE;AACpC,UAAM,CAACC,aAAaC,cAAAA,IAAkBC,SAAiB,OAAA;AACvD,UAAM,CAACC,MAAMC,OAAAA,IAAWF,SAAS,IAAA;AACjC,UAAMG,aAAaC,OAA6B,IAAA;AAGhD,UAAMC,eAAeC,YAA0D,CAACC,UAAAA;AAC9EJ,iBAAWK,SAASC,cAAcF,KAAAA;IACpC,GAAG,CAAA,CAAE;AAEL,WACE,sBAAA,cAACG,UAAUC,SAAO;MAACC,SAAAA;MAAQC,YAAW;OACpC,sBAAA,cAACC,WAAWC,MAAI;MAACvB;MAAYwB,KAAKb;OAChC,sBAAA,cAACc,QAAQF,MAAI,MACX,sBAAA,cAACE,QAAQC,YAAU;MACjBC,MAAK;MACLC,UAAAA;MACAC,OAAO3B,EAAE,oBAAA;MACT4B,UAAUrB;MACVY,YAAYU,GAAG,wBAAA;MACfC,SAAS,MAAMtB,QAAQ,CAACD,UAAS,CAACA,KAAAA;SAGtC,sBAAA,cAACwB,OAAAA;MACCC,WAAWH,GACT,8BACAtB,QAAQ,8BACRR,SAAS,aAAa,iBACtBA,SAAS,aAAaQ,QAAQ,kBAAA;OAGhC,sBAAA,cAACa,WAAWH,SAAO,MACjB,sBAAA,cAACG,WAAWa,OAAK;MAACd,YAAW;MAAiCf;SAE/DG,QACC,sBAAA,cAACwB,OAAAA;MAAIC,WAAU;OACb,sBAAA,cAACZ,WAAWc,MAAI;MACd9B;MACA+B,KAAK;MACLC,KAAK;MACLC,qBAAqBhC;MACrBiC,SAAS,MAAM9B,QAAQ,KAAA;MACvB+B,UAAU5B;;;;;AAQ1B;;;ADjDO,IAAM6B,sBAAsB,CAAC,EAAEC,MAAMC,KAAI,MAA4B;;;AAC1E,UAAMC,QAAQC,SAASH,IAAAA;AACvB,QAAI,CAACE,OAAO;AACV,aAAO;IACT;AAEA,YAAQD,MAAAA;MACN,KAAK;MACL,KAAK;MACL,KAAK,mBAAmB;AACtB,eACE,gBAAAG,OAAA,cAACC,WAAWC,MAAI;UAACN;WACf,gBAAAI,OAAA,cAACC,WAAWE,SAAO;UAACN;WAClB,gBAAAG,OAAA,cAACC,WAAWG,OAAK,IAAA,CAAA,CAAA;MAIzB;MAEA,SAAS;AACP,eAAO,gBAAAJ,OAAA,cAACK,mBAAAA;UAAkBT;UAAYC;;MACxC;IACF;;;;AACF;AAEA,IAAA,8BAAeF;",
6
+ "names": ["React", "getSpace", "React", "useCallback", "useRef", "useState", "Toolbar", "useTranslation", "StackItem", "mx", "ChessboardArticle", "game", "role", "t", "useTranslation", "meta", "id", "orientation", "setOrientation", "useState", "open", "setOpen", "controller", "useRef", "handleSelect", "useCallback", "index", "current", "setMoveNumber", "StackItem", "Content", "toolbar", "classNames", "Chessboard", "Root", "ref", "Toolbar", "IconButton", "icon", "iconOnly", "label", "disabled", "mx", "onClick", "div", "className", "Board", "Info", "min", "max", "onOrientationChange", "onClose", "onSelect", "ChessboardContainer", "game", "role", "space", "getSpace", "React", "Chessboard", "Root", "Content", "Board", "ChessboardArticle"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import {
2
+ CHESS_BLUEPRINT_KEY,
3
+ blueprint_definition_default
4
+ } from "./chunk-TIIGNOGK.mjs";
5
+ import "./chunk-FBLAVAMY.mjs";
6
+ import "./chunk-DUO4WTAM.mjs";
7
+ export {
8
+ CHESS_BLUEPRINT_KEY,
9
+ blueprint_definition_default as default
10
+ };
11
+ //# sourceMappingURL=blueprint-definition-FD4TL5EE.mjs.map
@@ -1,62 +1,78 @@
1
1
  import {
2
2
  meta
3
- } from "./chunk-PE3IWOFR.mjs";
3
+ } from "./chunk-DUO4WTAM.mjs";
4
4
 
5
5
  // src/components/Chessboard.tsx
6
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
7
- import React3, { forwardRef, useCallback, useEffect as useEffect2, useImperativeHandle, useMemo as useMemo2, useRef as useRef2 } from "react";
6
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
7
+ import React2, { forwardRef, useCallback, useEffect as useEffect2, useImperativeHandle, useMemo as useMemo2, useRef as useRef2 } from "react";
8
8
  import { addEventListener } from "@dxos/async";
9
- import { ChessModel, Gameboard, Chessboard as NativeChessboard } from "@dxos/react-ui-gameboard";
10
- import { mx as mx3 } from "@dxos/react-ui-theme";
9
+ import { ChessModel, Gameboard, Chessboard as NaturalChessboard, getRawPgn, useGameboardContext as useGameboardContext2 } from "@dxos/react-ui-gameboard";
10
+ import { useSoundEffect } from "@dxos/react-ui-sfx";
11
+ import { mx as mx2 } from "@dxos/react-ui-theme";
11
12
 
12
- // src/components/ChessboardInfo.tsx
13
+ // src/components/Info.tsx
13
14
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
14
15
  import React, { useEffect, useMemo, useRef } from "react";
15
- import { Icon, IconButton, useTranslation } from "@dxos/react-ui";
16
+ import { generateName } from "@dxos/display-name";
17
+ import { getSpace, useMembers } from "@dxos/react-client/echo";
18
+ import { Icon, IconButton, Select, useTranslation } from "@dxos/react-ui";
16
19
  import { useGameboardContext } from "@dxos/react-ui-gameboard";
17
20
  import { mx } from "@dxos/react-ui-theme";
18
- var ChessboardInfo = ({ classNames, orientation = "white", onOrientationChange, onClose, ...props }) => {
21
+ var Info = ({ classNames, orientation = "white", onOrientationChange, onClose, ...props }) => {
19
22
  var _effect = _useSignals();
20
23
  try {
21
24
  const { t } = useTranslation(meta.id);
22
- const { model } = useGameboardContext(ChessboardInfo.displayName);
25
+ const { model } = useGameboardContext(Info.displayName);
26
+ const members = useMembers(getSpace(model.object)?.key);
23
27
  return /* @__PURE__ */ React.createElement("div", {
24
- className: mx("grid grid-rows-[min-content_1fr_min-content] is-full min-is-[16rem] p-2 overflow-hidden bg-inputSurface rounded", classNames)
28
+ className: mx("grid grid-rows-[min-content_1fr_min-content] is-full min-is-[18rem] p-2 overflow-hidden bg-groupSurface rounded-sm", classNames)
25
29
  }, /* @__PURE__ */ React.createElement(PlayerIndicator, {
26
30
  model,
27
31
  player: orientation === "white" ? "black" : "white",
28
- title: model.object.players?.[orientation === "white" ? "black" : "white"]
29
- }, onClose && /* @__PURE__ */ React.createElement(IconButton, {
30
- icon: "ph--x--regular",
31
- iconOnly: true,
32
- label: t("button flip"),
33
- size: 4,
34
- onClick: onClose
32
+ icon: onClose && /* @__PURE__ */ React.createElement(IconButton, {
33
+ icon: "ph--x--regular",
34
+ iconOnly: true,
35
+ label: t("close info button"),
36
+ size: 4,
37
+ onClick: onClose
38
+ })
39
+ }, /* @__PURE__ */ React.createElement(PlayerSelector, {
40
+ value: model.object.players?.[orientation === "white" ? "black" : "white"],
41
+ onValueChange: (value) => {
42
+ model.object.players[orientation === "white" ? "black" : "white"] = value;
43
+ },
44
+ members
35
45
  })), /* @__PURE__ */ React.createElement(History, {
36
46
  model,
37
47
  ...props
38
48
  }), /* @__PURE__ */ React.createElement(PlayerIndicator, {
39
49
  model,
40
50
  player: orientation,
41
- title: model.object.players?.[orientation]
42
- }, onOrientationChange && /* @__PURE__ */ React.createElement(IconButton, {
43
- icon: "ph--arrows-down-up--regular",
44
- iconOnly: true,
45
- label: t("button flip"),
46
- size: 6,
47
- classNames: mx("transition duration-200 ease-linear", orientation === "white" && "rotate-180"),
48
- onClick: () => onOrientationChange(orientation === "white" ? "black" : "white")
51
+ icon: onOrientationChange && /* @__PURE__ */ React.createElement(IconButton, {
52
+ classNames: mx("transition duration-200 ease-linear", orientation === "white" && "rotate-180"),
53
+ icon: "ph--arrows-clockwise--regular",
54
+ iconOnly: true,
55
+ label: t("flip board button"),
56
+ size: 4,
57
+ onClick: () => onOrientationChange(orientation === "white" ? "black" : "white")
58
+ })
59
+ }, /* @__PURE__ */ React.createElement(PlayerSelector, {
60
+ value: model.object.players?.[orientation],
61
+ onValueChange: (value) => {
62
+ model.object.players[orientation] = value;
63
+ },
64
+ members
49
65
  })));
50
66
  } finally {
51
67
  _effect.f();
52
68
  }
53
69
  };
54
- ChessboardInfo.displayName = "Chessboard.Info";
70
+ Info.displayName = "Chessboard.Info";
55
71
  var History = ({ classNames, model, min, max, onSelect }) => {
56
72
  var _effect = _useSignals();
57
73
  try {
58
74
  const { t } = useTranslation(meta.id);
59
- const label = model.game.isGameOver() ? model.game.isCheckmate() ? t("game.checkmate") : model.game.isStalemate() ? t("game.stalemate") : t("game.draw") : model.game.isCheck() ? t("game.check") : void 0;
75
+ const label = model.game.isGameOver() ? model.game.isCheckmate() ? t("game.checkmate label") : model.game.isStalemate() ? t("game.stalemate label") : t("game.draw label") : model.game.isCheck() ? t("game.check label") : void 0;
60
76
  const history = model.game.history();
61
77
  const moves = useMemo(() => history.reduce((acc, move, index) => {
62
78
  if (index % 2 === 0) {
@@ -96,7 +112,7 @@ var History = ({ classNames, model, min, max, onSelect }) => {
96
112
  ]);
97
113
  return /* @__PURE__ */ React.createElement("div", {
98
114
  ref: scrollerRef,
99
- className: mx("overflow-y-scroll", classNames),
115
+ className: mx("overflow-y-auto", classNames),
100
116
  style: {
101
117
  minHeight: min === void 0 ? "auto" : `${min * 24}px`,
102
118
  maxHeight: max === void 0 ? "auto" : `${max * 24}px`
@@ -121,12 +137,12 @@ var History = ({ classNames, model, min, max, onSelect }) => {
121
137
  _effect.f();
122
138
  }
123
139
  };
124
- var PlayerIndicator = ({ children, model, player, title }) => {
140
+ var PlayerIndicator = ({ children, model, player, icon }) => {
125
141
  var _effect = _useSignals();
126
142
  try {
127
143
  const turn = player === (model.game.turn() === "w" ? "white" : "black");
128
144
  return /* @__PURE__ */ React.createElement("div", {
129
- className: "grid grid-cols-[2rem_1fr_2rem] gap-1 bs-[--rail-size] pis-1 pie-1 flex items-center overflow-hidden"
145
+ className: "grid grid-cols-[2rem_1fr_2rem] gap-2 bs-[--rail-size] pli-1 flex items-center overflow-hidden"
130
146
  }, /* @__PURE__ */ React.createElement("div", {
131
147
  className: "place-items-center"
132
148
  }, /* @__PURE__ */ React.createElement(Icon, {
@@ -134,107 +150,46 @@ var PlayerIndicator = ({ children, model, player, title }) => {
134
150
  size: 6,
135
151
  classNames: mx(turn && (model.game.isCheckmate() ? "text-red-500" : "text-green-500"))
136
152
  })), /* @__PURE__ */ React.createElement("div", {
137
- className: "truncate"
138
- }, title), children);
139
- } finally {
140
- _effect.f();
141
- }
142
- };
143
-
144
- // src/components/ChessboardPlayers.tsx
145
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
146
- import React2 from "react";
147
- import { generateName } from "@dxos/display-name";
148
- import { getSpace, useMembers } from "@dxos/react-client/echo";
149
- import { Icon as Icon2, Input, Select, useThemeContext } from "@dxos/react-ui";
150
- import { useGameboardContext as useGameboardContext2 } from "@dxos/react-ui-gameboard";
151
- import { mx as mx2 } from "@dxos/react-ui-theme";
152
- var ChessboardPlayers = ({ classNames, children }) => {
153
- var _effect = _useSignals2();
154
- try {
155
- const { model } = useGameboardContext2(ChessboardPlayers.displayName);
156
- const members = useMembers(getSpace(model.object)?.key);
157
- const players = model.object.players;
158
- if (!players) {
159
- return null;
160
- }
161
- return /* @__PURE__ */ React2.createElement("div", {
162
- role: "none",
163
- className: mx2("grid grid-cols-[1fr_min-content_1fr] pis-2 pie-2 overflow-hidden", classNames)
164
- }, /* @__PURE__ */ React2.createElement("div", {
165
- role: "none",
166
- className: "flex flex-row-reverse items-center gap-2"
167
- }, /* @__PURE__ */ React2.createElement(PlayerSelect, {
168
- side: "white",
169
- value: players.white,
170
- onValueChange: (player) => players.white = player,
171
- members
172
- })), /* @__PURE__ */ React2.createElement("div", {
173
- className: "flex flex-row justify-center items-center"
174
- }, children), /* @__PURE__ */ React2.createElement("div", {
175
- role: "none",
176
- className: "flex flex-row items-center gap-2"
177
- }, /* @__PURE__ */ React2.createElement(PlayerSelect, {
178
- side: "black",
179
- value: players.black,
180
- onValueChange: (player) => players.black = player,
181
- members
182
- })));
153
+ className: "truncate overflow-hidden items-center"
154
+ }, children), icon);
183
155
  } finally {
184
156
  _effect.f();
185
157
  }
186
158
  };
187
- ChessboardPlayers.displayName = "Chessboard.Players";
188
- var PlayerSelect = ({ side, value, onValueChange, members }) => {
189
- var _effect = _useSignals2();
159
+ var PlayerSelector = ({ value, onValueChange, members }) => {
160
+ var _effect = _useSignals();
190
161
  try {
191
- const { themeMode } = useThemeContext();
192
- const iconFillMode = side === "black" && themeMode === "light" || side === "white" && themeMode === "dark" ? "fill" : void 0;
193
- return /* @__PURE__ */ React2.createElement(Input.Root, null, /* @__PURE__ */ React2.createElement(Input.Label, null, /* @__PURE__ */ React2.createElement(Icon2, {
194
- "aria-label": `Chess icon for side ${side}`,
195
- icon: `ph--crown-cross--${iconFillMode || "regular"}`,
196
- size: 6
197
- })), /* @__PURE__ */ React2.createElement(Select.Root, {
162
+ const { t } = useTranslation(meta.id);
163
+ return /* @__PURE__ */ React.createElement(Select.Root, {
198
164
  value,
199
165
  onValueChange
200
- }, /* @__PURE__ */ React2.createElement(Select.TriggerButton, {
201
- placeholder: "Select player"
202
- }), /* @__PURE__ */ React2.createElement(Select.Portal, null, /* @__PURE__ */ React2.createElement(Select.Content, null, /* @__PURE__ */ React2.createElement(Select.Viewport, null, members.map((member) => {
166
+ }, /* @__PURE__ */ React.createElement(Select.TriggerButton, {
167
+ placeholder: t("select player button")
168
+ }), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, members.map((member) => {
203
169
  const memberKey = member.identity.identityKey.toHex();
204
170
  const displayName = member.identity?.profile?.displayName || generateName(memberKey);
205
- return /* @__PURE__ */ React2.createElement(Select.Option, {
171
+ return /* @__PURE__ */ React.createElement(Select.Option, {
206
172
  key: memberKey,
207
173
  value: memberKey
208
174
  }, displayName);
209
- })), /* @__PURE__ */ React2.createElement(Select.Arrow, null)))));
175
+ })), /* @__PURE__ */ React.createElement(Select.Arrow, null))));
210
176
  } finally {
211
177
  _effect.f();
212
178
  }
213
179
  };
214
180
 
215
181
  // src/components/Chessboard.tsx
216
- function _define_property(obj, key, value) {
217
- if (key in obj) {
218
- Object.defineProperty(obj, key, {
219
- value,
220
- enumerable: true,
221
- configurable: true,
222
- writable: true
223
- });
224
- } else {
225
- obj[key] = value;
226
- }
227
- return obj;
228
- }
229
182
  var ExtendedChessModel = class extends ChessModel {
183
+ object;
230
184
  constructor(object) {
231
- super(), _define_property(this, "object", void 0), this.object = object;
185
+ super(), this.object = object;
232
186
  }
233
187
  };
234
- var ChessboardRoot = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRef) => {
235
- var _effect = _useSignals3();
188
+ var Root = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRef) => {
189
+ var _effect = _useSignals2();
236
190
  try {
237
191
  const model = useMemo2(() => new ExtendedChessModel(game), []);
192
+ const click = useSoundEffect("Click");
238
193
  useImperativeHandle(forwardedRef, () => {
239
194
  return {
240
195
  setMoveNumber: (index) => model.setMoveIndex(index)
@@ -243,15 +198,56 @@ var ChessboardRoot = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRe
243
198
  model
244
199
  ]);
245
200
  useEffect2(() => {
246
- model.update(game.pgn);
201
+ if (model.pgn !== getRawPgn(game.pgn ?? "")) {
202
+ const silent = model.pgn === "*";
203
+ model.update(game.pgn);
204
+ if (!silent) {
205
+ void click.play();
206
+ }
207
+ }
247
208
  }, [
248
209
  game.pgn
249
210
  ]);
211
+ const handleDrop = useCallback((move) => {
212
+ if (!model.makeMove(move)) {
213
+ return false;
214
+ }
215
+ void click.play();
216
+ game.pgn = model.pgn;
217
+ return true;
218
+ }, [
219
+ model
220
+ ]);
221
+ return /* @__PURE__ */ React2.createElement(Gameboard.Root, {
222
+ model,
223
+ onDrop: handleDrop
224
+ }, children);
225
+ } finally {
226
+ _effect.f();
227
+ }
228
+ });
229
+ var Content = ({ classNames, children, role }) => {
230
+ var _effect = _useSignals2();
231
+ try {
232
+ return /* @__PURE__ */ React2.createElement(Gameboard.Content, {
233
+ classNames: mx2(classNames, role === "card--popover" && "size-container popover-square"),
234
+ grow: !role || role === "card--extrinsic",
235
+ contain: !role || role === "card--extrinsic" || role === "card--popover"
236
+ }, children);
237
+ } finally {
238
+ _effect.f();
239
+ }
240
+ };
241
+ var Board = (props) => {
242
+ var _effect = _useSignals2();
243
+ try {
244
+ const { model } = useGameboardContext2(Board.displayName);
250
245
  const ref = useRef2(null);
251
246
  useEffect2(() => {
252
247
  if (!ref.current) {
253
248
  return;
254
249
  }
250
+ ref.current.setAttribute("data-arrow-keys", "all");
255
251
  return addEventListener(ref.current, "keydown", (ev) => {
256
252
  switch (ev.key) {
257
253
  case "ArrowUp":
@@ -275,50 +271,24 @@ var ChessboardRoot = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRe
275
271
  }, [
276
272
  model
277
273
  ]);
278
- const handleDrop = useCallback((move) => {
279
- if (model.makeMove(move)) {
280
- game.pgn = model.pgn;
281
- return true;
282
- }
283
- return false;
284
- }, [
285
- model
286
- ]);
287
- return /* @__PURE__ */ React3.createElement(Gameboard.Root, {
288
- model,
289
- onDrop: handleDrop
290
- }, /* @__PURE__ */ React3.createElement("div", {
274
+ return /* @__PURE__ */ React2.createElement(NaturalChessboard, {
291
275
  ref,
292
- role: "none",
293
- tabIndex: 0,
294
- className: "grid grow outline-none"
295
- }, children));
296
- } finally {
297
- _effect.f();
298
- }
299
- });
300
- var ChessboardContent = ({ classNames, children, role }) => {
301
- var _effect = _useSignals3();
302
- try {
303
- return /* @__PURE__ */ React3.createElement(Gameboard.Content, {
304
- classNames: mx3(classNames, role === "card--popover" && "size-container popover-square"),
305
- grow: !role || role === "card--extrinsic",
306
- contain: !role || role === "card--extrinsic" || role === "card--popover"
307
- }, children);
276
+ ...props
277
+ });
308
278
  } finally {
309
279
  _effect.f();
310
280
  }
311
281
  };
282
+ Board.displayName = "Chessboard.Board";
312
283
  var Chessboard = {
313
- Root: ChessboardRoot,
314
- Content: ChessboardContent,
315
- Board: NativeChessboard,
316
- Info: ChessboardInfo,
317
- Players: ChessboardPlayers
284
+ Root,
285
+ Content,
286
+ Board,
287
+ Info
318
288
  };
319
289
 
320
290
  export {
321
291
  ExtendedChessModel,
322
292
  Chessboard
323
293
  };
324
- //# sourceMappingURL=chunk-UDWRTBWA.mjs.map
294
+ //# sourceMappingURL=chunk-5DOZV3PW.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Chessboard.tsx", "../../../src/components/Info.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, {\n type PropsWithChildren,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport {\n ChessModel,\n Gameboard,\n type GameboardRootProps,\n Chessboard as NaturalChessboard,\n type ChessboardProps as NaturalChessboardProps,\n getRawPgn,\n useGameboardContext,\n} from '@dxos/react-ui-gameboard';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { type Chess } from '../types';\n\nimport { Info, type InfoProps } from './Info';\n\nexport interface ChessboardController {\n setMoveNumber(index: number): void;\n}\n\nexport class ExtendedChessModel extends ChessModel {\n constructor(readonly object: Chess.Game) {\n super();\n }\n}\n\n//\n// Root\n//\n\ntype RootProps = PropsWithChildren<{\n game: Chess.Game;\n}>;\n\nconst Root = forwardRef<ChessboardController, RootProps>(({ game, children }, forwardedRef) => {\n const model = useMemo(() => new ExtendedChessModel(game), []);\n const click = useSoundEffect('Click');\n\n // Controller.\n useImperativeHandle(forwardedRef, () => {\n return {\n setMoveNumber: (index) => model.setMoveIndex(index),\n };\n }, [model]);\n\n // External change.\n // NOTE: Warning if user has not interacted with the board.\n useEffect(() => {\n if (model.pgn !== getRawPgn(game.pgn ?? '')) {\n const silent = model.pgn === '*';\n model.update(game.pgn);\n if (!silent) {\n void click.play();\n }\n }\n }, [game.pgn]);\n\n // Move.\n const handleDrop = useCallback<NonNullable<GameboardRootProps<ChessModel>['onDrop']>>(\n (move) => {\n if (!model.makeMove(move)) {\n return false;\n }\n\n void click.play();\n game.pgn = model.pgn;\n return true;\n },\n [model],\n );\n\n return (\n <Gameboard.Root model={model} onDrop={handleDrop}>\n {children}\n </Gameboard.Root>\n );\n});\n\n//\n// Content\n//\n\ntype Role = 'card--popover' | 'card--intrinsic' | 'card--extrinsic';\n\ntype ContentProps = ThemedClassName<PropsWithChildren<{ role?: Role }>>;\n\nconst Content = ({ classNames, children, role }: ContentProps) => {\n return (\n <Gameboard.Content\n classNames={mx(classNames, role === 'card--popover' && 'size-container popover-square')}\n grow={!role || role === 'card--extrinsic'}\n contain={!role || role === 'card--extrinsic' || role === 'card--popover'}\n >\n {children}\n </Gameboard.Content>\n );\n};\n\n//\n// Board\n//\n\ntype BoardProps = NaturalChessboardProps;\n\nconst Board = (props: BoardProps) => {\n const { model } = useGameboardContext<ChessModel>(Board.displayName);\n\n // Keyboard navigation.\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n // Participate in keyboard navigation (set tabIndex={0})\n ref.current.setAttribute('data-arrow-keys', 'all');\n\n return addEventListener(ref.current, 'keydown', (ev) => {\n switch (ev.key) {\n case 'ArrowUp':\n model.setMoveIndex(0);\n break;\n case 'ArrowDown':\n model.setMoveIndex(model.game.history().length);\n break;\n case 'ArrowLeft':\n if (model.moveIndex.value > 0) {\n model.setMoveIndex(model.moveIndex.value - 1);\n }\n break;\n case 'ArrowRight':\n if (model.moveIndex.value < model.game.history().length) {\n model.setMoveIndex(model.moveIndex.value + 1);\n }\n break;\n }\n });\n }, [model]);\n\n return <NaturalChessboard ref={ref} {...props} />;\n};\n\nBoard.displayName = 'Chessboard.Board';\n\n//\n// Chessboard\n//\n\nexport const Chessboard = {\n Root: Root,\n Content: Content,\n Board: Board,\n Info: Info,\n};\n\nexport type {\n RootProps as ChessboardRootProps,\n ContentProps as ChessboardContentProps,\n BoardProps as ChessboardBoardProps,\n InfoProps as ChessboardInfoProps,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren, useEffect, useMemo, useRef } from 'react';\n\nimport { generateName } from '@dxos/display-name';\nimport { type SpaceMember, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { Icon, IconButton, Select, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { type Player, useGameboardContext } from '@dxos/react-ui-gameboard';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { meta } from '../meta';\n\nimport { type ExtendedChessModel } from './Chessboard';\n\nexport type InfoProps = ThemedClassName<\n {\n orientation?: Player;\n onOrientationChange?: (orientation: Player) => void;\n onClose?: () => void;\n } & Pick<HistoryProps, 'min' | 'max' | 'onSelect'>\n>;\n\nexport const Info = ({ classNames, orientation = 'white', onOrientationChange, onClose, ...props }: InfoProps) => {\n const { t } = useTranslation(meta.id);\n const { model } = useGameboardContext<ExtendedChessModel>(Info.displayName);\n const members = useMembers(getSpace(model.object)?.key);\n\n return (\n <div\n className={mx(\n 'grid grid-rows-[min-content_1fr_min-content] is-full min-is-[18rem] p-2 overflow-hidden bg-groupSurface rounded-sm',\n classNames,\n )}\n >\n <PlayerIndicator\n model={model}\n player={orientation === 'white' ? 'black' : 'white'}\n icon={\n onClose && (\n <IconButton icon='ph--x--regular' iconOnly label={t('close info button')} size={4} onClick={onClose} />\n )\n }\n >\n <PlayerSelector\n value={model.object.players?.[orientation === 'white' ? 'black' : 'white']}\n onValueChange={(value) => {\n model.object.players![orientation === 'white' ? 'black' : 'white'] = value;\n }}\n members={members}\n />\n </PlayerIndicator>\n\n <History model={model} {...props} />\n\n <PlayerIndicator\n model={model}\n player={orientation}\n icon={\n onOrientationChange && (\n <IconButton\n classNames={mx('transition duration-200 ease-linear', orientation === 'white' && 'rotate-180')}\n icon='ph--arrows-clockwise--regular'\n iconOnly\n label={t('flip board button')}\n size={4}\n onClick={() => onOrientationChange(orientation === 'white' ? 'black' : 'white')}\n />\n )\n }\n >\n <PlayerSelector\n value={model.object.players?.[orientation]}\n onValueChange={(value) => {\n model.object.players![orientation] = value;\n }}\n members={members}\n />\n </PlayerIndicator>\n </div>\n );\n};\n\nInfo.displayName = 'Chessboard.Info';\n\n//\n// History\n//\n\ntype HistoryProps = ThemedClassName<{\n model: ExtendedChessModel;\n min?: number;\n max?: number;\n onSelect?: (index: number) => void;\n}>;\n\nconst History = ({ classNames, model, min, max, onSelect }: HistoryProps) => {\n const { t } = useTranslation(meta.id);\n const label = model.game.isGameOver()\n ? model.game.isCheckmate()\n ? t('game.checkmate label')\n : model.game.isStalemate()\n ? t('game.stalemate label')\n : t('game.draw label')\n : model.game.isCheck()\n ? t('game.check label')\n : undefined;\n\n const history = model.game.history();\n const moves = useMemo(\n () =>\n history.reduce(\n (acc, move, index) => {\n if (index % 2 === 0) {\n acc.push([{ index, move }]);\n } else {\n acc[acc.length - 1].push({ index, move });\n }\n return acc;\n },\n [] as { index: number; move: string }[][],\n ),\n [history.length],\n );\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n scrollerRef.current?.scrollTo({ top: scrollerRef.current.scrollHeight });\n }, [history.length]);\n\n useEffect(() => {\n const div = scrollerRef.current?.querySelector(`[data-index=\"${model.moveIndex.value - 1}\"]`);\n scrollerRef.current?.classList.add('scrollbar-none');\n div?.scrollIntoView({ behavior: 'smooth' });\n scrollerRef.current?.classList.remove('scrollbar-none');\n }, [model.moveIndex.value]);\n\n return (\n <div\n ref={scrollerRef}\n className={mx('overflow-y-auto', classNames)}\n style={{\n minHeight: min === undefined ? 'auto' : `${min * 24}px`,\n maxHeight: max === undefined ? 'auto' : `${max * 24}px`,\n }}\n >\n {moves.map(([a, b], index) => (\n <div key={index} className='grid grid-cols-[3rem_1fr_1fr_1rem] gap-2 pis-4 leading-1'>\n <div className='content-center text-xs text-subdued'>{index + 1}</div>\n {a && (\n <div\n data-index={a.index}\n className={mx('pis-2 cursor-pointer', a.index === model.moveIndex.value - 1 && 'bg-primary-500')}\n onClick={() => onSelect?.(a.index + 1)}\n >\n {a.move}\n </div>\n )}\n {b && (\n <div\n data-index={b.index}\n className={mx('pis-2 cursor-pointer', b.index === model.moveIndex.value - 1 && 'bg-primary-500')}\n onClick={() => onSelect?.(b.index + 1)}\n >\n {b.move}\n </div>\n )}\n </div>\n ))}\n {label && <div className='text-center'>{label}</div>}\n </div>\n );\n};\n\n//\n// PlayerIndicator\n//\n\ntype PlayerIndicatorProps = PropsWithChildren<{\n model: ExtendedChessModel;\n player: Player;\n icon?: JSX.Element;\n}>;\n\nconst PlayerIndicator = ({ children, model, player, icon }: PlayerIndicatorProps) => {\n const turn = player === (model.game.turn() === 'w' ? 'white' : 'black');\n return (\n <div className='grid grid-cols-[2rem_1fr_2rem] gap-2 bs-[--rail-size] pli-1 flex items-center overflow-hidden'>\n <div className='place-items-center'>\n <Icon\n icon={turn ? 'ph--circle--fill' : 'ph--circle--thin'}\n size={6}\n classNames={mx(turn && (model.game.isCheckmate() ? 'text-red-500' : 'text-green-500'))}\n />\n </div>\n <div className='truncate overflow-hidden items-center'>{children}</div>\n {icon}\n </div>\n );\n};\n\n//\n// PlayerSelector\n//\n\ntype PlayerSelectorProps = {\n value?: string;\n onValueChange: (player: string) => void;\n members: SpaceMember[];\n};\n\nconst PlayerSelector = ({ value, onValueChange, members }: PlayerSelectorProps) => {\n const { t } = useTranslation(meta.id);\n return (\n <Select.Root value={value} onValueChange={onValueChange}>\n <Select.TriggerButton placeholder={t('select player button')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {members.map((member) => {\n const memberKey = member.identity.identityKey.toHex();\n const displayName = member.identity?.profile?.displayName || generateName(memberKey);\n return (\n <Select.Option key={memberKey} value={memberKey}>\n {displayName}\n </Select.Option>\n );\n })}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useMemo", "useRef", "addEventListener", "ChessModel", "Gameboard", "Chessboard", "NaturalChessboard", "getRawPgn", "useGameboardContext", "useSoundEffect", "mx", "React", "useEffect", "useMemo", "useRef", "generateName", "getSpace", "useMembers", "Icon", "IconButton", "Select", "useTranslation", "useGameboardContext", "mx", "Info", "classNames", "orientation", "onOrientationChange", "onClose", "props", "t", "useTranslation", "meta", "id", "model", "useGameboardContext", "displayName", "members", "useMembers", "getSpace", "object", "key", "div", "className", "mx", "PlayerIndicator", "player", "icon", "IconButton", "iconOnly", "label", "size", "onClick", "PlayerSelector", "value", "players", "onValueChange", "History", "min", "max", "onSelect", "game", "isGameOver", "isCheckmate", "isStalemate", "isCheck", "undefined", "history", "moves", "useMemo", "reduce", "acc", "move", "index", "push", "length", "scrollerRef", "useRef", "useEffect", "current", "scrollTo", "top", "scrollHeight", "querySelector", "moveIndex", "classList", "add", "scrollIntoView", "behavior", "remove", "ref", "style", "minHeight", "maxHeight", "map", "a", "b", "data-index", "children", "turn", "Icon", "Select", "Root", "TriggerButton", "placeholder", "Portal", "Content", "Viewport", "member", "memberKey", "identity", "identityKey", "toHex", "profile", "generateName", "Option", "Arrow", "ExtendedChessModel", "ChessModel", "object", "Root", "forwardRef", "game", "children", "forwardedRef", "model", "useMemo", "click", "useSoundEffect", "useImperativeHandle", "setMoveNumber", "index", "setMoveIndex", "useEffect", "pgn", "getRawPgn", "silent", "update", "play", "handleDrop", "useCallback", "move", "makeMove", "React", "Gameboard", "onDrop", "Content", "classNames", "role", "mx", "grow", "contain", "Board", "props", "useGameboardContext", "displayName", "ref", "useRef", "current", "setAttribute", "addEventListener", "ev", "key", "history", "length", "moveIndex", "value", "NaturalChessboard", "Chessboard", "Info"]
7
+ }
@@ -6,14 +6,15 @@ var __export = (target, all) => {
6
6
 
7
7
  // src/meta.ts
8
8
  import { trim } from "@dxos/util";
9
- var CHESS_PLUGIN = "dxos.org/plugin/chess";
10
9
  var meta = {
11
- id: CHESS_PLUGIN,
10
+ id: "dxos.org/plugin/chess",
12
11
  name: "Chess",
13
12
  description: trim`
14
- Play chess with friends or practice with the AI.
13
+ Full-featured chess game supporting multiplayer matches with friends or practice sessions against AI opponents.
14
+ Track game history and analyze moves in real-time.
15
15
  `,
16
16
  icon: "ph--shield-chevron--regular",
17
+ iconHue: "amber",
17
18
  source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-chess",
18
19
  screenshots: [
19
20
  "https://dxos.network/plugin-details-chess-dark.png"
@@ -22,7 +23,6 @@ var meta = {
22
23
 
23
24
  export {
24
25
  __export,
25
- CHESS_PLUGIN,
26
26
  meta
27
27
  };
28
- //# sourceMappingURL=chunk-PE3IWOFR.mjs.map
28
+ //# sourceMappingURL=chunk-DUO4WTAM.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: PluginMeta = {\n id: 'dxos.org/plugin/chess',\n name: 'Chess',\n description: trim`\n Full-featured chess game supporting multiplayer matches with friends or practice sessions against AI opponents.\n Track game history and analyze moves in real-time.\n `,\n icon: 'ph--shield-chevron--regular',\n iconHue: 'amber',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-chess',\n screenshots: ['https://dxos.network/plugin-details-chess-dark.png'],\n};\n"],
5
+ "mappings": ";;;;;;;AAKA,SAASA,YAAY;AAEd,IAAMC,OAAmB;EAC9BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,aAAa;IAAC;;AAChB;",
6
+ "names": ["trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "screenshots"]
7
+ }