@oicl/openbridge-webcomponents 0.0.8 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. package/.release-it.json +12 -0
  2. package/.storybook/main.ts +17 -0
  3. package/.storybook/preview.ts +0 -1
  4. package/CHANGELOG.md +118 -41
  5. package/__snapshots__/application-topbar--inactive.png +0 -0
  6. package/__snapshots__/button-button--raised-disabled.png +0 -0
  7. package/__snapshots__/button-rich-button--with-graphic-info.png +0 -0
  8. package/__snapshots__/input-slider--no-icons.png +0 -0
  9. package/__snapshots__/input-slider--no-value.png +0 -0
  10. package/__snapshots__/line-corner-line--primary.png +0 -0
  11. package/__snapshots__/line-example--air.png +0 -0
  12. package/__snapshots__/line-example--connector.png +0 -0
  13. package/__snapshots__/line-example--electric.png +0 -0
  14. package/__snapshots__/line-example--fluid.png +0 -0
  15. package/__snapshots__/line-horizontal-line--primary.png +0 -0
  16. package/__snapshots__/line-vertical-line--complex.png +0 -0
  17. package/__snapshots__/line-vertical-line--primary.png +0 -0
  18. package/custom-elements.json +679 -297
  19. package/dist/automation/corner-line/corner-line.d.ts +22 -0
  20. package/dist/automation/corner-line/corner-line.d.ts.map +1 -0
  21. package/dist/automation/corner-line/corner-line.js +161 -0
  22. package/dist/automation/corner-line/corner-line.js.map +1 -0
  23. package/dist/automation/horizontal-line/horizontal-line.d.ts +15 -0
  24. package/dist/automation/horizontal-line/horizontal-line.d.ts.map +1 -0
  25. package/dist/automation/horizontal-line/horizontal-line.js +110 -0
  26. package/dist/automation/horizontal-line/horizontal-line.js.map +1 -0
  27. package/dist/automation/index.d.ts +20 -0
  28. package/dist/automation/index.d.ts.map +1 -0
  29. package/dist/automation/index.js +42 -0
  30. package/dist/automation/index.js.map +1 -0
  31. package/dist/automation/vertical-line/vertical-line.d.ts +15 -0
  32. package/dist/automation/vertical-line/vertical-line.d.ts.map +1 -0
  33. package/dist/automation/vertical-line/vertical-line.js +111 -0
  34. package/dist/automation/vertical-line/vertical-line.js.map +1 -0
  35. package/dist/components/brilliance-menu/brilliance-menu.d.ts.map +1 -1
  36. package/dist/components/brilliance-menu/brilliance-menu.js +2 -0
  37. package/dist/components/brilliance-menu/brilliance-menu.js.map +1 -1
  38. package/dist/components/button/button.css.js +2 -2
  39. package/dist/components/navigation-item/navigation-item.css.js +2 -1
  40. package/dist/components/navigation-item/navigation-item.css.js.map +1 -1
  41. package/dist/components/notification-button/notification-button.css.js +1 -1
  42. package/dist/components/rich-button/rich-button.css.js +20 -10
  43. package/dist/components/rich-button/rich-button.css.js.map +1 -1
  44. package/dist/components/rich-button/rich-button.d.ts +1 -0
  45. package/dist/components/rich-button/rich-button.d.ts.map +1 -1
  46. package/dist/components/rich-button/rich-button.js +5 -0
  47. package/dist/components/rich-button/rich-button.js.map +1 -1
  48. package/dist/components/slider/slider.css.js +20 -0
  49. package/dist/components/slider/slider.css.js.map +1 -1
  50. package/dist/components/slider/slider.d.ts +8 -0
  51. package/dist/components/slider/slider.d.ts.map +1 -1
  52. package/dist/components/slider/slider.js +44 -18
  53. package/dist/components/slider/slider.js.map +1 -1
  54. package/dist/components/top-bar/top-bar.css.js +5 -1
  55. package/dist/components/top-bar/top-bar.css.js.map +1 -1
  56. package/dist/components/top-bar/top-bar.d.ts.map +1 -1
  57. package/dist/components/top-bar/top-bar.js +8 -8
  58. package/dist/components/top-bar/top-bar.js.map +1 -1
  59. package/fix-generated.cjs +1 -0
  60. package/package.json +20 -26
  61. package/src/automation/corner-line/corner-line.stories.ts +31 -0
  62. package/src/automation/corner-line/corner-line.ts +167 -0
  63. package/src/automation/horizontal-line/horizontal-line.stories.ts +28 -0
  64. package/src/automation/horizontal-line/horizontal-line.ts +100 -0
  65. package/src/automation/index.ts +41 -0
  66. package/src/automation/line.stories.ts +142 -0
  67. package/src/automation/vertical-line/vertical-line.stories.ts +71 -0
  68. package/src/automation/vertical-line/vertical-line.ts +104 -0
  69. package/src/components/brilliance-menu/brilliance-menu.ts +2 -0
  70. package/src/components/rich-button/rich-button.css +15 -2
  71. package/src/components/rich-button/rich-button.stories.ts +36 -0
  72. package/src/components/rich-button/rich-button.ts +2 -0
  73. package/src/components/slider/slider.css +20 -0
  74. package/src/components/slider/slider.stories.ts +20 -1
  75. package/src/components/slider/slider.ts +43 -19
  76. package/src/components/top-bar/top-bar.css +4 -0
  77. package/src/components/top-bar/top-bar.ts +10 -8
  78. package/src/palettes/variables.css +64 -43
  79. package/.yarnrc.yml +0 -1
  80. package/script/svg-instruments/convert-svg.ts +0 -246
  81. package/script/svg-instruments/environment.d.ts +0 -7
  82. package/script/svg-instruments/exports.ts +0 -82
  83. package/script/svg-instruments/figma-types.ts +0 -804
  84. package/script/svg-instruments/figmaImport.ts +0 -79
  85. package/script/svg-instruments/main.ts +0 -109
  86. package/test.svg +0 -3
@@ -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
- ];