@operato/board 10.0.0-beta.43 → 10.0.0-beta.45

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 (33) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/src/component/conveyance.d.ts +2 -0
  3. package/dist/src/component/conveyance.js +38 -0
  4. package/dist/src/component/conveyance.js.map +1 -0
  5. package/dist/src/component/facility.d.ts +2 -0
  6. package/dist/src/component/facility.js +35 -0
  7. package/dist/src/component/facility.js.map +1 -0
  8. package/dist/src/component/index.d.ts +5 -0
  9. package/dist/src/component/index.js +5 -0
  10. package/dist/src/component/index.js.map +1 -1
  11. package/dist/src/component/manufacturing.d.ts +2 -0
  12. package/dist/src/component/manufacturing.js +41 -0
  13. package/dist/src/component/manufacturing.js.map +1 -0
  14. package/dist/src/component/register-default-groups.js +19 -2
  15. package/dist/src/component/register-default-groups.js.map +1 -1
  16. package/dist/src/component/storage.d.ts +2 -0
  17. package/dist/src/component/storage.js +27 -0
  18. package/dist/src/component/storage.js.map +1 -0
  19. package/dist/src/component/transport.d.ts +2 -0
  20. package/dist/src/component/transport.js +36 -0
  21. package/dist/src/component/transport.js.map +1 -0
  22. package/dist/src/component/warehouse.d.ts +1 -0
  23. package/dist/src/component/warehouse.js +8 -1
  24. package/dist/src/component/warehouse.js.map +1 -1
  25. package/dist/src/modeller/component-toolbar/component-menu.js +8 -1
  26. package/dist/src/modeller/component-toolbar/component-menu.js.map +1 -1
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +7 -7
  29. package/translations/en.json +19 -1
  30. package/translations/ja.json +19 -1
  31. package/translations/ko.json +19 -1
  32. package/translations/ms.json +19 -1
  33. package/translations/zh.json +19 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,24 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [10.0.0-beta.45](https://github.com/hatiolab/operato/compare/v10.0.0-beta.44...v10.0.0-beta.45) (2026-04-30)
7
+
8
+
9
+ ### :rocket: New Features
10
+
11
+ * **board,property-panel:** logistics group split + NaN-safe number inputs ([aa3aa37](https://github.com/hatiolab/operato/commit/aa3aa376802d2296ee9a8315b4490b8a2a34b223))
12
+ * **board,property-panel:** manufacturing group + dynamic nature refresh ([a82cab7](https://github.com/hatiolab/operato/commit/a82cab79dded6b5996c554dfbcaf6f578f303861))
13
+
14
+
15
+
16
+ ## [10.0.0-beta.44](https://github.com/hatiolab/operato/compare/v10.0.0-beta.43...v10.0.0-beta.44) (2026-04-28)
17
+
18
+ **Note:** Version bump only for package @operato/board
19
+
20
+
21
+
22
+
23
+
6
24
  ## [10.0.0-beta.43](https://github.com/hatiolab/operato/compare/v10.0.0-beta.42...v10.0.0-beta.43) (2026-04-24)
7
25
 
8
26
  **Note:** Version bump only for package @operato/board
@@ -0,0 +1,2 @@
1
+ import { ComponentGroup } from '../types.js';
2
+ export declare const conveyance: ComponentGroup;
@@ -0,0 +1,38 @@
1
+ // Conveyance group icon — belt section with end drums, a parcel riding
2
+ // on top, and a flow arrow above. Same stroke-weight family as the other
3
+ // logistics group icons (heavy 2.5 for the dominant feature, light 1.0
4
+ // for outline detail, fill for emphasized solids).
5
+ const icon = `
6
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
7
+ <style type="text/css">
8
+ .st0{fill:{{strokeColor}};}
9
+ .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
10
+ .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
11
+ </style>
12
+ <g>
13
+ <!-- flow arrow (direction of travel) -->
14
+ <line class="st15" x1="9" y1="5.5" x2="20.5" y2="5.5"/>
15
+ <polyline class="st15" points="18,3 21,5.5 18,8"/>
16
+ <!-- parcel sitting on the belt (fill-detail, the visual focal point) -->
17
+ <rect class="st0" x="11.5" y="11" width="7" height="5"/>
18
+ <!-- belt top surface (heavy stroke, anchors the silhouette) -->
19
+ <line class="st14" x1="6" y1="17" x2="24" y2="17"/>
20
+ <!-- end drums -->
21
+ <circle class="st15" cx="6" cy="20" r="3.2"/>
22
+ <circle class="st15" cx="24" cy="20" r="3.2"/>
23
+ <circle class="st0" cx="6" cy="20" r="0.9"/>
24
+ <circle class="st0" cx="24" cy="20" r="0.9"/>
25
+ <!-- frame legs / ground -->
26
+ <line class="st15" x1="6" y1="23.4" x2="6" y2="26.5"/>
27
+ <line class="st15" x1="24" y1="23.4" x2="24" y2="26.5"/>
28
+ <line class="st15" x1="2.5" y1="26.5" x2="27.5" y2="26.5"/>
29
+ </g>
30
+ </svg>
31
+ `;
32
+ export const conveyance = {
33
+ name: 'conveyance',
34
+ description: 'conveyors, sorters, chutes, and induct stations — components that move parcels along a path',
35
+ icon,
36
+ templates: []
37
+ };
38
+ //# sourceMappingURL=conveyance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conveyance.js","sourceRoot":"","sources":["../../../src/component/conveyance.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,yEAAyE;AACzE,uEAAuE;AACvE,mDAAmD;AACnD,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BZ,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,6FAA6F;IAC1G,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA","sourcesContent":["import { ComponentGroup } from '../types.js'\n\n// Conveyance group icon — belt section with end drums, a parcel riding\n// on top, and a flow arrow above. Same stroke-weight family as the other\n// logistics group icons (heavy 2.5 for the dominant feature, light 1.0\n// for outline detail, fill for emphasized solids).\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n </style>\n <g>\n <!-- flow arrow (direction of travel) -->\n <line class=\"st15\" x1=\"9\" y1=\"5.5\" x2=\"20.5\" y2=\"5.5\"/>\n <polyline class=\"st15\" points=\"18,3 21,5.5 18,8\"/>\n <!-- parcel sitting on the belt (fill-detail, the visual focal point) -->\n <rect class=\"st0\" x=\"11.5\" y=\"11\" width=\"7\" height=\"5\"/>\n <!-- belt top surface (heavy stroke, anchors the silhouette) -->\n <line class=\"st14\" x1=\"6\" y1=\"17\" x2=\"24\" y2=\"17\"/>\n <!-- end drums -->\n <circle class=\"st15\" cx=\"6\" cy=\"20\" r=\"3.2\"/>\n <circle class=\"st15\" cx=\"24\" cy=\"20\" r=\"3.2\"/>\n <circle class=\"st0\" cx=\"6\" cy=\"20\" r=\"0.9\"/>\n <circle class=\"st0\" cx=\"24\" cy=\"20\" r=\"0.9\"/>\n <!-- frame legs / ground -->\n <line class=\"st15\" x1=\"6\" y1=\"23.4\" x2=\"6\" y2=\"26.5\"/>\n <line class=\"st15\" x1=\"24\" y1=\"23.4\" x2=\"24\" y2=\"26.5\"/>\n <line class=\"st15\" x1=\"2.5\" y1=\"26.5\" x2=\"27.5\" y2=\"26.5\"/>\n </g>\n</svg>\n`\n\nexport const conveyance: ComponentGroup = {\n name: 'conveyance',\n description: 'conveyors, sorters, chutes, and induct stations — components that move parcels along a path',\n icon,\n templates: []\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { ComponentGroup } from '../types.js';
2
+ export declare const facility: ComponentGroup;
@@ -0,0 +1,35 @@
1
+ // Facility group icon — sawtooth-roof factory with a chimney.
2
+ // Stroke weights mirror the legacy `warehouse` icon (heavy 2.5 for the
3
+ // roofline, light 1.0 for everything else, filled rectangles for door/
4
+ // windows) so the new logistics groups read as a coherent visual family.
5
+ const icon = `
6
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
7
+ <style type="text/css">
8
+ .st0{fill:{{strokeColor}};}
9
+ .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
10
+ .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
11
+ </style>
12
+ <g>
13
+ <!-- chimney -->
14
+ <rect class="st0" x="22.2" y="2.5" width="2.6" height="9.5"/>
15
+ <!-- sawtooth roofline (heavy stroke, anchors the silhouette) -->
16
+ <polyline class="st14" points="2.5,12 7,7 7,12 12,7 12,12 17,7 17,12 22,7 22,12"/>
17
+ <!-- factory walls -->
18
+ <polyline class="st15" points="3.2,12 3.2,24.8 26.8,24.8 26.8,12"/>
19
+ <!-- ground line -->
20
+ <line class="st15" x1="1.7" y1="25.8" x2="28.3" y2="25.8"/>
21
+ <!-- entrance door (centered, fill-detail) -->
22
+ <rect class="st0" x="13" y="18" width="4" height="6.8"/>
23
+ <!-- two symmetric windows (outline-detail) -->
24
+ <rect class="st15" x="6" y="15.5" width="3.2" height="3.2"/>
25
+ <rect class="st15" x="20.8" y="15.5" width="3.2" height="3.2"/>
26
+ </g>
27
+ </svg>
28
+ `;
29
+ export const facility = {
30
+ name: 'facility',
31
+ description: 'floors, walls, mezzanines, and atmospheric backdrops — the built environment that holds everything else',
32
+ icon,
33
+ templates: []
34
+ };
35
+ //# sourceMappingURL=facility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facility.js","sourceRoot":"","sources":["../../../src/component/facility.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,uEAAuE;AACvE,uEAAuE;AACvE,yEAAyE;AACzE,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBZ,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,yGAAyG;IACtH,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA","sourcesContent":["import { ComponentGroup } from '../types.js'\n\n// Facility group icon — sawtooth-roof factory with a chimney.\n// Stroke weights mirror the legacy `warehouse` icon (heavy 2.5 for the\n// roofline, light 1.0 for everything else, filled rectangles for door/\n// windows) so the new logistics groups read as a coherent visual family.\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n </style>\n <g>\n <!-- chimney -->\n <rect class=\"st0\" x=\"22.2\" y=\"2.5\" width=\"2.6\" height=\"9.5\"/>\n <!-- sawtooth roofline (heavy stroke, anchors the silhouette) -->\n <polyline class=\"st14\" points=\"2.5,12 7,7 7,12 12,7 12,12 17,7 17,12 22,7 22,12\"/>\n <!-- factory walls -->\n <polyline class=\"st15\" points=\"3.2,12 3.2,24.8 26.8,24.8 26.8,12\"/>\n <!-- ground line -->\n <line class=\"st15\" x1=\"1.7\" y1=\"25.8\" x2=\"28.3\" y2=\"25.8\"/>\n <!-- entrance door (centered, fill-detail) -->\n <rect class=\"st0\" x=\"13\" y=\"18\" width=\"4\" height=\"6.8\"/>\n <!-- two symmetric windows (outline-detail) -->\n <rect class=\"st15\" x=\"6\" y=\"15.5\" width=\"3.2\" height=\"3.2\"/>\n <rect class=\"st15\" x=\"20.8\" y=\"15.5\" width=\"3.2\" height=\"3.2\"/>\n </g>\n</svg>\n`\n\nexport const facility: ComponentGroup = {\n name: 'facility',\n description: 'floors, walls, mezzanines, and atmospheric backdrops — the built environment that holds everything else',\n icon,\n templates: []\n}\n"]}
@@ -8,6 +8,11 @@ export * from './3d.js';
8
8
  export * from './iot.js';
9
9
  export * from './form.js';
10
10
  export * from './warehouse.js';
11
+ export * from './facility.js';
12
+ export * from './conveyance.js';
13
+ export * from './storage.js';
14
+ export * from './transport.js';
15
+ export * from './manufacturing.js';
11
16
  export * from './container.js';
12
17
  export * from './material-design.js';
13
18
  export * from './etc.js';
@@ -8,6 +8,11 @@ export * from './3d.js';
8
8
  export * from './iot.js';
9
9
  export * from './form.js';
10
10
  export * from './warehouse.js';
11
+ export * from './facility.js';
12
+ export * from './conveyance.js';
13
+ export * from './storage.js';
14
+ export * from './transport.js';
15
+ export * from './manufacturing.js';
11
16
  export * from './container.js';
12
17
  export * from './material-design.js';
13
18
  export * from './etc.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/component/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,UAAU,CAAA","sourcesContent":["export * from './shape.js'\nexport * from './line.js'\nexport * from './text-and-media.js'\nexport * from './chart-and-gauge.js'\nexport * from './table.js'\nexport * from './data-source.js'\nexport * from './3d.js'\nexport * from './iot.js'\nexport * from './form.js'\nexport * from './warehouse.js'\nexport * from './container.js'\nexport * from './material-design.js'\nexport * from './etc.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/component/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,UAAU,CAAA","sourcesContent":["export * from './shape.js'\nexport * from './line.js'\nexport * from './text-and-media.js'\nexport * from './chart-and-gauge.js'\nexport * from './table.js'\nexport * from './data-source.js'\nexport * from './3d.js'\nexport * from './iot.js'\nexport * from './form.js'\nexport * from './warehouse.js'\nexport * from './facility.js'\nexport * from './conveyance.js'\nexport * from './storage.js'\nexport * from './transport.js'\nexport * from './manufacturing.js'\nexport * from './container.js'\nexport * from './material-design.js'\nexport * from './etc.js'\n"]}
@@ -0,0 +1,2 @@
1
+ import { ComponentGroup } from '../types.js';
2
+ export declare const manufacturing: ComponentGroup;
@@ -0,0 +1,41 @@
1
+ // Manufacturing group icon — articulated robot arm silhouette: base +
2
+ // upper-arm link + elbow joint + forearm link + gripper. The gripper
3
+ // makes the silhouette unmistakable as "automated work cell" rather
4
+ // than a generic mechanical drawing. Stroke-weight family matches the
5
+ // other logistics group icons (heavy 2.5 for the dominant feature,
6
+ // light 1.0 for outline detail, fill for emphasized solids).
7
+ const icon = `
8
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
9
+ <style type="text/css">
10
+ .st0{fill:{{strokeColor}};}
11
+ .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
12
+ .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
13
+ </style>
14
+ <g>
15
+ <!-- base / pedestal (fill, the visual ground anchor) -->
16
+ <rect class="st0" x="9" y="24.5" width="10" height="3"/>
17
+ <!-- ground line -->
18
+ <line class="st15" x1="2" y1="27.5" x2="28" y2="27.5"/>
19
+ <!-- first link (upper arm), heavy stroke = main structure -->
20
+ <line class="st14" x1="14" y1="24.5" x2="14" y2="13"/>
21
+ <!-- shoulder joint disk -->
22
+ <circle class="st0" cx="14" cy="13" r="1.8"/>
23
+ <!-- second link (forearm), heavy stroke -->
24
+ <line class="st14" x1="14" y1="13" x2="22" y2="6"/>
25
+ <!-- elbow joint disk -->
26
+ <circle class="st0" cx="22" cy="6" r="1.5"/>
27
+ <!-- gripper: two opposing fingers -->
28
+ <line class="st15" x1="22" y1="6" x2="26" y2="3"/>
29
+ <line class="st15" x1="22" y1="6" x2="26" y2="6.5"/>
30
+ <line class="st15" x1="25.5" y1="2.5" x2="26.5" y2="3.5"/>
31
+ <line class="st15" x1="25.5" y1="6" x2="26.5" y2="7"/>
32
+ </g>
33
+ </svg>
34
+ `;
35
+ export const manufacturing = {
36
+ name: 'manufacturing',
37
+ description: 'robot arms, work cells, and automation equipment — fixed-base machines that perform work on parcels and parts',
38
+ icon,
39
+ templates: []
40
+ };
41
+ //# sourceMappingURL=manufacturing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manufacturing.js","sourceRoot":"","sources":["../../../src/component/manufacturing.ts"],"names":[],"mappings":"AAEA,sEAAsE;AACtE,qEAAqE;AACrE,oEAAoE;AACpE,sEAAsE;AACtE,mEAAmE;AACnE,6DAA6D;AAC7D,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BZ,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,+GAA+G;IAC5H,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA","sourcesContent":["import { ComponentGroup } from '../types.js'\n\n// Manufacturing group icon — articulated robot arm silhouette: base +\n// upper-arm link + elbow joint + forearm link + gripper. The gripper\n// makes the silhouette unmistakable as \"automated work cell\" rather\n// than a generic mechanical drawing. Stroke-weight family matches the\n// other logistics group icons (heavy 2.5 for the dominant feature,\n// light 1.0 for outline detail, fill for emphasized solids).\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n </style>\n <g>\n <!-- base / pedestal (fill, the visual ground anchor) -->\n <rect class=\"st0\" x=\"9\" y=\"24.5\" width=\"10\" height=\"3\"/>\n <!-- ground line -->\n <line class=\"st15\" x1=\"2\" y1=\"27.5\" x2=\"28\" y2=\"27.5\"/>\n <!-- first link (upper arm), heavy stroke = main structure -->\n <line class=\"st14\" x1=\"14\" y1=\"24.5\" x2=\"14\" y2=\"13\"/>\n <!-- shoulder joint disk -->\n <circle class=\"st0\" cx=\"14\" cy=\"13\" r=\"1.8\"/>\n <!-- second link (forearm), heavy stroke -->\n <line class=\"st14\" x1=\"14\" y1=\"13\" x2=\"22\" y2=\"6\"/>\n <!-- elbow joint disk -->\n <circle class=\"st0\" cx=\"22\" cy=\"6\" r=\"1.5\"/>\n <!-- gripper: two opposing fingers -->\n <line class=\"st15\" x1=\"22\" y1=\"6\" x2=\"26\" y2=\"3\"/>\n <line class=\"st15\" x1=\"22\" y1=\"6\" x2=\"26\" y2=\"6.5\"/>\n <line class=\"st15\" x1=\"25.5\" y1=\"2.5\" x2=\"26.5\" y2=\"3.5\"/>\n <line class=\"st15\" x1=\"25.5\" y1=\"6\" x2=\"26.5\" y2=\"7\"/>\n </g>\n</svg>\n`\n\nexport const manufacturing: ComponentGroup = {\n name: 'manufacturing',\n description: 'robot arms, work cells, and automation equipment — fixed-base machines that perform work on parcels and parts',\n icon,\n templates: []\n}\n"]}
@@ -1,16 +1,20 @@
1
1
  import { BoardModeller } from '../ox-board-modeller.js';
2
2
  import { chartAndGauge } from './chart-and-gauge.js';
3
3
  import { container } from './container.js';
4
+ import { conveyance } from './conveyance.js';
4
5
  import { dataSource } from './data-source.js';
5
6
  import { etc } from './etc.js';
7
+ import { facility } from './facility.js';
6
8
  import { form } from './form.js';
7
9
  import { iot } from './iot.js';
8
10
  import { line } from './line.js';
11
+ import { manufacturing } from './manufacturing.js';
9
12
  import { shape } from './shape.js';
13
+ import { storage } from './storage.js';
10
14
  import { table } from './table.js';
11
15
  import { textAndMedia } from './text-and-media.js';
12
16
  import { threed } from './3d.js';
13
- import { warehouse } from './warehouse.js';
17
+ import { transport } from './transport.js';
14
18
  import { materialDesign } from './material-design.js';
15
19
  export function registerDefaultGroups() {
16
20
  BoardModeller.registerGroup(line);
@@ -22,7 +26,20 @@ export function registerDefaultGroups() {
22
26
  BoardModeller.registerGroup(dataSource);
23
27
  BoardModeller.registerGroup(iot);
24
28
  BoardModeller.registerGroup(threed);
25
- BoardModeller.registerGroup(warehouse);
29
+ // Logistics-domain groups, ordered by typical modeling workflow:
30
+ // facility (build the envelope) → conveyance (lay the lines) →
31
+ // storage (place racks/units) → transport (introduce mobile carriers) →
32
+ // manufacturing (work cells / robot arms that act on parts).
33
+ BoardModeller.registerGroup(facility);
34
+ BoardModeller.registerGroup(conveyance);
35
+ BoardModeller.registerGroup(storage);
36
+ BoardModeller.registerGroup(transport);
37
+ BoardModeller.registerGroup(manufacturing);
38
+ // `warehouse` is no longer registered — `storage` replaces it (same icon,
39
+ // clearer name). The export is kept in `warehouse.ts` so existing
40
+ // external imports don't break, but the registry no longer carries a
41
+ // 'warehouse' group, so any template still pinned to `group: 'warehouse'`
42
+ // will not appear until its package migrates to `group: 'storage'`.
26
43
  BoardModeller.registerGroup(form);
27
44
  BoardModeller.registerGroup(materialDesign);
28
45
  BoardModeller.registerGroup(etc);
@@ -1 +1 @@
1
- {"version":3,"file":"register-default-groups.js","sourceRoot":"","sources":["../../../src/component/register-default-groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,UAAU,qBAAqB;IACnC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACjC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAClC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;IACzC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;IAC1C,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAClC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;IACtC,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;IACvC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAChC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IACnC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;IACtC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACjC,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;IAC3C,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC","sourcesContent":["import { BoardModeller } from '../ox-board-modeller.js'\nimport { chartAndGauge } from './chart-and-gauge.js'\nimport { container } from './container.js'\nimport { dataSource } from './data-source.js'\nimport { etc } from './etc.js'\nimport { form } from './form.js'\nimport { iot } from './iot.js'\nimport { line } from './line.js'\nimport { shape } from './shape.js'\nimport { table } from './table.js'\nimport { textAndMedia } from './text-and-media.js'\nimport { threed } from './3d.js'\nimport { warehouse } from './warehouse.js'\nimport { materialDesign } from './material-design.js'\n\nexport function registerDefaultGroups() {\n BoardModeller.registerGroup(line)\n BoardModeller.registerGroup(shape)\n BoardModeller.registerGroup(textAndMedia)\n BoardModeller.registerGroup(chartAndGauge)\n BoardModeller.registerGroup(table)\n BoardModeller.registerGroup(container)\n BoardModeller.registerGroup(dataSource)\n BoardModeller.registerGroup(iot)\n BoardModeller.registerGroup(threed)\n BoardModeller.registerGroup(warehouse)\n BoardModeller.registerGroup(form)\n BoardModeller.registerGroup(materialDesign)\n BoardModeller.registerGroup(etc)\n}\n"]}
1
+ {"version":3,"file":"register-default-groups.js","sourceRoot":"","sources":["../../../src/component/register-default-groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,UAAU,qBAAqB;IACnC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACjC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAClC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;IACzC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;IAC1C,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAClC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;IACtC,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;IACvC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAChC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IACnC,iEAAiE;IACjE,+DAA+D;IAC/D,wEAAwE;IACxE,6DAA6D;IAC7D,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IACrC,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;IACvC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACpC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;IACtC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;IAC1C,0EAA0E;IAC1E,kEAAkE;IAClE,qEAAqE;IACrE,0EAA0E;IAC1E,oEAAoE;IACpE,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACjC,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;IAC3C,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC","sourcesContent":["import { BoardModeller } from '../ox-board-modeller.js'\nimport { chartAndGauge } from './chart-and-gauge.js'\nimport { container } from './container.js'\nimport { conveyance } from './conveyance.js'\nimport { dataSource } from './data-source.js'\nimport { etc } from './etc.js'\nimport { facility } from './facility.js'\nimport { form } from './form.js'\nimport { iot } from './iot.js'\nimport { line } from './line.js'\nimport { manufacturing } from './manufacturing.js'\nimport { shape } from './shape.js'\nimport { storage } from './storage.js'\nimport { table } from './table.js'\nimport { textAndMedia } from './text-and-media.js'\nimport { threed } from './3d.js'\nimport { transport } from './transport.js'\nimport { materialDesign } from './material-design.js'\n\nexport function registerDefaultGroups() {\n BoardModeller.registerGroup(line)\n BoardModeller.registerGroup(shape)\n BoardModeller.registerGroup(textAndMedia)\n BoardModeller.registerGroup(chartAndGauge)\n BoardModeller.registerGroup(table)\n BoardModeller.registerGroup(container)\n BoardModeller.registerGroup(dataSource)\n BoardModeller.registerGroup(iot)\n BoardModeller.registerGroup(threed)\n // Logistics-domain groups, ordered by typical modeling workflow:\n // facility (build the envelope) → conveyance (lay the lines) →\n // storage (place racks/units) → transport (introduce mobile carriers) →\n // manufacturing (work cells / robot arms that act on parts).\n BoardModeller.registerGroup(facility)\n BoardModeller.registerGroup(conveyance)\n BoardModeller.registerGroup(storage)\n BoardModeller.registerGroup(transport)\n BoardModeller.registerGroup(manufacturing)\n // `warehouse` is no longer registered — `storage` replaces it (same icon,\n // clearer name). The export is kept in `warehouse.ts` so existing\n // external imports don't break, but the registry no longer carries a\n // 'warehouse' group, so any template still pinned to `group: 'warehouse'`\n // will not appear until its package migrates to `group: 'storage'`.\n BoardModeller.registerGroup(form)\n BoardModeller.registerGroup(materialDesign)\n BoardModeller.registerGroup(etc)\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { ComponentGroup } from '../types.js';
2
+ export declare const storage: ComponentGroup;
@@ -0,0 +1,27 @@
1
+ // Storage group — successor to the legacy `warehouse` group. Reuses the
2
+ // warehouse silhouette icon so existing users who recognize it find the
3
+ // new group at a glance.
4
+ const icon = `
5
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
6
+ <style type="text/css">
7
+ .st0{fill:{{strokeColor}};}
8
+ .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:10;}
9
+ .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-miterlimit:10;}
10
+ </style>
11
+ <g>
12
+ <polyline class="st14" points="1.5,11.2 15,5.2 28.5,11 "/>
13
+ <line class="st15" x1="3.2" y1="11.6" x2="3.2" y2="23.8"/>
14
+ <line class="st15" x1="26.9" y1="11.6" x2="26.9" y2="23.8"/>
15
+ <line class="st5" x1="1.7" y1="24.8" x2="28.3" y2="24.8"/>
16
+ <rect x="21.1" y="18.3" class="st0" width="3.4" height="5.5"/>
17
+ <path class="st0" d="M5.9,13.6v10.2h13.8V13.6H5.9z M18.7,17.3H6.8v-2.4h11.9V17.3z"/>
18
+ </g>
19
+ </svg>
20
+ `;
21
+ export const storage = {
22
+ name: 'storage',
23
+ description: 'pallets, parcels, and racks — units of stored goods and the racks that hold them',
24
+ icon,
25
+ templates: []
26
+ };
27
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/component/storage.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,wEAAwE;AACxE,yBAAyB;AACzB,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;CAgBZ,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAmB;IACrC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,kFAAkF;IAC/F,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA","sourcesContent":["import { ComponentGroup } from '../types.js'\n\n// Storage group — successor to the legacy `warehouse` group. Reuses the\n// warehouse silhouette icon so existing users who recognize it find the\n// new group at a glance.\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:10;}\n .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-miterlimit:10;}\n </style>\n <g>\n <polyline class=\"st14\" points=\"1.5,11.2 15,5.2 28.5,11 \t\"/>\n <line class=\"st15\" x1=\"3.2\" y1=\"11.6\" x2=\"3.2\" y2=\"23.8\"/>\n <line class=\"st15\" x1=\"26.9\" y1=\"11.6\" x2=\"26.9\" y2=\"23.8\"/>\n <line class=\"st5\" x1=\"1.7\" y1=\"24.8\" x2=\"28.3\" y2=\"24.8\"/>\n <rect x=\"21.1\" y=\"18.3\" class=\"st0\" width=\"3.4\" height=\"5.5\"/>\n <path class=\"st0\" d=\"M5.9,13.6v10.2h13.8V13.6H5.9z M18.7,17.3H6.8v-2.4h11.9V17.3z\"/>\n </g>\n</svg>\n`\n\nexport const storage: ComponentGroup = {\n name: 'storage',\n description: 'pallets, parcels, and racks — units of stored goods and the racks that hold them',\n icon,\n templates: []\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { ComponentGroup } from '../types.js';
2
+ export declare const transport: ComponentGroup;
@@ -0,0 +1,36 @@
1
+ // Transport group icon — forklift silhouette: cab + chassis (single
2
+ // outline path), heavy mast, twin forks pointing right, two filled
3
+ // wheels. Stroke-weight family matches the other logistics icons (mast
4
+ // gets the 2.5 emphasis as the unmistakable forklift feature).
5
+ const icon = `
6
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
7
+ <style type="text/css">
8
+ .st0{fill:{{strokeColor}};}
9
+ .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
10
+ .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
11
+ </style>
12
+ <g>
13
+ <!-- vertical mast (the unmistakable forklift feature) -->
14
+ <line class="st14" x1="20" y1="3" x2="20" y2="22"/>
15
+ <!-- carriage bar -->
16
+ <line class="st15" x1="17" y1="13" x2="22" y2="13"/>
17
+ <!-- twin forks pointing forward -->
18
+ <line class="st15" x1="20" y1="17.5" x2="27" y2="17.5"/>
19
+ <line class="st15" x1="20" y1="21" x2="27" y2="21"/>
20
+ <!-- cab + chassis silhouette (single outline) -->
21
+ <path class="st15" d="M3.5 22 L3.5 14 L7 14 L7 7.5 L15 7.5 L15 14 L17 14 L17 22 Z"/>
22
+ <!-- ground line -->
23
+ <line class="st15" x1="2" y1="26.5" x2="28" y2="26.5"/>
24
+ <!-- wheels (fill, the visual ground anchor) -->
25
+ <circle class="st0" cx="7.5" cy="24" r="2.4"/>
26
+ <circle class="st0" cx="14.5" cy="24" r="2.4"/>
27
+ </g>
28
+ </svg>
29
+ `;
30
+ export const transport = {
31
+ name: 'transport',
32
+ description: 'forklifts, AGVs, tuggers, workers — mobile transporters that carry loads through the facility',
33
+ icon,
34
+ templates: []
35
+ };
36
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/component/transport.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,mEAAmE;AACnE,uEAAuE;AACvE,+DAA+D;AAC/D,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBZ,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,+FAA+F;IAC5G,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA","sourcesContent":["import { ComponentGroup } from '../types.js'\n\n// Transport group icon — forklift silhouette: cab + chassis (single\n// outline path), heavy mast, twin forks pointing right, two filled\n// wheels. Stroke-weight family matches the other logistics icons (mast\n// gets the 2.5 emphasis as the unmistakable forklift feature).\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n </style>\n <g>\n <!-- vertical mast (the unmistakable forklift feature) -->\n <line class=\"st14\" x1=\"20\" y1=\"3\" x2=\"20\" y2=\"22\"/>\n <!-- carriage bar -->\n <line class=\"st15\" x1=\"17\" y1=\"13\" x2=\"22\" y2=\"13\"/>\n <!-- twin forks pointing forward -->\n <line class=\"st15\" x1=\"20\" y1=\"17.5\" x2=\"27\" y2=\"17.5\"/>\n <line class=\"st15\" x1=\"20\" y1=\"21\" x2=\"27\" y2=\"21\"/>\n <!-- cab + chassis silhouette (single outline) -->\n <path class=\"st15\" d=\"M3.5 22 L3.5 14 L7 14 L7 7.5 L15 7.5 L15 14 L17 14 L17 22 Z\"/>\n <!-- ground line -->\n <line class=\"st15\" x1=\"2\" y1=\"26.5\" x2=\"28\" y2=\"26.5\"/>\n <!-- wheels (fill, the visual ground anchor) -->\n <circle class=\"st0\" cx=\"7.5\" cy=\"24\" r=\"2.4\"/>\n <circle class=\"st0\" cx=\"14.5\" cy=\"24\" r=\"2.4\"/>\n </g>\n</svg>\n`\n\nexport const transport: ComponentGroup = {\n name: 'transport',\n description: 'forklifts, AGVs, tuggers, workers — mobile transporters that carry loads through the facility',\n icon,\n templates: []\n}\n"]}
@@ -1,2 +1,3 @@
1
1
  import { ComponentGroup } from '../types.js';
2
+ /** @deprecated Use `storage` instead — same icon, same role, clearer name. */
2
3
  export declare const warehouse: ComponentGroup;
@@ -1,3 +1,9 @@
1
+ // Legacy warehouse silhouette — same SVG as the new `storage` group. Kept
2
+ // here only so external code that still imports `warehouse` from this
3
+ // package keeps working until they migrate to `storage`.
4
+ //
5
+ // `warehouse` is no longer registered by `registerDefaultGroups` — see
6
+ // `storage.ts` for the active replacement.
1
7
  const icon = `
2
8
  <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
3
9
  <style type="text/css">
@@ -15,9 +21,10 @@ const icon = `
15
21
  </g>
16
22
  </svg>
17
23
  `;
24
+ /** @deprecated Use `storage` instead — same icon, same role, clearer name. */
18
25
  export const warehouse = {
19
26
  name: 'warehouse',
20
- description: 'a group of various components used in a warehouse depiction',
27
+ description: '(deprecated) replaced by `storage` kept as a no-op placeholder for external imports',
21
28
  icon,
22
29
  templates: []
23
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"warehouse.js","sourceRoot":"","sources":["../../../src/component/warehouse.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;CAgBZ,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,6DAA6D;IAC1E,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA","sourcesContent":["import { ComponentGroup } from '../types.js'\n\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:10;}\n .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-miterlimit:10;}\n </style>\n <g>\n <polyline class=\"st14\" points=\"1.5,11.2 15,5.2 28.5,11 \t\"/>\n <line class=\"st15\" x1=\"3.2\" y1=\"11.6\" x2=\"3.2\" y2=\"23.8\"/>\n <line class=\"st15\" x1=\"26.9\" y1=\"11.6\" x2=\"26.9\" y2=\"23.8\"/>\n <line class=\"st5\" x1=\"1.7\" y1=\"24.8\" x2=\"28.3\" y2=\"24.8\"/>\n <rect x=\"21.1\" y=\"18.3\" class=\"st0\" width=\"3.4\" height=\"5.5\"/>\n <path class=\"st0\" d=\"M5.9,13.6v10.2h13.8V13.6H5.9z M18.7,17.3H6.8v-2.4h11.9V17.3z\"/>\n </g>\n</svg>\n`\n\nexport const warehouse: ComponentGroup = {\n name: 'warehouse',\n description: 'a group of various components used in a warehouse depiction',\n icon,\n templates: []\n}\n"]}
1
+ {"version":3,"file":"warehouse.js","sourceRoot":"","sources":["../../../src/component/warehouse.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,sEAAsE;AACtE,yDAAyD;AACzD,EAAE;AACF,uEAAuE;AACvE,2CAA2C;AAC3C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;CAgBZ,CAAA;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,uFAAuF;IACpG,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA","sourcesContent":["import { ComponentGroup } from '../types.js'\n\n// Legacy warehouse silhouette — same SVG as the new `storage` group. Kept\n// here only so external code that still imports `warehouse` from this\n// package keeps working until they migrate to `storage`.\n//\n// `warehouse` is no longer registered by `registerDefaultGroups` — see\n// `storage.ts` for the active replacement.\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:10;}\n .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-miterlimit:10;}\n </style>\n <g>\n <polyline class=\"st14\" points=\"1.5,11.2 15,5.2 28.5,11 \t\"/>\n <line class=\"st15\" x1=\"3.2\" y1=\"11.6\" x2=\"3.2\" y2=\"23.8\"/>\n <line class=\"st15\" x1=\"26.9\" y1=\"11.6\" x2=\"26.9\" y2=\"23.8\"/>\n <line class=\"st5\" x1=\"1.7\" y1=\"24.8\" x2=\"28.3\" y2=\"24.8\"/>\n <rect x=\"21.1\" y=\"18.3\" class=\"st0\" width=\"3.4\" height=\"5.5\"/>\n <path class=\"st0\" d=\"M5.9,13.6v10.2h13.8V13.6H5.9z M18.7,17.3H6.8v-2.4h11.9V17.3z\"/>\n </g>\n</svg>\n`\n\n/** @deprecated Use `storage` instead — same icon, same role, clearer name. */\nexport const warehouse: ComponentGroup = {\n name: 'warehouse',\n description: '(deprecated) replaced by `storage` kept as a no-op placeholder for external imports',\n icon,\n templates: []\n}\n"]}
@@ -25,7 +25,14 @@ export class ComponentMenu extends ScopedElementsMixin(LitElement) {
25
25
  render() {
26
26
  return this.group
27
27
  ? html `
28
- <h2 onclick=${(e) => e.stopPropagation()}>${this.group} list</h2>
28
+ <h2 onclick=${(e) => e.stopPropagation()}>
29
+ ${ /* group label — translate via group.<name> key, fall back to the
30
+ raw group name so untranslated groups keep working.
31
+ "list" is also translatable; defaults to the literal "list"
32
+ which is what users have been seeing all along. */''}
33
+ ${i18next.t(`group.${this.group}`, { defaultValue: this.group })}
34
+ ${i18next.t('label.list', { defaultValue: 'list' })}
35
+ </h2>
29
36
 
30
37
  <div templates @mouseover=${(e) => this.onHoverComponent(e)}>
31
38
  ${(this.templates || []).map(template => {
@@ -1 +1 @@
1
- {"version":3,"file":"component-menu.js","sourceRoot":"","sources":["../../../../src/modeller/component-toolbar/component-menu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\n\nimport { Scene } from '@hatiolab/things-scene'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { i18next } from '@operato/i18n'\n\nimport { Pallet, PalletItem } from '../../types.js'\nimport { ComponentDetail } from './component-detail.js'\n\nconst noImage = new URL('../../../../icons/components/no-image.png', import.meta.url).href\n\nexport class ComponentMenu extends ScopedElementsMixin(LitElement) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n align-content: stretch;\n\n background-color: var(--component-menu-background-color, var(--md-sys-color-secondary-container));\n color: var(--component-menu-color, var(--md-sys-color-on-secondary-container));\n margin: 0px;\n padding: 0px;\n\n width: 180px;\n height: 100%;\n\n overflow: visible;\n\n border: 2px solid var(--component-menu-border-color, var(--md-sys-color-secondary));\n box-sizing: border-box;\n\n position: absolute;\n top: 0px;\n\n z-index: 1;\n }\n\n h2 {\n background-color: var(--component-menu-border-color, var(--md-sys-color-secondary));\n padding: 1px 5px;\n margin: 0;\n font: var(--component-menu-title);\n color: var(--md-sys-color-on-secondary);\n text-transform: capitalize;\n }\n\n [templates] {\n flex: 1;\n\n display: block;\n margin: 0;\n padding: 0;\n overflow-y: auto;\n\n background-color: var(--component-menu-background-color, var(--md-sys-color-secondary-container));\n color: var(--component-menu-color, var(--md-sys-color-on-secondary-container));\n }\n\n [template] {\n display: flex;\n align-items: center;\n min-height: var(--component-menu-item-icon-size);\n padding: 0 5px 0 0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n font-size: 11px;\n color: var(--component-menu-item-color, var(--md-sys-color-on-secondary-container));\n text-transform: capitalize;\n }\n\n [template]:hover,\n [template]:focus {\n color: var(--component-menu-item-hover-color, var(--md-sys-color-secondary));\n font-weight: bold;\n cursor: pointer;\n }\n\n [template] img {\n margin: 5px;\n width: var(--component-menu-item-icon-size);\n height: var(--component-menu-item-icon-size);\n }\n\n component-detail {\n position: absolute;\n top: 0;\n left: 180px;\n height: 100%;\n outline: none;\n }\n\n component-detail[hidden] {\n display: none;\n }\n `\n ]\n\n @property({ type: Object }) groups: Pallet[] = []\n @property({ type: Object }) scene: Scene | null = null\n @property({ type: String }) group: string | null = ''\n\n @state() templates: PalletItem[] = []\n @state() template: PalletItem | any\n\n @query('component-detail') detail!: HTMLElement\n\n static get scopedElements() {\n return {\n 'component-detail': ComponentDetail\n }\n }\n\n render() {\n return this.group\n ? html`\n <h2 onclick=${(e: MouseEvent) => e.stopPropagation()}>${this.group} list</h2>\n\n <div templates @mouseover=${(e: MouseEvent) => this.onHoverComponent(e)}>\n ${(this.templates || []).map(template => {\n const { type } = template\n\n return html`\n <div @click=${this.onClickTemplate} data-type=${type} template>\n <img src=${String(this.templateIcon(template))} />${i18next.t(`component.${type}`)}\n </div>\n `\n })}\n </div>\n\n <component-detail\n tabindex=\"-1\"\n @focusout=${() => {\n this.template = null\n }}\n .template=${this.template}\n hidden\n >\n </component-detail>\n `\n : html``\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('group')) {\n if (!this.group) {\n this.templates = []\n this.setAttribute('hidden', '')\n } else {\n this.templates = this.groups.find((g: Pallet) => g.name === this.group)?.templates || []\n this.removeAttribute('active')\n }\n }\n\n if (changes.has('template')) {\n this.template && this.template.about\n ? this.detail.removeAttribute('hidden')\n : this.detail.setAttribute('hidden', '')\n }\n }\n\n findTemplate(type: string | null | undefined) {\n this.template = type && this.templates.find(template => template.type == type)\n }\n\n onHoverComponent(e: MouseEvent) {\n const button = e.target as HTMLElement\n this.findTemplate(button!.closest('[data-type]')?.getAttribute('data-type'))\n }\n\n onClickTemplate(e: MouseEvent) {\n var item = e.target as HTMLElement\n var type = item.closest('[data-type]')?.getAttribute('data-type')\n\n if (!type) {\n return\n }\n\n if (this.scene) {\n this.scene.rootContainer?.trigger('addstop') // 새로운 컴포넌트 클릭시 이전 추가 모드 정지\n this.template = this.templates.find(template => template.type == type)\n this.template && this.scene.startAddMode(JSON.parse(JSON.stringify(this.template.model)))\n }\n\n this.group = null\n }\n\n templateIcon(template: PalletItem) {\n return template.icon || noImage\n }\n}\n"]}
1
+ {"version":3,"file":"component-menu.js","sourceRoot":"","sources":["../../../../src/modeller/component-toolbar/component-menu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\n\nimport { Scene } from '@hatiolab/things-scene'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { i18next } from '@operato/i18n'\n\nimport { Pallet, PalletItem } from '../../types.js'\nimport { ComponentDetail } from './component-detail.js'\n\nconst noImage = new URL('../../../../icons/components/no-image.png', import.meta.url).href\n\nexport class ComponentMenu extends ScopedElementsMixin(LitElement) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n align-content: stretch;\n\n background-color: var(--component-menu-background-color, var(--md-sys-color-secondary-container));\n color: var(--component-menu-color, var(--md-sys-color-on-secondary-container));\n margin: 0px;\n padding: 0px;\n\n width: 180px;\n height: 100%;\n\n overflow: visible;\n\n border: 2px solid var(--component-menu-border-color, var(--md-sys-color-secondary));\n box-sizing: border-box;\n\n position: absolute;\n top: 0px;\n\n z-index: 1;\n }\n\n h2 {\n background-color: var(--component-menu-border-color, var(--md-sys-color-secondary));\n padding: 1px 5px;\n margin: 0;\n font: var(--component-menu-title);\n color: var(--md-sys-color-on-secondary);\n text-transform: capitalize;\n }\n\n [templates] {\n flex: 1;\n\n display: block;\n margin: 0;\n padding: 0;\n overflow-y: auto;\n\n background-color: var(--component-menu-background-color, var(--md-sys-color-secondary-container));\n color: var(--component-menu-color, var(--md-sys-color-on-secondary-container));\n }\n\n [template] {\n display: flex;\n align-items: center;\n min-height: var(--component-menu-item-icon-size);\n padding: 0 5px 0 0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n font-size: 11px;\n color: var(--component-menu-item-color, var(--md-sys-color-on-secondary-container));\n text-transform: capitalize;\n }\n\n [template]:hover,\n [template]:focus {\n color: var(--component-menu-item-hover-color, var(--md-sys-color-secondary));\n font-weight: bold;\n cursor: pointer;\n }\n\n [template] img {\n margin: 5px;\n width: var(--component-menu-item-icon-size);\n height: var(--component-menu-item-icon-size);\n }\n\n component-detail {\n position: absolute;\n top: 0;\n left: 180px;\n height: 100%;\n outline: none;\n }\n\n component-detail[hidden] {\n display: none;\n }\n `\n ]\n\n @property({ type: Object }) groups: Pallet[] = []\n @property({ type: Object }) scene: Scene | null = null\n @property({ type: String }) group: string | null = ''\n\n @state() templates: PalletItem[] = []\n @state() template: PalletItem | any\n\n @query('component-detail') detail!: HTMLElement\n\n static get scopedElements() {\n return {\n 'component-detail': ComponentDetail\n }\n }\n\n render() {\n return this.group\n ? html`\n <h2 onclick=${(e: MouseEvent) => e.stopPropagation()}>\n ${/* group label — translate via group.<name> key, fall back to the\n raw group name so untranslated groups keep working.\n \"list\" is also translatable; defaults to the literal \"list\"\n which is what users have been seeing all along. */ ''}\n ${i18next.t(`group.${this.group}`, { defaultValue: this.group })}\n ${i18next.t('label.list', { defaultValue: 'list' })}\n </h2>\n\n <div templates @mouseover=${(e: MouseEvent) => this.onHoverComponent(e)}>\n ${(this.templates || []).map(template => {\n const { type } = template\n\n return html`\n <div @click=${this.onClickTemplate} data-type=${type} template>\n <img src=${String(this.templateIcon(template))} />${i18next.t(`component.${type}`)}\n </div>\n `\n })}\n </div>\n\n <component-detail\n tabindex=\"-1\"\n @focusout=${() => {\n this.template = null\n }}\n .template=${this.template}\n hidden\n >\n </component-detail>\n `\n : html``\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('group')) {\n if (!this.group) {\n this.templates = []\n this.setAttribute('hidden', '')\n } else {\n this.templates = this.groups.find((g: Pallet) => g.name === this.group)?.templates || []\n this.removeAttribute('active')\n }\n }\n\n if (changes.has('template')) {\n this.template && this.template.about\n ? this.detail.removeAttribute('hidden')\n : this.detail.setAttribute('hidden', '')\n }\n }\n\n findTemplate(type: string | null | undefined) {\n this.template = type && this.templates.find(template => template.type == type)\n }\n\n onHoverComponent(e: MouseEvent) {\n const button = e.target as HTMLElement\n this.findTemplate(button!.closest('[data-type]')?.getAttribute('data-type'))\n }\n\n onClickTemplate(e: MouseEvent) {\n var item = e.target as HTMLElement\n var type = item.closest('[data-type]')?.getAttribute('data-type')\n\n if (!type) {\n return\n }\n\n if (this.scene) {\n this.scene.rootContainer?.trigger('addstop') // 새로운 컴포넌트 클릭시 이전 추가 모드 정지\n this.template = this.templates.find(template => template.type == type)\n this.template && this.scene.startAddMode(JSON.parse(JSON.stringify(this.template.model)))\n }\n\n this.group = null\n }\n\n templateIcon(template: PalletItem) {\n return template.icon || noImage\n }\n}\n"]}