diff --git a/apps/web/src/routes/kripke/+page.svelte b/apps/web/src/routes/kripke/+page.svelte index b6af55e..67ed5dd 100644 --- a/apps/web/src/routes/kripke/+page.svelte +++ b/apps/web/src/routes/kripke/+page.svelte @@ -1,157 +1,21 @@ -{#snippet sampleArrow()} - - - - - - - - -{/snippet} -
-

KRiPkE

-
-
- {#each [1,2,3,4,5,6,7,8,9,10] as i} - {#if i <= life} - - {:else} - - {/if} - {/each} -
- -
-
- id: {isomorphic[getId(frame)]} - - - {@render sampleArrow()} × {remainingRelations} - -
- - -
- -
- - - -
- -
-
    - {#each moves as move} -
  • - {#if move.type === "guess"} - Guess({move.frameId}) = {move.correct} - {/if} - {#if move.type === "check"} - Valid({move.formulaStr}) = {move.valid} - {/if} -
  • - {/each} -
-
-
+

Rules

diff --git a/apps/web/src/routes/kripke/formula-input.svelte b/apps/web/src/routes/kripke/formula-input.svelte index 8732d4f..3431dc9 100644 --- a/apps/web/src/routes/kripke/formula-input.svelte +++ b/apps/web/src/routes/kripke/formula-input.svelte @@ -3,8 +3,10 @@ import { type Formula, prettyPrint, tryParse } from "@cannorin/kripke"; let { formula = $bindable(undefined), + disabled = false, }: { formula?: Formula | undefined; + disabled?: boolean | undefined; } = $props(); let input = $state(formula ? prettyPrint(formula) : ""); @@ -26,4 +28,5 @@ $effect(() => { class={["rounded border border-foreground ring-0 focus:outline-none focus:ring-0 p-2 w-full", error && "border-primary"]} type="text" placeholder="Enter modal formula" + disabled={disabled} bind:value={input} /> diff --git a/apps/web/src/routes/kripke/frame-input.svelte b/apps/web/src/routes/kripke/frame-input.svelte index e404a23..fa052ed 100644 --- a/apps/web/src/routes/kripke/frame-input.svelte +++ b/apps/web/src/routes/kripke/frame-input.svelte @@ -3,7 +3,6 @@ import { type Frame, type Relation, type World, - getFrame, left, reverse, right, @@ -12,9 +11,11 @@ import { import { type Vector, add, degree, rotate, sub, theta } from "./vector"; let { - frame = $bindable(getFrame(0)), + frame = $bindable({ relations: new Set() }), + disabled = false, }: { frame?: Frame | undefined; + disabled?: boolean | undefined; } = $props(); let selected: World | null = $state(null); @@ -114,7 +115,6 @@ function getPath(rel: Relation) { fill: rgb(var(--background)); stroke: rgb(var(--foreground)); stroke-width: 1; - cursor: pointer; } .node.selected { stroke: rgb(var(--primary)); @@ -124,7 +124,6 @@ function getPath(rel: Relation) { stroke: rgb(var(--foreground)); stroke-width: 1; fill: none; - cursor: pointer; marker-end: url(#arrowhead); } @@ -151,8 +150,8 @@ function getPath(rel: Relation) { {#key rel} handleEdgeClick(rel, e)} + class={["edge", !disabled && "cursor-pointer"]} + onclick={(e) => !disabled && handleEdgeClick(rel, e)} /> {/key} {/each} @@ -164,8 +163,8 @@ function getPath(rel: Relation) { cx={x} cy={y} r={radius.x} - class="node {selected === w ? 'selected' : ''}" - onclick={(e) => handleNodeClick(w, e)} + class={["node", selected === w && "selected", !disabled && "cursor-pointer"]} + onclick={(e) => !disabled && handleNodeClick(w, e)} /> {/each} diff --git a/apps/web/src/routes/kripke/game.svelte b/apps/web/src/routes/kripke/game.svelte new file mode 100644 index 0000000..6478ece --- /dev/null +++ b/apps/web/src/routes/kripke/game.svelte @@ -0,0 +1,178 @@ + + +{#snippet sampleArrow()} + + + + + + + + +{/snippet} + +
+
+ {#each [1,2,3,4,5,6,7,8,9,10] as i} + {#if i <= life} + + {:else} + + {/if} + {/each} +
+ +
+
+ id: {isomorphic[getId(frame)]} + + + {@render sampleArrow()} × {remainingRelations} + +
+ + +
+ +
+ + + +
+ +
+
    + {#each moves as move} +
  • + {#if move.type === "guess"} + Guess({move.frameId}) = {move.correct} + {/if} + {#if move.type === "check"} + Valid({move.formulaStr}) = {move.valid} + {/if} +
  • + {/each} +
+
+