@lvl99dotcom/paintcanvas 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +2 -2
  2. package/dist/lib/brushes/configRanges/index.d.ts +17 -0
  3. package/dist/lib/brushes/configRanges/index.js +31 -1
  4. package/dist/lib/brushes/params/index.d.ts +2 -1
  5. package/dist/lib/brushes/params/index.js +7 -4
  6. package/dist/lib/brushes/types/index.d.ts +8 -0
  7. package/dist/lib/classes/Layer/index.d.ts +10 -0
  8. package/dist/lib/classes/Layer/index.js +15 -1
  9. package/dist/lib/classes/LayerAutosave/index.d.ts +9 -15
  10. package/dist/lib/classes/LayerAutosave/index.js +30 -43
  11. package/dist/lib/classes/LayerStack/index.d.ts +15 -0
  12. package/dist/lib/classes/LayerStack/index.js +26 -2
  13. package/dist/lib/classes/PaintCanvas/index.d.ts +36 -5
  14. package/dist/lib/classes/PaintCanvas/index.js +45 -14
  15. package/dist/lib/classes/PngEncoder/index.d.ts +41 -0
  16. package/dist/lib/classes/PngEncoder/index.js +104 -0
  17. package/dist/lib/classes/ProfileGraphs/index.d.ts +87 -0
  18. package/dist/lib/classes/ProfileGraphs/index.js +148 -0
  19. package/dist/lib/classes/SettingsAutosave/index.d.ts +1 -1
  20. package/dist/lib/classes/SettingsAutosave/index.js +2 -1
  21. package/dist/lib/classes/UiSettings/index.d.ts +24 -2
  22. package/dist/lib/classes/UiSettings/index.js +32 -7
  23. package/dist/lib/messages/schema.d.ts +720 -0
  24. package/dist/lib/presets/schema.d.ts +360 -0
  25. package/dist/lib/presets/schema.js +8 -1
  26. package/dist/lib/profiles/index.d.ts +61 -0
  27. package/dist/lib/profiles/index.js +131 -0
  28. package/dist/lib/profiles/schema.d.ts +73 -0
  29. package/dist/lib/profiles/schema.js +53 -0
  30. package/dist/lib/rendering/sample/index.d.ts +11 -0
  31. package/dist/lib/rendering/sample/index.js +36 -5
  32. package/dist/lib/settings/index.d.ts +2 -1
  33. package/dist/lib/settings/index.js +4 -1
  34. package/dist/lib/settings/schema.d.ts +53 -1
  35. package/dist/lib/settings/schema.js +9 -2
  36. package/dist/lib/storage/index.d.ts +26 -0
  37. package/dist/lib/storage/index.js +38 -1
  38. package/dist/lib/validation/validators.generated.js +13061 -3675
  39. package/dist/lib/version/index.d.ts +25 -0
  40. package/dist/lib/version/index.js +35 -0
  41. package/dist/locales/en-GB.js +35 -0
  42. package/dist/locales/en-US.js +35 -0
  43. package/dist/locales/fr.js +35 -0
  44. package/dist/locales/ja.js +35 -0
  45. package/dist/locales/ko.js +35 -0
  46. package/dist/locales/zh-Hans.js +35 -0
  47. package/dist/locales/zh-Hant.js +35 -0
  48. package/dist/package.js +1 -1
  49. package/dist/ui/ask/index.d.ts +48 -0
  50. package/dist/ui/ask/index.js +67 -0
  51. package/dist/ui/base/index.d.ts +8 -1
  52. package/dist/ui/base/index.js +19 -4
  53. package/dist/ui/elements/PaintCanvas/index.d.ts +13 -3
  54. package/dist/ui/elements/PaintCanvas/index.js +25 -6
  55. package/dist/ui/elements/PaintCanvas/style.js +1 -1
  56. package/dist/ui/elements/PcAppSettings/index.d.ts +15 -7
  57. package/dist/ui/elements/PcAppSettings/index.js +53 -62
  58. package/dist/ui/elements/PcBrushConfig/index.d.ts +26 -14
  59. package/dist/ui/elements/PcBrushConfig/index.js +214 -145
  60. package/dist/ui/elements/PcBrushConfig/style.js +1 -1
  61. package/dist/ui/elements/PcBrushTest/index.d.ts +1 -0
  62. package/dist/ui/elements/PcBrushTest/index.js +15 -9
  63. package/dist/ui/elements/PcBrushTest/style.js +1 -1
  64. package/dist/ui/elements/PcButton/index.d.ts +12 -3
  65. package/dist/ui/elements/PcButton/index.js +18 -10
  66. package/dist/ui/elements/PcButtonMenu/index.d.ts +88 -0
  67. package/dist/ui/elements/PcButtonMenu/index.js +125 -0
  68. package/dist/ui/elements/PcCanvas/index.d.ts +15 -1
  69. package/dist/ui/elements/PcCanvas/index.js +42 -19
  70. package/dist/ui/elements/PcCanvas/style.js +1 -1
  71. package/dist/ui/elements/PcClipboardTools/index.d.ts +11 -7
  72. package/dist/ui/elements/PcClipboardTools/index.js +30 -29
  73. package/dist/ui/elements/PcDialog/index.d.ts +46 -10
  74. package/dist/ui/elements/PcDialog/index.js +102 -51
  75. package/dist/ui/elements/PcDialogWindow/index.d.ts +141 -0
  76. package/dist/ui/elements/PcDialogWindow/index.js +385 -0
  77. package/dist/ui/elements/PcInputSettings/index.d.ts +2 -1
  78. package/dist/ui/elements/PcInputSettings/index.js +9 -15
  79. package/dist/ui/elements/PcLayerItem/index.d.ts +21 -6
  80. package/dist/ui/elements/PcLayerItem/index.js +53 -26
  81. package/dist/ui/elements/PcLayerItem/style.js +1 -1
  82. package/dist/ui/elements/PcPanelBrushes/index.d.ts +3 -2
  83. package/dist/ui/elements/PcPanelBrushes/index.js +7 -5
  84. package/dist/ui/elements/PcPanelBrushes/style.js +1 -1
  85. package/dist/ui/elements/PcPanelColours/index.js +2 -2
  86. package/dist/ui/elements/PcPanelColours/style.js +1 -1
  87. package/dist/ui/elements/PcPanelLayers/index.js +1 -1
  88. package/dist/ui/elements/PcPanelLayers/style.js +1 -1
  89. package/dist/ui/elements/PcProfileEditor/index.d.ts +103 -0
  90. package/dist/ui/elements/PcProfileEditor/index.js +259 -0
  91. package/dist/ui/elements/PcProfileGraph/index.d.ts +84 -0
  92. package/dist/ui/elements/PcProfileGraph/index.js +317 -0
  93. package/dist/ui/elements/PcShortcutSettings/index.js +9 -13
  94. package/dist/ui/elements/PcSliderRange/index.d.ts +147 -0
  95. package/dist/ui/elements/PcSliderRange/index.js +308 -0
  96. package/dist/ui/elements/PcStats/index.d.ts +19 -4
  97. package/dist/ui/elements/PcStats/index.js +29 -13
  98. package/dist/ui/elements/PcToggleCheckbox/index.d.ts +13 -2
  99. package/dist/ui/elements/PcToggleCheckbox/index.js +27 -8
  100. package/dist/ui/elements/PcToolSettings/index.d.ts +1 -0
  101. package/dist/ui/elements/PcToolSettings/index.js +14 -14
  102. package/dist/ui/elements/PcVersion/index.d.ts +12 -0
  103. package/dist/ui/elements/PcVersion/index.js +43 -0
  104. package/dist/ui/icons/images/icon-profile-graph@2x.js +3 -0
  105. package/dist/ui/icons/index.d.ts +1 -1
  106. package/dist/ui/icons/index.js +2 -0
  107. package/dist/ui/index.d.ts +9 -2
  108. package/dist/ui/index.js +9 -2
  109. package/dist/ui/layout/index.d.ts +2 -2
  110. package/dist/ui/layout/index.js +2 -2
  111. package/dist/ui/styles/index.d.ts +21 -1
  112. package/dist/ui/styles/index.js +73 -14
  113. package/locales/en-GB.json +35 -0
  114. package/locales/en-US.json +35 -0
  115. package/locales/fr.json +35 -0
  116. package/locales/ja.json +35 -0
  117. package/locales/ko.json +35 -0
  118. package/locales/zh-Hans.json +35 -0
  119. package/locales/zh-Hant.json +35 -0
  120. package/package.json +25 -23
