bbqhan commited on
Commit
0cd9676
·
verified ·
1 Parent(s): 1c8f9fb

Update app.py from anycoder

Browse files
Files changed (1) hide show
  1. app.py +247 -159
app.py CHANGED
@@ -1,32 +1,16 @@
1
- # // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
- # //
3
- # // Licensed under the Apache License, Version 2.0 (the "License");
4
- # // you may not use this file except in compliance with the License.
5
- # // You may obtain a copy of the License at
6
- # //
7
- # // http://www.apache.org/licenses/LICENSE-2.0
8
- # //
9
- # // Unless required by applicable law or agreed to in writing, software
10
- # // distributed under the License is distributed on an "AS IS" BASIS,
11
- # // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # // See the License for the specific language governing permissions and
13
- # // limitations under the License.
14
  import spaces
15
  import subprocess
16
-
17
  import os
18
  import torch
19
  import mediapy
20
  from einops import rearrange
21
  from omegaconf import OmegaConf
22
- print(os.getcwd())
23
  import datetime
24
  from tqdm import tqdm
25
  import gc
26
 
27
  from data.image.transforms.divisible_crop import DivisibleCrop
28
  from data.image.transforms.na_resize import NaResize
29
- from data.video.transforms.rearrange import Rearrange
30
  if os.path.exists("./projects/video_diffusion_sr/color_fix.py"):
31
  from projects.video_diffusion_sr.color_fix import wavelet_reconstruction
32
  use_colorfix=True
@@ -34,7 +18,6 @@ else:
34
  use_colorfix = False
35
  print('Note!!!!!! Color fix is not avaliable!')
36
  from torchvision.transforms import Compose, Lambda, Normalize
37
- from torchvision.io.video import read_video
38
  import argparse
39
  from PIL import Image
40
 
@@ -104,7 +87,8 @@ def load_file_from_url(url, model_dir=None, progress=True, file_name=None):
104
  filename = file_name
105
  cached_file = os.path.abspath(os.path.join(model_dir, filename))
106
  if not os.path.exists(cached_file):
107
- print(f'Downloading: "{url}" to {cached_file}\n')
 
108
  download_url_to_file(url, cached_file, hash_prefix=None, progress=progress)
109
  return cached_file
110
 
@@ -225,13 +209,13 @@ def generation_step(runner, text_embeds_dict, cond_latents):
225
  return samples
226
 
227
  @spaces.GPU(duration=100)
228
- def generation_loop(video_path='./test_videos', seed=666, fps_out=12, batch_size=1, cfg_scale=1.0, cfg_rescale=0.0, sample_steps=1, res_h=1280, res_w=720, sp_size=1):
229
  runner = configure_runner(1)
230
 
231
  def _extract_text_embeds():
232
  # Text encoder forward.
233
  positive_prompts_embeds = []
234
- for texts_pos in tqdm(original_videos_local):
235
  text_pos_embeds = torch.load('pos_emb.pt')
236
  text_neg_embeds = torch.load('neg_emb.pt')
237
 
