@nodaro/shared 2.17.0 → 2.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/index.cjs +260 -14
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +111 -6
  4. package/dist/index.d.ts +111 -6
  5. package/dist/index.js +251 -15
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__tests__/apply-video-negative-prompt.test.ts +38 -1
  9. package/src/__tests__/credit-identifiers.test.ts +47 -0
  10. package/src/__tests__/gvp-supported-providers.test.ts +22 -1
  11. package/src/__tests__/prompt-length-limits.test.ts +4 -0
  12. package/src/__tests__/video-audio-capability.test.ts +43 -0
  13. package/src/__tests__/video-mode-for-inputs.test.ts +1 -1
  14. package/src/__tests__/wan-3-catalog.test.ts +243 -0
  15. package/src/credit-identifiers.ts +42 -9
  16. package/src/i18n/held-prop.ar.ts +2 -0
  17. package/src/i18n/held-prop.de.ts +3 -0
  18. package/src/i18n/held-prop.es.ts +3 -0
  19. package/src/i18n/held-prop.fr.ts +2 -0
  20. package/src/i18n/held-prop.he.ts +3 -0
  21. package/src/i18n/held-prop.hi.ts +2 -0
  22. package/src/i18n/held-prop.ja.ts +3 -0
  23. package/src/i18n/held-prop.ko.ts +3 -0
  24. package/src/i18n/held-prop.pt-BR.ts +3 -0
  25. package/src/i18n/held-prop.ru.ts +2 -0
  26. package/src/i18n/held-prop.zh-CN.ts +3 -0
  27. package/src/i18n/person.ar.ts +3 -0
  28. package/src/i18n/person.de.ts +4 -0
  29. package/src/i18n/person.es.ts +4 -0
  30. package/src/i18n/person.fr.ts +3 -0
  31. package/src/i18n/person.he.ts +4 -0
  32. package/src/i18n/person.hi.ts +3 -0
  33. package/src/i18n/person.ja.ts +4 -0
  34. package/src/i18n/person.ko.ts +4 -0
  35. package/src/i18n/person.pt-BR.ts +4 -0
  36. package/src/i18n/person.ru.ts +3 -0
  37. package/src/i18n/person.zh-CN.ts +4 -0
  38. package/src/i18n/setting.ar.ts +2 -0
  39. package/src/i18n/setting.de.ts +3 -0
  40. package/src/i18n/setting.es.ts +3 -0
  41. package/src/i18n/setting.fr.ts +2 -0
  42. package/src/i18n/setting.he.ts +3 -0
  43. package/src/i18n/setting.hi.ts +2 -0
  44. package/src/i18n/setting.ja.ts +3 -0
  45. package/src/i18n/setting.ko.ts +3 -0
  46. package/src/i18n/setting.pt-BR.ts +3 -0
  47. package/src/i18n/setting.ru.ts +2 -0
  48. package/src/i18n/setting.zh-CN.ts +3 -0
  49. package/src/i18n/style.ar.ts +2 -0
  50. package/src/i18n/style.de.ts +3 -0
  51. package/src/i18n/style.es.ts +3 -0
  52. package/src/i18n/style.fr.ts +2 -0
  53. package/src/i18n/style.he.ts +3 -0
  54. package/src/i18n/style.hi.ts +2 -0
  55. package/src/i18n/style.ja.ts +3 -0
  56. package/src/i18n/style.ko.ts +3 -0
  57. package/src/i18n/style.pt-BR.ts +3 -0
  58. package/src/i18n/style.ru.ts +2 -0
  59. package/src/i18n/style.zh-CN.ts +3 -0
  60. package/src/i18n/styling.ar.ts +4 -0
  61. package/src/i18n/styling.de.ts +5 -0
  62. package/src/i18n/styling.es.ts +5 -0
  63. package/src/i18n/styling.fr.ts +4 -0
  64. package/src/i18n/styling.he.ts +5 -0
  65. package/src/i18n/styling.hi.ts +4 -0
  66. package/src/i18n/styling.ja.ts +5 -0
  67. package/src/i18n/styling.ko.ts +5 -0
  68. package/src/i18n/styling.pt-BR.ts +5 -0
  69. package/src/i18n/styling.ru.ts +4 -0
  70. package/src/i18n/styling.zh-CN.ts +5 -0
  71. package/src/index.ts +10 -0
  72. package/src/model-catalog.ts +101 -0
  73. package/src/model-constants.ts +217 -8
  74. package/src/node-default-mappings.ts +5 -0
  75. package/src/video-ui-defaults.ts +66 -0
@@ -79,6 +79,9 @@ const map: LocaleCatalogMap = {
79
79
  "compass": { label: "나침반", description: "탐험을 위한 손에 든 항해용 나침반입니다" },
80
80
  "bow-and-arrow": { label: "활과 화살", description: "화살을 메긴 채 당겨진 양궁 활입니다" },
81
81
  "shield": { label: "방패", description: "중세 / 판타지 분위기의 손에 든 방패입니다" },
82
+
83
+ // --- picker-gaps 2026-09-01 ---
84
+ "work-gloves": { label: "작업용 장갑", description: "손에 든 낡은 가죽 작업용 장갑입니다" },
82
85
  }
83
86
 
84
87
  export default map
@@ -79,6 +79,9 @@ const map: LocaleCatalogMap = {
79
79
  "compass": { label: "Bússola", description: "Bússola náutica de mão, exploração" },
80
80
  "bow-and-arrow": { label: "Arco e Flecha", description: "Arco de arquearia esticado com flecha encaixada" },
81
81
  "shield": { label: "Escudo", description: "Escudo de mão, medieval ou fantasia" },
82
+
83
+ // --- picker-gaps 2026-09-01 ---
84
+ "work-gloves": { label: "Luvas de Trabalho", description: "Luvas de couro de trabalho gastas seguradas na mão" },
82
85
  }
