src/data/constellations.js

// ————————————————————————————————————————————————
// The 88 IAU constellation stick figures (#120).
//
// CONSTELLATIONS — every IAU constellation as { id, names: { fr, en },
// color, zodiac, strokes }, where each `stroke` is an ordered polyline
// of Hipparcos catalogue numbers (HIP) that all resolve in
// `src/data/stars.js` (the bright-star catalogue trimmed to magnitude
// ≤ 6.5). `id` is the lowercased IAU 3-letter abbreviation. `color` is
// the line colour — the 12 ecliptic ("zodiac") constellations keep
// distinct hues; the other 76 share NEUTRAL_FIGURE_COLOR so the zodiac
// stand out in the sky. `zodiac` is true for exactly those 12.
//
// ZODIAC — the derived 12-entry view (CONSTELLATIONS.filter(c => c.zodiac)).
//
// validateConstellations(hipSet) is the defensive runtime pruner: it
// drops any HIP not in the supplied set, collapses sub-2-star strokes,
// drops figures left with no strokes, and returns { figures, warnings }
// without ever throwing. On the shipped catalogue it is a no-op (the
// data below is already pruned to mag ≤ 6.5 at build time).
//
// Names are FR/EN, resolved via objectName() at render time — same
// shape as src/data/planets.js / locations.js.
//
// SOURCE: generated by scripts/build-constellations.js from Stellarium's
// "western_SnT" sky culture (Sky & Telescope figures); the HIP-to-HIP
// connections are treated as public-domain astronomical data (see
// README). To regenerate: pin SKYCULTURE_COMMIT in that script, then
//   node scripts/build-constellations.js
// (it rewrites this file). No Three / no Vite imports — Node-testable.
// ————————————————————————————————————————————————

export const NEUTRAL_FIGURE_COLOR = 0x6a7a93;

