@muonic/muon 0.0.2-beta.0

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 (124) hide show
  1. package/.nycrc +17 -0
  2. package/.versionrc +3 -0
  3. package/CHANGELOG.md +389 -0
  4. package/components/card/index.js +1 -0
  5. package/components/card/src/card-component.js +43 -0
  6. package/components/card/src/card-styles.css +25 -0
  7. package/components/card/src/config-tokens.json +11 -0
  8. package/components/card/src/design-tokens.json +34 -0
  9. package/components/card/story.js +52 -0
  10. package/components/cta/index.js +1 -0
  11. package/components/cta/src/config-tokens.json +11 -0
  12. package/components/cta/src/cta-component.js +174 -0
  13. package/components/cta/src/cta-styles.css +105 -0
  14. package/components/cta/src/design-tokens.json +132 -0
  15. package/components/cta/story.js +99 -0
  16. package/components/detail/index.js +1 -0
  17. package/components/detail/src/config-tokens.json +11 -0
  18. package/components/detail/src/design-tokens.json +102 -0
  19. package/components/detail/src/detail-component.js +27 -0
  20. package/components/detail/src/detail-styles.css +83 -0
  21. package/components/detail/story.js +33 -0
  22. package/components/form/index.js +1 -0
  23. package/components/form/src/config-tokens.json +11 -0
  24. package/components/form/src/design-tokens.json +9 -0
  25. package/components/form/src/form-component.js +197 -0
  26. package/components/form/src/form-styles.css +10 -0
  27. package/components/form/story.js +71 -0
  28. package/components/icon/index.js +1 -0
  29. package/components/icon/src/config-tokens.json +31 -0
  30. package/components/icon/src/design-tokens.json +8 -0
  31. package/components/icon/src/icon-component.js +91 -0
  32. package/components/icon/src/icon-styles.css +26 -0
  33. package/components/icon/story.js +26 -0
  34. package/components/image/index.js +1 -0
  35. package/components/image/src/config-tokens.json +26 -0
  36. package/components/image/src/image-component.js +96 -0
  37. package/components/image/src/image-styles.css +71 -0
  38. package/components/image/story.js +31 -0
  39. package/components/inputter/index.js +1 -0
  40. package/components/inputter/src/config-tokens.json +14 -0
  41. package/components/inputter/src/design-tokens.json +308 -0
  42. package/components/inputter/src/inputter-component.js +227 -0
  43. package/components/inputter/src/inputter-styles-detail.css +59 -0
  44. package/components/inputter/src/inputter-styles.css +305 -0
  45. package/components/inputter/src/inputter-styles.slotted.css +64 -0
  46. package/components/inputter/story.js +243 -0
  47. package/css/accessibility.css +3 -0
  48. package/css/default.css +9 -0
  49. package/css/global.css +8 -0
  50. package/directives/image-loader-directive.js +116 -0
  51. package/directives/svg-loader-directive.js +94 -0
  52. package/index.js +52 -0
  53. package/mixins/card-mixin.js +27 -0
  54. package/mixins/detail-mixin.js +128 -0
  55. package/mixins/form-associate-mixin.js +36 -0
  56. package/mixins/form-element-mixin.js +378 -0
  57. package/mixins/image-holder-mixin.js +20 -0
  58. package/mixins/mask-mixin.js +159 -0
  59. package/mixins/validation-mixin.js +272 -0
  60. package/muon-element/index.js +97 -0
  61. package/package.json +72 -0
  62. package/rollup.config.mjs +30 -0
  63. package/scripts/build/storybook/index.mjs +11 -0
  64. package/scripts/build/storybook/run.mjs +47 -0
  65. package/scripts/rollup-plugins.mjs +116 -0
  66. package/scripts/serve/index.mjs +11 -0
  67. package/scripts/serve/run.mjs +27 -0
  68. package/scripts/style-dictionary.mjs +64 -0
  69. package/scripts/utils/config.mjs +30 -0
  70. package/scripts/utils/index.mjs +283 -0
  71. package/storybook/find-stories.js +36 -0
  72. package/storybook/server.config.mjs +19 -0
  73. package/storybook/stories.js +86 -0
  74. package/storybook/tokens/color.js +87 -0
  75. package/storybook/tokens/font.js +52 -0
  76. package/storybook/tokens/spacer.js +48 -0
  77. package/tests/README.md +3 -0
  78. package/tests/components/card/__snapshots__/card.test.snap.js +70 -0
  79. package/tests/components/card/card.test.js +81 -0
  80. package/tests/components/cta/__snapshots__/cta.test.snap.js +246 -0
  81. package/tests/components/cta/cta.test.js +212 -0
  82. package/tests/components/form/__snapshots__/form.test.snap.js +115 -0
  83. package/tests/components/form/form.test.js +336 -0
  84. package/tests/components/icon/__snapshots__/icon.test.snap.js +95 -0
  85. package/tests/components/icon/icon.test.js +197 -0
  86. package/tests/components/image/__snapshots__/image.test.snap.js +205 -0
  87. package/tests/components/image/image.test.js +314 -0
  88. package/tests/components/image/images/15.png +0 -0
  89. package/tests/components/image/images/150.png +0 -0
  90. package/tests/components/inputter/__snapshots__/inputter.test.snap.js +357 -0
  91. package/tests/components/inputter/inputter.test.js +427 -0
  92. package/tests/helpers/index.js +30 -0
  93. package/tests/mixins/__snapshots__/card.test.snap.js +35 -0
  94. package/tests/mixins/__snapshots__/detail.test.snap.js +237 -0
  95. package/tests/mixins/__snapshots__/form-element.test.snap.js +137 -0
  96. package/tests/mixins/__snapshots__/mask.test.snap.js +53 -0
  97. package/tests/mixins/__snapshots__/validation.test.snap.js +297 -0
  98. package/tests/mixins/card.test.js +63 -0
  99. package/tests/mixins/detail.test.js +223 -0
  100. package/tests/mixins/form-element.test.js +473 -0
  101. package/tests/mixins/mask.test.js +261 -0
  102. package/tests/mixins/muon-element.test.js +52 -0
  103. package/tests/mixins/validation.test.js +423 -0
  104. package/tests/runner/commands.mjs +19 -0
  105. package/tests/scripts/utils/card-component.js +26 -0
  106. package/tests/scripts/utils/muon.config.test.json +13 -0
  107. package/tests/scripts/utils/single.component.config.json +5 -0
  108. package/tests/scripts/utils/test-runner.mjs +1 -0
  109. package/tests/scripts/utils/utils-test.mjs +284 -0
  110. package/tests/utils/validation.functions.test.js +199 -0
  111. package/tokens/theme/color.json +482 -0
  112. package/tokens/theme/font.json +61 -0
  113. package/tokens/theme/size.json +27 -0
  114. package/tokens/theme/spacer.json +73 -0
  115. package/tokens/utils/formats/reference.js +17 -0
  116. package/tokens/utils/modular-scale.js +33 -0
  117. package/tokens/utils/templates/font-face.css.template +30 -0
  118. package/tokens/utils/transforms/color.js +27 -0
  119. package/tokens/utils/transforms/string.js +6 -0
  120. package/tokens/utils/validation.json +76 -0
  121. package/utils/scroll/index.js +31 -0
  122. package/utils/validation/index.js +205 -0
  123. package/web-test-runner.browserstack.config.mjs +123 -0
  124. package/web-test-runner.config.mjs +44 -0
