Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add initial support for more advanced game settings #179

Merged
merged 19 commits into from
Mar 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
5fa4abf
feat: set up basic HTML for flash card game settings
dustin-jw Feb 27, 2024
b42ee7b
feat: update question counts for each category
dustin-jw Feb 27, 2024
98eded9
feat: update total question count as user selects categories
dustin-jw Feb 27, 2024
003661a
feat: update durations based on the number of questions
dustin-jw Feb 28, 2024
c988e8a
feat: update input value with number of questions
dustin-jw Feb 28, 2024
679e48b
feat: optionally save settings when the form is submitted
dustin-jw Feb 28, 2024
5cc83b1
feat: start the game with randomly sorted questions
dustin-jw Feb 28, 2024
a4f2777
feat: update question total number in heading/title
dustin-jw Feb 28, 2024
4e8eade
feat: replicate game settings for other game types
dustin-jw Feb 28, 2024
3eca8ff
feat: set up links to game settings and quick start games
dustin-jw Feb 28, 2024
4ef318c
feat: remove settings for timer and saving settings
dustin-jw Feb 28, 2024
fac36a5
feat: remove max questions input/description
dustin-jw Feb 28, 2024
0a6b870
feat: style button
dustin-jw Feb 28, 2024
d1e3559
feat: style fieldset and legend
dustin-jw Feb 28, 2024
b834ec3
feat: style checkboxes
dustin-jw Feb 28, 2024
412ed64
feat: allow users to start game even without JS
dustin-jw Feb 29, 2024
82a4f5a
feat: adjust headings to show tags for each question
dustin-jw Feb 29, 2024
407e504
feat: add link back to game settings on last question
dustin-jw Mar 1, 2024
cfdcff5
feat: rephrase SEO description to not mention features that don't exist
dustin-jw Mar 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .eleventy.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ module.exports = function (eleventyConfig) {
eleventyConfig.addLayoutAlias('default', 'layout.njk');

eleventyConfig.addFilter('mdToHtml', markdownToHtml);
eleventyConfig.addFilter('csvList', (values) => values.join(', '));

return {
dir: {
Expand Down
73 changes: 40 additions & 33 deletions pages/_data/questionData.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,44 +15,51 @@ const getQuestions = async () => {
const questions = await base('Questions and Answers').select().all();

const publishedQuestions = questions
.filter((record) => record.fields.Published || viewDrafts)
.map((record) => {
const options = [
{
answer: record.fields.Answer,
isCorrect: true,
},
];

if (record.fields['Distractor 1']?.trim()) {
options.push({
answer: record.fields['Distractor 1'],
isCorrect: false,
});
}

if (record.fields['Distractor 2']?.trim()) {
options.push({
answer: record.fields['Distractor 2'],
isCorrect: false,
});
}

return {
...record.fields,
options: options.sort(() => {
const sign = Math.round(Math.random()) > 0 ? 1 : -1;

return sign;
}),
};
});
.filter((record) => record.fields.Published || viewDrafts)
.map((record, index) => {
const options = [
{
answer: record.fields.Answer,
isCorrect: true,
},
];

if (record.fields['Distractor 1']?.trim()) {
options.push({
answer: record.fields['Distractor 1'],
isCorrect: false,
});
}

if (record.fields['Distractor 2']?.trim()) {
options.push({
answer: record.fields['Distractor 2'],
isCorrect: false,
});
}

return {
...record.fields,
id: record.id,
pageNumber: index + 1,
options: options.sort(() => {
const sign = Math.round(Math.random()) > 0 ? 1 : -1;

return sign;
}),
};
});

return publishedQuestions;
};

const getFlashCardQuestions = (questions) =>
questions.filter((question) => !question['Multiple Choice Only']);
questions
.filter((question) => !question['Multiple Choice Only'])
.map((question, index) => ({
...question,
pageNumber: index + 1,
}));

const getUniqueCategories = (questions) => {
return [
Expand Down
5 changes: 5 additions & 0 deletions pages/flash-card-questions.ejs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
permalink: /flash-card-questions.json
eleventyExcludeFromCollections: true
---
<%- JSON.stringify(questionData.flashCardQuestions) -%>
20 changes: 20 additions & 0 deletions pages/flash-cards/game-settings.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
title: Flash Cards Game Settings
seo_title: "Flash Cards Game Settings: Trivia11y"
description: Choose from categories to study using flash cards to test your accessibility knowledge.
---

{% extends 'layout.njk' %}

{% block content%}
{% from 'macros/game-settings.njk' import gameSettings %}
{{ gameSettings('Flash Cards Game Settings', questionData.flashCardCategories, 'flash-cards') }}
{% endblock %}

{% block scripts %}
<script>
const IS_MULTIPLE_CHOICE = false;
const GAME_TYPE = 'flash-cards';
</script>
<script src="/js/game-settings.js" type="module"></script>
{% endblock %}
6 changes: 3 additions & 3 deletions pages/flash-cards/index.njk
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ eleventyExcludeFromCollections: true
<div class="obj-content-width">
<article>
<header class="cmp-game-header">
<h1 class="cmp-game-header__title">
<h1 class="cmp-game-header__title">Question <span data-question-number>{{ questionGroup.pageNumber }}</span> of <span data-question-total>{{ questionGroup.questionTotal }}</span></h2>
<h2 class="cmp-game-header__subtitle">
{% if questionGroup.category !== 'All Questions' %}
Category: {{ questionGroup.category }}
{% else %}
All Categories
{{ questionGroup.question.Tags | csvList }}
{% endif %}
</h1>
<h2 class="cmp-game-header__question-count">Question <span data-question-number>{{ questionGroup.pageNumber }}</span> of {{ questionGroup.questionTotal }}</h2>
</header>
{% from 'macros/flash-card.njk' import flashCard %}
{{ flashCard(questionGroup.question) }}
Expand Down
44 changes: 32 additions & 12 deletions pages/index.njk
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,38 @@ description: A quiz game and study tool to help those at all skill levels to lea
Choose a game format and then select a category to help you test your knowledge: Flash Cards for reviewing what you know, Short Answer questions for confirming you actually know your stuff, and Multiple Choice for simulating test conditions.
</p>

{% from 'macros/categories.njk' import categories %}
<div class="obj-game-type">
<div class="obj-game-type__group">
{{ categories('flash-cards', 'Flash Cards', questionData.flashCardCategories) }}
</div>
<div class="obj-game-type__group">
{{ categories('short-answer', 'Short Answer', questionData.flashCardCategories) }}
</div>
<div class="obj-game-type__group">
{{ categories('multiple-choice', 'Multiple Choice', questionData.categories) }}
</div>
</div>
<ul class="cmp-categories">
<li class="cmp-categories__item">
<a href="/flash-cards/game-settings/" class="cmp-categories__link">
Flash Cards
</a>
</li>
<li class="cmp-categories__item">
<a href="/flash-cards/all-questions/1/" class="cmp-categories__link cmp-categories__link--alternative" data-game-type="flash-cards">
Flash Cards quick start (all categories, 50 questions max)
</a>
</li>
<li class="cmp-categories__item">
<a href="/short-answer/game-settings/" class="cmp-categories__link">
Short Answer
</a>
</li>
<li class="cmp-categories__item">
<a href="/short-answer/all-questions/1/" class="cmp-categories__link cmp-categories__link--alternative" data-game-type="short-answer">
Short Answer quick start (all categories, 50 questions max)
</a>
</li>
<li class="cmp-categories__item">
<a href="/multiple-choice/game-settings/" class="cmp-categories__link">
Multiple Choice
</a>
</li>
<li class="cmp-categories__item">
<a href="/multiple-choice/all-questions/1/" class="cmp-categories__link cmp-categories__link--alternative" data-game-type="multiple-choice">
Multiple Choice quick start (all categories, 50 questions max)
</a>
</li>
</ul>
</div>
{% endblock %}

Expand Down
20 changes: 20 additions & 0 deletions pages/multiple-choice/game-settings.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
title: Multiple Choice Game Settings
seo_title: "Multiple Choice Game Settings: Trivia11y"
description: Choose from categories to study using multiple choice questions to test your accessibility knowledge.
---

{% extends 'layout.njk' %}

{% block content%}
{% from 'macros/game-settings.njk' import gameSettings %}
{{ gameSettings('Multiple Choice Game Settings', questionData.categories, 'multiple-choice') }}
{% endblock %}

{% block scripts %}
<script>
const IS_MULTIPLE_CHOICE = true;
const GAME_TYPE = 'multiple-choice';
</script>
<script src="/js/game-settings.js" type="module"></script>
{% endblock %}
6 changes: 3 additions & 3 deletions pages/multiple-choice/index.njk
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ eleventyExcludeFromCollections: true
<div class="obj-content-width">
<article>
<header class="cmp-game-header">
<h1 class="cmp-game-header__title">
<h1 class="cmp-game-header__title">Question <span data-question-number>{{ questionGroup.pageNumber }}</span> of <span data-question-total>{{ questionGroup.questionTotal }}</span></h2>
<h2 class="cmp-game-header__subtitle">
{% if questionGroup.category !== 'All Questions' %}
Category: {{ questionGroup.category }}
{% else %}
All Categories
{{ questionGroup.question.Tags | csvList }}
{% endif %}
</h1>
<h2 class="cmp-game-header__question-count">Question <span data-question-number>{{ questionGroup.pageNumber }}</span> of {{ questionGroup.questionTotal }}</h2>
</header>

{% from 'macros/multiple-choice.njk' import multipleChoice %}
Expand Down
20 changes: 20 additions & 0 deletions pages/short-answer/game-settings.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
title: Short Answer Game Settings
seo_title: "Short Answer Game Settings: Trivia11y"
description: Choose from categories to study using short answer questions to test your accessibility knowledge.
---

{% extends 'layout.njk' %}

{% block content%}
{% from 'macros/game-settings.njk' import gameSettings %}
{{ gameSettings('Short Answer Game Settings', questionData.flashCardCategories, 'short-answer') }}
{% endblock %}

{% block scripts %}
<script>
const IS_MULTIPLE_CHOICE = false;
const GAME_TYPE = 'short-answer';
</script>
<script src="/js/game-settings.js" type="module"></script>
{% endblock %}
16 changes: 8 additions & 8 deletions pages/short-answer/index.njk
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ eleventyExcludeFromCollections: true
<div class="obj-content-width">
<article>
<header class="cmp-game-header">
<h1 class="cmp-game-header__title">
{% if questionGroup.category !== 'All Questions' %}
Category: {{ questionGroup.category }}
{% else %}
All Categories
{% endif %}
</h1>
<h2 class="cmp-game-header__question-count">Question <span data-question-number>{{ questionGroup.pageNumber }}</span> of {{ questionGroup.questionTotal }}</h2>
<h1 class="cmp-game-header__title">Question <span data-question-number>{{ questionGroup.pageNumber }}</span> of <span data-question-total>{{ questionGroup.questionTotal }}</span></h2>
<h2 class="cmp-game-header__subtitle">
{% if questionGroup.category !== 'All Questions' %}
Category: {{ questionGroup.category }}
{% else %}
{{ questionGroup.question.Tags | csvList }}
{% endif %}
</h1>
</header>

{% from 'macros/short-answer.njk' import shortAnswer %}
Expand Down
10 changes: 10 additions & 0 deletions src/css/components/_button.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.cmp-button {
cursor: pointer;
padding: 0.5rem 1rem;
background-color: var(--background-color);
color: var(--text-color);
font-size: clamp(1rem, 1rem + 1vw, 2rem);
border: 0.125rem solid var(--text-color);
border-radius: 0.25rem;
box-shadow: 0.25rem 0.25rem 0 0 var(--shadow);
}
4 changes: 4 additions & 0 deletions src/css/components/_categories.scss
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
align-items: center;
transition: color 150ms ease-in-out, text-decoration-color 150ms ease-in-out;

&--alternative {
font-size: clamp(0.875rem, 0.875rem + 0.5vw, 1.125rem);
}

&:hover {
color: var(--foundry-culture-base);
text-decoration-color: hsl(var(--text-color-hsl) / 0%);
Expand Down
20 changes: 0 additions & 20 deletions src/css/components/_category-heading.scss

This file was deleted.

28 changes: 28 additions & 0 deletions src/css/components/_checkbox.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
.cmp-checkbox {
&__grid {
display: grid;
grid-template-columns: 1fr;
gap: 1rem 2rem;

> div:first-child {
grid-column: 1 / -1;
}

@container (min-width: 36rem) {
grid-template-columns: auto 1fr;
}
}

&__wrapper {
display: flex;
align-items: center;
gap: 0.25rem;
font-size: clamp(1rem, 1rem + 0.5vw, 1.5rem);
}

&__input {
accent-color: var(--link-color);
height: 0.8em;
width: 0.8em;
}
}
2 changes: 1 addition & 1 deletion src/css/components/_game-header.scss
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
margin: 0;
}

&__question-count {
&__subtitle {
margin: 0;
font-weight: 400;
font-size: clamp(1rem, var(--size) + 0.5vw, 1.5rem);
Expand Down
11 changes: 0 additions & 11 deletions src/css/components/_inline-form.scss
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,4 @@
border: 0.125rem solid var(--text-color);
border-radius: 0.25rem;
}

&__button {
cursor: pointer;
padding: 0.5rem 1rem;
background-color: var(--background-color);
color: var(--text-color);
font-size: clamp(1rem, 1rem + 1vw, 2rem);
border: 0.125rem solid var(--text-color);
border-radius: 0.25rem;
box-shadow: 0.25rem 0.25rem 0 0 var(--shadow);
}
}
12 changes: 12 additions & 0 deletions src/css/elements/_fieldset-legend.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
fieldset {
container: fieldset / inline-size;
border: none;
margin: 0;
padding: 0;
}

legend {
display: block;
margin-block-end: 0.5rem;
font-size: clamp(1rem, 1rem + 1vw, 2rem);
}
15 changes: 0 additions & 15 deletions src/css/objects/_game-type.scss

This file was deleted.

Loading
Loading