@plone-collective/volto-image-editor 1.0.0-alpha.1

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 (57) hide show
  1. package/.changelog.draft +19 -0
  2. package/.release-it.json +34 -0
  3. package/CHANGELOG.md +27 -0
  4. package/README.md +209 -0
  5. package/babel.config.js +17 -0
  6. package/locales/de/LC_MESSAGES/volto.po +187 -0
  7. package/locales/en/LC_MESSAGES/volto.po +187 -0
  8. package/locales/es/LC_MESSAGES/volto.po +194 -0
  9. package/locales/pt_BR/LC_MESSAGES/volto.po +192 -0
  10. package/locales/volto.pot +189 -0
  11. package/news/.gitkeep +0 -0
  12. package/package.json +50 -0
  13. package/public/.gitkeep +0 -0
  14. package/src/components/.gitkeep +0 -0
  15. package/src/components/ImageEditor/ImageEditor.scss +59 -0
  16. package/src/components/ImageEditor/ImageEditor.tsx +290 -0
  17. package/src/components/ImageEditor/ImageEditorWrapper.scss +13 -0
  18. package/src/components/ImageEditor/ImageEditorWrapper.tsx +91 -0
  19. package/src/components/ImageEditor/components/AdjustableCropperBackground.tsx +60 -0
  20. package/src/components/ImageEditor/components/AdjustableImage.scss +3 -0
  21. package/src/components/ImageEditor/components/AdjustableImage.tsx +85 -0
  22. package/src/components/ImageEditor/components/AdjustablePreviewBackground.tsx +59 -0
  23. package/src/components/ImageEditor/components/Button.scss +30 -0
  24. package/src/components/ImageEditor/components/Button.tsx +27 -0
  25. package/src/components/ImageEditor/components/Navigation.scss +38 -0
  26. package/src/components/ImageEditor/components/Navigation.tsx +153 -0
  27. package/src/components/ImageEditor/components/SettingsModal.scss +369 -0
  28. package/src/components/ImageEditor/components/SettingsModal.tsx +582 -0
  29. package/src/components/ImageEditor/components/Slider.scss +231 -0
  30. package/src/components/ImageEditor/components/Slider.tsx +322 -0
  31. package/src/components/ImageEditor/types/ImageSettings.ts +23 -0
  32. package/src/components/Widgets/FileWidget.scss +14 -0
  33. package/src/components/Widgets/FileWidget.tsx +239 -0
  34. package/src/config/settings.ts +5 -0
  35. package/src/customizations/volto/components/manage/Widgets/FileWidget.jsx +3 -0
  36. package/src/icons/AspectRatioIcons.tsx +39 -0
  37. package/src/icons/BrightnessIcon.tsx +19 -0
  38. package/src/icons/ContrastIcon.tsx +19 -0
  39. package/src/icons/CropIcon.tsx +19 -0
  40. package/src/icons/DownloadIcon.tsx +20 -0
  41. package/src/icons/FlipHorizontalIcon.tsx +21 -0
  42. package/src/icons/FlipVerticalIcon.tsx +27 -0
  43. package/src/icons/HueIcon.tsx +20 -0
  44. package/src/icons/ResetIcon.tsx +19 -0
  45. package/src/icons/ResetRotationIcon.tsx +20 -0
  46. package/src/icons/RestrictionIcons.tsx +19 -0
  47. package/src/icons/RotateLeftIcon.tsx +21 -0
  48. package/src/icons/RotateRightIcon.tsx +21 -0
  49. package/src/icons/SaturationIcon.tsx +20 -0
  50. package/src/icons/SettingsIcon.tsx +21 -0
  51. package/src/icons/StencilIcons.tsx +8 -0
  52. package/src/index.ts +10 -0
  53. package/src/theme/constants.scss +13 -0
  54. package/src/theme/custom.css +82 -0
  55. package/src/theme/mixins.scss +91 -0
  56. package/towncrier.toml +33 -0
  57. package/tsconfig.json +30 -0
