@nuralogix.ai/web-measurement-embedded-app 0.1.0-alpha.9 → 0.1.0-beta.2

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/README.md +140 -86
  2. package/dist/app.css +66 -52
  3. package/dist/app.mjs +99 -89
  4. package/dist/assets/extraction/extraction_wasm_0.1.0-beta.1.json +1 -0
  5. package/dist/assets/extraction_worker_0.1.0-beta.1_js.json +1 -0
  6. package/dist/assets/facetracker_worker_0.1.0-beta.1_js.json +1 -0
  7. package/dist/assets/models/detectorModel_bin.json +1 -0
  8. package/dist/assets/models/detectorModel_json.json +1 -0
  9. package/dist/assets/models/landmarkModel_bin.json +1 -0
  10. package/dist/assets/models/landmarkModel_json.json +1 -0
  11. package/dist/language/strings.de.json +9 -12
  12. package/dist/language/strings.en.json +14 -27
  13. package/dist/language/strings.es.json +9 -12
  14. package/dist/language/strings.fr.json +7 -24
  15. package/dist/language/strings.it.json +11 -14
  16. package/dist/language/strings.ja.json +10 -13
  17. package/dist/language/strings.pt-BR.json +25 -0
  18. package/dist/language/strings.pt.json +9 -12
  19. package/dist/language/strings.zh.json +25 -0
  20. package/dist/stylex.css +30 -18
  21. package/lib/index.d.ts +52 -6
  22. package/lib/index.mjs +739 -1
  23. package/package.json +4 -2
  24. package/dist/assets/extraction/extraction_wasm_0.1.0-alpha.25.json +0 -1
  25. package/dist/assets/extraction_worker_0.1.0-alpha.25_js.json +0 -1
  26. package/dist/assets/facetracker_worker_0.1.0-alpha.25_js.json +0 -1
  27. package/dist/assets/taskVision/model/face_landmarker.task +0 -0
  28. package/dist/assets/taskVision/wasm/vision_wasm_internal_js.json +0 -1
  29. package/dist/assets/taskVision/wasm/vision_wasm_internal_wasm.json +0 -1
  30. package/dist/assets/taskVision/wasm/vision_wasm_nosimd_internal_js.json +0 -1
  31. package/dist/assets/taskVision/wasm/vision_wasm_nosimd_internal_wasm.json +0 -1
  32. package/dist/language/strings.br.json +0 -28
  33. package/dist/language/strings.cn.json +0 -28
package/README.md CHANGED
@@ -1,110 +1,127 @@
1
1
  ### Web Measurement Embedded App
2
2
 
