chromonym 3.1.1 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/NOTICE.md +243 -1
  2. package/README.md +51 -43
  3. package/dist/conversions/rgb.d.ts +7 -1
  4. package/dist/conversions/rgb.d.ts.map +1 -1
  5. package/dist/conversions/rgb.js +11 -2
  6. package/dist/conversions/rgb.js.map +1 -1
  7. package/dist/convert.d.ts +73 -21
  8. package/dist/convert.d.ts.map +1 -1
  9. package/dist/convert.js +13 -2
  10. package/dist/convert.js.map +1 -1
  11. package/dist/defineColorPalette.d.ts +53 -0
  12. package/dist/defineColorPalette.d.ts.map +1 -0
  13. package/dist/defineColorPalette.js +103 -0
  14. package/dist/defineColorPalette.js.map +1 -0
  15. package/dist/detectFormat.d.ts +26 -3
  16. package/dist/detectFormat.d.ts.map +1 -1
  17. package/dist/detectFormat.js +20 -0
  18. package/dist/detectFormat.js.map +1 -1
  19. package/dist/identify.d.ts +63 -17
  20. package/dist/identify.d.ts.map +1 -1
  21. package/dist/identify.js.map +1 -1
  22. package/dist/index.d.ts +13 -4
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +12 -3
  25. package/dist/index.js.map +1 -1
  26. package/dist/indexing.d.ts +13 -3
  27. package/dist/indexing.d.ts.map +1 -1
  28. package/dist/indexing.js +67 -19
  29. package/dist/indexing.js.map +1 -1
  30. package/dist/palettes/crayola.d.ts +16 -0
  31. package/dist/palettes/crayola.d.ts.map +1 -1
  32. package/dist/palettes/crayola.js +16 -0
  33. package/dist/palettes/crayola.js.map +1 -1
  34. package/dist/palettes/fs595b.d.ts +467 -0
  35. package/dist/palettes/fs595b.d.ts.map +1 -0
  36. package/dist/palettes/fs595b.js +256 -0
  37. package/dist/palettes/fs595b.js.map +1 -0
  38. package/dist/palettes/fs595c.d.ts +1224 -0
  39. package/dist/palettes/fs595c.d.ts.map +1 -0
  40. package/dist/palettes/fs595c.js +633 -0
  41. package/dist/palettes/fs595c.js.map +1 -0
  42. package/dist/palettes/isccNbs.d.ts +562 -0
  43. package/dist/palettes/isccNbs.d.ts.map +1 -0
  44. package/dist/palettes/isccNbs.js +300 -0
  45. package/dist/palettes/isccNbs.js.map +1 -0
  46. package/dist/palettes/nbs.d.ts +578 -0
  47. package/dist/palettes/nbs.d.ts.map +1 -0
  48. package/dist/palettes/nbs.js +309 -0
  49. package/dist/palettes/nbs.js.map +1 -0
  50. package/dist/palettes/ncs.d.ts +3949 -0
  51. package/dist/palettes/ncs.d.ts.map +1 -0
  52. package/dist/palettes/ncs.js +2011 -0
  53. package/dist/palettes/ncs.js.map +1 -0
  54. package/dist/palettes/ntc.d.ts +3170 -0
  55. package/dist/palettes/ntc.d.ts.map +1 -0
  56. package/dist/palettes/ntc.js +1602 -0
  57. package/dist/palettes/ntc.js.map +1 -0
  58. package/dist/palettes/pantone.d.ts +18 -1
  59. package/dist/palettes/pantone.d.ts.map +1 -1
  60. package/dist/palettes/pantone.js +18 -1
  61. package/dist/palettes/pantone.js.map +1 -1
  62. package/dist/palettes/resene.d.ts +2802 -0
  63. package/dist/palettes/resene.d.ts.map +1 -0
  64. package/dist/palettes/resene.js +1422 -0
  65. package/dist/palettes/resene.js.map +1 -0
  66. package/dist/palettes/web.d.ts +10 -0
  67. package/dist/palettes/web.d.ts.map +1 -1
  68. package/dist/palettes/web.js +10 -0
  69. package/dist/palettes/web.js.map +1 -1
  70. package/dist/palettes/x11.d.ts +15 -10
  71. package/dist/palettes/x11.d.ts.map +1 -1
  72. package/dist/palettes/x11.js +15 -10
  73. package/dist/palettes/x11.js.map +1 -1
  74. package/dist/palettes/xkcd.d.ts +1880 -0
  75. package/dist/palettes/xkcd.d.ts.map +1 -0
  76. package/dist/palettes/xkcd.js +955 -0
  77. package/dist/palettes/xkcd.js.map +1 -0
  78. package/dist/resolve.d.ts +58 -14
  79. package/dist/resolve.d.ts.map +1 -1
  80. package/dist/resolve.js +32 -16
  81. package/dist/resolve.js.map +1 -1
  82. package/dist/types.d.ts +47 -0
  83. package/dist/types.d.ts.map +1 -1
  84. package/dist/types.js.map +1 -1
  85. package/package.json +44 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xkcd.js","sourceRoot":"","sources":["../../src/palettes/xkcd.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Palette } from '../types.js';\nimport { standardNormalize } from './normalize.js';\n\n/**\n * XKCD color-survey palette (923 entries): results\n * of Randall Munroe's 2010 \"Color Survey,\" released to the public\n * domain under CC0. Names are the most-common crowd-sourced name\n * for each color, including weird ones (\"poo brown\", \"baby puke\n * green\"). Keys are lowercase with spaces.\n *\n * Source: <https://xkcd.com/color/rgb.txt>. See NOTICE.md for\n * attribution details.\n */\nconst xkcdColors = {\n 'acid green': '#8ffe09',\n adobe: '#bd6c48',\n algae: '#54ac68',\n 'algae green': '#21c36f',\n 'almost black': '#070d0d',\n amber: '#feb308',\n amethyst: '#9b5fc0',\n apple: '#6ecb3c',\n 'apple green': '#76cd26',\n apricot: '#ffb16d',\n aqua: '#13eac9',\n 'aqua blue': '#02d8e9',\n 'aqua green': '#12e193',\n 'aqua marine': '#2ee8bb',\n 'army green': '#4b5d16',\n asparagus: '#77ab56',\n aubergine: '#3d0734',\n auburn: '#9a3001',\n avocado: '#90b134',\n 'avocado green': '#87a922',\n azul: '#1d5dec',\n azure: '#069af3',\n 'baby blue': '#a2cffe',\n 'baby green': '#8cff9e',\n 'baby pink': '#ffb7ce',\n 'baby poo': '#ab9004',\n 'baby poop': '#937c00',\n 'baby poop green': '#8f9805',\n 'baby puke green': '#b6c406',\n 'baby purple': '#ca9bf7',\n 'baby shit brown': '#ad900d',\n 'baby shit green': '#889717',\n banana: '#ffff7e',\n 'banana yellow': '#fafe4b',\n 'barbie pink': '#fe46a5',\n 'barf green': '#94ac02',\n barney: '#ac1db8',\n 'barney purple': '#a00498',\n 'battleship grey': '#6b7c85',\n beige: '#e6daa6',\n berry: '#990f4b',\n bile: '#b5c306',\n black: '#000000',\n bland: '#afa88b',\n blood: '#770001',\n 'blood orange': '#fe4b03',\n 'blood red': '#980002',\n blue: '#0343df',\n 'blue blue': '#2242c7',\n 'blue violet': '#5d06e9',\n 'blue with a hint of purple': '#533cc6',\n 'blue/green': '#0f9b8e',\n 'blue/purple': '#5a06ef',\n blueberry: '#464196',\n bluegrey: '#85a3b2',\n 'bluey green': '#2bb179',\n 'bluey grey': '#89a0b0',\n 'bluey purple': '#6241c7',\n bluish: '#2976bb',\n 'bluish green': '#10a674',\n 'bluish grey': '#748b97',\n 'bluish purple': '#703be7',\n blurple: '#5539cc',\n blush: '#f29e8e',\n 'blush pink': '#fe828c',\n booger: '#9bb53c',\n 'booger green': '#96b403',\n bordeaux: '#7b002c',\n 'boring green': '#63b365',\n 'bottle green': '#044a05',\n brick: '#a03623',\n 'brick orange': '#c14a09',\n 'brick red': '#8f1402',\n 'bright aqua': '#0bf9ea',\n 'bright blue': '#0165fc',\n 'bright cyan': '#41fdfe',\n 'bright green': '#01ff07',\n 'bright lavender': '#c760ff',\n 'bright light blue': '#26f7fd',\n 'bright light green': '#2dfe54',\n 'bright lilac': '#c95efb',\n 'bright lime': '#87fd05',\n 'bright lime green': '#65fe08',\n 'bright magenta': '#ff08e8',\n 'bright olive': '#9cbb04',\n 'bright orange': '#ff5b00',\n 'bright pink': '#fe01b1',\n 'bright purple': '#be03fd',\n 'bright red': '#ff000d',\n 'bright sea green': '#05ffa6',\n 'bright sky blue': '#02ccfe',\n 'bright teal': '#01f9c6',\n 'bright turquoise': '#0ffef9',\n 'bright violet': '#ad0afd',\n 'bright yellow': '#fffd01',\n 'bright yellow green': '#9dff00',\n 'british racing green': '#05480d',\n bronze: '#a87900',\n brown: '#653700',\n 'brown green': '#706c11',\n 'brown grey': '#8d8468',\n 'brown orange': '#b96902',\n 'brown red': '#922b05',\n 'brown yellow': '#b29705',\n brownish: '#9c6d57',\n 'brownish green': '#6a6e09',\n 'brownish grey': '#86775f',\n 'brownish orange': '#cb7723',\n 'brownish pink': '#c27e79',\n 'brownish purple': '#76424e',\n 'brownish red': '#9e3623',\n 'brownish yellow': '#c9b003',\n 'browny green': '#6f6c0a',\n 'browny orange': '#ca6b02',\n bruise: '#7e4071',\n 'bubble gum pink': '#ff69af',\n bubblegum: '#ff6cb5',\n buff: '#fef69e',\n burgundy: '#610023',\n 'burnt orange': '#c04e01',\n 'burnt red': '#9f2305',\n 'burnt siena': '#b75203',\n 'burnt sienna': '#b04e0f',\n 'burnt umber': '#a0450e',\n 'burnt yellow': '#d5ab09',\n burple: '#6832e3',\n butter: '#ffff81',\n 'butter yellow': '#fffd74',\n butterscotch: '#fdb147',\n 'cadet blue': '#4e7496',\n camel: '#c69f59',\n camo: '#7f8f4e',\n 'camo green': '#526525',\n 'camouflage green': '#4b6113',\n canary: '#fdff63',\n 'canary yellow': '#fffe40',\n 'candy pink': '#ff63e9',\n caramel: '#af6f09',\n carmine: '#9d0216',\n carnation: '#fd798f',\n 'carnation pink': '#ff7fa7',\n 'carolina blue': '#8ab8fe',\n celadon: '#befdb7',\n celery: '#c1fd95',\n cement: '#a5a391',\n cerise: '#de0c62',\n cerulean: '#0485d1',\n 'cerulean blue': '#056eee',\n charcoal: '#343837',\n 'charcoal grey': '#3c4142',\n chartreuse: '#c1f80a',\n cherry: '#cf0234',\n 'cherry red': '#f7022a',\n chestnut: '#742802',\n chocolate: '#3d1c02',\n 'chocolate brown': '#411900',\n cinnamon: '#ac4f06',\n claret: '#680018',\n clay: '#b66a50',\n 'clay brown': '#b2713d',\n 'clear blue': '#247afd',\n 'cloudy blue': '#acc2d9',\n cobalt: '#1e488f',\n 'cobalt blue': '#030aa7',\n cocoa: '#875f42',\n coffee: '#a6814c',\n 'cool blue': '#4984b8',\n 'cool green': '#33b864',\n 'cool grey': '#95a3a6',\n copper: '#b66325',\n coral: '#fc5a50',\n 'coral pink': '#ff6163',\n cornflower: '#6a79f7',\n 'cornflower blue': '#5170d7',\n cranberry: '#9e003a',\n cream: '#ffffc2',\n creme: '#ffffb6',\n crimson: '#8c000f',\n custard: '#fffd78',\n cyan: '#00ffff',\n dandelion: '#fedf08',\n dark: '#1b2431',\n 'dark aqua': '#05696b',\n 'dark aquamarine': '#017371',\n 'dark beige': '#ac9362',\n 'dark blue green': '#005249',\n 'dark blue grey': '#1f3b4d',\n 'dark brown': '#341c02',\n 'dark coral': '#cf524e',\n 'dark cream': '#fff39a',\n 'dark cyan': '#0a888a',\n 'dark forest green': '#002d04',\n 'dark fuchsia': '#9d0759',\n 'dark gold': '#b59410',\n 'dark grass green': '#388004',\n 'dark green blue': '#1f6357',\n 'dark grey': '#363737',\n 'dark grey blue': '#29465b',\n 'dark hot pink': '#d90166',\n 'dark indigo': '#1f0954',\n 'dark khaki': '#9b8f55',\n 'dark lavender': '#856798',\n 'dark lilac': '#9c6da5',\n 'dark lime': '#84b701',\n 'dark lime green': '#7ebd01',\n 'dark magenta': '#960056',\n 'dark maroon': '#3c0008',\n 'dark mauve': '#874c62',\n 'dark mint': '#48c072',\n 'dark mint green': '#20c073',\n 'dark mustard': '#a88905',\n 'dark navy': '#000435',\n 'dark navy blue': '#00022e',\n 'dark olive': '#373e02',\n 'dark olive green': '#3c4d03',\n 'dark orange': '#c65102',\n 'dark pastel green': '#56ae57',\n 'dark peach': '#de7e5d',\n 'dark periwinkle': '#665fd1',\n 'dark pink': '#cb416b',\n 'dark plum': '#3f012c',\n 'dark purple': '#35063e',\n 'dark red': '#840000',\n 'dark rose': '#b5485d',\n 'dark royal blue': '#02066f',\n 'dark sage': '#598556',\n 'dark salmon': '#c85a53',\n 'dark sand': '#a88f59',\n 'dark sea green': '#11875d',\n 'dark seafoam': '#1fb57a',\n 'dark seafoam green': '#3eaf76',\n 'dark sky blue': '#448ee4',\n 'dark slate blue': '#214761',\n 'dark tan': '#af884a',\n 'dark taupe': '#7f684e',\n 'dark teal': '#014d4e',\n 'dark turquoise': '#045c5a',\n 'dark violet': '#34013f',\n 'dark yellow': '#d5b60a',\n 'dark yellow green': '#728f02',\n darkblue: '#030764',\n darkgreen: '#054907',\n 'darkish blue': '#014182',\n 'darkish green': '#287c37',\n 'darkish pink': '#da467d',\n 'darkish purple': '#751973',\n 'darkish red': '#a90308',\n 'deep aqua': '#08787f',\n 'deep blue': '#040273',\n 'deep brown': '#410200',\n 'deep green': '#02590f',\n 'deep lavender': '#8d5eb7',\n 'deep lilac': '#966ebd',\n 'deep magenta': '#a0025c',\n 'deep orange': '#dc4d01',\n 'deep pink': '#cb0162',\n 'deep purple': '#36013f',\n 'deep red': '#9a0200',\n 'deep rose': '#c74767',\n 'deep sea blue': '#015482',\n 'deep sky blue': '#0d75f8',\n 'deep teal': '#00555a',\n 'deep turquoise': '#017374',\n 'deep violet': '#490648',\n denim: '#3b638c',\n 'denim blue': '#3b5b92',\n desert: '#ccad60',\n diarrhea: '#9f8303',\n dirt: '#8a6e45',\n 'dirt brown': '#836539',\n 'dirty blue': '#3f829d',\n 'dirty green': '#667e2c',\n 'dirty orange': '#c87606',\n 'dirty pink': '#ca7b80',\n 'dirty purple': '#734a65',\n 'dirty yellow': '#cdc50a',\n 'dodger blue': '#3e82fc',\n drab: '#828344',\n 'drab green': '#749551',\n 'dried blood': '#4b0101',\n 'duck egg blue': '#c3fbf4',\n 'dull blue': '#49759c',\n 'dull brown': '#876e4b',\n 'dull green': '#74a662',\n 'dull orange': '#d8863b',\n 'dull pink': '#d5869d',\n 'dull purple': '#84597e',\n 'dull red': '#bb3f3f',\n 'dull teal': '#5f9e8f',\n 'dull yellow': '#eedc5b',\n dusk: '#4e5481',\n 'dusk blue': '#26538d',\n 'dusky blue': '#475f94',\n 'dusky pink': '#cc7a8b',\n 'dusky purple': '#895b7b',\n 'dusky rose': '#ba6873',\n dust: '#b2996e',\n 'dusty blue': '#5a86ad',\n 'dusty green': '#76a973',\n 'dusty lavender': '#ac86a8',\n 'dusty orange': '#f0833a',\n 'dusty pink': '#d58a94',\n 'dusty purple': '#825f87',\n 'dusty red': '#b9484e',\n 'dusty rose': '#c0737a',\n 'dusty teal': '#4c9085',\n earth: '#a2653e',\n 'easter green': '#8cfd7e',\n 'easter purple': '#c071fe',\n ecru: '#feffca',\n 'egg shell': '#fffcc4',\n eggplant: '#380835',\n 'eggplant purple': '#430541',\n 'eggshell blue': '#c4fff7',\n 'electric blue': '#0652ff',\n 'electric green': '#21fc0d',\n 'electric lime': '#a8ff04',\n 'electric pink': '#ff0490',\n 'electric purple': '#aa23ff',\n emerald: '#01a049',\n 'emerald green': '#028f1e',\n evergreen: '#05472a',\n 'faded blue': '#658cbb',\n 'faded green': '#7bb274',\n 'faded orange': '#f0944d',\n 'faded pink': '#de9dac',\n 'faded purple': '#916e99',\n 'faded red': '#d3494e',\n 'faded yellow': '#feff7f',\n fawn: '#cfaf7b',\n fern: '#63a950',\n 'fern green': '#548d44',\n 'fire engine red': '#fe0002',\n 'flat blue': '#3c73a8',\n 'flat green': '#699d4c',\n 'fluorescent green': '#08ff08',\n 'fluro green': '#0aff02',\n 'foam green': '#90fda9',\n forest: '#0b5509',\n 'forest green': '#06470c',\n 'forrest green': '#154406',\n 'french blue': '#436bad',\n 'fresh green': '#69d84f',\n 'frog green': '#58bc08',\n fuchsia: '#ed0dd9',\n gold: '#dbb40c',\n golden: '#f5bf03',\n 'golden brown': '#b27a01',\n 'golden rod': '#f9bc08',\n 'golden yellow': '#fec615',\n grape: '#6c3461',\n 'grape purple': '#5d1451',\n grapefruit: '#fd5956',\n grass: '#5cac2d',\n 'grass green': '#3f9b0b',\n 'grassy green': '#419c03',\n green: '#15b01a',\n 'green apple': '#5edc1f',\n 'green brown': '#544e03',\n 'green grey': '#77926f',\n 'green teal': '#0cb577',\n 'green/blue': '#01c08d',\n 'green/yellow': '#b5ce08',\n greenish: '#40a368',\n 'greenish beige': '#c9d179',\n 'greenish blue': '#0b8b87',\n 'greenish brown': '#696112',\n 'greenish cyan': '#2afeb7',\n 'greenish grey': '#96ae8d',\n 'greenish tan': '#bccb7a',\n 'greenish teal': '#32bf84',\n 'greenish turquoise': '#00fbb0',\n 'greenish yellow': '#cdfd02',\n 'greeny blue': '#42b395',\n 'greeny brown': '#696006',\n 'greeny grey': '#7ea07a',\n 'greeny yellow': '#c6f808',\n grey: '#929591',\n 'grey brown': '#7f7053',\n 'grey pink': '#c3909b',\n 'grey purple': '#826d8c',\n 'grey teal': '#5e9b8a',\n 'grey/blue': '#647d8e',\n 'grey/green': '#86a17d',\n greyish: '#a8a495',\n 'greyish blue': '#5e819d',\n 'greyish brown': '#7a6a4f',\n 'greyish green': '#82a67d',\n 'greyish pink': '#c88d94',\n 'greyish purple': '#887191',\n 'greyish teal': '#719f91',\n 'gross green': '#a0bf16',\n gunmetal: '#536267',\n hazel: '#8e7618',\n heather: '#a484ac',\n heliotrope: '#d94ff5',\n 'highlighter green': '#1bfc06',\n 'hospital green': '#9be5aa',\n 'hot green': '#25ff29',\n 'hot magenta': '#f504c9',\n 'hot pink': '#ff028d',\n 'hot purple': '#cb00f5',\n 'hunter green': '#0b4008',\n ice: '#d6fffa',\n 'ice blue': '#d7fffe',\n 'icky green': '#8fae22',\n 'indian red': '#850e04',\n indigo: '#380282',\n 'indigo blue': '#3a18b1',\n iris: '#6258c4',\n 'irish green': '#019529',\n ivory: '#ffffcb',\n jade: '#1fa774',\n 'jade green': '#2baf6a',\n 'jungle green': '#048243',\n 'kelley green': '#009337',\n 'kelly green': '#02ab2e',\n 'kermit green': '#5cb200',\n 'key lime': '#aeff6e',\n khaki: '#aaa662',\n 'khaki green': '#728639',\n kiwi: '#9cef43',\n 'kiwi green': '#8ee53f',\n lavender: '#c79fef',\n 'lavender blue': '#8b88f8',\n 'lavender pink': '#dd85d7',\n 'lawn green': '#4da409',\n leaf: '#71aa34',\n 'leaf green': '#5ca904',\n 'leafy green': '#51b73b',\n leather: '#ac7434',\n lemon: '#fdff52',\n 'lemon green': '#adf802',\n 'lemon lime': '#bffe28',\n 'lemon yellow': '#fdff38',\n lichen: '#8fb67b',\n 'light aqua': '#8cffdb',\n 'light aquamarine': '#7bfdc7',\n 'light beige': '#fffeb6',\n 'light blue green': '#7efbb3',\n 'light blue grey': '#b7c9e2',\n 'light bluish green': '#76fda8',\n 'light bright green': '#53fe5c',\n 'light brown': '#ad8150',\n 'light burgundy': '#a8415b',\n 'light cyan': '#acfffc',\n 'light eggplant': '#894585',\n 'light forest green': '#4f9153',\n 'light gold': '#fddc5c',\n 'light grass green': '#9af764',\n 'light green blue': '#56fca2',\n 'light greenish blue': '#63f7b4',\n 'light grey': '#d8dcd6',\n 'light grey blue': '#9dbcd4',\n 'light grey green': '#b7e1a1',\n 'light indigo': '#6d5acf',\n 'light khaki': '#e6f2a2',\n 'light lavendar': '#efc0fe',\n 'light lavender': '#dfc5fe',\n 'light light blue': '#cafffb',\n 'light light green': '#c8ffb0',\n 'light lilac': '#edc8ff',\n 'light lime': '#aefd6c',\n 'light lime green': '#b9ff66',\n 'light magenta': '#fa5ff7',\n 'light maroon': '#a24857',\n 'light mauve': '#c292a1',\n 'light mint': '#b6ffbb',\n 'light mint green': '#a6fbb2',\n 'light moss green': '#a6c875',\n 'light mustard': '#f7d560',\n 'light navy': '#155084',\n 'light navy blue': '#2e5a88',\n 'light neon green': '#4efd54',\n 'light olive': '#acbf69',\n 'light olive green': '#a4be5c',\n 'light orange': '#fdaa48',\n 'light pastel green': '#b2fba5',\n 'light pea green': '#c4fe82',\n 'light peach': '#ffd8b1',\n 'light periwinkle': '#c1c6fc',\n 'light pink': '#ffd1df',\n 'light plum': '#9d5783',\n 'light purple': '#bf77f6',\n 'light red': '#ff474c',\n 'light rose': '#ffc5cb',\n 'light royal blue': '#3a2efe',\n 'light sage': '#bcecac',\n 'light salmon': '#fea993',\n 'light sea green': '#98f6b0',\n 'light seafoam': '#a0febf',\n 'light seafoam green': '#a7ffb5',\n 'light sky blue': '#c6fcff',\n 'light tan': '#fbeeac',\n 'light teal': '#90e4c1',\n 'light turquoise': '#7ef4cc',\n 'light urple': '#b36ff6',\n 'light violet': '#d6b4fc',\n 'light yellow': '#fffe7a',\n 'light yellow green': '#ccfd7f',\n 'light yellowish green': '#c2ff89',\n lightblue: '#7bc8f6',\n 'lighter green': '#75fd63',\n 'lighter purple': '#a55af4',\n lightgreen: '#76ff7b',\n 'lightish blue': '#3d7afd',\n 'lightish green': '#61e160',\n 'lightish purple': '#a552e6',\n 'lightish red': '#fe2f4a',\n lilac: '#cea2fd',\n liliac: '#c48efd',\n lime: '#aaff32',\n 'lime green': '#89fe05',\n 'lime yellow': '#d0fe1d',\n lipstick: '#d5174e',\n 'lipstick red': '#c0022f',\n 'macaroni and cheese': '#efb435',\n magenta: '#c20078',\n mahogany: '#4a0100',\n maize: '#f4d054',\n mango: '#ffa62b',\n manilla: '#fffa86',\n marigold: '#fcc006',\n marine: '#042e60',\n 'marine blue': '#01386a',\n maroon: '#650021',\n mauve: '#ae7181',\n 'medium blue': '#2c6fbb',\n 'medium brown': '#7f5112',\n 'medium green': '#39ad48',\n 'medium grey': '#7d7f7c',\n 'medium pink': '#f36196',\n 'medium purple': '#9e43a2',\n melon: '#ff7855',\n merlot: '#730039',\n 'metallic blue': '#4f738e',\n 'mid blue': '#276ab3',\n 'mid green': '#50a747',\n midnight: '#03012d',\n 'midnight blue': '#020035',\n 'midnight purple': '#280137',\n 'military green': '#667c3e',\n 'milk chocolate': '#7f4e1e',\n mint: '#9ffeb0',\n 'mint green': '#8fff9f',\n 'minty green': '#0bf77d',\n mocha: '#9d7651',\n moss: '#769958',\n 'moss green': '#658b38',\n 'mossy green': '#638b27',\n mud: '#735c12',\n 'mud brown': '#60460f',\n 'mud green': '#606602',\n 'muddy brown': '#886806',\n 'muddy green': '#657432',\n 'muddy yellow': '#bfac05',\n mulberry: '#920a4e',\n 'murky green': '#6c7a0e',\n mushroom: '#ba9e88',\n mustard: '#ceb301',\n 'mustard brown': '#ac7e04',\n 'mustard green': '#a8b504',\n 'mustard yellow': '#d2bd0a',\n 'muted blue': '#3b719f',\n 'muted green': '#5fa052',\n 'muted pink': '#d1768f',\n 'muted purple': '#805b87',\n 'nasty green': '#70b23f',\n navy: '#01153e',\n 'navy blue': '#001146',\n 'navy green': '#35530a',\n 'neon blue': '#04d9ff',\n 'neon green': '#0cff0c',\n 'neon pink': '#fe019a',\n 'neon purple': '#bc13fe',\n 'neon red': '#ff073a',\n 'neon yellow': '#cfff04',\n 'nice blue': '#107ab0',\n 'night blue': '#040348',\n ocean: '#017b92',\n 'ocean blue': '#03719c',\n 'ocean green': '#3d9973',\n ocher: '#bf9b0c',\n ochre: '#bf9005',\n ocre: '#c69c04',\n 'off blue': '#5684ae',\n 'off green': '#6ba353',\n 'off white': '#ffffe4',\n 'off yellow': '#f1f33f',\n 'old pink': '#c77986',\n 'old rose': '#c87f89',\n olive: '#6e750e',\n 'olive brown': '#645403',\n 'olive drab': '#6f7632',\n 'olive green': '#677a04',\n 'olive yellow': '#c2b709',\n orange: '#f97306',\n 'orange brown': '#be6400',\n 'orange pink': '#ff6f52',\n 'orange yellow': '#ffad01',\n orangeish: '#fd8d49',\n orangered: '#fe420f',\n 'orangey brown': '#b16002',\n 'orangey red': '#fa4224',\n 'orangey yellow': '#fdb915',\n orangish: '#fc824a',\n 'orangish brown': '#b25f03',\n 'orangish red': '#f43605',\n orchid: '#c875c4',\n pale: '#fff9d0',\n 'pale aqua': '#b8ffeb',\n 'pale blue': '#d0fefe',\n 'pale brown': '#b1916e',\n 'pale cyan': '#b7fffa',\n 'pale gold': '#fdde6c',\n 'pale green': '#c7fdb5',\n 'pale grey': '#fdfdfe',\n 'pale lavender': '#eecffe',\n 'pale light green': '#b1fc99',\n 'pale lilac': '#e4cbff',\n 'pale lime': '#befd73',\n 'pale lime green': '#b1ff65',\n 'pale magenta': '#d767ad',\n 'pale mauve': '#fed0fc',\n 'pale olive': '#b9cc81',\n 'pale olive green': '#b1d27b',\n 'pale orange': '#ffa756',\n 'pale peach': '#ffe5ad',\n 'pale pink': '#ffcfdc',\n 'pale purple': '#b790d4',\n 'pale red': '#d9544d',\n 'pale rose': '#fdc1c5',\n 'pale salmon': '#ffb19a',\n 'pale sky blue': '#bdf6fe',\n 'pale teal': '#82cbb2',\n 'pale turquoise': '#a5fbd5',\n 'pale violet': '#ceaefa',\n 'pale yellow': '#ffff84',\n parchment: '#fefcaf',\n 'pastel blue': '#a2bffe',\n 'pastel green': '#b0ff9d',\n 'pastel orange': '#ff964f',\n 'pastel pink': '#ffbacd',\n 'pastel purple': '#caa0ff',\n 'pastel red': '#db5856',\n 'pastel yellow': '#fffe71',\n pea: '#a4bf20',\n 'pea green': '#8eab12',\n 'pea soup': '#929901',\n 'pea soup green': '#94a617',\n peach: '#ffb07c',\n 'peachy pink': '#ff9a8a',\n 'peacock blue': '#016795',\n pear: '#cbf85f',\n periwinkle: '#8e82fe',\n 'periwinkle blue': '#8f99fb',\n perrywinkle: '#8f8ce7',\n petrol: '#005f6a',\n 'pig pink': '#e78ea5',\n pine: '#2b5d34',\n 'pine green': '#0a481e',\n pink: '#ff81c0',\n 'pink red': '#f5054f',\n 'pink/purple': '#ef1de7',\n pinkish: '#d46a7e',\n 'pinkish brown': '#b17261',\n 'pinkish grey': '#c8aca9',\n 'pinkish orange': '#ff724c',\n 'pinkish purple': '#d648d7',\n 'pinkish red': '#f10c45',\n 'pinkish tan': '#d99b82',\n pinky: '#fc86aa',\n 'pinky purple': '#c94cbe',\n 'pinky red': '#fc2647',\n 'piss yellow': '#ddd618',\n pistachio: '#c0fa8b',\n plum: '#580f41',\n 'plum purple': '#4e0550',\n 'poison green': '#40fd14',\n poo: '#8f7303',\n 'poo brown': '#885f01',\n poop: '#7f5e00',\n 'poop brown': '#7a5901',\n 'poop green': '#6f7c00',\n 'powder blue': '#b1d1fc',\n 'powder pink': '#ffb2d0',\n 'primary blue': '#0804f9',\n 'prussian blue': '#004577',\n puce: '#a57e52',\n puke: '#a5a502',\n 'puke brown': '#947706',\n 'puke green': '#9aae07',\n 'puke yellow': '#c2be0e',\n pumpkin: '#e17701',\n 'pumpkin orange': '#fb7d07',\n 'pure blue': '#0203e2',\n purple: '#7e1e9c',\n 'purple brown': '#673a3f',\n 'purple grey': '#866f85',\n 'purple red': '#990147',\n 'purple/blue': '#5d21d0',\n 'purple/pink': '#d725de',\n purpleish: '#98568d',\n 'purpleish blue': '#6140ef',\n 'purpleish pink': '#df4ec8',\n purpley: '#8756e4',\n 'purpley blue': '#5f34e7',\n 'purpley grey': '#947e94',\n 'purpley pink': '#c83cb9',\n purplish: '#94568c',\n 'purplish blue': '#601ef9',\n 'purplish brown': '#6b4247',\n 'purplish grey': '#7a687f',\n 'purplish pink': '#ce5dae',\n 'purplish red': '#b0054b',\n purply: '#983fb2',\n 'purply blue': '#661aee',\n 'purply pink': '#f075e6',\n putty: '#beae8a',\n 'racing green': '#014600',\n 'radioactive green': '#2cfa1f',\n raspberry: '#b00149',\n 'raw sienna': '#9a6200',\n 'raw umber': '#a75e09',\n 'really light blue': '#d4ffff',\n red: '#e50000',\n 'red brown': '#8b2e16',\n 'red orange': '#fd3c06',\n 'red pink': '#fa2a55',\n 'red purple': '#820747',\n 'red violet': '#9e0168',\n 'red wine': '#8c0034',\n reddish: '#c44240',\n 'reddish brown': '#7f2b0a',\n 'reddish grey': '#997570',\n 'reddish orange': '#f8481c',\n 'reddish pink': '#fe2c54',\n 'reddish purple': '#910951',\n 'reddy brown': '#6e1005',\n 'rich blue': '#021bf9',\n 'rich purple': '#720058',\n 'robin egg blue': '#8af1fe',\n \"robin's egg\": '#6dedfd',\n \"robin's egg blue\": '#98eff9',\n rosa: '#fe86a4',\n rose: '#cf6275',\n 'rose pink': '#f7879a',\n 'rose red': '#be013c',\n 'rosy pink': '#f6688e',\n rouge: '#ab1239',\n royal: '#0c1793',\n 'royal blue': '#0504aa',\n 'royal purple': '#4b006e',\n ruby: '#ca0147',\n russet: '#a13905',\n rust: '#a83c09',\n 'rust brown': '#8b3103',\n 'rust orange': '#c45508',\n 'rust red': '#aa2704',\n 'rusty orange': '#cd5909',\n 'rusty red': '#af2f0d',\n saffron: '#feb209',\n sage: '#87ae73',\n 'sage green': '#88b378',\n salmon: '#ff796c',\n 'salmon pink': '#fe7b7c',\n sand: '#e2ca76',\n 'sand brown': '#cba560',\n 'sand yellow': '#fce166',\n sandstone: '#c9ae74',\n sandy: '#f1da7a',\n 'sandy brown': '#c4a661',\n 'sandy yellow': '#fdee73',\n 'sap green': '#5c8b15',\n sapphire: '#2138ab',\n scarlet: '#be0119',\n sea: '#3c9992',\n 'sea blue': '#047495',\n 'sea green': '#53fca1',\n seafoam: '#80f9ad',\n 'seafoam blue': '#78d1b6',\n 'seafoam green': '#7af9ab',\n seaweed: '#18d17b',\n 'seaweed green': '#35ad6b',\n sepia: '#985e2b',\n shamrock: '#01b44c',\n 'shamrock green': '#02c14d',\n shit: '#7f5f00',\n 'shit brown': '#7b5804',\n 'shit green': '#758000',\n 'shocking pink': '#fe02a2',\n 'sick green': '#9db92c',\n 'sickly green': '#94b21c',\n 'sickly yellow': '#d0e429',\n sienna: '#a9561e',\n silver: '#c5c9c7',\n sky: '#82cafc',\n 'sky blue': '#75bbfd',\n slate: '#516572',\n 'slate blue': '#5b7c99',\n 'slate green': '#658d6d',\n 'slate grey': '#59656d',\n 'slime green': '#99cc04',\n snot: '#acbb0d',\n 'snot green': '#9dc100',\n 'soft blue': '#6488ea',\n 'soft green': '#6fc276',\n 'soft pink': '#fdb0c0',\n 'soft purple': '#a66fb5',\n spearmint: '#1ef876',\n 'spring green': '#a9f971',\n spruce: '#0a5f38',\n squash: '#f2ab15',\n steel: '#738595',\n 'steel blue': '#5a7d9a',\n 'steel grey': '#6f828a',\n stone: '#ada587',\n 'stormy blue': '#507b9c',\n straw: '#fcf679',\n strawberry: '#fb2943',\n 'strong blue': '#0c06f7',\n 'strong pink': '#ff0789',\n 'sun yellow': '#ffdf22',\n sunflower: '#ffc512',\n 'sunflower yellow': '#ffda03',\n 'sunny yellow': '#fff917',\n 'sunshine yellow': '#fffd37',\n swamp: '#698339',\n 'swamp green': '#748500',\n tan: '#d1b26f',\n 'tan brown': '#ab7e4c',\n 'tan green': '#a9be70',\n tangerine: '#ff9408',\n taupe: '#b9a281',\n tea: '#65ab7c',\n 'tea green': '#bdf8a3',\n teal: '#029386',\n 'teal blue': '#01889f',\n 'teal green': '#25a36f',\n tealish: '#24bca8',\n 'tealish green': '#0cdc73',\n 'terra cotta': '#c9643b',\n terracota: '#cb6843',\n 'tiffany blue': '#7bf2da',\n tomato: '#ef4026',\n 'tomato red': '#ec2d01',\n topaz: '#13bbaf',\n toupe: '#c7ac7d',\n 'toxic green': '#61de2a',\n 'tree green': '#2a7e19',\n 'true blue': '#010fcc',\n 'true green': '#089404',\n turquoise: '#06c2ac',\n 'turquoise blue': '#06b1c4',\n 'turquoise green': '#04f489',\n 'turtle green': '#75b84f',\n twilight: '#4e518b',\n 'twilight blue': '#0a437a',\n 'ugly blue': '#31668a',\n 'ugly brown': '#7d7103',\n 'ugly green': '#7a9703',\n 'ugly pink': '#cd7584',\n 'ugly purple': '#a442a0',\n 'ugly yellow': '#d0c101',\n ultramarine: '#2000b1',\n 'ultramarine blue': '#1805db',\n umber: '#b26400',\n velvet: '#750851',\n vermillion: '#f4320c',\n 'very dark blue': '#000133',\n 'very dark brown': '#1d0200',\n 'very dark green': '#062e03',\n 'very dark purple': '#2a0134',\n 'very light blue': '#d5ffff',\n 'very light brown': '#d3b683',\n 'very light green': '#d1ffbd',\n 'very light pink': '#fff4f2',\n 'very light purple': '#f6cefc',\n 'very pale blue': '#d6fffe',\n 'very pale green': '#cffdbc',\n 'vibrant blue': '#0339f8',\n 'vibrant green': '#0add08',\n 'vibrant purple': '#ad03de',\n violet: '#9a0eea',\n 'violet blue': '#510ac9',\n 'violet pink': '#fb5ffc',\n 'violet red': '#a50055',\n viridian: '#1e9167',\n 'vivid blue': '#152eff',\n 'vivid green': '#2fef10',\n 'vivid purple': '#9900fa',\n vomit: '#a2a415',\n 'vomit green': '#89a203',\n 'vomit yellow': '#c7c10c',\n 'warm blue': '#4b57db',\n 'warm brown': '#964e02',\n 'warm grey': '#978a84',\n 'warm pink': '#fb5581',\n 'warm purple': '#952e8f',\n 'washed out green': '#bcf5a6',\n 'water blue': '#0e87cc',\n watermelon: '#fd4659',\n 'weird green': '#3ae57f',\n wheat: '#fbdd7e',\n white: '#ffffff',\n 'windows blue': '#3778bf',\n wine: '#80013f',\n 'wine red': '#7b0323',\n wintergreen: '#20f986',\n wisteria: '#a87dc2',\n yellow: '#ffff14',\n 'yellow brown': '#b79400',\n 'yellow ochre': '#cb9d06',\n 'yellow orange': '#fcb001',\n 'yellow tan': '#ffe36e',\n yellowgreen: '#bbf90f',\n yellowish: '#faee66',\n 'yellowish brown': '#9b7a01',\n 'yellowish green': '#b0dd16',\n 'yellowish orange': '#ffab0f',\n 'yellowish tan': '#fcfc81',\n 'yellowy brown': '#ae8b0c',\n 'yellowy green': '#bff128',\n} as const;\n\nexport type XkcdColorName = keyof typeof xkcdColors;\n\n/**\n * XKCD 2010 Color Survey: crowd-sourced common-speech color\n * names (923 entries, CC0 public domain). Earthy,\n * muted, and sometimes irreverent ('baby puke green', 'poo\n * brown'). Default metric CIEDE2000 for consistent nearest-\n * match behavior across the survey's full-gamut coverage.\n *\n * @example\n * identify('#b2996e', { palette: xkcd }); // 'dust'\n * resolve('cloudy blue', { palette: xkcd }); // '#acc2d9'\n * xkcd.colors['baby puke green']; // '#b6c406'\n */\nexport const xkcd = {\n name: 'xkcd',\n colors: xkcdColors,\n normalize: standardNormalize,\n defaultMetric: 'deltaE2000',\n} as const satisfies Palette<XkcdColorName>;\n"]}
