Commit Graph

108 Commits

Author SHA1 Message Date
kennethreitz 676a596a66 Weak endings need a full vowel; trailing sibilant is transparent
middle / unavoidable shared only a schwa+L tail — the weak-ending rule
firing on a reduced vowel. Weak endings now require a full final vowel
(infancy/see on IY stays). Surfaced that swimmers' plural -s blocked
its coda from nesting with finisher; a trailing sibilant is inflection,
so it's stripped from the coda tag — Wayne's chain stays whole, garbage
(JH) still stays out.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 02:58:03 -04:00
kennethreitz b76430caaf Bold # header lines
Lines starting with # render bold and a touch brighter (a title, not
just a dim note); ( and [ annotation lines stay dim. Export matches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 21:11:24 -04:00
kennethreitz c86f87f707 Caret spotlight: brighten the family + margin brackets
Clicking into a colored word brightens its whole rhyme family (dark
ink on lit chips) and draws a soft rounded bracket in the left gutter
spanning the family's lines — rhyme and alliteration each get their
own bracket, gated to their toggle. No dimming of the rest; additive.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 21:08:34 -04:00
kennethreitz c77d24fb83 Weak V-x attach needs coda nesting too
garbage/javascript were joining dollar/scholar's AA-x group via the
attach path, which lacked the coda-class guard the bucket path has.
Now a bare V-x key attaches only when the token's coda nests with the
group's — same rule both paths. syrup/burden was the same looseness
(ER-schwa, mismatched coda) and now correctly splits; the real
stir-up/were-up perfect phrase matches stay.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:35:31 -04:00
kennethreitz e6b86a8a88 16-color palette with least-used assignment
The Python diss put pink on five different families: 18 families, 12
colors, and the assignment kept grabbing low indices so one hue piled
up. Now 16 colors (added cyan, amber, lavender, emerald) and each
family takes the globally least-used non-adjacent color, so hues
spread evenly — no color repeats more than twice on a dense page.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:31:52 -04:00
kennethreitz 411681d0a0 Vowel families must be local
Slant/multi attachment, multi buckets, and unequal-length containment
fusion now require members within ~6-8 lines. "All Me" was chaining
Baby/Mercedes/loan/being/Daddy into one teal family across 110 lines;
vowel assonance is local evidence, not global. Perfect rhymes and
equal-key fusion stay global (a real rhyme carries any distance).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:56:56 -04:00
kennethreitz fec0485b68 Dark ink on the spotlit chips
At 85% fill the off-white text washed out; the focused family's
glyphs flip to dark (like the primary button) with a touch of weight.
Possible because the highlight layer owns glyph color.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:48:41 -04:00
kennethreitz 202ec1542d Spotlight brighter still (2.8x, cap 85%)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:46:24 -04:00
kennethreitz f320c0d9f4 Spotlight brightens the caret's family instead of dimming the rest
The full color field stays put; the family under the caret glows
~1.8x (capped at 60%). Additive, not subtractive.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:44:05 -04:00
kennethreitz 77316330ea Weak V-x families stop gluing: coda-nested buckets, gated fusion
The spotlight exposed forever/question/extra/sequential as one EH-x
family. Three fixes:
- phrases obey refrain muting (the «Forever ever» carpet)
- bare V-x buckets subdivide by nesting final-coda classes, so
  placement (NT) keeps creation (N) but forever (.) releases
  sequential (L); phrases ride the main cluster
- single-vowel suffix fusion requires member coda sets to nest

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:40:34 -04:00
kennethreitz bd542e0b2e Spotlight: the family under the caret, automatically
Click into any colored word and every other family dims to a whisper
(22% of normal); the caret's rhyme thread stays lit across the whole
draft. Caret anywhere else restores the full field. No toggle — it
follows where you are. Smallest covering token wins (word over
phrase), recomputed after each analysis since gids shift.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:31:19 -04:00
kennethreitz 329c114b3e Spend the palette better: dedupe hues, adjacency-aware assignment
r9/r10/r11 were a pale pink, a second teal, and a second orange — now
rose, indigo, and chartreuse. Color assignment stops being gid % 12:
each family picks the first hue not worn by families on its own or
neighboring lines, so similar colors never sit next to each other.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 14:15:58 -04:00
kennethreitz ec269dc6f9 Brighter internal fills; pin overlay heights to the textarea
Internals 19% (phrases 14%), ends stay 34%, export matches. On long
documents the overlay layers get a tail spacer equalizing their
scroll height with the editor's, so deep scroll positions can't clamp
and slide the colors off the visible text.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:54:25 -04:00
kennethreitz 3252d70c57 Remove the counts layer
The caret-line readout already gives syllables on demand; a number on
every line was furniture.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:40:25 -04:00
kennethreitz fa539bbb68 Remove Save TXT
Share covers it (Notes, Files, anywhere), and drag-drop import remains
the way back in. Toolbar: Copy · Save PNG · Share + toggles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:39:09 -04:00
kennethreitz 7ff10af066 Share button via the Web Share API
Apple offers no content-accepting Notes URL scheme; the native share
sheet is the real path — Notes, Messages, Mail, one tap. Button only
appears where navigator.share exists (Safari, iOS, Android).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:37:21 -04:00
kennethreitz 5c87d827e6 Split the word entry into Explore and Wordplay lenses
Two sub-tabs under the lookup input: Explore (associations, describes,
synonyms — the meaning side) and Wordplay (rhymes, near, multis — the
sound side). Readout and history shared; switching repaints from the
cached entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:32:02 -04:00
kennethreitz 0bbbd46826 Associations section, above describes
What the word summons (Datamuse rel_trg): rain -> showers, monsoon,
shine, hail. The theme-building lens, first in the entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:27:45 -04:00
kennethreitz b204c8d9b9 Multis lookup and per-line syllable counts
- Multis: dictionary search by vowel skeleton — single words and
  two-word combos matching the target's run from its stressed anchor
  (charisma -> little/women/business; vacation plans -> information
  back). Perfect rhymes excluded; phrases supported as targets; new
  "multis" row in the rhymes section. Indexes warm at boot.
- Counts toggle: syllables per line in dim digits at the editor's
  right edge, wrap-safe and live; carried into the PNG export.
- Suffix fusion: multi families whose vowel keys are end-aligned
  containments merge (back pocket / rap profit / off it / still in
  office = one Em chain), with trailing schwas stripped before
  comparison; the longest end token now owns the scheme slot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:23:29 -04:00
kennethreitz f59e059f0d Actually wrap annotation lines in the dim span
The grey wrap targeted a renderer shape that no longer exists and
silently no-opped; it now applies at the real line-append point, and
the editor selection rule is un-nested for parser safety.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:04:14 -04:00
kennethreitz e9ebd318cd End-dominated vowel fusion; annotation lines render dimmer
- Same-vowel perfect families fuse when both live at line ends:
  blood/mud + thugs/drugs (+does/love/enough) read as Kanye's one AH
  chain; mid-line families keep their codas distinct
- Annotation lines (#, [, ( starts) render in a dim ink — the
  highlight layer now owns the glyph color (textarea text is
  transparent over it), in the editor and the PNG export

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:02:16 -04:00
kennethreitz 5e7845f0bb Parentheticals rhyme internally but never claim the line ending
(justify greed) now lights up with need/breed as internal rhyme; the
ending slot stays with the last word outside parens, so (yeah) tails
still can't set the scheme. The old all-or-nothing exclusion is gone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:57:49 -04:00
kennethreitz ff7a6b5790 Google search-page dumps extract to just the lyrics
Third extractor: the knowledge panel's standalone "Lyrics" header
through the Source:/Songwriters: footer — everything after (result
snippets, videos, People-also-search-for) drops. Requires both
markers, so a poem with a "Lyrics" line passes through whole.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:56:17 -04:00
kennethreitz 56ebb2046b Normalize Unicode line separators on paste
Google's lyrics box ships U+2028/U+2029 between lines, which a
textarea collapses — verses arrived as one giant line. All line-
separator flavors (CR, CRLF, LS, PS, NEL, VT, FF) normalize to \n,
and the Lyrics/Songwriters/Musixmatch furniture strips with the rest.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:54:03 -04:00
kennethreitz d268755aa1 AZLyrics-style page dumps extract to just the lyrics
Second extractor alongside the Genius one: quoted-title headers up
top plus a Thanks-to/Writer(s)/licensed-by footer mark the envelope;
both header and footer evidence are required, so quoted lines in your
own writing never trigger it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:52:33 -04:00
kennethreitz 5e50664458 Sidebar sections always expanded; paste preserves undo
The more… expanders are gone — describes, rhymes, and synonyms render
in full and the entry just scrolls. Smart paste inserts through the
undo-aware path so Cmd+Z cleanly un-pastes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:51:10 -04:00
kennethreitz 00106f584a Whole-page Genius dumps extract to just the lyrics
A full select-all paste (nav, bio, Q&A, credits, translations) now
reduces to the block between the first [Section] header and the
Embed/About footer, with "You might also like" recommendation inserts
dropped through to the next section. Lyrics-only pastes — with or
without [tags] — pass through untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:48:36 -04:00
kennethreitz 5cb419e385 Fix stale placeholder/comments describing the old underline rendering
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:47:03 -04:00
kennethreitz a7cb3ef4ad Smart paste: normalize typographic punctuation, strip lyrics-site cruft
Curly apostrophes broke phonetic tokenization (don't -> don + t);
pasted and dropped-in text now normalizes quotes/nbsp and drops
Genius-style cruft lines (Contributors, "... Lyrics" headers,
Translations, You might also like, Source:, Embed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:39:13 -04:00
kennethreitz e865fc17e9 Sidebar rebuilt as a word page; phrase lookups
One lookup renders the whole entry — phonetic readout as a plain
header (card chrome and dismiss gone), describes, rhymes by syllable
(+near), synonyms always fully expanded — with collapsed sections
behind "more…", a clickable history trail, and lookups firing as you
type (Go button and mode seg removed).

Multi-word lookups work: phrases read straight through for the
phonetic readout, rhyme on their final word (labeled), and hit
WordNet compounds for synonyms (new york -> Empire State).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:36:39 -04:00
kennethreitz d7fed935f0 Compound reading wins: mirror word groups dissolve into phrase families
four/door and inch/hinge were pure mirrors of «four-inch»/«door
hinge» yet their word fills painted over the orange-family phrase
color. A word group living entirely inside one family's phrases now
dissolves, so the phrase color paints the whole compound.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:21:16 -04:00
kennethreitz faa3522956 Repetition is refrain, not rhyme
Identical words/phrases no longer form a color group on their own — a
group colors only once a differing word rhymes into it. Repeated
endings still share a scheme letter (refrains scan), and a repeated
unrhymed ending no longer flags as "unanswered".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:15:27 -04:00
kennethreitz 478870b4a2 Rime keys strip leading onsets from unstressed pronunciations
CMU's unstressed "this" (DH IH0 S) has no stressed vowel, so its
rhyming part included the onset and founded a consonant-led key the
coda-nest fuse couldn't parse — repeated "this" fell out of the
wrist/assist/shit chain in full songs. Rimes now always start at a
vowel.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:10:26 -04:00
kennethreitz 2d77760633 Rename buttons: Save PNG and Save TXT
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:08:10 -04:00
kennethreitz f56d03eabf Coda-nesting fusion, s/z neutralization, wrapping draft tabs
- Single-vowel perfect families whose coda classes nest fuse into one
  chain: wrist (IH S T) hubs this (IH S) and shit (IH T), which ride
  as slant satellites — Logic's hook reads as one color
- Final s/z voicing neutralizes in coda classes and weak-ending keys:
  vamonos rhymes dominoes
- The drafts bar wraps instead of scrolling, so many drafts stay
  visible

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:05:45 -04:00
kennethreitz b2788e3620 Beats upgrade + looser cadence matching
Beats: every pattern gets an 808 bass line (pitch-glide sine, per-
style note movement), trap/halftime get layered claps, lo-fi/jazz get
open hats, hats humanize velocity. Two new styles (Halftime, Dembow),
a tap-tempo button, and a four-dot beat indicator synced to the bar.

Cadence: flexible monosyllables (x) read as stressed, so contours
differing only in flex positions join one flow family.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:59:27 -04:00
kennethreitz 45bb65d9d1 Normal caret height when rhythm is off
Line-height returns to 1.9 by default; the roomy 2.35 line box (and
its tall caret) only applies while the rhythm dots need the space.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:53:36 -04:00
kennethreitz 49b536c434 Toggle order rhyme/alliteration/rhythm; dots persist while typing
The rhythm layer now keeps dots over the unchanged prefix of an
edited line (same logic as the rhyme fills) instead of blanking the
whole line until re-analysis.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:52:25 -04:00
kennethreitz fcf18f627c Cadence families and unanswered endings
Two starred ideas, zero new chrome:
- Rhythm dots take a shared color when 2+ lines have the identical
  stress contour (5+ syllables) — flow rhymes, visible
- Line-endings with no rhyme partner get a faint gray fill in the
  rhyme layer: the open loops that show where to strike next

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:39:24 -04:00
kennethreitz 57710fd001 Files in, files out: Save .txt and drag-drop import
Drafts escape localStorage — a Save .txt button downloads the current
draft (named after its first line), and dropping text files anywhere
on the page turns each into a new draft tab.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:36:45 -04:00
kennethreitz 16b5601cdd Rhyme toggle: switch the color highlighting on/off
First in the toggle row, on by default; the export honors it. Rhythm
dots and alliteration underlines are independent layers, so any
combination works (e.g. rhythm-only for a clean flow view).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:34:26 -04:00
kennethreitz c7af71ac75 Three lookup/layer upgrades: ticks, senses, alliteration
- Rhyme/synonym chips already in your draft get a gold tick
- Word card shows WordNet sense count (3+) — double-entendre fuel
- "alliteration" toggle underlines words sharing an initial sound
  (locally clustered, 3+ words), in the editor and the PNG export:
  fills = tail sound, underlines = head sound

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:27:09 -04:00
kennethreitz 56ec754c5f Rapper-native: ad-lib awareness and a bar counter
Inline (parentheticals) are delivery, not text — they no longer rhyme
or steal the line-ending slot ("...bunch (yeah)" rhymes on bunch).
The readout leads with "bar 3/16" for the caret's place in its verse.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:16:39 -04:00
kennethreitz a5e835bcd7 Drop a stray measurement line in the export dot loop
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:12:14 -04:00
kennethreitz 8262f65ae7 Export carries the rhythm dots when the toggle is on
WYSIWYG: PNG line spacing widens to fit, dots centered under each
word in ink, same notation as the editor.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:12:03 -04:00
kennethreitz 1027302ab8 Rename the stress toggle to "rhythm"
Sheet music for rapping — the label should say what it feels like,
not what linguists call it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:10:39 -04:00
kennethreitz 1d3e78bb99 Stress dots on monosyllables too; nudged lower again
Single-syllable words now get one dot; dots at 2.2em, line-height 2.35.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:47:40 -04:00
kennethreitz 8897b63fa0 Stress dots in ink (white) instead of gold
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:46:39 -04:00
kennethreitz 4afb8f960b Stress dots slightly lower (2.04em, line-height 2.2)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:45:58 -04:00
kennethreitz 566645e22d Nudge stress dots lower (1.9em) with a little more line-height
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:45:40 -04:00