@xivdyetools/core 2.7.0 → 4.0.1

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 (156) hide show
  1. package/README.md +85 -67
  2. package/dist/blending/blending.d.ts +22 -0
  3. package/dist/blending/blending.d.ts.map +1 -0
  4. package/dist/blending/blending.js +129 -0
  5. package/dist/blending/blending.js.map +1 -0
  6. package/dist/blending/conversions.d.ts +53 -0
  7. package/dist/blending/conversions.d.ts.map +1 -0
  8. package/dist/blending/conversions.js +256 -0
  9. package/dist/blending/conversions.js.map +1 -0
  10. package/dist/blending/index.d.ts +8 -0
  11. package/dist/blending/index.d.ts.map +1 -0
  12. package/dist/blending/index.js +3 -0
  13. package/dist/blending/index.js.map +1 -0
  14. package/dist/blending/types.d.ts +36 -0
  15. package/dist/blending/types.d.ts.map +1 -0
  16. package/dist/blending/types.js +21 -0
  17. package/dist/blending/types.js.map +1 -0
  18. package/dist/config/band-calibration.d.ts +68 -0
  19. package/dist/config/band-calibration.d.ts.map +1 -0
  20. package/dist/config/band-calibration.js +196 -0
  21. package/dist/config/band-calibration.js.map +1 -0
  22. package/dist/config/band-vocabulary.d.ts +82 -0
  23. package/dist/config/band-vocabulary.d.ts.map +1 -0
  24. package/dist/config/band-vocabulary.js +117 -0
  25. package/dist/config/band-vocabulary.js.map +1 -0
  26. package/dist/config/consolidated-ids.js +2 -2
  27. package/dist/config/consolidated-ids.js.map +1 -1
  28. package/dist/config/dye-vocabulary.d.ts +45 -0
  29. package/dist/config/dye-vocabulary.d.ts.map +1 -0
  30. package/dist/config/dye-vocabulary.js +58 -0
  31. package/dist/config/dye-vocabulary.js.map +1 -0
  32. package/dist/config/facewear.d.ts +24 -0
  33. package/dist/config/facewear.d.ts.map +1 -0
  34. package/dist/config/facewear.js +35 -0
  35. package/dist/config/facewear.js.map +1 -0
  36. package/dist/config/learn-links.d.ts +70 -0
  37. package/dist/config/learn-links.d.ts.map +1 -0
  38. package/dist/config/learn-links.js +171 -0
  39. package/dist/config/learn-links.js.map +1 -0
  40. package/dist/config/product-links.d.ts +44 -0
  41. package/dist/config/product-links.d.ts.map +1 -0
  42. package/dist/config/product-links.js +44 -0
  43. package/dist/config/product-links.js.map +1 -0
  44. package/dist/constants/index.d.ts +14 -1
  45. package/dist/constants/index.d.ts.map +1 -1
  46. package/dist/constants/index.js +38 -22
  47. package/dist/constants/index.js.map +1 -1
  48. package/dist/data/character_colors/race_specific/hair_colors.json +1 -1
  49. package/dist/data/character_colors/race_specific/skin_colors.json +1 -1
  50. package/dist/data/dyes.json +1127 -0
  51. package/dist/data/facewear_colors.json +57 -0
  52. package/dist/data/locales/de.json +4 -50
  53. package/dist/data/locales/en.json +4 -50
  54. package/dist/data/locales/fr.json +4 -50
  55. package/dist/data/locales/ja.json +4 -50
  56. package/dist/data/locales/ko.json +4 -50
  57. package/dist/data/locales/zh.json +4 -50
  58. package/dist/data/presets.json +59 -301
  59. package/dist/index.d.ts +156 -17
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +114 -10
  62. package/dist/index.js.map +1 -1
  63. package/dist/services/APIService.d.ts +7 -61
  64. package/dist/services/APIService.d.ts.map +1 -1
  65. package/dist/services/APIService.js +43 -154
  66. package/dist/services/APIService.js.map +1 -1
  67. package/dist/services/CharacterColorService.d.ts +4 -36
  68. package/dist/services/CharacterColorService.d.ts.map +1 -1
  69. package/dist/services/CharacterColorService.js +16 -68
  70. package/dist/services/CharacterColorService.js.map +1 -1
  71. package/dist/services/ColorService.d.ts +55 -68
  72. package/dist/services/ColorService.d.ts.map +1 -1
  73. package/dist/services/ColorService.js +86 -94
  74. package/dist/services/ColorService.js.map +1 -1
  75. package/dist/services/DyeService.d.ts +10 -103
  76. package/dist/services/DyeService.d.ts.map +1 -1
  77. package/dist/services/DyeService.js +13 -156
  78. package/dist/services/DyeService.js.map +1 -1
  79. package/dist/services/LocalizationService.d.ts +1 -33
  80. package/dist/services/LocalizationService.d.ts.map +1 -1
  81. package/dist/services/LocalizationService.js +0 -44
  82. package/dist/services/LocalizationService.js.map +1 -1
  83. package/dist/services/PaletteService.d.ts +8 -9
  84. package/dist/services/PaletteService.d.ts.map +1 -1
  85. package/dist/services/PaletteService.js +2 -21
  86. package/dist/services/PaletteService.js.map +1 -1
  87. package/dist/services/PresetService.d.ts +2 -34
  88. package/dist/services/PresetService.d.ts.map +1 -1
  89. package/dist/services/PresetService.js +12 -59
  90. package/dist/services/PresetService.js.map +1 -1
  91. package/dist/services/chara/chara-models.d.ts +68 -0
  92. package/dist/services/chara/chara-models.d.ts.map +1 -0
  93. package/dist/services/chara/chara-models.js +87 -0
  94. package/dist/services/chara/chara-models.js.map +1 -0
  95. package/dist/services/chara/chara-parser.d.ts +95 -0
  96. package/dist/services/chara/chara-parser.d.ts.map +1 -0
  97. package/dist/services/chara/chara-parser.js +299 -0
  98. package/dist/services/chara/chara-parser.js.map +1 -0
  99. package/dist/services/chara/chara-resolver.d.ts +103 -0
  100. package/dist/services/chara/chara-resolver.d.ts.map +1 -0
  101. package/dist/services/chara/chara-resolver.js +233 -0
  102. package/dist/services/chara/chara-resolver.js.map +1 -0
  103. package/dist/services/color/ColorConverter.d.ts +107 -35
  104. package/dist/services/color/ColorConverter.d.ts.map +1 -1
  105. package/dist/services/color/ColorConverter.js +159 -48
  106. package/dist/services/color/ColorConverter.js.map +1 -1
  107. package/dist/services/color/ColorManipulator.d.ts +11 -0
  108. package/dist/services/color/ColorManipulator.d.ts.map +1 -1
  109. package/dist/services/color/ColorManipulator.js +14 -0
  110. package/dist/services/color/ColorManipulator.js.map +1 -1
  111. package/dist/services/color/ColorblindnessSimulator.d.ts +17 -0
  112. package/dist/services/color/ColorblindnessSimulator.d.ts.map +1 -1
  113. package/dist/services/color/ColorblindnessSimulator.js +53 -1
  114. package/dist/services/color/ColorblindnessSimulator.js.map +1 -1
  115. package/dist/services/color/SpectralMixer.d.ts +0 -34
  116. package/dist/services/color/SpectralMixer.d.ts.map +1 -1
  117. package/dist/services/color/SpectralMixer.js +0 -73
  118. package/dist/services/color/SpectralMixer.js.map +1 -1
  119. package/dist/services/dye/DyeDatabase.d.ts +0 -21
  120. package/dist/services/dye/DyeDatabase.d.ts.map +1 -1
  121. package/dist/services/dye/DyeDatabase.js +78 -103
  122. package/dist/services/dye/DyeDatabase.js.map +1 -1
  123. package/dist/services/dye/DyeSearch.d.ts +17 -31
  124. package/dist/services/dye/DyeSearch.d.ts.map +1 -1
  125. package/dist/services/dye/DyeSearch.js +31 -67
  126. package/dist/services/dye/DyeSearch.js.map +1 -1
  127. package/dist/services/dye/HarmonyGenerator.d.ts +11 -18
  128. package/dist/services/dye/HarmonyGenerator.d.ts.map +1 -1
  129. package/dist/services/dye/HarmonyGenerator.js +24 -35
  130. package/dist/services/dye/HarmonyGenerator.js.map +1 -1
  131. package/dist/services/localization/LocaleLoader.d.ts.map +1 -1
  132. package/dist/services/localization/LocaleLoader.js +0 -1
  133. package/dist/services/localization/LocaleLoader.js.map +1 -1
  134. package/dist/services/localization/TranslationProvider.d.ts +1 -42
  135. package/dist/services/localization/TranslationProvider.d.ts.map +1 -1
  136. package/dist/services/localization/TranslationProvider.js +4 -82
  137. package/dist/services/localization/TranslationProvider.js.map +1 -1
  138. package/dist/types/index.d.ts +39 -52
  139. package/dist/types/index.d.ts.map +1 -1
  140. package/dist/types/index.js +50 -10
  141. package/dist/types/index.js.map +1 -1
  142. package/dist/utils/index.d.ts +35 -122
  143. package/dist/utils/index.d.ts.map +1 -1
  144. package/dist/utils/index.js +45 -422
  145. package/dist/utils/index.js.map +1 -1
  146. package/dist/utils/kd-tree.d.ts +0 -4
  147. package/dist/utils/kd-tree.d.ts.map +1 -1
  148. package/dist/utils/kd-tree.js +0 -6
  149. package/dist/utils/kd-tree.js.map +1 -1
  150. package/package.json +19 -10
  151. package/dist/data/character_colors/index.json +0 -40
  152. package/dist/data/colors_xiv.json +0 -3538
  153. package/dist/version.d.ts +0 -11
  154. package/dist/version.d.ts.map +0 -1
  155. package/dist/version.js +0 -11
  156. package/dist/version.js.map +0 -1
