kitchen-simulator 11.30.1 → 11.30.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/es/assets/img/svg/accessories.svg +4 -4
  2. package/es/assets/img/svg/bottombar/elevation-back.svg +6 -6
  3. package/es/assets/img/svg/bottombar/elevation-front.svg +6 -6
  4. package/es/assets/img/svg/bottombar/elevation-left.svg +6 -6
  5. package/es/assets/img/svg/bottombar/elevation-right.svg +7 -7
  6. package/es/assets/img/svg/bottombar/elevation.svg +13 -13
  7. package/es/assets/img/svg/detail.svg +77 -77
  8. package/es/assets/img/svg/filtersActive.svg +19 -19
  9. package/es/assets/img/svg/invert.svg +12 -12
  10. package/es/assets/img/svg/menubar/login.svg +84 -84
  11. package/es/assets/img/svg/menubar/my_projects.svg +85 -85
  12. package/es/assets/img/svg/menubar/new_project.svg +110 -110
  13. package/es/assets/img/svg/menubar/save_project.svg +84 -84
  14. package/es/assets/img/svg/options.svg +3 -3
  15. package/es/assets/img/svg/positioning.svg +3 -3
  16. package/es/assets/img/svg/toggleFilters.svg +19 -19
  17. package/es/assets/img/svg/toolbar/shopping-cart.svg +13 -13
  18. package/es/assets/img/svg/wizardstep/detail_view.svg +87 -87
  19. package/es/assets/img/svg/wizardstep/tile_view.svg +95 -95
  20. package/es/class/vertex.js +7 -1
  21. package/es/components/viewer2d/viewer2d.js +7 -22
  22. package/es/components/viewer3d/camera-controls-module/camera-controls.module.js +556 -556
  23. package/es/components/viewer3d/scene-creator.js +6 -5
  24. package/es/constants/applianceCategories.js +19 -0
  25. package/es/engine/2d/viewer-utils.js +20 -0
  26. package/es/mappings/external-events/mapExternalEventPayload.js +4 -4
  27. package/es/mappings/external-events/mappers/addItemMapper.js +9 -9
  28. package/es/shared/domain/asset/sanitize-asset-url.js +5 -5
  29. package/es/shared/math/line-metrics.js +11 -11
  30. package/es/utils/geometry.js +13 -12
  31. package/es/utils/skinPanelEngine.js +14 -14
  32. package/lib/assets/img/svg/accessories.svg +4 -4
  33. package/lib/assets/img/svg/bottombar/elevation-back.svg +6 -6
  34. package/lib/assets/img/svg/bottombar/elevation-front.svg +6 -6
  35. package/lib/assets/img/svg/bottombar/elevation-left.svg +6 -6
  36. package/lib/assets/img/svg/bottombar/elevation-right.svg +7 -7
  37. package/lib/assets/img/svg/bottombar/elevation.svg +13 -13
  38. package/lib/assets/img/svg/detail.svg +77 -77
  39. package/lib/assets/img/svg/filtersActive.svg +19 -19
  40. package/lib/assets/img/svg/invert.svg +12 -12
  41. package/lib/assets/img/svg/menubar/login.svg +84 -84
  42. package/lib/assets/img/svg/menubar/my_projects.svg +85 -85
  43. package/lib/assets/img/svg/menubar/new_project.svg +110 -110
  44. package/lib/assets/img/svg/menubar/save_project.svg +84 -84
  45. package/lib/assets/img/svg/options.svg +3 -3
  46. package/lib/assets/img/svg/positioning.svg +3 -3
  47. package/lib/assets/img/svg/toggleFilters.svg +19 -19
  48. package/lib/assets/img/svg/toolbar/shopping-cart.svg +13 -13
  49. package/lib/assets/img/svg/wizardstep/detail_view.svg +87 -87
  50. package/lib/assets/img/svg/wizardstep/tile_view.svg +95 -95
  51. package/lib/class/vertex.js +7 -1
  52. package/lib/components/viewer2d/viewer2d.js +7 -22
  53. package/lib/components/viewer3d/camera-controls-module/camera-controls.module.js +556 -556
  54. package/lib/components/viewer3d/scene-creator.js +6 -5
  55. package/lib/constants/applianceCategories.js +25 -0
  56. package/lib/engine/2d/viewer-utils.js +25 -0
  57. package/lib/mappings/external-events/mapExternalEventPayload.js +4 -4
  58. package/lib/mappings/external-events/mappers/addItemMapper.js +9 -9
  59. package/lib/shared/domain/asset/sanitize-asset-url.js +5 -5
  60. package/lib/shared/math/line-metrics.js +11 -11
  61. package/lib/utils/geometry.js +13 -12
  62. package/lib/utils/skinPanelEngine.js +14 -14
  63. package/package.json +1 -1
