@itwin/appui-react 5.25.0 → 5.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/lib/appui-react/layout/target/TitleBarTarget.d.ts +1 -1
  3. package/lib/appui-react/layout/target/TitleBarTarget.d.ts.map +1 -1
  4. package/lib/appui-react/layout/target/TitleBarTarget.js +3 -3
  5. package/lib/appui-react/layout/target/TitleBarTarget.js.map +1 -1
  6. package/lib/appui-react/layout/target/TitleBarTarget.scss +9 -7
  7. package/lib/appui-react/layout/widget/ContentContainer.d.ts +2 -0
  8. package/lib/appui-react/layout/widget/ContentContainer.d.ts.map +1 -1
  9. package/lib/appui-react/layout/widget/ContentContainer.js +16 -16
  10. package/lib/appui-react/layout/widget/ContentContainer.js.map +1 -1
  11. package/lib/appui-react/layout/widget/FloatingWidget.d.ts +56 -4
  12. package/lib/appui-react/layout/widget/FloatingWidget.d.ts.map +1 -1
  13. package/lib/appui-react/layout/widget/FloatingWidget.js +97 -51
  14. package/lib/appui-react/layout/widget/FloatingWidget.js.map +1 -1
  15. package/lib/appui-react/layout/widget/PanelWidget.d.ts +2 -2
  16. package/lib/appui-react/layout/widget/PanelWidget.d.ts.map +1 -1
  17. package/lib/appui-react/layout/widget/PanelWidget.js +6 -4
  18. package/lib/appui-react/layout/widget/PanelWidget.js.map +1 -1
  19. package/lib/appui-react/layout/widget/TabBar.d.ts +2 -0
  20. package/lib/appui-react/layout/widget/TabBar.d.ts.map +1 -1
  21. package/lib/appui-react/layout/widget/TabBar.js +13 -12
  22. package/lib/appui-react/layout/widget/TabBar.js.map +1 -1
  23. package/lib/appui-react/layout/widget/Widget.d.ts +6 -3
  24. package/lib/appui-react/layout/widget/Widget.d.ts.map +1 -1
  25. package/lib/appui-react/layout/widget/Widget.js +29 -31
  26. package/lib/appui-react/layout/widget/Widget.js.map +1 -1
  27. package/lib/appui-react/preview/PreviewFeatures.d.ts +11 -3
  28. package/lib/appui-react/preview/PreviewFeatures.d.ts.map +1 -1
  29. package/lib/appui-react/preview/PreviewFeatures.js +4 -2
  30. package/lib/appui-react/preview/PreviewFeatures.js.map +1 -1
  31. package/lib/appui-react/preview/control-widget-visibility/CloseWidgetButton.d.ts +3 -0
  32. package/lib/appui-react/preview/control-widget-visibility/CloseWidgetButton.d.ts.map +1 -1
  33. package/lib/appui-react/preview/control-widget-visibility/CloseWidgetButton.js +11 -2
  34. package/lib/appui-react/preview/control-widget-visibility/CloseWidgetButton.js.map +1 -1
  35. package/lib/appui-react/preview/widget-tab-actions/Widget.d.ts +10 -0
  36. package/lib/appui-react/preview/widget-tab-actions/Widget.d.ts.map +1 -0
  37. package/lib/appui-react/preview/widget-tab-actions/Widget.js +242 -0
  38. package/lib/appui-react/preview/widget-tab-actions/Widget.js.map +1 -0
  39. package/lib/appui-react/preview/widget-tab-actions/Widget.scss +198 -0
  40. package/lib/appui-react/preview/widget-tab-actions/useWidgetTabActions.d.ts +6 -0
  41. package/lib/appui-react/preview/widget-tab-actions/useWidgetTabActions.d.ts.map +1 -0
  42. package/lib/appui-react/preview/widget-tab-actions/useWidgetTabActions.js +18 -0
  43. package/lib/appui-react/preview/widget-tab-actions/useWidgetTabActions.js.map +1 -0
  44. package/lib/cjs/appui-react/layout/target/TitleBarTarget.scss +9 -7
  45. package/lib/cjs/appui-react/preview/widget-tab-actions/Widget.scss +198 -0
  46. package/lib/esm/appui-react/layout/target/TitleBarTarget.scss +9 -7
  47. package/lib/esm/appui-react/preview/widget-tab-actions/Widget.scss +198 -0
  48. package/package.json +8 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Change Log - @itwin/appui-react
2
2
 
3
+ ## 5.26.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f291611: Deprecated `PreviewFeaturesProviderProps` interface. Use `React.ComponentProps<typeof PreviewFeaturesProvider>` instead.
8
+ - f291611: Bumped the release tag of `PreviewFeaturesProvider` component and `PreviewFeatures` interface from `@beta` to `@public`.
9
+ - 2c75727: Added `widgetTabActions` preview feature, which when enabled displays widget tab actions for individual tabs instead of the default behavior where only active tab actions are exposed. Note that this feature replaces the overflow dropdown menu with a scrollable container to display all tab actions. Close button will be shown in widget tab when `controlWidgetVisibility` preview feature is enabled.
10
+
11
+ ```tsx
12
+ <PreviewFeaturesProvider
13
+ features={{
14
+ widgetTabActions: true,
15
+ }}
16
+ >
17
+ <App />
18
+ </PreviewFeaturesProvider>
19
+ ```
20
+
21
+ ### Patch Changes
22
+
23
+ - @itwin/components-react@5.26.0
24
+ - @itwin/core-react@5.26.0
25
+ - @itwin/imodel-components-react@5.26.0
26
+
3
27
  ## 5.25.0
4
28
 
5
29
  ### Minor Changes
@@ -4,5 +4,5 @@
4
4
  import "./TitleBarTarget.scss";
5
5
  import * as React from "react";
6
6
  /** @internal */
7
- export declare function TitleBarTarget(): React.JSX.Element;
7
+ export declare function TitleBarTarget(props: React.ComponentProps<"div">): React.JSX.Element;
8
8
  //# sourceMappingURL=TitleBarTarget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TitleBarTarget.d.ts","sourceRoot":"","sources":["../../../../src/appui-react/layout/target/TitleBarTarget.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,uBAAuB,CAAC;AAE/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,gBAAgB;AAChB,wBAAgB,cAAc,sBAwB7B"}