@@ -0,0 +1,43 @@
1
+ import { PcElement, defineElement } from "../../base/index.js";
2
+ import { PAINTCANVAS_REPOSITORY_URL, versionText } from "../../../lib/version/index.js";
3
+ import { css, html } from "lit";
4
+ // src/ui/elements/PcVersion/index.ts
5
+ /**
6
+ * PaintCanvas's version and the commit it was built from, e.g. "PaintCanvas v0.6.0 (ac12a0d)", as a link to its GitHub
7
+ * repository (opened in a new tab). For an app's settings or about panel.
8
+ *
9
+ * @example
10
+ * html`<pc-version></pc-version>`
11
+ */
12
+ var PcVersion = class extends PcElement {
13
+ static styles = [PcElement.styles, css`
14
+ :host {
15
+ display: block;
16
+ font-family: var(--pc-font);
17
+ font-size: var(--pc-font-size-small);
18
+ }
19
+ a {
20
+ color: var(--pc-text-muted);
21
+ text-decoration: none;
22
+ }
23
+ a:hover {
24
+ color: var(--pc-text);
25
+ text-decoration: underline;
26
+ }
27
+ a:focus-visible {
28
+ outline: var(--pc-focus-width) solid var(--pc-focus);
29
+ outline-offset: 2px;
30
+ }
31
+ `];
32
+ render() {
33
+ return html`<a
34
+ part="link"
35
+ href=${PAINTCANVAS_REPOSITORY_URL}
36
+ target="_blank"
37
+ rel="noopener noreferrer"
38
+ >${versionText()}</a
39
+ >`;
40
+ }
41
+ };
42
+ defineElement("pc-version", PcVersion);
43
+ export { PcVersion };
@@ -0,0 +1,3 @@
1
+ // src/ui/icons/images/icon-profile-graph@2x.png?url
2
+ var icon_profile_graph_2x_default = "data:image/png;base64,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";
3
+ export { icon_profile_graph_2x_default as default };
@@ -1,5 +1,5 @@
1
1
  /** Names of the icons that come with PaintCanvas */
2
- export type IconName = "brush" | "eraser" | "cursor" | "rectangleMask" | "circleMask" | "polygonMask" | "freehandMask" | "eyedropper" | "zoom" | "zoomIn" | "zoomOut" | "pan" | "undo" | "redo" | "layers" | "locked" | "unlocked" | "visible" | "hidden" | "linked" | "unlinked" | "pressure" | "focusPen" | "tilt" | "randomise" | "flipHorizontal" | "flipVertical" | "rotate90Left" | "rotate90Right" | "rotate" | "horizontalSize" | "verticalSize" | "diagonalTlbrSize" | "diagonalTrblSize" | "clipboard" | "smoothingLinear" | "smoothingBezierQuad" | "smoothingBezierCubic" | "sun" | "moon" | "star" | "cog";
2
+ export type IconName = "brush" | "eraser" | "cursor" | "rectangleMask" | "circleMask" | "polygonMask" | "freehandMask" | "eyedropper" | "zoom" | "zoomIn" | "zoomOut" | "pan" | "undo" | "redo" | "layers" | "locked" | "unlocked" | "visible" | "hidden" | "linked" | "unlinked" | "pressure" | "focusPen" | "tilt" | "randomise" | "profileGraph" | "flipHorizontal" | "flipVertical" | "rotate90Left" | "rotate90Right" | "rotate" | "horizontalSize" | "verticalSize" | "diagonalTlbrSize" | "diagonalTrblSize" | "clipboard" | "smoothingLinear" | "smoothingBezierQuad" | "smoothingBezierCubic" | "sun" | "moon" | "star" | "cog";
3
3
  /** The icons that come with PaintCanvas, as URLs */
4
4
  export declare const DEFAULT_ICONS: Readonly<Record<IconName, string>>;
