@swr-data-lab/components 1.13.3 → 1.13.5

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.
@@ -34,70 +34,70 @@ let { project, charts, baseUrl } = $props();
34
34
  </div>
35
35
  </main>
36
36
 
37
- <style>
38
- :global(*) {
39
- margin: 0;
40
- padding: 0;
41
- box-sizing: border-box;
42
- color: inherit;
43
- }
44
- main {
45
- display: flex;
46
- justify-content: center;
47
- align-items: center;
48
- flex-flow: column;
49
- font-family: var(--swr-sans);
50
- font-size: var(--fs-small-1);
51
- max-width: 60rem;
52
- margin: 0 auto;
53
- }
54
- .inner {
55
- width: 100%;
56
- border: 1px solid rgb(0, 0, 0);
57
- }
58
- h1 {
59
- font-size: var(--fs-small-1);
60
- width: 100%;
61
- border-bottom: 1px solid black;
62
- padding-bottom: 0.2em;
63
- background-color: rgb(233, 238, 245);
64
- }
65
- table {
66
- border-collapse: collapse;
67
- border-spacing: 0;
68
- width: 100%;
69
- }
70
- a {
71
- display: block;
72
- text-decoration: none;
73
- }
74
- th,
75
- td,
76
- h1 {
77
- padding: 0.2em 0.4em;
78
- text-align: left;
79
- }
80
- th {
81
- border-bottom: 1px solid black;
82
- }
83
- tr {
84
- border-bottom: 1px solid black;
85
- &:last-child {
86
- border-bottom: 0;
87
- }
88
- }
37
+ <style>main {
38
+ display: flex;
39
+ justify-content: center;
40
+ align-items: center;
41
+ flex-flow: column;
42
+ font-family: var(--swr-sans);
43
+ font-size: var(--fs-small-1);
44
+ max-width: 60rem;
45
+ margin: 0 auto;
46
+ }
89
47
 
90
- input {
91
- display: block;
92
- width: 100%;
93
- padding: 0.1em 0.3em;
94
- }
48
+ .inner {
49
+ width: 100%;
50
+ border: 1px solid rgb(0, 0, 0);
51
+ }
95
52
 
96
- a:hover,
97
- a:focus-visible {
98
- text-decoration: underline;
99
- }
100
- a:last-child {
101
- border-bottom: 0;
102
- }
103
- </style>
53
+ h1 {
54
+ font-size: var(--fs-small-1);
55
+ width: 100%;
56
+ border-bottom: 1px solid black;
57
+ padding-bottom: 0.2em;
58
+ background-color: rgb(233, 238, 245);
59
+ }
60
+
61
+ table {
62
+ border-collapse: collapse;
63
+ border-spacing: 0;
64
+ width: 100%;
65
+ }
66
+
67
+ a {
68
+ display: block;
69
+ text-decoration: none;
70
+ }
71
+
72
+ th,
73
+ td,
74
+ h1 {
75
+ padding: 0.2em 0.4em;
76
+ text-align: left;
77
+ }
78
+
79
+ th {
80
+ border-bottom: 1px solid black;
81
+ }
82
+
83
+ tr {
84
+ border-bottom: 1px solid black;
85
+ }
86
+ tr:last-child {
87
+ border-bottom: 0;
88
+ }
89
+
90
+ input {
91
+ display: block;
92
+ width: 100%;
93
+ padding: 0.1em 0.3em;
94
+ }
95
+
96
+ a:hover,
97
+ a:focus-visible {
98
+ text-decoration: underline;
99
+ }
100
+
101
+ a:last-child {
102
+ border-bottom: 0;
103
+ }</style>
@@ -11,5 +11,24 @@ const { position = 'bottom-right', customAttribution } = $props();
11
11
  })}
12
12
  />
13
13
 