1
+ {"version":3,"file":"TitleBarTarget.d.ts","sourceRoot":"","sources":["../../../../src/appui-react/layout/target/TitleBarTarget.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,uBAAuB,CAAC;AAE/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAyBhE"}
@@ -18,7 +18,7 @@ import { useAllowedWidgetTarget } from "./useAllowedWidgetTarget.js";
18
18
  import { useLayout } from "../base/LayoutStore.js";
19
19
  import { useSendBackHomeState } from "../widget/SendBack.js";
20
20
  /** @internal */
21
- export function TitleBarTarget() {
21
+ export function TitleBarTarget(props) {
22
22
  const cursorType = React.useContext(CursorTypeContext);
23
23
  const draggedWidgetId = React.useContext(DraggedWidgetIdContext);
24
24
  const widgetId = React.useContext(WidgetIdContext);
@@ -30,8 +30,8 @@ export function TitleBarTarget() {
30
30
  const hidden = !allowedTarget ||
31
31
  (((!draggedTab && !draggedWidgetId) || draggedWidgetId === widgetId) &&
32
32
  !(activeHomeState?.widgetId === widgetId));
33
- const className = classnames("nz-target-titleBarTarget", hidden && "nz-hidden", cursorType && getCursorClassName(cursorType));
34
- return (React.createElement("div", { className: className, ref: ref },
33
+ const className = classnames("nz-target-titleBarTarget", hidden && "nz-hidden", cursorType && getCursorClassName(cursorType), props.className);
34
+ return (React.createElement("div", { ...props, className: className, ref: ref },
35
35
  React.createElement(TabOutline, null)));
36
36
  }
37
37
  function useTargetArgs(widgetId) {
@@ -1 +1 @@
1
- {"version":3,"file":"TitleBarTarget.js","sourceRoot":"","sources":["../../../../src/appui-react/layout/target/TitleBarTarget.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,uBAAuB,CAAC;AAC/B,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,gBAAgB;AAChB,MAAM,UAAU,cAAc;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,oBAAoB,EAAE,CAAC;IAC/C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnB,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAiB,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,MAAM,GACV,CAAC,aAAa;QACd,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,eAAe,CAAC,IAAI,eAAe,KAAK,QAAQ,CAAC;YAClE,CAAC,CAAC,eAAe,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,UAAU,CAC1B,0BAA0B,EAC1B,MAAM,IAAI,WAAW,EACrB,UAAU,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAC7C,CAAC;IACF,OAAO,CACL,6BAAK,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG;QACjC,oBAAC,UAAU,OAAG,CACV,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAA2B;IAChD,OAAO,KAAK,CAAC,OAAO,CAAwB,GAAG,EAAE;QAC/C,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ;SACT,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Widget\n */\n\nimport \"./TitleBarTarget.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { DraggedWidgetIdContext, useTarget } from \"../base/DragManager.js\";\nimport { CursorTypeContext } from \"../base/NineZone.js\";\nimport { getCursorClassName } from \"../widget-panels/CursorOverlay.js\";\nimport type { WidgetState } from \"../state/WidgetState.js\";\nimport { WidgetIdContext } from \"../widget/Widget.js\";\nimport { TabOutline } from \"../outline/TabOutline.js\";\nimport { useAllowedWidgetTarget } from \"./useAllowedWidgetTarget.js\";\nimport type { WidgetDropTargetState } from \"../state/DropTargetState.js\";\nimport { useLayout } from \"../base/LayoutStore.js\";\nimport { useSendBackHomeState } from \"../widget/SendBack.js\";\n\n/** @internal */\nexport function TitleBarTarget() {\n const cursorType = React.useContext(CursorTypeContext);\n const draggedWidgetId = React.useContext(DraggedWidgetIdContext);\n const widgetId = React.useContext(WidgetIdContext);\n const activeHomeState = useSendBackHomeState();\n assert(!!widgetId);\n const draggedTab = useLayout((state) => !!state.draggedTab);\n const [ref] = useTarget<HTMLDivElement>(useTargetArgs(widgetId));\n const allowedTarget = useAllowedWidgetTarget(widgetId);\n\n const hidden =\n !allowedTarget ||\n (((!draggedTab && !draggedWidgetId) || draggedWidgetId === widgetId) &&\n !(activeHomeState?.widgetId === widgetId));\n const className = classnames(\n \"nz-target-titleBarTarget\",\n hidden && \"nz-hidden\",\n cursorType && getCursorClassName(cursorType)\n );\n return (\n <div className={className} ref={ref}>\n <TabOutline />\n </div>\n );\n}\n\nfunction useTargetArgs(widgetId: WidgetState[\"id\"]) {\n return React.useMemo<WidgetDropTargetState>(() => {\n return {\n type: \"widget\",\n widgetId,\n };\n }, [widgetId]);\n}\n"]}
1
+ {"version":3,"file":"TitleBarTarget.js","sourceRoot":"","sources":["../../../../src/appui-react/layout/target/TitleBarTarget.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,uBAAuB,CAAC;AAC/B,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,gBAAgB;AAChB,MAAM,UAAU,cAAc,CAAC,KAAkC;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,oBAAoB,EAAE,CAAC;IAC/C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnB,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAiB,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,MAAM,GACV,CAAC,aAAa;QACd,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,eAAe,CAAC,IAAI,eAAe,KAAK,QAAQ,CAAC;YAClE,CAAC,CAAC,eAAe,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,UAAU,CAC1B,0BAA0B,EAC1B,MAAM,IAAI,WAAW,EACrB,UAAU,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAC5C,KAAK,CAAC,SAAS,CAChB,CAAC;IACF,OAAO,CACL,gCAAS,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG;QAC5C,oBAAC,UAAU,OAAG,CACV,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAA2B;IAChD,OAAO,KAAK,CAAC,OAAO,CAAwB,GAAG,EAAE;QAC/C,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ;SACT,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Widget\n */\n\nimport \"./TitleBarTarget.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { DraggedWidgetIdContext, useTarget } from \"../base/DragManager.js\";\nimport { CursorTypeContext } from \"../base/NineZone.js\";\nimport { getCursorClassName } from \"../widget-panels/CursorOverlay.js\";\nimport type { WidgetState } from \"../state/WidgetState.js\";\nimport { WidgetIdContext } from \"../widget/Widget.js\";\nimport { TabOutline } from \"../outline/TabOutline.js\";\nimport { useAllowedWidgetTarget } from \"./useAllowedWidgetTarget.js\";\nimport type { WidgetDropTargetState } from \"../state/DropTargetState.js\";\nimport { useLayout } from \"../base/LayoutStore.js\";\nimport { useSendBackHomeState } from \"../widget/SendBack.js\";\n\n/** @internal */\nexport function TitleBarTarget(props: React.ComponentProps<\"div\">) {\n const cursorType = React.useContext(CursorTypeContext);\n const draggedWidgetId = React.useContext(DraggedWidgetIdContext);\n const widgetId = React.useContext(WidgetIdContext);\n const activeHomeState = useSendBackHomeState();\n assert(!!widgetId);\n const draggedTab = useLayout((state) => !!state.draggedTab);\n const [ref] = useTarget<HTMLDivElement>(useTargetArgs(widgetId));\n const allowedTarget = useAllowedWidgetTarget(widgetId);\n\n const hidden =\n !allowedTarget ||\n (((!draggedTab && !draggedWidgetId) || draggedWidgetId === widgetId) &&\n !(activeHomeState?.widgetId === widgetId));\n const className = classnames(\n \"nz-target-titleBarTarget\",\n hidden && \"nz-hidden\",\n cursorType && getCursorClassName(cursorType),\n props.className\n );\n return (\n <div {...props} className={className} ref={ref}>\n <TabOutline />\n </div>\n );\n}\n\nfunction useTargetArgs(widgetId: WidgetState[\"id\"]) {\n return React.useMemo<WidgetDropTargetState>(() => {\n return {\n type: \"widget\",\n widgetId,\n };\n }, [widgetId]);\n}\n"]}
@@ -4,14 +4,16 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  @use "~@itwin/core-react/lib/core-react/z-index" as *;
6
6
 
7
- .nz-target-titleBarTarget {
8
- flex: 1 1 0;
9
- position: relative;
10
- overflow: hidden;
7
+ @layer appui.component {
8
+ .nz-target-titleBarTarget {
9
+ flex: 1 1 0;
10
+ position: relative;
11
+ overflow: hidden;
11
12
 
12
- @include uicore-z-index(drop-target);
13
+ @include uicore-z-index(drop-target);
13
14
 
14
- &.nz-hidden {
15
- display: none;
15
+ &.nz-hidden {
16
+ display: none;
17
+ }
16
18
  }
17
19
  }
@@ -9,4 +9,6 @@ export interface WidgetContentContainerProps {
9
9
  }
10
10
  /** @internal */
11
11
  export declare function WidgetContentContainer(props: WidgetContentContainerProps): React.JSX.Element;
12
+ /** @internal */
13
+ export declare function useWidgetContentContainer(): React.RefCallback<HTMLDivElement>;
12
14
  //# sourceMappingURL=ContentContainer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContentContainer.d.ts","sourceRoot":"","sources":["../../../../src/appui-react/layout/widget/ContentContainer.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,yBAAyB,CAAC;AAEjC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,gBAAgB;AAChB,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,qBA4BxE"}
1
+ {"version":3,"file":"ContentContainer.d.ts","sourceRoot":"","sources":["../../../../src/appui-react/layout/widget/ContentContainer.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,yBAAyB,CAAC;AAEjC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,gBAAgB;AAChB,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,qBAmBxE;AAED,gBAAgB;AAChB,wBAAgB,yBAAyB,IAAI,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,CAS7E"}
@@ -8,30 +8,30 @@
8
8
  import "./ContentContainer.scss";
9
9
  import classnames from "classnames";
10
10
  import * as React from "react";
11
- import { assert } from "@itwin/core-bentley";
12
11
  import { WidgetContentManagerContext } from "./ContentManager.js";
13
12
  import { PanelSideContext } from "../widget-panels/Panel.js";
14
- import { WidgetIdContext } from "./Widget.js";
13
+ import { useActiveTabId, WidgetIdContext } from "./Widget.js";
15
14
  import { useLayout } from "../base/LayoutStore.js";
16
15
  import { getWidgetState } from "../state/internal/WidgetStateHelpers.js";
16
+ import { useSafeContext } from "../../hooks/useSafeContext.js";
17
17
  /** @internal */
18
18
  export function WidgetContentContainer(props) {
19
- const widgetId = React.useContext(WidgetIdContext);
20
- const widgetContentManager = React.useContext(WidgetContentManagerContext);
21
19
  const side = React.useContext(PanelSideContext);
22
- assert(!!widgetId);
23
- const { minimized, activeTabId } = useLayout((state) => {
24
- const widget = getWidgetState(state, widgetId);
25
- return { minimized: widget.minimized, activeTabId: widget.activeTabId };
26
- }, true);
27
- const ref = React.useCallback((instance) => {
28
- if (!widgetContentManager)
29
- return;
30
- widgetContentManager.setContainer(activeTabId, instance ?? undefined);
31
- }, [widgetContentManager, activeTabId]);
32
- const className = classnames("nz-widget-contentContainer", undefined === side && minimized && "nz-minimized");
33
- return (React.createElement("div", { className: className },
20
+ const widgetId = useSafeContext(WidgetIdContext);
21
+ const minimized = useLayout((state) => {
22
+ return getWidgetState(state, widgetId).minimized;
23
+ });
24
+ const ref = useWidgetContentContainer();
25
+ return (React.createElement("div", { className: classnames("nz-widget-contentContainer", undefined === side && minimized && "nz-minimized") },
34
26
  React.createElement("div", { className: "nz-content", ref: ref }),
35
27
  props.children));
36
28
  }
29
+ /** @internal */
30
+ export function useWidgetContentContainer() {
31
+ const widgetContentManager = useSafeContext(WidgetContentManagerContext);
32
+ const activeTabId = useActiveTabId();
33
+ return React.useCallback((instance) => {
34
+ widgetContentManager.setContainer(activeTabId, instance ?? undefined);
35
+ }, [widgetContentManager, activeTabId]);
36
+ }
37
37
  //# sourceMappingURL=ContentContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContentContainer.js","sourceRoot":"","sources":["../../../../src/appui-react/layout/widget/ContentContainer.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,yBAAyB,CAAC;AACjC,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAOzE,gBAAgB;AAChB,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,oBAAoB,GAAG,KAAK,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAChD,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IAC1E,CAAC,EAAE,IAAI,CAAC,CAAC;IACT,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAC3B,CAAC,QAAQ,EAAE,EAAE;QACX,IAAI,CAAC,oBAAoB;YAAE,OAAO;QAElC,oBAAoB,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;IACxE,CAAC,EACD,CAAC,oBAAoB,EAAE,WAAW,CAAC,CACpC,CAAC;IAEF,MAAM,SAAS,GAAG,UAAU,CAC1B,4BAA4B,EAC5B,SAAS,KAAK,IAAI,IAAI,SAAS,IAAI,cAAc,CAClD,CAAC;IACF,OAAO,CACL,6BAAK,SAAS,EAAE,SAAS;QACvB,6BAAK,SAAS,EAAC,YAAY,EAAC,GAAG,EAAE,GAAG,GAAI;QACvC,KAAK,CAAC,QAAQ,CACX,CACP,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Widget\n */\n\nimport \"./ContentContainer.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { WidgetContentManagerContext } from \"./ContentManager.js\";\nimport { PanelSideContext } from \"../widget-panels/Panel.js\";\nimport { WidgetIdContext } from \"./Widget.js\";\nimport { useLayout } from \"../base/LayoutStore.js\";\nimport { getWidgetState } from \"../state/internal/WidgetStateHelpers.js\";\n\n/** @internal */\nexport interface WidgetContentContainerProps {\n children?: React.ReactNode;\n}\n\n/** @internal */\nexport function WidgetContentContainer(props: WidgetContentContainerProps) {\n const widgetId = React.useContext(WidgetIdContext);\n const widgetContentManager = React.useContext(WidgetContentManagerContext);\n const side = React.useContext(PanelSideContext);\n assert(!!widgetId);\n const { minimized, activeTabId } = useLayout((state) => {\n const widget = getWidgetState(state, widgetId);\n return { minimized: widget.minimized, activeTabId: widget.activeTabId };\n }, true);\n const ref = React.useCallback<React.RefCallback<HTMLDivElement>>(\n (instance) => {\n if (!widgetContentManager) return;\n\n widgetContentManager.setContainer(activeTabId, instance ?? undefined);\n },\n [widgetContentManager, activeTabId]\n );\n\n const className = classnames(\n \"nz-widget-contentContainer\",\n undefined === side && minimized && \"nz-minimized\"\n );\n return (\n <div className={className}>\n <div className=\"nz-content\" ref={ref} />\n {props.children}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ContentContainer.js","sourceRoot":"","sources":["../../../../src/appui-react/layout/widget/ContentContainer.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,yBAAyB,CAAC;AACjC,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAO/D,gBAAgB;AAChB,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QACpC,OAAO,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,yBAAyB,EAAE,CAAC;IAExC,OAAO,CACL,6BACE,SAAS,EAAE,UAAU,CACnB,4BAA4B,EAC5B,SAAS,KAAK,IAAI,IAAI,SAAS,IAAI,cAAc,CAClD;QAED,6BAAK,SAAS,EAAC,YAAY,EAAC,GAAG,EAAE,GAAG,GAAI;QACvC,KAAK,CAAC,QAAQ,CACX,CACP,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,yBAAyB;IACvC,MAAM,oBAAoB,GAAG,cAAc,CAAC,2BAA2B,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,WAAW,CACtB,CAAC,QAAQ,EAAE,EAAE;QACX,oBAAoB,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;IACxE,CAAC,EACD,CAAC,oBAAoB,EAAE,WAAW,CAAC,CACpC,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Widget\n */\n\nimport \"./ContentContainer.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { WidgetContentManagerContext } from \"./ContentManager.js\";\nimport { PanelSideContext } from \"../widget-panels/Panel.js\";\nimport { useActiveTabId, WidgetIdContext } from \"./Widget.js\";\nimport { useLayout } from \"../base/LayoutStore.js\";\nimport { getWidgetState } from \"../state/internal/WidgetStateHelpers.js\";\nimport { useSafeContext } from \"../../hooks/useSafeContext.js\";\n\n/** @internal */\nexport interface WidgetContentContainerProps {\n children?: React.ReactNode;\n}\n\n/** @internal */\nexport function WidgetContentContainer(props: WidgetContentContainerProps) {\n const side = React.useContext(PanelSideContext);\n const widgetId = useSafeContext(WidgetIdContext);\n const minimized = useLayout((state) => {\n return getWidgetState(state, widgetId).minimized;\n });\n const ref = useWidgetContentContainer();\n\n return (\n <div\n className={classnames(\n \"nz-widget-contentContainer\",\n undefined === side && minimized && \"nz-minimized\"\n )}\n >\n <div className=\"nz-content\" ref={ref} />\n {props.children}\n </div>\n );\n}\n\n/** @internal */\nexport function useWidgetContentContainer(): React.RefCallback<HTMLDivElement> {\n const widgetContentManager = useSafeContext(WidgetContentManagerContext);\n const activeTabId = useActiveTabId();\n return React.useCallback(\n (instance) => {\n widgetContentManager.setContainer(activeTabId, instance ?? undefined);\n },\n [widgetContentManager, activeTabId]\n );\n}\n"]}
@@ -10,24 +10,76 @@ type FloatingWidgetEdgeHandle = "left" | "right" | "top" | "bottom";
10
10
  type FloatingWidgetCornerHandle = "topLeft" | "topRight" | "bottomLeft" | "bottomRight";
11
11
  /** @internal */
12
12
  export type FloatingWidgetResizeHandle = FloatingWidgetEdgeHandle | FloatingWidgetCornerHandle;
13
- /** @internal */
14
- export interface FloatingWidgetProviderProps {
13
+ interface FloatingWidgetProviderProps {
15
14
  id: FloatingWidgetState["id"];
16
15
  }
17
16
  /** @internal */
18
17
  export declare function FloatingWidgetProvider(props: FloatingWidgetProviderProps): React.JSX.Element;
19
- /** @internal */
20
- export interface FloatingWidgetProps {
18
+ interface FloatingWidgetProps {
21
19
  onMouseEnter?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;
22
20
  onMouseLeave?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;
23
21
  }
24
22
  /** @internal */
25
23
  export declare function FloatingWidget(props: FloatingWidgetProps): React.JSX.Element;
24
+ interface FloatingWidgetHandleProps extends React.HTMLAttributes<HTMLDivElement> {
25
+ handle: FloatingWidgetResizeHandle;
26
+ }
27
+ /** @internal */
28
+ export declare function FloatingWidgetHandle(props: FloatingWidgetHandleProps): React.JSX.Element | null;
26
29
  /** @internal */
27
30
  export declare function getResizeBy(handle: FloatingWidgetResizeHandle, offset: XAndY): Rectangle;
28
31
  /** @internal */
29
32
  export declare function useFloatingWidgetId(): FloatingWidgetState["id"] | undefined;
30
33
  /** @internal */
31
34
  export declare function useWidgetAllowedToDock(): boolean;
35
+ /** @internal */
36
+ export declare function useFloatingWidget(): {
37
+ ref: (instance: Element | null) => void;
38
+ maximizedWidget: {
39
+ style: {
40
+ transform?: undefined;
41
+ height?: undefined;
42
+ width?: undefined;
43
+ "max-height"?: undefined;
44
+ "max-width"?: undefined;
45
+ };
46
+ classNames: {
47
+ "uifw-preview-enableMaximizedWidget_floatingWidget"?: undefined;
48
+ };
49
+ } | {
50
+ style: {
51
+ transform: string;
52
+ height: string;
53
+ width: string;
54
+ "max-height": string;
55
+ "max-width": string;
56
+ };
57
+ classNames: {
58
+ "uifw-preview-enableMaximizedWidget_floatingWidget": boolean;
59
+ };
60
+ };
61
+ hidden: boolean | undefined;
62
+ minimized: boolean;
63
+ resizable: boolean;
64
+ dragged: boolean;
65
+ isToolSettingsTab: boolean;
66
+ style: {
67
+ transform: string;
68
+ height: number | undefined;
69
+ width: number | undefined;
70
+ "max-height"?: undefined;
71
+ "max-width"?: undefined;
72
+ maxHeight: string | undefined;
73
+ maxWidth: string | undefined;
74
+ } | {
75
+ transform: string;
76
+ height: string;
77
+ width: string;
78
+ "max-height": string;
79
+ "max-width": string;
80
+ maxHeight: string | undefined;
81
+ maxWidth: string | undefined;
82
+ };
83
+ };
32
84
  export {};
33
85
  //# sourceMappingURL=FloatingWidget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingWidget.d.ts","sourceRoot":"","sources":["../../../../src/appui-react/layout/widget/FloatingWidget.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,uBAAuB,CAAC;AAE/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAEL,SAAS,EAGV,MAAM,4BAA4B,CAAC;AAapC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAUnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2CAA2C,CAAC;AAMvE,KAAK,wBAAwB,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AACpE,KAAK,0BAA0B,GAC3B,SAAS,GACT,UAAU,GACV,YAAY,GACZ,aAAa,CAAC;AAElB,gBAAgB;AAChB,MAAM,MAAM,0BAA0B,GAClC,wBAAwB,GACxB,0BAA0B,CAAC;AAE/B,gBAAgB;AAChB,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,qBAGxE;AAED,gBAAgB;AAChB,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;CAC3E;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,qBAwFxD;AAoKD,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,KAAK,aAmB5E;AAED,gBAAgB;AAChB,wBAAgB,mBAAmB,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,SAAS,CAS3E;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,IAAI,OAAO,CAYhD"}
1
+ {"version":3,"file":"FloatingWidget.d.ts","sourceRoot":"","sources":["../../../../src/appui-react/layout/widget/FloatingWidget.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,uBAAuB,CAAC;AAE/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAEL,SAAS,EAGV,MAAM,4BAA4B,CAAC;AAapC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAUnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2CAA2C,CAAC;AASvE,KAAK,wBAAwB,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AACpE,KAAK,0BAA0B,GAC3B,SAAS,GACT,UAAU,GACV,YAAY,GACZ,aAAa,CAAC;AAElB,gBAAgB;AAChB,MAAM,MAAM,0BAA0B,GAClC,wBAAwB,GACxB,0BAA0B,CAAC;AAE/B,UAAU,2BAA2B;IACnC,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,qBAQxE;AAED,UAAU,mBAAmB;IAC3B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;CAC3E;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,qBAyDxD;AAoHD,UAAU,yBACR,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC5C,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAED,gBAAgB;AAChB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,4BA+DpE;AAED,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,KAAK,aAmB5E;AAED,gBAAgB;AAChB,wBAAgB,mBAAmB,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,SAAS,CAS3E;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,IAAI,OAAO,CAYhD;AAuBD,gBAAgB;AAChB,wBAAgB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoChC"}
@@ -21,38 +21,18 @@ import { WidgetOutline } from "../outline/WidgetOutline.js";
21
21
  import { useLayout } from "../base/LayoutStore.js";
22
22
  import { getWidgetState } from "../state/internal/WidgetStateHelpers.js";
23
23
  import { useIsMaximizedWidget, useMaximizedFloatingWidget, } from "../../preview/enable-maximized-widget/useMaximizedWidget.js";
24
+ import { useWidgetTabActions } from "../../preview/widget-tab-actions/useWidgetTabActions.js";
25
+ import { FloatingWidget as TabActionsFloatingWidget } from "../../preview/widget-tab-actions/Widget.js";
26
+ import { useSafeContext } from "../../hooks/useSafeContext.js";
24
27
  /** @internal */
25
28
  export function FloatingWidgetProvider(props) {
26
29
  const floatingWidget = React.useContext(FloatingWidgetNodeContext);
27
- return React.createElement(WidgetProvider, { id: props.id }, floatingWidget);
30
+ const widgetTabActions = useWidgetTabActions();
31
+ return (React.createElement(WidgetProvider, { id: props.id }, widgetTabActions ? React.createElement(TabActionsFloatingWidget, null) : floatingWidget));
28
32
  }
29
33
  /** @internal */
30
34
  export function FloatingWidget(props) {
31
- const uiIsVisible = React.useContext(UiIsVisibleContext);
32
- const id = useFloatingWidgetId();
33
- assert(!!id);
34
- const { autoSized, bounds, hideWithUiWhenFloating, isToolSettingsTab, minimized, resizable, } = useFloatingWidgetState();
35
- const hideFloatingWidget = !uiIsVisible && hideWithUiWhenFloating;
36
- const item = React.useMemo(() => ({
37
- id,
38
- type: "widget",
39
- }), [id]);
40
- const dragged = useIsDraggedItem(item);
41
- const ref = useHandleAutoSize(dragged);
42
- const maximizedWidget = useMaximizedFloatingWidget();
43
- const className = classnames("nz-widget-floatingWidget", dragged && "nz-dragged", isToolSettingsTab && "nz-floating-toolSettings", minimized && "nz-minimized", hideFloatingWidget && "nz-hidden", maximizedWidget.classNames);
44
- const style = React.useMemo(() => {
45
- const boundsRect = Rectangle.create(bounds);
46
- const { height, width } = boundsRect.getSize();
47
- const position = boundsRect.topLeft();
48
- return {
49
- transform: `translate(${position.x}px, ${position.y}px)`,
50
- height: minimized || autoSized ? undefined : height,
51
- width: autoSized ? undefined : width,
52
- maxHeight: autoSized ? "60%" : undefined,
53
- maxWidth: autoSized ? "60%" : undefined,
54
- };
55
- }, [autoSized, bounds, minimized]);
35
+ const { ref, style, hidden, minimized, resizable, dragged, isToolSettingsTab, maximizedWidget, } = useFloatingWidget();
56
36
  const content = React.useMemo(() => (React.createElement(WidgetContentContainer, null,
57
37
  React.createElement(WidgetTarget, null),
58
38
  React.createElement(WidgetOutline, null))), []);
@@ -65,38 +45,47 @@ export function FloatingWidget(props) {
65
45
  React.createElement(FloatingWidgetHandle, { handle: "topRight" }),
66
46
  React.createElement(FloatingWidgetHandle, { handle: "bottomLeft" }),
67
47
  React.createElement(FloatingWidgetHandle, { handle: "bottomRight" }))), [resizable]);
68
- return (React.createElement(Widget, { className: className, widgetId: id, style: {
69
- ...style,
70
- ...maximizedWidget.style,
71
- }, ref: ref, onMouseEnter: props.onMouseEnter, onMouseLeave: props.onMouseLeave },
48
+ return (React.createElement(Widget, { className: classnames("nz-widget-floatingWidget", dragged && "nz-dragged", isToolSettingsTab && "nz-floating-toolSettings", minimized && "nz-minimized", hidden && "nz-hidden", maximizedWidget.classNames), style: style, ref: ref, onMouseEnter: props.onMouseEnter, onMouseLeave: props.onMouseLeave },
72
49
  React.createElement(WidgetTabBar, { separator: !minimized }),
73
50
  content,
74
51
  handles));
75
52
  }
76
- function useFloatingWidgetState() {
53
+ function useIsDraggedWidget() {
77
54
  const id = useFloatingWidgetId();
78
55
  assert(!!id);
79
- return useLayout((state) => {
56
+ const item = React.useMemo(() => ({
57
+ id,
58
+ type: "widget",
59
+ }), [id]);
60
+ return useIsDraggedItem(item);
61
+ }
62
+ function useFloatingWidgetStyle() {
63
+ const id = useSafeContext(WidgetIdContext);
64
+ const autoSized = useLayout((state) => {
80
65
  const widget = getWidgetState(state, id);
81
66
  const floatingWidget = state.floatingWidgets.byId[id];
82
- const tabs = widget.tabs;
83
- const activeTabId = widget.activeTabId;
84
- const activeTab = state.tabs[activeTabId];
85
- const userSized = floatingWidget.userSized;
86
- const singleTab = 1 === tabs.length;
87
- const toolSettingsTabId = state.toolSettings?.tabId;
88
- const isToolSettingsTab = widget.tabs[0] === toolSettingsTabId;
89
- const resizable = !!floatingWidget.resizable && !isToolSettingsTab;
90
- const autoSized = singleTab && !userSized;
67
+ const singleTab = 1 === widget.tabs.length;
68
+ return singleTab && !floatingWidget.userSized;
69
+ });
70
+ const bounds = useLayout((state) => state.floatingWidgets.byId[id].bounds);
71
+ const minimized = useLayout((state) => getWidgetState(state, id).minimized);
72
+ const style = React.useMemo(() => {
73
+ const boundsRect = Rectangle.create(bounds);
74
+ const { height, width } = boundsRect.getSize();
75
+ const position = boundsRect.topLeft();
91
76
  return {
92
- autoSized,
93
- bounds: floatingWidget.bounds,
94
- hideWithUiWhenFloating: activeTab.hideWithUiWhenFloating,
95
- isToolSettingsTab,
96
- minimized: widget.minimized,
97
- resizable,
77
+ transform: `translate(${position.x}px, ${position.y}px)`,
78
+ height: minimized || autoSized ? undefined : height,
79
+ width: autoSized ? undefined : width,
80
+ maxHeight: autoSized ? "60%" : undefined,
81
+ maxWidth: autoSized ? "60%" : undefined,
98
82
  };
99
- }, true);
83
+ }, [autoSized, bounds, minimized]);
84
+ const maximizedWidget = useMaximizedFloatingWidget();
85
+ return {
86
+ ...style,
87
+ ...maximizedWidget.style,
88
+ };
100
89
  }
101
90
  // Re-adjust bounds so that widget is behind pointer when auto-sized.
102
91
  function useHandleAutoSize(dragged) {
@@ -167,7 +156,8 @@ function useHandleAutoSize(dragged) {
167
156
  const refs = useRefs(ref, roRef);
168
157
  return refs;
169
158
  }
170
- function FloatingWidgetHandle(props) {
159
+ /** @internal */
160
+ export function FloatingWidgetHandle(props) {
171
161
  const dispatch = React.useContext(NineZoneDispatchContext);
172
162
  const id = useFloatingWidgetId();
173
163
  const { handle } = props;
@@ -210,10 +200,9 @@ function FloatingWidgetHandle(props) {
210
200
  const ref = React.useRef(null);
211
201
  const refs = useRefs(ref, pointerCaptorRef);
212
202
  const isMaximized = useIsMaximizedWidget();
213
- const className = classnames("nz-widget-floatingWidget_handle", `nz-${handle}`);
214
203
  if (isMaximized)
215
204
  return null;
216
- return React.createElement("div", { className: className, ref: refs });
205
+ return (React.createElement("div", { ...props, className: classnames("nz-widget-floatingWidget_handle", `nz-${handle}`, props.className), ref: refs }));
217
206
  }
218
207
  /** @internal */
219
208
  export function getResizeBy(handle, offset) {
@@ -262,4 +251,61 @@ export function useWidgetAllowedToDock() {
262
251
  return true;
263
252
  });
264
253
  }
254
+ function useBringToFront() {
255
+ const dispatch = React.useContext(NineZoneDispatchContext);
256
+ const floatingWidgetId = useFloatingWidgetId();
257
+ const ref = React.useRef(null);
258
+ React.useEffect(() => {
259
+ const listener = () => {
260
+ floatingWidgetId &&
261
+ dispatch({
262
+ type: "FLOATING_WIDGET_BRING_TO_FRONT",
263
+ id: floatingWidgetId,
264
+ });
265
+ };
266
+ const element = ref.current;
267
+ element?.addEventListener("click", listener);
268
+ return () => {
269
+ element?.removeEventListener("click", listener);
270
+ };
271
+ }, [dispatch, floatingWidgetId]);
272
+ return ref;
273
+ }
274
+ /** @internal */
275
+ export function useFloatingWidget() {
276
+ const id = useSafeContext(WidgetIdContext);
277
+ const uiIsVisible = React.useContext(UiIsVisibleContext);
278
+ const minimized = useLayout((state) => getWidgetState(state, id).minimized);
279
+ const hideWithUiWhenFloating = useLayout((state) => {
280
+ const widget = getWidgetState(state, id);
281
+ const activeTab = state.tabs[widget.activeTabId];
282
+ return activeTab.hideWithUiWhenFloating;
283
+ });
284
+ const isToolSettingsTab = useLayout((state) => {
285
+ const widget = getWidgetState(state, id);
286
+ const toolSettingsTabId = state.toolSettings?.tabId;
287
+ return widget.tabs[0] === toolSettingsTabId;
288
+ });
289
+ const resizable = useLayout((state) => {
290
+ const floatingWidget = state.floatingWidgets.byId[id];
291
+ return !!floatingWidget.resizable && !isToolSettingsTab;
292
+ });
293
+ const hidden = !uiIsVisible && hideWithUiWhenFloating;
294
+ const style = useFloatingWidgetStyle();
295
+ const dragged = useIsDraggedWidget();
296
+ const maximizedWidget = useMaximizedFloatingWidget();
297
+ const autoSizeRef = useHandleAutoSize(dragged);
298
+ const bringToFrontRef = useBringToFront();
299
+ const ref = useRefs(autoSizeRef, bringToFrontRef);
300
+ return {
301
+ ref,
302
+ maximizedWidget,
303
+ hidden,
304
+ minimized,
305
+ resizable,
306
+ dragged,
307
+ isToolSettingsTab,
308
+ style,
309
+ };
310
+ }
265
311
  //# sourceMappingURL=FloatingWidget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingWidget.js","sourceRoot":"","sources":["../../../../src/appui-react/layout/widget/FloatingWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Widget\n */\n\nimport \"./FloatingWidget.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport {\n Point,\n Rectangle,\n useRefs,\n useResizeObserver,\n} from \"@itwin/core-react/internal\";\nimport type { UseDragResizeHandleArgs } from \"../base/DragManager.js\";\nimport {\n DragManagerContext,\n useDragResizeHandle,\n useIsDraggedItem,\n} from \"../base/DragManager.js\";\nimport {\n FloatingWidgetNodeContext,\n MeasureContext,\n NineZoneDispatchContext,\n UiIsVisibleContext,\n} from \"../base/NineZone.js\";\nimport type { FloatingWidgetState } from \"../state/WidgetState.js\";\nimport { WidgetContentContainer } from \"./ContentContainer.js\";\nimport { WidgetTabBar } from \"./TabBar.js\";\nimport { Widget, WidgetIdContext, WidgetProvider } from \"./Widget.js\";\nimport type { PointerCaptorArgs } from \"../base/usePointerCaptor.js\";\nimport { usePointerCaptor } from \"../base/usePointerCaptor.js\";\nimport { WidgetTarget } from \"../target/WidgetTarget.js\";\nimport { WidgetOutline } from \"../outline/WidgetOutline.js\";\nimport { useLayout } from \"../base/LayoutStore.js\";\nimport { getWidgetState } from \"../state/internal/WidgetStateHelpers.js\";\nimport type { XAndY } from \"../state/internal/NineZoneStateHelpers.js\";\nimport {\n useIsMaximizedWidget,\n useMaximizedFloatingWidget,\n} from \"../../preview/enable-maximized-widget/useMaximizedWidget.js\";\n\ntype FloatingWidgetEdgeHandle = \"left\" | \"right\" | \"top\" | \"bottom\";\ntype FloatingWidgetCornerHandle =\n | \"topLeft\"\n | \"topRight\"\n | \"bottomLeft\"\n | \"bottomRight\";\n\n/** @internal */\nexport type FloatingWidgetResizeHandle =\n | FloatingWidgetEdgeHandle\n | FloatingWidgetCornerHandle;\n\n/** @internal */\nexport interface FloatingWidgetProviderProps {\n id: FloatingWidgetState[\"id\"];\n}\n\n/** @internal */\nexport function FloatingWidgetProvider(props: FloatingWidgetProviderProps) {\n const floatingWidget = React.useContext(FloatingWidgetNodeContext);\n return <WidgetProvider id={props.id}>{floatingWidget}</WidgetProvider>;\n}\n\n/** @internal */\nexport interface FloatingWidgetProps {\n onMouseEnter?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n onMouseLeave?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n}\n\n/** @internal */\nexport function FloatingWidget(props: FloatingWidgetProps) {\n const uiIsVisible = React.useContext(UiIsVisibleContext);\n const id = useFloatingWidgetId();\n assert(!!id);\n const {\n autoSized,\n bounds,\n hideWithUiWhenFloating,\n isToolSettingsTab,\n minimized,\n resizable,\n } = useFloatingWidgetState();\n const hideFloatingWidget = !uiIsVisible && hideWithUiWhenFloating;\n\n const item = React.useMemo(\n () => ({\n id,\n type: \"widget\" as const,\n }),\n [id]\n );\n const dragged = useIsDraggedItem(item);\n const ref = useHandleAutoSize(dragged);\n const maximizedWidget = useMaximizedFloatingWidget();\n\n const className = classnames(\n \"nz-widget-floatingWidget\",\n dragged && \"nz-dragged\",\n isToolSettingsTab && \"nz-floating-toolSettings\",\n minimized && \"nz-minimized\",\n hideFloatingWidget && \"nz-hidden\",\n maximizedWidget.classNames\n );\n const style = React.useMemo(() => {\n const boundsRect = Rectangle.create(bounds);\n const { height, width } = boundsRect.getSize();\n const position = boundsRect.topLeft();\n return {\n transform: `translate(${position.x}px, ${position.y}px)`,\n height: minimized || autoSized ? undefined : height,\n width: autoSized ? undefined : width,\n maxHeight: autoSized ? \"60%\" : undefined,\n maxWidth: autoSized ? \"60%\" : undefined,\n };\n }, [autoSized, bounds, minimized]);\n\n const content = React.useMemo(\n () => (\n <WidgetContentContainer>\n <WidgetTarget />\n <WidgetOutline />\n </WidgetContentContainer>\n ),\n []\n );\n const handles = React.useMemo(\n () =>\n resizable && (\n <>\n <FloatingWidgetHandle handle=\"left\" />\n <FloatingWidgetHandle handle=\"top\" />\n <FloatingWidgetHandle handle=\"right\" />\n <FloatingWidgetHandle handle=\"bottom\" />\n <FloatingWidgetHandle handle=\"topLeft\" />\n <FloatingWidgetHandle handle=\"topRight\" />\n <FloatingWidgetHandle handle=\"bottomLeft\" />\n <FloatingWidgetHandle handle=\"bottomRight\" />\n </>\n ),\n [resizable]\n );\n return (\n <Widget\n className={className}\n widgetId={id}\n style={{\n ...style,\n ...maximizedWidget.style,\n }}\n ref={ref}\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n >\n <WidgetTabBar separator={!minimized} />\n {content}\n {handles}\n </Widget>\n );\n}\n\nfunction useFloatingWidgetState() {\n const id = useFloatingWidgetId();\n assert(!!id);\n return useLayout((state) => {\n const widget = getWidgetState(state, id);\n const floatingWidget = state.floatingWidgets.byId[id];\n const tabs = widget.tabs;\n const activeTabId = widget.activeTabId;\n const activeTab = state.tabs[activeTabId];\n const userSized = floatingWidget.userSized;\n const singleTab = 1 === tabs.length;\n\n const toolSettingsTabId = state.toolSettings?.tabId;\n const isToolSettingsTab = widget.tabs[0] === toolSettingsTabId;\n const resizable = !!floatingWidget.resizable && !isToolSettingsTab;\n const autoSized = singleTab && !userSized;\n return {\n autoSized,\n bounds: floatingWidget.bounds,\n hideWithUiWhenFloating: activeTab.hideWithUiWhenFloating,\n isToolSettingsTab,\n minimized: widget.minimized,\n resizable,\n };\n }, true);\n}\n\n// Re-adjust bounds so that widget is behind pointer when auto-sized.\nfunction useHandleAutoSize(dragged: boolean) {\n const dragManager = React.useContext(DragManagerContext);\n const dispatch = React.useContext(NineZoneDispatchContext);\n const measureNz = React.useContext(MeasureContext);\n const id = useFloatingWidgetId();\n assert(!!id);\n const userSized = useLayout(\n (state) => state.floatingWidgets.byId[id].userSized\n );\n const maximizedWidget = useIsMaximizedWidget();\n\n const updatePosition = React.useRef(true);\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (!updatePosition.current) return;\n if (!dragged) return;\n if (maximizedWidget) return;\n if (!dragManager.draggedItem) return;\n if (!ref.current) return;\n\n let bounds = Rectangle.create(ref.current.getBoundingClientRect());\n const nzBounds = measureNz();\n const pointerPosition = dragManager.draggedItem.info.pointerPosition;\n\n if (bounds.containsPoint(pointerPosition)) return;\n\n // Pointer is outside of tab area. Need to re-adjust widget bounds so that tab is behind pointer\n if (pointerPosition.x > bounds.right) {\n const offset = pointerPosition.x - bounds.right + 20;\n bounds = bounds.offsetX(offset);\n }\n\n // Adjust bounds to be relative to 9z origin\n bounds = bounds.offset({ x: -nzBounds.left, y: -nzBounds.top });\n\n dispatch({\n type: \"FLOATING_WIDGET_SET_BOUNDS\",\n id,\n bounds: bounds.toProps(),\n });\n dispatch({\n type: \"FLOATING_WIDGET_SET_USER_SIZED\",\n id,\n userSized: true,\n });\n updatePosition.current = false;\n }, [dragged, dragManager, dispatch, id, measureNz, maximizedWidget]);\n const handleResize = React.useCallback(() => {\n if (!ref.current) return;\n if (dragged) return;\n if (maximizedWidget) return;\n if (userSized) return;\n\n let bounds = Rectangle.create(ref.current.getBoundingClientRect());\n\n // Adjust bounds to be relative to 9z origin\n const nzBounds = measureNz();\n bounds = bounds.offset({ x: -nzBounds.left, y: -nzBounds.top });\n\n dispatch({\n type: \"FLOATING_WIDGET_SET_BOUNDS\",\n id,\n bounds,\n });\n }, [dispatch, dragged, id, userSized, measureNz, maximizedWidget]);\n const roRef = useResizeObserver(handleResize);\n const refs = useRefs(ref, roRef);\n return refs;\n}\n\ninterface FloatingWidgetHandleProps {\n handle: FloatingWidgetResizeHandle;\n}\n\nfunction FloatingWidgetHandle(props: FloatingWidgetHandleProps) {\n const dispatch = React.useContext(NineZoneDispatchContext);\n const id = useFloatingWidgetId();\n const { handle } = props;\n const relativePosition = React.useRef<Point>(new Point());\n assert(id !== undefined);\n const onDrag = React.useCallback<\n NonNullable<UseDragResizeHandleArgs[\"onDrag\"]>\n >(\n (pointerPosition) => {\n assert(!!ref.current);\n const bounds = Rectangle.create(ref.current.getBoundingClientRect());\n const newRelativePosition = bounds.topLeft().getOffsetTo(pointerPosition);\n const offset = relativePosition.current.getOffsetTo(newRelativePosition);\n const resizeBy = getResizeBy(handle, offset);\n dispatch({\n type: \"FLOATING_WIDGET_RESIZE\",\n id,\n resizeBy,\n });\n },\n [dispatch, handle, id]\n );\n const handleDragStart = useDragResizeHandle({\n handle,\n widgetId: id,\n onDrag,\n });\n const handlePointerDown = React.useCallback(\n (args: PointerCaptorArgs) => {\n assert(!!ref.current);\n const bounds = Rectangle.create(ref.current.getBoundingClientRect());\n const initialPointerPosition = new Point(args.clientX, args.clientY);\n relativePosition.current = bounds\n .topLeft()\n .getOffsetTo(initialPointerPosition);\n handleDragStart({\n initialPointerPosition,\n pointerPosition: initialPointerPosition,\n });\n dispatch({\n type: \"FLOATING_WIDGET_BRING_TO_FRONT\",\n id,\n });\n },\n [dispatch, handleDragStart, id]\n );\n const pointerCaptorRef = usePointerCaptor(handlePointerDown);\n const ref = React.useRef<HTMLDivElement>(null);\n const refs = useRefs(ref, pointerCaptorRef);\n const isMaximized = useIsMaximizedWidget();\n const className = classnames(\n \"nz-widget-floatingWidget_handle\",\n `nz-${handle}`\n );\n if (isMaximized) return null;\n return <div className={className} ref={refs} />;\n}\n\n/** @internal */\nexport function getResizeBy(handle: FloatingWidgetResizeHandle, offset: XAndY) {\n switch (handle) {\n case \"left\":\n return new Rectangle(-offset.x);\n case \"top\":\n return new Rectangle(0, -offset.y);\n case \"right\":\n return new Rectangle(0, 0, offset.x);\n case \"bottom\":\n return new Rectangle(0, 0, 0, offset.y);\n case \"topLeft\":\n return new Rectangle(-offset.x, -offset.y);\n case \"topRight\":\n return new Rectangle(0, -offset.y, offset.x);\n case \"bottomLeft\":\n return new Rectangle(-offset.x, 0, 0, offset.y);\n case \"bottomRight\":\n return new Rectangle(0, 0, offset.x, offset.y);\n }\n}\n\n/** @internal */\nexport function useFloatingWidgetId(): FloatingWidgetState[\"id\"] | undefined {\n const widgetId = React.useContext(WidgetIdContext);\n return useLayout((state) => {\n if (!widgetId) return undefined;\n const floatingWidget = state.floatingWidgets.byId[widgetId];\n if (!floatingWidget) return undefined;\n\n return widgetId;\n });\n}\n\n/** @internal */\nexport function useWidgetAllowedToDock(): boolean {\n const id = useFloatingWidgetId();\n return useLayout((state) => {\n if (id) {\n const widget = getWidgetState(state, id);\n const activeTab = state.tabs[widget.activeTabId];\n if (activeTab.allowedPanelTargets?.length === 0) {\n return false;\n }\n }\n return true;\n });\n}\n"]}
1
+ {"version":3,"file":"FloatingWidget.js","sourceRoot":"","sources":["../../../../src/appui-react/layout/widget/FloatingWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Widget\n */\n\nimport \"./FloatingWidget.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport {\n Point,\n Rectangle,\n useRefs,\n useResizeObserver,\n} from \"@itwin/core-react/internal\";\nimport type { UseDragResizeHandleArgs } from \"../base/DragManager.js\";\nimport {\n DragManagerContext,\n useDragResizeHandle,\n useIsDraggedItem,\n} from \"../base/DragManager.js\";\nimport {\n FloatingWidgetNodeContext,\n MeasureContext,\n NineZoneDispatchContext,\n UiIsVisibleContext,\n} from \"../base/NineZone.js\";\nimport type { FloatingWidgetState } from \"../state/WidgetState.js\";\nimport { WidgetContentContainer } from \"./ContentContainer.js\";\nimport { WidgetTabBar } from \"./TabBar.js\";\nimport { Widget, WidgetIdContext, WidgetProvider } from \"./Widget.js\";\nimport type { PointerCaptorArgs } from \"../base/usePointerCaptor.js\";\nimport { usePointerCaptor } from \"../base/usePointerCaptor.js\";\nimport { WidgetTarget } from \"../target/WidgetTarget.js\";\nimport { WidgetOutline } from \"../outline/WidgetOutline.js\";\nimport { useLayout } from \"../base/LayoutStore.js\";\nimport { getWidgetState } from \"../state/internal/WidgetStateHelpers.js\";\nimport type { XAndY } from \"../state/internal/NineZoneStateHelpers.js\";\nimport {\n useIsMaximizedWidget,\n useMaximizedFloatingWidget,\n} from \"../../preview/enable-maximized-widget/useMaximizedWidget.js\";\nimport { useWidgetTabActions } from \"../../preview/widget-tab-actions/useWidgetTabActions.js\";\nimport { FloatingWidget as TabActionsFloatingWidget } from \"../../preview/widget-tab-actions/Widget.js\";\nimport { useSafeContext } from \"../../hooks/useSafeContext.js\";\n\ntype FloatingWidgetEdgeHandle = \"left\" | \"right\" | \"top\" | \"bottom\";\ntype FloatingWidgetCornerHandle =\n | \"topLeft\"\n | \"topRight\"\n | \"bottomLeft\"\n | \"bottomRight\";\n\n/** @internal */\nexport type FloatingWidgetResizeHandle =\n | FloatingWidgetEdgeHandle\n | FloatingWidgetCornerHandle;\n\ninterface FloatingWidgetProviderProps {\n id: FloatingWidgetState[\"id\"];\n}\n\n/** @internal */\nexport function FloatingWidgetProvider(props: FloatingWidgetProviderProps) {\n const floatingWidget = React.useContext(FloatingWidgetNodeContext);\n const widgetTabActions = useWidgetTabActions();\n return (\n <WidgetProvider id={props.id}>\n {widgetTabActions ? <TabActionsFloatingWidget /> : floatingWidget}\n </WidgetProvider>\n );\n}\n\ninterface FloatingWidgetProps {\n onMouseEnter?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n onMouseLeave?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n}\n\n/** @internal */\nexport function FloatingWidget(props: FloatingWidgetProps) {\n const {\n ref,\n style,\n hidden,\n minimized,\n resizable,\n dragged,\n isToolSettingsTab,\n maximizedWidget,\n } = useFloatingWidget();\n\n const content = React.useMemo(\n () => (\n <WidgetContentContainer>\n <WidgetTarget />\n <WidgetOutline />\n </WidgetContentContainer>\n ),\n []\n );\n const handles = React.useMemo(\n () =>\n resizable && (\n <>\n <FloatingWidgetHandle handle=\"left\" />\n <FloatingWidgetHandle handle=\"top\" />\n <FloatingWidgetHandle handle=\"right\" />\n <FloatingWidgetHandle handle=\"bottom\" />\n <FloatingWidgetHandle handle=\"topLeft\" />\n <FloatingWidgetHandle handle=\"topRight\" />\n <FloatingWidgetHandle handle=\"bottomLeft\" />\n <FloatingWidgetHandle handle=\"bottomRight\" />\n </>\n ),\n [resizable]\n );\n return (\n <Widget\n className={classnames(\n \"nz-widget-floatingWidget\",\n dragged && \"nz-dragged\",\n isToolSettingsTab && \"nz-floating-toolSettings\",\n minimized && \"nz-minimized\",\n hidden && \"nz-hidden\",\n maximizedWidget.classNames\n )}\n style={style}\n ref={ref}\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n >\n <WidgetTabBar separator={!minimized} />\n {content}\n {handles}\n </Widget>\n );\n}\n\nfunction useIsDraggedWidget() {\n const id = useFloatingWidgetId();\n assert(!!id);\n const item = React.useMemo(\n () => ({\n id,\n type: \"widget\" as const,\n }),\n [id]\n );\n return useIsDraggedItem(item);\n}\n\nfunction useFloatingWidgetStyle() {\n const id = useSafeContext(WidgetIdContext);\n const autoSized = useLayout((state) => {\n const widget = getWidgetState(state, id);\n const floatingWidget = state.floatingWidgets.byId[id];\n const singleTab = 1 === widget.tabs.length;\n return singleTab && !floatingWidget.userSized;\n });\n const bounds = useLayout((state) => state.floatingWidgets.byId[id].bounds);\n const minimized = useLayout((state) => getWidgetState(state, id).minimized);\n const style = React.useMemo(() => {\n const boundsRect = Rectangle.create(bounds);\n const { height, width } = boundsRect.getSize();\n const position = boundsRect.topLeft();\n return {\n transform: `translate(${position.x}px, ${position.y}px)`,\n height: minimized || autoSized ? undefined : height,\n width: autoSized ? undefined : width,\n maxHeight: autoSized ? \"60%\" : undefined,\n maxWidth: autoSized ? \"60%\" : undefined,\n };\n }, [autoSized, bounds, minimized]);\n const maximizedWidget = useMaximizedFloatingWidget();\n return {\n ...style,\n ...maximizedWidget.style,\n };\n}\n\n// Re-adjust bounds so that widget is behind pointer when auto-sized.\nfunction useHandleAutoSize(dragged: boolean) {\n const dragManager = React.useContext(DragManagerContext);\n const dispatch = React.useContext(NineZoneDispatchContext);\n const measureNz = React.useContext(MeasureContext);\n const id = useFloatingWidgetId();\n assert(!!id);\n const userSized = useLayout(\n (state) => state.floatingWidgets.byId[id].userSized\n );\n const maximizedWidget = useIsMaximizedWidget();\n\n const updatePosition = React.useRef(true);\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (!updatePosition.current) return;\n if (!dragged) return;\n if (maximizedWidget) return;\n if (!dragManager.draggedItem) return;\n if (!ref.current) return;\n\n let bounds = Rectangle.create(ref.current.getBoundingClientRect());\n const nzBounds = measureNz();\n const pointerPosition = dragManager.draggedItem.info.pointerPosition;\n\n if (bounds.containsPoint(pointerPosition)) return;\n\n // Pointer is outside of tab area. Need to re-adjust widget bounds so that tab is behind pointer\n if (pointerPosition.x > bounds.right) {\n const offset = pointerPosition.x - bounds.right + 20;\n bounds = bounds.offsetX(offset);\n }\n\n // Adjust bounds to be relative to 9z origin\n bounds = bounds.offset({ x: -nzBounds.left, y: -nzBounds.top });\n\n dispatch({\n type: \"FLOATING_WIDGET_SET_BOUNDS\",\n id,\n bounds: bounds.toProps(),\n });\n dispatch({\n type: \"FLOATING_WIDGET_SET_USER_SIZED\",\n id,\n userSized: true,\n });\n updatePosition.current = false;\n }, [dragged, dragManager, dispatch, id, measureNz, maximizedWidget]);\n const handleResize = React.useCallback(() => {\n if (!ref.current) return;\n if (dragged) return;\n if (maximizedWidget) return;\n if (userSized) return;\n\n let bounds = Rectangle.create(ref.current.getBoundingClientRect());\n\n // Adjust bounds to be relative to 9z origin\n const nzBounds = measureNz();\n bounds = bounds.offset({ x: -nzBounds.left, y: -nzBounds.top });\n\n dispatch({\n type: \"FLOATING_WIDGET_SET_BOUNDS\",\n id,\n bounds,\n });\n }, [dispatch, dragged, id, userSized, measureNz, maximizedWidget]);\n const roRef = useResizeObserver(handleResize);\n const refs = useRefs(ref, roRef);\n return refs;\n}\n\ninterface FloatingWidgetHandleProps\n extends React.HTMLAttributes<HTMLDivElement> {\n handle: FloatingWidgetResizeHandle;\n}\n\n/** @internal */\nexport function FloatingWidgetHandle(props: FloatingWidgetHandleProps) {\n const dispatch = React.useContext(NineZoneDispatchContext);\n const id = useFloatingWidgetId();\n const { handle } = props;\n const relativePosition = React.useRef<Point>(new Point());\n assert(id !== undefined);\n const onDrag = React.useCallback<\n NonNullable<UseDragResizeHandleArgs[\"onDrag\"]>\n >(\n (pointerPosition) => {\n assert(!!ref.current);\n const bounds = Rectangle.create(ref.current.getBoundingClientRect());\n const newRelativePosition = bounds.topLeft().getOffsetTo(pointerPosition);\n const offset = relativePosition.current.getOffsetTo(newRelativePosition);\n const resizeBy = getResizeBy(handle, offset);\n dispatch({\n type: \"FLOATING_WIDGET_RESIZE\",\n id,\n resizeBy,\n });\n },\n [dispatch, handle, id]\n );\n const handleDragStart = useDragResizeHandle({\n handle,\n widgetId: id,\n onDrag,\n });\n const handlePointerDown = React.useCallback(\n (args: PointerCaptorArgs) => {\n assert(!!ref.current);\n const bounds = Rectangle.create(ref.current.getBoundingClientRect());\n const initialPointerPosition = new Point(args.clientX, args.clientY);\n relativePosition.current = bounds\n .topLeft()\n .getOffsetTo(initialPointerPosition);\n handleDragStart({\n initialPointerPosition,\n pointerPosition: initialPointerPosition,\n });\n dispatch({\n type: \"FLOATING_WIDGET_BRING_TO_FRONT\",\n id,\n });\n },\n [dispatch, handleDragStart, id]\n );\n const pointerCaptorRef = usePointerCaptor(handlePointerDown);\n const ref = React.useRef<HTMLDivElement>(null);\n const refs = useRefs(ref, pointerCaptorRef);\n const isMaximized = useIsMaximizedWidget();\n if (isMaximized) return null;\n return (\n <div\n {...props}\n className={classnames(\n \"nz-widget-floatingWidget_handle\",\n `nz-${handle}`,\n props.className\n )}\n ref={refs}\n />\n );\n}\n\n/** @internal */\nexport function getResizeBy(handle: FloatingWidgetResizeHandle, offset: XAndY) {\n switch (handle) {\n case \"left\":\n return new Rectangle(-offset.x);\n case \"top\":\n return new Rectangle(0, -offset.y);\n case \"right\":\n return new Rectangle(0, 0, offset.x);\n case \"bottom\":\n return new Rectangle(0, 0, 0, offset.y);\n case \"topLeft\":\n return new Rectangle(-offset.x, -offset.y);\n case \"topRight\":\n return new Rectangle(0, -offset.y, offset.x);\n case \"bottomLeft\":\n return new Rectangle(-offset.x, 0, 0, offset.y);\n case \"bottomRight\":\n return new Rectangle(0, 0, offset.x, offset.y);\n }\n}\n\n/** @internal */\nexport function useFloatingWidgetId(): FloatingWidgetState[\"id\"] | undefined {\n const widgetId = React.useContext(WidgetIdContext);\n return useLayout((state) => {\n if (!widgetId) return undefined;\n const floatingWidget = state.floatingWidgets.byId[widgetId];\n if (!floatingWidget) return undefined;\n\n return widgetId;\n });\n}\n\n/** @internal */\nexport function useWidgetAllowedToDock(): boolean {\n const id = useFloatingWidgetId();\n return useLayout((state) => {\n if (id) {\n const widget = getWidgetState(state, id);\n const activeTab = state.tabs[widget.activeTabId];\n if (activeTab.allowedPanelTargets?.length === 0) {\n return false;\n }\n }\n return true;\n });\n}\n\nfunction useBringToFront() {\n const dispatch = React.useContext(NineZoneDispatchContext);\n const floatingWidgetId = useFloatingWidgetId();\n const ref = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n const listener = () => {\n floatingWidgetId &&\n dispatch({\n type: \"FLOATING_WIDGET_BRING_TO_FRONT\",\n id: floatingWidgetId,\n });\n };\n const element = ref.current;\n element?.addEventListener(\"click\", listener);\n return () => {\n element?.removeEventListener(\"click\", listener);\n };\n }, [dispatch, floatingWidgetId]);\n return ref;\n}\n\n/** @internal */\nexport function useFloatingWidget() {\n const id = useSafeContext(WidgetIdContext);\n const uiIsVisible = React.useContext(UiIsVisibleContext);\n const minimized = useLayout((state) => getWidgetState(state, id).minimized);\n const hideWithUiWhenFloating = useLayout((state) => {\n const widget = getWidgetState(state, id);\n const activeTab = state.tabs[widget.activeTabId];\n return activeTab.hideWithUiWhenFloating;\n });\n const isToolSettingsTab = useLayout((state) => {\n const widget = getWidgetState(state, id);\n const toolSettingsTabId = state.toolSettings?.tabId;\n return widget.tabs[0] === toolSettingsTabId;\n });\n const resizable = useLayout((state) => {\n const floatingWidget = state.floatingWidgets.byId[id];\n return !!floatingWidget.resizable && !isToolSettingsTab;\n });\n const hidden = !uiIsVisible && hideWithUiWhenFloating;\n\n const style = useFloatingWidgetStyle();\n const dragged = useIsDraggedWidget();\n const maximizedWidget = useMaximizedFloatingWidget();\n const autoSizeRef = useHandleAutoSize(dragged);\n const bringToFrontRef = useBringToFront();\n const ref = useRefs(autoSizeRef, bringToFrontRef);\n return {\n ref,\n maximizedWidget,\n hidden,\n minimized,\n resizable,\n dragged,\n isToolSettingsTab,\n style,\n };\n}\n"]}
@@ -4,8 +4,7 @@
4
4
  import "./PanelWidget.scss";
5
5
  import * as React from "react";
6
6
  import type { WidgetState } from "../state/WidgetState.js";
7
- /** @internal */
8
- export interface PanelWidgetProps {
7
+ interface PanelWidgetProps {
9
8
  widgetId: WidgetState["id"];
10
9
  }
11
10
  /** @internal */
@@ -19,4 +18,5 @@ export declare function useBorders(widgetId: WidgetState["id"]): {
19
18
  "nz-border-left": boolean;
20
19
  "nz-border-right": boolean;
21
20
  };
21
+ export {};
22
22
  //# sourceMappingURL=PanelWidget.d.ts.map