5
5
  /**
@@ -23,6 +23,7 @@ import icon_pressure_2x_default from "./images/icon-pressure@2x.js";
23
23
  import icon_focus_pen_2x_default from "./images/icon-focus-pen@2x.js";
24
24
  import icon_tilt_2x_default from "./images/icon-tilt@2x.js";
25
25
  import icon_randomise_2x_default from "./images/icon-randomise@2x.js";
26
+ import icon_profile_graph_2x_default from "./images/icon-profile-graph@2x.js";
26
27
  import icon_flip_horizontal_2x_default from "./images/icon-flip-horizontal@2x.js";
27
28
  import icon_flip_vertical_2x_default from "./images/icon-flip-vertical@2x.js";
28
29
  import icon_rotate_90_left_2x_default from "./images/icon-rotate-90-left@2x.js";
@@ -69,6 +70,7 @@ var DEFAULT_ICONS = {
69
70
  focusPen: icon_focus_pen_2x_default,
70
71
  tilt: icon_tilt_2x_default,
71
72
  randomise: icon_randomise_2x_default,
73
+ profileGraph: icon_profile_graph_2x_default,
72
74
  flipHorizontal: icon_flip_horizontal_2x_default,
73
75
  flipVertical: icon_flip_vertical_2x_default,
74
76
  rotate90Left: icon_rotate_90_left_2x_default,
@@ -4,16 +4,22 @@ export { PcElement, defineElement, emit } from "./base";
4
4
  export { PcIcon } from "./elements/PcIcon";
5
5
  export { PcButton, type ButtonVariant } from "./elements/PcButton";
6
6
  export { PcButtonGroup } from "./elements/PcButtonGroup";
7
+ export { PcButtonMenu, isNarrowerThan, type ButtonMenuItem, } from "./elements/PcButtonMenu";
7
8
  export { PcIconToggle } from "./elements/PcIconToggle";
8
9
  export { PcToggleCheckbox } from "./elements/PcToggleCheckbox";
9
10
  export { PcSlider } from "./elements/PcSlider";
10
11
  export { PcNumberSlider, fitNumber } from "./elements/PcNumberSlider";
12
+ export { PcProfileEditor, type ProfileSaveDetail, } from "./elements/PcProfileEditor";
13
+ export { PcProfileGraph, curvePath, movePoint, } from "./elements/PcProfileGraph";
14
+ export { PcSliderRange, rangeFraction, type RangeDetail, type RangeEnd, } from "./elements/PcSliderRange";
11
15
  export { PcBrushSize, sizeText } from "./elements/PcBrushSize";
12
16
  export { PointerDrag, DRAG_THRESHOLD, dragDelta } from "./drag";
13
17
  export { markDismissingPress, isDismissingPress } from "./dismiss";
14
18
  export { PcMenu, isMenuItem, menuSections, type MenuItem, type MenuLabel, type MenuDivider, type MenuEntry, } from "./elements/PcMenu";
15
19
  export { PcContextMenu, CONTEXT_MENU_TOGGLE_EVENT, MENU_MARGIN, menuLeft, menuTop, type MenuPlacement, } from "./elements/PcContextMenu";
16
- export { PcDialog, CANCEL_CHOICE, type DialogChoice, } from "./elements/PcDialog";
20
+ export { PcDialogWindow, DIALOG_DISMISS_EVENT, type DialogCloseReason, } from "./elements/PcDialogWindow";
21
+ export { PcDialog, CANCEL_CHOICE, type DialogChoice, type DialogChoiceDetail, type DialogField, } from "./elements/PcDialog";
22
+ export { askConfirm, askText, deletePresetQuestion, OK_CHOICE, type AskOptions, type AskTextOptions, type ConfirmFn, type PromptFn, } from "./ask";
17
23
  export { PcToast, TOAST_DURATION_MS, type ToastKind } from "./elements/PcToast";
18
24
  export { PcInfoTip } from "./elements/PcInfoTip";
19
25
  export { PcPopover } from "./elements/PcPopover";
@@ -22,11 +28,12 @@ export { PcPane, PANE_COLLAPSE_EVENT, type PaneEdge, type PaneOrientation, } fro
22
28
  export { PcInputSettings, type InputSettingsLike, } from "./elements/PcInputSettings";
23
29
  export { PcMatch } from "./elements/PcMatch";
24
30
  export { PcColourPair, COLOUR_CLICK_EVENT } from "./elements/PcColourPair";
25
- export { PcClipboardTools, CLIPBOARD_TOOLS } from "./elements/PcClipboardTools";
31
+ export { PcClipboardTools, CLIPBOARD_MENU_BELOW, CLIPBOARD_TOOLS, } from "./elements/PcClipboardTools";
26
32
  export { PcShortcutSettings, type ShortcutSettingsLike, } from "./elements/PcShortcutSettings";
27
33
  export { PcAppSettings } from "./elements/PcAppSettings";
28
34
  export { PcPanelColours, LONG_PRESS_MS, type ColourModel, } from "./elements/PcPanelColours";
29
35
  export { PcStats, formatBytes } from "./elements/PcStats";
36
+ export { PcVersion } from "./elements/PcVersion";
30
37
  export { PcThemePicker, THEMES, THEME_ICONS, isTheme, type Theme, } from "./elements/PcThemePicker";
31
38
  export { PaintCanvasElement } from "./elements/PaintCanvas";
32
39
  export { DEFAULT_NARROW_WIDTH, DEFAULT_SIDE_MODES, LayoutStateController, STATE_EVENT, matchesState, parseSideModes, showsRail, sideModeFor, type InputKind, type LayoutState, type SideMode, type SideModeRule, } from "./layout";
package/dist/ui/index.js CHANGED
@@ -5,16 +5,22 @@ import { PcElement, defineElement, emit } from "./base/index.js";
5
5
  import { PcIcon } from "./elements/PcIcon/index.js";
6
6
  import { PcButton } from "./elements/PcButton/index.js";
7
7
  import { PcButtonGroup } from "./elements/PcButtonGroup/index.js";
8
+ import { PcButtonMenu, isNarrowerThan } from "./elements/PcButtonMenu/index.js";
8
9
  import { PcIconToggle } from "./elements/PcIconToggle/index.js";
9
10
  import { PcToggleCheckbox } from "./elements/PcToggleCheckbox/index.js";
10
11
  import { PcSlider } from "./elements/PcSlider/index.js";
11
12
  import { PcNumberSlider, fitNumber } from "./elements/PcNumberSlider/index.js";
13
+ import { PcProfileEditor } from "./elements/PcProfileEditor/index.js";
14
+ import { PcProfileGraph, curvePath, movePoint } from "./elements/PcProfileGraph/index.js";
15
+ import { PcSliderRange, rangeFraction } from "./elements/PcSliderRange/index.js";
12
16
  import { PcBrushSize, sizeText } from "./elements/PcBrushSize/index.js";
13
17
  import { DRAG_THRESHOLD, PointerDrag, dragDelta } from "./drag/index.js";
14
18
  import { isDismissingPress, markDismissingPress } from "./dismiss/index.js";
15
19
  import { PcMenu, isMenuItem, menuSections } from "./elements/PcMenu/index.js";
16
20
  import { CONTEXT_MENU_TOGGLE_EVENT, MENU_MARGIN, PcContextMenu, menuLeft, menuTop } from "./elements/PcContextMenu/index.js";
21
+ import { DIALOG_DISMISS_EVENT, PcDialogWindow } from "./elements/PcDialogWindow/index.js";
17
22
  import { CANCEL_CHOICE, PcDialog } from "./elements/PcDialog/index.js";
23
+ import { OK_CHOICE, askConfirm, askText, deletePresetQuestion } from "./ask/index.js";
18
24
  import { PcToast, TOAST_DURATION_MS } from "./elements/PcToast/index.js";
19
25
  import { PcInfoTip } from "./elements/PcInfoTip/index.js";
20
26
  import { PcPopover } from "./elements/PcPopover/index.js";
@@ -23,12 +29,13 @@ import { PANE_COLLAPSE_EVENT, PcPane } from "./elements/PcPane/index.js";
23
29
  import { PcInputSettings } from "./elements/PcInputSettings/index.js";
24
30
  import { PcMatch } from "./elements/PcMatch/index.js";
25
31
  import { COLOUR_CLICK_EVENT, PcColourPair } from "./elements/PcColourPair/index.js";
26
- import { CLIPBOARD_TOOLS, PcClipboardTools } from "./elements/PcClipboardTools/index.js";
32
+ import { CLIPBOARD_MENU_BELOW, CLIPBOARD_TOOLS, PcClipboardTools } from "./elements/PcClipboardTools/index.js";
27
33
  import { PcShortcutSettings } from "./elements/PcShortcutSettings/index.js";
28
34
  import { PcAppSettings } from "./elements/PcAppSettings/index.js";
29
35
  import { LONG_PRESS_MS, PcPanelColours } from "./elements/PcPanelColours/index.js";
30
36
  import { PcStats, formatBytes } from "./elements/PcStats/index.js";
37
+ import { PcVersion } from "./elements/PcVersion/index.js";
31
38
  import { PcThemePicker, THEME_ICONS } from "./elements/PcThemePicker/index.js";
32
39
  import { PaintCanvasElement } from "./elements/PaintCanvas/index.js";
33
40
  import { DEFAULT_NARROW_WIDTH, DEFAULT_SIDE_MODES, LayoutStateController, STATE_EVENT, matchesState, parseSideModes, showsRail, sideModeFor } from "./layout/index.js";
34
- export { CANCEL_CHOICE, CLIPBOARD_TOOLS, COLOUR_CLICK_EVENT, CONTEXT_MENU_TOGGLE_EVENT, DARK_TOKENS, DEFAULT_ICONS, DEFAULT_NARROW_WIDTH, DEFAULT_SIDE_MODES, DRAG_THRESHOLD, IconRegistry, LIGHT_TOKENS, LONG_PRESS_MS, LayoutStateController, MENU_MARGIN, PANE_COLLAPSE_EVENT, PaintCanvasElement, PcAppSettings, PcBrushSize, PcButton, PcButtonGroup, PcClipboardTools, PcColourPair, PcContextMenu, PcDialog, PcElement, PcIcon, PcIconToggle, PcInfoTip, PcInputSettings, PcMatch, PcMenu, PcNumberSlider, PcPane, PcPanel, PcPanelColours, PcPopover, PcShortcutSettings, PcSlider, PcStats, PcThemePicker, PcToast, PcToggleCheckbox, PointerDrag, STATE_EVENT, THEMES, THEME_ICONS, TOAST_DURATION_MS, TOKENS_CSS, defineElement, dragDelta, emit, fitNumber, formatBytes, icons, installTokens, isDismissingPress, isMenuItem, isTheme, markDismissingPress, matchesState, menuLeft, menuSections, menuTop, parseSideModes, showsRail, sideModeFor, sizeText, tokens };
41
+ export { CANCEL_CHOICE, CLIPBOARD_MENU_BELOW, CLIPBOARD_TOOLS, COLOUR_CLICK_EVENT, CONTEXT_MENU_TOGGLE_EVENT, DARK_TOKENS, DEFAULT_ICONS, DEFAULT_NARROW_WIDTH, DEFAULT_SIDE_MODES, DIALOG_DISMISS_EVENT, DRAG_THRESHOLD, IconRegistry, LIGHT_TOKENS, LONG_PRESS_MS, LayoutStateController, MENU_MARGIN, OK_CHOICE, PANE_COLLAPSE_EVENT, PaintCanvasElement, PcAppSettings, PcBrushSize, PcButton, PcButtonGroup, PcButtonMenu, PcClipboardTools, PcColourPair, PcContextMenu, PcDialog, PcDialogWindow, PcElement, PcIcon, PcIconToggle, PcInfoTip, PcInputSettings, PcMatch, PcMenu, PcNumberSlider, PcPane, PcPanel, PcPanelColours, PcPopover, PcProfileEditor, PcProfileGraph, PcShortcutSettings, PcSlider, PcSliderRange, PcStats, PcThemePicker, PcToast, PcToggleCheckbox, PcVersion, PointerDrag, STATE_EVENT, THEMES, THEME_ICONS, TOAST_DURATION_MS, TOKENS_CSS, askConfirm, askText, curvePath, defineElement, deletePresetQuestion, dragDelta, emit, fitNumber, formatBytes, icons, installTokens, isDismissingPress, isMenuItem, isNarrowerThan, isTheme, markDismissingPress, matchesState, menuLeft, menuSections, menuTop, movePoint, parseSideModes, rangeFraction, showsRail, sideModeFor, sizeText, tokens };
@@ -16,8 +16,8 @@ export interface SideModeRule {
16
16
  mode: SideMode;
17
17
  below?: number;
18
18
  }
19
- /** Side modes used unless the implementer chooses others: docked, and a rail below 600px wide */
20
- export declare const DEFAULT_SIDE_MODES = "docked, rail@600";
19
+ /** Side modes used unless the implementer chooses others: docked, and floating below 600px wide */
20
+ export declare const DEFAULT_SIDE_MODES = "docked, floating@600";
21
21
  /** Layout width (CSS pixels) below which the layout counts as narrow, unless the implementer chooses another */
