@moyarich/console-addon-resizable 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -2
- package/dist/components/ResizableConsoleFrame/ResizableConsoleFrame.d.cts +50 -0
- package/dist/components/ResizableConsoleFrame/ResizableConsoleFrame.d.ts +50 -0
- package/dist/console-addon-resizable.css +293 -0
- package/dist/index.cjs +377 -0
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +377 -0
- package/dist/locales/en.json +8 -0
- package/dist/locales/es.json +8 -0
- package/dist/locales/fr.json +8 -0
- package/dist/locales/pt.json +8 -0
- package/dist/localization.d.cts +3 -0
- package/dist/localization.d.ts +3 -0
- package/dist/styles.css +294 -0
- package/package.json +73 -4
package/dist/index.js
ADDED
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { GripVertical, GripHorizontal, MoveDiagonal2 } from "lucide-react";
|
|
3
|
+
import { useRef, useState, useCallback, useEffect } from "react";
|
|
4
|
+
import { consoleExtensionPoints } from "@moyarich/console-core";
|
|
5
|
+
const horizontal$3 = "Resize console horizontally";
|
|
6
|
+
const horizontalTitle$3 = "Drag to resize horizontally";
|
|
7
|
+
const vertical$3 = "Resize console vertically";
|
|
8
|
+
const verticalTitle$3 = "Drag to resize vertically";
|
|
9
|
+
const both$3 = "Resize console in both directions";
|
|
10
|
+
const bothTitle$3 = "Drag to resize width and height";
|
|
11
|
+
const en = {
|
|
12
|
+
horizontal: horizontal$3,
|
|
13
|
+
horizontalTitle: horizontalTitle$3,
|
|
14
|
+
vertical: vertical$3,
|
|
15
|
+
verticalTitle: verticalTitle$3,
|
|
16
|
+
both: both$3,
|
|
17
|
+
bothTitle: bothTitle$3
|
|
18
|
+
};
|
|
19
|
+
const horizontal$2 = "Redimensionar horizontalmente";
|
|
20
|
+
const horizontalTitle$2 = "Arrastrar para cambiar el ancho";
|
|
21
|
+
const vertical$2 = "Redimensionar verticalmente";
|
|
22
|
+
const verticalTitle$2 = "Arrastrar para cambiar la altura";
|
|
23
|
+
const both$2 = "Redimensionar en ambas direcciones";
|
|
24
|
+
const bothTitle$2 = "Arrastrar para cambiar ancho y altura";
|
|
25
|
+
const es = {
|
|
26
|
+
horizontal: horizontal$2,
|
|
27
|
+
horizontalTitle: horizontalTitle$2,
|
|
28
|
+
vertical: vertical$2,
|
|
29
|
+
verticalTitle: verticalTitle$2,
|
|
30
|
+
both: both$2,
|
|
31
|
+
bothTitle: bothTitle$2
|
|
32
|
+
};
|
|
33
|
+
const horizontal$1 = "Redimensionner horizontalement";
|
|
34
|
+
const horizontalTitle$1 = "Glisser pour modifier la largeur";
|
|
35
|
+
const vertical$1 = "Redimensionner verticalement";
|
|
36
|
+
const verticalTitle$1 = "Glisser pour modifier la hauteur";
|
|
37
|
+
const both$1 = "Redimensionner dans les deux sens";
|
|
38
|
+
const bothTitle$1 = "Glisser pour modifier largeur et hauteur";
|
|
39
|
+
const fr = {
|
|
40
|
+
horizontal: horizontal$1,
|
|
41
|
+
horizontalTitle: horizontalTitle$1,
|
|
42
|
+
vertical: vertical$1,
|
|
43
|
+
verticalTitle: verticalTitle$1,
|
|
44
|
+
both: both$1,
|
|
45
|
+
bothTitle: bothTitle$1
|
|
46
|
+
};
|
|
47
|
+
const horizontal = "Redimensionar o console horizontalmente";
|
|
48
|
+
const horizontalTitle = "Arraste para redimensionar horizontalmente";
|
|
49
|
+
const vertical = "Redimensionar o console verticalmente";
|
|
50
|
+
const verticalTitle = "Arraste para redimensionar verticalmente";
|
|
51
|
+
const both = "Redimensionar o console nas duas direções";
|
|
52
|
+
const bothTitle = "Arraste para alterar a largura e a altura";
|
|
53
|
+
const pt = {
|
|
54
|
+
horizontal,
|
|
55
|
+
horizontalTitle,
|
|
56
|
+
vertical,
|
|
57
|
+
verticalTitle,
|
|
58
|
+
both,
|
|
59
|
+
bothTitle
|
|
60
|
+
};
|
|
61
|
+
const locales = { en, es, fr, pt };
|
|
62
|
+
function resolveAddonMessages(locale = "en", overrides) {
|
|
63
|
+
const tag = locale.replace(/_/g, "-").toLowerCase();
|
|
64
|
+
return {
|
|
65
|
+
...en,
|
|
66
|
+
...locales[tag] ?? locales[tag.split("-")[0]] ?? {},
|
|
67
|
+
...overrides
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function resolveConsoleResizeAxes(direction) {
|
|
71
|
+
return {
|
|
72
|
+
horizontal: direction === "horizontal" || direction === "both" || direction === "inline",
|
|
73
|
+
vertical: direction === "vertical" || direction === "both" || direction === "block"
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function clamp(value, min, max) {
|
|
77
|
+
return Math.min(Math.max(value, min), Math.max(min, max));
|
|
78
|
+
}
|
|
79
|
+
function getCornerCursor(horizontalEdge, verticalEdge) {
|
|
80
|
+
return horizontalEdge === verticalEdge ? "nwse-resize" : "nesw-resize";
|
|
81
|
+
}
|
|
82
|
+
function toCssSize(value) {
|
|
83
|
+
return typeof value === "number" ? `${value}px` : value;
|
|
84
|
+
}
|
|
85
|
+
function ResizableConsoleFrame({
|
|
86
|
+
mode,
|
|
87
|
+
options,
|
|
88
|
+
children
|
|
89
|
+
}) {
|
|
90
|
+
const {
|
|
91
|
+
direction = "both",
|
|
92
|
+
defaultWidth = 720,
|
|
93
|
+
defaultHeight = 300,
|
|
94
|
+
minWidth = 320,
|
|
95
|
+
minHeight = 180,
|
|
96
|
+
maxWidth,
|
|
97
|
+
maxHeight,
|
|
98
|
+
horizontalEdge = "end",
|
|
99
|
+
verticalEdge = "end",
|
|
100
|
+
className = "",
|
|
101
|
+
style,
|
|
102
|
+
onResize,
|
|
103
|
+
locale = "en",
|
|
104
|
+
translations
|
|
105
|
+
} = options;
|
|
106
|
+
const labels = resolveAddonMessages(locale, translations);
|
|
107
|
+
const axes = resolveConsoleResizeAxes(direction);
|
|
108
|
+
const frameRef = useRef(null);
|
|
109
|
+
const dragRef = useRef(null);
|
|
110
|
+
const bodyStyleRef = useRef(
|
|
111
|
+
null
|
|
112
|
+
);
|
|
113
|
+
const [width, setWidth] = useState(defaultWidth);
|
|
114
|
+
const [height, setHeight] = useState(defaultHeight);
|
|
115
|
+
const [activeAxis, setActiveAxis] = useState(null);
|
|
116
|
+
const restoreBodyStyles = useCallback(() => {
|
|
117
|
+
if (typeof document === "undefined" || !bodyStyleRef.current) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
document.body.style.cursor = bodyStyleRef.current.cursor;
|
|
121
|
+
document.body.style.userSelect = bodyStyleRef.current.userSelect;
|
|
122
|
+
bodyStyleRef.current = null;
|
|
123
|
+
}, []);
|
|
124
|
+
const stopResize = useCallback(
|
|
125
|
+
(event) => {
|
|
126
|
+
const drag = dragRef.current;
|
|
127
|
+
if (drag && event && drag.pointerId === event.pointerId && drag.target.hasPointerCapture(event.pointerId)) {
|
|
128
|
+
drag.target.releasePointerCapture(event.pointerId);
|
|
129
|
+
}
|
|
130
|
+
dragRef.current = null;
|
|
131
|
+
setActiveAxis(null);
|
|
132
|
+
restoreBodyStyles();
|
|
133
|
+
},
|
|
134
|
+
[restoreBodyStyles]
|
|
135
|
+
);
|
|
136
|
+
useEffect(
|
|
137
|
+
() => () => {
|
|
138
|
+
dragRef.current = null;
|
|
139
|
+
restoreBodyStyles();
|
|
140
|
+
},
|
|
141
|
+
[restoreBodyStyles]
|
|
142
|
+
);
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
if (!dragRef.current) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
dragRef.current = null;
|
|
148
|
+
setActiveAxis(null);
|
|
149
|
+
restoreBodyStyles();
|
|
150
|
+
}, [direction, restoreBodyStyles]);
|
|
151
|
+
const startResize = (event, axis) => {
|
|
152
|
+
event.preventDefault();
|
|
153
|
+
const frame = frameRef.current;
|
|
154
|
+
if (!frame) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const bounds = frame.getBoundingClientRect();
|
|
158
|
+
const parentBounds = frame.parentElement?.getBoundingClientRect();
|
|
159
|
+
const parentMaxWidth = parentBounds?.width ?? Number.POSITIVE_INFINITY;
|
|
160
|
+
const resolvedMaxWidth = Math.min(
|
|
161
|
+
maxWidth ?? parentMaxWidth,
|
|
162
|
+
parentMaxWidth
|
|
163
|
+
);
|
|
164
|
+
const resolvedMaxHeight = maxHeight ?? Number.POSITIVE_INFINITY;
|
|
165
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
166
|
+
dragRef.current = {
|
|
167
|
+
axis,
|
|
168
|
+
pointerId: event.pointerId,
|
|
169
|
+
target: event.currentTarget,
|
|
170
|
+
startX: event.clientX,
|
|
171
|
+
startY: event.clientY,
|
|
172
|
+
startWidth: bounds.width,
|
|
173
|
+
startHeight: bounds.height,
|
|
174
|
+
maxWidth: resolvedMaxWidth,
|
|
175
|
+
maxHeight: resolvedMaxHeight
|
|
176
|
+
};
|
|
177
|
+
setActiveAxis(axis);
|
|
178
|
+
if (typeof document !== "undefined") {
|
|
179
|
+
bodyStyleRef.current = {
|
|
180
|
+
cursor: document.body.style.cursor,
|
|
181
|
+
userSelect: document.body.style.userSelect
|
|
182
|
+
};
|
|
183
|
+
document.body.style.cursor = axis === "both" ? getCornerCursor(horizontalEdge, verticalEdge) : axis === "horizontal" ? "col-resize" : "row-resize";
|
|
184
|
+
document.body.style.userSelect = "none";
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const moveResize = (event) => {
|
|
188
|
+
const drag = dragRef.current;
|
|
189
|
+
if (!drag || drag.pointerId !== event.pointerId) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
let nextWidth = drag.startWidth;
|
|
193
|
+
let nextHeight = drag.startHeight;
|
|
194
|
+
if (drag.axis === "horizontal" || drag.axis === "both") {
|
|
195
|
+
const directionMultiplier = horizontalEdge === "end" ? 1 : -1;
|
|
196
|
+
nextWidth = clamp(
|
|
197
|
+
drag.startWidth + (event.clientX - drag.startX) * directionMultiplier,
|
|
198
|
+
minWidth,
|
|
199
|
+
drag.maxWidth
|
|
200
|
+
);
|
|
201
|
+
setWidth(nextWidth);
|
|
202
|
+
}
|
|
203
|
+
if (drag.axis === "vertical" || drag.axis === "both") {
|
|
204
|
+
const directionMultiplier = verticalEdge === "end" ? 1 : -1;
|
|
205
|
+
nextHeight = clamp(
|
|
206
|
+
drag.startHeight + (event.clientY - drag.startY) * directionMultiplier,
|
|
207
|
+
minHeight,
|
|
208
|
+
drag.maxHeight
|
|
209
|
+
);
|
|
210
|
+
setHeight(nextHeight);
|
|
211
|
+
}
|
|
212
|
+
onResize?.({
|
|
213
|
+
width: nextWidth,
|
|
214
|
+
height: nextHeight
|
|
215
|
+
});
|
|
216
|
+
};
|
|
217
|
+
const resizeWithKeyboard = (event, axis) => {
|
|
218
|
+
const horizontal2 = axis !== "vertical" && (event.key === "ArrowLeft" || event.key === "ArrowRight");
|
|
219
|
+
const vertical2 = axis !== "horizontal" && (event.key === "ArrowUp" || event.key === "ArrowDown");
|
|
220
|
+
const frame = frameRef.current;
|
|
221
|
+
if (!frame || !horizontal2 && !vertical2) return;
|
|
222
|
+
event.preventDefault();
|
|
223
|
+
event.stopPropagation();
|
|
224
|
+
const bounds = frame.getBoundingClientRect();
|
|
225
|
+
const parentWidth = frame.parentElement?.getBoundingClientRect().width ?? Infinity;
|
|
226
|
+
const step = event.shiftKey ? 50 : 10;
|
|
227
|
+
let nextWidth = bounds.width;
|
|
228
|
+
let nextHeight = bounds.height;
|
|
229
|
+
if (horizontal2) {
|
|
230
|
+
const sign = (event.key === "ArrowRight" ? 1 : -1) * (horizontalEdge === "end" ? 1 : -1);
|
|
231
|
+
nextWidth = clamp(
|
|
232
|
+
bounds.width + sign * step,
|
|
233
|
+
minWidth,
|
|
234
|
+
Math.min(maxWidth ?? parentWidth, parentWidth)
|
|
235
|
+
);
|
|
236
|
+
setWidth(nextWidth);
|
|
237
|
+
}
|
|
238
|
+
if (vertical2) {
|
|
239
|
+
const sign = (event.key === "ArrowDown" ? 1 : -1) * (verticalEdge === "end" ? 1 : -1);
|
|
240
|
+
nextHeight = clamp(
|
|
241
|
+
bounds.height + sign * step,
|
|
242
|
+
minHeight,
|
|
243
|
+
maxHeight ?? Infinity
|
|
244
|
+
);
|
|
245
|
+
setHeight(nextHeight);
|
|
246
|
+
}
|
|
247
|
+
onResize?.({ width: nextWidth, height: nextHeight });
|
|
248
|
+
};
|
|
249
|
+
const renderHorizontalHandle = () => {
|
|
250
|
+
if (!axes.horizontal) {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
return /* @__PURE__ */ jsx(
|
|
254
|
+
"div",
|
|
255
|
+
{
|
|
256
|
+
className: "console-resize-handle",
|
|
257
|
+
role: "separator",
|
|
258
|
+
"aria-orientation": "vertical",
|
|
259
|
+
"aria-valuemin": minWidth,
|
|
260
|
+
"aria-valuemax": maxWidth,
|
|
261
|
+
"aria-valuenow": typeof width === "number" ? width : void 0,
|
|
262
|
+
"aria-label": labels.horizontal,
|
|
263
|
+
title: labels.horizontalTitle,
|
|
264
|
+
tabIndex: 0,
|
|
265
|
+
"data-console-resize-axis": "horizontal",
|
|
266
|
+
onKeyDown: (event) => resizeWithKeyboard(event, "horizontal"),
|
|
267
|
+
"data-active": activeAxis === "horizontal" || void 0,
|
|
268
|
+
onPointerDown: (event) => startResize(event, "horizontal"),
|
|
269
|
+
onPointerMove: moveResize,
|
|
270
|
+
onPointerUp: stopResize,
|
|
271
|
+
onPointerCancel: stopResize,
|
|
272
|
+
children: /* @__PURE__ */ jsx("span", { className: "console-resize-grip", "aria-hidden": "true", children: /* @__PURE__ */ jsx(GripVertical, { size: 14 }) })
|
|
273
|
+
}
|
|
274
|
+
);
|
|
275
|
+
};
|
|
276
|
+
const renderVerticalHandle = () => {
|
|
277
|
+
if (!axes.vertical) {
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
return /* @__PURE__ */ jsx(
|
|
281
|
+
"div",
|
|
282
|
+
{
|
|
283
|
+
className: "console-resize-handle",
|
|
284
|
+
role: "separator",
|
|
285
|
+
"aria-orientation": "horizontal",
|
|
286
|
+
"aria-valuemin": minHeight,
|
|
287
|
+
"aria-valuemax": maxHeight,
|
|
288
|
+
"aria-valuenow": typeof height === "number" ? height : void 0,
|
|
289
|
+
"aria-label": labels.vertical,
|
|
290
|
+
title: labels.verticalTitle,
|
|
291
|
+
tabIndex: 0,
|
|
292
|
+
"data-console-resize-axis": "vertical",
|
|
293
|
+
onKeyDown: (event) => resizeWithKeyboard(event, "vertical"),
|
|
294
|
+
"data-active": activeAxis === "vertical" || void 0,
|
|
295
|
+
onPointerDown: (event) => startResize(event, "vertical"),
|
|
296
|
+
onPointerMove: moveResize,
|
|
297
|
+
onPointerUp: stopResize,
|
|
298
|
+
onPointerCancel: stopResize,
|
|
299
|
+
children: /* @__PURE__ */ jsx("span", { className: "console-resize-grip", "aria-hidden": "true", children: /* @__PURE__ */ jsx(GripHorizontal, { size: 14 }) })
|
|
300
|
+
}
|
|
301
|
+
);
|
|
302
|
+
};
|
|
303
|
+
const renderCornerHandle = () => {
|
|
304
|
+
if (direction !== "both") {
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
return /* @__PURE__ */ jsx(
|
|
308
|
+
"div",
|
|
309
|
+
{
|
|
310
|
+
className: "console-resize-corner-handle",
|
|
311
|
+
role: "separator",
|
|
312
|
+
"aria-label": labels.both,
|
|
313
|
+
title: labels.bothTitle,
|
|
314
|
+
tabIndex: 0,
|
|
315
|
+
"data-console-resize-axis": "both",
|
|
316
|
+
onKeyDown: (event) => resizeWithKeyboard(event, "both"),
|
|
317
|
+
"data-active": activeAxis === "both" || void 0,
|
|
318
|
+
onPointerDown: (event) => startResize(event, "both"),
|
|
319
|
+
onPointerMove: moveResize,
|
|
320
|
+
onPointerUp: stopResize,
|
|
321
|
+
onPointerCancel: stopResize,
|
|
322
|
+
children: /* @__PURE__ */ jsx(MoveDiagonal2, { size: 15, "aria-hidden": "true" })
|
|
323
|
+
}
|
|
324
|
+
);
|
|
325
|
+
};
|
|
326
|
+
return /* @__PURE__ */ jsxs(
|
|
327
|
+
"div",
|
|
328
|
+
{
|
|
329
|
+
ref: frameRef,
|
|
330
|
+
className: `console-resizable-frame ${className}`.trim(),
|
|
331
|
+
"data-console-resize-direction": direction,
|
|
332
|
+
"data-console-resize-horizontal-edge": horizontalEdge,
|
|
333
|
+
"data-console-resize-vertical-edge": verticalEdge,
|
|
334
|
+
"data-console-mode": mode,
|
|
335
|
+
style: {
|
|
336
|
+
"--_console-resizable-width": toCssSize(width),
|
|
337
|
+
"--_console-resizable-height": toCssSize(height),
|
|
338
|
+
"--_console-resizable-min-width": `${minWidth}px`,
|
|
339
|
+
"--_console-resizable-min-height": `${minHeight}px`,
|
|
340
|
+
"--_console-resizable-max-width": maxWidth === void 0 ? "100%" : `${maxWidth}px`,
|
|
341
|
+
"--_console-resizable-max-height": maxHeight === void 0 ? "100%" : `${maxHeight}px`,
|
|
342
|
+
...style
|
|
343
|
+
},
|
|
344
|
+
children: [
|
|
345
|
+
/* @__PURE__ */ jsx("div", { className: "console-resizable-frame-content", children }),
|
|
346
|
+
renderHorizontalHandle(),
|
|
347
|
+
renderVerticalHandle(),
|
|
348
|
+
renderCornerHandle()
|
|
349
|
+
]
|
|
350
|
+
}
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
const RESIZABLE_CONSOLE_ADDON_ID = "@moyarich/console-addon-resizable";
|
|
354
|
+
function createResizableConsoleAddon(options = {}) {
|
|
355
|
+
const decorator = {
|
|
356
|
+
render(context) {
|
|
357
|
+
return /* @__PURE__ */ jsx(ResizableConsoleFrame, { mode: context.mode, options, children: context.renderDefault() });
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
return {
|
|
361
|
+
id: RESIZABLE_CONSOLE_ADDON_ID,
|
|
362
|
+
activate(host) {
|
|
363
|
+
host.extensions.register(
|
|
364
|
+
consoleExtensionPoints.frameDecorator,
|
|
365
|
+
decorator,
|
|
366
|
+
{
|
|
367
|
+
id: `${RESIZABLE_CONSOLE_ADDON_ID}:frame`
|
|
368
|
+
}
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
export {
|
|
374
|
+
RESIZABLE_CONSOLE_ADDON_ID,
|
|
375
|
+
createResizableConsoleAddon,
|
|
376
|
+
resolveConsoleResizeAxes
|
|
377
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"horizontal": "Resize console horizontally",
|
|
3
|
+
"horizontalTitle": "Drag to resize horizontally",
|
|
4
|
+
"vertical": "Resize console vertically",
|
|
5
|
+
"verticalTitle": "Drag to resize vertically",
|
|
6
|
+
"both": "Resize console in both directions",
|
|
7
|
+
"bothTitle": "Drag to resize width and height"
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"horizontal": "Redimensionar horizontalmente",
|
|
3
|
+
"horizontalTitle": "Arrastrar para cambiar el ancho",
|
|
4
|
+
"vertical": "Redimensionar verticalmente",
|
|
5
|
+
"verticalTitle": "Arrastrar para cambiar la altura",
|
|
6
|
+
"both": "Redimensionar en ambas direcciones",
|
|
7
|
+
"bothTitle": "Arrastrar para cambiar ancho y altura"
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"horizontal": "Redimensionner horizontalement",
|
|
3
|
+
"horizontalTitle": "Glisser pour modifier la largeur",
|
|
4
|
+
"vertical": "Redimensionner verticalement",
|
|
5
|
+
"verticalTitle": "Glisser pour modifier la hauteur",
|
|
6
|
+
"both": "Redimensionner dans les deux sens",
|
|
7
|
+
"bothTitle": "Glisser pour modifier largeur et hauteur"
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"horizontal": "Redimensionar o console horizontalmente",
|
|
3
|
+
"horizontalTitle": "Arraste para redimensionar horizontalmente",
|
|
4
|
+
"vertical": "Redimensionar o console verticalmente",
|
|
5
|
+
"verticalTitle": "Arraste para redimensionar verticalmente",
|
|
6
|
+
"both": "Redimensionar o console nas duas direções",
|
|
7
|
+
"bothTitle": "Arraste para alterar a largura e a altura"
|
|
8
|
+
}
|