@univers42/ui-collection 1.0.1 → 2.1.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 (45) hide show
  1. package/README.md +131 -9
  2. package/dist/library/components/react/asset-picker/AssetPickerBoard.d.ts +16 -4
  3. package/dist/library/components/react/asset-picker/AssetPickerBoard.d.ts.map +1 -1
  4. package/dist/library/components/react/asset-picker/AssetPickerBoard.js +285 -68
  5. package/dist/library/components/react/asset-picker/AssetPickerBoard.js.map +1 -1
  6. package/dist/library/components/react/asset-picker/AssetRenderer.d.ts +13 -0
  7. package/dist/library/components/react/asset-picker/AssetRenderer.d.ts.map +1 -0
  8. package/dist/library/components/react/asset-picker/AssetRenderer.js +68 -0
  9. package/dist/library/components/react/asset-picker/AssetRenderer.js.map +1 -0
  10. package/dist/library/components/react/asset-picker/assetValues.d.ts +36 -0
  11. package/dist/library/components/react/asset-picker/assetValues.d.ts.map +1 -0
  12. package/dist/library/components/react/asset-picker/assetValues.js +192 -0
  13. package/dist/library/components/react/asset-picker/assetValues.js.map +1 -0
  14. package/dist/library/components/react/asset-picker/defaultTabs.d.ts +11 -1
  15. package/dist/library/components/react/asset-picker/defaultTabs.d.ts.map +1 -1
  16. package/dist/library/components/react/asset-picker/defaultTabs.js +35 -8
  17. package/dist/library/components/react/asset-picker/defaultTabs.js.map +1 -1
  18. package/dist/library/components/react/asset-picker/index.d.ts +2 -0
  19. package/dist/library/components/react/asset-picker/index.d.ts.map +1 -1
  20. package/dist/library/components/react/asset-picker/index.js +2 -0
  21. package/dist/library/components/react/asset-picker/index.js.map +1 -1
  22. package/dist/library/components/react/asset-picker/types.d.ts +35 -1
  23. package/dist/library/components/react/asset-picker/types.d.ts.map +1 -1
  24. package/dist/library/components/react/asset-picker/types.js +21 -1
  25. package/dist/library/components/react/asset-picker/types.js.map +1 -1
  26. package/dist/library/components/react/emoji-picker/EmojiPickerBoard.d.ts +6 -1
  27. package/dist/library/components/react/emoji-picker/EmojiPickerBoard.d.ts.map +1 -1
  28. package/dist/library/components/react/emoji-picker/EmojiPickerBoard.js +87 -19
  29. package/dist/library/components/react/emoji-picker/EmojiPickerBoard.js.map +1 -1
  30. package/dist/library/components/react/emoji-picker/emojiPickerData.d.ts +6 -1
  31. package/dist/library/components/react/emoji-picker/emojiPickerData.d.ts.map +1 -1
  32. package/dist/library/components/react/emoji-picker/emojiPickerData.js +227 -24
  33. package/dist/library/components/react/emoji-picker/emojiPickerData.js.map +1 -1
  34. package/dist/library/components/react/icon-picker/IconPickerBoard.d.ts +4 -1
  35. package/dist/library/components/react/icon-picker/IconPickerBoard.d.ts.map +1 -1
  36. package/dist/library/components/react/icon-picker/IconPickerBoard.js +10 -18
  37. package/dist/library/components/react/icon-picker/IconPickerBoard.js.map +1 -1
  38. package/dist/library/index.d.ts +1 -4
  39. package/dist/library/index.d.ts.map +1 -1
  40. package/dist/library/index.js +1 -2
  41. package/dist/library/index.js.map +1 -1
  42. package/dist/library/media/collections/svg.d.ts.map +1 -1
  43. package/dist/library/media/collections/svg.js +253 -2
  44. package/dist/library/media/collections/svg.js.map +1 -1
  45. package/package.json +4 -2
package/README.md CHANGED
@@ -19,6 +19,7 @@ npm install @univers42/ui-collection react
19
19
  ```bash
20
20
  npm install
21
21
  npm run build
22
+ npm run release:check
22
23
  ```
23
24
 
24
25
  ## Releases and Upgrades
@@ -38,6 +39,7 @@ The repository now includes:
38
39
 
39
40
  - `prepack` packaging hooks in [package.json](/home/settes/cursus/trascendence/UI-Collection/package.json)
40
41
  - a publish workflow in [.github/workflows/publish-package.yml](/home/settes/cursus/trascendence/UI-Collection/.github/workflows/publish-package.yml)
