@oicl/openbridge-webcomponents 0.0.9 → 0.0.10

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 (68) hide show
  1. package/.release-it.json +1 -1
  2. package/.storybook/preview.ts +0 -1
  3. package/CHANGELOG.md +13 -1
  4. package/__snapshots__/application-topbar--inactive.png +0 -0
  5. package/__snapshots__/button-button--raised-disabled.png +0 -0
  6. package/__snapshots__/input-slider--no-icons.png +0 -0
  7. package/__snapshots__/input-slider--no-value.png +0 -0
  8. package/__snapshots__/line-corner-line--primary.png +0 -0
  9. package/__snapshots__/line-example--air.png +0 -0
  10. package/__snapshots__/line-example--connector.png +0 -0
  11. package/__snapshots__/line-example--electric.png +0 -0
  12. package/__snapshots__/line-example--fluid.png +0 -0
  13. package/__snapshots__/line-horizontal-line--primary.png +0 -0
  14. package/__snapshots__/line-vertical-line--complex.png +0 -0
  15. package/__snapshots__/line-vertical-line--primary.png +0 -0
  16. package/custom-elements.json +764 -399
  17. package/dist/automation/corner-line/corner-line.d.ts +22 -0
  18. package/dist/automation/corner-line/corner-line.d.ts.map +1 -0
  19. package/dist/automation/corner-line/corner-line.js +161 -0
  20. package/dist/automation/corner-line/corner-line.js.map +1 -0
  21. package/dist/automation/horizontal-line/horizontal-line.d.ts +15 -0
  22. package/dist/automation/horizontal-line/horizontal-line.d.ts.map +1 -0
  23. package/dist/automation/horizontal-line/horizontal-line.js +110 -0
  24. package/dist/automation/horizontal-line/horizontal-line.js.map +1 -0
  25. package/dist/automation/index.d.ts +20 -0
  26. package/dist/automation/index.d.ts.map +1 -0
  27. package/dist/automation/index.js +42 -0
  28. package/dist/automation/index.js.map +1 -0
  29. package/dist/automation/vertical-line/vertical-line.d.ts +15 -0
  30. package/dist/automation/vertical-line/vertical-line.d.ts.map +1 -0
  31. package/dist/automation/vertical-line/vertical-line.js +111 -0
  32. package/dist/automation/vertical-line/vertical-line.js.map +1 -0
  33. package/dist/components/brilliance-menu/brilliance-menu.d.ts.map +1 -1
  34. package/dist/components/brilliance-menu/brilliance-menu.js +2 -0
  35. package/dist/components/brilliance-menu/brilliance-menu.js.map +1 -1
  36. package/dist/components/slider/slider.css.js +20 -0
  37. package/dist/components/slider/slider.css.js.map +1 -1
  38. package/dist/components/slider/slider.d.ts +8 -0
  39. package/dist/components/slider/slider.d.ts.map +1 -1
  40. package/dist/components/slider/slider.js +44 -18
  41. package/dist/components/slider/slider.js.map +1 -1
  42. package/dist/components/top-bar/top-bar.css.js +5 -1
  43. package/dist/components/top-bar/top-bar.css.js.map +1 -1
  44. package/dist/components/top-bar/top-bar.d.ts.map +1 -1
  45. package/dist/components/top-bar/top-bar.js +8 -8
  46. package/dist/components/top-bar/top-bar.js.map +1 -1
  47. package/package.json +18 -25
  48. package/src/automation/corner-line/corner-line.stories.ts +31 -0
  49. package/src/automation/corner-line/corner-line.ts +167 -0
  50. package/src/automation/horizontal-line/horizontal-line.stories.ts +28 -0
  51. package/src/automation/horizontal-line/horizontal-line.ts +100 -0
  52. package/src/automation/index.ts +41 -0
  53. package/src/automation/line.stories.ts +142 -0
  54. package/src/automation/vertical-line/vertical-line.stories.ts +71 -0
  55. package/src/automation/vertical-line/vertical-line.ts +104 -0
  56. package/src/components/brilliance-menu/brilliance-menu.ts +2 -0
  57. package/src/components/slider/slider.css +20 -0
  58. package/src/components/slider/slider.stories.ts +20 -1
  59. package/src/components/slider/slider.ts +43 -19
  60. package/src/components/top-bar/top-bar.css +4 -0
  61. package/src/components/top-bar/top-bar.ts +10 -8
  62. package/src/palettes/variables.css +64 -43
  63. package/script/svg-instruments/convert-svg.ts +0 -246
  64. package/script/svg-instruments/environment.d.ts +0 -7
  65. package/script/svg-instruments/exports.ts +0 -82
  66. package/script/svg-instruments/figma-types.ts +0 -804
  67. package/script/svg-instruments/figmaImport.ts +0 -79
  68. package/script/svg-instruments/main.ts +0 -109
