Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
834297b
Merge branch 'master' into dev
AUTOMATIC1111 Jul 27, 2024
8e0881d
fix image upscale on cpu
w-e-w Jul 27, 2024
850e149
Merge pull request #16275 from AUTOMATIC1111/fix-image-upscale-on-cpu
AUTOMATIC1111 Jul 27, 2024
4823909
Merge branch 'master' into dev
AUTOMATIC1111 Jul 27, 2024
cbaaf0a
fix NGMS pr typo
hello2565 Jul 31, 2024
9677b09
add break-word for geninfo in pnginfo
gutris1 Aug 7, 2024
f57ec2b
Update stable diffusion 1.5 URL
missionfloyd Sep 4, 2024
d8ad364
Fix typo
changeworld Oct 3, 2024
c9a06d1
Use stable-diffusion-v1-5 repo instead
missionfloyd Oct 8, 2024
1ae073c
Support SDXL v-pred models
catboxanon Oct 19, 2024
907bfb5
add w-e-w and catboxanon to codeowners file
AUTOMATIC1111 Oct 19, 2024
8b19b75
Merge pull request #16567 from AUTOMATIC1111/feat/sdxl-vpred
AUTOMATIC1111 Oct 19, 2024
c462e5a
Merge pull request #16460 from AUTOMATIC1111/sd-1.5-url
catboxanon Oct 19, 2024
bb4cbaf
Merge pull request #16341 from gutris1/devv
w-e-w Oct 19, 2024
c2ce1d3
Automatically enable ztSNR based on existence of key in state_dict
catboxanon Oct 19, 2024
d0b27dc
Merge pull request #16300 from hello2564/fix_NGMS_pr_typo
w-e-w Oct 20, 2024
c2bc187
fix modalImageViewer preview/result flicker (#16426)
w-e-w Oct 20, 2024
65423d2
MIME type text/css (#16406)
w-e-w Oct 20, 2024
6a59766
Add Skip Early CFG to XYZ (#16282)
w-e-w Oct 20, 2024
bb1f391
clarify readme: weget ... chmod +x webui.sh (#16251)
w-e-w Oct 20, 2024
5865da2
Merge pull request #16569 from AUTOMATIC1111/feat/ztsnr-auto
w-e-w Oct 20, 2024
984b952
Fix DAT models download (#16302)
w-e-w Oct 24, 2024
ee0ad5c
chore(js): avoid lots of `Wake Lock is not supported.`
bluelovers Oct 25, 2024
38c8043
Merge pull request #16523 from changeworld/fix/typo
w-e-w Oct 26, 2024
d88a3c1
Merge pull request #16588 from bluelovers/patch-3
w-e-w Oct 27, 2024
df74c3c
threading
Haoming02 Oct 29, 2024
9568622
limit number of simultaneous updates
w-e-w Oct 29, 2024
deb3803
image embedding data cache (#16556)
w-e-w Oct 29, 2024
820fe8d
Allow newline in Extra Network activation text (#16428)
w-e-w Oct 29, 2024
0bf36cf
extra_only / main_ui_only ScriptPostprocessing (#16374)
w-e-w Oct 29, 2024
4ec10bc
Fix postprocessing_enable_in_main_ui ScriptPostprocessing elem_id (#1…
w-e-w Oct 29, 2024
14c6d6c
Disable Hires checkpoint if same as First pass checkpoint (#16269)
w-e-w Oct 29, 2024
f31faf6
pyenv-win compatibility - another approach (#16287)
viking1304 Oct 29, 2024
5948143
addEventListener {passive: false} (#16575)
w-e-w Oct 29, 2024
5206b93
InputAccordion duplicate elem_id handling (#16381)
w-e-w Oct 29, 2024
ac28cad
Fix weighting config for SDXL v-pred
catboxanon Oct 29, 2024
533c7b7
Fix Default system None filter logic (#16309)
w-e-w Oct 29, 2024
28323cf
XYZ option to disable grid (#16416)
w-e-w Oct 29, 2024
e6f36d9
sd_xl_v.yaml: use_checkpoint = False
catboxanon Oct 29, 2024
aa52408
Merge pull request #16606 from AUTOMATIC1111/fix/vweighting
w-e-w Oct 30, 2024
91de919
Warn if WebUI is installed under a dot directory (#16584)
w-e-w Oct 30, 2024
1b16c62
use shared.hf_endpoint (#16611)
w-e-w Oct 30, 2024
ca3bedb
Honor lossless webp compression option in API
catboxanon Nov 1, 2024
7799859
Merge pull request #16620 from AUTOMATIC1111/fix/api-webp-lossless
w-e-w Nov 1, 2024
d2c9efb
Bump safetensors to v0.4.5
catboxanon Nov 19, 2024
957888a
Merge pull request #16667 from AUTOMATIC1111/fix/safetensors-bump
w-e-w Nov 19, 2024
cd869bb
fix prompt-bracket-checker miscounting of literal tokens (#16669)
w-e-w Nov 20, 2024
023454b
fix passing of literal backslash (#16671)
w-e-w Nov 21, 2024
65bd61e
format-dropdown
Haoming02 Nov 27, 2024
539ea39
use DropdownEditable
w-e-w Nov 28, 2024
b425b97
improve img fromat description
w-e-w Nov 28, 2024
0120768
Merge pull request #16687 from Haoming02/dropdown4format
w-e-w Nov 28, 2024
7025a2c
check-for-order
Haoming02 Dec 12, 2024
fbc51fa
skip escaped
Haoming02 Dec 16, 2024
8bf30e3
revert IIFE
Haoming02 Dec 17, 2024
e8c3b1f
Merge pull request #16718 from Haoming02/bracket-checker-order
w-e-w Dec 17, 2024
04903af
Merge pull request #16604 from Haoming02/ext-updt-parallel
w-e-w Dec 17, 2024
b414c62
removed unnecessary import modules.errors
Sanchows Dec 24, 2024
fc0952a
Merge pull request #16745 from Sanchows/removed-unused-import-modules…
w-e-w Dec 24, 2024
f25c3fc
fix sd_vae_explanation (#16748)
w-e-w Dec 24, 2024
7953c57
Update postprocessing_codeformer.py
Neokmi Dec 25, 2024
6577e06
Update postprocessing_gfpgan.py
Neokmi Dec 25, 2024
f113474
lint
w-e-w Dec 25, 2024
1a773bf
Merge pull request #16751 from Neokmi/master
w-e-w Dec 25, 2024
078d04e
ruff <path> is deprecated. Use ruff check <path> (#16753)
w-e-w Dec 27, 2024
fc54833
Authenticated Sysinfo
w-e-w Dec 26, 2024
dc34c00
fix shadows name 'k' from outer scope
w-e-w Dec 27, 2024
95f659e
[Edited] Refactor code to optimize performance
MayureshMore Feb 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/on_pull_request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- name: Install Ruff
run: pip install ruff==0.3.3
- name: Run Ruff
run: ruff .
run: ruff check .
lint-js:
name: eslint
runs-on: ubuntu-latest
Expand Down
13 changes: 1 addition & 12 deletions CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,12 +1 @@
* @AUTOMATIC1111

# if you were managing a localization and were removed from this file, this is because
# the intended way to do localizations now is via extensions. See:
# https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Developing-extensions
# Make a repo with your localization and since you are still listed as a collaborator
# you can add it to the wiki page yourself. This change is because some people complained
# the git commit log is cluttered with things unrelated to almost everyone and
# because I believe this is the best overall for the project to handle localizations almost
# entirely without my oversight.


* @AUTOMATIC1111 @w-e-w @catboxanon
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ python_cmd="python3.11"
2. Navigate to the directory you would like the webui to be installed and execute the following command:
```bash
wget -q https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh
chmod +x webui.sh
```
Or just clone the repo wherever you want:
```bash
Expand Down
98 changes: 98 additions & 0 deletions configs/sd_xl_v.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
model:
target: sgm.models.diffusion.DiffusionEngine
params:
scale_factor: 0.13025
disable_first_stage_autocast: True

denoiser_config:
target: sgm.modules.diffusionmodules.denoiser.DiscreteDenoiser
params:
num_idx: 1000

weighting_config:
target: sgm.modules.diffusionmodules.denoiser_weighting.VWeighting
scaling_config:
target: sgm.modules.diffusionmodules.denoiser_scaling.VScaling
discretization_config:
target: sgm.modules.diffusionmodules.discretizer.LegacyDDPMDiscretization

network_config:
target: sgm.modules.diffusionmodules.openaimodel.UNetModel
params:
adm_in_channels: 2816
num_classes: sequential
use_checkpoint: False
in_channels: 4
out_channels: 4
model_channels: 320
attention_resolutions: [4, 2]
num_res_blocks: 2
channel_mult: [1, 2, 4]
num_head_channels: 64
use_spatial_transformer: True
use_linear_in_transformer: True
transformer_depth: [1, 2, 10] # note: the first is unused (due to attn_res starting at 2) 32, 16, 8 --> 64, 32, 16
context_dim: 2048
spatial_transformer_attn_type: softmax-xformers
legacy: False

conditioner_config:
target: sgm.modules.GeneralConditioner
params:
emb_models:
# crossattn cond
- is_trainable: False
input_key: txt
target: sgm.modules.encoders.modules.FrozenCLIPEmbedder
params:
layer: hidden
layer_idx: 11
# crossattn and vector cond
- is_trainable: False
input_key: txt
target: sgm.modules.encoders.modules.FrozenOpenCLIPEmbedder2
params:
arch: ViT-bigG-14
version: laion2b_s39b_b160k
freeze: True
layer: penultimate
always_return_pooled: True
legacy: False
# vector cond
- is_trainable: False
input_key: original_size_as_tuple
target: sgm.modules.encoders.modules.ConcatTimestepEmbedderND
params:
outdim: 256 # multiplied by two
# vector cond
- is_trainable: False
input_key: crop_coords_top_left
target: sgm.modules.encoders.modules.ConcatTimestepEmbedderND
params:
outdim: 256 # multiplied by two
# vector cond
- is_trainable: False
input_key: target_size_as_tuple
target: sgm.modules.encoders.modules.ConcatTimestepEmbedderND
params:
outdim: 256 # multiplied by two

first_stage_config:
target: sgm.models.autoencoder.AutoencoderKLInferenceWrapper
params:
embed_dim: 4
monitor: val/rec_loss
ddconfig:
attn_type: vanilla-xformers
double_z: true
z_channels: 4
resolution: 256
in_channels: 3
out_ch: 3
ch: 128
ch_mult: [1, 2, 4, 4]
num_res_blocks: 2
attn_resolutions: []
dropout: 0.0
lossconfig:
target: torch.nn.Identity
Original file line number Diff line number Diff line change
Expand Up @@ -816,7 +816,7 @@ onUiLoaded(async() => {
// Increase or decrease brush size based on scroll direction
adjustBrushSize(elemId, e.deltaY);
}
});
}, {passive: false});

// Handle the move event for pan functionality. Updates the panX and panY variables and applies the new transform to the target element.
function handleMoveKeyDown(e) {
Expand Down
2 changes: 1 addition & 1 deletion extensions-builtin/hypertile/hypertile.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""
Hypertile module for splitting attention layers in SD-1.5 U-Net and SD-1.5 VAE
Warn: The patch works well only if the input image has a width and height that are multiples of 128
Original author: @tfernd Github: https://github.com/tfernd/HyperTile
Original author: @tfernd GitHub: https://github.com/tfernd/HyperTile
"""

from __future__ import annotations
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ def ui(self):
with ui_components.InputAccordion(False, label="Auto-sized crop") as enable:
gr.Markdown('Each image is center-cropped with an automatically chosen width and height.')
with gr.Row():
mindim = gr.Slider(minimum=64, maximum=2048, step=8, label="Dimension lower bound", value=384, elem_id="postprocess_multicrop_mindim")
maxdim = gr.Slider(minimum=64, maximum=2048, step=8, label="Dimension upper bound", value=768, elem_id="postprocess_multicrop_maxdim")
mindim = gr.Slider(minimum=64, maximum=2048, step=8, label="Dimension lower bound", value=384, elem_id=self.elem_id_suffix("postprocess_multicrop_mindim"))
maxdim = gr.Slider(minimum=64, maximum=2048, step=8, label="Dimension upper bound", value=768, elem_id=self.elem_id_suffix("postprocess_multicrop_maxdim"))
with gr.Row():
minarea = gr.Slider(minimum=64 * 64, maximum=2048 * 2048, step=1, label="Area lower bound", value=64 * 64, elem_id="postprocess_multicrop_minarea")
maxarea = gr.Slider(minimum=64 * 64, maximum=2048 * 2048, step=1, label="Area upper bound", value=640 * 640, elem_id="postprocess_multicrop_maxarea")
minarea = gr.Slider(minimum=64 * 64, maximum=2048 * 2048, step=1, label="Area lower bound", value=64 * 64, elem_id=self.elem_id_suffix("postprocess_multicrop_minarea"))
maxarea = gr.Slider(minimum=64 * 64, maximum=2048 * 2048, step=1, label="Area upper bound", value=640 * 640, elem_id=self.elem_id_suffix("postprocess_multicrop_maxarea"))
with gr.Row():
objective = gr.Radio(["Maximize area", "Minimize error"], value="Maximize area", label="Resizing objective", elem_id="postprocess_multicrop_objective")
threshold = gr.Slider(minimum=0, maximum=1, step=0.01, label="Error threshold", value=0.1, elem_id="postprocess_multicrop_threshold")
objective = gr.Radio(["Maximize area", "Minimize error"], value="Maximize area", label="Resizing objective", elem_id=self.elem_id_suffix("postprocess_multicrop_objective"))
threshold = gr.Slider(minimum=0, maximum=1, step=0.01, label="Error threshold", value=0.1, elem_id=self.elem_id_suffix("postprocess_multicrop_threshold"))

return {
"enable": enable,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ class ScriptPostprocessingFocalCrop(scripts_postprocessing.ScriptPostprocessing)

def ui(self):
with ui_components.InputAccordion(False, label="Auto focal point crop") as enable:
face_weight = gr.Slider(label='Focal point face weight', value=0.9, minimum=0.0, maximum=1.0, step=0.05, elem_id="postprocess_focal_crop_face_weight")
entropy_weight = gr.Slider(label='Focal point entropy weight', value=0.15, minimum=0.0, maximum=1.0, step=0.05, elem_id="postprocess_focal_crop_entropy_weight")
edges_weight = gr.Slider(label='Focal point edges weight', value=0.5, minimum=0.0, maximum=1.0, step=0.05, elem_id="postprocess_focal_crop_edges_weight")
debug = gr.Checkbox(label='Create debug image', elem_id="train_process_focal_crop_debug")
face_weight = gr.Slider(label='Focal point face weight', value=0.9, minimum=0.0, maximum=1.0, step=0.05, elem_id=self.elem_id_suffix("postprocess_focal_crop_face_weight"))
entropy_weight = gr.Slider(label='Focal point entropy weight', value=0.15, minimum=0.0, maximum=1.0, step=0.05, elem_id=self.elem_id_suffix("postprocess_focal_crop_entropy_weight"))
edges_weight = gr.Slider(label='Focal point edges weight', value=0.5, minimum=0.0, maximum=1.0, step=0.05, elem_id=self.elem_id_suffix("postprocess_focal_crop_edges_weight"))
debug = gr.Checkbox(label='Create debug image', elem_id=self.elem_id_suffix("train_process_focal_crop_debug"))

return {
"enable": enable,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ class ScriptPostprocessingSplitOversized(scripts_postprocessing.ScriptPostproces
def ui(self):
with ui_components.InputAccordion(False, label="Split oversized images") as enable:
with gr.Row():
split_threshold = gr.Slider(label='Threshold', value=0.5, minimum=0.0, maximum=1.0, step=0.05, elem_id="postprocess_split_threshold")
overlap_ratio = gr.Slider(label='Overlap ratio', value=0.2, minimum=0.0, maximum=0.9, step=0.05, elem_id="postprocess_overlap_ratio")
split_threshold = gr.Slider(label='Threshold', value=0.5, minimum=0.0, maximum=1.0, step=0.05, elem_id=self.elem_id_suffix("postprocess_split_threshold"))
overlap_ratio = gr.Slider(label='Overlap ratio', value=0.2, minimum=0.0, maximum=0.9, step=0.05, elem_id=self.elem_id_suffix("postprocess_overlap_ratio"))

return {
"enable": enable,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,69 @@
// Stable Diffusion WebUI - Bracket checker
// By Hingashi no Florin/Bwin4L & @akx
// Stable Diffusion WebUI - Bracket Checker
// By @Bwin4L, @akx, @w-e-w, @Haoming02
// Counts open and closed brackets (round, square, curly) in the prompt and negative prompt text boxes in the txt2img and img2img tabs.
// If there's a mismatch, the keyword counter turns red and if you hover on it, a tooltip tells you what's wrong.

function checkBrackets(textArea, counterElt) {
var counts = {};
(textArea.value.match(/[(){}[\]]/g) || []).forEach(bracket => {
counts[bracket] = (counts[bracket] || 0) + 1;
});
var errors = [];

function checkPair(open, close, kind) {
if (counts[open] !== counts[close]) {
errors.push(
`${open}...${close} - Detected ${counts[open] || 0} opening and ${counts[close] || 0} closing ${kind}.`
);
// If there's a mismatch, the keyword counter turns red, and if you hover on it, a tooltip tells you what's wrong.

function checkBrackets(textArea, counterElem) {
const pairs = [
['(', ')', 'round brackets'],
['[', ']', 'square brackets'],
['{', '}', 'curly brackets']
];

const counts = {};
const errors = new Set();
let i = 0;

while (i < textArea.value.length) {
let char = textArea.value[i];
let escaped = false;
while (char === '\\' && i + 1 < textArea.value.length) {
escaped = !escaped;
i++;
char = textArea.value[i];
}

if (escaped) {
i++;
continue;
}

for (const [open, close, label] of pairs) {
if (char === open) {
counts[label] = (counts[label] || 0) + 1;
} else if (char === close) {
counts[label] = (counts[label] || 0) - 1;
if (counts[label] < 0) {
errors.add(`Incorrect order of ${label}.`);
}
}
}

i++;
}

for (const [open, close, label] of pairs) {
if (counts[label] == undefined) {
continue;
}

if (counts[label] > 0) {
errors.add(`${open} ... ${close} - Detected ${counts[label]} more opening than closing ${label}.`);
} else if (counts[label] < 0) {
errors.add(`${open} ... ${close} - Detected ${-counts[label]} more closing than opening ${label}.`);
}
}

checkPair('(', ')', 'round brackets');
checkPair('[', ']', 'square brackets');
checkPair('{', '}', 'curly brackets');
counterElt.title = errors.join('\n');
counterElt.classList.toggle('error', errors.length !== 0);
counterElem.title = [...errors].join('\n');
counterElem.classList.toggle('error', errors.size !== 0);
}

function setupBracketChecking(id_prompt, id_counter) {
var textarea = gradioApp().querySelector("#" + id_prompt + " > label > textarea");
var counter = gradioApp().getElementById(id_counter);
const textarea = gradioApp().querySelector(`#${id_prompt} > label > textarea`);
const counter = gradioApp().getElementById(id_counter);

if (textarea && counter) {
textarea.addEventListener("input", () => checkBrackets(textarea, counter));
onEdit(`${id_prompt}_BracketChecking`, textarea, 400, () => checkBrackets(textarea, counter));
}
}

Expand Down
2 changes: 1 addition & 1 deletion html/footer.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<div>
<a href="{api_docs}">API</a>
 • 
<a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui">Github</a>
<a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui">GitHub</a>
 • 
<a href="https://gradio.app">Gradio</a>
 • 
Expand Down
2 changes: 1 addition & 1 deletion javascript/contextMenus.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ var contextMenuInit = function() {
e.preventDefault();
}
});
});
}, {passive: false});
});
eventListenerApplied = true;

Expand Down
2 changes: 1 addition & 1 deletion javascript/extraNetworks.js
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ function setupExtraNetworks() {
setupExtraNetworksForTab('img2img');
}

var re_extranet = /<([^:^>]+:[^:]+):[\d.]+>(.*)/;
var re_extranet = /<([^:^>]+:[^:]+):[\d.]+>(.*)/s;
var re_extranet_g = /<([^:^>]+:[^:]+):[\d.]+>/g;

var re_extranet_neg = /\(([^:^>]+:[\d.]+)\)/;
Expand Down
30 changes: 18 additions & 12 deletions javascript/imageviewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ function showModal(event) {
if (modalImage.style.display === 'none') {
lb.style.setProperty('background-image', 'url(' + source.src + ')');
}
updateModalImage();
lb.style.display = "flex";
lb.focus();

Expand All @@ -31,21 +32,26 @@ function negmod(n, m) {
return ((n % m) + m) % m;
}

function updateModalImage() {
const modalImage = gradioApp().getElementById("modalImage");
let currentButton = selected_gallery_button();
let preview = gradioApp().querySelectorAll('.livePreview > img');
if (opts.js_live_preview_in_modal_lightbox && preview.length > 0) {
// show preview image if available
modalImage.src = preview[preview.length - 1].src;
} else if (currentButton?.children?.length > 0 && modalImage.src != currentButton.children[0].src) {
modalImage.src = currentButton.children[0].src;
if (modalImage.style.display === 'none') {
const modal = gradioApp().getElementById("lightboxModal");
modal.style.setProperty('background-image', `url(${modalImage.src})`);
}
}
}

function updateOnBackgroundChange() {
const modalImage = gradioApp().getElementById("modalImage");
if (modalImage && modalImage.offsetParent) {
let currentButton = selected_gallery_button();
let preview = gradioApp().querySelectorAll('.livePreview > img');
if (opts.js_live_preview_in_modal_lightbox && preview.length > 0) {
// show preview image if available
modalImage.src = preview[preview.length - 1].src;
} else if (currentButton?.children?.length > 0 && modalImage.src != currentButton.children[0].src) {
modalImage.src = currentButton.children[0].src;
if (modalImage.style.display === 'none') {
const modal = gradioApp().getElementById("lightboxModal");
modal.style.setProperty('background-image', `url(${modalImage.src})`);
}
}
updateModalImage();
}
}

Expand Down
3 changes: 2 additions & 1 deletion javascript/progressbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,12 @@ function requestProgress(id_task, progressbarContainer, gallery, atEnd, onProgre
var wakeLock = null;

var requestWakeLock = async function() {
if (!opts.prevent_screen_sleep_during_generation || wakeLock) return;
if (!opts.prevent_screen_sleep_during_generation || wakeLock !== null) return;
try {
wakeLock = await navigator.wakeLock.request('screen');
} catch (err) {
console.error('Wake Lock is not supported.');
wakeLock = false;
}
};

Expand Down
2 changes: 1 addition & 1 deletion javascript/resizeHandle.js
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
} else {
R.screenX = evt.changedTouches[0].screenX;
}
});
}, {passive: false});
});

resizeHandle.addEventListener('dblclick', onDoubleClick);
Expand Down
Loading
Loading