2026-03-03 09:15:39 +00:00
---
title: Zmienne
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
description: Zmienne projektu, kolekcje, tryby i powiązania kolorów w OpenPencil.
2026-03-03 09:15:39 +00:00
---
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
2026-03-03 09:15:39 +00:00
# Zmienne
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Zmienne przechowują tokeny projektu przeznaczone do ponownego użycia: kolory, odstępy i inne właściwości, które można powiązać z obiektami. Po zmianie wartości zmiennej wszystkie obiekty, które jej używają, zostają zaktualizowane.
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
## Otwieranie okna zmiennych
2026-03-03 09:15:39 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Otwórz je z **Widok → Zmienne…** , wyszukując „Zmienne” w palecie poleceń albo, gdy żaden obiekt nie jest zaznaczony, z sekcji „Zmienne” na karcie „Projekt”. Przycisk **Rozwiń** w rogu okna daje mu większą część okna aplikacji.
Okno wyświetla po lewej zmienne aktywnej kolekcji, po prawej umożliwia edycję zaznaczonej zmiennej lub kolekcji, a poniżej pokazuje arkusz stylów, który z nich powstaje. W wąskim oknie lub na telefonie pokazuje jeden tryb naraz, a zmienna, ustawienia kolekcji albo arkusz stylów otwierają się nad listą z przyciskiem powrotu.
2026-03-03 09:15:39 +00:00
## Kolekcje
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Zmienne są łączone w kolekcje. W szerokim oknie są wypisane na pasku bocznym wraz z liczbą zmiennych w każdej; w węższym są kartami, a na telefonie menu.
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
- **Przejście do kolekcji:** kliknij ją na pasku bocznym lub jej kartę
- **Tworzenie kolekcji:** kliknij ** +** obok **Kolekcje** albo przycisk z folderem na pasku narzędzi (**Utwórz kolekcję**)
- **Zmiana nazwy lub usuwanie:** gdy żadna zmienna nie jest zaznaczona, prawa strona edytuje kolekcję: zmień jej nazwę albo usuń ją z menu ** ⋯** obok nazwy (**Usuń kolekcję**)
2026-10-06 12:35:41 +00:00
- **Atrybut przełączania:** atrybut, który włącza tryby przełączane ręcznie, domyślnie `data-theme` dla kolekcji o nazwie Theme; wpisz inną nazwę, np. `data-color-scheme` , aby dopasować go do istniejącego kodu
2026-03-03 09:15:39 +00:00
## Tryby
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Każda kolekcja może zawierać kilka trybów (na przykład Light i Dark). Tryby są wyświetlane na liście jako kolumny wartości, a zmienna ma wartość dla każdego trybu. Zarządza się nimi w sekcji **Ustawienia kolekcji** :
- **Dodawanie trybu:** kliknij ** +** obok pozycji **Tryby**
- **Zmiana nazwy:** edytuj nazwę trybu
- **Duplikowanie, ustawianie jako domyślnego, usuwanie:** użyj menu ** ⋯** obok trybu (**Duplikuj tryb**, **Ustaw jako domyślny** , **Usuń tryb** )
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Tryb domyślny jest **Zawsze włączony** i trafia do `:root` . Każdy inny tryb ma pole **Obowiązuje, gdy** , które określa, kiedy tryb przejmuje kontrolę w wyeksportowanym arkuszu stylów; wygenerowany CSS jest pokazany poniżej:
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
| Obowiązuje, gdy | CSS |
| --- | --- |
2026-10-06 12:35:41 +00:00
| **przełączono ręcznie** | atrybut przełączania kolekcji z trybem jako wartością, na przykład `[data-theme="dark"]` dla trybu Dark kolekcji Theme |
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
| **system jest w trybie ciemnym** / **system jest w trybie jasnym** | `@media (prefers-color-scheme: dark)` / `light` |
| **włączony jest wysoki kontrast** | `@media (prefers-contrast: more)` |
| **włączone jest ograniczenie ruchu** | `@media (prefers-reduced-motion: reduce)` |
| **ekran jest węższy niż** / **ekran jest szerszy niż** szerokość | `@media (max-width: 640px)` / `min-width` |
| **kontener jest węższy niż** / **kontener jest szerszy niż** szerokość | `@container (max-width: 640px)` / `min-width` |
| **Własny CSS** | dowolny selektor albo zapytanie `@media` , `@supports` lub `@container` |
Na płótnie warstwa pokazuje tryb, gdy ustawisz ją na ten tryb, niezależnie od warunku. W wyeksportowanym kodzie tryb przełączany ręcznie włącza się przez dodanie jego atrybutu do elementu, więc warstwy ustawione na ten tryb są eksportowane z tym atrybutem. Warstwy ustawione na tryb z dowolnym innym warunkiem, także z własnymi selektorami, są eksportowane z wartościami dosłownymi zamiast tokenów, ponieważ o tym, kiedy tryb obowiązuje, decyduje arkusz stylów, a nie warstwa.
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
## Praca ze zmiennymi
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Zmienne są grupowane według folderów w ich nazwach (`Brand/Primary` jest widoczna jako *Primary* w folderze *Brand* ) i pokazują nazwę CSS oraz jedną wartość dla każdego trybu.
- **Tworzenie zmiennej:** kliknij **Utwórz zmienną** (lub ** +**) i wybierz typ; nowa zmienna otworzy się do edycji
- **Zaznaczanie:** kliknij wiersz albo poruszaj się strzałkami i naciśnij Enter. Kliknięcie z Shift zaznacza zakres, a kliknięcie z Cmd (Ctrl w Windows i Linuksie) dodaje wiersz lub usuwa go z zaznaczenia
- **Filtrowanie:** wpisz tekst w pasku wyszukiwania, aby filtrować według nazwy, nazwy CSS, opisu lub wartości, np. `--color-brand` , koloru szesnastkowego albo zmiennej, na którą wskazuje alias, z tolerancją literówek jak w palecie poleceń; kliknij grupę na pasku bocznym, aby pokazać tylko ją i grupy w niej zawarte, albo użyj przycisku filtra (**Filtruj według typu**), aby pokazać tylko niektóre typy
- **Zmiana nazwy lub edycja w miejscu:** kliknij dwukrotnie nazwę albo wartość liczbową lub tekstową na liście
- **Prawy przycisk myszy:** zmień nazwę, zduplikuj (**Duplikuj**), przenieś do grupy lub nowej grupy (**Przenieś do grupy**, **Nowa grupa…** ) albo usuń (**Usuń zmienne**) zaznaczone zmienne; usuwa je też Delete lub Backspace
- **Zmiana kolejności:** przeciągnij wiersz; kolejność jest zapisywana w pliku
- **Zaznaczonych kilka:** prawa strona przenosi je do grupy, duplikuje albo usuwa
- **Cofnij i ponów:** Cmd+Z oraz Cmd+Shift+Z lub Cmd+Y (Ctrl w systemach Windows i Linux) działają w oknie tak jak na kanwie, jeden krok na zmianę. Enter zatwierdza pole i wraca do listy; dopóki pole zawiera niezatwierdzony tekst, Cmd+Z cofa wpisywanie
2026-03-03 09:15:39 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Zaznaczenie zmiennej pozwala edytować:
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
- **Nazwa** i **Nazwa CSS:** pozostaw nazwę CSS pustą, aby utworzyć ją z nazwy i zakresów, na przykład `--color-brand-primary` . Wpisz nazwę bez `--` ; nazwa, której CSS nie może użyć, jest oznaczana i nie jest zapisywana
- **Jednostka:** dla liczb `px` , `rem` , `%` , `ms` , `s` , `deg` albo brak; wartości wpisuje się w tej jednostce
- **Wartość** lub **Wartości:** po jednej dla każdego trybu; kolor otwiera wybór koloru. Przycisk zmiennej (**Użyj zmiennej**) obok wartości kieruje ją do innej zmiennej tego samego typu, czyli aliasu, który podąża za tą zmienną; **Odłącz zmienną** przywraca wartość, którą pokazywał
- **Wyrażenie CSS:** dla liczb wartość taka jak `clamp(1rem, 4vw, 1.5rem)` zapisywana w CSS zamiast liczby, podczas gdy kanwa nadal rysuje liczbę
- **Zakresy:** dla jakich właściwości zmienna jest proponowana
- **Opis**
- **Ukryj przy publikowaniu:** pliki, które używają tego jako biblioteki, nie widzą zmiennej
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
## Arkusz stylów
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Dół okna pokazuje aktywną kolekcję jako właściwości niestandardowe CSS. Przycisk kopiowania (**Kopiuj wszystkie zmienne jako CSS**) kopiuje zmienne całego dokumentu jako CSS albo motyw Tailwind v4 (**Kopiuj wszystkie zmienne jako motyw Tailwind**), dzięki czemu aliasy do innych kolekcji są rozwiązywane.
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
## Powiązywanie zmiennych z zalewami
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
W sekcji „Zalew” panelu właściwości użyj wyboru zmiennej, aby powiązać zmienną koloru z zalewem obiektu.
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
- **Powiązanie:** wybierz zmienną koloru z listy. Zalew pokazuje fioletową etykietę z nazwą zmiennej.
- **Odłączenie:** kliknij przycisk odłączania na etykiecie, aby usunąć powiązanie. Zalew wraca do obliczonej wartości koloru.
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
Gdy wartość zmiennej się zmienia (albo po przełączeniu trybu), wszystkie powiązane zalewy aktualizują się automatycznie.
2026-03-03 09:15:39 +00:00
## Wskazówki
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
feat: edit variables as tokens in the variables dialog (#907)
* feat: prototype the design tokens panel
Undoable editor actions for token fields and mode conditions, a token view model, and table, inspector, collection and stylesheet panels shown in a Storybook story with a real editor.
* feat: lay the tokens panel out for mobile
Below the mobile breakpoint the collection tabs become a select, the list shows one chosen mode with the CSS name under each token, and the token, the modes, and the stylesheet each open over the list behind Back. CodeViewer can fill its container for the full-screen stylesheet.
* feat: share drill-in navigation and put tokens on a listbox
PanelDrillIn gives detail views one back control that names where it returns, a slide preset from theme/motion, and focus that moves into the detail and back to what opened it. The Settings model editor and the tokens panel's mobile views use it. The token list is a Reka Listbox with arrow-key navigation and labelled groups, and the inspector and stylesheet swap with a short fade under the motion policy.
* feat: lay the tokens panel out by container width
The panel switches to the compact drill-in by its own measured width, and the list's columns follow the list's width through container queries, so the panel adapts inside dialogs and split views, not only on phones. src/AGENTS.md now says when to use container queries, measured size, and viewport breakpoints.
* test(core): group the variable undo tests in a domain folder
* feat: edit variables as tokens in the variables dialog
The variables dialog now hosts the tokens panel: a grouped token list with CSS names, an inspector for each token and for the collection and its modes, and the live stylesheet. It keeps adding variables by type, search, collection and mode management, and copying the document's stylesheet, and lays out by its own width down to phones.
useVariables().collections returns copies, so components given a collection see modes added or renamed in place, and addVariable returns the new ID so the panel can open it.
* fix: satisfy the type-aware lint in token updates and panel stories
* docs: describe the tokens panel in the translated variables guides
* feat: say when each mode applies in plain words
A mode's condition was a raw CSS field that designers could not read. Each non-default mode now picks when it applies (switched manually, system dark or light mode, high contrast, reduced motion, screen or container width, or custom CSS), with the CSS it writes shown underneath and a note on how the mode behaves on the canvas and in exported code. Presets only write the condition string modes already store, so files round-trip unchanged. Column headers name the condition in words, and deleting the collection moves into a menu beside its name.
* feat: bring the variables dialog up to Figma's
The dialog now covers what Figma's variables dialog offers: collections and groups in a sidebar with counts, a group, search and type filter, type icons, names and values edited in place, drag to reorder, multi-select with a context menu, the Delete key and a side panel to duplicate, group and delete, aliases chosen from a variable picker and detached back to the value they showed, hiding from publishing, and an expand toggle. It opens from View → Variables… and the command palette as well as the Design panel.
It also fixes review findings: a single-mode collection labels its value Value, column titles share one font, a CSS name is typed after a fixed -- and checked by the CSS parser before it is saved, and the stylesheet previews CSS with the format chosen when copying. AppInput applies an instance's input classes last so they can override adornment padding.
* feat: undo and redo inside the variables dialog
Canvas shortcuts stop while any dialog is open, so Cmd+Z did nothing in the variables dialog although every edit there is on the editor's history. Undo and redo now take a document scope: they also run when the topmost layer is a dialog that edits the document, which the variables dialog marks, while menus, pickers and Settings still hold them back and a field with uncommitted text keeps its own undo.
Enter commits a field and returns focus to the list. The panel drops selections, group filters and collections that undo removed. A color picker session undoes as one step through a coalesce key on updateVariableValue, and undoing a deletion puts the variable back in its place.
* feat: search variables like the command palette
The variables search matched a substring of the name only, so a CSS name, a hex color or a description found nothing, and the palette, AppPicker and AppCombobox each spelled out the same Fuse.js options. One helper in @open-pencil/vue now owns the matching: fuzzySearch ranks results for lists people pick from, and fuzzyFilter keeps a list's own order for lists people arrange. The panel searches names, CSS names, descriptions and every mode's value, alias names included; useVariables() searches names and descriptions.
* fix: say a token group once when its name repeats it
Kits that mirror Tailwind classes name tokens like Gap/gap-1, which derived --gap-gap-1. A group the next segment repeats is now said once, giving --gap-1.
* fix: keep the add variable menu under its button after a resize
The toolbar swaps the icon button for the labelled one when the dialog widens. Reka keeps the anchor it mounted with, so the menu opened at the window corner; keying the trigger remounts it with the new button.
* fix: leave bound layers alone when variables are added or reordered
Adding, copying, or reordering variables re-resolved every bound layer in the document. In the shadcn kit two Avatar instances are saved at 24 while their binding gives 40, so adding a number resized them and relaid out about 7,800 layers, freezing the browser for seconds. These changes alter no bound value and now only request a render, as renaming already did.
* refactor: let the variables dialog own its undo shortcuts
Undo and redo in the dialog went through a document scope in the global shortcut registry, which decided whether the dialog was on top by querying Reka's dismissable layers in DOM order. The dialog now listens on its own content with a tinykeys handler built from the command keybindings: menus and pickers it opens portal elsewhere, so their keys never reach it, and the registry is back to one scope.
* refactor: read mode conditions with css-tree
Presets were recognized by normalizing the condition with regular expressions and matching another. css-tree, which Core already ships through unifont, now parses the condition into its media or container feature, so spacing, case and comments are handled as CSS does, and a non-breaking space, which CSS does not treat as whitespace, no longer turns a custom condition into a preset.
* refactor: take the mode attribute hint from modeAttribute
The hint for a manually switched mode cut the brackets off its selector with a regular expression. It now reads the attribute name and value from modeAttribute, which the selector is built from.
* fix: keep a refused CSS name in focus and color picker sessions apart
Enter on a CSS name the parser refuses no longer hands the keyboard back to the list, so the name can be corrected. The typed name is read with parseCSSName instead of stripping a leading -- by hand, so a pasted var(--name) works too.
Each color picker session takes a random undo key; a counter restarted when the inspector remounted, so two sessions on the same token could merge into one undo step.
* fix: keep token expressions and cleared fields in step with their variable
Editing a number left its CSS expression recording the old number, so reopening the file dropped the expression as edited elsewhere. A number now updates its expression, and an alias drops it, in the same undo step.
Undoing a token field that had been unset kept the key with an undefined value; it is now removed.
* fix: preview and detach aliases in their own mode
An alias in the Dark column showed, and detached to, what its target gives in the mode the canvas is in. Both now resolve in the column's mode.
* fix: drop tokens a filter hides from the selection
A search, group, or type filter could hide selected tokens that stayed selected, so the inspector, the bulk actions, and the Delete key still acted on rows the list no longer showed.
* fix: keep a drill-in's list out of the tab order while its detail slides
The list stayed focusable until the detail finished sliding in, and became focusable again under a detail sliding out. It is now inert from the moment the detail opens and the departing detail is inert. A detail with no field focuses its back control, and hidden inputs are skipped.
* docs: drop a duplicated Stroke entry from the changelog
Two merges left the Stroke-extends-Fill breaking change twice; the copy that still said strokes render solid only is outdated, since gradient and image strokes now import and render.
2026-10-06 12:35:40 +00:00
- Łącz powiązane tokeny w kolekcje, na przykład `Primitives` dla kolorów źródłowych, `Semantic` dla aliasów znaczeniowych i `Spacing` dla odstępów.
- Tryby są przydatne do przełączania motywu: wartości Light i Dark można zdefiniować w tej samej kolekcji.
- Zmienne obsługują aliasy: kolekcja `Semantic` może odwoływać się do wartości z kolekcji `Primitives` .
docs: polish localized documentation
* docs: polish localized documentation
- Rewrite Russian documentation for natural terminology and current source parity\n- Continue the Polish editorial pass across guides and SDK references\n- Refresh shared localized SDK API data imports
* docs(pl): complete editorial pass
- Rewrite the remaining advanced Vue SDK references\n- Refresh the Figma compatibility matrix against the canonical source\n- Align terminology and behavior across every Polish documentation page
* docs(de): complete editorial pass
- Rewrite German guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(es): complete editorial pass
- Rewrite Spanish guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs(fr): complete editorial pass
- Rewrite French guides, automation docs, and Vue SDK references\n- Restore current AI, export, component, and variable behavior\n- Refresh the Penpot comparison and Figma compatibility matrix
* docs: correct localized terminology
- Replace unnecessary English prose with natural localized terminology\n- Derive documentation aliases from named directory roots\n- Preserve English only for identifiers, APIs, and exact product terms
* docs(it): continue editorial pass
- Rewrite Italian user guides and automation documentation\n- Update Vue SDK composables and component references\n- Restore current AI, export, component, and variable behavior
* docs(it): complete editorial pass
- Finish Italian advanced SDK and reference documentation\n- Refresh the Penpot comparison and Figma compatibility matrix\n- Replace literal machine translations with natural technical prose
* docs(pl): refine property panel terminology
* docs: refine remaining localized prose
- Replace overfitted English prose in Polish feature documentation\n- Rewrite the Russian property-list reference in natural terminology
* docs(ru): rewrite Penpot comparison naturally
- Replace remaining English prose with natural Russian\n- Preserve code identifiers and library names only where required
* docs: rewrite localized feature overviews naturally
- Replace avoidable English prose in German, Spanish, and French\n- Keep identifiers and product names unchanged
* docs(de): refine property panel terminology
* docs: refine Spanish and French SDK terminology
* docs(ru): continue full prose audit
- Rewrite homepage, setup, navigation, and guide index naturally\n- Restore missing zoom shortcuts
* docs(ru): audit user and automation guides
- Rewrite selection, collaboration, and automation prose naturally\n- Preserve API identifiers while localizing ordinary terminology
* docs(ru): audit CLI inspection and analysis
* docs(ru): audit Vue SDK overview and guides
* docs(ru): audit Vue SDK API prose
- Localize ordinary component and composable terminology\n- Preserve API symbols and code identifiers
* docs(ru): audit advanced and gradient API references
* docs(ru): finish advanced API prose audit
* docs(ru): audit JSX renderer guide
* docs(ru): audit CLI export and scripting guides
* docs(pl): audit Penpot comparison prose
* docs(pl): audit selection and automation guides
* docs(pl): audit homepage and variable guides
* docs(pl): audit vector, layers, and Pen guides
* docs(pl): audit Auto layout and shape guides
* docs(pl): audit context menu and export guides
* docs(pl): audit JSX and analysis guides
* docs(pl): audit AI Chat guide
* docs(pl): audit components and CLI inspection
* docs(pl): audit scripting and SDK overview prose
* docs(pl): audit SDK API indexes
* docs(pl): audit SDK component references
* docs(pl): audit SDK composable references
* docs(ru): refine usePosition terminology
* docs(pl): audit advanced SDK references
* docs(pl): audit Figma compatibility matrix
* docs(pl): finish residual SDK terminology audit
* docs(pl): finish component terminology audit
* docs(pl): finish SDK guide terminology audit
* docs(de): begin full user guide prose audit
* docs(de): audit navigation, Pen, and layers guides
* docs(de): audit Auto Layout, shapes, menu, and export
* docs(de): audit components, text, and vector guides
* docs(de): audit variables and automation overview
* docs(de): audit AI Chat and collaboration guides
* docs(de): audit CLI inspection, analysis, and export
* docs(de): audit scripting and JSX guides
* docs(de): audit Vue SDK overview and guides
* docs(de): audit SDK API indexes
* docs(de): audit SDK component references
* docs(de): audit SDK composable references
* docs(de): audit advanced SDK references
* docs(de): audit Penpot comparison prose
* docs(de): audit Figma compatibility reference
* docs(es): begin full user guide prose audit
* docs(es): audit document organization guides
* docs(es): audit editing workflow guides
* docs(es): audit automation and collaboration prose
* docs(es): audit CLI inspection and export guides
* docs(es): audit CLI scripting guide
* docs(es): audit JSX and feature overview prose
* docs(es): audit Penpot comparison prose
* docs(es): audit SDK overview and guides
* docs(es): begin SDK component reference audit
* docs(es): audit SDK navigation component references
* docs(es): audit SDK color and layout components
* docs(es): begin SDK composable reference audit
* docs(es): audit SDK property composable references
* docs(es): audit SDK editor composable references
* docs(es): begin advanced SDK reference audit
* docs(es): audit advanced SDK state references
* docs(es): complete advanced SDK reference audit
* docs(es): audit Figma compatibility reference
* docs(es): complete residual terminology sweep
* docs(fr): begin full prose second audit
* docs(fr): audit AI and variables prose
* docs(fr): audit core user guide prose
* docs(fr): audit editing workflow guides
* docs(fr): audit CLI and JSX prose
* docs(fr): audit Penpot comparison prose
* docs(fr): audit SDK overview and guides
* docs(fr): begin SDK API reference audit
* docs(fr): audit SDK navigation component references
* docs(fr): audit SDK color and layout components
* docs(fr): begin SDK composable reference audit
* docs(fr): audit SDK property composable references
* docs(fr): audit editor composables and advanced APIs
* docs(fr): audit advanced SDK state references
* docs(fr): complete advanced SDK reference audit
* docs(fr): audit Figma compatibility reference
* docs(fr): complete residual terminology sweep
* docs(it): begin full prose second audit
* docs(it): audit document workflow guides
* docs(it): audit editing and automation prose
* docs(it): audit CLI and JSX prose
* docs(it): audit Penpot comparison and SDK guides
* docs(it): begin SDK API reference audit
* docs(it): audit SDK component and state references
* docs(it): audit residual SDK references
* docs(it): audit Figma compatibility reference
* docs(it): complete residual terminology sweep
* docs(i18n): verify residual locale terminology
2026-08-20 15:36:50 +00:00
- Zalewy i wybór koloru opisano na stronie [Kształty ](./drawing-shapes ).