@nodaro/shared 1.4.2
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.
- package/LICENSE +202 -0
- package/README.md +32 -0
- package/dist/index.cjs +12506 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12269 -0
- package/dist/index.d.ts +12269 -0
- package/dist/index.js +11831 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
- package/src/__tests__/__snapshots__/prompt-builder-segments.test.ts.snap +65 -0
- package/src/__tests__/ai-avatar-pricing.test.ts +321 -0
- package/src/__tests__/apply-video-negative-prompt.test.ts +76 -0
- package/src/__tests__/attach-columns.test.ts +28 -0
- package/src/__tests__/audio-crossfade-curves.test.ts +33 -0
- package/src/__tests__/build-model-menu.test.ts +58 -0
- package/src/__tests__/character-aspect-defaults.test.ts +142 -0
- package/src/__tests__/character-mention-slug.test.ts +199 -0
- package/src/__tests__/character-reference-photo-kinds.test.ts +32 -0
- package/src/__tests__/character-usage-mode.test.ts +147 -0
- package/src/__tests__/character-variant-assets.test.ts +142 -0
- package/src/__tests__/character-voice.test.ts +130 -0
- package/src/__tests__/cinematic-avatar-pricing.test.ts +119 -0
- package/src/__tests__/combine-transitions.test.ts +137 -0
- package/src/__tests__/component-types.test.ts +87 -0
- package/src/__tests__/condition-variables.test.ts +98 -0
- package/src/__tests__/credit-identifiers.test.ts +811 -0
- package/src/__tests__/default-video-provider.test.ts +63 -0
- package/src/__tests__/entity-image-handle.test.ts +43 -0
- package/src/__tests__/entity-variants.test.ts +33 -0
- package/src/__tests__/fal-lip-sync-sets.test.ts +31 -0
- package/src/__tests__/featured-entities.test.ts +33 -0
- package/src/__tests__/film-pricing.test.ts +64 -0
- package/src/__tests__/filter-condition.test.ts +285 -0
- package/src/__tests__/freecut-protocol.test.ts +35 -0
- package/src/__tests__/generate-text-items.test.ts +19 -0
- package/src/__tests__/generated-results.test.ts +50 -0
- package/src/__tests__/graph-utils.test.ts +618 -0
- package/src/__tests__/group-aggregation.test.ts +83 -0
- package/src/__tests__/i18n-locale-completeness.test.ts +156 -0
- package/src/__tests__/image-critic-node.test.ts +86 -0
- package/src/__tests__/image-mask-mode.test.ts +16 -0
- package/src/__tests__/image-ref-limit.test.ts +78 -0
- package/src/__tests__/inpaint-region.test.ts +24 -0
- package/src/__tests__/input-field-map-parity.test.ts +30 -0
- package/src/__tests__/json-evaluator.test.ts +289 -0
- package/src/__tests__/json-path.test.ts +64 -0
- package/src/__tests__/lip-sync-pricing.test.ts +142 -0
- package/src/__tests__/list-merge.test.ts +96 -0
- package/src/__tests__/list-sort.test.ts +134 -0
- package/src/__tests__/llm-models.test.ts +445 -0
- package/src/__tests__/location-mention-slug.test.ts +246 -0
- package/src/__tests__/locations-coverage-critic-schema.test.ts +92 -0
- package/src/__tests__/loop-delimiter.test.ts +39 -0
- package/src/__tests__/lottie-slots.test.ts +245 -0
- package/src/__tests__/model-catalog-flux2-resolutions.test.ts +21 -0
- package/src/__tests__/model-constants-location.test.ts +20 -0
- package/src/__tests__/model-constants.test.ts +122 -0
- package/src/__tests__/model-tree.test.ts +86 -0
- package/src/__tests__/no-internal-imports.test.ts +25 -0
- package/src/__tests__/node-default-mappings.test.ts +175 -0
- package/src/__tests__/node-mappable-fields.test.ts +7 -0
- package/src/__tests__/node-preset-export.test.ts +46 -0
- package/src/__tests__/node-preset-extract.test.ts +166 -0
- package/src/__tests__/node-refs-canonical.test.ts +54 -0
- package/src/__tests__/node-refs-combine.test.ts +54 -0
- package/src/__tests__/node-refs.test.ts +187 -0
- package/src/__tests__/node-runtime-keys.test.ts +99 -0
- package/src/__tests__/object-aspect-defaults.test.ts +59 -0
- package/src/__tests__/parameter-node-value.test.ts +137 -0
- package/src/__tests__/pinterest-url.test.ts +35 -0
- package/src/__tests__/pipeline-chat.test.ts +110 -0
- package/src/__tests__/pipeline-validation.test.ts +98 -0
- package/src/__tests__/presentation-utils.test.ts +1137 -0
- package/src/__tests__/producer-types.test.ts +47 -0
- package/src/__tests__/prompt-length-limits.test.ts +156 -0
- package/src/__tests__/provider-directive-defaults.test.ts +46 -0
- package/src/__tests__/reduce-strategy-registry.test.ts +43 -0
- package/src/__tests__/reference-board-templates.test.ts +33 -0
- package/src/__tests__/reference-roles.test.ts +36 -0
- package/src/__tests__/resolve-field-mappings.test.ts +110 -0
- package/src/__tests__/resolve-pipeline-model.test.ts +76 -0
- package/src/__tests__/scene-node-types.test.ts +80 -0
- package/src/__tests__/scraper-actors.test.ts +67 -0
- package/src/__tests__/seedance-2-catalog.test.ts +18 -0
- package/src/__tests__/seedance-2-credit-id.test.ts +23 -0
- package/src/__tests__/seedance-aspects.test.ts +52 -0
- package/src/__tests__/selector.test.ts +1151 -0
- package/src/__tests__/settled-with-limit.test.ts +214 -0
- package/src/__tests__/social-media-specs.test.ts +129 -0
- package/src/__tests__/sub-workflow-validation.test.ts +88 -0
- package/src/__tests__/switchx-pricing.test.ts +28 -0
- package/src/__tests__/to-connected-references.test.ts +153 -0
- package/src/__tests__/utilities.test.ts +541 -0
- package/src/__tests__/video-analysis-pricing.test.ts +58 -0
- package/src/__tests__/video-analysis.test.ts +63 -0
- package/src/__tests__/video-audio-capability.test.ts +204 -0
- package/src/__tests__/video-gen-providers.test.ts +28 -0
- package/src/__tests__/video-mode-aliases.test.ts +150 -0
- package/src/__tests__/video-ref-limits.test.ts +72 -0
- package/src/__tests__/video-utils.test.ts +303 -0
- package/src/__tests__/voice-changer-models.test.ts +33 -0
- package/src/__tests__/workflow-export-strip.test.ts +46 -0
- package/src/ai-avatar-pricing.ts +213 -0
- package/src/ancestor-refs.ts +48 -0
- package/src/animals.ts +231 -0
- package/src/audio-crossfade-curves.ts +73 -0
- package/src/audio-fx-presets.ts +64 -0
- package/src/avatar-payload-validators.ts +214 -0
- package/src/caption-styles.ts +31 -0
- package/src/character-aspect-defaults.ts +102 -0
- package/src/character-facets.ts +37 -0
- package/src/character-mention-slug.ts +166 -0
- package/src/character-usage-mode.ts +109 -0
- package/src/character-variant-assets.ts +121 -0
- package/src/character-voice.ts +151 -0
- package/src/cinematic-avatar-pricing.ts +111 -0
- package/src/clone-utils.ts +46 -0
- package/src/combine-transitions.ts +482 -0
- package/src/community.ts +112 -0
- package/src/component-types.ts +127 -0
- package/src/condition-variables.ts +65 -0
- package/src/credit-estimators/index.ts +15 -0
- package/src/credit-estimators/video-utils.ts +165 -0
- package/src/credit-identifiers.ts +304 -0
- package/src/entity-approval-types.ts +31 -0
- package/src/entity-aspect-defaults.ts +82 -0
- package/src/entity-asset-types.ts +296 -0
- package/src/entity-image-handle.ts +36 -0
- package/src/extra-refs.ts +139 -0
- package/src/featured-entities.ts +136 -0
- package/src/film-pricing.ts +117 -0
- package/src/filter-condition.ts +250 -0
- package/src/flux2-pricing.ts +18 -0
- package/src/freecut-protocol.ts +52 -0
- package/src/furniture.ts +167 -0
- package/src/generate-text-items.ts +15 -0
- package/src/generated-results.ts +63 -0
- package/src/group-aggregation.ts +75 -0
- package/src/hint-graph-types.ts +18 -0
- package/src/i18n/action-fx.ar.ts +89 -0
- package/src/i18n/action-fx.de.ts +89 -0
- package/src/i18n/action-fx.es.ts +89 -0
- package/src/i18n/action-fx.fr.ts +89 -0
- package/src/i18n/action-fx.he.ts +89 -0
- package/src/i18n/action-fx.hi.ts +89 -0
- package/src/i18n/action-fx.ja.ts +89 -0
- package/src/i18n/action-fx.ko.ts +89 -0
- package/src/i18n/action-fx.pt-BR.ts +89 -0
- package/src/i18n/action-fx.ru.ts +89 -0
- package/src/i18n/action-fx.zh-CN.ts +89 -0
- package/src/i18n/aesthetic.ar.ts +170 -0
- package/src/i18n/aesthetic.de.ts +48 -0
- package/src/i18n/aesthetic.es.ts +169 -0
- package/src/i18n/aesthetic.fr.ts +52 -0
- package/src/i18n/aesthetic.he.ts +169 -0
- package/src/i18n/aesthetic.hi.ts +55 -0
- package/src/i18n/aesthetic.ja.ts +165 -0
- package/src/i18n/aesthetic.ko.ts +169 -0
- package/src/i18n/aesthetic.pt-BR.ts +148 -0
- package/src/i18n/aesthetic.ru.ts +155 -0
- package/src/i18n/aesthetic.zh-CN.ts +172 -0
- package/src/i18n/animals.ar.ts +145 -0
- package/src/i18n/animals.de.ts +144 -0
- package/src/i18n/animals.es.ts +158 -0
- package/src/i18n/animals.fr.ts +144 -0
- package/src/i18n/animals.he.ts +155 -0
- package/src/i18n/animals.hi.ts +157 -0
- package/src/i18n/animals.ja.ts +159 -0
- package/src/i18n/animals.ko.ts +159 -0
- package/src/i18n/animals.pt-BR.ts +157 -0
- package/src/i18n/animals.ru.ts +155 -0
- package/src/i18n/animals.zh-CN.ts +155 -0
- package/src/i18n/atmosphere.ar.ts +49 -0
- package/src/i18n/atmosphere.de.ts +47 -0
- package/src/i18n/atmosphere.es.ts +50 -0
- package/src/i18n/atmosphere.fr.ts +47 -0
- package/src/i18n/atmosphere.he.ts +47 -0
- package/src/i18n/atmosphere.hi.ts +49 -0
- package/src/i18n/atmosphere.ja.ts +49 -0
- package/src/i18n/atmosphere.ko.ts +49 -0
- package/src/i18n/atmosphere.pt-BR.ts +49 -0
- package/src/i18n/atmosphere.ru.ts +47 -0
- package/src/i18n/atmosphere.zh-CN.ts +152 -0
- package/src/i18n/backdrop.ar.ts +53 -0
- package/src/i18n/backdrop.de.ts +46 -0
- package/src/i18n/backdrop.es.ts +54 -0
- package/src/i18n/backdrop.fr.ts +52 -0
- package/src/i18n/backdrop.he.ts +51 -0
- package/src/i18n/backdrop.hi.ts +59 -0
- package/src/i18n/backdrop.ja.ts +61 -0
- package/src/i18n/backdrop.ko.ts +59 -0
- package/src/i18n/backdrop.pt-BR.ts +59 -0
- package/src/i18n/backdrop.ru.ts +57 -0
- package/src/i18n/backdrop.zh-CN.ts +57 -0
- package/src/i18n/camera-format.ar.ts +40 -0
- package/src/i18n/camera-format.de.ts +37 -0
- package/src/i18n/camera-format.es.ts +41 -0
- package/src/i18n/camera-format.fr.ts +37 -0
- package/src/i18n/camera-format.he.ts +37 -0
- package/src/i18n/camera-format.hi.ts +42 -0
- package/src/i18n/camera-format.ja.ts +37 -0
- package/src/i18n/camera-format.ko.ts +37 -0
- package/src/i18n/camera-format.pt-BR.ts +46 -0
- package/src/i18n/camera-format.ru.ts +42 -0
- package/src/i18n/camera-format.zh-CN.ts +42 -0
- package/src/i18n/camera-motions.ar.ts +86 -0
- package/src/i18n/camera-motions.de.ts +74 -0
- package/src/i18n/camera-motions.es.ts +86 -0
- package/src/i18n/camera-motions.fr.ts +86 -0
- package/src/i18n/camera-motions.he.ts +86 -0
- package/src/i18n/camera-motions.hi.ts +99 -0
- package/src/i18n/camera-motions.ja.ts +99 -0
- package/src/i18n/camera-motions.ko.ts +99 -0
- package/src/i18n/camera-motions.pt-BR.ts +99 -0
- package/src/i18n/camera-motions.ru.ts +99 -0
- package/src/i18n/camera-motions.zh-CN.ts +99 -0
- package/src/i18n/character-fx.ar.ts +72 -0
- package/src/i18n/character-fx.de.ts +72 -0
- package/src/i18n/character-fx.es.ts +72 -0
- package/src/i18n/character-fx.fr.ts +72 -0
- package/src/i18n/character-fx.he.ts +72 -0
- package/src/i18n/character-fx.hi.ts +72 -0
- package/src/i18n/character-fx.ja.ts +72 -0
- package/src/i18n/character-fx.ko.ts +72 -0
- package/src/i18n/character-fx.pt-BR.ts +72 -0
- package/src/i18n/character-fx.ru.ts +72 -0
- package/src/i18n/character-fx.zh-CN.ts +72 -0
- package/src/i18n/color-look.ar.ts +50 -0
- package/src/i18n/color-look.de.ts +47 -0
- package/src/i18n/color-look.es.ts +50 -0
- package/src/i18n/color-look.fr.ts +50 -0
- package/src/i18n/color-look.he.ts +49 -0
- package/src/i18n/color-look.hi.ts +52 -0
- package/src/i18n/color-look.ja.ts +54 -0
- package/src/i18n/color-look.ko.ts +54 -0
- package/src/i18n/color-look.pt-BR.ts +54 -0
- package/src/i18n/color-look.ru.ts +52 -0
- package/src/i18n/color-look.zh-CN.ts +53 -0
- package/src/i18n/composition-effects.ar.ts +26 -0
- package/src/i18n/composition-effects.de.ts +25 -0
- package/src/i18n/composition-effects.es.ts +27 -0
- package/src/i18n/composition-effects.fr.ts +25 -0
- package/src/i18n/composition-effects.he.ts +25 -0
- package/src/i18n/composition-effects.hi.ts +27 -0
- package/src/i18n/composition-effects.ja.ts +27 -0
- package/src/i18n/composition-effects.ko.ts +27 -0
- package/src/i18n/composition-effects.pt-BR.ts +25 -0
- package/src/i18n/composition-effects.ru.ts +82 -0
- package/src/i18n/composition-effects.zh-CN.ts +25 -0
- package/src/i18n/era.ar.ts +37 -0
- package/src/i18n/era.de.ts +34 -0
- package/src/i18n/era.es.ts +37 -0
- package/src/i18n/era.fr.ts +37 -0
- package/src/i18n/era.he.ts +36 -0
- package/src/i18n/era.hi.ts +39 -0
- package/src/i18n/era.ja.ts +41 -0
- package/src/i18n/era.ko.ts +39 -0
- package/src/i18n/era.pt-BR.ts +41 -0
- package/src/i18n/era.ru.ts +121 -0
- package/src/i18n/era.zh-CN.ts +39 -0
- package/src/i18n/exposure-settings.ar.ts +28 -0
- package/src/i18n/exposure-settings.de.ts +26 -0
- package/src/i18n/exposure-settings.es.ts +28 -0
- package/src/i18n/exposure-settings.fr.ts +29 -0
- package/src/i18n/exposure-settings.he.ts +28 -0
- package/src/i18n/exposure-settings.hi.ts +31 -0
- package/src/i18n/exposure-settings.ja.ts +31 -0
- package/src/i18n/exposure-settings.ko.ts +31 -0
- package/src/i18n/exposure-settings.pt-BR.ts +31 -0
- package/src/i18n/exposure-settings.ru.ts +31 -0
- package/src/i18n/exposure-settings.zh-CN.ts +31 -0
- package/src/i18n/framing.ar.ts +78 -0
- package/src/i18n/framing.de.ts +73 -0
- package/src/i18n/framing.es.ts +78 -0
- package/src/i18n/framing.fr.ts +78 -0
- package/src/i18n/framing.he.ts +77 -0
- package/src/i18n/framing.hi.ts +82 -0
- package/src/i18n/framing.ja.ts +84 -0
- package/src/i18n/framing.ko.ts +82 -0
- package/src/i18n/framing.pt-BR.ts +84 -0
- package/src/i18n/framing.ru.ts +82 -0
- package/src/i18n/framing.zh-CN.ts +82 -0
- package/src/i18n/furniture.ar.ts +92 -0
- package/src/i18n/furniture.de.ts +93 -0
- package/src/i18n/furniture.es.ts +101 -0
- package/src/i18n/furniture.fr.ts +93 -0
- package/src/i18n/furniture.he.ts +101 -0
- package/src/i18n/furniture.hi.ts +101 -0
- package/src/i18n/furniture.ja.ts +101 -0
- package/src/i18n/furniture.ko.ts +101 -0
- package/src/i18n/furniture.pt-BR.ts +101 -0
- package/src/i18n/furniture.ru.ts +101 -0
- package/src/i18n/furniture.zh-CN.ts +101 -0
- package/src/i18n/held-prop.ar.ts +74 -0
- package/src/i18n/held-prop.de.ts +65 -0
- package/src/i18n/held-prop.es.ts +83 -0
- package/src/i18n/held-prop.fr.ts +74 -0
- package/src/i18n/held-prop.he.ts +73 -0
- package/src/i18n/held-prop.hi.ts +82 -0
- package/src/i18n/held-prop.ja.ts +84 -0
- package/src/i18n/held-prop.ko.ts +84 -0
- package/src/i18n/held-prop.pt-BR.ts +84 -0
- package/src/i18n/held-prop.ru.ts +82 -0
- package/src/i18n/held-prop.zh-CN.ts +82 -0
- package/src/i18n/index.ts +208 -0
- package/src/i18n/instrumentation.ar.ts +195 -0
- package/src/i18n/instrumentation.de.ts +195 -0
- package/src/i18n/instrumentation.es.ts +195 -0
- package/src/i18n/instrumentation.fr.ts +195 -0
- package/src/i18n/instrumentation.he.ts +195 -0
- package/src/i18n/instrumentation.hi.ts +195 -0
- package/src/i18n/instrumentation.ja.ts +195 -0
- package/src/i18n/instrumentation.ko.ts +195 -0
- package/src/i18n/instrumentation.pt-BR.ts +195 -0
- package/src/i18n/instrumentation.ru.ts +195 -0
- package/src/i18n/instrumentation.zh-CN.ts +195 -0
- package/src/i18n/lens.ar.ts +24 -0
- package/src/i18n/lens.de.ts +24 -0
- package/src/i18n/lens.es.ts +24 -0
- package/src/i18n/lens.fr.ts +24 -0
- package/src/i18n/lens.he.ts +24 -0
- package/src/i18n/lens.hi.ts +24 -0
- package/src/i18n/lens.ja.ts +24 -0
- package/src/i18n/lens.ko.ts +24 -0
- package/src/i18n/lens.pt-BR.ts +24 -0
- package/src/i18n/lens.ru.ts +25 -0
- package/src/i18n/lens.zh-CN.ts +24 -0
- package/src/i18n/lighting.ar.ts +86 -0
- package/src/i18n/lighting.de.ts +84 -0
- package/src/i18n/lighting.es.ts +89 -0
- package/src/i18n/lighting.fr.ts +84 -0
- package/src/i18n/lighting.he.ts +88 -0
- package/src/i18n/lighting.hi.ts +90 -0
- package/src/i18n/lighting.ja.ts +90 -0
- package/src/i18n/lighting.ko.ts +90 -0
- package/src/i18n/lighting.pt-BR.ts +90 -0
- package/src/i18n/lighting.ru.ts +88 -0
- package/src/i18n/lighting.zh-CN.ts +92 -0
- package/src/i18n/loop-subject.ar.ts +39 -0
- package/src/i18n/loop-subject.de.ts +39 -0
- package/src/i18n/loop-subject.es.ts +39 -0
- package/src/i18n/loop-subject.fr.ts +39 -0
- package/src/i18n/loop-subject.he.ts +39 -0
- package/src/i18n/loop-subject.hi.ts +39 -0
- package/src/i18n/loop-subject.ja.ts +39 -0
- package/src/i18n/loop-subject.ko.ts +39 -0
- package/src/i18n/loop-subject.pt-BR.ts +39 -0
- package/src/i18n/loop-subject.ru.ts +39 -0
- package/src/i18n/loop-subject.zh-CN.ts +39 -0
- package/src/i18n/materials.ar.ts +80 -0
- package/src/i18n/materials.de.ts +80 -0
- package/src/i18n/materials.es.ts +87 -0
- package/src/i18n/materials.fr.ts +80 -0
- package/src/i18n/materials.he.ts +86 -0
- package/src/i18n/materials.hi.ts +86 -0
- package/src/i18n/materials.ja.ts +88 -0
- package/src/i18n/materials.ko.ts +88 -0
- package/src/i18n/materials.pt-BR.ts +88 -0
- package/src/i18n/materials.ru.ts +86 -0
- package/src/i18n/materials.zh-CN.ts +86 -0
- package/src/i18n/mood.ar.ts +61 -0
- package/src/i18n/mood.de.ts +61 -0
- package/src/i18n/mood.es.ts +66 -0
- package/src/i18n/mood.fr.ts +61 -0
- package/src/i18n/mood.he.ts +64 -0
- package/src/i18n/mood.hi.ts +66 -0
- package/src/i18n/mood.ja.ts +66 -0
- package/src/i18n/mood.ko.ts +66 -0
- package/src/i18n/mood.pt-BR.ts +64 -0
- package/src/i18n/mood.ru.ts +64 -0
- package/src/i18n/mood.zh-CN.ts +64 -0
- package/src/i18n/music-genre.ar.ts +302 -0
- package/src/i18n/music-genre.de.ts +302 -0
- package/src/i18n/music-genre.es.ts +302 -0
- package/src/i18n/music-genre.fr.ts +302 -0
- package/src/i18n/music-genre.he.ts +302 -0
- package/src/i18n/music-genre.hi.ts +302 -0
- package/src/i18n/music-genre.ja.ts +302 -0
- package/src/i18n/music-genre.ko.ts +302 -0
- package/src/i18n/music-genre.pt-BR.ts +302 -0
- package/src/i18n/music-genre.ru.ts +302 -0
- package/src/i18n/music-genre.zh-CN.ts +302 -0
- package/src/i18n/music-mood.ar.ts +75 -0
- package/src/i18n/music-mood.de.ts +75 -0
- package/src/i18n/music-mood.es.ts +75 -0
- package/src/i18n/music-mood.fr.ts +75 -0
- package/src/i18n/music-mood.he.ts +75 -0
- package/src/i18n/music-mood.hi.ts +75 -0
- package/src/i18n/music-mood.ja.ts +75 -0
- package/src/i18n/music-mood.ko.ts +75 -0
- package/src/i18n/music-mood.pt-BR.ts +75 -0
- package/src/i18n/music-mood.ru.ts +75 -0
- package/src/i18n/music-mood.zh-CN.ts +75 -0
- package/src/i18n/person.ar.ts +638 -0
- package/src/i18n/person.de.ts +629 -0
- package/src/i18n/person.es.ts +645 -0
- package/src/i18n/person.fr.ts +621 -0
- package/src/i18n/person.he.ts +656 -0
- package/src/i18n/person.hi.ts +654 -0
- package/src/i18n/person.ja.ts +662 -0
- package/src/i18n/person.ko.ts +662 -0
- package/src/i18n/person.pt-BR.ts +656 -0
- package/src/i18n/person.ru.ts +656 -0
- package/src/i18n/person.zh-CN.ts +656 -0
- package/src/i18n/photo-genre.ar.ts +58 -0
- package/src/i18n/photo-genre.de.ts +52 -0
- package/src/i18n/photo-genre.es.ts +64 -0
- package/src/i18n/photo-genre.fr.ts +58 -0
- package/src/i18n/photo-genre.he.ts +62 -0
- package/src/i18n/photo-genre.hi.ts +63 -0
- package/src/i18n/photo-genre.ja.ts +65 -0
- package/src/i18n/photo-genre.ko.ts +63 -0
- package/src/i18n/photo-genre.pt-BR.ts +65 -0
- package/src/i18n/photo-genre.ru.ts +63 -0
- package/src/i18n/photo-genre.zh-CN.ts +63 -0
- package/src/i18n/photographer.ar.ts +75 -0
- package/src/i18n/photographer.de.ts +74 -0
- package/src/i18n/photographer.es.ts +77 -0
- package/src/i18n/photographer.fr.ts +77 -0
- package/src/i18n/photographer.he.ts +78 -0
- package/src/i18n/photographer.hi.ts +80 -0
- package/src/i18n/photographer.ja.ts +84 -0
- package/src/i18n/photographer.ko.ts +84 -0
- package/src/i18n/photographer.pt-BR.ts +83 -0
- package/src/i18n/photographer.ru.ts +78 -0
- package/src/i18n/photographer.zh-CN.ts +78 -0
- package/src/i18n/pose.ar.ts +95 -0
- package/src/i18n/pose.de.ts +96 -0
- package/src/i18n/pose.es.ts +104 -0
- package/src/i18n/pose.fr.ts +96 -0
- package/src/i18n/pose.he.ts +104 -0
- package/src/i18n/pose.hi.ts +104 -0
- package/src/i18n/pose.ja.ts +104 -0
- package/src/i18n/pose.ko.ts +104 -0
- package/src/i18n/pose.pt-BR.ts +104 -0
- package/src/i18n/pose.ru.ts +104 -0
- package/src/i18n/pose.zh-CN.ts +104 -0
- package/src/i18n/post-process-effects.ar.ts +25 -0
- package/src/i18n/post-process-effects.de.ts +24 -0
- package/src/i18n/post-process-effects.es.ts +26 -0
- package/src/i18n/post-process-effects.fr.ts +24 -0
- package/src/i18n/post-process-effects.he.ts +24 -0
- package/src/i18n/post-process-effects.hi.ts +26 -0
- package/src/i18n/post-process-effects.ja.ts +26 -0
- package/src/i18n/post-process-effects.ko.ts +26 -0
- package/src/i18n/post-process-effects.pt-BR.ts +24 -0
- package/src/i18n/post-process-effects.ru.ts +24 -0
- package/src/i18n/post-process-effects.zh-CN.ts +24 -0
- package/src/i18n/render-quality.ar.ts +34 -0
- package/src/i18n/render-quality.de.ts +30 -0
- package/src/i18n/render-quality.es.ts +35 -0
- package/src/i18n/render-quality.fr.ts +34 -0
- package/src/i18n/render-quality.he.ts +33 -0
- package/src/i18n/render-quality.hi.ts +39 -0
- package/src/i18n/render-quality.ja.ts +39 -0
- package/src/i18n/render-quality.ko.ts +39 -0
- package/src/i18n/render-quality.pt-BR.ts +37 -0
- package/src/i18n/render-quality.ru.ts +37 -0
- package/src/i18n/render-quality.zh-CN.ts +37 -0
- package/src/i18n/seasons.ar.ts +10 -0
- package/src/i18n/seasons.de.ts +10 -0
- package/src/i18n/seasons.es.ts +10 -0
- package/src/i18n/seasons.fr.ts +10 -0
- package/src/i18n/seasons.he.ts +10 -0
- package/src/i18n/seasons.hi.ts +10 -0
- package/src/i18n/seasons.ja.ts +10 -0
- package/src/i18n/seasons.ko.ts +10 -0
- package/src/i18n/seasons.pt-BR.ts +10 -0
- package/src/i18n/seasons.ru.ts +10 -0
- package/src/i18n/seasons.zh-CN.ts +10 -0
- package/src/i18n/setting.ar.ts +73 -0
- package/src/i18n/setting.de.ts +73 -0
- package/src/i18n/setting.es.ts +77 -0
- package/src/i18n/setting.fr.ts +73 -0
- package/src/i18n/setting.he.ts +76 -0
- package/src/i18n/setting.hi.ts +76 -0
- package/src/i18n/setting.ja.ts +78 -0
- package/src/i18n/setting.ko.ts +76 -0
- package/src/i18n/setting.pt-BR.ts +78 -0
- package/src/i18n/setting.ru.ts +76 -0
- package/src/i18n/setting.zh-CN.ts +76 -0
- package/src/i18n/style.ar.ts +55 -0
- package/src/i18n/style.de.ts +54 -0
- package/src/i18n/style.es.ts +54 -0
- package/src/i18n/style.fr.ts +54 -0
- package/src/i18n/style.he.ts +54 -0
- package/src/i18n/style.hi.ts +54 -0
- package/src/i18n/style.ja.ts +54 -0
- package/src/i18n/style.ko.ts +54 -0
- package/src/i18n/style.pt-BR.ts +56 -0
- package/src/i18n/style.ru.ts +54 -0
- package/src/i18n/style.zh-CN.ts +54 -0
- package/src/i18n/styling.ar.ts +295 -0
- package/src/i18n/styling.de.ts +285 -0
- package/src/i18n/styling.es.ts +317 -0
- package/src/i18n/styling.fr.ts +285 -0
- package/src/i18n/styling.he.ts +307 -0
- package/src/i18n/styling.hi.ts +323 -0
- package/src/i18n/styling.ja.ts +317 -0
- package/src/i18n/styling.ko.ts +311 -0
- package/src/i18n/styling.pt-BR.ts +301 -0
- package/src/i18n/styling.ru.ts +301 -0
- package/src/i18n/styling.zh-CN.ts +307 -0
- package/src/i18n/temporal.ar.ts +31 -0
- package/src/i18n/temporal.de.ts +24 -0
- package/src/i18n/temporal.es.ts +27 -0
- package/src/i18n/temporal.fr.ts +28 -0
- package/src/i18n/temporal.he.ts +31 -0
- package/src/i18n/temporal.hi.ts +31 -0
- package/src/i18n/temporal.ja.ts +31 -0
- package/src/i18n/temporal.ko.ts +31 -0
- package/src/i18n/temporal.pt-BR.ts +31 -0
- package/src/i18n/temporal.ru.ts +31 -0
- package/src/i18n/temporal.zh-CN.ts +31 -0
- package/src/i18n/transitions.ar.ts +97 -0
- package/src/i18n/transitions.de.ts +97 -0
- package/src/i18n/transitions.es.ts +97 -0
- package/src/i18n/transitions.fr.ts +97 -0
- package/src/i18n/transitions.he.ts +97 -0
- package/src/i18n/transitions.hi.ts +97 -0
- package/src/i18n/transitions.ja.ts +97 -0
- package/src/i18n/transitions.ko.ts +97 -0
- package/src/i18n/transitions.pt-BR.ts +97 -0
- package/src/i18n/transitions.ru.ts +97 -0
- package/src/i18n/transitions.zh-CN.ts +97 -0
- package/src/i18n/types.ts +158 -0
- package/src/i18n/vehicles.ar.ts +137 -0
- package/src/i18n/vehicles.de.ts +125 -0
- package/src/i18n/vehicles.es.ts +138 -0
- package/src/i18n/vehicles.fr.ts +125 -0
- package/src/i18n/vehicles.he.ts +136 -0
- package/src/i18n/vehicles.hi.ts +138 -0
- package/src/i18n/vehicles.ja.ts +138 -0
- package/src/i18n/vehicles.ko.ts +138 -0
- package/src/i18n/vehicles.pt-BR.ts +136 -0
- package/src/i18n/vehicles.ru.ts +136 -0
- package/src/i18n/vehicles.zh-CN.ts +136 -0
- package/src/i18n/voice-character.ar.ts +126 -0
- package/src/i18n/voice-character.de.ts +126 -0
- package/src/i18n/voice-character.es.ts +126 -0
- package/src/i18n/voice-character.fr.ts +126 -0
- package/src/i18n/voice-character.he.ts +126 -0
- package/src/i18n/voice-character.hi.ts +126 -0
- package/src/i18n/voice-character.ja.ts +126 -0
- package/src/i18n/voice-character.ko.ts +126 -0
- package/src/i18n/voice-character.pt-BR.ts +126 -0
- package/src/i18n/voice-character.ru.ts +126 -0
- package/src/i18n/voice-character.zh-CN.ts +126 -0
- package/src/i18n/voice-delivery.ar.ts +77 -0
- package/src/i18n/voice-delivery.de.ts +77 -0
- package/src/i18n/voice-delivery.es.ts +77 -0
- package/src/i18n/voice-delivery.fr.ts +77 -0
- package/src/i18n/voice-delivery.he.ts +77 -0
- package/src/i18n/voice-delivery.hi.ts +77 -0
- package/src/i18n/voice-delivery.ja.ts +77 -0
- package/src/i18n/voice-delivery.ko.ts +77 -0
- package/src/i18n/voice-delivery.pt-BR.ts +77 -0
- package/src/i18n/voice-delivery.ru.ts +77 -0
- package/src/i18n/voice-delivery.zh-CN.ts +77 -0
- package/src/i18n/weapons.ar.ts +115 -0
- package/src/i18n/weapons.de.ts +114 -0
- package/src/i18n/weapons.es.ts +116 -0
- package/src/i18n/weapons.fr.ts +103 -0
- package/src/i18n/weapons.he.ts +114 -0
- package/src/i18n/weapons.hi.ts +116 -0
- package/src/i18n/weapons.ja.ts +116 -0
- package/src/i18n/weapons.ko.ts +116 -0
- package/src/i18n/weapons.pt-BR.ts +114 -0
- package/src/i18n/weapons.ru.ts +114 -0
- package/src/i18n/weapons.zh-CN.ts +114 -0
- package/src/image-critic-node.ts +61 -0
- package/src/image-critic-types.ts +40 -0
- package/src/index.ts +866 -0
- package/src/inject-upstream.ts +15 -0
- package/src/inpaint-region.ts +51 -0
- package/src/json-evaluator.ts +732 -0
- package/src/json-path.ts +52 -0
- package/src/lip-sync-pricing.ts +90 -0
- package/src/list-merge.ts +40 -0
- package/src/list-sort.ts +122 -0
- package/src/list-source-resolver.ts +50 -0
- package/src/llm-models.ts +245 -0
- package/src/location-mention-slug.ts +291 -0
- package/src/location-preset-catalog-map.ts +128 -0
- package/src/loop-delimiter.ts +73 -0
- package/src/lora-routing.ts +95 -0
- package/src/lottie-overlay-catalog.ts +175 -0
- package/src/lottie-slots.ts +309 -0
- package/src/model-catalog.ts +2386 -0
- package/src/model-constants.ts +1910 -0
- package/src/model-tree.ts +120 -0
- package/src/monetization.ts +15 -0
- package/src/multi-pick.ts +42 -0
- package/src/node-default-mappings.ts +262 -0
- package/src/node-mappable-fields.ts +70 -0
- package/src/node-preset-export.ts +56 -0
- package/src/node-preset-extract.ts +147 -0
- package/src/node-refs.ts +253 -0
- package/src/node-runtime-keys.ts +117 -0
- package/src/object-aspect-defaults.ts +72 -0
- package/src/object-picker-types.ts +22 -0
- package/src/parameter-node-value.ts +284 -0
- package/src/pinterest-url.ts +28 -0
- package/src/pipeline-chat.ts +72 -0
- package/src/pipeline-defaults.ts +318 -0
- package/src/pipeline-events.ts +162 -0
- package/src/pipeline-state-types.ts +196 -0
- package/src/pipeline-types.ts +647 -0
- package/src/pipeline-validation.ts +87 -0
- package/src/presentation-types.ts +23 -0
- package/src/presentation-utils.ts +397 -0
- package/src/producer-types.ts +188 -0
- package/src/progress-curve.ts +99 -0
- package/src/provider-directive-defaults.ts +69 -0
- package/src/reduce-strategy-registry.ts +121 -0
- package/src/reference-board-templates.ts +81 -0
- package/src/reference-roles.ts +153 -0
- package/src/reference-sheet/__tests__/board-to-column.test.ts +20 -0
- package/src/reference-sheet/__tests__/catalog.test.ts +50 -0
- package/src/reference-sheet/__tests__/cost.test.ts +38 -0
- package/src/reference-sheet/__tests__/no-drift.test.ts +28 -0
- package/src/reference-sheet/__tests__/panel-plan.test.ts +61 -0
- package/src/reference-sheet/__tests__/panel-prompts.test.ts +17 -0
- package/src/reference-sheet/__tests__/plan-generation.test.ts +72 -0
- package/src/reference-sheet/__tests__/presets.test.ts +54 -0
- package/src/reference-sheet/__tests__/types.test.ts +24 -0
- package/src/reference-sheet/catalog.ts +144 -0
- package/src/reference-sheet/cost.ts +37 -0
- package/src/reference-sheet/credit-id.ts +7 -0
- package/src/reference-sheet/index.ts +8 -0
- package/src/reference-sheet/panel-plan.ts +65 -0
- package/src/reference-sheet/panel-prompts.ts +14 -0
- package/src/reference-sheet/plan-generation.ts +79 -0
- package/src/reference-sheet/presets.ts +77 -0
- package/src/reference-sheet/types.ts +92 -0
- package/src/repeat-types.ts +97 -0
- package/src/resolve-field-mappings.ts +119 -0
- package/src/route-filter.ts +80 -0
- package/src/scene-helper-types.ts +249 -0
- package/src/scene-node-types.ts +281 -0
- package/src/scraper-actors.ts +57 -0
- package/src/scraper-output-schemas.ts +25 -0
- package/src/seasons.ts +45 -0
- package/src/selector.ts +864 -0
- package/src/settled-with-limit.ts +42 -0
- package/src/shot-element.ts +43 -0
- package/src/social-media-specs.ts +121 -0
- package/src/social-post.ts +24 -0
- package/src/sub-workflow-validation.ts +78 -0
- package/src/supported-fonts.ts +40 -0
- package/src/surround.ts +113 -0
- package/src/switchx-pricing.ts +33 -0
- package/src/text-separators.ts +59 -0
- package/src/to-connected-references.ts +77 -0
- package/src/types.ts +272 -0
- package/src/variant-job-id.ts +17 -0
- package/src/vehicles.ts +213 -0
- package/src/video-analysis-pricing.ts +74 -0
- package/src/video-analysis.ts +127 -0
- package/src/video-duration.ts +25 -0
- package/src/voice-changer-models.ts +36 -0
- package/src/voice-matcher-types.ts +37 -0
- package/src/voices.ts +92 -0
- package/src/weapons.ts +190 -0
- package/src/workflow-export.ts +153 -0
package/src/furniture.ts
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical catalog of furniture presets for the Object entity node.
|
|
3
|
+
*
|
|
4
|
+
* When the Object category is "furniture", users pick a specific furniture
|
|
5
|
+
* piece from this catalog. The picker auto-fills the object's `objectName`
|
|
6
|
+
* and `description` so the existing `buildObjectPrompt` pipeline just works
|
|
7
|
+
* — no backend prompt changes needed.
|
|
8
|
+
*
|
|
9
|
+
* Organized into everyday sub-categories: seating, tables, beds, storage,
|
|
10
|
+
* lighting, kitchen & dining, outdoor, decorative, and bath.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export type FurnitureSubcategory =
|
|
14
|
+
| "seating"
|
|
15
|
+
| "tables"
|
|
16
|
+
| "beds"
|
|
17
|
+
| "storage"
|
|
18
|
+
| "lighting"
|
|
19
|
+
| "kitchen-dining"
|
|
20
|
+
| "outdoor"
|
|
21
|
+
| "decorative"
|
|
22
|
+
| "bath"
|
|
23
|
+
|
|
24
|
+
export interface Furniture {
|
|
25
|
+
readonly id: string
|
|
26
|
+
readonly label: string
|
|
27
|
+
readonly subcategory: FurnitureSubcategory
|
|
28
|
+
readonly description: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const FURNITURE: ReadonlyArray<Furniture> = [
|
|
32
|
+
// -------------------- Seating --------------------
|
|
33
|
+
{ id: "sofa", label: "Sofa", subcategory: "seating", description: "Three-seater sofa with plush cushioned back and seat, low armrests and upholstery in a neutral tone" },
|
|
34
|
+
{ id: "sectional-sofa", label: "Sectional Sofa", subcategory: "seating", description: "L-shaped sectional sofa with deep seats, soft cushions, a chaise end and hidden storage or recline mechanisms" },
|
|
35
|
+
{ id: "loveseat", label: "Loveseat", subcategory: "seating", description: "Compact two-seat loveseat with rolled arms, tufted back and tapered wooden legs" },
|
|
36
|
+
{ id: "armchair", label: "Armchair", subcategory: "seating", description: "Upholstered armchair with a tall padded back, curved armrests and four slim wooden legs" },
|
|
37
|
+
{ id: "recliner", label: "Recliner", subcategory: "seating", description: "Padded recliner chair with a pull lever, extending footrest, thick leather upholstery and a reclined backrest" },
|
|
38
|
+
{ id: "office-chair", label: "Office Chair", subcategory: "seating", description: "Ergonomic office chair with a mesh back, adjustable armrests, gas-lift height and a five-point caster base" },
|
|
39
|
+
{ id: "rocking-chair", label: "Rocking Chair", subcategory: "seating", description: "Wooden rocking chair with curved rockers, a woven cane back and a padded seat cushion" },
|
|
40
|
+
{ id: "throne", label: "Throne", subcategory: "seating", description: "Ornate royal throne with a towering carved back, gilded trim, jeweled accents and a plush velvet cushion" },
|
|
41
|
+
{ id: "bean-bag", label: "Bean Bag", subcategory: "seating", description: "Oversized slouchy bean bag chair with soft fabric exterior and a pillowy squishy shape that molds to the body" },
|
|
42
|
+
{ id: "stool", label: "Stool", subcategory: "seating", description: "Simple backless stool with a round wooden seat, four splayed turned legs and a worn comfortable patina" },
|
|
43
|
+
{ id: "bench", label: "Bench", subcategory: "seating", description: "Long wooden bench with a flat seat, open slatted back and sturdy planked legs" },
|
|
44
|
+
{ id: "chaise-lounge", label: "Chaise Lounge", subcategory: "seating", description: "Elegant chaise lounge with a sloped headrest, elongated upholstered seat and turned wooden legs" },
|
|
45
|
+
{ id: "dining-chair", label: "Dining Chair", subcategory: "seating", description: "Formal dining chair with a high slatted back, upholstered seat cushion and tapered wooden legs" },
|
|
46
|
+
|
|
47
|
+
// -------------------- Tables --------------------
|
|
48
|
+
{ id: "dining-table", label: "Dining Table", subcategory: "tables", description: "Large rectangular dining table with a polished wooden top, thick trestle base and seating for six to eight" },
|
|
49
|
+
{ id: "coffee-table", label: "Coffee Table", subcategory: "tables", description: "Low rectangular coffee table with a glass or wooden top, clean minimalist legs and a lower shelf for magazines" },
|
|
50
|
+
{ id: "side-table", label: "Side Table", subcategory: "tables", description: "Petite side table with a round top, single drawer and slim tapered legs" },
|
|
51
|
+
{ id: "console-table", label: "Console Table", subcategory: "tables", description: "Narrow console table with a long slim top, delicate legs and decorative scrollwork along the apron" },
|
|
52
|
+
{ id: "desk", label: "Desk", subcategory: "tables", description: "Writing desk with a flat work surface, drawer bank on the side and a cable management cutout at the back" },
|
|
53
|
+
{ id: "workbench", label: "Workbench", subcategory: "tables", description: "Heavy-duty workbench with a thick butcher-block top, pegboard back panel and a vice clamped to one edge" },
|
|
54
|
+
{ id: "vanity-table", label: "Vanity Table", subcategory: "tables", description: "Dressing vanity with a wide tri-fold mirror, small drawers on each side and a cushioned bench tucked underneath" },
|
|
55
|
+
{ id: "nightstand", label: "Nightstand", subcategory: "tables", description: "Small bedside nightstand with a single drawer, open lower shelf and a lamp-ready top surface" },
|
|
56
|
+
{ id: "picnic-table", label: "Picnic Table", subcategory: "tables", description: "Classic wooden picnic table with a plank top, attached bench seats and weathered outdoor finish" },
|
|
57
|
+
|
|
58
|
+
// -------------------- Beds --------------------
|
|
59
|
+
{ id: "bed-single", label: "Single Bed", subcategory: "beds", description: "Narrow single bed with a padded headboard, tailored fitted sheet and a folded throw blanket at the foot" },
|
|
60
|
+
{ id: "bed-queen", label: "Queen Bed", subcategory: "beds", description: "Queen-size bed with a tall upholstered headboard, layered pillows, a crisp duvet and a runner across the foot" },
|
|
61
|
+
{ id: "bed-king", label: "King Bed", subcategory: "beds", description: "Grand king-size bed with a tufted headboard, multiple plush pillows, crisp white linens and a thick quilted duvet" },
|
|
62
|
+
{ id: "bunk-bed", label: "Bunk Bed", subcategory: "beds", description: "Sturdy wooden bunk bed with two stacked mattresses, side ladder, safety rails and matching kid-friendly bedding" },
|
|
63
|
+
{ id: "canopy-bed", label: "Canopy Bed", subcategory: "beds", description: "Four-poster canopy bed with tall carved posts, a fabric canopy draped overhead and flowing curtains at each corner" },
|
|
64
|
+
{ id: "four-poster-bed", label: "Four-Poster Bed", subcategory: "beds", description: "Four-poster bed with turned wooden columns at each corner rising unadorned to match the headboard's carved profile" },
|
|
65
|
+
{ id: "daybed", label: "Daybed", subcategory: "beds", description: "Daybed with a low frame, three upholstered sides acting as back and armrests and bolster cushions along the wall" },
|
|
66
|
+
{ id: "crib", label: "Baby Crib", subcategory: "beds", description: "Wooden baby crib with vertical slatted sides, a small fitted mattress and soft plush toys tucked inside" },
|
|
67
|
+
{ id: "futon", label: "Futon", subcategory: "beds", description: "Convertible futon with a slim padded mattress over a folding metal frame that converts from sofa to bed" },
|
|
68
|
+
{ id: "hammock", label: "Hammock", subcategory: "beds", description: "Woven rope hammock slung between two supports, gently sagging with an inviting curve and colorful tassels at each end" },
|
|
69
|
+
|
|
70
|
+
// -------------------- Storage --------------------
|
|
71
|
+
{ id: "bookshelf", label: "Bookshelf", subcategory: "storage", description: "Tall freestanding bookshelf with multiple horizontal shelves, wooden sides and rows of neatly stacked books" },
|
|
72
|
+
{ id: "wardrobe", label: "Wardrobe", subcategory: "storage", description: "Large double-door wardrobe with a full-length hanging section, drawer bank and decorative paneled doors" },
|
|
73
|
+
{ id: "dresser", label: "Dresser", subcategory: "storage", description: "Wooden dresser with a wide top, six deep drawers in two columns, brass pull handles and short tapered legs" },
|
|
74
|
+
{ id: "cabinet", label: "Cabinet", subcategory: "storage", description: "Storage cabinet with paneled doors, interior adjustable shelves and brass hardware" },
|
|
75
|
+
{ id: "chest", label: "Storage Chest", subcategory: "storage", description: "Weathered wooden storage chest with iron banding, a hinged domed lid and a heavy clasp latch at the front" },
|
|
76
|
+
{ id: "trunk", label: "Steamer Trunk", subcategory: "storage", description: "Vintage steamer trunk with leather straps, brass corners, travel stickers and a latched lid revealing tray inserts" },
|
|
77
|
+
{ id: "filing-cabinet", label: "Filing Cabinet", subcategory: "storage", description: "Four-drawer metal filing cabinet with label slots on each drawer, recessed pull handles and a key lock at the top" },
|
|
78
|
+
{ id: "tv-stand", label: "TV Stand", subcategory: "storage", description: "Low entertainment TV stand with open shelves, glass-fronted cabinet doors and cable pass-throughs" },
|
|
79
|
+
{ id: "display-case", label: "Display Case", subcategory: "storage", description: "Tall glass display case with interior lighting, glass shelves and a lockable framed door" },
|
|
80
|
+
{ id: "hutch", label: "China Hutch", subcategory: "storage", description: "Two-part china hutch with a glass-fronted upper cabinet showing plates on edge and a buffet base with drawers and doors" },
|
|
81
|
+
{ id: "toy-chest", label: "Toy Chest", subcategory: "storage", description: "Painted wooden toy chest with cheerful decals, a soft-close hinged lid and stickers accumulated on the sides" },
|
|
82
|
+
|
|
83
|
+
// -------------------- Lighting --------------------
|
|
84
|
+
{ id: "floor-lamp", label: "Floor Lamp", subcategory: "lighting", description: "Tall floor lamp with a slim metal stand, weighted base, pull-chain switch and a drum fabric shade at the top" },
|
|
85
|
+
{ id: "table-lamp", label: "Table Lamp", subcategory: "lighting", description: "Classic table lamp with a ceramic base, pleated fabric shade and a small pull-chain switch" },
|
|
86
|
+
{ id: "desk-lamp", label: "Desk Lamp", subcategory: "lighting", description: "Articulating desk lamp with an adjustable arm, hinged head and a small cone-shaped metal shade" },
|
|
87
|
+
{ id: "chandelier", label: "Chandelier", subcategory: "lighting", description: "Grand crystal chandelier with tiered cascading crystals, curved golden arms and multiple flame-shaped bulbs" },
|
|
88
|
+
{ id: "pendant-light", label: "Pendant Light", subcategory: "lighting", description: "Modern pendant light hanging from a long cord with a minimalist metal or glass shade" },
|
|
89
|
+
{ id: "sconce", label: "Wall Sconce", subcategory: "lighting", description: "Wall-mounted sconce with a decorative backplate, curved arm and a fabric or glass shade pointing upward" },
|
|
90
|
+
{ id: "lantern", label: "Lantern", subcategory: "lighting", description: "Classic lantern with a metal frame, glass panels, a candle or flickering bulb inside and a carrying ring on top" },
|
|
91
|
+
{ id: "candelabra", label: "Candelabra", subcategory: "lighting", description: "Ornate silver candelabra with multiple curved branching arms each holding a tall taper candle" },
|
|
92
|
+
{ id: "neon-sign", label: "Neon Sign", subcategory: "lighting", description: "Glowing neon sign with bent glass tubes shaped into cursive lettering or a retro icon, casting colored light on the wall" },
|
|
93
|
+
|
|
94
|
+
// -------------------- Kitchen & Dining --------------------
|
|
95
|
+
{ id: "kitchen-island", label: "Kitchen Island", subcategory: "kitchen-dining", description: "Freestanding kitchen island with a thick butcher-block top, cabinet storage below, bar stool overhang and a rack above" },
|
|
96
|
+
{ id: "bar-counter", label: "Bar Counter", subcategory: "kitchen-dining", description: "Home bar counter with a polished wooden top, brass footrail, backlit glass shelving and rows of bottles displayed behind" },
|
|
97
|
+
{ id: "bar-stool", label: "Bar Stool", subcategory: "kitchen-dining", description: "Tall bar stool with a round swiveling seat, footrest ring, metal frame and an optional low backrest" },
|
|
98
|
+
{ id: "pot-rack", label: "Pot Rack", subcategory: "kitchen-dining", description: "Overhead hanging pot rack with a wrought-iron frame, S-hooks dangling pots and pans and shelving for spices on top" },
|
|
99
|
+
{ id: "spice-rack", label: "Spice Rack", subcategory: "kitchen-dining", description: "Wall-mounted spice rack with rows of small labeled glass jars, wooden shelves and a cheerful cluttered charm" },
|
|
100
|
+
{ id: "buffet", label: "Buffet", subcategory: "kitchen-dining", description: "Long dining-room buffet with a flat top for serving platters, drawers for linens and cabinet doors for dishware below" },
|
|
101
|
+
|
|
102
|
+
// -------------------- Outdoor --------------------
|
|
103
|
+
{ id: "patio-chair", label: "Patio Chair", subcategory: "outdoor", description: "Outdoor patio chair with a weather-resistant woven wicker seat, aluminum frame and a weatherproof cushion" },
|
|
104
|
+
{ id: "adirondack-chair", label: "Adirondack Chair", subcategory: "outdoor", description: "Classic wooden Adirondack chair with a slanted slatted back, wide flat armrests and a seat that scoops gently back" },
|
|
105
|
+
{ id: "porch-swing", label: "Porch Swing", subcategory: "outdoor", description: "Wooden porch swing suspended on chains from the ceiling with a slatted seat and a row of colorful outdoor cushions" },
|
|
106
|
+
{ id: "gazebo", label: "Gazebo", subcategory: "outdoor", description: "Freestanding outdoor gazebo with a peaked shingled roof, six open wooden columns, railings and a raised wooden floor" },
|
|
107
|
+
{ id: "bistro-set", label: "Bistro Set", subcategory: "outdoor", description: "Compact outdoor bistro set with a round wrought-iron table and two matching chairs in a glossy weather-resistant finish" },
|
|
108
|
+
{ id: "sun-lounger", label: "Sun Lounger", subcategory: "outdoor", description: "Poolside sun lounger with an adjustable reclining back, white vinyl straps and a matching side table" },
|
|
109
|
+
{ id: "fire-pit", label: "Fire Pit", subcategory: "outdoor", description: "Round outdoor fire pit bowl with a rough-iron exterior, flickering flames and glowing embers beneath a protective mesh screen" },
|
|
110
|
+
|
|
111
|
+
// -------------------- Decorative --------------------
|
|
112
|
+
{ id: "mirror", label: "Mirror", subcategory: "decorative", description: "Large wall mirror with an ornate gilded frame, carved scrollwork and slightly aged silvering in the glass" },
|
|
113
|
+
{ id: "rug", label: "Rug", subcategory: "decorative", description: "Large patterned area rug with intricate woven motifs, tasseled ends and a soft plush pile" },
|
|
114
|
+
{ id: "vase", label: "Vase", subcategory: "decorative", description: "Tall ceramic vase with a rounded body, narrow neck, glazed finish and a fresh bouquet of flowers arranged inside" },
|
|
115
|
+
{ id: "grandfather-clock", label: "Grandfather Clock", subcategory: "decorative", description: "Tall wooden grandfather clock with a glass pendulum door, brass clock face, roman numerals and a chime mechanism" },
|
|
116
|
+
{ id: "wall-art", label: "Framed Wall Art", subcategory: "decorative", description: "Large framed artwork in a gilded or minimalist frame with a gallery-style matte border and a single focal painting" },
|
|
117
|
+
{ id: "pillow", label: "Throw Pillow", subcategory: "decorative", description: "Decorative throw pillow with a patterned cover, piped edges, plush fill and an invisible zipper closure" },
|
|
118
|
+
{ id: "curtains", label: "Curtains", subcategory: "decorative", description: "Full-length curtains with thick draping fabric, pleated tops hanging from a metal rod and tie-backs on each side" },
|
|
119
|
+
{ id: "sculpture", label: "Sculpture", subcategory: "decorative", description: "Abstract sculpture on a pedestal with flowing organic forms in bronze or marble catching the light from multiple angles" },
|
|
120
|
+
|
|
121
|
+
// -------------------- Bath --------------------
|
|
122
|
+
{ id: "bathtub", label: "Bathtub", subcategory: "bath", description: "Freestanding clawfoot bathtub with rolled rim, polished white enamel interior and four ornate cast-iron feet" },
|
|
123
|
+
{ id: "shower", label: "Walk-In Shower", subcategory: "bath", description: "Walk-in shower with frameless glass panels, tiled walls, a rainfall showerhead and a linear floor drain" },
|
|
124
|
+
{ id: "toilet", label: "Toilet", subcategory: "bath", description: "Standard white ceramic toilet with an oval bowl, elongated seat and a tank with a chrome flush handle" },
|
|
125
|
+
{ id: "sink-vanity", label: "Sink Vanity", subcategory: "bath", description: "Bathroom sink vanity with a stone countertop, undermount basin, wide mirror above and paneled cabinet doors below" },
|
|
126
|
+
{ id: "towel-rack", label: "Towel Rack", subcategory: "bath", description: "Wall-mounted heated towel rack with multiple horizontal bars and fluffy folded towels draped over each bar" },
|
|
127
|
+
] as const
|
|
128
|
+
|
|
129
|
+
const furnitureById = new Map<string, Furniture>(FURNITURE.map((f) => [f.id, f]))
|
|
130
|
+
|
|
131
|
+
export function getFurniture(id: string | undefined | null): Furniture | undefined {
|
|
132
|
+
if (!id) return undefined
|
|
133
|
+
return furnitureById.get(id)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function getFurnitureLabel(id: string | undefined | null, fallback?: string): string {
|
|
137
|
+
const f = getFurniture(id)
|
|
138
|
+
if (f) return f.label
|
|
139
|
+
if (fallback !== undefined) return fallback
|
|
140
|
+
return (id ?? "").replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase())
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export const FURNITURE_IDS: ReadonlyArray<string> = FURNITURE.map((f) => f.id)
|
|
144
|
+
|
|
145
|
+
export const FURNITURE_SUBCATEGORY_LABELS: Readonly<Record<FurnitureSubcategory, string>> = {
|
|
146
|
+
seating: "Seating",
|
|
147
|
+
tables: "Tables",
|
|
148
|
+
beds: "Beds",
|
|
149
|
+
storage: "Storage",
|
|
150
|
+
lighting: "Lighting",
|
|
151
|
+
"kitchen-dining": "Kitchen & Dining",
|
|
152
|
+
outdoor: "Outdoor",
|
|
153
|
+
decorative: "Decorative",
|
|
154
|
+
bath: "Bath",
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export const FURNITURE_SUBCATEGORY_ORDER: ReadonlyArray<FurnitureSubcategory> = [
|
|
158
|
+
"seating",
|
|
159
|
+
"tables",
|
|
160
|
+
"beds",
|
|
161
|
+
"storage",
|
|
162
|
+
"lighting",
|
|
163
|
+
"kitchen-dining",
|
|
164
|
+
"outdoor",
|
|
165
|
+
"decorative",
|
|
166
|
+
"bath",
|
|
167
|
+
]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Delimiter the Generate Text templates instruct the LLM to emit between blocks. */
|
|
2
|
+
export const GENERATE_TEXT_DELIMITER = "===NEXT==="
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Split a Generate Text result into fan-out items. Used by BOTH the frontend
|
|
6
|
+
* extractNodeOutput and the backend output-extractor so single-node and DAG
|
|
7
|
+
* execution produce identical `items`.
|
|
8
|
+
*/
|
|
9
|
+
export function splitGeneratedItems(text: string | null | undefined): string[] {
|
|
10
|
+
if (!text) return []
|
|
11
|
+
const parts = text.split(GENERATE_TEXT_DELIMITER).map((s) => s.trim()).filter(Boolean)
|
|
12
|
+
if (parts.length > 0) return parts
|
|
13
|
+
const trimmed = text.trim()
|
|
14
|
+
return trimmed ? [trimmed] : []
|
|
15
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for reading a node's accumulated `generatedResults` array.
|
|
3
|
+
*
|
|
4
|
+
* Used by both frontend DAG executor (`node-input-resolver.ts`) and backend
|
|
5
|
+
* orchestrator (`output-extractor.ts`) so they agree on when a node has
|
|
6
|
+
* upstream-consumable output.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Extract all output values from a node's accumulated generatedResults.
|
|
11
|
+
* Returns the full flat list (any length). Returns undefined only when empty.
|
|
12
|
+
*/
|
|
13
|
+
export function extractAllGeneratedResults(
|
|
14
|
+
data: Record<string, unknown>,
|
|
15
|
+
): string[] | undefined {
|
|
16
|
+
const results = data.generatedResults as
|
|
17
|
+
| Array<{ url?: string; text?: string }>
|
|
18
|
+
| undefined
|
|
19
|
+
if (!results || results.length === 0) return undefined
|
|
20
|
+
const outputs = results
|
|
21
|
+
.map((r) => r.url || r.text || "")
|
|
22
|
+
.filter((v) => v.length > 0)
|
|
23
|
+
return outputs.length > 0 ? outputs : undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Extract a JSON array (e.g. web-scrape `generatedJson`) as a list of strings.
|
|
28
|
+
* Each array element is stringified; already-string elements pass through.
|
|
29
|
+
*/
|
|
30
|
+
export function extractGeneratedJsonAsList(
|
|
31
|
+
data: Record<string, unknown>,
|
|
32
|
+
): string[] | undefined {
|
|
33
|
+
const jsonArr = data.generatedJson
|
|
34
|
+
if (!Array.isArray(jsonArr) || jsonArr.length === 0) return undefined
|
|
35
|
+
return jsonArr.map((item: unknown) =>
|
|
36
|
+
typeof item === "string" ? item : JSON.stringify(item),
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* If a collected item list has a single entry whose contents parse to a
|
|
42
|
+
* non-empty JSON array, spread the array's elements into separate items.
|
|
43
|
+
* Mirrors the `output.json` spread in the orchestrator so a list node with
|
|
44
|
+
* one row holding a JSON array feeds filter-list / deduplicate / sort-list /
|
|
45
|
+
* merge-lists per-element instead of as one giant stringified blob.
|
|
46
|
+
*/
|
|
47
|
+
export function spreadJsonArrayIfSingleton(items: string[]): string[] {
|
|
48
|
+
if (items.length !== 1) return items
|
|
49
|
+
const single = items[0]
|
|
50
|
+
if (typeof single !== "string") return items
|
|
51
|
+
const trimmed = single.trim()
|
|
52
|
+
if (!trimmed.startsWith("[")) return items
|
|
53
|
+
let parsed: unknown
|
|
54
|
+
try {
|
|
55
|
+
parsed = JSON.parse(trimmed)
|
|
56
|
+
} catch {
|
|
57
|
+
return items
|
|
58
|
+
}
|
|
59
|
+
if (!Array.isArray(parsed) || parsed.length === 0) return items
|
|
60
|
+
return parsed.map((el) =>
|
|
61
|
+
typeof el === "string" ? el : JSON.stringify(el),
|
|
62
|
+
)
|
|
63
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { OutputType } from "./presentation-utils.js"
|
|
2
|
+
|
|
3
|
+
// Intentional subset of OutputType (presentation-utils.ts:152) —
|
|
4
|
+
// excludes "data" (multi-output / opaque types are skipped from aggregation).
|
|
5
|
+
export type AggregateableType = "text" | "image" | "video" | "audio"
|
|
6
|
+
|
|
7
|
+
// Stable ordered tuple of aggregateable types — used for handle ordering + presentTypes.
|
|
8
|
+
export const AGGREGATEABLE_TYPES = ["text", "image", "video", "audio"] as const
|
|
9
|
+
|
|
10
|
+
export interface Member {
|
|
11
|
+
nodeId: string
|
|
12
|
+
type: AggregateableType
|
|
13
|
+
value: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface AggregationBuckets {
|
|
17
|
+
text: string[]
|
|
18
|
+
image: string[]
|
|
19
|
+
video: string[]
|
|
20
|
+
audio: string[]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function aggregateByType(members: Member[]): AggregationBuckets {
|
|
24
|
+
const buckets: AggregationBuckets = { text: [], image: [], video: [], audio: [] }
|
|
25
|
+
for (const m of members) buckets[m.type].push(m.value)
|
|
26
|
+
return buckets
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function presentTypes(buckets: AggregationBuckets): AggregateableType[] {
|
|
30
|
+
return AGGREGATEABLE_TYPES.filter((t) => buckets[t].length > 0)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Type guard for narrowing OutputType to AggregateableType.
|
|
34
|
+
export function isAggregateableType(t: OutputType | undefined): t is AggregateableType {
|
|
35
|
+
return t === "text" || t === "image" || t === "video" || t === "audio"
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Handle id naming conventions for Group / Collect dynamic output handles + Collect's single input handle.
|
|
39
|
+
export const GROUP_HANDLE_PREFIX = "out-" as const
|
|
40
|
+
export const COLLECT_IN_HANDLE = "in" as const
|
|
41
|
+
|
|
42
|
+
export function groupHandleId(t: AggregateableType): string {
|
|
43
|
+
return `${GROUP_HANDLE_PREFIX}${t}`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function parseGroupHandle(h: string | null | undefined): AggregateableType | undefined {
|
|
47
|
+
if (!h || !h.startsWith(GROUP_HANDLE_PREFIX)) return undefined
|
|
48
|
+
const candidate = h.slice(GROUP_HANDLE_PREFIX.length) as OutputType
|
|
49
|
+
return isAggregateableType(candidate) ? candidate : undefined
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Build a parent → children-ids map from a flat node array in a single pass.
|
|
54
|
+
* Used by both engines' `buildExecutionLevels` to derive the implicit
|
|
55
|
+
* child → group dependency edges in O(N+G) instead of O(N×G).
|
|
56
|
+
*/
|
|
57
|
+
export function buildChildrenByParent<N extends { id: string; parentId?: string }>(
|
|
58
|
+
nodes: ReadonlyArray<N>,
|
|
59
|
+
): Map<string, string[]> {
|
|
60
|
+
const childrenByParent = new Map<string, string[]>()
|
|
61
|
+
for (const n of nodes) {
|
|
62
|
+
if (!n.parentId) continue
|
|
63
|
+
const list = childrenByParent.get(n.parentId)
|
|
64
|
+
if (list) list.push(n.id)
|
|
65
|
+
else childrenByParent.set(n.parentId, [n.id])
|
|
66
|
+
}
|
|
67
|
+
return childrenByParent
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Whether an edge targets a Collect node's "in" handle. The default-"in" fallback
|
|
71
|
+
// matches every other call site so legacy edges without an explicit targetHandle
|
|
72
|
+
// keep working. Duck-typed input shape avoids a runtime dep on @xyflow/react.
|
|
73
|
+
export function isCollectInEdge(e: { targetHandle?: string | null }): boolean {
|
|
74
|
+
return (e.targetHandle ?? COLLECT_IN_HANDLE) === COLLECT_IN_HANDLE
|
|
75
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Structural node/edge/graph shapes used by hint + aggregation helpers. */
|
|
2
|
+
export interface HintNodeLike {
|
|
3
|
+
readonly id: string
|
|
4
|
+
readonly type?: string
|
|
5
|
+
readonly data?: unknown
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface HintEdgeLike {
|
|
9
|
+
readonly source: string
|
|
10
|
+
readonly target: string
|
|
11
|
+
readonly sourceHandle?: string | null
|
|
12
|
+
readonly targetHandle?: string | null
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface HintGraphContext {
|
|
16
|
+
readonly nodes: ReadonlyArray<HintNodeLike>
|
|
17
|
+
readonly edges: ReadonlyArray<HintEdgeLike>
|
|
18
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { LocaleCatalogMap } from "./types.js"
|
|
2
|
+
|
|
3
|
+
const map: LocaleCatalogMap = {
|
|
4
|
+
// ── Disaster ──
|
|
5
|
+
"earthquake-tremor": { label: "هزة أرضية", description: "اهتزاز خفيف للأرض، أشياء معلقة تتأرجح" },
|
|
6
|
+
"earthquake-major": { label: "زلزال كبير", description: "أرض تتشقق، حطام يتساقط" },
|
|
7
|
+
"building-collapse": { label: "انهيار مبنى", description: "بناء يتفتت أثناء سقوطه" },
|
|
8
|
+
"tsunami-wave": { label: "موجة تسونامي", description: "جدار شاهق من الماء يندفع للأمام" },
|
|
9
|
+
"tornado": { label: "إعصار قمعي", description: "سحابة قمعية تلامس الأرض" },
|
|
10
|
+
"hurricane": { label: "إعصار", description: "رياح عاصفة تثني الأشجار، أمطار غزيرة" },
|
|
11
|
+
"blizzard-whiteout": { label: "عاصفة ثلجية مُعمية", description: "ثلوج كثيفة تمحو الرؤية" },
|
|
12
|
+
"sandstorm": { label: "عاصفة رملية", description: "جدار من الغبار البرتقالي يبتلع المشهد" },
|
|
13
|
+
"dust-storm-haboob": { label: "عاصفة غبار (هبوب)", description: "جبهة غبار صحراوية شاهقة" },
|
|
14
|
+
"wildfire-distant": { label: "حريق غابات بعيد", description: "توهج برتقالي + دخان في الأفق" },
|
|
15
|
+
"wildfire-engulfing": { label: "حريق ملتهم", description: "ألسنة لهب تقترب، تموج حراري شديد" },
|
|
16
|
+
"volcanic-eruption": { label: "ثوران بركاني", description: "حمم تتدفق، عمود رماد" },
|
|
17
|
+
"lava-flow": { label: "تدفق حمم", description: "نهر منصهر متوهج يزحف على الأرض" },
|
|
18
|
+
"ash-rain": { label: "مطر رماد", description: "رماد رمادي مرعب يتساقط كالثلج" },
|
|
19
|
+
"avalanche": { label: "انهيار جليدي", description: "جدار من الثلج ينهمر على المنحدر" },
|
|
20
|
+
"hailstorm": { label: "عاصفة بَرَد", description: "حبات بَرَد كبيرة ترتد عن الأسطح" },
|
|
21
|
+
|
|
22
|
+
// ── Fire & Blasts ──
|
|
23
|
+
"explosion-small": { label: "انفجار صغير", description: "انفجار مُحكم مع وميض مركزي" },
|
|
24
|
+
"explosion-large": { label: "انفجار كبير", description: "كرة نارية بحجم مركبة مع حطام" },
|
|
25
|
+
"explosion-massive": { label: "انفجار هائل", description: "كرة نارية تسوي مبانٍ مع موجة صدمة" },
|
|
26
|
+
"nuclear-detonation": { label: "تفجير نووي", description: "سحابة فطرية + ومضة تضيء الأفق" },
|
|
27
|
+
"fireball-airborne": { label: "كرة نار محمولة جوا", description: "كرة لهب متدحرجة في الجو" },
|
|
28
|
+
"gas-explosion": { label: "انفجار غاز", description: "اندفاع لامع بأسلوب بروبان" },
|
|
29
|
+
"oil-fire": { label: "حريق نفط", description: "ألسنة لهب طويلة دهنية + دخان أسود كثيف" },
|
|
30
|
+
"blazing-inferno": { label: "جحيم متوهج", description: "جدار من النار يلتهم كل شيء" },
|
|
31
|
+
"flame-burst": { label: "اندفاع لهب", description: "نفاثة سريعة موجهة من اللهب" },
|
|
32
|
+
"ember-shower": { label: "وابل جمرات", description: "شلال من الجمرات البرتقالية المتوهجة" },
|
|
33
|
+
"smoke-pillar": { label: "عمود دخان", description: "عمود عمودي طويل من الدخان الأسود" },
|
|
34
|
+
"mushroom-cloud": { label: "سحابة فطرية", description: "سحابة تفجير كلاسيكية بقبة وجذع" },
|
|
35
|
+
|
|
36
|
+
// ── Electric ──
|
|
37
|
+
"lightning-bolt": { label: "صاعقة برق", description: "ضربة متفرعة عبر سماء عاصفة" },
|
|
38
|
+
"lightning-strike-impact": { label: "ضربة برق", description: "صاعقة تضرب الأرض بانفجار من الضوء" },
|
|
39
|
+
"lightning-storm": { label: "عاصفة برقية", description: "ضربات متعددة متزامنة" },
|
|
40
|
+
"ball-lightning": { label: "برق كروي", description: "كرة متوهجة من البلازما الكهربائية تطفو في الجو" },
|
|
41
|
+
"plasma-arc": { label: "قوس بلازما", description: "قوس مستمر عالي الجهد بين نقطتين" },
|
|
42
|
+
"taser-sparks": { label: "شرر صاعق كهربائي", description: "تفريغ كهربائي مُحكم متطاير عند التلامس" },
|
|
43
|
+
"electric-discharge": { label: "تفريغ كهربائي", description: "اندفاع طاقة متقوسة من جهاز معطل" },
|
|
44
|
+
"transformer-blowout": { label: "انفجار محول كهربائي", description: "انفجار أزرق أبيض فوق عمود كهرباء" },
|
|
45
|
+
"st-elmos-fire": { label: "نار القديس إلمو", description: "توهج بلازما أزرق مخيف على أطراف معدنية" },
|
|
46
|
+
"static-shock-burst": { label: "صدمة كهرباء ساكنة", description: "ومضة صغيرة مرئية من كهرباء ساكنة" },
|
|
47
|
+
|
|
48
|
+
// ── Combat ──
|
|
49
|
+
"muzzle-flash": { label: "ومضة فوهة", description: "ومضة برتقالية ساطعة من فوهة بندقية" },
|
|
50
|
+
"gunshot-impact": { label: "ارتطام طلقة", description: "رصاصة تصيب سطحا ببخاخ من الحطام" },
|
|
51
|
+
"bullet-trail": { label: "أثر رصاصة", description: "أثر مرئي لرصاصة عبر الهواء" },
|
|
52
|
+
"sword-spark": { label: "شرر سيف", description: "وابل ماكرو من الشرر بفعل احتكاك المعدن" },
|
|
53
|
+
"blade-clash": { label: "اشتباك نصال", description: "نصلان يلتقيان بموجة ارتطام" },
|
|
54
|
+
"ricochet-spark": { label: "شرر ارتداد", description: "رصاصة ترتد عن المعدن مع شرر" },
|
|
55
|
+
"debris-field": { label: "حقل حطام", description: "شظايا متجمدة في الجو تتناثر" },
|
|
56
|
+
"glass-shatter-airborne": { label: "تحطم زجاج في الجو", description: "زجاج ينفجر للخارج إلى شظايا معلقة" },
|
|
57
|
+
"shockwave-ground": { label: "موجة صدمة أرضية", description: "حلقة مرئية تتسع على مستوى الأرض" },
|
|
58
|
+
"sonic-boom": { label: "دوي صوتي", description: "مخروط هواء مضغوط بسرعة فوق صوتية" },
|
|
59
|
+
"smoke-grenade": { label: "قنبلة دخانية", description: "دخان ملون كثيف يتفتح للخارج" },
|
|
60
|
+
"flashbang": { label: "قنبلة صوتية ضوئية", description: "اندفاع أبيض مُعمي من الضوء" },
|
|
61
|
+
"blood-spray": { label: "رذاذ دم", description: "قوس سينمائي من قطرات الدم" },
|
|
62
|
+
"arrow-hit-spark": { label: "شرر ارتطام سهم", description: "سهم يضرب بشرر صغير عند الارتطام" },
|
|
63
|
+
|
|
64
|
+
// ── Sci-Fi ──
|
|
65
|
+
"laser-blast": { label: "إطلاق ليزر", description: "شعاع متماسك ساطع من الطاقة" },
|
|
66
|
+
"energy-beam": { label: "شعاع طاقة", description: "شعاع عريض نابض من طاقة البلازما" },
|
|
67
|
+
"plasma-bolt": { label: "قذيفة بلازما", description: "مقذوف متوهج يترك أثرا من البخار" },
|
|
68
|
+
"force-field-shimmer": { label: "تلألؤ حقل قوة", description: "حاجز طاقة شفاف بنمط سداسي" },
|
|
69
|
+
"force-field-impact": { label: "ارتطام بحقل قوة", description: "تموج مرئي حيث يصطدم المقذوف بالدرع" },
|
|
70
|
+
"portal-opening": { label: "فتح بوابة", description: "دوامة طاقة تشق الفضاء" },
|
|
71
|
+
"warp-distortion": { label: "تشويه حرف", description: "زمكان ينحني حول جسم" },
|
|
72
|
+
"hologram-flicker": { label: "وميض هولوجرام", description: "إسقاط شفاف يتعطل" },
|
|
73
|
+
"ion-storm": { label: "عاصفة أيونية", description: "حقل متطاير من جسيمات مشحونة على خلفية كونية" },
|
|
74
|
+
"antimatter-flash": { label: "ومضة مضاد المادة", description: "اندفاع طاقة بيضاء يمزق الواقع" },
|
|
75
|
+
|
|
76
|
+
// ── Magic ──
|
|
77
|
+
"fireball-spell": { label: "تعويذة كرة نار", description: "كرة نار دوارة مُلقاة باليد" },
|
|
78
|
+
"magic-aura": { label: "هالة سحرية", description: "هالة طاقة متوهجة حول شخصية" },
|
|
79
|
+
"summoning-glyph": { label: "حرف استدعاء", description: "دائرة سحرية متوهجة على الأرض" },
|
|
80
|
+
"lightning-magic": { label: "سحر برق", description: "سحر كهربائي يتقوس من يدي الساحر" },
|
|
81
|
+
"ice-shard-burst": { label: "اندفاع شظايا ثلجية", description: "شظايا بلورية تتطاير للخارج" },
|
|
82
|
+
"energy-rune": { label: "رمز طاقة", description: "رمز سحري متوهج معلق في الهواء" },
|
|
83
|
+
"portal-magic": { label: "بوابة سحرية", description: "مدخل غامض دوار في الفضاء" },
|
|
84
|
+
"healing-glow": { label: "توهج شفاء", description: "ضوء ذهبي دافئ ينبعث من الساحر" },
|
|
85
|
+
"dark-vortex": { label: "دوامة مظلمة", description: "فراغ دوار أسود بنفسجي مشؤوم" },
|
|
86
|
+
"light-explosion": { label: "انفجار ضوء", description: "اندفاع من إشعاع أبيض ذهبي خالص" },
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export default map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { LocaleCatalogMap } from "./types.js"
|
|
2
|
+
|
|
3
|
+
const map: LocaleCatalogMap = {
|
|
4
|
+
// ── Disaster ──
|
|
5
|
+
"earthquake-tremor": { label: "Erdbeben (leicht)", description: "Leichtes Beben, hängende Objekte schwanken" },
|
|
6
|
+
"earthquake-major": { label: "Schweres Erdbeben", description: "Aufreißender Boden, herabstürzende Trümmer" },
|
|
7
|
+
"building-collapse": { label: "Gebäudeeinsturz", description: "Bauwerk zerbricht im Fall" },
|
|
8
|
+
"tsunami-wave": { label: "Tsunami-Welle", description: "Hereinstürzende Wand aus Wasser" },
|
|
9
|
+
"tornado": { label: "Tornado", description: "Trichterwolke berührt den Boden" },
|
|
10
|
+
"hurricane": { label: "Hurrikan", description: "Heulende Winde, gebogene Bäume, Regenschleier" },
|
|
11
|
+
"blizzard-whiteout": { label: "Schneesturm-Whiteout", description: "Dichter Schnee löscht die Sicht aus" },
|
|
12
|
+
"sandstorm": { label: "Sandsturm", description: "Wand aus orangefarbenem Staub verschluckt die Szene" },
|
|
13
|
+
"dust-storm-haboob": { label: "Staubsturm (Haboob)", description: "Hochaufragende Wüsten-Staubfront" },
|
|
14
|
+
"wildfire-distant": { label: "Ferner Waldbrand", description: "Oranges Glühen + Rauch am Horizont" },
|
|
15
|
+
"wildfire-engulfing": { label: "Verschlingender Waldbrand", description: "Flammen rücken näher, intensives Hitzeflimmern" },
|
|
16
|
+
"volcanic-eruption": { label: "Vulkanausbruch", description: "Aufsteigende Lava, Aschewolke" },
|
|
17
|
+
"lava-flow": { label: "Lavastrom", description: "Glühender geschmolzener Strom kriecht über den Boden" },
|
|
18
|
+
"ash-rain": { label: "Aschefall", description: "Apokalyptische graue Asche fällt wie Schnee" },
|
|
19
|
+
"avalanche": { label: "Lawine", description: "Schneewand stürzt den Berghang hinunter" },
|
|
20
|
+
"hailstorm": { label: "Hagelsturm", description: "Große Hagelkörner prallen von Oberflächen ab" },
|
|
21
|
+
|
|
22
|
+
// ── Fire & Blasts ──
|
|
23
|
+
"explosion-small": { label: "Kleine Explosion", description: "Kompakte Detonation mit Lichtblitz im Zentrum" },
|
|
24
|
+
"explosion-large": { label: "Große Explosion", description: "Feuerball in Fahrzeuggröße mit umherfliegenden Trümmern" },
|
|
25
|
+
"explosion-massive": { label: "Massive Explosion", description: "Gebäudezerschmetternder Feuerball mit Druckwelle" },
|
|
26
|
+
"nuclear-detonation": { label: "Nukleare Detonation", description: "Atompilz und horizonterhellender Lichtblitz" },
|
|
27
|
+
"fireball-airborne": { label: "Schwebender Feuerball", description: "Rollende Feuerkugel in der Luft" },
|
|
28
|
+
"gas-explosion": { label: "Gasexplosion", description: "Heller Propan-artiger Lichtblitz" },
|
|
29
|
+
"oil-fire": { label: "Ölbrand", description: "Hohe fettige Flammen + dichter schwarzer Rauch" },
|
|
30
|
+
"blazing-inferno": { label: "Loderndes Inferno", description: "Feuerwand verschlingt alles" },
|
|
31
|
+
"flame-burst": { label: "Flammenstoß", description: "Schneller gerichteter Flammenstrahl" },
|
|
32
|
+
"ember-shower": { label: "Funkenflug", description: "Kaskade glühender oranger Funken" },
|
|
33
|
+
"smoke-pillar": { label: "Rauchsäule", description: "Hohe vertikale Säule aus schwarzem Rauch" },
|
|
34
|
+
"mushroom-cloud": { label: "Atompilz", description: "Klassische Detonationswolke aus Stiel und Kuppel" },
|
|
35
|
+
|
|
36
|
+
// ── Electric ──
|
|
37
|
+
"lightning-bolt": { label: "Blitz", description: "Verzweigte Entladung am Sturmhimmel" },
|
|
38
|
+
"lightning-strike-impact": { label: "Blitzeinschlag", description: "Blitz schlägt in den Boden mit Lichtexplosion" },
|
|
39
|
+
"lightning-storm": { label: "Gewittersturm", description: "Mehrere gleichzeitige Einschläge" },
|
|
40
|
+
"ball-lightning": { label: "Kugelblitz", description: "Glühender Plasma-Orb schwebt in der Luft" },
|
|
41
|
+
"plasma-arc": { label: "Plasmabogen", description: "Hochspannungs-Dauerlichtbogen zwischen zwei Punkten" },
|
|
42
|
+
"taser-sparks": { label: "Taser-Funken", description: "Kompakte knisternde elektrische Entladung beim Kontakt" },
|
|
43
|
+
"electric-discharge": { label: "Elektrische Entladung", description: "Schauer aus Lichtbögen aus einem defekten Gerät" },
|
|
44
|
+
"transformer-blowout": { label: "Transformator-Explosion", description: "Blau-weiße Explosion auf einem Strommast" },
|
|
45
|
+
"st-elmos-fire": { label: "Elmsfeuer", description: "Unheimliches blaues Plasmaglühen an Metallspitzen" },
|
|
46
|
+
"static-shock-burst": { label: "Statikentladung", description: "Winziger sichtbarer Funken statischer Elektrizität" },
|
|
47
|
+
|
|
48
|
+
// ── Combat ──
|
|
49
|
+
"muzzle-flash": { label: "Mündungsfeuer", description: "Heller orangefarbener Blitz aus dem Gewehrlauf" },
|
|
50
|
+
"gunshot-impact": { label: "Schuss-Einschlag", description: "Kugel trifft Oberfläche mit Trümmer-Auswurf" },
|
|
51
|
+
"bullet-trail": { label: "Geschossspur", description: "Sichtbarer Streif einer Kugel durch die Luft" },
|
|
52
|
+
"sword-spark": { label: "Klingenfunken", description: "Makro-Schauer aus Reibungsfunken Metall auf Metall" },
|
|
53
|
+
"blade-clash": { label: "Klingenstoß", description: "Zwei Klingen treffen mit Schockwelle aufeinander" },
|
|
54
|
+
"ricochet-spark": { label: "Querschläger-Funken", description: "Kugel prallt von Metall mit Funkenflug ab" },
|
|
55
|
+
"debris-field": { label: "Trümmerfeld", description: "In der Luft erstarrende Splitter zerstreuen sich" },
|
|
56
|
+
"glass-shatter-airborne": { label: "Glas zerspringt im Flug", description: "Glas explodiert nach außen in Splittern in der Luft" },
|
|
57
|
+
"shockwave-ground": { label: "Druckwelle am Boden", description: "Sichtbarer expandierender Ring auf Bodenhöhe" },
|
|
58
|
+
"sonic-boom": { label: "Überschallknall", description: "Kegel komprimierter Luft bei Überschallgeschwindigkeit" },
|
|
59
|
+
"smoke-grenade": { label: "Rauchgranate", description: "Dichter farbiger Rauch breitet sich nach außen aus" },
|
|
60
|
+
"flashbang": { label: "Blendgranate", description: "Blendender weißer Lichtblitz" },
|
|
61
|
+
"blood-spray": { label: "Blutsprenkel", description: "Filmreifer Bogen aus Bluttropfen" },
|
|
62
|
+
"arrow-hit-spark": { label: "Pfeil-Einschlagfunken", description: "Pfeil trifft mit kleinen Funken am Aufprall ein" },
|
|
63
|
+
|
|
64
|
+
// ── Sci-Fi ──
|
|
65
|
+
"laser-blast": { label: "Laserstrahl", description: "Heller kohärenter Energiestrahl" },
|
|
66
|
+
"energy-beam": { label: "Energiestrahl", description: "Breiter pulsierender Plasma-Energiestrahl" },
|
|
67
|
+
"plasma-bolt": { label: "Plasmageschoss", description: "Glühendes Projektil mit Dampfschweif" },
|
|
68
|
+
"force-field-shimmer": { label: "Kraftfeld-Schimmer", description: "Durchscheinende Energiebarriere mit Hex-Muster" },
|
|
69
|
+
"force-field-impact": { label: "Kraftfeld-Aufprall", description: "Sichtbare Welle dort, wo das Geschoss den Schild trifft" },
|
|
70
|
+
"portal-opening": { label: "Portalöffnung", description: "Wirbelnder Energievortex reißt den Raum auf" },
|
|
71
|
+
"warp-distortion": { label: "Warp-Verzerrung", description: "Raumzeit krümmt sich um ein Objekt" },
|
|
72
|
+
"hologram-flicker": { label: "Hologramm-Flackern", description: "Durchscheinende Projektion glitcht" },
|
|
73
|
+
"ion-storm": { label: "Ionensturm", description: "Knisterndes Feld geladener Teilchen vor kosmischer Kulisse" },
|
|
74
|
+
"antimatter-flash": { label: "Antimaterie-Blitz", description: "Realitäts-zerreißender Stoß reiner weißer Energie" },
|
|
75
|
+
|
|
76
|
+
// ── Magic ──
|
|
77
|
+
"fireball-spell": { label: "Feuerball-Zauber", description: "Mit der Hand geworfener Wirbel aus Feuer" },
|
|
78
|
+
"magic-aura": { label: "Magische Aura", description: "Glühender Energie-Halo um eine Figur" },
|
|
79
|
+
"summoning-glyph": { label: "Beschwörungsglyphe", description: "Glühender magischer Kreis am Boden" },
|
|
80
|
+
"lightning-magic": { label: "Blitzmagie", description: "Elektrische Zauberei aus den Händen des Magiers" },
|
|
81
|
+
"ice-shard-burst": { label: "Eissplitter-Stoß", description: "Kristalline Splitter spritzen nach außen" },
|
|
82
|
+
"energy-rune": { label: "Energierune", description: "Glühendes arkanes Symbol schwebt in der Luft" },
|
|
83
|
+
"portal-magic": { label: "Magisches Portal", description: "Wirbelndes mystisches Tor im Raum" },
|
|
84
|
+
"healing-glow": { label: "Heilungsschein", description: "Warmes goldenes Licht strömt vom Zaubernden aus" },
|
|
85
|
+
"dark-vortex": { label: "Dunkler Vortex", description: "Bedrohlicher schwarz-violetter Wirbelschlund" },
|
|
86
|
+
"light-explosion": { label: "Lichtexplosion", description: "Blitz aus reinem weiß-goldenem Strahlen" },
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export default map
|