42
+ - a tarball smoke test in [scripts/smoke-package.mjs](/home/settes/cursus/trascendence/UI-Collection/scripts/smoke-package.mjs)
41
43
  - a release guide in [RELEASING.md](/home/settes/cursus/trascendence/UI-Collection/RELEASING.md)
42
44
 
43
45
  ### Using This Package in Another Repository
@@ -135,9 +137,18 @@ Legacy re-exports are still available:
135
137
  ```tsx
136
138
  import {
137
139
  AssetPickerBoard,
140
+ AssetRenderer,
138
141
  ColorPickerBoard,
139
142
  IconPickerBoard,
140
143
  EmojiPickerBoard,
144
+ assetValueToBoardValue,
145
+ createDefaultAssetPickerTabs,
146
+ createEmojiPickerTab,
147
+ createIconPickerTab,
148
+ createMediaCollectionPickerTab,
149
+ parseAssetValue,
150
+ resolveAssetValue,
151
+ serializeAssetSelection,
141
152
  SLASH_ITEMS,
142
153
  SECTION_LABELS,
143
154
  getMediaItem,
@@ -149,6 +160,7 @@ import {
149
160
  DEFAULT_ASSET_PICKER_TABS,
150
161
  DEFAULT_COLOR_PRESETS,
151
162
  DEFAULT_ICON_PICKER_ITEMS,
163
+ EMOJI_PICKER_GROUPS,
152
164
  DEFAULT_EMOJI_PICKER_ITEMS,
153
165
  } from '@univers42/ui-collection';
154
166
  ```
@@ -161,7 +173,12 @@ import { SLASH_ITEMS } from '@univers42/ui-collection/library/catalogs';
161
173
  import { IconText, IconBoard } from '@univers42/ui-collection/library/icons/react/slash-menu';
162
174
  import {
163
175
  AssetPickerBoard,
176
+ AssetRenderer,
177
+ assetValueToBoardValue,
164
178
  createMediaCollectionPickerTab,
179
+ parseAssetValue,
180
+ resolveAssetValue,
181
+ serializeAssetSelection,
165
182
  } from '@univers42/ui-collection/library/components/react/asset-picker';
166
183
  import { ColorPickerBoard } from '@univers42/ui-collection/library/components/react/color-picker';
167
184
  import { IconPickerBoard } from '@univers42/ui-collection/library/components/react/icon-picker';
@@ -193,14 +210,25 @@ The root API is intentionally small and stable. More specialized modules live un
193
210
  Root exports include:
194
211
 
195
212
  - `AssetPickerBoard`
213
+ - `AssetRenderer`
196
214
  - `ColorPickerBoard`
197
215
  - `IconPickerBoard`
198
216
  - `EmojiPickerBoard`
199
217
  - `DEFAULT_ASSET_PICKER_TABS`
218
+ - `createDefaultAssetPickerTabs`
219
+ - `createEmojiPickerTab`
220
+ - `createIconPickerTab`
221
+ - `createMediaCollectionPickerTab`
222
+ - `parseAssetValue`
223
+ - `resolveAssetValue`
224
+ - `assetValueToBoardValue`
225
+ - `serializeAssetSelection`
200
226
  - `DEFAULT_COLOR_PRESETS`
201
227
  - `DEFAULT_ICON_PICKER_ITEMS`
228
+ - `EMOJI_PICKER_GROUPS`
202
229
  - `DEFAULT_EMOJI_PICKER_ITEMS`
203
230
  - `AssetPickerBoardProps`
231
+ - `AssetPickerBoardAppearance`
204
232
  - `AssetPickerBoardTab`
205
233
  - `AssetPickerBoardItem`
206
234
  - `AssetPickerBoardValue`
@@ -209,6 +237,7 @@ Root exports include:
209
237
  - `ColorPickerPreset`
210
238
  - `IconPickerBoardProps`
211
239
  - `IconPickerItem`
240
+ - `EmojiPickerGroup`
212
241
  - `EmojiPickerBoardProps`
213
242
  - `EmojiPickerItem`
214
243
 
@@ -251,7 +280,8 @@ Default datasets available from the root:
251
280
  - `DEFAULT_ASSET_PICKER_TABS`: default tabs for emojis, SVGs, and icons
252
281
  - `DEFAULT_COLOR_PRESETS`: 8 presets
253
282
  - `DEFAULT_ICON_PICKER_ITEMS`: 30 icons