@@ -0,0 +1,171 @@
1
+ /**
2
+ * /manual topic roster + learn-more link table — shared data for every
3
+ * surface (web MetricHelp rows, bot /manual embeds, og-worker redirect page).
4
+ *
5
+ * Per the confirmed 5.0 rules (design register, cross-cutting):
6
+ * - Authority order when sourcing: clinical body → medical portal →
7
+ * encyclopaedia. Read the target, not its name.
8
+ * - **A missing URL degrades to no link, never the English one.**
9
+ * - Embeds print authority + host, never the path; web `<a>`s still name the
10
+ * authority.
11
+ * - The lead sentence and its tail are authored together per locale (JA
12
+ * `をご覧ください`; KO takes no tail — position-dependent). Those live in
13
+ * the locale string tables, not here.
14
+ * - Every URL here passed a liveness check on 2026-08-07. Two of five had
15
+ * already moved once before that — keep the liveness test in CI-reachable
16
+ * form and treat a dead link as an absent link at render time.
17
+ *
18
+ * Roster decisions:
19
+ * - Colour Vision: EN = NEI (clinical body) · DE = Portal der Augenmedizin
20
+ * (medical portal) · FR = Wikipédia *Daltonisme* (encyclopaedia; no
21
+ * endorsed FR clinical page) · JA = 日本眼科医会 (the JA copy names
22
+ * achromatopsia as separate, not a fourth 色覚異常) · KO = KDCA 국가건강정보포털.
23
+ * **ZH is deliberately absent** — blocked on a Simplified-Chinese reader.
24
+ * - Contrast: cite WCAG 1.4.11 in all six locales, but **link only en/fr/zh**
25
+ * (the W3C-authorized translations). DE's endorsed 2.0 translation lacks the
26
+ * criterion; KO's translation is unofficial http; JA's waic.jp needs its own
27
+ * check before it can join.
28
+ * - Matching Methods: our own docs — no localised authority exists.
29
+ * - Spectrum & Prices: Lodestone **by game region, not locale**.
30
+ * - Image Matching Tips and Character File link nothing.
31
+ */
32
+ const W3C = 'W3C';
33
+ /** Our own documentation site (Matching Methods target, all locales). */
34
+ export const XIVDYETOOLS_DOCS_URL = 'https://developers.xivdyetools.app/';
35
+ /** Lodestone by region — Spectrum & Prices resolves region from the user's world. */
36
+ export const LODESTONE_BY_REGION = {
37
+ na: {
38
+ authority: 'The Lodestone',
39
+ host: 'na.finalfantasyxiv.com',
40
+ url: 'https://na.finalfantasyxiv.com/lodestone/',
41
+ },
42
+ eu: {
43
+ authority: 'The Lodestone',
44
+ host: 'eu.finalfantasyxiv.com',
45
+ url: 'https://eu.finalfantasyxiv.com/lodestone/',
46
+ },
47
+ jp: {
48
+ authority: 'The Lodestone',
49
+ host: 'jp.finalfantasyxiv.com',
50
+ url: 'https://jp.finalfantasyxiv.com/lodestone/',
51
+ },
52
+ de: {
53
+ authority: 'The Lodestone',
54
+ host: 'de.finalfantasyxiv.com',
55
+ url: 'https://de.finalfantasyxiv.com/lodestone/',
56
+ },
57
+ fr: {
58
+ authority: 'The Lodestone',
59
+ host: 'fr.finalfantasyxiv.com',
60
+ url: 'https://fr.finalfantasyxiv.com/lodestone/',
61
+ },
62
+ };
63
+ const MATCHING_METHODS_LINK = {
64
+ authority: 'XIV Dye Tools Docs',
65
+ host: 'developers.xivdyetools.app',
66
+ url: XIVDYETOOLS_DOCS_URL,
67
+ };
68
+ /**
69
+ * The /manual topic roster. `match_image` ships today; the other five need
70
+ * handler + choice registration in the bot (they are part of the 5.0 port).
71
+ */
72
+ export const MANUAL_TOPICS = [
73
+ {
74
+ id: 'match_image',
75
+ emoji: '📸',
76
+ links: {},
77
+ },
78
+ {
79
+ id: 'color_vision',
80
+ emoji: '♿',
81
+ links: {
82
+ en: {
83
+ authority: 'National Eye Institute',
84
+ host: 'www.nei.nih.gov',
85
+ url: 'https://www.nei.nih.gov/learn-about-eye-health/eye-conditions-and-diseases/color-blindness',
86
+ },
87
+ de: {
88
+ authority: 'Portal der Augenmedizin',
89
+ host: 'www.portal-der-augenmedizin.de',
90
+ url: 'https://www.portal-der-augenmedizin.de/aktuelles/20110405-farbenblindheit-im-alltag.html',
91
+ },
92
+ fr: {
93
+ authority: 'Wikipédia — Daltonisme',
94
+ host: 'fr.wikipedia.org',
95
+ url: 'https://fr.wikipedia.org/wiki/Daltonisme',
96
+ },
97
+ ja: {
98
+ authority: '日本眼科医会',
99
+ host: 'www.gankaikai.or.jp',
100
+ url: 'https://www.gankaikai.or.jp/health/50/',
101
+ },
102
+ ko: {
103
+ authority: '질병관리청 국가건강정보포털',
104
+ host: 'health.kdca.go.kr',
105
+ url: 'https://health.kdca.go.kr/healthinfo/biz/health/gnrlzHealthInfo/gnrlzHealthInfo/gnrlzHealthInfoView.do?cntnts_sn=1469',
106
+ },
107
+ // zh: deliberately absent — needs a Simplified-Chinese source found via
108
+ // a community reader. Absent = no link, never the English one.
109
+ },
110
+ },
111
+ {
112
+ id: 'contrast',
113
+ emoji: '🔲',
114
+ links: {
115
+ en: {
116
+ authority: `${W3C} — WCAG 2.1 (1.4.11)`,
117
+ host: 'www.w3.org',
118
+ url: 'https://www.w3.org/TR/WCAG21/#non-text-contrast',
119
+ },
120
+ fr: {
121
+ authority: `${W3C} — WCAG 2.1, traduction autorisée (1.4.11)`,
122
+ host: 'www.w3.org',
123
+ url: 'https://www.w3.org/Translations/WCAG21-fr/',
124
+ },
125
+ zh: {
126
+ authority: `${W3C} — WCAG 2.1 授权翻译 (1.4.11)`,
127
+ host: 'www.w3.org',
128
+ url: 'https://www.w3.org/Translations/WCAG21-zh/',
129
+ },
130
+ // de: endorsed WCAG 2.0 translation lacks 1.4.11 (a 2.1 criterion).
131
+ // ko: only an unofficial http translation exists.
132
+ // ja: waic.jp candidate not yet verified.
133
+ // All three cite 1.4.11 in copy but render the absent-link state.
134
+ },
135
+ },
136
+ {
137
+ id: 'matching_methods',
138
+ emoji: '📐',
139
+ links: {
140
+ en: MATCHING_METHODS_LINK,
141
+ de: MATCHING_METHODS_LINK,
142
+ fr: MATCHING_METHODS_LINK,
143
+ ja: MATCHING_METHODS_LINK,
144
+ ko: MATCHING_METHODS_LINK,
145
+ zh: MATCHING_METHODS_LINK,
146
+ },
147
+ },
148
+ {
149
+ id: 'spectrum_prices',
150
+ emoji: '🪙',
151
+ links: {}, // region-keyed — resolve via LODESTONE_BY_REGION, not locale
152
+ },
153
+ {
154
+ id: 'character_file',
155
+ emoji: '👤',
156
+ links: {}, // links nothing by decision
157
+ },
158
+ ];
159
+ /**
160
+ * Learn-more link for a topic + locale. Returns null for the absent state —
161
+ * consumers render "no link", never the English URL.
162
+ */
163
+ export function getLearnLink(topic, locale) {
164
+ const entry = MANUAL_TOPICS.find((t) => t.id === topic);
165
+ return entry?.links[locale] ?? null;
166
+ }
167
+ /** Lodestone link for a game region (Spectrum & Prices topic). */
168
+ export function getLodestoneLink(region) {
169
+ return LODESTONE_BY_REGION[region];
170
+ }
171
+ //# sourceMappingURL=learn-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn-links.js","sourceRoot":"","sources":["../../src/config/learn-links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Where the product can be found — one home, because both surfaces print it.
3
+ *
4
+ * The web app's About modal and the bot's `/about` show the same seven
5
+ * places. Kept here rather than in each surface for the reason the 5.0
6
+ * design register keeps giving: a list duplicated across two apps is a list
7
+ * that drifts, and the drift is invisible until somebody notices the bot is
8
+ * advertising a repo that moved two releases ago.
9
+ *
10
+ * Only `label` and `url` live here. Icons are presentation and stay with the
11
+ * surface that draws them — the web app maps these onto its SVG set, the bot
12
+ * renders markdown links.
13
+ *
14
+ * @module config/product-links
15
+ */
16
+ export interface ProductLink {
17
+ /** Display name. Proper nouns — never localised. */
18
+ label: string;
19
+ url: string;
20
+ }
21
+ /**
22
+ * Social presence, in the order both surfaces display it.
23
+ *
24
+ * `github.com/FlashGalatine` is the profile rather than a repository: the
25
+ * project has moved repos once already (the standalone discord-worker into
26
+ * the monorepo), and a profile link survives the next move too.
27
+ */
28
+ export declare const SOCIAL_LINKS: readonly ProductLink[];
29
+ /**
30
+ * The product itself. The web app does not print these (a modal linking to
31
+ * the page it is drawn on says nothing); the bot does, because a Discord
32
+ * reader has no other way in.
33
+ */
34
+ export declare const PRODUCT_LINKS: {
35
+ readonly webApp: {
36
+ readonly label: "Web App";
37
+ readonly url: "https://xivdyetools.app/";
38
+ };
39
+ readonly inviteBot: {
40
+ readonly label: "Invite Bot";
41
+ readonly url: "https://discord.com/oauth2/authorize?client_id=1447108133020369048";
42
+ };
43
+ };
44
+ //# sourceMappingURL=product-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-links.d.ts","sourceRoot":"","sources":["../../src/config/product-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,WAAW,EAQrC,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;;;;;;CAMsB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Where the product can be found — one home, because both surfaces print it.
3
+ *
4
+ * The web app's About modal and the bot's `/about` show the same seven
5
+ * places. Kept here rather than in each surface for the reason the 5.0
6
+ * design register keeps giving: a list duplicated across two apps is a list
7
+ * that drifts, and the drift is invisible until somebody notices the bot is
8
+ * advertising a repo that moved two releases ago.
9
+ *
10
+ * Only `label` and `url` live here. Icons are presentation and stay with the
11
+ * surface that draws them — the web app maps these onto its SVG set, the bot
12
+ * renders markdown links.
13
+ *
14
+ * @module config/product-links
15
+ */
16
+ /**
17
+ * Social presence, in the order both surfaces display it.
18
+ *
19
+ * `github.com/FlashGalatine` is the profile rather than a repository: the
20
+ * project has moved repos once already (the standalone discord-worker into
21
+ * the monorepo), and a profile link survives the next move too.
22
+ */
23
+ export const SOCIAL_LINKS = [
24
+ { label: 'GitHub', url: 'https://github.com/FlashGalatine' },
25
+ { label: 'X/Twitter', url: 'https://x.com/AsheJunius' },
26
+ { label: 'Twitch', url: 'https://www.twitch.tv/flashgalatine' },
27
+ { label: 'Bluesky', url: 'https://bsky.app/profile/projectgalatine.com' },
28
+ { label: 'Discord', url: 'https://discord.gg/5VUSKTZCe5' },
29
+ { label: 'Patreon', url: 'https://patreon.com/ProjectGalatine' },
30
+ { label: 'Ko-fi', url: 'https://ko-fi.com/flashgalatine' },
31
+ ];
32
+ /**
33
+ * The product itself. The web app does not print these (a modal linking to
34
+ * the page it is drawn on says nothing); the bot does, because a Discord
35
+ * reader has no other way in.
36
+ */
37
+ export const PRODUCT_LINKS = {
38
+ webApp: { label: 'Web App', url: 'https://xivdyetools.app/' },
39
+ inviteBot: {
40
+ label: 'Invite Bot',
41
+ url: 'https://discord.com/oauth2/authorize?client_id=1447108133020369048',
42
+ },
43
+ };
44
+ //# sourceMappingURL=product-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-links.js","sourceRoot":"","sources":["../../src/config/product-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,kCAAkC,EAAE;IAC5D,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,0BAA0B,EAAE;IACvD,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,qCAAqC,EAAE;IAC/D,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,8CAA8C,EAAE;IACzE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,+BAA+B,EAAE;IAC1D,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,qCAAqC,EAAE;IAChE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,iCAAiC,EAAE;CAClD,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,0BAA0B,EAAE;IAC7D,SAAS,EAAE;QACT,KAAK,EAAE,YAAY;QACnB,GAAG,EAAE,oEAAoE;KAC1E;CAC6C,CAAC"}
@@ -25,12 +25,25 @@ export declare const VALUE_MAX = 100;
25
25
  * These matrices transform RGB values to simulate different types of colorblindness
