diff --git a/src/components/PageFrame.module.css b/src/components/PageFrame.module.css
new file mode 100644
index 0000000..ef8c652
--- /dev/null
+++ b/src/components/PageFrame.module.css
@@ -0,0 +1,51 @@
+.frame {
+ position: fixed;
+ inset: 1rem;
+ border: 2px solid black;
+ border-radius: 2rem;
+ background: #f5f0e4;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+}
+
+.header {
+ padding: 1.25rem 1.5rem 0;
+ text-align: center;
+}
+
+.title {
+ margin: 0;
+ font-size: 1.5rem;
+ font-weight: 600;
+}
+
+.rule {
+ position: relative;
+ border: none;
+ border-top: 1px solid #c8b99a;
+ margin: 0.75rem 0 0;
+}
+
+.rule::before {
+ content: '◆';
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ background: #f5f0e4;
+ padding: 0 0.35em;
+ font-size: 0.55rem;
+ color: #c8b99a;
+ line-height: 1;
+}
+
+.content {
+ flex: 1;
+ overflow-y: auto;
+ padding: 1rem 1.5rem;
+}
+
+.footer {
+ padding: 1rem 1.5rem 1.5rem;
+}
diff --git a/src/components/PageFrame.tsx b/src/components/PageFrame.tsx
new file mode 100644
index 0000000..fe24c01
--- /dev/null
+++ b/src/components/PageFrame.tsx
@@ -0,0 +1,22 @@
+import styles from './PageFrame.module.css'
+
+interface Props {
+ title: string
+ children: React.ReactNode
+ footer?: React.ReactNode
+}
+
+export default function PageFrame({ title, children, footer }: Props) {
+ return (
+
+
+
+ {children}
+
+ {footer &&
{footer}
}
+
+ )
+}
diff --git a/src/components/PrimaryButton.module.css b/src/components/PrimaryButton.module.css
new file mode 100644
index 0000000..f4cc75b
--- /dev/null
+++ b/src/components/PrimaryButton.module.css
@@ -0,0 +1,17 @@
+.button {
+ width: 100%;
+ padding: 1rem;
+ background: #a8d5e8;
+ border: none;
+ border-radius: 1rem;
+ font-size: 1.25rem;
+ font-weight: 600;
+ cursor: pointer;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
+ transition: transform 80ms ease, box-shadow 80ms ease;
+}
+
+.button:active {
+ transform: translateY(2px);
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
+}
diff --git a/src/components/PrimaryButton.tsx b/src/components/PrimaryButton.tsx
new file mode 100644
index 0000000..26e34f2
--- /dev/null
+++ b/src/components/PrimaryButton.tsx
@@ -0,0 +1,14 @@
+import styles from './PrimaryButton.module.css'
+
+interface Props {
+ onClick: () => void
+ children: React.ReactNode
+}
+
+export default function PrimaryButton({ onClick, children }: Props) {
+ return (
+
+ )
+}
diff --git a/src/index.css b/src/index.css
index 1f58fc4..c3e1bc4 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,4 +1,5 @@
*, *::before, *::after { box-sizing: border-box; }
+button { min-height: 2.75rem; font-size: 1rem; font-family: inherit; cursor: pointer; }
html, body, #root { margin: 0; height: 100%; }
body {
font-family: sans-serif;
diff --git a/src/pages/EnterScores.tsx b/src/pages/EnterScores.tsx
index f04bbf5..b797a62 100644
--- a/src/pages/EnterScores.tsx
+++ b/src/pages/EnterScores.tsx
@@ -1,12 +1,13 @@
+import PageFrame from '../components/PageFrame'
+
interface Props {
onSubmit: () => void
}
export default function EnterScores({ onSubmit }: Props) {
return (
-
-
Enter Scores
+
-
+
)
}
diff --git a/src/pages/PlayerSetup.tsx b/src/pages/PlayerSetup.tsx
index 7f9c798..41e257f 100644
--- a/src/pages/PlayerSetup.tsx
+++ b/src/pages/PlayerSetup.tsx
@@ -1,12 +1,14 @@
+import PageFrame from '../components/PageFrame'
+import PrimaryButton from '../components/PrimaryButton'
+
interface Props {
onStart: () => void
}
export default function PlayerSetup({ onStart }: Props) {
return (
-
-
Player Setup
-
-
+ Start}>
+ {null}
+
)
}
diff --git a/src/pages/ScoreSheet.tsx b/src/pages/ScoreSheet.tsx
index b00e871..03ba921 100644
--- a/src/pages/ScoreSheet.tsx
+++ b/src/pages/ScoreSheet.tsx
@@ -1,3 +1,5 @@
+import PageFrame from '../components/PageFrame'
+
interface Props {
onScoreRound: () => void
onNewGame: () => void
@@ -5,10 +7,9 @@ interface Props {
export default function ScoreSheet({ onScoreRound, onNewGame }: Props) {
return (
-
-
Score Sheet
+
-
+
)
}
diff --git a/src/pages/TitleScreen.module.css b/src/pages/TitleScreen.module.css
index b6da4e4..170f8f0 100644
--- a/src/pages/TitleScreen.module.css
+++ b/src/pages/TitleScreen.module.css
@@ -39,14 +39,3 @@
right: 1.5rem;
}
-.newGameButton {
- width: 100%;
- padding: 1rem;
- background: #a8d5e8;
- border: none;
- border-radius: 1rem;
- font-size: 1.25rem;
- font-weight: 600;
- cursor: pointer;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
-}
diff --git a/src/pages/TitleScreen.tsx b/src/pages/TitleScreen.tsx
index a1259b6..b11b2b7 100644
--- a/src/pages/TitleScreen.tsx
+++ b/src/pages/TitleScreen.tsx
@@ -1,4 +1,5 @@
import styles from './TitleScreen.module.css'
+import PrimaryButton from '../components/PrimaryButton'
interface Props {
onNewGame: () => void
@@ -12,9 +13,7 @@ export default function TitleScreen({ onNewGame }: Props) {
7
-
+
New Game
)