From d53671d72b438863a82be37c82c1418b3640ec3f Mon Sep 17 00:00:00 2001 From: cpojer Date: Fri, 10 May 2024 19:11:10 +0900 Subject: [PATCH] More docs page updates. GitOrigin-RevId: 15957a7878e01934393468f18d65fdf5037f8846 --- .eslintrc.cjs | 1 + README.md | 4 +- ares/package.json | 1 - docs/content/examples/map-data-examples.tsx | 47 ++++++ docs/content/examples/map-editor.tsx | 30 ++++ docs/content/pages/core-concepts/actions.mdx | 1 + docs/content/pages/core-concepts/map-data.mdx | 123 ++++++++++++++- docs/content/pages/index.mdx | 9 +- docs/content/pages/playground/map-editor.mdx | 10 ++ docs/content/playground/ClientComponent.tsx | 31 ++++ docs/content/playground/ClientScope.tsx | 51 +++++++ .../content/playground/PlaygroundDemoGame.tsx | 37 +++++ docs/content/playground/PlaygroundGame.tsx | 81 ++++++++++ docs/content/public/FiraCode.woff2 | Bin 103168 -> 0 bytes docs/content/public/apple-touch-icon.png | Bin 3167 -> 3185 bytes docs/content/public/favicon.ico | Bin 510 -> 2462 bytes docs/content/public/favicon.png | Bin 306 -> 284 bytes docs/content/public/fonts/AthenaNova.woff2 | Bin 0 -> 17756 bytes docs/package.json | 12 +- docs/vocs.config.tsx | 59 +++++++ hera/package.json | 3 +- hera/ui/fps/Fps.tsx | 11 ++ hera/ui/fps/FpsComponent.tsx | 33 ++++ infra/babelFbtPlugins.tsx | 30 ++++ infra/resolver.tsx | 5 +- infra/root.ts | 4 + package.json | 12 ++ patches/@remix-run__router@1.16.1.patch | 22 +++ pnpm-lock.yaml | 88 +++++++++-- tests/display.html | 28 ++++ tests/display.tsx | 144 ++++++++++++++++++ tests/package.json | 11 ++ tests/vite.config.ts | 26 ++++ tests/viteServer.tsx | 3 +- ui/Browser.tsx | 19 ++- ui/CSS.tsx | 131 +--------------- ui/Dialog.tsx | 6 +- ui/cssVar.tsx | 116 +++++++++++++- ui/hooks/useScale.tsx | 6 +- 39 files changed, 1032 insertions(+), 163 deletions(-) create mode 100644 docs/content/examples/map-data-examples.tsx create mode 100644 docs/content/examples/map-editor.tsx create mode 100644 docs/content/pages/core-concepts/actions.mdx create mode 100644 docs/content/pages/playground/map-editor.mdx create mode 100644 docs/content/playground/ClientComponent.tsx create mode 100644 docs/content/playground/ClientScope.tsx create mode 100644 docs/content/playground/PlaygroundDemoGame.tsx create mode 100644 docs/content/playground/PlaygroundGame.tsx delete mode 100644 docs/content/public/FiraCode.woff2 create mode 100644 docs/content/public/fonts/AthenaNova.woff2 create mode 100644 hera/ui/fps/Fps.tsx create mode 100644 hera/ui/fps/FpsComponent.tsx create mode 100644 infra/babelFbtPlugins.tsx create mode 100644 infra/root.ts create mode 100644 patches/@remix-run__router@1.16.1.patch create mode 100644 tests/display.html create mode 100644 tests/display.tsx create mode 100644 tests/vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index be6fd4f5..e7d8c9b1 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -72,6 +72,7 @@ module.exports = { './ares/ares.tsx', './artemis/prisma/seed.tsx', './codegen/**', + './docs/vocs.config.tsx', './electron/**', './infra/**', './scripts/**', diff --git a/README.md b/README.md index 46adb8a9..b9c7f251 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ The codebase is split into multiple packages to enforce the separation of concer - `apollo` → Data structures and algorithms for manipulating _game_ state (_client/server_). - `hera` → Game engine and rendering (_client_). - `ui` → Design system (_client_). -- `deimos` → Landing page (_client_). +- `docs` → Docs & Playground (_client_). These are secondary packages focused on specific domains: @@ -67,7 +67,7 @@ Check out our [Athena Crisis Open Source Docs & Playground](https://athenacrisis ## What is open source and what isn't? -About 75% of all non-content related Athena Crisis code – **almost 100,000 lines** – is open source, including the core data structures, algorithms, game engine, rendering, AI, landing page and the map editor. Backend implementations such as user management, databases, APIs, realtime spectating, server configuration, and app wrappers for Steam or app stores are not open source. We aim to open source more of the game over time, but the content will remain the intellectual property of Nakazawa Tech KK and therefore not be open source. You can buy and enjoy [Athena Crisis on Steam Early Access](https://store.steampowered.com/app/2456430/Athena_Crisis/) or [buy it on athenacrisis.com](https://app.athenacrisis.com/checkout). +About 75% of all non-content related Athena Crisis code – **almost 100,000 lines** – is open source, including the core data structures, algorithms, game engine, rendering, AI, and the map editor. Backend implementations such as user management, databases, APIs, realtime spectating, server configuration, and app wrappers for Steam or app stores are not open source. We aim to open source more of the game over time, but the content will remain the intellectual property of Nakazawa Tech KK and therefore not be open source. You can buy and enjoy [Athena Crisis on Steam Early Access](https://store.steampowered.com/app/2456430/Athena_Crisis/) or [buy it on athenacrisis.com](https://app.athenacrisis.com/checkout). ## Why did you open source Athena Crisis? diff --git a/ares/package.json b/ares/package.json index 0915e9d1..3e0f508b 100644 --- a/ares/package.json +++ b/ares/package.json @@ -36,7 +36,6 @@ "react": "19.0.0-canary-fd0da3eef-20240404", "react-dom": "19.0.0-canary-fd0da3eef-20240404", "react-error-boundary": "^4.0.13", - "react-fps": "^1.0.6", "react-relay": "^16.2.0", "react-router-dom": "^6.23.1", "relay-runtime": "^16.2.0", diff --git a/docs/content/examples/map-data-examples.tsx b/docs/content/examples/map-data-examples.tsx new file mode 100644 index 00000000..ed691ca2 --- /dev/null +++ b/docs/content/examples/map-data-examples.tsx @@ -0,0 +1,47 @@ +import { Mountain } from '@deities/athena/info/Tile.tsx'; +import { Flamethrower, Infantry } from '@deities/athena/info/Unit.tsx'; +import withModifiers from '@deities/athena/lib/withModifiers.tsx'; +import vec from '@deities/athena/map/vec.tsx'; +import MapData from '@deities/athena/MapData.tsx'; +import Button from '@deities/ui/Button.tsx'; +import { Fragment, useState } from 'react'; +import PlaygroundGame from '../playground/PlaygroundGame.tsx'; + +// [!region mapA] +const mapA = withModifiers( + MapData.createMap({ + map: [1, 1, 1, 1, Mountain.id, 1, 1, 1, 1], + size: { height: 3, width: 3 }, + teams: [ + { + id: 1, + name: '', + players: [{ funds: 500, id: 1, userId: '1' }], + }, + { + id: 2, + name: '', + players: [{ funds: 500, id: 2, name: 'Bot' }], + }, + ], + }), +); +// [!endregion mapA] + +// [!region mapB] +const mapB = mapA.copy({ + units: mapA.units + .set(vec(2, 1), Flamethrower.create(1)) + .set(vec(3, 3), Infantry.create(2)), +}); +// [!endregion mapB] + +export default function ExampleMap() { + const [render, rerender] = useState(0); + return ( + + + + + ); +} diff --git a/docs/content/examples/map-editor.tsx b/docs/content/examples/map-editor.tsx new file mode 100644 index 00000000..f1bbea4c --- /dev/null +++ b/docs/content/examples/map-editor.tsx @@ -0,0 +1,30 @@ +import { Sniper } from '@deities/athena/info/Unit.tsx'; +import MapEditor from '@deities/hera/editor/MapEditor.tsx'; + +const viewer = { + access: 'User', + character: { + unitId: Sniper.id, + variant: 0, + }, + displayName: 'Maxima', + factionName: 'Atlas', + id: 'Demo-User-12', + skills: [], + username: 'demo-maxima', +} as const; + +export default function MapEditorExample() { + return ( + {}} + fogStyle="soft" + setHasChanges={() => {}} + tiltStyle="on" + updateMap={() => {}} + user={viewer} + /> + ); +} diff --git a/docs/content/pages/core-concepts/actions.mdx b/docs/content/pages/core-concepts/actions.mdx new file mode 100644 index 00000000..1060a658 --- /dev/null +++ b/docs/content/pages/core-concepts/actions.mdx @@ -0,0 +1 @@ +# Actions diff --git a/docs/content/pages/core-concepts/map-data.mdx b/docs/content/pages/core-concepts/map-data.mdx index edc4ac81..29e157ec 100644 --- a/docs/content/pages/core-concepts/map-data.mdx +++ b/docs/content/pages/core-concepts/map-data.mdx @@ -1,3 +1,124 @@ +import { lazy } from 'react'; +import ClientComponent from '../../playground/ClientComponent.tsx'; + # The `MapData` Class -[`MapData`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/MapData.tsx) +The [`MapData`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/MapData.tsx) class is at the core of each map and game state. As outlined in section about [Immutable Data Structures](/core-concepts/immutable-data-structures), it is immutable. Any change to map state returns a new instance of `MapData`. Here is the data that it holds: + +```tsx +class MapData { + map: TileMap, + modifiers: ModifierMap, + decorators: DecoratorMap, + config: MapConfig, + size: SizeVector, + currentPlayer: PlayerID, + round: number, + active: PlayerIDs, + teams: Teams, + buildings: ImmutableMap, + units: ImmutableMap, +} +``` + +Each map in the game is a grid defined by `size`. `map` is an Array of tile ids (In-game they are referred to as "fields"), with `modifiers` being the corresponding Array to identify the specific sprite variant for rendering. For example, if a tile in a specific location is a Street, with Street tiles above and below, but not to the right and left, the modifier will store information that it should render a vertical Street sprite. `map` is critical for gameplay and behaviors, but `modifiers` is only used for rendering. Modifiers are only stored on each map to avoid recalculating them frequently. In tests, you can use `withModifiers(map)` to generate the correct modifiers automatically. + +:::info[Note] +In Athena Crisis, the look of a tile on the screen depends on its adjacent tiles. There is always only one way to render a tile based on its neighbors. The map editor first checks if a tile can be placed via [`canPlaceTile`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/lib/canPlaceTile.tsx), and then recalculates the modifiers for the field and its neighbors via [`getModifier`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/lib/getModifier.tsx). +::: + +While `map` and `modifiers` are dense arrays, `decorators`, `buildings` and `units` are sparse. This is efficient because each game map has a tile and modifier for each field, but usually only few decorations, buildings and units. + +## Fun with Maps + +There are helper functions to serialize and deserialize map state from plain JavaScript values. Let's take a look at how to create an instance of `MapData` as is often seen in tests: + +```tsx +// [!include ~/examples/map-data-examples.tsx:mapA] +``` + +This creates a map with a 3x3 grid of plain fields (id `1`) and a Mountain in the center. The map has two teams with one human player and one bot. Now, let's add some units to this map: + +```tsx +// [!include ~/examples/map-data-examples.tsx:mapB] +``` + +We said "add some units", but in reality we created a completely new map with the units added. If we render this map, we see a Flamethrower on one side, and an Infantry on the other: + + import('../../examples/map-data-examples.tsx'))} +/> + +## Vectors & Positions + +In the above example we made use of a [`vec`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/map/vec.tsx) function. `vec` is a convenience function to create [`Vector`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/map/Vector.tsx) instances, which are 2d coordinates. Vectors cannot be created directly, and are always accessed via `vec`. Instances are cached for the duration of the session, and the same instance is returned for the same coordinates: + +```tsx +console.log(vec(3, 15) === vec(3, 15)); // true +``` + +Not only is this more memory efficient, but it also allows using them as keys in a `Map` or `Set`: + +```tsx +// Doesn't work: +const set = new Set([new Vector(1, 2), new Vector(3, 4)]); + +set.has(new Vector(1, 2)); // false + +// Works: +const set = new Set([vec(1, 2), vec(3, 4)]); + +set.has(vec(1, 2)); // true +``` + +Vectors have a number of convenience methods to navigate a grid. Here are some of the most useful ones: + +```tsx +vec(1, 3).down(); // Vector { x: 1, y: 4 } + +vec(2, 2).adjacent(); // up, right, down, left + +vec(2, 2).expand(); // self, up, right, down, left + +vec(5, 5).distance(vec(1, 1)); // 8, Manhattan distance +``` + +## Map State Queries + +Since most data structures are immutable, it's common to access data fields directly. For example, to find all opponent's of the current player you can do: + +```tsx +const opposingUnits = map.units.filter((unit) => + map.isOpponent(unit, map.currentPlayer), +); +``` + +This example will return a new `ImmutableMap` of all units. `MapData` contains many helper methods to query map state. For example, `map.isOpponent` checks if two players or entities are opponents, `map.isTeam(unit, player)` checks if they are the same team. To check if a unit matches a player, you can use `map.matchesPlayer(unit, player). These checks are necessary because a game can have multiple teams each consisting of one or more players. + +Since it's inconvenient to calculate the index of a tile in the `map` array, you can use `map.getTileInfo(vector)` to receive the tile structure for a specific field: + +```tsx +map.getTileInfo(vec(2, 2)).id === Mountain.id; // true +``` + +`MapData` has a few methods that return a new map state, for example `map.recover(playerID)` which returns a new map with all `completed` and `moved` states removed from units. This is used to reset the state for a player when a user ends their turn. + +There is a large number of query functions available in [`athena/lib`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/lib) that can be used to access map state or produce new ones. These functions are used widely in game logic and the AI. + +## Updating Map State + +Let's say we want to set the health of each opposing unit to `1`: + +```tsx +const units = map.units.map((unit) => + map.isOpponent(unit, map.currentPlayer) ? unit.setHealth(1) : unit, +); + +const newMap = map.copy({ units }); +``` + +That's it! After a mutation to map state it can be shared with other players, like for example when an action is taken on the server or the state can be stored in a database using `JSON.stringify(newMap)`. In the next section we'll discuss the formalized approach to update game state via [Actions](/core-concepts/actions). + +:::info[Note] +Many data structures in Athena Crisis are technically mutable as they are basic JavaScript Arrays, Sets or Maps. This is usually for performance reasons. Their immutability is enforced via TypeScript types. +::: diff --git a/docs/content/pages/index.mdx b/docs/content/pages/index.mdx index 0f228c08..d6fbeb44 100644 --- a/docs/content/pages/index.mdx +++ b/docs/content/pages/index.mdx @@ -2,13 +2,15 @@ layout: landing --- +import { lazy } from 'react'; import { HomePage } from 'vocs/components'; +import ClientComponent from '../playground/ClientComponent.tsx'; - Athena Crisis logo + Athena Crisis logo Open Source Docs & Playground - This is a description of my documentation website. + Athena Crisis is a modern retro turn-based strategy game. @@ -18,4 +20,7 @@ import { HomePage } from 'vocs/components'; GitHub + import('../playground/PlaygroundDemoGame.tsx'))} + /> diff --git a/docs/content/pages/playground/map-editor.mdx b/docs/content/pages/playground/map-editor.mdx new file mode 100644 index 00000000..7bc8a445 --- /dev/null +++ b/docs/content/pages/playground/map-editor.mdx @@ -0,0 +1,10 @@ +--- +layout: minimal +--- + +import { lazy } from 'react'; +import ClientComponent from '../../playground/ClientComponent.tsx'; + +# Map Editor + + import('../../examples/map-editor.tsx'))} /> diff --git a/docs/content/playground/ClientComponent.tsx b/docs/content/playground/ClientComponent.tsx new file mode 100644 index 00000000..6c339d4e --- /dev/null +++ b/docs/content/playground/ClientComponent.tsx @@ -0,0 +1,31 @@ +import Spinner from '@deities/ui/Spinner.tsx'; +import Stack from '@deities/ui/Stack.tsx'; +import { Suspense, useEffect, useState } from 'react'; + +export default function ClientComponent({ + module: Module, +}: { + module: () => JSX.Element; +}) { + const [element, setElement] = useState(null); + + useEffect(() => { + import('./ClientScope.tsx').then(({ default: ClientScope }) => + setElement( + + + + + } + > + + + , + ), + ); + }, [Module]); + + return element; +} diff --git a/docs/content/playground/ClientScope.tsx b/docs/content/playground/ClientScope.tsx new file mode 100644 index 00000000..17b850de --- /dev/null +++ b/docs/content/playground/ClientScope.tsx @@ -0,0 +1,51 @@ +import { initializeCSSVariables } from '@deities/ui/cssVar.tsx'; +import { ScaleContext } from '@deities/ui/hooks/useScale.tsx'; +import { css, injectGlobal } from '@emotion/css'; +import { init as initFbt, IntlVariations } from 'fbt'; + +initializeCSSVariables(); + +initFbt({ + hooks: { + getViewerContext: () => ({ + GENDER: IntlVariations.GENDER_UNKNOWN, + locale: 'en_US', + }), + }, + translations: {}, +}); + +injectGlobal(` +@font-face { + font-display: swap; + font-family: Athena; + src: url('/fonts/AthenaNova.woff2'); +} + +body { + font-family: Athena, ui-sans-serif, system-ui, sans-serif; + font-size: 20px; + font-weight: normal; + line-height: 1em; +} + +`); + +if (import.meta.env.DEV) { + import('@deities/hera/ui/fps/Fps.tsx'); +} + +export default function ClientScope({ children }: { children: JSX.Element }) { + return ( + +
{children}
+
+ ); +} + +const style = css` + all: initial; + + font-family: Athena, ui-sans-serif, system-ui, sans-serif; + outline: none; +`; diff --git a/docs/content/playground/PlaygroundDemoGame.tsx b/docs/content/playground/PlaygroundDemoGame.tsx new file mode 100644 index 00000000..01231511 --- /dev/null +++ b/docs/content/playground/PlaygroundDemoGame.tsx @@ -0,0 +1,37 @@ +import convertBiome from '@deities/athena/lib/convertBiome.tsx'; +import { Biome } from '@deities/athena/map/Biome.tsx'; +import demo1, { + metadata as metadata1, +} from '@deities/hermes/map-fixtures/demo-1.tsx'; +import demo2, { + metadata as metadata2, +} from '@deities/hermes/map-fixtures/demo-2.tsx'; +import randomEntry from '../../../hephaestus/randomEntry.tsx'; +import PlaygroundGame from './PlaygroundGame.tsx'; + +const biome = randomEntry([ + Biome.Grassland, + Biome.Desert, + Biome.Snow, + Biome.Swamp, + Biome.Volcano, +]); + +const [map, metadata] = randomEntry([ + [demo1, metadata1], + [demo1, metadata1], + [demo1, metadata1], + [demo2, metadata2], +]); +const currentDemoMap = convertBiome( + map.copy({ + config: map.config.copy({ + fog: randomEntry([true, false, false, false, false]), + }), + }), + biome, +); + +export default function PlaygroundDemoGame() { + return ; +} diff --git a/docs/content/playground/PlaygroundGame.tsx b/docs/content/playground/PlaygroundGame.tsx new file mode 100644 index 00000000..19947ead --- /dev/null +++ b/docs/content/playground/PlaygroundGame.tsx @@ -0,0 +1,81 @@ +import { MapMetadata } from '@deities/apollo/MapMetadata.tsx'; +import { prepareSprites } from '@deities/art/Sprites.tsx'; +import MapData from '@deities/athena/MapData.tsx'; +import GameMap from '@deities/hera/GameMap.tsx'; +import useClientGame from '@deities/hera/hooks/useClientGame.tsx'; +import useClientGameAction from '@deities/hera/hooks/useClientGameAction.tsx'; +import GameActions from '@deities/hera/ui/GameActions.tsx'; +import MapInfo from '@deities/hera/ui/MapInfo.tsx'; +import setupGamePad from '@deities/ui/controls/setupGamePad.tsx'; +import setupKeyboard from '@deities/ui/controls/setupKeyboard.tsx'; +import useScale from '@deities/ui/hooks/useScale.tsx'; +import { useInView } from 'framer-motion'; +import { useRef } from 'react'; + +prepareSprites(); +setupGamePad(); +setupKeyboard(); + +const startAction = { + type: 'Start', +} as const; + +export default function PlaygroundGame({ + map, + metadata, +}: { + map: MapData; + metadata?: MapMetadata; +}) { + const userId = 'User-Demo'; + const [game, setGame] = useClientGame( + map, + userId, + metadata?.effects || new Map(), + startAction, + ); + + const onAction = useClientGameAction(game, setGame); + const zoom = useScale(); + const ref = useRef(null); + const isInView = useInView(ref, { margin: '-20% 0px 6% 0px' }); + + return ( +
+ + {(props, actions) => { + const hide = + !isInView || props.lastActionResponse?.type === 'GameEnd'; + + return ( + <> + + + + ); + }} + +
+ ); +} diff --git a/docs/content/public/FiraCode.woff2 b/docs/content/public/FiraCode.woff2 deleted file mode 100644 index c856e7bec8332ae42a7c03d1ee2571f234edcc5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103168 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�q*u!)UyWCY7~7cId1HB*fWcBVcyP>#y|Vh6UP)oBBxuhT_`5#jW?_1EE z!am+V+!0w}ni);6ci9Z_tdBD_9yW<@`=P>4WAZCt_Q>*QI*Twdxq2zmYY*3(Jy>xx zK6ufA(y!i$sUN@vKMH?udWN5oNSq;n|K+wM05m?ol&b{Z5k|lH$6)tJzpM_#C;aXj1tM;gIaB#I z_uB}>FUR=u4wdPHj?ec@plR1!AB1_m2(sWuEgj7B>+>K&Cm&kCJ}?EMZXJJIKC@ly z`|CkA3Y-PWPA^$LM2oi^+P+8-B5;pkIR10?-C*|SrcNEUsx(6_t#1>FudS00t-I$Y z1pppYos=UT{QQ#${777%dB)+-r0Z^3nB@T?Ss49aGOJ8m0~<)~aHI+rQ0KW&R;Nvy zFdg22isZ=ZVkohv6Z2WRvr)=GrD;cHWPZY3z&c5Zm=8_qsm$9@AxK^tZ)RM*aVAI_ zceE>qjk{>B&_6(7)lO{ZO7pVU3}mkgXrt@Md=ODUDEE#!{Wfv%%E6tjUvCm@?l%EC z(*HP!L!YuA?8+Zvku)HSOIQT=yot&`c(~0jt%A+ZnkJ)P}kjF1l4|Ob$shnj2_9 z3D>iF$!Dr3ddNJxWW=aQXv|{6gvbZ0fR5B?G%jwaCB%;TbXM3(%D5IKoZ2_Rqaa^Q zE@4g4Iw2}!Ae9^HgVBVO@$9^&|Nb*7P6QlkBmrfm2D>Z$BaNj~(I{(V0sk@Ul2m^W zupflANNYKm)jKw!3!|e+R#XZw;}+eEo5#veTKiaaRK(mwOs#pobDvD+0z-Beo(HXnty7A}}wa^34{fmC(mqGl-^-_*W0F!u#!5=fC= zeI*l8vBLubh~{J59c1`Efs%y%JW@x3@dqj^2jV&sU|o=jg~66t=;as>I-L{`Aye70L>q9|NH0@(FNrlVne^5#t4ha2)S;diFmu>ga+q|hRe#ETg{;;iz-3zREZR7h$ywQO8g z&Yx;tt3OKruJ4tQIXSpU-Rv$=y5+j8j!bRoOK&(T#mtyzZWy*~D3!RTXJ{?+*!V&H zBL(t&Uy%?4KmZBl)3XCb2pZM5`&#ql@)IXeC}ZXf7&mZeCH0o#GuJv51K;tMr+WO zN|sAj>&?cPQ#gnLh{yvFi3OOcjK*_7#%k8Cp$kW^Zr)P548f8G3~AJ?p_6+A00kH_ z5Wxg>!juUV$rR0^m5V>3N&o%yII?M2AffyQ_8^EMqxuf+KncR7@)piuNh7Vg3BC+@ zya|)XP$iNz4!RW_UFo&-3n?@`-T%3lMe4oC>0jsSni^XG{`mADP(eiTseGZBD%mS3PqW)G#u531g@fQ8RiC>)Aw}<9pEmM<5*4)?P1nPY`oDVb0MZ((j9N)u z^7_CBNxF1zcV0Y``S;2YuKeh_fQ>kGY(sJ`Rf7W zVZ{Um=veir)h_=G?JO=eJw{0}r4EG=Y0k@qc)DNl<6yM2L0sER<6;L07ci(}^WuGe z$C^J6qkX4%uy(%#RdVv(CXORh#?0zBu4B{2(ZNR!dnBqZiP;PMpXHFFqrJ1u!~K|B z_F{QzL!Vig{vW}H%x*75%hYw<=cy0-BCAp;;_0tWXXh@oNz4(~t+Bcux!HCfkX`4}F&4H~pg z-eyn!hvpYT!H_1};w3RIzDWZ5_4_%6v5zgud7G*l79ltvo0J+i;Ob{N>}Sg!$+h@0 z*;^{XwH;TUYTN(S)^!Fo!EEh>CMuyyRl0;CRd|8WL@X2y5;}xlLzi9@2%$)m-aAMM zLLvgvI|3SN=v9=^q)G4PY$%q_Y-zf=9Z~tEYQo{<6VLx618KP+6|Vn_)_*diUa3^m zp;|`X|9Xr6^-m9IzWpmI4?s+J`|b@!s$8UouJ(KU(h>SU&ev{)DL&6xJ2lT*ww^mA zG&xf<5rwvcjOoXSW`s)vi5RC)X!|iUj?KoA=3|M*x;?K z0mVObAdXUS;lWCPkh)M8>aN$QLPXe-&*LPkvOMF49bdy5f?ojjbJqkLU-QWx<_rnK zYR=pyRVGAAY#4k`mQKastK;wnYE={jsJi2xG)#hoL6v)WyZ_3}F*PzVo}Zl1uh5si zw`MB-AQ|l8?>8XJ)=amhH)7%Ml2;+Vb+!XNt@b(M!Lb6hPq)NkZq$zc&;u`C# zWZpl8A{4gY+y!B2Ud$C;tK4~-<)eDgG$uYwQ@5D41b#Ou!lvRCJdq{LBt$~(WidZL z5pj?KR<(blKIed_9J^Gm;J~J@t^)R(P9Af&bS&{lvi^!3X#qUkYuYD;wZ;Y9esE=y%ark=`c1)eEjn z|BNdR_-mNhD?MIiKSAb7K_#Lyqohp3JC=rVo{gWbjM`fvD~dBkCA*7>M*4Ox;%RWSqL4s z{41{o0llN+jr&Nn;1OSb6Ev$*7h{|*6O^))@%Ug>x0_XG-0!9naV)ueVW!=urL4V} zEb3aNhV*QX@T^|OBA+jDngT`7S*5du9(>V$|HdbrpHV>mF12}#hq(NgZYIm<&*O#; zPKPlakZ@7uhTG(vA=FCRjkSZxIH6~J9?Hi?9JfZa$n#$~^E)u|x(<&dcHFUy7UK-j zP`WmyRpKj3(oo~)ti5A_3ms;#z>yX=Y5z9ia5gT|{Z;UyIyB8KzpjRXW?5xI@nyZn zw9T!=UX$gN!m zdgMi=dM(HlukS2Z?}z`ItkW?*`<&onn`MJnz;MyhbXiXcJ?B0k63Rx0v%i!6@EU5SJzX*Yc7U}BYFJAHiI`1WvQ{6W8n4LQlgO##v( zn`rEK;Jb}^*1qoIcj_bg#lL zQv(6S@kA5=z|&K-9SN)UYf<|Fd!Y4fJ+p`gBOR`eTc6PQ7SYw%@UiOgnw|AXJO5g_ zX+wN5sByn?@f};Wedv4Qb+b%C=Rec+4X^H5nY60OdC$qwhgu&ke7;&)3G&CR6AvaR zTkgpUiAX5flX;?tC~JB4$Vk0Xlh%6*aOG7ilxm%huIt47nOB>eUlqGik`a|SceknSD5q`JSr3+-jmmSEm@ zD;+usW=A)AOrEp~o26Gg(O~C~)X8RJq2Gjr-uS`KP!%JRBGZ~$fgh@}C#bTDz%Yvm z-w#9$Nt#Vd?1}_M@(e7JeaA&5q~cNF+Emc>*K`g^Vd`vKo{Q7DQL~zlgAuCJnhD0}%X{7`vYY;ZC=ar^K&XYHjZqR{FesE!z03jzLL*>nWA71LVreSiuk*+@tvkjo zH50R1ABP4voVdIJ$&I+Ju&Qsqa&dR|O;v=qQ{G5Bt{mQy)kBgkH2kQiMA1vb6I_m# zTj#M6E1?YU+1-OX<~4ulx~)N*T=ow9oW=`@YK0Qyi$cX5qVsFzWCpa;*QP@}YM+&- zn)D(FJM|(b{u6p?cP!%lbkeA@$p1Q(FnO>Sr%n?~8yMyGIHd>UFk{yKJC2TK9aOlO zl*e`b;Nhk|H8JLIYeN<+E$(O3oT`D(TH2mqrTHF^QvKDbYP(EVP$9=5(Q}q!XPrHy zp<)_21=?4Ujp;2dopq*rnhAt8oTqHccbYPAu{!Qe1|ND0hrJ+f+)yv67S|mpHCBJ7 zrYroO@wdEp&BH8|PK)M`oSSYgzGQ2A<@a1^d)R~I&~BficNgV0_D$&K*Upr(?NIZx zvu?vti@Pb0oFU&zxdJ?_js^$$C*Z5nw*}rp9O?an2Xm|Bn}hqZDqXd1T8NmI3q6vW?dvC@;aOqhoorHer`&x~gRdy=9}+8!g?#!~yNH-Az) zg{_z|7Z{q=jU@p&P!`hfIQWJ85i`uk`c!#00?ct-yO{{m@e6*!n=%^Ca^B-HkzL1d zuE4G+S8zEn%$+=8VYrXbqOt-Uru04joltSR+$w86^uU(+sJcn&H8o1ih~)tvIQDKJ zm|?9Fzp8xzv?3T~;13<*OqcH$E(Si#l9>WI1>NOC#z1;QSjX+SMu9{yCP_gYgT9U^ z;zoZFQ%X_@sm(W{x;iRqJH%@aSAEtcOQTO}{ue+AQqjL%b_f1c;84*KL=JJb)hnSIcZC@>z-{m}E z<{u1ci1t6k=>0?kC4=W25OAxW8_6vc{$ON;C53*oR}Sak?MZreMo$}nNcj2deZc14 zM=$cUXp(p}AD*G^K7q%)i^Gb*Un2V(CB4sXJqNO(Aw?uRWqxvy|G!?R0bIsD{nti+^DS0<}pF(~8_?{Z{7oFlWt8HbAMB?RA@XcuV6^A z0taExl|*5u)MhMlf(J^gd|RZ3LnNyTy~y0xqf|fne4zYp=r~y9Wk&@Qjmjt#N&jnJ zXN^R(lU{q65x*tPOpRt67^UuEi7r*Eu9ThkYSjB$Qh% z@iY5ZKSPp_gi{95pjFriHRY)j`)N|siL>tC+GMB==$aO__GeacrBrX0BJm-=U3a< zJi7`y^IBE270bnA3;>4F7Ry@Vla5R(9 X!6WdgxKc=S?i^2`1{X`5pXdJoZdm2v diff --git a/docs/content/public/apple-touch-icon.png b/docs/content/public/apple-touch-icon.png index 82fad44d755262127b843f4c20f603a553918f37..e7aaf7b75e572306d9452909633dff88c58e957e 100644 GIT binary patch delta 1217 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 literal 510 zcmZ{hu}i~17{yxWTYFk7S5ri(*#uh~o>px(J&RRiq(Siuw1f3k5T(pZ& z90ZqQ7YC1VDPNHXw| znvu(^@|uJ@KE$wB2^)F9o@?Ib3ro`2<|(9k?-hcoxMVx?+*&OA6>~Td&kqAJY?sbg zy))l1^!!rbMnM?3UO8eAY%_<^2+Xp-P2aCkZxZ^Z+fV8Qs5&Ohcl|fhd7m0^ Y%{OzURj1k(RBr|9YZt128qMVFA8IyWk^lez diff --git a/docs/content/public/favicon.png b/docs/content/public/favicon.png index 98fb82c40cb94b61dc4ae011763b9d4da39d052f..a6128bc083c758836c0e87c367b5f684ef62c7fc 100644 GIT binary patch delta 269 zcmV+o0rLK`0-OSn7=H)@0002jsm;m&001peOjJex|Nj600RP#vufxp9xTyb~Jb8$Z z!*L*pcyNA45IjqBO-DpIN>C~)DgXcg%_z?R00002bW%=J0Dzk-P8a|H0GvrgK~#9! zrO!bQgD?yQQ4&auG0gpsTi0zYXj!$x2K`5nGW{OF?SwYD$bXp7FF~~mM0cXnY85UJ zzj66IgM}!YcM`x%RYd6XJg3lV1#>{up$|c7ZGs8fw9~-|L!~*mB(M_TG3tHG3jtv3 zvMj8y0c#xb;?;~u$?KFtP&_+KqvCRqm1nO#5m@E-3#M( T3Ahyi0000-7=Hu<0000ISs=>*001peOjJex|Nj6000000en$|)aUlPlJWWSL zh;YPCJa~TEsG}Z(($>I-_|dKkUHZ`6Rc0#4J}jDBnypdq z=sw5!QmE3_DPz%qE$m)14#Zc`LPKy4ZM1wH0NIxiK;@i&0G*>j5QLb5mdpr&Aax>n p3NfKVzyM0LAsmiiK_A(Vy#WHPCwEsfRzLs%002ovPDHLkV1k{bc!~f3 diff --git a/docs/content/public/fonts/AthenaNova.woff2 b/docs/content/public/fonts/AthenaNova.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b00db90dfe9017ec9caf33ba85e08680886f11e7 GIT binary patch literal 17756 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 JJAeQH006?Tw50$5 literal 0 HcmV?d00001 diff --git a/docs/package.json b/docs/package.json index 6e7ba269..d10602b6 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,11 +15,21 @@ "preview": "vocs preview" }, "dependencies": { + "@deities/apollo": "workspace:*", + "@deities/art": "workspace:*", + "@deities/athena": "workspace:*", + "@deities/hera": "workspace:*", + "@deities/hermes": "workspace:*", + "@deities/ui": "workspace:*", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/css": "^11.11.2", "@types/react": "^18.3.1", "dunkel-theme": "^1.7.1", + "fbt": "^1.0.2", + "framer-motion": "^11.1.9", "licht-theme": "^1.7.1", "react": "19.0.0-canary-fd0da3eef-20240404", "react-dom": "19.0.0-canary-fd0da3eef-20240404", - "vocs": "^1.0.0-alpha.49" + "vocs": "1.0.0-alpha.51" } } diff --git a/docs/vocs.config.tsx b/docs/vocs.config.tsx index a1cf4766..a70893ff 100644 --- a/docs/vocs.config.tsx +++ b/docs/vocs.config.tsx @@ -1,6 +1,10 @@ import { readFileSync } from 'node:fs'; +import babelPluginEmotion from '@emotion/babel-plugin'; +import react from '@vitejs/plugin-react'; import React from 'react'; import { defineConfig } from 'vocs'; +import babelFbtPlugins from '../infra/babelFbtPlugins.tsx'; +import resolver from '../infra/resolver.tsx'; const Licht = JSON.parse( readFileSync('./node_modules/licht-theme/licht.json', 'utf8'), @@ -11,6 +15,7 @@ const Dunkel = JSON.parse( export default defineConfig({ basePath: '/open-source', + baseUrl: 'https://athenacrisis.com/open-source', description: 'Open Source Docs & Playground', editLink: { pattern: @@ -25,6 +30,12 @@ export default defineConfig({ head: ( <> + ), iconUrl: '/favicon.png', @@ -58,9 +69,22 @@ export default defineConfig({ link: '/core-concepts/map-data', text: 'MapData ', }, + { + link: '/core-concepts/actions', + text: 'Actions ', + }, ], text: 'Core Concepts', }, + { + items: [ + { + link: '/playground/map-editor', + text: 'Map Editor', + }, + ], + text: 'Playground', + }, ], socials: [ { @@ -80,4 +104,39 @@ export default defineConfig({ accentColor: '#c3217f', }, title: 'Athena Crisis', + topNav: [ + { link: '/core-concepts/overview', match: '/core-concepts', text: 'Docs' }, + { + link: 'https://store.steampowered.com/app/2456430/Athena_Crisis/', + text: 'AC on Steam', + }, + { + items: [ + { + link: 'https://nkzw.tech', + text: 'Nakazawa Tech', + }, + { + link: 'https://null.com', + text: 'Null', + }, + ], + text: 'More', + }, + ], + vite: { + define: { + 'process.env.IS_LANDING_PAGE': `1`, + }, + plugins: [ + react({ + babel: { + plugins: [...babelFbtPlugins, babelPluginEmotion], + }, + }), + ], + resolve: { + alias: [resolver], + }, + }, }); diff --git a/hera/package.json b/hera/package.json index 43c6fa70..5f02745e 100644 --- a/hera/package.json +++ b/hera/package.json @@ -26,7 +26,8 @@ "fbt": "^1.0.2", "framer-motion": "^11.1.9", "react": "19.0.0-canary-fd0da3eef-20240404", - "react-dom": "19.0.0-canary-fd0da3eef-20240404" + "react-dom": "19.0.0-canary-fd0da3eef-20240404", + "react-fps": "^1.0.6" }, "devDependencies": { "@types/react": "^18.3.1", diff --git a/hera/ui/fps/Fps.tsx b/hera/ui/fps/Fps.tsx new file mode 100644 index 00000000..b316f3d2 --- /dev/null +++ b/hera/ui/fps/Fps.tsx @@ -0,0 +1,11 @@ +import { createRoot } from 'react-dom/client'; +import { HideContext } from '../../hooks/useHide.tsx'; +import Fps from './FpsComponent.tsx'; + +const root = document.createElement('div'); +createRoot(root).render( + + + , +); +document.body.append(root); diff --git a/hera/ui/fps/FpsComponent.tsx b/hera/ui/fps/FpsComponent.tsx new file mode 100644 index 00000000..583344c1 --- /dev/null +++ b/hera/ui/fps/FpsComponent.tsx @@ -0,0 +1,33 @@ +import parseInteger from '@deities/hephaestus/parseInteger.tsx'; +import Box from '@deities/ui/Box.tsx'; +import { css, cx } from '@emotion/css'; +import { useFps } from 'react-fps'; +import useHide from '../../hooks/useHide.tsx'; +import maybeFade from '../../ui/lib/maybeFade.tsx'; + +export default function Fps() { + const hidden = useHide(); + const { avgFps, currentFps } = useFps(20); + return currentFps != null ? ( + + {currentFps} fps/{parseInteger(avgFps)} avg + + ) : null; +} + +const style = css` + bottom: 10px; + font-size: 12px; + height: 12px; + left: 0; + line-height: 12px; + margin: 0 auto; + min-height: auto; + padding: 0 8px; + pointer-events: none; + position: fixed; + right: 0; + white-space: nowrap; + width: 124px; + z-index: 1000; +`; diff --git a/infra/babelFbtPlugins.tsx b/infra/babelFbtPlugins.tsx new file mode 100644 index 00000000..652de190 --- /dev/null +++ b/infra/babelFbtPlugins.tsx @@ -0,0 +1,30 @@ +import { join } from 'node:path'; +import babelPluginFbt from 'babel-plugin-fbt'; +import babelPluginFbtImport from 'babel-plugin-fbt-import'; +import babelPluginFbtRuntime from 'babel-plugin-fbt-runtime'; +import isOpenSource from './isOpenSource.tsx'; +import root from './root.ts'; + +const enumManifest = (() => { + try { + return require('../ares/.enum_manifest.json'); + } catch { + if (!isOpenSource()) { + throw new Error('babelFbtPlugins: Missing enum manifest.'); + } + } + return {}; +})(); + +export default [ + babelPluginFbtImport, + [ + babelPluginFbt, + { + extraOptions: { __self: true }, + fbtCommonPath: join(root, 'i18n/Common.cjs'), + fbtEnumManifest: enumManifest, + }, + ], + babelPluginFbtRuntime, +]; diff --git a/infra/resolver.tsx b/infra/resolver.tsx index 7469e8ce..90bb391a 100644 --- a/infra/resolver.tsx +++ b/infra/resolver.tsx @@ -1,7 +1,6 @@ import { existsSync } from 'node:fs'; import { join } from 'node:path'; - -const root = process.cwd(); +import root from './root.ts'; const mappings = new Map([ ['athena-crisis:audio', join(root, 'ui/Audio')], @@ -10,7 +9,7 @@ const mappings = new Map([ ] as const); export default { - customResolver(id: string, from: string | undefined) { + customResolver(id: string) { if ( id === 'athena-crisis:audio' || id === 'athena-crisis:asset-variants' || diff --git a/infra/root.ts b/infra/root.ts new file mode 100644 index 00000000..c06ec1b5 --- /dev/null +++ b/infra/root.ts @@ -0,0 +1,4 @@ +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default dirname(dirname(fileURLToPath(import.meta.url))); diff --git a/package.json b/package.json index 30ca8d2e..a886c643 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,17 @@ "pnpm": ">=9.0.1" }, "pnpm": { + "peerDependencyRules": { + "allowAny": [ + "@aws-sdk/client-sso-oidc", + "react", + "react-dom", + "utf-8-validate" + ], + "ignoreMissing": [ + "@fbtjs/default-collection-transform" + ] + }, "neverBuiltDependencies": [ "canvas" ], @@ -95,6 +106,7 @@ "rollup@^2.0.0": "^4.16.4" }, "patchedDependencies": { + "@remix-run/router@1.16.1": "patches/@remix-run__router@1.16.1.patch", "eslint-plugin-import@2.29.1": "patches/eslint-plugin-import@2.29.1.patch", "fbt@1.0.2": "patches/fbt@1.0.2.patch", "graphql-helix@1.13.0": "patches/graphql-helix@1.13.0.patch", diff --git a/patches/@remix-run__router@1.16.1.patch b/patches/@remix-run__router@1.16.1.patch new file mode 100644 index 00000000..2b334b09 --- /dev/null +++ b/patches/@remix-run__router@1.16.1.patch @@ -0,0 +1,22 @@ +diff --git a/dist/router.cjs.js b/dist/router.cjs.js +index 7c5abbb2f2c314912921298c6101e1fe0e0bebbf..4c0c94b3e9675a6bdeb95fb27364aa73a320a281 100644 +--- a/dist/router.cjs.js ++++ b/dist/router.cjs.js +@@ -3562,7 +3562,7 @@ function createStaticHandler(routes, opts) { + let results = await callDataStrategy("action", request, [actionMatch], matches, isRouteRequest, requestContext, unstable_dataStrategy); + result = results[0]; + if (request.signal.aborted) { +- throwStaticHandlerAbortedError(request, isRouteRequest, future); ++ //throwStaticHandlerAbortedError(request, isRouteRequest, future); + } + } + if (isRedirectResult(result)) { +@@ -3677,7 +3677,7 @@ function createStaticHandler(routes, opts) { + } + let results = await callDataStrategy("loader", request, matchesToLoad, matches, isRouteRequest, requestContext, unstable_dataStrategy); + if (request.signal.aborted) { +- throwStaticHandlerAbortedError(request, isRouteRequest, future); ++ //throwStaticHandlerAbortedError(request, isRouteRequest, future); + } + + // Process and commit output from loaders diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bff20cbc..5b1515cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ overrides: rollup@^2.0.0: ^4.16.4 patchedDependencies: + '@remix-run/router@1.16.1': + hash: f5klonf5edxua46cqfhk7ivlia + path: patches/@remix-run__router@1.16.1.patch eslint-plugin-import@2.29.1: hash: gqi3hqavyg4p4tnm2gmk4olmpe path: patches/eslint-plugin-import@2.29.1.patch @@ -181,9 +184,6 @@ importers: react-error-boundary: specifier: ^4.0.13 version: 4.0.13(react@19.0.0-canary-fd0da3eef-20240404) - react-fps: - specifier: ^1.0.6 - version: 1.0.6(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404) react-relay: specifier: ^16.2.0 version: 16.2.0(react@19.0.0-canary-fd0da3eef-20240404) @@ -569,12 +569,42 @@ importers: docs: dependencies: + '@deities/apollo': + specifier: workspace:* + version: link:../apollo + '@deities/art': + specifier: workspace:* + version: link:../art + '@deities/athena': + specifier: workspace:* + version: link:../athena + '@deities/hera': + specifier: workspace:* + version: link:../hera + '@deities/hermes': + specifier: workspace:* + version: link:../hermes + '@deities/ui': + specifier: workspace:* + version: link:../ui + '@emotion/babel-plugin': + specifier: ^11.11.0 + version: 11.11.0 + '@emotion/css': + specifier: ^11.11.2 + version: 11.11.2 '@types/react': specifier: ^18.3.1 version: 18.3.1 dunkel-theme: specifier: ^1.7.1 version: 1.7.1 + fbt: + specifier: ^1.0.2 + version: 1.0.2(patch_hash=nsmo6pdao5zymwjciznmexrgoy)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0-canary-fd0da3eef-20240404) + framer-motion: + specifier: ^11.1.9 + version: 11.1.9(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404) licht-theme: specifier: ^1.7.1 version: 1.7.1 @@ -585,8 +615,8 @@ importers: specifier: 19.0.0-canary-fd0da3eef-20240404 version: 19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404) vocs: - specifier: 1.0.0-alpha.49 - version: 1.0.0-alpha.49(@types/node@20.12.11)(@types/react-dom@18.3.0)(@types/react@18.3.1)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404)(rollup@4.17.2)(terser@5.31.0)(ts-node@10.9.2(@swc/core@1.5.5)(@types/node@20.12.11)(typescript@5.4.5))(typescript@5.4.5) + specifier: 1.0.0-alpha.51 + version: 1.0.0-alpha.51(@types/node@20.12.11)(@types/react-dom@18.3.0)(@types/react@18.3.1)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404)(rollup@4.17.2)(terser@5.31.0)(ts-node@10.9.2(@swc/core@1.5.5)(@types/node@20.12.11)(typescript@5.4.5))(typescript@5.4.5) eslint-plugin: {} @@ -657,6 +687,9 @@ importers: react-dom: specifier: 19.0.0-canary-fd0da3eef-20240404 version: 19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404) + react-fps: + specifier: ^1.0.6 + version: 1.0.6(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404) devDependencies: '@types/react': specifier: ^18.3.1 @@ -726,6 +759,9 @@ importers: '@deities/ares': specifier: workspace:* version: link:../ares + '@deities/art': + specifier: workspace:* + version: link:../art '@deities/athena': specifier: workspace:* version: link:../athena @@ -735,9 +771,21 @@ importers: '@deities/hephaestus': specifier: workspace:* version: link:../hephaestus + '@deities/hera': + specifier: workspace:* + version: link:../hera '@deities/hermes': specifier: workspace:* version: link:../hermes + '@deities/ui': + specifier: workspace:* + version: link:../ui + '@emotion/babel-plugin': + specifier: ^11.11.0 + version: 11.11.0 + '@emotion/css': + specifier: ^11.11.2 + version: 11.11.2 '@nkzw/immutable-map': specifier: ^1.2.2 version: 1.2.2 @@ -750,15 +798,33 @@ importers: '@types/object-inspect': specifier: ^1.13.0 version: 1.13.0 + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 chalk: specifier: ^5.3.0 version: 5.3.0 + fbt: + specifier: ^1.0.2 + version: 1.0.2(patch_hash=nsmo6pdao5zymwjciznmexrgoy)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0-canary-fd0da3eef-20240404) jest-image-snapshot: specifier: ^6.4.0 version: 6.4.0 playwright: specifier: ^1.44.0 version: 1.44.0 + react: + specifier: 19.0.0-canary-fd0da3eef-20240404 + version: 19.0.0-canary-fd0da3eef-20240404 + react-dom: + specifier: 19.0.0-canary-fd0da3eef-20240404 + version: 19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404) + react-error-boundary: + specifier: ^4.0.13 + version: 4.0.13(react@19.0.0-canary-fd0da3eef-20240404) strip-ansi: specifier: ^7.1.0 version: 7.1.0 @@ -7568,8 +7634,8 @@ packages: jsdom: optional: true - vocs@1.0.0-alpha.49: - resolution: {integrity: sha512-scdiioB5jdbFfko20/H6QuZ5btVmmArLSswYnjQEP7Qlb/wQhiz9W8PiCzj2vjnXdX0Eyl8Q5YAJPab9ETBNKA==} + vocs@1.0.0-alpha.51: + resolution: {integrity: sha512-OrRmVMo7m3QGQ9KvhQLhKIj4/FKxsXwol04gdLVIHR2Fr5awMApeLxkFnxcy30bht3LYxe5dw/ZWMBpB1Atm9Q==} hasBin: true peerDependencies: react: ^18.2.0 @@ -10213,7 +10279,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@remix-run/router@1.16.1': {} + '@remix-run/router@1.16.1(patch_hash=f5klonf5edxua46cqfhk7ivlia)': {} '@rollup/plugin-babel@5.3.1(@babel/core@7.24.5)(@types/babel__core@7.20.5)(rollup@4.17.2)': dependencies: @@ -14986,14 +15052,14 @@ snapshots: react-router-dom@6.23.1(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404): dependencies: - '@remix-run/router': 1.16.1 + '@remix-run/router': 1.16.1(patch_hash=f5klonf5edxua46cqfhk7ivlia) react: 19.0.0-canary-fd0da3eef-20240404 react-dom: 19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404) react-router: 6.23.1(react@19.0.0-canary-fd0da3eef-20240404) react-router@6.23.1(react@19.0.0-canary-fd0da3eef-20240404): dependencies: - '@remix-run/router': 1.16.1 + '@remix-run/router': 1.16.1(patch_hash=f5klonf5edxua46cqfhk7ivlia) react: 19.0.0-canary-fd0da3eef-20240404 react-side-effect@2.1.2(react@19.0.0-canary-fd0da3eef-20240404): @@ -16228,7 +16294,7 @@ snapshots: - supports-color - terser - vocs@1.0.0-alpha.49(@types/node@20.12.11)(@types/react-dom@18.3.0)(@types/react@18.3.1)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404)(rollup@4.17.2)(terser@5.31.0)(ts-node@10.9.2(@swc/core@1.5.5)(@types/node@20.12.11)(typescript@5.4.5))(typescript@5.4.5): + vocs@1.0.0-alpha.51(@types/node@20.12.11)(@types/react-dom@18.3.0)(@types/react@18.3.1)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404)(rollup@4.17.2)(terser@5.31.0)(ts-node@10.9.2(@swc/core@1.5.5)(@types/node@20.12.11)(typescript@5.4.5))(typescript@5.4.5): dependencies: '@floating-ui/react': 0.26.13(react-dom@19.0.0-canary-fd0da3eef-20240404(react@19.0.0-canary-fd0da3eef-20240404))(react@19.0.0-canary-fd0da3eef-20240404) '@hono/node-server': 1.11.1 diff --git a/tests/display.html b/tests/display.html new file mode 100644 index 00000000..5956b5e8 --- /dev/null +++ b/tests/display.html @@ -0,0 +1,28 @@ + + + + + Athena Crisis + + + + +
+ + + + diff --git a/tests/display.tsx b/tests/display.tsx new file mode 100644 index 00000000..0f8d8ec0 --- /dev/null +++ b/tests/display.tsx @@ -0,0 +1,144 @@ +import decodeGameActionResponse from '@deities/apollo/lib/decodeGameActionResponse.tsx'; +import { + InstantAnimationConfig, + TileSize, +} from '@deities/athena/map/Configuration.tsx'; +import MapData from '@deities/athena/MapData.tsx'; +import NullBehavior from '@deities/hera/behavior/NullBehavior.tsx'; +import GameMap from '@deities/hera/GameMap.tsx'; +import '@deities/ui/CSS.tsx'; +import AudioPlayer from '@deities/ui/AudioPlayer.tsx'; +import { applyVar } from '@deities/ui/cssVar.tsx'; +import { css, cx, injectGlobal } from '@emotion/css'; +import React, { useEffect, useMemo } from 'react'; +import { createRoot } from 'react-dom/client'; +import { ErrorBoundary } from 'react-error-boundary'; + +declare global { + // eslint-disable-next-line no-var + var MapHasRendered: Record; + // eslint-disable-next-line no-var + var renderMap: (url: string) => void; +} + +// Playwright does not like audio. +AudioPlayer.pause(); + +const root = createRoot(document.getElementById('app')!); +window.renderMap = (url: string) => { + window.MapHasRendered = Object.create(null); + root.render(); +}; + +const ErrorComponent = ({ error }: { error: Error }) => ( + <> + {Object.keys(window.MapHasRendered).map((key) => { + window.MapHasRendered[key] = true; + return ( +
+ {error.message} +
+ ); + })} + +); + +const DisplayMap = ({ url: initialURL }: { url: string }) => { + const url = new URL(initialURL); + const maps = url.searchParams.getAll('map[]'); + const viewers = url.searchParams.getAll('viewer[]'); + const gameActionResponses = url.searchParams.getAll('gameActionResponse[]'); + const eventEmitters = useMemo( + () => maps.map(() => new EventTarget()), + [maps], + ); + + // Initialize global state for listeners. + gameActionResponses?.forEach((_, index) => { + window.MapHasRendered[index] = false; + }); + + useEffect(() => { + if (gameActionResponses?.length) { + gameActionResponses.forEach((gameActionResponse, index) => { + eventEmitters[index].dispatchEvent( + new CustomEvent('action', { + detail: decodeGameActionResponse(JSON.parse(gameActionResponse)), + }), + ); + eventEmitters[index].addEventListener('actionsProcessed', () => + setTimeout(() => { + window.MapHasRendered[index] = true; + }, 300), + ); + }); + } + }, [eventEmitters, gameActionResponses, initialURL]); + + return ( + + {maps.map((mapData, index) => { + const map = MapData.fromJSON(mapData); + if (!map) { + return ( +
+ Could not render Map {index} +
+ ); + } + return ( +
+
+ +
+
+ ); + })} +
+ ); +}; + +injectGlobal(` + body { + line-height: 1px; + } +`); + +const redStyle = css` + color: ${applyVar('error-color')}; + font-weight: bold; +`; + +const inlineStyle = css` + display: inline-block; +`; + +const wrapperStyle = css` + padding-top: ${TileSize}px; +`; + +document.body.style.background = '#fff'; +document.body.style.margin = '0px'; +document.body.style.padding = '0px'; + +renderMap(window.location.href); diff --git a/tests/package.json b/tests/package.json index c1ab2db3..45607881 100644 --- a/tests/package.json +++ b/tests/package.json @@ -12,17 +12,28 @@ "devDependencies": { "@deities/apollo": "workspace:*", "@deities/ares": "workspace:*", + "@deities/art": "workspace:*", "@deities/athena": "workspace:*", "@deities/dionysus": "workspace:*", "@deities/hephaestus": "workspace:*", + "@deities/hera": "workspace:*", "@deities/hermes": "workspace:*", + "@deities/ui": "workspace:*", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/css": "^11.11.2", "@nkzw/immutable-map": "^1.2.2", "@playwright/browser-chromium": "^1.44.0", "@types/jest-image-snapshot": "^6.4.0", "@types/object-inspect": "^1.13.0", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "chalk": "^5.3.0", + "fbt": "^1.0.2", "jest-image-snapshot": "^6.4.0", "playwright": "^1.44.0", + "react": "19.0.0-canary-fd0da3eef-20240404", + "react-dom": "19.0.0-canary-fd0da3eef-20240404", + "react-error-boundary": "^4.0.13", "strip-ansi": "^7.1.0", "term-img": "^6.0.0" } diff --git a/tests/vite.config.ts b/tests/vite.config.ts new file mode 100644 index 00000000..2800d136 --- /dev/null +++ b/tests/vite.config.ts @@ -0,0 +1,26 @@ +import babelPluginEmotion from '@emotion/babel-plugin'; +import react from '@vitejs/plugin-react'; +import babelFbtPlugins from '../infra/babelFbtPlugins.tsx'; +import resolver from '../infra/resolver.tsx'; + +const root = process.cwd(); + +export default { + define: { + 'process.env.IS_LANDING_PAGE': `0`, + }, + plugins: [ + react({ + babel: { + plugins: [...babelFbtPlugins, babelPluginEmotion], + }, + }), + ], + resolve: { + alias: [resolver], + }, + root, + server: { + host: true, + }, +}; diff --git a/tests/viteServer.tsx b/tests/viteServer.tsx index fbd85da0..35f05e97 100644 --- a/tests/viteServer.tsx +++ b/tests/viteServer.tsx @@ -1,4 +1,3 @@ -import { resolve } from 'node:path'; import startServer from '../infra/startServer.tsx'; const APP_PORT = 3001; @@ -8,7 +7,7 @@ export async function setup() { const server = await startServer({ name: 'Tests', port: APP_PORT, - root: resolve(import.meta.dirname, '../deimos'), + root: import.meta.dirname, silent: true, }); diff --git a/ui/Browser.tsx b/ui/Browser.tsx index 3fb3d59c..a2256d4f 100644 --- a/ui/Browser.tsx +++ b/ui/Browser.tsx @@ -3,19 +3,28 @@ declare global { var safari: Record string }>; } -export const isIPhone = /iphone/i.test(navigator.userAgent); +const maybeWindow = + typeof window === 'undefined' + ? { + HTMLElement: false, + navigator: { userAgent: '' }, + safari: null, + } + : window; + +export const isIPhone = /iphone/i.test(maybeWindow.navigator.userAgent); export const isIOS = - !!window.navigator.userAgent.match(/i(?:pad|phone)/i) || + !!maybeWindow.navigator.userAgent.match(/i(?:pad|phone)/i) || (/(macintosh|macintel|macppc|mac68k|macos)/i.test(navigator.userAgent) && navigator.maxTouchPoints > 0); export const isSafari = - /constructor/i.test(window.HTMLElement as unknown as string) || + /constructor/i.test(maybeWindow.HTMLElement as unknown as string) || ((pushNotification) => pushNotification.toString() === '[object SafariRemoteNotification]')( - !window['safari'] || - (typeof safari !== 'undefined' && window['safari'].pushNotification), + !maybeWindow['safari'] || + (typeof safari !== 'undefined' && maybeWindow['safari'].pushNotification), ) || isIOS; diff --git a/ui/CSS.tsx b/ui/CSS.tsx index 84fcb064..42354851 100644 --- a/ui/CSS.tsx +++ b/ui/CSS.tsx @@ -1,146 +1,23 @@ -import { TileSize } from '@deities/athena/map/Configuration.tsx'; import { injectGlobal } from '@emotion/css'; import Background from './assets/Background.png'; import Breakpoints from './Breakpoints.tsx'; -import { isFirefox, isSafari } from './Browser.tsx'; -import cssVar, { applyVar } from './cssVar.tsx'; +import { applyVar, initializeCSSVariables } from './cssVar.tsx'; import getColor from './getColor.tsx'; -import { getScale } from './hooks/useScale.tsx'; import pixelBorder from './pixelBorder.tsx'; -const transform = cssVar( - 'perspective-transform', - isFirefox - ? '' - : (isSafari ? `translateZ(-25px) ` : '') + - `perspective(calc(125px - ${applyVar('perspective-height')} / 20 * 10px)) rotateX(calc(2deg - ${applyVar('perspective-height')} / 20 * 1deg))`, -); +initializeCSSVariables(); injectGlobal(` * { box-sizing: border-box; } -:root { - ${cssVar('background-color-active', '#a7c2f5')} - ${cssVar('background-color-bright', '#ffffff')} - ${cssVar('background-color-dark', 'rgba(40, 40, 40, 1)')} - ${cssVar('background-color-light', 'rgba(255, 255, 255, 0.8)')} - ${cssVar('background-color-light9', 'rgba(255, 255, 255, 0.9)')} - ${cssVar('background-color', '#f2f2f2')} - ${cssVar('border-color-light', 'rgba(0, 0, 0, 0.2)')} - ${cssVar('border-color', 'rgba(0, 0, 0, 0.7)')} - - ${cssVar('highlight-color', '#3999d4')} - ${cssVar('text-color-active-light', '#fff')} - ${cssVar('text-color-bright', '#fff')} - ${cssVar('text-color-active', '#111')} - ${cssVar('text-color-inactive', '#838383')} - ${cssVar('text-color-light', '#a2a2a2')} - ${cssVar('text-color', '#111')} - - // Player Colors - ${cssVar('color-black', '10, 10, 10')} - ${cssVar('color-blue', '60, 157, 255')} - ${cssVar('color-cyan', '33, 195, 155')} - ${cssVar('color-gray', '132, 132, 132')} - ${cssVar('color-green', '94, 163, 24')} - ${cssVar('color-neutral', '179, 160, 124')} - ${cssVar('color-orange', '255, 158, 60')} - ${cssVar('color-pink', '195, 33, 127')} - ${cssVar('color-purple', '157, 60, 255')} - ${cssVar('color-red', '195, 46, 33')} - - ${cssVar('color-red-orange', 'rgb(225, 102, 46.5)')} - ${cssVar('color-orange-green', 'rgb(134.5, 160.5, 42)')} - - // Common Variables - ${cssVar('error-color', '#c4362e')} - ${cssVar('inset-z', 0)} - ${cssVar('inset', '0px')} - ${cssVar('mouse-position-left', '0px')} - ${cssVar('mouse-position-right', 'auto')} - ${cssVar('scale', getScale(TileSize))} - ${cssVar('transform-origin', 'center center')} - ${cssVar('ui-scale', 1)} - ${cssVar('perspective-height', 0)} - ${transform} -} - @media (prefers-color-scheme: dark) { - :root { - ${cssVar('background-color-active', '#596884')} - ${cssVar('background-color-bright', '#121212')} - ${cssVar('background-color-dark', '#d7d7d7')} - ${cssVar('background-color-light', 'rgba(50, 50, 50, 0.8)')} - ${cssVar('background-color-light9', 'rgba(50, 50, 50, 0.9)')} - ${cssVar('background-color', '#28282b')} - - ${cssVar('border-color-light', 'rgba(255, 255, 255, 0.2)')} - ${cssVar('border-color', 'rgba(255, 255, 255, 0.7)')} - - ${cssVar('highlight-color', '#5e9fff')} - ${cssVar('text-color-active-light', '#555')} - ${cssVar('text-color-bright', '#fff')} - ${cssVar('text-color-active', '#f5f5f5')} - ${cssVar('text-color-inactive', '#999')} - ${cssVar('text-color-light', '#a7a7a7')} - ${cssVar('text-color', '#f5f5f5')} - - // Player Colors - ${cssVar('color-black', '10, 10, 10')} - ${cssVar('color-blue', '60, 157, 235')} - ${cssVar('color-cyan', '45, 197, 146')} - ${cssVar('color-gray', '132, 132, 132')} - ${cssVar('color-green', '142, 169, 53')} - ${cssVar('color-neutral', '204, 193, 155')} - ${cssVar('color-orange', '216, 154, 78')} - ${cssVar('color-pink', '255, 60, 200')} - ${cssVar('color-purple', '157, 80, 255')} - ${cssVar('color-red', '255, 76, 60')} - ${cssVar('color-red-orange', 'rgb(230, 125, 76)')} - ${cssVar('color-orange-green', 'rgb(153, 182, 47)')} - } - div.background { filter: invert(1); } } -html.dark { - ${cssVar('background-color-active', '#596884')} - ${cssVar('background-color-bright', '#121212')} - ${cssVar('background-color-dark', '#d7d7d7')} - ${cssVar('background-color-light', 'rgba(50, 50, 50, 0.8)')} - ${cssVar('background-color-light9', 'rgba(50, 50, 50, 0.9)')} - ${cssVar('background-color', '#28282b')} - - ${cssVar('border-color-light', 'rgba(255, 255, 255, 0.2)')} - ${cssVar('border-color', 'rgba(255, 255, 255, 0.7)')} - - ${cssVar('highlight-color', '#5e9fff')} - ${cssVar('text-color-active-light', '#555')} - ${cssVar('text-color-bright', '#fff')} - ${cssVar('text-color-active', '#f5f5f5')} - ${cssVar('text-color-inactive', '#999')} - ${cssVar('text-color-light', '#a7a7a7')} - ${cssVar('text-color', '#f5f5f5')} - - // Player Colors - ${cssVar('color-black', '10, 10, 10')} - ${cssVar('color-blue', '60, 157, 235')} - ${cssVar('color-cyan', '45, 197, 146')} - ${cssVar('color-gray', '132, 132, 132')} - ${cssVar('color-green', '142, 169, 53')} - ${cssVar('color-neutral', '204, 193, 155')} - ${cssVar('color-orange', '216, 154, 78')} - ${cssVar('color-pink', '255, 60, 200')} - ${cssVar('color-purple', '157, 80, 255')} - ${cssVar('color-red', '255, 76, 60')} - ${cssVar('color-red-orange', 'rgb(230, 125, 76)')} - ${cssVar('color-orange-green', 'rgb(153, 182, 47)')} -} - html.dark div.background { filter: invert(1); } @@ -440,8 +317,4 @@ p { margin: 0; user-select: text; } - -.sentry-error-embed-wrapper { - z-index: 20000 !important; -} `); diff --git a/ui/Dialog.tsx b/ui/Dialog.tsx index 3c29b390..900631e6 100644 --- a/ui/Dialog.tsx +++ b/ui/Dialog.tsx @@ -162,14 +162,14 @@ const backgroundStyle = css` background-color: ${applyVar('background-color-light')}; inset: 0; position: fixed; - z-index: 2; + z-index: 29; `; const wrapperStyle = css` inset: 0; pointer-events: none; position: fixed; - z-index: 3; + z-index: 30; `; const containerStyle = css` @@ -187,7 +187,7 @@ const containerStyle = css` transform: ${isSafari ? '' : `scale(${applyVar('ui-scale')})`}; transition: transform 300ms ease; width: 93vw; - z-index: calc(${applyVar('inset-z')} + 3); + z-index: calc(${applyVar('inset-z')} + 30); `; const largeStyle = css` diff --git a/ui/cssVar.tsx b/ui/cssVar.tsx index 766740a6..48c02719 100644 --- a/ui/cssVar.tsx +++ b/ui/cssVar.tsx @@ -1,3 +1,8 @@ +import { TileSize } from '@deities/athena/map/Configuration.tsx'; +import { injectGlobal } from '@emotion/css'; +import { isFirefox, isSafari } from './Browser.tsx'; +import { getScale } from './hooks/useScale.tsx'; + type GlobalCSSVariableName = // Map | 'animation-duration-30' @@ -77,8 +82,9 @@ export class CSSVariables { } const variables = new CSSVariables('a'); +const cssVar = variables.set.bind(variables); -export default variables.set.bind(variables); +export default cssVar; export const applyVar = variables.apply.bind(variables); export function insetStyle(inset: number | string) { @@ -89,3 +95,111 @@ export function insetStyle(inset: number | string) { [variables.set('inset-z')]: inset ? 1 : 0, }; } + +const transform = cssVar( + 'perspective-transform', + isFirefox + ? '' + : (isSafari ? `translateZ(-25px) ` : '') + + `perspective(calc(125px - ${applyVar('perspective-height')} / 20 * 10px)) rotateX(calc(2deg - ${applyVar('perspective-height')} / 20 * 1deg))`, +); + +const darkMode = ` +${cssVar('background-color-active', '#596884')} +${cssVar('background-color-bright', '#121212')} +${cssVar('background-color-dark', '#d7d7d7')} +${cssVar('background-color-light', 'rgba(50, 50, 50, 0.8)')} +${cssVar('background-color-light9', 'rgba(50, 50, 50, 0.9)')} +${cssVar('background-color', '#28282b')} + +${cssVar('border-color-light', 'rgba(255, 255, 255, 0.2)')} +${cssVar('border-color', 'rgba(255, 255, 255, 0.7)')} + +${cssVar('highlight-color', '#5e9fff')} +${cssVar('text-color-active-light', '#555')} +${cssVar('text-color-bright', '#fff')} +${cssVar('text-color-active', '#f5f5f5')} +${cssVar('text-color-inactive', '#999')} +${cssVar('text-color-light', '#a7a7a7')} +${cssVar('text-color', '#f5f5f5')} + +// Player Colors +${cssVar('color-black', '10, 10, 10')} +${cssVar('color-blue', '60, 157, 235')} +${cssVar('color-cyan', '45, 197, 146')} +${cssVar('color-gray', '132, 132, 132')} +${cssVar('color-green', '142, 169, 53')} +${cssVar('color-neutral', '204, 193, 155')} +${cssVar('color-orange', '216, 154, 78')} +${cssVar('color-pink', '255, 60, 200')} +${cssVar('color-purple', '157, 80, 255')} +${cssVar('color-red', '255, 76, 60')} +${cssVar('color-red-orange', 'rgb(230, 125, 76)')} +${cssVar('color-orange-green', 'rgb(153, 182, 47)')} +`; + +let initialized = false; +export function initializeCSSVariables() { + if (initialized) { + return; + } + + initialized = true; + injectGlobal(` +:root { + ${cssVar('background-color-active', '#a7c2f5')} + ${cssVar('background-color-bright', '#ffffff')} + ${cssVar('background-color-dark', 'rgba(40, 40, 40, 1)')} + ${cssVar('background-color-light', 'rgba(255, 255, 255, 0.8)')} + ${cssVar('background-color-light9', 'rgba(255, 255, 255, 0.9)')} + ${cssVar('background-color', '#f2f2f2')} + ${cssVar('border-color-light', 'rgba(0, 0, 0, 0.2)')} + ${cssVar('border-color', 'rgba(0, 0, 0, 0.7)')} + + ${cssVar('highlight-color', '#3999d4')} + ${cssVar('text-color-active-light', '#fff')} + ${cssVar('text-color-bright', '#fff')} + ${cssVar('text-color-active', '#111')} + ${cssVar('text-color-inactive', '#838383')} + ${cssVar('text-color-light', '#a2a2a2')} + ${cssVar('text-color', '#111')} + + // Player Colors + ${cssVar('color-black', '10, 10, 10')} + ${cssVar('color-blue', '60, 157, 255')} + ${cssVar('color-cyan', '33, 195, 155')} + ${cssVar('color-gray', '132, 132, 132')} + ${cssVar('color-green', '94, 163, 24')} + ${cssVar('color-neutral', '179, 160, 124')} + ${cssVar('color-orange', '255, 158, 60')} + ${cssVar('color-pink', '195, 33, 127')} + ${cssVar('color-purple', '157, 60, 255')} + ${cssVar('color-red', '195, 46, 33')} + + ${cssVar('color-red-orange', 'rgb(225, 102, 46.5)')} + ${cssVar('color-orange-green', 'rgb(134.5, 160.5, 42)')} + + // Common Variables + ${cssVar('error-color', '#c4362e')} + ${cssVar('inset-z', 0)} + ${cssVar('inset', '0px')} + ${cssVar('mouse-position-left', '0px')} + ${cssVar('mouse-position-right', 'auto')} + ${cssVar('scale', getScale(TileSize))} + ${cssVar('transform-origin', 'center center')} + ${cssVar('ui-scale', 1)} + ${cssVar('perspective-height', 0)} + ${transform} +} + +@media (prefers-color-scheme: dark) { + :root { + ${darkMode} + } +} + +html.dark { + ${darkMode} +} +`); +} diff --git a/ui/hooks/useScale.tsx b/ui/hooks/useScale.tsx index 4ae09573..6ff87daf 100644 --- a/ui/hooks/useScale.tsx +++ b/ui/hooks/useScale.tsx @@ -9,11 +9,15 @@ import { import { isIOS } from '../Browser.tsx'; import cssVar, { applyVar } from '../cssVar.tsx'; -const div = document.createElement('div'); +let div: HTMLDivElement | null = null; const CACHE = new Map(); export const MAX_SCALE = 3; export const getScale = (tileSize: number) => { + if (!div) { + div = document.createElement('div'); + } + const size = isIOS ? Math.max(window.screen.width, window.screen.height) : Math.max(window.innerWidth, window.innerHeight);