26
26
  */
27
27
  export declare const BRETTEL_MATRICES: ColorblindMatrices;
28
+ /**
29
+ * Machado, Oliveira & Fernandes (2009) transformation matrices at severity 1.0.
30
+ *
31
+ * Unlike {@link BRETTEL_MATRICES} (applied to gamma-encoded sRGB by the legacy
32
+ * simulator), these matrices are defined over **linear RGB** — use them only
33
+ * through `ColorblindnessSimulator.simulateColorblindnessMachado`, which
34
+ * linearizes, transforms, and re-encodes.
35
+ *
36
+ * The 5.0 band calibration (SEPARATION cuts) was computed against this set, so
37
+ * any recomputation of those bands must use the Machado path, not Brettel.
38
+ * Achromatopsia is not part of the Machado dichromacy model; it is represented
39
+ * here as Rec. 709 luminance grayscale in linear light.
40
+ */
41
+ export declare const MACHADO_MATRICES: ColorblindMatrices;
28
42
  /**
29
43
  * Regex patterns for validation
30
44
  */
31
45
  export declare const PATTERNS: {
32
46
  readonly HEX_COLOR: RegExp;
33
- readonly RGB_COLOR: RegExp;
34
47
  };
35
48
  /**
36
49
  * Universalis API configuration
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAc,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMzE;;GAEG;AACH,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,OAAO,MAAM,CAAC;AAE3B;;GAEG;AACH,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,SAAS,MAAM,CAAC;AAkC7B;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,kBAqB9B,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,QAAQ;;;CAGX,CAAC;AAMX;;GAEG;AACH,eAAO,MAAM,oBAAoB,mCAAmC,CAAC;AACrE,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,aAAa,QAAgB,CAAC;AAG3C,eAAO,MAAM,iBAAiB,UAAU,CAAC;AACzC,eAAO,MAAM,qBAAqB,QAAc,CAAC;AACjD,eAAO,MAAM,oBAAoB,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAM7D;;GAEG;AACH,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,OAAO,MAAM,CAAC;AAE3B;;GAEG;AACH,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,SAAS,MAAM,CAAC;AAY7B;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,kBAqB9B,CAAC;AAMF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB,EAAE,kBAqB9B,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,QAAQ;;CAEX,CAAC;AAMX;;GAEG;AACH,eAAO,MAAM,oBAAoB,mCAAmC,CAAC;AACrE,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,aAAa,QAAgB,CAAC;AAC3C,eAAO,MAAM,iBAAiB,UAAU,CAAC;AACzC,eAAO,MAAM,qBAAqB,QAAc,CAAC;AACjD,eAAO,MAAM,oBAAoB,MAAM,CAAC"}
@@ -28,25 +28,6 @@ export const VALUE_MAX = 100;
28
28
  */
