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 ( +
+
+

{title}

+
+
+
+ {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
)