22
22
  export declare const DEFAULT_NARROW_WIDTH = 600;
23
23
  /**
@@ -14,8 +14,8 @@ var SIDE_MODES = [
14
14
  * showsRail("docked"); // false
15
15
  */
16
16
  var showsRail = (mode) => mode === "rail" || mode === "overlay";
17
- /** Side modes used unless the implementer chooses others: docked, and a rail below 600px wide */
18
- var DEFAULT_SIDE_MODES = "docked, rail@600";
17
+ /** Side modes used unless the implementer chooses others: docked, and floating below 600px wide */
18
+ var DEFAULT_SIDE_MODES = "docked, floating@600";
19
19
  /** Layout width (CSS pixels) below which the layout counts as narrow, unless the implementer chooses another */
20
20
  var DEFAULT_NARROW_WIDTH = 600;
21
21
  /**
@@ -1,10 +1,30 @@
1
+ /** The sizes of pill buttons, from small to extra extra large (`pill` is the usual size) */
2
+ export declare const PILL_SIZES: readonly ["pill-s", "pill", "pill-l", "pill-xl", "pill-xxl"];
3
+ /** A pill button size */
4
+ export type PillSize = (typeof PILL_SIZES)[number];
5
+ /** Each pill size's least height, font size and padding, in pixels */
6
+ export declare const PILL_SIZE_STYLES: Readonly<Record<PillSize, {
7
+ height: number;
8
+ fontSize: number;
9
+ padding: string;
10
+ }>>;
11
+ /**
12
+ * CSS declarations giving a pill size (its least height, font size and padding), with text on one centred line.
13
+ *
14
+ * @example
15
+ * pillSizeDeclarations("pill-s"); // "min-height: 24px; font-size: 14px; padding: 2px 8px; line-height: 1;"
16
+ */
17
+ export declare const pillSizeDeclarations: (size: PillSize) => string;
1
18
  /** Windows, menus and dialog buttons: affirmative buttons purple, cancel and close buttons pink */