29
29
  export const COLOR_DISTANCE_MAX = Math.sqrt(255 ** 2 + 255 ** 2 + 255 ** 2); // ~441.67
30
30
  // ============================================================================
31
- // Vision Type Configuration
32
- // ============================================================================
33
- /** @internal */
34
- export const VISION_TYPES = [
35
- 'normal',
36
- 'deuteranopia',
37
- 'protanopia',
38
- 'tritanopia',
39
- 'achromatopsia',
40
- ];
41
- /** @internal */
42
- export const VISION_TYPE_LABELS = {
43
- normal: 'Normal Vision',
44
- deuteranopia: 'Deuteranopia (Red-Green Colorblindness)',
45
- protanopia: 'Protanopia (Red-Green Colorblindness)',
46
- tritanopia: 'Tritanopia (Blue-Yellow Colorblindness)',
47
- achromatopsia: 'Achromatopsia (Total Colorblindness)',
48
- };
49
- // ============================================================================
50
31
  // Colorblindness Transformation Matrices (Brettel 1997)
51
32
  // ============================================================================
52
33
  /**
@@ -76,6 +57,44 @@ export const BRETTEL_MATRICES = {
76
57
  ],
77
58
  };
78
59
  // ============================================================================
60
+ // Colorblindness Transformation Matrices (Machado et al. 2009, severity 1.0)
61
+ // ============================================================================
62
+ /**
63
+ * Machado, Oliveira & Fernandes (2009) transformation matrices at severity 1.0.
64
+ *
65
+ * Unlike {@link BRETTEL_MATRICES} (applied to gamma-encoded sRGB by the legacy
66
+ * simulator), these matrices are defined over **linear RGB** — use them only
67
+ * through `ColorblindnessSimulator.simulateColorblindnessMachado`, which
68
+ * linearizes, transforms, and re-encodes.
69
+ *
70
+ * The 5.0 band calibration (SEPARATION cuts) was computed against this set, so
71
+ * any recomputation of those bands must use the Machado path, not Brettel.
72
+ * Achromatopsia is not part of the Machado dichromacy model; it is represented
73
+ * here as Rec. 709 luminance grayscale in linear light.
74
+ */
75
+ export const MACHADO_MATRICES = {
76
+ protanopia: [
77
+ [0.152286, 1.052583, -0.204868],
78
+ [0.114503, 0.786281, 0.099216],
79
+ [-0.003882, -0.048116, 1.051998],
80
+ ],
81
+ deuteranopia: [
82
+ [0.367322, 0.860646, -0.227968],
83
+ [0.280085, 0.672501, 0.047413],
84
+ [-0.01182, 0.04294, 0.968881],
85
+ ],
86
+ tritanopia: [
87
+ [1.255528, -0.076749, -0.178779],
88
+ [-0.078411, 0.930809, 0.147602],
89
+ [0.004733, 0.691367, 0.3039],
90
+ ],
91
+ achromatopsia: [
92
+ [0.2126, 0.7152, 0.0722],
93
+ [0.2126, 0.7152, 0.0722],
94
+ [0.2126, 0.7152, 0.0722],
95
+ ],
96
+ };
97
+ // ============================================================================
79
98
  // Regular Expressions