83
86
 
84
87
  export default map
@@ -77,6 +77,8 @@ const map: LocaleCatalogMap = {
77
77
  "compass": { label: "Компас", description: "Ручной морской компас, исследование" },
78
78
  "bow-and-arrow": { label: "Лук со стрелой", description: "Натянутый лук с наложенной стрелой" },
79
79
  "shield": { label: "Щит", description: "Ручной щит, средневековый или фэнтезийный" },
80
+ // --- picker-gaps 2026-09-01 ---
81
+ "work-gloves": { label: "Рабочие перчатки", description: "Поношенные кожаные рабочие перчатки в руке" },
80
82
  }
81
83
 
82
84
  export default map
@@ -77,6 +77,9 @@ const map: LocaleCatalogMap = {
77
77
  "compass": { label: "指南针", description: "手持航海指南针,探险感" },
78
78
  "bow-and-arrow": { label: "弓与箭", description: "拉满的弓,搭着箭" },
79
79
  "shield": { label: "盾牌", description: "手持的盾牌,中世纪 / 奇幻风" },
80
+
81
+ // --- picker-gaps 2026-09-01 ---
82
+ "work-gloves": { label: "工作手套", description: "手中拿着的磨旧皮革工作手套" },
80
83
  }
81
84
 
82
85
  export default map
@@ -633,6 +633,9 @@ const map: LocaleCatalogMap = {
633
633
  "lips-full-lower": { label: "شفة سفلى ممتلئة", description: "شفاه ممتلئة مع شفة سفلى أكثر امتلاء" },
634
634
  "lips-natural": { label: "طبيعي", description: "شكل شفاه طبيعي" },
635
635
  "lips-heart": { label: "قلب", description: "شفاه على شكل قلب مع قوس كيوبيد محدد" },
636
+ // --- picker-gaps 2026-09-01 ---
637
+ "samarkand-silk-road": { label: "طريق حرير سمرقند", description: "جمالية بازار طريق الحرير الأوزبكي (سمرقند / بخارى)" },
638
+ "tashkent-modern": { label: "طشقند الحديثة", description: "جمالية آسيا الوسطى الأوزبكية الحضرية المعاصرة" },
636
639
  }
637
640
 
638
641
  export default map
@@ -624,6 +624,10 @@ const map: LocaleCatalogMap = {
624
624
  "lips-full-lower": { label: "Volle Unterlippe", description: "Volle Lippen mit vollerer Unterlippe" },
625
625
  "lips-natural": { label: "Natürlich", description: "Natürliche Lippenform" },
626
626
  "lips-heart": { label: "Herzförmig", description: "Herzförmige Lippen mit ausgeprägtem Amorbogen" },
627
+
628
+ // --- picker-gaps 2026-09-01 ---
629
+ "samarkand-silk-road": { label: "Samarkand Seidenstraße", description: "Usbekische Seidenstraßen-Basar-Ästhetik (Samarkand / Buchara)" },
630
+ "tashkent-modern": { label: "Taschkent Modern", description: "Zeitgenössische usbekische, großstädtische zentralasiatische Ästhetik" },
627
631
  }
628
632
 
629
633
  export default map
@@ -640,6 +640,10 @@ const map: LocaleCatalogMap = {
640
640
  "lips-full-lower": { label: "Labio Inferior Lleno", description: "Labios llenos con un labio inferior más lleno" },
641
641
  "lips-natural": { label: "Natural", description: "Forma de labios natural" },
642
642
  "lips-heart": { label: "Corazón", description: "Labios en forma de corazón con un arco de cupido definido" },
643
+
644
+ // --- picker-gaps 2026-09-01 ---
645
+ "samarkand-silk-road": { label: "Ruta de la Seda de Samarcanda", description: "Estética de bazar uzbeka de la Ruta de la Seda (Samarcanda / Bujará)" },
646
+ "tashkent-modern": { label: "Taskent Moderno", description: "Estética centroasiática metropolitana uzbeka contemporánea" },
643
647
  }
644
648
 
645
649
  export default map
@@ -616,6 +616,9 @@ const map: LocaleCatalogMap = {
616
616
  "lips-full-lower": { label: "Lèvre inférieure pleine", description: "Lèvres pleines avec une lèvre inférieure plus pleine" },
617
617
  "lips-natural": { label: "Naturelle", description: "Forme de lèvres naturelle" },
618
618
  "lips-heart": { label: "Cœur", description: "Lèvres en forme de cœur avec un arc de Cupidon défini" },
619
+ // --- picker-gaps 2026-09-01 ---
620
+ "samarkand-silk-road": { label: "Route de la soie de Samarcande", description: "Esthétique de bazar de la Route de la soie ouzbek (Samarcande / Boukhara)" },
621
+ "tashkent-modern": { label: "Tachkent moderne", description: "Esthétique métropolitaine ouzbèke contemporaine d'Asie centrale" },
619
622
  }
620
623
 
621
624
  export default map
@@ -651,6 +651,10 @@ const map: LocaleCatalogMap = {
651
651
  "lips-full-lower": { label: "שפה תחתונה מלאה", description: "שפתיים מלאות עם שפה תחתונה מלאה יותר" },
652
652
  "lips-natural": { label: "טבעי", description: "צורת שפתיים טבעית" },
653
653
  "lips-heart": { label: "לב", description: "שפתיים בצורת לב עם קשת קופידון מוגדרת" },
654
+
655
+ // --- picker-gaps 2026-09-01 ---
656
+ "samarkand-silk-road": { label: "דרך המשי סמרקנד", description: "אסתטיקת בזאר אוזבקית של דרך המשי (סמרקנד / בוכרה)" },
657
+ "tashkent-modern": { label: "טשקנט מודרני", description: "אסתטיקה מרכז-אסייתית אוזבקית מטרופוליטנית עכשווית" },
654
658
  }
