diff --git a/packages/client/src/components/Card.tsx b/packages/client/src/components/Card.tsx
index e1ab0c5..5df8859 100644
--- a/packages/client/src/components/Card.tsx
+++ b/packages/client/src/components/Card.tsx
@@ -1,7 +1,7 @@
import { Component, Suspense } from "solid-js";
import type { Card } from "@games/shared/cards";
-import { Clickable, Stylable } from "./toolbox";
+import { Clickable, Sizable, Stylable } from "./toolbox";
const cardToSvgFilename = (card: Card) => {
if (card.kind == "joker") {
@@ -25,7 +25,8 @@ export default ((props) => {
draggable={false}
class={props.class}
style={props.style}
- width="100px"
+ width={props.width ?? "100px"}
+ height={props.height}
src={
props.face == "down"
? "/views/back.svg"
@@ -43,5 +44,6 @@ export default ((props) => {
| { card?: Card; face: "down" }
) &
Stylable &
- Clickable
+ Clickable &
+ Sizable
>;
diff --git a/packages/client/src/components/FannedHand.tsx b/packages/client/src/components/FannedHand.tsx
index 70b787c..4398fff 100644
--- a/packages/client/src/components/FannedHand.tsx
+++ b/packages/client/src/components/FannedHand.tsx
@@ -4,18 +4,26 @@ import Card from "./Card";
export default (props: { handCount: number }) => {
return (
-
-
- {() => (
+
+ {(_, i) => {
+ const midOffset = i() + 0.5 - props.handCount / 2;
+ return (
- )}
-
-
+ );
+ }}
+
);
};
diff --git a/packages/client/src/components/Game.tsx b/packages/client/src/components/Game.tsx
index 987c765..dcdd87c 100644
--- a/packages/client/src/components/Game.tsx
+++ b/packages/client/src/components/Game.tsx
@@ -49,13 +49,22 @@ export default () => {
Quit
- {([playerKey, handCount]) => (
+ {([playerKey, handCount], i) => (
{
+ const midOffset =
+ i() +
+ 0.5 -
+ Object.values(view().playerHandCounts).length /
+ 2;
+
+ ref.style = `position: absolute; display: flex; justify-content: center; top: 65%; transform: translate(${Math.abs(
+ midOffset * 0
+ )}px, 0px) rotate(${midOffset * 1}rad)`;
+ }}
>
-
-
-
+
)}
diff --git a/packages/client/src/components/Table.tsx b/packages/client/src/components/Table.tsx
index d2f7472..d107c7f 100644
--- a/packages/client/src/components/Table.tsx
+++ b/packages/client/src/components/Table.tsx
@@ -65,7 +65,7 @@ export default (props: { tableKey: string }) => {
view,
}}
>
-
+
p != me())}>
{(player, i) => {
const verticalOffset = () => {
diff --git a/packages/client/src/components/toolbox.tsx b/packages/client/src/components/toolbox.tsx
index ca2ae98..332e45b 100644
--- a/packages/client/src/components/toolbox.tsx
+++ b/packages/client/src/components/toolbox.tsx
@@ -14,3 +14,8 @@ export type Clickable = {
>
| undefined;
};
+
+export type Sizable = {
+ width?: string;
+ height?: string;
+};
diff --git a/packages/server/src/api.ts b/packages/server/src/api.ts
index d13c423..50b97df 100644
--- a/packages/server/src/api.ts
+++ b/packages/server/src/api.ts
@@ -10,7 +10,6 @@ import dayjs from "dayjs";
import db from "./db";
import { liveTable, WsOut, WsIn } from "./table";
import { Human } from "@prisma/client";
-import _ from "lodash";
import { combine } from "kefir";
const api = new Elysia({ prefix: "/api" })
@@ -89,9 +88,9 @@ const api = new Elysia({ prefix: "/api" })
send({ players })
);
- table.outputs.playersReady.onValue((readys) =>
- send({ playersReady: readys })
- );
+ table.outputs.playersReady
+ .skipDuplicates()
+ .onValue((readys) => send({ playersReady: readys }));
combine(
[table.outputs.gameState],