@xsynaptic/sonic-ui 0.18.0 → 0.19.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 (102) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +12 -2
  3. package/dist/default/elements/button.js +0 -5
  4. package/dist/default/elements/dial.js +0 -7
  5. package/dist/default/elements/display-element.js +0 -5
  6. package/dist/default/elements/envelope.js +0 -6
  7. package/dist/default/elements/meter.js +0 -1
  8. package/dist/default/elements/number.js +0 -7
  9. package/dist/default/elements/segmented.js +0 -5
  10. package/dist/default/elements/slider.js +0 -7
  11. package/dist/default/elements/sonic-element.js +3 -1
  12. package/dist/default/elements/switch.js +0 -1
  13. package/dist/default/elements/toggle.js +0 -5
  14. package/dist/default/elements/value-element.js +8 -4
  15. package/dist/default/elements/wave-element.js +7 -8
  16. package/dist/default/elements/xy.js +0 -7
  17. package/dist/default/index.js +2 -1
  18. package/dist/default/lib/clock.js +23 -0
  19. package/dist/default/lib/spoken-duration.js +30 -0
  20. package/dist/default/lib/waveform-buckets.js +7 -1
  21. package/dist/dev/elements/button.js +12 -5
  22. package/dist/dev/elements/button.js.map +1 -1
  23. package/dist/dev/elements/dial.js +14 -7
  24. package/dist/dev/elements/dial.js.map +1 -1
  25. package/dist/dev/elements/display-element.js +2 -2
  26. package/dist/dev/elements/display-element.js.map +1 -1
  27. package/dist/dev/elements/envelope.js +17 -6
  28. package/dist/dev/elements/envelope.js.map +1 -1
  29. package/dist/dev/elements/meter.js +1 -1
  30. package/dist/dev/elements/meter.js.map +1 -1
  31. package/dist/dev/elements/number.js +13 -7
  32. package/dist/dev/elements/number.js.map +1 -1
  33. package/dist/dev/elements/segmented.js +12 -5
  34. package/dist/dev/elements/segmented.js.map +1 -1
  35. package/dist/dev/elements/slider.js +14 -7
  36. package/dist/dev/elements/slider.js.map +1 -1
  37. package/dist/dev/elements/sonic-element.d.ts +13 -2
  38. package/dist/dev/elements/sonic-element.js +63 -11
  39. package/dist/dev/elements/sonic-element.js.map +1 -1
  40. package/dist/dev/elements/split.js.map +1 -1
  41. package/dist/dev/elements/switch.js +7 -1
  42. package/dist/dev/elements/switch.js.map +1 -1
  43. package/dist/dev/elements/toggle.js +12 -5
  44. package/dist/dev/elements/toggle.js.map +1 -1
  45. package/dist/dev/elements/value-element.d.ts +6 -0
  46. package/dist/dev/elements/value-element.js +8 -4
  47. package/dist/dev/elements/value-element.js.map +1 -1
  48. package/dist/dev/elements/wave-element.d.ts +2 -1
  49. package/dist/dev/elements/wave-element.js +21 -8
  50. package/dist/dev/elements/wave-element.js.map +1 -1
  51. package/dist/dev/elements/waveform.d.ts +1 -1
  52. package/dist/dev/elements/xy.js +14 -7
  53. package/dist/dev/elements/xy.js.map +1 -1
  54. package/dist/dev/index.d.ts +3 -2
  55. package/dist/dev/index.js +2 -1
  56. package/dist/dev/lib/clock.d.ts +5 -0
  57. package/dist/dev/lib/clock.js +24 -0
  58. package/dist/dev/lib/clock.js.map +1 -0
  59. package/dist/dev/lib/mirror-children.js.map +1 -1
  60. package/dist/dev/lib/owned-control.js.map +1 -1
  61. package/dist/dev/lib/spoken-duration.js +31 -0
  62. package/dist/dev/lib/spoken-duration.js.map +1 -0
  63. package/dist/dev/lib/waveform-buckets.d.ts +2 -2
  64. package/dist/dev/lib/waveform-buckets.js +7 -1
  65. package/dist/dev/lib/waveform-buckets.js.map +1 -1
  66. package/dist/skins/amber.css +1 -0
  67. package/dist/skins/ivory.css +1 -0
  68. package/dist/skins/lime.css +1 -0
  69. package/dist/skins/slate.css +1 -0
  70. package/dist/styles/button.css +29 -5
  71. package/dist/styles/dial.css +10 -9
  72. package/dist/styles/envelope.css +10 -4
  73. package/dist/styles/led.css +5 -1
  74. package/dist/styles/material/arc.css +3 -2
  75. package/dist/styles/material/bracket.css +2 -2
  76. package/dist/styles/material/cap.css +33 -12
  77. package/dist/styles/material/core.css +4 -0
  78. package/dist/styles/material/glass.css +1 -1
  79. package/dist/styles/material/groove.css +4 -3
  80. package/dist/styles/material/keycap.css +3 -2
  81. package/dist/styles/material/lens.css +1 -1
  82. package/dist/styles/material/pane.css +5 -4
  83. package/dist/styles/material/readout.css +6 -6
  84. package/dist/styles/material/well.css +2 -2
  85. package/dist/styles/meter.css +2 -7
  86. package/dist/styles/number.css +5 -1
  87. package/dist/styles/panel.css +4 -3
  88. package/dist/styles/ring.css +1 -1
  89. package/dist/styles/screen.css +5 -1
  90. package/dist/styles/segmented.css +17 -4
  91. package/dist/styles/slider.css +9 -3
  92. package/dist/styles/spectrum.css +16 -3
  93. package/dist/styles/switch.css +35 -10
  94. package/dist/styles/toggle.css +14 -7
  95. package/dist/styles/waveform.css +15 -4
  96. package/dist/styles/wavestrip.css +11 -3
  97. package/dist/styles/xy.css +9 -5
  98. package/package.json +1 -6
  99. package/dist/default/dat.js +0 -52
  100. package/dist/dev/dat.d.ts +0 -20
  101. package/dist/dev/dat.js +0 -53
  102. package/dist/dev/dat.js.map +0 -1