@@ -18,6 +18,7 @@ import { animateDoor, isElevationView, isEmpty, isImmutable, replaceMeshesWithLi
18
18
  import { formatNumber } from "../../utils/math";
19
19
  import { toJSIfNeeded } from "../../shared/objects/immutable";
20
20
  import { isCornerCabinet } from "../../shared/domain/cabinet-corner";
21
+ import { APPLIANCE_CATEGORY_DISHWASHER } from "../../constants/applianceCategories";
21
22
  export var fVLine = [];
22
23
  var scene_mode = null;
23
24
  export function parseData(sceneData, actions, catalog, camera, renderer, mode) {
@@ -2474,13 +2475,13 @@ export function createMDFromItem(item, lines, molding) {
2474
2475
  };
2475
2476
  }
2476
2477
  function tryAdjacent(ct1, ct2) {
2477
- if (ct1.catid.includes('Dishwasher') && ct1.catid.includes('BF')) {
2478
+ if (ct1.catid.includes(APPLIANCE_CATEGORY_DISHWASHER) && ct1.catid.includes('BF')) {
2478
2479
  var temp = ct1;
2479
2480
  ct1 = ct2;
2480
2481
  ct2 = temp;
2481
2482
  }
2482
2483
  log('----tryAdjacent', ct1.id, ct2.id);
2483
- if (!ct2.catid.includes('Dishwasher') && !ct2.catid.includes('BF') && ct1.catid != ct2.catid) return false;
2484
+ if (!ct2.catid.includes(APPLIANCE_CATEGORY_DISHWASHER) && !ct2.catid.includes('BF') && ct1.catid != ct2.catid) return false;
2484
2485
  if (ct1.items[0].layoutpos === 'Vanity' || ct2.items[0].layoutpos === 'Vanity') return false;
2485
2486
  if (ct1.rotRad != ct2.rotRad) return false;
2486
2487
  log('ct1', ct1.pos.x, ct1.pos.y, ct1.size.width);
@@ -2625,7 +2626,7 @@ function showItemCT(item, CT, visible, planData, layer) {
2625
2626
  });
2626
2627
  }
2627
2628
  function getCountertopMesh(item, visible, planData, layer) {
2628
- if (item.type.includes('Dishwasher')) return undefined;
2629
+ if (item.type.includes(APPLIANCE_CATEGORY_DISHWASHER)) return undefined;
2629
2630
  if (item.type.includes('BF')) return undefined;
2630
2631
  var item3D = planData.sceneGraph.layers[layer.id].items[item.id];
2631
2632
  var countertop = null;
@@ -2695,10 +2696,10 @@ function addCTMesh(countertop, planData, layer) {
2695
2696
  var pivotMat = ctMesh.parent.parent.matrix;
2696
2697
  pivotMat.setPosition(new Three.Vector3(countertop.pos.x, 0, -countertop.pos.y));
2697
2698
  var width = countertop.items.find(function (ct) {
2698
- return !ct.type.includes('Dishwasher') && !ct.type.includes('BF');
2699
+ return !ct.type.includes(APPLIANCE_CATEGORY_DISHWASHER) && !ct.type.includes('BF');
2699
2700
  }).properties.get('width').get('_length');
2700
2701
  var unit_width = countertop.items.find(function (ct) {
2701
- return !ct.type.includes('Dishwasher') && !ct.type.includes('BF');
2702
+ return !ct.type.includes(APPLIANCE_CATEGORY_DISHWASHER) && !ct.type.includes('BF');
2702
2703
  }).properties.get('width').get('_unit') || 'cm';
2703
2704
  width = convert(width).from(unit_width).to('cm');
2704
2705
  pivotMat.scale(new Three.Vector3(countertop.size.width / width, 1, 1));
@@ -0,0 +1,19 @@
1
+ // Appliance category/name constants
2
+ //
3
+ // NOTE: Keep these in a small dedicated module instead of adding more
4
+ // hardcoded strings into src/constants.js (which is already very large).
5
+
6
+ // wall-like appliances
7
+ export var APPLIANCE_CATEGORY_COOK_TOP = 'Cook Top';
8
+ export var APPLIANCE_CATEGORY_MICROWAVE = 'Microwave';
9
+ export var APPLIANCE_CATEGORY_HOOD = 'Hood';
10
+
11
+ // base-like appliances
12
+ export var APPLIANCE_CATEGORY_DISHWASHER = 'Dishwasher';
13
+ export var APPLIANCE_CATEGORY_REFRIGERATOR = 'Refrigerator';
14
+ export var APPLIANCE_CATEGORY_RANGE = 'Range';
15
+
16
+ // Categories that we exclude from some snapping/overlap logic.
17
+ // (exported as an array so call-sites can create their own Set and avoid
18
+ // accidental shared mutation)
19
+ export var EXCLUDED_APPLIANCE_CATEGORIES = Object.freeze([APPLIANCE_CATEGORY_COOK_TOP, APPLIANCE_CATEGORY_MICROWAVE, APPLIANCE_CATEGORY_HOOD]);
@@ -0,0 +1,20 @@
1
+ import { APPLIANCE_CATEGORY_COOK_TOP, APPLIANCE_CATEGORY_HOOD, APPLIANCE_CATEGORY_RANGE } from "../../constants/applianceCategories";
2
+
3
+ /**
4
+ * Returns `true` for items that are intentionally allowed to overlap other
5
+ * elements while being placed/dragged in the 2D viewer.
6
+ *
7
+ * Why this exists:
8
+ * - `GeometryUtils.validInterSect(...)` is used as a collision/intersection gate.
9
+ * - Some appliances (e.g. cooktops/ranges/hoods) are expected to be placed "on"
10
+ * or "inside" cabinetry/countertops, so they must not be blocked by that gate.
11
+ *
12
+ * NOTE: This currently identifies items by the appliance category strings found
13
+ * in `itemInfo.name` / `itemInfo.cabinet_category`.
14
+ */
15
+ export var shouldBypassItemIntersectionValidation = function shouldBypassItemIntersectionValidation(itemRect) {
16
+ var itemInfo = itemRect === null || itemRect === void 0 ? void 0 : itemRect.itemInfo;
17
+ var name = typeof (itemInfo === null || itemInfo === void 0 ? void 0 : itemInfo.name) === 'string' ? itemInfo.name : '';
18
+ var cabinetCategory = typeof (itemInfo === null || itemInfo === void 0 ? void 0 : itemInfo.cabinet_category) === 'string' ? itemInfo.cabinet_category : '';
19
+ return name.includes(APPLIANCE_CATEGORY_HOOD) || cabinetCategory.toLowerCase().includes(APPLIANCE_CATEGORY_HOOD.toLowerCase()) || name.includes(APPLIANCE_CATEGORY_RANGE) || name.includes(APPLIANCE_CATEGORY_COOK_TOP);
20
+ };
@@ -4,10 +4,10 @@ import { mapAddItemEvent } from "./mappers/addItemMapper";
4
4
  import { mapChangeDoorStyleEvent } from "./mappers/changeDoorStyleMapper";
5
5
  import { mapLoadProjectEvent } from "./mappers/loadProjectMapper";
6
6
 
7
- /**
8
- * Main dispatcher for external event payload mapping.
9
- * Converts new API formats into legacy internal formats (e.g. assets3d -> structure_json)
10
- * without changing the behavior of the existing 3D tool.
7
+ /**
8
+ * Main dispatcher for external event payload mapping.
9
+ * Converts new API formats into legacy internal formats (e.g. assets3d -> structure_json)
10
+ * without changing the behavior of the existing 3D tool.
11
11
  */
12
12
  export function mapExternalEventPayload(evt, state, defaultTextures) {
13
13
  if (isEmpty(evt)) return null;
@@ -5,15 +5,15 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
5
5
  import { ITEM_TYPE } from "../../../constants";
6
6
  import { isEmpty } from "../../../utils/helper";
7
7
 
8
- /**
9
- * Mapping logic for EXTERNAL_EVENT_ADD_ITEM.
10
- *
11
- * Converts the new assets3d payload shape into the legacy structure_json format
12
- * expected by the existing 3D tool.
13
- *
14
- * @param {Object} evt.payload External event payload
15
- * @param {Immutable.Map} state Planner state
16
- * @returns {Object|null} Updated event (or null when payload is empty)
8
+ /**
9
+ * Mapping logic for EXTERNAL_EVENT_ADD_ITEM.
10
+ *
11
+ * Converts the new assets3d payload shape into the legacy structure_json format
12
+ * expected by the existing 3D tool.
13
+ *
14
+ * @param {Object} evt.payload External event payload
15
+ * @param {Immutable.Map} state Planner state
16
+ * @returns {Object|null} Updated event (or null when payload is empty)
17
17
  */
18
18
  export function mapAddItemEvent(orgEvtPayload, state) {
19
19
  var _evtPayload, _evtPayload3;
@@ -1,8 +1,8 @@
1
- /**
2
- * Strip stray dots from the **path portion** of a GLTF/BIN URL.
3
- * e.g. `…/B36_36x34.5x24.gltf` → `…/B36_36x345x24.gltf`
4
- *
5
- * Leaves the protocol/domain and the final file extension untouched.
1
+ /**
2
+ * Strip stray dots from the **path portion** of a GLTF/BIN URL.
3
+ * e.g. `…/B36_36x34.5x24.gltf` → `…/B36_36x345x24.gltf`
4
+ *
5
+ * Leaves the protocol/domain and the final file extension untouched.
6
6
  */
7
7
  export var sanitizeAssetUrl = function sanitizeAssetUrl(url) {
8
8
  if (!url) return url;
@@ -8,17 +8,17 @@ function getVertex(vertices, vertexId) {
8
8
  return typeof vertices.get === 'function' ? vertices.get(vertexId) : vertices[vertexId];
9
9
  }
10
10
 
11
- /**
12
- * Computes a line length using its 2 vertices.
13
- *
14
- * Assumptions (matches existing DRAG logic):
15
- * - vertex coordinates are stored in centimeters
16
- * - result is converted to the provided unit
17
- *
18
- * @param {object} line - line object/record with `vertices` (array or immutable List)
19
- * @param {object} vertices - vertices collection (plain object map or immutable Map)
20
- * @param {string} unit - target unit (e.g. 'in', 'cm')
21
- * @returns {number|null}
11
+ /**
12
+ * Computes a line length using its 2 vertices.
13
+ *
14
+ * Assumptions (matches existing DRAG logic):
15
+ * - vertex coordinates are stored in centimeters
16
+ * - result is converted to the provided unit
17
+ *
18
+ * @param {object} line - line object/record with `vertices` (array or immutable List)
19
+ * @param {object} vertices - vertices collection (plain object map or immutable Map)
20
+ * @param {string} unit - target unit (e.g. 'in', 'cm')
21
+ * @returns {number|null}
22
22
  */
23
23
  export function getLineLength(line, vertices) {
24
24
  var _v0$x, _v1$x, _v0$y, _v1$y;
@@ -15,6 +15,8 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
15
15
  */
16
16
  import { fAbs, toFixedFloat } from "./math.js";
17
17
  import { BASE_CABINET_LAYOUTPOS, EPSILON, LINE_THICKNESS, MEPSILON, OVERLAP_INCLUDED, OVERLAP_LINK, OVERLAP_NONE, OVERLAP_SAME, OVERLAP_SOME, UNIT_ANGLE, WALL_CABINET_LAYOUTPOS } from "../constants";
18
+ import { APPLIANCE_CATEGORY_COOK_TOP, APPLIANCE_CATEGORY_HOOD, EXCLUDED_APPLIANCE_CATEGORIES } from "../constants/applianceCategories";
19
+ import { shouldBypassItemIntersectionValidation } from "../engine/2d/viewer-utils.js";
18
20
  import { convert } from "./convert-units-lite";
19
21
  import * as Three from 'three';
20
22
  import { returnReplaceableDeepSearchType } from "../components/viewer2d/utils.js";
@@ -729,8 +731,9 @@ export function getAllItemSpecified(scene, catalog, filter) {
729
731
  };
730
732
  var curiteminfo;
731
733
  var iteminfo = [];
734
+ var excludedApplianceCategories = new Set(EXCLUDED_APPLIANCE_CATEGORIES);
732
735
  layer.items.forEach(function (item) {
733
- var _cat$obj;
736
+ var _cat$obj, _cat$obj2;
734
737
  if (!item) return;
735
738
  var val = {
736
739
  pos: {
@@ -756,11 +759,9 @@ export function getAllItemSpecified(scene, catalog, filter) {
756
759
  val.item = item;
757
760
 
758
761
  // Filter check
759
- if (Array.isArray(filter)) {
760
- if (!val.layoutpos || !filter.includes(val.layoutpos)) return;
761
- } else if (val.layoutpos !== filter || isEmpty(cat) || (cat === null || cat === void 0 ? void 0 : cat.type) === 'appliance' && ['Cook Top', 'Microwave'].includes(cat === null || cat === void 0 || (_cat$obj = cat.obj) === null || _cat$obj === void 0 ? void 0 : _cat$obj.category)) {
762
- return;
763
- }
762
+ var isExcludedItem = isEmpty(cat) || (cat === null || cat === void 0 ? void 0 : cat.type) === 'appliance' && excludedApplianceCategories.has(cat === null || cat === void 0 || (_cat$obj = cat.obj) === null || _cat$obj === void 0 ? void 0 : _cat$obj.category) || excludedApplianceCategories.has(cat === null || cat === void 0 || (_cat$obj2 = cat.obj) === null || _cat$obj2 === void 0 ? void 0 : _cat$obj2.cabinet_category);
763
+ var layoutMatches = Array.isArray(filter) ? !!val.layoutpos && filter.includes(val.layoutpos) : val.layoutpos === filter;
764
+ if (!layoutMatches || isExcludedItem) return;
764
765
 
765
766
  // Current vs others
766
767
  var rect = getCalcRectFromItem3D(val);
@@ -1633,7 +1634,7 @@ export function calcSnap2(allItemRect, allItemSnap, allLineRects, allLineSnap, a
1633
1634
  rotRad = snap.rotRad;
1634
1635
  }
1635
1636
  });
1636
- if (allItemRect.cur.itemInfo.name.includes('Cook Top')) {
1637
+ if (allItemRect.cur.itemInfo.name.includes(APPLIANCE_CATEGORY_COOK_TOP)) {
1637
1638
  var intersects = allItemRect.others.filter(function (others) {
1638
1639
  return intersectRect(others.rect, curitem.rect);
1639
1640
  });
@@ -1645,12 +1646,12 @@ export function calcSnap2(allItemRect, allItemSnap, allLineRects, allLineSnap, a
1645
1646
  }
1646
1647
  });
1647
1648
  }
1648
- if (allItemRect.cur.itemInfo.name.includes('Hood') || allItemRect.cur.itemInfo.cabinet_category.toLowerCase().includes('hood') || allItemRect.cur.itemInfo.name.includes('Range') || allItemRect.cur.itemInfo.name.includes('Cook Top')) {
1649
+ if (shouldBypassItemIntersectionValidation(allItemRect.cur)) {
1649
1650
  var _intersects = allItemRect.others.filter(function (others) {
1650
1651
  return intersectRect(others.rect, curitem.rect);
1651
1652
  });
1652
1653
  _intersects.forEach(function (rect) {
1653
- if (isPointInArea(allArea, rect.itemInfo) || !allArea.length) if (rect.itemInfo.name.includes('Hood') || rect.itemInfo.cabinet_category.toLowerCase().includes('hood') || rect.itemInfo.name.includes('Range') || rect.itemInfo.name.includes('Cook Top')) {
1654
+ if ((isPointInArea(allArea, rect.itemInfo) || !allArea.length) && shouldBypassItemIntersectionValidation(rect)) {
1654
1655
  nx = rect.itemInfo.x;
1655
1656
  ny = rect.itemInfo.y;
1656
1657
  rotRad = rect.itemInfo.rotation * Math.PI / 180;
@@ -2039,9 +2040,9 @@ export function needSnap(curItem, othItem) {
2039
2040
  var isBlsnapOth = othItem.item.category === 'cabinet' && othItem.item.layoutpos === BASE_CABINET_LAYOUTPOS && Math.abs(curFloor - otherFloor) >= delta;
2040
2041
  var isBlsnapCur = curItem.selectedItem.category === 'cabinet' && curItem.selectedItem.layoutpos === BASE_CABINET_LAYOUTPOS && Math.abs(curFloor - otherFloor) >= delta;
2041
2042
  if (curItem.cat.hasOwnProperty('long_name') || othItem.cat && othItem.cat.hasOwnProperty('long_name')) {
2042
- if (curItem.cat.long_name.includes('Hood') || othItem.cat && othItem.cat.long_name.includes('Hood')) blSnap = true;
2043
- if (curItem.cat.long_name.includes('Hood') && othItem.cat && isBlsnapOth || isBlsnapCur && othItem.cat.long_name.includes('Hood')) blSnap = false;
2044
- if (curItem.cat.long_name.includes('Cook Top') && othItem.cat && othItem.cat.long_name.includes('Cabinet') || curItem.cat.long_name.includes('Cabinet') && othItem.cat && othItem.cat.long_name.includes('Cook Top')) blSnap = true;
2043
+ if (curItem.cat.long_name.includes(APPLIANCE_CATEGORY_HOOD) || othItem.cat && othItem.cat.long_name.includes(APPLIANCE_CATEGORY_HOOD)) blSnap = true;
2044
+ if (curItem.cat.long_name.includes(APPLIANCE_CATEGORY_HOOD) && othItem.cat && isBlsnapOth || isBlsnapCur && othItem.cat.long_name.includes(APPLIANCE_CATEGORY_HOOD)) blSnap = false;
2045
+ if (curItem.cat.long_name.includes(APPLIANCE_CATEGORY_COOK_TOP) && othItem.cat && othItem.cat.long_name.includes('Cabinet') || curItem.cat.long_name.includes('Cabinet') && othItem.cat && othItem.cat.long_name.includes(APPLIANCE_CATEGORY_COOK_TOP)) blSnap = true;
2045
2046
  }
2046
2047
  return blSnap;
2047
2048
  }
@@ -137,10 +137,10 @@ function isSnappedWithCornerCabient(srcItem, desItem) {
137
137
  } else return false;
138
138
  }
139
139
 
140
- /**
141
- * @param {*} faceSegs
142
- * @param {*} otherFaces
143
- * @returns
140
+ /**
141
+ * @param {*} faceSegs
142
+ * @param {*} otherFaces
143
+ * @returns
144
144
  */
145
145
  function getTrimmedFaceSegs(faceSegs, otherFaces, cnt) {
146
146
  try {
@@ -301,8 +301,8 @@ function applyGroupingRules(faces) {
301
301
  };
302
302
  }
303
303
 
304
- /**
305
- * Horizontal Grouping (for base cabinets back-to-back : BSV48 48" x 34.5")
304
+ /**
305
+ * Horizontal Grouping (for base cabinets back-to-back : BSV48 48" x 34.5")
306
306
  */
307
307
  function applyHorizontalGrouping(faces) {
308
308
  var removeIdxs = [];
@@ -344,8 +344,8 @@ function applyHorizontalGrouping(faces) {
344
344
  };
345
345
  }
346
346
 
347
- /**
348
- * Vertical Grouping (For CT3DR or CT2DR SKUs + stacked wall cabinets)
347
+ /**
348
+ * Vertical Grouping (For CT3DR or CT2DR SKUs + stacked wall cabinets)
349
349
  */
350
350
  function applyVerticalGrouping(faces) {
351
351
  var removeIdxs = [];
@@ -436,8 +436,8 @@ function buildMP3SkinPanelArray(bottomHeight, topHeight, mp3SkinPanelArray) {
436
436
  return skinPanelTypeArray;
437
437
  }
438
438
 
439
- /**
440
- * Decide which skin panel pieces are needed for a tall cabinet.
439
+ /**
440
+ * Decide which skin panel pieces are needed for a tall cabinet.
441
441
  */
442
442
  function resolveTallCabinetBundle(face) {
443
443
  var item = face.itemInfo;
@@ -457,8 +457,8 @@ function resolveTallCabinetBundle(face) {
457
457
  return face !== null && face !== void 0 && face.skinPanelSKU ? [face.skinPanelSKU] : [];
458
458
  }
459
459
 
460
- /**
461
- * Converts a face → list of SKUs
460
+ /**
461
+ * Converts a face → list of SKUs
462
462
  */
463
463
  function resolveSkinPanelSKU(face) {
464
464
  var layout = face.itemInfo.layoutpos;
@@ -468,8 +468,8 @@ function resolveSkinPanelSKU(face) {
468
468
  return [face.skinPanelSKU];
469
469
  }
470
470
 
471
- /**
472
- * Make skin panel data with grouping skinPanelSKU & doorStyle
471
+ /**
472
+ * Make skin panel data with grouping skinPanelSKU & doorStyle
473
473
  */
474
474
  function buildSkinPanelData(faces) {
475
475
  var tempResult = [];
@@ -1,4 +1,4 @@
1
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M11.05 5.47V20.18L8 20.96" stroke="#000F33" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
3
- <path d="M16.02 3V17.32L14.13 17.76" stroke="#000F33" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
4
- </svg>
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M11.05 5.47V20.18L8 20.96" stroke="#000F33" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M16.02 3V17.32L14.13 17.76" stroke="#000F33" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
4
+ </svg>
@@ -1,6 +1,6 @@
1
- <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M14.5564 21L20.2416 14.9342L21.0051 2.53973L14.8952 6.34589" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
3
- <path d="M8.91868 1L9.14126 12.3969L1.90534 17.3692L0.994629 4.08224L8.91868 1Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
4
- <path d="M8.9187 1L21.0053 2.53972L20.2418 14.9342L9.14128 12.3969L8.9187 1Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
5
- <path d="M14.5566 21L1.90534 17.3692L0.994629 4.08224L14.8953 6.34588L14.5566 21Z" fill="#4C12A1" fill-opacity="0.5" stroke="#4C12A1" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
6
- </svg>
1
+ <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M14.5564 21L20.2416 14.9342L21.0051 2.53973L14.8952 6.34589" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
3
+ <path d="M8.91868 1L9.14126 12.3969L1.90534 17.3692L0.994629 4.08224L8.91868 1Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
4
+ <path d="M8.9187 1L21.0053 2.53972L20.2418 14.9342L9.14128 12.3969L8.9187 1Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
5
+ <path d="M14.5566 21L1.90534 17.3692L0.994629 4.08224L14.8953 6.34588L14.5566 21Z" fill="#4C12A1" fill-opacity="0.5" stroke="#4C12A1" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
6
+ </svg>
@@ -1,6 +1,6 @@
1
- <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M8.9187 1L21.0053 2.53972L20.2418 14.9342L9.14128 12.3969L8.9187 1Z" fill="#4C12A1" fill-opacity="0.5" stroke="#4C12A1" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
3
- <path d="M14.5566 21L1.90534 17.3692L0.994629 4.08224L14.8953 6.34588L14.5566 21Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
4
- <path d="M14.5564 21L20.2416 14.9342M21.0051 2.53973L14.8952 6.34589" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
5
- <path d="M8.91868 1L0.994629 4.08224L1.90534 17.3692L9.14126 12.3969" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
6
- </svg>
1
+ <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M8.9187 1L21.0053 2.53972L20.2418 14.9342L9.14128 12.3969L8.9187 1Z" fill="#4C12A1" fill-opacity="0.5" stroke="#4C12A1" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M14.5566 21L1.90534 17.3692L0.994629 4.08224L14.8953 6.34588L14.5566 21Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
4
+ <path d="M14.5564 21L20.2416 14.9342M21.0051 2.53973L14.8952 6.34589" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
5
+ <path d="M8.91868 1L0.994629 4.08224L1.90534 17.3692L9.14126 12.3969" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
6
+ </svg>
@@ -1,6 +1,6 @@
1
- <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M8.91868 1L9.14126 12.3969L1.90534 17.3692L0.994629 4.08224L8.91868 1Z" fill="#4C12A1" fill-opacity="0.5" stroke="#4C12A1" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
3
- <path d="M14.5564 21L20.2416 14.9342L21.0051 2.53973L14.8952 6.34589" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
4
- <path d="M8.9187 1L21.0053 2.53972L20.2418 14.9342L9.14128 12.3969" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
5
- <path d="M1.90534 17.3692L14.5566 21L14.8953 6.34588L0.994629 4.08224" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
6
- </svg>
1
+ <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M8.91868 1L9.14126 12.3969L1.90534 17.3692L0.994629 4.08224L8.91868 1Z" fill="#4C12A1" fill-opacity="0.5" stroke="#4C12A1" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M14.5564 21L20.2416 14.9342L21.0051 2.53973L14.8952 6.34589" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
4
+ <path d="M8.9187 1L21.0053 2.53972L20.2418 14.9342L9.14128 12.3969" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
5
+ <path d="M1.90534 17.3692L14.5566 21L14.8953 6.34588L0.994629 4.08224" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
6
+ </svg>
@@ -1,7 +1,7 @@
1
- <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M14.5566 21L1.90534 17.3692L0.994629 4.08224L14.8953 6.34588L14.5566 21Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
3
- <path d="M8.91868 1L9.14126 12.3969L1.90534 17.3692L0.994629 4.08224L8.91868 1Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
4
- <path d="M8.9187 1L21.0053 2.53972L20.2418 14.9342L9.14128 12.3969L8.9187 1Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
5
- <path d="M14.5564 21L20.2416 14.9342L21.0051 2.53973L14.8952 6.34589" fill="#4C12A1" fill-opacity="0.5"/>
6
- <path d="M14.5564 21L20.2416 14.9342L21.0051 2.53973L14.8952 6.34589L14.5564 21Z" stroke="#4C12A1" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
7
- </svg>
1
+ <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M14.5566 21L1.90534 17.3692L0.994629 4.08224L14.8953 6.34588L14.5566 21Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
3
+ <path d="M8.91868 1L9.14126 12.3969L1.90534 17.3692L0.994629 4.08224L8.91868 1Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
4
+ <path d="M8.9187 1L21.0053 2.53972L20.2418 14.9342L9.14128 12.3969L8.9187 1Z" stroke="#C1CAE4" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 3"/>
5
+ <path d="M14.5564 21L20.2416 14.9342L21.0051 2.53973L14.8952 6.34589" fill="#4C12A1" fill-opacity="0.5"/>
6
+ <path d="M14.5564 21L20.2416 14.9342L21.0051 2.53973L14.8952 6.34589L14.5564 21Z" stroke="#4C12A1" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
7
+ </svg>
@@ -1,13 +1,13 @@
1
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <g clip-path="url(#clip0_1516_100789)">
3
- <path d="M4.25 6L2 7.125L8 10.125L14 7.125L11.75 6" stroke="rgba(58, 11, 128, 1)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
4
- <path d="M2 10.125L8 13.125L14 10.125" stroke="rgba(58, 11, 128, 1)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
5
- <path d="M8 7.125V1.875" stroke="rgba(58, 11, 128, 1)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
6
- <path d="M5.75 4.125L8 1.875L10.25 4.125" stroke="rgba(58, 11, 128, 1)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
7
- </g>
8
- <defs>
9
- <clipPath id="clip0_1516_100789">
10
- <rect width="16" height="16" fill="white"/>
11
- </clipPath>
12
- </defs>
13
- </svg>
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_1516_100789)">
3
+ <path d="M4.25 6L2 7.125L8 10.125L14 7.125L11.75 6" stroke="rgba(58, 11, 128, 1)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
4
+ <path d="M2 10.125L8 13.125L14 10.125" stroke="rgba(58, 11, 128, 1)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
5
+ <path d="M8 7.125V1.875" stroke="rgba(58, 11, 128, 1)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
6
+ <path d="M5.75 4.125L8 1.875L10.25 4.125" stroke="rgba(58, 11, 128, 1)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
7
+ </g>
8
+ <defs>
9
+ <clipPath id="clip0_1516_100789">
10
+ <rect width="16" height="16" fill="white"/>
11
+ </clipPath>
12
+ </defs>
13
+ </svg>
@@ -1,77 +1,77 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- width="18"
13
- height="14"
14
- id="svg3049"
15
- version="1.1"
16
- inkscape:version="0.48.4 r9939"
17
- sodipodi:docname="New document 5">
18
- <defs
19
- id="defs3051" />
20
- <sodipodi:namedview
21
- id="base"
22
- pagecolor="#ffffff"
23
- bordercolor="#666666"
24
- borderopacity="1.0"
25
- inkscape:pageopacity="0.0"
26
- inkscape:pageshadow="2"
27
- inkscape:zoom="11.197802"
28
- inkscape:cx="16"
29
- inkscape:cy="16"
30
- inkscape:current-layer="layer1"
31
- showgrid="true"
32
- inkscape:grid-bbox="true"
33
- inkscape:document-units="px"
34
- inkscape:window-width="1920"
35
- inkscape:window-height="1017"
36
- inkscape:window-x="-8"
37
- inkscape:window-y="-8"
38
- inkscape:window-maximized="1" />
39
- <metadata
40
- id="metadata3054">
41
- <rdf:RDF>
42
- <cc:Work
43
- rdf:about="">
44
- <dc:format>image/svg+xml</dc:format>
45
- <dc:type
46
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
47
- <dc:title></dc:title>
48
- </cc:Work>
49
- </rdf:RDF>
50
- </metadata>
51
- <g
52
- id="layer1"
53
- inkscape:label="Layer 1"
54
- inkscape:groupmode="layer"
55
- transform="translate(0,-18)">
56
- <g
57
- transform="translate(-867,-822.725)"
58
- clip-path="url(#clip77_0_1)"
59
- id="g4">
60
- <path
61
- style="stroke:#4c12a1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"
62
- inkscape:connector-curvature="0"
63
- d="m 868,841.725 h 16"
64
- id="path6" />
65
- <path
66
- style="stroke:#4c12a1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"
67
- inkscape:connector-curvature="0"
68
- d="m 868,847.725 h 16"
69
- id="path8" />
70
- <path
71
- style="stroke:#4c12a1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"
72
- inkscape:connector-curvature="0"
73
- d="m 868,853.725 h 16"
74
- id="path10" />
75
- </g>
76
- </g>
77
- </svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ width="18"
13
+ height="14"
14
+ id="svg3049"
15
+ version="1.1"
16
+ inkscape:version="0.48.4 r9939"
17
+ sodipodi:docname="New document 5">
18
+ <defs
19
+ id="defs3051" />
20
+ <sodipodi:namedview
21
+ id="base"
22
+ pagecolor="#ffffff"
23
+ bordercolor="#666666"
24
+ borderopacity="1.0"
25
+ inkscape:pageopacity="0.0"
26
+ inkscape:pageshadow="2"
27
+ inkscape:zoom="11.197802"
28
+ inkscape:cx="16"
29
+ inkscape:cy="16"
30
+ inkscape:current-layer="layer1"
31
+ showgrid="true"
32
+ inkscape:grid-bbox="true"
33
+ inkscape:document-units="px"
34
+ inkscape:window-width="1920"
35
+ inkscape:window-height="1017"
36
+ inkscape:window-x="-8"
37
+ inkscape:window-y="-8"
38
+ inkscape:window-maximized="1" />
39
+ <metadata
40
+ id="metadata3054">
41
+ <rdf:RDF>
42
+ <cc:Work
43
+ rdf:about="">
44
+ <dc:format>image/svg+xml</dc:format>
45
+ <dc:type
46
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
47
+ <dc:title></dc:title>
48
+ </cc:Work>
49
+ </rdf:RDF>
50
+ </metadata>
51
+ <g
52
+ id="layer1"
53
+ inkscape:label="Layer 1"
54
+ inkscape:groupmode="layer"
55
+ transform="translate(0,-18)">
56
+ <g
57
+ transform="translate(-867,-822.725)"
58
+ clip-path="url(#clip77_0_1)"
59
+ id="g4">
60
+ <path
61
+ style="stroke:#4c12a1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"
62
+ inkscape:connector-curvature="0"
63
+ d="m 868,841.725 h 16"
64
+ id="path6" />
65
+ <path
66
+ style="stroke:#4c12a1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"
67
+ inkscape:connector-curvature="0"
68
+ d="m 868,847.725 h 16"
69
+ id="path8" />
70
+ <path
71
+ style="stroke:#4c12a1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"
72
+ inkscape:connector-curvature="0"
73
+ d="m 868,853.725 h 16"
74
+ id="path10" />
75
+ </g>
76
+ </g>
77
+ </svg>
@@ -1,19 +1,19 @@
1
- <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <rect width="40" height="40" rx="6" fill="#3A0B80"/>
3
- <g clip-path="url(#clip0_2782_269361)">
4
- <path d="M20 14C20 14.5304 20.2107 15.0391 20.5858 15.4142C20.9609 15.7893 21.4696 16 22 16C22.5304 16 23.0391 15.7893 23.4142 15.4142C23.7893 15.0391 24 14.5304 24 14C24 13.4696 23.7893 12.9609 23.4142 12.5858C23.0391 12.2107 22.5304 12 22 12C21.4696 12 20.9609 12.2107 20.5858 12.5858C20.2107 12.9609 20 13.4696 20 14Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
5
- <path d="M12 14H20" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
6
- <path d="M24 14H28" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
7
- <path d="M14 20C14 20.5304 14.2107 21.0391 14.5858 21.4142C14.9609 21.7893 15.4696 22 16 22C16.5304 22 17.0391 21.7893 17.4142 21.4142C17.7893 21.0391 18 20.5304 18 20C18 19.4696 17.7893 18.9609 17.4142 18.5858C17.0391 18.2107 16.5304 18 16 18C15.4696 18 14.9609 18.2107 14.5858 18.5858C14.2107 18.9609 14 19.4696 14 20Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
8
- <path d="M12 20H14" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
9
- <path d="M18 20H28" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
10
- <path d="M23 26C23 26.5304 23.2107 27.0391 23.5858 27.4142C23.9609 27.7893 24.4696 28 25 28C25.5304 28 26.0391 27.7893 26.4142 27.4142C26.7893 27.0391 27 26.5304 27 26C27 25.4696 26.7893 24.9609 26.4142 24.5858C26.0391 24.2107 25.5304 24 25 24C24.4696 24 23.9609 24.2107 23.5858 24.5858C23.2107 24.9609 23 25.4696 23 26Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
11
- <path d="M12 26H23" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
12
- <path d="M27 26H28" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
13
- </g>
14
- <defs>
15
- <clipPath id="clip0_2782_269361">
16
- <rect width="24" height="24" fill="white" transform="translate(8 8)"/>
17
- </clipPath>
18
- </defs>
19
- </svg>
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="40" height="40" rx="6" fill="#3A0B80"/>
3
+ <g clip-path="url(#clip0_2782_269361)">
4
+ <path d="M20 14C20 14.5304 20.2107 15.0391 20.5858 15.4142C20.9609 15.7893 21.4696 16 22 16C22.5304 16 23.0391 15.7893 23.4142 15.4142C23.7893 15.0391 24 14.5304 24 14C24 13.4696 23.7893 12.9609 23.4142 12.5858C23.0391 12.2107 22.5304 12 22 12C21.4696 12 20.9609 12.2107 20.5858 12.5858C20.2107 12.9609 20 13.4696 20 14Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
5
+ <path d="M12 14H20" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
6
+ <path d="M24 14H28" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
7
+ <path d="M14 20C14 20.5304 14.2107 21.0391 14.5858 21.4142C14.9609 21.7893 15.4696 22 16 22C16.5304 22 17.0391 21.7893 17.4142 21.4142C17.7893 21.0391 18 20.5304 18 20C18 19.4696 17.7893 18.9609 17.4142 18.5858C17.0391 18.2107 16.5304 18 16 18C15.4696 18 14.9609 18.2107 14.5858 18.5858C14.2107 18.9609 14 19.4696 14 20Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
8
+ <path d="M12 20H14" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
9
+ <path d="M18 20H28" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
10
+ <path d="M23 26C23 26.5304 23.2107 27.0391 23.5858 27.4142C23.9609 27.7893 24.4696 28 25 28C25.5304 28 26.0391 27.7893 26.4142 27.4142C26.7893 27.0391 27 26.5304 27 26C27 25.4696 26.7893 24.9609 26.4142 24.5858C26.0391 24.2107 25.5304 24 25 24C24.4696 24 23.9609 24.2107 23.5858 24.5858C23.2107 24.9609 23 25.4696 23 26Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
11
+ <path d="M12 26H23" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
12
+ <path d="M27 26H28" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
13
+ </g>
14
+ <defs>
15
+ <clipPath id="clip0_2782_269361">
16
+ <rect width="24" height="24" fill="white" transform="translate(8 8)"/>
17
+ </clipPath>
18
+ </defs>
19
+ </svg>