@oxy.so/bloom 4.15.0 → 4.16.1
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/docs/app-shell.mdx +74 -6
- package/docs/bottom-bar.mdx +9 -1
- package/docs/hooks.mdx +23 -0
- package/docs/sidebar.mdx +15 -2
- package/docs/tab-bar.mdx +1 -1
- package/lib/commonjs/app-shell/AppShell.js +3 -1
- package/lib/commonjs/app-shell/AppShell.js.map +1 -1
- package/lib/commonjs/app-shell/AppShellEngine.js +54 -28
- package/lib/commonjs/app-shell/AppShellEngine.js.map +1 -1
- package/lib/commonjs/app-shell/AppShellHeader.js +4 -3
- package/lib/commonjs/app-shell/AppShellHeader.js.map +1 -1
- package/lib/commonjs/app-shell/NotificationBell.js +8 -4
- package/lib/commonjs/app-shell/NotificationBell.js.map +1 -1
- package/lib/commonjs/app-shell/ProOfferCard.js +19 -11
- package/lib/commonjs/app-shell/ProOfferCard.js.map +1 -1
- package/lib/commonjs/bottom-bar/BottomBarBase.js +9 -2
- package/lib/commonjs/bottom-bar/BottomBarBase.js.map +1 -1
- package/lib/commonjs/hooks/index.js +7 -0
- package/lib/commonjs/hooks/index.js.map +1 -1
- package/lib/commonjs/hooks/use-is-rtl.js +104 -0
- package/lib/commonjs/hooks/use-is-rtl.js.map +1 -0
- package/lib/commonjs/sidebar/Sidebar.js +41 -22
- package/lib/commonjs/sidebar/Sidebar.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarFolder.js +11 -5
- package/lib/commonjs/sidebar/SidebarFolder.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarLogoView.js +2 -2
- package/lib/commonjs/sidebar/SidebarLogoView.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarModeSwitcher.js +1 -1
- package/lib/commonjs/sidebar/SidebarModeSwitcher.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarPlanCard.js +3 -3
- package/lib/commonjs/sidebar/SidebarPlanCard.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarRail.js +7 -1
- package/lib/commonjs/sidebar/SidebarRail.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarRailItem.js +2 -2
- package/lib/commonjs/sidebar/SidebarRailItem.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarTeamMenu.js +12 -7
- package/lib/commonjs/sidebar/SidebarTeamMenu.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarUserMenu.js +9 -5
- package/lib/commonjs/sidebar/SidebarUserMenu.js.map +1 -1
- package/lib/commonjs/tab-bar/TabBarBase.js +57 -21
- package/lib/commonjs/tab-bar/TabBarBase.js.map +1 -1
- package/lib/module/app-shell/AppShell.js +3 -1
- package/lib/module/app-shell/AppShell.js.map +1 -1
- package/lib/module/app-shell/AppShellEngine.js +54 -28
- package/lib/module/app-shell/AppShellEngine.js.map +1 -1
- package/lib/module/app-shell/AppShellHeader.js +4 -3
- package/lib/module/app-shell/AppShellHeader.js.map +1 -1
- package/lib/module/app-shell/NotificationBell.js +8 -4
- package/lib/module/app-shell/NotificationBell.js.map +1 -1
- package/lib/module/app-shell/ProOfferCard.js +19 -11
- package/lib/module/app-shell/ProOfferCard.js.map +1 -1
- package/lib/module/bottom-bar/BottomBarBase.js +9 -2
- package/lib/module/bottom-bar/BottomBarBase.js.map +1 -1
- package/lib/module/hooks/index.js +1 -0
- package/lib/module/hooks/index.js.map +1 -1
- package/lib/module/hooks/use-is-rtl.js +97 -0
- package/lib/module/hooks/use-is-rtl.js.map +1 -0
- package/lib/module/sidebar/Sidebar.js +41 -22
- package/lib/module/sidebar/Sidebar.js.map +1 -1
- package/lib/module/sidebar/SidebarFolder.js +11 -5
- package/lib/module/sidebar/SidebarFolder.js.map +1 -1
- package/lib/module/sidebar/SidebarLogoView.js +2 -2
- package/lib/module/sidebar/SidebarLogoView.js.map +1 -1
- package/lib/module/sidebar/SidebarModeSwitcher.js +1 -1
- package/lib/module/sidebar/SidebarModeSwitcher.js.map +1 -1
- package/lib/module/sidebar/SidebarPlanCard.js +3 -3
- package/lib/module/sidebar/SidebarPlanCard.js.map +1 -1
- package/lib/module/sidebar/SidebarRail.js +7 -1
- package/lib/module/sidebar/SidebarRail.js.map +1 -1
- package/lib/module/sidebar/SidebarRailItem.js +2 -2
- package/lib/module/sidebar/SidebarRailItem.js.map +1 -1
- package/lib/module/sidebar/SidebarTeamMenu.js +12 -7
- package/lib/module/sidebar/SidebarTeamMenu.js.map +1 -1
- package/lib/module/sidebar/SidebarUserMenu.js +9 -5
- package/lib/module/sidebar/SidebarUserMenu.js.map +1 -1
- package/lib/module/tab-bar/TabBarBase.js +57 -21
- package/lib/module/tab-bar/TabBarBase.js.map +1 -1
- package/lib/typescript/commonjs/app-shell/AppShellEngine.d.ts.map +1 -1
- package/lib/typescript/commonjs/app-shell/AppShellHeader.d.ts.map +1 -1
- package/lib/typescript/commonjs/app-shell/NotificationBell.d.ts.map +1 -1
- package/lib/typescript/commonjs/app-shell/ProOfferCard.d.ts.map +1 -1
- package/lib/typescript/commonjs/app-shell/types.d.ts +16 -5
- package/lib/typescript/commonjs/app-shell/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/bottom-bar/BottomBarBase.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/index.d.ts +1 -0
- package/lib/typescript/commonjs/hooks/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/use-is-rtl.d.ts +53 -0
- package/lib/typescript/commonjs/hooks/use-is-rtl.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/shared.d.ts +10 -10
- package/lib/typescript/commonjs/sidebar/Sidebar.d.ts.map +1 -1
- package/lib/typescript/commonjs/sidebar/SidebarFolder.d.ts.map +1 -1
- package/lib/typescript/commonjs/sidebar/SidebarRail.d.ts +1 -1
- package/lib/typescript/commonjs/sidebar/SidebarRail.d.ts.map +1 -1
- package/lib/typescript/commonjs/sidebar/SidebarTeamMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/sidebar/SidebarUserMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/sidebar/types.d.ts +24 -3
- package/lib/typescript/commonjs/sidebar/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/TabBarBase.d.ts.map +1 -1
- package/lib/typescript/module/app-shell/AppShellEngine.d.ts.map +1 -1
- package/lib/typescript/module/app-shell/AppShellHeader.d.ts.map +1 -1
- package/lib/typescript/module/app-shell/NotificationBell.d.ts.map +1 -1
- package/lib/typescript/module/app-shell/ProOfferCard.d.ts.map +1 -1
- package/lib/typescript/module/app-shell/types.d.ts +16 -5
- package/lib/typescript/module/app-shell/types.d.ts.map +1 -1
- package/lib/typescript/module/bottom-bar/BottomBarBase.d.ts.map +1 -1
- package/lib/typescript/module/hooks/index.d.ts +1 -0
- package/lib/typescript/module/hooks/index.d.ts.map +1 -1
- package/lib/typescript/module/hooks/use-is-rtl.d.ts +53 -0
- package/lib/typescript/module/hooks/use-is-rtl.d.ts.map +1 -0
- package/lib/typescript/module/icons/shared.d.ts +10 -10
- package/lib/typescript/module/sidebar/Sidebar.d.ts.map +1 -1
- package/lib/typescript/module/sidebar/SidebarFolder.d.ts.map +1 -1
- package/lib/typescript/module/sidebar/SidebarRail.d.ts +1 -1
- package/lib/typescript/module/sidebar/SidebarRail.d.ts.map +1 -1
- package/lib/typescript/module/sidebar/SidebarTeamMenu.d.ts.map +1 -1
- package/lib/typescript/module/sidebar/SidebarUserMenu.d.ts.map +1 -1
- package/lib/typescript/module/sidebar/types.d.ts +24 -3
- package/lib/typescript/module/sidebar/types.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/TabBarBase.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/app-shell/AppShell.tsx +1 -1
- package/src/app-shell/AppShellEngine.tsx +45 -24
- package/src/app-shell/AppShellHeader.tsx +4 -3
- package/src/app-shell/NotificationBell.tsx +8 -4
- package/src/app-shell/ProOfferCard.tsx +18 -10
- package/src/app-shell/types.ts +16 -5
- package/src/bottom-bar/BottomBarBase.tsx +9 -3
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-is-rtl.ts +102 -0
- package/src/sidebar/Sidebar.tsx +41 -21
- package/src/sidebar/SidebarFolder.tsx +7 -4
- package/src/sidebar/SidebarLogoView.tsx +2 -2
- package/src/sidebar/SidebarModeSwitcher.tsx +1 -1
- package/src/sidebar/SidebarPlanCard.tsx +3 -3
- package/src/sidebar/SidebarRail.tsx +7 -1
- package/src/sidebar/SidebarRailItem.tsx +2 -2
- package/src/sidebar/SidebarTeamMenu.tsx +10 -6
- package/src/sidebar/SidebarUserMenu.tsx +8 -5
- package/src/sidebar/types.ts +25 -3
- package/src/tab-bar/TabBarBase.tsx +58 -21
|
@@ -24,7 +24,7 @@ export interface SidebarNavItem {
|
|
|
24
24
|
activeIcon?: SidebarIcon;
|
|
25
25
|
/** Link target. On web the row renders a real anchor. */
|
|
26
26
|
href?: string;
|
|
27
|
-
/** Counter badge
|
|
27
|
+
/** Counter badge at the row's end (the right in LTR); primary-tinted when the row is selected. */
|
|
28
28
|
badge?: string | number;
|
|
29
29
|
/**
|
|
30
30
|
* An ACTION row (Settings → a modal): intercepts the navigation. When set,
|
|
@@ -79,7 +79,7 @@ export interface SidebarRailItemProps {
|
|
|
79
79
|
activeIcon?: SidebarIcon;
|
|
80
80
|
label: string;
|
|
81
81
|
href?: string;
|
|
82
|
-
/** Sits over the indicator's top-right
|
|
82
|
+
/** Sits over the indicator's top-end corner (top-right in LTR). */
|
|
83
83
|
badge?: ReactNode;
|
|
84
84
|
selected?: boolean;
|
|
85
85
|
onPress?: () => void;
|
|
@@ -147,6 +147,8 @@ export interface SidebarTeam {
|
|
|
147
147
|
label: string;
|
|
148
148
|
version?: string;
|
|
149
149
|
};
|
|
150
|
+
/** Names the menu the card opens. Default `` `${name} menu` ``. */
|
|
151
|
+
menuLabel?: string;
|
|
150
152
|
}
|
|
151
153
|
export interface SidebarAccountUser {
|
|
152
154
|
id: string;
|
|
@@ -195,6 +197,8 @@ export interface SidebarAccount {
|
|
|
195
197
|
onManage?: () => void;
|
|
196
198
|
addUserLabel?: string;
|
|
197
199
|
manageLabel?: string;
|
|
200
|
+
/** Names the menu the switcher opens. Default `"Account menu"`. */
|
|
201
|
+
menuLabel?: string;
|
|
198
202
|
}
|
|
199
203
|
export interface SidebarTeamMenuProps {
|
|
200
204
|
team: SidebarTeam;
|
|
@@ -271,6 +275,14 @@ export interface SidebarProps {
|
|
|
271
275
|
/** Rendered inside a mobile drawer: always expanded, close button instead of collapse. */
|
|
272
276
|
mobile?: boolean;
|
|
273
277
|
onClose?: () => void;
|
|
278
|
+
/** The landmark's accessible name. Default `"Sidebar"`. */
|
|
279
|
+
accessibilityLabel?: string;
|
|
280
|
+
/** Names the collapse control while expanded. Default `"Collapse sidebar"`. */
|
|
281
|
+
collapseLabel?: string;
|
|
282
|
+
/** Names the same control while collapsed. Default `"Expand sidebar"`. */
|
|
283
|
+
expandLabel?: string;
|
|
284
|
+
/** Names the `mobile` close button. Default `"Close sidebar"`. */
|
|
285
|
+
closeLabel?: string;
|
|
274
286
|
/** Expanded width fills the container instead of the size's own width. */
|
|
275
287
|
fluid?: boolean;
|
|
276
288
|
/** The panel's edge. Defaults to `card`. */
|
|
@@ -288,8 +300,17 @@ export interface SidebarProps {
|
|
|
288
300
|
searchShortcutLabel?: string;
|
|
289
301
|
/** Binds ⌘L / Ctrl+L on web. Defaults to true. */
|
|
290
302
|
searchShortcut?: boolean;
|
|
303
|
+
/** Names the quick-search button. Default `"Quick Search"`. */
|
|
291
304
|
searchLabel?: string;
|
|
305
|
+
/** Names the search button in a flat `mobile` header. Default `"Search"`. */
|
|
306
|
+
searchButtonLabel?: string;
|
|
307
|
+
/** Placeholder. Defaults `"Search navigation…"`, or `"Search..."` in a flat `mobile` header. */
|
|
292
308
|
searchPlaceholder?: string;
|
|
309
|
+
/** Names the search field. Default `"Filter navigation"`. */
|
|
310
|
+
filterLabel?: string;
|
|
311
|
+
/** Names the button that clears and closes the search. Default `"Clear navigation search"`. */
|
|
312
|
+
clearSearchLabel?: string;
|
|
313
|
+
/** Default `"No results"`. */
|
|
293
314
|
noResultsLabel?: string;
|
|
294
315
|
/**
|
|
295
316
|
* The brand at the top: a mark and/or a wordmark. In the panel it takes the
|
|
@@ -323,7 +344,7 @@ export interface SidebarTreeItem {
|
|
|
323
344
|
onLongPress?: () => void;
|
|
324
345
|
key: string;
|
|
325
346
|
label: string;
|
|
326
|
-
/** A short chip
|
|
347
|
+
/** A short chip at the row's end (the right in LTR), e.g. a relative time (`34m`, `now`). */
|
|
327
348
|
meta?: string;
|
|
328
349
|
/** Link target (a real anchor on web). */
|
|
329
350
|
href?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/sidebar/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE1E,uDAAuD;AACvD,+FAA+F;AAC/F,MAAM,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,kFAAkF;IAClF,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/sidebar/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabBarBase.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/TabBarBase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EASL,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TabBarBase.d.ts","sourceRoot":"","sources":["../../../../src/tab-bar/TabBarBase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EASL,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AA4Bf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAItE,OAAO,EAkBL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AA8rB3E;;;;;;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"}
|
package/package.json
CHANGED
|
@@ -138,7 +138,7 @@ export function createAppShell(BottomBar: ComponentType<BottomBarProps>, Fab: Co
|
|
|
138
138
|
navFrom={navFrom}
|
|
139
139
|
navExpandedFrom={navExpandedFrom}
|
|
140
140
|
header={props.header !== undefined ? props.header : props.title ? <PageHeader title={props.title}
|
|
141
|
-
subtitle={props.breadcrumb} actions={props.actions} leading={<AppShellMenuButton />} /> : undefined}
|
|
141
|
+
subtitle={props.breadcrumb} actions={props.actions} leading={<AppShellMenuButton accessibilityLabel={props.drawerOpenLabel} />} /> : undefined}
|
|
142
142
|
bottomBar={props.bottomBar !== undefined ? props.bottomBar : bottom}
|
|
143
143
|
bottomBarVisibility={props.bottomBarVisibility ?? 'compact'}
|
|
144
144
|
floatingAction={props.floatingAction !== undefined ? props.floatingAction : (primaryAction && (!compact || !hasNavigation || props.bottomBar !== undefined) ? <Fab {...primaryAction} /> : undefined)}
|
|
@@ -13,6 +13,7 @@ import Animated, {
|
|
|
13
13
|
import type { ContentPanelProps } from '../content-panel/types';
|
|
14
14
|
import type { BloomColorScopeProps } from '../theme/color-scope/ColorScope';
|
|
15
15
|
import { useControllableState } from '../hooks/use-controllable-state';
|
|
16
|
+
import { useDirectionProps, useIsRtl } from '../hooks/use-is-rtl';
|
|
16
17
|
import { Backdrop, OverlayRoot } from '../overlay';
|
|
17
18
|
import { Portal } from '../portal';
|
|
18
19
|
import { Sidebar } from '../sidebar';
|
|
@@ -39,11 +40,11 @@ import { useShellWidth } from './use-shell-width';
|
|
|
39
40
|
* nav the sidebar in flow from `navFrom` (`lg` for the panel, `sm` for
|
|
40
41
|
* a rail, `sm` whenever `navExpandedFrom` swaps the two); below it
|
|
41
42
|
* the same props drive the drawer. `overlay` pads the whole frame
|
|
42
|
-
* by `gutter`, `reveal` sits the rail 12 from the top-
|
|
43
|
+
* by `gutter`, `reveal` sits the rail 12 from the top-start corner
|
|
43
44
|
* page `dashboard` one fluid column capped at `contentMaxWidth`;
|
|
44
45
|
* `feed`/`focus` a `contentWidth` reading column centred in what
|
|
45
46
|
* the nav leaves; `split` a column of header over three panes
|
|
46
|
-
* aside optional right
|
|
47
|
+
* aside optional end-side column (right in LTR), `asideWidth` (320) wide from `asideFrom`
|
|
47
48
|
* (xl), pinned like the rail; below it stacked after the content
|
|
48
49
|
* slots `topBar` above the columns, `bottomBar` pinned to the bottom
|
|
49
50
|
* with the safe-area inset, `floatingAction` above that bar —
|
|
@@ -51,7 +52,7 @@ import { useShellWidth } from './use-shell-width';
|
|
|
51
52
|
* below nav the header grows a hamburger (also with no title — see
|
|
52
53
|
* `useAppShell` / `AppShellMenuButton`). `overlay` opens the rail
|
|
53
54
|
* as a drawer (12 inset) over a 40% black backdrop; `reveal`
|
|
54
|
-
* slides the page 272
|
|
55
|
+
* slides the page 272 toward the end edge and rounds it to 32 while the rail,
|
|
55
56
|
* flat beneath it, scales up from 0.94 and fades in (325ms,
|
|
56
57
|
* cubic-bezier(0.42, 0, 0.58, 1)); pressing the page (a 10% black
|
|
57
58
|
* / 5% white veil) closes it
|
|
@@ -148,6 +149,8 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
148
149
|
overlay,
|
|
149
150
|
drawerOpen,
|
|
150
151
|
onDrawerOpenChange,
|
|
152
|
+
drawerOpenLabel = 'Open navigation',
|
|
153
|
+
drawerCloseLabel = 'Close navigation',
|
|
151
154
|
scroll = 'document',
|
|
152
155
|
style,
|
|
153
156
|
testID,
|
|
@@ -204,6 +207,15 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
204
207
|
const asideStacked = hasAside && !asideBeside && asideCollapse === 'stack' && !canvas;
|
|
205
208
|
|
|
206
209
|
const reducedMotion = useReducedMotion();
|
|
210
|
+
// Insets here are logical; a `translateX` sign and a `transformOrigin` are
|
|
211
|
+
// not, so the reveal reads the direction once here.
|
|
212
|
+
const rtl = useIsRtl();
|
|
213
|
+
const dir = rtl ? -1 : 1;
|
|
214
|
+
const railOrigin = rtl ? 'right center' : 'left center';
|
|
215
|
+
// react-native-web resolves logical insets against its OWN direction context
|
|
216
|
+
// (a `dir` prop), not `<html dir>` — every root and the portaled drawer hand
|
|
217
|
+
// it on.
|
|
218
|
+
const dirProps = useDirectionProps();
|
|
207
219
|
const [open, setOpen] = useControllableState<boolean>({
|
|
208
220
|
value: drawerOpen,
|
|
209
221
|
defaultValue: false,
|
|
@@ -337,6 +349,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
337
349
|
actions={actions}
|
|
338
350
|
menuOpen={isOpen}
|
|
339
351
|
showMenu={menuInHeader}
|
|
352
|
+
menuLabel={drawerOpenLabel}
|
|
340
353
|
onMenuPress={menuInHeader ? shell.toggleDrawer : undefined}
|
|
341
354
|
testID={testID ? `${testID}-header` : undefined}
|
|
342
355
|
/>
|
|
@@ -387,8 +400,8 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
387
400
|
reveal.value = reducedMotion ? target : withTiming(target, { duration: REVEAL_MS, easing: REVEAL_EASE });
|
|
388
401
|
}, [isOpen, drawerStyle, reducedMotion, reveal]);
|
|
389
402
|
const feedPageStyle = useAnimatedStyle(() => ({
|
|
390
|
-
transform: reveal.value === 0 ? [] : [{ translateX: (REVEAL_OFFSET + 12) * reveal.value }],
|
|
391
|
-
}), [reveal]);
|
|
403
|
+
transform: reveal.value === 0 ? [] : [{ translateX: dir * (REVEAL_OFFSET + 12) * reveal.value }],
|
|
404
|
+
}), [reveal, dir]);
|
|
392
405
|
|
|
393
406
|
const feedChromeTransition: WebCssStyle = Platform.OS === 'web'
|
|
394
407
|
? { '--bloom-panel-inset-duration': reducedMotion ? '0ms' : `${REVEAL_MS}ms` } : {};
|
|
@@ -407,8 +420,8 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
407
420
|
[reveal],
|
|
408
421
|
);
|
|
409
422
|
const pageStyle = useAnimatedStyle(
|
|
410
|
-
() => ({ transform: reveal.value === 0 ? [] : [{ translateX: REVEAL_OFFSET * reveal.value }], borderRadius: 32 * reveal.value }),
|
|
411
|
-
[reveal],
|
|
423
|
+
() => ({ transform: reveal.value === 0 ? [] : [{ translateX: dir * REVEAL_OFFSET * reveal.value }], borderRadius: 32 * reveal.value }),
|
|
424
|
+
[reveal, dir],
|
|
412
425
|
);
|
|
413
426
|
const veilStyle = useAnimatedStyle(() => ({ opacity: reveal.value }), [reveal]);
|
|
414
427
|
|
|
@@ -416,6 +429,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
416
429
|
return (
|
|
417
430
|
<AppShellProvider value={shell}>
|
|
418
431
|
<View
|
|
432
|
+
{...dirProps}
|
|
419
433
|
testID={testID}
|
|
420
434
|
onLayout={onLayout}
|
|
421
435
|
style={[frame, doc ? { overflow: WEB_OVERFLOW_CLIP } : null, { flexDirection: 'row', backgroundColor: background }, style]}
|
|
@@ -425,7 +439,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
425
439
|
style={[
|
|
426
440
|
flowSidebar.surface === 'docked'
|
|
427
441
|
? { flexShrink: 0 }
|
|
428
|
-
: { paddingTop: 12, paddingBottom: 12,
|
|
442
|
+
: { paddingTop: 12, paddingBottom: 12, paddingInlineStart: 12, flexShrink: 0 },
|
|
429
443
|
doc ? stickyRail(0) : null,
|
|
430
444
|
]}
|
|
431
445
|
>
|
|
@@ -438,9 +452,9 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
438
452
|
pointerEvents={isOpen ? 'auto' : 'none'}
|
|
439
453
|
// Fixed on web in document mode: the rail waits beneath the VIEWPORT,
|
|
440
454
|
// wherever the page is scrolled to.
|
|
441
|
-
style={{ position: doc ? WEB_POSITION_FIXED : 'absolute', top: 0, bottom: 0,
|
|
455
|
+
style={{ position: doc ? WEB_POSITION_FIXED : 'absolute', top: 0, bottom: 0, insetInlineStart: 0, width: 272, paddingTop: 12, paddingBottom: 12, paddingInlineStart: 6 }}
|
|
442
456
|
>
|
|
443
|
-
<Animated.View style={[{ height: '100%', width: 260, transformOrigin:
|
|
457
|
+
<Animated.View style={[{ height: '100%', width: 260, transformOrigin: railOrigin }, railStyle]}>
|
|
444
458
|
<Sidebar {...drawerSidebar} mobile surface="plain" onClose={() => setOpen(false)} />
|
|
445
459
|
</Animated.View>
|
|
446
460
|
</View>
|
|
@@ -473,7 +487,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
473
487
|
>
|
|
474
488
|
{column}
|
|
475
489
|
</Scroller>
|
|
476
|
-
{asideColumn({ paddingTop: small ? 24 : 12, paddingBottom: 12,
|
|
490
|
+
{asideColumn({ paddingTop: small ? 24 : 12, paddingBottom: 12, paddingInlineEnd: 12 })}
|
|
477
491
|
{!wide ? (
|
|
478
492
|
<Animated.View
|
|
479
493
|
pointerEvents={isOpen ? 'auto' : 'none'}
|
|
@@ -481,7 +495,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
481
495
|
>
|
|
482
496
|
<Pressable
|
|
483
497
|
role="button"
|
|
484
|
-
accessibilityLabel=
|
|
498
|
+
accessibilityLabel={drawerCloseLabel}
|
|
485
499
|
focusable={isOpen}
|
|
486
500
|
onPress={() => setOpen(false)}
|
|
487
501
|
style={{
|
|
@@ -713,7 +727,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
713
727
|
{headerNode}
|
|
714
728
|
<View style={{ flex: 1, minHeight: 0, minWidth: 0 }}>{children}</View>
|
|
715
729
|
</View>
|
|
716
|
-
{asideColumn(canvas ? {
|
|
730
|
+
{asideColumn(canvas ? { paddingTop: gutter, paddingBottom: gutter, paddingInlineEnd: gutter } : {})}
|
|
717
731
|
</>
|
|
718
732
|
);
|
|
719
733
|
|
|
@@ -727,7 +741,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
727
741
|
: dashboardBody;
|
|
728
742
|
|
|
729
743
|
// A DOCKED nav is flush to the window: it takes the shell's whole height and
|
|
730
|
-
// its own hairline is the separator, so the shell gives up its
|
|
744
|
+
// its own hairline is the separator, so the shell gives up its start and
|
|
731
745
|
// vertical padding around that column rather than framing it like a card.
|
|
732
746
|
const dockedNav = navInFlow && flowSidebar?.surface === 'docked';
|
|
733
747
|
const navRegion =
|
|
@@ -738,7 +752,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
738
752
|
</View>
|
|
739
753
|
) : canvas && !dockedNav ? (
|
|
740
754
|
// The canvas row has no padding of its own, so the nav states its.
|
|
741
|
-
<View style={{
|
|
755
|
+
<View style={{ paddingTop: gutter, paddingBottom: gutter, paddingInlineStart: gutter, flexShrink: 0 }}>
|
|
742
756
|
<Sidebar {...flowSidebar} />
|
|
743
757
|
</View>
|
|
744
758
|
) : (
|
|
@@ -754,11 +768,12 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
754
768
|
onPress={() => setOpen(false)}
|
|
755
769
|
blurIntensity={0}
|
|
756
770
|
dimOpacity={0.4}
|
|
757
|
-
accessibilityLabel=
|
|
771
|
+
accessibilityLabel={drawerCloseLabel}
|
|
758
772
|
/>
|
|
759
773
|
<View
|
|
774
|
+
{...dirProps}
|
|
760
775
|
pointerEvents="box-none"
|
|
761
|
-
style={{ position: 'absolute', top: 0, bottom: 0,
|
|
776
|
+
style={{ position: 'absolute', top: 0, bottom: 0, insetInlineStart: 0, flexDirection: 'row', padding: 12 }}
|
|
762
777
|
>
|
|
763
778
|
<View pointerEvents="auto" style={{ height: '100%' }}>
|
|
764
779
|
<Sidebar {...drawerSidebar} mobile onClose={() => setOpen(false)} />
|
|
@@ -774,19 +789,24 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
774
789
|
gap: dockedNav || canvas ? 0 : Math.max(0, navigationGap ?? columnGap),
|
|
775
790
|
// A canvas runs to the window's edge, so the row keeps no padding at all
|
|
776
791
|
// and each region carries its own (the nav below, the aside in `canvasBody`).
|
|
777
|
-
|
|
778
|
-
|
|
792
|
+
// A docked nav keeps only the END padding. Spelled in longhands, never the
|
|
793
|
+
// `padding` shorthand plus a logical override: react-native-web expands the
|
|
794
|
+
// shorthand to physical sides, and which of two declarations for one edge
|
|
795
|
+
// wins is then a matter of declaration order rather than intent.
|
|
796
|
+
...(dockedNav
|
|
797
|
+
? { paddingTop: 0, paddingBottom: 0, paddingInlineStart: 0, paddingInlineEnd: canvas || plainDocumentFrame ? 0 : gutter }
|
|
798
|
+
: { padding: canvas || plainDocumentFrame ? 0 : gutter }),
|
|
779
799
|
backgroundColor: background,
|
|
780
800
|
};
|
|
781
801
|
|
|
782
802
|
if (variant === 'feed' && drawerStyle === 'reveal' && drawerAvailable) {
|
|
783
803
|
return (
|
|
784
804
|
<AppShellProvider value={shell}>
|
|
785
|
-
<View testID={testID} onLayout={onLayout}
|
|
805
|
+
<View {...dirProps} testID={testID} onLayout={onLayout}
|
|
786
806
|
style={[frame, { overflow: doc ? WEB_OVERFLOW_CLIP : 'hidden', backgroundColor: background }, style]}>
|
|
787
807
|
<View aria-hidden={!isOpen} pointerEvents={isOpen ? 'auto' : 'none'}
|
|
788
|
-
style={{ position: doc ? WEB_POSITION_FIXED : 'absolute', top: 0, bottom: 0,
|
|
789
|
-
<Animated.View style={[{ height: '100%', width: 260, transformOrigin:
|
|
808
|
+
style={{ position: doc ? WEB_POSITION_FIXED : 'absolute', top: 0, bottom: 0, insetInlineStart: 0, width: 272, paddingTop: 12, paddingBottom: 12, paddingInlineStart: 6 }}>
|
|
809
|
+
<Animated.View style={[{ height: '100%', width: 260, transformOrigin: railOrigin }, railStyle]}>
|
|
790
810
|
{drawerSidebar && <Sidebar {...drawerSidebar} mobile surface="plain" onClose={() => setOpen(false)} />}
|
|
791
811
|
</Animated.View>
|
|
792
812
|
</View>
|
|
@@ -798,7 +818,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
798
818
|
</StyledView>
|
|
799
819
|
<Animated.View pointerEvents={isOpen ? 'auto' : 'none'}
|
|
800
820
|
style={[{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }, veilStyle]}>
|
|
801
|
-
<Pressable role="button" accessibilityLabel=
|
|
821
|
+
<Pressable role="button" accessibilityLabel={drawerCloseLabel} focusable={isOpen}
|
|
802
822
|
onPress={() => setOpen(false)} testID={testID ? `${testID}-veil` : undefined}
|
|
803
823
|
style={{ flex: 1 }} />
|
|
804
824
|
</Animated.View>
|
|
@@ -823,6 +843,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
823
843
|
return (
|
|
824
844
|
<AppShellProvider value={shell}>
|
|
825
845
|
<View
|
|
846
|
+
{...dirProps}
|
|
826
847
|
testID={testID}
|
|
827
848
|
onLayout={onLayout}
|
|
828
849
|
style={[frame, { flexDirection: 'column', backgroundColor: background }, style]}
|
|
@@ -842,7 +863,7 @@ const AppShellComponent: React.FC<AppShellEngineProps> = ({
|
|
|
842
863
|
|
|
843
864
|
return (
|
|
844
865
|
<AppShellProvider value={shell}>
|
|
845
|
-
<View testID={testID} onLayout={onLayout} style={[frame, rowStyle, style]}>
|
|
866
|
+
<View {...dirProps} testID={testID} onLayout={onLayout} style={[frame, rowStyle, style]}>
|
|
846
867
|
{navRegion}
|
|
847
868
|
{drawerRegion}
|
|
848
869
|
{body}
|
|
@@ -15,9 +15,9 @@ import type { AppShellHeaderProps } from './types';
|
|
|
15
15
|
*
|
|
16
16
|
* header column, gap 8
|
|
17
17
|
* title row wraps, items bottom-aligned, space-between, gap 8
|
|
18
|
-
*
|
|
18
|
+
* start gap 6: a medium icon button (hamburger, below `lg` only) and the
|
|
19
19
|
* title — title-2-medium, px4, no wrap, text-primary
|
|
20
|
-
* actions wrap,
|
|
20
|
+
* actions wrap, end-aligned (right in LTR, left in RTL), gap 10
|
|
21
21
|
*/
|
|
22
22
|
const AppShellHeaderComponent: React.FC<AppShellHeaderProps> = ({
|
|
23
23
|
title,
|
|
@@ -26,6 +26,7 @@ const AppShellHeaderComponent: React.FC<AppShellHeaderProps> = ({
|
|
|
26
26
|
onMenuPress,
|
|
27
27
|
menuOpen = false,
|
|
28
28
|
showMenu: showMenuProp,
|
|
29
|
+
menuLabel = 'Open navigation',
|
|
29
30
|
style,
|
|
30
31
|
testID,
|
|
31
32
|
}) => {
|
|
@@ -52,7 +53,7 @@ const AppShellHeaderComponent: React.FC<AppShellHeaderProps> = ({
|
|
|
52
53
|
>
|
|
53
54
|
<View style={{ minWidth: 0, flexDirection: 'row', alignItems: 'center', gap: 6 }}>
|
|
54
55
|
{showMenu ? (
|
|
55
|
-
<Button size="md" icon={menuOpen ? RiCloseLine : RiMenuLine} accessibilityLabel=
|
|
56
|
+
<Button size="md" icon={menuOpen ? RiCloseLine : RiMenuLine} accessibilityLabel={menuLabel} aria-expanded={menuOpen} onPress={onMenuPress} testID={testID ? `${testID}-menu` : undefined} appearance="plain" tone="neutral" />
|
|
56
57
|
) : null}
|
|
57
58
|
{title != null ? (
|
|
58
59
|
<Text
|
|
@@ -3,6 +3,7 @@ import { View } from 'react-native';
|
|
|
3
3
|
|
|
4
4
|
import { Button } from '../button';
|
|
5
5
|
import { useInteractionState } from '../hooks/use-interaction-state';
|
|
6
|
+
import { mirrorAlign, useDirectionProps, useIsRtl } from '../hooks/use-is-rtl';
|
|
6
7
|
import { RiNotificationLine } from '../icons/remix/RiNotificationLine';
|
|
7
8
|
import { NotificationCenter } from '../notification-center';
|
|
8
9
|
import { Popover, PopoverContent, PopoverTrigger } from '../popover';
|
|
@@ -16,10 +17,10 @@ import type { NotificationBellProps } from './types';
|
|
|
16
17
|
* glyph, and the notification center in a popover under it.
|
|
17
18
|
*
|
|
18
19
|
* trigger medium secondary icon button (36), RiNotificationLine 20
|
|
19
|
-
* count 16px red-600 disc at top 2 /
|
|
20
|
+
* count 16px red-600 disc at top 2 / inline-start 18, 1.5px ring in the button's
|
|
20
21
|
* own surface (so it reads punched out), 10/16 bold white; the ring
|
|
21
22
|
* drops away while the button is hovered or pressed
|
|
22
|
-
* popover bottom
|
|
23
|
+
* popover bottom, trailing edge (mirrored under RTL), 8px off, 440 wide, no chrome of its own — the center
|
|
23
24
|
* (max 430) is the card
|
|
24
25
|
*/
|
|
25
26
|
const NotificationBellComponent: React.FC<NotificationBellProps> = ({
|
|
@@ -33,6 +34,8 @@ const NotificationBellComponent: React.FC<NotificationBellProps> = ({
|
|
|
33
34
|
testID,
|
|
34
35
|
}) => {
|
|
35
36
|
const theme = useTheme();
|
|
37
|
+
const rtl = useIsRtl();
|
|
38
|
+
const dirProps = useDirectionProps();
|
|
36
39
|
const [open, setOpen] = useState(false);
|
|
37
40
|
const { state: hovered, onIn, onOut } = useInteractionState();
|
|
38
41
|
const unread = unreadCount ?? notifications.filter((item) => item.unread).length;
|
|
@@ -48,6 +51,7 @@ const NotificationBellComponent: React.FC<NotificationBellProps> = ({
|
|
|
48
51
|
return (
|
|
49
52
|
<Popover open={open} onOpenChange={setOpen}>
|
|
50
53
|
<View
|
|
54
|
+
{...dirProps}
|
|
51
55
|
style={{ position: 'relative', flexDirection: 'row' }}
|
|
52
56
|
// Hover is read on the wrapper (the `group`).
|
|
53
57
|
{...({ onPointerEnter: onIn, onPointerLeave: onOut })}
|
|
@@ -62,7 +66,7 @@ const NotificationBellComponent: React.FC<NotificationBellProps> = ({
|
|
|
62
66
|
style={{
|
|
63
67
|
position: 'absolute',
|
|
64
68
|
top: 2,
|
|
65
|
-
|
|
69
|
+
insetInlineStart: 18,
|
|
66
70
|
width: 16,
|
|
67
71
|
height: 16,
|
|
68
72
|
borderRadius: borderRadius.full,
|
|
@@ -82,7 +86,7 @@ const NotificationBellComponent: React.FC<NotificationBellProps> = ({
|
|
|
82
86
|
<PopoverContent
|
|
83
87
|
label={accessibilityLabel}
|
|
84
88
|
side="bottom"
|
|
85
|
-
align=
|
|
89
|
+
align={mirrorAlign('end', 'bottom', rtl)}
|
|
86
90
|
sideOffset={8}
|
|
87
91
|
style={{
|
|
88
92
|
width,
|
|
@@ -13,6 +13,7 @@ import Animated, {
|
|
|
13
13
|
import Svg, { Defs, LinearGradient, Mask, Rect, Stop } from 'react-native-svg';
|
|
14
14
|
|
|
15
15
|
import { Button, CloseButton } from '../button';
|
|
16
|
+
import { useDirectionProps, useIsRtl } from '../hooks/use-is-rtl';
|
|
16
17
|
import { BREAKPOINTS } from '../styles/breakpoints';
|
|
17
18
|
import { WEB_POSITION_FIXED, type WebCssStyle } from '../styles/web-view-style';
|
|
18
19
|
import { Z_INDEX } from '../styles/z-index';
|
|
@@ -22,18 +23,19 @@ import type { ProOfferCardProps } from './types';
|
|
|
22
23
|
|
|
23
24
|
/**
|
|
24
25
|
* `ProOfferCard`: the upgrade prompt anchored
|
|
25
|
-
* bottom-
|
|
26
|
+
* bottom-start of the app (bottom-left in LTR, bottom-right in RTL).
|
|
26
27
|
*
|
|
27
28
|
* card 280 wide (full width minus 12 each side under `sm`), 12 from
|
|
28
|
-
* the bottom-
|
|
29
|
+
* the bottom-start corner, radius 16, 1px border-button-white,
|
|
29
30
|
* background-secondary, p16, gap 12, shadow-waitlist
|
|
30
31
|
* backdrop a tonal band across the top (card → raised surface →
|
|
31
32
|
* clear, diagonal, 70%), masked from opaque at 38% to clear
|
|
32
33
|
* copy mark, then title body-medium / description body-2-regular
|
|
33
34
|
* secondary, 4 apart
|
|
34
35
|
* cta full-width button with a white 40% shimmer sweeping across it
|
|
35
|
-
* every 2.5s (skewed −12°), hidden under
|
|
36
|
-
*
|
|
36
|
+
* every 2.5s (skewed −12°) toward the end edge, hidden under
|
|
37
|
+
* reduced motion
|
|
38
|
+
* close xs close button 12 from the top-end corner
|
|
37
39
|
* enter fades up 16px over 300ms after a 1.2s delay
|
|
38
40
|
*
|
|
39
41
|
* No shader backdrop ships by default; pass your own
|
|
@@ -79,6 +81,8 @@ function DefaultBackdrop({ from, via }: { from: string; via: string }) {
|
|
|
79
81
|
|
|
80
82
|
function Shimmer({ width }: { width: number }) {
|
|
81
83
|
const reducedMotion = useReducedMotion();
|
|
84
|
+
// The sweep runs start → end, so under RTL both its travel and its lean flip.
|
|
85
|
+
const dir = useIsRtl() ? -1 : 1;
|
|
82
86
|
const travel = useSharedValue(0);
|
|
83
87
|
useEffect(() => {
|
|
84
88
|
if (reducedMotion || width === 0) return;
|
|
@@ -90,14 +94,14 @@ function Shimmer({ width }: { width: number }) {
|
|
|
90
94
|
}, [reducedMotion, width, travel]);
|
|
91
95
|
const barWidth = width * 0.45;
|
|
92
96
|
const style = useAnimatedStyle(
|
|
93
|
-
() => ({ transform: [{ translateX: travel.value * barWidth * 3.5 }, { skewX:
|
|
94
|
-
[travel, barWidth],
|
|
97
|
+
() => ({ transform: [{ translateX: dir * travel.value * barWidth * 3.5 }, { skewX: `${dir * -12}deg` }] }),
|
|
98
|
+
[travel, barWidth, dir],
|
|
95
99
|
);
|
|
96
100
|
if (reducedMotion || width === 0) return null;
|
|
97
101
|
return (
|
|
98
102
|
<Animated.View
|
|
99
103
|
pointerEvents="none"
|
|
100
|
-
style={[{ position: 'absolute', top: 0, bottom: 0,
|
|
104
|
+
style={[{ position: 'absolute', top: 0, bottom: 0, insetInlineStart: -width * 0.55, width: barWidth }, style]}
|
|
101
105
|
>
|
|
102
106
|
<Svg width="100%" height="100%">
|
|
103
107
|
<Defs>
|
|
@@ -130,6 +134,9 @@ const ProOfferCardComponent: React.FC<ProOfferCardProps> = ({
|
|
|
130
134
|
testID,
|
|
131
135
|
}) => {
|
|
132
136
|
const theme = useTheme();
|
|
137
|
+
// Fixed to the viewport, usually outside any shell: it hands react-native-web
|
|
138
|
+
// the document's direction itself so its logical insets resolve against it.
|
|
139
|
+
const dirProps = useDirectionProps();
|
|
133
140
|
const { width: viewport } = useWindowDimensions();
|
|
134
141
|
const reducedMotion = useReducedMotion();
|
|
135
142
|
const [ctaWidth, setCtaWidth] = useState(0);
|
|
@@ -160,8 +167,8 @@ const ProOfferCardComponent: React.FC<ProOfferCardProps> = ({
|
|
|
160
167
|
? {
|
|
161
168
|
position: IS_WEB ? WEB_POSITION_FIXED : 'absolute',
|
|
162
169
|
bottom: 12,
|
|
163
|
-
|
|
164
|
-
...(narrow ? {
|
|
170
|
+
insetInlineStart: 12,
|
|
171
|
+
...(narrow ? { insetInlineEnd: 12 } : { width: 280 }),
|
|
165
172
|
zIndex: Z_INDEX.floating,
|
|
166
173
|
}
|
|
167
174
|
: { width: 280 };
|
|
@@ -183,6 +190,7 @@ const ProOfferCardComponent: React.FC<ProOfferCardProps> = ({
|
|
|
183
190
|
|
|
184
191
|
return (
|
|
185
192
|
<Animated.View
|
|
193
|
+
{...dirProps}
|
|
186
194
|
role="complementary"
|
|
187
195
|
accessibilityLabel={accessibilityLabel}
|
|
188
196
|
testID={testID}
|
|
@@ -235,7 +243,7 @@ const ProOfferCardComponent: React.FC<ProOfferCardProps> = ({
|
|
|
235
243
|
size="xs"
|
|
236
244
|
accessibilityLabel={dismissLabel}
|
|
237
245
|
onPress={onDismiss}
|
|
238
|
-
style={{ position: 'absolute', top: 12,
|
|
246
|
+
style={{ position: 'absolute', top: 12, insetInlineEnd: 12, zIndex: Z_INDEX.raised }}
|
|
239
247
|
testID={testID ? `${testID}-dismiss` : undefined}
|
|
240
248
|
/>
|
|
241
249
|
</Animated.View>
|
package/src/app-shell/types.ts
CHANGED
|
@@ -10,8 +10,9 @@ import type { SidebarProps } from '../sidebar/types';
|
|
|
10
10
|
* How the sidebar reaches a narrow screen (below `lg`):
|
|
11
11
|
*
|
|
12
12
|
* - `overlay` a drawer over the page with a 40% black backdrop
|
|
13
|
-
* - `reveal` the sidebar waits beneath the page, which slides 272px
|
|
14
|
-
*
|
|
13
|
+
* - `reveal` the sidebar waits beneath the page, which slides 272px toward
|
|
14
|
+
* the end edge (right in LTR, left in RTL) and rounds its corner
|
|
15
|
+
* to 32 as the rail scales in from 0.94
|
|
15
16
|
*/
|
|
16
17
|
export type AppShellDrawer = 'overlay' | 'reveal';
|
|
17
18
|
|
|
@@ -92,7 +93,7 @@ export interface AppShellEngineProps {
|
|
|
92
93
|
title?: string;
|
|
93
94
|
/** Breadcrumb trail above the heading (a `Breadcrumb`). */
|
|
94
95
|
breadcrumb?: ReactNode;
|
|
95
|
-
/** Header actions
|
|
96
|
+
/** Header actions at the end edge — the right in LTR (`NotificationBell`, buttons). */
|
|
96
97
|
actions?: ReactNode;
|
|
97
98
|
/**
|
|
98
99
|
* Replaces the whole header. Put an `AppShellMenuButton` in it to keep the
|
|
@@ -105,7 +106,7 @@ export interface AppShellEngineProps {
|
|
|
105
106
|
*/
|
|
106
107
|
header?: ReactNode;
|
|
107
108
|
/**
|
|
108
|
-
* A second column
|
|
109
|
+
* A second column at the page's end edge — the right in LTR, the left in RTL (a detail panel, activity, a
|
|
109
110
|
* chat). In flow from `asideFrom`; below it, stacked under the content or
|
|
110
111
|
* hidden (`asideCollapse`). Pinned like the sidebar — with document scroll
|
|
111
112
|
* it stays in document flow and sticks after tall content reaches its lower edge.
|
|
@@ -130,6 +131,14 @@ export interface AppShellEngineProps {
|
|
|
130
131
|
/** Controlled drawer state (below `lg`). */
|
|
131
132
|
drawerOpen?: boolean;
|
|
132
133
|
onDrawerOpenChange?: (open: boolean) => void;
|
|
134
|
+
/** Names the hamburger that opens the drawer. Default `"Open navigation"`. */
|
|
135
|
+
drawerOpenLabel?: string;
|
|
136
|
+
/**
|
|
137
|
+
* Names the controls that close the drawer — the backdrop and the page veil a
|
|
138
|
+
* `reveal` drawer leaves. Default `"Close navigation"`. The sidebar's own close
|
|
139
|
+
* button is `sidebar.closeLabel`.
|
|
140
|
+
*/
|
|
141
|
+
drawerCloseLabel?: string;
|
|
133
142
|
/**
|
|
134
143
|
* What scrolls the page.
|
|
135
144
|
*
|
|
@@ -285,6 +294,8 @@ export interface AppShellHeaderProps {
|
|
|
285
294
|
* header falls back to the window being narrower than `lg`.
|
|
286
295
|
*/
|
|
287
296
|
showMenu?: boolean;
|
|
297
|
+
/** Names the hamburger. Default `"Open navigation"`. */
|
|
298
|
+
menuLabel?: string;
|
|
288
299
|
style?: StyleProp<ViewStyle>;
|
|
289
300
|
testID?: string;
|
|
290
301
|
}
|
|
@@ -318,7 +329,7 @@ export interface ProOfferCardProps {
|
|
|
318
329
|
accessibilityLabel?: string;
|
|
319
330
|
dismissLabel?: string;
|
|
320
331
|
/**
|
|
321
|
-
* `fixed` (default) anchors bottom-left of the viewport (web) / the nearest
|
|
332
|
+
* `fixed` (default) anchors bottom-start (bottom-left in LTR) of the viewport (web) / the nearest
|
|
322
333
|
* positioned parent (native); `inline` renders in flow.
|
|
323
334
|
*/
|
|
324
335
|
placement?: 'fixed' | 'inline';
|