2
19
  export declare const windows: import("lit").CSSResult;
3
20
  /** Interface controls whose text isn't selected by clicking or dragging (form fields stay selectable) */
4
21
  export declare const noTextSelection: import("lit").CSSResult;
5
22
  /** Icon toggles (a checkbox hidden behind its icon, purple while on) and boxed icon buttons */
6
23
  export declare const iconControls: import("lit").CSSResult;
7
- /** Small purple pill buttons, e.g. "Configure", "New Layer", "Import" */
24
+ /**
25
+ * Purple pill buttons, e.g. "Configure", "New Layer", "Import": `pill` is the usual size; `pill-s`, `pill-l`, `pill-xl`
26
+ * and `pill-xxl` are the others (see `PILL_SIZE_STYLES`).
27
+ */
8
28
  export declare const pills: import("lit").CSSResult;
9
29
  /** The shared styles as text, e.g. for `unsafeCSS` */
10
30
  export declare const WINDOWS_CSS: string;
@@ -1,5 +1,53 @@
1
- import { css } from "lit";
1
+ import { css, unsafeCSS } from "lit";
2
2
  // src/ui/styles/index.ts
3
+ /** The sizes of pill buttons, from small to extra extra large (`pill` is the usual size) */
4
+ var PILL_SIZES = [
5
+ "pill-s",
6
+ "pill",
7
+ "pill-l",
8
+ "pill-xl",
9
+ "pill-xxl"
10
+ ];
11
+ /** Each pill size's least height, font size and padding, in pixels */
12
+ var PILL_SIZE_STYLES = {
13
+ "pill-s": {
14
+ height: 24,
15
+ fontSize: 14,
16
+ padding: "2px 8px"
17
+ },
18
+ pill: {
19
+ height: 32,
20
+ fontSize: 16,
21
+ padding: "8px 16px"
22
+ },
23
+ "pill-l": {
24
+ height: 50,
25
+ fontSize: 20,
26
+ padding: "15px 25px"
27
+ },
28
+ "pill-xl": {
29
+ height: 75,
30
+ fontSize: 24,
31
+ padding: "25px 37px"
32
+ },
33
+ "pill-xxl": {
34
+ height: 100,
35
+ fontSize: 28,
36
+ padding: "36px 50px"
37
+ }
38
+ };
39
+ /**
40
+ * CSS declarations giving a pill size (its least height, font size and padding), with text on one centred line.
41
+ *
42
+ * @example
43
+ * pillSizeDeclarations("pill-s"); // "min-height: 24px; font-size: 14px; padding: 2px 8px; line-height: 1;"
44
+ */
45
+ var pillSizeDeclarations = (size) => {
46
+ const { height, fontSize, padding } = PILL_SIZE_STYLES[size];
47
+ return `min-height: ${height}px; font-size: ${fontSize}px; padding: ${padding}; line-height: 1;`;
48
+ };
49
+ /** The usual pill size, for buttons shaped as pills without a size of their own */
50
+ var PILL = unsafeCSS(pillSizeDeclarations("pill"));
3
51
  /** Windows, menus and dialog buttons: affirmative buttons purple, cancel and close buttons pink */
4
52
  var windows = css`
5
53
  button,
@@ -25,12 +73,15 @@ var windows = css`
25
73
  button[type="submit"],
26
74
  button.cancel,
27
75
  button.close {
28
- min-height: var(--pc-control-size);
29
- padding: var(--pc-space-1) var(--pc-space-3);
76
+ display: inline-flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ box-sizing: border-box;
30
80
  border: 0;
31
81
  border-radius: var(--pc-radius-pill);
32
82
  color: var(--pc-accent-text);
33
83
  font: inherit;
84
+ ${PILL}
34
85
  font-weight: bold;
35
86
  cursor: pointer;
36
87
  }
@@ -159,30 +210,38 @@ var iconControls = css`
159
210
  outline: var(--pc-focus-width) solid var(--pc-focus);
160
211
  }
161
212
  `;