@@ -0,0 +1,19 @@
1
+ ## 1.0.0-alpha.1 (2025-10-20)
2
+
3
+ ### Feature
4
+
5
+ - Adds support editing the brightness of an image. @Humanaice
6
+ - Adds support editing the contrast of an image. @Humanaice
7
+ - Adds support editing the hue of an image. @Humanaice
8
+ - Adds support editing the saturation of an image. @Humanaice
9
+ - Adds support for image cropping. @Humanaice
10
+ - Adds support for image flipping. @Humanaice
11
+ - Adds support for rotating the image by 90 degrees clockwise and counter-clockwise. @Humanaice
12
+ - Implement a widget to edit Images in Volto. @Humanaice
13
+
14
+ ### Internal
15
+
16
+ - Adds basic instructions to use GitHub Copilot features. @ericof
17
+ - Implement GitHub Action's workflows. @ericof
18
+
19
+
@@ -0,0 +1,34 @@
1
+ {
2
+ "plugins": {
3
+ "../../core/packages/scripts/prepublish.js": {}
4
+ },
5
+ "hooks": {
6
+ "after:bump": [
7
+ "uvx towncrier build --draft --yes --version ${version} > .changelog.draft",
8
+ "uvx towncrier build --yes --version ${version}",
9
+ "cp ../../README.md ./ && cp CHANGELOG.md ../../CHANGELOG.md",
10
+ "python3 -c 'import json; data = json.load(open(\"../../package.json\")); data[\"version\"] = \"${version}\"; json.dump(data, open(\"../../package.json\", \"w\"), indent=2)'",
11
+ "git add ../../CHANGELOG.md ../../package.json"
12
+ ],
13
+ "after:release": "rm .changelog.draft README.md"
14
+ },
15
+ "npm": {
16
+ "publish": false
17
+ },
18
+ "plonePrePublish": {
19
+ "publish": true
20
+ },
21
+ "git": {
22
+ "changelog": "uvx towncrier build --draft --yes --version 0.0.0",
23
+ "requireUpstream": false,
24
+ "requireCleanWorkingDir": false,
25
+ "commitMessage": "Release ${version}",
26
+ "tagName": "${version}",
27
+ "tagAnnotation": "Release ${version}"
28
+ },
29
+ "github": {
30
+ "release": true,
31
+ "releaseName": "${version}",
32
+ "releaseNotes": "cat .changelog.draft"
33
+ }
34
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # Changelog
2
+
3
+ <!-- You should *NOT* be adding new change log entries to this file.
4
+ You should create a file in the news directory instead.
5
+ For helpful instructions, please see:
6
+ https://6.docs.plone.org/contributing/index.html#contributing-change-log-label
7
+ -->
8
+
9
+ <!-- towncrier release notes start -->
10
+
11
+ ## 1.0.0-alpha.1 (2025-10-20)
12
+
13
+ ### Feature
14
+
15
+ - Adds support editing the brightness of an image. @Humanaice
16
+ - Adds support editing the contrast of an image. @Humanaice
17
+ - Adds support editing the hue of an image. @Humanaice
18
+ - Adds support editing the saturation of an image. @Humanaice
19
+ - Adds support for image cropping. @Humanaice
20
+ - Adds support for image flipping. @Humanaice
21
+ - Adds support for rotating the image by 90 degrees clockwise and counter-clockwise. @Humanaice
22
+ - Implement a widget to edit Images in Volto. @Humanaice
23
+
24
+ ### Internal
25
+
26
+ - Adds basic instructions to use GitHub Copilot features. @ericof
27
+ - Implement GitHub Action's workflows. @ericof
package/README.md ADDED
@@ -0,0 +1,209 @@
1
+ # Volto Image Editor (@plone-collective/volto-image-editor)
2
+
3
+ An image editor, based on [React Advanced Image Cropper](https://www.npmjs.com/package/react-advanced-cropper), to be used with Plone and Volto.
4
+
5
+ [![npm](https://img.shields.io/npm/v/@plone-collective/volto-image-editor)](https://www.npmjs.com/package/@plone-collective/volto-image-editor)
6
+ [![](https://img.shields.io/badge/-Storybook-ff4785?logo=Storybook&logoColor=white&style=flat-square)](https://simplesconsultoria.github.io/volto-image-editor/)
7
+ [![Code analysis checks](https://github.com/collective/volto-image-editor/actions/workflows/main.yml/badge.svg)](https://github.com/collective/volto-image-editor/actions/workflows/main.yml)
8
+
9
+ ## ✨ Features
10
+
11
+
12
+ This add-on modifies Volto's File widget, providing an image editor with the following actions:
13
+
14
+ - Crops the image. Supports many aspect ratios
15
+ - Rotates the image in 90-degree increments
16
+ - Flips the image horizontally or vertically
17
+ - Adjusts the image saturation
18
+ - Adjusts the image brightness
19
+ - Adjusts the image contrast
20
+ - Adjusts the image hue
21
+
22
+
23
+
24
+ ## 🚀 Installation
25
+
26
+ > **Note:** This add-on requires Volto 18 or newer. Follow your project's official workflow for dependency management.
27
+
28
+
29
+ To install this add-on, edit the `package.json` of your policy package (usually located in `packages/<policy-package>/package.json`):
30
+
31
+ ```json
32
+ "addons": [
33
+ "@plone-collective/volto-image-editor"
34
+ ],
35
+ "dependencies": {
36
+ "@plone-collective/volto-image-editor": "*"
37
+ }
38
+ ```
39
+
40
+ After editing, follow your project's standard process to update dependencies and rebuild.
41
+
42
+ ## 🧪 Test Installation
43
+
44
+ Visit http://localhost:3000/ in a browser, log in, and verify that the image editor features are available in the File widget.
45
+
46
+ ## 🌍 Internationalization (i18n)
47
+
48
+ All UI strings in this add-on are translatable. Use the provided `make i18n` command to extract and sync translation messages.
49
+
50
+ ## 🛠️ Development
51
+
52
+
53
+ Development for this add-on uses pnpm workspaces, the latest `mrs-developer`, and Volto core improvements. It is compatible only with pnpm and Volto 18.
54
+
55
+
56
+ ### 📋 Prerequisites
57
+
58
+ - An [operating system](https://6.docs.plone.org/install/create-project-cookieplone.html#prerequisites-for-installation) that runs all the requirements mentioned.
59
+ - [nvm](https://6.docs.plone.org/install/create-project-cookieplone.html#nvm)
60
+ - [Node.js and pnpm](https://6.docs.plone.org/install/create-project.html#node-js) 22
61
+ - [Make](https://6.docs.plone.org/install/create-project-cookieplone.html#make)
62
+ - [Git](https://6.docs.plone.org/install/create-project-cookieplone.html#git)
63
+ - [Docker](https://docs.docker.com/get-started/get-docker/) (optional)
64
+
65
+
66
+ ### 📦 Installation
67
+
68
+ 1. Clone this repository, then change your working directory.
69
+
70
+ ```shell
71
+ git clone git@github.com:collective/volto-image-editor.git
72
+ cd volto-image-editor
73
+ ```
74
+
75
+ 2. Install this code base.
76
+
77
+ ```shell
78
+ make install
79
+ ```
80
+
81
+
82
+ ### 🧰 Make Convenience Commands
83
+
84
+ Run `make help` to list the available commands.
85
+
86
+ ```text
87
+ help Show this help
88
+ install Installs the add-on in a development environment
89
+ start Starts Volto, allowing reloading of the add-on during development
90
+ build Build a production bundle for distribution of the project with the add-on
91
+ i18n Sync i18n
92
+ ci-i18n Check if i18n is not synced
93
+ format Format codebase
94
+ lint Lint, or catch and remove problems, in code base
95
+ release Release the add-on on npmjs.org
96
+ release-dry-run Dry-run the release of the add-on on npmjs.org
97
+ test Run unit tests
98
+ ci-test Run unit tests in CI
99
+ backend-docker-start Starts a Docker-based backend for development
100
+ storybook-start Start Storybook server on port 6006
101
+ storybook-build Build Storybook
102
+ acceptance-frontend-dev-start Start acceptance frontend in development mode
103
+ acceptance-frontend-prod-start Start acceptance frontend in production mode
104
+ acceptance-backend-start Start backend acceptance server
105
+ ci-acceptance-backend-start Start backend acceptance server in headless mode for CI
106
+ acceptance-test Start Cypress in interactive mode
107
+ ci-acceptance-test Run cypress tests in headless mode for CI
108
+ ```
109
+
110
+ ### 🏗️ Development Environment Setup
111
+
112
+ Install package requirements:
113
+
114
+ ```shell
115
+ make install
116
+ ```
117
+
118
+ ### 🚦 Start Developing
119
+
120
+ Start the backend:
121
+
122
+ ```shell
123
+ make backend-docker-start
124
+ ```
125
+
126
+ In a separate terminal session, start the frontend:
127
+
128
+ ```shell
129
+ make start
130
+ ```
131
+
132
+ ### 🧹 Lint Code
133
+
134
+ Run ESLint, Prettier, and Stylelint in analyze mode:
135
+
136
+ ```shell
137
+ make lint
138
+ ```
139
+
140
+ ### 🎨 Format Code
141
+
142
+ Run ESLint, Prettier, and Stylelint in fix mode:
143
+
144
+ ```shell
145
+ make format
146
+ ```
147
+
148
+ ### 🌍 Internationalization (i18n)
149
+
150
+ Extract the i18n messages to locales:
151
+
152
+ ```shell
153
+ make i18n
154
+ ```
155
+
156
+ ### 🧪 Unit Tests
157
+
158
+ Run unit tests:
159
+
160
+ ```shell
161
+ make test
162
+ ```
163
+
164
+ ### 🧪 Run Cypress Tests
165
+
166
+ Run each of these steps in separate terminal sessions:
167
+
168
+ In the first session, start the frontend in development mode:
169
+
170
+ ```shell
171
+ make acceptance-frontend-dev-start
172
+ ```
173
+
174
+ In the second session, start the backend acceptance server:
175
+
176
+ ```shell
177
+ make acceptance-backend-start
178
+ ```
179
+
180
+ In the third session, start the Cypress interactive test runner:
181
+
182
+ ```shell
183
+ make acceptance-test
184
+ ```
185
+
186
+
187
+ ## 📄 License
188
+
189
+ This project is licensed under the MIT license.
190
+
191
+
192
+ ## 🙏 Credits and Acknowledgements
193
+
194
+ The development of this add-on was supported by:
195
+
196
+ <div style="text-align:center;">
197
+ <div>
198
+ <img src="https://raw.githubusercontent.com/collective/volto-image-editor/refs/heads/main/docs/docs/_static/ifpb-icon.svg" height="50px" style="max-height:50px">
199
+ <h3>Instituto Federal da Paraíba</h3>
200
+ </a>
201
+ </div>
202
+ <div>
203
+ <img src="https://raw.githubusercontent.com/collective/volto-image-editor/refs/heads/main/docs/docs/_static/logo-simples.svg" height="50px" style="max-height:50px">
204
+ <h3>Simples Consultoria</h3>
205
+ </a>
206
+ </div>
207
+ </div>
208
+
209
+ Generated using [Cookieplone (0.9.9)](https://github.com/plone/cookieplone) and [cookieplone-templates (62683ae)](https://github.com/plone/cookieplone-templates/commit/62683aec96c2b6454cc32e06e57910fab3d52425) on 2025-10-14 23:13:02.127574. A special thanks to all contributors and supporters!
@@ -0,0 +1,17 @@
1
+ module.exports = function (api) {
2
+ api.cache(true);
3
+ const presets = ['razzle'];
4
+ const plugins = [
5
+ [
6
+ 'react-intl', // React Intl extractor, required for the whole i18n infrastructure to work
7
+ {
8
+ messagesDir: './build/messages/',
9
+ },
10
+ ],
11
+ ];
12
+
13
+ return {
14
+ plugins,
15
+ presets,
16
+ };
17
+ };
@@ -0,0 +1,187 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: \n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: \n"
6
+ "PO-Revision-Date: \n"
7
+ "Last-Translator: \n"
8
+ "Language: de\n"
9
+ "Language-Team: \n"
10
+ "Content-Type: \n"
11
+ "Content-Transfer-Encoding: \n"
12
+ "Plural-Forms: \n"
13
+
14
+ #. Default: "Aspect Ratio"
15
+ #: components/ImageEditor/components/SettingsModal
16
+ msgid "Aspect Ratio"
17
+ msgstr ""
18
+
19
+ #. Default: "Choose a file"
20
+ #: components/Widgets/FileWidget
21
+ msgid "Choose a file"
22
+ msgstr ""
23
+
24
+ #. Default: "Circle"
25
+ #: components/ImageEditor/components/SettingsModal
26
+ msgid "Circle"
27
+ msgstr ""
28
+
29
+ #. Default: "Drop file here to replace the existing file"
30
+ #: components/Widgets/FileWidget
31
+ msgid "Drop file here to replace the existing file"
32
+ msgstr ""
33
+
34
+ #. Default: "Drop file here to upload a new file"
35
+ #: components/Widgets/FileWidget
36
+ msgid "Drop file here to upload a new file"
37
+ msgstr ""
38
+
39
+ #. Default: "Drop files here ..."
40
+ #: components/Widgets/FileWidget
41
+ msgid "Drop files here ..."
42
+ msgstr ""
43
+
44
+ #. Default: "Edit image"
45
+ #: components/ImageEditor/ImageEditorWrapper
46
+ msgid "Edit image"
47
+ msgstr ""
48
+
49
+ #. Default: "Editor Settings"
50
+ #: components/ImageEditor/components/SettingsModal
51
+ msgid "Editor Settings"
52
+ msgstr ""
53
+
54
+ #. Default: "File is not of the accepted type {accept}"
55
+ #: components/Widgets/FileWidget
56
+ msgid "File is not of the accepted type {accept}"
57
+ msgstr ""
58
+
59
+ #. Default: "Fill"
60
+ #: components/ImageEditor/components/SettingsModal
61
+ msgid "Fill Area"
62
+ msgstr ""
63
+
64
+ #. Default: "Fit"
65
+ #: components/ImageEditor/components/SettingsModal
66
+ msgid "Fit Area"
67
+ msgstr ""
68
+
69
+ #. Default: "Free"
70
+ #: components/ImageEditor/components/SettingsModal
71
+ msgid "Free aspect ratio"
72
+ msgstr ""
73
+
74
+ #. Default: "Image Restriction"
75
+ #: components/ImageEditor/components/SettingsModal
76
+ msgid "Image Restriction"
77
+ msgstr ""
78
+
79
+ #. Default: "2:1"
80
+ #: components/ImageEditor/components/SettingsModal
81
+ msgid "Landscape (2:1)"
82
+ msgstr ""
83
+
84
+ #. Default: "Max height"
85
+ #: components/ImageEditor/components/SettingsModal
86
+ msgid "Max height"
87
+ msgstr ""
88
+
89
+ #. Default: "Max width"
90
+ #: components/ImageEditor/components/SettingsModal
91
+ msgid "Max width"
92
+ msgstr ""
93
+
94
+ #. Default: "Maximum Crop Dimensions"
95
+ #: components/ImageEditor/components/SettingsModal
96
+ msgid "Maximum Crop Dimensions"
97
+ msgstr ""
98
+
99
+ #. Default: "Min height"
100
+ #: components/ImageEditor/components/SettingsModal
101
+ msgid "Min height"
102
+ msgstr ""
103
+
104
+ #. Default: "Min width"
105
+ #: components/ImageEditor/components/SettingsModal
106
+ msgid "Min width"
107
+ msgstr ""
108
+
109
+ #. Default: "Minimum Dimensions"
110
+ #: components/ImageEditor/components/SettingsModal
111
+ msgid "Minimum Dimensions"
112
+ msgstr ""
113
+
114
+ #. Default: "9:16"
115
+ #: components/ImageEditor/components/SettingsModal
116
+ msgid "Mobile (9:16)"
117
+ msgstr ""
118
+
119
+ #. Default: "4:3"
120
+ #: components/ImageEditor/components/SettingsModal
121
+ msgid "Monitor (4:3)"
122
+ msgstr ""
123
+
124
+ #. Default: "Free"
125
+ #: components/ImageEditor/components/SettingsModal
126
+ msgid "No Restriction"
127
+ msgstr ""
128
+
129
+ #. Default: "3:4"
130
+ #: components/ImageEditor/components/SettingsModal
131
+ msgid "Photo (3:4)"
132
+ msgstr ""
133
+
134
+ #. Default: "1:2"
135
+ #: components/ImageEditor/components/SettingsModal
136
+ msgid "Portrait (1:2)"
137
+ msgstr ""
138
+
139
+ #. Default: "Rectangle"
140
+ #: components/ImageEditor/components/SettingsModal
141
+ msgid "Rectangle"
142
+ msgstr ""
143
+
144
+ #. Default: "Replace existing file"
145
+ #: components/Widgets/FileWidget
146
+ msgid "Replace existing file"
147
+ msgstr ""
148
+
149
+ #. Default: "Reset rotation and flip"
150
+ #: components/ImageEditor/components/Navigation
151
+ msgid "Reset rotation and flip"
152
+ msgstr ""
153
+
154
+ #. Default: "1:1"
155
+ #: components/ImageEditor/components/SettingsModal
156
+ msgid "Square (1:1)"
157
+ msgstr ""
158
+
159
+ #. Default: "Stencil"
160
+ #: components/ImageEditor/components/SettingsModal
161
+ msgid "Stencil"
162
+ msgstr ""
163
+
164
+ #. Default: "Stencil Grid"
165
+ #: components/ImageEditor/components/SettingsModal
166
+ msgid "Stencil Grid"
167
+ msgstr ""
168
+
169
+ #. Default: "Stencil Type"
170
+ #: components/ImageEditor/components/SettingsModal
171
+ msgid "Stencil Type"
172
+ msgstr ""
173
+
174
+ #. Default: "The file you uploaded exceeded the maximum allowed size of {size} bytes"
175
+ #: components/Widgets/FileWidget
176
+ msgid "The file you uploaded exceeded the maximum allowed size of {size} bytes"
177
+ msgstr ""
178
+
179
+ #. Default: "21:9"
180
+ #: components/ImageEditor/components/SettingsModal
181
+ msgid "Ultra Wide (21:9)"
182
+ msgstr ""
183
+
184
+ #. Default: "16:9"
185
+ #: components/ImageEditor/components/SettingsModal
186
+ msgid "Widescreen (16:9)"
187
+ msgstr ""
@@ -0,0 +1,187 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: \n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: \n"
6
+ "PO-Revision-Date: \n"
7
+ "Last-Translator: \n"
8
+ "Language: en\n"
9
+ "Language-Team: \n"
10
+ "Content-Type: \n"
11
+ "Content-Transfer-Encoding: \n"
12
+ "Plural-Forms: \n"
13
+
14
+ #. Default: "Aspect Ratio"
15
+ #: components/ImageEditor/components/SettingsModal
16
+ msgid "Aspect Ratio"
17
+ msgstr ""
18
+
19
+ #. Default: "Choose a file"
20
+ #: components/Widgets/FileWidget
21
+ msgid "Choose a file"
22
+ msgstr ""
23
+
24
+ #. Default: "Circle"
25
+ #: components/ImageEditor/components/SettingsModal
26
+ msgid "Circle"
27
+ msgstr ""
28
+
29
+ #. Default: "Drop file here to replace the existing file"
30
+ #: components/Widgets/FileWidget
31
+ msgid "Drop file here to replace the existing file"
32
+ msgstr ""
33
+
34
+ #. Default: "Drop file here to upload a new file"
35
+ #: components/Widgets/FileWidget
36
+ msgid "Drop file here to upload a new file"
37
+ msgstr ""
38
+
39
+ #. Default: "Drop files here ..."
40
+ #: components/Widgets/FileWidget
41
+ msgid "Drop files here ..."
42
+ msgstr ""
43
+
44
+ #. Default: "Edit image"
45
+ #: components/ImageEditor/ImageEditorWrapper
46
+ msgid "Edit image"
47
+ msgstr ""
48
+
49
+ #. Default: "Editor Settings"
50
+ #: components/ImageEditor/components/SettingsModal
51
+ msgid "Editor Settings"
52
+ msgstr ""
53
+
54
+ #. Default: "File is not of the accepted type {accept}"
55
+ #: components/Widgets/FileWidget
56
+ msgid "File is not of the accepted type {accept}"
57
+ msgstr ""
58
+
59
+ #. Default: "Fill"
60
+ #: components/ImageEditor/components/SettingsModal
61
+ msgid "Fill Area"
62
+ msgstr ""
63
+
64
+ #. Default: "Fit"
65
+ #: components/ImageEditor/components/SettingsModal
66
+ msgid "Fit Area"
67
+ msgstr ""
68
+
69
+ #. Default: "Free"
70
+ #: components/ImageEditor/components/SettingsModal
71
+ msgid "Free aspect ratio"
72
+ msgstr ""
73
+
74
+ #. Default: "Image Restriction"
75
+ #: components/ImageEditor/components/SettingsModal
76
+ msgid "Image Restriction"
77
+ msgstr ""
78
+
79
+ #. Default: "2:1"
80
+ #: components/ImageEditor/components/SettingsModal
81
+ msgid "Landscape (2:1)"
82
+ msgstr ""
83
+
84
+ #. Default: "Max height"
85
+ #: components/ImageEditor/components/SettingsModal
86
+ msgid "Max height"
87
+ msgstr ""
88
+
89
+ #. Default: "Max width"
90
+ #: components/ImageEditor/components/SettingsModal
91
+ msgid "Max width"
92
+ msgstr ""
93
+
94
+ #. Default: "Maximum Crop Dimensions"
95
+ #: components/ImageEditor/components/SettingsModal
96
+ msgid "Maximum Crop Dimensions"
97
+ msgstr ""
98
+
99
+ #. Default: "Min height"
100
+ #: components/ImageEditor/components/SettingsModal
101
+ msgid "Min height"
102
+ msgstr ""
103
+
104
+ #. Default: "Min width"
105
+ #: components/ImageEditor/components/SettingsModal
106
+ msgid "Min width"
107
+ msgstr ""
108
+
109
+ #. Default: "Minimum Dimensions"
110
+ #: components/ImageEditor/components/SettingsModal
111
+ msgid "Minimum Dimensions"
112
+ msgstr ""
113
+
114
+ #. Default: "9:16"
115
+ #: components/ImageEditor/components/SettingsModal
116
+ msgid "Mobile (9:16)"
117
+ msgstr ""
118
+
119
+ #. Default: "4:3"
120
+ #: components/ImageEditor/components/SettingsModal
121
+ msgid "Monitor (4:3)"
122
+ msgstr ""
123
+
124
+ #. Default: "Free"
125
+ #: components/ImageEditor/components/SettingsModal
126
+ msgid "No Restriction"
127
+ msgstr ""
128
+
129
+ #. Default: "3:4"
130
+ #: components/ImageEditor/components/SettingsModal
131
+ msgid "Photo (3:4)"
132
+ msgstr ""
133
+
134
+ #. Default: "1:2"
135
+ #: components/ImageEditor/components/SettingsModal
136
+ msgid "Portrait (1:2)"
137
+ msgstr ""
138
+
139
+ #. Default: "Rectangle"
140
+ #: components/ImageEditor/components/SettingsModal
141
+ msgid "Rectangle"
142
+ msgstr ""
143
+
144
+ #. Default: "Replace existing file"
145
+ #: components/Widgets/FileWidget
146
+ msgid "Replace existing file"
147
+ msgstr ""
148
+
149
+ #. Default: "Reset rotation and flip"
150
+ #: components/ImageEditor/components/Navigation
151
+ msgid "Reset rotation and flip"
152
+ msgstr ""
153
+
154
+ #. Default: "1:1"
155
+ #: components/ImageEditor/components/SettingsModal
156
+ msgid "Square (1:1)"
157
+ msgstr ""
158
+
159
+ #. Default: "Stencil"
160
+ #: components/ImageEditor/components/SettingsModal
161
+ msgid "Stencil"
162
+ msgstr ""
163
+
164
+ #. Default: "Stencil Grid"
165
+ #: components/ImageEditor/components/SettingsModal
166
+ msgid "Stencil Grid"
167
+ msgstr ""
168
+
169
+ #. Default: "Stencil Type"
170
+ #: components/ImageEditor/components/SettingsModal
171
+ msgid "Stencil Type"
172
+ msgstr ""
173
+
174
+ #. Default: "The file you uploaded exceeded the maximum allowed size of {size} bytes"
175
+ #: components/Widgets/FileWidget
176
+ msgid "The file you uploaded exceeded the maximum allowed size of {size} bytes"
177
+ msgstr ""
178
+
179
+ #. Default: "21:9"
180
+ #: components/ImageEditor/components/SettingsModal
181
+ msgid "Ultra Wide (21:9)"
182
+ msgstr ""
183
+
184
+ #. Default: "16:9"
185
+ #: components/ImageEditor/components/SettingsModal
186
+ msgid "Widescreen (16:9)"
187
+ msgstr ""