@@ -17,8 +17,9 @@
17
17
  --border-edge-color: rgba(0, 0, 0, .050);
18
18
  --border-solid-color: rgb(51, 51, 51);
19
19
  --border-icon-outline-color: rgba(0, 0, 0, .500);
20
+ --border-silhouette-color: rgb(255, 255, 255);
20
21
  --instrument-enhanced-primary-color: rgb(26, 45, 255);
21
- --instrument-enhanced-secondary-color: rgb(46, 79, 138);
22
+ --instrument-enhanced-secondary-color: rgb(37, 76, 147);
22
23
  --instrument-enhanced-tertiary-color: rgba(46, 79, 138, .300);
23
24
  --instrument-regular-primary-color: rgb(13, 13, 13);
24
25
  --instrument-regular-secondary-color: rgb(89, 89, 89);
@@ -122,13 +123,13 @@
122
123
  --on-flat-active-color: rgb(13, 13, 13);
123
124
  --on-flat-neutral-color: rgba(0, 0, 0, .650);
124
125
  --on-flat-disabled-color: rgba(0, 0, 0, .300);
125
- --selected-enabled-background-color: rgb(46, 79, 138);
126
+ --selected-enabled-background-color: rgb(37, 76, 147);
126
127
  --selected-enabled-border-color: rgba(0, 0, 0, .00);
127
- --selected-hover-background-color: rgb(33, 57, 99);
128
+ --selected-hover-background-color: rgb(27, 55, 106);
128
129
  --selected-hover-border-color: rgba(0, 0, 0, .00);
129
- --selected-pressed-background-color: rgb(20, 35, 61);
130
+ --selected-pressed-background-color: rgb(16, 34, 65);
130
131
  --selected-pressed-border-color: rgba(0, 0, 0, .00);
131
- --selected-focused-background-color: rgb(46, 79, 138);
132
+ --selected-focused-background-color: rgb(37, 76, 147);
132
133
  --selected-focused-border-color: rgba(0, 110, 225, .300);
133
134
  --selected-disabled-background-color: rgba(0, 0, 0, .200);
134
135
  --selected-disabled-border-color: rgba(0, 0, 0, .00);
@@ -174,6 +175,19 @@
174
175
  --on-device-active-color: rgb(255, 255, 255);
175
176
  --on-device-neutral-color: rgba(0, 0, 0, .450);
176
177
  --on-device-disabled-color: rgb(179, 179, 179);
178
+ --notification-enabled-background-color: rgb(26, 45, 255);
179
+ --notification-enabled-border-color: rgba(0, 0, 0, .300);
180
+ --notification-hover-background-color: rgb(0, 19, 229);
181
+ --notification-hover-border-color: rgba(0, 0, 0, .300);
182
+ --notification-pressed-background-color: rgb(0, 15, 178);
183
+ --notification-pressed-border-color: rgba(0, 0, 0, .500);
184
+ --notification-focused-background-color: rgb(26, 45, 255);
185
+ --notification-focused-border-color: rgba(37, 76, 147, .500);
186
+ --notification-disabled-background-color: rgb(26, 45, 255);
187
+ --notification-disabled-border-color: rgba(0, 0, 0, .00);
188
+ --on-notification-active-color: rgb(255, 255, 255);
189
+ --on-notification-neutral-color: rgba(255, 255, 255, .600);
190
+ --on-notification-disabled-color: rgba(255, 255, 255, .300);
177
191
  --running-enabled-background-color: rgb(0, 138, 23);
178
192
  --running-enabled-border-color: rgba(0, 0, 0, .100);
179
193
  --running-hover-background-color: rgb(27, 111, 27);
@@ -318,7 +332,7 @@
318
332
  --icon-02-chevron-down: url('data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d=" M18 9.41L16.59 8L12 12.58L7.41 8L6 9.41L12 15.41L18 9.41Z" fill="rgba(0, 0, 0, .650)"/></svg>');
319
333
 
320
334
  }