254
- - `DEFAULT_EMOJI_PICKER_ITEMS`: 24 emojis
283
+ - `EMOJI_PICKER_GROUPS`: 9 standard-style emoji categories
284
+ - `DEFAULT_EMOJI_PICKER_ITEMS`: 180 emojis across smileys, people, animals, food, travel, activities, objects, symbols, and flags
255
285
 
256
286
  #### Unified Asset Picker
257
287
 
@@ -260,20 +290,50 @@ Default datasets available from the root:
260
290
  ```tsx
261
291
  import {
262
292
  AssetPickerBoard,
263
- DEFAULT_ASSET_PICKER_TABS,
293
+ assetValueToBoardValue,
294
+ createDefaultAssetPickerTabs,
295
+ serializeAssetSelection,
264
296
  } from '@univers42/ui-collection';
265
297
 
266
298
  export function Demo() {
299
+ const tabs = createDefaultAssetPickerTabs();
300
+
267
301
  return (
268
302
  <AssetPickerBoard
269
303
  label="Block asset picker"
270
- tabs={DEFAULT_ASSET_PICKER_TABS}
271
- onChange={({ tab, item }) => console.log(tab.id, item.value)}
304
+ tabs={tabs}
305
+ value={assetValueToBoardValue('icon:text', tabs)}
306
+ onChange={(selection) => {
307
+ console.log(selection.tab.id);
308
+ console.log(selection.item.value);
309
+ console.log(serializeAssetSelection(selection));
310
+ }}
272
311
  />
273
312
  );
274
313
  }
275
314
  ```
276
315
 
316
+ #### Canonical Asset Values
317
+
318
+ The package now emits stable values directly from the library so the consumer does not need local prefixes or wrappers:
319
+
320
+ - icons serialize as `icon:<id>`, for example `icon:text`
321
+ - emojis serialize as the raw glyph, for example `😀`
322
+ - media keeps the existing media ref contract, for example `local:/media/svg/icons/arrow-left.svg`
323
+
324
+ ```tsx
325
+ import {
326
+ parseAssetValue,
327
+ resolveAssetValue,
328
+ } from '@univers42/ui-collection';
329
+
330
+ const parsed = parseAssetValue('icon:text');
331
+ const resolved = resolveAssetValue('icon:text');
332
+
333
+ console.log(parsed.kind); // icon
334
+ console.log(resolved?.label); // Text
335
+ ```
336
+
277
337
  #### Which Picker Should You Import?
278
338
 
279
339
  Use `AssetPickerBoard` when you want the general-purpose board with all default asset families in one place. You do not need to import `IconPickerBoard` or `EmojiPickerBoard` to use the unified board.
