@fprad0/skill-master-mcp 0.0.11 → 1.0.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.
- package/CHANGELOG.md +96 -83
- package/README.md +472 -443
- package/VERSION.md +9 -9
- package/bin/lib/bootstrap-global-core.mjs +34 -0
- package/bin/lib/client-config.mjs +293 -268
- package/bin/lib/doctor-core.mjs +202 -0
- package/bin/lib/menu-core.mjs +1629 -1154
- package/bin/lib/operation-result.mjs +59 -0
- package/bin/lib/register-clients-core.mjs +247 -0
- package/bin/lib/skill-installation.mjs +215 -0
- package/bin/lib/update-cli-core.mjs +117 -0
- package/bin/skill-master-activation.mjs +163 -163
- package/bin/skill-master-bootstrap-global.mjs +61 -49
- package/bin/skill-master-configure-private-registry.mjs +3 -3
- package/bin/skill-master-doctor.mjs +239 -181
- package/bin/skill-master-eval-activation.mjs +32 -32
- package/bin/skill-master-install-global-skills.mjs +59 -97
- package/bin/skill-master-install-project-skills.mjs +97 -0
- package/bin/skill-master-menu.mjs +406 -320
- package/bin/skill-master-register-clients.mjs +232 -98
- package/bin/skill-master-success-skills.mjs +307 -307
- package/bin/skill-master-update.mjs +121 -72
- package/bin/skill-master.mjs +3 -3
- package/dist/activation.d.ts.map +1 -1
- package/dist/activation.js +12 -0
- package/dist/activation.js.map +1 -1
- package/dist/prompt-router.d.ts.map +1 -1
- package/dist/prompt-router.js +19 -0
- package/dist/prompt-router.js.map +1 -1
- package/dist/recommender.d.ts.map +1 -1
- package/dist/recommender.js +4 -1
- package/dist/recommender.js.map +1 -1
- package/docs/architecture/APRENDIZADO_DE_IMPLEMENTACOES_BEM_SUCEDIDAS.md +125 -125
- package/docs/architecture/ARQUITETURA_AUTO_UPDATE.md +9 -9
- package/docs/architecture/PLANO_MASTER_ACIONAMENTO_AUTOMATICO_E_APRENDIZADO.md +341 -341
- package/docs/architecture/REDE_SEGURA_DE_SKILLS.md +148 -148
- package/docs/operations/GUIA_MULTI_COMPUTADOR.md +262 -255
- package/docs/operations/GUIA_NPM_PRIVADO.md +294 -294
- package/docs/operations/GUIA_NPM_PUBLICO.md +147 -147
- package/docs/operations/MENU_VISUAL_EVIDENCE_2026-06-28.md +66 -0
- package/docs/operations/assets/menu-frame-compact.html +76 -0
- package/docs/operations/assets/menu-frame-compact.png +0 -0
- package/docs/operations/assets/menu-frame-large.html +84 -0
- package/docs/operations/assets/menu-frame-large.png +0 -0
- package/docs/operations/assets/menu-frame-running.html +80 -0
- package/docs/operations/assets/menu-frame-running.png +0 -0
- package/docs/operations/cross-platform-auth-transfer/ANALISE_COMPATIBILIDADE_MCP_2026-06-28.md +140 -0
- package/docs/operations/cross-platform-auth-transfer/README_TRANSFERENCIA.md +85 -0
- package/docs/operations/reborn-menu-cyberpunk-transfer/ANALISE_MENU_REBORN_CYBERPUNK_2026-06-28.md +174 -0
- package/docs/operations/reborn-menu-cyberpunk-transfer/HANDOFF_IMPLEMENTACAO_REBORN_CYBERPUNK_2026-06-28.md +119 -0
- package/docs/operations/reborn-menu-cyberpunk-transfer/ORDEM_DE_EXECUCAO_MENU_REBORN_CYBERPUNK.md +134 -0
- package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA.md +84 -0
- package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA_REBORN_PACKAGE.md +56 -0
- package/docs/operations/reborn-menu-cyberpunk-transfer/references/cyan-hud-frame-sheet.jpg +0 -0
- package/docs/operations/reborn-menu-cyberpunk-transfer/references/cyberpunk-pattern-sheet.jpg +0 -0
- package/docs/operations/reborn-menu-cyberpunk-transfer/references/fluid-workflow-windows.gif +0 -0
- package/docs/operations/token-economy-transfer/ANALISE_AVANCADA_ECONOMIA_TOKENS_2026-06-30.md +141 -0
- package/docs/operations/token-economy-transfer/PLANO_DEV_SENIOR_MASTER_TOKEN_ECONOMY_2026-06-30.md +171 -0
- package/docs/operations/token-economy-transfer/README_TRANSFERENCIA_TOKEN_ECONOMY.md +31 -0
- package/docs/planning/MENU_RUNTIME_CORRECTION_PLAN_2026-06-30.md +551 -0
- package/docs/planning/V0_0_9_APROVACAO_CRITICA_MENSAGENS_DE_VENDA.md +85 -85
- package/docs/planning/V0_0_9_FONTES_E_CRITERIOS_DE_AUTORIDADE.md +139 -139
- package/docs/planning/V0_0_9_MATRIZ_SKILLS_MULTIDISCIPLINARES.md +105 -105
- package/docs/planning/V0_0_9_POLITICA_MORAL_CATOLICA_PARA_IA.md +181 -181
- package/docs/planning/V0_0_9_PROMPTS_EXECUCAO.md +59 -59
- package/docs/planning/V0_0_9_ROADMAP_DISCERNIMENTO_E_CONHECIMENTO_AMPLO.md +181 -181
- package/docs/prompt-tasks/PROMPT_TASK_001_BOOTSTRAP_SKILL_MASTER_MCP.md +6 -0
- package/docs/prompt-tasks/PROMPT_TASK_002_AUTO_UPDATE_LAUNCHER.md +6 -0
- package/docs/prompt-tasks/PROMPT_TASK_003_REMOTE_MANIFEST_AND_RELEASES.md +6 -0
- package/docs/prompt-tasks/PROMPT_TASK_004_MULTI_USER_DISTRIBUTION.md +6 -0
- package/docs/prompt-tasks/PROMPT_TASK_005_SECURITY_AND_QUALITY_GATE.md +6 -0
- package/docs/prompt-tasks/PROMPT_TASK_006_MASTER_ACIONAMENTO_APRENDIZADO.md +83 -0
- package/docs/prompt-tasks/PROMPT_TASK_007_PERSONA_ORQUESTRADORA.md +88 -0
- package/docs/prompt-tasks/PROMPT_TASK_008_PROMPT_ROUTER_MODOS_ATIVACAO.md +156 -0
- package/docs/prompt-tasks/PROMPT_TASK_009_PIPELINE_APRENDIZADO_SUCESSO.md +105 -0
- package/docs/prompt-tasks/PROMPT_TASK_010_EVALS_GOVERNANCA_ATIVACAO.md +119 -0
- package/docs/prompt-tasks/PROMPT_TASK_011_MENU_NOTIFICACOES_NOTION.md +120 -0
- package/docs/prompt-tasks/PROMPT_TASK_012_MENU_CYBERPUNK_PIXEL_FRAME.md +123 -0
- package/docs/prompt-tasks/PROMPT_TASK_013_MENU_FLUID_DNA_ANIMATION.md +114 -0
- package/docs/prompt-tasks/PROMPT_TASK_014_MENU_FUNCTIONAL_PARITY_QA.md +157 -0
- package/docs/prompt-tasks/PROMPT_TASK_015_TRANSFER_RELEASE_HANDOFF.md +127 -0
- package/docs/prompt-tasks/PROMPT_TASK_016_CROSS_PLATFORM_MCP_AUTH_REGISTRATION.md +107 -0
- package/docs/prompt-tasks/PROMPT_TASK_018_NPM_PUBLISH_2FA_SETUP.md +80 -0
- package/docs/prompt-tasks/PROMPT_TASK_019_TOKEN_ECONOMY_GLOBAL_SKILLS.md +56 -0
- package/docs/prompt-tasks/PROMPT_TASK_MASTER_EXECUTOR.md +6 -0
- package/docs/skill-candidates/v0.0.10/cli-creator/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/cli-creator/SKILL.md +160 -160
- package/docs/skill-candidates/v0.0.10/cli-creator/agents/openai.yaml +4 -4
- package/docs/skill-candidates/v0.0.10/cli-creator/references/agent-cli-patterns.md +154 -154
- package/docs/skill-candidates/v0.0.10/developer-workstation-ops/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/figma/LICENSE.txt +1 -1
- package/docs/skill-candidates/v0.0.10/figma/SKILL.md +42 -42
- package/docs/skill-candidates/v0.0.10/figma/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma/references/figma-mcp-config.md +35 -35
- package/docs/skill-candidates/v0.0.10/figma/references/figma-tools-and-prompts.md +34 -34
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/SKILL.md +349 -349
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/references/mapping-checklist.md +7 -7
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/scripts/normalize_node_id.py +25 -25
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/SKILL.md +537 -537
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/references/rule-template.md +15 -15
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/scripts/check_agents_md.sh +9 -9
- package/docs/skill-candidates/v0.0.10/figma-generate-design/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-design/SKILL.md +341 -341
- package/docs/skill-candidates/v0.0.10/figma-generate-design/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-generate-design/maintainers.yml +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-library/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-library/SKILL.md +314 -314
- package/docs/skill-candidates/v0.0.10/figma-generate-library/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-generate-library/maintainers.yml +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/code-connect-setup.md +260 -260
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/component-creation.md +1014 -1014
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/discovery-phase.md +518 -518
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/documentation-creation.md +834 -834
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/error-recovery.md +540 -540
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/naming-conventions.md +527 -527
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/token-creation.md +962 -962
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/bindVariablesToComponent.js +110 -110
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/cleanupOrphans.js +127 -127
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createComponentWithVariants.js +148 -148
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createDocumentationPage.js +139 -139
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createSemanticTokens.js +108 -108
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createVariableCollection.js +49 -49
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/inspectFileStructure.js +121 -121
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/rehydrateState.js +92 -92
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/validateCreation.js +83 -83
- package/docs/skill-candidates/v0.0.10/figma-implement-design/LICENSE.txt +1 -1
- package/docs/skill-candidates/v0.0.10/figma-implement-design/SKILL.md +258 -258
- package/docs/skill-candidates/v0.0.10/figma-implement-design/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-use/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-use/SKILL.md +233 -233
- package/docs/skill-candidates/v0.0.10/figma-use/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-use/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-use/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-use/maintainers.yml +1 -1
- package/docs/skill-candidates/v0.0.10/figma-use/references/api-reference.md +301 -301
- package/docs/skill-candidates/v0.0.10/figma-use/references/common-patterns.md +512 -512
- package/docs/skill-candidates/v0.0.10/figma-use/references/component-patterns.md +488 -488
- package/docs/skill-candidates/v0.0.10/figma-use/references/effect-style-patterns.md +123 -123
- package/docs/skill-candidates/v0.0.10/figma-use/references/gotchas.md +599 -599
- package/docs/skill-candidates/v0.0.10/figma-use/references/maintainers.yml +12 -12
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-patterns.md +513 -513
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.d.ts +11293 -11293
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.index.md +441 -441
- package/docs/skill-candidates/v0.0.10/figma-use/references/text-style-patterns.md +203 -203
- package/docs/skill-candidates/v0.0.10/figma-use/references/validation-and-recovery.md +109 -109
- package/docs/skill-candidates/v0.0.10/figma-use/references/variable-patterns.md +354 -354
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/maintainers.yml +9 -9
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--creating.md +17 -17
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--using.md +17 -17
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components.md +50 -50
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-effect-styles.md +52 -52
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-text-styles.md +90 -90
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--creating.md +13 -13
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--using.md +13 -13
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables.md +64 -64
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds.md +41 -41
- package/docs/skill-candidates/v0.0.10/frontend-design/LICENSE.txt +177 -177
- package/docs/skill-candidates/v0.0.10/frontend-design/SKILL.md +55 -55
- package/docs/skill-candidates/v0.0.10/frontend-ui-ux-systems/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/github/SKILL.md +74 -74
- package/docs/skill-candidates/v0.0.10/github/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/github/assets/github-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/image-graphic-design-rendering/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/language-quality-pt-en-fr-it-ru/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/math-physics-reasoning/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/mcp-builder/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/mcp-builder/SKILL.md +236 -236
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/evaluation.md +601 -601
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/mcp_best_practices.md +249 -249
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/node_mcp_server.md +969 -969
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/python_mcp_server.md +718 -718
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/connections.py +151 -151
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/evaluation.py +373 -373
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/example_evaluation.xml +22 -22
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/requirements.txt +2 -2
- package/docs/skill-candidates/v0.0.10/mcp-client-readiness/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.10/openai-docs/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/openai-docs/SKILL.md +161 -161
- package/docs/skill-candidates/v0.0.10/openai-docs/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/openai-docs/assets/openai-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/openai-docs/references/latest-model.md +37 -37
- package/docs/skill-candidates/v0.0.10/openai-docs/references/prompting-guide.md +244 -244
- package/docs/skill-candidates/v0.0.10/openai-docs/references/upgrade-guide.md +181 -181
- package/docs/skill-candidates/v0.0.10/openai-docs/scripts/fetch-codex-manual.mjs +598 -598
- package/docs/skill-candidates/v0.0.10/openai-docs/scripts/resolve-latest-model-info.js +147 -147
- package/docs/skill-candidates/v0.0.10/playwright/NOTICE.txt +14 -14
- package/docs/skill-candidates/v0.0.10/playwright/SKILL.md +147 -147
- package/docs/skill-candidates/v0.0.10/playwright/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/playwright/assets/playwright-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/playwright/references/cli.md +116 -116
- package/docs/skill-candidates/v0.0.10/playwright/references/workflows.md +95 -95
- package/docs/skill-candidates/v0.0.10/playwright/scripts/playwright_cli.sh +25 -25
- package/docs/skill-candidates/v0.0.10/polyglot-backend-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/screenshot/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/screenshot/SKILL.md +267 -267
- package/docs/skill-candidates/v0.0.10/screenshot/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/screenshot/assets/screenshot-small.svg +5 -5
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/ensure_macos_permissions.sh +54 -54
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_display_info.swift +22 -22
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_permissions.swift +40 -40
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_window_info.swift +126 -126
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.ps1 +163 -163
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.py +585 -585
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/SKILL.md +62 -62
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/agents/openai.yaml +4 -4
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/activation-policy.md +77 -77
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/human-approval-policy.md +83 -83
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/persona-dev-senior-master.md +46 -46
- package/docs/skill-candidates/v0.0.10/terminal-menu-operations/SKILL.md +30 -30
- package/docs/skill-candidates/v0.0.10/terminal-pixel-art-tui/SKILL.md +43 -43
- package/docs/skill-candidates/v0.0.10/webapp-testing/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/webapp-testing/SKILL.md +95 -95
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/console_logging.py +34 -34
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/element_discovery.py +39 -39
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/static_html_automation.py +32 -32
- package/docs/skill-candidates/v0.0.10/webapp-testing/scripts/with_server.py +105 -105
- package/docs/skill-candidates/v0.0.10/winui-app/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/winui-app/SKILL.md +94 -94
- package/docs/skill-candidates/v0.0.10/winui-app/agents/openai.yaml +5 -5
- package/docs/skill-candidates/v0.0.10/winui-app/config.yaml +50 -50
- package/docs/skill-candidates/v0.0.10/winui-app/references/_sections.md +96 -96
- package/docs/skill-candidates/v0.0.10/winui-app/references/accessibility-input-and-localization.md +51 -51
- package/docs/skill-candidates/v0.0.10/winui-app/references/build-run-and-launch-verification.md +72 -72
- package/docs/skill-candidates/v0.0.10/winui-app/references/community-toolkit-controls-and-helpers.md +57 -57
- package/docs/skill-candidates/v0.0.10/winui-app/references/controls-layout-and-adaptive-ui.md +84 -84
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-environment-audit-and-remediation.md +82 -82
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-setup-and-project-selection.md +67 -67
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-template-first-recovery.md +62 -62
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-winui-app-structure.md +62 -62
- package/docs/skill-candidates/v0.0.10/winui-app/references/motion-animations-and-polish.md +45 -45
- package/docs/skill-candidates/v0.0.10/winui-app/references/performance-diagnostics-and-responsiveness.md +46 -46
- package/docs/skill-candidates/v0.0.10/winui-app/references/sample-source-map.md +37 -37
- package/docs/skill-candidates/v0.0.10/winui-app/references/shell-navigation-and-windowing.md +67 -67
- package/docs/skill-candidates/v0.0.10/winui-app/references/styling-theming-materials-and-icons.md +71 -71
- package/docs/skill-candidates/v0.0.10/winui-app/references/testing-debugging-and-review-checklists.md +77 -77
- package/docs/skill-candidates/v0.0.10/winui-app/references/windows-app-sdk-lifecycle-notifications-and-deployment.md +52 -52
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/SKILL.md +398 -398
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/common-patterns.md +330 -330
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/complete-examples.md +871 -871
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/component-patterns.md +501 -501
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/data-fetching.md +766 -766
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/file-organization.md +501 -501
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/loading-and-error-states.md +500 -500
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/performance.md +405 -405
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/routing-guide.md +363 -363
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/styling-guide.md +427 -427
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/typescript-standards.md +417 -417
- package/docs/skill-candidates/v0.0.11/git-version-control-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/go-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/java-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/javascript-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/json-contract-design/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/multi-client-mcp-ops/SKILL.md +36 -36
- package/docs/skill-candidates/v0.0.11/nextjs/SKILL.md +745 -745
- package/docs/skill-candidates/v0.0.11/nextjs/agents/openai.yaml +3 -3
- package/docs/skill-candidates/v0.0.11/nextjs/references/app-router-files.md +94 -94
- package/docs/skill-candidates/v0.0.11/python-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/ruby-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/senior-fullstack/SKILL.md +209 -209
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/architecture_patterns.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/development_workflows.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/tech_stack_guide.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/code_quality_analyzer.py +114 -114
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/fullstack_scaffolder.py +114 -114
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/project_scaffolder.py +114 -114
- package/docs/skill-candidates/v0.0.11/shadcn/SKILL.md +573 -573
- package/docs/skill-candidates/v0.0.11/shadcn/agents/openai.yaml +3 -3
- package/docs/skill-candidates/v0.0.11/sql-postgresql-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/terminal-shell-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/typescript-expert/SKILL.md +429 -429
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/tsconfig-strict.json +91 -91
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/typescript-cheatsheet.md +383 -383
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/utility-types.ts +335 -335
- package/docs/skill-candidates/v0.0.11/typescript-expert/scripts/ts_diagnostic.py +203 -203
- package/docs/skill-candidates/v0.0.11/ui-component-primitives/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/web-mobile-design-systems/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/windows-linux-platform-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.12/context-compression-handoff/SKILL.md +47 -0
- package/docs/skill-candidates/v0.0.12/csharp-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/css-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/go-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/html-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/javascript-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/json-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/prompt-budget-gate/SKILL.md +46 -0
- package/docs/skill-candidates/v0.0.12/python-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/react-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/ruby-senior-master-engineering/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.12/senior-master-code-optimizer/SKILL.md +48 -0
- package/docs/skill-candidates/v0.0.12/sql-senior-master-engineering/SKILL.md +31 -0
- package/docs/skill-candidates/v0.0.12/token-economy-orchestrator/SKILL.md +38 -0
- package/docs/skill-candidates/v0.0.12/typescript-senior-master-engineering/SKILL.md +35 -0
- package/docs/skill-candidates/v0.0.9/ai-ethics-human-dignity/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.9/broad-domain-router/SKILL.md +41 -41
- package/docs/skill-candidates/v0.0.9/catholic-moral-discernment/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.9/engineering-systems-master/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.9/language-quality-pt-en-fr/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.9/math-science-reasoning/SKILL.md +29 -29
- package/docs/skill-candidates/v0.0.9/philosophy-sociology-discernment/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.9/professional-boundary-triage/SKILL.md +40 -40
- package/docs/skill-candidates/v0.0.9/release-ethics-gate/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.9/source-authority-reviewer/SKILL.md +31 -31
- package/examples/client-configs/claude-code.commands.md +21 -17
- package/examples/client-configs/claude-code.project.mcp.json +18 -18
- package/examples/client-configs/claude-desktop.macos.json +18 -18
- package/examples/client-configs/claude-desktop.windows.json +20 -20
- package/examples/client-configs/codex.windows.toml +11 -11
- package/examples/client-configs/gemini-code-assist.intellij.mcp.json +18 -18
- package/examples/client-configs/gemini.linux.settings.json +21 -21
- package/examples/client-configs/gemini.windows.settings.json +23 -23
- package/examples/client-configs/generic-stdio.json +16 -16
- package/manifests/channels/beta.json +26 -26
- package/manifests/channels/stable.json +27 -27
- package/network/approved-skills.json +54 -54
- package/network/unapproved-skill-candidates.json +110 -110
- package/package.json +87 -78
- package/scripts/configure-private-registry.mjs +208 -208
- package/scripts/lib/private-registry.mjs +97 -97
- package/scripts/render-menu-evidence.mjs +130 -0
- package/scripts/verify-menu-actions.mjs +117 -115
- package/sources.json +11 -11
|
@@ -1,513 +1,513 @@
|
|
|
1
|
-
# Plugin API Patterns
|
|
2
|
-
|
|
3
|
-
> Part of the [use_figma skill](../SKILL.md). Quick reference for common Figma Plugin API operations.
|
|
4
|
-
|
|
5
|
-
## Contents
|
|
6
|
-
|
|
7
|
-
- Execution Basics
|
|
8
|
-
- Creating Nodes
|
|
9
|
-
- Fills and Strokes
|
|
10
|
-
- Auto Layout
|
|
11
|
-
- Effects
|
|
12
|
-
- Opacity and Blend Modes
|
|
13
|
-
- Corner Radius and Clipping
|
|
14
|
-
- Grouping and Organization
|
|
15
|
-
- Components and Variants
|
|
16
|
-
- Styles
|
|
17
|
-
- Cloning, Finding Nodes, and Grids
|
|
18
|
-
- Constraints and Viewport
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
## Execution Basics
|
|
22
|
-
|
|
23
|
-
### Page Context
|
|
24
|
-
|
|
25
|
-
Page context resets between `use_figma` calls — `figma.currentPage` always starts on the first page. Use `await figma.setCurrentPageAsync(page)` at the start of each invocation to switch to the correct page.
|
|
26
|
-
|
|
27
|
-
```javascript
|
|
28
|
-
const targetPage = figma.root.children.find(p => p.name === "My Page");
|
|
29
|
-
await figma.setCurrentPageAsync(targetPage);
|
|
30
|
-
// targetPage.children is now populated
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### Closing the Plugin
|
|
34
|
-
|
|
35
|
-
Every execution **must** call `figma.closePlugin()` on success and `figma.closePluginWithFailure()` on error:
|
|
36
|
-
|
|
37
|
-
```javascript
|
|
38
|
-
figma.closePlugin("Success message describing what was done");
|
|
39
|
-
figma.closePluginWithFailure("Description of what went wrong");
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
`figma.notify()` does **not** exist. Return all information via the close message string.
|
|
43
|
-
|
|
44
|
-
### Working Incrementally
|
|
45
|
-
|
|
46
|
-
Don't build an entire screen in one call. Break work into small steps:
|
|
47
|
-
1. Create tokens/variables
|
|
48
|
-
2. Create text styles
|
|
49
|
-
3. Build individual components
|
|
50
|
-
4. Compose sections
|
|
51
|
-
5. Assemble screens
|
|
52
|
-
|
|
53
|
-
Verify structure with `get_metadata` between steps. Use `get_screenshot` after each major creation milestone to catch visual problems early.
|
|
54
|
-
|
|
55
|
-
## Creating Nodes
|
|
56
|
-
|
|
57
|
-
### Frames
|
|
58
|
-
|
|
59
|
-
```javascript
|
|
60
|
-
const frame = figma.createFrame();
|
|
61
|
-
frame.name = "Container";
|
|
62
|
-
frame.resize(1440, 900);
|
|
63
|
-
frame.x = 0;
|
|
64
|
-
frame.y = 0;
|
|
65
|
-
frame.fills = [{ type: "SOLID", color: { r: 0.98, g: 0.98, b: 0.99 } }];
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Text
|
|
69
|
-
|
|
70
|
-
```javascript
|
|
71
|
-
// MUST load font before any text operations
|
|
72
|
-
await figma.loadFontAsync({ family: "Inter", style: "Regular" });
|
|
73
|
-
|
|
74
|
-
const text = figma.createText();
|
|
75
|
-
text.fontName = { family: "Inter", style: "Regular" };
|
|
76
|
-
text.fontSize = 16;
|
|
77
|
-
text.lineHeight = { value: 24, unit: "PIXELS" };
|
|
78
|
-
text.letterSpacing = { value: 0, unit: "PERCENT" };
|
|
79
|
-
text.characters = "Hello World";
|
|
80
|
-
text.fills = [{ type: "SOLID", color: { r: 0.1, g: 0.1, b: 0.12 } }];
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Rectangles
|
|
84
|
-
|
|
85
|
-
```javascript
|
|
86
|
-
const rect = figma.createRectangle();
|
|
87
|
-
rect.name = "Background";
|
|
88
|
-
rect.resize(400, 300);
|
|
89
|
-
rect.cornerRadius = 12;
|
|
90
|
-
rect.fills = [{ type: "SOLID", color: { r: 0.95, g: 0.95, b: 0.96 } }];
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Ellipses
|
|
94
|
-
|
|
95
|
-
```javascript
|
|
96
|
-
const circle = figma.createEllipse();
|
|
97
|
-
circle.name = "Avatar Circle";
|
|
98
|
-
circle.resize(48, 48);
|
|
99
|
-
circle.fills = [{ type: "SOLID", color: { r: 0.85, g: 0.87, b: 0.90 } }];
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Lines
|
|
103
|
-
|
|
104
|
-
```javascript
|
|
105
|
-
const line = figma.createLine();
|
|
106
|
-
line.name = "Divider";
|
|
107
|
-
line.resize(400, 0);
|
|
108
|
-
line.strokes = [{ type: "SOLID", color: { r: 0, g: 0, b: 0 }, opacity: 0.08 }];
|
|
109
|
-
line.strokeWeight = 1;
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### SVG Import
|
|
113
|
-
|
|
114
|
-
```javascript
|
|
115
|
-
const svgString = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
116
|
-
<path d="M5 12h14M12 5l7 7-7 7" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
117
|
-
</svg>`;
|
|
118
|
-
|
|
119
|
-
const node = figma.createNodeFromSvg(svgString);
|
|
120
|
-
node.name = "Icon/Arrow Right";
|
|
121
|
-
node.resize(24, 24);
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## Fills & Strokes
|
|
125
|
-
|
|
126
|
-
### Solid Fill
|
|
127
|
-
|
|
128
|
-
```javascript
|
|
129
|
-
node.fills = [{ type: "SOLID", color: { r: 0.2, g: 0.2, b: 0.25 } }];
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Fill with Opacity
|
|
133
|
-
|
|
134
|
-
```javascript
|
|
135
|
-
node.fills = [{ type: "SOLID", color: { r: 0.2, g: 0.2, b: 0.25 }, opacity: 0.5 }];
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### No Fill (Transparent)
|
|
139
|
-
|
|
140
|
-
```javascript
|
|
141
|
-
node.fills = [];
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Linear Gradient
|
|
145
|
-
|
|
146
|
-
```javascript
|
|
147
|
-
node.fills = [{
|
|
148
|
-
type: "GRADIENT_LINEAR",
|
|
149
|
-
gradientStops: [
|
|
150
|
-
{ color: { r: 0.2, g: 0.36, b: 0.96, a: 1 }, position: 0 },
|
|
151
|
-
{ color: { r: 0.56, g: 0.24, b: 0.88, a: 1 }, position: 1 }
|
|
152
|
-
],
|
|
153
|
-
gradientTransform: [[1, 0, 0], [0, 1, 0]]
|
|
154
|
-
}];
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### Strokes
|
|
158
|
-
|
|
159
|
-
```javascript
|
|
160
|
-
node.strokes = [{ type: "SOLID", color: { r: 0.85, g: 0.85, b: 0.87 } }];
|
|
161
|
-
node.strokeWeight = 1;
|
|
162
|
-
node.strokeAlign = "INSIDE"; // "CENTER", "OUTSIDE"
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### Multiple Fills (Layered)
|
|
166
|
-
|
|
167
|
-
```javascript
|
|
168
|
-
node.fills = [
|
|
169
|
-
{ type: "SOLID", color: { r: 0.95, g: 0.95, b: 0.96 } },
|
|
170
|
-
{ type: "SOLID", color: { r: 0.2, g: 0.36, b: 0.96 }, opacity: 0.05 }
|
|
171
|
-
];
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
## Auto Layout
|
|
175
|
-
|
|
176
|
-
### Setting Up Auto Layout
|
|
177
|
-
|
|
178
|
-
```javascript
|
|
179
|
-
const frame = figma.createFrame();
|
|
180
|
-
frame.layoutMode = "VERTICAL"; // or "HORIZONTAL"
|
|
181
|
-
frame.primaryAxisSizingMode = "AUTO"; // Hug main axis
|
|
182
|
-
frame.counterAxisSizingMode = "FIXED"; // Fixed cross axis
|
|
183
|
-
frame.resize(360, 1); // Width fixed, height auto
|
|
184
|
-
frame.itemSpacing = 16; // Gap between children
|
|
185
|
-
frame.paddingTop = 24;
|
|
186
|
-
frame.paddingBottom = 24;
|
|
187
|
-
frame.paddingLeft = 24;
|
|
188
|
-
frame.paddingRight = 24;
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### Alignment
|
|
192
|
-
|
|
193
|
-
```javascript
|
|
194
|
-
// Main axis (direction of layout)
|
|
195
|
-
frame.primaryAxisAlignItems = "MIN"; // Start
|
|
196
|
-
frame.primaryAxisAlignItems = "CENTER"; // Center
|
|
197
|
-
frame.primaryAxisAlignItems = "MAX"; // End
|
|
198
|
-
frame.primaryAxisAlignItems = "SPACE_BETWEEN"; // Distribute
|
|
199
|
-
|
|
200
|
-
// Cross axis
|
|
201
|
-
frame.counterAxisAlignItems = "MIN"; // Start
|
|
202
|
-
frame.counterAxisAlignItems = "CENTER"; // Center
|
|
203
|
-
frame.counterAxisAlignItems = "MAX"; // End
|
|
204
|
-
// NOTE: 'STRETCH' is NOT valid — use 'MIN' + child.layoutSizingX = 'FILL'
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
### Child Sizing
|
|
208
|
-
|
|
209
|
-
```javascript
|
|
210
|
-
// IMPORTANT: FILL can only be set AFTER the child is appended to an auto-layout parent
|
|
211
|
-
parent.appendChild(child)
|
|
212
|
-
child.layoutSizingHorizontal = "FILL"; // Stretch to parent
|
|
213
|
-
child.layoutSizingHorizontal = "HUG"; // Shrink to content
|
|
214
|
-
child.layoutSizingHorizontal = "FIXED"; // Manual width
|
|
215
|
-
|
|
216
|
-
child.layoutSizingVertical = "FILL";
|
|
217
|
-
child.layoutSizingVertical = "HUG";
|
|
218
|
-
child.layoutSizingVertical = "FIXED";
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
### Wrapping (Grid-like Layout)
|
|
222
|
-
|
|
223
|
-
```javascript
|
|
224
|
-
frame.layoutMode = "HORIZONTAL";
|
|
225
|
-
frame.layoutWrap = "WRAP";
|
|
226
|
-
frame.itemSpacing = 24; // Horizontal gap
|
|
227
|
-
frame.counterAxisSpacing = 24; // Vertical gap (between rows)
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
### Absolute Positioning Within Auto Layout
|
|
231
|
-
|
|
232
|
-
```javascript
|
|
233
|
-
child.layoutPositioning = "ABSOLUTE";
|
|
234
|
-
child.constraints = { horizontal: "MAX", vertical: "MIN" }; // Top-right
|
|
235
|
-
child.x = parentWidth - childWidth - 8;
|
|
236
|
-
child.y = 8;
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
## Effects
|
|
240
|
-
|
|
241
|
-
### Drop Shadow
|
|
242
|
-
|
|
243
|
-
```javascript
|
|
244
|
-
node.effects = [{
|
|
245
|
-
type: "DROP_SHADOW",
|
|
246
|
-
color: { r: 0, g: 0, b: 0, a: 0.08 },
|
|
247
|
-
offset: { x: 0, y: 4 },
|
|
248
|
-
radius: 16,
|
|
249
|
-
spread: -2,
|
|
250
|
-
visible: true,
|
|
251
|
-
blendMode: "NORMAL"
|
|
252
|
-
}];
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
### Inner Shadow
|
|
256
|
-
|
|
257
|
-
```javascript
|
|
258
|
-
node.effects = [{
|
|
259
|
-
type: "INNER_SHADOW",
|
|
260
|
-
color: { r: 0, g: 0, b: 0, a: 0.05 },
|
|
261
|
-
offset: { x: 0, y: 1 },
|
|
262
|
-
radius: 2,
|
|
263
|
-
spread: 0,
|
|
264
|
-
visible: true,
|
|
265
|
-
blendMode: "NORMAL"
|
|
266
|
-
}];
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
### Background Blur
|
|
270
|
-
|
|
271
|
-
```javascript
|
|
272
|
-
node.effects = [{
|
|
273
|
-
type: "BACKGROUND_BLUR",
|
|
274
|
-
radius: 16,
|
|
275
|
-
visible: true
|
|
276
|
-
}];
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### Layer Blur
|
|
280
|
-
|
|
281
|
-
```javascript
|
|
282
|
-
node.effects = [{
|
|
283
|
-
type: "LAYER_BLUR",
|
|
284
|
-
radius: 8,
|
|
285
|
-
visible: true
|
|
286
|
-
}];
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### Multiple Effects
|
|
290
|
-
|
|
291
|
-
```javascript
|
|
292
|
-
node.effects = [
|
|
293
|
-
{ type: "DROP_SHADOW", color: { r: 0, g: 0, b: 0, a: 0.04 }, offset: { x: 0, y: 1 }, radius: 3, spread: 0, visible: true, blendMode: "NORMAL" },
|
|
294
|
-
{ type: "DROP_SHADOW", color: { r: 0, g: 0, b: 0, a: 0.06 }, offset: { x: 0, y: 8 }, radius: 24, spread: -4, visible: true, blendMode: "NORMAL" }
|
|
295
|
-
];
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
## Opacity & Blend Modes
|
|
299
|
-
|
|
300
|
-
```javascript
|
|
301
|
-
node.opacity = 0.5;
|
|
302
|
-
node.blendMode = "NORMAL"; // "MULTIPLY", "SCREEN", "OVERLAY", "DARKEN", "LIGHTEN", etc.
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## Corner Radius
|
|
306
|
-
|
|
307
|
-
```javascript
|
|
308
|
-
// Uniform
|
|
309
|
-
node.cornerRadius = 12;
|
|
310
|
-
|
|
311
|
-
// Per-corner
|
|
312
|
-
node.topLeftRadius = 12;
|
|
313
|
-
node.topRightRadius = 12;
|
|
314
|
-
node.bottomLeftRadius = 0;
|
|
315
|
-
node.bottomRightRadius = 0;
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
## Clipping
|
|
319
|
-
|
|
320
|
-
```javascript
|
|
321
|
-
frame.clipsContent = true; // Children clipped to frame bounds
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
## Grouping & Organization
|
|
325
|
-
|
|
326
|
-
### Groups
|
|
327
|
-
|
|
328
|
-
```javascript
|
|
329
|
-
const group = figma.group([node1, node2, node3], figma.currentPage);
|
|
330
|
-
group.name = "Grouped Elements";
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
### Sections
|
|
334
|
-
|
|
335
|
-
```javascript
|
|
336
|
-
const section = figma.createSection();
|
|
337
|
-
section.name = "My Section";
|
|
338
|
-
section.resizeWithoutConstraints(800, 600);
|
|
339
|
-
section.x = 0;
|
|
340
|
-
section.y = 0;
|
|
341
|
-
// IMPORTANT: Sections don't auto-resize — always resize after adding content
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
### Appending Children
|
|
345
|
-
|
|
346
|
-
```javascript
|
|
347
|
-
parentFrame.appendChild(childNode);
|
|
348
|
-
|
|
349
|
-
// Insert at a specific index
|
|
350
|
-
parentFrame.insertChild(0, childNode); // Insert at beginning
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
## Components & Variants
|
|
354
|
-
|
|
355
|
-
### Create Component
|
|
356
|
-
|
|
357
|
-
```javascript
|
|
358
|
-
const component = figma.createComponent();
|
|
359
|
-
component.name = "Button/Primary";
|
|
360
|
-
component.description = "Primary action button.";
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
### Create Instance
|
|
364
|
-
|
|
365
|
-
```javascript
|
|
366
|
-
const instance = component.createInstance();
|
|
367
|
-
instance.x = 200;
|
|
368
|
-
instance.y = 100;
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### Import Components by Key (Team Libraries)
|
|
372
|
-
|
|
373
|
-
These methods import components from **team libraries** (not the same file). For components in the current file, use `figma.getNodeByIdAsync()` or `findOne()`/`findAll()`.
|
|
374
|
-
|
|
375
|
-
```javascript
|
|
376
|
-
// Import a published component from a team library by its key
|
|
377
|
-
const comp = await figma.importComponentByKeyAsync(componentKey)
|
|
378
|
-
const instance = comp.createInstance()
|
|
379
|
-
|
|
380
|
-
// Import a published component set from a team library by its key
|
|
381
|
-
const set = await figma.importComponentSetByKeyAsync(componentSetKey)
|
|
382
|
-
const variant = set.defaultVariant
|
|
383
|
-
const variantInstance = variant.createInstance()
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
### Combine as Variants
|
|
387
|
-
|
|
388
|
-
```javascript
|
|
389
|
-
// IMPORTANT: Pass ComponentNodes (not frames)
|
|
390
|
-
const componentSet = figma.combineAsVariants(
|
|
391
|
-
[variantA, variantB, variantC],
|
|
392
|
-
figma.currentPage
|
|
393
|
-
);
|
|
394
|
-
componentSet.name = "Button";
|
|
395
|
-
componentSet.description = "Button component with multiple variants.";
|
|
396
|
-
|
|
397
|
-
// CRITICAL: Layout variants in a grid after combining (they stack at 0,0)
|
|
398
|
-
let maxX = 0, maxY = 0;
|
|
399
|
-
componentSet.children.forEach((child, i) => {
|
|
400
|
-
child.x = (i % numCols) * colWidth;
|
|
401
|
-
child.y = Math.floor(i / numCols) * rowHeight;
|
|
402
|
-
});
|
|
403
|
-
for (const child of componentSet.children) {
|
|
404
|
-
maxX = Math.max(maxX, child.x + child.width);
|
|
405
|
-
maxY = Math.max(maxY, child.y + child.height);
|
|
406
|
-
}
|
|
407
|
-
componentSet.resizeWithoutConstraints(maxX + 40, maxY + 40);
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
### Component Properties
|
|
411
|
-
|
|
412
|
-
```javascript
|
|
413
|
-
// addComponentProperty returns a STRING key — capture it!
|
|
414
|
-
const labelKey = component.addComponentProperty("label", "TEXT", "Button");
|
|
415
|
-
const showIconKey = component.addComponentProperty("showIcon", "BOOLEAN", true);
|
|
416
|
-
const iconSlotKey = component.addComponentProperty("iconSlot", "INSTANCE_SWAP", defaultIconId);
|
|
417
|
-
|
|
418
|
-
// MUST link properties to child nodes via componentPropertyReferences
|
|
419
|
-
labelNode.componentPropertyReferences = { characters: labelKey };
|
|
420
|
-
iconInstance.componentPropertyReferences = {
|
|
421
|
-
visible: showIconKey,
|
|
422
|
-
mainComponent: iconSlotKey
|
|
423
|
-
};
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
## Styles
|
|
427
|
-
|
|
428
|
-
### Text Style
|
|
429
|
-
|
|
430
|
-
```javascript
|
|
431
|
-
await figma.loadFontAsync({ family: "Inter", style: "Regular" });
|
|
432
|
-
|
|
433
|
-
const style = figma.createTextStyle();
|
|
434
|
-
style.name = "Body/Default";
|
|
435
|
-
style.fontName = { family: "Inter", style: "Regular" };
|
|
436
|
-
style.fontSize = 16;
|
|
437
|
-
style.lineHeight = { value: 24, unit: "PIXELS" };
|
|
438
|
-
style.letterSpacing = { value: 0, unit: "PERCENT" };
|
|
439
|
-
|
|
440
|
-
// Apply to a text node
|
|
441
|
-
textNode.textStyleId = style.id;
|
|
442
|
-
```
|
|
443
|
-
|
|
444
|
-
### Effect Style
|
|
445
|
-
|
|
446
|
-
```javascript
|
|
447
|
-
const shadowStyle = figma.createEffectStyle();
|
|
448
|
-
shadowStyle.name = "Shadow/Subtle";
|
|
449
|
-
shadowStyle.effects = [{
|
|
450
|
-
type: "DROP_SHADOW",
|
|
451
|
-
color: { r: 0, g: 0, b: 0, a: 0.06 },
|
|
452
|
-
offset: { x: 0, y: 2 },
|
|
453
|
-
radius: 8,
|
|
454
|
-
spread: 0,
|
|
455
|
-
visible: true,
|
|
456
|
-
blendMode: "NORMAL"
|
|
457
|
-
}];
|
|
458
|
-
|
|
459
|
-
// Apply to a node
|
|
460
|
-
frame.effectStyleId = shadowStyle.id;
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
## Cloning & Duplication
|
|
464
|
-
|
|
465
|
-
```javascript
|
|
466
|
-
const clone = originalNode.clone();
|
|
467
|
-
clone.x = originalNode.x + originalNode.width + 40;
|
|
468
|
-
clone.name = "Copy of " + originalNode.name;
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
## Finding Nodes
|
|
472
|
-
|
|
473
|
-
```javascript
|
|
474
|
-
// Find by name on current page
|
|
475
|
-
const node = figma.currentPage.findOne(n => n.name === "My Frame");
|
|
476
|
-
|
|
477
|
-
// Find all by type
|
|
478
|
-
const allTexts = figma.currentPage.findAll(n => n.type === "TEXT");
|
|
479
|
-
|
|
480
|
-
// Find all by name pattern
|
|
481
|
-
const allButtons = figma.currentPage.findAll(n => n.name.startsWith("Button/"));
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
## Layout Grids
|
|
485
|
-
|
|
486
|
-
```javascript
|
|
487
|
-
frame.layoutGrids = [
|
|
488
|
-
{
|
|
489
|
-
pattern: "COLUMNS",
|
|
490
|
-
alignment: "STRETCH",
|
|
491
|
-
count: 12,
|
|
492
|
-
gutterSize: 24,
|
|
493
|
-
offset: 80,
|
|
494
|
-
visible: true
|
|
495
|
-
}
|
|
496
|
-
];
|
|
497
|
-
```
|
|
498
|
-
|
|
499
|
-
## Constraints (Non-Auto-Layout Frames)
|
|
500
|
-
|
|
501
|
-
```javascript
|
|
502
|
-
child.constraints = {
|
|
503
|
-
horizontal: "LEFT_RIGHT", // LEFT, RIGHT, CENTER, LEFT_RIGHT, SCALE
|
|
504
|
-
vertical: "TOP" // TOP, BOTTOM, CENTER, TOP_BOTTOM, SCALE
|
|
505
|
-
};
|
|
506
|
-
```
|
|
507
|
-
|
|
508
|
-
## Viewport & Zoom
|
|
509
|
-
|
|
510
|
-
```javascript
|
|
511
|
-
// Zoom to fit specific nodes
|
|
512
|
-
figma.viewport.scrollAndZoomIntoView([frame1, frame2]);
|
|
513
|
-
```
|
|
1
|
+
# Plugin API Patterns
|
|
2
|
+
|
|
3
|
+
> Part of the [use_figma skill](../SKILL.md). Quick reference for common Figma Plugin API operations.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- Execution Basics
|
|
8
|
+
- Creating Nodes
|
|
9
|
+
- Fills and Strokes
|
|
10
|
+
- Auto Layout
|
|
11
|
+
- Effects
|
|
12
|
+
- Opacity and Blend Modes
|
|
13
|
+
- Corner Radius and Clipping
|
|
14
|
+
- Grouping and Organization
|
|
15
|
+
- Components and Variants
|
|
16
|
+
- Styles
|
|
17
|
+
- Cloning, Finding Nodes, and Grids
|
|
18
|
+
- Constraints and Viewport
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## Execution Basics
|
|
22
|
+
|
|
23
|
+
### Page Context
|
|
24
|
+
|
|
25
|
+
Page context resets between `use_figma` calls — `figma.currentPage` always starts on the first page. Use `await figma.setCurrentPageAsync(page)` at the start of each invocation to switch to the correct page.
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
const targetPage = figma.root.children.find(p => p.name === "My Page");
|
|
29
|
+
await figma.setCurrentPageAsync(targetPage);
|
|
30
|
+
// targetPage.children is now populated
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Closing the Plugin
|
|
34
|
+
|
|
35
|
+
Every execution **must** call `figma.closePlugin()` on success and `figma.closePluginWithFailure()` on error:
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
figma.closePlugin("Success message describing what was done");
|
|
39
|
+
figma.closePluginWithFailure("Description of what went wrong");
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`figma.notify()` does **not** exist. Return all information via the close message string.
|
|
43
|
+
|
|
44
|
+
### Working Incrementally
|
|
45
|
+
|
|
46
|
+
Don't build an entire screen in one call. Break work into small steps:
|
|
47
|
+
1. Create tokens/variables
|
|
48
|
+
2. Create text styles
|
|
49
|
+
3. Build individual components
|
|
50
|
+
4. Compose sections
|
|
51
|
+
5. Assemble screens
|
|
52
|
+
|
|
53
|
+
Verify structure with `get_metadata` between steps. Use `get_screenshot` after each major creation milestone to catch visual problems early.
|
|
54
|
+
|
|
55
|
+
## Creating Nodes
|
|
56
|
+
|
|
57
|
+
### Frames
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
const frame = figma.createFrame();
|
|
61
|
+
frame.name = "Container";
|
|
62
|
+
frame.resize(1440, 900);
|
|
63
|
+
frame.x = 0;
|
|
64
|
+
frame.y = 0;
|
|
65
|
+
frame.fills = [{ type: "SOLID", color: { r: 0.98, g: 0.98, b: 0.99 } }];
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Text
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
// MUST load font before any text operations
|
|
72
|
+
await figma.loadFontAsync({ family: "Inter", style: "Regular" });
|
|
73
|
+
|
|
74
|
+
const text = figma.createText();
|
|
75
|
+
text.fontName = { family: "Inter", style: "Regular" };
|
|
76
|
+
text.fontSize = 16;
|
|
77
|
+
text.lineHeight = { value: 24, unit: "PIXELS" };
|
|
78
|
+
text.letterSpacing = { value: 0, unit: "PERCENT" };
|
|
79
|
+
text.characters = "Hello World";
|
|
80
|
+
text.fills = [{ type: "SOLID", color: { r: 0.1, g: 0.1, b: 0.12 } }];
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Rectangles
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
const rect = figma.createRectangle();
|
|
87
|
+
rect.name = "Background";
|
|
88
|
+
rect.resize(400, 300);
|
|
89
|
+
rect.cornerRadius = 12;
|
|
90
|
+
rect.fills = [{ type: "SOLID", color: { r: 0.95, g: 0.95, b: 0.96 } }];
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Ellipses
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
const circle = figma.createEllipse();
|
|
97
|
+
circle.name = "Avatar Circle";
|
|
98
|
+
circle.resize(48, 48);
|
|
99
|
+
circle.fills = [{ type: "SOLID", color: { r: 0.85, g: 0.87, b: 0.90 } }];
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Lines
|
|
103
|
+
|
|
104
|
+
```javascript
|
|
105
|
+
const line = figma.createLine();
|
|
106
|
+
line.name = "Divider";
|
|
107
|
+
line.resize(400, 0);
|
|
108
|
+
line.strokes = [{ type: "SOLID", color: { r: 0, g: 0, b: 0 }, opacity: 0.08 }];
|
|
109
|
+
line.strokeWeight = 1;
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### SVG Import
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
const svgString = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
116
|
+
<path d="M5 12h14M12 5l7 7-7 7" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
117
|
+
</svg>`;
|
|
118
|
+
|
|
119
|
+
const node = figma.createNodeFromSvg(svgString);
|
|
120
|
+
node.name = "Icon/Arrow Right";
|
|
121
|
+
node.resize(24, 24);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Fills & Strokes
|
|
125
|
+
|
|
126
|
+
### Solid Fill
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
node.fills = [{ type: "SOLID", color: { r: 0.2, g: 0.2, b: 0.25 } }];
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Fill with Opacity
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
node.fills = [{ type: "SOLID", color: { r: 0.2, g: 0.2, b: 0.25 }, opacity: 0.5 }];
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### No Fill (Transparent)
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
node.fills = [];
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Linear Gradient
|
|
145
|
+
|
|
146
|
+
```javascript
|
|
147
|
+
node.fills = [{
|
|
148
|
+
type: "GRADIENT_LINEAR",
|
|
149
|
+
gradientStops: [
|
|
150
|
+
{ color: { r: 0.2, g: 0.36, b: 0.96, a: 1 }, position: 0 },
|
|
151
|
+
{ color: { r: 0.56, g: 0.24, b: 0.88, a: 1 }, position: 1 }
|
|
152
|
+
],
|
|
153
|
+
gradientTransform: [[1, 0, 0], [0, 1, 0]]
|
|
154
|
+
}];
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Strokes
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
node.strokes = [{ type: "SOLID", color: { r: 0.85, g: 0.85, b: 0.87 } }];
|
|
161
|
+
node.strokeWeight = 1;
|
|
162
|
+
node.strokeAlign = "INSIDE"; // "CENTER", "OUTSIDE"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Multiple Fills (Layered)
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
node.fills = [
|
|
169
|
+
{ type: "SOLID", color: { r: 0.95, g: 0.95, b: 0.96 } },
|
|
170
|
+
{ type: "SOLID", color: { r: 0.2, g: 0.36, b: 0.96 }, opacity: 0.05 }
|
|
171
|
+
];
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Auto Layout
|
|
175
|
+
|
|
176
|
+
### Setting Up Auto Layout
|
|
177
|
+
|
|
178
|
+
```javascript
|
|
179
|
+
const frame = figma.createFrame();
|
|
180
|
+
frame.layoutMode = "VERTICAL"; // or "HORIZONTAL"
|
|
181
|
+
frame.primaryAxisSizingMode = "AUTO"; // Hug main axis
|
|
182
|
+
frame.counterAxisSizingMode = "FIXED"; // Fixed cross axis
|
|
183
|
+
frame.resize(360, 1); // Width fixed, height auto
|
|
184
|
+
frame.itemSpacing = 16; // Gap between children
|
|
185
|
+
frame.paddingTop = 24;
|
|
186
|
+
frame.paddingBottom = 24;
|
|
187
|
+
frame.paddingLeft = 24;
|
|
188
|
+
frame.paddingRight = 24;
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Alignment
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
// Main axis (direction of layout)
|
|
195
|
+
frame.primaryAxisAlignItems = "MIN"; // Start
|
|
196
|
+
frame.primaryAxisAlignItems = "CENTER"; // Center
|
|
197
|
+
frame.primaryAxisAlignItems = "MAX"; // End
|
|
198
|
+
frame.primaryAxisAlignItems = "SPACE_BETWEEN"; // Distribute
|
|
199
|
+
|
|
200
|
+
// Cross axis
|
|
201
|
+
frame.counterAxisAlignItems = "MIN"; // Start
|
|
202
|
+
frame.counterAxisAlignItems = "CENTER"; // Center
|
|
203
|
+
frame.counterAxisAlignItems = "MAX"; // End
|
|
204
|
+
// NOTE: 'STRETCH' is NOT valid — use 'MIN' + child.layoutSizingX = 'FILL'
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Child Sizing
|
|
208
|
+
|
|
209
|
+
```javascript
|
|
210
|
+
// IMPORTANT: FILL can only be set AFTER the child is appended to an auto-layout parent
|
|
211
|
+
parent.appendChild(child)
|
|
212
|
+
child.layoutSizingHorizontal = "FILL"; // Stretch to parent
|
|
213
|
+
child.layoutSizingHorizontal = "HUG"; // Shrink to content
|
|
214
|
+
child.layoutSizingHorizontal = "FIXED"; // Manual width
|
|
215
|
+
|
|
216
|
+
child.layoutSizingVertical = "FILL";
|
|
217
|
+
child.layoutSizingVertical = "HUG";
|
|
218
|
+
child.layoutSizingVertical = "FIXED";
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Wrapping (Grid-like Layout)
|
|
222
|
+
|
|
223
|
+
```javascript
|
|
224
|
+
frame.layoutMode = "HORIZONTAL";
|
|
225
|
+
frame.layoutWrap = "WRAP";
|
|
226
|
+
frame.itemSpacing = 24; // Horizontal gap
|
|
227
|
+
frame.counterAxisSpacing = 24; // Vertical gap (between rows)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Absolute Positioning Within Auto Layout
|
|
231
|
+
|
|
232
|
+
```javascript
|
|
233
|
+
child.layoutPositioning = "ABSOLUTE";
|
|
234
|
+
child.constraints = { horizontal: "MAX", vertical: "MIN" }; // Top-right
|
|
235
|
+
child.x = parentWidth - childWidth - 8;
|
|
236
|
+
child.y = 8;
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Effects
|
|
240
|
+
|
|
241
|
+
### Drop Shadow
|
|
242
|
+
|
|
243
|
+
```javascript
|
|
244
|
+
node.effects = [{
|
|
245
|
+
type: "DROP_SHADOW",
|
|
246
|
+
color: { r: 0, g: 0, b: 0, a: 0.08 },
|
|
247
|
+
offset: { x: 0, y: 4 },
|
|
248
|
+
radius: 16,
|
|
249
|
+
spread: -2,
|
|
250
|
+
visible: true,
|
|
251
|
+
blendMode: "NORMAL"
|
|
252
|
+
}];
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Inner Shadow
|
|
256
|
+
|
|
257
|
+
```javascript
|
|
258
|
+
node.effects = [{
|
|
259
|
+
type: "INNER_SHADOW",
|
|
260
|
+
color: { r: 0, g: 0, b: 0, a: 0.05 },
|
|
261
|
+
offset: { x: 0, y: 1 },
|
|
262
|
+
radius: 2,
|
|
263
|
+
spread: 0,
|
|
264
|
+
visible: true,
|
|
265
|
+
blendMode: "NORMAL"
|
|
266
|
+
}];
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Background Blur
|
|
270
|
+
|
|
271
|
+
```javascript
|
|
272
|
+
node.effects = [{
|
|
273
|
+
type: "BACKGROUND_BLUR",
|
|
274
|
+
radius: 16,
|
|
275
|
+
visible: true
|
|
276
|
+
}];
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Layer Blur
|
|
280
|
+
|
|
281
|
+
```javascript
|
|
282
|
+
node.effects = [{
|
|
283
|
+
type: "LAYER_BLUR",
|
|
284
|
+
radius: 8,
|
|
285
|
+
visible: true
|
|
286
|
+
}];
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Multiple Effects
|
|
290
|
+
|
|
291
|
+
```javascript
|
|
292
|
+
node.effects = [
|
|
293
|
+
{ type: "DROP_SHADOW", color: { r: 0, g: 0, b: 0, a: 0.04 }, offset: { x: 0, y: 1 }, radius: 3, spread: 0, visible: true, blendMode: "NORMAL" },
|
|
294
|
+
{ type: "DROP_SHADOW", color: { r: 0, g: 0, b: 0, a: 0.06 }, offset: { x: 0, y: 8 }, radius: 24, spread: -4, visible: true, blendMode: "NORMAL" }
|
|
295
|
+
];
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## Opacity & Blend Modes
|
|
299
|
+
|
|
300
|
+
```javascript
|
|
301
|
+
node.opacity = 0.5;
|
|
302
|
+
node.blendMode = "NORMAL"; // "MULTIPLY", "SCREEN", "OVERLAY", "DARKEN", "LIGHTEN", etc.
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Corner Radius
|
|
306
|
+
|
|
307
|
+
```javascript
|
|
308
|
+
// Uniform
|
|
309
|
+
node.cornerRadius = 12;
|
|
310
|
+
|
|
311
|
+
// Per-corner
|
|
312
|
+
node.topLeftRadius = 12;
|
|
313
|
+
node.topRightRadius = 12;
|
|
314
|
+
node.bottomLeftRadius = 0;
|
|
315
|
+
node.bottomRightRadius = 0;
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Clipping
|
|
319
|
+
|
|
320
|
+
```javascript
|
|
321
|
+
frame.clipsContent = true; // Children clipped to frame bounds
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## Grouping & Organization
|
|
325
|
+
|
|
326
|
+
### Groups
|
|
327
|
+
|
|
328
|
+
```javascript
|
|
329
|
+
const group = figma.group([node1, node2, node3], figma.currentPage);
|
|
330
|
+
group.name = "Grouped Elements";
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Sections
|
|
334
|
+
|
|
335
|
+
```javascript
|
|
336
|
+
const section = figma.createSection();
|
|
337
|
+
section.name = "My Section";
|
|
338
|
+
section.resizeWithoutConstraints(800, 600);
|
|
339
|
+
section.x = 0;
|
|
340
|
+
section.y = 0;
|
|
341
|
+
// IMPORTANT: Sections don't auto-resize — always resize after adding content
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Appending Children
|
|
345
|
+
|
|
346
|
+
```javascript
|
|
347
|
+
parentFrame.appendChild(childNode);
|
|
348
|
+
|
|
349
|
+
// Insert at a specific index
|
|
350
|
+
parentFrame.insertChild(0, childNode); // Insert at beginning
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## Components & Variants
|
|
354
|
+
|
|
355
|
+
### Create Component
|
|
356
|
+
|
|
357
|
+
```javascript
|
|
358
|
+
const component = figma.createComponent();
|
|
359
|
+
component.name = "Button/Primary";
|
|
360
|
+
component.description = "Primary action button.";
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Create Instance
|
|
364
|
+
|
|
365
|
+
```javascript
|
|
366
|
+
const instance = component.createInstance();
|
|
367
|
+
instance.x = 200;
|
|
368
|
+
instance.y = 100;
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Import Components by Key (Team Libraries)
|
|
372
|
+
|
|
373
|
+
These methods import components from **team libraries** (not the same file). For components in the current file, use `figma.getNodeByIdAsync()` or `findOne()`/`findAll()`.
|
|
374
|
+
|
|
375
|
+
```javascript
|
|
376
|
+
// Import a published component from a team library by its key
|
|
377
|
+
const comp = await figma.importComponentByKeyAsync(componentKey)
|
|
378
|
+
const instance = comp.createInstance()
|
|
379
|
+
|
|
380
|
+
// Import a published component set from a team library by its key
|
|
381
|
+
const set = await figma.importComponentSetByKeyAsync(componentSetKey)
|
|
382
|
+
const variant = set.defaultVariant
|
|
383
|
+
const variantInstance = variant.createInstance()
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Combine as Variants
|
|
387
|
+
|
|
388
|
+
```javascript
|
|
389
|
+
// IMPORTANT: Pass ComponentNodes (not frames)
|
|
390
|
+
const componentSet = figma.combineAsVariants(
|
|
391
|
+
[variantA, variantB, variantC],
|
|
392
|
+
figma.currentPage
|
|
393
|
+
);
|
|
394
|
+
componentSet.name = "Button";
|
|
395
|
+
componentSet.description = "Button component with multiple variants.";
|
|
396
|
+
|
|
397
|
+
// CRITICAL: Layout variants in a grid after combining (they stack at 0,0)
|
|
398
|
+
let maxX = 0, maxY = 0;
|
|
399
|
+
componentSet.children.forEach((child, i) => {
|
|
400
|
+
child.x = (i % numCols) * colWidth;
|
|
401
|
+
child.y = Math.floor(i / numCols) * rowHeight;
|
|
402
|
+
});
|
|
403
|
+
for (const child of componentSet.children) {
|
|
404
|
+
maxX = Math.max(maxX, child.x + child.width);
|
|
405
|
+
maxY = Math.max(maxY, child.y + child.height);
|
|
406
|
+
}
|
|
407
|
+
componentSet.resizeWithoutConstraints(maxX + 40, maxY + 40);
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Component Properties
|
|
411
|
+
|
|
412
|
+
```javascript
|
|
413
|
+
// addComponentProperty returns a STRING key — capture it!
|
|
414
|
+
const labelKey = component.addComponentProperty("label", "TEXT", "Button");
|
|
415
|
+
const showIconKey = component.addComponentProperty("showIcon", "BOOLEAN", true);
|
|
416
|
+
const iconSlotKey = component.addComponentProperty("iconSlot", "INSTANCE_SWAP", defaultIconId);
|
|
417
|
+
|
|
418
|
+
// MUST link properties to child nodes via componentPropertyReferences
|
|
419
|
+
labelNode.componentPropertyReferences = { characters: labelKey };
|
|
420
|
+
iconInstance.componentPropertyReferences = {
|
|
421
|
+
visible: showIconKey,
|
|
422
|
+
mainComponent: iconSlotKey
|
|
423
|
+
};
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
## Styles
|
|
427
|
+
|
|
428
|
+
### Text Style
|
|
429
|
+
|
|
430
|
+
```javascript
|
|
431
|
+
await figma.loadFontAsync({ family: "Inter", style: "Regular" });
|
|
432
|
+
|
|
433
|
+
const style = figma.createTextStyle();
|
|
434
|
+
style.name = "Body/Default";
|
|
435
|
+
style.fontName = { family: "Inter", style: "Regular" };
|
|
436
|
+
style.fontSize = 16;
|
|
437
|
+
style.lineHeight = { value: 24, unit: "PIXELS" };
|
|
438
|
+
style.letterSpacing = { value: 0, unit: "PERCENT" };
|
|
439
|
+
|
|
440
|
+
// Apply to a text node
|
|
441
|
+
textNode.textStyleId = style.id;
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Effect Style
|
|
445
|
+
|
|
446
|
+
```javascript
|
|
447
|
+
const shadowStyle = figma.createEffectStyle();
|
|
448
|
+
shadowStyle.name = "Shadow/Subtle";
|
|
449
|
+
shadowStyle.effects = [{
|
|
450
|
+
type: "DROP_SHADOW",
|
|
451
|
+
color: { r: 0, g: 0, b: 0, a: 0.06 },
|
|
452
|
+
offset: { x: 0, y: 2 },
|
|
453
|
+
radius: 8,
|
|
454
|
+
spread: 0,
|
|
455
|
+
visible: true,
|
|
456
|
+
blendMode: "NORMAL"
|
|
457
|
+
}];
|
|
458
|
+
|
|
459
|
+
// Apply to a node
|
|
460
|
+
frame.effectStyleId = shadowStyle.id;
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## Cloning & Duplication
|
|
464
|
+
|
|
465
|
+
```javascript
|
|
466
|
+
const clone = originalNode.clone();
|
|
467
|
+
clone.x = originalNode.x + originalNode.width + 40;
|
|
468
|
+
clone.name = "Copy of " + originalNode.name;
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
## Finding Nodes
|
|
472
|
+
|
|
473
|
+
```javascript
|
|
474
|
+
// Find by name on current page
|
|
475
|
+
const node = figma.currentPage.findOne(n => n.name === "My Frame");
|
|
476
|
+
|
|
477
|
+
// Find all by type
|
|
478
|
+
const allTexts = figma.currentPage.findAll(n => n.type === "TEXT");
|
|
479
|
+
|
|
480
|
+
// Find all by name pattern
|
|
481
|
+
const allButtons = figma.currentPage.findAll(n => n.name.startsWith("Button/"));
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
## Layout Grids
|
|
485
|
+
|
|
486
|
+
```javascript
|
|
487
|
+
frame.layoutGrids = [
|
|
488
|
+
{
|
|
489
|
+
pattern: "COLUMNS",
|
|
490
|
+
alignment: "STRETCH",
|
|
491
|
+
count: 12,
|
|
492
|
+
gutterSize: 24,
|
|
493
|
+
offset: 80,
|
|
494
|
+
visible: true
|
|
495
|
+
}
|
|
496
|
+
];
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
## Constraints (Non-Auto-Layout Frames)
|
|
500
|
+
|
|
501
|
+
```javascript
|
|
502
|
+
child.constraints = {
|
|
503
|
+
horizontal: "LEFT_RIGHT", // LEFT, RIGHT, CENTER, LEFT_RIGHT, SCALE
|
|
504
|
+
vertical: "TOP" // TOP, BOTTOM, CENTER, TOP_BOTTOM, SCALE
|
|
505
|
+
};
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
## Viewport & Zoom
|
|
509
|
+
|
|
510
|
+
```javascript
|
|
511
|
+
// Zoom to fit specific nodes
|
|
512
|
+
figma.viewport.scrollAndZoomIntoView([frame1, frame2]);
|
|
513
|
+
```
|