@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,10 +1,10 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  Chessboard
4
- } from "./chunk-PIRITYWV.mjs";
4
+ } from "./chunk-F4C2HVZL.mjs";
5
5
  import {
6
6
  meta
7
- } from "./chunk-6OWCPDUA.mjs";
7
+ } from "./chunk-KNOOJFIR.mjs";
8
8
 
9
9
  // src/components/ChessboardContainer.tsx
10
10
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
@@ -14,10 +14,10 @@ import { getSpace } from "@dxos/react-client/echo";
14
14
  // src/components/ChessboardArticle.tsx
15
15
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
16
16
  import React, { useCallback, useRef, useState } from "react";
17
- import { IconButton, useTranslation } from "@dxos/react-ui";
17
+ import { Toolbar, useTranslation } from "@dxos/react-ui";
18
18
  import { StackItem } from "@dxos/react-ui-stack";
19
19
  import { mx } from "@dxos/react-ui-theme";
20
- var ChessboardArticle = ({ game }) => {
20
+ var ChessboardArticle = ({ game, role }) => {
21
21
  var _effect = _useSignals();
22
22
  try {
23
23
  const { t } = useTranslation(meta.id);
@@ -28,13 +28,22 @@ var ChessboardArticle = ({ game }) => {
28
28
  controller.current?.setMoveNumber(index);
29
29
  }, []);
30
30
  return /* @__PURE__ */ React.createElement(StackItem.Content, {
31
- classNames: "@container bs-full is-full overflow-hidden"
31
+ toolbar: true,
32
+ classNames: "@container"
32
33
  }, /* @__PURE__ */ React.createElement(Chessboard.Root, {
33
34
  game,
34
35
  ref: controller
35
- }, /* @__PURE__ */ React.createElement("div", {
36
- className: mx("grid grid-rows-[1fr_4rem] bs-full is-full gap-2", open && "@3xl:grid-cols-[1fr_320px]")
36
+ }, /* @__PURE__ */ React.createElement(Toolbar.Root, null, /* @__PURE__ */ React.createElement(Toolbar.IconButton, {
37
+ icon: "ph--info--regular",
38
+ iconOnly: true,
39
+ label: t("toggle info button"),
40
+ disabled: open,
41
+ classNames: mx("invisible @3xl:visible"),
42
+ onClick: () => setOpen((open2) => !open2)
43
+ })), /* @__PURE__ */ React.createElement("div", {
44
+ 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")
37
45
  }, /* @__PURE__ */ React.createElement(Chessboard.Content, null, /* @__PURE__ */ React.createElement(Chessboard.Board, {
46
+ classNames: "m-4 rounded-sm overflow-hidden",
38
47
  orientation
39
48
  })), open && /* @__PURE__ */ React.createElement("div", {
40
49
  className: "hidden @3xl:flex flex-col p-8 justify-center items-center overflow-hidden"
@@ -45,17 +54,7 @@ var ChessboardArticle = ({ game }) => {
45
54
  onOrientationChange: setOrientation,
46
55
  onClose: () => setOpen(false),
47
56
  onSelect: handleSelect
48
- })), /* @__PURE__ */ React.createElement("div", {
49
- className: "flex justify-center items-center"
50
- }, /* @__PURE__ */ React.createElement(Chessboard.Players, null, /* @__PURE__ */ React.createElement(IconButton, {
51
- variant: "ghost",
52
- icon: "ph--info--regular",
53
- iconOnly: true,
54
- label: t("button toggle info"),
55
- size: 6,
56
- classNames: mx("invisible", !open && "@3xl:visible"),
57
- onClick: () => setOpen((open2) => !open2)
58
- }))))));
57
+ })))));
59
58
  } finally {
60
59
  _effect.f();
61
60
  }
@@ -81,7 +80,8 @@ var ChessboardContainer = ({ game, role }) => {
81
80
  }
82
81
  default: {
83
82
  return /* @__PURE__ */ React2.createElement(ChessboardArticle, {
84
- game
83
+ game,
84
+ role
85
85
  });
86
86
  }
