@oxyhq/bloom 0.51.0 → 0.52.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.
- package/lib/commonjs/frosted-icon-button/shared.js +11 -1
- package/lib/commonjs/frosted-icon-button/shared.js.map +1 -1
- package/lib/commonjs/tab-bar/TabBarBase.js +30 -5
- package/lib/commonjs/tab-bar/TabBarBase.js.map +1 -1
- package/lib/commonjs/tab-bar/glyph.js +9 -4
- package/lib/commonjs/tab-bar/glyph.js.map +1 -1
- package/lib/commonjs/tab-bar/glyph.native.js +7 -2
- package/lib/commonjs/tab-bar/glyph.native.js.map +1 -1
- package/lib/commonjs/tab-bar/index.js +7 -0
- package/lib/commonjs/tab-bar/index.js.map +1 -1
- package/lib/commonjs/tab-bar/index.web.js +7 -0
- package/lib/commonjs/tab-bar/index.web.js.map +1 -1
- package/lib/commonjs/tab-bar/shared.js +32 -1
- package/lib/commonjs/tab-bar/shared.js.map +1 -1
- package/lib/commonjs/tab-bar/surface-solid.js +43 -0
- package/lib/commonjs/tab-bar/surface-solid.js.map +1 -0
- package/lib/commonjs/tab-bar/surface.js +5 -42
- package/lib/commonjs/tab-bar/surface.js.map +1 -1
- package/lib/commonjs/tab-bar/surface.native.js +65 -8
- package/lib/commonjs/tab-bar/surface.native.js.map +1 -1
- package/lib/commonjs/tab-bar/use-reserved-space.js +50 -0
- package/lib/commonjs/tab-bar/use-reserved-space.js.map +1 -0
- package/lib/module/frosted-icon-button/shared.js +11 -1
- package/lib/module/frosted-icon-button/shared.js.map +1 -1
- package/lib/module/tab-bar/TabBarBase.js +31 -6
- package/lib/module/tab-bar/TabBarBase.js.map +1 -1
- package/lib/module/tab-bar/glyph.js +9 -4
- package/lib/module/tab-bar/glyph.js.map +1 -1
- package/lib/module/tab-bar/glyph.native.js +7 -2
- package/lib/module/tab-bar/glyph.native.js.map +1 -1
- package/lib/module/tab-bar/index.js +1 -0
- package/lib/module/tab-bar/index.js.map +1 -1
- package/lib/module/tab-bar/index.web.js +1 -0
- package/lib/module/tab-bar/index.web.js.map +1 -1
- package/lib/module/tab-bar/shared.js +30 -0
- package/lib/module/tab-bar/shared.js.map +1 -1
- package/lib/module/tab-bar/surface-solid.js +37 -0
- package/lib/module/tab-bar/surface-solid.js.map +1 -0
- package/lib/module/tab-bar/surface.js +10 -23
- package/lib/module/tab-bar/surface.js.map +1 -1
- package/lib/module/tab-bar/surface.native.js +68 -9
- package/lib/module/tab-bar/surface.native.js.map +1 -1
- package/lib/module/tab-bar/use-reserved-space.js +46 -0
- package/lib/module/tab-bar/use-reserved-space.js.map +1 -0
- package/lib/typescript/commonjs/benefit-list/types.d.ts +2 -1
- package/lib/typescript/commonjs/benefit-list/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/fab/types.d.ts +4 -2
- package/lib/typescript/commonjs/fab/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/frosted-icon-button/shared.d.ts +11 -1
- package/lib/typescript/commonjs/frosted-icon-button/shared.d.ts.map +1 -1
- package/lib/typescript/commonjs/frosted-icon-button/types.d.ts +2 -1
- package/lib/typescript/commonjs/frosted-icon-button/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/TabBarBase.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/glyph.d.ts +1 -1
- package/lib/typescript/commonjs/tab-bar/glyph.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/glyph.native.d.ts +1 -1
- package/lib/typescript/commonjs/tab-bar/glyph.native.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/index.d.ts +1 -0
- package/lib/typescript/commonjs/tab-bar/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/index.web.d.ts +1 -0
- package/lib/typescript/commonjs/tab-bar/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/shared.d.ts +25 -0
- package/lib/typescript/commonjs/tab-bar/shared.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/surface-solid.d.ts +6 -0
- package/lib/typescript/commonjs/tab-bar/surface-solid.d.ts.map +1 -0
- package/lib/typescript/commonjs/tab-bar/surface.d.ts +28 -5
- package/lib/typescript/commonjs/tab-bar/surface.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/surface.native.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/types.d.ts +43 -4
- package/lib/typescript/commonjs/tab-bar/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/use-reserved-space.d.ts +25 -0
- package/lib/typescript/commonjs/tab-bar/use-reserved-space.d.ts.map +1 -0
- package/lib/typescript/module/benefit-list/types.d.ts +2 -1
- package/lib/typescript/module/benefit-list/types.d.ts.map +1 -1
- package/lib/typescript/module/fab/types.d.ts +4 -2
- package/lib/typescript/module/fab/types.d.ts.map +1 -1
- package/lib/typescript/module/frosted-icon-button/shared.d.ts +11 -1
- package/lib/typescript/module/frosted-icon-button/shared.d.ts.map +1 -1
- package/lib/typescript/module/frosted-icon-button/types.d.ts +2 -1
- package/lib/typescript/module/frosted-icon-button/types.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/TabBarBase.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/glyph.d.ts +1 -1
- package/lib/typescript/module/tab-bar/glyph.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/glyph.native.d.ts +1 -1
- package/lib/typescript/module/tab-bar/glyph.native.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/index.d.ts +1 -0
- package/lib/typescript/module/tab-bar/index.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/index.web.d.ts +1 -0
- package/lib/typescript/module/tab-bar/index.web.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/shared.d.ts +25 -0
- package/lib/typescript/module/tab-bar/shared.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/surface-solid.d.ts +6 -0
- package/lib/typescript/module/tab-bar/surface-solid.d.ts.map +1 -0
- package/lib/typescript/module/tab-bar/surface.d.ts +28 -5
- package/lib/typescript/module/tab-bar/surface.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/surface.native.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/types.d.ts +43 -4
- package/lib/typescript/module/tab-bar/types.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/use-reserved-space.d.ts +25 -0
- package/lib/typescript/module/tab-bar/use-reserved-space.d.ts.map +1 -0
- package/package.json +2 -8
- package/src/__tests__/TabBar.test.tsx +82 -2
- package/src/__tests__/TabBarGlassFallback.test.tsx +234 -0
- package/src/__tests__/TabBarLongPress.test.tsx +258 -0
- package/src/__tests__/TabBarReservedSpace.test.tsx +150 -0
- package/src/__tests__/TabBarWebFork.test.ts +47 -0
- package/src/__tests__/icon-references.test.ts +243 -0
- package/src/benefit-list/types.ts +2 -1
- package/src/fab/types.ts +4 -2
- package/src/frosted-icon-button/shared.ts +11 -1
- package/src/frosted-icon-button/types.ts +2 -1
- package/src/tab-bar/TabBarBase.tsx +39 -5
- package/src/tab-bar/glyph.native.tsx +5 -2
- package/src/tab-bar/glyph.tsx +8 -4
- package/src/tab-bar/index.ts +1 -0
- package/src/tab-bar/index.web.tsx +1 -0
- package/src/tab-bar/shared.ts +38 -0
- package/src/tab-bar/surface-solid.tsx +40 -0
- package/src/tab-bar/surface.native.tsx +77 -15
- package/src/tab-bar/surface.tsx +10 -29
- package/src/tab-bar/types.ts +43 -4
- package/src/tab-bar/use-reserved-space.ts +44 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/benefit-list/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/benefit-list/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,QAAQ,EAAE,SAAS,CAAC;IACpB,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
|
|
@@ -53,8 +53,10 @@ export interface FabProps {
|
|
|
53
53
|
onPress?: () => void;
|
|
54
54
|
/**
|
|
55
55
|
* The icon to render inside the FAB. Typically a Bloom icon element
|
|
56
|
-
* (`<Icons.
|
|
57
|
-
*
|
|
56
|
+
* (`<Icons.PlusLarge_Stroke2_Corner0_Rounded />` — icon exports carry their full
|
|
57
|
+
* style and corner suffix, and there is no shortened alias). For an icon-only
|
|
58
|
+
* FAB this is the whole content; for the extended variant it sits to the left of
|
|
59
|
+
* the `label`.
|
|
58
60
|
*
|
|
59
61
|
* `children` is accepted as an alias/override of `icon` for ergonomics — if
|
|
60
62
|
* both are given, `icon` wins and `children` is ignored.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/fab/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7D;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,aAAa,GACb,WAAW,GACX,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,WAAW,QAAQ;IACvB,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/fab/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7D;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,aAAa,GACb,WAAW,GACX,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,WAAW,QAAQ;IACvB,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAExB;;;;OAIG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC;IAEzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,8CAA8C;IAC9C,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAUhB,wDAAwD;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC/D,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;CACtC"}
|
|
@@ -52,9 +52,19 @@ export declare function resolveFrostedPalette(colors: ThemeColors, isDark: boole
|
|
|
52
52
|
* Inject `color` as the icon's `fill` — but only as a FALLBACK: if the caller
|
|
53
53
|
* already set an explicit `fill` on the icon element, it wins and the node is
|
|
54
54
|
* returned untouched. Bloom icons resolve their paint as `fill ?? style.color`,
|
|
55
|
-
* so
|
|
55
|
+
* so any bare Bloom icon element gets the theme-aware color for free while an
|
|
56
56
|
* explicitly-colored icon is never overridden. Non-element children (plain
|
|
57
57
|
* text/strings) pass through unchanged.
|
|
58
|
+
*
|
|
59
|
+
* KNOWN LIMIT, deliberately not papered over: an icon component that paints from
|
|
60
|
+
* a `color` PROP rather than from `fill`/`style.color` ignores this entirely, and
|
|
61
|
+
* does so SILENTLY — nothing throws, the glyph renders, it simply never takes the
|
|
62
|
+
* tint. `color` is not injected alongside `fill` because the prop is not ours to
|
|
63
|
+
* claim: components use it for semantic variants (`color="danger"`), so writing an
|
|
64
|
+
* `rgb(…)` string into it can produce a worse failure than the one it fixes, and
|
|
65
|
+
* an icon already carrying its own `color` would be clobbered. Consumers with such
|
|
66
|
+
* a set pre-color the element themselves; the tab bar additionally offers
|
|
67
|
+
* `TabBarItem.activeIcon`, which carries selection by shape instead of by tint.
|
|
58
68
|
*/
|
|
59
69
|
export declare function applyIconColor(node: ReactNode, color: string): ReactNode;
|
|
60
70
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/frosted-icon-button/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AAGxF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;CACd;AASD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,GAAG,eAAe,CASxF;AAiBD,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,cAAc,CAa1F;AAKD
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/frosted-icon-button/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AAGxF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;CACd;AASD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,GAAG,eAAe,CASxF;AAiBD,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,cAAc,CAa1F;AAKD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAKxE"}
|
|
@@ -15,7 +15,8 @@ export interface FrostedIconButtonProps {
|
|
|
15
15
|
onPress?: () => void;
|
|
16
16
|
/**
|
|
17
17
|
* The icon to render, centered inside the circle. Typically a Bloom icon
|
|
18
|
-
* element (`<Icons.
|
|
18
|
+
* element (`<Icons.ArrowLeft_Stroke2_Corner0_Rounded />` — icon exports carry
|
|
19
|
+
* their full style and corner suffix). If the icon does not set its own `fill`,
|
|
19
20
|
* the button injects the theme-aware icon color (foreground when frosted,
|
|
20
21
|
* `primaryForeground` when `active`) as a fallback so a bare icon is colored
|
|
21
22
|
* correctly out of the box; an explicit `fill` on the icon always wins.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/frosted-icon-button/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/frosted-icon-button/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,IAAI,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IAEtC,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAUvE,wDAAwD;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC/D,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;CACtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabBarBase.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/TabBarBase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAgBf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,
|
|
1
|
+
{"version":3,"file":"TabBarBase.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/TabBarBase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAgBf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAiBL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AAqa3E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAC1C,IAAI,EAAE,aAAa,CAAC,oBAAoB,CAAC;YAElB,WAAW;;EAGnC;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC;YAC1C,iBAAiB;;EAG/C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TabBarGlyphProps } from './shared';
|
|
2
|
-
export declare function TabBarGlyph({ item, tint, size }: TabBarGlyphProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function TabBarGlyph({ item, tint, size, active }: TabBarGlyphProps): import("react/jsx-runtime").JSX.Element;
|
|
3
3
|
export declare namespace TabBarGlyph {
|
|
4
4
|
var displayName: string;
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glyph.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/glyph.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"glyph.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/glyph.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,gBAAgB,2CAazE;yBAbe,WAAW"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TabBarGlyphProps } from './shared';
|
|
2
|
-
export declare function TabBarGlyph({ item, tint, size }: TabBarGlyphProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function TabBarGlyph({ item, tint, size, active }: TabBarGlyphProps): import("react/jsx-runtime").JSX.Element;
|
|
3
3
|
export declare namespace TabBarGlyph {
|
|
4
4
|
var displayName: string;
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glyph.native.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/glyph.native.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"glyph.native.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/glyph.native.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,gBAAgB,2CA2BzE;yBA3Be,WAAW"}
|
|
@@ -8,5 +8,6 @@ export declare const TabBarButton: {
|
|
|
8
8
|
};
|
|
9
9
|
export { MINIMIZE_SPRING, setMinimized, TabBarMinimizeProvider, useMinimizeOnScroll, useMinimizeState, useTabBarMinimized, } from './minimize-context';
|
|
10
10
|
export type { MinimizeState } from './minimize-context';
|
|
11
|
+
export { useTabBarReservedSpace } from './use-reserved-space';
|
|
11
12
|
export type { TabBarButtonProps, TabBarItem, TabBarProps, TabBarTheme } from './types';
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/index.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,MAAM;;;CAA+C,CAAC;AACnE,eAAO,MAAM,YAAY;;;CAAkC,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/index.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,MAAM;;;CAA+C,CAAC;AACnE,eAAO,MAAM,YAAY;;;CAAkC,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -8,5 +8,6 @@ export declare const TabBarButton: {
|
|
|
8
8
|
};
|
|
9
9
|
export { MINIMIZE_SPRING, setMinimized, TabBarMinimizeProvider, useMinimizeOnScroll, useMinimizeState, useTabBarMinimized, } from './minimize-context';
|
|
10
10
|
export type { MinimizeState } from './minimize-context';
|
|
11
|
+
export { useTabBarReservedSpace } from './use-reserved-space';
|
|
11
12
|
export type { TabBarButtonProps, TabBarItem, TabBarProps, TabBarTheme } from './types';
|
|
12
13
|
//# sourceMappingURL=index.web.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/index.web.tsx"],"names":[],"mappings":"AAqBA,eAAO,MAAM,MAAM;;;CAA+C,CAAC;AACnE,eAAO,MAAM,YAAY;;;CAAkC,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/index.web.tsx"],"names":[],"mappings":"AAqBA,eAAO,MAAM,MAAM;;;CAA+C,CAAC;AACnE,eAAO,MAAM,YAAY;;;CAAkC,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -26,6 +26,15 @@ export declare const HIGHLIGHT_MINIMIZED: number;
|
|
|
26
26
|
export declare const BLUR_BLEED = 44;
|
|
27
27
|
/** Label type size. Small by design — the icon carries the meaning. */
|
|
28
28
|
export declare const LABEL_FONT_SIZE = 9.5;
|
|
29
|
+
/**
|
|
30
|
+
* Vertical gap between the bottom of the pill and the bottom of the window.
|
|
31
|
+
*
|
|
32
|
+
* The safe-area inset is folded in HERE, which is why anything reserving layout
|
|
33
|
+
* space for the bar must go through `useTabBarReservedSpace` (which derives its
|
|
34
|
+
* number from this same function) rather than adding `insets.bottom` to a
|
|
35
|
+
* hardcoded height — that double-counts the inset.
|
|
36
|
+
*/
|
|
37
|
+
export declare function tabBarBottomGap(bottomInset: number): number;
|
|
29
38
|
/**
|
|
30
39
|
* Slide spring: interruptible by design — rapid tab-hopping retargets with
|
|
31
40
|
* preserved velocity. Slight under-damping gives the pill a tiny settle, safe
|
|
@@ -35,6 +44,14 @@ export declare const SLIDE_SPRING: {
|
|
|
35
44
|
duration: number;
|
|
36
45
|
dampingRatio: number;
|
|
37
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* How long a press must be held before `onIndexLongPress` fires.
|
|
49
|
+
*
|
|
50
|
+
* Comfortably above the tap gesture's own 400ms ceiling: the two can never both
|
|
51
|
+
* be candidates at the same instant, so arming the long press cannot cost the
|
|
52
|
+
* bar a tap. Matches the platform long-press feel (iOS ~0.5s).
|
|
53
|
+
*/
|
|
54
|
+
export declare const LONG_PRESS_MIN_DURATION = 500;
|
|
38
55
|
/**
|
|
39
56
|
* Resolve the bar's five colors from Bloom's theme tokens, with an optional
|
|
40
57
|
* partial override on top.
|
|
@@ -89,5 +106,13 @@ export interface TabBarGlyphProps {
|
|
|
89
106
|
tint: string;
|
|
90
107
|
/** Rendered icon size in px ({@link ICON_SIZE}). */
|
|
91
108
|
size: number;
|
|
109
|
+
/**
|
|
110
|
+
* Which crossfade layer this is: `false` for the inactive one underneath,
|
|
111
|
+
* `true` for the one fading in on top. The active layer renders
|
|
112
|
+
* `item.activeIcon` when the item has one, so a set that expresses selection
|
|
113
|
+
* by shape (outline → filled) crossfades between two different nodes rather
|
|
114
|
+
* than between two tints of the same node.
|
|
115
|
+
*/
|
|
116
|
+
active: boolean;
|
|
92
117
|
}
|
|
93
118
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/shared.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAWvD,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,4EAA4E;AAC5E,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,qEAAqE;AACrE,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,8DAA8D;AAC9D,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B;;;GAGG;AACH,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,WAAW,QAA0B,CAAC;AACnD,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA6B,CAAC;AAC9D,iEAAiE;AACjE,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,uEAAuE;AACvE,eAAO,MAAM,eAAe,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/shared.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAWvD,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,4EAA4E;AAC5E,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,qEAAqE;AACrE,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,8DAA8D;AAC9D,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B;;;GAGG;AACH,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,WAAW,QAA0B,CAAC;AACnD,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA6B,CAAC;AAC9D,iEAAiE;AACjE,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,uEAAuE;AACvE,eAAO,MAAM,eAAe,MAAM,CAAC;AAWnC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;CAAwC,CAAC;AAElE;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAM3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC/B,WAAW,CAQb;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAe5E;AAaD,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,KAAK,EAAE,WAAW,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,KAAK,EAAE,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,MAAM,EAAE,OAAO,CAAC;CACjB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TabBarSurfaceProps } from './shared';
|
|
2
|
+
export declare function SolidTabBarSurface({ theme, style }: TabBarSurfaceProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export declare namespace SolidTabBarSurface {
|
|
4
|
+
var displayName: string;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=surface-solid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-solid.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/surface-solid.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,2CAWtE;yBAXe,kBAAkB"}
|
|
@@ -1,6 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Ported from expo-glass-tabs v0.1.1 — src/glass-tab-bar.tsx
|
|
3
|
+
* (MIT © 2026 David Mokos). See the top-level NOTICE.
|
|
4
|
+
*
|
|
5
|
+
* NEUTRAL default variant of the tab bar's capsule surface: the non-glass one.
|
|
6
|
+
*
|
|
7
|
+
* This is the file resolved by everything that does NOT do React Native's
|
|
8
|
+
* platform-extension resolution — a consumer's `tsc` (which follows Bloom's
|
|
9
|
+
* `"react-native"` source export condition) and any non-Metro bundler reading
|
|
10
|
+
* the published `lib/`. It therefore imports NOTHING platform-specific:
|
|
11
|
+
* `expo-glass-effect` is native-only, and a static import of it from a file a
|
|
12
|
+
* web bundler or a consumer's type-checker resolves would break module
|
|
13
|
+
* resolution outright. Same three-way split, for the same reason, as
|
|
14
|
+
* `theme/native-root-vars{,.native,.web}.ts`.
|
|
15
|
+
*
|
|
16
|
+
* The surface itself lives in `surface-solid.tsx`, because `surface.native.tsx`
|
|
17
|
+
* renders it as its own fallback and cannot import this file to get it — Metro
|
|
18
|
+
* resolves `./surface` back to `surface.native.tsx`, i.e. to itself. This module's
|
|
19
|
+
* job is to give that one implementation the name every entry module imports.
|
|
20
|
+
*
|
|
21
|
+
* The variants — all three implement `TabBarSurfaceProps` exactly, so the entry
|
|
22
|
+
* modules can swap them freely:
|
|
23
|
+
* - `surface.native.tsx` — iOS/Android (Metro), real `UIGlassEffect` glass, with
|
|
24
|
+
* the solid surface as its fallback;
|
|
25
|
+
* - `surface.web.tsx` — web, a CSS `backdrop-filter`;
|
|
26
|
+
* - this file — everywhere else, the opaque fallback alone.
|
|
27
|
+
*/
|
|
28
|
+
export { SolidTabBarSurface as TabBarSurface } from './surface-solid';
|
|
6
29
|
//# sourceMappingURL=surface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/surface.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/surface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,kBAAkB,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface.native.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/surface.native.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"surface.native.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/surface.native.tsx"],"names":[],"mappings":"AAmDA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AA8CnD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,2CAgBjE;yBAhBe,aAAa"}
|
|
@@ -18,13 +18,38 @@ export type TabBarItem = {
|
|
|
18
18
|
/** Text under the icon; fades out and is clipped when the bar minimizes. */
|
|
19
19
|
label: string;
|
|
20
20
|
/**
|
|
21
|
-
* The glyph, as a Bloom icon element (`<Icons.
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* The glyph, as a Bloom icon element (`<Icons.Home_Stroke2_Corner0_Rounded />`)
|
|
22
|
+
* or any node. Every `@oxyhq/bloom/icons` export carries its full style and
|
|
23
|
+
* corner suffix; a shortened `Home` is not an export, and a name that does not
|
|
24
|
+
* exist is simply `undefined`, which React then rejects as an invalid element
|
|
25
|
+
* type. This is the primary icon API — same convention as `Tabs`/`TabsTrigger`
|
|
26
|
+
* and `FrostedIconButton`. The bar renders it TWICE (an inactive layer with the
|
|
24
27
|
* active layer crossfading on top), injecting the layer's tint as the icon's
|
|
25
|
-
* `fill` unless the element already sets one.
|
|
28
|
+
* `fill` unless the element already sets one. See {@link TabBarItem.activeIcon}
|
|
29
|
+
* for a set whose selected state is a different shape rather than a tint.
|
|
26
30
|
*/
|
|
27
31
|
icon: ReactNode;
|
|
32
|
+
/**
|
|
33
|
+
* Optional second node rendered by the ACTIVE crossfade layer instead of
|
|
34
|
+
* `icon`; without it that layer renders `icon` again, which is the original
|
|
35
|
+
* behaviour.
|
|
36
|
+
*
|
|
37
|
+
* For icon sets that express selection by SHAPE rather than by tint — an
|
|
38
|
+
* outline glyph that becomes a filled one, with a different path — a tint
|
|
39
|
+
* crossfade cannot say what the set says, because both layers would draw the
|
|
40
|
+
* same shape in two colors. Supplying the filled variant here makes the
|
|
41
|
+
* existing crossfade swap NODES, so the outline dissolves into the fill.
|
|
42
|
+
*
|
|
43
|
+
* It is also the escape hatch for an icon that ignores the injected tint: the
|
|
44
|
+
* bar tints a glyph by cloning it with a `fill` prop (see `applyIconColor`),
|
|
45
|
+
* so an icon set that paints from a `color` prop instead never lights up, with
|
|
46
|
+
* no error. Pre-color both nodes yourself and the crossfade still works.
|
|
47
|
+
*
|
|
48
|
+
* On iOS an item carrying `sfSymbol` renders the symbol on both layers and
|
|
49
|
+
* ignores this — a symbol is tinted natively, so the tint crossfade is the
|
|
50
|
+
* right expression there.
|
|
51
|
+
*/
|
|
52
|
+
activeIcon?: ReactNode;
|
|
28
53
|
/**
|
|
29
54
|
* Optional SF Symbol name, used INSTEAD of `icon` on iOS only. A pure
|
|
30
55
|
* enhancement handled solely in `glyph.native.tsx`; the neutral and web
|
|
@@ -57,6 +82,20 @@ export type TabBarProps = ViewProps & {
|
|
|
57
82
|
* or by keyboard/assistive-technology activation of a `TabBarButton`.
|
|
58
83
|
*/
|
|
59
84
|
onIndexChange?: (index: number) => void;
|
|
85
|
+
/**
|
|
86
|
+
* Called with the index under the finger when a tab is pressed and HELD.
|
|
87
|
+
*
|
|
88
|
+
* This is the only way to reach a long press on the bar: its gesture detector
|
|
89
|
+
* consumes the touches (that is what makes scrubbing possible), so a button's
|
|
90
|
+
* own `onLongPress` never fires for a real finger. The gesture is added to the
|
|
91
|
+
* bar's gesture race only when this prop is supplied — holding still for half
|
|
92
|
+
* a second on a bar without it keeps behaving exactly as before, and can still
|
|
93
|
+
* start a scrub.
|
|
94
|
+
*
|
|
95
|
+
* Long-pressing does NOT move the highlight or select the tab; it is a
|
|
96
|
+
* secondary action (an account switcher on the profile tab, say).
|
|
97
|
+
*/
|
|
98
|
+
onIndexLongPress?: (index: number) => void;
|
|
60
99
|
/** Partial override of the theme resolved from Bloom's color tokens. */
|
|
61
100
|
theme?: Partial<TabBarTheme>;
|
|
62
101
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,IAAI,EAAE,UAAU,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The vertical space the tab bar occupies above the bottom of the window, in
|
|
3
|
+
* px. Use it directly as the bottom padding (or bottom offset) of anything that
|
|
4
|
+
* would otherwise sit under the bar:
|
|
5
|
+
*
|
|
6
|
+
* ```tsx
|
|
7
|
+
* const reserved = useTabBarReservedSpace();
|
|
8
|
+
*
|
|
9
|
+
* <Animated.ScrollView contentContainerStyle={{ paddingBottom: reserved }} />
|
|
10
|
+
* <Fab style={{ position: 'absolute', right: 16, bottom: reserved + 12 }} />
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* The value ALREADY INCLUDES the bottom safe-area inset — the bar folds the
|
|
14
|
+
* inset into its own bottom gap, so it is measured from the true window edge,
|
|
15
|
+
* not from the safe area. Never write `reserved + insets.bottom`: that counts
|
|
16
|
+
* the home indicator twice and strands a visible band of dead space under every
|
|
17
|
+
* list (a 76px bar reserving 110px on an iOS device or PWA). It is the whole
|
|
18
|
+
* number; nothing needs adding to it.
|
|
19
|
+
*
|
|
20
|
+
* It is the EXPANDED height, deliberately. The bar minimizes while scrolling
|
|
21
|
+
* down and re-expands on the way up, so reserving the minimized height would
|
|
22
|
+
* hide the end of a list the moment the user scrolled back to it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function useTabBarReservedSpace(): number;
|
|
25
|
+
//# sourceMappingURL=use-reserved-space.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-reserved-space.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/use-reserved-space.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxyhq/bloom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.52.0",
|
|
4
4
|
"description": "Bloom UI — Oxy ecosystem component library for React Native + Expo + Web",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -1189,7 +1189,7 @@
|
|
|
1189
1189
|
"expo": "*",
|
|
1190
1190
|
"expo-blur": "*",
|
|
1191
1191
|
"expo-font": "*",
|
|
1192
|
-
"expo-glass-effect": ">=0.1.
|
|
1192
|
+
"expo-glass-effect": ">=0.1.9",
|
|
1193
1193
|
"expo-haptics": "*",
|
|
1194
1194
|
"expo-image": "*",
|
|
1195
1195
|
"expo-router": ">=3.0.0",
|
|
@@ -1211,18 +1211,12 @@
|
|
|
1211
1211
|
"expo-font": {
|
|
1212
1212
|
"optional": true
|
|
1213
1213
|
},
|
|
1214
|
-
"expo-glass-effect": {
|
|
1215
|
-
"optional": true
|
|
1216
|
-
},
|
|
1217
1214
|
"expo-haptics": {
|
|
1218
1215
|
"optional": true
|
|
1219
1216
|
},
|
|
1220
1217
|
"expo-router": {
|
|
1221
1218
|
"optional": true
|
|
1222
1219
|
},
|
|
1223
|
-
"expo-symbols": {
|
|
1224
|
-
"optional": true
|
|
1225
|
-
},
|
|
1226
1220
|
"react-dom": {
|
|
1227
1221
|
"optional": true
|
|
1228
1222
|
},
|
|
@@ -46,6 +46,17 @@ const ITEMS: TabBarItem[] = [
|
|
|
46
46
|
{ name: 'you', label: 'You', icon: <BareIcon id="you-icon" /> },
|
|
47
47
|
];
|
|
48
48
|
|
|
49
|
+
/**
|
|
50
|
+
* An item whose selected state is a different SHAPE, not a different tint —
|
|
51
|
+
* the icon-set convention (outline vs filled) that `activeIcon` exists for.
|
|
52
|
+
*/
|
|
53
|
+
const SHAPE_ITEM: TabBarItem = {
|
|
54
|
+
name: 'home',
|
|
55
|
+
label: 'Home',
|
|
56
|
+
icon: <BareIcon id="outline-icon" />,
|
|
57
|
+
activeIcon: <BareIcon id="filled-icon" />,
|
|
58
|
+
};
|
|
59
|
+
|
|
49
60
|
/** Captures the live `ThemeColors` so assertions compare against real tokens. */
|
|
50
61
|
function ThemeProbe({ onColors }: { onColors: (colors: ThemeColors) => void }) {
|
|
51
62
|
onColors(useTheme().colors);
|
|
@@ -259,6 +270,75 @@ describe('TabBar', () => {
|
|
|
259
270
|
expect(flattenStyle(labelFor(UNSAFE_root, 'Home').props.style).color).toBe(theme.inactiveTint);
|
|
260
271
|
});
|
|
261
272
|
|
|
273
|
+
describe('activeIcon', () => {
|
|
274
|
+
function ShapeBar() {
|
|
275
|
+
return (
|
|
276
|
+
<TabBar activeIndex={0}>
|
|
277
|
+
<TabBarButton item={SHAPE_ITEM} index={0} />
|
|
278
|
+
</TabBar>
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
it('renders the item icon underneath and activeIcon on the crossfade layer', () => {
|
|
283
|
+
// A tint crossfade cannot express an outline-to-filled swap: both layers
|
|
284
|
+
// would draw the same path in two colors. The layers must render two
|
|
285
|
+
// different NODES.
|
|
286
|
+
const { getAllByTestId } = renderWithTheme(<ShapeBar />);
|
|
287
|
+
expect(getAllByTestId('outline-icon')).toHaveLength(1);
|
|
288
|
+
expect(getAllByTestId('filled-icon')).toHaveLength(1);
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
it('puts activeIcon on the ACTIVE layer, not the inactive one', () => {
|
|
292
|
+
// The tint each node was cloned with is what identifies its layer — the
|
|
293
|
+
// crossfading layer is the one painted with `activeTint`.
|
|
294
|
+
const theme = readTheme();
|
|
295
|
+
const { getAllByTestId } = renderWithTheme(<ShapeBar />);
|
|
296
|
+
expect(getAllByTestId('filled-icon')[0]?.props.fill).toBe(theme.activeTint);
|
|
297
|
+
expect(getAllByTestId('outline-icon')[0]?.props.fill).toBe(theme.inactiveTint);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
it('falls back to icon on both layers when the item has no activeIcon', () => {
|
|
301
|
+
// Full backward compatibility: an item that only carries `icon` behaves
|
|
302
|
+
// exactly as it did before `activeIcon` existed.
|
|
303
|
+
const theme = readTheme();
|
|
304
|
+
const { getAllByTestId } = renderWithTheme(<Bar activeIndex={0} />);
|
|
305
|
+
const fills = getAllByTestId('home-icon').map((node) => node.props.fill);
|
|
306
|
+
expect(fills).toHaveLength(2);
|
|
307
|
+
expect(fills).toEqual(expect.arrayContaining([theme.inactiveTint, theme.activeTint]));
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
it('is honoured by the native glyph too, per crossfade layer', () => {
|
|
311
|
+
const theme = readTheme();
|
|
312
|
+
const active = renderWithTheme(
|
|
313
|
+
<NativeTabBarGlyph item={SHAPE_ITEM} tint={theme.activeTint} size={21} active />,
|
|
314
|
+
);
|
|
315
|
+
expect(active.queryByTestId('filled-icon')).toBeTruthy();
|
|
316
|
+
expect(active.queryByTestId('outline-icon')).toBeNull();
|
|
317
|
+
|
|
318
|
+
const inactive = renderWithTheme(
|
|
319
|
+
<NativeTabBarGlyph item={SHAPE_ITEM} tint={theme.inactiveTint} size={21} active={false} />,
|
|
320
|
+
);
|
|
321
|
+
expect(inactive.queryByTestId('outline-icon')).toBeTruthy();
|
|
322
|
+
expect(inactive.queryByTestId('filled-icon')).toBeNull();
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
it('keeps the SF Symbol path on iOS, which is tinted natively', () => {
|
|
326
|
+
// A symbol IS tinted per layer by the system, so the tint crossfade is
|
|
327
|
+
// still the right expression there and `activeIcon` stays unused.
|
|
328
|
+
const theme = readTheme();
|
|
329
|
+
const { UNSAFE_root, queryByTestId } = renderWithTheme(
|
|
330
|
+
<NativeTabBarGlyph
|
|
331
|
+
item={{ ...SHAPE_ITEM, sfSymbol: 'house.fill' }}
|
|
332
|
+
tint={theme.activeTint}
|
|
333
|
+
size={21}
|
|
334
|
+
active
|
|
335
|
+
/>,
|
|
336
|
+
);
|
|
337
|
+
expect(hosts(UNSAFE_root, 'SymbolView')).toHaveLength(1);
|
|
338
|
+
expect(queryByTestId('filled-icon')).toBeNull();
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
|
|
262
342
|
describe('theming', () => {
|
|
263
343
|
it('resolves its defaults from Bloom tokens, never a hardcoded palette', () => {
|
|
264
344
|
const theme = readTheme();
|
|
@@ -322,7 +402,7 @@ describe('TabBar', () => {
|
|
|
322
402
|
const theme = readTheme();
|
|
323
403
|
const item: TabBarItem = { ...(ITEMS[0] as TabBarItem), sfSymbol: 'house.fill' };
|
|
324
404
|
const { UNSAFE_root } = renderWithTheme(
|
|
325
|
-
<NativeTabBarGlyph item={item} tint={theme.activeTint} size={21} />,
|
|
405
|
+
<NativeTabBarGlyph item={item} tint={theme.activeTint} size={21} active />,
|
|
326
406
|
);
|
|
327
407
|
const symbol = hosts(UNSAFE_root, 'SymbolView')[0];
|
|
328
408
|
expect(symbol?.props.name).toBe('house.fill');
|
|
@@ -333,7 +413,7 @@ describe('TabBar', () => {
|
|
|
333
413
|
it('falls back to the item icon when no SF Symbol is given', () => {
|
|
334
414
|
const theme = readTheme();
|
|
335
415
|
const { queryByTestId, UNSAFE_root } = renderWithTheme(
|
|
336
|
-
<NativeTabBarGlyph item={ITEMS[0] as TabBarItem} tint={theme.activeTint} size={21} />,
|
|
416
|
+
<NativeTabBarGlyph item={ITEMS[0] as TabBarItem} tint={theme.activeTint} size={21} active />,
|
|
337
417
|
);
|
|
338
418
|
expect(hosts(UNSAFE_root, 'SymbolView')).toHaveLength(0);
|
|
339
419
|
expect(queryByTestId('home-icon')).toBeTruthy();
|