The composable runners could edit, add, remove and move children, swap and switch, but not run the other component operations. New nodes run each one through the production generator in the pure runner and the real event in the frontend interpreter: - Detach, UpdateMain, DeleteComponent and RestoreComponent; - Duplicate, and NestCopy (a copy moved into a main); - EditText, with the automatic rename the text editor applies; - MoveShape (frontend only, through the sidebar) and MoveToCell; - swap-shape and reset on any copy head; - Undo with a step count, and an edit undone before its sync (frontend only). New cases, all with the undo/redo round trip: - Q, R, S, T, U: detach, update main, delete and restore, duplicate and nest, at nesting depths 0 to 2; - V, W, X: a new edit after undo, three undos over nested cascades, an undo before the edit's sync; - Y: text overrides against main text edits; - Z: a main child move; - AA to AF: swap outcomes on values and structure, and the grid cell of a swapped child; - AG, AH, AI: the plugin suite's slot alignment cases. The plugin suite gets OpDetach, OpSwap and OpReset, names that keep the roles of two nestable components apart, Assert.knownFailure, and ports of cases Q, AA, AB and K's reset. Supporting changes: nodes can record what they created (IAppliedResult); create-component takes a size, since with 0.01 frames the frontend reflows split undo entries at points that depend on timing (F43); the interpreter ends the text measurement headless, so text steps settle; tm/known-failure pins the wrong value a known bug gives in a case assertion; the interpreter no longer moves its undo baseline after a skipped optional, which cut the end-of-variant round trip short. Confirmed and pinned: F12 (resetting a nested swap clears the top copy's overrides), F27 (the automatic text rename touches :name-group), F29 (a second switch loses an override) and F44 (a swapped grid child misses the main's cell changes). F43 also shows through a plain sync at depth 2 (case Q).
Penpot Plugins
What can you find here?
We've been working in an MVP to allow users to develop their own plugins and use the existing ones.
There are 2 important folders to keep an eye on: apps and libs.
In the libs folder you'll find:
- plugins-runtime: here you'll find the code that initializes the plugin and sets a few listeners to know when the penpot page/file/selection changes. It has its own README.
- plugins-styles: basic css library with penpot styles in case you need help for styling your plugins.
In the apps folder you'll find some examples that use the libraries mentioned
above.
-
contrast-plugin: to run this example check Create a plugin from scratch
-
example-styles: to run this example you should run
pnpm run start:styles-example
Open in your browser: http://localhost:4202/
Run Penpot sample plugins
This guide will help you launch a Penpot plugin from the penpot-plugins repository. Before proceeding, ensure that you have Penpot running locally by following the setup instructions.
In the terminal, navigate to the penpot-plugins repository and run pnpm -r install to install the required dependencies. Then, run pnpm run start to
launch the plugins runtime.
After installing the dependencies, choose a plugin to launch. You can either run one of the provided examples or create your own (see "Creating a plugin from scratch" below). To launch a plugin, Open a new terminal tab and run the appropriate startup script for the chosen plugin.
For instance, to launch the Contrast plugin, use the following command:
// for the contrast plugin
pnpm run start:plugin:contrast
Finally, open in your browser the specific port. In this specific example would
be http://localhost:4302
A table listing the available plugins and their corresponding startup commands is provided below.
Sample plugins
| Plugin | Description | PORT | Start command | Manifest URL |
|---|---|---|---|---|
| poc-state-plugin | Sandbox plugin to test new plugins api functionality | 4202 | pnpm run start:plugin:poc-state | http://localhost:4202/assets/manifest.json |
| contrast-plugin | Sample plugin that gives you color contrast information | 4202 | pnpm run start:plugin:contrast | http://localhost:4202/assets/manifest.json |
| icons-plugin | Tool to add icons from Feather | 4202 | pnpm run start:plugin:icons | http://localhost:4202/assets/manifest.json |
| lorem-ipsum-plugin | Generate Lorem ipsum text | 4202 | pnpm run start:plugin:loremipsum | http://localhost:4202/assets/manifest.json |
| create-palette-plugin | Creates a board with all the palette colors | 4202 | pnpm run start:plugin:palette | http://localhost:4202/assets/manifest.json |
| table-plugin | Create or import table | 4202 | pnpm run start:table-plugin | http://localhost:4202/assets/manifest.json |
| rename-layers-plugin | Rename layers in bulk | 4202 | pnpm run start:plugin:renamelayers | http://localhost:4202/assets/manifest.json |
| colors-to-tokens-plugin | Generate tokens JSON file | 4202 | pnpm run start:plugin:colors-to-tokens | http://localhost:4202/assets/manifest.json |
| poc-tokens-plugin | Sandbox plugin to test tokens functionality | 4202 | pnpm run start:plugin:poc-tokens | http://localhost:4202/assets/manifest.json |
Web Apps
| App | Description | PORT | Start command | URL |
|---|---|---|---|---|
| plugins-runtime | Runtime for the plugins subsystem | 4200 | pnpm run start:app:runtime | |
| example-styles | Showcase of some of the Penpot styles that can be used in plugins | 4201 | pnpm run start:app:styles-example | http://localhost:4201/ |
Creating a plugin from scratch
If you want to create a new plugin, read the following README
License
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
Copyright (c) KALEIDOS SUBSIDIARY SL
Penpot is a Kaleidos’ open source project