Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
dd1c6e2
Add placement property to StandardLayoutToolbarItem
GerardasB Nov 27, 2025
40b850b
Rename to custom usage.
GerardasB Nov 27, 2025
16f43d8
Rename to advanced usage.
GerardasB Nov 27, 2025
c128e3b
Add stories
GerardasB Nov 27, 2025
fce4df1
Add secondary toolbars to NavigationArea
GerardasB Nov 28, 2025
173b429
Add All story
GerardasB Nov 28, 2025
131558a
Add group item
GerardasB Nov 28, 2025
cd90b6e
Cleanup
GerardasB Nov 28, 2025
72c2f7b
Add gap
GerardasB Nov 28, 2025
ff69a3c
Enable vertical overflow of toolbars
GerardasB Nov 28, 2025
70055c6
Toolbar panel alignment
GerardasB Nov 28, 2025
c46d78b
Toolbar alignment
GerardasB Nov 28, 2025
e2284e1
npm run extract-api
GerardasB Nov 28, 2025
49a7e29
Add All (custom) story
GerardasB Dec 1, 2025
1c0465d
Merge branch 'master' into gerardas/toolbar-placement
GerardasB Dec 1, 2025
e77bc1b
Secondary horizontal toolbar to take at most 50% of width
GerardasB Dec 4, 2025
6d5704f
Rename to Toolbars story
GerardasB Dec 4, 2025
67cae08
Add hideNavigationAid control
GerardasB Dec 4, 2025
fd3c74e
Merge branch 'master' into gerardas/toolbar-placement
GerardasB Dec 5, 2025
05aa9e6
Merge branch 'master' into gerardas/toolbar-placement
GerardasB Dec 8, 2025
a9fc501
Add cornerButton
GerardasB Dec 8, 2025
e00c852
Move navigation aid to horizontal container
GerardasB Dec 8, 2025
b649324
Fix excess bottom spacing due to `controlWidgetVisibility` preview fe…
GerardasB Dec 9, 2025
3fec536
Fix toolbar alignment w/ empty toolbars
GerardasB Dec 10, 2025
145d5fe
Spacing of control widget visibility
GerardasB Dec 10, 2025
80e1854
Add controlWidgetVisibility control to sb
GerardasB Dec 10, 2025
757bee6
Fix tests
GerardasB Dec 10, 2025
4b5a8d3
pnpm changeset
GerardasB Dec 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .changeset/afraid-signs-rush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
"@itwin/appui-react": minor
---

Added `ToolbarAdvancedUsage` non-exhaustive string literal union type used in `advancedUsage` property of `StandardLayoutToolbarItem` interface.
This property takes precedence over enum based `usage` property and allows specifying advanced toolbar item usage scenarios.
When set to `"view-settings"` it positions the toolbar item at the bottom-right of the content area in the default standard layout configuration.