321
-
335
+
322
336
  :root[data-obc-theme=day] {
323
337
  --element-active-color: rgb(26, 26, 26);
324
338
  --element-neutral-color: rgba(0, 0, 0, .590);
@@ -364,24 +378,20 @@
364
378
  --alert-warning-color: rgb(246, 148, 0);
365
379
  --alert-alarm-color: rgb(223, 27, 27);
366
380
  --alert-critical-alarm-color: rgb(229, 0, 229);
367
- --alert-limit-primary-color: rgba(0, 0, 0, .100);
368
- --alert-limit-secondary-color: rgba(0, 0, 0, .100);
381
+ --alert-limit-primary-color: rgba(0, 0, 0, .080);
382
+ --alert-limit-secondary-color: rgba(0, 0, 0, .080);
369
383
  --automation-device-primary-color: rgb(255, 255, 255);
370
384
  --automation-device-secondary-color: rgb(112, 112, 112);
371
385
  --automation-device-tertiary-color: rgb(0, 0, 0);
372
386
  --automation-device-primary-inverted-color: rgb(15, 15, 15);
373
387
  --automation-device-secondary-inverted-color: rgb(102, 102, 102);
374
388
  --automation-device-tertiary-inverted-color: rgb(128, 128, 128);
375
- --automation-button-primary-color: rgb(255, 255, 255);
376
- --automation-button-tertiary-color: rgba(0, 0, 0, .200);
377
- --automation-button-primary-inverted-color: rgb(224, 224, 224);
378
- --automation-button-tertiary-inverted-color: rgba(0, 0, 0, .100);
379
389
  --automation-pipe-primary-color: rgb(255, 255, 255);
380
- --automation-pipe-secondary-color: rgba(0, 0, 0, .200);
381
- --automation-pipe-tertiary-color: rgba(0, 0, 0, .590);
390
+ --automation-pipe-secondary-color: rgb(143, 143, 143);
391
+ --automation-pipe-tertiary-color: rgb(51, 51, 51);
382
392
  --automation-pipe-primary-inverted-color: rgb(224, 224, 224);
383
- --automation-pipe-secondary-inverted-color: rgba(0, 0, 0, .100);
384
- --automation-pipe-tertiary-inverted-color: rgba(0, 0, 0, .420);
393
+ --automation-pipe-secondary-inverted-color: rgb(179, 179, 179);
394
+ --automation-pipe-tertiary-inverted-color: rgb(143, 143, 143);
385
395
  --automation-pipe-overlay-color: rgba(0, 0, 0, .200);
386
396
  --automation-pipe-disabled-color: rgba(0, 0, 0, .100);
387
397
  --automation-acid-alkalis: rgb(231, 193, 244);
@@ -423,7 +433,7 @@
423
433
  --raised-disabled-border-color: rgba(0, 0, 0, .100);
424
434
  --on-raised-active-color: rgb(255, 255, 255);
425
435
  --on-raised-neutral-color: rgba(255, 255, 255, .700);
426
- --on-raised-disabled-color: rgba(0, 0, 0, .200);
436
+ --on-raised-disabled-color: rgba(0, 0, 0, .300);
427
437
  --indent-enabled-background-color: rgba(0, 0, 0, .050);
428
438
  --indent-enabled-border-color: rgba(0, 0, 0, .050);
429
439
  --indent-hover-background-color: rgba(0, 0, 0, .100);
@@ -444,7 +454,7 @@
444
454
  --flat-pressed-background-color: rgba(0, 0, 0, .120);
445
455
  --flat-pressed-border-color: rgba(0, 0, 0, .00);
446
456
  --flat-focused-background-color: rgba(0, 0, 0, .00);
447
- --flat-focused-border-color: rgba(0, 110, 225, .300);
457
+ --flat-focused-border-color: rgb(153, 206, 255);
448
458
  --flat-disabled-background-color: rgba(0, 0, 0, .00);
449
459
  --flat-disabled-border-color: rgba(0, 0, 0, .00);
450
460
  --flat-activated-background-color: rgba(0, 0, 0, .050);
@@ -593,17 +603,20 @@
593
603
  --font-ui-overline-size: 12px;
594
604
  --font-ui-overline-weight: semibold;
595
605
  --font-ui-overline-line-height: 24px;
606
+ --font-ui-overline-new-size: 16px;
607
+ --font-ui-overline-new-weight: semibold;
608
+ --font-ui-overline-new-line-height: 24px;
596
609
  --font-ui-button-size: 16px;
597
- --font-ui-button-weight: semibold;
610
+ --font-ui-button-weight: Medium;
598
611
  --font-ui-button-line-height: 24px;
599
612
  --font-ui-body-active-size: 16px;
600
- --font-ui-body-active-weight: bold;
613
+ --font-ui-body-active-weight: semibold;
601
614
  --font-ui-body-active-line-height: 24px;
602
615
  --font-ui-body-size: 16px;
603
616
  --font-ui-body-weight: regular;
604
617
  --font-ui-body-line-height: 24px;
605
618
  --font-ui-label-active-size: 12px;
606
- --font-ui-label-active-weight: bold;
619
+ --font-ui-label-active-weight: semibold;
607
620
  --font-ui-label-active-line-height: 16px;
608
621
  --font-ui-label-size: 12px;
609
622
  --font-ui-label-weight: regular;
@@ -617,6 +630,15 @@
617
630
  --font-instrument-label-l-size: 64px;
618
631
  --font-instrument-label-l-weight: regular;
619
632
  --font-instrument-label-l-line-height: 80px;
633
+ --font-instrument-value-regular-size: 16px;
634
+ --font-instrument-value-regular-weight: Medium;
635
+ --font-instrument-value-regular-line-height: 24px;
636
+ --font-instrument-value-enhanced-size: 36px;
637
+ --font-instrument-value-enhanced-weight: Medium;
638
+ --font-instrument-value-enhanced-line-height: 48px;
639
+ --font-instrument-value-double-size: 72px;
640
+ --font-instrument-value-double-weight: Medium;
641
+ --font-instrument-value-double-line-height: 96px;
620
642
  --font-instrument-value-s-size: 16px;
621
643
  --font-instrument-value-s-weight: semibold;
622
644
  --font-instrument-value-s-line-height: 24px;
@@ -658,12 +680,11 @@
658
680
  --shadow-floating: 0px 4px 16px 0px rgba(0, 0, 0, .300);
659
681
  --shadow-overlay: 0px 8px 32px 0px rgba(0, 0, 0, .400);
660
682
  --shadow-focused: 0px 0px 0px 4px rgb(0, 59, 148);
661
-
662
683
  --icon-02-chevron-up: url('data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M6 14.0002L7.41 15.4102L12 10.8302L16.59 15.4102L18 14.0002L12 8.00016L6 14.0002Z" fill="rgba(0, 0, 0, 0.55)"/></svg>');
663
684
  --icon-02-chevron-down: url('data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 9.41L16.59 8L12 12.58L7.41 8L6 9.41L12 15.41L18 9.41Z" fill="rgba(0, 0, 0, 0.55)"/></svg>');
664
685
 
665
686
  }