80
99
  // ============================================================================
81
100
  /**
@@ -83,7 +102,6 @@ export const BRETTEL_MATRICES = {
83
102
  */
84
103
  export const PATTERNS = {
85
104
  HEX_COLOR: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
86
- RGB_COLOR: /^rgb\(\d+,\s*\d+,\s*\d+\)$/,
87
105
  };
88
106
  // ============================================================================
89
107
  // API Configuration (Universalis)
@@ -99,8 +117,6 @@ export const UNIVERSALIS_API_RETRY_DELAY = 1000; // milliseconds
99
117
  * API caching and rate limiting
100
118
  */
101
119
  export const API_CACHE_TTL = 5 * 60 * 1000; // 5 minutes
102
- /** @internal */
103
- export const API_DEBOUNCE_DELAY = 500; // milliseconds
104
120
  export const API_CACHE_VERSION = '1.0.0'; // Increment to invalidate all cached data
105
121
  export const API_MAX_RESPONSE_SIZE = 1024 * 1024; // 1 MB maximum response size
106
122
  export const API_RATE_LIMIT_DELAY = 200; // milliseconds between requests
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"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"}
@@ -41543,7 +41543,7 @@
41543
41543
  }
41544
41544
  ]
41545
41545
  },
41546
- "Helion": {
41546
+ "Helions": {
41547
41547
  "Male": [
41548
41548
  {
41549
41549
  "index": 0,
@@ -41543,7 +41543,7 @@
41543
41543
  }
41544
41544
  ]
41545
41545
  },
41546
- "Helion": {
41546
+ "Helions": {
41547
41547
  "Male": [
41548
41548
  {
41549
41549
  "index": 0,