@@ -92,7 +92,7 @@
92
92
 
93
93
  .sonic-waveform {
94
94
  --_sonic-waveform-inset: calc(
95
- var(--_sonic-waveform-size) * var(--sonic-waveform-inset-ratio, 0.06)
95
+ var(--_sonic-waveform-size) * var(--sonic-waveform-inset-ratio, 0)
96
96
  );
97
97
  --_sonic-unit: calc(var(--_sonic-waveform-size) / 48);
98
98
  --_sonic-glass-depth: var(--sonic-glass-depth, calc(0.6 * var(--_sonic-relief)));
@@ -104,7 +104,11 @@
104
104
  --_sonic-waveform-wave: var(--_sonic-waveform-lit);
105
105
  --_sonic-waveform-wave-edge: var(
106
106
  --sonic-waveform-edge,
107
- color-mix(in oklab, var(--_sonic-waveform-lit) calc(100% - 55% * var(--_sonic-relief)), #000)
107
+ color-mix(
108
+ in oklab,
109
+ var(--_sonic-waveform-lit) calc(100% - 55% * var(--_sonic-relief)),
110
+ var(--_sonic-shade)
111
+ )
108
112
  );
109
113
  --_sonic-waveform-grid: var(--sonic-waveform-grid, var(--_sonic-etch));
110
114
  --_sonic-waveform-ends: var(--sonic-waveform-ends, var(--_sonic-etch));
@@ -135,8 +139,15 @@
135
139
  touch-action: var(--sonic-touch-action, pan-y);
136
140
  cursor: grab;
137
141
 
138
- --_sonic-glass-radius: calc(
139
- var(--_sonic-waveform-size) * var(--sonic-waveform-radius-ratio, 0.08)
142
+ --_sonic-waveform-radius-own: calc(
143
+ var(--_sonic-waveform-size) * var(--sonic-waveform-radius-ratio)
144
+ );
145
+ --_sonic-glass-radius: var(
146
+ --_sonic-waveform-radius-own,
147
+ var(
148
+ --sonic-radius,
149
+ calc(var(--_sonic-waveform-size) * var(--sonic-waveform-radius-ratio, 0.08))
150
+ )
140
151
  );
141
152
 
142
153
  border-radius: var(--_sonic-glass-radius);
@@ -111,7 +111,7 @@
111
111
  --_sonic-wavestrip-groove-size: var(--sonic-wavestrip-groove-size, 0px);
112
112
  --_sonic-wavestrip-marker-ratio: var(--sonic-wavestrip-marker-ratio, 0.065);
113
113
  --_sonic-wavestrip-inset: calc(
114
- var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-inset-ratio, 0.1)
114
+ var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-inset-ratio, 0)
115
115
  );
116
116
  --_sonic-unit: calc(var(--_sonic-wavestrip-size) / 32);
117
117
  --_sonic-wavestrip-lit: var(--_sonic-lit);
@@ -143,8 +143,15 @@
143
143
  touch-action: var(--sonic-touch-action, pan-y);
144
144
  cursor: ew-resize;
145
145
 
146
- --_sonic-glass-radius: calc(
147
- var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-radius-ratio, 0.15)
146
+ --_sonic-wavestrip-radius-own: calc(
147
+ var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-radius-ratio)
148
+ );
149
+ --_sonic-glass-radius: var(
150
+ --_sonic-wavestrip-radius-own,
151
+ var(
152
+ --sonic-radius,
153
+ calc(var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-radius-ratio, 0.15))
154
+ )
148
155
  );
