Back to Napplet Machines V8
SOURCE / PINNED RELEASE

Made of little things.

Napplet Machines V8

Release
b3f614e739f0…
Author-recorded commit
534f19acb4ba…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-b5572362d4a

Archive hash verified: 0f7feb97e2c3d336…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

src/art.ts
// Shared toy-box colors, intentionally independent of the runtime's UI palette.
export const paint = ['#ff5068', '#ffdc3f', '#596dff', '#22ddc4'];
export function courseStyle(name: string) {
  if (name === 'Little Lagoon' || name === 'Coastal Comet')
    return {
      sky: '#78cfe6',
      horizon: '#ddf6ed',
      ocean: '#31bbd2',
      shore: '#fff0bd',
      hill: '#f3c57b',
      ground: '#ffe5a2',
      patch: '#fff0bd',
      edge: '#f9a477',
      water: '#31cde0',
      leaves: ['#17baa0', '#42dcb0', '#ff8aaa', '#ffbc48'],
      accent: '#ff726c',
      subtitle:
        name === 'Coastal Comet'
          ? 'Coastal sweepers, a cliffside kink & room to pass.'
          : 'Wide beaches. Narrow corners. Seaside scrapes.',
    };
  if (name === 'Skyline Sprint' || name === 'Skybridge Eight')
    return {
      sky: '#a59be9',
      horizon: '#ffe2dc',
      ocean: '#948be0',
      shore: '#ffd8bc',
      hill: '#c991ca',
      ground: '#f0bfd9',
      patch: '#f9d4e0',
      edge: '#ae86d8',
      water: '#9c9ef1',
      leaves: ['#ef709e', '#ff9a72', '#a18bef', '#ffdc6d'],
      accent: '#a08aff',
      subtitle:
        name === 'Skybridge Eight'
          ? 'Over, under, around. A sky-high figure eight.'
          : 'Candy-colored heights. Hold your nerve.',
    };
  if (name === 'Petal Park')
    return {
      sky: '#b7b7f1',
      horizon: '#ffefd5',
      ocean: '#8e9fe8',
      shore: '#ffd7ac',
      hill: '#c988ad',
      ground: '#f5d0ba',
      patch: '#ffe5cc',
      edge: '#ce8fba',
      water: '#a9c7fa',
      leaves: ['#ef719f', '#ffc465', '#a491e9', '#67c7ab'],
      accent: '#e869a8',
      subtitle: 'Four garden lobes. Tight waists. Blooming good scraps.',
    };
  if (name === 'Switchback Summit')
    return {
      sky: '#99cfed',
      horizon: '#e7fbef',
      ocean: '#5fa7d1',
      shore: '#d7e5cb',
      hill: '#7eacba',
      ground: '#b6ddd0',
      patch: '#d3eddf',
      edge: '#739fab',
      water: '#77c8e6',
      leaves: ['#388e97', '#61b5a4', '#bccce4', '#ffc476'],
      accent: '#fd965f',
      subtitle: 'Climb the ridge. Thread the esses. Brave the open crest.',
    };
  return {
    sky: '#8cc9ec',
    horizon: '#e4f6cf',
    ocean: '#4bbfc1',
    shore: '#efdd9b',
    hill: '#64bd85',
    ground: '#94dc75',
    patch: '#b2e991',
    edge: '#51b891',
    water: '#41cce3',
    leaves: ['#1caf88', '#3dc9a0', '#bde857', '#ffa26f'],
    accent: '#ff6374',
    subtitle:
      name === 'Pinefall Circuit'
        ? 'Big hills. Tiny cars. No room for polite racing.'
        : 'Your corners. Your chaos. Take it for a spin.',
  };
}
export function carPortrait(index: number) {
  const stripe = index === 1 ? '#17254d' : '#fff8e7';
  return `<svg class="ride-art" viewBox="0 0 240 130" aria-hidden="true">
    <ellipse cx="124" cy="108" rx="85" ry="13" fill="#17254d" opacity=".16"/>
    <g stroke="#17254d" stroke-width="3" stroke-linejoin="round">
      <ellipse cx="67" cy="86" rx="16" ry="22" fill="#17254d"/><ellipse cx="67" cy="86" rx="7" ry="11" fill="#fff8e7"/>
      <ellipse cx="176" cy="90" rx="16" ry="22" fill="#17254d"/><ellipse cx="176" cy="90" rx="7" ry="11" fill="#fff8e7"/>
      <path d="M32 62 113 30 213 62 211 83 130 116 32 83Z" fill="currentColor"/>
      <path d="m32 62 98 32 83-32-100-32Z" fill="#fff" opacity=".25" stroke="none"/>
      <path d="m130 94 81-32v21l-81 33Z" fill="#17254d" opacity=".15" stroke="none"/>
      <path d="m58 52 35-28 54 2 31 26-61 23Z" fill="currentColor"/>
      <path d="m64 51 29-23 21 7-2 34Z" fill="#83eaf1"/>
      <path d="m118 36 28-6 25 22-54 19Z" fill="#263f75"/>
      <path d="m139 83 40-16 15 5-40 17Z" fill="${stripe}" stroke="none"/>
      <path d="m165 99 32-13v8l-32 13Z" fill="#fff8e7"/>
      <path d="m39 71 17 6v8l-17-6Z" fill="#ffdb45"/>
      ${index === 3 ? '<path d="m28 54 46-20 12 5-44 20v9l-14-5Z" fill="#ff5068"/>' : ''}
      ${index === 2 ? '<path d="m93 25 10-12 26 1 12 14Z" fill="#ffda45"/>' : ''}
    </g></svg>`;
}