3
-
3
+ Need deeper integration details? Check the full docs at [docs.deepaffex.ai/wmea](https://docs.deepaffex.ai/wmea/).
4
4
 
5
5
  ```html
6
6
  <!DOCTYPE html>
7
7
  <html lang="en">
8
- <head>
9
- <meta charset="UTF-8" />
10
- <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
11
- <title>Measurement Embedded App Demo</title>
8
+ <head>
9
+ <meta charset="UTF-8" />
10
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
+ <title>Measurement Embedded App Demo</title>
12
+ <style>
13
+ #measurement-embedded-app-container {
14
+ position: fixed;
15
+ top: 100px;
16
+ left: 0;
17
+ width: 100vw;
18
+ height: calc(100vh - 100px);
19
+ }
20
+ </style>
12
21
  <script type="importmap">
13
- {
14
- "imports": {
15
- "@nuralogix.ai/web-measurement-embedded-app": "https://unpkg.com/@nuralogix.ai/web-measurement-embedded-app"
16
- }
22
+ {
23
+ "imports": {
24
+ "@nuralogix.ai/web-measurement-embedded-app": "https://unpkg.com/@nuralogix.ai/web-measurement-embedded-app"
17
25
  }
26
+ }
18
27
  </script>
19
- </head>
20
- <body>
21
- <div id="measurement-embedded-app-container"></div>
22
- <script type="module">
23
- import MeasurementEmbeddedApp, { faceAttributeValue } from '@nuralogix.ai/web-measurement-embedded-app';
24
- const {
25
- SEX_ASSIGNED_MALE_AT_BIRTH,
26
- SMOKER_FALSE,
27
- BLOOD_PRESSURE_MEDICATION_FALSE,
28
- DIABETES_NONE
29
- } = faceAttributeValue;
30
- const measurementApp = new MeasurementEmbeddedApp();
31
- const container = document.getElementById('measurement-embedded-app-container');
32
- if (container) {
33
- const apiUrl = '/api';
34
- const studyId = await fetch(`${apiUrl}/studyId`);
35
- const studyIdResponse = await studyId.json();
36
- const token = await fetch(`${apiUrl}/token`);
37
- const tokenResponse = await token.json();
38
- if (studyIdResponse.status === '200' && tokenResponse.status === '200') {
39
- measurementApp.init({
40
- container,
41
- appPath: 'https://unpkg.com/@nuralogix.ai/web-measurement-embedded-app/dist',
42
- settings: {
43
- token: tokenResponse.token,
44
- refreshToken: tokenResponse.refreshToken,
45
- studyId: studyIdResponse.studyId,
46
- },
47
- profile: {
48
- age: 40,
49
- height: 180,
50
- weight: 60,
51
- sex: SEX_ASSIGNED_MALE_AT_BIRTH,
52
- smoking: SMOKER_FALSE,
53
- bloodPressureMedication: BLOOD_PRESSURE_MEDICATION_FALSE,
54
- diabetes: DIABETES_NONE,
55
- bypassProfile: false,
56
- },
57
- config: { // optional
58
- checkConstraints: true, // optional
59
- cameraFacingMode: 'user', // optional
60
- cameraAutoStart: true, // optional
61
- measurementAutoStart: false, // optional
62
- }
63
- // top: '100px', // (optional)
64
- // language: 'fr', // (optional)
65
- // apiUrl: 'some-custom-api-url-value', // (optional)
66
- loadError: function(error) {
67
- console.error("load rror", error);
68
- }
69
- });
70
- measurementApp.on.results = (results) => {
71
- console.log("Results received", results);
72
- measurementApp.destroy();
73
- };
74
- measurementApp.on.error = (error) => {
75
- console.log("error received", error);
76
- };
77
- measurementApp.on.webhook = (webhook) => {
78
- console.log("Webhook received", webhook);
79
- };
80
- } else {
81
- console.error('Failed to get Study ID and Token pair');
82
- }
83
- }
84
- </script>
85
- </body>
28
+ </head>
29
+ <body>
30
+ <div id="measurement-embedded-app-container"></div>
31
+ <script type="module">
32
+ import MeasurementEmbeddedApp, { faceAttributeValue } from '@nuralogix.ai/web-measurement-embedded-app';
33
+ const {
34
+ SEX_ASSIGNED_MALE_AT_BIRTH,
35
+ SMOKER_FALSE,
36
+ BLOOD_PRESSURE_MEDICATION_FALSE,
37
+ DIABETES_NONE
38
+ } = faceAttributeValue;
39
+ const measurementApp = new MeasurementEmbeddedApp();
40
+ const container = document.getElementById('measurement-embedded-app-container');
41
+ if (container) {
42
+ const apiUrl = '/api';
43
+ const studyId = await fetch(`${apiUrl}/studyId`);
44
+ const studyIdResponse = await studyId.json();
45
+ const token = await fetch(`${apiUrl}/token`);
46
+ const tokenResponse = await token.json();
47
+ if (studyIdResponse.status === '200' && tokenResponse.status === '200') {
48
+ measurementApp.init({
49
+ container,
50
+ appPath: 'https://unpkg.com/@nuralogix.ai/web-measurement-embedded-app/dist',
51
+ settings: {
52
+ token: tokenResponse.token,
53
+ refreshToken: tokenResponse.refreshToken,
54
+ studyId: studyIdResponse.studyId,
55
+ },
56
+ profile: {
57
+ age: 40,
58
+ height: 180,
59
+ weight: 60,
60
+ sex: SEX_ASSIGNED_MALE_AT_BIRTH,
61
+ smoking: SMOKER_FALSE,
62
+ bloodPressureMedication: BLOOD_PRESSURE_MEDICATION_FALSE,
63
+ diabetes: DIABETES_NONE,
64
+ bypassProfile: false,
65
+ },
66
+ // Optional configuration overrides (defaults shown)
67
+ config: {
68
+ checkConstraints: true,
69
+ cameraFacingMode: 'user', // or 'environment' for back camera
70
+ cameraAutoStart: false,
71
+ measurementAutoStart: false,
72
+ cancelWhenLowSNR: true,
73
+ }
74
+ // Optional language/api overrides
75
+ // language: 'fr'
76
+ apiUrl: 'api.na-east.deepaffex.ai', // optional for region specific data processing
77
+ loadError: function(error) {
78
+ console.error("load error", error);
79
+ }
80
+ });
81
+ measurementApp.on.results = (results) => {
82
+ console.log("Results received", results);
83
+ measurementApp.destroy();
84
+ };
85
+ measurementApp.on.error = (error) => {
86
+ console.log("error received", error);
87
+ };
88
+ measurementApp.on.event = (appEvent) => {
89
+ console.log("App Event received", appEvent);
90
+ };
91
+ } else {
92
+ console.error('Failed to get Study ID and Token pair');
93
+ }
94
+ }
95
+ </script>
96
+ </body>
86
97
  </html>
87
98
  ```
88
99
 
89
- **Notes:**
90
-
91
- - If you are bundling `Web Measurement Embedded App` with your app, set `appPath` to `'.'`.
92
-
93
- - `language` prop is optional. You can either set it to `en` or `fr`
94
- - If a supported language is set, the app loads with a supported language.
95
- - If the language prop is not set, the app checks the browser's language and if it is among
96
- the list of supported languages, it loads the language pack for the browser's language.
97
- Otherwise falls back to `en`.
100
+ **Notes:**
98
101
 
102
+ - Set `appPath` to `'.'` when you bundle the assets yourself.
103
+ - Profile handling: when `bypassProfile` remains `true` (default) we skip demographic submission and emit an `ERROR` event with `PROFILE_INFO_NOT_SET`; set it to `false` once you supply real profile data.
104
+ - Style the container you pass to `init` (e.g., position, top, width).
105
+ - Optional `apiUrl` enables region-specific processing; omitted values follow the backend token's region automatically. When set explicitly, frontend calls your URL (processing where that endpoint runs) while results continue to store in the token's region—verify the combination suits your deployment.
106
+ - Config options:
107
+ - `checkConstraints` (default: `true`) – enables constraint validation pre-measurement
108
+ - `cameraFacingMode` (default: `'user'`) – use `'user'` for front camera or `'environment'` for back camera.
109
+ - `cameraAutoStart` (default: `false`) – automatically starts the camera once permission is granted.
110
+ - `measurementAutoStart` (default: `false`) – automatically starts the measurement once constraints are satisfied.
111
+ - `cancelWhenLowSNR` (default: `true`) – cancels the measurement if signal-to-noise ratio falls below threshold.
112
+ - Language support: `en`, `ja`, `zh`, `es`, `pt`, `pt-BR`, `it`, `fr`, `de`.
113
+ - Unsupported browser locales fall back to base language (e.g., `zh-TW` → `zh`), then to English.
114
+ - `loadError` is called if assets fail to download or the app cannot initialize.
99
115
 
100
116
  **Methods:**
101
117
 
102
118
  ```typescript
103
119
  init(options: MeasurementEmbeddedAppOptions): void;
104
120
  destroy(): void;
105
- cancel(): void;
121
+ cancel(reset: boolean): Promise<boolean>;
106
122
  setTheme(theme: 'light' | 'dark'): void;
107
123
  setLanguage(language: SupportedLanguage): void;
124
+ getLogs(): Promise<Log[]>;
108
125
  ```
109
126
 
110
127
  **Events:**
@@ -128,3 +145,40 @@ error: ((error: MeasurementEmbeddedAppError) => void) | null;
128
145
  */
129
146
  event: ((appEvent: AppEvent) => void) | null;
130
147
  ```
148
+
149
+ **App events dispatched through `measurementApp.on.event`:**
150
+
151
+ - `APP_LOADED` – the embedded app finished its startup sequence.
152
+ - `CAMERA_PERMISSION_GRANTED` – the user granted camera access.
153
+ - `CAMERA_STARTED` – a camera stream opened successfully.
154
+ - `MEASUREMENT_STARTED` – a measurement run begins.
155
+ - `MEASUREMENT_COMPLETED` – the measurement finished and results are stable.
156
+ - `INTERMEDIATE_RESULTS` – partial results are available during an active run.
157
+ - `RESULTS_RECEIVED` – the final measurement results are available.
158
+ - `MEASUREMENT_CANCELED` – the active measurement was canceled (user action or constraint).
159
+ - `CONSTRAINT_VIOLATION` – a constraint (e.g., face distance) failed.
160
+ - `PAGE_VISIBILITY_CHANGE` – the page changed visibility (e.g., tab switch or minimize).
161
+ - `PAGE_UNLOADED` – the page is unloading.
162
+
163
+ **Other runtime helpers:**
164
+
165
+ ```typescript
166
+ await measurementApp.cancel(true); // cancel current run
167
+ const logs = await measurementApp.getLogs();
168
+ measurementApp.setTheme('dark');
169
+ measurementApp.setLanguage('es');
170
+ ```
171
+
172
+ **Error codes emitted through `measurementApp.on.error`:**
173
+
174
+ | Code | Meaning |
175
+ | -------------------------- | ----------------------------------------------------------------- |
176
+ | `CAMERA_PERMISSION_DENIED` | Camera access prompt was rejected. |
177
+ | `CAMERA_START_FAILED` | Camera hardware failed to start after permission. |
178
+ | `NO_DEVICES_FOUND` | No video input devices detected during enumeration. |
179
+ | `PAGE_NOT_VISIBLE` | Measurement was running while the tab or window became hidden. |
180
+ | `MEASUREMENT_LOW_SNR` | Signal-to-noise ratio dropped below the acceptable threshold. |
181
+ | `WORKER_ERROR` | SDK worker encountered a fatal processing error. |
182
+ | `PROFILE_INFO_NOT_SET` | Profile bypass stayed enabled, so demographics were not provided. |
183
+ | `COLLECTOR` | Frame collection reported an error |
184
+ | `WEBSOCKET_DISCONNECTED` | Realtime WebSocket connection closed or dropped. |
package/dist/app.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap');
2
+
1
3
  @layer priority1 {
2
4
  @keyframes nuraqng64z-B {
3
5
  0% {
@@ -8,8 +10,8 @@
8
10
  transform: rotate(360deg);
9
11
  }
10
12
  }
11
- }
12
-
13
+ }
14
+
13
15
  @layer priority2 {
14
16
  .nura164fk60 {
15
17
  background: initial;
@@ -82,8 +84,8 @@
82
84
  .nura6rcfto {
83
85
  padding: var(--padding);
84
86
  }
85
- }
86
-
87
+ }
88
+
87
89
  @layer priority3 {
88
90
  .nura196p5u9 {
89
91
  border-bottom: 1px solid #0000;
@@ -121,6 +123,10 @@
121
123
  border-top: 1px solid #ddd;
122
124
  }
123
125
 
126
+ .nura13z6uf9 {
127
+ gap: .5rem;
128
+ }
129
+
124
130
  .nura167g77z {
125
131
  gap: 8px;
126
132
  }
@@ -220,8 +226,8 @@
220
226
  .nura1uvtmcs:focus {
221
227
  outline: none;
222
228
  }
223
- }
224
-
229
+ }
230
+
225
231
  @layer priority4 {
226
232
  .nura1lugfcp {
227
233
  -webkit-appearance: none;
@@ -447,6 +453,10 @@
447
453
  letter-spacing: var(--letterSpacing);
448
454
  }
449
455
 
456
+ .nura1uo3zyz {
457
+ line-height: 1.15;
458
+ }
459
+
450
460
  .nura15bjb6t {
451
461
  line-height: inherit;
452
462
  }
@@ -463,8 +473,8 @@
463
473
  opacity: .5;
464
474
  }
465
475
 
466
- .nura1ks1olk {
467
- opacity: .7;
476
+ .nura197sbye {
477
+ opacity: .6;
468
478
  }
469
479
 
470
480
  .nurag01cxk {
@@ -620,8 +630,8 @@
620
630
  cursor: pointer;
621
631
  }
622
632
 
623
- .nura1spsku0:hover {
624
- filter: brightness(.9);
633
+ .nurakapau0:hover {
634
+ filter: brightness(.95);
625
635
  }
626
636
 
627
637
  .nura1t7rm6y:hover {
@@ -636,13 +646,17 @@
636
646
  transform: scale(1.1);
637
647
  }
638
648
 
649
+ .nura19y0ph4:active {
650
+ filter: brightness(.9);
651
+ }
652
+
639
653
  @media (width <= 768px) {
640
654
  .nura4vx8n7.nura4vx8n7 {
641
655
  align-items: end;
642
656
  }
643
657
  }
644
- }
645
-
658
+ }
659
+
646
660
  @layer priority5 {
647
661
  .nura1szun9y {
648
662
  bottom: 1rem;
@@ -789,8 +803,8 @@
789
803
  padding-bottom: 1rem;
790
804
  }
791
805
  }
792
- }
793
-
806
+ }
807
+
794
808
  @layer priority6 {
795
809
  .nuratb5x6d:before {
796
810
  border-color: var(--1il6zln);
@@ -827,8 +841,8 @@
827
841
  .nuradb2nx::-moz-progress-bar {
828
842
  transition: var(--1nt0dl9);
829
843
  }
830
- }
831
-
844
+ }
845
+
832
846
  @layer priority7 {
833
847
  .nura18j5lt8:after {
834
848
  background-color: var(--15iyedw);
@@ -854,7 +868,7 @@
854
868
  color: var(--bfcyyw);
855
869
  }
856
870
 
857
- .nura1s928wv:after, .nura1cpjm7i:before {
871
+ .nura1cpjm7i:before, .nura1s928wv:after {
858
872
  content: "";
859
873
  }
860
874
 
@@ -874,15 +888,15 @@
874
888
  opacity: 1;
875
889
  }
876
890
 
877
- .nura1j6awrg:after, .nura1hmns74:before {
891
+ .nura1hmns74:before, .nura1j6awrg:after {
878
892
  position: absolute;
879
893
  }
880
894
 
881
895
  .nura7tg5rq:before {
882
896
  transform-origin: 100%;
883
897
  }
884
- }
885
-
898
+ }
899
+
886
900
  @layer priority8 {
887
901
  .nura171sez1:before {
888
902
  border-bottom-left-radius: var(--ucnkut);
@@ -927,8 +941,8 @@
927
941
  .nuragu5zj8:before {
928
942
  width: var(--nzppn4);
929
943
  }
930
- }
931
-
944
+ }
945
+
932
946
  @layer priority1 {
933
947
  :host, .nura1lutyi5 {
934
948
  --nura137mxtf: blur(0);
@@ -999,7 +1013,7 @@
999
1013
  }
1000
1014
 
1001
1015
  :host, .nura8l07yk {
1002
- --nura5ws185: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1016
+ --nura5ws185: "Inter Variable", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1003
1017
  --nura15pxpln: "Source Code Pro", monospace;
1004
1018
  --nuraop3txb: 100;
1005
1019
  --nurav8kkbq: 200;
@@ -1010,12 +1024,12 @@
1010
1024
  --nuraa6i7ec: 700;
1011
1025
  --nuraicucjz: 800;
1012
1026
  --nura1bthghg: 800;
1013
- --nura13kdxmb: -.05em;
1014
- --nurarrpz26: -.05em;
1015
- --nuras6s3bh: -.05em;
1016
- --nura1q7jn1b: -.05em;
1017
- --nuraccq7bu: -.05em;
1018
- --nuracrl1yn: -.05em;
1027
+ --nura13kdxmb: 0;
1028
+ --nurarrpz26: 0;
1029
+ --nuras6s3bh: 0;
1030
+ --nura1q7jn1b: .01em;
1031
+ --nuraccq7bu: .02em;
1032
+ --nuracrl1yn: .04em;
1019
1033
  }
1020
1034
 
1021
1035
  :host, .nura927nu8 {
@@ -1138,7 +1152,7 @@
1138
1152
  }
1139
1153
 
1140
1154
  :host, .nura8l07yk {
1141
- --nura5ws185: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1155
+ --nura5ws185: "Inter Variable", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1142
1156
  --nura15pxpln: "Source Code Pro", monospace;
1143
1157
  --nuraop3txb: 100;
1144
1158
  --nurav8kkbq: 200;
@@ -1149,12 +1163,12 @@
1149
1163
  --nuraa6i7ec: 700;
1150
1164
  --nuraicucjz: 800;
1151
1165
  --nura1bthghg: 800;
1152
- --nura13kdxmb: -.05em;
1153
- --nurarrpz26: -.05em;
1154
- --nuras6s3bh: -.05em;
1155
- --nura1q7jn1b: -.05em;
1156
- --nuraccq7bu: -.05em;
1157
- --nuracrl1yn: -.05em;
1166
+ --nura13kdxmb: 0;
1167
+ --nurarrpz26: 0;
1168
+ --nuras6s3bh: 0;
1169
+ --nura1q7jn1b: .01em;
1170
+ --nuraccq7bu: .02em;
1171
+ --nuracrl1yn: .04em;
1158
1172
  }
1159
1173
 
1160
1174
  :host, .nura927nu8 {
@@ -1207,8 +1221,8 @@
1207
1221
  --nurant3gmo: 72px;
1208
1222
  }
1209
1223
  }
1210
- }
1211
-
1224
+ }
1225
+
1212
1226
  @layer priority1 {
1213
1227
  :host, .nurazc319s {
1214
1228
  --nura15kgmj: #4382fb;
@@ -1309,7 +1323,7 @@
1309
1323
  }
1310
1324
 
1311
1325
  :host, .nuray4fqpn {
1312
- --nurab0d2oh: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1326
+ --nurab0d2oh: "Inter Variable", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1313
1327
  --nura1q6hgg3: "Source Code Pro", monospace;
1314
1328
  --nura1h50opk: 100;
1315
1329
  --nura1mlt2cb: 200;
@@ -1320,12 +1334,12 @@
1320
1334
  --nuralxs4ab: 700;
1321
1335
  --nurao6jd0z: 800;
1322
1336
  --nura1p1d7fs: 800;
1323
- --nura1mhtijf: -.05em;
1324
- --nural0r81e: -.05em;
1325
- --nuraipvt1z: -.05em;
1326
- --nura103k51f: -.05em;
1327
- --nuraz6gym2: -.05em;
1328
- --nurac66gpe: -.05em;
1337
+ --nura1mhtijf: 0;
1338
+ --nural0r81e: 0;
1339
+ --nuraipvt1z: 0;
1340
+ --nura103k51f: .01em;
1341
+ --nuraz6gym2: .02em;
1342
+ --nurac66gpe: .04em;
1329
1343
  }
1330
1344
 
1331
1345
  :host, .nura1du2u5v {
@@ -1448,7 +1462,7 @@
1448
1462
  }
1449
1463
 
1450
1464
  :host, .nuray4fqpn {
1451
- --nurab0d2oh: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1465
+ --nurab0d2oh: "Inter Variable", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1452
1466
  --nura1q6hgg3: "Source Code Pro", monospace;
1453
1467
  --nura1h50opk: 100;
1454
1468
  --nura1mlt2cb: 200;
@@ -1459,12 +1473,12 @@
1459
1473
  --nuralxs4ab: 700;
1460
1474
  --nurao6jd0z: 800;
1461
1475
  --nura1p1d7fs: 800;
1462
- --nura1mhtijf: -.05em;
1463
- --nural0r81e: -.05em;
1464
- --nuraipvt1z: -.05em;
1465
- --nura103k51f: -.05em;
1466
- --nuraz6gym2: -.05em;
1467
- --nurac66gpe: -.05em;
1476
+ --nura1mhtijf: 0;
1477
+ --nural0r81e: 0;
1478
+ --nuraipvt1z: 0;
1479
+ --nura103k51f: .01em;
1480
+ --nuraz6gym2: .02em;
1481
+ --nurac66gpe: .04em;
1468
1482
  }
1469
1483
 
1470
1484
  :host, .nura1du2u5v {