655
659
 
656
660
  export default map
@@ -649,6 +649,9 @@ const map: LocaleCatalogMap = {
649
649
  "lips-full-lower": { label: "भरा निचला होंठ", description: "भरे होंठ जिनमें निचला होंठ अधिक भरा" },
650
650
  "lips-natural": { label: "प्राकृतिक", description: "प्राकृतिक होंठों का आकार" },
651
651
  "lips-heart": { label: "दिल", description: "दिल-आकार के होंठ जिनमें परिभाषित cupid's bow" },
652
+ // --- picker-gaps 2026-09-01 ---
653
+ "samarkand-silk-road": { label: "समरकंद सिल्क रोड", description: "उज़्बेक सिल्क रोड बाज़ार सौंदर्यबोध (समरकंद / बुखारा)" },
654
+ "tashkent-modern": { label: "ताशकंद मॉडर्न", description: "समकालीन उज़्बेक महानगरीय मध्य एशियाई सौंदर्यबोध" },
652
655
  }
653
656
 
654
657
  export default map
@@ -657,6 +657,10 @@ const map: LocaleCatalogMap = {
657
657
  "lips-full-lower": { label: "下唇が厚い", description: "下唇がより厚い、ふっくらした唇" },
658
658
  "lips-natural": { label: "ナチュラル", description: "自然な唇の形" },
659
659
  "lips-heart": { label: "ハート型", description: "はっきりとしたキューピッドボウのあるハート型の唇" },
660
+
661
+ // --- picker-gaps 2026-09-01 ---
662
+ "samarkand-silk-road": { label: "サマルカンド・シルクロード", description: "ウズベキスタンのシルクロードのバザール美学(サマルカンド/ブハラ)" },
663
+ "tashkent-modern": { label: "タシケント・モダン", description: "現代ウズベキスタンの大都市的な中央アジア美学" },
660
664
  }
661
665
 
662
666
  export default map
@@ -657,6 +657,10 @@ const map: LocaleCatalogMap = {
657
657
  "lips-full-lower": { label: "도톰한 아랫입술", description: "아랫입술이 더 도톰한 풍성한 입술입니다" },
658
658
  "lips-natural": { label: "자연스러운", description: "자연스러운 입술 모양입니다" },
659
659
  "lips-heart": { label: "하트형", description: "또렷한 큐피드 보우가 있는 하트 모양 입술입니다" },
660
+
661
+ // --- picker-gaps 2026-09-01 ---
662
+ "samarkand-silk-road": { label: "사마르칸트 실크로드", description: "우즈베크 실크로드 바자르 미감 (사마르칸트 / 부하라)" },
663
+ "tashkent-modern": { label: "타슈켄트 모던", description: "현대적인 우즈베크 대도시 중앙아시아 미감" },
660
664
  }
661
665
 
662
666
  export default map
@@ -651,6 +651,10 @@ const map: LocaleCatalogMap = {
651
651
  "lips-full-lower": { label: "Lábio Inferior Cheio", description: "Lábios cheios com um lábio inferior mais cheio" },
652
652
  "lips-natural": { label: "Natural", description: "Formato de lábios natural" },
653
653
  "lips-heart": { label: "Coração", description: "Lábios em formato de coração com um arco do cupido definido" },
654
+
655
+ // --- picker-gaps 2026-09-01 ---
656
+ "samarkand-silk-road": { label: "Rota da Seda de Samarcanda", description: "Estética de bazar da Rota da Seda uzbeque (Samarcanda / Bukhara)" },
657
+ "tashkent-modern": { label: "Tashkent Moderna", description: "Estética centro-asiática metropolitana uzbeque contemporânea" },
654
658
  }
655
659
 
656
660
  export default map
@@ -651,6 +651,9 @@ const map: LocaleCatalogMap = {
651
651
  "lips-full-lower": { label: "Полная нижняя губа", description: "Полные губы с более полной нижней губой" },
652
652
  "lips-natural": { label: "Натуральная", description: "Натуральная форма губ" },
653
653
  "lips-heart": { label: "Сердечком", description: "Губы в форме сердца с выраженной «лук Купидона»" },
654
+ // --- picker-gaps 2026-09-01 ---
655
+ "samarkand-silk-road": { label: "Самаркандский Шёлковый путь", description: "Эстетика узбекского базара Шёлкового пути (Самарканд / Бухара)" },
656
+ "tashkent-modern": { label: "Современный Ташкент", description: "Современная узбекская столичная центральноазиатская эстетика" },
654
657
  }
655
658
 
656
659
  export default map
@@ -651,6 +651,10 @@ const map: LocaleCatalogMap = {
651
651
  "lips-full-lower": { label: "下唇丰满", description: "下唇更为丰满的丰润嘴唇" },
652
652
  "lips-natural": { label: "自然", description: "自然的唇形" },
653
653
  "lips-heart": { label: "心形唇", description: "唇峰分明的心形嘴唇" },
654
+
655
+ // --- picker-gaps 2026-09-01 ---
656
+ "samarkand-silk-road": { label: "撒马尔罕丝绸之路", description: "乌兹别克丝绸之路集市美学(撒马尔罕 / 布哈拉)" },
657
+ "tashkent-modern": { label: "现代塔什干", description: "当代乌兹别克都市中亚美学" },
654
658
  }
655
659
 
656
660
  export default map