162
- /** Small purple pill buttons, e.g. "Configure", "New Layer", "Import" */
213
+ /** Pill buttons, of each size in `PILL_SIZES` as classes */
214
+ var PILL_SELECTOR = unsafeCSS(["configure", ...PILL_SIZES].map((name) => `button.${name}`).join(", "));
215
+ /** Each pill size's class, giving it its height, font size and padding */
216
+ var PILL_SIZE_CLASSES = unsafeCSS(PILL_SIZES.map((size) => `button.${size} { ${pillSizeDeclarations(size)} }`).join("\n"));
217
+ /**
218
+ * Purple pill buttons, e.g. "Configure", "New Layer", "Import": `pill` is the usual size; `pill-s`, `pill-l`, `pill-xl`
219
+ * and `pill-xxl` are the others (see `PILL_SIZE_STYLES`).
220
+ */
163
221
  var pills = css`
164
- button.configure,
165
- button.pill {
166
- min-height: 30px;
167
- padding: var(--pc-space-1) var(--pc-space-3);
222
+ ${PILL_SELECTOR} {
223
+ display: inline-flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ box-sizing: border-box;
168
227
  border: 0;
169
228
  border-radius: var(--pc-radius-pill);
170
229
  background: var(--pc-accent);
171
230
  color: var(--pc-accent-text);
172
231
  font: inherit;
232
+ ${PILL}
173
233
  font-weight: bold;
174
234
  cursor: pointer;
175
235
  }
176
- button.configure:hover:not(:disabled),
177
- button.pill:hover:not(:disabled) {
236
+ ${PILL_SIZE_CLASSES}
237
+ :is(${PILL_SELECTOR}):hover:not(:disabled) {
178
238
  filter: brightness(1.15);
179
239
  }
180
- button.configure:focus-visible,
181
- button.pill:focus-visible {
240
+ :is(${PILL_SELECTOR}):focus-visible {
182
241
  outline: var(--pc-focus-width) solid var(--pc-focus);
183
242
  outline-offset: 2px;
184
243
  }
185
- button.pill:disabled {
244
+ :is(${PILL_SELECTOR}):disabled {
186
245
  background: var(--pc-disabled);
187
246
  cursor: default;
188
247
  }
@@ -192,4 +251,4 @@ var WINDOWS_CSS = windows.cssText;
192
251
  var NO_TEXT_SELECTION_CSS = noTextSelection.cssText;
193
252
  var ICON_CONTROLS_CSS = iconControls.cssText;
194
253
  var PILLS_CSS = pills.cssText;
195
- export { ICON_CONTROLS_CSS, NO_TEXT_SELECTION_CSS, PILLS_CSS, WINDOWS_CSS, iconControls, noTextSelection, pills, windows };
254
+ export { ICON_CONTROLS_CSS, NO_TEXT_SELECTION_CSS, PILLS_CSS, PILL_SIZES, PILL_SIZE_STYLES, WINDOWS_CSS, iconControls, noTextSelection, pillSizeDeclarations, pills, windows };
@@ -7,6 +7,7 @@
7
7
  "paintCanvas.common.clear": "Clear",
8
8
  "paintCanvas.common.cut": "Cut",
9
9
  "paintCanvas.common.copy": "Copy",
10
+ "paintCanvas.common.copyMerged": "Copy merged",
10
11
  "paintCanvas.common.paste": "Paste",
11
12
  "paintCanvas.common.undo": "Undo",
12
13
  "paintCanvas.common.redo": "Redo",
@@ -16,6 +17,31 @@
16
17
  "paintCanvas.common.height": "Height",
17
18
  "paintCanvas.common.size": "Size",
18
19
  "paintCanvas.common.opacity": "Opacity",
20
+ "paintCanvas.range.low": "{label} (min)",
21
+ "paintCanvas.range.high": "{label} (max)",
22
+ "paintCanvas.profileGraph.point": "Point {number}: {x}, {y}",
23
+ "paintCanvas.profileGraph.remove": "Remove point",
24
+ "paintCanvas.profileGraph.linear": "Sharp corner (linear)",
25
+ "paintCanvas.profileGraph.bezier": "Smooth (bezier cubic)",
26
+ "paintCanvas.profiles.linear": "Linear",
27
+ "paintCanvas.profiles.overweight": "Overweight",
28
+ "paintCanvas.profiles.underweight": "Underweight",
29
+ "paintCanvas.profileEditor.title": "{param} profile graph",
30
+ "paintCanvas.profileEditor.button": "{param}: profile graph",
31
+ "paintCanvas.profileEditor.custom": "Custom",
32
+ "paintCanvas.profileEditor.actions": "Profile graph actions",
33
+ "paintCanvas.profileEditor.new": "New graph",
34
+ "paintCanvas.profileEditor.duplicate": "Duplicate…",
35
+ "paintCanvas.profileEditor.rename": "Rename…",
36
+ "paintCanvas.profileEditor.delete": "Delete…",
37
+ "paintCanvas.profileEditor.reset": "Reset",
38
+ "paintCanvas.profileEditor.name": "Name",
39
+ "paintCanvas.profileEditor.saveHeading": "Save profile graph",
40
+ "paintCanvas.profileEditor.renameHeading": "Rename profile graph",
41
+ "paintCanvas.profileEditor.deleteHeading": "Delete profile graph",
42
+ "paintCanvas.profileEditor.deleteConfirm": "Delete \"{name}\"? This can't be undone.",
43
+ "paintCanvas.profileEditor.replaceHeading": "Replace profile graph",
44
+ "paintCanvas.profileEditor.replaceConfirm": "You already have a profile graph called \"{name}\". Replace it?",
19
45
  "paintCanvas.tool.brush": "Brush",
20
46
  "paintCanvas.tool.eraser": "Eraser",
21
47
  "paintCanvas.tool.move": "Move, scale and rotate",
@@ -88,6 +114,9 @@
88
114
  "paintCanvas.presets.myPresets": "My presets",
89
115
  "paintCanvas.presets.unknownAuthor": "Unknown",
90
116
  "paintCanvas.presets.deleteConfirm": "Delete \"{name}\"? This can't be undone.",
117
+ "paintCanvas.presets.deleteHeading": "Delete preset",
118
+ "paintCanvas.presets.replaceHeading": "Replace preset",
119
+ "paintCanvas.presets.replace": "Replace",
91
120
  "paintCanvas.presets.deleted": "Deleted \"{name}\"",
92
121
  "paintCanvas.presets.deleteFailed": "Couldn't delete \"{name}\"",
93
122
  "paintCanvas.presets.saved": "Saved \"{name}\" to My presets",
@@ -134,6 +163,8 @@
134
163
  "paintCanvas.layers.alphaLock": "Alpha lock",
135
164
  "paintCanvas.layers.blendMode": "Blending mode",
136
165
  "paintCanvas.layers.actions": "Layer actions",
166
+ "paintCanvas.layers.rename": "Rename…",
167
+ "paintCanvas.layers.renameTitle": "Rename layer",
137
168
  "paintCanvas.layers.reorder": "Reorder {name}: drag, or press for actions",
138
169
  "paintCanvas.layers.duplicate": "Duplicate",
139
170
  "paintCanvas.layers.createMask": "Create mask",
@@ -181,6 +212,7 @@
181
212
  "paintCanvas.brushConfig.snapToPixelGrid": "Snap to pixel grid",
182
213
  "paintCanvas.brushConfig.addToPresets": "Add to presets",
183
214
  "paintCanvas.brushConfig.variation": "{param}: {source}",
215
+ "paintCanvas.brushConfig.varyWith": "{param}: vary with",
184
216
  "paintCanvas.layers.mergeDownTitle": "Merge down",
185
217
  "paintCanvas.layers.clear": "Clear…",
186
218
  "paintCanvas.layers.delete": "Delete…",
@@ -260,6 +292,9 @@
260
292
  "paintCanvas.settings.fileIncompatible": "Settings JSON file not compatible",
261
293
  "paintCanvas.settings.fileReadFailed": "Failed to read settings JSON file",
262
294
  "paintCanvas.settings.exportFailed": "Error exporting settings JSON file",
295
+ "paintCanvas.settings.gpu": "Draw with the GPU",
296
+ "paintCanvas.settings.gpuHint": "Try this if drawing is slow. It applies after reloading the page.",
297
+ "paintCanvas.settings.reloadToApply": "Reload the page to apply this change.",
263
298
  "paintCanvas.stats.label": "Canvas details",
264
299
  "paintCanvas.stats.size": "Canvas: {width} × {height} px",
265
300
  "paintCanvas.stats.zoom": "Zoom: {zoom}",
@@ -7,6 +7,7 @@
7
7
  "paintCanvas.common.clear": "Clear",
8
8
  "paintCanvas.common.cut": "Cut",
9
9
  "paintCanvas.common.copy": "Copy",
10
+ "paintCanvas.common.copyMerged": "Copy merged",
10
11
  "paintCanvas.common.paste": "Paste",
11
12
  "paintCanvas.common.undo": "Undo",
12
13
  "paintCanvas.common.redo": "Redo",
@@ -16,6 +17,31 @@
16
17
  "paintCanvas.common.height": "Height",
17
18
  "paintCanvas.common.size": "Size",
18
19
  "paintCanvas.common.opacity": "Opacity",
20
+ "paintCanvas.range.low": "{label} (min)",
21
+ "paintCanvas.range.high": "{label} (max)",
22
+ "paintCanvas.profileGraph.point": "Point {number}: {x}, {y}",
23
+ "paintCanvas.profileGraph.remove": "Remove point",
24
+ "paintCanvas.profileGraph.linear": "Sharp corner (linear)",
25
+ "paintCanvas.profileGraph.bezier": "Smooth (bezier cubic)",
26
+ "paintCanvas.profiles.linear": "Linear",
27
+ "paintCanvas.profiles.overweight": "Overweight",
28
+ "paintCanvas.profiles.underweight": "Underweight",
29
+ "paintCanvas.profileEditor.title": "{param} profile graph",
30
+ "paintCanvas.profileEditor.button": "{param}: profile graph",
31
+ "paintCanvas.profileEditor.custom": "Custom",
32
+ "paintCanvas.profileEditor.actions": "Profile graph actions",
33
+ "paintCanvas.profileEditor.new": "New graph",
34
+ "paintCanvas.profileEditor.duplicate": "Duplicate…",
35
+ "paintCanvas.profileEditor.rename": "Rename…",
36
+ "paintCanvas.profileEditor.delete": "Delete…",
37
+ "paintCanvas.profileEditor.reset": "Reset",
38
+ "paintCanvas.profileEditor.name": "Name",
39
+ "paintCanvas.profileEditor.saveHeading": "Save profile graph",
40
+ "paintCanvas.profileEditor.renameHeading": "Rename profile graph",
41
+ "paintCanvas.profileEditor.deleteHeading": "Delete profile graph",
42
+ "paintCanvas.profileEditor.deleteConfirm": "Delete \"{name}\"? This can't be undone.",
43
+ "paintCanvas.profileEditor.replaceHeading": "Replace profile graph",
44
+ "paintCanvas.profileEditor.replaceConfirm": "You already have a profile graph called \"{name}\". Replace it?",
19
45
  "paintCanvas.tool.brush": "Brush",
20
46
  "paintCanvas.tool.eraser": "Eraser",
21
47
  "paintCanvas.tool.move": "Move, scale and rotate",
@@ -88,6 +114,9 @@
88
114
  "paintCanvas.presets.myPresets": "My presets",
89
115
  "paintCanvas.presets.unknownAuthor": "Unknown",
90
116
  "paintCanvas.presets.deleteConfirm": "Delete \"{name}\"? This can't be undone.",
117
+ "paintCanvas.presets.deleteHeading": "Delete preset",
118
+ "paintCanvas.presets.replaceHeading": "Replace preset",
119
+ "paintCanvas.presets.replace": "Replace",
91
120
  "paintCanvas.presets.deleted": "Deleted \"{name}\"",
92
121
  "paintCanvas.presets.deleteFailed": "Couldn't delete \"{name}\"",
93
122
  "paintCanvas.presets.saved": "Saved \"{name}\" to My presets",
@@ -134,6 +163,8 @@
134
163
  "paintCanvas.layers.alphaLock": "Alpha lock",
135
164
  "paintCanvas.layers.blendMode": "Blending mode",
136
165
  "paintCanvas.layers.actions": "Layer actions",
166
+ "paintCanvas.layers.rename": "Rename…",
167
+ "paintCanvas.layers.renameTitle": "Rename layer",
137
168
  "paintCanvas.layers.reorder": "Reorder {name}: drag, or press for actions",
138
169
  "paintCanvas.layers.duplicate": "Duplicate",
139
170
  "paintCanvas.layers.createMask": "Create mask",
@@ -181,6 +212,7 @@
181
212
  "paintCanvas.brushConfig.snapToPixelGrid": "Snap to pixel grid",
182
213
  "paintCanvas.brushConfig.addToPresets": "Add to presets",
183
214
  "paintCanvas.brushConfig.variation": "{param}: {source}",
215
+ "paintCanvas.brushConfig.varyWith": "{param}: vary with",
184
216
  "paintCanvas.layers.mergeDownTitle": "Merge down",
185
217
  "paintCanvas.layers.clear": "Clear…",
186
218
  "paintCanvas.layers.delete": "Delete…",
@@ -260,6 +292,9 @@
260
292
  "paintCanvas.settings.fileIncompatible": "Settings JSON file not compatible",
261
293
  "paintCanvas.settings.fileReadFailed": "Failed to read settings JSON file",
262
294
  "paintCanvas.settings.exportFailed": "Error exporting settings JSON file",
295
+ "paintCanvas.settings.gpu": "Draw with the GPU",
296
+ "paintCanvas.settings.gpuHint": "Try this if drawing is slow. It applies after reloading the page.",
297
+ "paintCanvas.settings.reloadToApply": "Reload the page to apply this change.",
263
298
  "paintCanvas.stats.label": "Canvas details",
264
299
  "paintCanvas.stats.size": "Canvas: {width} × {height} px",
265
300
  "paintCanvas.stats.zoom": "Zoom: {zoom}",
package/locales/fr.json CHANGED
@@ -7,6 +7,7 @@
7
7
  "paintCanvas.common.clear": "Effacer",
8
8
  "paintCanvas.common.cut": "Couper",
9
9
  "paintCanvas.common.copy": "Copier",
10
+ "paintCanvas.common.copyMerged": "Copier avec fusion",
10
11
  "paintCanvas.common.paste": "Coller",
11
12
  "paintCanvas.common.undo": "Annuler",
12
13
  "paintCanvas.common.redo": "Rétablir",
@@ -16,6 +17,31 @@
16
17
  "paintCanvas.common.height": "Hauteur",
17
18
  "paintCanvas.common.size": "Taille",
18
19
  "paintCanvas.common.opacity": "Opacité",
20
+ "paintCanvas.range.low": "{label} (min)",
21
+ "paintCanvas.range.high": "{label} (max)",
22
+ "paintCanvas.profileGraph.point": "Point {number} : {x}, {y}",
23
+ "paintCanvas.profileGraph.remove": "Supprimer le point",
24
+ "paintCanvas.profileGraph.linear": "Angle net (linéaire)",
25
+ "paintCanvas.profileGraph.bezier": "Lisse (bézier cubique)",
26
+ "paintCanvas.profiles.linear": "Linéaire",
27
+ "paintCanvas.profiles.overweight": "Surpondéré",
28
+ "paintCanvas.profiles.underweight": "Sous-pondéré",
29
+ "paintCanvas.profileEditor.title": "Courbe de profil : {param}",
30
+ "paintCanvas.profileEditor.button": "{param} : courbe de profil",
31
+ "paintCanvas.profileEditor.custom": "Personnalisé",
32
+ "paintCanvas.profileEditor.actions": "Actions de la courbe",
33
+ "paintCanvas.profileEditor.new": "Nouvelle courbe",
34
+ "paintCanvas.profileEditor.duplicate": "Dupliquer…",
35
+ "paintCanvas.profileEditor.rename": "Renommer…",
36
+ "paintCanvas.profileEditor.delete": "Supprimer…",
37
+ "paintCanvas.profileEditor.reset": "Réinitialiser",
38
+ "paintCanvas.profileEditor.name": "Nom",
39
+ "paintCanvas.profileEditor.saveHeading": "Enregistrer la courbe",
40
+ "paintCanvas.profileEditor.renameHeading": "Renommer la courbe",
41
+ "paintCanvas.profileEditor.deleteHeading": "Supprimer la courbe",
42
+ "paintCanvas.profileEditor.deleteConfirm": "Supprimer « {name} » ? Cette action est irréversible.",
43
+ "paintCanvas.profileEditor.replaceHeading": "Remplacer la courbe",
44
+ "paintCanvas.profileEditor.replaceConfirm": "Vous avez déjà une courbe nommée « {name} ». La remplacer ?",
19
45
  "paintCanvas.tool.brush": "Pinceau",
20
46
  "paintCanvas.tool.eraser": "Gomme",
21
47
  "paintCanvas.tool.move": "Déplacer, redimensionner et faire pivoter",
@@ -88,6 +114,9 @@
88
114
  "paintCanvas.presets.myPresets": "Mes préréglages",
89
115
  "paintCanvas.presets.unknownAuthor": "Inconnu",
90
116
  "paintCanvas.presets.deleteConfirm": "Supprimer « {name} » ? Cette action est irréversible.",
117
+ "paintCanvas.presets.deleteHeading": "Supprimer le préréglage",
118
+ "paintCanvas.presets.replaceHeading": "Remplacer le préréglage",
119
+ "paintCanvas.presets.replace": "Remplacer",
91
120
  "paintCanvas.presets.deleted": "« {name} » supprimé",
92
121
  "paintCanvas.presets.deleteFailed": "Impossible de supprimer « {name} »",
93
122
  "paintCanvas.presets.saved": "« {name} » enregistré dans Mes préréglages",
@@ -134,6 +163,8 @@
134
163
  "paintCanvas.layers.alphaLock": "Verrouillage alpha",
135
164
  "paintCanvas.layers.blendMode": "Mode de fusion",
136
165
  "paintCanvas.layers.actions": "Actions du calque",
166
+ "paintCanvas.layers.rename": "Renommer…",
167
+ "paintCanvas.layers.renameTitle": "Renommer le calque",
137
168
  "paintCanvas.layers.reorder": "Réorganiser {name} : faire glisser, ou appuyer pour les actions",
138
169
  "paintCanvas.layers.duplicate": "Dupliquer",
139
170
  "paintCanvas.layers.createMask": "Créer un masque",
@@ -181,6 +212,7 @@
181
212
  "paintCanvas.brushConfig.snapToPixelGrid": "Aligner sur la grille de pixels",
182
213
  "paintCanvas.brushConfig.addToPresets": "Ajouter aux préréglages",
183
214
  "paintCanvas.brushConfig.variation": "{param} : {source}",
215
+ "paintCanvas.brushConfig.varyWith": "{param} : varier selon",
184
216
  "paintCanvas.layers.mergeDownTitle": "Fusionner avec le calque inférieur",
185
217
  "paintCanvas.layers.clear": "Effacer…",
186
218
  "paintCanvas.layers.delete": "Supprimer…",
@@ -260,6 +292,9 @@
260
292
  "paintCanvas.settings.fileIncompatible": "Fichier JSON de réglages incompatible",
261
293
  "paintCanvas.settings.fileReadFailed": "Échec de la lecture du fichier JSON de réglages",
262
294
  "paintCanvas.settings.exportFailed": "Erreur lors de l'exportation du fichier JSON de réglages",
295
+ "paintCanvas.settings.gpu": "Dessiner avec le GPU",
296
+ "paintCanvas.settings.gpuHint": "Essayez ceci si le dessin est lent. Le changement s’applique après le rechargement de la page.",
297
+ "paintCanvas.settings.reloadToApply": "Rechargez la page pour appliquer ce changement.",
263
298
  "paintCanvas.stats.label": "Détails de la toile",
264
299
  "paintCanvas.stats.size": "Toile : {width} × {height} px",
265
300
  "paintCanvas.stats.zoom": "Zoom : {zoom}",