package/dist/resolve.d.ts CHANGED
@@ -1,11 +1,9 @@
1
1
  import { web } from './palettes/web.js';
2
- import type { ColorFormat, ColorValue, Palette } from './types.js';
3
- /** Extract string keys from a Palette's `colors` map. */
4
- type PaletteKey<P extends Palette> = Extract<keyof P['colors'], string>;
2
+ import type { ColorFormat, ColorValue, Palette, PaletteKey } from './types.js';
5
3
  /**
6
4
  * One ranked fuzzy-match entry when `resolve` is called with `k`.
7
5
  * `distance` is the Levenshtein edit distance between the normalized
8
- * input and the normalized palette key — integer count of insertions,
6
+ * input and the normalized palette key: an integer count of insertions,
9
7
  * deletions, and substitutions.
10
8
  */
11
9
  export type ResolveMatch<Name extends string> = {
@@ -13,6 +11,54 @@ export type ResolveMatch<Name extends string> = {
13
11
  readonly value: ColorValue;
14
12
  readonly distance: number;
15
13
  };
14
+ /**
15
+ * Options for the strict variant of {@link resolve}. Generic over the
16
+ * palette so the caller sees narrow inference on `opts.palette` (same
17
+ * pattern as {@link IdentifyOptions}).
18
+ *
19
+ * @example
20
+ * resolve('Pantone 185 C', { palette: pantone });
21
+ * resolve('rebeccapurple', { format: 'RGB' });
22
+ */
23
+ export type ResolveOptions<P extends Palette = typeof web> = {
24
+ /**
25
+ * Palette to look the name up in. Defaults to `web` (CSS named colors).
26
+ */
27
+ readonly palette?: P;
28
+ /**
29
+ * Output format for the matched color. Defaults to `'HEX'`.
30
+ */
31
+ readonly format?: ColorFormat;
32
+ };
33
+ /**
34
+ * Options for the fuzzy (top-k) variant of {@link resolve}. Returns an
35
+ * array of {@link ResolveMatch} entries ranked by edit distance.
36
+ *
37
+ * @example
38
+ * resolve('rebecapurple', { palette: web, k: 3 });
39
+ * // [
40
+ * // { name: 'rebeccapurple', value: '#663399', distance: 1 },
41
+ * // { name: 'purple', value: '#800080', distance: 6 },
42
+ * // ...
43
+ * // ]
44
+ */
45
+ export type ResolveFuzzyOptions<P extends Palette = typeof web> = {
46
+ /**
47
+ * Palette to search. Generic so the return narrows to the palette's
48
+ * literal-key union.
49
+ */
50
+ readonly palette?: P;
51
+ /**
52
+ * Output format for each matched `value`. Defaults to `'HEX'`.
53
+ */
54
+ readonly format?: ColorFormat;
55
+ /**
56
+ * Number of ranked matches to return. When present, `resolve` runs in
57
+ * typo-tolerant mode (Levenshtein edit distance against normalized
58
+ * keys) and returns `ResolveMatch[]` instead of a single value.
59
+ */
60
+ readonly k: number;
61
+ };
16
62
  /**
17
63
  * Resolve a human-readable name to a color. Normalizes the input using
18
64
  * the palette's own `normalize` function before looking it up.
@@ -34,16 +80,14 @@ export type ResolveMatch<Name extends string> = {
34
80
  * // ...]
35
81
  * ```
36
82
  *
83
+ * Tie-breaking on equal edit distance: first-declared entry in the
84
+ * palette's `colors` object wins. Matches `identify`'s contract.
85
+ *
86
+ * `k` is forgiving: fractional rounds, negatives and zero return
87
+ * `[]`, `NaN` / `±Infinity` return `[]`. No throws on invalid `k`.
88
+ *
37
89
  * Defaults: palette = `web`, format = 'HEX', `k` = undefined (strict).
38
90
  */
39
- export declare function resolve(name: string, opts?: {
40
- palette?: Palette;
41
- format?: ColorFormat;
42
- }): ColorValue | null;
43
- export declare function resolve<P extends Palette = typeof web>(name: string, opts: {
44
- palette?: P;
45
- format?: ColorFormat;
46
- k: number;
47
- }): Array<ResolveMatch<PaletteKey<P>>>;
48
- export {};
91
+ export declare function resolve<P extends Palette = typeof web>(name: string, opts?: ResolveOptions<P>): ColorValue | null;
92
+ export declare function resolve<P extends Palette = typeof web>(name: string, opts: ResolveFuzzyOptions<P>): Array<ResolveMatch<PaletteKey<P>>>;
49
93
  //# sourceMappingURL=resolve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAY,OAAO,EAAE,MAAM,YAAY,CAAC;AAO7E,yDAAyD;AACzD,KAAK,UAAU,CAAC,CAAC,SAAS,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAExE;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,MAAM,IAAI;IAC9C,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACjD,UAAU,GAAG,IAAI,CAAC;AAGrB,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,GAAG,EACpD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC","sourcesContent":["import { hexToRgba } from './conversions/hex.js';\nimport { fromRgba } from './convert.js';\nimport { getNameIndex } from './indexing.js';\nimport { levenshtein } from './math/editDistance.js';\nimport { web } from './palettes/web.js';\nimport type { ColorFormat, ColorValue, HexColor, Palette } from './types.js';\n\n// No built-in palette key exceeds ~30 chars post-normalize; anything well past\n// that can't plausibly win a fuzzy match and risks pathological O(n·m) cost\n// across every palette entry. Guard the k-branch input at 64.\nconst MAX_FUZZY_INPUT_LENGTH = 64;\n\n/** Extract string keys from a Palette's `colors` map. */\ntype PaletteKey<P extends Palette> = Extract<keyof P['colors'], string>;\n\n/**\n * One ranked fuzzy-match entry when `resolve` is called with `k`.\n * `distance` is the Levenshtein edit distance between the normalized\n * input and the normalized palette key — integer count of insertions,\n * deletions, and substitutions.\n */\nexport type ResolveMatch<Name extends string> = {\n readonly name: Name;\n readonly value: ColorValue;\n readonly distance: number;\n};\n\n/**\n * Resolve a human-readable name to a color. Normalizes the input using\n * the palette's own `normalize` function before looking it up.\n *\n * **Without `k`** (strict, unchanged): returns the exact match value, or\n * `null` if the normalized name isn't in the palette.\n *\n * **With `k`** (fuzzy, typo-tolerant): returns an array of the top `k`\n * matches ranked by Levenshtein edit distance against normalized keys.\n * Useful for user-typed input where misspellings, casing, and\n * punctuation can all be recovered.\n *\n * ```ts\n * resolve('rebeccapurple') // '#663399'\n * resolve('rebecapurple') // null (strict)\n * resolve('rebecapurple', { palette: web, k: 3 }) // fuzzy:\n * // [{ name: 'rebeccapurple', value: '#663399', distance: 1 },\n * // { name: 'purple', value: '#800080', distance: 6 },\n * // ...]\n * ```\n *\n * Defaults: palette = `web`, format = 'HEX', `k` = undefined (strict).\n */\n\n// Overload 1: strict — single ColorValue or null (unchanged).\nexport function resolve(\n name: string,\n opts?: { palette?: Palette; format?: ColorFormat },\n): ColorValue | null;\n\n// Overload 2: fuzzy top-k — ranked Match[].\nexport function resolve<P extends Palette = typeof web>(\n name: string,\n opts: { palette?: P; format?: ColorFormat; k: number },\n): Array<ResolveMatch<PaletteKey<P>>>;\n\n// Implementation.\nexport function resolve(\n name: string,\n opts: { palette?: Palette; format?: ColorFormat; k?: number } = {},\n): ColorValue | null | Array<ResolveMatch<string>> {\n const palette = opts.palette ?? web;\n const format = opts.format ?? 'HEX';\n const normalized = palette.normalize(name);\n\n if (opts.k !== undefined) {\n const limit = Math.max(0, opts.k);\n if (limit === 0) return [];\n if (normalized.length > MAX_FUZZY_INPUT_LENGTH) return [];\n // Iterate the name index's normalized → canonical map once; for each\n // entry compute Levenshtein from the user's normalized input.\n const ranked: Array<[string, number]> = [];\n for (const [normalizedKey, canonical] of getNameIndex(palette).entries()) {\n ranked.push([canonical, levenshtein(normalized, normalizedKey)]);\n }\n ranked.sort((a, b) => a[1] - b[1]);\n const out: Array<ResolveMatch<string>> = [];\n const take = Math.min(limit, ranked.length);\n for (let i = 0; i < take; i++) {\n const entry = ranked[i];\n if (entry === undefined) continue;\n const hex = (palette.colors as Record<string, HexColor>)[entry[0]];\n if (hex === undefined) continue;\n out.push({\n name: entry[0],\n value: fromRgba(hexToRgba(hex), format),\n distance: entry[1],\n });\n }\n return out;\n }\n\n // Strict path.\n const canonical = getNameIndex(palette).get(normalized);\n if (canonical === undefined) return null;\n const hex = (palette.colors as Record<string, HexColor>)[canonical];\n if (hex === undefined) return null;\n return fromRgba(hexToRgba(hex), format);\n}\n"]}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAY,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAOzF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,MAAM,IAAI;IAC9C,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,GAAG,IAAI;IAC3D;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,GAAG,IAAI;IAChE;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,GAAG,EACpD,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GACvB,UAAU,GAAG,IAAI,CAAC;AAGrB,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,GAAG,EACpD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC3B,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC","sourcesContent":["import { hexToRgba } from './conversions/hex.js';\nimport { fromRgba } from './convert.js';\nimport { getNameIndex } from './indexing.js';\nimport { levenshtein } from './math/editDistance.js';\nimport { web } from './palettes/web.js';\nimport type { ColorFormat, ColorValue, HexColor, Palette, PaletteKey } from './types.js';\n\n// No built-in palette key exceeds ~30 chars post-normalize; anything well past\n// that can't plausibly win a fuzzy match and risks pathological O(n·m) cost\n// across every palette entry. Guard the k-branch input at 64.\nconst MAX_FUZZY_INPUT_LENGTH = 64;\n\n/**\n * One ranked fuzzy-match entry when `resolve` is called with `k`.\n * `distance` is the Levenshtein edit distance between the normalized\n * input and the normalized palette key: an integer count of insertions,\n * deletions, and substitutions.\n */\nexport type ResolveMatch<Name extends string> = {\n readonly name: Name;\n readonly value: ColorValue;\n readonly distance: number;\n};\n\n/**\n * Options for the strict variant of {@link resolve}. Generic over the\n * palette so the caller sees narrow inference on `opts.palette` (same\n * pattern as {@link IdentifyOptions}).\n *\n * @example\n * resolve('Pantone 185 C', { palette: pantone });\n * resolve('rebeccapurple', { format: 'RGB' });\n */\nexport type ResolveOptions<P extends Palette = typeof web> = {\n /**\n * Palette to look the name up in. Defaults to `web` (CSS named colors).\n */\n readonly palette?: P;\n /**\n * Output format for the matched color. Defaults to `'HEX'`.\n */\n readonly format?: ColorFormat;\n};\n\n/**\n * Options for the fuzzy (top-k) variant of {@link resolve}. Returns an\n * array of {@link ResolveMatch} entries ranked by edit distance.\n *\n * @example\n * resolve('rebecapurple', { palette: web, k: 3 });\n * // [\n * // { name: 'rebeccapurple', value: '#663399', distance: 1 },\n * // { name: 'purple', value: '#800080', distance: 6 },\n * // ...\n * // ]\n */\nexport type ResolveFuzzyOptions<P extends Palette = typeof web> = {\n /**\n * Palette to search. Generic so the return narrows to the palette's\n * literal-key union.\n */\n readonly palette?: P;\n /**\n * Output format for each matched `value`. Defaults to `'HEX'`.\n */\n readonly format?: ColorFormat;\n /**\n * Number of ranked matches to return. When present, `resolve` runs in\n * typo-tolerant mode (Levenshtein edit distance against normalized\n * keys) and returns `ResolveMatch[]` instead of a single value.\n */\n readonly k: number;\n};\n\n/**\n * Resolve a human-readable name to a color. Normalizes the input using\n * the palette's own `normalize` function before looking it up.\n *\n * **Without `k`** (strict, unchanged): returns the exact match value, or\n * `null` if the normalized name isn't in the palette.\n *\n * **With `k`** (fuzzy, typo-tolerant): returns an array of the top `k`\n * matches ranked by Levenshtein edit distance against normalized keys.\n * Useful for user-typed input where misspellings, casing, and\n * punctuation can all be recovered.\n *\n * ```ts\n * resolve('rebeccapurple') // '#663399'\n * resolve('rebecapurple') // null (strict)\n * resolve('rebecapurple', { palette: web, k: 3 }) // fuzzy:\n * // [{ name: 'rebeccapurple', value: '#663399', distance: 1 },\n * // { name: 'purple', value: '#800080', distance: 6 },\n * // ...]\n * ```\n *\n * Tie-breaking on equal edit distance: first-declared entry in the\n * palette's `colors` object wins. Matches `identify`'s contract.\n *\n * `k` is forgiving: fractional rounds, negatives and zero return\n * `[]`, `NaN` / `±Infinity` return `[]`. No throws on invalid `k`.\n *\n * Defaults: palette = `web`, format = 'HEX', `k` = undefined (strict).\n */\n\n// Overload 1: strict — single ColorValue or null (unchanged).\nexport function resolve<P extends Palette = typeof web>(\n name: string,\n opts?: ResolveOptions<P>,\n): ColorValue | null;\n\n// Overload 2: fuzzy top-k — ranked Match[].\nexport function resolve<P extends Palette = typeof web>(\n name: string,\n opts: ResolveFuzzyOptions<P>,\n): Array<ResolveMatch<PaletteKey<P>>>;\n\n// Implementation.\nexport function resolve(\n name: string,\n opts: ResolveOptions & { k?: number } = {},\n): ColorValue | null | Array<ResolveMatch<string>> {\n const palette = opts.palette ?? web;\n const format = opts.format ?? 'HEX';\n const normalized = palette.normalize(name);\n\n if (opts.k !== undefined) {\n // k normalization — same contract as `identify`'s top-k path:\n // fractional rounds, negative clamps to 0, NaN/±Infinity collapse\n // to 0 (empty result). Prior code crashed on NaN / fractional via\n // `new Array(NaN)`; the `Number.isFinite` guard fixes that.\n const safeK = Number.isFinite(opts.k) ? Math.max(0, Math.round(opts.k)) : 0;\n if (safeK === 0) return [];\n if (normalized.length > MAX_FUZZY_INPUT_LENGTH) return [];\n\n const index = getNameIndex(palette).entries();\n // Bounded insertion-sort window, keyed on Levenshtein distance.\n // See the twin comment in indexing.ts nearestAll for the full\n // rationale. Levenshtein per comparison is heavier than ΔE, so\n // the per-entry distance math dominates more than on identify,\n // but the allocation savings still help at k << palette size.\n const best: Array<[string, number]> = [];\n for (const [normalizedKey, canonical] of index) {\n const d = levenshtein(normalized, normalizedKey);\n if (best.length < safeK) {\n let j = best.length;\n while (j > 0 && (best[j - 1] as [string, number])[1] > d) j--;\n best.splice(j, 0, [canonical, d]);\n } else if (d < (best[safeK - 1] as [string, number])[1]) {\n let j = safeK - 1;\n while (j > 0 && (best[j - 1] as [string, number])[1] > d) j--;\n best.splice(j, 0, [canonical, d]);\n best.pop();\n }\n }\n\n const out: Array<ResolveMatch<string>> = [];\n for (const [canonical, d] of best) {\n const hex = (palette.colors as Record<string, HexColor>)[canonical];\n if (hex === undefined) continue;\n out.push({\n name: canonical,\n value: fromRgba(hexToRgba(hex), format),\n distance: d,\n });\n }\n return out;\n }\n\n // Strict path.\n const canonical = getNameIndex(palette).get(normalized);\n if (canonical === undefined) return null;\n const hex = (palette.colors as Record<string, HexColor>)[canonical];\n if (hex === undefined) return null;\n return fromRgba(hexToRgba(hex), format);\n}\n"]}
package/dist/resolve.js CHANGED
@@ -13,31 +13,47 @@ export function resolve(name, opts = {}) {
13
13
  const format = opts.format ?? 'HEX';
14
14
  const normalized = palette.normalize(name);
15
15
  if (opts.k !== undefined) {
16
- const limit = Math.max(0, opts.k);
17
- if (limit === 0)
16
+ // k normalization — same contract as `identify`'s top-k path:
17
+ // fractional rounds, negative clamps to 0, NaN/±Infinity collapse
18
+ // to 0 (empty result). Prior code crashed on NaN / fractional via
19
+ // `new Array(NaN)`; the `Number.isFinite` guard fixes that.
20
+ const safeK = Number.isFinite(opts.k) ? Math.max(0, Math.round(opts.k)) : 0;
21
+ if (safeK === 0)
18
22
  return [];
19
23
  if (normalized.length > MAX_FUZZY_INPUT_LENGTH)
20
24
  return [];
21
- // Iterate the name index's normalized → canonical map once; for each
22
- // entry compute Levenshtein from the user's normalized input.
23
- const ranked = [];
24
- for (const [normalizedKey, canonical] of getNameIndex(palette).entries()) {
25
- ranked.push([canonical, levenshtein(normalized, normalizedKey)]);
25
+ const index = getNameIndex(palette).entries();
26
+ // Bounded insertion-sort window, keyed on Levenshtein distance.
27
+ // See the twin comment in indexing.ts nearestAll for the full
28
+ // rationale. Levenshtein per comparison is heavier than ΔE, so
29
+ // the per-entry distance math dominates more than on identify,
30
+ // but the allocation savings still help at k << palette size.
31
+ const best = [];
32
+ for (const [normalizedKey, canonical] of index) {
33
+ const d = levenshtein(normalized, normalizedKey);
34
+ if (best.length < safeK) {
35
+ let j = best.length;
36
+ while (j > 0 && best[j - 1][1] > d)
37
+ j--;
38
+ best.splice(j, 0, [canonical, d]);
39
+ }
40
+ else if (d < best[safeK - 1][1]) {
41
+ let j = safeK - 1;
42
+ while (j > 0 && best[j - 1][1] > d)
43
+ j--;
44
+ best.splice(j, 0, [canonical, d]);
45
+ best.pop();
46
+ }
26
47
  }
27
- ranked.sort((a, b) => a[1] - b[1]);
28
48
  const out = [];
29
- const take = Math.min(limit, ranked.length);
30
- for (let i = 0; i < take; i++) {
31
- const entry = ranked[i];
32
- if (entry === undefined)
33
- continue;
34
- const hex = palette.colors[entry[0]];
49
+ for (const [canonical, d] of best) {
50
+ const hex = palette.colors[canonical];
35
51
  if (hex === undefined)
36
52
  continue;
37
53
  out.push({
38
- name: entry[0],
54
+ name: canonical,
39
55
  value: fromRgba(hexToRgba(hex), format),
40
- distance: entry[1],
56
+ distance: d,
41
57
  });
42
58
  }
43
59
  return out;
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGxC,+EAA+E;AAC/E,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAqDlC,kBAAkB;AAClB,MAAM,UAAU,OAAO,CACrB,IAAY,EACZ,IAAI,GAA4D,EAAE;IAElE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,MAAM,GAAG,sBAAsB;YAAE,OAAO,EAAE,CAAC;QAC1D,qEAAqE;QACrE,8DAA8D;QAC9D,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACzE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAClC,MAAM,GAAG,GAAI,OAAO,CAAC,MAAmC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS;YAChC,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACd,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;gBACvC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;aACnB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,eAAe;IACf,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,GAAG,GAAI,OAAO,CAAC,MAAmC,CAAC,SAAS,CAAC,CAAC;IACpE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import { hexToRgba } from './conversions/hex.js';\nimport { fromRgba } from './convert.js';\nimport { getNameIndex } from './indexing.js';\nimport { levenshtein } from './math/editDistance.js';\nimport { web } from './palettes/web.js';\nimport type { ColorFormat, ColorValue, HexColor, Palette } from './types.js';\n\n// No built-in palette key exceeds ~30 chars post-normalize; anything well past\n// that can't plausibly win a fuzzy match and risks pathological O(n·m) cost\n// across every palette entry. Guard the k-branch input at 64.\nconst MAX_FUZZY_INPUT_LENGTH = 64;\n\n/** Extract string keys from a Palette's `colors` map. */\ntype PaletteKey<P extends Palette> = Extract<keyof P['colors'], string>;\n\n/**\n * One ranked fuzzy-match entry when `resolve` is called with `k`.\n * `distance` is the Levenshtein edit distance between the normalized\n * input and the normalized palette key — integer count of insertions,\n * deletions, and substitutions.\n */\nexport type ResolveMatch<Name extends string> = {\n readonly name: Name;\n readonly value: ColorValue;\n readonly distance: number;\n};\n\n/**\n * Resolve a human-readable name to a color. Normalizes the input using\n * the palette's own `normalize` function before looking it up.\n *\n * **Without `k`** (strict, unchanged): returns the exact match value, or\n * `null` if the normalized name isn't in the palette.\n *\n * **With `k`** (fuzzy, typo-tolerant): returns an array of the top `k`\n * matches ranked by Levenshtein edit distance against normalized keys.\n * Useful for user-typed input where misspellings, casing, and\n * punctuation can all be recovered.\n *\n * ```ts\n * resolve('rebeccapurple') // '#663399'\n * resolve('rebecapurple') // null (strict)\n * resolve('rebecapurple', { palette: web, k: 3 }) // fuzzy:\n * // [{ name: 'rebeccapurple', value: '#663399', distance: 1 },\n * // { name: 'purple', value: '#800080', distance: 6 },\n * // ...]\n * ```\n *\n * Defaults: palette = `web`, format = 'HEX', `k` = undefined (strict).\n */\n\n// Overload 1: strict — single ColorValue or null (unchanged).\nexport function resolve(\n name: string,\n opts?: { palette?: Palette; format?: ColorFormat },\n): ColorValue | null;\n\n// Overload 2: fuzzy top-k — ranked Match[].\nexport function resolve<P extends Palette = typeof web>(\n name: string,\n opts: { palette?: P; format?: ColorFormat; k: number },\n): Array<ResolveMatch<PaletteKey<P>>>;\n\n// Implementation.\nexport function resolve(\n name: string,\n opts: { palette?: Palette; format?: ColorFormat; k?: number } = {},\n): ColorValue | null | Array<ResolveMatch<string>> {\n const palette = opts.palette ?? web;\n const format = opts.format ?? 'HEX';\n const normalized = palette.normalize(name);\n\n if (opts.k !== undefined) {\n const limit = Math.max(0, opts.k);\n if (limit === 0) return [];\n if (normalized.length > MAX_FUZZY_INPUT_LENGTH) return [];\n // Iterate the name index's normalized → canonical map once; for each\n // entry compute Levenshtein from the user's normalized input.\n const ranked: Array<[string, number]> = [];\n for (const [normalizedKey, canonical] of getNameIndex(palette).entries()) {\n ranked.push([canonical, levenshtein(normalized, normalizedKey)]);\n }\n ranked.sort((a, b) => a[1] - b[1]);\n const out: Array<ResolveMatch<string>> = [];\n const take = Math.min(limit, ranked.length);\n for (let i = 0; i < take; i++) {\n const entry = ranked[i];\n if (entry === undefined) continue;\n const hex = (palette.colors as Record<string, HexColor>)[entry[0]];\n if (hex === undefined) continue;\n out.push({\n name: entry[0],\n value: fromRgba(hexToRgba(hex), format),\n distance: entry[1],\n });\n }\n return out;\n }\n\n // Strict path.\n const canonical = getNameIndex(palette).get(normalized);\n if (canonical === undefined) return null;\n const hex = (palette.colors as Record<string, HexColor>)[canonical];\n if (hex === undefined) return null;\n return fromRgba(hexToRgba(hex), format);\n}\n"]}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGxC,+EAA+E;AAC/E,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,sBAAsB,GAAG,EAAE,CAAC;AA0GlC,kBAAkB;AAClB,MAAM,UAAU,OAAO,CACrB,IAAY,EACZ,IAAI,GAAoC,EAAE;IAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACzB,8DAA8D;QAC9D,kEAAkE;QAClE,kEAAkE;QAClE,4DAA4D;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,MAAM,GAAG,sBAAsB;YAAE,OAAO,EAAE,CAAC;QAE1D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,gEAAgE;QAChE,8DAA8D;QAC9D,+DAA+D;QAC/D,+DAA+D;QAC/D,8DAA8D;QAC9D,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,IAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAsB,CAAC,CAAC,CAAC,GAAG,CAAC;oBAAE,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,CAAC,GAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,IAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAsB,CAAC,CAAC,CAAC,GAAG,CAAC;oBAAE,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAClC,MAAM,GAAG,GAAI,OAAO,CAAC,MAAmC,CAAC,SAAS,CAAC,CAAC;YACpE,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS;YAChC,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;gBACvC,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,eAAe;IACf,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,GAAG,GAAI,OAAO,CAAC,MAAmC,CAAC,SAAS,CAAC,CAAC;IACpE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import { hexToRgba } from './conversions/hex.js';\nimport { fromRgba } from './convert.js';\nimport { getNameIndex } from './indexing.js';\nimport { levenshtein } from './math/editDistance.js';\nimport { web } from './palettes/web.js';\nimport type { ColorFormat, ColorValue, HexColor, Palette, PaletteKey } from './types.js';\n\n// No built-in palette key exceeds ~30 chars post-normalize; anything well past\n// that can't plausibly win a fuzzy match and risks pathological O(n·m) cost\n// across every palette entry. Guard the k-branch input at 64.\nconst MAX_FUZZY_INPUT_LENGTH = 64;\n\n/**\n * One ranked fuzzy-match entry when `resolve` is called with `k`.\n * `distance` is the Levenshtein edit distance between the normalized\n * input and the normalized palette key: an integer count of insertions,\n * deletions, and substitutions.\n */\nexport type ResolveMatch<Name extends string> = {\n readonly name: Name;\n readonly value: ColorValue;\n readonly distance: number;\n};\n\n/**\n * Options for the strict variant of {@link resolve}. Generic over the\n * palette so the caller sees narrow inference on `opts.palette` (same\n * pattern as {@link IdentifyOptions}).\n *\n * @example\n * resolve('Pantone 185 C', { palette: pantone });\n * resolve('rebeccapurple', { format: 'RGB' });\n */\nexport type ResolveOptions<P extends Palette = typeof web> = {\n /**\n * Palette to look the name up in. Defaults to `web` (CSS named colors).\n */\n readonly palette?: P;\n /**\n * Output format for the matched color. Defaults to `'HEX'`.\n */\n readonly format?: ColorFormat;\n};\n\n/**\n * Options for the fuzzy (top-k) variant of {@link resolve}. Returns an\n * array of {@link ResolveMatch} entries ranked by edit distance.\n *\n * @example\n * resolve('rebecapurple', { palette: web, k: 3 });\n * // [\n * // { name: 'rebeccapurple', value: '#663399', distance: 1 },\n * // { name: 'purple', value: '#800080', distance: 6 },\n * // ...\n * // ]\n */\nexport type ResolveFuzzyOptions<P extends Palette = typeof web> = {\n /**\n * Palette to search. Generic so the return narrows to the palette's\n * literal-key union.\n */\n readonly palette?: P;\n /**\n * Output format for each matched `value`. Defaults to `'HEX'`.\n */\n readonly format?: ColorFormat;\n /**\n * Number of ranked matches to return. When present, `resolve` runs in\n * typo-tolerant mode (Levenshtein edit distance against normalized\n * keys) and returns `ResolveMatch[]` instead of a single value.\n */\n readonly k: number;\n};\n\n/**\n * Resolve a human-readable name to a color. Normalizes the input using\n * the palette's own `normalize` function before looking it up.\n *\n * **Without `k`** (strict, unchanged): returns the exact match value, or\n * `null` if the normalized name isn't in the palette.\n *\n * **With `k`** (fuzzy, typo-tolerant): returns an array of the top `k`\n * matches ranked by Levenshtein edit distance against normalized keys.\n * Useful for user-typed input where misspellings, casing, and\n * punctuation can all be recovered.\n *\n * ```ts\n * resolve('rebeccapurple') // '#663399'\n * resolve('rebecapurple') // null (strict)\n * resolve('rebecapurple', { palette: web, k: 3 }) // fuzzy:\n * // [{ name: 'rebeccapurple', value: '#663399', distance: 1 },\n * // { name: 'purple', value: '#800080', distance: 6 },\n * // ...]\n * ```\n *\n * Tie-breaking on equal edit distance: first-declared entry in the\n * palette's `colors` object wins. Matches `identify`'s contract.\n *\n * `k` is forgiving: fractional rounds, negatives and zero return\n * `[]`, `NaN` / `±Infinity` return `[]`. No throws on invalid `k`.\n *\n * Defaults: palette = `web`, format = 'HEX', `k` = undefined (strict).\n */\n\n// Overload 1: strict — single ColorValue or null (unchanged).\nexport function resolve<P extends Palette = typeof web>(\n name: string,\n opts?: ResolveOptions<P>,\n): ColorValue | null;\n\n// Overload 2: fuzzy top-k — ranked Match[].\nexport function resolve<P extends Palette = typeof web>(\n name: string,\n opts: ResolveFuzzyOptions<P>,\n): Array<ResolveMatch<PaletteKey<P>>>;\n\n// Implementation.\nexport function resolve(\n name: string,\n opts: ResolveOptions & { k?: number } = {},\n): ColorValue | null | Array<ResolveMatch<string>> {\n const palette = opts.palette ?? web;\n const format = opts.format ?? 'HEX';\n const normalized = palette.normalize(name);\n\n if (opts.k !== undefined) {\n // k normalization — same contract as `identify`'s top-k path:\n // fractional rounds, negative clamps to 0, NaN/±Infinity collapse\n // to 0 (empty result). Prior code crashed on NaN / fractional via\n // `new Array(NaN)`; the `Number.isFinite` guard fixes that.\n const safeK = Number.isFinite(opts.k) ? Math.max(0, Math.round(opts.k)) : 0;\n if (safeK === 0) return [];\n if (normalized.length > MAX_FUZZY_INPUT_LENGTH) return [];\n\n const index = getNameIndex(palette).entries();\n // Bounded insertion-sort window, keyed on Levenshtein distance.\n // See the twin comment in indexing.ts nearestAll for the full\n // rationale. Levenshtein per comparison is heavier than ΔE, so\n // the per-entry distance math dominates more than on identify,\n // but the allocation savings still help at k << palette size.\n const best: Array<[string, number]> = [];\n for (const [normalizedKey, canonical] of index) {\n const d = levenshtein(normalized, normalizedKey);\n if (best.length < safeK) {\n let j = best.length;\n while (j > 0 && (best[j - 1] as [string, number])[1] > d) j--;\n best.splice(j, 0, [canonical, d]);\n } else if (d < (best[safeK - 1] as [string, number])[1]) {\n let j = safeK - 1;\n while (j > 0 && (best[j - 1] as [string, number])[1] > d) j--;\n best.splice(j, 0, [canonical, d]);\n best.pop();\n }\n }\n\n const out: Array<ResolveMatch<string>> = [];\n for (const [canonical, d] of best) {\n const hex = (palette.colors as Record<string, HexColor>)[canonical];\n if (hex === undefined) continue;\n out.push({\n name: canonical,\n value: fromRgba(hexToRgba(hex), format),\n distance: d,\n });\n }\n return out;\n }\n\n // Strict path.\n const canonical = getNameIndex(palette).get(normalized);\n if (canonical === undefined) return null;\n const hex = (palette.colors as Record<string, HexColor>)[canonical];\n if (hex === undefined) return null;\n return fromRgba(hexToRgba(hex), format);\n}\n"]}
package/dist/types.d.ts CHANGED
@@ -36,12 +36,59 @@ export type ColorFormat = (typeof FORMAT_VALUES)[number];
36
36
  export declare const COLOR_FORMATS: ReadonlySet<ColorFormat>;
37
37
  export type ColorValue = HexColor | RgbString | Rgba | HslString | HsvString;
38
38
  export type NormalizeFn = (name: string) => string;
39
+ /**
40
+ * A named color lookup plus its indexing rules. The unit of BYO
41
+ * extension: pass one of these to `identify`/`resolve`/`convert`
42
+ * (or import a built-in like `web` / `x11` / `pantone` / `crayola`)
43
+ * and the same nearest-match / name-resolution machinery runs over
44
+ * it.
45
+ *
46
+ * Generic over `Name` so BYO palettes carry their literal-key union
47
+ * through `identify`'s return type. The `as const satisfies` pattern
48
+ * is the standard BYO construction; it locks every key as a literal
49
+ * so inference doesn't widen to `string`.
50
+ *
51
+ * @example
52
+ * // Minimal BYO palette with full inference:
53
+ * const brand = {
54
+ * name: 'brand',
55
+ * colors: {
56
+ * 'Acme Red': '#ff0044',
57
+ * 'Acme Blue': '#0044ff',
58
+ * },
59
+ * normalize: (s: string) => s.toLowerCase().replace(/\s+/g, ''),
60
+ * defaultMetric: 'deltaE2000',
61
+ * } as const satisfies Palette<'Acme Red' | 'Acme Blue'>;
62
+ *
63
+ * identify('#ff0000', { palette: brand });
64
+ * // typed as "'Acme Red' | 'Acme Blue' | null"
65
+ */
39
66
  export type Palette<Name extends string = string> = {
67
+ /**
68
+ * Human-readable palette name; used in error messages so a thrown
69
+ * error from `convert` tells you which palette missed the lookup.
70
+ */
40
71
  readonly name: string;
72
+ /**
73
+ * The color map. Keys are the palette's canonical names (display
74
+ * form; whatever comes back from `identify`). Values are hex strings.
75
+ */
41
76
  readonly colors: Readonly<Record<Name, HexColor>>;
77
+ /**
78
+ * Name normalizer: run on both user input and canonical keys before
79
+ * strict lookup. Collapses casing, whitespace, and common prefixes
80
+ * so `'Pantone 185 C'`, `'pantone-185c'`, and `'185 C'` all resolve
81
+ * to the same entry.
82
+ */
42
83
  readonly normalize: NormalizeFn;
84
+ /**
85
+ * The distance metric used by `identify` when the caller doesn't
86
+ * override via `{ metric }`. Chosen per palette based on density
87
+ * and saturation characteristics (see `DistanceMetric`).
88
+ */
43
89
  readonly defaultMetric: DistanceMetric;
44
90
  };
91
+ export type PaletteKey<P extends Palette> = Extract<keyof P['colors'], string>;
45
92
  export type DistanceMetric = 'euclidean-srgb' | 'euclidean-linear' | 'deltaE76' | 'deltaE94' | 'deltaE2000' | 'deltaEok';
46
93
  export {};
47
94
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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","sourcesContent":["// --- Hex ---\nexport type HexColor = `#${string}`;\n\n// --- RGB (no alpha) ---\nexport type RgbString =\n | `rgb(${number},${number},${number})`\n | `rgb(${number}, ${number}, ${number})`;\nexport type RgbTuple = readonly [r: number, g: number, b: number];\nexport type RgbObject = { r: number; g: number; b: number };\nexport type RgbInput = RgbString | RgbTuple | RgbObject;\n\n// --- RGBA (canonical internal representation) ---\nexport type RgbaString =\n | `rgba(${number},${number},${number},${number})`\n | `rgba(${number}, ${number}, ${number}, ${number})`;\nexport type RgbaTuple = readonly [r: number, g: number, b: number, a: number];\nexport type Rgba = { r: number; g: number; b: number; a: number };\nexport type RgbaInput = RgbaString | RgbaTuple | Rgba;\n\n// --- HSL ---\nexport type HslString = `hsl(${number}, ${number}%, ${number}%)`;\nexport type HslObject = { h: number; s: number; l: number };\nexport type HslInput = HslString | HslObject;\n\n// --- HSV ---\nexport type HsvString = `hsv(${number}, ${number}%, ${number}%)`;\nexport type HsvObject = { h: number; s: number; v: number };\nexport type HsvInput = HsvString | HsvObject;\n\n// --- Unified input: anything the core `convert` / `identify` path accepts. ---\n// Pantone strings are deliberately NOT in this union — they require the\n// `pantone` palette data to parse. Callers who want to feed a Pantone code\n// import `pantoneToRgba` from `chromonym/conversions/pantone` (or the\n// subpath) and pass the resulting `Rgba` here. Keeps `identify` / `convert`\n// palette-free so they tree-shake down to structural math.\nexport type ColorInput = HexColor | RgbInput | RgbaInput | HslInput | HsvInput;\n\n// --- Format keys (SCREAMING_CAPS — these are lookup keys for converter dispatch) ---\n// PANTONE intentionally omitted — see ColorInput comment.\nconst FORMAT_VALUES = ['HEX', 'RGB', 'RGBA', 'HSL', 'HSV'] as const;\nexport type ColorFormat = (typeof FORMAT_VALUES)[number];\nexport const COLOR_FORMATS: ReadonlySet<ColorFormat> = new Set(FORMAT_VALUES);\n\n// --- A returned color value (union of canonical output shapes, one per ColorFormat) ---\nexport type ColorValue = HexColor | RgbString | Rgba | HslString | HsvString;\n\n// --- Name normalization function shape (used by palettes). ---\n// A NormalizeFn takes a user-supplied name (\"Pantone 185 C\") and returns\n// its canonical lookup key (\"185c\"). Paired with each Palette.\nexport type NormalizeFn = (name: string) => string;\n\n// --- Palette: a named color lookup with its indexing rules. ---\n// Generic over the key type so BYO palettes can carry narrow literal\n// unions for full type inference through identify/resolve.\nexport type Palette<Name extends string = string> = {\n readonly name: string;\n readonly colors: Readonly<Record<Name, HexColor>>;\n readonly normalize: NormalizeFn;\n readonly defaultMetric: DistanceMetric;\n};\n\n// --- Distance metric for nearest-name lookup (used by `identify`). ---\n// Choose based on palette density and accuracy needs:\n// 'euclidean-srgb' — fastest; fine for well-separated palettes (web, x11)\n// 'euclidean-linear' — undoes sRGB gamma first; closer to physical light mixing\n// 'deltaE76' — Euclidean in CIELAB; simple perceptual metric (CIE 1976)\n// 'deltaE94' — chroma/hue weighted; fixes saturation overweighting\n// 'deltaE2000' — industry standard; fixes blue/purple region\n// 'deltaEok' — Euclidean in OKLAB (Ottosson 2020); most modern;\n// perceptually uniform by construction, cheaper than ΔE2000\nexport type DistanceMetric =\n | 'euclidean-srgb'\n | 'euclidean-linear'\n | 'deltaE76'\n | 'deltaE94'\n | 'deltaE2000'\n | 'deltaEok';\n"]}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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","sourcesContent":["// --- Hex ---\nexport type HexColor = `#${string}`;\n\n// --- RGB (no alpha) ---\nexport type RgbString =\n | `rgb(${number},${number},${number})`\n | `rgb(${number}, ${number}, ${number})`;\nexport type RgbTuple = readonly [r: number, g: number, b: number];\nexport type RgbObject = { r: number; g: number; b: number };\nexport type RgbInput = RgbString | RgbTuple | RgbObject;\n\n// --- RGBA (canonical internal representation) ---\nexport type RgbaString =\n | `rgba(${number},${number},${number},${number})`\n | `rgba(${number}, ${number}, ${number}, ${number})`;\nexport type RgbaTuple = readonly [r: number, g: number, b: number, a: number];\nexport type Rgba = { r: number; g: number; b: number; a: number };\nexport type RgbaInput = RgbaString | RgbaTuple | Rgba;\n\n// --- HSL ---\nexport type HslString = `hsl(${number}, ${number}%, ${number}%)`;\nexport type HslObject = { h: number; s: number; l: number };\nexport type HslInput = HslString | HslObject;\n\n// --- HSV ---\nexport type HsvString = `hsv(${number}, ${number}%, ${number}%)`;\nexport type HsvObject = { h: number; s: number; v: number };\nexport type HsvInput = HsvString | HsvObject;\n\n// --- Unified input: anything the core `convert` / `identify` path accepts. ---\n// Pantone strings are deliberately NOT in this union — they require the\n// `pantone` palette data to parse. Callers who want to feed a Pantone code\n// import `pantoneToRgba` from `chromonym/conversions/pantone` (or the\n// subpath) and pass the resulting `Rgba` here. Keeps `identify` / `convert`\n// palette-free so they tree-shake down to structural math.\nexport type ColorInput = HexColor | RgbInput | RgbaInput | HslInput | HsvInput;\n\n// --- Format keys (SCREAMING_CAPS — these are lookup keys for converter dispatch) ---\n// PANTONE intentionally omitted — see ColorInput comment.\nconst FORMAT_VALUES = ['HEX', 'RGB', 'RGBA', 'HSL', 'HSV'] as const;\nexport type ColorFormat = (typeof FORMAT_VALUES)[number];\nexport const COLOR_FORMATS: ReadonlySet<ColorFormat> = new Set(FORMAT_VALUES);\n\n// --- A returned color value (union of canonical output shapes, one per ColorFormat) ---\nexport type ColorValue = HexColor | RgbString | Rgba | HslString | HsvString;\n\n// --- Name normalization function shape (used by palettes). ---\n// A NormalizeFn takes a user-supplied name (\"Pantone 185 C\") and returns\n// its canonical lookup key (\"185c\"). Paired with each Palette.\nexport type NormalizeFn = (name: string) => string;\n\n/**\n * A named color lookup plus its indexing rules. The unit of BYO\n * extension: pass one of these to `identify`/`resolve`/`convert`\n * (or import a built-in like `web` / `x11` / `pantone` / `crayola`)\n * and the same nearest-match / name-resolution machinery runs over\n * it.\n *\n * Generic over `Name` so BYO palettes carry their literal-key union\n * through `identify`'s return type. The `as const satisfies` pattern\n * is the standard BYO construction; it locks every key as a literal\n * so inference doesn't widen to `string`.\n *\n * @example\n * // Minimal BYO palette with full inference:\n * const brand = {\n * name: 'brand',\n * colors: {\n * 'Acme Red': '#ff0044',\n * 'Acme Blue': '#0044ff',\n * },\n * normalize: (s: string) => s.toLowerCase().replace(/\\s+/g, ''),\n * defaultMetric: 'deltaE2000',\n * } as const satisfies Palette<'Acme Red' | 'Acme Blue'>;\n *\n * identify('#ff0000', { palette: brand });\n * // typed as \"'Acme Red' | 'Acme Blue' | null\"\n */\nexport type Palette<Name extends string = string> = {\n /**\n * Human-readable palette name; used in error messages so a thrown\n * error from `convert` tells you which palette missed the lookup.\n */\n readonly name: string;\n /**\n * The color map. Keys are the palette's canonical names (display\n * form; whatever comes back from `identify`). Values are hex strings.\n */\n readonly colors: Readonly<Record<Name, HexColor>>;\n /**\n * Name normalizer: run on both user input and canonical keys before\n * strict lookup. Collapses casing, whitespace, and common prefixes\n * so `'Pantone 185 C'`, `'pantone-185c'`, and `'185 C'` all resolve\n * to the same entry.\n */\n readonly normalize: NormalizeFn;\n /**\n * The distance metric used by `identify` when the caller doesn't\n * override via `{ metric }`. Chosen per palette based on density\n * and saturation characteristics (see `DistanceMetric`).\n */\n readonly defaultMetric: DistanceMetric;\n};\n\n// Extract the string-literal key union from a Palette's `colors` map.\n// Used across identify/resolve/convert to narrow return types to the\n// caller's palette. Exported so consumers writing wrapper code can\n// reuse the same key-extraction rule without redeclaring it.\nexport type PaletteKey<P extends Palette> = Extract<keyof P['colors'], string>;\n\n// --- Distance metric for nearest-name lookup (used by `identify`). ---\n// Choose based on palette density and accuracy needs:\n// 'euclidean-srgb' — fastest; fine for well-separated palettes (web, x11)\n// 'euclidean-linear' — undoes sRGB gamma first; closer to physical light mixing\n// 'deltaE76' — Euclidean in CIELAB; simple perceptual metric (CIE 1976)\n// 'deltaE94' — chroma/hue weighted; fixes saturation overweighting\n// 'deltaE2000' — industry standard; fixes blue/purple region\n// 'deltaEok' — Euclidean in OKLAB (Ottosson 2020); most modern;\n// perceptually uniform by construction, cheaper than ΔE2000\nexport type DistanceMetric =\n | 'euclidean-srgb'\n | 'euclidean-linear'\n | 'deltaE76'\n | 'deltaE94'\n | 'deltaE2000'\n | 'deltaEok';\n"]}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAqCA,sFAAsF;AACtF,0DAA0D;AAC1D,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAEpE,MAAM,CAAC,MAAM,aAAa,GAA6B,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC","sourcesContent":["// --- Hex ---\nexport type HexColor = `#${string}`;\n\n// --- RGB (no alpha) ---\nexport type RgbString =\n | `rgb(${number},${number},${number})`\n | `rgb(${number}, ${number}, ${number})`;\nexport type RgbTuple = readonly [r: number, g: number, b: number];\nexport type RgbObject = { r: number; g: number; b: number };\nexport type RgbInput = RgbString | RgbTuple | RgbObject;\n\n// --- RGBA (canonical internal representation) ---\nexport type RgbaString =\n | `rgba(${number},${number},${number},${number})`\n | `rgba(${number}, ${number}, ${number}, ${number})`;\nexport type RgbaTuple = readonly [r: number, g: number, b: number, a: number];\nexport type Rgba = { r: number; g: number; b: number; a: number };\nexport type RgbaInput = RgbaString | RgbaTuple | Rgba;\n\n// --- HSL ---\nexport type HslString = `hsl(${number}, ${number}%, ${number}%)`;\nexport type HslObject = { h: number; s: number; l: number };\nexport type HslInput = HslString | HslObject;\n\n// --- HSV ---\nexport type HsvString = `hsv(${number}, ${number}%, ${number}%)`;\nexport type HsvObject = { h: number; s: number; v: number };\nexport type HsvInput = HsvString | HsvObject;\n\n// --- Unified input: anything the core `convert` / `identify` path accepts. ---\n// Pantone strings are deliberately NOT in this union — they require the\n// `pantone` palette data to parse. Callers who want to feed a Pantone code\n// import `pantoneToRgba` from `chromonym/conversions/pantone` (or the\n// subpath) and pass the resulting `Rgba` here. Keeps `identify` / `convert`\n// palette-free so they tree-shake down to structural math.\nexport type ColorInput = HexColor | RgbInput | RgbaInput | HslInput | HsvInput;\n\n// --- Format keys (SCREAMING_CAPS — these are lookup keys for converter dispatch) ---\n// PANTONE intentionally omitted — see ColorInput comment.\nconst FORMAT_VALUES = ['HEX', 'RGB', 'RGBA', 'HSL', 'HSV'] as const;\nexport type ColorFormat = (typeof FORMAT_VALUES)[number];\nexport const COLOR_FORMATS: ReadonlySet<ColorFormat> = new Set(FORMAT_VALUES);\n\n// --- A returned color value (union of canonical output shapes, one per ColorFormat) ---\nexport type ColorValue = HexColor | RgbString | Rgba | HslString | HsvString;\n\n// --- Name normalization function shape (used by palettes). ---\n// A NormalizeFn takes a user-supplied name (\"Pantone 185 C\") and returns\n// its canonical lookup key (\"185c\"). Paired with each Palette.\nexport type NormalizeFn = (name: string) => string;\n\n// --- Palette: a named color lookup with its indexing rules. ---\n// Generic over the key type so BYO palettes can carry narrow literal\n// unions for full type inference through identify/resolve.\nexport type Palette<Name extends string = string> = {\n readonly name: string;\n readonly colors: Readonly<Record<Name, HexColor>>;\n readonly normalize: NormalizeFn;\n readonly defaultMetric: DistanceMetric;\n};\n\n// --- Distance metric for nearest-name lookup (used by `identify`). ---\n// Choose based on palette density and accuracy needs:\n// 'euclidean-srgb' — fastest; fine for well-separated palettes (web, x11)\n// 'euclidean-linear' — undoes sRGB gamma first; closer to physical light mixing\n// 'deltaE76' — Euclidean in CIELAB; simple perceptual metric (CIE 1976)\n// 'deltaE94' — chroma/hue weighted; fixes saturation overweighting\n// 'deltaE2000' — industry standard; fixes blue/purple region\n// 'deltaEok' — Euclidean in OKLAB (Ottosson 2020); most modern;\n// perceptually uniform by construction, cheaper than ΔE2000\nexport type DistanceMetric =\n | 'euclidean-srgb'\n | 'euclidean-linear'\n | 'deltaE76'\n | 'deltaE94'\n | 'deltaE2000'\n | 'deltaEok';\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAqCA,sFAAsF;AACtF,0DAA0D;AAC1D,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAEpE,MAAM,CAAC,MAAM,aAAa,GAA6B,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC","sourcesContent":["// --- Hex ---\nexport type HexColor = `#${string}`;\n\n// --- RGB (no alpha) ---\nexport type RgbString =\n | `rgb(${number},${number},${number})`\n | `rgb(${number}, ${number}, ${number})`;\nexport type RgbTuple = readonly [r: number, g: number, b: number];\nexport type RgbObject = { r: number; g: number; b: number };\nexport type RgbInput = RgbString | RgbTuple | RgbObject;\n\n// --- RGBA (canonical internal representation) ---\nexport type RgbaString =\n | `rgba(${number},${number},${number},${number})`\n | `rgba(${number}, ${number}, ${number}, ${number})`;\nexport type RgbaTuple = readonly [r: number, g: number, b: number, a: number];\nexport type Rgba = { r: number; g: number; b: number; a: number };\nexport type RgbaInput = RgbaString | RgbaTuple | Rgba;\n\n// --- HSL ---\nexport type HslString = `hsl(${number}, ${number}%, ${number}%)`;\nexport type HslObject = { h: number; s: number; l: number };\nexport type HslInput = HslString | HslObject;\n\n// --- HSV ---\nexport type HsvString = `hsv(${number}, ${number}%, ${number}%)`;\nexport type HsvObject = { h: number; s: number; v: number };\nexport type HsvInput = HsvString | HsvObject;\n\n// --- Unified input: anything the core `convert` / `identify` path accepts. ---\n// Pantone strings are deliberately NOT in this union — they require the\n// `pantone` palette data to parse. Callers who want to feed a Pantone code\n// import `pantoneToRgba` from `chromonym/conversions/pantone` (or the\n// subpath) and pass the resulting `Rgba` here. Keeps `identify` / `convert`\n// palette-free so they tree-shake down to structural math.\nexport type ColorInput = HexColor | RgbInput | RgbaInput | HslInput | HsvInput;\n\n// --- Format keys (SCREAMING_CAPS — these are lookup keys for converter dispatch) ---\n// PANTONE intentionally omitted — see ColorInput comment.\nconst FORMAT_VALUES = ['HEX', 'RGB', 'RGBA', 'HSL', 'HSV'] as const;\nexport type ColorFormat = (typeof FORMAT_VALUES)[number];\nexport const COLOR_FORMATS: ReadonlySet<ColorFormat> = new Set(FORMAT_VALUES);\n\n// --- A returned color value (union of canonical output shapes, one per ColorFormat) ---\nexport type ColorValue = HexColor | RgbString | Rgba | HslString | HsvString;\n\n// --- Name normalization function shape (used by palettes). ---\n// A NormalizeFn takes a user-supplied name (\"Pantone 185 C\") and returns\n// its canonical lookup key (\"185c\"). Paired with each Palette.\nexport type NormalizeFn = (name: string) => string;\n\n/**\n * A named color lookup plus its indexing rules. The unit of BYO\n * extension: pass one of these to `identify`/`resolve`/`convert`\n * (or import a built-in like `web` / `x11` / `pantone` / `crayola`)\n * and the same nearest-match / name-resolution machinery runs over\n * it.\n *\n * Generic over `Name` so BYO palettes carry their literal-key union\n * through `identify`'s return type. The `as const satisfies` pattern\n * is the standard BYO construction; it locks every key as a literal\n * so inference doesn't widen to `string`.\n *\n * @example\n * // Minimal BYO palette with full inference:\n * const brand = {\n * name: 'brand',\n * colors: {\n * 'Acme Red': '#ff0044',\n * 'Acme Blue': '#0044ff',\n * },\n * normalize: (s: string) => s.toLowerCase().replace(/\\s+/g, ''),\n * defaultMetric: 'deltaE2000',\n * } as const satisfies Palette<'Acme Red' | 'Acme Blue'>;\n *\n * identify('#ff0000', { palette: brand });\n * // typed as \"'Acme Red' | 'Acme Blue' | null\"\n */\nexport type Palette<Name extends string = string> = {\n /**\n * Human-readable palette name; used in error messages so a thrown\n * error from `convert` tells you which palette missed the lookup.\n */\n readonly name: string;\n /**\n * The color map. Keys are the palette's canonical names (display\n * form; whatever comes back from `identify`). Values are hex strings.\n */\n readonly colors: Readonly<Record<Name, HexColor>>;\n /**\n * Name normalizer: run on both user input and canonical keys before\n * strict lookup. Collapses casing, whitespace, and common prefixes\n * so `'Pantone 185 C'`, `'pantone-185c'`, and `'185 C'` all resolve\n * to the same entry.\n */\n readonly normalize: NormalizeFn;\n /**\n * The distance metric used by `identify` when the caller doesn't\n * override via `{ metric }`. Chosen per palette based on density\n * and saturation characteristics (see `DistanceMetric`).\n */\n readonly defaultMetric: DistanceMetric;\n};\n\n// Extract the string-literal key union from a Palette's `colors` map.\n// Used across identify/resolve/convert to narrow return types to the\n// caller's palette. Exported so consumers writing wrapper code can\n// reuse the same key-extraction rule without redeclaring it.\nexport type PaletteKey<P extends Palette> = Extract<keyof P['colors'], string>;\n\n// --- Distance metric for nearest-name lookup (used by `identify`). ---\n// Choose based on palette density and accuracy needs:\n// 'euclidean-srgb' — fastest; fine for well-separated palettes (web, x11)\n// 'euclidean-linear' — undoes sRGB gamma first; closer to physical light mixing\n// 'deltaE76' — Euclidean in CIELAB; simple perceptual metric (CIE 1976)\n// 'deltaE94' — chroma/hue weighted; fixes saturation overweighting\n// 'deltaE2000' — industry standard; fixes blue/purple region\n// 'deltaEok' — Euclidean in OKLAB (Ottosson 2020); most modern;\n// perceptually uniform by construction, cheaper than ΔE2000\nexport type DistanceMetric =\n | 'euclidean-srgb'\n | 'euclidean-linear'\n | 'deltaE76'\n | 'deltaE94'\n | 'deltaE2000'\n | 'deltaEok';\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "chromonym",
3
- "version": "3.1.1",
4
- "description": "One color-naming API for any palette. Identify, resolve, and convert colors across your own palette or the built-in CSS, X11, Pantone, and Crayola sets — fully typed, tree-shakeable, perceptual distance metrics (CIEDE2000 / OKLAB).",
3
+ "version": "3.3.0",
4
+ "description": "One color-naming API for any palette. Identify, resolve, and convert colors across your own palette or twelve built-in sets (CSS, X11, Pantone, Crayola, NTC, XKCD, Resene, NCS, ISCC-NBS, NBS, FS 595 B/C); fully typed, tree-shakeable, perceptual distance metrics (CIEDE2000 / OKLAB).",
5
5
  "keywords": [
6
6
  "color",
7
7
  "color-name",
@@ -26,10 +26,9 @@
26
26
  "rgb",
27
27
  "hsl",
28
28
  "hsv",
29
- "palette",
30
- "chromonym"
29
+ "palette"
31
30
  ],
32
- "author": "the-simian <harlinjesse@gmail.com>",
31
+ "author": "the-simian <info@simiancraft.com>",
33
32
  "license": "MIT",
34
33
  "homepage": "https://github.com/simiancraft/chromonym#readme",
35
34
  "repository": {
@@ -65,11 +64,51 @@
65
64
  "import": "./dist/palettes/pantone.js",
66
65
  "default": "./dist/palettes/pantone.js"
67
66
  },
67
+ "./resene": {
68
+ "types": "./dist/palettes/resene.d.ts",
69
+ "import": "./dist/palettes/resene.js",
70
+ "default": "./dist/palettes/resene.js"
71
+ },
68
72
  "./crayola": {
69
73
  "types": "./dist/palettes/crayola.d.ts",
70
74
  "import": "./dist/palettes/crayola.js",
71
75
  "default": "./dist/palettes/crayola.js"
72
76
  },
77
+ "./fs595b": {
78
+ "types": "./dist/palettes/fs595b.d.ts",
79
+ "import": "./dist/palettes/fs595b.js",
80
+ "default": "./dist/palettes/fs595b.js"
81
+ },
82
+ "./fs595c": {
83
+ "types": "./dist/palettes/fs595c.d.ts",
84
+ "import": "./dist/palettes/fs595c.js",
85
+ "default": "./dist/palettes/fs595c.js"
86
+ },
87
+ "./iscc-nbs": {
88
+ "types": "./dist/palettes/isccNbs.d.ts",
89
+ "import": "./dist/palettes/isccNbs.js",
90
+ "default": "./dist/palettes/isccNbs.js"
91
+ },
92
+ "./nbs": {
93
+ "types": "./dist/palettes/nbs.d.ts",
94
+ "import": "./dist/palettes/nbs.js",
95
+ "default": "./dist/palettes/nbs.js"
96
+ },
97
+ "./ncs": {
98
+ "types": "./dist/palettes/ncs.d.ts",
99
+ "import": "./dist/palettes/ncs.js",
100
+ "default": "./dist/palettes/ncs.js"
101
+ },
102
+ "./ntc": {
103
+ "types": "./dist/palettes/ntc.d.ts",
104
+ "import": "./dist/palettes/ntc.js",
105
+ "default": "./dist/palettes/ntc.js"
106
+ },
107
+ "./xkcd": {
108
+ "types": "./dist/palettes/xkcd.d.ts",
109
+ "import": "./dist/palettes/xkcd.js",
110
+ "default": "./dist/palettes/xkcd.js"
111
+ },
73
112
  "./conversions/hex": {
74
113
  "types": "./dist/conversions/hex.d.ts",
75
114
  "import": "./dist/conversions/hex.js",