@@ -68,6 +68,8 @@ const map: LocaleCatalogMap = {
68
68
  "locker-room": { label: "غرفة خزائن", description: "غرفة خزائن صالة رياضية ببلاط ومقاعد ومرايا" },
69
69
  "music-studio": { label: "استوديو موسيقي", description: "استوديو تسجيل بميكروفونات وإسفنج ولوحة تحكم" },
70
70
  "conservatory": { label: "بيت زجاجي", description: "بيت زجاجي بجدران زجاجية ونباتات استوائية وشمس مفلترة" },
71
+ // --- picker-gaps 2026-09-01 ---
72
+ "open-air-market": { label: "سوق مكشوف", description: "سوق صاخب من أكشاك الباعة تحت المظلات" },
71
73
  }
72
74
 
73
75
  export default map
@@ -68,6 +68,9 @@ const map: LocaleCatalogMap = {
68
68
  "locker-room": { label: "Umkleideraum", description: "Sport-/Fitnessstudio-Umkleide, Fliesen, Bänke, Spiegel" },
69
69
  "music-studio": { label: "Tonstudio", description: "Aufnahmestudio, Mikrofone, Schaumstoff, Mischpult" },
70
70
  "conservatory": { label: "Wintergarten", description: "Glaswandiger Wintergarten, tropische Pflanzen, gefiltertes Sonnenlicht" },
71
+
72
+ // --- picker-gaps 2026-09-01 ---
73
+ "open-air-market": { label: "Freiluftmarkt", description: "Belebter Markt mit Verkaufsständen unter Planen" },
71
74
  }
72
75
 
73
76
  export default map
@@ -72,6 +72,9 @@ const map: LocaleCatalogMap = {
72
72
  "locker-room": { label: "Vestuario", description: "Vestuario de gimnasio o deportes, azulejos, bancos, espejos" },
73
73
  "music-studio": { label: "Estudio de Música", description: "Estudio de grabación, micrófonos, espuma, mesa de control" },
74
74
  "conservatory": { label: "Invernadero", description: "Invernadero con paredes de cristal, plantas tropicales, sol filtrado" },
75
+
76
+ // --- picker-gaps 2026-09-01 ---
77
+ "open-air-market": { label: "Mercado al Aire Libre", description: "Mercado bullicioso de puestos de vendedores bajo toldos" },
75
78
  }
76
79
 
77
80
  export default map
@@ -68,6 +68,8 @@ const map: LocaleCatalogMap = {
68
68
  "locker-room": { label: "Vestiaire", description: "Vestiaire de gym/sport, carrelage, bancs, miroirs" },
69
69
  "music-studio": { label: "Studio d'enregistrement", description: "Studio d'enregistrement, microphones, mousse, console de mixage" },
70
70
  "conservatory": { label: "Jardin d'hiver", description: "Serre aux parois de verre, plantes tropicales, lumière filtrée" },
71
+ // --- picker-gaps 2026-09-01 ---
72
+ "open-air-market": { label: "Marché en plein air", description: "Marché animé d'étals de vendeurs sous des auvents" },
71
73
  }
72
74
 
73
75
  export default map
@@ -71,6 +71,9 @@ const map: LocaleCatalogMap = {
71
71
  "locker-room": { label: "חדר הלבשה", description: "חדר הלבשה של חדר כושר / ספורט, קרמיקה, ספסלים, מראות" },
72
72
  "music-studio": { label: "אולפן הקלטות", description: "אולפן הקלטות, מיקרופונים, ספוג, קונסולת בקרה" },
73
73
  "conservatory": { label: "חממה זכוכית", description: "חממה עם קירות זכוכית, צמחים טרופיים, שמש מסוננת" },
74
+
75
+ // --- picker-gaps 2026-09-01 ---
76
+ "open-air-market": { label: "שוק פתוח", description: "שוק שוקק של דוכני מוכרים תחת סככות" },
74
77
  }
75
78
 
76
79
  export default map
@@ -71,6 +71,8 @@ const map: LocaleCatalogMap = {
71
71
  "haunted-mansion": { label: "Haunted Mansion", description: "टूटा-फूटा gothic घर" },
72
72
  "dreamscape": { label: "Dreamscape", description: "Surreal तैरते द्वीप" },
73
73
  "wasteland": { label: "Post-Apocalyptic Wasteland", description: "जंग लगा बादल भरा wasteland" },
74
+ // --- picker-gaps 2026-09-01 ---
75
+ "open-air-market": { label: "खुला बाज़ार", description: "शामियानों के नीचे विक्रेता स्टॉलों का हलचल भरा बाज़ार" },
74
76
  }
75
77
 
76
78
  export default map
@@ -73,6 +73,9 @@ const map: LocaleCatalogMap = {
73
73
  "locker-room": { label: "ロッカールーム", description: "ジム/スポーツ用ロッカールーム、タイル、ベンチ、鏡" },
74
74
  "music-studio": { label: "音楽スタジオ", description: "レコーディングスタジオ、マイク、防音材、ミキシングコンソール" },
75
75
  "conservatory": { label: "コンサバトリー(温室)", description: "ガラス張りの温室、熱帯植物、漉した光" },
76
+
77
+ // --- picker-gaps 2026-09-01 ---
78
+ "open-air-market": { label: "野外市場", description: "天蓋の下に露店が並ぶ賑やかな市場" },
76
79
  }
77
80
 
78
81
  export default map
