{
  "tfsVersion": "1",
  "exportDate": "2026-05-25",
  "bloc": {
    "name": "Style Transfert",
    "w": 5,
    "h": 11,
    "rows": [
      {
        "btns": [
          {
            "label": "Copy Style",
            "jsx": "~/Documents/TFS/scripts/CopyStyle.jsx",
            "type": "script",
            "scriptMode": "file",
            "expressionProperty": "position",
            "expressionCode": "",
            "commandMode": "effect",
            "commandId": "",
            "commandName": "",
            "commandNameFr": "",
            "img": "{\"type\":\"lucide\",\"name\":\"copy\",\"color\":\"#00A0FF\"}",
            "hideLabel": true,
            "tooltip": "Copies the style of a text layer",
            "_file": {
              "filename": "CopyStyle.jsx",
              "encoding": "utf8",
              "content": "$.global.copiedStyle = null;\n$.global.copiedEffects = [];\n\nvar isFrenchAE = (app.isoLanguage && app.isoLanguage.toLowerCase().indexOf(\"fr\") === 0);\n\nfunction t(fr, en) {\n    return isFrenchAE ? fr : en;\n}\n\nfunction copyTextStyle(layer) {\n    $.global.copiedStyle = layer.property(\"Source Text\").value;\n}\n\nfunction copyEffects(layer) {\n    var effects = layer.property(\"ADBE Effect Parade\");\n\n    $.global.copiedEffects = [];\n\n    if (!effects || effects.numProperties === 0) {\n        return;\n    }\n\n    for (var i = 1; i <= effects.numProperties; i++) {\n        var effect = effects.property(i);\n\n        var effectData = {\n            matchName: effect.matchName,\n            name: effect.name,\n            enabled: effect.enabled,\n            properties: []\n        };\n\n        for (var j = 1; j <= effect.numProperties; j++) {\n            var prop = effect.property(j);\n\n            try {\n                if (prop.propertyValueType !== PropertyValueType.NO_VALUE) {\n                    effectData.properties.push({\n                        index: j,\n                        value: prop.value\n                    });\n                }\n            } catch (e) {}\n        }\n\n        $.global.copiedEffects.push(effectData);\n    }\n}\n\n\n// Lancement du script\nvar comp = app.project.activeItem;\n\nif (!(comp instanceof CompItem)) {\n    alert(t(\n        \"Veuillez ouvrir une composition.\",\n        \"Please open a composition.\"\n    ));\n} else if (comp.selectedLayers.length !== 1 || !(comp.selectedLayers[0] instanceof TextLayer)) {\n    alert(t(\n        \"Veuillez sélectionner un calque texte.\",\n        \"Please select a text layer.\"\n    ));\n} else {\n    app.beginUndoGroup(\"Copy Text Style and Effects\");\n\n    var selectedLayer = comp.selectedLayers[0];\n\n    copyTextStyle(selectedLayer);\n    copyEffects(selectedLayer);\n\n    app.endUndoGroup();\n}"
            }
          }
        ]
      },
      {
        "btns": [
          {
            "label": "Paste Style",
            "jsx": "~/Documents/TFS/scripts/PasteStyle.jsx",
            "type": "script",
            "scriptMode": "file",
            "expressionProperty": "position",
            "expressionCode": "",
            "commandMode": "effect",
            "commandId": "",
            "commandName": "",
            "commandNameFr": "",
            "img": "{\"type\":\"lucide\",\"name\":\"copy-plus\",\"color\":\"#00A0FF\"}",
            "hideLabel": true,
            "tooltip": "Pastes the style onto a text layer",
            "_file": {
              "filename": "PasteStyle.jsx",
              "encoding": "utf8",
              "content": "var isFrenchAE = (app.isoLanguage && app.isoLanguage.toLowerCase().indexOf(\"fr\") === 0);\n\nfunction t(fr, en) {\n    return isFrenchAE ? fr : en;\n}\n\nfunction pasteTextStyle(layer) {\n    if (!$.global.copiedStyle) return;\n\n    if (layer instanceof TextLayer) {\n        var sourceText = layer.property(\"Source Text\");\n        var currentText = sourceText.value.text;\n\n        var newStyle = $.global.copiedStyle;\n        newStyle.text = currentText;\n\n        sourceText.setValue(newStyle);\n    }\n}\n\nfunction pasteEffects(layer) {\n    if (!$.global.copiedEffects || $.global.copiedEffects.length === 0) return;\n\n    var targetEffects = layer.property(\"ADBE Effect Parade\");\n\n    for (var e = 0; e < $.global.copiedEffects.length; e++) {\n        var data = $.global.copiedEffects[e];\n\n        try {\n            var newEffect = targetEffects.addProperty(data.matchName);\n            newEffect.name = data.name;\n            newEffect.enabled = data.enabled;\n\n            for (var p = 0; p < data.properties.length; p++) {\n                try {\n                    var propData = data.properties[p];\n                    newEffect.property(propData.index).setValue(propData.value);\n                } catch (err) {}\n            }\n\n        } catch (err2) {}\n    }\n}\n\n\n// Lancement du script\nvar comp = app.project.activeItem;\n\nif (!(comp instanceof CompItem)) {\n    alert(t(\n        \"Veuillez ouvrir une composition.\",\n        \"Please open a composition.\"\n    ));\n} else if (comp.selectedLayers.length === 0) {\n    alert(t(\n        \"Veuillez sélectionner au moins un calque.\",\n        \"Please select at least one layer.\"\n    ));\n} else {\n    app.beginUndoGroup(\"Paste Text Style and Effects\");\n\n    var selectedLayers = comp.selectedLayers;\n\n    for (var i = 0; i < selectedLayers.length; i++) {\n        var layer = selectedLayers[i];\n\n        pasteTextStyle(layer);\n        pasteEffects(layer);\n    }\n\n    app.endUndoGroup();\n}"
            }
          }
        ]
      }
    ]
  }
}