87
87
  }
@@ -94,4 +94,4 @@ export {
94
94
  ChessboardContainer,
95
95
  ChessboardContainer_default as default
96
96
  };
97
- //# sourceMappingURL=ChessboardContainer-PF75AEMW.mjs.map
97
+ //# sourceMappingURL=ChessboardContainer-7OQ6TOKB.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,12 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ CHESS_BLUEPRINT_KEY,
4
+ blueprint_definition_default
5
+ } from "./chunk-F3HFLDV5.mjs";
6
+ import "./chunk-QKXLEJNZ.mjs";
7
+ import "./chunk-KNOOJFIR.mjs";
8
+ export {
9
+ CHESS_BLUEPRINT_KEY,
10
+ blueprint_definition_default as default
11
+ };
12
+ //# sourceMappingURL=blueprint-definition-GR6OLMB6.mjs.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  Chess_exports
4
- } from "./chunk-5DYLCQBR.mjs";
4
+ } from "./chunk-QKXLEJNZ.mjs";
5
5
 
6
6
  // src/capabilities/blueprint-definition.ts
7
7
  import { Capabilities, contributes } from "@dxos/app-framework";
@@ -9,10 +9,12 @@ import { Blueprint, Template } from "@dxos/blueprints";
9
9
  import { trim } from "@dxos/util";
10
10
 
11
11
  // src/functions/create.ts
12
- import { Effect, Schema } from "effect";
12
+ import * as Effect from "effect/Effect";
13
+ import * as Schema from "effect/Schema";
13
14
  import { DatabaseService, defineFunction } from "@dxos/functions";