@@ -0,0 +1,261 @@
1
+ /* eslint-disable no-undef */
2
+ import { expect, fixture, html, defineCE, unsafeStatic, waitUntil } from '@open-wc/testing';
3
+ import { MuonElement } from '@muonic/muon';
4
+ import { MaskMixin } from '@muonic/muon/mixins/mask-mixin';
5
+ import { defaultChecks, fillIn } from '../helpers';
6
+ import sinon from 'sinon';
7
+
8
+ const Inputter = class extends MaskMixin(MuonElement) {
9
+
10
+ _onInput(inputEvent) {
11
+ super._onInput(inputEvent);
12
+ this.value = this._processMaskInputValue(this._slottedValue);
13
+ this._fireChangeEvent();
14
+ }
15
+
16
+ _onChange(changeEvent) {
17
+ changeEvent.stopPropagation();
18
+ let value = this._processFormChangeValue(this._slottedValue);
19
+ if (this.mask) {
20
+ value = this._processMaskChangeValue(value);
21
+ }
22
+ if (value !== this.value) {
23
+ this.value = value;
24
+ this._fireChangeEvent();
25
+ }
26
+ }
27
+
28
+ get standardTemplate() {
29
+ return html`
30
+ ${this._addLabel}
31
+ ${this._addSlottedContent}
32
+ ${this._addMask}
33
+ `;
34
+ }
35
+ };
36
+ const tagName = defineCE(Inputter);
37
+ const tag = unsafeStatic(tagName);
38
+
39
+ describe('mask & separator', () => {
40
+ describe('mask', async () => {
41
+ let inputter;
42
+ let shadowRoot;
43
+ let maskedInput;
44
+ let inputElement;
45
+ let changeEventSpy;
46
+ before(async () => {
47
+ inputter = await fixture(html`
48
+ <${tag} mask="00000" >
49
+ <label slot="label">input label</label>
50
+ <input type="text" value=""/>
51
+ </${tag}>`);
52
+ shadowRoot = inputter.shadowRoot;
53
+ maskedInput = shadowRoot.querySelector('.input-mask');
54
+ inputElement = inputter.querySelector('input');
55
+
56
+ changeEventSpy = sinon.spy();
57
+ inputter.addEventListener('change', changeEventSpy);
58
+ });
59
+
60
+ it('default checks', async () => {
61
+ await defaultChecks(inputter);
62
+ });
63
+
64
+ it('masked input check', async () => {
65
+ expect(maskedInput).to.be.not.null; // eslint-disable-line no-unused-expressions
66
+ expect(maskedInput.textContent).to.be.equal('00000', '`input-mask` has correct value');
67
+ });
68
+
69
+ it('input value `1`', async () => {
70
+ await fillIn(inputElement, '1', 'input');
71
+ await waitUntil(() => inputter.value === '1');
72
+ maskedInput = shadowRoot.querySelector('.input-mask');
73
+ expect(inputElement.value).to.be.equal('1', 'Input has correct value');
74
+ expect(inputter.value).to.be.equal('1', 'Inputter has correct value');
75
+ expect(maskedInput.textContent).to.be.equal(' 0000', '`input-mask` has correct value');
76
+ expect(changeEventSpy.callCount).to.equal(1, '`change` event fired');
77
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('1', '`change` event has value `1`');
78
+ });
79
+
80
+ it('input value `12`', async () => {
81
+ await fillIn(inputElement, '12', 'input');
82
+ await waitUntil(() => inputter.value === '12');
83
+ maskedInput = shadowRoot.querySelector('.input-mask');
84
+ expect(inputElement.value).to.be.equal('12', 'Input has correct value');
85
+ expect(inputter.value).to.be.equal('12', 'Inputter has correct value');
86
+ expect(maskedInput.textContent).to.be.equal(' 000', '`input-mask` has correct value');
87
+ expect(changeEventSpy.callCount).to.equal(2, '`change` event fired');
88
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('12', '`change` event has value `12`');
89
+ });
90
+ it('input value `123`', async () => {
91
+ await fillIn(inputElement, '123', 'change');
92
+ await waitUntil(() => inputter.value === '123');
93
+ maskedInput = shadowRoot.querySelector('.input-mask');
94
+ expect(inputElement.value).to.be.equal('123', 'Input has correct value');
95
+ expect(inputter.value).to.be.equal('123', 'Inputter has correct value');
96
+ expect(maskedInput.textContent).to.be.equal(' 00', '`input-mask` has correct value');
97
+ expect(changeEventSpy.callCount).to.equal(3, '`change` event fired');
98
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('123', '`change` event has value `123`');
99
+ });
100
+ });
101
+
102
+ describe('mask separator', async () => {
103
+ let inputter;
104
+ let shadowRoot;
105
+ let maskedInput;
106
+ let inputElement;
107
+ let changeEventSpy;
108
+ before(async () => {
109
+ inputter = await fixture(html`
110
+ <${tag} mask="00-00-00" separator="-">
111
+ <label slot="label">input label</label>
112
+ <input type="text" value=""/>
113
+ </${tag}>`);
114
+ shadowRoot = inputter.shadowRoot;
115
+ maskedInput = shadowRoot.querySelector('.input-mask');
116
+ inputElement = inputter.querySelector('input');
117
+ changeEventSpy = sinon.spy();
118
+ inputter.addEventListener('change', changeEventSpy);
119
+ });
120
+
121
+ it('default checks', async () => {
122
+ await defaultChecks(inputter);
123
+ });
124
+
125
+ it('masked input check', async () => {
126
+ expect(maskedInput).to.be.not.null; // eslint-disable-line no-unused-expressions
127
+ expect(maskedInput.textContent).to.be.equal('00-00-00', '`input-mask` has correct value');
128
+ });
129
+
130
+ it('input value `1`', async () => {
131
+ await fillIn(inputElement, '1', 'input');
132
+ await waitUntil(() => inputter.value === '1');
133
+ maskedInput = inputter.shadowRoot.querySelector('.input-mask');
134
+ expect(inputElement.value).to.be.equal('1', 'Input has correct value');
135
+ expect(inputter.value).to.be.equal('1', 'Inputter has correct value');
136
+ expect(maskedInput.textContent).to.be.equal(' 0-00-00', '`input-mask` has correct value');
137
+ expect(changeEventSpy.callCount).to.equal(1, '`change` event fired');
138
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('1', '`change` event has value `1`');
139
+ });
140
+
141
+ it('input value `12`', async () => {
142
+ await fillIn(inputElement, '12', 'input');
143
+ await waitUntil(() => inputter.value === '12-');
144
+ maskedInput = inputter.shadowRoot.querySelector('.input-mask');
145
+ expect(inputElement.value).to.be.equal('12-', 'Input has correct value');
146
+ expect(inputter.value).to.be.equal('12-', 'Inputter has correct value');
147
+ expect(maskedInput.textContent).to.be.equal(' 00-00', '`input-mask` has correct value');
148
+ expect(changeEventSpy.callCount).to.equal(2, '`change` event fired');
149
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('12-', '`change` event has value `12-`');
150
+ });
151
+
152
+ it('input value `123`', async () => {
153
+ await fillIn(inputElement, '123', 'input');
154
+ await waitUntil(() => inputter.value === '12-3');
155
+ maskedInput = inputter.shadowRoot.querySelector('.input-mask');
156
+ expect(inputElement.value).to.be.equal('12-3', 'Input has correct value');
157
+ expect(inputter.value).to.be.equal('12-3', 'Inputter has correct value');
158
+ expect(maskedInput.textContent).to.be.equal(' 0-00', '`input-mask` has correct value');
159
+ expect(changeEventSpy.callCount).to.equal(3, '`change` event fired');
160
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('12-3', '`change` event has value `12-3`');
161
+ });
162
+
163
+ it('delete value `3`', async () => {
164
+ await fillIn(inputElement, '12-', 'input');
165
+ await waitUntil(() => inputter.value === '12-');
166
+ maskedInput = inputter.shadowRoot.querySelector('.input-mask');
167
+ expect(inputElement.value).to.be.equal('12-', 'Input has correct value');
168
+ expect(inputter.value).to.be.equal('12-', 'Inputter has correct value');
169
+ expect(maskedInput.textContent).to.be.equal(' 00-00', '`input-mask` has correct value');
170
+ expect(changeEventSpy.callCount).to.equal(4, '`change` event fired');
171
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('12-', '`change` event has value `12-`');
172
+ });
173
+
174
+ it('delete value `2`', async () => {
175
+ await fillIn(inputElement, '12', 'input');
176
+ await waitUntil(() => inputter.value === '1');
177
+ maskedInput = inputter.shadowRoot.querySelector('.input-mask');
178
+ expect(inputElement.value).to.be.equal('1', 'Input has correct value');
179
+ expect(inputter.value).to.be.equal('1', 'Inputter has correct value');
180
+ expect(maskedInput.textContent).to.be.equal(' 0-00-00', '`input-mask` has correct value');
181
+ expect(changeEventSpy.callCount).to.equal(5, '`change` event fired');
182
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('1', '`change` event has value `1`');
183
+ });
184
+
185
+ it('input value `123`', async () => {
186
+ await fillIn(inputElement, '123', 'change');
187
+ await waitUntil(() => inputter.value === '12-3');
188
+ maskedInput = inputter.shadowRoot.querySelector('.input-mask');
189
+ expect(inputElement.value).to.be.equal('12-3', 'Input has correct value');
190
+ expect(inputter.value).to.be.equal('12-3', 'Inputter has correct value');
191
+ expect(maskedInput.textContent).to.be.equal(' 0-00', '`input-mask` has correct value');
192
+ expect(changeEventSpy.callCount).to.equal(6, '`change` event fired');
193
+ expect(changeEventSpy.lastCall.args[0].detail.value).to.equal('12-3', '`change` event has value `12-3`');
194
+ });
195
+ });
196
+
197
+ describe('tel mask seprator', async () => {
198
+ let inputter;
199
+ let shadowRoot;
200
+ let maskedInput;
201
+ let inputElement;
202
+ before(async () => {
203
+ inputter = await fixture(html`
204
+ <${tag} mask="00-00-00" separator="-">
205
+ <label slot="label">input label</label>
206
+ <input type="tel" value=""/>
207
+ </${tag}>`);
208
+ shadowRoot = inputter.shadowRoot;
209
+ maskedInput = shadowRoot.querySelector('.input-mask');
210
+ inputElement = inputter.querySelector('input');
211
+ });
212
+
213
+ it('default checks', async () => {
214
+ await defaultChecks(inputter);
215
+ });
216
+
217
+ it('masked input check', async () => {
218
+ expect(maskedInput).to.be.not.null; // eslint-disable-line no-unused-expressions
219
+ expect(maskedInput.textContent).to.be.equal('00-00-00', '`input-mask` has correct value');
220
+ });
221
+
222
+ it('input value `1`', async () => {
223
+ await fillIn(inputElement, '1', 'input');
224
+ await waitUntil(() => inputter.value === '1');
225
+ maskedInput = inputter.shadowRoot.querySelector('.input-mask');
226
+ expect(inputter.value).to.be.equal('1', 'Inputter has correct value');
227
+ expect(maskedInput.textContent).to.be.equal(' 0-00-00', '`input-mask` has correct value');
228
+ });
229
+
230
+ it('input value `12`', async () => {
231
+ await fillIn(inputElement, '12', 'input');
232
+ await waitUntil(() => inputter.value === '12-');
233
+ maskedInput = inputter.shadowRoot.querySelector('.input-mask');
234
+ expect(inputElement.value).to.be.equal('12-', 'Input has correct value');
235
+ expect(inputter.value).to.be.equal('12-', 'Inputter has correct value');
236
+ expect(maskedInput.textContent).to.be.equal(' 00-00', '`input-mask` has correct value');
237
+ });
238
+ });
239
+ describe('radio mask', async () => {
240
+ let inputter;
241
+ let shadowRoot;
242
+ let maskedInput;
243
+ before(async () => {
244
+ inputter = await fixture(html`
245
+ <${tag} mask="xxx">
246
+ <label for="radio-option">input label</label>
247
+ <input type="radio" id="radio-option" value="yes"/>
248
+ </${tag}>`);
249
+ shadowRoot = inputter.shadowRoot;
250
+ maskedInput = shadowRoot.querySelector('.input-mask');
251
+ });
252
+
253
+ it('default checks', async () => {
254
+ await defaultChecks(inputter);
255
+ });
256
+
257
+ it('masked input check', async () => {
258
+ expect(maskedInput).to.be.null; // eslint-disable-line no-unused-expressions
259
+ });
260
+ });
261
+ });
@@ -0,0 +1,52 @@
1
+ /* eslint-disable no-undef */
2
+ import { expect, fixture, html, defineCE, unsafeStatic } from '@open-wc/testing';
3
+ import { MuonElement, ScopedElementsMixin } from '@muonic/muon';
4
+
5
+ const MuonComponent = class extends MuonElement {
6
+ get slottedStyles() {
7
+ return {
8
+ _$cssResult$: true,
9
+ cssText: ':host{color:red}'
10
+ };
11
+ }
12
+
13
+ get standardTemplate() {
14
+ return html`<slot></slot>`;
15
+ }
16
+ };
17
+
18
+ const ParentMuonComponent = class extends ScopedElementsMixin(MuonElement) {
19
+
20
+ static get scopedElements() {
21
+ return {
22
+ 'child-el': MuonComponent
23
+ };
24
+ }
25
+
26
+ get standardTemplate() {
27
+ return html`<child-el>test</child-el>`;
28
+ }
29
+ };
30
+
31
+ const tagName = defineCE(MuonComponent);
32
+ const tag = unsafeStatic(tagName);
33
+
34
+ const parentTagName = defineCE(ParentMuonComponent);
35
+ const parentTag = unsafeStatic(parentTagName);
36
+
37
+ describe('muon-component', () => {
38
+ it('standard', async () => {
39
+ const element = await fixture(html`<${tag}>foo</${tag}>`);
40
+
41
+ expect(getComputedStyle(element).color).to.equal('rgb(255, 0, 0)', 'computed style value added for component');
42
+ });
43
+
44
+ it('scoped', async () => {
45
+ const element = await fixture(html`<${parentTag}></${parentTag}>`);
46
+
47
+ const shadowRoot = element.shadowRoot;
48
+ const childEl = shadowRoot.querySelector('child-el');
49
+
50
+ expect(getComputedStyle(childEl).color).to.equal('rgb(255, 0, 0)', 'computed style value added for child shadow component');
51
+ });
52
+ });