@dxos/plugin-chess 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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-Y5Y4YGNL.mjs +11 -0
  4. package/dist/lib/browser/{chunk-VTIITHYS.mjs → chunk-3LPE2B5J.mjs} +30 -14
  5. package/dist/lib/browser/chunk-3LPE2B5J.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-UDWRTBWA.mjs → chunk-5DOZV3PW.mjs} +113 -143
  7. package/dist/lib/browser/chunk-5DOZV3PW.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-T275KG4U.mjs → chunk-CCF24VRU.mjs} +13 -14
  9. package/dist/lib/browser/chunk-CCF24VRU.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-PE3IWOFR.mjs → chunk-DUO4WTAM.mjs} +5 -5
  11. package/dist/lib/browser/chunk-DUO4WTAM.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-H65TQTPW.mjs → chunk-Q5TZCIH7.mjs} +2 -2
  13. package/dist/lib/browser/index.mjs +30 -29
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/{intent-resolver-DA5H5633.mjs → intent-resolver-KPGHK5JU.mjs} +5 -5
  16. package/dist/lib/browser/{intent-resolver-DA5H5633.mjs.map → intent-resolver-KPGHK5JU.mjs.map} +1 -1
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{react-surface-FSDNVKZN.mjs → react-surface-3YST34QI.mjs} +7 -7
  19. package/dist/lib/browser/{react-surface-FSDNVKZN.mjs.map → react-surface-3YST34QI.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-GR6OLMB6.mjs +12 -0
  24. package/dist/lib/node-esm/{chunk-3NZRGOSV.mjs → chunk-F3HFLDV5.mjs} +30 -14
  25. package/dist/lib/node-esm/chunk-F3HFLDV5.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-PIRITYWV.mjs → chunk-F4C2HVZL.mjs} +113 -143
  27. package/dist/lib/node-esm/chunk-F4C2HVZL.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-6OWCPDUA.mjs → chunk-KNOOJFIR.mjs} +5 -5
  29. package/dist/lib/node-esm/chunk-KNOOJFIR.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-5DYLCQBR.mjs → chunk-QKXLEJNZ.mjs} +13 -14
  31. package/dist/lib/node-esm/chunk-QKXLEJNZ.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 +30 -29
  34. package/dist/lib/node-esm/index.mjs.map +3 -3
  35. package/dist/lib/node-esm/{intent-resolver-PODONUD3.mjs → intent-resolver-ZAELGF7I.mjs} +5 -5
  36. package/dist/lib/node-esm/{intent-resolver-PODONUD3.mjs.map → intent-resolver-ZAELGF7I.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-KV2KBSIU.mjs} +7 -7
  39. package/dist/lib/node-esm/{react-surface-2TW3PIGQ.mjs.map → react-surface-KV2KBSIU.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 +14 -9
  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 +9 -6
  65. package/dist/types/src/translations.d.ts.map +1 -1
  66. package/dist/types/src/types/Chess.d.ts +3 -3
  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 +45 -51
  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 +9 -6
  86. package/src/types/Chess.ts +20 -28
  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-Y5Y4YGNL.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-GR6OLMB6.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-3LPE2B5J.mjs";
5
+ import "./chunk-CCF24VRU.mjs";
6
+ import "./chunk-DUO4WTAM.mjs";
7
+ export {
8
+ CHESS_BLUEPRINT_KEY,
9
+ blueprint_definition_default as default
10
+ };
11
+ //# sourceMappingURL=blueprint-definition-Y5Y4YGNL.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Chess_exports
3
- } from "./chunk-T275KG4U.mjs";
3
+ } from "./chunk-CCF24VRU.mjs";
4
4
 
5
5
  // src/capabilities/blueprint-definition.ts
6
6
  import { Capabilities, contributes } from "@dxos/app-framework";
@@ -8,10 +8,12 @@ import { Blueprint, Template } from "@dxos/blueprints";
8
8
  import { trim } from "@dxos/util";
9
9
 
10
10
  // src/functions/create.ts