149
156
 
150
157
  border-radius: var(--_sonic-glass-radius);
@@ -170,6 +177,7 @@
170
177
  display: block;
171
178
  inline-size: 100%;
172
179
  block-size: 100%;
180
+ border-radius: max(0px, var(--_sonic-glass-radius) - var(--_sonic-wavestrip-inset));
173
181
  }
174
182
 
175
183
  .sonic-wavestrip-markers {
@@ -41,7 +41,11 @@
41
41
  touch-action: none;
42
42
  cursor: crosshair;
43
43
 
44
- --_sonic-glass-radius: calc(var(--_sonic-xy-size) * var(--_sonic-xy-radius-ratio));
44
+ --_sonic-xy-radius-own: calc(var(--_sonic-xy-size) * var(--sonic-xy-radius-ratio));
45
+ --_sonic-glass-radius: var(
46
+ --_sonic-xy-radius-own,
47
+ var(--sonic-radius, calc(var(--_sonic-xy-size) * var(--_sonic-xy-radius-ratio)))
48
+ );
45
49
 
46
50
  border-radius: var(--_sonic-glass-radius);
47
51
  }
@@ -144,7 +148,7 @@
144
148
 
145
149
  cursor: var(--_sonic-xy-cursor);
146
150
  filter: drop-shadow(0 0 calc(0.15 * var(--_sonic-xy-puck)) var(--_sonic-xy-puck-glow));
147
- transition: filter 120ms ease-out;
151
+ transition: filter var(--_sonic-fade-duration) ease-out;
148
152
 
149
153
  &::before {
150
154
  position: absolute;
@@ -156,9 +160,9 @@
156
160
  border-radius: 50%;
157
161
  box-shadow: var(--_sonic-xy-puck-ring);
158
162
  transition:
159
- background-color 120ms ease-out,
160
- border-color 120ms ease-out,
161
- box-shadow 120ms ease-out;
163
+ background-color var(--_sonic-fade-duration) ease-out,
164
+ border-color var(--_sonic-fade-duration) ease-out,
165
+ box-shadow var(--_sonic-fade-duration) ease-out;
162
166
  }
163
167
  }
164
168
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsynaptic/sonic-ui",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "description": "Native custom elements for audio interfaces, skinned with CSS custom properties",
5
5
  "keywords": [
6
6
  "custom-elements",
@@ -38,11 +38,6 @@
38
38
  "development": "./dist/dev/index.js",
39
39
  "import": "./dist/default/index.js"
40
40
  },