@@ -71,6 +71,9 @@ const map: LocaleCatalogMap = {
71
71
  "locker-room": { label: "라커룸", description: "타일과 벤치, 거울이 있는 헬스장 / 스포츠 라커룸입니다" },
72
72
  "music-studio": { label: "음악 스튜디오", description: "마이크, 흡음 폼, 콘솔 보드가 있는 녹음 스튜디오입니다" },
73
73
  "conservatory": { label: "온실", description: "유리벽으로 둘러싸인 온실, 열대 식물과 여과된 햇빛입니다" },
74
+
75
+ // --- picker-gaps 2026-09-01 ---
76
+ "open-air-market": { label: "노천 시장", description: "차양 아래 노점들이 늘어선 북적이는 시장입니다" },
74
77
  }
75
78
 
76
79
  export default map
@@ -73,6 +73,9 @@ const map: LocaleCatalogMap = {
73
73
  "locker-room": { label: "Vestiário", description: "Vestiário de academia ou esporte, azulejos, bancos e espelhos" },
74
74
  "music-studio": { label: "Estúdio de Música", description: "Estúdio de gravação, microfones, espuma e mesa de controle" },
75
75
  "conservatory": { label: "Estufa", description: "Estufa com paredes de vidro, plantas tropicais e luz filtrada" },
76
+
77
+ // --- picker-gaps 2026-09-01 ---
78
+ "open-air-market": { label: "Mercado ao Ar Livre", description: "Mercado agitado de barracas de vendedores sob toldos" },
76
79
  }
77
80
 
78
81
  export default map
@@ -71,6 +71,8 @@ const map: LocaleCatalogMap = {
71
71
  "locker-room": { label: "Раздевалка", description: "Раздевалка спортзала, плитка, скамейки, зеркала" },
72
72
  "music-studio": { label: "Музыкальная студия", description: "Студия звукозаписи, микрофоны, поролон, пульт управления" },
73
73
  "conservatory": { label: "Зимний сад", description: "Стеклянная оранжерея, тропические растения, рассеянный солнечный свет" },
74
+ // --- picker-gaps 2026-09-01 ---
75
+ "open-air-market": { label: "Рынок под открытым небом", description: "Оживлённый рынок с торговыми лотками под навесами" },
74
76
  }
75
77
 
76
78
  export default map
@@ -71,6 +71,9 @@ const map: LocaleCatalogMap = {
71
71
  "haunted-mansion": { label: "鬼屋", description: "腐朽的哥特庄园" },
72
72
  "dreamscape": { label: "梦境", description: "超现实的漂浮岛屿" },
73
73
  "wasteland": { label: "末日废土", description: "锈迹斑斑的阴沉废土" },
74
+
75
+ // --- picker-gaps 2026-09-01 ---
76
+ "open-air-market": { label: "露天市场", description: "遮阳棚下摊位林立的繁忙市集" },
74
77
  }
75
78
 
76
79
  export default map
@@ -50,6 +50,8 @@ const map: LocaleCatalogMap = {
50
50
  "acrylic-paint": { label: "طلاء أكريليك", description: "وسيط معتم سريع الجفاف بحواف حادة" },
51
51
  "mixed-media": { label: "وسائط مختلطة", description: "وسائط مدمجة بأنسجة متغايرة" },
52
52
  "manga": { label: "مانغا", description: "فن لوحات مرسومة بالحبر أبيض وأسود بتظليل Screen-tone" },
53
+ // --- picker-gaps 2026-09-01 ---
54
+ "early-color-photo": { label: "صورة ملونة مبكرة", description: "ألوان مطلع القرن العشرين بأسلوب بروكودين-غورسكي / أوتوكروم" },
53
55
  }
54
56
 
55
57
  export default map
@@ -49,6 +49,9 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "Acrylfarbe", description: "Schnelltrocknendes deckendes Medium, scharfe Kanten" },
50
50
  "mixed-media": { label: "Mischtechnik", description: "Kombinierte Medien, heterogene Texturen" },
51
51
  "manga": { label: "Manga", description: "Getuschte S/W-Panel-Kunst, Rastertöne" },
52
+
53
+ // --- picker-gaps 2026-09-01 ---
54
+ "early-color-photo": { label: "Frühe Farbfotografie", description: "Prokudin-Gorski / Autochrom-Farbe der frühen 1900er" },
52
55
  }
53
56
 
54
57
  export default map
@@ -49,6 +49,9 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "Pintura Acrílica", description: "Medio opaco de secado rápido, bordes definidos" },
50
50
  "mixed-media": { label: "Técnica Mixta", description: "Medios combinados, texturas heterogéneas" },
51
51
  "manga": { label: "Manga", description: "Arte de viñetas entintado en B&N, sombreado con tramas" },
52
+
53
+ // --- picker-gaps 2026-09-01 ---
54
+ "early-color-photo": { label: "Foto a Color Temprana", description: "Color de principios de 1900, estilo Prokudin-Gorski / autocromo" },
52
55
  }
53
56
 
54
57
  export default map
@@ -49,6 +49,8 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "Peinture acrylique", description: "Médium opaque à séchage rapide, contours nets" },
50
50
  "mixed-media": { label: "Techniques mixtes", description: "Médias combinés, textures hétérogènes" },
51
51
  "manga": { label: "Manga", description: "Art encré N&B en cases, ombrage à trame" },
52
+ // --- picker-gaps 2026-09-01 ---
53
+ "early-color-photo": { label: "Photo couleur ancienne", description: "Couleur du début des années 1900, autochrome / Prokoudine-Gorski" },
52
54
  }
53
55
 
54
56
  export default map
@@ -49,6 +49,9 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "צבע אקריליק", description: "מדיה אטומה מתייבשת מהר, קצוות חדים" },
50
50
  "mixed-media": { label: "מדיה מעורבת", description: "שילוב מדיות, טקסטורות הטרוגניות" },
51
51
  "manga": { label: "מאנגה", description: "אמנות פאנלים בדיו שחור-לבן עם הצללת screen-tone" },