14
- <style>
15
- </style>
14
+ <style>:global(.maplibregl-ctrl.maplibregl-ctrl-attrib) {
15
+ font-size: var(--fs-small-3);
16
+ letter-spacing: 0.005em;
17
+ word-spacing: 0.005em;
18
+ font-family: var(--swr-sans);
19
+ }
20
+ :global(.maplibregl-ctrl-attrib.maplibregl-compact-show) :global(.maplibregl-ctrl-attrib-inner) {
21
+ display: block;
22
+ }
23
+ :global(.maplibregl-ctrl-attrib-button) {
24
+ display: none;
25
+ }
26
+ :global(.maplibregl-ctrl-attrib) :global(a) {
27
+ color: inherit;
28
+ text-decoration: none;
29
+ text-underline-offset: 0.2em;
30
+ }
31
+ :global(.maplibregl-ctrl-attrib) :global(a:hover) {
32
+ color: inherit;
33
+ text-decoration: underline;
34
+ }</style>
@@ -21,5 +21,135 @@ const geocoder = new MaplibreGeocoder(geocoderAPI, {
21
21
 
22
22
  <MapControl control={geocoder} position="top-left" />
23
23
 
24
- <style>
25
- </style>
24
+ <style>:global(.maplibregl-ctrl-geocoder) {
25
+ background-color: #fff;
26
+ position: relative;
27
+ width: 100%;
28
+ z-index: 1;
29
+ font-family: var(--swr-sans);
30
+ font-size: var(--fs-small-1);
31
+ border-radius: var(--br-small);
32
+ border: 1px solid rgba(0, 0, 0, 0.75);
33
+ box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.075);
34
+ }
35
+ :global(.maplibre-gl-geocoder--error) {
36
+ font-size: var(--fs-small-2);
37
+ color: var(--gray-dark-2);
38
+ padding: 0.4em 0.65em;
39
+ }
40
+ :global(.maplibregl-ctrl-geocoder--input) {
41
+ width: 100%;
42
+ height: 100%;
43
+ font-family: inherit;
44
+ font-size: inherit;
45
+ background-color: transparent;
46
+ color: var(--gray-dark-5);
47
+ border: 0;
48
+ height: 1.85em;
49
+ padding: 0 1.85em;
50
+ padding-top: 0.1em;
51
+ text-overflow: ellipsis;
52
+ white-space: nowrap;
53
+ overflow: hidden;
54
+ }
55
+ :global(.maplibregl-ctrl-geocoder--input::placeholder) {
56
+ opacity: 1;
57
+ color: var(--gray-dark-2);
58
+ }
59
+ :global(.maplibregl-ctrl-geocoder--input:focus) {
60
+ color: var(--gray-dark-5);
61
+ outline: 0;
62
+ }
63
+ :global(.maplibregl-ctrl-geocoder) :global(.maplibregl-ctrl-geocoder--pin-right) > :global(*) {
64
+ display: none;
65
+ position: absolute;
66
+ z-index: 2;
67
+ right: 0.5em;
68
+ top: 50%;
69
+ transform: translateY(-50%);
70
+ border: 0;
71
+ }
72
+ :global(.maplibregl-ctrl-geocoder) :global(.suggestions) {
73
+ background: white;
74
+ border: 1px solid rgba(0, 0, 0, 0.75);
75
+ box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1);
76
+ border-radius: var(--br-small);
77
+ left: 0;
78
+ list-style: none;
79
+ position: absolute;
80
+ width: 100%;
81
+ top: calc(100% + 0.5em);
82
+ z-index: 1000;
83
+ overflow: hidden;
84
+ }
85
+ :global(.maplibregl-ctrl-bottom-left) :global(.suggestions),
86
+ :global(.maplibregl-ctrl-bottom-right) :global(.suggestions) {
87
+ top: auto;
88
+ bottom: 100%;
89
+ }
90
+ :global(.maplibregl-ctrl-geocoder) :global(.suggestions) > :global(li) > :global(a) {
91
+ cursor: default;
92
+ display: block;
93
+ padding: 0.5em 0.75em;
94
+ color: var(--gray-dark-5);
95
+ padding-bottom: 0.5em;
96
+ border-bottom: 1px solid var(--gray-light-3);
97
+ }
98
+ :global(.maplibregl-ctrl-geocoder) :global(.suggestions) > :global(li:last-child) > :global(a) {
99
+ border-bottom: 0;
100
+ }
101
+ :global(.maplibregl-ctrl-geocoder) :global(.suggestions) > :global(.active) > :global(a),
102
+ :global(.maplibregl-ctrl-geocoder) :global(.suggestions) > :global(li) > :global(a:hover) {
103
+ background: var(--gray-light-5);
104
+ text-decoration: none;
105
+ cursor: pointer;
106
+ }
107
+ :global(.maplibregl-ctrl-geocoder) :global(.suggestions) > :global(.active) :global(.maplibregl-ctrl-geocoder--result-title),
108
+ :global(.maplibregl-ctrl-geocoder) :global(.suggestions) > :global(li) > :global(a:hover) :global(.maplibregl-ctrl-geocoder--result-title) {
109
+ text-decoration: underline;
110
+ }
111
+ :global(.maplibregl-ctrl-geocoder--suggestion) {
112
+ display: flex;
113
+ flex-direction: row;
114
+ align-items: center;
115
+ }
116
+ :global(.maplibregl-ctrl-geocoder--suggestion-info) {
117
+ display: flex;
118
+ flex-direction: column;
119
+ }
120
+ :global(.maplibregl-ctrl-geocoder--suggestion-match) {
121
+ font-weight: bold;
122
+ }
123
+ :global(.maplibregl-ctrl-geocoder--suggestion-title),
124
+ :global(.maplibregl-ctrl-geocoder--suggestion-address),
125
+ :global(.maplibregl-ctrl-geocoder--result-address) {
126
+ text-overflow: ellipsis;
127
+ overflow: hidden;
128
+ white-space: nowrap;
129
+ }
130
+ :global(.maplibregl-ctrl-geocoder--result-icon) {
131
+ display: none;
132
+ }
133
+ :global(.maplibregl-ctrl-geocoder--result-title) {
134
+ font-weight: 600;
135
+ letter-spacing: 0;
136
+ }
137
+ :global(.maplibregl-ctrl-geocoder--result-address) {
138
+ font-size: var(--fs-small-2);
139
+ color: var(--gray-dark-2);
140
+ line-height: 1.3;
141
+ }
142
+ :global(.maplibregl-ctrl-geocoder--icon) {
143
+ display: inline-block;
144
+ position: absolute;
145
+ top: 50%;
146
+ transform: translateY(-50%);
147
+ height: 1em;
148
+ }
149
+ :global(.maplibregl-ctrl-geocoder--icon-close) {
150
+ right: 0;
151
+ }
152
+ :global(.maplibregl-ctrl-geocoder--icon-search) {
153
+ left: 0.5em;
154
+ height: 1.5em;
155
+ }</style>
@@ -72,20 +72,146 @@ $effect(() => {
72
72
  {/if}
73
73
  </div>
74
74
 
75
- <style>
76
- .container {
77
- width: 100%;
78
- height: 100%;
79
- }
75
+ <style>.container {
76
+ width: 100%;
77
+ height: 100%;
78
+ }
79
+
80
+ .debug {
81
+ position: absolute;
82
+ top: 0;
83
+ right: 0;
84
+ background: rgba(0, 0, 0, 0.9);
85
+ color: white;
86
+ z-index: 1000;
87
+ padding: 2px;
88
+ font-family: monospace;
89
+ }
80
90
 
81
- .debug {
82
- position: absolute;
83
- top: 0;
84
- right: 0;
85
- background: rgba(0, 0, 0, 0.9);
86
- color: white;
87
- z-index: 1000;
88
- padding: 2px;
89
- font-family: monospace;
90
- }
91
- </style>
91
+ :global(.maplibregl-map) {
92
+ overflow: hidden;
93
+ position: relative;
94
+ }
95
+ :global(.maplibregl-canvas) {
96
+ left: 0;
97
+ position: absolute;
98
+ top: 0;
99
+ }
100
+ :global(.maplibregl-map:fullscreen) {
101
+ height: 100%;
102
+ width: 100%;
103
+ }
104
+ :global(.maplibregl-canvas-container.maplibregl-interactive) {
105
+ cursor: grab;
106
+ user-select: none;
107
+ }
108
+ :global(.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer) {
109
+ cursor: pointer;
110
+ }
111
+ :global(.maplibregl-canvas-container.maplibregl-interactive:active) {
112
+ cursor: grabbing;
113
+ }
114
+ :global(.maplibregl-canvas-container.maplibregl-touch-zoom-rotate),
115
+ :global(.maplibregl-canvas-container.maplibregl-touch-zoom-rotate) :global(.maplibregl-canvas) {
116
+ touch-action: pan-x pan-y;
117
+ }
118
+ :global(.maplibregl-canvas-container.maplibregl-touch-drag-pan),
119
+ :global(.maplibregl-canvas-container.maplibregl-touch-drag-pan) :global(.maplibregl-canvas) {
120
+ touch-action: pinch-zoom;
121
+ }
122
+ :global(.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan),
123
+ :global(.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan) :global(.maplibregl-canvas) {
124
+ touch-action: none;
125
+ }
126
+ :global(.maplibregl-ctrl-bottom-left),
127
+ :global(.maplibregl-ctrl-bottom-right),
128
+ :global(.maplibregl-ctrl-top-left),
129
+ :global(.maplibregl-ctrl-top-right) {
130
+ position: absolute;
131
+ z-index: 2;
132
+ display: flex;
133
+ flex-flow: column;
134
+ gap: 0.75em;
135
+ align-items: flex-start;
136
+ }
137
+ :global(.maplibregl-ctrl-top-left) {
138
+ left: 0.5em;
139
+ top: 0.5em;
140
+ }
141
+ :global(.maplibregl-ctrl-top-right) {
142
+ right: 0;
143
+ top: 0;
144
+ }
145
+ :global(.maplibregl-ctrl-bottom-left) {
146
+ bottom: 0.5em;
147
+ left: 0.5em;
148
+ }
149
+ :global(.maplibregl-ctrl-bottom-right) {
150
+ bottom: 0.5em;
151
+ right: 0.5em;
152
+ }
153
+ :global(.maplibregl-ctrl) {
154
+ pointer-events: auto;
155
+ transform: translate(0);
156
+ }
157
+ :global(.maplibregl-ctrl-group) {
158
+ background: white;
159
+ border: 1px solid rgba(0, 0, 0, 0.75);
160
+ box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.075);
161
+ border-radius: var(--br-small);
162
+ overflow: hidden;
163
+ }
164
+ :global(.maplibregl-ctrl-group) :global(button) {
165
+ background-color: transparent;
166
+ border: 0;
167
+ box-sizing: border-box;
168
+ cursor: pointer;
169
+ display: block;
170
+ height: 29px;
171
+ outline: none;
172
+ padding: 0;
173
+ width: 29px;
174
+ }
175
+ :global(.maplibregl-ctrl-group) :global(button) + :global(button) {
176
+ border-top: 1px solid rgba(0, 0, 0, 0.35);
177
+ }
178
+ :global(.maplibregl-ctrl) :global(button) :global(.maplibregl-ctrl-icon) {
179
+ background-position: 50%;
180
+ background-repeat: no-repeat;
181
+ display: block;
182
+ height: 100%;
183
+ width: 100%;
184
+ }
185
+ :global(.maplibregl-ctrl) :global(button:disabled) {
186
+ cursor: not-allowed;
187
+ }
188
+ :global(.maplibregl-ctrl) :global(button:disabled) :global(.maplibregl-ctrl-icon) {
189
+ opacity: 0.5;
190
+ }
191
+ :global(.maplibregl-ctrl) :global(button:not(:disabled):hover) {
192
+ background-color: var(--gray-light-5);
193
+ }
194
+ :global(.maplibregl-ctrl-group) :global(button:focus:focus-visible) {
195
+ box-shadow: 0 0 2px 2px #0096ff;
196
+ }
197
+ :global(.maplibregl-ctrl-group) :global(button:focus:not(:focus-visible)) {
198
+ box-shadow: none;
199
+ }
200
+ :global(.maplibregl-ctrl-group) :global(button:focus:first-child) {
201
+ border-radius: 4px 4px 0 0;
202
+ }
203
+ :global(.maplibregl-ctrl-group) :global(button:focus:last-child) {
204
+ border-radius: 0 0 4px 4px;
205
+ }
206
+ :global(.maplibregl-ctrl-group) :global(button:focus:only-child) {
207
+ border-radius: inherit;
208
+ }
209
+ :global(.maplibregl-marker) {
210
+ left: 0;
211
+ top: 0;
212
+ position: absolute;
213
+ will-change: transform;
214
+ }
215
+ :global(.maplibregl-marker) :global(path) {
216
+ fill: var(--violet-dark-5);
217
+ }</style>
@@ -5,5 +5,12 @@ const { showCompass = false, visualizePitch = false, position = 'bottom-left' }
5
5
 
6
6
  <MapControl control={new maplibre.NavigationControl({ showCompass, visualizePitch })} {position} />
7
7
 
8
- <style>
9
- </style>
8
+ <style>:global(button.maplibregl-ctrl-zoom-out) :global(.maplibregl-ctrl-icon) {
9
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E");
10
+ }
11
+ :global(button.maplibregl-ctrl-zoom-in) :global(.maplibregl-ctrl-icon) {
12
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E");
13
+ }
14
+ :global(button.maplibregl-ctrl-compass) :global(.maplibregl-ctrl-icon) {
15
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath d='m10.5 16 4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E");
16
+ }</style>
@@ -5,5 +5,10 @@ let { maxWidth = 100, unit = 'metric', position = 'bottom-left' } = $props();
5
5
 
6
6
  <MapControl control={new maplibre.ScaleControl({ maxWidth, unit })} {position} />
7
7
 
8
- <style>
9
- </style>
8
+ <style>:global(.maplibregl-ctrl-scale) {
9
+ color: inherit;
10
+ border-bottom: 1px solid currentColor;
11
+ font-weight: 400;
12
+ font-size: var(--fs-small-3);
13
+ font-family: var(--swr-text);
14
+ }</style>
@@ -29,18 +29,100 @@ onDestroy(() => tooltip.remove());
29
29
  {@render children?.()}
30
30
  </div>
31
31
 
32
- <style>
33
- .container {
34
- background: white;
35
- padding: 0.75em;
36
- border-radius: 2px;
37
- border: 1px solid rgba(0, 0, 0, 0.75);
38
- border-radius: var(--br-small);
39
- filter: drop-shadow(2px 2px 2px rgba(0, 0, 0, 0.1));
40
- pointer-events: none;
41
- }
32
+ <style>.container {
33
+ background: white;
34
+ padding: 0.75em;
35
+ border-radius: 2px;
36
+ border: 1px solid rgba(0, 0, 0, 0.75);
37
+ border-radius: var(--br-small);
38
+ filter: drop-shadow(2px 2px 2px rgba(0, 0, 0, 0.1));
39
+ pointer-events: none;
40
+ }
42
41
 
43
- .mouseEvents {
44
- pointer-events: all;
45
- }
46
- </style>
42
+ .mouseEvents {
43
+ pointer-events: all;
44
+ }
45
+
46
+ :global(.maplibregl-popup) {
47
+ top: 0;
48
+ left: 0;
49
+ display: flex;
50
+ position: absolute;
51
+ will-change: transform;
52
+ }
53
+ :global(.maplibregl-popup-anchor-top),
54
+ :global(.maplibregl-popup-anchor-top-left),
55
+ :global(.maplibregl-popup-anchor-top-right) {
56
+ flex-direction: column;
57
+ }
58
+ :global(.maplibregl-popup-anchor-bottom),
59
+ :global(.maplibregl-popup-anchor-bottom-left),
60
+ :global(.maplibregl-popup-anchor-bottom-right) {
61
+ flex-direction: column-reverse;
62
+ }
63
+ :global(.maplibregl-popup-anchor-left) {
64
+ flex-direction: row;
65
+ }
66
+ :global(.maplibregl-popup-anchor-right) {
67
+ flex-direction: row-reverse;
68
+ }
69
+ :global(.maplibregl-popup-anchor-bottom) :global(.maplibregl-popup-tip) {
70
+ transform: translateY(50%) rotate(45deg);
71
+ align-self: center;
72
+ }
73
+ :global(.maplibregl-popup-anchor-top) :global(.maplibregl-popup-tip) {
74
+ transform: translateY(-50%) rotate(-135deg);
75
+ align-self: center;
76
+ }
77
+ :global(.maplibregl-popup-anchor-left) :global(.maplibregl-popup-tip) {
78
+ transform: translateX(-50%) rotate(135deg);
79
+ align-self: center;
80
+ }
81
+ :global(.maplibregl-popup-anchor-top-left) :global(.maplibregl-popup-tip) {
82
+ transform: translateY(1em) translateX(-50%) rotate(135deg);
83
+ }
84
+ :global(.maplibregl-popup-anchor-bottom-left) :global(.maplibregl-popup-tip) {
85
+ transform: translateY(-1em) translateX(-50%) rotate(135deg);
86
+ }
87
+ :global(.maplibregl-popup-anchor-right) :global(.maplibregl-popup-tip) {
88
+ transform: translateX(50%) rotate(-45deg);
89
+ align-self: center;
90
+ }
91
+ :global(.maplibregl-popup-anchor-top-right) :global(.maplibregl-popup-tip) {
92
+ transform: translateX(-1em) translateY(-50%) rotate(-135deg);
93
+ align-self: flex-end;
94
+ }
95
+ :global(.maplibregl-popup-anchor-bottom-right) :global(.maplibregl-popup-tip) {
96
+ transform: translateX(-1em) translateY(50%) rotate(45deg);
97
+ align-self: flex-end;
98
+ }
99
+ :global(.maplibregl-popup-close-button) {
100
+ position: absolute;
101
+ top: 0.5em;
102
+ right: 0.5em;
103
+ cursor: pointer;
104
+ border-radius: 2px;
105
+ display: flex;
106
+ justify-content: center;
107
+ align-items: center;
108
+ padding-bottom: 0.15em;
109
+ font-size: 1.25rem;
110
+ width: 1.1em;
111
+ height: 1.1em;
112
+ z-index: 100;
113
+ background: white;
114
+ border: 1px solid var(--gray-dark-5);
115
+ }
116
+ :global(.maplibregl-popup-close-button:hover),
117
+ :global(.maplibregl-popup-close-button:focus) {
118
+ background: var(--gray-light-5);
119
+ }
120
+ :global(.maplibregl-popup-tip) {
121
+ width: 0.65rem;
122
+ height: 0.65rem;
123
+ background: white;
124
+ position: absolute;
125
+ border-right: 1px solid rgba(0, 0, 0, 0.75);
126
+ border-bottom: 1px solid rgba(0, 0, 0, 0.75);
127
+ z-index: 10;
128
+ }</style>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@swr-data-lab/components",
3
3
  "description": "SWR Data Lab component library",
4
- "version": "1.13.3",
4
+ "version": "1.13.5",
5
5
  "author": "SWR Data Lab",
6
6
  "license": "UNLICENSED",
7
7
  "type": "module",