11
- import { Effect, Schema } from "effect";
11
+ import * as Effect from "effect/Effect";
12
+ import * as Schema from "effect/Schema";
12
13
  import { DatabaseService, defineFunction } from "@dxos/functions";
13
14
  var create_default = defineFunction({
14
- name: "dxos.org/function/chess/create",
15
+ key: "dxos.org/function/chess/create",
16
+ name: "Create Chess",
15
17
  description: "Creates a new chess game.",
16
18
  inputSchema: Schema.Struct({
17
19
  pgn: Schema.optional(Schema.String.annotations({
@@ -32,11 +34,13 @@ var create_default = defineFunction({
32
34
 
33
35
  // src/functions/move.ts
34
36
  import { Chess as ChessJS } from "chess.js";
35
- import { Effect as Effect2, Schema as Schema2 } from "effect";
37
+ import * as Effect2 from "effect/Effect";
38
+ import * as Schema2 from "effect/Schema";
36
39
  import { ArtifactId } from "@dxos/assistant";
37
40
  import { DatabaseService as DatabaseService2, defineFunction as defineFunction2 } from "@dxos/functions";
38
41
  var move_default = defineFunction2({
39
- name: "dxos.org/function/chess/move",
42
+ key: "dxos.org/function/chess/move",
43
+ name: "Move",
40
44
  description: "Makes a move in the given chess game.",
41
45
  inputSchema: Schema2.Struct({
42
46
  id: ArtifactId.annotations({
@@ -75,15 +79,21 @@ var move_default = defineFunction2({
75
79
 
76
80
  // src/functions/play.ts
77
81
  import { Chess as ChessJS2 } from "chess.js";
78
- import { Effect as Effect3, Schema as Schema3 } from "effect";
82
+ import * as Effect3 from "effect/Effect";
83
+ import * as Schema3 from "effect/Schema";
79
84
  import { ArtifactId as ArtifactId2 } from "@dxos/assistant";
80
85
  import { DatabaseService as DatabaseService3, defineFunction as defineFunction3 } from "@dxos/functions";
81
86
  var play_default = defineFunction3({
82
- name: "dxos.org/function/chess/play",
87
+ key: "dxos.org/function/chess/play",
88
+ name: "Play",
83
89
  description: "Uses the chess engine to play the next move.",
84
90
  inputSchema: Schema3.Struct({
85
91
  id: ArtifactId2.annotations({
86
92
  description: "The ID of the chess object."
93
+ }),
94
+ side: Schema3.optional(Schema3.Literal("white", "black", "any")).annotations({
95
+ description: "The side to play.",
96
+ defaultValue: "any"
87
97
  })
88
98
  }),
89
99
  outputSchema: Schema3.Struct({
@@ -94,7 +104,7 @@ var play_default = defineFunction3({
94
104
  description: "The move that was played."
95
105
  })
96
106
  }),
97
- handler: Effect3.fn(function* ({ data: { id } }) {
107
+ handler: Effect3.fn(function* ({ data: { id, side = "any" } }) {
98
108
  const object = yield* DatabaseService3.resolve(ArtifactId2.toDXN(id), Chess_exports.Game);
99
109
  const chess = new ChessJS2();
100
110
  if (object.pgn) {
@@ -102,6 +112,12 @@ var play_default = defineFunction3({
102
112
  } else if (object.fen) {
103
113
  chess.load(object.fen);
104
114
  }
115
+ if (!(side === "any" || chess.turn() === "w" && side === "white" || chess.turn() === "b" && side === "black")) {
116
+ return {
117
+ move: void 0,
118
+ pgn: object.pgn
119
+ };
120
+ }
105
121
  const moves = chess.moves();
106
122
  const move = moves[Math.floor(Math.random() * moves.length)];
107
123
  chess.move(move, {
@@ -116,17 +132,17 @@ var play_default = defineFunction3({
116
132
  });
117
133
 
118
134
  // src/capabilities/blueprint-definition.ts
119
- var BLUEPRINT_KEY = "dxos.org/blueprint/chess";
120
135
  var functions = [
121
136
  create_default,
122
137
  move_default,
123
138
  play_default
124
139
  ];
125
- var blueprint_definition_default = () => {
140
+ var CHESS_BLUEPRINT_KEY = "dxos.org/blueprint/chess";
141
+ var blueprint_definition_default = (() => {
126
142
  return [
127
143
  contributes(Capabilities.Functions, functions),
128
144
  contributes(Capabilities.BlueprintDefinition, Blueprint.make({
129
- key: BLUEPRINT_KEY,
145
+ key: CHESS_BLUEPRINT_KEY,
130
146
  name: "Chess",
131
147
  tools: Blueprint.toolDefinitions({
132
148
  functions
@@ -141,13 +157,13 @@ var blueprint_definition_default = () => {
141
157
  })
142
158
  }))
143
159
  ];
144
- };
160
+ });
145
161
 
146
162
  export {
147
163
  create_default,
148
164
  move_default,
149
165
  play_default,
150
- BLUEPRINT_KEY,
166
+ CHESS_BLUEPRINT_KEY,
151
167
  blueprint_definition_default
152
168
  };
153
- //# sourceMappingURL=chunk-VTIITHYS.mjs.map
169
+ //# sourceMappingURL=chunk-3LPE2B5J.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/blueprint-definition.ts", "../../../src/functions/create.ts", "../../../src/functions/move.ts", "../../../src/functions/play.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes } from '@dxos/app-framework';\nimport { Blueprint, Template } from '@dxos/blueprints';\nimport { type FunctionDefinition } from '@dxos/functions';\nimport { trim } from '@dxos/util';\n\nimport { create, move, play } from '../functions';\n\nconst functions: FunctionDefinition[] = [create, move, play];\n\nexport const CHESS_BLUEPRINT_KEY = 'dxos.org/blueprint/chess';\n\nexport default () => {\n return [\n contributes(Capabilities.Functions, functions),\n contributes(\n Capabilities.BlueprintDefinition,\n Blueprint.make({\n key: CHESS_BLUEPRINT_KEY,\n name: 'Chess',\n tools: Blueprint.toolDefinitions({ functions }),\n instructions: Template.make({\n source: trim`\n You are an expert chess player.\n To analyze a game you can access the \"pgn\" property by loading the context object that represents the current game.\n You could suggest a good next move or offer to play a move.\n Don't actually make a move unless you are asked to.\n `,\n }),\n }),\n ),\n ];\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { DatabaseService, defineFunction } from '@dxos/functions';\n\nimport { Chess } from '../types';\n\nexport default defineFunction({\n key: 'dxos.org/function/chess/create',\n name: 'Create Chess',\n description: 'Creates a new chess game.',\n inputSchema: Schema.Struct({\n pgn: Schema.optional(\n Schema.String.annotations({\n description: 'Portable Game Notation.',\n }),\n ),\n fen: Schema.optional(\n Schema.String.annotations({\n description: 'Forsyth-Edwards Notation.',\n }),\n ),\n }),\n outputSchema: Chess.Game,\n handler: Effect.fn(function* ({ data: { pgn, fen } }) {\n return yield* DatabaseService.add(Chess.makeGame({ pgn, fen }));\n }),\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Chess as ChessJS } from 'chess.js';\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { ArtifactId } from '@dxos/assistant';\nimport { DatabaseService, defineFunction } from '@dxos/functions';\n\nimport { Chess } from '../types';\n\nexport default defineFunction({\n key: 'dxos.org/function/chess/move',\n name: 'Move',\n description: 'Makes a move in the given chess game.',\n inputSchema: Schema.Struct({\n id: ArtifactId.annotations({\n description: 'The ID of the chess object.',\n }),\n move: Schema.String.annotations({\n description: 'The move to make in the chess game.',\n examples: ['e4', 'Bf3'],\n }),\n }),\n outputSchema: Schema.Struct({\n pgn: Schema.String.annotations({\n description: 'The PGN of the game after the move was played.',\n }),\n }),\n handler: Effect.fn(function* ({ data: { id, move } }) {\n const object = yield* DatabaseService.resolve(ArtifactId.toDXN(id), Chess.Game);\n const chess = new ChessJS();\n if (object.pgn) {\n chess.loadPgn(object.pgn);\n } else if (object.fen) {\n chess.load(object.fen);\n }\n\n chess.move(move, { strict: false });\n object.pgn = chess.pgn();\n return { pgn: object.pgn };\n }),\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Chess as ChessJS } from 'chess.js';\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { ArtifactId } from '@dxos/assistant';\nimport { DatabaseService, defineFunction } from '@dxos/functions';\n\nimport { Chess } from '../types';\n\nexport default defineFunction({\n key: 'dxos.org/function/chess/play',\n name: 'Play',\n description: 'Uses the chess engine to play the next move.',\n inputSchema: Schema.Struct({\n id: ArtifactId.annotations({\n description: 'The ID of the chess object.',\n }),\n side: Schema.optional(Schema.Literal('white', 'black', 'any')).annotations({\n description: 'The side to play.',\n defaultValue: 'any',\n }),\n }),\n outputSchema: Schema.Struct({\n pgn: Schema.String.annotations({\n description: 'The PGN of the game after the move was played.',\n }),\n move: Schema.optional(Schema.String).annotations({\n description: 'The move that was played.',\n }),\n }),\n handler: Effect.fn(function* ({ data: { id, side = 'any' } }) {\n const object = yield* DatabaseService.resolve(ArtifactId.toDXN(id), Chess.Game);\n const chess = new ChessJS();\n if (object.pgn) {\n chess.loadPgn(object.pgn);\n } else if (object.fen) {\n chess.load(object.fen);\n }\n\n if (!(side === 'any' || (chess.turn() === 'w' && side === 'white') || (chess.turn() === 'b' && side === 'black'))) {\n return { move: undefined, pgn: object.pgn! };\n }\n\n const moves = chess.moves();\n const move = moves[Math.floor(Math.random() * moves.length)];\n\n chess.move(move, { strict: false });\n object.pgn = chess.pgn();\n return { move, pgn: object.pgn };\n }),\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["Capabilities", "contributes", "Blueprint", "Template", "trim", "Effect", "Schema", "DatabaseService", "defineFunction", "defineFunction", "key", "name", "description", "inputSchema", "Struct", "pgn", "optional", "String", "annotations", "fen", "outputSchema", "Chess", "Game", "handler", "fn", "data", "DatabaseService", "add", "makeGame", "Chess", "ChessJS", "Effect", "Schema", "ArtifactId", "DatabaseService", "defineFunction", "defineFunction", "key", "name", "description", "inputSchema", "Struct", "id", "ArtifactId", "annotations", "move", "String", "examples", "outputSchema", "pgn", "handler", "fn", "data", "object", "DatabaseService", "resolve", "toDXN", "Chess", "Game", "chess", "ChessJS", "loadPgn", "fen", "load", "strict", "Chess", "ChessJS", "Effect", "Schema", "ArtifactId", "DatabaseService", "defineFunction", "defineFunction", "key", "name", "description", "inputSchema", "Struct", "id", "ArtifactId", "annotations", "side", "optional", "Literal", "defaultValue", "outputSchema", "pgn", "String", "move", "handler", "fn", "data", "object", "DatabaseService", "resolve", "toDXN", "Chess", "Game", "chess", "ChessJS", "loadPgn", "fen", "load", "turn", "undefined", "moves", "Math", "floor", "random", "length", "strict", "functions", "create", "move", "play", "CHESS_BLUEPRINT_KEY", "contributes", "Capabilities", "Functions", "BlueprintDefinition", "Blueprint", "make", "key", "name", "tools", "toolDefinitions", "instructions", "Template", "source", "trim"]
7
+ }
@@ -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