// Each entry: { id, names: { fr, en }, color, zodiac, strokes: number[][] }.
// Zodiac first (ecliptic order), then the remaining constellations.
export const CONSTELLATIONS = [
  {
    id: 'ari',
    names: { fr: 'Bélier', en: 'Aries' },
    color: 0xff6b6b,
    zodiac: true,
    strokes: [[8832, 8903, 9884, 13209]],
  },
  {
    id: 'tau',
    names: { fr: 'Taureau', en: 'Taurus' },
    color: 0xff9f43,
    zodiac: true,
    strokes: [
      [26451, 21421, 20894, 20205, 20455, 20889, 25428],
      [16083, 18907],
      [15900, 16852],
      [20205, 18724, 16083],
    ],
  },
  {
    id: 'gem',
    names: { fr: 'Gémeaux', en: 'Gemini' },
    color: 0xffd166,
    zodiac: true,
    strokes: [
      [32362, 35350, 35550, 34088, 31681],
      [35550, 36962, 37740],
      [36962, 37826],
      [36962, 36046, 34693, 36850],
      [34693, 33018],
      [34693, 32246, 30883],
      [32246, 30343, 29655, 28734],
    ],
  },
  {
    id: 'cnc',
    names: { fr: 'Cancer', en: 'Cancer' },
    color: 0xc9e265,
    zodiac: true,
    strokes: [
      [44066, 42911, 40526],
      [42911, 42806, 43103],
    ],
  },
  {
    id: 'leo',
    names: { fr: 'Lion', en: 'Leo' },
    color: 0x6bc16b,
    zodiac: true,
    strokes: [
      [49669, 49583, 50583, 50335, 48455, 47908],
      [50583, 54872, 57632, 54879, 54872],
      [54879, 49583],
      [48455, 46146, 46750, 47908, 49583],
      [54879, 55642, 55434],
    ],
  },
  {
    id: 'vir',
    names: { fr: 'Vierge', en: 'Virgo' },
    color: 0x4ecdc4,
    zodiac: true,
    strokes: [
      [60129, 58948, 57380, 57757, 60129, 61941, 63090, 63608],
      [61941, 64238, 65474],
      [61941, 66249, 68520, 72220],
      [66249, 69701, 71957],
    ],
  },
  {
    id: 'lib',
    names: { fr: 'Balance', en: 'Libra' },
    color: 0x4dabf7,
    zodiac: true,
    strokes: [
      [72622, 74785],
      [72622, 73714],
      [74785, 76333, 72622],
      [76333, 76470, 76600],
    ],
  },
  {
    id: 'sco',
    names: { fr: 'Scorpion', en: 'Scorpius' },
    color: 0x5c7cfa,
    zodiac: true,
    strokes: [
      [78820, 78401, 78265],
      [
        78401, 80112, 80763, 81266, 82396, 82514, 82729, 84143, 86228, 87073, 86670, 85696, 85927,
        87261,
      ],
      [78820, 79374],
      [78265, 78104],
    ],
  },
  {
    id: 'sgr',
    names: { fr: 'Sagittaire', en: 'Sagittarius' },
    color: 0x9775fa,
    zodiac: true,
    strokes: [
      [90185, 88635, 89931, 90185],
      [89931, 90496, 92041, 89931],
      [92041, 92855, 93864, 93506, 92041],
      [93506, 90185, 89642],
      [90496, 89341],
      [95168, 94141, 93683, 93085, 94141],
    ],
  },
  {
    id: 'cap',
    names: { fr: 'Capricorne', en: 'Capricornus' },
    color: 0xc77dff,
    zodiac: true,
    strokes: [[100064, 100345, 102485, 102978, 105881, 106723, 107556, 106985, 104139, 100064]],
  },
  {
    id: 'aqr',
    names: { fr: 'Verseau', en: 'Aquarius' },
    color: 0xf368e0,
    zodiac: true,
    strokes: [
      [102618, 106278, 109074, 110395, 110960, 111497],
      [110960, 110672, 109074],
      [109139, 106278],
      [109074, 110003, 112961, 114724, 115033, 115438],
      [115033, 114341],
      [115033, 113136, 112716, 112961],
    ],
  },
  {
    id: 'psc',
    names: { fr: 'Poissons', en: 'Pisces' },
    color: 0xff8fab,
    zodiac: true,
    strokes: [
      [
        5742, 6193, 5586, 5742, 7097, 8198, 9487, 7884, 4906, 3786, 118268, 116771, 115830, 114971,
        115738, 116928, 116771,
      ],
    ],
  },
  {
    id: 'and',
    names: { fr: 'Andromède', en: 'Andromeda' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [677, 3092, 5447, 9640],
      [113726, 116631, 116805, 116584],
      [116631, 1473, 2912, 3092],
      [2912, 5447, 4436, 3881, 5434, 7607],
      [3092, 3031, 3693, 4463],
    ],
  },
  {
    id: 'ant',
    names: { fr: 'Machine pneumatique', en: 'Antlia' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[53502, 51172, 46515]],
  },
  {
    id: 'aps',
    names: { fr: 'Oiseau de paradis', en: 'Apus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [72370, 81065],
      [80047, 81852, 81065],
    ],
  },
  {
    id: 'aql',
    names: { fr: 'Aigle', en: 'Aquila' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [98036, 97649, 97278, 95501, 93805],
      [95501, 93747],
      [95501, 97804, 99473],
      [93244, 93747],
      [93805, 93429],
      [99473, 96468, 93805, 93747],
    ],
  },
  {
    id: 'ara',
    names: { fr: 'Autel', en: 'Ara' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [85267, 85727, 82363, 83081, 83153, 85792, 88714],
      [85792, 85258],
    ],
  },
  {
    id: 'aur',
    names: { fr: 'Cocher', en: 'Auriga' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [25428, 23015, 23767, 24608, 28360, 28380, 25428],
      [23767, 23453, 23416, 24608, 28358, 28360],
    ],
  },
  {
    id: 'boo',
    names: { fr: 'Bouvier', en: 'Bootes' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [69673, 72105, 74666, 73555, 71075, 71053, 69673, 67927, 67275],
      [69673, 71795],
      [71075, 69732, 70497, 69483, 69732],
    ],
  },
  {
    id: 'cae',
    names: { fr: 'Burin', en: 'Caelum' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[23595, 21861, 21770, 21060]],
  },
  {
    id: 'cam',
    names: { fr: 'Girafe', en: 'Camelopardalis' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [23040, 23522, 22783, 29997, 33694],
      [22783, 17959, 17884, 16228],
    ],
  },
  {
    id: 'cvn',
    names: { fr: 'Chiens de chasse', en: 'Canes Venatici' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[63125, 61317]],
  },
  {
    id: 'cma',
    names: { fr: 'Grand Chien', en: 'Canis Major' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [30324, 32349, 34444, 33579],
      [34444, 35904],
      [30324, 31592, 33152, 33579],
      [32349, 33347, 34045, 33160, 33347],
    ],
  },
  {
    id: 'cmi',
    names: { fr: 'Petit Chien', en: 'Canis Minor' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[37279, 36188]],
  },
  {
    id: 'car',
    names: { fr: 'Carène', en: 'Carina' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [30438, 45238, 50099, 52419, 51576, 50371, 45556, 42913],
      [51576, 53253],
      [52419, 54301, 54751, 54463, 53253],
      [45556, 41037, 38827, 39953],
    ],
  },
  {
    id: 'cas',
    names: { fr: 'Cassiopée', en: 'Cassiopeia' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[746, 3179, 4427, 6686, 8886]],
  },
  {
    id: 'cen',
    names: { fr: 'Centaure', en: 'Centaurus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [61932, 66657, 68702, 71683],
      [66657, 68002, 61932],
      [68002, 68282, 68245, 71352],
      [68245, 68862, 70090, 68933, 67464, 68002],
      [55425, 59196, 60823, 61932],
      [60823, 59449, 56243],
      [67464, 65936, 65109, 61789],
      [71352, 73334],
    ],
  },
  {
    id: 'cep',
    names: { fr: 'Céphée', en: 'Cepheus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [102422, 105199, 106032, 112724],
      [106032, 116727, 112724, 110991, 109492, 109857, 107259, 105199],
      [101093, 102422],
    ],
  },
  {
    id: 'cet',
    names: { fr: 'Baleine', en: 'Cetus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [
        12706, 14135, 13954, 12828, 11484, 12706, 12387, 10826, 8645, 8102, 3419, 1562, 5364, 6537,
        8645,
      ],
    ],
  },
  {
    id: 'cha',
    names: { fr: 'Caméléon', en: 'Chamaeleon' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[40702, 51839, 52633, 60000, 58484, 51839]],
  },
  {
    id: 'cir',
    names: { fr: 'Compas', en: 'Circinus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[74824, 71908, 75323]],
  },
  {
    id: 'col',
    names: { fr: 'Colombe', en: 'Columba' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [26634, 27628],
      [25859, 26634],
      [28328, 27628, 28199, 30277],
    ],
  },
  {
    id: 'com',
    names: { fr: 'Chevelure de Bérénice', en: 'Coma Berenices' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[64241, 64394, 60742]],
  },
  {
    id: 'cra',
    names: { fr: 'Couronne australe', en: 'Corona Australis' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[93825, 94114, 94160, 94005, 90982]],
  },
  {
    id: 'crb',
    names: { fr: 'Couronne boréale', en: 'Corona Borealis' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[76127, 75695, 76267, 76952, 77512, 78159, 78493]],
  },
  {
    id: 'crv',
    names: { fr: 'Corbeau', en: 'Corvus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [60965, 59803, 59316, 61359, 60965],
      [59316, 59199],
    ],
  },
  {
    id: 'crt',
    names: { fr: 'Coupe', en: 'Crater' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [53740, 54682, 55705, 57283, 58188],
      [55705, 55282, 55687, 56633],
      [55282, 53740],
    ],
  },
  {
    id: 'cru',
    names: { fr: 'Croix du Sud', en: 'Crux' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [60718, 61084],
      [62434, 59747],
    ],
  },
  {
    id: 'cyg',
    names: { fr: 'Cygne', en: 'Cygnus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [102098, 100453, 102488],
      [100453, 95947],
      [100453, 97165, 95853, 94779],
      [95853, 99848, 102098, 103413, 104732, 102488],
    ],
  },
  {
    id: 'del',
    names: { fr: 'Dauphin', en: 'Delphinus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[101421, 101769, 101958, 102532, 102281, 101769]],
  },
  {
    id: 'dor',
    names: { fr: 'Dorade', en: 'Dorado' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [19893, 21281, 23693, 26069, 21281],
      [26069, 27100, 27890, 26069],
    ],
  },
  {
    id: 'dra',
    names: { fr: 'Dragon', en: 'Draco' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [56211, 61281, 68756, 75458, 78527, 80331, 83895, 89908, 89937],
      [89908, 94376, 97433],
      [94376, 87585, 85829, 85670, 87833, 87585],
    ],
  },
  {
    id: 'equ',
    names: { fr: 'Petit Cheval', en: 'Equuleus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[104987, 104858, 104521]],
  },
  {
    id: 'eri',
    names: { fr: 'Éridan', en: 'Eridanus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [
        23875, 22109, 21444, 19587, 18543, 17593, 17378, 16537, 13701, 12770, 12843, 14146, 15474,
        16611, 17651, 18216, 18673, 21248, 21393, 20535, 20042, 17874, 16870, 15510, 13847, 12486,
        12413, 11407, 9007, 7588,
      ],
    ],
  },
  {
    id: 'for',
    names: { fr: 'Fourneau', en: 'Fornax' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[14879, 13147, 9677]],
  },
  {
    id: 'gru',
    names: { fr: 'Grue', en: 'Grus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [108085, 109111, 110997, 109268, 112122, 110997],
      [112122, 112623, 113638],
    ],
  },
  {
    id: 'her',
    names: { fr: 'Hercule', en: 'Hercules' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [84379, 84345, 80816, 80170],
      [80816, 81693, 83207],
      [81693, 81833, 81126, 79992],
      [81833, 84380, 85112, 87808, 86414],
      [84380, 83207, 84379, 85693, 86974, 87933, 88794],
      [77760, 79101, 79992],
      [80170, 80463, 81008],
    ],
  },
  {
    id: 'hor',
    names: { fr: 'Horloge', en: 'Horologium' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[19747, 12653, 12225, 12484, 14240, 13884]],
  },
  {
    id: 'hya',
    names: { fr: 'Hydre', en: 'Hydra' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [
        43234, 42799, 42402, 42313, 43109, 43813, 45336, 47431, 46390, 48356, 49402, 49841, 51069,
        52943, 53740,
      ],
      [54682, 56343, 57936, 64962, 68895, 72571],
    ],
  },
  {
    id: 'hyi',
    names: { fr: 'Hydre mâle', en: 'Hydrus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[2021, 17678, 11001, 9236, 2021]],
  },
  {
    id: 'ind',
    names: { fr: 'Indien', en: 'Indus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[103227, 102333, 101772, 105319, 108431, 103227]],
  },
  {
    id: 'lac',
    names: { fr: 'Lézard', en: 'Lacerta' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [111022, 111169, 110538, 110609, 111022, 110351, 111104, 111944, 111022],
      [111104, 109754, 109937],
    ],
  },
  {
    id: 'lmi',
    names: { fr: 'Petit Lion', en: 'Leo Minor' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[46952, 49593, 51233, 53229, 51056, 49593]],
  },
  {
    id: 'lep',
    names: { fr: 'Lièvre', en: 'Lepus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [23685, 24305, 25985, 25606, 23685],
      [24845, 24305, 24327],
      [25606, 27072, 27654, 28910, 28103, 27288, 25985],
    ],
  },
  {
    id: 'lup',
    names: { fr: 'Loup', en: 'Lupus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [71860, 74395, 75264, 76297, 75141, 73273],
      [76297, 78384, 75177, 77634, 78384, 74395],
    ],
  },
  {
    id: 'lyn',
    names: { fr: 'Lynx', en: 'Lynx' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[45860, 45688, 44700, 44248, 41075, 36145, 33449, 30060]],
  },
  {
    id: 'lyr',
    names: { fr: 'Lyre', en: 'Lyra' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [91262, 91919, 91971, 91262],
      [91971, 92791, 93194, 92420, 91971],
    ],
  },
  {
    id: 'men',
    names: { fr: 'Table', en: 'Mensa' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[29271, 23467]],
  },
  {
    id: 'mic',
    names: { fr: 'Microscope', en: 'Microscopium' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[102831, 102989]],
  },
  {
    id: 'mon',
    names: { fr: 'Licorne', en: 'Monoceros' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [31978, 31216, 30419, 32578, 31216],
      [32578, 34769, 30867, 29651],
      [34769, 39863, 37447],
    ],
  },
  {
    id: 'mus',
    names: { fr: 'Mouche', en: 'Musca' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[57363, 59929, 61585, 62322, 63613, 61199, 61585]],
  },
  {
    id: 'nor',
    names: { fr: 'Règle', en: 'Norma' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[78639, 80000, 80582, 78914, 78639]],
  },
  {
    id: 'oct',
    names: { fr: 'Octant', en: 'Octans' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[70638, 107089, 112405, 70638]],
  },
  {
    id: 'oph',
    names: { fr: 'Serpentaire', en: 'Ophiuchus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [86032, 83000, 80883, 79593, 79882, 80628, 81377, 83000],
      [81377, 84012, 86742, 87108, 88048],
      [86742, 86032],
      [84012, 84970, 85423],
      [81377, 80894, 80569, 80343, 80473],
    ],
  },
  {
    id: 'ori',
    names: { fr: 'Orion', en: 'Orion' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [27989, 26727, 27366],
      [26727, 26311, 25930, 25336],
      [25930, 25281, 24436],
      [27989, 25336, 26207, 27989],
      [23607, 22957, 22845, 22509, 22449, 25336],
      [22449, 22549, 22797, 23123],
      [27989, 28614, 29038],
      [29426, 28716, 27913, 29038],
    ],
  },
  {
    id: 'pav',
    names: { fr: 'Paon', en: 'Pavo' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [100751, 99240, 102395],
      [100751, 105858, 102395],
      [91792, 99240, 98495],
      [99240, 93015, 88866, 86929],
      [88866, 90098, 92609, 99240],
    ],
  },
  {
    id: 'peg',
    names: { fr: 'Pégase', en: 'Pegasus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [109410, 112158, 113881, 112748, 112440, 109176, 107354],
      [677, 113881, 113963, 1067, 677],
      [107315, 109427, 112029, 113963],
    ],
  },
  {
    id: 'per',
    names: { fr: 'Persée', en: 'Perseus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [17448, 18246, 18614, 18532, 17358, 15863, 14328, 13268, 13531, 14328],
      [13531, 14632, 15863],
      [14632, 14668, 14576, 18532],
      [14576, 14354],
      [17358, 19343, 19812, 20070, 19167],
      [14632, 12777, 8068],
    ],
  },
  {
    id: 'phe',
    names: { fr: 'Phénix', en: 'Phoenix' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [2081, 5165, 6867],
      [2081, 765, 5165, 5348, 7083, 6867],
    ],
  },
  {
    id: 'pic',
    names: { fr: 'Peintre', en: 'Pictor' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[32607, 27530, 27321]],
  },
  {
    id: 'psa',
    names: { fr: 'Poisson austral', en: 'Piscis Austrinus' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[113368, 113246, 112948, 111188, 109285, 107380, 107608, 109285, 111954, 113368]],
  },
  {
    id: 'pup',
    names: { fr: 'Poupe', en: 'Puppis' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [39953, 39429, 39757, 38170, 37229, 36917, 35264, 31685, 30438],
      [36917, 37677, 38070, 38170],
    ],
  },
  {
    id: 'pyx',
    names: { fr: 'Boussole', en: 'Pyxis' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[39429, 42515, 42828, 43409]],
  },
  {
    id: 'ret',
    names: { fr: 'Réticule', en: 'Reticulum' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[19780, 17440, 18597, 19921, 19780]],
  },
  {
    id: 'sge',
    names: { fr: 'Flèche', en: 'Sagitta' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [98337, 97365, 96757],
      [97365, 96837],
    ],
  },
  {
    id: 'scl',
    names: { fr: 'Sculpteur', en: 'Sculptor' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[4577, 117452, 115102, 116231]],
  },
  {
    id: 'sct',
    names: { fr: 'Écu de Sobieski', en: 'Scutum' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[92175, 91117, 90595, 91726, 92175]],
  },
  {
    id: 'ser',
    names: { fr: 'Serpent', en: 'Serpens' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [77233, 78072, 77450, 76852, 77233, 76276, 77070, 77622, 77516, 79593],
      [84012, 86263, 88048, 89962, 92946],
    ],
  },
  {
    id: 'sex',
    names: { fr: 'Sextant', en: 'Sextans' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[48437, 49641, 51437, 51362]],
  },
  {
    id: 'tel',
    names: { fr: 'Télescope', en: 'Telescopium' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[89112, 90422, 90568]],
  },
  {
    id: 'tri',
    names: { fr: 'Triangle', en: 'Triangulum' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[8796, 10064, 10670, 8796]],
  },
  {
    id: 'tra',
    names: { fr: 'Triangle austral', en: 'Triangulum Australe' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[82273, 77952, 76440, 74946, 82273]],
  },
  {
    id: 'tuc',
    names: { fr: 'Toucan', en: 'Tucana' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[2484, 1599, 118322, 110838, 110130, 114996, 2484]],
  },
  {
    id: 'uma',
    names: { fr: 'Grande Ourse', en: 'Ursa Major' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [
      [58001, 57399, 54539, 50801, 50372],
      [57399, 55219],
      [59774, 54061, 53910, 58001, 59774, 62956, 65378, 67301],
      [54061, 46733, 48319],
      [46733, 41704, 48319, 53910],
      [48319, 46853, 44471, 44127],
    ],
  },
  {
    id: 'umi',
    names: { fr: 'Petite Ourse', en: 'Ursa Minor' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[11767, 85822, 82080, 77055, 79822, 75097, 72607, 77055]],
  },
  {
    id: 'vel',
    names: { fr: 'Voiles', en: 'Vela' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[42913, 39953, 44816, 46651, 50191, 52727, 48774, 45941, 42913]],
  },
  {
    id: 'vol',
    names: { fr: 'Poisson volant', en: 'Volans' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[44382, 41312, 39794, 35228, 34481, 39794, 44382]],
  },
  {
    id: 'vul',
    names: { fr: 'Petit Renard', en: 'Vulpecula' },
    color: 0x6a7a93,
    zodiac: false,
    strokes: [[95771, 97886]],
  },
];

// Derived: the 12 ecliptic constellations.
export const ZODIAC = CONSTELLATIONS.filter((c) => c.zodiac);

// Prune a copy of CONSTELLATIONS against `hipSet` (a Set<number> of
// available HIP ids). Drops unknown HIPs, collapses consecutive
// duplicates a drop may introduce, drops strokes that fall below two
// stars, and drops figures left with no drawable strokes. Returns
// { figures, warnings }; `figures` keeps the entry shape (incl. `zodiac`);
// `warnings` is an array of human-readable strings. Never throws.
export function validateConstellations(hipSet) {
  const warnings = [];
  const figures = [];
  for (const c of CONSTELLATIONS) {
    const strokes = [];
    for (const stroke of c.strokes) {
      const kept = [];
      for (const hip of stroke) {
        if (hipSet.has(hip)) kept.push(hip);
        else warnings.push(`${c.id}: HIP ${hip} not in star catalog — dropped`);
      }
      const cleaned = kept.filter((hip, i) => i === 0 || hip !== kept[i - 1]);
      if (cleaned.length >= 2) strokes.push(cleaned);
      else if (stroke.length >= 2)
        warnings.push(`${c.id}: a stroke collapsed below 2 stars after pruning — dropped`);
    }
    if (strokes.length > 0)
      figures.push({ id: c.id, names: c.names, color: c.color, zodiac: c.zodiac, strokes });
    else warnings.push(`${c.id}: no drawable strokes after pruning — constellation dropped`);
  }
  return { figures, warnings };
}
← Astrarium