Chapter 8
Error and fallback states
A live catalogue of every degraded, empty or failure UI the site can render, so their look can be reviewed without triggering a real outage. Each block below is the actual component with representative mock data.
Word fetch failure
components/TrendingFallback.vue
Trigger:A page's data fetch throws (network error or a 5xx): GET /api/daily-word, /api/word-calendar, /api/parts, /api/part, /api/kanji, /api/kanji-detail, /api/explore or /api/patterns. The home page, /words, /words/[date], /parts, /parts/[text], /kanji, /kanji/[char], /explore and /patterns each pass their own title; a 400/404 swaps the message for a specific one, such as “That day hasn't arrived yet.” or “There is no word for this day.” The “More like this” row has no error state: if GET /api/related fails the row is simply left out.
Unable to Load Today's Word
Failed to load the word. Please try again.
The page could not fetch its data. This is usually temporary.
Entry with an unsettled origin
components/WordEntryView.vue (hedged sources, morphemes: [])
Trigger:An entry whose source hedges or gives no clean split: no morpheme breakdown (any other split would be a guess) and a “Not settled” callout, which appears whenever a quoted Wiktionary line contains a hedge such as “probably” or “unknown”. The content test requires such a line whenever an entry is tagged “Origin unclear”. The entry below is a synthetic placeholder, not a real etymology.
First opened Tuesday, October 13, 2026
例
れい
Pitch accent: We don't have the data for this section. No accent list gives this spelling and reading, or the two we check against disagree.
example
A placeholder entry used to preview this layout.
Taken apart
No breakdown is shown for this word: Wiktionary's text for it doesn't give a split that spells the word and joins to its reading, and any other split would be a guess.
Written with 例
In a sentence
We don't have the data for this section. The pinned Tatoeba export has no sentence with a translation that uses this word and passes our filter.
What Wiktionary says
Quoted line by line from Wiktionary's Etymology section for this reading, taken from one dated dump so it can't change underneath us. Nothing below is paraphrased.
Not settled
Wiktionary itself hedges on part of this word's origin — those lines are marked below.
- Hedged“Placeholder — this line is hedged (probably) so the callout shows. A real entry quotes Wiktionary here, verbatim.”
Source: Wiktionary: 例 (dump of 2026-09-02), available under CC BY-SA 4.0. Reading, meaning and part of speech from JMdict, and kanji readings from KANJIDIC2 (EDRDG).
What the labels mean
- 漢語 Sino-Japanese
- Words built from Chinese-derived morphemes — borrowed from Chinese or coined in Japan out of Chinese parts — read with on'yomi.
- Origin unclear
- Scholars disagree, or nobody knows.
Loading skeletons
pages/index.vue · pages/words/index.vue · pages/words/[date].vue · pages/parts/index.vue · pages/parts/[text].vue · pages/kanji/index.vue · pages/kanji/[char].vue · pages/explore.vue · pages/patterns.vue
Trigger:Shown while the page's data is still being fetched in the browser: when a reader moves to another day, month, part, kanji or filter, or retries after a failure. A first visit is rendered on the server with its data already in the HTML, so it normally shows no skeleton. The page never renders an empty frame.
Word page
Calendar
Calendar day states
pages/words/index.vue
Trigger:A day is “open” once midnight in Japan has passed (it shows its word and links to it), “today” when it is the current day, and “upcoming” before then — an upcoming day reveals nothing, and the API refuses to serve it. With calendar filters set, an open day whose word matches is tinted and one that doesn't is “faded” but still a link; an upcoming day is neither. A month with no match says so and points to the nearest months that have one. The words below are placeholders.
11
例
れい
faded
12
例
れい
open
13
例
れい
today
upcoming
Vocabulary-layer badges
components/WordEntryView.vue (entry.stratum)
Trigger:Every entry names the layer of the vocabulary it belongs to; the calendar colors its dot to match.
404 — page not found
pages/[...slug].vue
Trigger:Any unmatched route. Full-page layout with the shared header/footer and a single 'Return to Home' action. The server answers a real 404 and the page is noindex.
404
Page Not Found
The page or resource you are looking for does not exist or has been moved.
Return to HomeAPI error responses
server/api/daily-word.get.ts · word-calendar · part · kanji-detail · explore · related
Trigger:Not a rendered UI — the JSON the data endpoints return on failure. The pages map these onto the fetch-failure state above.
400 Bad Request
?date= is not a real calendar date, or is a day that hasn't arrived yet in Japan (an upcoming word is never served early). On /api/word-calendar, ?month= is not a real YYYY-MM; /api/explore and /api/word-calendar reject an unknown level, layer, process, part of speech, frequency or accent pattern, or an over-long search or part, and /api/part a missing or over-long text.
{
"statusCode": 400,
"statusMessage": "Bad Request",
"data": {
"error": "Invalid query parameters",
"details": [
{
"path": "date",
"message": "Date cannot be in the future"
}
]
}
}404 Not Found
A valid past date (or month) the catalogue doesn't cover, or a part or kanji no open word shows. With no ?date=, /api/daily-word serves today's word (starting a new lap once the words run out), and is a 404 only before the first word.
{
"statusCode": 404,
"statusMessage": "Not Found",
"data": {
"error": "There is no word for 2018-10-07."
}
}