52
+
53
+ // --- picker-gaps 2026-09-01 ---
54
+ "early-color-photo": { label: "צילום צבע מוקדם", description: "צבע מוקדם של תחילת המאה ה-20 בסגנון פרוקודין-גורסקי / אוטוכרום" },
52
55
  }
53
56
 
54
57
  export default map
@@ -49,6 +49,8 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "Acrylic Paint", description: "तेज़ी से सूखने वाला opaque medium, तीखे edges" },
50
50
  "mixed-media": { label: "Mixed Media", description: "मिश्रित media, heterogeneous textures" },
51
51
  "manga": { label: "Manga", description: "Inked B&W panel कला, screen-tone shading" },
52
+ // --- picker-gaps 2026-09-01 ---
53
+ "early-color-photo": { label: "प्रारंभिक रंगीन फ़ोटो", description: "Prokudin-Gorsky / autochrome शैली का 1900 के दशक का आरंभिक रंगीन फ़ोटो लुक" },
52
54
  }
53
55
 
54
56
  export default map
@@ -49,6 +49,9 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "アクリル絵具", description: "速乾性の不透明メディア、シャープなエッジ" },
50
50
  "mixed-media": { label: "ミクストメディア", description: "複数の素材を組み合わせた不均質な質感" },
51
51
  "manga": { label: "漫画", description: "インクで描かれた白黒のコマ漫画、スクリーントーン" },
52
+
53
+ // --- picker-gaps 2026-09-01 ---
54
+ "early-color-photo": { label: "初期のカラー写真", description: "プロクジン=ゴルスキー/オートクロームによる1900年代初頭のカラー" },
52
55
  }
53
56
 
54
57
  export default map
@@ -49,6 +49,9 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "아크릴화", description: "빠르게 마르고 불투명한 매체로 가장자리가 또렷합니다" },
50
50
  "mixed-media": { label: "믹스드 미디어", description: "다양한 매체가 결합된 이질적인 텍스처입니다" },
51
51
  "manga": { label: "망가", description: "잉크로 그린 흑백 패널 아트와 스크린톤 셰이딩입니다" },
52
+
53
+ // --- picker-gaps 2026-09-01 ---
54
+ "early-color-photo": { label: "초기 컬러 사진", description: "프로쿠딘-고르스키 / 오토크롬 방식의 1900년대 초 컬러입니다" },
52
55
  }
53
56
 
54
57
  export default map
@@ -51,6 +51,9 @@ const map: LocaleCatalogMap = {
51
51
  "acrylic-paint": { label: "Tinta Acrílica", description: "Tinta opaca de secagem rápida com bordas nítidas" },
52
52
  "mixed-media": { label: "Técnica Mista", description: "Combinação de meios e texturas heterogêneas" },
53
53
  "manga": { label: "Mangá", description: "Arte de painéis em P&B entintados com sombreamento em screen-tone" },
54
+
55
+ // --- picker-gaps 2026-09-01 ---
56
+ "early-color-photo": { label: "Foto Colorida Antiga", description: "Cor do início dos anos 1900, autochrome / Prokudin-Gorsky" },
54
57
  }
55
58
 
56
59
  export default map
@@ -49,6 +49,8 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "Акрил", description: "Быстросохнущий укрывистый материал, чёткие края" },
50
50
  "mixed-media": { label: "Смешанная техника", description: "Сочетание материалов, разнородные текстуры" },
51
51
  "manga": { label: "Манга", description: "Чёрно-белые панели тушью с тонированием скринтонами" },
52
+ // --- picker-gaps 2026-09-01 ---
53
+ "early-color-photo": { label: "Ранняя цветная фотография", description: "Цвет начала 1900-х в духе Прокудина-Горского / автохрома" },
52
54
  }
53
55
 
54
56
  export default map
@@ -49,6 +49,9 @@ const map: LocaleCatalogMap = {
49
49
  "acrylic-paint": { label: "丙烯画", description: "速干不透明介质,边缘锐利" },
50
50
  "mixed-media": { label: "综合材料", description: "混合多种介质,异质肌理交织" },
51
51
  "manga": { label: "漫画", description: "黑白勾线分镜,网点纸阴影" },
52
+
53
+ // --- picker-gaps 2026-09-01 ---
54
+ "early-color-photo": { label: "早期彩色照片", description: "普罗库金-戈尔斯基 / Autochrome 微粒彩屏,1900 年代早期彩色" },
52
55
  }
53
56
 
54
57
  export default map
@@ -297,6 +297,10 @@ const map: LocaleCatalogMap = {
297
297
  "top-mesh-top": { label: "أعلى شبكي", description: "أعلى من قماش شبكي شفاف" },
298
298
  "top-sheer-top": { label: "أعلى شفاف", description: "أعلى من قماش شفاف" },
299
299
  "top-bandeau": { label: "Bandeau", description: "أعلى أنبوبي بدون حمالات" },
300
+ // --- picker-gaps 2026-09-01 ---
301
+ "outfit-workwear-overalls": { label: "أفرول عمل", description: "أفرول جينز بصدرية فوق قميص فلانيل مربعات" },
302
+ "outfit-chapan": { label: "رداء شابان", description: "رداء آسيا الوسطى الطويل المبطن من قماش الإيكات" },
303
+ "outfit-caftan": { label: "قفطان", description: "رداء شرق أوسطي / شمال أفريقي طويل وفضفاض" },
300
304
  }
301
305
 
302
306
  export default map