@@ -285,6 +345,10 @@ export function Demo() {
285
345
  return (
286
346
  <AssetPickerBoard
287
347
  label="Block asset picker"
348
+ showSelectionPreview={false}
349
+ showStatusBar={false}
350
+ itemLabelVisibility="hidden"
351
+ appearance="unstyled"
288
352
  onChange={({ tab, item }) => {
289
353
  console.log(tab.id); // emojis | svg | icons
290
354
  console.log(item.value); // selected value
@@ -332,13 +396,62 @@ export function Demo() {
332
396
  return (
333
397
  <>
334
398
  <ColorPickerBoard label="Brand palette" onChange={(hex) => console.log(hex)} />
335
- <IconPickerBoard label="Slash icons" onChange={(iconId) => console.log(iconId)} />
399
+ <IconPickerBoard label="Slash icons" onChange={(iconValue) => console.log(iconValue)} />
336
400
  <EmojiPickerBoard label="Reaction picker" onChange={(emoji) => console.log(emoji)} />
337
401
  </>
338
402
  );
339
403
  }
340
404
  ```
341
405
 
406
+ `IconPickerBoard` emits canonical icon values by default, for example `icon:text`. `EmojiPickerBoard` emits the raw emoji glyph, and supports grouped sections plus persistent recents through `recentStorageKey`.
407
+
408
+ #### Host-Themed Asset Picker
409
+
410
+ This is the recommended integration when the host application owns the visual theme and wants emoji, icon and cover-heavy tabs without visible labels.
411
+
412
+ ```tsx
413
+ import {
414
+ AssetPickerBoard,
415
+ AssetRenderer,
416
+ createDefaultAssetPickerTabs,
417
+ } from '@univers42/ui-collection';
418
+
419
+ const tabs = createDefaultAssetPickerTabs({
420
+ emojiTabOptions: {
421
+ itemLabelVisibility: 'hidden',
422
+ layout: 'emoji',
423
+ },
424
+ iconTabOptions: {
425
+ itemLabelVisibility: 'hidden',
426
+ layout: 'icon',
427
+ },
428
+ svgTabOptions: {
429
+ itemLabelVisibility: 'hidden',
430
+ layout: 'cover',
431
+ },
432
+ });
433
+
434
+ export function Demo() {
435
+ return (
436
+ <AssetPickerBoard
437
+ tabs={tabs}
438
+ appearance="unstyled"
439
+ showSelectionPreview={false}
440
+ showStatusBar={false}
441
+ classNames={{
442
+ root: 'asset-picker-root',
443
+ tabButton: 'asset-picker-tab',
444
+ itemButton: 'asset-picker-cell',
445
+ }}
446
+ />
447
+ );
448
+ }
449
+
450
+ export function StoredAssetPreview({ value }: { value: string }) {
451
+ return <AssetRenderer value={value} size={28} />;
452
+ }
453
+ ```
454
+
342
455
  ### 2. React Slash-Menu Icons
343
456
 
344
457
  Available from:
@@ -584,7 +697,7 @@ const registry = extendMediaLibrary([stickers]);
584
697
 
585
698
  Current curated asset inventory:
586
699
 
587
- - `svg`: 5 items
700
+ - `svg`: 32 items
588
701
  - `emojis`: 4 items
589
702
  - `photos`: 2 items
590
703
  - `videos`: 3 items
@@ -605,47 +718,56 @@ Current sources:
605
718
  Importing from `@univers42/ui-collection` gives you:
606
719
 
607
720
  - the unified `AssetPickerBoard`
721
+ - the official `AssetRenderer`
608
722
  - the color, icon, and emoji picker wrappers
609
723
  - the React slash-menu icons
610
724
  - `SLASH_ITEMS` and `SECTION_LABELS`
611
725
  - the media registry and helpers
612
726
  - the default color, icon, emoji, and asset-picker datasets
727
+ - the canonical asset value helpers for parse, resolve and serialize
613
728
 
614
729
  ## Full Example
615
730
 
616
731
  ```tsx
617
732
  import {
618
733
  AssetPickerBoard,
734
+ AssetRenderer,
619
735
  ColorPickerBoard,
620
- DEFAULT_ASSET_PICKER_TABS,
621
736
  DEFAULT_ICON_PICKER_ITEMS,
622
737
  EmojiPickerBoard,
623
738
  IconPickerBoard,
624
739
  SLASH_ITEMS,
740
+ createDefaultAssetPickerTabs,
625
741
  getMediaCollection,
626
742
  getMediaItem,
743
+ parseAssetValue,
627
744
  resolveMediaUrl,
628
745
  } from '@univers42/ui-collection';
629
746
 
630
747
  const heroVideo = getMediaItem('video-mdn-flower');
631
748
  const emojiAssets = getMediaCollection('emojis');
632
749
  const src = heroVideo ? resolveMediaUrl(heroVideo.ref) : '';
750
+ const tabs = createDefaultAssetPickerTabs();
751
+ const parsed = parseAssetValue('icon:text');
633
752
 
634
753
  console.log(DEFAULT_ICON_PICKER_ITEMS.length);
635
754
  console.log(SLASH_ITEMS.length);
636
755
  console.log(emojiAssets.length);
637
756
  console.log(src);
757
+ console.log(parsed.kind);
638
758
 
639
759
  export function Demo() {
640
760
  return (
641
761
  <>
642
762
  <AssetPickerBoard
643
763
  label="Unified asset picker"
644
- tabs={DEFAULT_ASSET_PICKER_TABS}
764
+ tabs={tabs}
765
+ showSelectionPreview={false}
645
766
  />
646
767
  <ColorPickerBoard label="Brand palette" />
647
768
  <IconPickerBoard label="Slash icon picker" />
648
- <EmojiPickerBoard label="Emoji picker" />
769
+ <EmojiPickerBoard label="Emoji picker" recentStorageKey="demo:emoji-recents" />
770
+ <AssetRenderer value="icon:text" size={24} />
649
771
  </>
650
772
  );
651
773
  }
@@ -1,20 +1,32 @@
1
1
  import { type DefaultAssetPickerTabsOptions } from './defaultTabs.js';
2
- import type { AssetPickerBoardSelection, AssetPickerBoardTab, AssetPickerBoardValue } from './types.js';
2
+ import type { AssetPickerBoardAppearance, AssetPickerBoardMessages, AssetPickerBoardSelection, AssetPickerBoardSlotClassNames, AssetPickerBoardSlotProps, AssetPickerBoardSlotStyles, AssetPickerBoardTab, AssetPickerBoardValue, AssetPickerItemLabelVisibility, AssetPickerTabLayout } from './types.js';
3
3
  export interface AssetPickerBoardProps {
4
4
  tabs?: AssetPickerBoardTab[];
5
- value?: AssetPickerBoardValue;
6
- defaultValue?: AssetPickerBoardValue;
5
+ value?: AssetPickerBoardValue | string;
6
+ defaultValue?: AssetPickerBoardValue | string;
7
7
  defaultTabId?: string;
8
8
  onChange?: (selection: AssetPickerBoardSelection) => void;
9
9
  onChangeComplete?: (selection: AssetPickerBoardSelection) => void;
10
+ onSerializedValueChange?: (value: string) => void;
10
11
  onTabChange?: (tab: AssetPickerBoardTab) => void;
11
12
  label?: string;
12
13
  showSearch?: boolean;
13
14
  showTabs?: boolean;
15
+ showHeader?: boolean;
16
+ showSelectionPreview?: boolean;
17
+ showStatusBar?: boolean;
14
18
  columns?: number;
15
19
  width?: number | string;
16
20
  className?: string;
21
+ appearance?: AssetPickerBoardAppearance;
22
+ classNames?: AssetPickerBoardSlotClassNames;
23
+ styles?: AssetPickerBoardSlotStyles;
24
+ slotProps?: AssetPickerBoardSlotProps;
25
+ messages?: AssetPickerBoardMessages;
26
+ locale?: string;
27
+ layout?: AssetPickerTabLayout;
28
+ itemLabelVisibility?: AssetPickerItemLabelVisibility;
17
29
  }
18
30
  export type { DefaultAssetPickerTabsOptions };
19
- export declare function AssetPickerBoard({ tabs, value, defaultValue, defaultTabId, onChange, onChangeComplete, onTabChange, label, showSearch, showTabs, columns, width, className, }: Readonly<AssetPickerBoardProps>): import("react/jsx-runtime").JSX.Element | null;
31
+ export declare function AssetPickerBoard({ tabs, value, defaultValue, defaultTabId, onChange, onChangeComplete, onSerializedValueChange, onTabChange, label, showSearch, showTabs, showHeader, showSelectionPreview, showStatusBar, columns, width, className, appearance, classNames, styles, slotProps, messages, locale, layout, itemLabelVisibility, }: Readonly<AssetPickerBoardProps>): import("react/jsx-runtime").JSX.Element | null;
20
32
  //# sourceMappingURL=AssetPickerBoard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssetPickerBoard.d.ts","sourceRoot":"","sources":["../../../../../library/components/react/asset-picker/AssetPickerBoard.tsx"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAEV,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC1D,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAClE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,YAAY,EAAE,6BAA6B,EAAE,CAAC;AAsE9C,wBAAgB,gBAAgB,CAAC,EAC/B,IAAgC,EAChC,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,KAAsB,EACtB,UAAiB,EACjB,QAAQ,EACR,OAAO,EACP,KAAW,EACX,SAAS,GACV,EAAE,QAAQ,CAAC,qBAAqB,CAAC,kDAyTjC"}
1
+ {"version":3,"file":"AssetPickerBoard.d.ts","sourceRoot":"","sources":["../../../../../library/components/react/asset-picker/AssetPickerBoard.tsx"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,0BAA0B,EAE1B,wBAAwB,EACxB,yBAAyB,EAEzB,8BAA8B,EAC9B,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAG9B,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACvC,YAAY,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC1D,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAClE,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACxC,UAAU,CAAC,EAAE,8BAA8B,CAAC;IAC5C,MAAM,CAAC,EAAE,0BAA0B,CAAC;IACpC,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,mBAAmB,CAAC,EAAE,8BAA8B,CAAC;CACtD;AAED,YAAY,EAAE,6BAA6B,EAAE,CAAC;AA6N9C,wBAAgB,gBAAgB,CAAC,EAC/B,IAAgC,EAChC,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,KAAsB,EACtB,UAAiB,EACjB,QAAQ,EACR,UAAiB,EACjB,oBAA2B,EAC3B,aAAoB,EACpB,OAAO,EACP,KAAW,EACX,SAAS,EACT,UAAsB,EACtB,UAAU,EACV,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,mBAA+B,GAChC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,kDA0jBjC"}