Compare commits

..

110 Commits

Author SHA1 Message Date
Rodrigo Faselli
33909a51cd Fix external outline Thickness (#14741)
* Fix external outline

* Format and values

* frag_color -> gl_FragColor

* Remove Transform3d& view_matrix

* Clarify rendering comments in 3DScene.cpp

Updated comments to clarify rendering process using stencil buffer.

---------

Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
2026-07-17 09:04:36 +08:00
Alexandre Folle de Menezes
979e56f1d0 Standardize the Unicode chars for unit strings (#14631)
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-07-16 17:37:09 -03:00
SoftFever
f7145c9b37 Update Maschine G-Code for X2D [Update Bambu Lab X2D 0.4 nozzle.json] (#14778)
Update Maschine G-Code according to latest Bambu Studio Version X2D
filament_change gcode: 2026/07/01
X2D layer_change gcode: 2026/07/01
X2D start gcode: 2026/06/05
X2D timelapse gcode: 2026/06/03

# Description

<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
  > * What issue does this PR address or fix?
  > * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-07-16 23:43:59 +08:00
SoftFever
a4d69962fc Merge branch 'main' into patch-4 2026-07-16 23:19:58 +08:00
Heiko Liebscher
671277b381 Update German (de) translation (#14577) 2026-07-16 09:11:09 -03:00
Mqrius
6d1974a662 Restore flow calibration special order, overridable via fill order (#14786) 2026-07-16 09:10:15 -03:00
Noisyfox
5e7ad1ad70 Fix OpenGL framebuffer object support on macOS (#14769)
* Fix OpenGL framebuffer object support on macOS
this enables the outline on macOS

* Revert "Fix OpenGL framebuffer object support on macOS"

This reverts commit 9872708954.

* Enable ARB framebuffer if OpenGL >= 3.0 (OrcaSlicer/OrcaSlicer#14770)

* FIX: plater toolbar image update

jira: STUDIO-12457

Change-Id: Ia855b4bd9bec884d52202f5d8f5cfad9efce0f2f
(cherry picked from commit 474691813b497654ef701fe7073992db366e81a9)

* FIX: thumbinal regen

jira: STUDIO-16732

Change-Id: I4cc4e76b36caf1a41793c1f84ee5e88a44ebdd42
(cherry picked from commit 53f33b7db260005e477842d6459b1b28aa8aa0d8)

* FIX: force update thumbinal once dirty

jira: STUDIO-13041

Change-Id: I770743b53c51351cb3b8a7133140974c75c05364
(cherry picked from commit 96198a12712f21d2b4521b6e3d1caff50bed21ff)

* FIX:thumbnail update

jira: STUDIO-13041 / STUDIO-13304

Change-Id: I9dec25f12454fc8485195cf5dc3feb421b6347c4
(cherry picked from commit cf778dc90f805d3f46e28f8f1d1d5814d3fb4d51)

---------

Co-authored-by: jun.zhang <jun.zhang@bambulab.com>
2026-07-16 11:02:55 +08:00
SoftFever
8d8e4c2835 fix profiles errors spotted with new changes 2026-07-16 00:33:14 +08:00
SoftFever
e5106a23b6 feat: AMS filament drying control (#14637)
## What this does
Ports the AMS filament drying control feature from BambuStudio. Most
work was done by Claude Code with deepseek-v4-pro. Thanks Bambu & CC &
DeepSeek :P


Allows users to start, monitor, and stop AMS-based filament drying
directly from the OrcaSlicer UI for N3F (AMS 2 Pro) and N3S (AMS HT) AMS
units.


Mostly from
c8f70c6ca7

Part of #12091

## Screenshots
<img width="500" alt="image"
src="https://github.com/user-attachments/assets/24f579cb-c67c-4d6e-bf77-c31e018f2f70"
/>
<img width="500" alt="image"
src="https://github.com/user-attachments/assets/74f628aa-6f5f-4150-b2e9-082e4ffc3527"
/>
<img width="500" alt="image"
src="https://github.com/user-attachments/assets/d2f26412-a054-4085-9236-5074a030b001"
/>
<img width="500" alt="image"
src="https://github.com/user-attachments/assets/7beef770-8fbc-4375-b244-e0de44b8db2f"
/>

## Changes
- **Data model:** Added drying status enums (`DryStatus`,
`DrySubStatus`, `CannotDryReason`, etc.), `DrySettings` struct,
`DevFilamentDryingPreset` struct to `DevAms`/`DevFilaSystem`
- **Promoted `DevAmsType`** to a global enum (`EXT_SPOOL=0, AMS=1,
AMS_LITE=2, N3F=3, N3S=4`), renamed `DUMMY` → `EXT_SPOOL`
- **JSON parsing:** Extended `DevFilaSystemParser` to parse drying
status fields from printer status messages
- **Commands:** Added `CtrlAmsStartDryingHour()` and
`CtrlAmsStopDrying()` sending `"ams_filament_drying"` JSON via MQTT
- **Backend utility:** New `DevUtilBackend` class with
`GetFilamentDryingPreset()` for reading filament drying config keys
- **UI dialog:** New `AMSDryControl` dialog with three pages
(status/control, guide, progress) matching BambuStudio behavior
- **Integration:** Wired AMS humidity indicator click to open the drying
dialog for N3F/N3S AMS types
- **Assets:** 12 new drying-related images from BambuStudio
- **Firmware parsing:** Added `is_support_remote_dry` flag parsed from
`fun2` bit 5

## Constraints
- N3F/N3S only — standard AMS and AMS Lite continue to use the existing
humidity popup
- Backward compatible — existing `command_ams_drying_stop()` preserved


<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-07-16 00:04:59 +08:00
SoftFever
c7558e978b Merge branch 'main' into dev/ams-heat 2026-07-15 23:33:12 +08:00
SoftFever
a34310cbda Assign setting_ids to the profiles added for slice validation
The eight presets added in 0545750c1b never got ids: the six iQ processes
had none, and K1 SE 0.8 / V-Core 4 0.8 carried ids copied from the presets
they were duplicated from — K1 SE 0.8 still shared K1C 0.8's id. Regenerated
with scripts/assign_vendor_setting_ids.py; none of the eight have shipped in
a release, so no existing id changes meaning.
2026-07-15 23:16:33 +08:00
SoftFever
0849c44ae0 Merge branch 'main' into dev/ams-heat 2026-07-15 19:45:27 +08:00
Kris Austin
d500ba4e9e test: fix flaky k-medoids goldens added with H2C/A2L support (#14773)
The filament-group golden harness landed with H2C/A2L support (#14685). Its
"FilamentGroup golden regression" / stress_66 case fails intermittently on
Windows x64, on main and on unrelated PRs alike. The test depends on how fast the
runner is.

The k-medoids clustering these goldens exercise is an anytime search bounded by a
3 second wall clock. Every restart is seeded from its own index, so nothing about
it is random. What varies is how many restarts fit in the budget, and the best
cost is a minimum over completed restarts, so a slower runner is never better.
Grading a score produced that way measures the machine as much as the code.

Add a ClusteringBudget struct and let the tests set it. The defaults are the
current 3 seconds and 30 restarts, so slicing behavior is unchanged. A
non-positive timeout removes the wall clock and bounds the search by restart
count alone.

The goldens are then graded under a fixed budget of four restarts, where every
one of them reaches the BambuStudio reference within 3%, so the score becomes a
property of the code. This retires the machine-specific 125103 lock on stress_66.

The default wall-clock path keeps its own test, asserting the grouping is valid
and the search does not run away. It makes no score assertion, because under a
wall clock that number is not a property of the code.

The golden test also checks the run fits in ten times the default wall clock.
Slicing quality depends on how many restarts fit in the budget, so a search an
order of magnitude slower would degrade real groupings while a fixed-budget score
gate stayed green.

The 3% tolerance stays as the parity allowance against the goldens. It also
covers a small spread across standard libraries: the k-medoids search seeds each
restart with std::shuffle, whose algorithm the C++ standard leaves unspecified,
so libstdc++, libc++ and the MSVC STL permute the same seed differently, start
from different medoids, and settle on slightly different groupings, about 3e-4
apart and only on the goldens heavy enough to reach the k-medoids search.
2026-07-15 16:59:55 +08:00
SoftFever
f626382209 Run slice check on arm64 Linux 2026-07-15 16:56:55 +08:00
SoftFever
be165c97de Add --outdir to profile validator to save sliced g-code 2026-07-15 16:52:02 +08:00
Bingo2023
84fa8d31f5 Update Maschine G-Code for X2D [Update Bambu Lab X2D 0.4 nozzle.json]
Update Maschine G-Code according to latest Bambu Studio Version
X2D filament_change gcode:  2026/07/01
X2D layer_change gcode: 2026/07/01
X2D start gcode: 2026/06/05
X2D timelapse gcode: 2026/06/03
2026-07-15 10:51:19 +02:00
SoftFever
8ac478be26 Add real slice validation for all printers (#14771)
# Description

Adds a --slice (-s) mode to the profile validator that slices a
two-colour cube through every shipped printer, expanding all custom
g-code (change_filament_gcode, machine start/end, etc.). This catches
invalid-placeholder / bad-flow / slicing errors that the static JSON
checks and unit tests can't see.

Included:
- Validator: new -s sweep mode; per-profile error attribution in the
log; resolves the synthetic 2nd-filament nozzle-mapping so multi-nozzle
BBL printers (incl. the Direct-Drive+Bowden X2D) validate cleanly.
- CI, two complementary paths:
- check_profiles.yml — runs the sweep on profile-only PRs (nightly
binary).
- build_all.yml — new parallel slice_check_linux job runs it on
engine/src PRs with the PR-built binary (build_all doesn't trigger on
resources/**, so no overlap). Runs off the build's artifact, so it
doesn't lengthen the build leg.
- Profile fixes surfaced by the sweep: Creality, FLSun, Ginger, Qidi,
RatRig, iQ.
- Engine: whitelist BBL firmware T-opcodes (T1001/T65279/T65535) in the
time estimator (log-only, no g-code change); dedupe a
per-filament/per-layer log flood in get_config_index.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-07-15 16:32:09 +08:00
Noisyfox
691fd5892d Trigger auto perspective on 3D mouse rotation (#14768) 2026-07-15 15:06:17 +08:00
SoftFever
d55e7834c8 Fix unit-test segfault on missing shipped profile in sparse CI checkout
The Unit Tests job sparse-checks-out only .github/scripts/tests, so the
baked-in absolute PROFILES_DIR was missing at runtime; the shipped-profile
test then read a non-existent JSON and null-dereferenced in opt_string.
Check out resources/ in the unit-test job, and guard the test helper to
skip when the profile is absent and require the key before dereferencing.
2026-07-15 14:55:41 +08:00
Ian Bassi
1889ffb22a Localization: Improve bot + Update po files (#14748) 2026-07-14 16:03:15 -03:00
Mqrius
c84d5c7943 Add top/bottom surface fill order control (Outward/Inward) for Concentric, Archimedean Chords and Octagram Spiral (#14179)
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-07-14 15:34:13 -03:00
SoftFever
c3f78723fb Run slice-validation sweep on engine PRs in CI 2026-07-15 02:10:16 +08:00
SoftFever
f1fd49c12f Add slice-validation sweep for shipped profiles 2026-07-15 01:49:04 +08:00
Valerii Bokhan
50768e0716 Feature: Retract amount after wipe (#11015)
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-07-14 14:42:16 -03:00
SoftFever
0545750c1b fix profile errors caught in new tests 2026-07-15 00:08:26 +08:00
SoftFever
591d1ac948 fix qidi profile errors 2026-07-15 00:06:54 +08:00
SoftFever
28bb05ac83 Suppress excessive warnings 2026-07-15 00:06:13 +08:00
Noisyfox
8fe7a33ae6 Merge branch 'main' into dev/ams-heat 2026-07-14 17:05:53 +08:00
Kris Austin
3c0338f462 fix: wipe tower height crash triggered by H2C/A2L support (#14758)
The new "Prime-tower visits..." test from #14685 (H2C/A2L support) throws
"Coordinate outside allowed range" at random on CI, on both Windows arm64 and
Linux x86_64. It's an uninitialized read of WipeTowerData::height.

#10780 (H2D/H2S) added a second wipe tower path, generate_new(), that fills in
depth, bbx, brim_width and rib_offset but not height. The older generate() sets
height, and clear() never did, so on the generate_new path it stays garbage.

first_layer_wipe_tower_corners() passes height to get_wipe_tower_cone_base() as
R = tan(cone_angle/2) * height. The stray bytes are usually zero, so R is zero
and the slice is fine, which is why it passes most runs on every platform. When
they aren't zero the cone radius runs past ClipperLib's limit and the slice
throws. Nothing selects for it, so it just flakes around.

#14685's test is the first to exercise this path, so that's when it started
showing up.

Initializing height in clear() fixes it, same as the m_origin fix in #13712. The
BBL generate_new path has no stabilization cone, so height = 0 is right.
2026-07-14 11:22:25 +08:00
Noisyfox
246f2d32bf Merge branch 'main' into dev/ams-heat
# Conflicts:
#	src/libslic3r/Preset.cpp
#	src/libslic3r/PrintConfig.hpp
#	src/slic3r/GUI/DeviceCore/CMakeLists.txt
#	src/slic3r/GUI/DeviceCore/DevDefs.h
#	src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp
#	src/slic3r/GUI/DeviceCore/DevFilaSystem.h
#	src/slic3r/GUI/DeviceCore/DevUtilBackend.cpp
#	src/slic3r/GUI/DeviceCore/DevUtilBackend.h
#	src/slic3r/GUI/DeviceManager.cpp
#	src/slic3r/GUI/DeviceManager.hpp
#	src/slic3r/GUI/SelectMachine.cpp
#	src/slic3r/GUI/SelectMachine.hpp
2026-07-14 10:10:19 +08:00
SoftFever
25216998b3 Add Bambu H2C and A2L machine support (#14685)
# Description

This PR adds full support for Bambu H2C and A2L printers.

All features should work, including pre-heating and cooling.

The Filament Track Switch feature has been ported but hasn't been tested
yet. Feedback is welcome.


# Screenshots/Recordings/Graphs


https://github.com/user-attachments/assets/417f0e32-1967-4536-b732-3c8dc8d4dd4a

<img width="1369" height="999" alt="image"
src="https://github.com/user-attachments/assets/3c3c12ee-69c7-44ef-90f1-badc2a7e803a"
/>

<img width="848" height="580" alt="image"
src="https://github.com/user-attachments/assets/28186a99-979d-4059-b40e-798162c30ce2"
/>

<img width="892" height="551" alt="image"
src="https://github.com/user-attachments/assets/22823921-f22d-4c4d-9b89-43070120d8a6"
/>


## Tests


- [x] Multi-color/material test printing on H2C
- [x] Test printing on A2L
- [x] Test printing on P1S
- [x] Test printing on other tool changers to confirm no regressions
~~- [ ] Optional: test with newer plugin. Note: existing v02.03.00.62
plugin works without any issues~~ Will address as separate task

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-07-14 02:55:08 +08:00
SoftFever
74813b401f Merge remote-tracking branch 'origin/main' into feature/h2c_support_clean
# Conflicts:
#	localization/i18n/fr/OrcaSlicer_fr.po
#	localization/i18n/list.txt
2026-07-14 02:54:20 +08:00
SoftFever
df1e114b72 resolve current_filament_id/current_nozzle_id in layer_change_gcode - enhanced 2026-07-14 02:12:09 +08:00
SoftFever
56f672ecbd resolve current_filament_id/current_nozzle_id in layer_change_gcode (fixes X2D) 2026-07-14 01:26:34 +08:00
SoftFever
9aa90fa6a8 update BBL H2D and X2D profiles 2026-07-14 00:52:54 +08:00
foXaCe
ec96ca17b8 i18n(fr): align walls with the glossary and complete the catalog (#14623) 2026-07-13 13:52:33 -03:00
Alexandre Folle de Menezes
174f043f67 Changes in pt-BR to conform to the translation Glossary (#14629) 2026-07-13 13:17:57 -03:00
Alexandre Folle de Menezes
3395d87240 pt-BR translation fixes after added context (#14679)
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-07-13 13:17:15 -03:00
Felix14_v2
32216dc931 Update OrcaSlicer_ru.po (#14745) 2026-07-13 12:35:30 -03:00
SoftFever
2268544a68 fix test error on Windows ARM64 2026-07-13 23:26:16 +08:00
foXaCe
c41e685a69 i18n: wrap hardcoded GUI strings (undo/redo labels, dialogs, notifications) + FR (#14729) 2026-07-13 12:19:33 -03:00
SoftFever
35ffe49b17 Fix sending print jobs to Bambu H2C printer 2026-07-13 18:13:15 +08:00
Noisyfox
49282858a4 Merge branch 'main' into dev/ams-heat 2026-07-13 14:43:45 +08:00
Rodrigo Faselli
79aa0bd4a2 Merge branch 'main' into feature/h2c_support_clean 2026-07-12 22:00:40 -03:00
SoftFever
30aa7d9557 feat(gui): warn when the hotend rack inventory falls short of the sliced plate
Follow-up to the rack-aware pre-print checks: after the blocking checks
pass, warn (without disabling Send) when the plate needs more matching
hotends than the rack printer currently holds - suggesting rack setup,
a nozzle info refresh, or a re-slice to avoid filament waste - or when
the only matches rely on unreliable nozzle information.

Text-only warning rows; this message board has no refresh or
don't-show-again buttons.
2026-07-13 00:55:52 +08:00
SoftFever
2fecfc291f fix(gui): rack-aware pre-print nozzle checks in the send dialog
A print sliced for a nozzle that sits in the hotend rack (but is not
mounted) was blocked by the send dialog's mounted-nozzle diameter check,
even though the printer fetches the required nozzle itself (#14685).

Consolidate the three mounted-nozzle gates (_is_nozzle_data_valid,
is_nozzle_type_match, _is_same_nozzle_diameters) into a single
CheckErrorExtruderNozzleWithSlicing fed by s_get_slicing_extuder_nozzles,
which collects the plate's per-extruder nozzle requirements (hybrid
extruders contribute one entry per used sub-nozzle flow). The rack
extruder validates against its whole inventory (mounted + rack) with
guidance to calibrate the rack, refresh nozzle info, or re-slice, and
blocks when toolhead + rack are full (no free slot to stow a nozzle).
Other extruders keep the validity/flow/diameter checks against the
mounted nozzle.

Also add CheckErrorRackStatus, which holds Send while the printer is
still reading the rack hotend information, and judge material hardness
for the rack extruder per dispatch-mapped nozzle as a non-blocking
caution (mounted nozzles keep the blocking gate).
2026-07-13 00:55:16 +08:00
SoftFever
e98750e713 fix(engine): real-change-only toolchange ordinals and a single M1020 toolchange command
A dual-nozzle H2C print with support filament hangs at its first nozzle
switch. The emitted file shows the change-filament block's M620 O ordinal
jumping from O1 straight to O230, plus a duplicate "M1020 S<n>" toolchange
command right after every change block. Two causes, fixed together because
they interlock (the ordinal check keys off the same toolchange detection
that suppresses the duplicate):

- append_tcr incremented m_toolchange_count once per prime-tower visit
  (roughly once per layer), while the change-filament template only emits
  its M620 O{toolchange_count + 1} line on real filament changes. With 229
  change-less sparse tower layers below the first support layer, the first
  real change reported ordinal 230. The counter now advances only when the
  expanded change block really contains a toolchange command, and the
  placeholder exposes the upcoming change's ordinal (count + 1). The
  set_extruder path already counted per real change and is unchanged.

- toolchange_prefix() returned "M1020 S" for BBL printers, so the
  custom_gcode_changes_tool() dedup could never match the stock profiles'
  line-leading "T[next_filament_id] ..." commands and the writer's own
  toolchange was appended after every change block on dual-extruder
  machines. The prefix is now the plain "T" (the manual-filament-change tag
  branch stays first), and the M1020 form moved into GCodeWriter::toolchange()
  as an explicit branch that also carries the nozzle:
  "M1020 S<filament> H<nozzle>". The nozzle parameter is signed on purpose:
  the null-safe nozzle lookup legitimately yields -1, matching the stock
  templates' own H-1 convention.

The prefix change also lets the CoolingBuffer recognize the change blocks'
T commands as tool boundaries on BBL printers (its per-filament attribution
previously keyed off the duplicate M1020, or nothing at all on
single-extruder models); its existing out-of-range guard ignores
T1000-class machine commands.

Verification: full suites green (libslic3r 48998 assertions / 169 cases;
fff_print 692 / 65 including three new scenarios - writer emission per
printer kind, dedup + ordinal progression on sequential prints, and a
prime-tower regression scenario verified to fail against the old per-visit
counting). Byte gate: 18 of 20 fixtures bit-identical; the sequential repro
differs by exactly its 3 removed duplicate M1020 lines, deterministic
across two runs. Reslicing the field project that exposed the hang yields
M620 O1 followed by a gapless O2..O59 and zero duplicate M1020 lines.

Co-authored-by: songwei.li <songwei.li@bambulab.com>
2026-07-12 21:30:12 +08:00
SoftFever
3ebd68d959 feat(engine): per-nozzle-variant machine limits in the time estimator
The time estimator's speed/acceleration limits were indexed by time
mode only, reading slot 0 of the per-(extruder x volume-type) arrays
the multi-extruder profiles already carry (H2C 0.4: 8 entries, H2D
0.4: 10). Every move was therefore modelled with the first machine
slot's limits regardless of which nozzle variant was printing -
estimation fidelity only, since emitted feedrates/accelerations are
decided on the slicing side.

Now the estimator resolves the machine slot of the nozzle currently
mounted in the active extruder: the nozzle grouping context is handed
to the processor BEFORE the streaming replay (new member + setter -
deliberately separate from the post-stream result-field handover that
gates the richer change-time model, whose timing is unchanged), the
occupancy recorder is populated on every filament change (bookkeeping
decoupled from the gated time model; recorder writes have no time
effect), and get_machine_config_idx maps (volume type x extruder type
x extruder) to the slot via the printer's variant layout, newly
carried on the processor result. The feedrate/acceleration getters
gain a slot parameter indexing [slot*2 + mode]; jerk and the
print/travel/retract accelerations stay mode-only. Reloaded sliced
projects re-estimate with the result's saved grouping context;
imported bare g-code degrades to slot 0 - the historical read.

M201/M203 write the parsed value into EVERY slot's mode entry (a
firmware envelope change is global), which keeps per-slot reads in
lockstep with the mode-only reads they replace: the fleet emits
envelope lines before any motion, so estimates - hence the estimated
time header, M73 lines, and every other byte - are unchanged (20/20
pinned-slice byte gate bit-identical, incl. the sequential repro
sliced twice). Fidelity improves where envelope emission is off or a
migrating per-layer plan moves filaments across variants.

Tests: a stub-driven processor case proving the slot follows the
active nozzle through the exact production path (T..H.. commands,
fallback recorder bookkeeping, 4x time ratio on the slow variant),
that emitted M201/M203 reach every slot, and that a missing context
degrades to slot 0. Suites green (libslic3r 48998/169, fff_print
667/62).
2026-07-12 14:48:45 +08:00
SoftFever
582017235c feat(engine): resolve per-variant config columns for raw filament reads on the export path
When a per-layer nozzle grouping migrates a filament across nozzle
variants, the write-back turns two groups of config arrays from
filament-indexed into column-indexed: the per-variant filament options
(one column per variant a filament uses) and the merged extruder
retract overrides (resized to the column count by apply_override).
Export-path readers that still indexed them with the raw filament id
read a neighbor's column for every filament ordered after a migrating
one: toolchange/standby temperatures (M104/M109), retraction lengths
and feedrates, wipe distance, z-hop types, air-filtration keys, and -
through the Extruder's cached flow term - the extrusion E of every
move.

Now every such read resolves its column through the existing
layer-aware resolver (get_filament_config_index ->
Print::get_filament_config_indx), which returns the raw filament id
whenever no per-layer grouping result is published, so static prints
are byte-inert by construction. The Extruder itself has no layer
knowledge, so it gains an injected config column (set_config_index,
default = filament id) that the generator refreshes at the only two
resolution-changing events - layer change and writer toolchange - and
that re-syncs the cached e_per_mm3 flow term. Old-filament reads
resolve at the current layer, which is safe because the per-layer maps
are gap-filled carry-forward. Whole-array placeholder copies
(toolchange temperature overrides) are rebuilt in filament order,
mirroring the existing per-variant placeholder remap. The resolvers
move to the public section so non-friend helpers (ooze prevention) can
resolve too.

Documented, deliberately unchanged: the wipe tower's per-filament
parameter rows (no layer dimension; tower x per-layer grouping is a
follow-up), travel_slope's physical-extruder read, estimator pre-heat
bookkeeping temps, and index-0 header diagnostics.

Verification: new Extruder column-injection scenario (defaults, column
follow + flow-cache rescale, filament-indexed reads unaffected, reset
semantics) and a migrating write-back case proving the column shift for
filaments ordered after a migrator and the resolver tracking it (11 +
14 assertions); suites green (libslic3r 48998/169, fff_print 655/61);
20/20 pinned-slice byte gate bit-identical (incl. sequential repro x2
deterministic).
2026-07-12 14:30:39 +08:00
SoftFever
abbd420f2a feat(engine): write per-variant filament values back for selector regroups
When the per-layer filament selector (enable_filament_dynamic_map)
migrates a filament across nozzle variants (e.g. Standard -> High Flow),
the config write-back only stored the derived extruder map; every
per-variant filament value (retraction, nozzle temperature, flow,
flush...) kept the numbers resolved from the pre-slice static mapping.

Now both dynamic write-back sites (the by-layer branch and the
sequential stitch) branch on the result's dynamic support. Migrating
results run a mixed-filament expansion that regathers every
filament_options_with_variant key from the pristine per-variant
superset, giving a migrating filament one config slot per (extruder
type x nozzle volume type) it lands on - filament_self_index,
filament_extruder_variant, and all value arrays grow in lockstep - and
recompute the retract overrides with per-slot machine indices so a nil
slot falls back to its own variant's machine value. Non-migrating
dynamic results take the merged three-map write-back so re-applies
reproduce from the written maps. Unrouted filaments resolve from the
result's own default map, so slot resolution never depends on
filament_map round-tripping through the plate config.

Print::apply reproduces the identical expansion from the persisted
group result (shared dedupe helper, expansion function, and slot
indices on both sides): the expanded keys sit in the psWipeTower /
psGCodeExport invalidate lists, so without the reproduction every
re-apply after a selector slice would diff non-empty and permanently
invalidate. cal_non_support_filaments now resolves the extruder per
layer from the published result for dynamic groupings.

filament_map_2 keeps its apply-time static derivation; nothing on the
dynamic path reads it (the per-slot machine indices key the override
merge), and per-(extruder x volume-type) machine limits in the g-code
processor remain a documented follow-up.

Every change is gated behind is_dynamic_group_reorder() or a persisted
result with dynamic support; no profile sets the flag, so the static
fleet's instruction stream is unchanged (20/20 pinned-slice byte gate
identical, incl. the sequential repro sliced twice, deterministic).

Tests: expansion unit coverage (migrating slots, unrouted fallback via
the default map, mis-sized volume map ignored, nullable retract keys in
lockstep, slot machine index layout), an end-to-end stub-driven
write-back asserting expanded slots, per-layer config-index resolution,
the override merge incl. the nil-slot variant fallback, and re-apply
stability, plus a real selector slice staying valid across re-apply.
Suites green (libslic3r 48987/168, fff_print 633/60).
2026-07-12 11:15:58 +08:00
SoftFever
c8db06b1d4 feat(engine): stitch per-object selector plans for sequential prints
Sequential (by-object) prints were incoherent with the per-layer filament
selector (enable_filament_dynamic_map): the by-object branch published a
static grouping while each per-object ToolOrdering independently ran the
dynamic planner from an empty nozzle status and wrote its own map to the
config (one write per object, last object wins). The exported toolchange
sequences then disagreed with the published result that drives the
per-layer maps, placeholders, and selector emission.

Now the by-object branch, when the selector is enabled, plans each unique
object once — threading the physical nozzle occupancy and the previous
object's last filament into the next plan — stitches the per-object
per-layer nozzle maps into one print-wide result (gap-filled by the new
normalize_nozzle_map_per_layer so any layer index resolves a filament's
nozzle consistently), publishes it, and writes the derived extruder map
back once. The plans are cached on the Print and g-code export consumes
the cache: the ToolOrdering seed changes the plan input (dontcare
assignment, first-layer reorder), so a fresh export-time construction
could re-plan differently from the published stitch. The per-object
dynamic write-back is gated off for sequential prints.

Every change is gated behind is_dynamic_group_reorder(); no profile sets
the flag, so the static fleet's instruction stream is unchanged (20/20
pinned-slice byte gate identical, incl. the by-object repro sliced twice).

Tests: normalize unit coverage (carry-forward, back-fill, ragged input),
stitched-blocks selector detection, and an end-to-end by-object selector
slice (apply -> process -> export) asserting the published stitched
result, one cached plan per object, the config write-back, and a clean
export. Suites green (libslic3r 48958/165, fff_print 633/60).
2026-07-12 03:24:35 +08:00
SoftFever
780b2f1ebe fix(engine): publish the nozzle group result for sequential prints
The Print-level LayeredNozzleGroupResult had a single producer, the
by-layer branch of ToolOrdering, which is gated to non-sequential prints.
The by-object branch in Print::process computed a grouping only in auto
map modes and never stored it, so a sequential slice exported with a null
group result: the per-nozzle placeholder tables came up empty and any
start g-code indexing nozzle_diameter_at_nozzle_id[] aborted with
"Indexing an empty vector variable". A prior by-layer slice masked the
bug by leaving its (never cleared) result on the Print.

Now the by-object branch runs get_recommended_filament_maps in every
static map mode (in manual modes the result mirrors the user's
assignment, deviations throw as in by-layer) and publishes it
print-wide. The config write-back stays gated to auto modes: in manual
modes it would only re-store the pre-slice values.

Regression test: a two-object by-object print must publish a non-null
group result and resolve nozzle_diameter_at_nozzle_id[] in start g-code
(both fail without the fix). Suites green (libslic3r 48929/162,
fff_print 633/60); 18-fixture byte gate identical; the by-object repro
project goes from the export error to valid g-code, determinism x2.
2026-07-12 00:46:15 +08:00
SoftFever
c65b0540a3 Merge remote-tracking branch 'origin/main' into feature/h2c_support_clean
# Conflicts:
#	src/libslic3r/PrintApply.cpp
#	src/libslic3r/PrintConfig.cpp
#	src/libslic3r/PrintConfig.hpp
#	tests/libslic3r/test_config.cpp
2026-07-11 23:10:54 +08:00
SoftFever
e717dea94b Merge branch 'main' into feature/h2c_support_clean 2026-07-11 22:19:59 +08:00
SoftFever
f5418415ac fix(gui): stop clipping the nozzle-count edit button on flow changes
HoverLabel's constructor used SetSizerAndFit, which records the
count-hidden width as the panel's explicit minimum size. An explicit
minimum outranks best size in sizer allocation, so once the "(N)" count
was shown, any ancestor Layout() - e.g. switching the extruder flow type
to Standard or High Flow - shrank the title row back to the stale width
and clipped the trailing edit button. Hybrid only appeared correct while
nothing had re-laid the row since its own Fit().

Use plain SetSizer and, on every title/count change, invalidate the
cached best size and re-lay both the row and its parent so the sizer
always allocates the current content width.
2026-07-11 22:11:47 +08:00
SoftFever
dacf26b06f fix(engine): keep engine-derived filament_map_2 out of the apply diff
Print::apply rebuilds m_config.filament_map_2 to the real per-filament slot
map on every apply, while the incoming full config only ever carries the
ConfigDef default. The resulting phantom one-key print_diff hit the
invalidator's catch-all branch and killed every print-level step on each
apply, so on multi-extruder printers a fresh slice result was invalidated
the moment the GUI re-applied after slicing completed.

Dropping the key from print_diff loses no information: it is never a user
input, and the rebuild derives it from filament_map, filament_volume_map
and the variant slots, each of which is diffed and invalidation-listed on
its own.

Regression test: re-applying an unchanged config after process() must not
invalidate psSlicingFinished (fails with APPLY_STATUS_INVALIDATED without
the fix). Suites green (libslic3r 48891/154, fff_print 631/59); 19-fixture
byte gate identical incl. the Hybrid repro project, determinism x2.
2026-07-11 22:11:35 +08:00
SoftFever
75c8d0775a feat(gui): per-filament nozzle volume selection and persistence
- FilamentMapDialog's manual page understands volume types: a mixed
  (Hybrid) extruder shows separate Standard / High Flow drop zones
  with live sub-nozzle counts, a validation timer with an inline
  error + "set nozzle count" suggestion, and composes a per-filament
  volume map on OK (persisted to the plate or globally)
- switching an extruder's Flow type rewrites the affected plate map
  entries; plate maps stay sized across filament add/delete/count
  changes (values keep their filament, no index shift)
- CLI: manual mapping on multi-nozzle printers synthesizes the volume
  map from extruder flow types when absent; nozzle-manual mode
  requires explicit maps; computed maps land on the plate so exported
  projects carry filament_volume_maps
- filament_nozzle_map joins the project options (selection seeding +
  filament-count resizing)
- pot entries for the new dialog strings

All 19 reference fixtures byte-identical; slicing an exported Hybrid
project reproduces its g-code byte-for-byte with the volume map
round-tripped through model_settings.config.
2026-07-11 16:37:50 +08:00
SoftFever
21b46044d0 feat(gcode): resolve per-filament variant slots per layer
- the g-code writer tracks the current layer id and resolves
  FILAMENT_CONFIG/NOZZLE_CONFIG (plus every non-macro variant lookup,
  toolchange placeholder scalars, and the change-filament flush
  overrides) through Print's per-filament, per-layer config-index
  resolvers instead of the filament->extruder collapse
- update_layer_related_config refreshes the per-layer
  extruder/volume/nozzle maps in the writer config;
  update_placeholder_parser_with_variant_params remaps the
  filament-variant arrays into filament-id space for custom g-code
  (Orca's flush placeholder computation moves inside it)
- the engine's concrete per-filament volume assignment now merges into
  the config write-back (the temporary hold from the producer commit
  is lifted together with these consumers), and the background process
  reads the computed volume map back to the plate
- append_full_config dumps the resolved filament_map_2 slots
- update_used_filament_values gains a bounds guard
- tests: per-filament Hybrid slot resolution + null-result fallback

Result: on a Hybrid extruder, each filament's features slice with its
assigned sub-nozzle's variant values (speeds, volumetric limits,
retraction). Verified on a 4-filament H2C Hybrid project: outer walls
split into three feedrate populations (30/50/200 mm/s), toolpath
geometry byte-identical, deterministic across repeated slices. All 18
non-Hybrid reference fixtures stay byte-identical except the
filament_map_2 header value now showing the real slot. Auto grouping
ties (multiple zero-flush perfect matchings) may pick a different
filament-to-nozzle isolation than other slicers; verified co-optimal.
2026-07-11 15:00:33 +08:00
SoftFever
03a704df7c feat(engine): wire the per-filament volume-map producer pipeline
- Print::update_filament_maps_to_config takes filament/volume/nozzle
  maps, backfills an empty volume map from extruder types, rebuilds
  filament_map_2, re-expands the per-filament variant arrays, and
  recomputes retract overrides keyed by resolved slots
- grouping writes its result back in every non-sequential mode;
  manual multi-nozzle grouping validates the user mapping and raises a
  translatable error on deviation; the engine's concrete volume
  assignment is deliberately not merged yet (per-filament arrays are
  already consumed by filament id, so materializing High Flow now
  would change motion before the layer-aware resolvers land)
- Print::apply treats the three map keys as engine outputs in auto
  modes (erased from the diff and adopted), compares them against used
  filaments in manual mode, and keeps the pre-expansion snapshot in
  sync with the late normalization pass so rebuilt headers reflect the
  sliced state instead of resurrecting stale values
- volume/nozzle maps and extruder_nozzle_stats join the invalidation
  group of filament_map (wipe tower + skirt/brim)
- PresetBundle composes full configs with an optional per-filament
  volume map (plate map, else defaults derived from each extruder's
  flow type); project config keeps the map sized across filament
  count changes
- PartPlate stores per-plate volume/nozzle maps; Plater injects them
  at every slice-composition site (incl. g-code reload and wipe-tower
  estimation); BackgroundSlicingProcess reads engine results back to
  the plate in auto modes
- per-filament map trust guards relaxed to size-match everywhere now
  that every producer sizes the map; single-filament explicit flow
  assignments are honored
- tests: grouping volume maps stay concrete, merge semantics of
  update_used_filament_values, single-filament override honoring

Motion g-code is byte-identical fleet-wide including Hybrid projects
(19-fixture gate + repro determinism double-slice). Header deltas:
the map keys now dump real values, and stale pre-normalization values
(e.g. enable_prime_tower on single-used-filament prints) no longer
leak into the config block.
2026-07-11 04:38:31 +08:00
SoftFever
18b9279c26 feat(print): add per-filament config-index resolvers and filament_map_2
- Print::get_nozzle_config_index / get_filament_config_indx resolve a
  filament's variant slot per layer from the nozzle group result, with
  hashed index caches; when no group result is published (sequential
  prints), they fall back to the static filament->extruder mapping so
  behavior is unchanged
- filament_map_2 caches each filament's resolved print-variant slot;
  rebuilt in Print::apply after the filament_map diff handling and in
  the filament-map write-back
- filament retract overrides now key by slot indices: apply_override
  fallback indexing flips to 0-based, Print::apply passes
  filament_map/extruder indices, the write-back passes filament_map_2
  (identical resolution while slots equal extruders)
- filament_volume_map/filament_nozzle_map/filament_map_2/
  filament_self_index become PrintConfig static members (required for
  member access); grouping input guards tightened so their registered
  1-element defaults are never mistaken for real per-filament maps
  (single-filament manual mode keeps the mix-marker fallback)
- update_filament_self_index_cache refreshed at every full-config
  assignment
- tests: 0-based apply_override fallback, get_config_index_base
  hit/miss/mixed-type cases

The resolvers are not consumed by the g-code writer yet. Non-Hybrid
g-code is unchanged except the config header, which now serializes the
three new static keys (defaults until the per-filament producer lands);
verified by the 19-fixture byte gate: 3 added header lines per fixture,
zero motion changes.
2026-07-11 02:29:40 +08:00
SoftFever
13cd8d4864 feat(config): keep per-(extruder x volume-type) slots in variant expansion
- get_extruder_nozzle_volume_count derives per-extruder volume-type slot
  lists from extruder_nozzle_stats (absent stats = one slot per extruder)
- update_values_to_printer_extruders learns the slot layout: when any
  extruder mixes volume types, option arrays keep one slot per
  (extruder x volume type), extruder-ascending then volume-ascending;
  single-slot resolution takes the filament's volume type on mixed
  extruders
- update_values_to_printer_extruders_for_multiple_filaments applies a
  per-filament nozzle_volume_type override from filament_volume_map
  (when sized to the filament count) and remaps filament_self_index
  through the same pipeline as every other filament key
- get_config_index_base + is_auto_filament_map_mode helpers (consumers
  land with the per-filament config-index resolvers)
- callers updated: PresetBundle composition paths, PrintApply (counts
  hoisted above the extruder_applied guard), Print write-back
- new tests: slot counting, Hybrid slot expansion incl. stride 2,
  per-filament override, non-Hybrid degeneracy

Non-Hybrid printers keep their variant layout and values (proven by a
19-fixture byte gate; the only header delta is filament_self_index now
flowing through the same variant pipeline as its sibling filament
keys). Hybrid slices grow the config-block variant arrays to one entry
per sub-nozzle volume type; motion g-code is unchanged until the
g-code writer consumes the new slots.
2026-07-11 00:51:10 +08:00
SoftFever
7c8d086d9e feat(gui): show per-extruder nozzle count with inline editor
The sidebar extruder cards get an interactive title row — "<name> ( <count> )"
with an edit button — showing the extruder's physical nozzle count on
multi-nozzle printers (hidden elsewhere). Clicking it opens the existing
"Set nozzle count" dialog, which now also handles a Hybrid extruder by
offering both Standard and High Flow counts (an empty mix is rejected) and
shows a hotend thumbnail.

Because `extruder_nozzle_stats` is session-only (saved presets never carry
it, so preset switches rebuild the edited config without it), the stats are
re-baselined whenever they are missing: each extruder starts with
extruder_max_nozzle_count nozzles of its selected volume type. Switching an
extruder's flow type carries its total count over to the new type, except
when the stats came from a device sync — the machine-reported per-type
breakdown must survive a manual flow switch.

The badge refreshes on preset load, flow-type change, manual edit, device
sync, and project load. Single-extruder cards keep the title row but never
enable editing.
2026-07-10 19:47:21 +08:00
SoftFever
c528d3a0bc feat(gui): enable Hybrid nozzle flow for multi-sub-nozzle extruders
An extruder with more than one physical sub-nozzle can hold a mix of
Standard and High Flow nozzles. The Flow dropdown now offers Hybrid for
such extruders (extruder_max_nozzle_count > 1, nil-guarded); grouping
already expands a Hybrid extruder into per-volume nozzle groups from
extruder_nozzle_stats.

- sidebar Flow combo offers Hybrid only for multi-sub-nozzle extruders
- preset lookup treats Hybrid as Standard (presets define no Hybrid
  variant); variant strings are never fabricated for it
- printer tab splits a Hybrid extruder into Standard + High Flow rows,
  with matching selection-index arithmetic and sync-enable rules
- syncing from a printer whose extruder holds mixed nozzle flows now
  selects Hybrid instead of collapsing to the dominant flow type
- send-to-printer flow check: a nozzle-rack extruder validates its
  nozzle inventory (mounted + rack) against every needed flow instead
  of comparing only the mounted nozzle; mounted-flow lookup is now
  per-extruder, fixing an index shift when a nozzle reports no flow
- Hybrid is session-only in app config (stored as Standard), so a
  fresh session starts from concrete flow types

Printers whose extruders have a single sub-nozzle (including all
dual-extruder machines without a rack) see no new option and identical
check behavior.
2026-07-10 18:02:26 +08:00
SoftFever
83d2d4179d feat(profiles): enable cooling filter on H2D, H2D Pro, and H2S
Declare support_cooling_filter=1 on the three profiles (0.2/0.6/0.8
variants inherit from 0.4) and insert the cooling-filter conditional
into the H2D and H2S machine start g-code, inside the low-chamber-temp
airduct branch:

  {if(cooling_filter_enabled)} M145.2 P0 F0 {else} M145.2 P0 F1 {endif}

H2D Pro intentionally gets no g-code edit: its duct firmware takes the
filter mode over the device channel only, so the flag merely enables
the toggle.

Impact on existing users at default settings: H2D/H2S start g-code gains
exactly one line (M145.2 P0 F1, filter off) in the cool-chamber branch;
nothing is removed or reordered. The existing support_air_filtration=1
overrides are deliberately kept so exhaust-fan behavior for ABS-class
filaments is unchanged, even though the machine-tab row is hidden while
the cooling-filter toggle is shown.
2026-07-10 16:49:22 +08:00
SoftFever
826e36fb1e feat(printer): add cooling filter support flag and expose its toggle
cooling_filter_enabled existed as a config option but was shown nowhere,
and there was no capability flag to gate it. The cooling filter and air
filtration are alternative accessories sharing the same duct, so a
printer declares one or the other.

- new hidden printer capability flag support_cooling_filter
- "Use cooling filter" toggle in the Accessory group, shown only when
  the printer supports it; the air-filtration toggle hides in that case
  (no vendor restriction: third-party printers keep air filtration)
- explicit defaults (0) in the common machine base
- H2C declares support_cooling_filter=1 instead of support_air_filtration;
  its start-gcode already carries the cooling-filter conditional, so the
  toggle is functional. On H2C this drops the two exhaust-fan lines that
  air filtration emitted for ABS-class filaments, matching the printer's
  actual duct accessory; H2C is new on this branch so no existing user
  output changes.

Printers without the flag keep exactly the previous accessory UI and
g-code.
2026-07-10 16:38:46 +08:00
SoftFever
b12aad6a8c feat(orient): auto-orient the largest overhang toward the cooling fan
New printer option fan_direction (undefine/left/right/both, default
undefine) declares which side the auxiliary part-cooling airflow comes
from. When set and the printer has an auxiliary fan, auto-orient adds a
yaw rotation so the dominant overhang area faces the airflow, and newly
added primitive shapes are pre-oriented the same way (except the Cube,
whose axis-aligned bounding box the pressure-advance pattern calibration
depends on).

- FanDirection enum + fan_direction printer option (Accessory group,
  enabled only with auxiliary_fan)
- orient engine: weighted overhang areas per candidate, yaw-direction
  search, vertical rotation applied on top of the primary orientation;
  the cooling weights are taken from the candidate actually chosen,
  including the flat-bottom tie-break
- orient_for_cooling() for primitive placement
- set fan_direction=left on H2C/H2D/H2D Pro/X1/X1E/P1S 0.4 profiles
  (X1C/H2S/P2S/X2D/Qidi X-Max 4 already carried the key, which now
  takes effect)

With fan_direction unset or no auxiliary fan the vertical rotation stays
identity and auto-orient results are unchanged; slicing and g-code are
never affected.
2026-07-10 16:21:48 +08:00
SoftFever
93a81179a1 feat(gui): add purge mode selector dialog
The engine already implements prime_volume_mode (Default/Saving/Fast)
but nothing in the UI could set it, leaving prime-saving unreachable on
multi-sub-nozzle extruders and fast purge unreachable on printers that
support it.

- new PurgeModeDialog with selectable Standard/Fast or
  Standard/Prime Saving cards depending on printer capability
- "Purge mode" sidebar button next to Flushing volumes; opens the
  dialog and stores the choice in the project config
- printer preset-load gating: button shown only when the printer has
  multiple sub-nozzles per extruder or sets support_fast_purge_mode;
  stale project values the printer cannot honor reset to Default
- enable fast purge on A2L 0.4 (support_fast_purge_mode), explicit
  default 0 in the common machine base
- new dialog strings added to OrcaSlicer.pot

Printers without these capabilities never show the button and their
projects keep prime_volume_mode at Default, so slicing output is
unchanged.
2026-07-10 15:41:57 +08:00
SoftFever
b2eeed2622 feat(slicing): enforce filament flow-type restrictions in auto grouping
Filament grouping already consumed per-filament forbidden nozzle volume
types, but every call site passed an empty map, so a variant-restricted
filament (e.g. one limited to "Direct Drive TPU High Flow") could be
auto-grouped onto an incompatible nozzle flow type on multi-variant
printers.

- add convert_to_nvt_type() to parse extruder variant strings
- add Print::get_filament_unprintable_flow(): forbidden volume types =
  printer extruder variants minus the filament's declared variants;
  filaments declaring no variants stay unrestricted
- feed the map into grouping at the by-object path (Print.cpp) and all
  six mapping/planning sites in reorder_extruders_for_minimum_flush_volume
- unit-test the string parser

Non-restricted configurations produce an empty map, so existing
printers' grouping and g-code are unchanged.
2026-07-10 15:10:46 +08:00
SoftFever
9e8ac03476 test(filament_group): don't assert max_group_size cap for MatchMode
The FilamentGroup property/golden harness checked a per-extruder
max_group_size cap unconditionally in check_constraints. That cap is an
invariant of the flush-partition solvers only (calc_group_by_enum /
calc_group_by_kmedoids, reached via calc_filament_group_for_flush), which
partition filaments subject to each extruder's capacity.

MatchMode (calc_filament_group_for_match) does not partition by capacity:
it maps every filament to the extruder holding the nearest-color loaded
AMS filament, and its solver capacity is the used-filament count, not
max_group_size (FilamentGroup.cpp:1067). So a legitimate MatchMode result
can place more than max_group_size filaments on one extruder.

The prop_a/b/c_mode_match specs run MatchMode, and their scenarios are
generated with std::uniform_int_distribution / std::shuffle, which are
implementation-defined. For a fixed mt19937 seed, libc++ (macOS), libstdc++
(Linux) and MSVC (Windows) draw different scenarios, so the CI failure only
surfaced on Linux/Windows while macOS passed. Verified locally: 248/600
config-A MatchMode seeds exceed the cap under libc++ — it is reachable
everywhere; seed 90400 just isn't an exceeding draw on macOS.

Gate section 3 on FGMode != MatchMode. No test case is removed or skipped:
all 57 FlushMode specs still assert the cap, MatchMode still asserts the
unprintable-filament/volume correctness constraints (which it honors), and
MatchMode grouping regressions are still caught by the golden score gate at
3% tolerance. Test-only change; slicing behavior and g-code are unaffected.
2026-07-10 02:17:52 +08:00
SoftFever
b58dcf5978 test(libnest2d): fix use-after-free crash in NfpPlacer lifetime tests
NfpPlacer stores std::reference_wrapper to the items it packs and re-reads
them from finalAlign() in its destructor (via clearItems()). Two placer
tests declared the placer before the items in the same scope, so the items
were destroyed first and the destructor dereferenced dangling references.

On macOS this is a deterministic SIGSEGV: libmalloc poisons the freed block
on free, so the item's point vector reads back as ~null (deref at 0x8). On
Linux/glibc the freed bytes usually survive, which is why it slipped through
upstream CI (introduced by #14267).

Declare the items before the placer so they outlive it, matching the pattern
the sibling 'packs many items' and 'obstacle' tests already use. Test-only;
the library lifetime contract (items must outlive the placer) is unchanged
and honored in production via _Nester in Arrange.cpp.
2026-07-10 01:55:00 +08:00
SoftFever
00816968a2 Merge branch 'main' into feature/h2c_support_clean 2026-07-09 22:17:20 +08:00
SoftFever
844c374798 update colors 2026-07-09 19:42:21 +08:00
SoftFever
f688a3e741 update the profile 2026-07-09 19:01:19 +08:00
SoftFever
0d31325df0 feat: Filament Track Switch (H2-series O2L-FTS) support
The Filament Track Switch (H2-series accessory, product code O2L-FTS) feeds
every AMS to both extruders through a two-track switch. Port full support
across the device layer, project config, and GUI.

Device / config:
- Model the switch-aware AMS binding (the set of extruders an AMS can feed
  and which input track A/B feeds it), switch readiness, the O2L-FTS firmware
  module, and the fun2 capability bit for checking a slice against installed
  hardware.
- Register has_filament_switcher and enable_filament_dynamic_map as project
  config that persists with the project and restores from a saved 3mf, and
  force both back to false on every project/printer/CLI load path. Live
  device sync is the only thing that sets them true.

GUI:
- Sidebar sync activates the switch from live device state, attributes each
  AMS to the extruder its input track feeds, shows a floating status icon
  (ready / not-calibrated), and surfaces a one-time tip / not-calibrated
  warning.
- Send dialog gains a non-blocking slice-vs-hardware mismatch warning and a
  blocking error when a slice needs dynamic nozzle mapping but the switch is
  missing or not set up.
- AMS load/unload guards, AMS-view routing glyph + un-calibrated banner +
  hidden external-spool road, and mapping-popup external-spool lockout.
- Filament pickers collapse the per-extruder split into a single deduplicated
  "AMS filaments" group with a smart-assign toggle when the switch is ready.
- Firmware-upgrade panel lists the O2L-FTS accessory and its version.
- Device-provided filament-change steps (ams.cfs) drive the change-step
  display when firmware sends them, including the three switch steps.
- "Load current filament" asks which extruder to feed via a
  FeedDirectionDialog when the switch is calibrated.

Inert without the accessory: every path is gated on the switch being
installed (MQTT aux bit 29, default off) or ready, both project flags default
false, and the per-extruder AMS attribution is byte-identical, so AMS state,
the send/load UI, and sliced g-code are unchanged for every printer that does
not report a Filament Track Switch.
2026-07-09 18:57:05 +08:00
SoftFever
26a0caff96 save exact (not standard-rounded) nozzle diameter in 3mf metadata 2026-07-09 13:13:29 +08:00
SoftFever
9810397546 test+i18n: multi-nozzle filament-group goldens and ported strings
Filament-group golden harness (config_a subset) and .3mf multi-nozzle round-trip tests, plus i18n msgids for the ported H2C/A2L strings.
2026-07-09 01:16:26 +08:00
SoftFever
28b7127150 feat(gui): multi-nozzle UI for H2C/A2L
Multi-nozzle sync widget, AMS rack-nozzle mapping popup, calibration rework, send-dialog nozzle mapping and extruder-count UI. Includes the fix to persist the AMS sync badge on filament cards (H2C/A2L and direct-sync printers).
2026-07-09 01:16:26 +08:00
SoftFever
a098b483f6 feat(device): H2C/A2L device layer
Nozzle rack data model and device-tab panel, multi-nozzle sync, per-nozzle filament blacklist, and print-dispatch nozzle mapping (DevNozzleMappingCtrl V0/V1).
2026-07-09 01:16:25 +08:00
SoftFever
15412cd812 feat(profiles): Bambu Lab H2C and A2L profiles and resources
Machine models and presets, process and filament presets, plus bed models, covers, previews and device images for the H2C and A2L.
2026-07-09 01:16:25 +08:00
SoftFever
237ef41b06 feat(libslic3r): multi-nozzle slicing engine for H2C/A2L
Port BambuStudio's dual-nozzle slicing core: H2C-era config keys, filament-to-nozzle grouping with per-layer dynamic regrouping, filament/nozzle/hotend gcode placeholder vocabulary, multi-nozzle wipe tower pre-heat/pre-cool, the two-pass pre-cooling injector, and corexy farthest-point timelapse.
2026-07-09 01:16:25 +08:00
Noisyfox
40fd225308 Make sure new strings are translated 2026-07-07 23:16:04 +08:00
Noisyfox
696a94a1a6 Update color 2026-07-07 22:29:28 +08:00
Noisyfox
7f67946dbf Fix incorrect length modification when loading device-related parameters
(cherry picked from commit bambulab/BambuStudio@ebf57372da)

Co-Authored-By: weizhen.xie <weizhen.xie@bambulab.com>
2026-07-07 22:02:10 +08:00
shsst
4227a192cd ENH:[Process/Filament] MOD: filament_ams parameters Profile Edited by lianhu.xiong
Change-Id: I2f540d0afd6ba368100bc88433cdf2024a1c7d3c
(cherry picked from commit 316d8461476d65a85de8dba41a861877c358dba5)
2026-07-07 21:17:04 +08:00
weizhen.xie
ae5d9c26fb ENH: Add filament ams/chamber parameters
Jira: None
Change-Id: I4c0a2d5b7e1c503fc9af9eb656fc6325e99af1de
(cherry picked from commit ce88e7794cb8786fae85603617757628a963e807)
2026-07-07 21:01:42 +08:00
changyu.chen
c2f5a87e24 FIX: print warning when ams is drying
jira: [STUDIO-16558]

Change-Id: I6313c4c02dce6853d48fd4b175a161bf116865a9
(cherry picked from commit 49609394cd92b7043f4f65debf585cbc37f382bd)
2026-07-07 17:54:17 +08:00
changyu.chen
1b93f35565 FIX: print warning when ams drying
jira: [STUDIO-16505]

Change-Id: I47b98643a7d941c594eb4d90c08f48a7880c947e
(cherry picked from commit bdc833d49440c73a56cf10b723fb02d33d1c3a98)
2026-07-07 17:51:51 +08:00
Noisyfox
f58a1f350a feat: add drying-while-printing warning in SelectMachine dialog
Port from BambuStudio commit c8f70c6ca. Shows a warning when AMS
is actively drying during print job preparation, alerting users that
the drying temperature will be lowered during printing.
2026-07-07 17:50:20 +08:00
Noisyfox
922af972c7 refactor: convert m_fila_system from raw pointer to shared_ptr
Matches BambuStudio commit c8f70c6ca. DevFilaSystem* m_fila_system
becomes std::shared_ptr<DevFilaSystem>, enabling proper shared ownership
for the AMS drying control feature without no-op deleter hacks.

- DeviceManager.hpp: m_fila_system and GetFilaSystem() use shared_ptr
- DeviceManager.cpp: std::make_shared allocation, remove manual delete,
  add .get() to ParseV1_0 calls
- MoonrakerPrinterAgent.cpp: add .get() to GetFilaSystem() in ParseV1_0
2026-07-07 17:29:10 +08:00
Noisyfox
f713c7ae49 Make sure codes uses same structure/naming/position as BambuStudio
for easier code comparasion & porting in the future
2026-07-07 17:07:40 +08:00
Noisyfox
0e20f60712 fix: adapt SVG colors to OrcaSlicer palette
- dev_ams_dry_ctr_enable.svg: Bambu green #00AE42 → Orca teal #009688
- dev_ams_dry_ctr_heating_icon.svg: red #E14747 → amber #F09A17 (matches ams_is_drying.svg)
2026-07-07 15:25:32 +08:00
Noisyfox
23799e0210 chore: remove superpowers planning docs 2026-07-07 15:20:26 +08:00
Noisyfox
668654da5f fix: use dark humidity icons in dark mode 2026-07-07 14:58:51 +08:00
Noisyfox
2524669139 Revert "feat: update error dialog stop-drying to use CtrlAmsStopDrying"
This reverts commit 044a113d54.
2026-07-07 14:47:52 +08:00
Noisyfox
044a113d54 feat: update error dialog stop-drying to use CtrlAmsStopDrying
Keeps command_ams_drying_stop() fallback for backward compatibility.
2026-07-07 14:47:33 +08:00
Noisyfox
b2827cb9fa feat: wire AMS humidity click to open AMSDryControl dialog
For N3F and N3S AMS types, clicking the humidity indicator
now opens the full drying control dialog instead of the popup.
2026-07-07 14:36:52 +08:00
Noisyfox
08b08e09fc fix: use OrcaSlicerTitle.ico instead of BambuStudioTitle.ico 2026-07-07 14:23:05 +08:00
Noisyfox
62e5cfed36 feat: add AMSDryControl dialog for AMS filament drying
Three-page wizard: main status/control page, guide page with
filament tray status, and progress page. Supports N3F and N3S AMS types.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-07 14:16:04 +08:00
Noisyfox
b2298855b0 assets: add AMS drying control images from BambuStudio
14 images: humidity level icons, drying state images per AMS type,
heating icon, guide illustration, tray status icons.
2026-07-07 13:35:16 +08:00
Noisyfox
ec913eaf30 feat: add is_support_remote_dry flag parsing from firmware
Parses fun2 bit 5 from printer firmware to enable remote drying support.
2026-07-07 13:27:39 +08:00
Noisyfox
22d9765348 feat: add CtrlAmsStartDryingHour and CtrlAmsStopDrying commands
Publish 'ams_filament_drying' JSON commands via MQTT for
starting and stopping AMS filament drying.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-07 13:19:11 +08:00
Noisyfox
dd5b755f60 feat: add drying status JSON parsing and DevAms helper methods
Parse dry_status, dry_sub_status, dry_fan statuses,
dry_settings, and dry_cannot_reasons from printer JSON.
Implement IsSupportRemoteDry, AmsIsDrying, get_ams_drying_preset.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-07 13:09:32 +08:00
Noisyfox
9ee7e9aba4 feat: add DevUtilBackend with GetFilamentDryingPreset
Reads filament_dev_ams_drying_* config keys from filament presets
and returns structured DevFilamentDryingPreset data.
2026-07-07 12:51:12 +08:00
Noisyfox
1adfb5f242 feat: add DevFilamentDryingPreset, ctrl method declarations, tray preset getter 2026-07-07 12:13:26 +08:00
Noisyfox
c88535ce9e feat: add drying enums, structs, getters to DevAms
Adds DryCtrlMode, DryStatus, DrySubStatus, DryFanStatus,
CannotDryReason enums and DrySettings struct for AMS drying control.
2026-07-07 12:00:53 +08:00
Noisyfox
272e88a337 refactor: promote DevAmsType to global enum, rename DUMMY to EXT_SPOOL
Matches BambuStudio's DevAmsType naming convention.
2026-07-07 11:49:55 +08:00
Noisyfox
c983f60d00 docs: add AMS drying control implementation plan
12 tasks covering: data model changes, DevUtilBackend utility,
drying commands, JSON parsing, UI dialog port, integration
wiring, image assets, and verification.
2026-07-07 11:26:38 +08:00
Noisyfox
e0d80ee953 docs: add BambuStudio reference path to spec 2026-07-07 11:21:00 +08:00
Noisyfox
885f14ed65 docs: fix spec self-review issues
Clarify dialog modality, precise image asset list, DevAmsType naming consistency.
2026-07-07 11:13:35 +08:00
Noisyfox
5b64e49c53 docs: add AMS drying control design spec
Port AMS filament drying control feature from BambuStudio.
Covers data model changes, commands, UI dialog, and integration plan.
2026-07-07 11:12:00 +08:00
831 changed files with 104349 additions and 6013 deletions

View File

@@ -165,6 +165,30 @@ jobs:
os: ${{ vars.SELF_HOSTED && 'orca-macos-arm64' || 'macos-14' }}
artifact: ${{ github.sha }}-tests-macos-arm64
test-dir: build/arm64/tests
# Slice a two-colour cube through every shipped printer with this PR's engine
# so all custom g-code (change_filament_gcode, machine start/end, etc.) is
# expanded - catches slicing regressions the static profile checks and unit
# tests can't see. Profile-only PRs are covered by check_profiles.yml (nightly
# binary); this covers src/engine PRs with the PR-built binary. Runs in
# parallel off build_linux's artifact so it doesn't lengthen the build leg.
slice_check_linux:
name: Slice check (Linux aarch64)
needs: build_linux
if: ${{ !cancelled() && success() }}
runs-on: ubuntu-24.04-arm
steps:
- name: Checkout repository
uses: actions/checkout@v7
- name: Download profile validator
uses: actions/download-artifact@v8
with:
name: ${{ github.sha }}-profile-validator-linux-aarch64
path: validator-bin
- name: Validate slice (expand custom g-code)
timeout-minutes: 60
run: |
chmod +x validator-bin/OrcaSlicer_profile_validator
./validator-bin/OrcaSlicer_profile_validator -p "${{ github.workspace }}/resources/profiles" -s -l 2
publish_test_results:
name: Publish Test Results
needs: [unit_tests_linux_x86_64, unit_tests_linux_aarch64, unit_tests_windows_x64, unit_tests_windows_arm64, unit_tests_macos_arm64]

View File

@@ -508,6 +508,22 @@ jobs:
retention-days: 5
if-no-files-found: error
# Ship the freshly-built validator so the parallel slice_check_linux job
# (build_all.yml) can slice-sweep the shipped profiles with this PR's
# engine. Taken from the aarch64 leg so the sweep runs on arm64 (its
# GitHub-hosted runner is free, and it also exercises the arm build).
# Stable sha-based name mirrors the tests artifact above so the
# downstream job downloads it by exact name.
- name: Upload profile validator (for slice check)
if: runner.os == 'Linux' && inputs.arch == 'aarch64'
uses: actions/upload-artifact@v7
with:
name: ${{ github.sha }}-profile-validator-linux-aarch64
overwrite: true
path: ./build/src/Release/OrcaSlicer_profile_validator
retention-days: 5
if-no-files-found: error
- name: Run external slicer regression tests
if: runner.os == 'Linux' && inputs.arch != 'aarch64'
timeout-minutes: 20

View File

@@ -49,6 +49,15 @@ jobs:
set +e
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 2>&1 | tee ${{ runner.temp }}/validate_system.log
exit ${PIPESTATUS[0]}
# Slice a two-colour cube through every printer so all custom g-code (incl. change_filament_gcode)
# is expanded - catches undefined-placeholder / invalid-flow bugs the static checks above cannot see.
- name: validate slice (expand custom g-code)
id: validate_slice
continue-on-error: true
run: |
set +e
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -s -l 2 2>&1 | tee ${{ runner.temp }}/validate_slice.log
exit ${PIPESTATUS[0]}
# For now run filament subtype check only for BBL profiles until we fix other vendors' profiles.
- name: validate filament subtype check for BBL profiles
id: validate_filament_subtypes
@@ -166,7 +175,7 @@ jobs:
echo "${{ github.event.pull_request.number }}" > ${{ runner.temp }}/profile-check-results/pr_number.txt
- name: Prepare comment artifact
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
run: |
{
# Marker matched by check_profiles_comment.yml to delete prior comments.
@@ -192,6 +201,15 @@ jobs:
echo ""
fi
if [ "${{ steps.validate_slice.outcome }}" = "failure" ]; then
echo "### Slice Validation Failed (custom g-code expansion)"
echo ""
echo '```'
head -c 30000 ${{ runner.temp }}/validate_slice.log || echo "No output captured"
echo '```'
echo ""
fi
if [ "${{ steps.validate_filament_subtypes.outcome }}" = "failure" ]; then
echo "### BBL Filament Subtype Validation Failed"
echo ""
@@ -223,7 +241,7 @@ jobs:
retention-days: 1
- name: Fail if any check failed
if: ${{ always() && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
if: ${{ always() && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
run: |
echo "One or more profile checks failed. See above for details."
exit 1

View File

@@ -79,6 +79,92 @@ jobs:
throw error;
}
localization-pr:
if: github.event_name == 'pull_request_target'
permissions:
contents: read
pull-requests: write
issues: write
runs-on: ubuntu-latest
steps:
- name: Auto-label and remind about the localization glossary
uses: actions/github-script@v9
with:
script: |
function isPermissionDenied(error) {
return error && error.status === 403 && /Resource not accessible by integration/i.test(error.message || '');
}
const pr = context.payload.pull_request;
// List changed files once (mirrors the `localization/**` paths filter in check_locale.yml)
const files = await github.paginate(github.rest.pulls.listFiles, {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number,
per_page: 100
});
const touchesLocalization = files.some((file) => file.filename.startsWith('localization/'));
const onlyPoFiles = files.length > 0 && files.every((file) => file.filename.endsWith('.po'));
// If the PR changes only .po files, automatically apply the Localization label
if (onlyPoFiles) {
try {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
labels: ['Localization']
});
core.info('Applied Localization label (PR changes only .po files).');
} catch (error) {
if (isPermissionDenied(error)) {
core.warning('Cannot add Localization label because token cannot write.');
} else {
throw error;
}
}
}
if (!touchesLocalization) {
core.info('No localization changes detected; skipping glossary reminder.');
return;
}
// Avoid posting the reminder twice (e.g. on reopen)
const marker = '<!-- localization-glossary-reminder -->';
const comments = await github.paginate(github.rest.issues.listComments, {
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
per_page: 100
});
if (comments.some((comment) => (comment.body || '').includes(marker))) {
core.info('Glossary reminder already present; skipping.');
return;
}
try {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
body:
`${marker}\n` +
`Hi @${pr.user.login}, this PR changes translations (\`localization/**\`).\n\n` +
`Please make sure recurring terms follow the [Localization glossary](https://www.orcaslicer.com/wiki/localization_glossary), ` +
`so the same English term is always rendered the same way within a language and terms that must stay in English ` +
`(brand/product names, acronyms, file formats, G-code, macros/variables) are not translated.`
});
} catch (error) {
if (isPermissionDenied(error)) {
core.warning('Skipping glossary reminder because token cannot write comments.');
return;
}
throw error;
}
apply-label:
if: github.event_name == 'issue_comment'
permissions:

View File

@@ -28,11 +28,15 @@ jobs:
- name: Checkout
uses: actions/checkout@v7
with:
# tests/data is referenced by absolute path (TEST_DATA_DIR).
# Tests reach outside tests/ at runtime: tests/data (TEST_DATA_DIR) and
# resources/profiles (PROFILES_DIR) by baked-in absolute path, plus
# resources/info (nozzle data) via resources_dir() during a real slice.
# Check out all of resources/ so no test hits a missing-file path.
sparse-checkout: |
.github
scripts
tests
resources
- name: Apt-Install Dependencies
if: runner.os == 'Linux' && !vars.SELF_HOSTED
uses: ./.github/actions/apt-install-deps

View File

@@ -55,3 +55,11 @@ ctest --test-dir ./tests/fff_print
- Add helper functions or utilities only when existing code cannot reasonably be reused. Avoid duplication.
- Keep code concise and clear. Manually simplify AI generated bloated codes before review.
- Include targeted tests or documented verification for behavior changes, especially in slicing logic, profiles, formats, and GUI defaults.
- For translation changes (`localization/i18n/**/*.po`), check that recurring terms match the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) for that language.
## Localization & translations
- Translation catalogs live in `localization/i18n/<lang>/OrcaSlicer_<lang>.po`.
- When creating or reviewing translations, use the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) as the source of truth for recurring terms, so the same English term is always rendered the same way within a language and terms that must stay in English (brand/product names, acronyms, file formats, G-code, macros/variables) are not translated.
- If a term's established translation changes, update both the affected `.po` files and the glossary so they stay in sync.
- Only edit `msgstr` (never `msgid`); keep placeholders (`%s`, `%1%`, `\n`), context (`msgctxt`), and file encoding/line endings intact.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -41,12 +41,23 @@ src/slic3r/GUI/DeviceCore/DevMapping.h
src/slic3r/GUI/DeviceCore/DevMapping.cpp
src/slic3r/GUI/DeviceCore/DevNozzleSystem.h
src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp
src/slic3r/GUI/DeviceCore/DevNozzleRack.h
src/slic3r/GUI/DeviceCore/DevNozzleRack.cpp
src/slic3r/GUI/DeviceCore/DevNozzleRackCtrl.cpp
src/slic3r/GUI/DeviceCore/DevUtil.h
src/slic3r/GUI/DeviceCore/DevUtil.cpp
src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h
src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp
src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h
src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp
src/slic3r/GUI/DeviceTab/wgtDeviceNozzleRack.h
src/slic3r/GUI/DeviceTab/wgtDeviceNozzleRack.cpp
src/slic3r/GUI/DeviceTab/wgtDeviceNozzleRackNozzleItem.h
src/slic3r/GUI/DeviceTab/wgtDeviceNozzleRackNozzleItem.cpp
src/slic3r/GUI/DeviceTab/wgtDeviceNozzleRackUpdate.h
src/slic3r/GUI/DeviceTab/wgtDeviceNozzleRackUpdate.cpp
src/slic3r/GUI/DeviceTab/wgtDeviceNozzleSelect.h
src/slic3r/GUI/DeviceTab/wgtDeviceNozzleSelect.cpp
src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp
src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp
src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp
@@ -97,6 +108,8 @@ src/slic3r/GUI/Widgets/FilamentLoad.cpp
src/slic3r/GUI/Widgets/TempInput.cpp
src/slic3r/GUI/Widgets/CheckList.cpp
src/slic3r/GUI/Widgets/SwitchButton.cpp
src/slic3r/GUI/Widgets/MultiNozzleSync.cpp
src/slic3r/GUI/Widgets/ProgressDialog.cpp
src/slic3r/GUI/ImGuiWrapper.cpp
src/slic3r/GUI/Jobs/ArrangeJob.cpp
src/slic3r/GUI/Jobs/OrientJob.cpp
@@ -274,4 +287,6 @@ src/slic3r/GUI/DownloaderFileGet.cpp
src/slic3r/GUI/FileArchiveDialog.cpp
src/slic3r/GUI/PrinterCloudAuthDialog.cpp
src/slic3r/GUI/PrinterWebViewHandler.cpp
src/slic3r/GUI/AMSDryControl.cpp
src/slic3r/GUI/AMSDryControl.hpp
src/libslic3r/PresetBundle.cpp

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="20" height="20" rx="10" fill="#00AF42" fill-opacity="0.2"/>
<path d="M14.0828 8.14395L9.08284 13.144C9.0393 13.1877 8.98755 13.2223 8.93057 13.246C8.87359 13.2696 8.81251 13.2818 8.75081 13.2818C8.68912 13.2818 8.62803 13.2696 8.57105 13.246C8.51408 13.2223 8.46233 13.1877 8.41878 13.144L6.23128 10.9565C6.18768 10.9129 6.15309 10.8611 6.12949 10.8041C6.1059 10.7471 6.09375 10.6861 6.09375 10.6244C6.09375 10.5628 6.1059 10.5017 6.12949 10.4447C6.15309 10.3878 6.18768 10.336 6.23128 10.2924C6.27488 10.2488 6.32665 10.2142 6.38362 10.1906C6.44059 10.167 6.50165 10.1549 6.56331 10.1549C6.62498 10.1549 6.68604 10.167 6.74301 10.1906C6.79998 10.2142 6.85174 10.2488 6.89534 10.2924L8.7512 12.1482L13.4196 7.48067C13.5076 7.39261 13.6271 7.34314 13.7516 7.34314C13.8761 7.34314 13.9956 7.39261 14.0836 7.48067C14.1717 7.56873 14.2212 7.68817 14.2212 7.8127C14.2212 7.93724 14.1717 8.05667 14.0836 8.14473L14.0828 8.14395Z" fill="#00AF42" stroke="#00AF42" stroke-width="0.833333"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9.35422" fill="#E14747" stroke="#E14747" stroke-width="1.29157"/>
<rect x="11" y="6" width="2" height="9" rx="1" fill="white"/>
<rect x="11" y="16" width="2" height="2" rx="1" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 321 B

View File

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.80005 12.3C1.80005 6.83238 6.23243 2.4 11.7 2.4C17.1677 2.4 21.6 6.83238 21.6 12.3C21.6 17.7676 17.1677 22.2 11.7 22.2C6.23243 22.2 1.80005 17.7676 1.80005 12.3Z" fill="#009688"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.7742 8.66235C18.0746 8.9415 18.0918 9.41131 17.8126 9.7117L12.2128 15.7376C11.5275 16.4751 10.36 16.4751 9.67461 15.7376L6.82482 12.6709C6.54567 12.3706 6.56289 11.9007 6.86328 11.6216C7.16367 11.3424 7.63348 11.3597 7.91263 11.66L10.7624 14.7267C10.8603 14.832 11.0271 14.832 11.125 14.7267L16.7248 8.70081C17.004 8.40042 17.4738 8.3832 17.7742 8.66235Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 759 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.3125 0.7125V2.6125C8.3125 3.00734 7.99484 3.325 7.6 3.325C7.20516 3.325 6.8875 3.00734 6.8875 2.6125V0.7125C6.8875 0.317656 7.20516 0 7.6 0C7.99484 0 8.3125 0.317656 8.3125 0.7125ZM12.9734 3.23297L11.6286 4.57781C11.3495 4.85687 10.8983 4.85687 10.6222 4.57781C10.3461 4.29875 10.3431 3.8475 10.6222 3.57141L11.967 2.22656C12.2461 1.9475 12.6973 1.9475 12.9734 2.22656C13.2495 2.50562 13.2525 2.95688 12.9734 3.23297ZM3.23297 2.22656L4.57781 3.57141C4.85687 3.85047 4.85687 4.30172 4.57781 4.57781C4.29875 4.85391 3.8475 4.85687 3.57141 4.57781L2.22656 3.23297C1.9475 2.95391 1.9475 2.50266 2.22656 2.22656C2.50562 1.95047 2.95688 1.9475 3.23297 2.22656ZM0.7125 6.8875H2.6125C3.00734 6.8875 3.325 7.20516 3.325 7.6C3.325 7.99484 3.00734 8.3125 2.6125 8.3125H0.7125C0.317656 8.3125 0 7.99484 0 7.6C0 7.20516 0.317656 6.8875 0.7125 6.8875ZM12.5875 6.8875H14.4875C14.8823 6.8875 15.2 7.20516 15.2 7.6C15.2 7.99484 14.8823 8.3125 14.4875 8.3125H12.5875C12.1927 8.3125 11.875 7.99484 11.875 7.6C11.875 7.20516 12.1927 6.8875 12.5875 6.8875ZM4.57781 11.6316L3.23297 12.9734C2.95391 13.2525 2.50266 13.2525 2.22656 12.9734C1.95047 12.6944 1.9475 12.2431 2.22656 11.967L3.57141 10.6222C3.85047 10.3431 4.30172 10.3431 4.57781 10.6222C4.85391 10.9012 4.85687 11.3525 4.57781 11.6286V11.6316ZM11.6316 10.6252L12.9734 11.967C13.2525 12.2461 13.2525 12.6973 12.9734 12.9734C12.6944 13.2495 12.2431 13.2525 11.967 12.9734L10.6222 11.6286C10.3431 11.3495 10.3431 10.8983 10.6222 10.6222C10.9012 10.3461 11.3525 10.3431 11.6286 10.6222L11.6316 10.6252ZM8.3125 12.5875V14.4875C8.3125 14.8823 7.99484 15.2 7.6 15.2C7.20516 15.2 6.8875 14.8823 6.8875 14.4875V12.5875C6.8875 12.1927 7.20516 11.875 7.6 11.875C7.99484 11.875 8.3125 12.1927 8.3125 12.5875ZM9.5 7.6C9.5 7.09609 9.29982 6.61282 8.9435 6.2565C8.58718 5.90018 8.10391 5.7 7.6 5.7C7.09609 5.7 6.61282 5.90018 6.2565 6.2565C5.90018 6.61282 5.7 7.09609 5.7 7.6C5.7 8.10391 5.90018 8.58718 6.2565 8.9435C6.61282 9.29982 7.09609 9.5 7.6 9.5C8.10391 9.5 8.58718 9.29982 8.9435 8.9435C9.29982 8.58718 9.5 8.10391 9.5 7.6ZM4.275 7.6C4.275 6.71815 4.62531 5.87243 5.24887 5.24887C5.87243 4.62531 6.71815 4.275 7.6 4.275C8.48184 4.275 9.32757 4.62531 9.95113 5.24887C10.5747 5.87243 10.925 6.71815 10.925 7.6C10.925 8.48184 10.5747 9.32757 9.95113 9.95113C9.32757 10.5747 8.48184 10.925 7.6 10.925C6.71815 10.925 5.87243 10.5747 5.24887 9.95113C4.62531 9.32757 4.275 8.48184 4.275 7.6Z" fill="#F09A17"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28.0424 15.4264C28.6059 15.3044 28.7112 14.8962 28.2789 14.5156L16.5815 4.28496C16.1473 3.90625 15.438 3.9044 15.0038 4.28311L3.26759 14.5156C2.83346 14.8943 2.93876 15.3026 3.5022 15.4245L4.90989 15.7275C5.47333 15.8494 5.93332 16.4202 5.93332 16.9966V26.5216C5.93332 27.0979 6.4044 27.569 6.98077 27.569H11.9354C12.5117 27.569 12.9828 27.0979 12.9828 26.5216V21.9512C12.9828 21.3748 13.4539 20.9038 14.0303 20.9038H17.3721C17.9485 20.9038 18.4196 21.3748 18.4196 21.9512V26.5216C18.4196 27.0979 18.8907 27.569 19.467 27.569H24.5657C25.1421 27.569 25.6132 27.0979 25.6132 26.5216V16.9966C25.6132 16.4202 26.0732 15.8494 26.6366 15.7293L28.0424 15.4264Z" fill="#00AE42" fill-opacity="0.2" stroke="#00AE42" stroke-width="0.784708" stroke-miterlimit="10" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 891 B

View File

@@ -0,0 +1,16 @@
<svg width="20" height="46" viewBox="0 0 20 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.3">
<rect width="20" height="14.6081" fill="#C2C2C2"/>
<rect y="7.45947" width="20" height="0.621622" fill="#858585"/>
<rect y="5.28381" width="20" height="0.621622" fill="#858585"/>
<rect y="9.63513" width="20" height="0.621622" fill="#858585"/>
<rect y="11.8108" width="20" height="0.621621" fill="#858585"/>
<rect y="13.9865" width="20" height="0.621622" fill="#858585"/>
<rect x="5.71429" y="14.6081" width="8.57143" height="20.8243" fill="#A3A3A3"/>
<rect x="4.57144" y="1.86487" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<rect x="13.1429" y="1.86487" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<path d="M8.85715 43.2027H11.1429L10.4812 45.6892L9.57895 45.6892L8.85715 43.2027Z" fill="#5C5C5C"/>
<path d="M4.57144 39.7838H15.4286L14.2857 35.4325H5.7143L4.57144 39.7838Z" fill="#D9D9D9"/>
<path d="M4.57144 39.7838H15.4286L12.2857 43.2027L8.00001 43.2027L4.57144 39.7838Z" fill="#C2C2C2"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,14 @@
<svg width="20" height="46" viewBox="0 0 20 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="20" height="14.6081" fill="#C2C2C2"/>
<rect y="7.45947" width="20" height="0.621622" fill="#858585"/>
<rect y="5.28381" width="20" height="0.621622" fill="#858585"/>
<rect y="9.63513" width="20" height="0.621622" fill="#858585"/>
<rect y="11.8108" width="20" height="0.621621" fill="#858585"/>
<rect y="13.9865" width="20" height="0.621622" fill="#858585"/>
<rect x="5.71429" y="14.6081" width="8.57143" height="20.8243" fill="#A3A3A3"/>
<rect x="4.57141" y="1.86487" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<rect x="13.1429" y="1.86487" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<path d="M8.85712 43.2027H11.1428L10.4812 45.6892L9.57892 45.6892L8.85712 43.2027Z" fill="#5C5C5C"/>
<path d="M4.57141 39.7838H15.4286L14.2857 35.4325H5.71427L4.57141 39.7838Z" fill="#D9D9D9"/>
<path d="M4.57141 39.7838H15.4286L12.2857 43.2027L7.99998 43.2027L4.57141 39.7838Z" fill="#C2C2C2"/>
</svg>

After

Width:  |  Height:  |  Size: 1009 B

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.99998 2.58331C9.43657 2.58331 10.8143 3.154 11.8301 4.16982C12.846 5.18564 13.4166 6.56339 13.4166 7.99998C13.4166 9.43657 12.846 10.8143 11.8301 11.8301C10.8143 12.846 9.43657 13.4166 7.99998 13.4166C6.56339 13.4166 5.18564 12.846 4.16982 11.8301C3.154 10.8143 2.58331 9.43657 2.58331 7.99998C2.58331 6.56339 3.154 5.18564 4.16982 4.16982C5.18564 3.154 6.56339 2.58331 7.99998 2.58331ZM7.99998 14.6666C9.76809 14.6666 11.4638 13.9643 12.714 12.714C13.9643 11.4638 14.6666 9.76809 14.6666 7.99998C14.6666 6.23187 13.9643 4.53618 12.714 3.28593C11.4638 2.03569 9.76809 1.33331 7.99998 1.33331C6.23187 1.33331 4.53618 2.03569 3.28593 3.28593C2.03569 4.53618 1.33331 6.23187 1.33331 7.99998C1.33331 9.76809 2.03569 11.4638 3.28593 12.714C4.53618 13.9643 6.23187 14.6666 7.99998 14.6666ZM7.99998 4.66665C7.65363 4.66665 7.37498 4.94529 7.37498 5.29165V8.20831C7.37498 8.55467 7.65363 8.83331 7.99998 8.83331C8.34633 8.83331 8.62498 8.55467 8.62498 8.20831V5.29165C8.62498 4.94529 8.34633 4.66665 7.99998 4.66665ZM8.83331 10.5C8.83331 10.279 8.74552 10.067 8.58924 9.91072C8.43295 9.75444 8.22099 9.66665 7.99998 9.66665C7.77897 9.66665 7.567 9.75444 7.41072 9.91072C7.25444 10.067 7.16665 10.279 7.16665 10.5C7.16665 10.721 7.25444 10.933 7.41072 11.0892C7.567 11.2455 7.77897 11.3333 7.99998 11.3333C8.22099 11.3333 8.43295 11.2455 8.58924 11.0892C8.74552 10.933 8.83331 10.721 8.83331 10.5Z" fill="#E14747"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,15 @@
<svg width="20" height="46" viewBox="0 0 20 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="20" height="14.6081" fill="#C2C2C2"/>
<rect y="7.45947" width="20" height="0.621622" fill="#858585"/>
<rect y="5.28381" width="20" height="0.621622" fill="#858585"/>
<rect y="9.63513" width="20" height="0.621622" fill="#858585"/>
<rect y="11.8108" width="20" height="0.621621" fill="#858585"/>
<rect y="13.9865" width="20" height="0.621622" fill="#858585"/>
<rect x="5.71429" y="14.6081" width="8.57143" height="20.8243" fill="#A3A3A3"/>
<rect x="9.14285" y="14.6081" width="1.71428" height="20.8243" fill="#FFF735"/>
<rect x="4.57144" y="1.86487" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<rect x="13.1429" y="1.86487" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<path d="M8.85715 43.2027H11.1429L10.4812 45.6892L9.57895 45.6892L8.85715 43.2027Z" fill="#5C5C5C"/>
<path d="M4.57144 39.7838H15.4286L14.2857 35.4325H5.7143L4.57144 39.7838Z" fill="#D9D9D9"/>
<path d="M4.57144 39.7838H15.4286L12.2857 43.2027L8.00001 43.2027L4.57144 39.7838Z" fill="#C2C2C2"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,11 @@
<svg width="14" height="22" viewBox="0 0 14 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.400024" width="13.2" height="9.9" fill="#C2C2C2"/>
<rect x="0.400024" y="4.3999" width="13.2" height="1.1" fill="#858585"/>
<rect x="0.400024" y="6.6001" width="13.2" height="1.1" fill="#858585"/>
<rect x="3.70001" y="9.8999" width="6.6" height="6.6" fill="#A3A3A3"/>
<rect x="2.60004" y="1.1001" width="2.2" height="2.2" fill="#DBDBDB"/>
<rect x="9.20001" y="1.1001" width="2.2" height="2.2" fill="#DBDBDB"/>
<path d="M5.90002 19.7998H8.10002L7.46318 21.9998L6.59476 21.9998L5.90002 19.7998Z" fill="#A3A3A3"/>
<path d="M2.60004 17.6001H11.4L10.4737 15.4001H3.52635L2.60004 17.6001Z" fill="#D9D9D9"/>
<path d="M2.60004 17.6001H11.4L8.85267 19.8001L5.37898 19.8001L2.60004 17.6001Z" fill="#C2C2C2"/>
</svg>

After

Width:  |  Height:  |  Size: 813 B

View File

@@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 7C20 3.13401 16.866 0 13 0H0L20 20V7Z" fill="#1F1F1F"/>
<path d="M12.8252 8.44141L17.4922 3.77441L18.1817 4.46384L12.8252 9.82027L9.48071 6.47575L10.1701 5.78632L12.8252 8.44141Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 311 B

View File

@@ -0,0 +1,14 @@
<svg width="20" height="46" viewBox="0 0 20 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="20" height="14.6081" fill="#C2C2C2"/>
<rect y="7.45947" width="20" height="0.621622" fill="#858585"/>
<rect y="5.28381" width="20" height="0.621622" fill="#858585"/>
<rect y="9.63513" width="20" height="0.621622" fill="#858585"/>
<rect y="11.8108" width="20" height="0.621621" fill="#858585"/>
<rect y="13.9865" width="20" height="0.621622" fill="#858585"/>
<rect x="5.71429" y="14.6081" width="8.57143" height="20.8243" fill="#A3A3A3"/>
<rect x="4.57141" y="1.86487" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<rect x="13.1429" y="1.86487" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<path d="M8.85712 43.2027H11.1428L10.4812 45.6892L9.57892 45.6892L8.85712 43.2027Z" fill="#5C5C5C"/>
<path d="M4.57141 39.7838H15.4286L14.2857 35.4325H5.71427L4.57141 39.7838Z" fill="#D9D9D9"/>
<path d="M4.57141 39.7838H15.4286L12.2857 43.2027L7.99998 43.2027L4.57141 39.7838Z" fill="#C2C2C2"/>
</svg>

After

Width:  |  Height:  |  Size: 1009 B

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 3.875C14.1549 3.875 16.2215 4.73102 17.7452 6.25476C19.269 7.77849 20.125 9.84512 20.125 12C20.125 14.1549 19.269 16.2215 17.7452 17.7452C16.2215 19.269 14.1549 20.125 12 20.125C9.84512 20.125 7.77849 19.269 6.25476 17.7452C4.73102 16.2215 3.875 14.1549 3.875 12C3.875 9.84512 4.73102 7.77849 6.25476 6.25476C7.77849 4.73102 9.84512 3.875 12 3.875ZM12 22C14.6522 22 17.1957 20.9464 19.0711 19.0711C20.9464 17.1957 22 14.6522 22 12C22 9.34784 20.9464 6.8043 19.0711 4.92893C17.1957 3.05357 14.6522 2 12 2C9.34784 2 6.8043 3.05357 4.92893 4.92893C3.05357 6.8043 2 9.34784 2 12C2 14.6522 3.05357 17.1957 4.92893 19.0711C6.8043 20.9464 9.34784 22 12 22ZM16.1016 10.7109L12.6641 7.27344C12.2969 6.90625 11.7031 6.90625 11.3398 7.27344L7.90234 10.7109C7.53516 11.0781 7.53516 11.6719 7.90234 12.0352C8.26953 12.3984 8.86328 12.4023 9.22656 12.0352L11.0625 10.1992V16.0625C11.0625 16.582 11.4805 17 12 17C12.5195 17 12.9375 16.582 12.9375 16.0625V10.1992L14.7734 12.0352C15.1406 12.4023 15.7344 12.4023 16.0977 12.0352C16.4609 11.668 16.4648 11.0742 16.0977 10.7109H16.1016Z" fill="#1F1F1F"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,28 @@
<svg width="98" height="92" viewBox="0 0 98 92" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0H85.4128V76.8716C85.4128 83.0784 80.3812 88.1101 74.1743 88.1101H11.2385C5.03166 88.1101 0 83.0784 0 76.8716V0Z" fill="url(#paint0_linear_1430_186)"/>
<path d="M4.04587 0.449524H81.8165V75.9725C81.8165 80.938 77.7912 84.9633 72.8257 84.9633H13.0367C8.0712 84.9633 4.04587 80.938 4.04587 75.9725V0.449524Z" fill="url(#paint1_linear_1430_186)"/>
<g opacity="0.3">
<path d="M20.6789 54.8441H42.2569V70.4609H20.6789V54.8441Z" fill="#333333"/>
<path d="M20.6789 54.8441H42.2569V55.4447H20.6789V54.8441Z" fill="#858585"/>
<path d="M20.6789 57.4472H42.2569V58.0479H20.6789V57.4472Z" fill="#858585"/>
<path d="M20.6789 60.0494H42.2569V60.6501H20.6789V60.0494Z" fill="#858585"/>
<path d="M20.6789 62.6526H42.2569V63.2532H20.6789V62.6526Z" fill="#858585"/>
<path d="M20.6789 65.2558H42.2569V65.8564H20.6789V65.2558Z" fill="#858585"/>
<path d="M20.6789 67.8589H42.2569V68.4596H20.6789V67.8589Z" fill="#858585"/>
<path d="M20.6789 70.4612H42.2569V71.0618H20.6789V70.4612Z" fill="#858585"/>
<path d="M29.6258 88.9632H33.0467L32.0965 91.2569H30.6711L29.6258 88.9632Z" fill="#323A3D"/>
<path d="M23.5735 71.2891H39.3623V82.4478H23.5735V71.2891Z" fill="#333333"/>
<path d="M25.6787 82.4475H36.994V89.2015H25.6787V82.4475Z" fill="#333333"/>
</g>
<path d="M85.4128 62.9358H98V78.6697H85.4128V62.9358Z" fill="#A5A5A5"/>
<defs>
<linearGradient id="paint0_linear_1430_186" x1="42.7064" y1="0" x2="42.7064" y2="88.1101" gradientUnits="userSpaceOnUse">
<stop stop-color="#A4A4A4" stop-opacity="0"/>
<stop offset="1" stop-color="#A4A4A4"/>
</linearGradient>
<linearGradient id="paint1_linear_1430_186" x1="42.9312" y1="0.449524" x2="42.9312" y2="84.9633" gradientUnits="userSpaceOnUse">
<stop stop-color="#BABABA" stop-opacity="0"/>
<stop offset="1" stop-color="#BABABA"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,42 @@
<svg width="98" height="102" viewBox="0 0 98 102" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0H85.4128V77.4975C85.4128 83.7549 80.3812 88.8276 74.1743 88.8276H11.2385C5.03166 88.8276 0 83.7549 0 77.4975V0Z" fill="url(#paint0_linear_4100_4174)"/>
<path d="M4.0459 0.453125H81.8166V76.591C81.8166 81.597 77.7912 85.6551 72.8257 85.6551H13.0367C8.07123 85.6551 4.0459 81.597 4.0459 76.591V0.453125Z" fill="url(#paint1_linear_4100_4174)"/>
<g opacity="0.1">
<path d="M20 56H42V71.4398H20V56Z" fill="#333333"/>
<path d="M20 56H42V56.5938H20V56Z" fill="#858585"/>
<path d="M20 58.5736H42V59.1674H20V58.5736Z" fill="#858585"/>
<path d="M20 61.1464H42V61.7402H20V61.1464Z" fill="#858585"/>
<path d="M20 63.72H42V64.3138H20V63.72Z" fill="#858585"/>
<path d="M20 66.2937H42V66.8875H20V66.2937Z" fill="#858585"/>
<path d="M20 68.8673H42V69.4611H20V68.8673Z" fill="#858585"/>
<path d="M20 71.4401H42V72.0339H20V71.4401Z" fill="#858585"/>
<path d="M29.1218 89.7323H32.6096L31.6408 92H30.1875L29.1218 89.7323Z" fill="#323A3D"/>
<path d="M22.9512 72.2585H39.0487V83.2908H22.9512V72.2585Z" fill="#333333"/>
<path d="M25.0977 83.2905H36.6342V89.9679H25.0977V83.2905Z" fill="#333333"/>
</g>
<path d="M85.4128 63.4482H98V79.3103H85.4128V63.4482Z" fill="#C2C2C2"/>
<rect x="47" y="56" width="20" height="14.6081" fill="#C2C2C2"/>
<rect x="47" y="63.4595" width="20" height="0.621622" fill="#858585"/>
<rect x="47" y="61.2838" width="20" height="0.621622" fill="#858585"/>
<rect x="47" y="65.6351" width="20" height="0.621622" fill="#858585"/>
<rect x="47" y="67.8108" width="20" height="0.621621" fill="#858585"/>
<rect x="47" y="69.9865" width="20" height="0.621622" fill="#858585"/>
<rect x="52.7142" y="70.6082" width="8.57143" height="20.8243" fill="#A3A3A3"/>
<rect x="56.1428" y="70.6082" width="1.71428" height="20.8243" fill="#FFF735"/>
<rect x="51.5714" y="57.8649" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<rect x="60.1428" y="57.8649" width="2.28571" height="2.48649" fill="#DBDBDB"/>
<path d="M55.8572 99.2028H58.1429L57.4812 101.689L56.579 101.689L55.8572 99.2028Z" fill="#5C5C5C"/>
<path d="M51.5714 95.7838H62.4286L61.2857 91.4325H52.7143L51.5714 95.7838Z" fill="#D9D9D9"/>
<path d="M51.5714 95.7838H62.4286L59.2857 99.2027L55 99.2027L51.5714 95.7838Z" fill="#C2C2C2"/>
<path d="M54.2189 51V42.2727H57.1678C57.8496 42.2727 58.4093 42.3892 58.8468 42.6222C59.2843 42.8523 59.6081 43.169 59.8184 43.5724C60.0286 43.9759 60.1337 44.4347 60.1337 44.9489C60.1337 45.4631 60.0286 45.919 59.8184 46.3168C59.6081 46.7145 59.2857 47.027 58.851 47.2543C58.4164 47.4787 57.861 47.5909 57.1848 47.5909H54.7985V46.6364H57.1507C57.6167 46.6364 57.9917 46.5682 58.2757 46.4318C58.5627 46.2955 58.7701 46.1023 58.8979 45.8523C59.0286 45.5994 59.0939 45.2983 59.0939 44.9489C59.0939 44.5994 59.0286 44.294 58.8979 44.0327C58.7672 43.7713 58.5584 43.5696 58.2715 43.4276C57.9846 43.2827 57.6053 43.2102 57.1337 43.2102H55.2757V51H54.2189ZM58.3269 47.0795L60.4746 51H59.2473L57.1337 47.0795H58.3269Z" fill="black"/>
<defs>
<linearGradient id="paint0_linear_4100_4174" x1="42.7064" y1="0" x2="42.7064" y2="88.8276" gradientUnits="userSpaceOnUse">
<stop stop-color="#BAB7B7" stop-opacity="0"/>
<stop offset="1" stop-color="#BAB7B7"/>
</linearGradient>
<linearGradient id="paint1_linear_4100_4174" x1="42.9312" y1="0.453125" x2="42.9312" y2="85.6551" gradientUnits="userSpaceOnUse">
<stop stop-color="#D7D5D5" stop-opacity="0"/>
<stop offset="1" stop-color="#D7D5D5"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,3 @@
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.23759 3.02832C9.67418 3.02832 11.0519 3.599 12.0678 4.61483C13.0836 5.63065 13.6543 7.0084 13.6543 8.44499C13.6543 9.88158 13.0836 11.2593 12.0678 12.2751C11.0519 13.291 9.67418 13.8617 8.23759 13.8617C6.801 13.8617 5.42325 13.291 4.40743 12.2751C3.39161 11.2593 2.82092 9.88158 2.82092 8.44499C2.82092 7.0084 3.39161 5.63065 4.40743 4.61483C5.42325 3.599 6.801 3.02832 8.23759 3.02832ZM8.23759 15.1117C10.0057 15.1117 11.7014 14.4093 12.9516 13.159C14.2019 11.9088 14.9043 10.2131 14.9043 8.44499C14.9043 6.67688 14.2019 4.98118 12.9516 3.73094C11.7014 2.4807 10.0057 1.77832 8.23759 1.77832C6.46948 1.77832 4.77379 2.4807 3.52354 3.73094C2.2733 4.98118 1.57092 6.67688 1.57092 8.44499C1.57092 10.2131 2.2733 11.9088 3.52354 13.159C4.77379 14.4093 6.46948 15.1117 8.23759 15.1117ZM8.23759 5.11165C7.89124 5.11165 7.61259 5.3903 7.61259 5.73665V8.65332C7.61259 8.99967 7.89124 9.27832 8.23759 9.27832C8.58394 9.27832 8.86259 8.99967 8.86259 8.65332V5.73665C8.86259 5.3903 8.58394 5.11165 8.23759 5.11165ZM9.07092 10.945C9.07092 10.724 8.98313 10.512 8.82685 10.3557C8.67056 10.1995 8.4586 10.1117 8.23759 10.1117C8.01658 10.1117 7.80461 10.1995 7.64833 10.3557C7.49205 10.512 7.40426 10.724 7.40426 10.945C7.40426 11.166 7.49205 11.378 7.64833 11.5342C7.80461 11.6905 8.01658 11.7783 8.23759 11.7783C8.4586 11.7783 8.67056 11.6905 8.82685 11.5342C8.98313 11.378 9.07092 11.166 9.07092 10.945Z" fill="#D01B1B"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,47 @@
<svg width="117" height="133" viewBox="0 0 117 133" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.625977 0.652832H101.727V92.8972C101.727 99.8008 96.1307 105.397 89.2272 105.397H13.126C6.22243 105.397 0.625977 99.8008 0.625977 92.8972V0.652832Z" fill="url(#paint0_linear_3544_2531)"/>
<path d="M5.41504 1.18701H97.4703V91.6561C97.4703 97.179 92.9932 101.656 87.4703 101.656H15.415C9.8922 101.656 5.41504 97.179 5.41504 91.6561V1.18701Z" fill="url(#paint1_linear_3544_2531)"/>
<rect x="101.727" y="75.4702" width="14.8991" height="18.7044" fill="#D1D1D1"/>
<rect x="64.6074" y="81.0449" width="22.6076" height="16.2354" fill="#C2C2C2"/>
<rect x="64.6074" y="89.335" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="64.6074" y="86.917" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="64.6074" y="91.7529" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="64.6074" y="94.1714" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="64.6074" y="96.5894" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="71.0664" y="97.2803" width="9.68895" height="23.144" fill="#A3A3A3"/>
<rect x="74.9414" y="97.2803" width="1.93779" height="23.144" fill="#E1E1E1"/>
<rect x="69.7744" y="83.1172" width="2.58372" height="2.76346" fill="#DBDBDB"/>
<rect x="79.4629" y="83.1172" width="2.58372" height="2.76346" fill="#DBDBDB"/>
<path d="M74.6191 129.06H77.2029L76.4549 131.824L75.4351 131.824L74.6191 129.06Z" fill="#5C5C5C"/>
<path d="M69.7744 125.26H82.0471L80.7552 120.424H71.0663L69.7744 125.26Z" fill="#D9D9D9"/>
<path d="M69.7744 125.26H82.0471L78.4945 129.06L73.65 129.06L69.7744 125.26Z" fill="#C2C2C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M88.2139 98.248H81.7539V120.259L83.1562 125.507L82.7773 125.911L78.9277 130.027H77.9688L77.4199 132.053L77.2207 132.791H74.6875L73.8711 130.027H73.2422L68.6572 125.534L68.8086 124.971L70.0654 120.266V98.248H63.6064V80.0127H88.2139V98.248ZM75.4346 131.791H76.4551L77.2031 129.028H74.6191L75.4346 131.791ZM69.7744 125.229L73.6504 129.027H78.4941L82.0469 125.229L80.7549 120.393H71.0664L69.7744 125.229ZM64.6064 97.248H71.0654V120.392H80.7539V97.248H87.2139V81.0127H64.6064V97.248Z" fill="#009688"/>
<path d="M67.9434 89.6042C67.9434 85.2044 71.5101 81.6033 75.9098 81.6033C80.3096 81.6033 83.8763 85.2044 83.8763 89.6042C83.8763 94.004 80.3096 97.6051 75.9098 97.6051C71.5101 97.6051 67.9434 94.004 67.9434 89.6042Z" fill="#009688"/>
<path d="M67.9434 89.6042C67.9434 85.2044 71.5101 81.6033 75.9098 81.6033C80.3096 81.6033 83.8763 85.2044 83.8763 89.6042C83.8763 94.004 80.3096 97.6051 75.9098 97.6051C71.5101 97.6051 67.9434 94.004 67.9434 89.6042Z" fill="black" fill-opacity="0.08"/>
<path d="M74.7449 92.9745L71.9268 90.1442L73.3308 88.734L74.7349 90.1442L78.2601 86.6038L79.6642 88.0139L74.7449 92.9745Z" fill="white"/>
<path d="M18.5156 80.0127H44.057V98.5779H18.5156V80.0127Z" fill="#C2C2C2"/>
<path d="M18.5156 80.0127H44.057V80.7267H18.5156V80.0127Z" fill="#858585"/>
<path d="M18.5156 83.1068H44.057V83.8208H18.5156V83.1068Z" fill="#858585"/>
<path d="M18.5156 86.2004H44.057V86.9144H18.5156V86.2004Z" fill="#858585"/>
<path d="M18.5156 89.2955H44.057V90.0094H18.5156V89.2955Z" fill="#858585"/>
<path d="M18.5156 92.3901H44.057V93.104H18.5156V92.3901Z" fill="#858585"/>
<path d="M18.5156 95.4851H44.057V96.1991H18.5156V95.4851Z" fill="#858585"/>
<path d="M18.5156 98.5779H44.057V99.2922H18.5156V98.5779Z" fill="#858585"/>
<path d="M29.1064 120.573H33.1557L32.0309 123.299H30.3437L29.1064 120.573Z" fill="#D9D9D9"/>
<path d="M21.9424 99.5618H40.6312V112.827H21.9424V99.5618Z" fill="#A3A3A3"/>
<path d="M24.4355 112.827H37.8292V120.856H24.4355V112.827Z" fill="#A3A3A3"/>
<path d="M18.5156 80.0127V99.292H21.9424V112.827H24.4355V120.856H29.2354L30.3438 123.3H32.0312L33.0381 120.856H37.8291V112.827H40.6309V99.292H44.0566V80.0127H18.5156ZM45.0566 100.292H41.6309V113.827H38.8291V121.856H33.708L32.7012 124.3H29.6992L28.5908 121.856H23.4355V113.827H20.9424V100.292H17.5156V79.0127H45.0566V100.292Z" fill="#009688"/>
<path d="M22.9863 88.9478C22.9863 84.548 26.553 80.9469 30.9528 80.9469C35.3526 80.9469 38.9193 84.548 38.9193 88.9478C38.9193 93.3475 35.3526 96.9486 30.9528 96.9486C26.553 96.9486 22.9863 93.3475 22.9863 88.9478Z" fill="#009688"/>
<path d="M22.9863 88.9478C22.9863 84.548 26.553 80.9469 30.9528 80.9469C35.3526 80.9469 38.9193 84.548 38.9193 88.9478C38.9193 93.3475 35.3526 96.9486 30.9528 96.9486C26.553 96.9486 22.9863 93.3475 22.9863 88.9478Z" fill="black" fill-opacity="0.08"/>
<path d="M29.7877 92.3181L26.9696 89.4878L28.3737 88.0777L29.7777 89.4878L33.3029 85.9474L34.707 87.3576L29.7877 92.3181Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear_3544_2531" x1="51.1766" y1="0.652832" x2="51.1766" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#333333" stop-opacity="0"/>
<stop offset="1" stop-color="#333333" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_3544_2531" x1="51.4427" y1="1.18701" x2="51.4427" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#474747" stop-opacity="0"/>
<stop offset="1" stop-color="#474747" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -0,0 +1,47 @@
<svg width="118" height="136" viewBox="0 0 118 136" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.625977 0.652344H101.727V92.8967C101.727 99.8003 96.1307 105.397 89.2272 105.397H13.126C6.22243 105.397 0.625977 99.8003 0.625977 92.8967V0.652344Z" fill="url(#paint0_linear_4627_4051)"/>
<path d="M5.41504 1.18652H97.4703V91.6556C97.4703 97.1785 92.9932 101.656 87.4703 101.656H15.415C9.8922 101.656 5.41504 97.1785 5.41504 91.6556V1.18652Z" fill="url(#paint1_linear_4627_4051)"/>
<path d="M116.626 75.4697H101.727V94.1741H116.626V75.4697Z" fill="#646464"/>
<path d="M87.215 81.0449H64.6074V97.2803H87.215V81.0449Z" fill="#959595"/>
<path d="M87.215 89.335H64.6074V90.0258H87.215V89.335Z" fill="#858585"/>
<path d="M87.215 86.917H64.6074V87.6079H87.215V86.917Z" fill="#858585"/>
<path d="M87.215 91.7529H64.6074V92.4438H87.215V91.7529Z" fill="#858585"/>
<path d="M87.215 94.1719H64.6074V94.8627H87.215V94.1719Z" fill="#858585"/>
<path d="M87.215 96.5898H64.6074V97.2807H87.215V96.5898Z" fill="#858585"/>
<path d="M80.7554 97.2803H71.0664V120.424H80.7554V97.2803Z" fill="#737373"/>
<path d="M76.8792 97.2803H74.9414V120.424H76.8792V97.2803Z" fill="#9D9D9D"/>
<path d="M72.3581 83.1172H69.7744V85.8806H72.3581V83.1172Z" fill="#B3B3B3"/>
<path d="M82.0466 83.1172H79.4629V85.8806H82.0466V83.1172Z" fill="#B3B3B3"/>
<path d="M74.6191 129.06H77.2029L76.4549 131.824H75.4351L74.6191 129.06Z" fill="#5C5C5C"/>
<path d="M69.7744 125.26H82.0471L80.7552 120.424H71.0663L69.7744 125.26Z" fill="#9F9F9F"/>
<path d="M69.7744 125.26H82.0471L78.4945 129.06H73.65L69.7744 125.26Z" fill="#8F8F8F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M88.2139 98.248H81.7539V120.259L83.1562 125.507L82.7773 125.911L78.9277 130.027H77.9688L77.4199 132.053L77.2207 132.791H74.6875L73.8711 130.027H73.2422L68.6572 125.534L68.8086 124.971L70.0654 120.266V98.248H63.6064V80.0127H88.2139V98.248ZM75.4346 131.791H76.4551L77.2031 129.028H74.6191L75.4346 131.791ZM69.7744 125.229L73.6504 129.027H78.4941L82.0469 125.229L80.7549 120.393H71.0664L69.7744 125.229ZM64.6064 97.248H71.0654V120.392H80.7539V97.248H87.2139V81.0127H64.6064V97.248Z" fill="#009688"/>
<path d="M67.9434 89.6044C67.9434 85.2046 71.5101 81.6035 75.9098 81.6035C80.3096 81.6035 83.8763 85.2046 83.8763 89.6044C83.8763 94.0042 80.3096 97.6053 75.9098 97.6053C71.5101 97.6053 67.9434 94.0042 67.9434 89.6044Z" fill="#009688"/>
<path d="M67.9434 89.6044C67.9434 85.2046 71.5101 81.6035 75.9098 81.6035C80.3096 81.6035 83.8763 85.2046 83.8763 89.6044C83.8763 94.0042 80.3096 97.6053 75.9098 97.6053C71.5101 97.6053 67.9434 94.0042 67.9434 89.6044Z" fill="black" fill-opacity="0.08"/>
<path d="M74.7449 92.9742L71.9268 90.1439L73.3308 88.7337L74.7349 90.1439L78.2601 86.6035L79.6642 88.0136L74.7449 92.9742Z" fill="white"/>
<path d="M18.5156 80.0127H44.057V98.5779H18.5156V80.0127Z" fill="#959595"/>
<path d="M18.5156 80.0127H44.057V80.7267H18.5156V80.0127Z" fill="#6E6E6E"/>
<path d="M18.5156 83.1064H44.057V83.8204H18.5156V83.1064Z" fill="#6E6E6E"/>
<path d="M18.5156 86.2002H44.057V86.9142H18.5156V86.2002Z" fill="#6E6E6E"/>
<path d="M18.5156 89.2959H44.057V90.0098H18.5156V89.2959Z" fill="#6E6E6E"/>
<path d="M18.5156 92.3896H44.057V93.1035H18.5156V92.3896Z" fill="#6E6E6E"/>
<path d="M18.5156 95.4854H44.057V96.1993H18.5156V95.4854Z" fill="#6E6E6E"/>
<path d="M18.5156 98.5781H44.057V99.2924H18.5156V98.5781Z" fill="#6E6E6E"/>
<path d="M29.1064 120.573H33.1557L32.0309 123.299H30.3437L29.1064 120.573Z" fill="#656565"/>
<path d="M21.9424 99.5615H40.6312V112.827H21.9424V99.5615Z" fill="#737373"/>
<path d="M24.4355 112.827H37.8292V120.856H24.4355V112.827Z" fill="#737373"/>
<path d="M18.5156 80.0127V99.292H21.9424V112.827H24.4355V120.856H29.2354L30.3438 123.3H32.0312L33.0381 120.856H37.8291V112.827H40.6309V99.292H44.0566V80.0127H18.5156ZM45.0566 100.292H41.6309V113.827H38.8291V121.856H33.708L32.7012 124.3H29.6992L28.5908 121.856H23.4355V113.827H20.9424V100.292H17.5156V79.0127H45.0566V100.292Z" fill="#009688"/>
<path d="M22.9863 88.9482C22.9863 84.5484 26.553 80.9473 30.9528 80.9473C35.3526 80.9473 38.9193 84.5484 38.9193 88.9482C38.9193 93.3479 35.3526 96.949 30.9528 96.949C26.553 96.949 22.9863 93.3479 22.9863 88.9482Z" fill="#009688"/>
<path d="M22.9863 88.9482C22.9863 84.5484 26.553 80.9473 30.9528 80.9473C35.3526 80.9473 38.9193 84.5484 38.9193 88.9482C38.9193 93.3479 35.3526 96.949 30.9528 96.949C26.553 96.949 22.9863 93.3479 22.9863 88.9482Z" fill="black" fill-opacity="0.08"/>
<path d="M29.7878 92.318L26.9697 89.4877L28.3738 88.0776L29.7778 89.4877L33.303 85.9473L34.7071 87.3575L29.7878 92.318Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear_4627_4051" x1="51.1766" y1="0.652344" x2="51.1766" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF" stop-opacity="0"/>
<stop offset="1" stop-color="#686868" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_4627_4051" x1="51.4427" y1="1.18652" x2="51.4427" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#CCCCCC" stop-opacity="0"/>
<stop offset="1" stop-color="#919191" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,43 @@
<svg width="117" height="133" viewBox="0 0 117 133" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.15332 0.652832H101.255V92.8972C101.255 99.8008 95.6581 105.397 88.7545 105.397H12.6533C5.74977 105.397 0.15332 99.8008 0.15332 92.8972V0.652832Z" fill="url(#paint0_linear_3544_2528)"/>
<path d="M4.94238 1.18701H96.9977V91.6561C96.9977 97.179 92.5205 101.656 86.9977 101.656H14.9424C9.41955 101.656 4.94238 97.179 4.94238 91.6561V1.18701Z" fill="url(#paint1_linear_3544_2528)"/>
<path d="M17.0439 80.0127H42.5853V98.5779H17.0439V80.0127Z" fill="#C2C2C2"/>
<path d="M17.0439 80.0127H42.5853V80.7267H17.0439V80.0127Z" fill="#858585"/>
<path d="M17.0439 83.1068H42.5853V83.8208H17.0439V83.1068Z" fill="#858585"/>
<path d="M17.0439 86.2004H42.5853V86.9144H17.0439V86.2004Z" fill="#858585"/>
<path d="M17.0439 89.2955H42.5853V90.0094H17.0439V89.2955Z" fill="#858585"/>
<path d="M17.0439 92.3901H42.5853V93.104H17.0439V92.3901Z" fill="#858585"/>
<path d="M17.0439 95.4851H42.5853V96.1991H17.0439V95.4851Z" fill="#858585"/>
<path d="M17.0439 98.5779H42.5853V99.2922H17.0439V98.5779Z" fill="#858585"/>
<path d="M27.6348 120.573H31.684L30.5592 123.299H28.872L27.6348 120.573Z" fill="#D9D9D9"/>
<path d="M20.4707 99.5618H39.1595V112.827H20.4707V99.5618Z" fill="#A3A3A3"/>
<path d="M22.9639 112.827H36.3575V120.856H22.9639V112.827Z" fill="#A3A3A3"/>
<path d="M17.0439 80.0127V99.292H20.4707V112.827H22.9639V120.856H27.7637L28.8721 123.3H30.5596L31.5664 120.856H36.3574V112.827H39.1592V99.292H42.585V80.0127H17.0439ZM43.585 100.292H40.1592V113.827H37.3574V121.856H32.2363L31.2295 124.3H28.2275L27.1191 121.856H21.9639V113.827H19.4707V100.292H16.0439V79.0127H43.585V100.292Z" fill="#009688"/>
<path d="M21.5146 88.9478C21.5146 84.548 25.0814 80.9469 29.4811 80.9469C33.8809 80.9469 37.4476 84.548 37.4476 88.9478C37.4476 93.3475 33.8809 96.9486 29.4811 96.9486C25.0814 96.9486 21.5146 93.3475 21.5146 88.9478Z" fill="#009688"/>
<path d="M21.5146 88.9478C21.5146 84.548 25.0814 80.9469 29.4811 80.9469C33.8809 80.9469 37.4476 84.548 37.4476 88.9478C37.4476 93.3475 33.8809 96.9486 29.4811 96.9486C25.0814 96.9486 21.5146 93.3475 21.5146 88.9478Z" fill="black" fill-opacity="0.08"/>
<path d="M28.316 92.3181L25.4979 89.4878L26.902 88.0777L28.3061 89.4878L31.8312 85.9474L33.2353 87.3576L28.316 92.3181Z" fill="white"/>
<rect x="63.7783" y="80.8379" width="22.6076" height="16.2354" fill="#C2C2C2"/>
<rect x="63.7783" y="89.1284" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.7783" y="86.71" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.7783" y="91.5464" width="22.6076" height="0.690789" fill="#858585"/>
<rect x="63.7783" y="93.9644" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.7783" y="96.3823" width="22.6076" height="0.690788" fill="#858585"/>
<rect x="70.2383" y="97.0732" width="9.68895" height="23.144" fill="#A3A3A3"/>
<rect x="74.1133" y="97.0732" width="1.93779" height="23.144" fill="#E1E1E1"/>
<rect x="68.9463" y="82.9106" width="2.58372" height="2.76316" fill="#DBDBDB"/>
<rect x="78.6348" y="82.9106" width="2.58372" height="2.76316" fill="#DBDBDB"/>
<path d="M73.791 128.853H76.3747L75.6268 131.616L74.6069 131.616L73.791 128.853Z" fill="#5C5C5C"/>
<path d="M68.9463 125.053H81.219L79.9271 120.218H70.2381L68.9463 125.053Z" fill="#D9D9D9"/>
<path d="M68.9463 125.053H81.219L77.6663 128.853L72.8219 128.853L68.9463 125.053Z" fill="#C2C2C2"/>
<rect x="101.254" y="75.4702" width="14.8991" height="18.7044" fill="#D1D1D1"/>
<defs>
<linearGradient id="paint0_linear_3544_2528" x1="50.7039" y1="0.652832" x2="50.7039" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#333333" stop-opacity="0"/>
<stop offset="1" stop-color="#333333" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_3544_2528" x1="50.97" y1="1.18701" x2="50.97" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#474747" stop-opacity="0"/>
<stop offset="1" stop-color="#474747" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,43 @@
<svg width="118" height="136" viewBox="0 0 118 136" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.625977 0.652344H101.727V92.8967C101.727 99.8003 96.1307 105.397 89.2272 105.397H13.126C6.22243 105.397 0.625977 99.8003 0.625977 92.8967V0.652344Z" fill="url(#paint0_linear_4627_4246)"/>
<path d="M5.41504 1.18652H97.4703V91.6556C97.4703 97.1785 92.9932 101.656 87.4703 101.656H15.415C9.8922 101.656 5.41504 97.1785 5.41504 91.6556V1.18652Z" fill="url(#paint1_linear_4627_4246)"/>
<path d="M116.626 75.4697H101.727V94.1741H116.626V75.4697Z" fill="#646464"/>
<path d="M87.215 81.0449H64.6074V97.2803H87.215V81.0449Z" fill="#959595"/>
<path d="M87.215 89.335H64.6074V90.0258H87.215V89.335Z" fill="#858585"/>
<path d="M87.215 86.917H64.6074V87.6079H87.215V86.917Z" fill="#858585"/>
<path d="M87.215 91.7529H64.6074V92.4438H87.215V91.7529Z" fill="#858585"/>
<path d="M87.215 94.1719H64.6074V94.8627H87.215V94.1719Z" fill="#858585"/>
<path d="M87.215 96.5898H64.6074V97.2807H87.215V96.5898Z" fill="#858585"/>
<path d="M80.7554 97.2803H71.0664V120.424H80.7554V97.2803Z" fill="#737373"/>
<path d="M76.8792 97.2803H74.9414V120.424H76.8792V97.2803Z" fill="#9D9D9D"/>
<path d="M72.3581 83.1172H69.7744V85.8806H72.3581V83.1172Z" fill="#B3B3B3"/>
<path d="M82.0466 83.1172H79.4629V85.8806H82.0466V83.1172Z" fill="#B3B3B3"/>
<path d="M74.6191 129.06H77.2029L76.4549 131.824H75.4351L74.6191 129.06Z" fill="#5C5C5C"/>
<path d="M69.7744 125.26H82.0471L80.7552 120.424H71.0663L69.7744 125.26Z" fill="#9F9F9F"/>
<path d="M69.7744 125.26H82.0471L78.4945 129.06H73.65L69.7744 125.26Z" fill="#8F8F8F"/>
<path d="M18.5156 80.0127H44.057V98.5779H18.5156V80.0127Z" fill="#959595"/>
<path d="M18.5156 80.0127H44.057V80.7267H18.5156V80.0127Z" fill="#6E6E6E"/>
<path d="M18.5156 83.1064H44.057V83.8204H18.5156V83.1064Z" fill="#6E6E6E"/>
<path d="M18.5156 86.2002H44.057V86.9142H18.5156V86.2002Z" fill="#6E6E6E"/>
<path d="M18.5156 89.2959H44.057V90.0098H18.5156V89.2959Z" fill="#6E6E6E"/>
<path d="M18.5156 92.3896H44.057V93.1035H18.5156V92.3896Z" fill="#6E6E6E"/>
<path d="M18.5156 95.4854H44.057V96.1993H18.5156V95.4854Z" fill="#6E6E6E"/>
<path d="M18.5156 98.5781H44.057V99.2924H18.5156V98.5781Z" fill="#6E6E6E"/>
<path d="M29.1064 120.573H33.1557L32.0309 123.299H30.3437L29.1064 120.573Z" fill="#656565"/>
<path d="M21.9424 99.5615H40.6312V112.827H21.9424V99.5615Z" fill="#737373"/>
<path d="M24.4355 112.827H37.8292V120.856H24.4355V112.827Z" fill="#737373"/>
<path d="M18.5156 80.0127V99.292H21.9424V112.827H24.4355V120.856H29.2354L30.3438 123.3H32.0312L33.0381 120.856H37.8291V112.827H40.6309V99.292H44.0566V80.0127H18.5156ZM45.0566 100.292H41.6309V113.827H38.8291V121.856H33.708L32.7012 124.3H29.6992L28.5908 121.856H23.4355V113.827H20.9424V100.292H17.5156V79.0127H45.0566V100.292Z" fill="#009688"/>
<path d="M22.9863 88.9482C22.9863 84.5484 26.553 80.9473 30.9528 80.9473C35.3526 80.9473 38.9193 84.5484 38.9193 88.9482C38.9193 93.3479 35.3526 96.949 30.9528 96.949C26.553 96.949 22.9863 93.3479 22.9863 88.9482Z" fill="#009688"/>
<path d="M22.9863 88.9482C22.9863 84.5484 26.553 80.9473 30.9528 80.9473C35.3526 80.9473 38.9193 84.5484 38.9193 88.9482C38.9193 93.3479 35.3526 96.949 30.9528 96.949C26.553 96.949 22.9863 93.3479 22.9863 88.9482Z" fill="black" fill-opacity="0.08"/>
<path d="M29.7878 92.318L26.9697 89.4877L28.3738 88.0776L29.7778 89.4877L33.303 85.9473L34.7071 87.3575L29.7878 92.318Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear_4627_4246" x1="51.1766" y1="0.652344" x2="51.1766" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF" stop-opacity="0"/>
<stop offset="1" stop-color="#686868" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_4627_4246" x1="51.4427" y1="1.18652" x2="51.4427" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#CCCCCC" stop-opacity="0"/>
<stop offset="1" stop-color="#919191" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1,45 @@
<svg width="117" height="133" viewBox="0 0 117 133" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.15332 0.786133H101.255V93.0305C101.255 99.9341 95.6581 105.531 88.7545 105.531H12.6533C5.74977 105.531 0.15332 99.9341 0.15332 93.0305V0.786133Z" fill="url(#paint0_linear_3544_2532)"/>
<path d="M4.94238 1.32031H96.9977V91.7894C96.9977 97.3123 92.5205 101.789 86.9977 101.789H14.9424C9.41955 101.789 4.94238 97.3123 4.94238 91.7894V1.32031Z" fill="url(#paint1_linear_3544_2532)"/>
<rect x="101.254" y="75.6035" width="14.8991" height="18.7044" fill="#D1D1D1"/>
<rect x="17.0439" y="80.146" width="25.5414" height="18.5652" fill="#C2C2C2"/>
<rect x="17.0439" y="80.146" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.0439" y="83.2402" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.0439" y="86.3335" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.0439" y="89.4287" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.0439" y="92.5234" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.0439" y="95.6187" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.0439" y="98.7114" width="25.5414" height="0.713966" fill="#858585"/>
<path d="M27.6348 120.706H31.684L30.5592 123.433H28.872L27.6348 120.706Z" fill="#D9D9D9"/>
<rect x="20.4707" y="99.6948" width="18.6888" height="13.2655" fill="#A3A3A3"/>
<rect x="22.9639" y="112.96" width="13.3936" height="8.0282" fill="#A3A3A3"/>
<path d="M43.085 79.646V99.9253H39.6592V113.46H36.8574V121.49H31.9004L31.0215 123.624L30.8945 123.933H28.5498L28.417 123.64L27.4414 121.49H22.4639V113.46H19.9707V99.9253H16.5439V79.646H43.085Z" stroke="#009688"/>
<path d="M21.5146 89.081C21.5146 84.6812 25.0814 81.0801 29.4811 81.0801C33.8809 81.0801 37.4476 84.6812 37.4476 89.081C37.4476 93.4807 33.8809 97.0819 29.4811 97.0819C25.0814 97.0819 21.5146 93.4807 21.5146 89.081Z" fill="#009688"/>
<path d="M21.5146 89.081C21.5146 84.6812 25.0814 81.0801 29.4811 81.0801C33.8809 81.0801 37.4476 84.6812 37.4476 89.081C37.4476 93.4807 33.8809 97.0819 29.4811 97.0819C25.0814 97.0819 21.5146 93.4807 21.5146 89.081Z" fill="black" fill-opacity="0.08"/>
<path d="M28.316 92.4513L25.4979 89.621L26.902 88.2109L28.3061 89.621L31.8312 86.0806L33.2353 87.4908L28.316 92.4513Z" fill="white"/>
<g opacity="0.2">
<rect x="63.7783" y="80.9707" width="22.6076" height="16.2354" fill="#C2C2C2"/>
<rect x="63.7783" y="89.2617" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.7783" y="86.8433" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.7783" y="91.6797" width="22.6076" height="0.690789" fill="#858585"/>
<rect x="63.7783" y="94.0977" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.7783" y="96.5156" width="22.6076" height="0.690788" fill="#858585"/>
<rect x="70.2383" y="97.2065" width="9.68895" height="23.144" fill="#A3A3A3"/>
<rect x="74.1133" y="97.2065" width="1.93779" height="23.144" fill="#E1E1E1"/>
<rect x="68.9463" y="83.0439" width="2.58372" height="2.76316" fill="#DBDBDB"/>
<rect x="78.6348" y="83.0439" width="2.58372" height="2.76316" fill="#DBDBDB"/>
<path d="M73.791 128.986H76.3747L75.6268 131.749L74.6069 131.749L73.791 128.986Z" fill="#5C5C5C"/>
<path d="M68.9463 125.187H81.219L79.9271 120.351H70.2381L68.9463 125.187Z" fill="#D9D9D9"/>
<path d="M68.9463 125.187H81.219L77.6663 128.986L72.8219 128.986L68.9463 125.187Z" fill="#C2C2C2"/>
</g>
<defs>
<linearGradient id="paint0_linear_3544_2532" x1="50.7039" y1="0.786133" x2="50.7039" y2="105.531" gradientUnits="userSpaceOnUse">
<stop stop-color="#333333" stop-opacity="0"/>
<stop offset="1" stop-color="#333333" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_3544_2532" x1="50.97" y1="1.32031" x2="50.97" y2="101.789" gradientUnits="userSpaceOnUse">
<stop stop-color="#474747" stop-opacity="0"/>
<stop offset="1" stop-color="#474747" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1,45 @@
<svg width="118" height="136" viewBox="0 0 118 136" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.625977 0.652344H101.727V92.8967C101.727 99.8003 96.1307 105.397 89.2272 105.397H13.126C6.22243 105.397 0.625977 99.8003 0.625977 92.8967V0.652344Z" fill="url(#paint0_linear_4627_4314)"/>
<path d="M5.41504 1.18652H97.4703V91.6556C97.4703 97.1785 92.9932 101.656 87.4703 101.656H15.415C9.8922 101.656 5.41504 97.1785 5.41504 91.6556V1.18652Z" fill="url(#paint1_linear_4627_4314)"/>
<path d="M116.626 75.4697H101.727V94.1741H116.626V75.4697Z" fill="#646464"/>
<g opacity="0.2">
<path d="M87.215 81.0449H64.6074V97.2803H87.215V81.0449Z" fill="#959595"/>
<path d="M87.215 89.335H64.6074V90.0258H87.215V89.335Z" fill="#858585"/>
<path d="M87.215 86.917H64.6074V87.6079H87.215V86.917Z" fill="#858585"/>
<path d="M87.215 91.7529H64.6074V92.4438H87.215V91.7529Z" fill="#858585"/>
<path d="M87.215 94.1719H64.6074V94.8627H87.215V94.1719Z" fill="#858585"/>
<path d="M87.215 96.5898H64.6074V97.2807H87.215V96.5898Z" fill="#858585"/>
<path d="M80.7554 97.2803H71.0664V120.424H80.7554V97.2803Z" fill="#737373"/>
<path d="M76.8792 97.2803H74.9414V120.424H76.8792V97.2803Z" fill="#9D9D9D"/>
<path d="M72.3581 83.1172H69.7744V85.8806H72.3581V83.1172Z" fill="#B3B3B3"/>
<path d="M82.0466 83.1172H79.4629V85.8806H82.0466V83.1172Z" fill="#B3B3B3"/>
<path d="M74.6191 129.06H77.2029L76.4549 131.824H75.4351L74.6191 129.06Z" fill="#5C5C5C"/>
<path d="M69.7744 125.26H82.0471L80.7552 120.424H71.0663L69.7744 125.26Z" fill="#9F9F9F"/>
<path d="M69.7744 125.26H82.0471L78.4945 129.06H73.65L69.7744 125.26Z" fill="#8F8F8F"/>
</g>
<path d="M18.5156 80.0127H44.057V98.5779H18.5156V80.0127Z" fill="#959595"/>
<path d="M18.5156 80.0127H44.057V80.7267H18.5156V80.0127Z" fill="#6E6E6E"/>
<path d="M18.5156 83.1064H44.057V83.8204H18.5156V83.1064Z" fill="#6E6E6E"/>
<path d="M18.5156 86.2002H44.057V86.9142H18.5156V86.2002Z" fill="#6E6E6E"/>
<path d="M18.5156 89.2959H44.057V90.0098H18.5156V89.2959Z" fill="#6E6E6E"/>
<path d="M18.5156 92.3896H44.057V93.1035H18.5156V92.3896Z" fill="#6E6E6E"/>
<path d="M18.5156 95.4854H44.057V96.1993H18.5156V95.4854Z" fill="#6E6E6E"/>
<path d="M18.5156 98.5781H44.057V99.2924H18.5156V98.5781Z" fill="#6E6E6E"/>
<path d="M29.1064 120.573H33.1557L32.0309 123.299H30.3437L29.1064 120.573Z" fill="#656565"/>
<path d="M21.9424 99.5615H40.6312V112.827H21.9424V99.5615Z" fill="#737373"/>
<path d="M24.4355 112.827H37.8292V120.856H24.4355V112.827Z" fill="#737373"/>
<path d="M18.5156 80.0127V99.292H21.9424V112.827H24.4355V120.856H29.2354L30.3438 123.3H32.0312L33.0381 120.856H37.8291V112.827H40.6309V99.292H44.0566V80.0127H18.5156ZM45.0566 100.292H41.6309V113.827H38.8291V121.856H33.708L32.7012 124.3H29.6992L28.5908 121.856H23.4355V113.827H20.9424V100.292H17.5156V79.0127H45.0566V100.292Z" fill="#009688"/>
<path d="M22.9863 88.9482C22.9863 84.5484 26.553 80.9473 30.9528 80.9473C35.3526 80.9473 38.9193 84.5484 38.9193 88.9482C38.9193 93.3479 35.3526 96.949 30.9528 96.949C26.553 96.949 22.9863 93.3479 22.9863 88.9482Z" fill="#009688"/>
<path d="M22.9863 88.9482C22.9863 84.5484 26.553 80.9473 30.9528 80.9473C35.3526 80.9473 38.9193 84.5484 38.9193 88.9482C38.9193 93.3479 35.3526 96.949 30.9528 96.949C26.553 96.949 22.9863 93.3479 22.9863 88.9482Z" fill="black" fill-opacity="0.08"/>
<path d="M29.7878 92.318L26.9697 89.4877L28.3738 88.0776L29.7778 89.4877L33.303 85.9473L34.7071 87.3575L29.7878 92.318Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear_4627_4314" x1="51.1766" y1="0.652344" x2="51.1766" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF" stop-opacity="0"/>
<stop offset="1" stop-color="#686868" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_4627_4314" x1="51.4427" y1="1.18652" x2="51.4427" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#CCCCCC" stop-opacity="0"/>
<stop offset="1" stop-color="#919191" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,39 @@
<svg width="117" height="133" viewBox="0 0 117 133" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.234375 0.652832H101.336V92.8972C101.336 99.8008 95.7391 105.397 88.8356 105.397H12.7344C5.83083 105.397 0.234375 99.8008 0.234375 92.8972V0.652832Z" fill="url(#paint0_linear_3482_2442)"/>
<path d="M5.02344 1.18701H97.0787V91.6561C97.0787 97.179 92.6016 101.656 87.0787 101.656H15.0234C9.5006 101.656 5.02344 97.179 5.02344 91.6561V1.18701Z" fill="url(#paint1_linear_3482_2442)"/>
<rect x="17.125" y="80.0127" width="25.5414" height="18.5652" fill="#C2C2C2"/>
<rect x="17.125" y="80.0127" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.125" y="83.1069" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.125" y="86.2002" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.125" y="89.2954" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.125" y="92.3901" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.125" y="95.4854" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.125" y="98.5781" width="25.5414" height="0.713966" fill="#858585"/>
<path d="M27.7158 120.573H31.7651L30.6403 123.299H28.9531L27.7158 120.573Z" fill="#D9D9D9"/>
<rect x="20.5518" y="99.5615" width="18.6888" height="13.2655" fill="#A3A3A3"/>
<rect x="23.0449" y="112.827" width="13.3936" height="8.0282" fill="#A3A3A3"/>
<rect x="101.335" y="75.4702" width="14.8991" height="18.7044" fill="#D1D1D1"/>
<rect x="63.8594" y="80.8379" width="22.6076" height="16.2354" fill="#C2C2C2"/>
<rect x="63.8594" y="89.1284" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.8594" y="86.71" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.8594" y="91.5464" width="22.6076" height="0.690789" fill="#858585"/>
<rect x="63.8594" y="93.9644" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.8594" y="96.3823" width="22.6076" height="0.690788" fill="#858585"/>
<rect x="70.3193" y="97.0732" width="9.68895" height="23.144" fill="#A3A3A3"/>
<rect x="74.1943" y="97.0732" width="1.93779" height="23.144" fill="#E1E1E1"/>
<rect x="69.0273" y="82.9106" width="2.58372" height="2.76316" fill="#DBDBDB"/>
<rect x="78.7158" y="82.9106" width="2.58372" height="2.76316" fill="#DBDBDB"/>
<path d="M73.8721 128.853H76.4558L75.7079 131.616L74.688 131.616L73.8721 128.853Z" fill="#5C5C5C"/>
<path d="M69.0273 125.053H81.3L80.0082 120.218H70.3192L69.0273 125.053Z" fill="#D9D9D9"/>
<path d="M69.0273 125.053H81.3L77.7474 128.853L72.9029 128.853L69.0273 125.053Z" fill="#C2C2C2"/>
<defs>
<linearGradient id="paint0_linear_3482_2442" x1="50.785" y1="0.652832" x2="50.785" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#333333" stop-opacity="0"/>
<stop offset="1" stop-color="#333333" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_3482_2442" x1="51.0511" y1="1.18701" x2="51.0511" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#474747" stop-opacity="0"/>
<stop offset="1" stop-color="#474747" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,39 @@
<svg width="118" height="136" viewBox="0 0 118 136" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.625977 0.652344H101.727V92.8967C101.727 99.8003 96.1307 105.397 89.2272 105.397H13.126C6.22243 105.397 0.625977 99.8003 0.625977 92.8967V0.652344Z" fill="url(#paint0_linear_4627_4455)"/>
<path d="M5.41504 1.18652H97.4703V91.6556C97.4703 97.1785 92.9932 101.656 87.4703 101.656H15.415C9.8922 101.656 5.41504 97.1785 5.41504 91.6556V1.18652Z" fill="url(#paint1_linear_4627_4455)"/>
<path d="M116.626 75.4697H101.727V94.1741H116.626V75.4697Z" fill="#646464"/>
<path d="M87.215 81.0449H64.6074V97.2803H87.215V81.0449Z" fill="#959595"/>
<path d="M87.215 89.335H64.6074V90.0258H87.215V89.335Z" fill="#858585"/>
<path d="M87.215 86.917H64.6074V87.6079H87.215V86.917Z" fill="#858585"/>
<path d="M87.215 91.7529H64.6074V92.4438H87.215V91.7529Z" fill="#858585"/>
<path d="M87.215 94.1719H64.6074V94.8627H87.215V94.1719Z" fill="#858585"/>
<path d="M87.215 96.5898H64.6074V97.2807H87.215V96.5898Z" fill="#858585"/>
<path d="M80.7554 97.2803H71.0664V120.424H80.7554V97.2803Z" fill="#737373"/>
<path d="M76.8792 97.2803H74.9414V120.424H76.8792V97.2803Z" fill="#9D9D9D"/>
<path d="M72.3581 83.1172H69.7744V85.8806H72.3581V83.1172Z" fill="#B3B3B3"/>
<path d="M82.0466 83.1172H79.4629V85.8806H82.0466V83.1172Z" fill="#B3B3B3"/>
<path d="M74.6191 129.06H77.2029L76.4549 131.824H75.4351L74.6191 129.06Z" fill="#5C5C5C"/>
<path d="M69.7744 125.26H82.0471L80.7552 120.424H71.0663L69.7744 125.26Z" fill="#9F9F9F"/>
<path d="M69.7744 125.26H82.0471L78.4945 129.06H73.65L69.7744 125.26Z" fill="#8F8F8F"/>
<path d="M18.5156 80.0127H44.057V98.5779H18.5156V80.0127Z" fill="#959595"/>
<path d="M18.5156 80.0127H44.057V80.7267H18.5156V80.0127Z" fill="#6E6E6E"/>
<path d="M18.5156 83.1064H44.057V83.8204H18.5156V83.1064Z" fill="#6E6E6E"/>
<path d="M18.5156 86.2002H44.057V86.9142H18.5156V86.2002Z" fill="#6E6E6E"/>
<path d="M18.5156 89.2959H44.057V90.0098H18.5156V89.2959Z" fill="#6E6E6E"/>
<path d="M18.5156 92.3896H44.057V93.1035H18.5156V92.3896Z" fill="#6E6E6E"/>
<path d="M18.5156 95.4854H44.057V96.1993H18.5156V95.4854Z" fill="#6E6E6E"/>
<path d="M18.5156 98.5781H44.057V99.2924H18.5156V98.5781Z" fill="#6E6E6E"/>
<path d="M29.1064 120.573H33.1557L32.0309 123.299H30.3437L29.1064 120.573Z" fill="#656565"/>
<path d="M21.9424 99.5615H40.6312V112.827H21.9424V99.5615Z" fill="#737373"/>
<path d="M24.4355 112.827H37.8292V120.856H24.4355V112.827Z" fill="#737373"/>
<defs>
<linearGradient id="paint0_linear_4627_4455" x1="51.1766" y1="0.652344" x2="51.1766" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF" stop-opacity="0"/>
<stop offset="1" stop-color="#686868" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_4627_4455" x1="51.4427" y1="1.18652" x2="51.4427" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#CCCCCC" stop-opacity="0"/>
<stop offset="1" stop-color="#919191" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,41 @@
<svg width="117" height="133" viewBox="0 0 117 133" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.355469 0.786133H101.457V93.0305C101.457 99.9341 95.8602 105.531 88.9567 105.531H12.8555C5.95192 105.531 0.355469 99.9341 0.355469 93.0305V0.786133Z" fill="url(#paint0_linear_3482_2486)"/>
<path d="M5.14453 1.32031H97.1998V91.7894C97.1998 97.3123 92.7227 101.789 87.1998 101.789H15.1445C9.62169 101.789 5.14453 97.3123 5.14453 91.7894V1.32031Z" fill="url(#paint1_linear_3482_2486)"/>
<rect x="17.2461" y="80.146" width="25.5414" height="18.5652" fill="#C2C2C2"/>
<rect x="17.2461" y="80.146" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.2461" y="83.2402" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.2461" y="86.3335" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.2461" y="89.4287" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.2461" y="92.5234" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.2461" y="95.6187" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.2461" y="98.7114" width="25.5414" height="0.713966" fill="#858585"/>
<path d="M27.8369 120.706H31.8862L30.7614 123.433H29.0742L27.8369 120.706Z" fill="#D9D9D9"/>
<rect x="20.6729" y="99.6948" width="18.6888" height="13.2655" fill="#A3A3A3"/>
<rect x="23.166" y="112.96" width="13.3936" height="8.0282" fill="#A3A3A3"/>
<rect x="101.456" y="75.6035" width="14.8991" height="18.7044" fill="#D1D1D1"/>
<g opacity="0.2">
<rect x="63.9805" y="80.9707" width="22.6076" height="16.2354" fill="#C2C2C2"/>
<rect x="63.9805" y="89.2617" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.9805" y="86.8433" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.9805" y="91.6797" width="22.6076" height="0.690789" fill="#858585"/>
<rect x="63.9805" y="94.0977" width="22.6076" height="0.69079" fill="#858585"/>
<rect x="63.9805" y="96.5156" width="22.6076" height="0.690788" fill="#858585"/>
<rect x="70.4404" y="97.2065" width="9.68895" height="23.144" fill="#A3A3A3"/>
<rect x="74.3154" y="97.2065" width="1.93779" height="23.144" fill="#E1E1E1"/>
<rect x="69.1484" y="83.0439" width="2.58372" height="2.76316" fill="#DBDBDB"/>
<rect x="78.8369" y="83.0439" width="2.58372" height="2.76316" fill="#DBDBDB"/>
<path d="M73.9932 128.986H76.5769L75.829 131.749L74.8091 131.749L73.9932 128.986Z" fill="#5C5C5C"/>
<path d="M69.1484 125.187H81.4211L80.1293 120.351H70.4403L69.1484 125.187Z" fill="#D9D9D9"/>
<path d="M69.1484 125.187H81.4211L77.8685 128.986L73.024 128.986L69.1484 125.187Z" fill="#C2C2C2"/>
</g>
<defs>
<linearGradient id="paint0_linear_3482_2486" x1="50.9061" y1="0.786133" x2="50.9061" y2="105.531" gradientUnits="userSpaceOnUse">
<stop stop-color="#333333" stop-opacity="0"/>
<stop offset="1" stop-color="#333333" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_3482_2486" x1="51.1722" y1="1.32031" x2="51.1722" y2="101.789" gradientUnits="userSpaceOnUse">
<stop stop-color="#474747" stop-opacity="0"/>
<stop offset="1" stop-color="#474747" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,41 @@
<svg width="118" height="136" viewBox="0 0 118 136" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.625977 0.652344H101.727V92.8967C101.727 99.8003 96.1307 105.397 89.2272 105.397H13.126C6.22243 105.397 0.625977 99.8003 0.625977 92.8967V0.652344Z" fill="url(#paint0_linear_8941_38592)"/>
<path d="M5.41504 1.18652H97.4703V91.6556C97.4703 97.1785 92.9932 101.656 87.4703 101.656H15.415C9.8922 101.656 5.41504 97.1785 5.41504 91.6556V1.18652Z" fill="url(#paint1_linear_8941_38592)"/>
<path d="M116.626 75.4697H101.727V94.1741H116.626V75.4697Z" fill="#646464"/>
<g opacity="0.2">
<path d="M87.215 81.0449H64.6074V97.2803H87.215V81.0449Z" fill="#959595"/>
<path d="M87.215 89.335H64.6074V90.0258H87.215V89.335Z" fill="#858585"/>
<path d="M87.215 86.917H64.6074V87.6079H87.215V86.917Z" fill="#858585"/>
<path d="M87.215 91.7529H64.6074V92.4438H87.215V91.7529Z" fill="#858585"/>
<path d="M87.215 94.1719H64.6074V94.8627H87.215V94.1719Z" fill="#858585"/>
<path d="M87.215 96.5898H64.6074V97.2807H87.215V96.5898Z" fill="#858585"/>
<path d="M80.7554 97.2803H71.0664V120.424H80.7554V97.2803Z" fill="#737373"/>
<path d="M76.8792 97.2803H74.9414V120.424H76.8792V97.2803Z" fill="#9D9D9D"/>
<path d="M72.3581 83.1172H69.7744V85.8806H72.3581V83.1172Z" fill="#B3B3B3"/>
<path d="M82.0466 83.1172H79.4629V85.8806H82.0466V83.1172Z" fill="#B3B3B3"/>
<path d="M74.6191 129.06H77.2029L76.4549 131.824H75.4351L74.6191 129.06Z" fill="#5C5C5C"/>
<path d="M69.7744 125.26H82.0471L80.7552 120.424H71.0663L69.7744 125.26Z" fill="#9F9F9F"/>
<path d="M69.7744 125.26H82.0471L78.4945 129.06H73.65L69.7744 125.26Z" fill="#8F8F8F"/>
</g>
<path d="M18.5156 80.0127H44.057V98.5779H18.5156V80.0127Z" fill="#959595"/>
<path d="M18.5156 80.0127H44.057V80.7267H18.5156V80.0127Z" fill="#6E6E6E"/>
<path d="M18.5156 83.1064H44.057V83.8204H18.5156V83.1064Z" fill="#6E6E6E"/>
<path d="M18.5156 86.2002H44.057V86.9142H18.5156V86.2002Z" fill="#6E6E6E"/>
<path d="M18.5156 89.2959H44.057V90.0098H18.5156V89.2959Z" fill="#6E6E6E"/>
<path d="M18.5156 92.3896H44.057V93.1035H18.5156V92.3896Z" fill="#6E6E6E"/>
<path d="M18.5156 95.4854H44.057V96.1993H18.5156V95.4854Z" fill="#6E6E6E"/>
<path d="M18.5156 98.5781H44.057V99.2924H18.5156V98.5781Z" fill="#6E6E6E"/>
<path d="M29.1064 120.573H33.1557L32.0309 123.299H30.3437L29.1064 120.573Z" fill="#656565"/>
<path d="M21.9424 99.5615H40.6312V112.827H21.9424V99.5615Z" fill="#737373"/>
<path d="M24.4355 112.827H37.8292V120.856H24.4355V112.827Z" fill="#737373"/>
<defs>
<linearGradient id="paint0_linear_8941_38592" x1="51.1766" y1="0.652344" x2="51.1766" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF" stop-opacity="0"/>
<stop offset="1" stop-color="#686868" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_8941_38592" x1="51.4427" y1="1.18652" x2="51.4427" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#CCCCCC" stop-opacity="0"/>
<stop offset="1" stop-color="#919191" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,43 @@
<svg width="117" height="133" viewBox="0 0 117 133" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.544922 0.652832H101.646V92.8972C101.646 99.8008 96.0497 105.397 89.1461 105.397H13.0449C6.14138 105.397 0.544922 99.8008 0.544922 92.8972V0.652832Z" fill="url(#paint0_linear_3544_2529)"/>
<path d="M5.33398 1.18701H97.3893V91.6561C97.3893 97.179 92.9121 101.656 87.3893 101.656H15.334C9.81115 101.656 5.33398 97.179 5.33398 91.6561V1.18701Z" fill="url(#paint1_linear_3544_2529)"/>
<rect x="17.4355" y="80.0127" width="25.5414" height="18.5652" fill="#C2C2C2"/>
<rect x="17.4355" y="80.0127" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.4355" y="83.1069" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.4355" y="86.2002" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.4355" y="89.2954" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.4355" y="92.3901" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.4355" y="95.4854" width="25.5414" height="0.713966" fill="#858585"/>
<rect x="17.4355" y="98.5781" width="25.5414" height="0.713966" fill="#858585"/>
<path d="M28.0264 120.573H32.0756L30.9508 123.299H29.2636L28.0264 120.573Z" fill="#D9D9D9"/>
<rect x="20.8623" y="99.5615" width="18.6888" height="13.2655" fill="#A3A3A3"/>
<rect x="23.3555" y="112.827" width="13.3936" height="8.0282" fill="#A3A3A3"/>
<rect x="101.646" y="75.4702" width="14.8991" height="18.7044" fill="#D1D1D1"/>
<rect x="64.1699" y="80.8379" width="22.6076" height="16.2354" fill="#C2C2C2"/>
<rect x="64.1699" y="89.1279" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="64.1699" y="86.71" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="64.1699" y="91.5459" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="64.1699" y="93.9644" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="64.1699" y="96.3823" width="22.6076" height="0.690866" fill="#858585"/>
<rect x="70.6299" y="97.0732" width="9.68895" height="23.144" fill="#A3A3A3"/>
<rect x="74.5059" y="97.0732" width="1.93779" height="23.144" fill="#E1E1E1"/>
<rect x="69.3379" y="82.9102" width="2.58372" height="2.76346" fill="#DBDBDB"/>
<rect x="79.0273" y="82.9102" width="2.58372" height="2.76346" fill="#DBDBDB"/>
<path d="M74.1816 128.853H76.7654L76.0174 131.616L74.9976 131.616L74.1816 128.853Z" fill="#5C5C5C"/>
<path d="M69.3379 125.053H81.6106L80.3187 120.217H70.6298L69.3379 125.053Z" fill="#D9D9D9"/>
<path d="M69.3379 125.053H81.6106L78.0579 128.853L73.2135 128.853L69.3379 125.053Z" fill="#C2C2C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M87.7773 98.041H81.3174V120.052L82.7197 125.3L82.3408 125.704L78.4912 129.82H77.5322L76.9834 131.846L76.7842 132.584H74.251L73.4346 129.82H72.8057L68.2207 125.327L68.3721 124.764L69.6289 120.059V98.041H63.1699V79.8057H87.7773V98.041ZM74.998 131.584H76.0186L76.7666 128.821H74.1826L74.998 131.584ZM69.3379 125.021L73.2139 128.82H78.0576L81.6104 125.021L80.3184 120.186H70.6299L69.3379 125.021ZM64.1699 97.041H70.6289V120.185H80.3174V97.041H86.7773V80.8057H64.1699V97.041Z" fill="#009688"/>
<path d="M67.5068 89.3972C67.5068 84.9974 71.0735 81.3963 75.4733 81.3963C79.8731 81.3963 83.4398 84.9974 83.4398 89.3972C83.4398 93.7969 79.8731 97.398 75.4733 97.398C71.0735 97.398 67.5068 93.7969 67.5068 89.3972Z" fill="#009688"/>
<path d="M67.5068 89.3972C67.5068 84.9974 71.0735 81.3963 75.4733 81.3963C79.8731 81.3963 83.4398 84.9974 83.4398 89.3972C83.4398 93.7969 79.8731 97.398 75.4733 97.398C71.0735 97.398 67.5068 93.7969 67.5068 89.3972Z" fill="black" fill-opacity="0.08"/>
<path d="M74.3084 92.7675L71.4902 89.9372L72.8943 88.527L74.2984 89.9372L77.8236 86.3968L79.2277 87.8069L74.3084 92.7675Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear_3544_2529" x1="51.0955" y1="0.652832" x2="51.0955" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#333333" stop-opacity="0"/>
<stop offset="1" stop-color="#333333" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_3544_2529" x1="51.3616" y1="1.18701" x2="51.3616" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#474747" stop-opacity="0"/>
<stop offset="1" stop-color="#474747" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,43 @@
<svg width="118" height="136" viewBox="0 0 118 136" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.625977 0.652344H101.727V92.8967C101.727 99.8003 96.1307 105.397 89.2272 105.397H13.126C6.22243 105.397 0.625977 99.8003 0.625977 92.8967V0.652344Z" fill="url(#paint0_linear_4627_4383)"/>
<path d="M5.41504 1.18652H97.4703V91.6556C97.4703 97.1785 92.9932 101.656 87.4703 101.656H15.415C9.8922 101.656 5.41504 97.1785 5.41504 91.6556V1.18652Z" fill="url(#paint1_linear_4627_4383)"/>
<path d="M116.626 75.4697H101.727V94.1741H116.626V75.4697Z" fill="#646464"/>
<path d="M87.215 81.0449H64.6074V97.2803H87.215V81.0449Z" fill="#959595"/>
<path d="M87.215 89.335H64.6074V90.0258H87.215V89.335Z" fill="#858585"/>
<path d="M87.215 86.917H64.6074V87.6079H87.215V86.917Z" fill="#858585"/>
<path d="M87.215 91.7529H64.6074V92.4438H87.215V91.7529Z" fill="#858585"/>
<path d="M87.215 94.1719H64.6074V94.8627H87.215V94.1719Z" fill="#858585"/>
<path d="M87.215 96.5898H64.6074V97.2807H87.215V96.5898Z" fill="#858585"/>
<path d="M80.7554 97.2803H71.0664V120.424H80.7554V97.2803Z" fill="#737373"/>
<path d="M76.8792 97.2803H74.9414V120.424H76.8792V97.2803Z" fill="#9D9D9D"/>
<path d="M72.3581 83.1172H69.7744V85.8806H72.3581V83.1172Z" fill="#B3B3B3"/>
<path d="M82.0466 83.1172H79.4629V85.8806H82.0466V83.1172Z" fill="#B3B3B3"/>
<path d="M74.6191 129.06H77.2029L76.4549 131.824H75.4351L74.6191 129.06Z" fill="#5C5C5C"/>
<path d="M69.7744 125.26H82.0471L80.7552 120.424H71.0663L69.7744 125.26Z" fill="#9F9F9F"/>
<path d="M69.7744 125.26H82.0471L78.4945 129.06H73.65L69.7744 125.26Z" fill="#8F8F8F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M88.2139 98.248H81.7539V120.259L83.1562 125.507L82.7773 125.911L78.9277 130.027H77.9688L77.4199 132.053L77.2207 132.791H74.6875L73.8711 130.027H73.2422L68.6572 125.534L68.8086 124.971L70.0654 120.266V98.248H63.6064V80.0127H88.2139V98.248ZM75.4346 131.791H76.4551L77.2031 129.028H74.6191L75.4346 131.791ZM69.7744 125.229L73.6504 129.027H78.4941L82.0469 125.229L80.7549 120.393H71.0664L69.7744 125.229ZM64.6064 97.248H71.0654V120.392H80.7539V97.248H87.2139V81.0127H64.6064V97.248Z" fill="#009688"/>
<path d="M67.9434 89.6044C67.9434 85.2046 71.5101 81.6035 75.9098 81.6035C80.3096 81.6035 83.8763 85.2046 83.8763 89.6044C83.8763 94.0042 80.3096 97.6053 75.9098 97.6053C71.5101 97.6053 67.9434 94.0042 67.9434 89.6044Z" fill="#009688"/>
<path d="M67.9434 89.6044C67.9434 85.2046 71.5101 81.6035 75.9098 81.6035C80.3096 81.6035 83.8763 85.2046 83.8763 89.6044C83.8763 94.0042 80.3096 97.6053 75.9098 97.6053C71.5101 97.6053 67.9434 94.0042 67.9434 89.6044Z" fill="black" fill-opacity="0.08"/>
<path d="M74.7449 92.9742L71.9268 90.1439L73.3308 88.7337L74.7349 90.1439L78.2601 86.6035L79.6642 88.0136L74.7449 92.9742Z" fill="white"/>
<path d="M18.5156 80.0127H44.057V98.5779H18.5156V80.0127Z" fill="#959595"/>
<path d="M18.5156 80.0127H44.057V80.7267H18.5156V80.0127Z" fill="#6E6E6E"/>
<path d="M18.5156 83.1064H44.057V83.8204H18.5156V83.1064Z" fill="#6E6E6E"/>
<path d="M18.5156 86.2002H44.057V86.9142H18.5156V86.2002Z" fill="#6E6E6E"/>
<path d="M18.5156 89.2959H44.057V90.0098H18.5156V89.2959Z" fill="#6E6E6E"/>
<path d="M18.5156 92.3896H44.057V93.1035H18.5156V92.3896Z" fill="#6E6E6E"/>
<path d="M18.5156 95.4854H44.057V96.1993H18.5156V95.4854Z" fill="#6E6E6E"/>
<path d="M18.5156 98.5781H44.057V99.2924H18.5156V98.5781Z" fill="#6E6E6E"/>
<path d="M29.1064 120.573H33.1557L32.0309 123.299H30.3437L29.1064 120.573Z" fill="#656565"/>
<path d="M21.9424 99.5615H40.6312V112.827H21.9424V99.5615Z" fill="#737373"/>
<path d="M24.4355 112.827H37.8292V120.856H24.4355V112.827Z" fill="#737373"/>
<defs>
<linearGradient id="paint0_linear_4627_4383" x1="51.1766" y1="0.652344" x2="51.1766" y2="105.397" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF" stop-opacity="0"/>
<stop offset="1" stop-color="#686868" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint1_linear_4627_4383" x1="51.4427" y1="1.18652" x2="51.4427" y2="101.656" gradientUnits="userSpaceOnUse">
<stop stop-color="#CCCCCC" stop-opacity="0"/>
<stop offset="1" stop-color="#919191" stop-opacity="0.3"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

@@ -0,0 +1,38 @@
<svg width="17" height="9" viewBox="0 0 17 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_iiii_6472_20428)">
<rect x="0.0527344" y="0.0527344" width="16" height="8.42105" rx="0.842105" fill="#808080"/>
</g>
<rect x="0.0527344" y="0.0527344" width="16" height="8.42105" rx="0.842105" stroke="#C2C2C2" stroke-width="0.105263"/>
<path d="M10.7006 2.79037H10.5244L10.426 2.792C9.41175 2.82502 8.47921 3.36695 7.94928 4.23755C7.46947 5.02578 6.61347 5.50693 5.69069 5.50693H5.51452V4.94947C5.51452 4.80429 5.35736 4.71355 5.23163 4.78614L3.94526 5.52882C3.81952 5.60141 3.81952 5.78289 3.94526 5.85548L5.23163 6.59816C5.35736 6.67075 5.51452 6.58001 5.51452 6.43483V5.87736H5.69069C6.74276 5.87736 7.71879 5.32886 8.26581 4.43018C8.73063 3.66656 9.54849 3.1912 10.4381 3.16225L10.5244 3.1608H10.7006V3.71826C10.7006 3.86344 10.8577 3.95418 10.9835 3.88159L12.2698 3.13891C12.3956 3.06632 12.3956 2.88485 12.2698 2.81225L10.9835 2.06958C10.8577 1.99699 10.7006 2.08773 10.7006 2.23291V2.79037Z" fill="#EEEEEE"/>
<path d="M5.51452 2.79037H5.69069L5.78908 2.792C6.80334 2.82502 7.73588 3.36695 8.26581 4.23755C8.74562 5.02578 9.60161 5.50693 10.5244 5.50693H10.7006V4.94947C10.7006 4.80429 10.8577 4.71355 10.9835 4.78614L12.2698 5.52882C12.3956 5.60141 12.3956 5.78289 12.2698 5.85548L10.9835 6.59816C10.8577 6.67075 10.7006 6.58001 10.7006 6.43483V5.87736H10.5244C9.47233 5.87736 8.4963 5.32886 7.94928 4.43018C7.48446 3.66656 6.6666 3.1912 5.77697 3.16225L5.69069 3.1608H5.51452V3.71826C5.51452 3.86344 5.35735 3.95418 5.23162 3.88159L3.94525 3.13891C3.81952 3.06632 3.81952 2.88485 3.94525 2.81225L5.23162 2.06958C5.35735 1.99699 5.51452 2.08773 5.51452 2.23291V2.79037Z" fill="#EEEEEE"/>
<defs>
<filter id="filter0_iiii_6472_20428" x="-1" y="-1" width="18.1055" height="10.5264" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-1"/>
<feGaussianBlur stdDeviation="0.5"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_6472_20428"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="-1"/>
<feGaussianBlur stdDeviation="0.5"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_6472_20428" result="effect2_innerShadow_6472_20428"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="1"/>
<feGaussianBlur stdDeviation="0.5"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="effect2_innerShadow_6472_20428" result="effect3_innerShadow_6472_20428"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="1"/>
<feGaussianBlur stdDeviation="0.5"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="effect3_innerShadow_6472_20428" result="effect4_innerShadow_6472_20428"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,38 @@
<svg width="33" height="18" viewBox="0 0 33 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_iiii_6472_20289)">
<rect x="0.105469" y="0.105469" width="32" height="16.8421" rx="1.68421" fill="#EA3D23"/>
</g>
<rect x="0.105469" y="0.105469" width="32" height="16.8421" rx="1.68421" stroke="#C2C2C2" stroke-width="0.210526"/>
<path d="M21.4011 5.57976H21.0488L20.852 5.58301C18.8235 5.64906 16.9584 6.73293 15.8986 8.47412C14.9389 10.0506 13.2269 11.0129 11.3814 11.0129H11.029V9.89796C11.029 9.6076 10.7147 9.42613 10.4633 9.57131L7.89051 11.0567C7.63905 11.2018 7.63905 11.5648 7.89051 11.71L10.4633 13.1953C10.7147 13.3405 11.029 13.159 11.029 12.8687V11.7538H11.3814C13.4855 11.7538 15.4376 10.6567 16.5316 8.85939C17.4613 7.33213 19.097 6.38143 20.8762 6.32352L21.0488 6.32062H21.4011V7.43555C21.4011 7.72591 21.7155 7.90739 21.9669 7.76221L24.5397 6.27685C24.7911 6.13167 24.7911 5.76871 24.5397 5.62353L21.9669 4.13818C21.7155 3.993 21.4011 4.17447 21.4011 4.46484V5.57976Z" fill="#EEEEEE"/>
<path d="M11.029 5.57976H11.3814L11.5782 5.58301C13.6067 5.64906 15.4718 6.73293 16.5316 8.47412C17.4912 10.0506 19.2032 11.0129 21.0488 11.0129H21.4011V9.89796C21.4011 9.6076 21.7155 9.42613 21.9669 9.57131L24.5397 11.0567C24.7911 11.2018 24.7911 11.5648 24.5397 11.71L21.9669 13.1953C21.7155 13.3405 21.4011 13.159 21.4011 12.8687V11.7538H21.0488C18.9447 11.7538 16.9926 10.6567 15.8986 8.85939C14.9689 7.33213 13.3332 6.38143 11.5539 6.32352L11.3814 6.32062H11.029V7.43555C11.029 7.72591 10.7147 7.90739 10.4632 7.76221L7.8905 6.27685C7.63904 6.13167 7.63904 5.76871 7.8905 5.62353L10.4632 4.13818C10.7147 3.993 11.029 4.17447 11.029 4.46484V5.57976Z" fill="#EEEEEE"/>
<defs>
<filter id="filter0_iiii_6472_20289" x="-2" y="-2" width="36.2109" height="21.0527" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="-2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_6472_20289"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="-2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_6472_20289" result="effect2_innerShadow_6472_20289"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="effect2_innerShadow_6472_20289" result="effect3_innerShadow_6472_20289"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="2"/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="effect3_innerShadow_6472_20289" result="effect4_innerShadow_6472_20289"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

@@ -0,0 +1,13 @@
<svg width="45" height="67" viewBox="0 0 45 67" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="44.2448" height="28.7351" fill="#C2C2C2"/>
<rect width="44.2448" height="1.1052" fill="#858585"/>
<rect y="4.78857" width="44.2448" height="1.1052" fill="#858585"/>
<rect y="9.57715" width="44.2448" height="1.1052" fill="#858585"/>
<rect y="14.3687" width="44.2448" height="1.1052" fill="#858585"/>
<rect y="19.1587" width="44.2448" height="1.1052" fill="#858585"/>
<rect y="23.9458" width="44.2448" height="1.1052" fill="#858585"/>
<rect y="28.7344" width="44.2448" height="1.1052" fill="#858585"/>
<rect x="10.252" y="30.0713" width="23.7411" height="32.7086" fill="#A3A3A3"/>
<rect x="20.2262" y="30.3394" width="3.16034" height="32.2355" fill="#FFF735"/>
<path d="M18.3454 62.7793H25.3598L23.4114 66.9998H20.4887L18.3454 62.7793Z" fill="#D9D9D9"/>
</svg>

After

Width:  |  Height:  |  Size: 868 B

View File

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.2" d="M5.98183 18.0178C1.49214 10.5356 7.48183 3.05343 20.1981 3.80156C20.9462 16.5216 13.464 22.5075 5.98183 18.0178Z" fill="#00AF42"/>
<path d="M20.9489 3.75655C20.9381 3.57307 20.8604 3.39991 20.7305 3.26994C20.6005 3.13998 20.4273 3.06226 20.2439 3.05155C13.1067 2.63249 7.38979 4.78124 4.95229 8.81249C4.10738 10.1915 3.69103 11.7903 3.75604 13.4062C3.80948 14.8987 4.24448 16.4062 5.04885 17.8922L3.21979 19.7203C3.07906 19.861 3 20.0519 3 20.2509C3 20.4499 3.07906 20.6408 3.21979 20.7815C3.36052 20.9223 3.55139 21.0013 3.75042 21.0013C3.94944 21.0013 4.14031 20.9223 4.28104 20.7815L6.10917 18.9525C7.59417 19.7559 9.1026 20.1909 10.5942 20.2444C10.6985 20.2481 10.8026 20.25 10.9064 20.25C12.4174 20.254 13.8997 19.8379 15.1879 19.0481C19.2192 16.6106 21.3689 10.8947 20.9489 3.75655ZM14.4145 17.7656C12.2817 19.0575 9.75698 19.0781 7.22292 17.8378L15.532 9.52967C15.6017 9.45999 15.6569 9.37727 15.6947 9.28622C15.7324 9.19518 15.7518 9.0976 15.7518 8.99905C15.7518 8.9005 15.7324 8.80292 15.6947 8.71188C15.6569 8.62083 15.6017 8.53811 15.532 8.46842C15.4623 8.39874 15.3796 8.34347 15.2885 8.30575C15.1975 8.26804 15.0999 8.24863 15.0014 8.24863C14.9028 8.24863 14.8052 8.26804 14.7142 8.30575C14.6231 8.34347 14.5404 8.39874 14.4707 8.46842L6.1626 16.7812C4.92604 14.25 4.94385 11.7187 6.23479 9.58967C8.30573 6.17061 13.2285 4.29842 19.4826 4.52155C19.7067 10.7709 17.8335 15.6947 14.4145 17.7656Z" fill="#00AF42"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -0,0 +1,9 @@
<svg width="6" height="10" viewBox="0 0 6 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 9.51613C0 9.78336 0.237026 10 0.529412 10C3.55073 10 6 7.76142 6 5C6 2.23858 3.55073 0 0.529412 0C0.237026 0 0 0.216637 0 0.483871C0 0.751105 0.237026 0.967742 0.529412 0.967742C2.96596 0.967742 4.94118 2.77305 4.94118 5C4.94118 7.22695 2.96596 9.03226 0.529412 9.03226C0.237026 9.03226 0 9.24889 0 9.51613Z" fill="url(#paint0_linear_46765_16184)"/>
<defs>
<linearGradient id="paint0_linear_46765_16184" x1="0.622561" y1="9.52006" x2="5.48816e-08" y2="0.52972" gradientUnits="userSpaceOnUse">
<stop stop-color="#00AE42"/>
<stop offset="1" stop-color="#00AE42" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 758 B

View File

@@ -0,0 +1,9 @@
<svg width="6" height="10" viewBox="0 0 6 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 9.51613C0 9.78336 0.237026 10 0.529412 10C3.55073 10 6 7.76142 6 5C6 2.23858 3.55073 0 0.529412 0C0.237026 0 0 0.216637 0 0.483871C0 0.751105 0.237026 0.967742 0.529412 0.967742C2.96596 0.967742 4.94118 2.77305 4.94118 5C4.94118 7.22695 2.96596 9.03226 0.529412 9.03226C0.237026 9.03226 0 9.24889 0 9.51613Z" fill="url(#paint0_linear_46765_16184)"/>
<defs>
<linearGradient id="paint0_linear_46765_16184" x1="0.622561" y1="9.52006" x2="0" y2="0.52972" gradientUnits="userSpaceOnUse">
<stop stop-color="#00AE42"/>
<stop offset="1" stop-color="#00AE42" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 748 B

View File

@@ -0,0 +1,9 @@
<svg width="6" height="10" viewBox="0 0 6 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.483871 0C0.216637 0 0 0.237026 0 0.529412C0 3.55073 2.23858 6 5 6C7.76142 6 10 3.55073 10 0.529412C10 0.237026 9.78336 0 9.51613 0C9.24889 0 9.03226 0.237026 9.03226 0.529412C9.03226 2.96596 7.22695 4.94118 5 4.94118C2.77305 4.94118 0.967742 2.96596 0.967742 0.529412C0.967742 0.237026 0.751105 0 0.483871 0Z" transform="translate(-2, 2)" fill="url(#paint0_linear_46765_16184)"/>
<defs>
<linearGradient id="paint0_linear_46765_16184" x1="0.52972" y1="0.622561" x2="9.52006" y2="0.622561" gradientUnits="userSpaceOnUse">
<stop stop-color="#00AE42"/>
<stop offset="1" stop-color="#00AE42" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 785 B

Some files were not shown because too many files have changed in this diff Show More