@@ -287,6 +287,11 @@ const map: LocaleCatalogMap = {
287
287
  "state-unbuttoned": { label: "Aufgeknöpft", description: "Offen / aufgeknöpft" },
288
288
  "state-rolled-sleeves": { label: "Hochgekrempelte Ärmel", description: "Ärmel zum Unterarm hochgerollt" },
289
289
  "state-layered": { label: "Geschichtet", description: "Mehrere gestapelte Schichten" },
290
+
291
+ // --- picker-gaps 2026-09-01 ---
292
+ "outfit-workwear-overalls": { label: "Arbeits-Latzhose", description: "Latzhose aus Denim über einem karierten Flanellhemd" },
293
+ "outfit-chapan": { label: "Chapan-Robe", description: "Langer gesteppter zentralasiatischer Ikat-Mantel" },
294
+ "outfit-caftan": { label: "Kaftan", description: "Langes, fließendes nahöstliches / nordafrikanisches Gewand" },
290
295
  }
291
296
 
292
297
  export default map
@@ -319,6 +319,11 @@ const map: LocaleCatalogMap = {
319
319
  "top-mesh-top": { label: "Top de Malla", description: "Top de tela de malla transparente" },
320
320
  "top-sheer-top": { label: "Top Transparente", description: "Top de tela translúcida" },
321
321
  "top-bandeau": { label: "Bandeau", description: "Top tubo sin tirantes" },
322
+
323
+ // --- picker-gaps 2026-09-01 ---
324
+ "outfit-workwear-overalls": { label: "Overol de Trabajo", description: "Overol con peto de mezclilla sobre una camisa de franela a cuadros" },
325
+ "outfit-chapan": { label: "Túnica Chapan", description: "Larga túnica acolchada de ikat de Asia Central" },
326
+ "outfit-caftan": { label: "Caftán", description: "Larga túnica fluida de Medio Oriente / Norte de África" },
322
327
  }
323
328
 
324
329
  export default map
@@ -287,6 +287,10 @@ const map: LocaleCatalogMap = {
287
287
  "state-unbuttoned": { label: "Déboutonné", description: "Ouvert / déboutonné" },
288
288
  "state-rolled-sleeves": { label: "Manches retroussées", description: "Manches retroussées sur l'avant-bras" },
289
289
  "state-layered": { label: "Superposé", description: "Plusieurs couches superposées" },
290
+ // --- picker-gaps 2026-09-01 ---
291
+ "outfit-workwear-overalls": { label: "Salopette de travail", description: "Salopette en jean par-dessus une chemise à carreaux en flanelle" },
292
+ "outfit-chapan": { label: "Robe chapan", description: "Longue robe matelassée en ikat d'Asie centrale" },
293
+ "outfit-caftan": { label: "Caftan", description: "Longue robe fluide du Moyen-Orient / d'Afrique du Nord" },
290
294
  }
291
295
 
292
296
  export default map
@@ -309,6 +309,11 @@ const map: LocaleCatalogMap = {
309
309
  "state-unbuttoned": { label: "פתוח", description: "פתוח / לא מכופתר" },
310
310
  "state-rolled-sleeves": { label: "שרוולים מגולגלים", description: "שרוולים מגולגלים עד האמה" },
311
311
  "state-layered": { label: "בשכבות", description: "מספר שכבות מוערמות" },
312
+
313
+ // --- picker-gaps 2026-09-01 ---
314
+ "outfit-workwear-overalls": { label: "אוברול עבודה", description: "אוברול ג'ינס עם כתפיות מעל חולצת פלנל משובצת" },
315
+ "outfit-chapan": { label: "גלימת צ'אפאן", description: "גלימת איקאט ארוכה ומרופדת של מרכז אסיה" },
316
+ "outfit-caftan": { label: "קפטן", description: "גלימה ארוכה ומתעופפת מזרח-תיכונית / צפון-אפריקאית" },
312
317
  }
313
318
 
314
319
  export default map
@@ -325,6 +325,10 @@ const map: LocaleCatalogMap = {
325
325
  "top-mesh-top": { label: "Mesh Top", description: "Sheer mesh कपड़े का top" },
326
326
  "top-sheer-top": { label: "Sheer Top", description: "पारभासी कपड़े का top" },
327
327
  "top-bandeau": { label: "Bandeau", description: "Strapless tube top" },
328
+ // --- picker-gaps 2026-09-01 ---
329
+ "outfit-workwear-overalls": { label: "वर्कवियर ओवरऑल्स", description: "प्लेड फ़लालैन शर्ट के ऊपर डेनिम bib ओवरऑल्स" },
330
+ "outfit-chapan": { label: "चपन चोग़ा", description: "मध्य एशियाई लंबा रजाईदार इकत चोग़ा" },
331
+ "outfit-caftan": { label: "कैफ़्तान", description: "लंबा बहता मध्य पूर्वी / उत्तरी अफ़्रीकी चोग़ा" },
328
332
  }
329
333
 
330
334
  export default map
@@ -319,6 +319,11 @@ const map: LocaleCatalogMap = {
319
319
  "top-mesh-top": { label: "メッシュトップ", description: "シアーなメッシュ生地のトップ" },
320
320
  "top-sheer-top": { label: "シアートップ", description: "半透明な生地のトップ" },
321
321
  "top-bandeau": { label: "バンドゥ", description: "ストラップレスのチューブトップ" },
322
+
323
+ // --- picker-gaps 2026-09-01 ---
324
+ "outfit-workwear-overalls": { label: "ワークウェア・オーバーオール", description: "チェックのフランネルシャツの上に着るデニムのビブオーバーオール" },
325
+ "outfit-chapan": { label: "チャパン(ローブ)", description: "中央アジアの長いキルティングのイカット織りローブ" },
326
+ "outfit-caftan": { label: "カフタン", description: "中東/北アフリカの流れるような長いローブ" },
322
327
  }
