@tamagui/create-menu 2.6.4 → 2.7.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.
@@ -2,11 +2,11 @@
2
2
  * createNativeMenu - native menu implementation for React Native
3
3
  *
4
4
  * Web: returns empty stub components (withNativeMenu uses the web components instead)
5
- * Native: lazily resolves Zeego at render time so importing the package doesn't warn/error
5
+ * Native: lazily resolves the registered adapter at render time.
6
6
  */
7
7
 
8
8
  import {
9
- getZeego,
9
+ getNativeMenuAdapter,
10
10
  NativeMenuContext,
11
11
  unstable_claimExternalPressOwnership,
12
12
  unstable_releaseExternalPressOwnership,
@@ -36,8 +36,8 @@ import type {
36
36
  MenuTriggerProps,
37
37
  } from './createNativeMenuTypes'
38
38
 
39
- // zeego module shape (DropdownMenu / ContextMenu both share this)
40
- type ZeegoMenuModule = {
39
+ // native menu modules share this compound-component shape
40
+ type NativeMenuModule = {
41
41
  Root: FC<Record<string, unknown>>
42
42
  Trigger: FC<MenuTriggerProps>
43
43
  Content: FC<NativeMenuContentProps>
@@ -65,7 +65,17 @@ type MappedComponentType =
65
65
  | 'Content'
66
66
  | 'Sub'
67
67
  | 'Group'
68
+ | 'Item'
69
+ | 'ItemTitle'
70
+ | 'ItemSubtitle'
71
+ | 'ItemIcon'
72
+ | 'ItemImage'
73
+ | 'ItemIndicator'
74
+ | 'Label'
75
+ | 'Separator'
68
76
  | 'CheckboxItem'
77
+ | 'Preview'
78
+ | 'Auxiliary'
69
79
 
70
80
  const MAPPED_TYPES: MappedComponentType[] = [
71
81
  'SubContent',
@@ -73,16 +83,30 @@ const MAPPED_TYPES: MappedComponentType[] = [
73
83
  'Content',
74
84
  'Sub',
75
85
  'Group',
86
+ 'Item',
87
+ 'ItemTitle',
88
+ 'ItemSubtitle',
89
+ 'ItemIcon',
90
+ 'ItemImage',
91
+ 'ItemIndicator',
92
+ 'Label',
93
+ 'Separator',
76
94
  'CheckboxItem',
95
+ 'Preview',
96
+ 'Auxiliary',
77
97
  ]
78
98
 
79
99
  // types whose children get recursively transformed
80
- const CONTAINER_TYPES: MappedComponentType[] = ['SubContent', 'Content', 'Sub', 'Group']
100
+ const CONTAINER_TYPES: MappedComponentType[] = [
101
+ 'SubContent',
102
+ 'SubTrigger',
103
+ 'Content',
104
+ 'Sub',
105
+ 'Group',
106
+ 'Item',
107
+ ]
81
108
 
82
- type ComponentMap = Pick<
83
- ZeegoMenuModule,
84
- 'SubContent' | 'Content' | 'Sub' | 'Group' | 'SubTrigger'
85
- >
109
+ type ComponentMap = Pick<NativeMenuModule, MappedComponentType>
86
110
 
87
111
  type TriggerPressBoundaryHandlers = {
88
112
  claim(debugName?: string | null): void
@@ -119,7 +143,12 @@ export type NativeMenuComponents = {
119
143
 
120
144
  function getComponentType(displayName: string): MappedComponentType | null {
121
145
  for (const type of MAPPED_TYPES) {
122
- if (displayName === type || displayName.includes(`(${type})`)) {
146
+ if (
147
+ displayName === type ||
148
+ displayName === `Menu${type}` ||
149
+ displayName === `ContextMenu${type}` ||
150
+ displayName.includes(`(${type})`)
151
+ ) {
123
152
  return type
124
153
  }
125
154
  }
@@ -164,7 +193,7 @@ function getTriggerDebugName(
164
193
  return [prefix, detail].filter(Boolean).join(':') || prefix
165
194
  }
166
195
 
167
- // stub used for web never actually rendered, just needs to exist for withNativeMenu fallback
196
+ // web never renders these stubs, but withNativeMenu requires their component shape
168
197
  const emptyStub = (() => null) as FC<any>
169
198
 
170
199
  function createWebStubs(): NativeMenuComponents {
@@ -203,39 +232,48 @@ export const createNativeMenu = (
203
232
  }
204
233
 
205
234
  // ===========================================
206
- // native implementation lazily resolves zeego
235
+ // native implementation lazily resolves the registered adapter
207
236
  // ===========================================
208
237
 
209
238
  const isContextMenu = MenuType === 'ContextMenu'
210
239
  const isAndroid = !isIos && !isWeb
211
240
 
212
241
  // cached after first successful resolve
213
- let resolved: { menu: ZeegoMenuModule; componentMap: ComponentMap } | null = null
242
+ let resolved: { menu: NativeMenuModule; componentMap: ComponentMap } | null = null
214
243
  let warned = false
215
244
 
216
245
  function resolve(): typeof resolved {
217
246
  if (resolved) return resolved
218
- const zeego = getZeego()
219
- if (!zeego.isEnabled) {
247
+ const adapter = getNativeMenuAdapter()
248
+ if (!adapter) {
220
249
  if (!warned) {
221
250
  warned = true
222
251
  console.warn(
223
- `Warning: Must call import '@tamagui/native/setup-zeego' at your app entry point to use native menus`
252
+ `Warning: Register a native menu adapter before rendering Tamagui native menus`
224
253
  )
225
254
  }
226
255
  return null
227
256
  }
228
- const menu = (
229
- isContextMenu ? zeego.state.ContextMenu : zeego.state.DropdownMenu
230
- ) as ZeegoMenuModule
257
+ const menu = (isContextMenu ? adapter.ContextMenu : adapter.Menu) as NativeMenuModule
231
258
  resolved = {
232
259
  menu,
233
260
  componentMap: {
234
261
  SubContent: menu.SubContent,
262
+ SubTrigger: menu.SubTrigger,
235
263
  Content: menu.Content,
236
264
  Sub: menu.Sub,
237
265
  Group: menu.Group,
238
- SubTrigger: menu.SubTrigger,
266
+ Item: menu.Item,
267
+ ItemTitle: menu.ItemTitle,
268
+ ItemSubtitle: menu.ItemSubtitle,
269
+ ItemIcon: menu.ItemIcon,
270
+ ItemImage: menu.ItemImage,
271
+ ItemIndicator: menu.ItemIndicator,
272
+ Label: menu.Label,
273
+ Separator: menu.Separator,
274
+ CheckboxItem: menu.CheckboxItem,
275
+ Preview: menu.Preview,
276
+ Auxiliary: menu.Auxiliary,
239
277
  },
240
278
  }
241
279
  return resolved
@@ -246,9 +284,9 @@ export const createNativeMenu = (
246
284
  onValueChange?: (value: string) => void
247
285
  }
248
286
 
249
- // transform children tree for zeego compatibility
287
+ // transform Tamagui menu children into the registered adapter's components
250
288
  function transformChildren(
251
- menu: ZeegoMenuModule,
289
+ menu: NativeMenuModule,
252
290
  map: ComponentMap,
253
291
  children: React.ReactNode,
254
292
  shouldReverseOnIos = false,
@@ -280,7 +318,7 @@ export const createNativeMenu = (
280
318
  return
281
319
  }
282
320
 
283
- // flatten ScrollView (native passthrough children need to be visible to zeego)
321
+ // flatten ScrollView so the adapter can inspect every menu item
284
322
  if (displayName.includes('ScrollView')) {
285
323
  const inner = transformChildren(
286
324
  menu,
@@ -298,23 +336,30 @@ export const createNativeMenu = (
298
336
  const debugName = getTriggerDebugName(MenuType, props)
299
337
  const claim = () => triggerBoundaryHandlers?.claim(debugName)
300
338
  const release = () => triggerBoundaryHandlers?.release(debugName)
339
+ const { children: triggerChildren, ...triggerProps } = props
301
340
 
302
341
  result.push(
303
- React.cloneElement(child, {
304
- onTouchStart: composeHandlers(claim, props.onTouchStart),
305
- onTouchEnd: composeHandlers(props.onTouchEnd, release),
306
- onTouchCancel: composeHandlers(props.onTouchCancel, release),
307
- onResponderGrant: composeHandlers(claim, props.onResponderGrant),
308
- onResponderRelease: composeHandlers(props.onResponderRelease, release),
309
- onResponderTerminate: composeHandlers(props.onResponderTerminate, release),
310
- onPressIn: composeHandlers(claim, props.onPressIn),
311
- onPressOut: composeHandlers(props.onPressOut, release),
312
- } as any)
342
+ React.createElement(
343
+ menu.Trigger,
344
+ {
345
+ ...triggerProps,
346
+ key: child.key,
347
+ onTouchStart: composeHandlers(claim, props.onTouchStart),
348
+ onTouchEnd: composeHandlers(props.onTouchEnd, release),
349
+ onTouchCancel: composeHandlers(props.onTouchCancel, release),
350
+ onResponderGrant: composeHandlers(claim, props.onResponderGrant),
351
+ onResponderRelease: composeHandlers(props.onResponderRelease, release),
352
+ onResponderTerminate: composeHandlers(props.onResponderTerminate, release),
353
+ onPressIn: composeHandlers(claim, props.onPressIn),
354
+ onPressOut: composeHandlers(props.onPressOut, release),
355
+ } as any,
356
+ triggerChildren
357
+ )
313
358
  )
314
359
  return
315
360
  }
316
361
 
317
- // RadioGroup: render as a zeego Group and pipe value/onValueChange
362
+ // RadioGroup: render as an adapter Group and pipe value/onValueChange
318
363
  // down to any RadioItem descendants via radioContext
319
364
  if (displayName.includes('RadioGroup')) {
320
365
  const {
@@ -341,7 +386,7 @@ export const createNativeMenu = (
341
386
  return
342
387
  }
343
388
 
344
- // RadioItem: zeego has no radio primitive, so emit a CheckboxItem whose
389
+ // Native adapters share a checkbox primitive, so emit a CheckboxItem whose
345
390
  // 'on'/'off' state is derived from the enclosing RadioGroup's value.
346
391
  if (displayName.includes('RadioItem') && radioContext) {
347
392
  const {
@@ -366,7 +411,14 @@ export const createNativeMenu = (
366
411
  value: itemValue === radioContext.value ? 'on' : 'off',
367
412
  onValueChange: () => radioContext.onValueChange?.(itemValue),
368
413
  } as any,
369
- cleanChildren
414
+ transformChildren(
415
+ menu,
416
+ map,
417
+ cleanChildren,
418
+ false,
419
+ triggerBoundaryHandlers,
420
+ radioContext
421
+ )
370
422
  )
371
423
  )
372
424
  return
@@ -406,7 +458,14 @@ export const createNativeMenu = (
406
458
  value: finalValue,
407
459
  onValueChange: finalOnValueChange,
408
460
  } as any,
409
- cleanChildren
461
+ transformChildren(
462
+ menu,
463
+ map,
464
+ cleanChildren,
465
+ false,
466
+ triggerBoundaryHandlers,
467
+ radioContext
468
+ )
410
469
  )
411
470
  )
412
471
  return
@@ -414,18 +473,19 @@ export const createNativeMenu = (
414
473
 
415
474
  if (componentType) {
416
475
  const { children: childChildren, ...restProps } = props
417
- const isContainer = (CONTAINER_TYPES as string[]).includes(componentType)
476
+ const AdapterComponent: FC<any> = map[componentType]
477
+ const isContainer = CONTAINER_TYPES.includes(componentType)
418
478
  const shouldReverse =
419
479
  componentType === 'Content' || componentType === 'SubContent'
420
480
  result.push(
421
481
  React.createElement(
422
- map[componentType as keyof ComponentMap],
482
+ AdapterComponent,
423
483
  { ...restProps, key: child.key } as any,
424
484
  isContainer
425
485
  ? transformChildren(
426
486
  menu,
427
487
  map,
428
- childChildren as React.ReactNode,
488
+ childChildren,
429
489
  shouldReverse,
430
490
  triggerBoundaryHandlers,
431
491
  radioContext
@@ -436,14 +496,21 @@ export const createNativeMenu = (
436
496
  return
437
497
  }
438
498
 
439
- // convert Item-like components to zeego Items
499
+ // convert Item-like components to adapter Items
440
500
  if (isItemLike(props, displayName)) {
441
501
  const { children: itemChildren, ...itemProps } = props
442
502
  result.push(
443
503
  React.createElement(
444
504
  menu.Item,
445
505
  { ...itemProps, key: child.key } as any,
446
- itemChildren
506
+ transformChildren(
507
+ menu,
508
+ map,
509
+ itemChildren as React.ReactNode,
510
+ false,
511
+ triggerBoundaryHandlers,
512
+ radioContext
513
+ )
447
514
  )
448
515
  )
449
516
  return
@@ -460,9 +527,9 @@ export const createNativeMenu = (
460
527
  return result
461
528
  }
462
529
 
463
- // lazy wrapper resolves the zeego component on first render
464
- function lazyZeego<P extends Record<string, any>>(
465
- name: keyof ZeegoMenuModule,
530
+ // resolve each adapter component on its first render
531
+ function lazyAdapter<P extends Record<string, any>>(
532
+ name: keyof NativeMenuModule,
466
533
  displayName?: string
467
534
  ): FC<P> {
468
535
  const Comp: FC<P> = (props) => {
@@ -474,20 +541,20 @@ export const createNativeMenu = (
474
541
  return Comp
475
542
  }
476
543
 
477
- const Trigger = lazyZeego<MenuTriggerProps>('Trigger')
478
- const Content = lazyZeego<NativeMenuContentProps>('Content')
479
- const Item = lazyZeego<NativeMenuItemProps>('Item')
480
- const ItemTitle = lazyZeego<NativeMenuItemTitleProps>('ItemTitle')
481
- const ItemSubtitle = lazyZeego<NativeMenuItemSubtitleProps>('ItemSubtitle')
482
- const ItemIcon = lazyZeego<NativeMenuItemIconProps>('ItemIcon')
483
- const ItemImage = lazyZeego<NativeMenuItemImageProps>('ItemImage')
484
- const ItemIndicator = lazyZeego<NativeMenuItemIndicatorProps>('ItemIndicator')
485
- const Group = lazyZeego<NativeMenuGroupProps>('Group')
486
- const Label = lazyZeego<NativeMenuLabelProps>('Label')
487
- const Separator = lazyZeego<NativeMenuSeparatorProps>('Separator')
488
- const Sub = lazyZeego<NativeMenuSubProps>('Sub')
489
- const SubTrigger = lazyZeego<NativeMenuSubTriggerProps>('SubTrigger')
490
- const SubContent = lazyZeego<NativeMenuSubContentProps>('SubContent')
544
+ const Trigger = lazyAdapter<MenuTriggerProps>('Trigger')
545
+ const Content = lazyAdapter<NativeMenuContentProps>('Content')
546
+ const Item = lazyAdapter<NativeMenuItemProps>('Item')
547
+ const ItemTitle = lazyAdapter<NativeMenuItemTitleProps>('ItemTitle')
548
+ const ItemSubtitle = lazyAdapter<NativeMenuItemSubtitleProps>('ItemSubtitle')
549
+ const ItemIcon = lazyAdapter<NativeMenuItemIconProps>('ItemIcon')
550
+ const ItemImage = lazyAdapter<NativeMenuItemImageProps>('ItemImage')
551
+ const ItemIndicator = lazyAdapter<NativeMenuItemIndicatorProps>('ItemIndicator')
552
+ const Group = lazyAdapter<NativeMenuGroupProps>('Group')
553
+ const Label = lazyAdapter<NativeMenuLabelProps>('Label')
554
+ const Separator = lazyAdapter<NativeMenuSeparatorProps>('Separator')
555
+ const Sub = lazyAdapter<NativeMenuSubProps>('Sub')
556
+ const SubTrigger = lazyAdapter<NativeMenuSubTriggerProps>('SubTrigger')
557
+ const SubContent = lazyAdapter<NativeMenuSubContentProps>('SubContent')
491
558
 
492
559
  const Portal: FC<{ children: React.ReactNode }> = ({ children }) => <>{children}</>
493
560
  Portal.displayName = 'Portal'
@@ -505,12 +572,12 @@ export const createNativeMenu = (
505
572
  CheckboxItem.displayName = 'CheckboxItem'
506
573
 
507
574
  const Preview: FC<ContextMenuPreviewProps> = isContextMenu
508
- ? lazyZeego<ContextMenuPreviewProps>('Preview', `${MenuType}Preview`)
575
+ ? lazyAdapter<ContextMenuPreviewProps>('Preview', `${MenuType}Preview`)
509
576
  : () => null
510
577
  Preview.displayName = `${MenuType}Preview`
511
578
 
512
579
  const Auxiliary: FC<NativeContextMenuAuxiliaryProps> = isContextMenu
513
- ? lazyZeego<NativeContextMenuAuxiliaryProps>('Auxiliary', `${MenuType}Auxiliary`)
580
+ ? lazyAdapter<NativeContextMenuAuxiliaryProps>('Auxiliary', `${MenuType}Auxiliary`)
514
581
  : () => null
515
582
  Auxiliary.displayName = `${MenuType}Auxiliary`
516
583
 
@@ -2,7 +2,7 @@
2
2
  * createNativeMenu - native menu implementation for React Native
3
3
  *
4
4
  * Web: returns empty stub components (withNativeMenu uses the web components instead)
5
- * Native: lazily resolves Zeego at render time so importing the package doesn't warn/error
5
+ * Native: lazily resolves the registered adapter at render time.
6
6
  */
7
7
  import type { FC } from 'react';
8
8
  import React from 'react';
@@ -1 +1 @@
1
- {"version":3,"file":"createNativeMenu.d.ts","sourceRoot":"","sources":["../../src/createNativeMenu/createNativeMenu.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EACV,uBAAuB,EACvB,+BAA+B,EAC/B,oBAAoB,EACpB,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AAuDhC,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG;QAC1B,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAA;QAC7B,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAA;QACnC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAA;QAC7B,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAA;QACvC,YAAY,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAA;QAC7C,UAAU,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAA;QACzC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAA;QAC/B,QAAQ,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAA;QACrC,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAA;QACvC,YAAY,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAA;QAC7C,aAAa,EAAE,EAAE,CAAC,4BAA4B,CAAC,CAAA;QAC/C,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAA;QACvC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAA;QAC/B,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAA;QAC/B,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAA;QAC3B,UAAU,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAA;QACzC,OAAO,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAA;QACpC,MAAM,EAAE,EAAE,CAAC;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE,CAAC,CAAA;QACzC,UAAU,EAAE,EAAE,CAAC;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE,CAAC,CAAA;QAC7C,SAAS,EAAE,EAAE,CAAC;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE,CAAC,CAAA;QAC5C,SAAS,EAAE,EAAE,CAAC,+BAA+B,CAAC,CAAA;KAC/C,CAAA;CACF,CAAA;AAkFD,eAAO,MAAM,gBAAgB,GAC3B,UAAU,aAAa,GAAG,MAAM,KAC/B,oBAwZF,CAAA"}
1
+ {"version":3,"file":"createNativeMenu.d.ts","sourceRoot":"","sources":["../../src/createNativeMenu/createNativeMenu.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EACV,uBAAuB,EACvB,+BAA+B,EAC/B,oBAAoB,EACpB,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AA+EhC,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG;QAC1B,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAA;QAC7B,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAA;QACnC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAA;QAC7B,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAA;QACvC,YAAY,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAA;QAC7C,UAAU,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAA;QACzC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAA;QAC/B,QAAQ,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAA;QACrC,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAA;QACvC,YAAY,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAA;QAC7C,aAAa,EAAE,EAAE,CAAC,4BAA4B,CAAC,CAAA;QAC/C,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAA;QACvC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAA;QAC/B,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAA;QAC/B,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAA;QAC3B,UAAU,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAA;QACzC,OAAO,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAA;QACpC,MAAM,EAAE,EAAE,CAAC;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE,CAAC,CAAA;QACzC,UAAU,EAAE,EAAE,CAAC;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE,CAAC,CAAA;QAC7C,SAAS,EAAE,EAAE,CAAC;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE,CAAC,CAAA;QAC5C,SAAS,EAAE,EAAE,CAAC,+BAA+B,CAAC,CAAA;KAC/C,CAAA;CACF,CAAA;AAuFD,eAAO,MAAM,gBAAgB,GAC3B,UAAU,aAAa,GAAG,MAAM,KAC/B,oBA8bF,CAAA"}