14
15
  var create_default = defineFunction({
15
- name: "dxos.org/function/chess/create",
16
+ key: "dxos.org/function/chess/create",
17
+ name: "Create Chess",
16
18
  description: "Creates a new chess game.",
17
19
  inputSchema: Schema.Struct({
18
20
  pgn: Schema.optional(Schema.String.annotations({
@@ -33,11 +35,13 @@ var create_default = defineFunction({
33
35
 
34
36
  // src/functions/move.ts
35
37
  import { Chess as ChessJS } from "chess.js";
36
- import { Effect as Effect2, Schema as Schema2 } from "effect";
38
+ import * as Effect2 from "effect/Effect";
39
+ import * as Schema2 from "effect/Schema";
37
40
  import { ArtifactId } from "@dxos/assistant";
38
41
  import { DatabaseService as DatabaseService2, defineFunction as defineFunction2 } from "@dxos/functions";
39
42
  var move_default = defineFunction2({
40
- name: "dxos.org/function/chess/move",
43
+ key: "dxos.org/function/chess/move",
44
+ name: "Move",
41
45
  description: "Makes a move in the given chess game.",
42
46
  inputSchema: Schema2.Struct({
43
47
  id: ArtifactId.annotations({
@@ -76,15 +80,21 @@ var move_default = defineFunction2({
76
80
 
77
81
  // src/functions/play.ts
78
82
  import { Chess as ChessJS2 } from "chess.js";
79
- import { Effect as Effect3, Schema as Schema3 } from "effect";
83
+ import * as Effect3 from "effect/Effect";
84
+ import * as Schema3 from "effect/Schema";
80
85
  import { ArtifactId as ArtifactId2 } from "@dxos/assistant";
81
86
  import { DatabaseService as DatabaseService3, defineFunction as defineFunction3 } from "@dxos/functions";
82
87
  var play_default = defineFunction3({
83
- name: "dxos.org/function/chess/play",
88
+ key: "dxos.org/function/chess/play",
89
+ name: "Play",
84
90
  description: "Uses the chess engine to play the next move.",
85
91
  inputSchema: Schema3.Struct({
86
92
  id: ArtifactId2.annotations({
87
93
  description: "The ID of the chess object."
94
+ }),
95
+ side: Schema3.optional(Schema3.Literal("white", "black", "any")).annotations({
96
+ description: "The side to play.",
97
+ defaultValue: "any"
88
98
  })
89
99
  }),
90
100
  outputSchema: Schema3.Struct({
@@ -95,7 +105,7 @@ var play_default = defineFunction3({
95
105
  description: "The move that was played."
96
106
  })
97
107
  }),
98
- handler: Effect3.fn(function* ({ data: { id } }) {
108
+ handler: Effect3.fn(function* ({ data: { id, side = "any" } }) {
99
109
  const object = yield* DatabaseService3.resolve(ArtifactId2.toDXN(id), Chess_exports.Game);
100
110
  const chess = new ChessJS2();
101
111
  if (object.pgn) {
@@ -103,6 +113,12 @@ var play_default = defineFunction3({
103
113
  } else if (object.fen) {
104
114
  chess.load(object.fen);
105
115
  }
116
+ if (!(side === "any" || chess.turn() === "w" && side === "white" || chess.turn() === "b" && side === "black")) {
117
+ return {
118
+ move: void 0,
119
+ pgn: object.pgn
120
+ };
121
+ }
106
122
  const moves = chess.moves();
107
123
  const move = moves[Math.floor(Math.random() * moves.length)];
108
124
  chess.move(move, {
@@ -117,17 +133,17 @@ var play_default = defineFunction3({
117
133
  });
118
134
 
119
135
  // src/capabilities/blueprint-definition.ts
120
- var BLUEPRINT_KEY = "dxos.org/blueprint/chess";
121
136
  var functions = [
122
137
  create_default,
123
138
  move_default,
124
139
  play_default
125
140
  ];
126
- var blueprint_definition_default = () => {
141
+ var CHESS_BLUEPRINT_KEY = "dxos.org/blueprint/chess";
142
+ var blueprint_definition_default = (() => {
127
143
  return [
128
144
  contributes(Capabilities.Functions, functions),
129
145
  contributes(Capabilities.BlueprintDefinition, Blueprint.make({
130
- key: BLUEPRINT_KEY,
146
+ key: CHESS_BLUEPRINT_KEY,
131
147
  name: "Chess",
132
148
  tools: Blueprint.toolDefinitions({
133
149
  functions
@@ -142,13 +158,13 @@ var blueprint_definition_default = () => {
142
158
  })
143
159
  }))
144
160
  ];
145
- };
161
+ });
146
162
 
147
163
  export {
148
164
  create_default,
149
165
  move_default,
150
166
  play_default,
151
- BLUEPRINT_KEY,
167
+ CHESS_BLUEPRINT_KEY,
152
168
  blueprint_definition_default
153
169
  };
154
- //# sourceMappingURL=chunk-3NZRGOSV.mjs.map
170
+ //# sourceMappingURL=chunk-F3HFLDV5.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,63 +1,79 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  meta
4
- } from "./chunk-6OWCPDUA.mjs";
4
+ } from "./chunk-KNOOJFIR.mjs";
5
5
 
6
6
  // src/components/Chessboard.tsx
7
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
8
- import React3, { forwardRef, useCallback, useEffect as useEffect2, useImperativeHandle, useMemo as useMemo2, useRef as useRef2 } from "react";
7
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
8
+ import React2, { forwardRef, useCallback, useEffect as useEffect2, useImperativeHandle, useMemo as useMemo2, useRef as useRef2 } from "react";
9
9
  import { addEventListener } from "@dxos/async";
10
- import { ChessModel, Gameboard, Chessboard as NativeChessboard } from "@dxos/react-ui-gameboard";
11
- import { mx as mx3 } from "@dxos/react-ui-theme";
10
+ import { ChessModel, Gameboard, Chessboard as NaturalChessboard, getRawPgn, useGameboardContext as useGameboardContext2 } from "@dxos/react-ui-gameboard";
11
+ import { useSoundEffect } from "@dxos/react-ui-sfx";
12
+ import { mx as mx2 } from "@dxos/react-ui-theme";
12
13
 
13
- // src/components/ChessboardInfo.tsx
14
+ // src/components/Info.tsx
14
15
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
15
16
  import React, { useEffect, useMemo, useRef } from "react";
16
- import { Icon, IconButton, useTranslation } from "@dxos/react-ui";
17
+ import { generateName } from "@dxos/display-name";
18
+ import { getSpace, useMembers } from "@dxos/react-client/echo";
19
+ import { Icon, IconButton, Select, useTranslation } from "@dxos/react-ui";
17
20
  import { useGameboardContext } from "@dxos/react-ui-gameboard";
18
21
  import { mx } from "@dxos/react-ui-theme";
19
- var ChessboardInfo = ({ classNames, orientation = "white", onOrientationChange, onClose, ...props }) => {
22
+ var Info = ({ classNames, orientation = "white", onOrientationChange, onClose, ...props }) => {
20
23
  var _effect = _useSignals();
21
24
  try {
22
25
  const { t } = useTranslation(meta.id);
23
- const { model } = useGameboardContext(ChessboardInfo.displayName);
26
+ const { model } = useGameboardContext(Info.displayName);
27
+ const members = useMembers(getSpace(model.object)?.key);
24
28
  return /* @__PURE__ */ React.createElement("div", {
25
- className: mx("grid grid-rows-[min-content_1fr_min-content] is-full min-is-[16rem] p-2 overflow-hidden bg-inputSurface rounded", classNames)
29
+ className: mx("grid grid-rows-[min-content_1fr_min-content] is-full min-is-[18rem] p-2 overflow-hidden bg-groupSurface rounded-sm", classNames)
26
30
  }, /* @__PURE__ */ React.createElement(PlayerIndicator, {
27
31
  model,
28
32
  player: orientation === "white" ? "black" : "white",
29
- title: model.object.players?.[orientation === "white" ? "black" : "white"]
30
- }, onClose && /* @__PURE__ */ React.createElement(IconButton, {
31
- icon: "ph--x--regular",
32
- iconOnly: true,
33
- label: t("button flip"),
34
- size: 4,
35
- onClick: onClose
33
+ icon: onClose && /* @__PURE__ */ React.createElement(IconButton, {
34
+ icon: "ph--x--regular",
35
+ iconOnly: true,
36
+ label: t("close info button"),
37
+ size: 4,
38
+ onClick: onClose
39
+ })
40
+ }, /* @__PURE__ */ React.createElement(PlayerSelector, {
41
+ value: model.object.players?.[orientation === "white" ? "black" : "white"],
42
+ onValueChange: (value) => {
43
+ model.object.players[orientation === "white" ? "black" : "white"] = value;
44
+ },
45
+ members
36
46
  })), /* @__PURE__ */ React.createElement(History, {
37
47
  model,
38
48
  ...props
39
49
  }), /* @__PURE__ */ React.createElement(PlayerIndicator, {
40
50
  model,
41
51
  player: orientation,
42
- title: model.object.players?.[orientation]
43
- }, onOrientationChange && /* @__PURE__ */ React.createElement(IconButton, {
44
- icon: "ph--arrows-down-up--regular",
45
- iconOnly: true,
46
- label: t("button flip"),
47
- size: 6,
48
- classNames: mx("transition duration-200 ease-linear", orientation === "white" && "rotate-180"),
49
- onClick: () => onOrientationChange(orientation === "white" ? "black" : "white")
52
+ icon: onOrientationChange && /* @__PURE__ */ React.createElement(IconButton, {
53
+ classNames: mx("transition duration-200 ease-linear", orientation === "white" && "rotate-180"),
54
+ icon: "ph--arrows-clockwise--regular",
55
+ iconOnly: true,
56
+ label: t("flip board button"),
57
+ size: 4,
58
+ onClick: () => onOrientationChange(orientation === "white" ? "black" : "white")
59
+ })
60
+ }, /* @__PURE__ */ React.createElement(PlayerSelector, {
61
+ value: model.object.players?.[orientation],
62
+ onValueChange: (value) => {
63
+ model.object.players[orientation] = value;
64
+ },
65
+ members
50
66
  })));
51
67
  } finally {
52
68
  _effect.f();
53
69
  }
54
70
  };
55
- ChessboardInfo.displayName = "Chessboard.Info";
71
+ Info.displayName = "Chessboard.Info";
56
72
  var History = ({ classNames, model, min, max, onSelect }) => {
57
73
  var _effect = _useSignals();
58
74
  try {
59
75
  const { t } = useTranslation(meta.id);
60
- 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;
76
+ 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;
61
77
  const history = model.game.history();
62
78
  const moves = useMemo(() => history.reduce((acc, move, index) => {
63
79
  if (index % 2 === 0) {
@@ -97,7 +113,7 @@ var History = ({ classNames, model, min, max, onSelect }) => {
97
113
  ]);
98
114
  return /* @__PURE__ */ React.createElement("div", {
99
115
  ref: scrollerRef,
100
- className: mx("overflow-y-scroll", classNames),
116
+ className: mx("overflow-y-auto", classNames),
101
117
  style: {
102
118
  minHeight: min === void 0 ? "auto" : `${min * 24}px`,
103
119
  maxHeight: max === void 0 ? "auto" : `${max * 24}px`
@@ -122,12 +138,12 @@ var History = ({ classNames, model, min, max, onSelect }) => {
122
138
  _effect.f();
123
139
  }
124
140
  };
125
- var PlayerIndicator = ({ children, model, player, title }) => {
141
+ var PlayerIndicator = ({ children, model, player, icon }) => {
126
142
  var _effect = _useSignals();
127
143
  try {
128
144
  const turn = player === (model.game.turn() === "w" ? "white" : "black");
129
145
  return /* @__PURE__ */ React.createElement("div", {
130
- className: "grid grid-cols-[2rem_1fr_2rem] gap-1 bs-[--rail-size] pis-1 pie-1 flex items-center overflow-hidden"
146
+ className: "grid grid-cols-[2rem_1fr_2rem] gap-2 bs-[--rail-size] pli-1 flex items-center overflow-hidden"
131
147
  }, /* @__PURE__ */ React.createElement("div", {
132
148
  className: "place-items-center"
133
149
  }, /* @__PURE__ */ React.createElement(Icon, {
@@ -135,107 +151,46 @@ var PlayerIndicator = ({ children, model, player, title }) => {
135
151
  size: 6,
136
152
  classNames: mx(turn && (model.game.isCheckmate() ? "text-red-500" : "text-green-500"))
137
153
  })), /* @__PURE__ */ React.createElement("div", {
138
- className: "truncate"
139
- }, title), children);
140
- } finally {
141
- _effect.f();
142
- }
143
- };
144
-
145
- // src/components/ChessboardPlayers.tsx
146
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
147
- import React2 from "react";
148
- import { generateName } from "@dxos/display-name";
149
- import { getSpace, useMembers } from "@dxos/react-client/echo";
150
- import { Icon as Icon2, Input, Select, useThemeContext } from "@dxos/react-ui";
151
- import { useGameboardContext as useGameboardContext2 } from "@dxos/react-ui-gameboard";
152
- import { mx as mx2 } from "@dxos/react-ui-theme";
153
- var ChessboardPlayers = ({ classNames, children }) => {
154
- var _effect = _useSignals2();
155
- try {
156
- const { model } = useGameboardContext2(ChessboardPlayers.displayName);
157
- const members = useMembers(getSpace(model.object)?.key);
158
- const players = model.object.players;
159
- if (!players) {
160
- return null;
161
- }
162
- return /* @__PURE__ */ React2.createElement("div", {
163
- role: "none",
164
- className: mx2("grid grid-cols-[1fr_min-content_1fr] pis-2 pie-2 overflow-hidden", classNames)
165
- }, /* @__PURE__ */ React2.createElement("div", {
166
- role: "none",
167
- className: "flex flex-row-reverse items-center gap-2"
168
- }, /* @__PURE__ */ React2.createElement(PlayerSelect, {
169
- side: "white",
170
- value: players.white,
171
- onValueChange: (player) => players.white = player,
172
- members
173
- })), /* @__PURE__ */ React2.createElement("div", {
174
- className: "flex flex-row justify-center items-center"
175
- }, children), /* @__PURE__ */ React2.createElement("div", {
176
- role: "none",
177
- className: "flex flex-row items-center gap-2"
178
- }, /* @__PURE__ */ React2.createElement(PlayerSelect, {
179
- side: "black",
180
- value: players.black,
181
- onValueChange: (player) => players.black = player,
182
- members
183
- })));
154
+ className: "truncate overflow-hidden items-center"
155
+ }, children), icon);
184
156
  } finally {
185
157
  _effect.f();
186
158
  }
187
159
  };
188
- ChessboardPlayers.displayName = "Chessboard.Players";
189
- var PlayerSelect = ({ side, value, onValueChange, members }) => {
190
- var _effect = _useSignals2();
160
+ var PlayerSelector = ({ value, onValueChange, members }) => {
161
+ var _effect = _useSignals();
191
162
  try {
192
- const { themeMode } = useThemeContext();
193
- const iconFillMode = side === "black" && themeMode === "light" || side === "white" && themeMode === "dark" ? "fill" : void 0;
194
- return /* @__PURE__ */ React2.createElement(Input.Root, null, /* @__PURE__ */ React2.createElement(Input.Label, null, /* @__PURE__ */ React2.createElement(Icon2, {
195
- "aria-label": `Chess icon for side ${side}`,
196
- icon: `ph--crown-cross--${iconFillMode || "regular"}`,
197
- size: 6
198
- })), /* @__PURE__ */ React2.createElement(Select.Root, {
163
+ const { t } = useTranslation(meta.id);
164
+ return /* @__PURE__ */ React.createElement(Select.Root, {
199
165
  value,
200
166
  onValueChange
201
- }, /* @__PURE__ */ React2.createElement(Select.TriggerButton, {
202
- placeholder: "Select player"
203
- }), /* @__PURE__ */ React2.createElement(Select.Portal, null, /* @__PURE__ */ React2.createElement(Select.Content, null, /* @__PURE__ */ React2.createElement(Select.Viewport, null, members.map((member) => {
167
+ }, /* @__PURE__ */ React.createElement(Select.TriggerButton, {
168
+ placeholder: t("select player button")
169
+ }), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, members.map((member) => {
204
170
  const memberKey = member.identity.identityKey.toHex();
205
171
  const displayName = member.identity?.profile?.displayName || generateName(memberKey);
206
- return /* @__PURE__ */ React2.createElement(Select.Option, {
172
+ return /* @__PURE__ */ React.createElement(Select.Option, {
207
173
  key: memberKey,
208
174
  value: memberKey
209
175
  }, displayName);
210
- })), /* @__PURE__ */ React2.createElement(Select.Arrow, null)))));
176
+ })), /* @__PURE__ */ React.createElement(Select.Arrow, null))));
211
177
  } finally {
212
178
  _effect.f();
213
179
  }
214
180
  };
215
181
 
216
182
  // src/components/Chessboard.tsx
217
- function _define_property(obj, key, value) {
218
- if (key in obj) {
219
- Object.defineProperty(obj, key, {
220
- value,
221
- enumerable: true,
222
- configurable: true,
223
- writable: true
224
- });
225
- } else {
226
- obj[key] = value;
227
- }
228
- return obj;
229
- }
230
183
  var ExtendedChessModel = class extends ChessModel {
184
+ object;
231
185
  constructor(object) {
232
- super(), _define_property(this, "object", void 0), this.object = object;
186
+ super(), this.object = object;
233
187
  }
234
188
  };
235
- var ChessboardRoot = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRef) => {
236
- var _effect = _useSignals3();
189
+ var Root = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRef) => {
190
+ var _effect = _useSignals2();
237
191
  try {
238
192
  const model = useMemo2(() => new ExtendedChessModel(game), []);
193
+ const click = useSoundEffect("Click");
239
194
  useImperativeHandle(forwardedRef, () => {
240
195
  return {
241
196
  setMoveNumber: (index) => model.setMoveIndex(index)
@@ -244,15 +199,56 @@ var ChessboardRoot = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRe
244
199
  model
245
200
  ]);
246
201
  useEffect2(() => {
247
- model.update(game.pgn);
202
+ if (model.pgn !== getRawPgn(game.pgn ?? "")) {
203
+ const silent = model.pgn === "*";
204
+ model.update(game.pgn);
205
+ if (!silent) {
206
+ void click.play();
207
+ }
208
+ }
248
209
  }, [
249
210
  game.pgn
250
211
  ]);
212
+ const handleDrop = useCallback((move) => {
213
+ if (!model.makeMove(move)) {
214
+ return false;
215
+ }
216
+ void click.play();
217
+ game.pgn = model.pgn;
218
+ return true;
219
+ }, [
220
+ model
221
+ ]);
222
+ return /* @__PURE__ */ React2.createElement(Gameboard.Root, {
223
+ model,
224
+ onDrop: handleDrop
225
+ }, children);
226
+ } finally {
227
+ _effect.f();
228
+ }
229
+ });
230
+ var Content = ({ classNames, children, role }) => {
231
+ var _effect = _useSignals2();
232
+ try {
233
+ return /* @__PURE__ */ React2.createElement(Gameboard.Content, {
234
+ classNames: mx2(classNames, role === "card--popover" && "size-container popover-square"),
235
+ grow: !role || role === "card--extrinsic",
236
+ contain: !role || role === "card--extrinsic" || role === "card--popover"
237
+ }, children);
238
+ } finally {
239
+ _effect.f();
240
+ }
241
+ };
242
+ var Board = (props) => {
243
+ var _effect = _useSignals2();
244
+ try {
245
+ const { model } = useGameboardContext2(Board.displayName);
251
246
  const ref = useRef2(null);
252
247
  useEffect2(() => {
253
248
  if (!ref.current) {
254
249
  return;
255
250
  }
251
+ ref.current.setAttribute("data-arrow-keys", "all");
256
252
  return addEventListener(ref.current, "keydown", (ev) => {
257
253
  switch (ev.key) {
258
254
  case "ArrowUp":
@@ -276,50 +272,24 @@ var ChessboardRoot = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRe
276
272
  }, [
277
273
  model
278
274
  ]);
279
- const handleDrop = useCallback((move) => {
280
- if (model.makeMove(move)) {
281
- game.pgn = model.pgn;
282
- return true;
283
- }
284
- return false;
285
- }, [
286
- model
287
- ]);
288
- return /* @__PURE__ */ React3.createElement(Gameboard.Root, {
289
- model,
290
- onDrop: handleDrop
291
- }, /* @__PURE__ */ React3.createElement("div", {
275
+ return /* @__PURE__ */ React2.createElement(NaturalChessboard, {
292
276
  ref,
293
- role: "none",
294
- tabIndex: 0,
295
- className: "grid grow outline-none"
296
- }, children));
297
- } finally {
298
- _effect.f();
299
- }
300
- });
301
- var ChessboardContent = ({ classNames, children, role }) => {
302
- var _effect = _useSignals3();
303
- try {
304
- return /* @__PURE__ */ React3.createElement(Gameboard.Content, {
305
- classNames: mx3(classNames, role === "card--popover" && "size-container popover-square"),
306
- grow: !role || role === "card--extrinsic",
307
- contain: !role || role === "card--extrinsic" || role === "card--popover"
308
- }, children);
277
+ ...props
278
+ });
309
279
  } finally {
310
280
  _effect.f();
311
281
  }
312
282
  };
283
+ Board.displayName = "Chessboard.Board";
313
284
  var Chessboard = {
314
- Root: ChessboardRoot,
315
- Content: ChessboardContent,
316
- Board: NativeChessboard,
317
- Info: ChessboardInfo,
318
- Players: ChessboardPlayers
285
+ Root,
286
+ Content,
287
+ Board,
288
+ Info
319
289
  };
320
290
 
321
291
  export {
322
292
  ExtendedChessModel,
323
293
  Chessboard
324
294
  };
325
- //# sourceMappingURL=chunk-PIRITYWV.mjs.map
295
+ //# sourceMappingURL=chunk-F4C2HVZL.mjs.map