@nodaro/shared 1.4.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 (665) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +32 -0
  3. package/dist/index.cjs +12506 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +12269 -0
  6. package/dist/index.d.ts +12269 -0
  7. package/dist/index.js +11831 -0
  8. package/dist/index.js.map +1 -0
  9. package/package.json +54 -0
  10. package/src/__tests__/__snapshots__/prompt-builder-segments.test.ts.snap +65 -0
  11. package/src/__tests__/ai-avatar-pricing.test.ts +321 -0
  12. package/src/__tests__/apply-video-negative-prompt.test.ts +76 -0
  13. package/src/__tests__/attach-columns.test.ts +28 -0
  14. package/src/__tests__/audio-crossfade-curves.test.ts +33 -0
  15. package/src/__tests__/build-model-menu.test.ts +58 -0
  16. package/src/__tests__/character-aspect-defaults.test.ts +142 -0
  17. package/src/__tests__/character-mention-slug.test.ts +199 -0
  18. package/src/__tests__/character-reference-photo-kinds.test.ts +32 -0
  19. package/src/__tests__/character-usage-mode.test.ts +147 -0
  20. package/src/__tests__/character-variant-assets.test.ts +142 -0
  21. package/src/__tests__/character-voice.test.ts +130 -0
  22. package/src/__tests__/cinematic-avatar-pricing.test.ts +119 -0
  23. package/src/__tests__/combine-transitions.test.ts +137 -0
  24. package/src/__tests__/component-types.test.ts +87 -0
  25. package/src/__tests__/condition-variables.test.ts +98 -0
  26. package/src/__tests__/credit-identifiers.test.ts +811 -0
  27. package/src/__tests__/default-video-provider.test.ts +63 -0
  28. package/src/__tests__/entity-image-handle.test.ts +43 -0
  29. package/src/__tests__/entity-variants.test.ts +33 -0
  30. package/src/__tests__/fal-lip-sync-sets.test.ts +31 -0
  31. package/src/__tests__/featured-entities.test.ts +33 -0
  32. package/src/__tests__/film-pricing.test.ts +64 -0
  33. package/src/__tests__/filter-condition.test.ts +285 -0
  34. package/src/__tests__/freecut-protocol.test.ts +35 -0
  35. package/src/__tests__/generate-text-items.test.ts +19 -0
  36. package/src/__tests__/generated-results.test.ts +50 -0
  37. package/src/__tests__/graph-utils.test.ts +618 -0
  38. package/src/__tests__/group-aggregation.test.ts +83 -0
  39. package/src/__tests__/i18n-locale-completeness.test.ts +156 -0
  40. package/src/__tests__/image-critic-node.test.ts +86 -0
  41. package/src/__tests__/image-mask-mode.test.ts +16 -0
  42. package/src/__tests__/image-ref-limit.test.ts +78 -0
  43. package/src/__tests__/inpaint-region.test.ts +24 -0
  44. package/src/__tests__/input-field-map-parity.test.ts +30 -0
  45. package/src/__tests__/json-evaluator.test.ts +289 -0
  46. package/src/__tests__/json-path.test.ts +64 -0
  47. package/src/__tests__/lip-sync-pricing.test.ts +142 -0
  48. package/src/__tests__/list-merge.test.ts +96 -0
  49. package/src/__tests__/list-sort.test.ts +134 -0
  50. package/src/__tests__/llm-models.test.ts +445 -0
  51. package/src/__tests__/location-mention-slug.test.ts +246 -0
  52. package/src/__tests__/locations-coverage-critic-schema.test.ts +92 -0
  53. package/src/__tests__/loop-delimiter.test.ts +39 -0
  54. package/src/__tests__/lottie-slots.test.ts +245 -0
  55. package/src/__tests__/model-catalog-flux2-resolutions.test.ts +21 -0
  56. package/src/__tests__/model-constants-location.test.ts +20 -0
  57. package/src/__tests__/model-constants.test.ts +122 -0
  58. package/src/__tests__/model-tree.test.ts +86 -0
  59. package/src/__tests__/no-internal-imports.test.ts +25 -0
  60. package/src/__tests__/node-default-mappings.test.ts +175 -0
  61. package/src/__tests__/node-mappable-fields.test.ts +7 -0
  62. package/src/__tests__/node-preset-export.test.ts +46 -0
  63. package/src/__tests__/node-preset-extract.test.ts +166 -0
  64. package/src/__tests__/node-refs-canonical.test.ts +54 -0
  65. package/src/__tests__/node-refs-combine.test.ts +54 -0
  66. package/src/__tests__/node-refs.test.ts +187 -0
  67. package/src/__tests__/node-runtime-keys.test.ts +99 -0
  68. package/src/__tests__/object-aspect-defaults.test.ts +59 -0
  69. package/src/__tests__/parameter-node-value.test.ts +137 -0
  70. package/src/__tests__/pinterest-url.test.ts +35 -0
  71. package/src/__tests__/pipeline-chat.test.ts +110 -0
  72. package/src/__tests__/pipeline-validation.test.ts +98 -0
  73. package/src/__tests__/presentation-utils.test.ts +1137 -0
  74. package/src/__tests__/producer-types.test.ts +47 -0
  75. package/src/__tests__/prompt-length-limits.test.ts +156 -0
  76. package/src/__tests__/provider-directive-defaults.test.ts +46 -0
  77. package/src/__tests__/reduce-strategy-registry.test.ts +43 -0
  78. package/src/__tests__/reference-board-templates.test.ts +33 -0
  79. package/src/__tests__/reference-roles.test.ts +36 -0
  80. package/src/__tests__/resolve-field-mappings.test.ts +110 -0
  81. package/src/__tests__/resolve-pipeline-model.test.ts +76 -0
  82. package/src/__tests__/scene-node-types.test.ts +80 -0
  83. package/src/__tests__/scraper-actors.test.ts +67 -0
  84. package/src/__tests__/seedance-2-catalog.test.ts +18 -0
  85. package/src/__tests__/seedance-2-credit-id.test.ts +23 -0
  86. package/src/__tests__/seedance-aspects.test.ts +52 -0
  87. package/src/__tests__/selector.test.ts +1151 -0
  88. package/src/__tests__/settled-with-limit.test.ts +214 -0
  89. package/src/__tests__/social-media-specs.test.ts +129 -0
  90. package/src/__tests__/sub-workflow-validation.test.ts +88 -0
  91. package/src/__tests__/switchx-pricing.test.ts +28 -0
  92. package/src/__tests__/to-connected-references.test.ts +153 -0
  93. package/src/__tests__/utilities.test.ts +541 -0
  94. package/src/__tests__/video-analysis-pricing.test.ts +58 -0
  95. package/src/__tests__/video-analysis.test.ts +63 -0
  96. package/src/__tests__/video-audio-capability.test.ts +204 -0
  97. package/src/__tests__/video-gen-providers.test.ts +28 -0
  98. package/src/__tests__/video-mode-aliases.test.ts +150 -0
  99. package/src/__tests__/video-ref-limits.test.ts +72 -0
  100. package/src/__tests__/video-utils.test.ts +303 -0
  101. package/src/__tests__/voice-changer-models.test.ts +33 -0
  102. package/src/__tests__/workflow-export-strip.test.ts +46 -0
  103. package/src/ai-avatar-pricing.ts +213 -0
  104. package/src/ancestor-refs.ts +48 -0
  105. package/src/animals.ts +231 -0
  106. package/src/audio-crossfade-curves.ts +73 -0
  107. package/src/audio-fx-presets.ts +64 -0
  108. package/src/avatar-payload-validators.ts +214 -0
  109. package/src/caption-styles.ts +31 -0
  110. package/src/character-aspect-defaults.ts +102 -0
  111. package/src/character-facets.ts +37 -0
  112. package/src/character-mention-slug.ts +166 -0
  113. package/src/character-usage-mode.ts +109 -0
  114. package/src/character-variant-assets.ts +121 -0
  115. package/src/character-voice.ts +151 -0
  116. package/src/cinematic-avatar-pricing.ts +111 -0
  117. package/src/clone-utils.ts +46 -0
  118. package/src/combine-transitions.ts +482 -0
  119. package/src/community.ts +112 -0
  120. package/src/component-types.ts +127 -0
  121. package/src/condition-variables.ts +65 -0
  122. package/src/credit-estimators/index.ts +15 -0
  123. package/src/credit-estimators/video-utils.ts +165 -0
  124. package/src/credit-identifiers.ts +304 -0
  125. package/src/entity-approval-types.ts +31 -0
  126. package/src/entity-aspect-defaults.ts +82 -0
  127. package/src/entity-asset-types.ts +296 -0
  128. package/src/entity-image-handle.ts +36 -0
  129. package/src/extra-refs.ts +139 -0
  130. package/src/featured-entities.ts +136 -0
  131. package/src/film-pricing.ts +117 -0
  132. package/src/filter-condition.ts +250 -0
  133. package/src/flux2-pricing.ts +18 -0
  134. package/src/freecut-protocol.ts +52 -0
  135. package/src/furniture.ts +167 -0
  136. package/src/generate-text-items.ts +15 -0
  137. package/src/generated-results.ts +63 -0
  138. package/src/group-aggregation.ts +75 -0
  139. package/src/hint-graph-types.ts +18 -0
  140. package/src/i18n/action-fx.ar.ts +89 -0
  141. package/src/i18n/action-fx.de.ts +89 -0
  142. package/src/i18n/action-fx.es.ts +89 -0
  143. package/src/i18n/action-fx.fr.ts +89 -0
  144. package/src/i18n/action-fx.he.ts +89 -0
  145. package/src/i18n/action-fx.hi.ts +89 -0
  146. package/src/i18n/action-fx.ja.ts +89 -0
  147. package/src/i18n/action-fx.ko.ts +89 -0
  148. package/src/i18n/action-fx.pt-BR.ts +89 -0
  149. package/src/i18n/action-fx.ru.ts +89 -0
  150. package/src/i18n/action-fx.zh-CN.ts +89 -0
  151. package/src/i18n/aesthetic.ar.ts +170 -0
  152. package/src/i18n/aesthetic.de.ts +48 -0
  153. package/src/i18n/aesthetic.es.ts +169 -0
  154. package/src/i18n/aesthetic.fr.ts +52 -0
  155. package/src/i18n/aesthetic.he.ts +169 -0
  156. package/src/i18n/aesthetic.hi.ts +55 -0
  157. package/src/i18n/aesthetic.ja.ts +165 -0
  158. package/src/i18n/aesthetic.ko.ts +169 -0
  159. package/src/i18n/aesthetic.pt-BR.ts +148 -0
  160. package/src/i18n/aesthetic.ru.ts +155 -0
  161. package/src/i18n/aesthetic.zh-CN.ts +172 -0
  162. package/src/i18n/animals.ar.ts +145 -0
  163. package/src/i18n/animals.de.ts +144 -0
  164. package/src/i18n/animals.es.ts +158 -0
  165. package/src/i18n/animals.fr.ts +144 -0
  166. package/src/i18n/animals.he.ts +155 -0
  167. package/src/i18n/animals.hi.ts +157 -0
  168. package/src/i18n/animals.ja.ts +159 -0
  169. package/src/i18n/animals.ko.ts +159 -0
  170. package/src/i18n/animals.pt-BR.ts +157 -0
  171. package/src/i18n/animals.ru.ts +155 -0
  172. package/src/i18n/animals.zh-CN.ts +155 -0
  173. package/src/i18n/atmosphere.ar.ts +49 -0
  174. package/src/i18n/atmosphere.de.ts +47 -0
  175. package/src/i18n/atmosphere.es.ts +50 -0
  176. package/src/i18n/atmosphere.fr.ts +47 -0
  177. package/src/i18n/atmosphere.he.ts +47 -0
  178. package/src/i18n/atmosphere.hi.ts +49 -0
  179. package/src/i18n/atmosphere.ja.ts +49 -0
  180. package/src/i18n/atmosphere.ko.ts +49 -0
  181. package/src/i18n/atmosphere.pt-BR.ts +49 -0
  182. package/src/i18n/atmosphere.ru.ts +47 -0
  183. package/src/i18n/atmosphere.zh-CN.ts +152 -0
  184. package/src/i18n/backdrop.ar.ts +53 -0
  185. package/src/i18n/backdrop.de.ts +46 -0
  186. package/src/i18n/backdrop.es.ts +54 -0
  187. package/src/i18n/backdrop.fr.ts +52 -0
  188. package/src/i18n/backdrop.he.ts +51 -0
  189. package/src/i18n/backdrop.hi.ts +59 -0
  190. package/src/i18n/backdrop.ja.ts +61 -0
  191. package/src/i18n/backdrop.ko.ts +59 -0
  192. package/src/i18n/backdrop.pt-BR.ts +59 -0
  193. package/src/i18n/backdrop.ru.ts +57 -0
  194. package/src/i18n/backdrop.zh-CN.ts +57 -0
  195. package/src/i18n/camera-format.ar.ts +40 -0
  196. package/src/i18n/camera-format.de.ts +37 -0
  197. package/src/i18n/camera-format.es.ts +41 -0
  198. package/src/i18n/camera-format.fr.ts +37 -0
  199. package/src/i18n/camera-format.he.ts +37 -0
  200. package/src/i18n/camera-format.hi.ts +42 -0
  201. package/src/i18n/camera-format.ja.ts +37 -0
  202. package/src/i18n/camera-format.ko.ts +37 -0
  203. package/src/i18n/camera-format.pt-BR.ts +46 -0
  204. package/src/i18n/camera-format.ru.ts +42 -0
  205. package/src/i18n/camera-format.zh-CN.ts +42 -0
  206. package/src/i18n/camera-motions.ar.ts +86 -0
  207. package/src/i18n/camera-motions.de.ts +74 -0
  208. package/src/i18n/camera-motions.es.ts +86 -0
  209. package/src/i18n/camera-motions.fr.ts +86 -0
  210. package/src/i18n/camera-motions.he.ts +86 -0
  211. package/src/i18n/camera-motions.hi.ts +99 -0
  212. package/src/i18n/camera-motions.ja.ts +99 -0
  213. package/src/i18n/camera-motions.ko.ts +99 -0
  214. package/src/i18n/camera-motions.pt-BR.ts +99 -0
  215. package/src/i18n/camera-motions.ru.ts +99 -0
  216. package/src/i18n/camera-motions.zh-CN.ts +99 -0
  217. package/src/i18n/character-fx.ar.ts +72 -0
  218. package/src/i18n/character-fx.de.ts +72 -0
  219. package/src/i18n/character-fx.es.ts +72 -0
  220. package/src/i18n/character-fx.fr.ts +72 -0
  221. package/src/i18n/character-fx.he.ts +72 -0
  222. package/src/i18n/character-fx.hi.ts +72 -0
  223. package/src/i18n/character-fx.ja.ts +72 -0
  224. package/src/i18n/character-fx.ko.ts +72 -0
  225. package/src/i18n/character-fx.pt-BR.ts +72 -0
  226. package/src/i18n/character-fx.ru.ts +72 -0
  227. package/src/i18n/character-fx.zh-CN.ts +72 -0
  228. package/src/i18n/color-look.ar.ts +50 -0
  229. package/src/i18n/color-look.de.ts +47 -0
  230. package/src/i18n/color-look.es.ts +50 -0
  231. package/src/i18n/color-look.fr.ts +50 -0
  232. package/src/i18n/color-look.he.ts +49 -0
  233. package/src/i18n/color-look.hi.ts +52 -0
  234. package/src/i18n/color-look.ja.ts +54 -0
  235. package/src/i18n/color-look.ko.ts +54 -0
  236. package/src/i18n/color-look.pt-BR.ts +54 -0
  237. package/src/i18n/color-look.ru.ts +52 -0
  238. package/src/i18n/color-look.zh-CN.ts +53 -0
  239. package/src/i18n/composition-effects.ar.ts +26 -0
  240. package/src/i18n/composition-effects.de.ts +25 -0
  241. package/src/i18n/composition-effects.es.ts +27 -0
  242. package/src/i18n/composition-effects.fr.ts +25 -0
  243. package/src/i18n/composition-effects.he.ts +25 -0
  244. package/src/i18n/composition-effects.hi.ts +27 -0
  245. package/src/i18n/composition-effects.ja.ts +27 -0
  246. package/src/i18n/composition-effects.ko.ts +27 -0
  247. package/src/i18n/composition-effects.pt-BR.ts +25 -0
  248. package/src/i18n/composition-effects.ru.ts +82 -0
  249. package/src/i18n/composition-effects.zh-CN.ts +25 -0
  250. package/src/i18n/era.ar.ts +37 -0
  251. package/src/i18n/era.de.ts +34 -0
  252. package/src/i18n/era.es.ts +37 -0
  253. package/src/i18n/era.fr.ts +37 -0
  254. package/src/i18n/era.he.ts +36 -0
  255. package/src/i18n/era.hi.ts +39 -0
  256. package/src/i18n/era.ja.ts +41 -0
  257. package/src/i18n/era.ko.ts +39 -0
  258. package/src/i18n/era.pt-BR.ts +41 -0
  259. package/src/i18n/era.ru.ts +121 -0
  260. package/src/i18n/era.zh-CN.ts +39 -0
  261. package/src/i18n/exposure-settings.ar.ts +28 -0
  262. package/src/i18n/exposure-settings.de.ts +26 -0
  263. package/src/i18n/exposure-settings.es.ts +28 -0
  264. package/src/i18n/exposure-settings.fr.ts +29 -0
  265. package/src/i18n/exposure-settings.he.ts +28 -0
  266. package/src/i18n/exposure-settings.hi.ts +31 -0
  267. package/src/i18n/exposure-settings.ja.ts +31 -0
  268. package/src/i18n/exposure-settings.ko.ts +31 -0
  269. package/src/i18n/exposure-settings.pt-BR.ts +31 -0
  270. package/src/i18n/exposure-settings.ru.ts +31 -0
  271. package/src/i18n/exposure-settings.zh-CN.ts +31 -0
  272. package/src/i18n/framing.ar.ts +78 -0
  273. package/src/i18n/framing.de.ts +73 -0
  274. package/src/i18n/framing.es.ts +78 -0
  275. package/src/i18n/framing.fr.ts +78 -0
  276. package/src/i18n/framing.he.ts +77 -0
  277. package/src/i18n/framing.hi.ts +82 -0
  278. package/src/i18n/framing.ja.ts +84 -0
  279. package/src/i18n/framing.ko.ts +82 -0
  280. package/src/i18n/framing.pt-BR.ts +84 -0
  281. package/src/i18n/framing.ru.ts +82 -0
  282. package/src/i18n/framing.zh-CN.ts +82 -0
  283. package/src/i18n/furniture.ar.ts +92 -0
  284. package/src/i18n/furniture.de.ts +93 -0
  285. package/src/i18n/furniture.es.ts +101 -0
  286. package/src/i18n/furniture.fr.ts +93 -0
  287. package/src/i18n/furniture.he.ts +101 -0
  288. package/src/i18n/furniture.hi.ts +101 -0
  289. package/src/i18n/furniture.ja.ts +101 -0
  290. package/src/i18n/furniture.ko.ts +101 -0
  291. package/src/i18n/furniture.pt-BR.ts +101 -0
  292. package/src/i18n/furniture.ru.ts +101 -0
  293. package/src/i18n/furniture.zh-CN.ts +101 -0
  294. package/src/i18n/held-prop.ar.ts +74 -0
  295. package/src/i18n/held-prop.de.ts +65 -0
  296. package/src/i18n/held-prop.es.ts +83 -0
  297. package/src/i18n/held-prop.fr.ts +74 -0
  298. package/src/i18n/held-prop.he.ts +73 -0
  299. package/src/i18n/held-prop.hi.ts +82 -0
  300. package/src/i18n/held-prop.ja.ts +84 -0
  301. package/src/i18n/held-prop.ko.ts +84 -0
  302. package/src/i18n/held-prop.pt-BR.ts +84 -0
  303. package/src/i18n/held-prop.ru.ts +82 -0
  304. package/src/i18n/held-prop.zh-CN.ts +82 -0
  305. package/src/i18n/index.ts +208 -0
  306. package/src/i18n/instrumentation.ar.ts +195 -0
  307. package/src/i18n/instrumentation.de.ts +195 -0
  308. package/src/i18n/instrumentation.es.ts +195 -0
  309. package/src/i18n/instrumentation.fr.ts +195 -0
  310. package/src/i18n/instrumentation.he.ts +195 -0
  311. package/src/i18n/instrumentation.hi.ts +195 -0
  312. package/src/i18n/instrumentation.ja.ts +195 -0
  313. package/src/i18n/instrumentation.ko.ts +195 -0
  314. package/src/i18n/instrumentation.pt-BR.ts +195 -0
  315. package/src/i18n/instrumentation.ru.ts +195 -0
  316. package/src/i18n/instrumentation.zh-CN.ts +195 -0
  317. package/src/i18n/lens.ar.ts +24 -0
  318. package/src/i18n/lens.de.ts +24 -0
  319. package/src/i18n/lens.es.ts +24 -0
  320. package/src/i18n/lens.fr.ts +24 -0
  321. package/src/i18n/lens.he.ts +24 -0
  322. package/src/i18n/lens.hi.ts +24 -0
  323. package/src/i18n/lens.ja.ts +24 -0
  324. package/src/i18n/lens.ko.ts +24 -0
  325. package/src/i18n/lens.pt-BR.ts +24 -0
  326. package/src/i18n/lens.ru.ts +25 -0
  327. package/src/i18n/lens.zh-CN.ts +24 -0
  328. package/src/i18n/lighting.ar.ts +86 -0
  329. package/src/i18n/lighting.de.ts +84 -0
  330. package/src/i18n/lighting.es.ts +89 -0
  331. package/src/i18n/lighting.fr.ts +84 -0
  332. package/src/i18n/lighting.he.ts +88 -0
  333. package/src/i18n/lighting.hi.ts +90 -0
  334. package/src/i18n/lighting.ja.ts +90 -0
  335. package/src/i18n/lighting.ko.ts +90 -0
  336. package/src/i18n/lighting.pt-BR.ts +90 -0
  337. package/src/i18n/lighting.ru.ts +88 -0
  338. package/src/i18n/lighting.zh-CN.ts +92 -0
  339. package/src/i18n/loop-subject.ar.ts +39 -0
  340. package/src/i18n/loop-subject.de.ts +39 -0
  341. package/src/i18n/loop-subject.es.ts +39 -0
  342. package/src/i18n/loop-subject.fr.ts +39 -0
  343. package/src/i18n/loop-subject.he.ts +39 -0
  344. package/src/i18n/loop-subject.hi.ts +39 -0
  345. package/src/i18n/loop-subject.ja.ts +39 -0
  346. package/src/i18n/loop-subject.ko.ts +39 -0
  347. package/src/i18n/loop-subject.pt-BR.ts +39 -0
  348. package/src/i18n/loop-subject.ru.ts +39 -0
  349. package/src/i18n/loop-subject.zh-CN.ts +39 -0
  350. package/src/i18n/materials.ar.ts +80 -0
  351. package/src/i18n/materials.de.ts +80 -0
  352. package/src/i18n/materials.es.ts +87 -0
  353. package/src/i18n/materials.fr.ts +80 -0
  354. package/src/i18n/materials.he.ts +86 -0
  355. package/src/i18n/materials.hi.ts +86 -0
  356. package/src/i18n/materials.ja.ts +88 -0
  357. package/src/i18n/materials.ko.ts +88 -0
  358. package/src/i18n/materials.pt-BR.ts +88 -0
  359. package/src/i18n/materials.ru.ts +86 -0
  360. package/src/i18n/materials.zh-CN.ts +86 -0
  361. package/src/i18n/mood.ar.ts +61 -0
  362. package/src/i18n/mood.de.ts +61 -0
  363. package/src/i18n/mood.es.ts +66 -0
  364. package/src/i18n/mood.fr.ts +61 -0
  365. package/src/i18n/mood.he.ts +64 -0
  366. package/src/i18n/mood.hi.ts +66 -0
  367. package/src/i18n/mood.ja.ts +66 -0
  368. package/src/i18n/mood.ko.ts +66 -0
  369. package/src/i18n/mood.pt-BR.ts +64 -0
  370. package/src/i18n/mood.ru.ts +64 -0
  371. package/src/i18n/mood.zh-CN.ts +64 -0
  372. package/src/i18n/music-genre.ar.ts +302 -0
  373. package/src/i18n/music-genre.de.ts +302 -0
  374. package/src/i18n/music-genre.es.ts +302 -0
  375. package/src/i18n/music-genre.fr.ts +302 -0
  376. package/src/i18n/music-genre.he.ts +302 -0
  377. package/src/i18n/music-genre.hi.ts +302 -0
  378. package/src/i18n/music-genre.ja.ts +302 -0
  379. package/src/i18n/music-genre.ko.ts +302 -0
  380. package/src/i18n/music-genre.pt-BR.ts +302 -0
  381. package/src/i18n/music-genre.ru.ts +302 -0
  382. package/src/i18n/music-genre.zh-CN.ts +302 -0
  383. package/src/i18n/music-mood.ar.ts +75 -0
  384. package/src/i18n/music-mood.de.ts +75 -0
  385. package/src/i18n/music-mood.es.ts +75 -0
  386. package/src/i18n/music-mood.fr.ts +75 -0
  387. package/src/i18n/music-mood.he.ts +75 -0
  388. package/src/i18n/music-mood.hi.ts +75 -0
  389. package/src/i18n/music-mood.ja.ts +75 -0
  390. package/src/i18n/music-mood.ko.ts +75 -0
  391. package/src/i18n/music-mood.pt-BR.ts +75 -0
  392. package/src/i18n/music-mood.ru.ts +75 -0
  393. package/src/i18n/music-mood.zh-CN.ts +75 -0
  394. package/src/i18n/person.ar.ts +638 -0
  395. package/src/i18n/person.de.ts +629 -0
  396. package/src/i18n/person.es.ts +645 -0
  397. package/src/i18n/person.fr.ts +621 -0
  398. package/src/i18n/person.he.ts +656 -0
  399. package/src/i18n/person.hi.ts +654 -0
  400. package/src/i18n/person.ja.ts +662 -0
  401. package/src/i18n/person.ko.ts +662 -0
  402. package/src/i18n/person.pt-BR.ts +656 -0
  403. package/src/i18n/person.ru.ts +656 -0
  404. package/src/i18n/person.zh-CN.ts +656 -0
  405. package/src/i18n/photo-genre.ar.ts +58 -0
  406. package/src/i18n/photo-genre.de.ts +52 -0
  407. package/src/i18n/photo-genre.es.ts +64 -0
  408. package/src/i18n/photo-genre.fr.ts +58 -0
  409. package/src/i18n/photo-genre.he.ts +62 -0
  410. package/src/i18n/photo-genre.hi.ts +63 -0
  411. package/src/i18n/photo-genre.ja.ts +65 -0
  412. package/src/i18n/photo-genre.ko.ts +63 -0
  413. package/src/i18n/photo-genre.pt-BR.ts +65 -0
  414. package/src/i18n/photo-genre.ru.ts +63 -0
  415. package/src/i18n/photo-genre.zh-CN.ts +63 -0
  416. package/src/i18n/photographer.ar.ts +75 -0
  417. package/src/i18n/photographer.de.ts +74 -0
  418. package/src/i18n/photographer.es.ts +77 -0
  419. package/src/i18n/photographer.fr.ts +77 -0
  420. package/src/i18n/photographer.he.ts +78 -0
  421. package/src/i18n/photographer.hi.ts +80 -0
  422. package/src/i18n/photographer.ja.ts +84 -0
  423. package/src/i18n/photographer.ko.ts +84 -0
  424. package/src/i18n/photographer.pt-BR.ts +83 -0
  425. package/src/i18n/photographer.ru.ts +78 -0
  426. package/src/i18n/photographer.zh-CN.ts +78 -0
  427. package/src/i18n/pose.ar.ts +95 -0
  428. package/src/i18n/pose.de.ts +96 -0
  429. package/src/i18n/pose.es.ts +104 -0
  430. package/src/i18n/pose.fr.ts +96 -0
  431. package/src/i18n/pose.he.ts +104 -0
  432. package/src/i18n/pose.hi.ts +104 -0
  433. package/src/i18n/pose.ja.ts +104 -0
  434. package/src/i18n/pose.ko.ts +104 -0
  435. package/src/i18n/pose.pt-BR.ts +104 -0
  436. package/src/i18n/pose.ru.ts +104 -0
  437. package/src/i18n/pose.zh-CN.ts +104 -0
  438. package/src/i18n/post-process-effects.ar.ts +25 -0
  439. package/src/i18n/post-process-effects.de.ts +24 -0
  440. package/src/i18n/post-process-effects.es.ts +26 -0
  441. package/src/i18n/post-process-effects.fr.ts +24 -0
  442. package/src/i18n/post-process-effects.he.ts +24 -0
  443. package/src/i18n/post-process-effects.hi.ts +26 -0
  444. package/src/i18n/post-process-effects.ja.ts +26 -0
  445. package/src/i18n/post-process-effects.ko.ts +26 -0
  446. package/src/i18n/post-process-effects.pt-BR.ts +24 -0
  447. package/src/i18n/post-process-effects.ru.ts +24 -0
  448. package/src/i18n/post-process-effects.zh-CN.ts +24 -0
  449. package/src/i18n/render-quality.ar.ts +34 -0
  450. package/src/i18n/render-quality.de.ts +30 -0
  451. package/src/i18n/render-quality.es.ts +35 -0
  452. package/src/i18n/render-quality.fr.ts +34 -0
  453. package/src/i18n/render-quality.he.ts +33 -0
  454. package/src/i18n/render-quality.hi.ts +39 -0
  455. package/src/i18n/render-quality.ja.ts +39 -0
  456. package/src/i18n/render-quality.ko.ts +39 -0
  457. package/src/i18n/render-quality.pt-BR.ts +37 -0
  458. package/src/i18n/render-quality.ru.ts +37 -0
  459. package/src/i18n/render-quality.zh-CN.ts +37 -0
  460. package/src/i18n/seasons.ar.ts +10 -0
  461. package/src/i18n/seasons.de.ts +10 -0
  462. package/src/i18n/seasons.es.ts +10 -0
  463. package/src/i18n/seasons.fr.ts +10 -0
  464. package/src/i18n/seasons.he.ts +10 -0
  465. package/src/i18n/seasons.hi.ts +10 -0
  466. package/src/i18n/seasons.ja.ts +10 -0
  467. package/src/i18n/seasons.ko.ts +10 -0
  468. package/src/i18n/seasons.pt-BR.ts +10 -0
  469. package/src/i18n/seasons.ru.ts +10 -0
  470. package/src/i18n/seasons.zh-CN.ts +10 -0
  471. package/src/i18n/setting.ar.ts +73 -0
  472. package/src/i18n/setting.de.ts +73 -0
  473. package/src/i18n/setting.es.ts +77 -0
  474. package/src/i18n/setting.fr.ts +73 -0
  475. package/src/i18n/setting.he.ts +76 -0
  476. package/src/i18n/setting.hi.ts +76 -0
  477. package/src/i18n/setting.ja.ts +78 -0
  478. package/src/i18n/setting.ko.ts +76 -0
  479. package/src/i18n/setting.pt-BR.ts +78 -0
  480. package/src/i18n/setting.ru.ts +76 -0
  481. package/src/i18n/setting.zh-CN.ts +76 -0
  482. package/src/i18n/style.ar.ts +55 -0
  483. package/src/i18n/style.de.ts +54 -0
  484. package/src/i18n/style.es.ts +54 -0
  485. package/src/i18n/style.fr.ts +54 -0
  486. package/src/i18n/style.he.ts +54 -0
  487. package/src/i18n/style.hi.ts +54 -0
  488. package/src/i18n/style.ja.ts +54 -0
  489. package/src/i18n/style.ko.ts +54 -0
  490. package/src/i18n/style.pt-BR.ts +56 -0
  491. package/src/i18n/style.ru.ts +54 -0
  492. package/src/i18n/style.zh-CN.ts +54 -0
  493. package/src/i18n/styling.ar.ts +295 -0
  494. package/src/i18n/styling.de.ts +285 -0
  495. package/src/i18n/styling.es.ts +317 -0
  496. package/src/i18n/styling.fr.ts +285 -0
  497. package/src/i18n/styling.he.ts +307 -0
  498. package/src/i18n/styling.hi.ts +323 -0
  499. package/src/i18n/styling.ja.ts +317 -0
  500. package/src/i18n/styling.ko.ts +311 -0
  501. package/src/i18n/styling.pt-BR.ts +301 -0
  502. package/src/i18n/styling.ru.ts +301 -0
  503. package/src/i18n/styling.zh-CN.ts +307 -0
  504. package/src/i18n/temporal.ar.ts +31 -0
  505. package/src/i18n/temporal.de.ts +24 -0
  506. package/src/i18n/temporal.es.ts +27 -0
  507. package/src/i18n/temporal.fr.ts +28 -0
  508. package/src/i18n/temporal.he.ts +31 -0
  509. package/src/i18n/temporal.hi.ts +31 -0
  510. package/src/i18n/temporal.ja.ts +31 -0
  511. package/src/i18n/temporal.ko.ts +31 -0
  512. package/src/i18n/temporal.pt-BR.ts +31 -0
  513. package/src/i18n/temporal.ru.ts +31 -0
  514. package/src/i18n/temporal.zh-CN.ts +31 -0
  515. package/src/i18n/transitions.ar.ts +97 -0
  516. package/src/i18n/transitions.de.ts +97 -0
  517. package/src/i18n/transitions.es.ts +97 -0
  518. package/src/i18n/transitions.fr.ts +97 -0
  519. package/src/i18n/transitions.he.ts +97 -0
  520. package/src/i18n/transitions.hi.ts +97 -0
  521. package/src/i18n/transitions.ja.ts +97 -0
  522. package/src/i18n/transitions.ko.ts +97 -0
  523. package/src/i18n/transitions.pt-BR.ts +97 -0
  524. package/src/i18n/transitions.ru.ts +97 -0
  525. package/src/i18n/transitions.zh-CN.ts +97 -0
  526. package/src/i18n/types.ts +158 -0
  527. package/src/i18n/vehicles.ar.ts +137 -0
  528. package/src/i18n/vehicles.de.ts +125 -0
  529. package/src/i18n/vehicles.es.ts +138 -0
  530. package/src/i18n/vehicles.fr.ts +125 -0
  531. package/src/i18n/vehicles.he.ts +136 -0
  532. package/src/i18n/vehicles.hi.ts +138 -0
  533. package/src/i18n/vehicles.ja.ts +138 -0
  534. package/src/i18n/vehicles.ko.ts +138 -0
  535. package/src/i18n/vehicles.pt-BR.ts +136 -0
  536. package/src/i18n/vehicles.ru.ts +136 -0
  537. package/src/i18n/vehicles.zh-CN.ts +136 -0
  538. package/src/i18n/voice-character.ar.ts +126 -0
  539. package/src/i18n/voice-character.de.ts +126 -0
  540. package/src/i18n/voice-character.es.ts +126 -0
  541. package/src/i18n/voice-character.fr.ts +126 -0
  542. package/src/i18n/voice-character.he.ts +126 -0
  543. package/src/i18n/voice-character.hi.ts +126 -0
  544. package/src/i18n/voice-character.ja.ts +126 -0
  545. package/src/i18n/voice-character.ko.ts +126 -0
  546. package/src/i18n/voice-character.pt-BR.ts +126 -0
  547. package/src/i18n/voice-character.ru.ts +126 -0
  548. package/src/i18n/voice-character.zh-CN.ts +126 -0
  549. package/src/i18n/voice-delivery.ar.ts +77 -0
  550. package/src/i18n/voice-delivery.de.ts +77 -0
  551. package/src/i18n/voice-delivery.es.ts +77 -0
  552. package/src/i18n/voice-delivery.fr.ts +77 -0
  553. package/src/i18n/voice-delivery.he.ts +77 -0
  554. package/src/i18n/voice-delivery.hi.ts +77 -0
  555. package/src/i18n/voice-delivery.ja.ts +77 -0
  556. package/src/i18n/voice-delivery.ko.ts +77 -0
  557. package/src/i18n/voice-delivery.pt-BR.ts +77 -0
  558. package/src/i18n/voice-delivery.ru.ts +77 -0
  559. package/src/i18n/voice-delivery.zh-CN.ts +77 -0
  560. package/src/i18n/weapons.ar.ts +115 -0
  561. package/src/i18n/weapons.de.ts +114 -0
  562. package/src/i18n/weapons.es.ts +116 -0
  563. package/src/i18n/weapons.fr.ts +103 -0
  564. package/src/i18n/weapons.he.ts +114 -0
  565. package/src/i18n/weapons.hi.ts +116 -0
  566. package/src/i18n/weapons.ja.ts +116 -0
  567. package/src/i18n/weapons.ko.ts +116 -0
  568. package/src/i18n/weapons.pt-BR.ts +114 -0
  569. package/src/i18n/weapons.ru.ts +114 -0
  570. package/src/i18n/weapons.zh-CN.ts +114 -0
  571. package/src/image-critic-node.ts +61 -0
  572. package/src/image-critic-types.ts +40 -0
  573. package/src/index.ts +866 -0
  574. package/src/inject-upstream.ts +15 -0
  575. package/src/inpaint-region.ts +51 -0
  576. package/src/json-evaluator.ts +732 -0
  577. package/src/json-path.ts +52 -0
  578. package/src/lip-sync-pricing.ts +90 -0
  579. package/src/list-merge.ts +40 -0
  580. package/src/list-sort.ts +122 -0
  581. package/src/list-source-resolver.ts +50 -0
  582. package/src/llm-models.ts +245 -0
  583. package/src/location-mention-slug.ts +291 -0
  584. package/src/location-preset-catalog-map.ts +128 -0
  585. package/src/loop-delimiter.ts +73 -0
  586. package/src/lora-routing.ts +95 -0
  587. package/src/lottie-overlay-catalog.ts +175 -0
  588. package/src/lottie-slots.ts +309 -0
  589. package/src/model-catalog.ts +2386 -0
  590. package/src/model-constants.ts +1910 -0
  591. package/src/model-tree.ts +120 -0
  592. package/src/monetization.ts +15 -0
  593. package/src/multi-pick.ts +42 -0
  594. package/src/node-default-mappings.ts +262 -0
  595. package/src/node-mappable-fields.ts +70 -0
  596. package/src/node-preset-export.ts +56 -0
  597. package/src/node-preset-extract.ts +147 -0
  598. package/src/node-refs.ts +253 -0
  599. package/src/node-runtime-keys.ts +117 -0
  600. package/src/object-aspect-defaults.ts +72 -0
  601. package/src/object-picker-types.ts +22 -0
  602. package/src/parameter-node-value.ts +284 -0
  603. package/src/pinterest-url.ts +28 -0
  604. package/src/pipeline-chat.ts +72 -0
  605. package/src/pipeline-defaults.ts +318 -0
  606. package/src/pipeline-events.ts +162 -0
  607. package/src/pipeline-state-types.ts +196 -0
  608. package/src/pipeline-types.ts +647 -0
  609. package/src/pipeline-validation.ts +87 -0
  610. package/src/presentation-types.ts +23 -0
  611. package/src/presentation-utils.ts +397 -0
  612. package/src/producer-types.ts +188 -0
  613. package/src/progress-curve.ts +99 -0
  614. package/src/provider-directive-defaults.ts +69 -0
  615. package/src/reduce-strategy-registry.ts +121 -0
  616. package/src/reference-board-templates.ts +81 -0
  617. package/src/reference-roles.ts +153 -0
  618. package/src/reference-sheet/__tests__/board-to-column.test.ts +20 -0
  619. package/src/reference-sheet/__tests__/catalog.test.ts +50 -0
  620. package/src/reference-sheet/__tests__/cost.test.ts +38 -0
  621. package/src/reference-sheet/__tests__/no-drift.test.ts +28 -0
  622. package/src/reference-sheet/__tests__/panel-plan.test.ts +61 -0
  623. package/src/reference-sheet/__tests__/panel-prompts.test.ts +17 -0
  624. package/src/reference-sheet/__tests__/plan-generation.test.ts +72 -0
  625. package/src/reference-sheet/__tests__/presets.test.ts +54 -0
  626. package/src/reference-sheet/__tests__/types.test.ts +24 -0
  627. package/src/reference-sheet/catalog.ts +144 -0
  628. package/src/reference-sheet/cost.ts +37 -0
  629. package/src/reference-sheet/credit-id.ts +7 -0
  630. package/src/reference-sheet/index.ts +8 -0
  631. package/src/reference-sheet/panel-plan.ts +65 -0
  632. package/src/reference-sheet/panel-prompts.ts +14 -0
  633. package/src/reference-sheet/plan-generation.ts +79 -0
  634. package/src/reference-sheet/presets.ts +77 -0
  635. package/src/reference-sheet/types.ts +92 -0
  636. package/src/repeat-types.ts +97 -0
  637. package/src/resolve-field-mappings.ts +119 -0
  638. package/src/route-filter.ts +80 -0
  639. package/src/scene-helper-types.ts +249 -0
  640. package/src/scene-node-types.ts +281 -0
  641. package/src/scraper-actors.ts +57 -0
  642. package/src/scraper-output-schemas.ts +25 -0
  643. package/src/seasons.ts +45 -0
  644. package/src/selector.ts +864 -0
  645. package/src/settled-with-limit.ts +42 -0
  646. package/src/shot-element.ts +43 -0
  647. package/src/social-media-specs.ts +121 -0
  648. package/src/social-post.ts +24 -0
  649. package/src/sub-workflow-validation.ts +78 -0
  650. package/src/supported-fonts.ts +40 -0
  651. package/src/surround.ts +113 -0
  652. package/src/switchx-pricing.ts +33 -0
  653. package/src/text-separators.ts +59 -0
  654. package/src/to-connected-references.ts +77 -0
  655. package/src/types.ts +272 -0
  656. package/src/variant-job-id.ts +17 -0
  657. package/src/vehicles.ts +213 -0
  658. package/src/video-analysis-pricing.ts +74 -0
  659. package/src/video-analysis.ts +127 -0
  660. package/src/video-duration.ts +25 -0
  661. package/src/voice-changer-models.ts +36 -0
  662. package/src/voice-matcher-types.ts +37 -0
  663. package/src/voices.ts +92 -0
  664. package/src/weapons.ts +190 -0
  665. package/src/workflow-export.ts +153 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * i18n resolver + lazy loader for parameter-node picker labels/descriptions.