323
328
 
324
329
  export default map
@@ -313,6 +313,11 @@ const map: LocaleCatalogMap = {
313
313
  "top-mesh-top": { label: "메쉬 톱", description: "비치는 메쉬 원단의 톱입니다" },
314
314
  "top-sheer-top": { label: "시어 톱", description: "투명한 원단의 톱입니다" },
315
315
  "top-bandeau": { label: "밴도", description: "스트랩리스 튜브 톱입니다" },
316
+
317
+ // --- picker-gaps 2026-09-01 ---
318
+ "outfit-workwear-overalls": { label: "워크웨어 멜빵바지", description: "격자무늬 플란넬 셔츠 위에 입은 데님 멜빵바지입니다" },
319
+ "outfit-chapan": { label: "차판 로브", description: "중앙아시아의 길고 누빔 처리된 이카트 로브입니다" },
320
+ "outfit-caftan": { label: "카프탄", description: "길고 하늘하늘한 중동 / 북아프리카 로브입니다" },
316
321
  }
317
322
 
318
323
  export default map
@@ -303,6 +303,11 @@ const map: LocaleCatalogMap = {
303
303
  "state-unbuttoned": { label: "Desabotoada", description: "Aberta / desabotoada" },
304
304
  "state-rolled-sleeves": { label: "Mangas Dobradas", description: "Mangas dobradas até o antebraço" },
305
305
  "state-layered": { label: "Sobreposta", description: "Várias camadas sobrepostas" },
306
+
307
+ // --- picker-gaps 2026-09-01 ---
308
+ "outfit-workwear-overalls": { label: "Macacão Jardineira", description: "Jardineira jeans sobre camisa xadrez de flanela" },
309
+ "outfit-chapan": { label: "Manto Chapan", description: "Manto ikat acolchoado longo da Ásia Central" },
310
+ "outfit-caftan": { label: "Cafetã", description: "Manto longo e fluido do Oriente Médio / Norte da África" },
306
311
  }
307
312
 
308
313
  export default map
@@ -303,6 +303,10 @@ const map: LocaleCatalogMap = {
303
303
  "top-mesh-top": { label: "Сетчатый топ", description: "Топ из прозрачной сетчатой ткани" },
304
304
  "top-sheer-top": { label: "Прозрачный топ", description: "Топ из полупрозрачной ткани" },
305
305
  "top-bandeau": { label: "Бандо", description: "Топ-труба без бретелей" },
306
+ // --- picker-gaps 2026-09-01 ---
307
+ "outfit-workwear-overalls": { label: "Рабочий комбинезон", description: "Джинсовый полукомбинезон поверх клетчатой фланелевой рубашки" },
308
+ "outfit-chapan": { label: "Чапан", description: "Центральноазиатский длинный стёганый халат из икат-ткани" },
309
+ "outfit-caftan": { label: "Кафтан", description: "Длинный струящийся ближневосточный / североафриканский халат" },
306
310
  }
307
311
 
308
312
  export default map
@@ -309,6 +309,11 @@ const map: LocaleCatalogMap = {
309
309
  "state-unbuttoned": { label: "敞开", description: "敞开 / 不扣扣子" },
310
310
  "state-rolled-sleeves":{ label: "卷起袖子", description: "袖子卷至前臂" },
311
311
  "state-layered": { label: "叠搭", description: "多层叠搭" },
312
+
313
+ // --- picker-gaps 2026-09-01 ---
314
+ "outfit-workwear-overalls": { label: "工装背带裤", description: "格纹法兰绒衬衫外搭牛仔背带裤" },
315
+ "outfit-chapan": { label: "恰潘长袍", description: "中亚风格的绗缝伊卡特长袍" },
316
+ "outfit-caftan": { label: "卡夫坦长袍", description: "飘逸的中东 / 北非长袍" },
312
317
  }
313
318
 
314
319
  export default map
package/src/index.ts CHANGED
@@ -38,6 +38,7 @@ export {
38
38
  NATIVE_NEGATIVE_PROMPT_MODELS,
39
39
  NATIVE_NEGATIVE_VIDEO_PROVIDERS,
40
40
  applyVideoNegativePrompt,
41
+ videoNegativeSuffix,
41
42
  MODELS_WITH_REFERENCE_IMAGE_SUPPORT,
42
43
  T2I_TO_I2I_VARIANT,
43
44
  REF_IMAGE_MAX_LIMITS,
@@ -116,6 +117,12 @@ export {
116
117
  isMinimaxH3Provider,
117
118
  MINIMAX_H3_DEFAULT_RESOLUTION,
118
119
  normalizeMinimaxH3Resolution,
120
+ WAN_3_PROVIDERS,
121
+ isWan3Provider,
122
+ WAN_3_DEFAULT_RESOLUTION,
123
+ normalizeWan3Resolution,
124
+ GEMINI_OMNI_PROVIDERS,
125
+ isGeminiOmniProvider,
119
126
  VIDEO_PROVIDERS_WITHOUT_DISPATCH,
120
127
  GVP_DEFAULT_PROVIDER,
121
128
  GVP_SUPPORTED_PROVIDERS,
@@ -987,6 +994,9 @@ export * from "./video-analysis.js"
987
994
  // buildVideoAuditCreditId / videoAuditCreditsForBucket / bucketSecondsFromAuditCreditId).
988
995
  export * from "./video-analysis-pricing.js"
989
996
 
997
+ // --- Unified video node UI-default fills (panel snap == strip == DAG payload) ---
998
+ export * from "./video-ui-defaults.js"
999
+
990
1000
  // --- Smart-cut best-pair search windows (shared bound + clamp) ---
991
1001
  export * from "./smart-cut-windows.js"
992
1002