666
-
687
+
667
688
  :root[data-obc-theme=dusk] {
668
689
  --element-active-color: rgb(242, 242, 242);
669
690
  --element-neutral-color: rgba(255, 255, 255, .550);
@@ -684,7 +705,7 @@
684
705
  --border-silhouette-color: rgb(0, 0, 0);
685
706
  --border-icon-outline-color: rgba(0, 0, 0, .500);
686
707
  --border-solid-color: rgb(51, 51, 51);
687
- --instrument-enhanced-primary-color: rgb(129, 223, 254);
708
+ --instrument-enhanced-primary-color: rgb(94, 213, 253);
688
709
  --instrument-enhanced-secondary-color: rgb(86, 150, 199);
689
710
  --instrument-enhanced-tertiary-color: rgba(92, 139, 193, .200);
690
711
  --instrument-regular-primary-color: rgb(230, 230, 230);
@@ -841,6 +862,19 @@
841
862
  --on-device-active-color: rgb(255, 255, 255);
842
863
  --on-device-neutral-color: rgb(123, 123, 123);
843
864
  --on-device-disabled-color: rgb(84, 84, 84);
865
+ --notification-enabled-background-color: rgb(94, 213, 253);
866
+ --notification-enabled-border-color: rgba(0, 0, 0, .500);
867
+ --notification-hover-background-color: rgb(154, 229, 254);
868
+ --notification-hover-border-color: rgba(0, 0, 0, .100);
869
+ --notification-pressed-background-color: rgb(17, 163, 212);
870
+ --notification-pressed-border-color: rgba(0, 0, 0, .200);
871
+ --notification-focused-background-color: rgb(94, 213, 253);
872
+ --notification-focused-border-color: rgb(247, 247, 247);
873
+ --notification-disabled-background-color: rgb(94, 213, 253);
874
+ --notification-disabled-border-color: rgba(0, 0, 0, .00);
875
+ --on-notification-active-color: rgb(0, 0, 0);
876
+ --on-notification-neutral-color: rgba(0, 0, 0, .600);
877
+ --on-notification-disabled-color: rgba(0, 0, 0, .200);
844
878
  --running-enabled-background-color: rgb(19, 138, 0);
845
879
  --running-enabled-border-color: rgba(0, 0, 0, .100);
846
880
  --running-hover-background-color: rgb(23, 168, 0);
@@ -906,19 +940,6 @@
906
940
  --on-critical-alarm-active-color: rgb(255, 255, 255);
907
941
  --on-critical-alarm-neutral-color: rgba(255, 255, 255, .700);
908
942
  --on-critical-alarm-disabled-color: rgba(255, 255, 255, .300);
909
- --notification-enabled-background-color: rgb(129, 212, 254);
910
- --notification-enabled-border-color: rgba(0, 0, 0, .500);
911
- --notification-hover-background-color: rgb(90, 191, 242);
912
- --notification-hover-border-color: rgba(0, 0, 0, .100);
913
- --notification-pressed-background-color: rgb(60, 167, 221);
914
- --notification-pressed-border-color: rgba(0, 0, 0, .200);
915
- --notification-focused-background-color: rgb(129, 212, 254);
916
- --notification-focused-border-color: rgb(247, 247, 247);
917
- --notification-disabled-background-color: rgb(129, 212, 254);
918
- --notification-disabled-border-color: rgba(0, 0, 0, .00);
919
- --on-notification-active-color: rgb(0, 0, 0);
920
- --on-notification-neutral-color: rgba(0, 0, 0, .600);
921
- --on-notification-disabled-color: rgba(0, 0, 0, .200);
922
943
  --font-ui-title-size: 24px;
923
944
  --font-ui-title-weight: bold;
924
945
  --font-ui-title-line-height: 32px;
@@ -996,7 +1017,7 @@
996
1017
  --icon-02-chevron-up: url('data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M6 14.0002L7.41 15.4102L12 10.8302L16.59 15.4102L18 14.0002L12 8.00016L6 14.0002Z" fill="rgba(255, 255, 255, .550)"/></svg>');
997
1018
  --icon-02-chevron-down: url('data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 9.41L16.59 8L12 12.58L7.41 8L6 9.41L12 15.41L18 9.41Z" fill="rgba(255, 255, 255, .550)"/></svg>');
998
1019
  }