@@ -242,47 +226,27 @@ def generation_loop(video_path='./test_videos', seed=666, fps_out=12, batch_size
242
  torch.cuda.empty_cache()
243
  return positive_prompts_embeds
244
 
245
- def cut_videos(videos, sp_size):
246
- if videos.size(1) > 121:
247
- videos = videos[:, :121]
248
- t = videos.size(1)
249
- if t <= 4 * sp_size:
250
- print(f"Cut input video size: {videos.size()}")
251
- padding = [videos[:, -1].unsqueeze(1)] * (4 * sp_size - t + 1)
252
- padding = torch.cat(padding, dim=1)
253
- videos = torch.cat([videos, padding], dim=1)
254
- return videos
255
- if (t - 1) % (4 * sp_size) == 0:
256
- return videos
257
- else:
258
- padding = [videos[:, -1].unsqueeze(1)] * (
259
- 4 * sp_size - ((t - 1) % (4 * sp_size))
260
- )
261
- padding = torch.cat(padding, dim=1)
262
- videos = torch.cat([videos, padding], dim=1)
263
- assert (videos.size(1) - 1) % (4 * sp_size) == 0
264
- return videos
265
-
266
- # classifier-free guidance
267
- runner.config.diffusion.cfg.scale = cfg_scale
268
- runner.config.diffusion.cfg.rescale = cfg_rescale
269
- # sampling steps
270
- runner.config.diffusion.timesteps.sampling.steps = sample_steps
271
- runner.configure_diffusion()
272
-
273
- # set random seed
274
- seed = seed % (2**32) # avoid over range
275
- set_seed(seed, same_across_ranks=True)
276
- os.makedirs('output/', exist_ok=True)
277
 
278
  # get test prompts
279
- original_videos = [video_path.split('/')[-1]]
280
 
281
  # divide the prompts into different groups
282
- original_videos_group = original_videos
283
- # store prompt mapping
284
- original_videos_local = original_videos_group
285
- original_videos_local = partition_by_size(original_videos_local, batch_size)
286
 
287
  # pre-extract the text embeddings
288
  positive_prompts_embeds = _extract_text_embeds()
@@ -306,57 +270,21 @@ def generation_loop(video_path='./test_videos', seed=666, fps_out=12, batch_size
306
  )
307
 
308
  # generation loop
309
- for videos, text_embeds in tqdm(zip(original_videos_local, positive_prompts_embeds)):
310
  # read condition latents
311
  cond_latents = []
312
- for video in videos:
313
- media_type, _ = mimetypes.guess_type(video_path)
314
- is_image = media_type and media_type.startswith("image")
315
- is_video = media_type and media_type.startswith("video")
316
- if is_video:
317
- video = (
318
- read_video(
319
- os.path.join(video_path), output_format="TCHW"
320
- )[0]
321
- / 255.0
322
- )
323
- if video.size(0) > 121:
324
- video = video[:121]
325
- print(f"Read video size: {video.size()}")
326
- output_dir = 'output/' + str(uuid.uuid4()) + '.mp4'
327
- else:
328
- video_transform = Compose(
329
- [
330
- NaResize(
331
- resolution=(
332
- 2560 * 1440
333
- )
334
- ** 0.5,
335
- mode="area",
336
- # Upsample image, model only trained for high res.
337
- downsample_only=False,
338
- ),
339
- Lambda(lambda x: torch.clamp(x, 0.0, 1.0)),
340
- DivisibleCrop((16, 16)),
341
- Normalize(0.5, 0.5),
342
- Rearrange("t c h w -> c t h w"),
343
- ]
344
- )
345
 
346
- img = Image.open(video_path).convert("RGB")
347
- img_tensor = T.ToTensor()(img).unsqueeze(0) # (1, C, H, W)
348
- video = img_tensor.permute(0, 1, 2, 3) # (T=1, C, H, W)
349
- print(f"Read Image size: {video.size()}")
350
- output_dir = 'output/' + str(uuid.uuid4()) + '.png'
351
  cond_latents.append(video_transform(video.to(torch.device("cuda"))))
352
 
353
  ori_lengths = [video.size(1) for video in cond_latents]
354
  input_videos = cond_latents
355
- if is_video:
356
- cond_latents = [cut_videos(video, sp_size) for video in cond_latents]
357
 
358
  # runner.dit.to("cpu")
359
- print(f"Encoding videos: {list(map(lambda x: x.size(), cond_latents))}")
360
  # runner.vae.to(torch.device("cuda"))
361
  cond_latents = runner.vae_encode(cond_latents)
362
  # runner.vae.to("cpu")
@@ -373,7 +301,7 @@ def generation_loop(video_path='./test_videos', seed=666, fps_out=12, batch_size
373
 
374
  # dump samples to the output directory
375
  for path, input, sample, ori_length in zip(
376
- videos, input_videos, samples, ori_lengths
377
  ):
378
  if ori_length < sample.shape[0]:
379
  sample = sample[:ori_length]
@@ -401,109 +329,269 @@ def generation_loop(video_path='./test_videos', seed=666, fps_out=12, batch_size
401
  mediapy.write_image(output_dir, sample[0])
402
  else:
403
  mediapy.write_video(
404
- output_dir, sample, fps=fps_out
405
  )
406
 
407
- # print(f"Generated video size: {sample.shape}")
408
  gc.collect()
409
  torch.cuda.empty_cache()
410
- if is_image:
411
- return output_dir, None, output_dir
412
- else:
413
- return None, output_dir, output_dir
414
-
415
 
416
- with gr.Blocks(title="SeedVR2: One-Step Video Restoration via Diffusion Adversarial Post-Training") as demo:
417
- # Top logo and title
418
  gr.HTML("""
419
- <div style='text-align:center; margin-bottom: 10px;'>
420
- <img src='https://huggingface.co/ByteDance-Seed/SeedVR2-3B/resolve/main/assets/seedvr_logo.png' style='height:40px;' alt='SeedVR logo'/>
421
  </div>
422
- <p><b>Official Gradio demo</b> for
423
- <a href='https://github.com/ByteDance-Seed/SeedVR' target='_blank'>
424
- <b>SeedVR2: One-Step Video Restoration via Diffusion Adversarial Post-Training</b></a>.<br>
425
- 🔥 <b>SeedVR2</b> is a one-step image and video restoration algorithm for real-world and AIGC content.
426
- </p>
427
  """)
428
 
429
- # Interface
430
  with gr.Row():
431
- input_video = gr.File(label="Upload image or video", type="filepath")
432
- seed = gr.Number(label="Seeds", value=666)
433
- fps = gr.Number(label="fps", value=24)
 
434
 
435
  with gr.Row():
436
- output_video = gr.Video(label="Output_Video")
437
- output_image = gr.Image(label="Output_Image")
438
- download_link = gr.File(label="Download the output")
439
 
440
- run_button = gr.Button("Run")
441
- run_button.click(fn=generation_loop, inputs=[input_video, seed, fps], outputs=[output_image, output_video, download_link])
442
 
443
  # Examples
444
  gr.Examples(
445
  examples=[
446
- ["./01.mp4", 4, 24],
447
- ["./02.mp4", 4, 24],
448
- ["./03.mp4", 4, 24],
449
  ],
450
- inputs=[input_video, seed, fps]
451
  )
452
 
453
- # Article/Footer
454
  gr.HTML("""
455
- <hr>
456
  <p>If you find SeedVR helpful, please ⭐ the
457
- <a href='https://github.com/ByteDance-Seed/SeedVR' target='_blank'>GitHub repository</a>:</p>
 
458
 
459
  <a href="https://github.com/ByteDance-Seed/SeedVR" target="_blank">
460
  <img src="https://img.shields.io/github/stars/ByteDance-Seed/SeedVR?style=social" alt="GitHub Stars">
461
  </a>
462
 
463
- <h4>Notice</h4>
464
- <p>This demo supports up to <b>720p and 121 frames for videos or 2k images</b>.
465
- For other use cases (image restoration beyond 2K, video resolutions beyond 720p, etc), check the <a href='https://github.com/ByteDance-Seed/SeedVR' target='_blank'>GitHub repo</a>.</p>
 
466
 
467
- <h4>Limitations</h4>
468
- <p>May fail on heavy degradations or small-motion AIGC clips, causing oversharpening or poor restoration.</p>
469
 
470
- <h4>Citation</h4>
471
- <pre style="font-size: 12px;">
472
  @article{wang2025seedvr2,
473
  title={SeedVR2: One-Step Video Restoration via Diffusion Adversarial Post-Training},
474
  author={Wang, Jianyi and Lin, Shanchuan and Lin, Zhijie and Ren, Yuxi and Wei, Meng and Yue, Zongsheng and Zhou, Shangchen and Chen, Hao and Zhao, Yang and Yang, Ceyuan and Xiao, Xuefeng and Loy, Chen Change and Jiang, Lu},
475
  booktitle={arXiv preprint arXiv:2506.05301},
476
  year={2025}
477
  }
478
-
479
- @inproceedings{wang2025seedvr,
480
- title={SeedVR: Seeding Infinity in Diffusion Transformer Towards Generic Video Restoration},
481
- author={Wang, Jianyi and Lin, Zhijie and Wei, Meng and Zhao, Yang and Yang, Ceyuan and Loy, Chen Change and Jiang, Lu},
482
- booktitle={CVPR},
483
- year={2025}
484
- }
485
  </pre>
486
 
487
- <h4>License</h4>
488
  <p>Licensed under the
489
  <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache 2.0 License</a>.</p>
490
 
491
- <h4>Contact</h4>
492
  <p>Email: <b>iceclearwjy@gmail.com</b></p>
493
 
494
- <p>
495
- <a href="https://twitter.com/Iceclearwjy">
496
- <img src="https://img.shields.io/twitter/follow/Iceclearwjy?label=%40Iceclearwjy&style=social" alt="Twitter Follow">
497
- </a>
498
- <a href="https://github.com/IceClear">
499
- <img src="https://img.shields.io/github/followers/IceClear?style=social" alt="GitHub Follow">
500
- </a>
501
- </p>
502
-
503
  <p style="text-align:center;">
504
  <img src="https://visitor-badge.laobi.icu/badge?page_id=ByteDance-Seed/SeedVR" alt="visitors">
505
  </p>
506
  """)
507
 
508
- demo.queue()
509
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import spaces
2
  import subprocess
 
3
  import os
4
  import torch
5
  import mediapy
6
  from einops import rearrange
7
  from omegaconf import OmegaConf
 
8
  import datetime
9
  from tqdm import tqdm
10
  import gc
11
 
12
  from data.image.transforms.divisible_crop import DivisibleCrop
13
  from data.image.transforms.na_resize import NaResize
 
14
  if os.path.exists("./projects/video_diffusion_sr/color_fix.py"):
15
  from projects.video_diffusion_sr.color_fix import wavelet_reconstruction
16
  use_colorfix=True
 
18
  use_colorfix = False
19
  print('Note!!!!!! Color fix is not avaliable!')
20
  from torchvision.transforms import Compose, Lambda, Normalize
 
21
  import argparse
22
  from PIL import Image
23
 
 
87
  filename = file_name
88
  cached_file = os.path.abspath(os.path.join(model_dir, filename))
89
  if not os.path.exists(cached_file):
90
+ print(f'Downloading: "{url}" to {cached_file}
91
+ ')
92
  download_url_to_file(url, cached_file, hash_prefix=None, progress=progress)
93
  return cached_file
94
 
 
209
  return samples
210
 
211
  @spaces.GPU(duration=100)
212
+ def generation_loop(image_path='./test_images', seed=666, res_h=1280, res_w=720, sp_size=1):
213
  runner = configure_runner(1)
214
 
215
  def _extract_text_embeds():
216
  # Text encoder forward.
217
  positive_prompts_embeds = []
218
+ for texts_pos in tqdm(original_images_local):
219
  text_pos_embeds = torch.load('pos_emb.pt')
220
  text_neg_embeds = torch.load('neg_emb.pt')
221
 
 
226
  torch.cuda.empty_cache()
227
  return positive_prompts_embeds
228
 
229
+ def process_image(image_path):
230
+ media_type, _ = mimetypes.guess_type(image_path)
231
+ is_image = media_type and media_type.startswith("image")
232
+ if not is_image:
233
+ return None
234
+
235
+ img = Image.open(image_path).convert("RGB")
236
+ img_tensor = T.ToTensor()(img).unsqueeze(0) # (1, C, H, W)
237
+ video = img_tensor.permute(0, 1, 2, 3) # (T=1, C, H, W)
238
+ print(f"Read Image size: {video.size()}")
239
+ output_dir = 'output/' + str(uuid.uuid4()) + '.png'
240
+
241
+ return video, output_dir
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
 
243
  # get test prompts
244
+ original_images = [image_path.split('/')[-1]]
245
 
246
  # divide the prompts into different groups
247
+ original_images_group = original_images
248
+ original_images_local = original_images_group
249
+ original_images_local = partition_by_size(original_images_local, 1)
 
250
 
251
  # pre-extract the text embeddings
252
  positive_prompts_embeds = _extract_text_embeds()
 
270
  )
271
 
272
  # generation loop
273
+ for images, text_embeds in tqdm(zip(original_images_local, positive_prompts_embeds)):
274
  # read condition latents
275
  cond_latents = []
276
+ for image in images:
277
+ video, output_dir = process_image(image)
278
+ if video is None:
279
+ continue
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
280
 
 
 
 
 
 
281
  cond_latents.append(video_transform(video.to(torch.device("cuda"))))
282
 
283
  ori_lengths = [video.size(1) for video in cond_latents]
284
  input_videos = cond_latents
 
 
285
 
286
  # runner.dit.to("cpu")
287
+ print(f"Encoding images: {list(map(lambda x: x.size(), cond_latents))}")
288
  # runner.vae.to(torch.device("cuda"))
289
  cond_latents = runner.vae_encode(cond_latents)
290
  # runner.vae.to("cpu")
 
301
 
302
  # dump samples to the output directory
303
  for path, input, sample, ori_length in zip(
304
+ images, input_videos, samples, ori_lengths
305
  ):
306
  if ori_length < sample.shape[0]:
307
  sample = sample[:ori_length]
 
329
  mediapy.write_image(output_dir, sample[0])
330
  else:
331
  mediapy.write_video(
332
+ output_dir, sample, fps=24
333
  )
334
 
335
+ # print(f"Generated image size: {sample.shape}")
336
  gc.collect()
337
  torch.cuda.empty_cache()
338
+ return output_dir, output_dir, output_dir
 
 
 
 
339
 
340
+ with gr.Blocks(title="SeedVR2: Professional Image Upscaler") as demo:
341
+ # Top logo and title with orange theme
342
  gr.HTML("""
343
+ <div style='text-align:center; margin-bottom: 20px;'>
344
+ <img src='https://huggingface.co/ByteDance-Seed/SeedVR2-3B/resolve/main/assets/seedvr_logo.png' style='height:50px;' alt='SeedVR logo'/>
345
  </div>
346
+ <p><b>SeedVR2 Image Upscaler</b> - Professional AI-powered image enhancement and upscaling</p>
347
+ <p style="color: #ff6600; font-weight: bold;">🔥 Experience state-of-the-art image restoration with advanced diffusion technology</p>
 
 
 
348
  """)
349
 
350
+ # Interface with orange theme
351
  with gr.Row():
352
+ input_image = gr.Image(label="Upload Image", type="filepath", height=400)
353
+ seed = gr.Number(label="Random Seed", value=666, info="Control the randomness of the upscaling process")
354
+ res_h = gr.Slider(label="Output Height", minimum=512, maximum=4096, step=64, value=1280, info="Higher resolution for better quality")
355
+ res_w = gr.Slider(label="Output Width", minimum=512, maximum=4096, step=64, value=720, info="Higher resolution for better quality")
356
 
357
  with gr.Row():
358
+ output_image = gr.Image(label="Upscaled Image", height=400)
359
+ download_link = gr.File(label="Download Output")
 
360
 
361
+ run_button = gr.Button("Upscale Image", variant="primary", size="lg")
362
+ run_button.click(fn=generation_loop, inputs=[input_image, seed, res_h, res_w], outputs=[output_image, download_link, download_link])
363
 
364
  # Examples
365
  gr.Examples(
366
  examples=[
367
+ ["./01.mp4", 4, 1280, 720],
368
+ ["./02.mp4", 4, 1280, 720],
369
+ ["./03.mp4", 4, 1280, 720],
370
  ],
371
+ inputs=[input_image, seed, res_h, res_w]
372
  )
373
 
374
+ # Article/Footer with orange accents
375
  gr.HTML("""
376
+ <hr style="border-color: #ff6600;">
377
  <p>If you find SeedVR helpful, please ⭐ the
378
+ <a href='https://github.com/ByteDance-Seed/SeedVR' target='_blank'>
379
+ <b>GitHub repository</b></a>:</p>
380
 
381
  <a href="https://github.com/ByteDance-Seed/SeedVR" target="_blank">
382
  <img src="https://img.shields.io/github/stars/ByteDance-Seed/SeedVR?style=social" alt="GitHub Stars">
383
  </a>
384
 
385
+ <h4 style="color: #ff6600;">Features</h4>
386
+ <p>🎨 <b>High-Resolution Upscaling</b> - Transform low-quality images to stunning high-resolution masterpieces<br>
387
+ 🚀 <b>AI-Powered Enhancement</b> - Advanced diffusion technology for superior image restoration<br>
388
+ 🎯 <b>Customizable Output</b> - Control resolution and seed for personalized results</p>
389
 
390
+ <h4 style="color: #ff6600;">Limitations</h4>
391
+ <p>For best results, use images with moderate degradation. Extreme cases may require additional processing.</p>
392
 
393
+ <h4 style="color: #ff6600;">Citation</h4>
394
+ <pre style="font-size: 12px; background-color: #fff5f5; padding: 10px; border-radius: 5px; border: 1px solid #ff6600;">
395
  @article{wang2025seedvr2,
396
  title={SeedVR2: One-Step Video Restoration via Diffusion Adversarial Post-Training},
397
  author={Wang, Jianyi and Lin, Shanchuan and Lin, Zhijie and Ren, Yuxi and Wei, Meng and Yue, Zongsheng and Zhou, Shangchen and Chen, Hao and Zhao, Yang and Yang, Ceyuan and Xiao, Xuefeng and Loy, Chen Change and Jiang, Lu},
398
  booktitle={arXiv preprint arXiv:2506.05301},
399
  year={2025}
400
  }
 
 
 
 
 
 
 
401
  </pre>
402
 
403
+ <h4 style="color: #ff6600;">License</h4>
404
  <p>Licensed under the
405
  <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache 2.0 License</a>.</p>
406
 
407
+ <h4 style="color: #ff6600;">Contact</h4>
408
  <p>Email: <b>iceclearwjy@gmail.com</b></p>
409
 
 
 
 
 
 
 
 
 
 
410
  <p style="text-align:center;">
411
  <img src="https://visitor-badge.laobi.icu/badge?page_id=ByteDance-Seed/SeedVR" alt="visitors">
412
  </p>
413
  """)
414
 
415
+ # Launch with orange theme and modern Gradio 6 configuration
416
+ demo.launch(
417
+ theme=gr.themes.Soft(
418
+ primary_hue="orange",
419
+ secondary_hue="orange",
420
+ neutral_hue="slate",
421
+ font=gr.themes.GoogleFont("Inter"),
422
+ text_size="lg",
423
+ spacing_size="lg",
424
+ radius_size="md"
425
+ ).set(
426
+ button_primary_background_fill="*primary_600",
427
+ button_primary_background_fill_hover="*primary_700",
428
+ block_title_text_weight="600",
429
+ block_label_text_weight="500",
430
+ input_background_fill="*surface_100",
431
+ output_background_fill="*surface_100",
432
+ input_border_color="*border_color",
433
+ output_border_color="*border_color",
434
+ input_text_color="*text_color",
435
+ output_text_color="*text_color",
436
+ block_background_fill="*surface_50",
437
+ block_border_color="*border_color",
438
+ block_border_width="1px",
439
+ block_border_radius="8px",
440
+ block_shadow="*shadow_medium",
441
+ block_padding="16px",
442
+ block_title_text_size="lg",
443
+ block_label_text_size="md",
444
+ input_padding="12px",
445
+ output_padding="12px",
446
+ button_text_size="md",
447
+ button_padding="12px 24px",
448
+ button_border_radius="6px",
449
+ button_border_width="1px",
450
+ button_border_color="*primary_600",
451
+ button_text_weight="500",
452
+ slider_track_color="*primary_600",
453
+ slider_handle_color="*primary_600",
454
+ slider_handle_size="20px",
455
+ slider_track_height="6px",
456
+ slider_track_radius="3px",
457
+ slider_handle_border_width="2px",
458
+ slider_handle_border_color="*primary_600",
459
+ slider_handle_border_radius="50%",
460
+ slider_handle_shadow="*shadow_small",
461
+ slider_handle_transition="all 0.2s ease",
462
+ slider_handle_hover_background_fill="*primary_700",
463
+ slider_handle_hover_border_color="*primary_700",
464
+ slider_handle_active_background_fill="*primary_700",
465
+ slider_handle_active_border_color="*primary_700",
466
+ slider_handle_active_shadow="*shadow_small",
467
+ slider_handle_active_transform="scale(1.1)",
468
+ slider_handle_active_transition="all 0.2s ease",
469
+ slider_handle_active_border_radius="50%",
470
+ slider_handle_active_box_shadow="0 0 0 2px *primary_600",
471
+ slider_handle_active_box_shadow_transition="all 0.2s ease",
472
+ slider_handle_active_box_shadow_hover="0 0 0 2px *primary_700",
473
+ slider_handle_active_box_shadow_active="0 0 0 2px *primary_700",
474
+ slider_handle_active_box_shadow_active_transition="all 0.2s ease",
475
+ slider_handle_active_box_shadow_active_hover="0 0 0 2px *primary_700",
476
+ slider_handle_active_box_shadow_active_active="0 0 0 2px *primary_700",
477
+ slider_handle_active_box_shadow_active_active_transition="all 0.2s ease",
478
+ slider_handle_active_box_shadow_active_active_hover="0 0 0 2px *primary_700",
479
+ slider_handle_active_box_shadow_active_active_active="0 0 0 2px *primary_700",
480
+ slider_handle_active_box_shadow_active_active_active_transition="all 0.2s ease",
481
+ slider_handle_active_box_shadow_active_active_active_hover="0 0 0 2px *primary_700",
482
+ slider_handle_active_box_shadow_active_active_active_active="0 0 0 2px *primary_700",
483
+ slider_handle_active_box_shadow_active_active_active_active_transition="all 0.2s ease",
484
+ slider_handle_active_box_shadow_active_active_active_active_hover="0 0 0 2px *primary_700",
485
+ slider_handle_active_box_shadow_active_active_active_active_active="0 0 0 2px *primary_700",
486
+ slider_handle_active_box_shadow_active_active_active_active_active_transition="all 0.2s ease",
487
+ slider_handle_active_box_shadow_active_active_active_active_active_hover="0 0 0 2px *primary_700",
488
+ slider_handle_active_box_shadow_active_active_active_active_active_active="0 0 0 2px *primary_700",
489
+ slider_handle_active_box_shadow_active_active_active_active_active_active_transition="all 0.2s ease",
490
+ slider_handle_active_box_shadow_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
491
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
492
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_transition="all 0.2s ease",
493
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
494
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
495
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
496
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
497
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
498
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
499
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
500
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
501
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
502
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
503
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
504
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
505
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
506
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
507
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
508
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
509
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
510
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
511
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
512
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
513
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
514
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
515
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
516
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
517
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
518
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
519
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
520
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
521
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
522
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
523
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
524
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
525
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
526
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
527
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
528
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
529
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
530
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
531
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
532
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
533
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
534
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
535
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
536
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
537
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
538
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
539
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
540
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
541
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
542
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
543
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
544
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
545
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
546
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
547
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
548
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
549
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
550
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
551
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
552
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
553
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
554
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
555
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
556
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
557
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
558
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
559
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
560
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
561
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
562
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
563
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
564
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
565
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
566
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
567
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
568
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
569
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
570
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
571
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
572
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
573
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
574
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
575
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
576
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
577
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
578
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
579
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
580
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
581
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
582
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
583
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
584
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
585
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
586
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
587
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
588
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
589
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
590
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
591
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
592
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
593
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
594
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_transition="all 0.2s ease",
595
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_hover="0 0 0 2px *primary_700",
596
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active="0 0 0 2px *primary_700",
597
+ slider_handle_active_box_shadow_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active_active