```tsx
ToolbarItemUtilities.createActionItem({
id: "action",
layouts: {
standard: {
usage: ToolbarUsage.ViewNavigation,
advancedUsage: "view-settings",
orientation: ToolbarOrientation.Horizontal,
},
},
});
```
7 changes: 7 additions & 0 deletions common/api/appui-react.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1804,6 +1804,7 @@ export interface ExpandableSectionProps extends CommonProps {
// @public @deprecated
export interface ExtensibleToolbarProps {
activeItemIds?: string[];
advancedUsage?: ToolbarAdvancedUsage;
items: ToolbarItem[];
orientation: ToolbarOrientation;
usage: ToolbarUsage;
Expand Down Expand Up @@ -3412,6 +3413,8 @@ export interface NavigationWidgetComposerProps extends CommonProps {
hideNavigationAid?: boolean;
horizontalToolbar?: React_2.ReactNode;
navigationAidHost?: React_2.ReactNode;
secondaryHorizontalToolbar?: React_2.ReactNode;
secondaryVerticalToolbar?: React_2.ReactNode;
verticalToolbar?: React_2.ReactNode;
}

Expand Down Expand Up @@ -4326,6 +4329,7 @@ export function StandardLayout(props: StandardLayoutProps): React_2.JSX.Element;

// @public
export interface StandardLayoutToolbarItem {
readonly advancedUsage?: ToolbarAdvancedUsage;
readonly orientation: ToolbarOrientation;
readonly usage: ToolbarUsage;
}
Expand Down Expand Up @@ -4755,6 +4759,9 @@ export interface ToolbarActionItem extends CommonToolbarItem {
readonly parentGroupItemId?: string;
}

// @public
export type ToolbarAdvancedUsage = "view-settings" | (string & {});

// @public
export class ToolbarButtonHelper {
static getAppButton(): HTMLButtonElement | null;
Expand Down
1 change: 1 addition & 0 deletions common/api/summary/appui-react.exports.csv
Original file line number Diff line number Diff line change
Expand Up @@ -681,6 +681,7 @@ public;interface;ToolAssistanceFieldProps
beta;function;Toolbar
public;const;TOOLBAR_OPACITY_DEFAULT
public;interface;ToolbarActionItem
public;type;ToolbarAdvancedUsage
public;class;ToolbarButtonHelper
public;function;ToolbarComposer
public;interface;ToolbarCustomItem
Expand Down
47 changes: 47 additions & 0 deletions docs/storybook/src/Utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
import { action } from "storybook/actions";
import type { ArgTypes } from "@storybook/react-vite";
import {
ContentProps,
Expand All @@ -12,6 +13,11 @@ import {
StageUsage,
StandardContentLayouts,
StandardFrontstageProps,
ToolbarActionItem,
ToolbarGroupItem,
ToolbarItemUtilities,
ToolbarOrientation,
ToolbarUsage,
Widget,
} from "@itwin/appui-react";
import { SvgPlaceholder } from "@itwin/itwinui-icons-react";
Expand Down Expand Up @@ -110,3 +116,44 @@ export function createWidget(id: number, overrides?: Partial<Widget>): Widget {
...overrides,
};
}

export function createToolbarItemFactory() {
let i = 0;
function createActionItem(
overrides?: Omit<Partial<ToolbarActionItem>, "icon">
) {
const id = `item${++i}`;
const label = `Item ${i}`;
return ToolbarItemUtilities.createActionItem({
id,
label,
icon: <SvgPlaceholder />,
execute: () => action(label)(),
layouts: {
standard: {
usage: ToolbarUsage.ContentManipulation,
orientation: ToolbarOrientation.Horizontal,
},
},
...overrides,
});
}

function createGroupItem(
overrides?: Omit<Partial<ToolbarGroupItem>, "icon">
) {
const id = `group${++i}`;
const label = `Group ${i}`;
return ToolbarItemUtilities.createGroupItem({
id,
label,
icon: <SvgPlaceholder />,
...overrides,
});
}

return {
createActionItem,
createGroupItem,
};
}
42 changes: 4 additions & 38 deletions docs/storybook/src/components/ToolbarComposer.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ import {
import {
CommandItemDef,
ToolItemDef,
ToolbarActionItem,
ToolbarGroupItem,
ToolbarHelper,
ToolbarItemUtilities,
ToolbarOrientation,
Expand All @@ -36,7 +34,10 @@ import placeholderIcon from "@bentley/icons-generic/icons/placeholder.svg";
import { AppUiDecorator, InitializerDecorator } from "../Decorators";
import { withResizer } from "../../.storybook/addons/Resizer";
import { createBumpEvent } from "../createBumpEvent";
import { enumArgType } from "../Utils";
import {
enumArgType,
createToolbarItemFactory as createItemFactory,
} from "../Utils";
import { ToolbarComposerStory } from "./ToolbarComposer";

const meta = {
Expand Down Expand Up @@ -573,41 +574,6 @@ function createAbstractConditionalIcon() {
};
}

function createItemFactory() {
let i = 0;
function createActionItem(
overrides?: Omit<Partial<ToolbarActionItem>, "icon">
) {
const id = `item${++i}`;
const label = `Item ${i}`;
return ToolbarItemUtilities.createActionItem({
id,
label,
icon: <SvgPlaceholder />,
execute: () => action(label)(),
...overrides,
});
}

function createGroupItem(
overrides?: Omit<Partial<ToolbarGroupItem>, "icon">
) {
const id = `group${++i}`;
const label = `Group ${i}`;
return ToolbarItemUtilities.createGroupItem({
id,
label,
icon: <SvgPlaceholder />,
...overrides,
});
}

return {
createActionItem,
createGroupItem,
};
}

function createItems() {
const action1 = ToolbarItemUtilities.createActionItem(
"item1",
Expand Down
Loading