999
-
1020
+
1000
1021
 
1001
1022
  :root[data-obc-theme=night] {
1002
1023
  --element-active-color: rgb(71, 71, 0);
@@ -1254,7 +1275,7 @@
1254
1275
  --on-critical-alarm-neutral-color: rgba(0, 0, 0, .700);
1255
1276
  --on-critical-alarm-disabled-color: rgba(0, 0, 0, .300);
1256
1277
  --font-ui-title-size: 24px;
1257
- --font-ui-title-weight: Bold;
1278
+ --font-ui-title-weight: bold;
1258
1279
  --font-ui-title-line-height: 32px;
1259
1280
  --font-ui-subtitle-size: 24px;
1260
1281
  --font-ui-subtitle-weight: regular;
@@ -1266,13 +1287,13 @@
1266
1287
  --font-ui-button-weight: semibold;
1267
1288
  --font-ui-button-line-height: 24px;
1268
1289
  --font-ui-body-active-size: 16px;
1269
- --font-ui-body-active-weight: Bold;
1290
+ --font-ui-body-active-weight: bold;
1270
1291
  --font-ui-body-active-line-height: 24px;
1271
1292
  --font-ui-body-size: 16px;
1272
1293
  --font-ui-body-weight: regular;
1273
1294
  --font-ui-body-line-height: 24px;
1274
1295
  --font-ui-label-active-size: 12px;
1275
- --font-ui-label-active-weight: Bold;
1296
+ --font-ui-label-active-weight: bold;
1276
1297
  --font-ui-label-active-line-height: 16px;
1277
1298
  --font-ui-label-size: 12px;
1278
1299
  --font-ui-label-weight: regular;
@@ -1329,5 +1350,5 @@
1329
1350
 
1330
1351
  --icon-02-chevron-up: url('data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M6 14.0002L7.41 15.4102L12 10.8302L16.59 15.4102L18 14.0002L12 8.00016L6 14.0002Z" fill="rgb(51, 51, 0)"/></svg>');
1331
1352
  --icon-02-chevron-down: url('data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 9.41L16.59 8L12 12.58L7.41 8L6 9.41L12 15.41L18 9.41Z" fill="rgb(51, 51, 0)"/></svg>');
1332
-
1333
- }
1353
+
1354
+ }
@@ -1,246 +0,0 @@
1
- import {FrameNode, StyleDict, StyledNode} from './figma-types';
2
- import {DOMParser, XMLSerializer} from 'xmldom';
3
-
4
- function childNodes2Elements(nodes: NodeListOf<ChildNode>): Element[] {
5
- const data = [];
6
- for (let i = 0; i < nodes.length; i++) {
7
- const node = nodes[i];
8
- if (node.nodeName === '#text') continue;
9
- if (node.nodeName === 'defs') continue;
10
- data.push(node as Element);
11
- }
12
- return data;
13
- }
14
-
15
- function getSvgId(svgNode: Element): string {
16
- let svgId = (svgNode.getAttribute('id') as string).replace('°', '°');
17
- const reDeg = /°/gi;
18
- svgId = svgId.replace(reDeg, '°');
19
- const re = new RegExp('_[0-9]+$');
20
- if (svgId.match(re)) {
21
- svgId = svgId.replace(re, '');
22
- }
23
- return svgId;
24
- }
25
-
26
- function replaceAll(string: string, search: string, replace: string): string {
27
- return string.split(search).join(replace);
28
- }
29
-
30
- function makeid(): string {
31
- let result = '';
32
- const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
33
- const charactersLength = characters.length;
34
- for (let i = 0; i < 10; i++) {
35
- result += characters.charAt(Math.floor(Math.random() * charactersLength));
36
- }
37
- return result;
38
- }
39
-
40
- export function convertSvg(
41
- figmaElement: FrameNode,
42
- svgString: string,
43
- styles: StyleDict,
44
- removeAttrs: boolean
45
- ): string {
46
- const svgDoc = new DOMParser().parseFromString(svgString, 'text/svg');
47
- const root = svgDoc.firstChild;
48
- if (root === null) return '';
49
-
50
- for (const nd of childNodes2Elements(root.childNodes)) {
51
- const svgId = getSvgId(nd);
52
- const elementId = figmaElement.name;
53
- if (svgId !== elementId) {
54
- console.warn(
55
- `Figma element id and svg id does not match (${elementId} !== ${svgId})`
56
- );
57
- }
58
- parseNode(figmaElement as unknown as StyledNode, nd, styles, removeAttrs);
59
- }
60
- let out = new XMLSerializer().serializeToString(svgDoc);
61
- const clipPrefix = makeid();
62
- out = replaceAll(out, 'url(#clip', `url(#${clipPrefix}clip`);
63
- out = replaceAll(out, 'clipPath id="clip', `clipPath id="${clipPrefix}clip`);
64
- out = replaceAll(out, 'url(#path-', `url(#${clipPrefix}path-`);
65
- out = replaceAll(out, 'mask id="path-', `mask id="${clipPrefix}path-`);
66
- return out;
67
- }
68
-
69
- function findFigmaNode(
70
- figmaElement: StyledNode,
71
- svgNode: Element
72
- ): StyledNode | undefined {
73
- const path = getSvgPath(svgNode);
74
- path.shift();
75
- return searchFigmaNode(figmaElement, path);
76
- }
77
-
78
- /** Searching for figma node matching the svg id path.
79
- *
80
- * Supports figma nodes having same name.
81
- * @param figmaElement
82
- * @param svgIds
83
- */
84
- function searchFigmaNode(
85
- figmaElement: StyledNode,
86
- svgIds: string[]
87
- ): StyledNode | undefined {
88
- if (svgIds.length === 0) return figmaElement;
89
- if (figmaElement.children === undefined) return undefined;
90
-
91
- const currentId = svgIds.shift();
92
- const figmaNodes = figmaElement.children
93
- .filter((f) => f.name === currentId && f.visible !== false)
94
- .map((f) => {
95
- const ids = [...svgIds];
96
- return searchFigmaNode(f, ids);
97
- })
98
- .filter((value) => value !== undefined) as StyledNode[];
99
- if (figmaNodes.length > 0) return figmaNodes[0];
100
- else return undefined;
101
- }
102
-
103
- function getSvgPath(svgNode: Element): string[] {
104
- if (svgNode.parentNode === null) return [];
105
- const svgId = getSvgId(svgNode);
106
-
107
- const ids = getSvgPath(svgNode.parentNode as Element);
108
- if (svgId.length !== 0) {
109
- ids.push(svgId);
110
- }
111
- return ids;
112
- }
113
-
114
- function parseNode(
115
- figmaRoot: StyledNode,
116
- svgNode: Element,
117
- styles: StyleDict,
118
- removeAttrs: boolean
119
- ) {
120
- const figmaNode = findFigmaNode(figmaRoot, svgNode);
121
- if (figmaNode === undefined) {
122
- console.warn(
123
- `Missing figma node: ${svgNode.getAttribute('id')}. Skipping subnodes.`
124
- );
125
- return;
126
- }
127
-
128
- const cssClasses = [];
129
- if (svgNode.hasAttribute('id')) {
130
- if (
131
- svgNode.hasAttribute('id') &&
132
- figmaNode.styles &&
133
- figmaNode.styles.stroke &&
134
- svgNode.hasAttribute('stroke')
135
- ) {
136
- if (removeAttrs) {
137
- svgNode.removeAttribute('stroke');
138
- svgNode.removeAttribute('stroke-opacity');
139
- }
140
- const strokeStyleId = figmaNode.styles.stroke;
141
- if (strokeStyleId !== undefined) {
142
- const styleName = convertStyleName(
143
- styles[strokeStyleId].name,
144
- '-stroke'
145
- );
146
- cssClasses.push(styleName);
147
- }
148
- }
149
-
150
- if (
151
- svgNode.hasAttribute('id') &&
152
- figmaNode.styles &&
153
- figmaNode.styles.fill &&
154
- svgNode.hasAttribute('fill')
155
- ) {
156
- if (removeAttrs) {
157
- svgNode.removeAttribute('fill');
158
- }
159
- const strokeStyleId = figmaNode.styles.fill;
160
- if (strokeStyleId !== undefined) {
161
- const styleName = convertStyleName(styles[strokeStyleId].name, '-fill');
162
- cssClasses.push(styleName);
163
- }
164
- }
165
- } else if (figmaNode.styles) {
166
- const hasBackground =
167
- figmaNode.background && figmaNode.background.length === 1;
168
- const svgHasFill = svgNode.hasAttribute('fill');
169
- const hasStrokeInsideOrOutside =
170
- figmaNode.strokeAlign &&
171
- (figmaNode.strokeAlign === 'INSIDE' ||
172
- figmaNode.strokeAlign === 'OUTSIDE');
173
- const mask = svgNode.getAttribute('mask');
174
- const hasMaskInsideOrOutside =
175
- mask && (mask.match(/inside/) || mask.match(/outside/));
176
- if (
177
- svgHasFill &&
178
- !hasMaskInsideOrOutside &&
179
- ((hasBackground && figmaNode.styles.fills) || figmaNode.styles.fill)
180
- ) {
181
- // Special case for background fill for frame
182
- if (removeAttrs) {
183
- svgNode.removeAttribute('fill');
184
- }
185
-
186
- const strokeStyleId = figmaNode.styles.fills || figmaNode.styles.fill;
187
- if (strokeStyleId !== undefined) {
188
- const styleName = convertStyleName(styles[strokeStyleId].name, '-fill');
189
- cssClasses.push(styleName);
190
- }
191
- }
192
-
193
- if (
194
- hasStrokeInsideOrOutside &&
195
- hasMaskInsideOrOutside &&
196
- svgHasFill &&
197
- figmaNode.styles &&
198
- figmaNode.styles.stroke
199
- ) {
200
- if (removeAttrs) {
201
- svgNode.removeAttribute('fill');
202
- }
203
- const strokeStyleId = figmaNode.styles.stroke;
204
- if (strokeStyleId !== undefined) {
205
- const styleName = convertStyleName(styles[strokeStyleId].name, '-fill');
206
- cssClasses.push(styleName);
207
- }
208
- }
209
-
210
- const hasStroke = figmaNode.strokes && figmaNode.strokes.length === 1;
211
- if (
212
- hasStroke &&
213
- svgNode.hasAttribute('stroke') &&
214
- figmaNode.styles &&
215
- figmaNode.styles.strokes
216
- ) {
217
- // Special case for stroke on frame
218
- if (removeAttrs) {
219
- svgNode.removeAttribute('stroke');
220
- }
221
- const strokeStyleId = figmaNode.styles.strokes;
222
- if (strokeStyleId !== undefined) {
223
- const styleName = convertStyleName(
224
- styles[strokeStyleId].name,
225
- '-stroke'
226
- );
227
- cssClasses.push(styleName);
228
- }
229
- }
230
- }
231
-
232
- if (cssClasses.length > 0) {
233
- svgNode.setAttribute('class', cssClasses.join(' '));
234
- }
235
- const childSvgs = childNodes2Elements(svgNode.childNodes);
236
- if (childSvgs.length > 0) {
237
- for (let i = 0; i < childSvgs.length; i++) {
238
- const svgNode = childSvgs[i];
239
- parseNode(figmaRoot, svgNode, styles, removeAttrs);
240
- }
241
- }
242
- }
243
-
244
- function convertStyleName(str: string, suffix: string): string {
245
- return 'ob-' + str.replace(/\//g, '-').toLowerCase() + suffix;
246
- }
@@ -1,7 +0,0 @@
1
- declare namespace NodeJS {
2
- export interface ProcessEnv {
3
- FIGMA_TOKEN: string;
4
- FIGMA_MAINFILE: string;
5
- FIGMA_DOCSTYLE: string;
6
- }
7
- }
@@ -1,82 +0,0 @@
1
- export interface ExportDef {
2
- name: string;
3
- path: string[]; // Array of subpath for targeting the svg export in Figma
4
- outputFolder: string; // sub folder of ./gen
5
- nonScaling?: boolean;
6
- }
7
-
8
- const staticExportComponents: ExportDef[] = [];
9
-
10
- function tickMarks(): ExportDef[] {
11
- const circleDegrees = ['0', '1', '2', '5', '9', '10', '30', '45', '90'];
12
- const tickType = ['Primary', 'Secondary', 'Tertiary'];
13
- const circleTickMarks: ExportDef[] = [];
14
-
15
- for (const degree of circleDegrees) {
16
- for (const tick of tickType) {
17
- const def: ExportDef = {
18
- name: `${tick}Tickmark${degree}`,
19
- path: [
20
- 'P2 Building blocks',
21
- 'Watchface elements',
22
- 'Tickmarks - Compass',
23
- `Degree=${degree}°, Tick size=${tick}`,
24
- ],
25
- outputFolder: 'Tickmarks',
26
- nonScaling: true,
27
- };
28
- circleTickMarks.push(def);
29
- }
30
- }
31
-
32
- const size = ['Medium', 'Large'];
33
- const toplines: ExportDef[] = size.map((s) => ({
34
- name: `Topline${s}`,
35
- path: [
36
- 'P2 Building blocks',
37
- 'Watchface',
38
- 'Azimuth watchface',
39
- `Size=${s}, Tickmarks=90°, Labels=False, Detailed=False, PORT / STBD=False`,
40
- 'watchface',
41
- 'top-line',
42
- ],
43
- outputFolder: 'Tickmarks',
44
- }));
45
- return [...circleTickMarks, ...toplines];
46
- }
47
-
48
- function watchface(): ExportDef[] {
49
- const watchface: ExportDef[] = [];
50
- const types = [
51
- {name: 'Regular', tag: 'Regular'},
52
- {name: 'PORT STBD', tag: 'PORT_STBD'},
53
- {name: 'Positive / Negative', tag: 'Positive_Negative'},
54
- {name: 'Off', tag: 'Off'},
55
- {name: 'Bar', tag: 'Bar'},
56
- ];
57
- const size = ['Small', 'Medium', 'Large'];
58
-
59
- for (const type of types) {
60
- for (const s of size) {
61
- const def: ExportDef = {
62
- name: `${type.tag}Watchface${s}`,
63
- path: [
64
- 'P2 Building blocks',
65
- 'Watchface elements',
66
- 'Watchface circle',
67
- `Size=${s}, Type=${type.name}, Condensed=False, Arc=Off`,
68
- ],
69
- outputFolder: 'Watchface',
70
- };
71
- watchface.push(def);
72
- }
73
- }
74
-
75
- return watchface;
76
- }
77
-
78
- export const exportComponents = [
79
- ...staticExportComponents,
80
- ...tickMarks(),
81
- ...watchface(),
82
- ];