@unif/react-native-design 0.29.0 → 0.30.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 (56) hide show
  1. package/README.md +14 -14
  2. package/jest-resolver.js +12 -1
  3. package/jest-setup.js +26 -8
  4. package/lib/module/components/ui/Avatar/Avatar.js +4 -3
  5. package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
  6. package/lib/module/components/ui/Avatar/styles.js +10 -2
  7. package/lib/module/components/ui/Avatar/styles.js.map +1 -1
  8. package/lib/module/components/ui/AvatarGroup/AvatarGroup.js +112 -0
  9. package/lib/module/components/ui/AvatarGroup/AvatarGroup.js.map +1 -0
  10. package/lib/module/components/ui/AvatarGroup/index.js +4 -0
  11. package/lib/module/components/ui/AvatarGroup/index.js.map +1 -0
  12. package/lib/module/components/ui/AvatarGroup/layout.js +44 -0
  13. package/lib/module/components/ui/AvatarGroup/layout.js.map +1 -0
  14. package/lib/module/components/ui/AvatarGroup/normalize.js +20 -0
  15. package/lib/module/components/ui/AvatarGroup/normalize.js.map +1 -0
  16. package/lib/module/components/ui/AvatarGroup/styles.js +20 -0
  17. package/lib/module/components/ui/AvatarGroup/styles.js.map +1 -0
  18. package/lib/module/components/ui/AvatarGroup/types.js +4 -0
  19. package/lib/module/components/ui/AvatarGroup/types.js.map +1 -0
  20. package/lib/module/components/ui/index.js +1 -0
  21. package/lib/module/components/ui/index.js.map +1 -1
  22. package/lib/typescript/manual-tests/runtime-api/RuntimeApiScreen.d.ts +1 -1
  23. package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts +2 -2
  24. package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts.map +1 -1
  25. package/lib/typescript/src/components/ui/Avatar/index.d.ts +1 -1
  26. package/lib/typescript/src/components/ui/Avatar/index.d.ts.map +1 -1
  27. package/lib/typescript/src/components/ui/Avatar/styles.d.ts +4 -2
  28. package/lib/typescript/src/components/ui/Avatar/styles.d.ts.map +1 -1
  29. package/lib/typescript/src/components/ui/Avatar/types.d.ts +4 -0
  30. package/lib/typescript/src/components/ui/Avatar/types.d.ts.map +1 -1
  31. package/lib/typescript/src/components/ui/AvatarGroup/AvatarGroup.d.ts +5 -0
  32. package/lib/typescript/src/components/ui/AvatarGroup/AvatarGroup.d.ts.map +1 -0
  33. package/lib/typescript/src/components/ui/AvatarGroup/index.d.ts +3 -0
  34. package/lib/typescript/src/components/ui/AvatarGroup/index.d.ts.map +1 -0
  35. package/lib/typescript/src/components/ui/AvatarGroup/layout.d.ts +16 -0
  36. package/lib/typescript/src/components/ui/AvatarGroup/layout.d.ts.map +1 -0
  37. package/lib/typescript/src/components/ui/AvatarGroup/normalize.d.ts +9 -0
  38. package/lib/typescript/src/components/ui/AvatarGroup/normalize.d.ts.map +1 -0
  39. package/lib/typescript/src/components/ui/AvatarGroup/styles.d.ts +17 -0
  40. package/lib/typescript/src/components/ui/AvatarGroup/styles.d.ts.map +1 -0
  41. package/lib/typescript/src/components/ui/AvatarGroup/types.d.ts +36 -0
  42. package/lib/typescript/src/components/ui/AvatarGroup/types.d.ts.map +1 -0
  43. package/lib/typescript/src/components/ui/index.d.ts +3 -1
  44. package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
  45. package/package.json +12 -12
  46. package/src/components/ui/Avatar/Avatar.tsx +9 -3
  47. package/src/components/ui/Avatar/index.ts +6 -1
  48. package/src/components/ui/Avatar/styles.ts +14 -3
  49. package/src/components/ui/Avatar/types.ts +5 -0
  50. package/src/components/ui/AvatarGroup/AvatarGroup.tsx +147 -0
  51. package/src/components/ui/AvatarGroup/index.ts +2 -0
  52. package/src/components/ui/AvatarGroup/layout.ts +56 -0
  53. package/src/components/ui/AvatarGroup/normalize.ts +28 -0
  54. package/src/components/ui/AvatarGroup/styles.ts +19 -0
  55. package/src/components/ui/AvatarGroup/types.ts +40 -0
  56. package/src/components/ui/index.ts +8 -1
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![License](https://img.shields.io/npm/l/@unif/react-native-design.svg?color=blue)](LICENSE)
6
6
  [![Docs](https://img.shields.io/badge/docs-unif--design.github.io-orange.svg)](https://unif-design.github.io/react-native-design/)
7
7
 
8
- Unif 设计系统 —— theme(设计令牌)+ 组件 + 图标 + utils,面向 React Native 0.86 新架构(Fabric + TurboModule)。所有 Unif 应用与端能力包的 UI 基座。
8
+ Unif 设计系统 —— theme(设计令牌)+ 组件 + 图标 + utils,面向 React Native 0.86+ 新架构(Fabric + TurboModule)。所有 Unif 应用与端能力包的 UI 基座。
9
9
 
10
10
  ## 特性
11
11
 
@@ -34,7 +34,7 @@ yarn add react-native-svg \
34
34
 
35
35
  iOS 另需在 `ios/` 执行 `bundle exec pod install`。完整步骤见[文档站 · 快速开始](https://unif-design.github.io/react-native-design/docs/getting-started)。
36
36
 
37
- `react-native-worklets` 的 Babel 插件与 Metro transformer 由宿主工程提供,不随本库分发 —— 宿主需自备与 RN `0.86.2` 匹配的 `@babel/core`、`@react-native/babel-preset@0.86.x`、`@react-native/metro-config@0.86.x`。
37
+ `react-native-worklets` 的 Babel 插件与 Metro transformer 由宿主工程提供,不随本库分发 —— 宿主需自备与自身 RN 版本匹配的 `@babel/core`、`@react-native/babel-preset`、`@react-native/metro-config`;本仓验证组合为 RN `0.86.3` 与对应的 `0.86.3` 工具链。
38
38
 
39
39
  `react-native-reanimated-carousel@5.0.0` 发布的 RNGH peer 是 `>=2.9.0 <3.0.0`,与本包要求的 `>=3.0.0 <4.0.0` 无交集;该组合已实测适配。消费端只能**接受这条警告**或加**只作用于 Carousel 的窄 override**(npm `overrides`、pnpm `peerDependencyRules.allowedVersions`、Yarn scoped `logFilters`),不要用全局 peer 忽略、`--force` 或 `--legacy-peer-deps`。本仓不使用全局 `logFilters`;`yarn check:runtime-peers` 只接受 root、example、website 三条精确的 RNRC 5 / RNGH 3 例外。
40
40
 
@@ -82,10 +82,10 @@ export const App = () => (
82
82
  );
83
83
  ```
84
84
 
85
- ## RN 0.86.2 组件展厅
85
+ ## RN 0.86.3 组件展厅
86
86
 
87
87
  仓库内的持久 `example/` 是 `@unif/react-native-design-example` workspace:它精确使用
88
- React Native `0.86.2`、React `19.2.3`、New Architecture 和 Hermes,并通过 Metro
88
+ React Native `0.86.3`、React `19.2.3`、New Architecture 和 Hermes,并通过 Metro
89
89
  直接消费本仓 public package root。展厅只挂载当前路由,共有以下 8 个 scene:
90
90
 
91
91
  | Scene ID | 标题 | 主要覆盖 |
@@ -96,7 +96,7 @@ React Native `0.86.2`、React `19.2.3`、New Architecture 和 Hermes,并通过
96
96
  | `forms` | 表单与输入 | 文本输入、选择控件、Stepper(xs 为横向触控 < 44pt 的紧凑档)、Form |
97
97
  | `navigation` | 导航组件 | NavBar、DrawerHeader、Tabs、Segmented、TabBar |
98
98
  | `collections` | 容器与集合 | Card、Ribbon、Cell、List、Grid、EntryCard、Carousel |
99
- | `media` | 媒体展示 | Avatar、Thumbnail、Logo 与图片失败边界 |
99
+ | `media` | 媒体展示 | Avatar、AvatarGroup、Thumbnail、Logo 与图片失败边界 |
100
100
  | `business` | 业务复合组件 | 渐变、背景、统计、头像环、版本状态 |
101
101
 
102
102
  从仓库根目录执行:
@@ -144,12 +144,12 @@ decode 仍按 `example/README.md` 的 Android/iOS 手工矩阵标记为待执行
144
144
  yarn create:runtime-harness
145
145
  ```
146
146
 
147
- 该命令**现场生成**一个一次性的 RN `0.86.2` app,用于人工验证 Jest 覆盖不到的部分:真实 native / Web 结构、44pt 命中框、a11y tree、reduced motion 与命令式 API 的竞态。
147
+ 该命令**现场生成**一个一次性的 RN `0.86.3` app,用于人工验证 Jest 覆盖不到的部分:真实 native / Web 结构、44pt 命中框、a11y tree、reduced motion 与命令式 API 的竞态。
148
148
 
149
149
  它做的事:
150
150
 
151
151
  1. `yarn prepare` + `yarn pack` 打包**当前源码**,harness 装的是 `file:` tarball,不是 registry 上的版本;
152
- 2. 用 `yarn.lock` 里钉死的官方 `@react-native-community/cli@20.1.0` + `@react-native-community/template@0.86.2` 生成脚手架 —— 两者的版本、template 自带的 React / RN / CLI 版本、以及锁文件里的 `checksum` 都会先校验,任一不符立即失败;
152
+ 2. 用 `yarn.lock` 里钉死的官方 `@react-native-community/cli@20.1.0` + `@react-native-community/template@0.86.3` 生成脚手架 —— 两者的版本、template 自带的 React / RN / CLI 版本、以及锁文件里的 `checksum` 都会先校验,任一不符立即失败;
153
153
  3. 枚举根 `peerDependencies` 的**每一个**非 optional 项,从根 direct range 精确匹配 `yarn.lock` locator,并交叉验证 installed version 与 peer range;`@babel/core` / `@react-native/metro-config` 也走同一链路,在首次安装前写成精确版本;
154
154
  4. 配好 Babel(`react-native-worklets/plugin` 排最后)、Metro、RNGH root import,拷入 `manual-tests/runtime-api/RuntimeApiScreen.tsx`,并逐文件核对生成的 Podfile / Android Gradle 文件与 installed template 捕获的摘要;
155
155
  5. 首次 `yarn install` 只在脚本自持的临时 app 内生成 `yarn.lock`,随后立即以同一 manifest / lock 执行 `yarn install --immutable` 最终复验,再执行 `bundle install` + `bundle exec pod install`;完整流程成功后才保留并打印绝对路径与全部 provider 版本。
@@ -158,7 +158,7 @@ yarn create:runtime-harness
158
158
 
159
159
  - app 只建在**脚本自持的系统临时目录**里(`fs.mkdtempSync`),**不接受调用方传目录**;脚手架之后的任一步失败也会递归删除自己那一个临时路径,只有完整成功才保留。
160
160
  - **完全不读、不写、不复制持久 `example/`** —— 两者职责不同:`example/` 提供公共面
161
- coverage 与可运行 RN `0.86.2` native shell;临时 runtime harness 专门验证 packed
161
+ coverage 与可运行 RN `0.86.3` native shell;临时 runtime harness 专门验证 packed
162
162
  tarball、负向路径与竞态,不替代展厅。
163
163
  - 生成物不入库。
164
164
 
@@ -173,22 +173,22 @@ harness 不继承本仓 `check:runtime-peers` 的 workspace 精确 allowlist;
173
173
 
174
174
  ## 兼容性
175
175
 
176
- 支持范围严格来自 `package.json#peerDependencies`;本仓直接验证的版本是 RN `0.86.2` + React `19.2.3`。
176
+ 支持范围严格来自 `package.json#peerDependencies`;本仓直接验证的版本是 RN `0.86.3` + React `19.2.3`。
177
177
 
178
178
  | 依赖 | 支持范围 | 本仓验证版本 |
179
179
  | ---------------------------------- | ------------------ | ------------ |
180
- | `react-native` | `>=0.86.0` | `0.86.2` |
180
+ | `react-native` | `>=0.86.0` | `0.86.3` |
181
181
  | `react` | `>=19.2.3 <20.0.0` | `19.2.3` |
182
182
  | `react-native-gesture-handler` | `>=3.0.0 <4.0.0` | `3.1.0` |
183
- | `react-native-reanimated` | `>=4.5.2 <4.6.0` | `4.5.3` |
184
- | `react-native-worklets` | `>=0.11.0 <0.12.0` | `0.11.3` |
183
+ | `react-native-reanimated` | `>=4.5.2 <4.7.0` | `4.6.0` |
184
+ | `react-native-worklets` | `>=0.11.0 <0.13.0` | `0.12.1` |
185
185
  | `react-native-reanimated-carousel` | `>=5.0.0 <6.0.0` | `5.0.0` |
186
186
  | `react-native-safe-area-context` | `>=5` | `5.8.0` |
187
187
  | `react-native-svg` | `>=15` | `15.15.5` |
188
- | `@sbaiahmed1/react-native-blur` | `>=4` | `4.6.2` |
188
+ | `@sbaiahmed1/react-native-blur` | `>=4` | `6.0.1` |
189
189
 
190
190
  - 新架构(Fabric + TurboModule)必须开启;旧架构 Bridge、RN `0.85` 及更低版本不在支持范围。
191
- - `react-native` peer 不封顶,RN `0.87+` 能装上;但本仓只在 `0.86.2` 上验证,更高版本未经验证。
191
+ - `react-native` peer 不封顶;当前验证基线是 RN `0.86.3`,同时保留对 Portal 所用 RN `0.86.3` 的安装兼容。
192
192
  - Node.js `^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0`(`package.json#engines`;本仓 `.nvmrc` 固定 `v24.13.0`)
193
193
  - TypeScript 6、Yarn 4
194
194
 
package/jest-resolver.js CHANGED
@@ -10,6 +10,10 @@
10
10
  * - worklets 官方 resolver(`react-native-worklets/jest/resolver`)的语义:
11
11
  * 对 worklets 相关请求过滤 .native.* extension,让 jest 走 web 实现,
12
12
  * 不触发 native init。
13
+ * - Reanimated 4.6 的 native initializer / mapper / mutable 分别会注册
14
+ * native-only CSS handler、调用原生调度函数、创建原生 shareable。Jest 使用
15
+ * JSReanimated + Worklets mock,这些路径都不可用。只让这些模块走通用实现,
16
+ * 避免把其余 Jest utilities 切到依赖 react-native-web 内部路径的 web 实现。
13
17
  *
14
18
  * jest 的 config `resolver` 是标量,直接写 worklets 的会把 RN 的顶掉,
15
19
  * 所以把 worklets 的 extension 过滤内联在这里,再委托给 RN 的 resolver。
@@ -18,9 +22,16 @@
18
22
  const reactNativeResolver = require('@react-native/jest-preset/jest/resolver.js');
19
23
 
20
24
  module.exports = (request, options) => {
25
+ const isReanimatedJestIncompatibleModule =
26
+ options.basedir.includes('react-native-reanimated') &&
27
+ (request === './initializers' ||
28
+ request.endsWith('/mappers') ||
29
+ request.endsWith('/mutables'));
30
+
21
31
  if (
22
32
  options.basedir.includes('react-native-worklets') ||
23
- request.includes('react-native-worklets')
33
+ request.includes('react-native-worklets') ||
34
+ isReanimatedJestIncompatibleModule
24
35
  ) {
25
36
  options = {
26
37
  ...options,
package/jest-setup.js CHANGED
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * `@unif/react-native-design/jest-setup` —— 把本库 9 个 runtime peer 里在 Jest 中
7
7
  * 需要接线的那 4 个接上各自的**官方**桩 / mock / setup。放进消费者的
8
- * `setupFilesAfterEnv`。(4 个里只有 3 个换了替身,reanimated 走真实模块。)
8
+ * `setupFilesAfterEnv`。
9
9
  *
10
10
  * 为什么由库提供:这份接线完全由本库的 peer 集决定,peer range 一变它就得变。
11
11
  * 让每个消费仓自己推导的结果是 5 个仓 5 种写法、3 个仓各自踩同一个坑
@@ -40,10 +40,28 @@ jest.mock('react-native-gesture-handler', () => ({
40
40
  GestureDetector: ({ children }) => children,
41
41
  }));
42
42
 
43
- // reanimated 走**真实模块** + 官方 setUpTests。
44
- // 不要映射到 `react-native-reanimated/mock`:那是上游刻意残缺的便利 mock
45
- // (src/mock.ts 里 19 处 `ADD ME IF NEEDED`),缺 useReducedMotion(本库
46
- // usePrefersReducedMotion 直接调)与 useComposedEventHandler(RNGH 3 Pressable 要用),
47
- // 且它的 useSharedValue 每次 render 返回新 Proxy,会让把 shared value 放进 effect
48
- // 依赖数组的组件(本库 ToastHost)在 fake timers 下堆内存耗尽。
49
- require('react-native-reanimated').setUpTests();
43
+ // Reanimated 4.6 的官方 mock 已覆盖本库使用的 hooks;真实 native 组件链会在
44
+ // React 19 test renderer 中尝试查 host instance / native style handle,不能用于 Jest。
45
+ // 上游 mock 的 useSharedValue 每次 render 都返回新 Proxy,会让把 shared value 放进
46
+ // effect 依赖数组的组件(本库 ToastHost)反复执行,所以只把这个 hook 稳定化。
47
+ jest.mock('react-native-reanimated', () => {
48
+ const React = require('react');
49
+ const reanimatedMock = require('react-native-reanimated/mock');
50
+
51
+ function useStableSharedValue(initialValue) {
52
+ const sharedValueRef = React.useRef();
53
+ if (sharedValueRef.current === undefined) {
54
+ sharedValueRef.current = reanimatedMock.useSharedValue(initialValue);
55
+ }
56
+ return sharedValueRef.current;
57
+ }
58
+
59
+ return {
60
+ ...reanimatedMock,
61
+ useSharedValue: useStableSharedValue,
62
+ };
63
+ });
64
+
65
+ // 用 actual 只安装官方 matcher / timer;不要提前 require 已注册的模块 mock,
66
+ // 否则消费仓在单测内追加的 jest.mock('react-native-reanimated', ...) 无法覆盖它。
67
+ jest.requireActual('react-native-reanimated').setUpTests();
@@ -5,10 +5,10 @@ import { Text, View } from 'react-native';
5
5
  import { scaleFontMetric, useColors, useFontScale } from "../../../theme/index.js";
6
6
  import { resolveImageSource } from "../../../utils/imageSource.js";
7
7
  import { ImageAttempt } from "../shared/ImageAttempt.js";
8
- import { paletteFor, sizingFor, styles } from "./styles.js";
8
+ import { paletteFor, resolveAvatarBorderRadius, sizingFor, styles } from "./styles.js";
9
9
  import { jsx as _jsx } from "react/jsx-runtime";
10
10
  /**
11
- * 圆形头像 —— 5 档尺寸 × 4 种配色 × 可选图片 source。
11
+ * 头像 —— 2 种形态 × 5 档尺寸 × 4 种配色 × 可选图片 source。
12
12
  *
13
13
  * 合法 source 由 keyed ImageAttempt 独立持有失败状态;非法 source 或加载失败
14
14
  * 时渲染 label + variant 背景色。
@@ -16,6 +16,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
16
16
  export function Avatar({
17
17
  label,
18
18
  size = 'md',
19
+ shape = 'circle',
19
20
  variant = 'neutral',
20
21
  source,
21
22
  style,
@@ -39,7 +40,7 @@ export function Avatar({
39
40
  style: [styles.base, {
40
41
  width: dims.box,
41
42
  height: dims.box,
42
- borderRadius: dims.box / 2,
43
+ borderRadius: resolveAvatarBorderRadius(size, shape),
43
44
  backgroundColor: palette.bg
44
45
  }, style],
45
46
  accessible: !!label,
@@ -1 +1 @@
1
- {"version":3,"names":["React","Text","View","scaleFontMetric","useColors","useFontScale","resolveImageSource","ImageAttempt","paletteFor","sizingFor","styles","jsx","_jsx","Avatar","label","size","variant","source","style","testID","c","fontScale","dims","palette","labelFontSize","fs","resolvedSource","fallback","fontSize","color","fg","numberOfLines","children","base","width","box","height","borderRadius","backgroundColor","bg","accessible","accessibilityLabel","undefined","image","resizeMode","key"],"sourceRoot":"../../../../../src","sources":["components/ui/Avatar/Avatar.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACzC,SAASC,eAAe,EAAEC,SAAS,EAAEC,YAAY,QAAQ,yBAAgB;AACzE,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,UAAU,EAAEC,SAAS,EAAEC,MAAM,QAAQ,aAAU;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGzD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAAC;EACrBC,KAAK;EACLC,IAAI,GAAG,IAAI;EACXC,OAAO,GAAG,SAAS;EACnBC,MAAM;EACNC,KAAK;EACLC;AACW,CAAC,EAAqB;EACjC,MAAMC,CAAC,GAAGhB,SAAS,CAAC,CAAC;EACrB,MAAMiB,SAAS,GAAGhB,YAAY,CAAC,CAAC;EAChC,MAAMiB,IAAI,GAAGb,SAAS,CAACM,IAAI,CAAC;EAC5B,MAAMQ,OAAO,GAAGf,UAAU,CAACQ,OAAO,EAAEI,CAAC,CAAC;EACtC,MAAMI,aAAa,GAAGrB,eAAe,CAACmB,IAAI,CAACG,EAAE,EAAEJ,SAAS,CAAC;EACzD,MAAMK,cAAc,GAAGpB,kBAAkB,CAACW,MAAM,CAAC;EACjD,MAAMU,QAAQ,gBACZf,IAAA,CAACX,IAAI;IACHiB,KAAK,EAAE,CAACR,MAAM,CAACI,KAAK,EAAE;MAAEc,QAAQ,EAAEJ,aAAa;MAAEK,KAAK,EAAEN,OAAO,CAACO;IAAG,CAAC,CAAE;IACtEC,aAAa,EAAE,CAAE;IAAAC,QAAA,EAEhBlB;EAAK,CACF,CACP;EAED,oBACEF,IAAA,CAACV,IAAI;IACHgB,KAAK,EAAE,CACLR,MAAM,CAACuB,IAAI,EACX;MACEC,KAAK,EAAEZ,IAAI,CAACa,GAAG;MACfC,MAAM,EAAEd,IAAI,CAACa,GAAG;MAChBE,YAAY,EAAEf,IAAI,CAACa,GAAG,GAAG,CAAC;MAC1BG,eAAe,EAAEf,OAAO,CAACgB;IAC3B,CAAC,EACDrB,KAAK,CACL;IACFsB,UAAU,EAAE,CAAC,CAAC1B,KAAM;IACpB2B,kBAAkB,EAAE3B,KAAM;IAC1BK,MAAM,EAAEA,MAAO;IAAAa,QAAA,EAEdN,cAAc,KAAKgB,SAAS,GAC3Bf,QAAQ,gBAERf,IAAA,CAACL,YAAY;MAEXU,MAAM,EAAES,cAAc,CAACT,MAAO;MAC9BU,QAAQ,EAAEA,QAAS;MACnBT,KAAK,EAAER,MAAM,CAACiC,KAAM;MACpBC,UAAU,EAAC;IAAO,GAJblB,cAAc,CAACmB,GAKrB;EACF,CACG,CAAC;AAEX","ignoreList":[]}
1
+ {"version":3,"names":["React","Text","View","scaleFontMetric","useColors","useFontScale","resolveImageSource","ImageAttempt","paletteFor","resolveAvatarBorderRadius","sizingFor","styles","jsx","_jsx","Avatar","label","size","shape","variant","source","style","testID","c","fontScale","dims","palette","labelFontSize","fs","resolvedSource","fallback","fontSize","color","fg","numberOfLines","children","base","width","box","height","borderRadius","backgroundColor","bg","accessible","accessibilityLabel","undefined","image","resizeMode","key"],"sourceRoot":"../../../../../src","sources":["components/ui/Avatar/Avatar.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACzC,SAASC,eAAe,EAAEC,SAAS,EAAEC,YAAY,QAAQ,yBAAgB;AACzE,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SACEC,UAAU,EACVC,yBAAyB,EACzBC,SAAS,EACTC,MAAM,QACD,aAAU;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGlB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAAC;EACrBC,KAAK;EACLC,IAAI,GAAG,IAAI;EACXC,KAAK,GAAG,QAAQ;EAChBC,OAAO,GAAG,SAAS;EACnBC,MAAM;EACNC,KAAK;EACLC;AACW,CAAC,EAAqB;EACjC,MAAMC,CAAC,GAAGlB,SAAS,CAAC,CAAC;EACrB,MAAMmB,SAAS,GAAGlB,YAAY,CAAC,CAAC;EAChC,MAAMmB,IAAI,GAAGd,SAAS,CAACM,IAAI,CAAC;EAC5B,MAAMS,OAAO,GAAGjB,UAAU,CAACU,OAAO,EAAEI,CAAC,CAAC;EACtC,MAAMI,aAAa,GAAGvB,eAAe,CAACqB,IAAI,CAACG,EAAE,EAAEJ,SAAS,CAAC;EACzD,MAAMK,cAAc,GAAGtB,kBAAkB,CAACa,MAAM,CAAC;EACjD,MAAMU,QAAQ,gBACZhB,IAAA,CAACZ,IAAI;IACHmB,KAAK,EAAE,CAACT,MAAM,CAACI,KAAK,EAAE;MAAEe,QAAQ,EAAEJ,aAAa;MAAEK,KAAK,EAAEN,OAAO,CAACO;IAAG,CAAC,CAAE;IACtEC,aAAa,EAAE,CAAE;IAAAC,QAAA,EAEhBnB;EAAK,CACF,CACP;EAED,oBACEF,IAAA,CAACX,IAAI;IACHkB,KAAK,EAAE,CACLT,MAAM,CAACwB,IAAI,EACX;MACEC,KAAK,EAAEZ,IAAI,CAACa,GAAG;MACfC,MAAM,EAAEd,IAAI,CAACa,GAAG;MAChBE,YAAY,EAAE9B,yBAAyB,CAACO,IAAI,EAAEC,KAAK,CAAC;MACpDuB,eAAe,EAAEf,OAAO,CAACgB;IAC3B,CAAC,EACDrB,KAAK,CACL;IACFsB,UAAU,EAAE,CAAC,CAAC3B,KAAM;IACpB4B,kBAAkB,EAAE5B,KAAM;IAC1BM,MAAM,EAAEA,MAAO;IAAAa,QAAA,EAEdN,cAAc,KAAKgB,SAAS,GAC3Bf,QAAQ,gBAERhB,IAAA,CAACN,YAAY;MAEXY,MAAM,EAAES,cAAc,CAACT,MAAO;MAC9BU,QAAQ,EAAEA,QAAS;MACnBT,KAAK,EAAET,MAAM,CAACkC,KAAM;MACpBC,UAAU,EAAC;IAAO,GAJblB,cAAc,CAACmB,GAKrB;EACF,CACG,CAAC;AAEX","ignoreList":[]}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  import { StyleSheet } from 'react-native';
4
- import { avatar, fw, rf } from "../../../theme/index.js";
5
- /** Avatar 静态 base —— 圆形容器(borderRadius / 尺寸由 sizingFor 派生)。 */
4
+ import { avatar, fw, radius, rf } from "../../../theme/index.js";
5
+ /** Avatar 静态 base —— 容器圆角 / 尺寸由 resolver 派生。 */
6
6
  export const styles = StyleSheet.create({
7
7
  base: {
8
8
  alignItems: 'center',
@@ -51,6 +51,14 @@ export function sizingFor(size) {
51
51
  }
52
52
  }
53
53
 
54
+ /** circle 保留直径一半的现有视觉;square 按尺寸使用既有圆角 token。 */
55
+ export function resolveAvatarBorderRadius(size, shape) {
56
+ if (shape === 'circle') return sizingFor(size).box / 2;
57
+ if (size === 'xs' || size === 'sm') return radius.xs;
58
+ if (size === 'xl') return radius.md;
59
+ return radius.sm;
60
+ }
61
+
54
62
  /** Avatar 配色推导:4 种 variant → { bg, fg }。签名与 Tag/Button 的 paletteFor 一致。 */
55
63
  export function paletteFor(variant, c) {
56
64
  switch (variant) {
@@ -1 +1 @@
1
- {"version":3,"names":["StyleSheet","avatar","fw","rf","styles","create","base","alignItems","justifyContent","overflow","label","fontWeight","semi","lineHeight","undefined","image","width","height","sizingFor","size","box","xs","fs","sm","md","lg","xl","paletteFor","variant","c","bg","primary","fg","onPrimary","info","onInfo","primaryContainer","surfaceContainerHighest","foreground"],"sourceRoot":"../../../../../src","sources":["components/ui/Avatar/styles.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SAASC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAA0B,yBAAgB;AAGjE;AACA,OAAO,MAAMC,MAAM,GAAGJ,UAAU,CAACK,MAAM,CAAC;EACtCC,IAAI,EAAE;IACJC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,QAAQ,EAAE;EACZ,CAAC;EACDC,KAAK,EAAE;IACLC,UAAU,EAAET,EAAE,CAACU,IAAI;IACnBC,UAAU,EAAEC;EACd,CAAC;EACDC,KAAK,EAAE;IACLC,KAAK,EAAE,MAAM;IACbC,MAAM,EAAE;EACV;AACF,CAAC,CAAC;;AAEF;AACA;AACA,OAAO,SAASC,SAASA,CAACC,IAAgB,EAA+B;EACvE,QAAQA,IAAI;IACV,KAAK,IAAI;MACP,OAAO;QAAEC,GAAG,EAAEnB,MAAM,CAACoB,EAAE;QAAEC,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;IACvC,KAAK,IAAI;MACP,OAAO;QAAEiB,GAAG,EAAEnB,MAAM,CAACsB,EAAE;QAAED,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;IACvC,KAAK,IAAI;MACP,OAAO;QAAEiB,GAAG,EAAEnB,MAAM,CAACuB,EAAE;QAAEF,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;IACvC,KAAK,IAAI;MACP,OAAO;QAAEiB,GAAG,EAAEnB,MAAM,CAACwB,EAAE;QAAEH,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;IACvC,KAAK,IAAI;MACP,OAAO;QAAEiB,GAAG,EAAEnB,MAAM,CAACyB,EAAE;QAAEJ,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;EACzC;AACF;;AAEA;AACA,OAAO,SAASwB,UAAUA,CACxBC,OAAsB,EACtBC,CAAc,EACc;EAC5B,QAAQD,OAAO;IACb,KAAK,OAAO;MACV,OAAO;QAAEE,EAAE,EAAED,CAAC,CAACE,OAAO;QAAEC,EAAE,EAAEH,CAAC,CAACI;MAAU,CAAC;IAC3C,KAAK,MAAM;MACT,OAAO;QAAEH,EAAE,EAAED,CAAC,CAACK,IAAI;QAAEF,EAAE,EAAEH,CAAC,CAACM;MAAO,CAAC;IACrC,KAAK,MAAM;MACT,OAAO;QAAEL,EAAE,EAAED,CAAC,CAACO,gBAAgB;QAAEJ,EAAE,EAAEH,CAAC,CAACE;MAAQ,CAAC;IAClD,KAAK,SAAS;MACZ,OAAO;QAAED,EAAE,EAAED,CAAC,CAACQ,uBAAuB;QAAEL,EAAE,EAAEH,CAAC,CAACS;MAAW,CAAC;EAC9D;AACF","ignoreList":[]}
1
+ {"version":3,"names":["StyleSheet","avatar","fw","radius","rf","styles","create","base","alignItems","justifyContent","overflow","label","fontWeight","semi","lineHeight","undefined","image","width","height","sizingFor","size","box","xs","fs","sm","md","lg","xl","resolveAvatarBorderRadius","shape","paletteFor","variant","c","bg","primary","fg","onPrimary","info","onInfo","primaryContainer","surfaceContainerHighest","foreground"],"sourceRoot":"../../../../../src","sources":["components/ui/Avatar/styles.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SAASC,MAAM,EAAEC,EAAE,EAAEC,MAAM,EAAEC,EAAE,QAA0B,yBAAgB;AAGzE;AACA,OAAO,MAAMC,MAAM,GAAGL,UAAU,CAACM,MAAM,CAAC;EACtCC,IAAI,EAAE;IACJC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,QAAQ,EAAE;EACZ,CAAC;EACDC,KAAK,EAAE;IACLC,UAAU,EAAEV,EAAE,CAACW,IAAI;IACnBC,UAAU,EAAEC;EACd,CAAC;EACDC,KAAK,EAAE;IACLC,KAAK,EAAE,MAAM;IACbC,MAAM,EAAE;EACV;AACF,CAAC,CAAC;;AAEF;AACA;AACA,OAAO,SAASC,SAASA,CAACC,IAAgB,EAA+B;EACvE,QAAQA,IAAI;IACV,KAAK,IAAI;MACP,OAAO;QAAEC,GAAG,EAAEpB,MAAM,CAACqB,EAAE;QAAEC,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;IACvC,KAAK,IAAI;MACP,OAAO;QAAEiB,GAAG,EAAEpB,MAAM,CAACuB,EAAE;QAAED,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;IACvC,KAAK,IAAI;MACP,OAAO;QAAEiB,GAAG,EAAEpB,MAAM,CAACwB,EAAE;QAAEF,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;IACvC,KAAK,IAAI;MACP,OAAO;QAAEiB,GAAG,EAAEpB,MAAM,CAACyB,EAAE;QAAEH,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;IACvC,KAAK,IAAI;MACP,OAAO;QAAEiB,GAAG,EAAEpB,MAAM,CAAC0B,EAAE;QAAEJ,EAAE,EAAEnB,EAAE,CAAC,EAAE;MAAE,CAAC;EACzC;AACF;;AAEA;AACA,OAAO,SAASwB,yBAAyBA,CACvCR,IAAgB,EAChBS,KAAkB,EACV;EACR,IAAIA,KAAK,KAAK,QAAQ,EAAE,OAAOV,SAAS,CAACC,IAAI,CAAC,CAACC,GAAG,GAAG,CAAC;EACtD,IAAID,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAK,IAAI,EAAE,OAAOjB,MAAM,CAACmB,EAAE;EACpD,IAAIF,IAAI,KAAK,IAAI,EAAE,OAAOjB,MAAM,CAACsB,EAAE;EACnC,OAAOtB,MAAM,CAACqB,EAAE;AAClB;;AAEA;AACA,OAAO,SAASM,UAAUA,CACxBC,OAAsB,EACtBC,CAAc,EACc;EAC5B,QAAQD,OAAO;IACb,KAAK,OAAO;MACV,OAAO;QAAEE,EAAE,EAAED,CAAC,CAACE,OAAO;QAAEC,EAAE,EAAEH,CAAC,CAACI;MAAU,CAAC;IAC3C,KAAK,MAAM;MACT,OAAO;QAAEH,EAAE,EAAED,CAAC,CAACK,IAAI;QAAEF,EAAE,EAAEH,CAAC,CAACM;MAAO,CAAC;IACrC,KAAK,MAAM;MACT,OAAO;QAAEL,EAAE,EAAED,CAAC,CAACO,gBAAgB;QAAEJ,EAAE,EAAEH,CAAC,CAACE;MAAQ,CAAC;IAClD,KAAK,SAAS;MACZ,OAAO;QAAED,EAAE,EAAED,CAAC,CAACQ,uBAAuB;QAAEL,EAAE,EAAEH,CAAC,CAACS;MAAW,CAAC;EAC9D;AACF","ignoreList":[]}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ import React, { useEffect } from 'react';
4
+ import { Text, View } from 'react-native';
5
+ import { Pressable } from 'react-native-gesture-handler';
6
+ import { pressedOpacity, scaleFontMetric, useColors, useFontScale, useThemedStyles } from "../../../theme/index.js";
7
+ import { createLogger } from "../../../utils/logger/index.js";
8
+ import { childTestID } from "../../../utils/testID/index.js";
9
+ import { Avatar } from "../Avatar/index.js";
10
+ import { resolveAvatarBorderRadius, sizingFor } from "../Avatar/styles.js";
11
+ import { normalizeNonBlankText } from "../shared/accessibilityName.js";
12
+ import { resolveAvatarGroupLayout } from "./layout.js";
13
+ import { normalizeAvatarGroup } from "./normalize.js";
14
+ import { makeStyles } from "./styles.js";
15
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
16
+ const log = createLogger('AvatarGroup');
17
+ const warned = new Set();
18
+ function warnOnce(key, message) {
19
+ if (warned.has(key)) return;
20
+ warned.add(key);
21
+ log.warn(message);
22
+ }
23
+
24
+ /** 重叠头像组;只拥有布局、溢出计数和可选溢出 action。 */
25
+ export function AvatarGroup({
26
+ items,
27
+ size = 'md',
28
+ shape = 'circle',
29
+ max,
30
+ style,
31
+ testID,
32
+ onOverflowPress,
33
+ overflowAccessibilityLabel,
34
+ overflowAccessibilityHint
35
+ }) {
36
+ const colors = useColors();
37
+ const fontScale = useFontScale();
38
+ const styles = useThemedStyles(makeStyles);
39
+ const normalized = normalizeAvatarGroup(items, max);
40
+ const layout = resolveAvatarGroupLayout(size);
41
+ const avatarSizing = sizingFor(size);
42
+ const overflowFontSize = scaleFontMetric(avatarSizing.fs, fontScale);
43
+ const customOverflowLabel = normalizeNonBlankText(overflowAccessibilityLabel);
44
+ const hasBlankOverflowLabel = normalized.overflowCount > 0 && onOverflowPress !== undefined && overflowAccessibilityLabel !== undefined && customOverflowLabel === undefined;
45
+ useEffect(() => {
46
+ if (typeof __DEV__ === 'undefined' || !__DEV__) return;
47
+ if (normalized.invalidMax) {
48
+ warnOnce(`max:${String(max)}`, `max 必须是大于等于 2 的有限整数,传入 ${String(max)},已展示全部成员。`);
49
+ }
50
+ if (hasBlankOverflowLabel) {
51
+ warnOnce('overflowAccessibilityLabel:blank', 'overflowAccessibilityLabel 不能为空白,已回退默认名称。');
52
+ }
53
+ }, [hasBlankOverflowLabel, max, normalized.invalidMax]);
54
+ if (items.length === 0) return null;
55
+ const slotStyle = index => ({
56
+ borderColor: colors.surface,
57
+ borderWidth: layout.borderWidth,
58
+ marginStart: index === 0 ? 0 : -layout.overlap,
59
+ zIndex: index
60
+ });
61
+ const overflowCount = normalized.overflowCount;
62
+ const overflowLabel = `+${overflowCount}`;
63
+ const overflowA11yLabel = onOverflowPress === undefined ? `还有 ${overflowCount} 位成员` : customOverflowLabel ?? `查看其余 ${overflowCount} 位成员`;
64
+ const overflowStyle = {
65
+ ...slotStyle(normalized.visibleItems.length),
66
+ width: layout.box,
67
+ height: layout.box,
68
+ borderRadius: resolveAvatarBorderRadius(size, shape),
69
+ backgroundColor: colors.primaryContainer
70
+ };
71
+ const overflowText = /*#__PURE__*/_jsx(Text, {
72
+ style: [styles.overflowText, {
73
+ color: colors.primary,
74
+ fontSize: overflowFontSize
75
+ }],
76
+ numberOfLines: 1,
77
+ children: overflowLabel
78
+ });
79
+ return /*#__PURE__*/_jsxs(View, {
80
+ style: [styles.root, style],
81
+ testID: testID,
82
+ children: [normalized.visibleItems.map((item, index) => /*#__PURE__*/_jsx(Avatar, {
83
+ label: item.label,
84
+ source: item.source,
85
+ variant: item.variant,
86
+ size: size,
87
+ shape: shape,
88
+ style: slotStyle(index)
89
+ }, item.key)), overflowCount === 0 ? null : onOverflowPress === undefined ? /*#__PURE__*/_jsx(View, {
90
+ accessible: true,
91
+ accessibilityLabel: overflowA11yLabel,
92
+ style: [styles.overflow, overflowStyle],
93
+ testID: childTestID(testID, 'overflow'),
94
+ children: overflowText
95
+ }) : /*#__PURE__*/_jsx(Pressable, {
96
+ accessible: true,
97
+ accessibilityRole: "button",
98
+ accessibilityLabel: overflowA11yLabel,
99
+ accessibilityHint: overflowAccessibilityHint,
100
+ onPress: onOverflowPress,
101
+ hitSlop: layout.hitSlop,
102
+ style: ({
103
+ pressed
104
+ }) => [styles.overflow, overflowStyle, {
105
+ opacity: pressed ? pressedOpacity : 1
106
+ }],
107
+ testID: childTestID(testID, 'overflow'),
108
+ children: overflowText
109
+ })]
110
+ });
111
+ }
112
+ //# sourceMappingURL=AvatarGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useEffect","Text","View","Pressable","pressedOpacity","scaleFontMetric","useColors","useFontScale","useThemedStyles","createLogger","childTestID","Avatar","resolveAvatarBorderRadius","sizingFor","normalizeNonBlankText","resolveAvatarGroupLayout","normalizeAvatarGroup","makeStyles","jsx","_jsx","jsxs","_jsxs","log","warned","Set","warnOnce","key","message","has","add","warn","AvatarGroup","items","size","shape","max","style","testID","onOverflowPress","overflowAccessibilityLabel","overflowAccessibilityHint","colors","fontScale","styles","normalized","layout","avatarSizing","overflowFontSize","fs","customOverflowLabel","hasBlankOverflowLabel","overflowCount","undefined","__DEV__","invalidMax","String","length","slotStyle","index","borderColor","surface","borderWidth","marginStart","overlap","zIndex","overflowLabel","overflowA11yLabel","overflowStyle","visibleItems","width","box","height","borderRadius","backgroundColor","primaryContainer","overflowText","color","primary","fontSize","numberOfLines","children","root","map","item","label","source","variant","accessible","accessibilityLabel","overflow","accessibilityRole","accessibilityHint","onPress","hitSlop","pressed","opacity"],"sourceRoot":"../../../../../src","sources":["components/ui/AvatarGroup/AvatarGroup.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export { AvatarGroup } from "./AvatarGroup.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AvatarGroup"],"sourceRoot":"../../../../../src","sources":["components/ui/AvatarGroup/index.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,kBAAe","ignoreList":[]}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ import { avatar, fixed, r, space } from "../../../theme/index.js";
4
+ /** 五档尺寸共享的重叠、分隔边与 44pt 命中区几何。 */
5
+ export function resolveAvatarGroupLayout(size) {
6
+ const box = avatar[size];
7
+ let overlap;
8
+ let borderWidth;
9
+ switch (size) {
10
+ case 'xs':
11
+ overlap = space['1'];
12
+ borderWidth = r(1);
13
+ break;
14
+ case 'sm':
15
+ overlap = space['2'];
16
+ borderWidth = r(1);
17
+ break;
18
+ case 'md':
19
+ overlap = space['3'];
20
+ borderWidth = r(1);
21
+ break;
22
+ case 'lg':
23
+ overlap = space['4'];
24
+ borderWidth = r(2);
25
+ break;
26
+ case 'xl':
27
+ overlap = space['6'];
28
+ borderWidth = r(2);
29
+ break;
30
+ }
31
+ const inset = Math.max(0, (fixed.hitTarget - box) / 2);
32
+ return {
33
+ box,
34
+ overlap,
35
+ borderWidth,
36
+ hitSlop: {
37
+ top: inset,
38
+ right: inset,
39
+ bottom: inset,
40
+ left: inset
41
+ }
42
+ };
43
+ }
44
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["avatar","fixed","r","space","resolveAvatarGroupLayout","size","box","overlap","borderWidth","inset","Math","max","hitTarget","hitSlop","top","right","bottom","left"],"sourceRoot":"../../../../../src","sources":["components/ui/AvatarGroup/layout.ts"],"mappings":";;AAAA,SAASA,MAAM,EAAEC,KAAK,EAAEC,CAAC,EAAEC,KAAK,QAAQ,yBAAgB;AAiBxD;AACA,OAAO,SAASC,wBAAwBA,CACtCC,IAAgB,EACW;EAC3B,MAAMC,GAAG,GAAGN,MAAM,CAACK,IAAI,CAAC;EACxB,IAAIE,OAAe;EACnB,IAAIC,WAAmB;EAEvB,QAAQH,IAAI;IACV,KAAK,IAAI;MACPE,OAAO,GAAGJ,KAAK,CAAC,GAAG,CAAC;MACpBK,WAAW,GAAGN,CAAC,CAAC,CAAC,CAAC;MAClB;IACF,KAAK,IAAI;MACPK,OAAO,GAAGJ,KAAK,CAAC,GAAG,CAAC;MACpBK,WAAW,GAAGN,CAAC,CAAC,CAAC,CAAC;MAClB;IACF,KAAK,IAAI;MACPK,OAAO,GAAGJ,KAAK,CAAC,GAAG,CAAC;MACpBK,WAAW,GAAGN,CAAC,CAAC,CAAC,CAAC;MAClB;IACF,KAAK,IAAI;MACPK,OAAO,GAAGJ,KAAK,CAAC,GAAG,CAAC;MACpBK,WAAW,GAAGN,CAAC,CAAC,CAAC,CAAC;MAClB;IACF,KAAK,IAAI;MACPK,OAAO,GAAGJ,KAAK,CAAC,GAAG,CAAC;MACpBK,WAAW,GAAGN,CAAC,CAAC,CAAC,CAAC;MAClB;EACJ;EAEA,MAAMO,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE,CAACV,KAAK,CAACW,SAAS,GAAGN,GAAG,IAAI,CAAC,CAAC;EACtD,OAAO;IACLA,GAAG;IACHC,OAAO;IACPC,WAAW;IACXK,OAAO,EAAE;MAAEC,GAAG,EAAEL,KAAK;MAAEM,KAAK,EAAEN,KAAK;MAAEO,MAAM,EAAEP,KAAK;MAAEQ,IAAI,EAAER;IAAM;EAClE,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ /** AvatarGroup 唯一的 max 与可见成员归一化入口。 */
4
+ export function normalizeAvatarGroup(items, max) {
5
+ const invalidMax = max !== undefined && (!Number.isFinite(max) || !Number.isInteger(max) || max < 2);
6
+ if (max === undefined || invalidMax || items.length <= max) {
7
+ return {
8
+ visibleItems: items,
9
+ overflowCount: 0,
10
+ invalidMax
11
+ };
12
+ }
13
+ const visibleCount = max - 1;
14
+ return {
15
+ visibleItems: items.slice(0, visibleCount),
16
+ overflowCount: items.length - visibleCount,
17
+ invalidMax: false
18
+ };
19
+ }
20
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["normalizeAvatarGroup","items","max","invalidMax","undefined","Number","isFinite","isInteger","length","visibleItems","overflowCount","visibleCount","slice"],"sourceRoot":"../../../../../src","sources":["components/ui/AvatarGroup/normalize.ts"],"mappings":";;AAQA;AACA,OAAO,SAASA,oBAAoBA,CAClCC,KAAiC,EACjCC,GAAuB,EACA;EACvB,MAAMC,UAAU,GACdD,GAAG,KAAKE,SAAS,KAChB,CAACC,MAAM,CAACC,QAAQ,CAACJ,GAAG,CAAC,IAAI,CAACG,MAAM,CAACE,SAAS,CAACL,GAAG,CAAC,IAAIA,GAAG,GAAG,CAAC,CAAC;EAE9D,IAAIA,GAAG,KAAKE,SAAS,IAAID,UAAU,IAAIF,KAAK,CAACO,MAAM,IAAIN,GAAG,EAAE;IAC1D,OAAO;MAAEO,YAAY,EAAER,KAAK;MAAES,aAAa,EAAE,CAAC;MAAEP;IAAW,CAAC;EAC9D;EAEA,MAAMQ,YAAY,GAAGT,GAAG,GAAG,CAAC;EAC5B,OAAO;IACLO,YAAY,EAAER,KAAK,CAACW,KAAK,CAAC,CAAC,EAAED,YAAY,CAAC;IAC1CD,aAAa,EAAET,KAAK,CAACO,MAAM,GAAGG,YAAY;IAC1CR,UAAU,EAAE;EACd,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ import { StyleSheet } from 'react-native';
4
+ import { fw } from "../../../theme/index.js";
5
+ export const makeStyles = _colors => StyleSheet.create({
6
+ root: {
7
+ alignItems: 'center',
8
+ flexDirection: 'row'
9
+ },
10
+ overflow: {
11
+ alignItems: 'center',
12
+ justifyContent: 'center',
13
+ overflow: 'hidden'
14
+ },
15
+ overflowText: {
16
+ fontWeight: fw.semi,
17
+ lineHeight: undefined
18
+ }
19
+ });
20
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","fw","makeStyles","_colors","create","root","alignItems","flexDirection","overflow","justifyContent","overflowText","fontWeight","semi","lineHeight","undefined"],"sourceRoot":"../../../../../src","sources":["components/ui/AvatarGroup/styles.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SAASC,EAAE,QAA0B,yBAAgB;AAErD,OAAO,MAAMC,UAAU,GAAIC,OAAoB,IAC7CH,UAAU,CAACI,MAAM,CAAC;EAChBC,IAAI,EAAE;IACJC,UAAU,EAAE,QAAQ;IACpBC,aAAa,EAAE;EACjB,CAAC;EACDC,QAAQ,EAAE;IACRF,UAAU,EAAE,QAAQ;IACpBG,cAAc,EAAE,QAAQ;IACxBD,QAAQ,EAAE;EACZ,CAAC;EACDE,YAAY,EAAE;IACZC,UAAU,EAAEV,EAAE,CAACW,IAAI;IACnBC,UAAU,EAAEC;EACd;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../../src","sources":["components/ui/AvatarGroup/types.ts"],"mappings":"","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  export { Avatar } from "./Avatar/index.js";
4
+ export { AvatarGroup } from "./AvatarGroup/index.js";
4
5
  export { BlurLayer } from "./BlurLayer/index.js";
5
6
  export { Button } from "./Button/index.js";
6
7
  export { Card } from "./Card/index.js";
@@ -1 +1 @@
1
- {"version":3,"names":["Avatar","BlurLayer","Button","Card","Carousel","Cell","List","Checkbox","Chip","CircularProgress","confirm","ConfirmHost","DrawerHeader","Empty","EntryCard","Form","FormGroup","FormRow","Grid","Icon","IconButton","Input","Logo","NavBar","PasswordInput","Pulse","PulseDot","usePulse","Radio","Reveal","Ribbon","Search","Skeleton","Segmented","Spinner","StatusDot","Stepper","Switch","TabBar","Tabs","Tag","Textarea","Thumbnail","toast","ToastHost"],"sourceRoot":"../../../../src","sources":["components/ui/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,mBAAU;AAEjC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,EAAEC,IAAI,QAAQ,iBAAQ;AAQnC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,gBAAgB,QAAQ,6BAAoB;AAErD,SAASC,OAAO,EAAEC,WAAW,QAAQ,oBAAW;AAEhD,SAASC,YAAY,QAAQ,yBAAgB;AAE7C,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,IAAI,EAAEC,SAAS,EAAEC,OAAO,QAAQ,iBAAQ;AAEjD,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,UAAU,QAAQ,uBAAc;AAEzC,SAASC,KAAK,QAAQ,kBAAS;AAO/B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,aAAa,QAAQ,0BAAiB;AAE/C,SAASC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,QAAQ,kBAAS;AAEnD,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,GAAG,QAAQ,gBAAO;AAE3B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,KAAK,EAAEC,SAAS,QAAQ,kBAAS","ignoreList":[]}
1
+ {"version":3,"names":["Avatar","AvatarGroup","BlurLayer","Button","Card","Carousel","Cell","List","Checkbox","Chip","CircularProgress","confirm","ConfirmHost","DrawerHeader","Empty","EntryCard","Form","FormGroup","FormRow","Grid","Icon","IconButton","Input","Logo","NavBar","PasswordInput","Pulse","PulseDot","usePulse","Radio","Reveal","Ribbon","Search","Skeleton","Segmented","Spinner","StatusDot","Stepper","Switch","TabBar","Tabs","Tag","Textarea","Thumbnail","toast","ToastHost"],"sourceRoot":"../../../../src","sources":["components/ui/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,mBAAU;AAOjC,SAASC,WAAW,QAAQ,wBAAe;AAE3C,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,EAAEC,IAAI,QAAQ,iBAAQ;AAQnC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,gBAAgB,QAAQ,6BAAoB;AAErD,SAASC,OAAO,EAAEC,WAAW,QAAQ,oBAAW;AAEhD,SAASC,YAAY,QAAQ,yBAAgB;AAE7C,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,IAAI,EAAEC,SAAS,EAAEC,OAAO,QAAQ,iBAAQ;AAEjD,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,UAAU,QAAQ,uBAAc;AAEzC,SAASC,KAAK,QAAQ,kBAAS;AAO/B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,aAAa,QAAQ,0BAAiB;AAE/C,SAASC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,QAAQ,kBAAS;AAEnD,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,GAAG,QAAQ,gBAAO;AAE3B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,KAAK,EAAEC,SAAS,QAAQ,kBAAS","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  /**
3
3
  * Runtime API 人工验证屏 —— 由 `yarn create:runtime-harness` 拷进临时的
4
- * RN 0.86.2 app 里跑,**不属于任何自动化测试**。
4
+ * RN 0.86.3 app 里跑,**不属于任何自动化测试**。
5
5
  *
6
6
  * 它只 import 包根 barrel(与真实消费者一致),用来验证 Jest 覆盖不到的部分:
7
7
  * 真实 native / Web 结构、44pt 命中框、a11y tree、reduced motion 和竞态。
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
2
  import type { AvatarProps } from './types';
3
3
  /**
4
- * 圆形头像 —— 5 档尺寸 × 4 种配色 × 可选图片 source。
4
+ * 头像 —— 2 种形态 × 5 档尺寸 × 4 种配色 × 可选图片 source。
5
5
  *
6
6
  * 合法 source 由 keyed ImageAttempt 独立持有失败状态;非法 source 或加载失败
7
7
  * 时渲染 label + variant 背景色。
8
8
  */
9
- export declare function Avatar({ label, size, variant, source, style, testID, }: AvatarProps): React.JSX.Element;
9
+ export declare function Avatar({ label, size, shape, variant, source, style, testID, }: AvatarProps): React.JSX.Element;
10
10
  //# sourceMappingURL=Avatar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Avatar/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,IAAW,EACX,OAAmB,EACnB,MAAM,EACN,KAAK,EACL,MAAM,GACP,EAAE,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA6CjC"}
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Avatar/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,IAAW,EACX,KAAgB,EAChB,OAAmB,EACnB,MAAM,EACN,KAAK,EACL,MAAM,GACP,EAAE,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA6CjC"}
@@ -1,3 +1,3 @@
1
1
  export { Avatar } from './Avatar';
2
- export type { AvatarProps, AvatarSize, AvatarVariant } from './types';
2
+ export type { AvatarProps, AvatarShape, AvatarSize, AvatarVariant, } from './types';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type ColorTokens } from '../../../theme';
2
- import type { AvatarSize, AvatarVariant } from './types';
3
- /** Avatar 静态 base —— 圆形容器(borderRadius / 尺寸由 sizingFor 派生)。 */
2
+ import type { AvatarShape, AvatarSize, AvatarVariant } from './types';
3
+ /** Avatar 静态 base —— 容器圆角 / 尺寸由 resolver 派生。 */
4
4
  export declare const styles: Readonly<{
5
5
  base: {
6
6
  alignItems: "center";
@@ -22,6 +22,8 @@ export declare function sizingFor(size: AvatarSize): {
22
22
  box: number;
23
23
  fs: number;
24
24
  };
25
+ /** circle 保留直径一半的现有视觉;square 按尺寸使用既有圆角 token。 */
26
+ export declare function resolveAvatarBorderRadius(size: AvatarSize, shape: AvatarShape): number;
25
27
  /** Avatar 配色推导:4 种 variant → { bg, fg }。签名与 Tag/Button 的 paletteFor 一致。 */
26
28
  export declare function paletteFor(variant: AvatarVariant, c: ColorTokens): {
27
29
  bg: string;
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Avatar/styles.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzD,+DAA+D;AAC/D,eAAO,MAAM,MAAM;;;;;;;;;;;;;;EAcjB,CAAC;AAEH;wEACwE;AACxE,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAavE;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,EACtB,CAAC,EAAE,WAAW,GACb;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAW5B"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Avatar/styles.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtE,gDAAgD;AAChD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;EAcjB,CAAC;AAEH;wEACwE;AACxE,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAavE;AAED,iDAAiD;AACjD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,WAAW,GACjB,MAAM,CAKR;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,EACtB,CAAC,EAAE,WAAW,GACb;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAW5B"}
@@ -1,6 +1,8 @@
1
1
  import type { ImageSourcePropType, StyleProp, ViewStyle } from 'react-native';
2
2
  /** 头像尺寸(对应 avatar.xs..xl):xs=18 / sm=28 / md=32 / lg=40 / xl=56 */
3
3
  export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
+ /** 头像形态:circle 为圆形,square 为带 token 圆角的方形。 */
5
+ export type AvatarShape = 'circle' | 'square';
4
6
  /**
5
7
  * 头像配色变体(仅在显示 letter / fallback 时生效,showImage 时被覆盖):
6
8
  * - `brand` 品牌橙底(AI 头像专用)
@@ -17,6 +19,8 @@ export type AvatarProps = {
17
19
  label: string;
18
20
  /** 尺寸,默认 'md' */
19
21
  size?: AvatarSize;
22
+ /** 形态,默认 'circle' */
23
+ shape?: AvatarShape;
20
24
  /** 配色变体,默认 'neutral' */
21
25
  variant?: AvatarVariant;
22
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Avatar/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9E,mEAAmE;AACnE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,wBAAwB;IACxB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,uCAAuC;IACvC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Avatar/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9E,mEAAmE;AACnE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1D,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,qBAAqB;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,wBAAwB;IACxB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,uCAAuC;IACvC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}