3
+ *
4
+ * Usage from a picker component:
5
+ *
6
+ * ```ts
7
+ * const locale = useUserLocale() // current user-selected locale
8
+ * await ensureLocaleCatalogLoaded("styling", locale) // call once per (catalog, locale), cached
9
+ * const localized = getLocalizedEntry("styling", entry.id, locale)
10
+ * const label = localized?.label ?? entry.label // fallback to canonical English
11
+ * const description = localized?.description ?? entry.description
12
+ * ```
13
+ *
14
+ * For search filtering, use `entryMatchesQuery(entry, locale, query)` which
15
+ * filters across BOTH the canonical English text AND the localized text.
16
+ */
17
+
18
+ import type { I18nCatalogId, LocaleCatalogMap, LocaleId, LocalizedEntry } from "./types.js"
19
+
20
+ export * from "./types.js"
21
+
22
+ /**
23
+ * In-memory cache of loaded locale catalogs. Key = `<catalog>:<locale>`.
24
+ * `undefined` = never loaded; `null` = loaded but missing/empty.
25
+ */
26
+ const cache = new Map<string, LocaleCatalogMap | null>()
27
+ const inflight = new Map<string, Promise<LocaleCatalogMap | null>>()
28
+
29
+ function cacheKey(catalog: I18nCatalogId, locale: LocaleId): string {
30
+ return `${catalog}:${locale}`
31
+ }
32
+
33
+ /**
34
+ * Lazy-load a sidecar catalog. Returns `null` if the locale is `en` (no
35
+ * sidecar — English lives in the canonical catalog file) or if no sidecar
36
+ * file exists for that (catalog, locale) pair.
37
+ *
38
+ * Implementation note: the dynamic import string is constructed so that
39
+ * Vite can statically analyze the glob and code-split each locale into its
40
+ * own chunk. The `/* @vite-ignore *\/` comment is required because the
41
+ * locale variable defeats Vite's default static analysis; we accept the
42
+ * runtime resolution and rely on the glob-discovery at module init.
43
+ */
44
+ export async function ensureLocaleCatalogLoaded(
45
+ catalog: I18nCatalogId,
46
+ locale: LocaleId,
47
+ ): Promise<LocaleCatalogMap | null> {
48
+ if (locale === "en") return null
49
+ const key = cacheKey(catalog, locale)
50
+ const cached = cache.get(key)
51
+ if (cached !== undefined) return cached
52
+ const existing = inflight.get(key)
53
+ if (existing) return existing
54
+ const promise = loadLocaleCatalog(catalog, locale).then(
55
+ (map) => {
56
+ cache.set(key, map)
57
+ inflight.delete(key)
58
+ return map
59
+ },
60
+ (err) => {
61
+ inflight.delete(key)
62
+ // Cache the failure as null so we don't retry forever
63
+ cache.set(key, null)
64
+ // Don't throw — missing sidecars are expected during gradual rollout;
65
+ // the picker just falls back to English.
66
+ console.warn(`[i18n] failed to load ${key}:`, err)
67
+ return null
68
+ },
69
+ )
70
+ inflight.set(key, promise)
71
+ return promise
72
+ }
73
+
74
+ /**
75
+ * Resolved value lookup. Reads from the in-memory cache; returns `undefined`
76
+ * if the locale's catalog hasn't been loaded yet (caller should await
77
+ * `ensureLocaleCatalogLoaded` first).
78
+ */
79
+ export function getLocalizedEntry(
80
+ catalog: I18nCatalogId,
81
+ id: string,
82
+ locale: LocaleId,
83
+ ): LocalizedEntry | undefined {
84
+ if (locale === "en") return undefined
85
+ const map = cache.get(cacheKey(catalog, locale))
86
+ if (!map) return undefined
87
+ return map[id]
88
+ }
89
+
90
+ /**
91
+ * Synchronous resolver that returns the best label available right now.
92
+ * Falls back to `englishLabel` when no translation exists (or the locale
93
+ * sidecar isn't loaded yet).
94
+ */
95
+ export function resolveLabel(
96
+ catalog: I18nCatalogId,
97
+ id: string,
98
+ englishLabel: string,
99
+ locale: LocaleId,
100
+ ): string {
101
+ if (locale === "en") return englishLabel
102
+ return getLocalizedEntry(catalog, id, locale)?.label ?? englishLabel
103
+ }
104
+
105
+ /**
106
+ * Synchronous resolver that returns the best description available now.
107
+ * Falls back to `englishDescription` when no translation exists.
108
+ */
109
+ export function resolveDescription(
110
+ catalog: I18nCatalogId,
111
+ id: string,
112
+ englishDescription: string,
113
+ locale: LocaleId,
114
+ ): string {
115
+ if (locale === "en") return englishDescription
116
+ return getLocalizedEntry(catalog, id, locale)?.description ?? englishDescription
117
+ }
118
+
119
+ /**
120
+ * Search predicate: returns true if `query` matches either the canonical
121
+ * English label/description or the localized label/description for the
122
+ * current locale.
123
+ *
124
+ * Empty query always matches.
125
+ */
126
+ export function entryMatchesQuery(
127
+ catalog: I18nCatalogId,
128
+ id: string,
129
+ englishLabel: string,
130
+ englishDescription: string,
131
+ locale: LocaleId,
132
+ query: string,
133
+ ): boolean {
134
+ const q = query.trim().toLowerCase()
135
+ if (!q) return true
136
+ if (englishLabel.toLowerCase().includes(q)) return true
137
+ if (englishDescription.toLowerCase().includes(q)) return true
138
+ if (locale === "en") return false
139
+ const localized = getLocalizedEntry(catalog, id, locale)
140
+ if (!localized) return false
141
+ if (localized.label && localized.label.toLowerCase().includes(q)) return true
142
+ if (localized.description && localized.description.toLowerCase().includes(q)) return true
143
+ return false
144
+ }
145
+
146
+ /**
147
+ * Sidecar loader registry. Populated by the consuming app via
148
+ * `registerSidecarLoaders` at startup.
149
+ *
150
+ * Why externalised: this package is bundled by tsup for npm publish, and
151
+ * `tsup` does NOT expand Vite's `import.meta.glob`. Calling it from inside
152
+ * the bundled module yields an empty loader map at runtime → all pickers
153
+ * silently fall back to English regardless of the user's locale.
154
+ *
155
+ * The frontend (which is processed by Vite) owns the glob — see
156
+ * `frontend/src/lib/i18n-bootstrap.ts`. Backend / Node tests don't need
157
+ * picker translations and simply skip registration.
158
+ *
159
+ * Keys are file paths relative to `packages/shared/src/i18n/`, e.g.
160
+ * `"./person.ja.ts"`.
161
+ */
162
+ type SidecarModule = { default?: LocaleCatalogMap } & Record<string, unknown>
163
+ export type SidecarLoader = () => Promise<unknown>
164
+
165
+ let sidecarLoaders: Record<string, SidecarLoader> = {}
166
+
167
+ /**
168
+ * Register the map of locale-sidecar loaders. Call once at app startup
169
+ * before any picker mounts.
170
+ *
171
+ * In Vite-processed code:
172
+ * ```ts
173
+ * import { registerSidecarLoaders } from "@nodaro/shared"
174
+ * registerSidecarLoaders(
175
+ * import.meta.glob("../../packages/shared/src/i18n/*.*.ts"),
176
+ * )
177
+ * ```
178
+ */
179
+ export function registerSidecarLoaders(loaders: Record<string, SidecarLoader>): void {
180
+ sidecarLoaders = loaders
181
+ }
182
+
183
+ async function loadLocaleCatalog(
184
+ catalog: I18nCatalogId,
185
+ locale: LocaleId,
186
+ ): Promise<LocaleCatalogMap | null> {
187
+ if (locale === "en") return null
188
+ // Match by suffix so the registry survives different glob roots —
189
+ // frontend's bootstrap globs from a different relative path than
190
+ // this file lives at, so keys look like ".../i18n/person.ja.ts".
191
+ const suffix = `${catalog}.${locale}.ts`
192
+ const matchKey = Object.keys(sidecarLoaders).find((k) =>
193
+ k.endsWith(`/${suffix}`) || k === `./${suffix}`,
194
+ )
195
+ const loader = matchKey ? sidecarLoaders[matchKey] : undefined
196
+ if (!loader) return null
197
+ try {
198
+ const mod = (await loader()) as SidecarModule
199
+ if (mod.default && typeof mod.default === "object") return mod.default
200
+ // Fallback: convention-named export (e.g. STYLING_FR)
201
+ const conventional = `${catalog.toUpperCase().replace(/-/g, "_")}_${locale.toUpperCase().replace(/-/g, "_")}`
202
+ const named = mod[conventional]
203
+ if (named && typeof named === "object") return named as LocaleCatalogMap
204
+ return null
205
+ } catch {
206
+ return null
207
+ }
208
+ }
@@ -0,0 +1,195 @@
1
+ import type { LocaleCatalogMap } from "./types.js"
2
+
3
+ const map: LocaleCatalogMap = {
4
+ // -------------------- INSTRUMENTS: Drums --------------------
5
+ "drums": { label: "طبول", description: "طقم طبول صوتي" },
6
+ "drum-machine": { label: "آلة الطبول", description: "إيقاعات مبرمجة" },
7
+ "808": { description: "باس وطقم Roland TR-808" },
8
+ "live-drums": { label: "طبول حية", description: "طقم صوتي مسجل" },
9
+ "breakbeats": { label: "بريك بيتس", description: "حلقات طبول مأخوذة كعينات" },
10
+ "trap-drums": { label: "طبول تراب", description: "تتابعات هاي هات + 808" },
11
+
12
+ // -------------------- INSTRUMENTS: Percussion --------------------
13
+ "bongos": { label: "بونغو", description: "زوج من الطبول الكوبية الصغيرة" },
14
+ "conga": { label: "كونغا", description: "طبل عالٍ بوجه واحد" },
15
+ "djembe": { label: "جمبي", description: "طبل على شكل كأس من غرب أفريقيا" },
16
+ "timbales": { label: "تيمبالس", description: "طبول معدنية كوبية مزدوجة" },
17
+ "tambourine": { label: "دف", description: "صنوج تُهز باليد" },
18
+ "shaker": { label: "هزّاز", description: "خشخيشة معبأة" },
19
+ "cowbell": { label: "جرس البقرة", description: "جرس بقرة محمول باليد" },
20
+ "maracas": { label: "ماراكاس", description: "زوج هزازات لاتينية" },
21
+ "claves": { label: "كلاڤيس", description: "عصي خشبية" },
22
+ "marimba": { label: "ماريمبا", description: "لوحة مفاتيح بمطارق خشبية" },
23
+ "vibraphone": { label: "ڤيبرافون", description: "مطرقة برنان كهربائي" },
24
+ "xylophone": { label: "إكسيلوفون", description: "مطرقة خشبية، صوت ساطع" },
25
+ "glockenspiel": { label: "غلوكنشپيل", description: "أجراس مطرقة عالية النبرة" },
26
+ "timpani": { label: "تيمباني", description: "طبل أوركسترالي كبير" },
27
+ "taiko": { label: "تايكو", description: "طبل فرقة ياباني" },
28
+ "frame-drum": { label: "طبل إطاري", description: "طبل دائري ضحل" },
29
+ "cajon": { label: "كاخون", description: "طبل بيروفي على شكل صندوق" },
30
+ "darbuka": { label: "دربوكة", description: "طبل كأسي من الشرق الأوسط" },
31
+
32
+ // -------------------- INSTRUMENTS: Keys --------------------
33
+ "piano": { label: "بيانو", description: "بيانو كبير أو قائم صوتي" },
34
+ "electric-piano": { label: "بيانو كهربائي", description: "بأسلوب Rhodes / Wurlitzer" },
35
+ "wurlitzer": { description: "بيانو كهربائي Wurlitzer كلاسيكي" },
36
+ "rhodes": { description: "بيانو كهربائي Rhodes كلاسيكي" },
37
+ "clavinet": { label: "كلاڤينيت", description: "Hohner D6 فانكي" },
38
+ "organ": { label: "أرغن", description: "Hammond أو أرغن أنابيب" },
39
+ "hammond-organ": { description: "أرغن B3 سول / روك" },
40
+ "pipe-organ": { label: "أرغن الأنابيب", description: "كاتدرائية / كنيسة" },
41
+ "accordion": { label: "أكورديون", description: "قصبات يحركها منفاخ" },
42
+ "mellotron": { label: "ميلوترون", description: "لوحة مفاتيح بحلقات شريط" },
43
+ "harpsichord": { label: "هاربسيكورد", description: "لوحة مفاتيح بأوتار منقورة" },
44
+ "celesta": { label: "سيليستا", description: "لوحة مفاتيح بصوت أجراس" },
45
+
46
+ // -------------------- INSTRUMENTS: Synth --------------------
47
+ "synthesizer": { label: "مؤلف توليفي", description: "مؤلف تناظري أو رقمي" },
48
+ "lead-synth": { label: "سينث رئيسي", description: "سينث لحني حاد" },
49
+ "pluck-synth": { label: "سينث منقور", description: "نغمة قصيرة منقورة" },
50
+ "pads": { label: "وسائد سينث", description: "نسيج سينث ممتد" },
51
+ "arpeggiator": { label: "أربيجياتور", description: "أنماط أربيجيو متسلسلة" },
52
+ "vocoder": { description: "سينث معدّل بالصوت" },
53
+ "talkbox": { description: "سينث مشكّل بالفم" },
54
+ "modular-synth": { label: "موديولاري", description: "سينث تناظري قابل للتوصيل" },
55
+ "fm-synth": { label: "سينث FM", description: "سينث تعديل التردد" },
56
+ "wavetable-synth": { label: "ويڤتيبل", description: "سينث مسح جدول الموجات" },
57
+ "stab-synth": { label: "ستاب", description: "وتر قصير إيقاعي" },
58
+
59
+ // -------------------- INSTRUMENTS: Guitar --------------------
60
+ "acoustic-guitar": { label: "جيتار صوتي", description: "أوتار فولاذية أو نايلون" },
61
+ "electric-guitar": { label: "جيتار كهربائي", description: "جسم صلب، غالباً مشوّه" },
62
+ "classical-guitar": { label: "جيتار كلاسيكي", description: "أوتار نايلون، نقر بالأصابع" },
63
+ "12-string-guitar": { label: "جيتار 12 وتراً", description: "ضرب بأوتار مزدوجة" },
64
+ "pedal-steel": { label: "بيدال ستيل", description: "ستيل انزلاقي ريفي" },
65
+ "lap-steel": { label: "لاب ستيل", description: "ستيل هاواي على الحجر" },
66
+ "dobro": { label: "دوبرو", description: "جيتار رنّان" },
67
+ "banjo": { label: "بانجو", description: "5 أوتار أو تينور" },
68
+ "mandolin": { label: "ماندولين", description: "فولك / بلوغراس" },
69
+ "ukulele": { label: "يوكوليلي", description: "يوكوليلي سوبرانو-تينور" },
70
+
71
+ // -------------------- INSTRUMENTS: Bass --------------------
72
+ "bass-guitar": { label: "جيتار باس", description: "باس كهربائي منخفض النبرة" },
73
+ "synth-bass": { label: "باس سينث", description: "ترددات منخفضة مولّفة" },
74
+ "sub-bass": { label: "ساب باس", description: "ترددات ساب جيبية عميقة" },
75
+ "acoustic-bass": { label: "باس صوتي", description: "جيتار باس صوتي" },
76
+ "upright-bass": { label: "كونترباص قائم", description: "كونترباص، أسلوب جاز" },
77
+ "fretless-bass": { label: "باس بدون عتبات", description: "جيتار باس انزلاقي" },
78
+ "acid-bass": { label: "باس أسيد", description: "TB-303 squelch" },
79
+ "wobble-bass": { label: "باس ووبل", description: "دبستب معدّل بـ LFO" },
80
+ "reese-bass": { label: "باس Reese", description: "دروم آند باس مفكوك التوليف" },
81
+
82
+ // -------------------- INSTRUMENTS: Brass --------------------
83
+ "brass": { label: "قسم النحاسيات", description: "بوق، ترومبون، إلخ" },
84
+ "trumpet": { label: "بوق", description: "بوق منفرد" },
85
+ "trombone": { label: "ترومبون", description: "ترومبون منفرد" },
86
+ "french-horn": { label: "بوق فرنسي", description: "نحاس ناعم" },
87
+ "tuba": { label: "توبا", description: "أدنى النحاسيات نبرة" },
88
+ "saxophone": { label: "ساكسوفون", description: "ساكسوفون منفرد أو في قسم" },
89
+ "flugelhorn": { label: "فلوغلهورن", description: "ابن عم البوق الناعم" },
90
+ "cornet": { label: "كورنيت", description: "كورنيت فرقة نحاسية" },
91
+ "muted-trumpet": { label: "بوق مكتوم", description: "بوق جاز مكتوم" },
92
+
93
+ // -------------------- INSTRUMENTS: Woodwinds --------------------
94
+ "flute": { label: "فلوت", description: "فلوت حفلات" },
95
+ "clarinet": { label: "كلارينت", description: "كلارينت منفرد" },
96
+ "harmonica": { label: "هارمونيكا", description: "هارمونيكا بلوز" },
97
+ "oboe": { label: "أوبوا", description: "تحركه قصبة، حزين" },
98
+ "bassoon": { label: "باسون", description: "قصبة مزدوجة منخفضة" },
99
+ "english-horn": { label: "بوق إنجليزي", description: "أوبوا تينور" },
100
+ "piccolo": { label: "بيكولو", description: "فلوت عالي النبرة" },
101
+ "recorder": { label: "ريكوردر", description: "آلة نفخ خشبية ناعمة الصوت" },
102
+ "pan-flute": { label: "فلوت بان", description: "فلوت أنابيب من الأنديز" },
103
+
104
+ // -------------------- INSTRUMENTS: Strings --------------------
105
+ "strings": { label: "قسم الأوتار", description: "قسم أوتار أوركسترالي" },
106
+ "violin": { label: "كمان", description: "كمان منفرد" },
107
+ "viola": { label: "ڤيولا", description: "ڤيولا منفردة" },
108
+ "cello": { label: "تشيلو", description: "تشيلو منفرد" },
109
+ "double-bass": { label: "كونترباص", description: "كونترباص أوركسترالي" },
110
+ "harp": { label: "قيثارة", description: "قيثارة حفلات أو فولك" },
111
+ "pizzicato-strings": { label: "بيتزيكاتو", description: "أوتار منقورة" },
112
+ "staccato-strings": { label: "ستاكاتو", description: "أوتار قصيرة وقوية" },
113
+ "fiddle": { label: "كمان فولك", description: "كمان بأسلوب فولك" },
114
+
115
+ // -------------------- INSTRUMENTS: World --------------------
116
+ "sitar": { label: "سيتار", description: "آلة هندية ذات رقبة طويلة" },
117
+ "tabla": { label: "تابلا", description: "طبول يدوية هندية" },
118
+ "steel-drum": { label: "طبل فولاذي", description: "ستيل بان من ترينيداد" },
119
+ "kalimba": { label: "كاليمبا", description: "بيانو الإبهام الأفريقي" },
120
+ "bagpipes": { label: "مزمار القربة", description: "مزمار القربة الاسكتلندي" },
121
+ "didgeridoo": { label: "ديدجريدو", description: "آلة نفخ أسترالية" },
122
+ "oud": { label: "عود", description: "عود شرق أوسطي" },
123
+ "erhu": { label: "إرهو", description: "كمان صيني ذو وترين" },
124
+ "koto": { label: "كوتو", description: "قانون ياباني" },
125
+ "shakuhachi": { label: "شاكوهاتشي", description: "فلوت ياباني ينفخ من الطرف" },
126
+ "shamisen": { label: "شاميسن", description: "عود ياباني ذو 3 أوتار" },
127
+ "duduk": { label: "دودوك", description: "قصبة مزدوجة أرمنية" },
128
+ "balalaika": { label: "بالالايكا", description: "عود روسي مثلث" },
129
+ "bouzouki": { label: "بوزوكي", description: "عود يوناني طويل العنق" },
130
+ "kora": { label: "كورا", description: "آلة 21 وتراً من غرب أفريقيا" },
131
+ "hang-drum": { label: "طبل هانغ", description: "هاندبان فولاذي" },
132
+
133
+ // -------------------- INSTRUMENTS: Middle Eastern --------------------
134
+ "kamancheh": { label: "كمنجة", description: "آلة وترية فارسية ذات قوس وسنّ" },
135
+ "ney": { label: "ناي", description: "ناي قصبي يُنفخ من الطرف (فارسي/عربي)" },
136
+ "santur": { label: "سنطور", description: "آلة وترية فارسية تُعزف بالمطارق" },
137
+
138
+ // -------------------- PRODUCTION_STYLES --------------------
139
+ "polished": { label: "مصقولة", description: "إنتاج نقي وسائد" },
140
+ "lo-fi": { description: "هسهسة شريط دافئة، غير مثالية" },
141
+ "raw": { label: "خام", description: "بدون فلترة، إحساس مباشر" },
142
+ "vintage": { label: "كلاسيكي", description: "دفء تناظري" },
143
+ "modern": { label: "حديث", description: "رقمي معاصر" },
144
+ "minimalist": { label: "بساطة", description: "متناثر، مقيّد" },
145
+ "wall-of-sound": { label: "جدار الصوت", description: "كثيف، متعدد الطبقات" },
146
+ "ambient": { label: "أمبيانت", description: "جو، مع تردد صدى" },
147
+ "garage-band": { label: "فرقة الكراج", description: "DIY، مسجل في القبو" },
148
+ "live-recording": { label: "حي", description: "صوت حفل / غرفة" },
149
+ "demo-quality": { label: "ديمو", description: "جمالية ديمو خام" },
150
+ "studio-pristine": { label: "استوديو نقي", description: "جودة مرجعية هاي فاي" },
151
+ "tape-saturated": { label: "شريط مشبع", description: "دفء شريط تناظري + تشغيل" },
152
+ "8-bit-retro": { label: "8-bit ريترو", description: "صوت ألعاب ريترو منخفض المعدل" },
153
+
154
+ // -------------------- VOCAL_PRESENCE --------------------
155
+ "instrumental": { label: "آلي", description: "بدون غناء (حصري)" },
156
+ "male-lead": { label: "غناء رجالي رئيسي", description: "غناء رجالي رئيسي" },
157
+ "female-lead": { label: "غناء نسائي رئيسي", description: "غناء نسائي رئيسي" },
158
+ "androgynous-lead": { label: "محايد جنسياً", description: "غناء رئيسي محايد جنسياً" },
159
+ "duet": { label: "ثنائي", description: "مغنيان رئيسيان" },
160
+ "choir": { label: "جوقة", description: "غناء جوقة / مجموعة" },
161
+ "gospel-choir": { label: "جوقة غوسبل", description: "جوقة دعم بأسلوب غوسبل" },
162
+ "harmony-stack": { label: "تكديس الهارمونيات", description: "هارمونيات صوتية مكدسة" },
163
+ "rapper-lead": { label: "مؤدي راب", description: "راب رئيسي" },
164
+ "spoken-word": { label: "كلمة منطوقة", description: "إلقاء / شعر فوق الموسيقى" },
165
+ "vocal-chops": { label: "قطع صوتية", description: "أصوات مأخوذة كعينات ومقطعة" },
166
+ "mixed": { label: "مختلط", description: "عدة مغنين رئيسيين" },
167
+
168
+ // -------------------- SINGING_STYLES --------------------
169
+ "pop-singing": { description: "أسلوب رئيسي سائد" },
170
+ "rock-singing": { description: "أداء صوتي بأسلوب الروك" },
171
+ "operatic": { label: "أوبرالي", description: "تقنية أوبرا كلاسيكية" },
172
+ "classical-vocals": { label: "كلاسيكي", description: "صوت كلاسيكي مدرّب" },
173
+ "rap": { label: "راب", description: "أداء منطوق إيقاعي" },
174
+ "trap-melodic": { label: "تراب (لحني)", description: "تراب لحني مع أوتو تيون" },
175
+ "growl": { label: "غراول", description: "غراول بأسلوب ديث ميتال" },
176
+ "scream": { label: "صراخ", description: "هاردكور / مصروخ" },
177
+ "shout": { label: "نداء", description: "نداء بانك / مرتل" },
178
+ "falsetto": { label: "فالسيتو", description: "نطاق عالٍ، خفيف" },
179
+ "head-voice": { label: "صوت الرأس", description: "نطاق عالٍ رنّان" },
180
+ "chest-voice": { label: "صوت الصدر", description: "نطاق منخفض قوي" },
181
+ "belting": { label: "بلتنغ", description: "نغمات عالية قوية ممتدة" },
182
+ "crooning": { label: "كرونينغ", description: "رومانسي كلاسيكي ناعم" },
183
+ "scat": { label: "سكات", description: "مقاطع جاز مرتجلة" },
184
+ "yodeling": { label: "يودلينغ", description: "تحول النطاق الألبي" },
185
+ "throat-singing": { label: "غناء الحلق", description: "نغمات إضافية منغولية / توڤانية" },
186
+ "melismatic": { label: "ميليسماتي", description: "جريات متعددة النغمات لكل مقطع" },
187
+ "autotuned": { label: "مضبوط بالأوتو تيون", description: "غناء مصحح الطبقة، معالج" },
188
+ "vocoded": { label: "معالج بالڤوكودر", description: "أصوات معالجة بالڤوكودر" },
189
+ "whisper-singing": { label: "غناء همسي", description: "غناء هادئ وحميمي" },
190
+ "breathy-singing": { label: "نَفَسي", description: "غناء هوائي حميمي" },
191
+ "harmonized": { label: "متناغم", description: "هارمونيات متعددة الأصوات" },
192
+ "chant": { label: "ترتيل", description: "ترتيل ليتورجي / رهباني" },
193
+ }
194
+
195
+ export default map
@@ -0,0 +1,195 @@
1
+ import type { LocaleCatalogMap } from "./types.js"
2
+
3
+ const map: LocaleCatalogMap = {
4
+ // -------------------- INSTRUMENTS: Drums --------------------
5
+ "drums": { label: "Schlagzeug", description: "Akustisches Schlagzeug" },
6
+ "drum-machine": { label: "Drumcomputer", description: "Programmierte Beats" },
7
+ "808": { description: "Roland TR-808 Bass + Kit" },
8
+ "live-drums": { label: "Live-Schlagzeug", description: "Aufgenommenes akustisches Kit" },
9
+ "breakbeats": { description: "Gesampelte Drum-Loops" },
10
+ "trap-drums": { label: "Trap-Drums", description: "Hi-Hat-Rolls + 808" },
11
+
12
+ // -------------------- INSTRUMENTS: Percussion --------------------
13
+ "bongos": { description: "Paar kleine kubanische Trommeln" },
14
+ "conga": { description: "Hohe einfellige Trommel" },
15
+ "djembe": { label: "Djembé", description: "Becherförmige westafrikanische Trommel" },
16
+ "timbales": { description: "Kubanisches Metalltrommel-Paar" },
17
+ "tambourine": { label: "Tamburin", description: "Mit der Hand geschüttelte Schellen" },
18
+ "shaker": { description: "Gefüllte Rassel" },
19
+ "cowbell": { label: "Kuhglocke", description: "Handgehaltene Kuhglocke" },
20
+ "maracas": { description: "Lateinamerikanisches Shaker-Paar" },
21
+ "claves": { description: "Holzstäbe" },
22
+ "marimba": { description: "Holzschlägel-Tastatur" },
23
+ "vibraphone": { label: "Vibraphon", description: "Schlägel mit elektrischem Resonator" },
24
+ "xylophone": { label: "Xylophon", description: "Holzschlägel, hell" },
25
+ "glockenspiel": { description: "Hohe Schlägelglocken" },
26
+ "timpani": { label: "Pauken", description: "Große Orchesterpauke" },
27
+ "taiko": { description: "Japanische Ensemble-Trommel" },
28
+ "frame-drum": { label: "Rahmentrommel", description: "Flache runde Trommel" },
29
+ "cajon": { label: "Cajón", description: "Boxförmige peruanische Trommel" },
30
+ "darbuka": { label: "Darbuka", description: "Nahöstliche Kelchtrommel" },
31
+
32
+ // -------------------- INSTRUMENTS: Keys --------------------
33
+ "piano": { label: "Klavier", description: "Akustischer Flügel oder Pianino" },
34
+ "electric-piano": { label: "E-Piano", description: "Rhodes-/Wurlitzer-Stil" },
35
+ "wurlitzer": { description: "Vintage Wurlitzer E-Piano" },
36
+ "rhodes": { description: "Vintage Rhodes E-Piano" },
37
+ "clavinet": { description: "Funky Hohner D6" },
38
+ "organ": { label: "Orgel", description: "Hammond oder Pfeifenorgel" },
39
+ "hammond-organ": { description: "Soul/Rock B3-Orgel" },
40
+ "pipe-organ": { label: "Pfeifenorgel", description: "Kathedrale / Kirche" },
41
+ "accordion": { label: "Akkordeon", description: "Balgbetriebenes Rohrblatt" },
42
+ "mellotron": { description: "Tape-Loop-Tastatur" },
43
+ "harpsichord": { label: "Cembalo", description: "Tastatur mit gezupften Saiten" },
44
+ "celesta": { description: "Glockenähnliche Tastatur" },
45
+
46
+ // -------------------- INSTRUMENTS: Synth --------------------
47
+ "synthesizer": { description: "Analoger oder digitaler Synth" },
48
+ "lead-synth": { label: "Lead-Synth", description: "Schneidender melodischer Synth" },
49
+ "pluck-synth": { label: "Pluck-Synth", description: "Kurze, gezupfte Klangfarbe" },
50
+ "pads": { label: "Synth-Pads", description: "Gehaltene Synth-Texturen" },
51
+ "arpeggiator": { description: "Sequenzierte Arp-Pattern" },
52
+ "vocoder": { description: "Stimmmodulierter Synth" },
53
+ "talkbox": { description: "Mundgeformter Synth" },
54
+ "modular-synth": { label: "Modular", description: "Patchbarer Analog-Synth" },
55
+ "fm-synth": { description: "Frequenzmodulations-Synth" },
56
+ "wavetable-synth": { label: "Wavetable", description: "Wavetable-Scanning-Synth" },
57
+ "stab-synth": { label: "Stab", description: "Kurzer, perkussiver Akkord" },
58
+
59
+ // -------------------- INSTRUMENTS: Guitar --------------------
60
+ "acoustic-guitar": { label: "Akustische Gitarre", description: "Stahl- oder Nylonsaiten" },
61
+ "electric-guitar": { label: "E-Gitarre", description: "Solid-Body, oft verzerrt" },
62
+ "classical-guitar": { label: "Klassische Gitarre", description: "Nylonsaiten, Fingerstyle" },
63
+ "12-string-guitar": { label: "12-Saiten-Gitarre", description: "Doppelchörige Schlaggitarre" },
64
+ "pedal-steel": { description: "Country-Gleitsteel" },
65
+ "lap-steel": { description: "Hawaiianische Schoßsteel" },
66
+ "dobro": { description: "Resonator-Gitarre" },
67
+ "banjo": { description: "5-saitig oder Tenor" },
68
+ "mandolin": { label: "Mandoline", description: "Folk / Bluegrass" },
69
+ "ukulele": { description: "Sopran-Tenor-Uke" },
70
+
71
+ // -------------------- INSTRUMENTS: Bass --------------------
72
+ "bass-guitar": { label: "Bassgitarre", description: "Tieffrequenter E-Bass" },
73
+ "synth-bass": { label: "Synth-Bass", description: "Synthetisierte Tiefen" },
74
+ "sub-bass": { description: "Tiefe Sinus-Sub-Frequenzen" },
75
+ "acoustic-bass": { label: "Akustikbass", description: "Akustische Bassgitarre" },
76
+ "upright-bass": { label: "Kontrabass", description: "Kontrabass, Jazz-Stil" },
77
+ "fretless-bass": { description: "Bundlose, gleitende Bassgitarre" },
78
+ "acid-bass": { description: "TB-303-Squelch" },
79
+ "wobble-bass": { description: "LFO-modulierter Dubstep" },
80
+ "reese-bass": { description: "Verstimmter Drum-and-Bass" },
81
+
82
+ // -------------------- INSTRUMENTS: Brass --------------------
83
+ "brass": { label: "Bläsersatz", description: "Trompete, Posaune usw." },
84
+ "trumpet": { label: "Trompete", description: "Solo-Trompete" },
85
+ "trombone": { label: "Posaune", description: "Solo-Posaune" },
86
+ "french-horn": { label: "Waldhorn", description: "Weiche Blechbläser" },
87
+ "tuba": { description: "Tiefste Blechbläser" },
88
+ "saxophone": { label: "Saxophon", description: "Solo- oder Sektions-Sax" },
89
+ "flugelhorn": { label: "Flügelhorn", description: "Weicher Trompeten-Verwandter" },
90
+ "cornet": { label: "Kornett", description: "Brassband-Kornett" },
91
+ "muted-trumpet": { label: "Gedämpfte Trompete", description: "Gedämpfte Jazz-Trompete" },
92
+
93
+ // -------------------- INSTRUMENTS: Woodwinds --------------------
94
+ "flute": { label: "Flöte", description: "Konzertflöte" },
95
+ "clarinet": { label: "Klarinette", description: "Solo-Klarinette" },
96
+ "harmonica": { label: "Mundharmonika", description: "Blues-Harp" },
97
+ "oboe": { description: "Rohrblatt-getrieben, klagend" },
98
+ "bassoon": { label: "Fagott", description: "Tiefes Doppelrohrblatt" },
99
+ "english-horn": { label: "Englischhorn", description: "Tenor-Oboe" },
100
+ "piccolo": { label: "Piccoloflöte", description: "Hohe Flöte" },
101
+ "recorder": { label: "Blockflöte", description: "Weich klingendes Holzblasinstrument" },
102
+ "pan-flute": { label: "Panflöte", description: "Andine Pfeifenflöte" },
103
+
104
+ // -------------------- INSTRUMENTS: Strings --------------------
105
+ "strings": { label: "Streichersatz", description: "Orchestraler Streichersatz" },
106
+ "violin": { label: "Violine", description: "Solo-Violine" },
107
+ "viola": { label: "Bratsche", description: "Solo-Bratsche" },
108
+ "cello": { description: "Solo-Cello" },
109
+ "double-bass": { label: "Kontrabass", description: "Orchestraler Kontrabass" },
110
+ "harp": { label: "Harfe", description: "Konzert- oder Folk-Harfe" },
111
+ "pizzicato-strings": { label: "Pizzicato", description: "Gezupfte Streicher" },
112
+ "staccato-strings": { label: "Staccato", description: "Kurze, knackige Streicher" },
113
+ "fiddle": { label: "Fiedel", description: "Folk-Stil-Violine" },
114
+
115
+ // -------------------- INSTRUMENTS: World --------------------
116
+ "sitar": { description: "Indisches Instrument mit langem Hals" },
117
+ "tabla": { description: "Indische Handtrommeln" },
118
+ "steel-drum": { label: "Steeldrum", description: "Trinidadisches Steelpan" },
119
+ "kalimba": { description: "Afrikanisches Daumenklavier" },
120
+ "bagpipes": { label: "Dudelsack", description: "Schottischer Dudelsack" },
121
+ "didgeridoo": { description: "Australisches Blasinstrument" },
122
+ "oud": { description: "Nahöstliche Laute" },
123
+ "erhu": { description: "Chinesische 2-saitige Fiedel" },
124
+ "koto": { description: "Japanische Zither" },
125
+ "shakuhachi": { description: "Japanische Längsflöte" },
126
+ "shamisen": { description: "Japanische 3-saitige Laute" },
127
+ "duduk": { description: "Armenisches Doppelrohrblatt" },
128
+ "balalaika": { description: "Russische dreieckige Laute" },
129
+ "bouzouki": { description: "Griechische langhalsige Laute" },
130
+ "kora": { description: "Westafrikanisches 21-Saiten-Instrument" },
131
+ "hang-drum": { description: "Stahl-Handpan" },
132
+
133
+ // -------------------- INSTRUMENTS: Middle Eastern --------------------
134
+ "kamancheh": { description: "Persische Stachelgeige mit Bogen" },
135
+ "ney": { description: "Persisch/arabische endgeblasene Rohrflöte" },
136
+ "santur": { description: "Persisches Hackbrett" },
137
+
138
+ // -------------------- PRODUCTION_STYLES --------------------
139
+ "polished": { label: "Poliert", description: "Makellose, Mainstream-Produktion" },
140
+ "lo-fi": { description: "Warmes Bandrauschen, unvollkommen" },
141
+ "raw": { label: "Roh", description: "Ungefiltert, Live-Gefühl" },
142
+ "vintage": { description: "Analoge Wärme" },
143
+ "modern": { description: "Zeitgenössisch digital" },
144
+ "minimalist": { label: "Minimalistisch", description: "Sparsam, zurückhaltend" },
145
+ "wall-of-sound": { label: "Wall of Sound", description: "Dicht, geschichtet" },
146
+ "ambient": { description: "Atmosphärisch, hallig" },
147
+ "garage-band": { label: "Garagenband", description: "DIY, im Keller aufgenommen" },
148
+ "live-recording": { label: "Live", description: "Konzert-/Raumklang" },
149
+ "demo-quality": { label: "Demo", description: "Rohe Demo-Ästhetik" },
150
+ "studio-pristine": { label: "Studio-Brillanz", description: "Hi-Fi-Referenzqualität" },
151
+ "tape-saturated": { label: "Bandsättigung", description: "Analoge Bandwärme + Drive" },
152
+ "8-bit-retro": { description: "Niedrig aufgelöste Retro-Spielaudio" },
153
+
154
+ // -------------------- VOCAL_PRESENCE --------------------
155
+ "instrumental": { description: "Keine Vocals (exklusiv)" },
156
+ "male-lead": { label: "Männlicher Lead", description: "Männlicher Lead-Gesang" },
157
+ "female-lead": { label: "Weiblicher Lead", description: "Weiblicher Lead-Gesang" },
158
+ "androgynous-lead": { label: "Androgyn", description: "Geschlechtsneutraler Lead" },
159
+ "duet": { label: "Duett", description: "Zwei Lead-Sänger" },
160
+ "choir": { label: "Chor", description: "Chor- / Ensemblegesang" },
161
+ "gospel-choir": { label: "Gospelchor", description: "Gospel-Backing-Chor" },
162
+ "harmony-stack": { label: "Harmoniestapel", description: "Geschichtete Vocal-Harmonien" },
163
+ "rapper-lead": { label: "Rapper", description: "Rap-Lead" },
164
+ "spoken-word": { label: "Spoken Word", description: "Gesprochenes / Gedicht über Musik" },
165
+ "vocal-chops": { description: "Geschnittene Sample-Vocals" },
166
+ "mixed": { label: "Gemischt", description: "Mehrere Lead-Sänger" },
167
+
168
+ // -------------------- SINGING_STYLES --------------------
169
+ "pop-singing": { description: "Mainstream-Lead-Stil" },
170
+ "rock-singing": { description: "Rock-Stil-Gesangsdarbietung" },
171
+ "operatic": { label: "Opernhaft", description: "Klassische Operntechnik" },
172
+ "classical-vocals": { label: "Klassisch", description: "Geschulte klassische Stimme" },
173
+ "rap": { description: "Rhythmische gesprochene Darbietung" },
174
+ "trap-melodic": { label: "Trap (Melodisch)", description: "Melodischer Trap, autotune" },
175
+ "growl": { description: "Death-Metal-Style-Growl" },
176
+ "scream": { label: "Schrei", description: "Hardcore / geschrien" },
177
+ "shout": { label: "Ruf", description: "Punk- / Sprechgesang-Ruf" },
178
+ "falsetto": { label: "Falsett", description: "Hohe Lage, leicht" },
179
+ "head-voice": { label: "Kopfstimme", description: "Resonante hohe Lage" },
180
+ "chest-voice": { label: "Bruststimme", description: "Starke, tiefe Lage" },
181
+ "belting": { description: "Kraftvolle gehaltene Höhen" },
182
+ "crooning": { description: "Sanftes vintage-romantisches Singen" },
183
+ "scat": { label: "Scat-Gesang", description: "Improvisierte Jazz-Silben" },
184
+ "yodeling": { label: "Jodeln", description: "Alpiner Registerwechsel" },
185
+ "throat-singing": { label: "Kehlkopfgesang", description: "Mongolische / tuvinische Obertöne" },
186
+ "melismatic": { label: "Melismatisch", description: "Mehrtonläufe pro Silbe" },
187
+ "autotuned": { label: "Autogetuned", description: "Tonhöhenkorrigiert, bearbeitet" },
188
+ "vocoded": { label: "Vocodiert", description: "Vocoder-bearbeitete Vocals" },
189
+ "whisper-singing": { label: "Flüstergesang", description: "Gedämpftes, intimes Singen" },
190
+ "breathy-singing": { label: "Hauchig", description: "Luftiges, intimes Singen" },
191
+ "harmonized": { label: "Harmonisiert", description: "Mehrstimmige Harmonien" },
192
+ "chant": { label: "Choralgesang", description: "Liturgischer / Mönchsgesang" },
193
+ }
194
+
195
+ export default map