41
- "./dat": {
42
- "types": "./dist/dev/dat.d.ts",
43
- "development": "./dist/dev/dat.js",
44
- "import": "./dist/default/dat.js"
45
- },
46
41
  "./define": {
47
42
  "types": "./dist/dev/define.d.ts",
48
43
  "development": "./dist/dev/define.js",
@@ -1,52 +0,0 @@
1
- import { clamp } from "./lib/math.js";
2
-
3
- //#region src/dat.ts
4
- function readVersion(view) {
5
- const version = view.getInt32(0, true);
6
- if (version === 1 || version === 2) return version;
7
- throw new Error(`A .dat file of version ${String(version)} is not one this reads`);
8
- }
9
- function readDatHeader(buffer) {
10
- if (buffer.byteLength < 20) throw new Error("A .dat header takes at least 20 bytes");
11
- const view = new DataView(buffer);
12
- const version = readVersion(view);
13
- const dataOffset = version === 1 ? 20 : 24;
14
- if (buffer.byteLength < dataOffset) throw new Error(`A version ${String(version)} .dat header takes ${String(dataOffset)} bytes`);
15
- const channels = version === 1 ? 1 : view.getInt32(20, true);
16
- if (channels < 1) throw new Error("A .dat header names no channels");
17
- const sampleRate = view.getInt32(8, true);
18
- const samplesPerPixel = view.getInt32(12, true);
19
- if (samplesPerPixel < 1) throw new Error("A .dat header names no samples per pixel");
20
- return {
21
- bits: (view.getUint32(4, true) & 1) === 1 ? 8 : 16,
22
- channels,
23
- dataOffset,
24
- pairs: view.getUint32(16, true),
25
- pairsPerSecond: sampleRate / samplesPerPixel,
26
- sampleRate,
27
- samplesPerPixel,
28
- version
29
- };
30
- }
31
- /** An inclusive byte range for a `Range` header; `undefined` when the pairs asked for are empty */
32
- function datByteRange(header, fromPair, toPair) {
33
- const from = clamp(Math.floor(fromPair), 0, header.pairs);
34
- const to = clamp(Math.ceil(toPair), from, header.pairs);
35
- if (!(to > from)) return void 0;
36
- const pairBytes = header.channels * 2 * header.bits / 8;
37
- return [header.dataOffset + from * pairBytes, header.dataOffset + to * pairBytes - 1];
38
- }
39
- function readDatSamples(header, body, byteOffset = 0) {
40
- return header.bits === 8 ? new Int8Array(body, byteOffset) : new Int16Array(body, byteOffset, Math.floor((body.byteLength - byteOffset) / 2));
41
- }
42
- function readDatPeaks(header, body, byteOffset = 0) {
43
- return {
44
- channels: header.channels,
45
- fullScale: header.bits === 8 ? 128 : 32768,
46
- pairsPerSecond: header.pairsPerSecond,
47
- samples: readDatSamples(header, body, byteOffset)
48
- };
49
- }
50
-
51
- //#endregion
52
- export { datByteRange, readDatHeader, readDatPeaks, readDatSamples };
package/dist/dev/dat.d.ts DELETED
@@ -1,20 +0,0 @@
1
- import { WaveformPeaks } from "./lib/waveform-buckets.js";
2
- //#region src/dat.d.ts
3
- export interface DatHeader {
4
- bits: 8 | 16;
5
- channels: number;
6
- dataOffset: number;
7
- pairs: number;
8
- pairsPerSecond: number;
9
- sampleRate: number;
10
- samplesPerPixel: number;
11
- version: 1 | 2;
12
- }
13
- export declare function readDatHeader(buffer: ArrayBuffer): DatHeader;
14
- /** An inclusive byte range for a `Range` header; `undefined` when the pairs asked for are empty */
15
- export declare function datByteRange(header: DatHeader, fromPair: number, toPair: number): [number, number] | undefined;
16
- export declare function readDatSamples(header: DatHeader, body: ArrayBuffer, byteOffset?: number): Int8Array | Int16Array;
17
- export declare function readDatPeaks(header: DatHeader, body: ArrayBuffer, byteOffset?: number): WaveformPeaks;
18
- //#endregion
19
- export type { WaveformPeaks };
20
- //# sourceMappingURL=dat.d.ts.map
package/dist/dev/dat.js DELETED
@@ -1,53 +0,0 @@
1
- import { clamp } from "./lib/math.js";
2
-
3
- //#region src/dat.ts
4
- function readVersion(view) {
5
- const version = view.getInt32(0, true);
6
- if (version === 1 || version === 2) return version;
7
- throw new Error(`A .dat file of version ${String(version)} is not one this reads`);
8
- }
9
- function readDatHeader(buffer) {
10
- if (buffer.byteLength < 20) throw new Error("A .dat header takes at least 20 bytes");
11
- const view = new DataView(buffer);
12
- const version = readVersion(view);
13
- const dataOffset = version === 1 ? 20 : 24;
14
- if (buffer.byteLength < dataOffset) throw new Error(`A version ${String(version)} .dat header takes ${String(dataOffset)} bytes`);
15
- const channels = version === 1 ? 1 : view.getInt32(20, true);
16
- if (channels < 1) throw new Error("A .dat header names no channels");
17
- const sampleRate = view.getInt32(8, true);
18
- const samplesPerPixel = view.getInt32(12, true);
19
- if (samplesPerPixel < 1) throw new Error("A .dat header names no samples per pixel");
20
- return {
21
- bits: (view.getUint32(4, true) & 1) === 1 ? 8 : 16,
22
- channels,
23
- dataOffset,
24
- pairs: view.getUint32(16, true),
25
- pairsPerSecond: sampleRate / samplesPerPixel,
26
- sampleRate,
27
- samplesPerPixel,
28
- version
29
- };
30
- }
31
- /** An inclusive byte range for a `Range` header; `undefined` when the pairs asked for are empty */
32
- function datByteRange(header, fromPair, toPair) {
33
- const from = clamp(Math.floor(fromPair), 0, header.pairs);
34
- const to = clamp(Math.ceil(toPair), from, header.pairs);
35
- if (!(to > from)) return void 0;
36
- const pairBytes = header.channels * 2 * header.bits / 8;
37
- return [header.dataOffset + from * pairBytes, header.dataOffset + to * pairBytes - 1];
38
- }
39
- function readDatSamples(header, body, byteOffset = 0) {
40
- return header.bits === 8 ? new Int8Array(body, byteOffset) : new Int16Array(body, byteOffset, Math.floor((body.byteLength - byteOffset) / 2));
41
- }
42
- function readDatPeaks(header, body, byteOffset = 0) {
43
- return {
44
- channels: header.channels,
45
- fullScale: header.bits === 8 ? 128 : 32768,
46
- pairsPerSecond: header.pairsPerSecond,
47
- samples: readDatSamples(header, body, byteOffset)
48
- };
49
- }
50
-
51
- //#endregion
52
- export { datByteRange, readDatHeader, readDatPeaks, readDatSamples };
53
- //# sourceMappingURL=dat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dat.js","names":[],"sources":["../../src/dat.ts"],"sourcesContent":["import type { WaveformPeaks } from '#lib/waveform-buckets.ts';\n\nimport { clamp } from '#lib/math.ts';\n\nexport type { WaveformPeaks } from '#lib/waveform-buckets.ts';\n\nexport interface DatHeader {\n\tbits: 8 | 16;\n\tchannels: number;\n\tdataOffset: number;\n\tpairs: number;\n\tpairsPerSecond: number;\n\tsampleRate: number;\n\tsamplesPerPixel: number;\n\tversion: 1 | 2;\n}\n\nfunction readVersion(view: DataView): 1 | 2 {\n\tconst version = view.getInt32(0, true);\n\tif (version === 1 || version === 2) return version;\n\n\tthrow new Error(`A .dat file of version ${String(version)} is not one this reads`);\n}\n\nexport function readDatHeader(buffer: ArrayBuffer): DatHeader {\n\tif (buffer.byteLength < 20) throw new Error('A .dat header takes at least 20 bytes');\n\n\tconst view = new DataView(buffer);\n\tconst version = readVersion(view);\n\tconst dataOffset = version === 1 ? 20 : 24;\n\tif (buffer.byteLength < dataOffset) {\n\t\tthrow new Error(`A version ${String(version)} .dat header takes ${String(dataOffset)} bytes`);\n\t}\n\n\tconst channels = version === 1 ? 1 : view.getInt32(20, true);\n\tif (channels < 1) throw new Error('A .dat header names no channels');\n\n\tconst sampleRate = view.getInt32(8, true);\n\tconst samplesPerPixel = view.getInt32(12, true);\n\tif (samplesPerPixel < 1) throw new Error('A .dat header names no samples per pixel');\n\n\treturn {\n\t\tbits: (view.getUint32(4, true) & 1) === 1 ? 8 : 16,\n\t\tchannels,\n\t\tdataOffset,\n\t\tpairs: view.getUint32(16, true),\n\t\tpairsPerSecond: sampleRate / samplesPerPixel,\n\t\tsampleRate,\n\t\tsamplesPerPixel,\n\t\tversion,\n\t};\n}\n\n/** An inclusive byte range for a `Range` header; `undefined` when the pairs asked for are empty */\nexport function datByteRange(\n\theader: DatHeader,\n\tfromPair: number,\n\ttoPair: number,\n): [number, number] | undefined {\n\tconst from = clamp(Math.floor(fromPair), 0, header.pairs);\n\tconst to = clamp(Math.ceil(toPair), from, header.pairs);\n\t// A server ignores an inverted `Range` and sends the whole file\n\tif (!(to > from)) return undefined;\n\n\tconst pairBytes = (header.channels * 2 * header.bits) / 8;\n\n\treturn [header.dataOffset + from * pairBytes, header.dataOffset + to * pairBytes - 1];\n}\n\n// Typed arrays read the platform's byte order; every browser platform is little-endian, as the format is\n// A range response can end mid-sample; the odd byte is dropped\nexport function readDatSamples(\n\theader: DatHeader,\n\tbody: ArrayBuffer,\n\tbyteOffset = 0,\n): Int8Array | Int16Array {\n\treturn header.bits === 8\n\t\t? new Int8Array(body, byteOffset)\n\t\t: new Int16Array(body, byteOffset, Math.floor((body.byteLength - byteOffset) / 2));\n}\n\nexport function readDatPeaks(header: DatHeader, body: ArrayBuffer, byteOffset = 0): WaveformPeaks {\n\treturn {\n\t\tchannels: header.channels,\n\t\tfullScale: header.bits === 8 ? 128 : 32_768,\n\t\tpairsPerSecond: header.pairsPerSecond,\n\t\tsamples: readDatSamples(header, body, byteOffset),\n\t};\n}\n"],"mappings":";;;AAiBA,SAAS,YAAY,MAAuB;CAC3C,MAAM,UAAU,KAAK,SAAS,GAAG,IAAI;CACrC,IAAI,YAAY,KAAK,YAAY,GAAG,OAAO;CAE3C,MAAM,IAAI,MAAM,0BAA0B,OAAO,OAAO,EAAE,uBAAuB;AAClF;AAEA,SAAgB,cAAc,QAAgC;CAC7D,IAAI,OAAO,aAAa,IAAI,MAAM,IAAI,MAAM,uCAAuC;CAEnF,MAAM,OAAO,IAAI,SAAS,MAAM;CAChC,MAAM,UAAU,YAAY,IAAI;CAChC,MAAM,aAAa,YAAY,IAAI,KAAK;CACxC,IAAI,OAAO,aAAa,YACvB,MAAM,IAAI,MAAM,aAAa,OAAO,OAAO,EAAE,qBAAqB,OAAO,UAAU,EAAE,OAAO;CAG7F,MAAM,WAAW,YAAY,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI;CAC3D,IAAI,WAAW,GAAG,MAAM,IAAI,MAAM,iCAAiC;CAEnE,MAAM,aAAa,KAAK,SAAS,GAAG,IAAI;CACxC,MAAM,kBAAkB,KAAK,SAAS,IAAI,IAAI;CAC9C,IAAI,kBAAkB,GAAG,MAAM,IAAI,MAAM,0CAA0C;CAEnF,OAAO;EACN,OAAO,KAAK,UAAU,GAAG,IAAI,IAAI,OAAO,IAAI,IAAI;EAChD;EACA;EACA,OAAO,KAAK,UAAU,IAAI,IAAI;EAC9B,gBAAgB,aAAa;EAC7B;EACA;EACA;CACD;AACD;;AAGA,SAAgB,aACf,QACA,UACA,QAC+B;CAC/B,MAAM,OAAO,MAAM,KAAK,MAAM,QAAQ,GAAG,GAAG,OAAO,KAAK;CACxD,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM,GAAG,MAAM,OAAO,KAAK;CAEtD,IAAI,EAAE,KAAK,OAAO,OAAO;CAEzB,MAAM,YAAa,OAAO,WAAW,IAAI,OAAO,OAAQ;CAExD,OAAO,CAAC,OAAO,aAAa,OAAO,WAAW,OAAO,aAAa,KAAK,YAAY,CAAC;AACrF;AAIA,SAAgB,eACf,QACA,MACA,aAAa,GACY;CACzB,OAAO,OAAO,SAAS,IACpB,IAAI,UAAU,MAAM,UAAU,IAC9B,IAAI,WAAW,MAAM,YAAY,KAAK,OAAO,KAAK,aAAa,cAAc,CAAC,CAAC;AACnF;AAEA,SAAgB,aAAa,QAAmB,MAAmB,aAAa,GAAkB;CACjG,OAAO;EACN,UAAU,OAAO;EACjB,WAAW,OAAO,SAAS,IAAI,MAAM;EACrC,gBAAgB,OAAO;EACvB,SAAS,eAAe,QAAQ,MAAM,UAAU;CACjD;AACD"}