diff --git a/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-basic-example/ocdk-surface-basic-position.ts b/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-basic-example/ocdk-surface-basic-position.ts new file mode 100644 index 0000000000..1375a65f39 --- /dev/null +++ b/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-basic-example/ocdk-surface-basic-position.ts @@ -0,0 +1,12 @@ +export const OcdkSurfaceBasicPositionList: string[] = [ + 'TOP_LEFT TOP_RIGHT', + 'TOP_RIGHT TOP_LEFT', + 'BOTTOM_LEFT BOTTOM_RIGHT', + 'BOTTOM_RIGHT BOTTOM_LEFT', + 'BOTTOM_LEFT TOP_LEFT', + 'TOP_LEFT BOTTOM_LEFT', + 'BOTTOM_RIGHT TOP_RIGHT', + 'TOP_RIGHT BOTTOM_RIGHT', + 'BOTTOM_CENTER TOP_CENTER', + 'TOP_CENTER BOTTOM_CENTER', +]; diff --git a/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-basic-example/public-api.ts b/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-basic-example/public-api.ts new file mode 100644 index 0000000000..34564980a3 --- /dev/null +++ b/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-basic-example/public-api.ts @@ -0,0 +1 @@ +export * from './ocdk-surface-basic-position'; diff --git a/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-tooltip-example/ocdk-surface-tooltip-example.tsx b/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-tooltip-example/ocdk-surface-tooltip-example.tsx index c950230ed4..2bb49df68f 100644 --- a/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-tooltip-example/ocdk-surface-tooltip-example.tsx +++ b/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-tooltip-example/ocdk-surface-tooltip-example.tsx @@ -109,6 +109,12 @@ export class OcdkSurfaceTooltipExample { case OcdkSurfaceTooltipPosition.RIGHT: this.surface.setCornerPoints({ anchor: OcdkSurfaceCorner.TOP_RIGHT, origin: OcdkSurfaceCorner.TOP_LEFT }); break; + case OcdkSurfaceTooltipPosition.BOTTOM_CENTER: + this.surface.setCornerPoints({ anchor: OcdkSurfaceCorner.BOTTOM_CENTER, origin: OcdkSurfaceCorner.TOP_CENTER }); + break; + case OcdkSurfaceTooltipPosition.TOP_CENTER: + this.surface.setCornerPoints({ anchor: OcdkSurfaceCorner.TOP_CENTER, origin: OcdkSurfaceCorner.BOTTOM_CENTER }); + break; } } diff --git a/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-tooltip-example/ocdk-surface-tooltip-position.ts b/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-tooltip-example/ocdk-surface-tooltip-position.ts index 13825b72aa..a19992097b 100644 --- a/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-tooltip-example/ocdk-surface-tooltip-position.ts +++ b/packages/libraries/cdk/dev/src/components/surface/ocdk-surface-tooltip-example/ocdk-surface-tooltip-position.ts @@ -2,7 +2,9 @@ export enum OcdkSurfaceTooltipPosition { TOP = 'TOP', BOTTOM = 'BOTTOM', LEFT = 'LEFT', - RIGHT = 'RIGHT' + RIGHT = 'RIGHT', + BOTTOM_CENTER = 'BOTTOM_CENTER', + TOP_CENTER = 'TOP_CENTER', } export type OcdkSurfaceTooltipPositionUnion = `${OcdkSurfaceTooltipPosition}`; diff --git a/packages/libraries/cdk/dev/src/components/surface/public-api.ts b/packages/libraries/cdk/dev/src/components/surface/public-api.ts index f75598d3c3..d4d93832b6 100644 --- a/packages/libraries/cdk/dev/src/components/surface/public-api.ts +++ b/packages/libraries/cdk/dev/src/components/surface/public-api.ts @@ -1,3 +1,4 @@ +export * from './ocdk-surface-basic-example/public-api'; export * from './ocdk-surface-tooltip-example/public-api'; export * from './ocdk-surface-select-example/public-api'; export * from './strategies/public-api'; diff --git a/packages/libraries/cdk/dev/src/index.html b/packages/libraries/cdk/dev/src/index.html index 7b98765c8e..8fe18ee120 100644 --- a/packages/libraries/cdk/dev/src/index.html +++ b/packages/libraries/cdk/dev/src/index.html @@ -254,7 +254,16 @@

tooltip example

+ +

centered surface tooltip example

+
+ + + + + +
diff --git a/packages/libraries/cdk/dev/src/www.ts b/packages/libraries/cdk/dev/src/www.ts index df4262ba41..cb785ba2f1 100644 --- a/packages/libraries/cdk/dev/src/www.ts +++ b/packages/libraries/cdk/dev/src/www.ts @@ -50,7 +50,6 @@ logger.log('init'); } } - (window as any).basic3Toggle = () => { // synchronize the trigger element (anchor) with the surface when both are available if (basicTrigger3 && basicSurface3) { diff --git a/packages/libraries/cdk/doc/overlay/strategies/overlay.strategy.symmetry.mdx b/packages/libraries/cdk/doc/overlay/strategies/overlay.strategy.symmetry.mdx index 83cbc56c47..655f01b26a 100644 --- a/packages/libraries/cdk/doc/overlay/strategies/overlay.strategy.symmetry.mdx +++ b/packages/libraries/cdk/doc/overlay/strategies/overlay.strategy.symmetry.mdx @@ -12,8 +12,8 @@ The main principles are: ## Symmetry position table -Positions that correspond to a `vertical` and `horizontal` positioning are defined (`green tick`). -Some are not available because of the overlapping of the `surface` container on top of the `anchor` (`red cross`). +Positions that correspond to a `vertical` and `horizontal` positioning are defined (`green tick`). The surface can be centered at the top or bottom of the trigger. +Some positions are not available because of the overlapping of the `surface` container on top of the `anchor` (`red cross`). The `orange` arrows shows the position switching when there is not enough space on the vertical `Y` axis. The `blue` arrows are here for horizontal axis. diff --git a/packages/libraries/cdk/src/components/surface/core/ocdk-surface-corner.ts b/packages/libraries/cdk/src/components/surface/core/ocdk-surface-corner.ts index 49df700357..0625f93575 100644 --- a/packages/libraries/cdk/src/components/surface/core/ocdk-surface-corner.ts +++ b/packages/libraries/cdk/src/components/surface/core/ocdk-surface-corner.ts @@ -6,10 +6,14 @@ export enum OcdkSurfaceCorner { TOP_LEFT = 0, /** 4 */ TOP_RIGHT = OcdkSurfaceCornerBit.RIGHT, + /** 2 */ + TOP_CENTER = OcdkSurfaceCornerBit.CENTER, /** 1 */ BOTTOM_LEFT = OcdkSurfaceCornerBit.BOTTOM, /** 5 */ BOTTOM_RIGHT = OcdkSurfaceCornerBit.BOTTOM | OcdkSurfaceCornerBit.RIGHT, // tslint:disable-line:no-bitwise + /** 3 */ + BOTTOM_CENTER = 3, /** 8 */ TOP_START = OcdkSurfaceCornerBit.FLIP_RTL, /** 12 */ diff --git a/packages/libraries/cdk/src/components/surface/core/ocdk-surface-normalized-corner.ts b/packages/libraries/cdk/src/components/surface/core/ocdk-surface-normalized-corner.ts index 72dc8e512e..e9849ca5db 100644 --- a/packages/libraries/cdk/src/components/surface/core/ocdk-surface-normalized-corner.ts +++ b/packages/libraries/cdk/src/components/surface/core/ocdk-surface-normalized-corner.ts @@ -5,8 +5,12 @@ export enum OcdkSurfaceNormalizedCorner { TOP_LEFT = 0, /** 4 */ TOP_RIGHT = OcdkSurfaceCornerBit.RIGHT, + /** 2 */ + TOP_CENTER = OcdkSurfaceCornerBit.CENTER, /** 1 */ BOTTOM_LEFT = OcdkSurfaceCornerBit.BOTTOM, /** 5 */ BOTTOM_RIGHT = OcdkSurfaceCornerBit.BOTTOM | OcdkSurfaceCornerBit.RIGHT, // tslint:disable-line:no-bitwise + /** 3 */ + BOTTOM_CENTER = 3, } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry-strategy.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry-strategy.ts index dba81e1088..c27da1e30a 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry-strategy.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry-strategy.ts @@ -1,6 +1,7 @@ import { OcdkSurfaceStrategyDefiner } from '../../core/system/ocdk-surface-strategy-definer'; import { OcdkSurfaceStrategyDefinerConfig } from '../../core/system/ocdk-surface-strategy-definer-config'; import { OcdkSurfaceOnePositionStrategy } from '../../core/ocdk-surface-one-position-strategy'; +import { ocdkSurfaceSymmetryBcTc } from './ocdk-surface-symmetry.bc-tc'; import { ocdkSurfaceSymmetryBlBr } from './ocdk-surface-symmetry.bl-br'; import { ocdkSurfaceSymmetryBlTl } from './ocdk-surface-symmetry.bl-tl'; import { ocdkSurfaceSymmetryBrBl } from './ocdk-surface-symmetry.br-bl'; @@ -9,6 +10,7 @@ import { ocdkSurfaceSymmetryTlBl } from './ocdk-surface-symmetry.tl-bl'; import { ocdkSurfaceSymmetryTrBr } from './ocdk-surface-symmetry.tr-br'; import { ocdkSurfaceSymmetryTlTr } from './ocdk-surface-symmetry.tl-tr'; import { ocdkSurfaceSymmetryTrTl } from './ocdk-surface-symmetry.tr-tl'; +import { ocdkSurfaceSymmetryTcBc } from './ocdk-surface-symmetry.tc-bc'; /** * global config to implement for the `symmetry` strategy @@ -32,12 +34,14 @@ export class OcdkSurfaceSymmetryStrategy implements OcdkSurfaceStrategyDefiner { + const loggerSymmetry = new OcdkLogger('ocdkSurfaceSymmetryBcTc'); + const helpers = OcdkSurfaceSymmetryStrategyHelpers; + + return { + cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.BOTTOM_CENTER, origin: OcdkSurfaceNormalizedCorner.TOP_CENTER }, + STRATEGIES: { + standard: { + inspectors: { + comfort: { + availableTop: (opt) => opt.measurements.viewportDistance.top - opt.config.anchorMargin.top - opt.config.MARGIN_TO_EDGE_COMFORT + opt.measurements.anchorSize.height, + availableBottom: (opt) => opt.measurements.viewportDistance.bottom - opt.config.anchorMargin.bottom - opt.config.MARGIN_TO_EDGE_COMFORT, + availableLeft: (opt) => opt.measurements.viewportDistance.left - opt.config.anchorMargin.left - opt.config.MARGIN_TO_EDGE_COMFORT, + availableRight: (opt) => opt.measurements.viewportDistance.right - opt.config.anchorMargin.right - opt.config.MARGIN_TO_EDGE_COMFORT + opt.measurements.anchorSize.width + } + }, + appliers: { + maxHeight: (opt) => opt.inspections.comfort.availableBottom, + maxWidth: (opt) => opt.measurements.surfaceSize.width, + verticalOffset: (opt) => opt.measurements.anchorSize.height + opt.config.anchorMargin.bottom, + verticalAlignment: 'top', + // center surface + horizontalOffset: (opt) => (opt.measurements.anchorSize.width - opt.measurements.surfaceSize.width)/2, + horizontalAlignment: 'right' + } + }, + FALLBACK: { + inspectors: { + comfort: { + availableBottom: (opt) => opt.measurements.viewportSize.height - 2 * opt.config.MARGIN_TO_EDGE_COMFORT + }, + limit: { + availableBottom: (opt) => opt.measurements.viewportSize.height - 2 * opt.config.MARGIN_TO_EDGE_LIMIT + }, + }, + appliers: { + maxHeight: (opt) => helpers.symmetryFallbackMaxHeight(opt, opt.inspections.comfort.availableBottom, opt.inspections.limit.availableBottom, true), + maxWidth: (opt) => opt.measurements.surfaceSize.width, + verticalOffset: (opt) => helpers.symmetryFallbackVerticalOffset(opt, opt.inspections.comfort.availableBottom, opt.inspections.limit.availableBottom, true), + verticalAlignment: 'top', + horizontalOffset: (opt) => (opt.measurements.anchorSize.width - opt.measurements.surfaceSize.width)/2, + horizontalAlignment: 'right' + } + }, + COMPUTE: (opt) => { + loggerSymmetry.log('[COMPUTE] position BOTTOM_CENTER TOP_CENTER'); + if (opt.measurements.surfaceSize.height > opt.inspections.comfort.availableBottom) { + // already in a switch process and this new position isn't good enough, go to the fallback of the last strategy position + if (opt.switchFrom && isOcdkSurfaceStrategyComputeResultPosition(opt.switchFrom) && opt.switchFrom.position) { + loggerSymmetry.log('[COMPUTE] already switched off but no enough space: continue with the fallback of bc-tc', opt.switchFrom); + return opt.switchFrom.position.STRATEGIES.FALLBACK; + } + // Check available space on right and left + switch (true) { + case opt.measurements.surfaceSize.width > opt.inspections.comfort.availableRight: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_RIGHT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT + } + }; + case opt.measurements.surfaceSize.width > opt.inspections.comfort.availableLeft: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_LEFT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT + } + }; + default: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_CENTER, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_CENTER + } + }; + } + } + // Check available space on right and left + switch (true) { + case opt.measurements.surfaceSize.width > opt.inspections.comfort.availableRight: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT, + origin: OcdkSurfaceNormalizedCorner.TOP_RIGHT + } + }; + case opt.measurements.surfaceSize.width > opt.inspections.comfort.availableLeft: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT, + origin: OcdkSurfaceNormalizedCorner.TOP_LEFT + } + }; + } + return; // no position switching: apply the current one + } + + } + }; +} diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.bl-br.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.bl-br.ts index 3274af5e57..e8f14e237c 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.bl-br.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.bl-br.ts @@ -37,7 +37,7 @@ export function ocdkSurfaceSymmetryBlBr(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableBottom, + maxHeight: (opt) => opt.inspections.comfort.availableTop, maxWidth: (opt) => opt.inspections.comfort.availableLeft, verticalOffset: () => 0, verticalAlignment: 'bottom', @@ -72,12 +72,27 @@ export function ocdkSurfaceSymmetryBlBr(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableTop) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_RIGHT, + origin: OcdkSurfaceNormalizedCorner.TOP_LEFT + } + }; + } return { cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT, origin: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT } }; + } else if (opt.measurements.surfaceSize.height > opt.inspections.comfort.availableTop) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_LEFT, + origin: OcdkSurfaceNormalizedCorner.TOP_RIGHT + } + }; } return; // no position switching: apply the current one } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.bl-tl.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.bl-tl.ts index 9a0f3151e5..518e3d5d63 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.bl-tl.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.bl-tl.ts @@ -121,19 +121,33 @@ export function ocdkSurfaceSymmetryBlTl(): OcdkSurfaceOnePositionStrategy { loggerSymmetry.log('[COMPUTE] position BOTTOM_LEFT TOP_LEFT'); - // no enough available space on bottom, trigger a position change to top instead if (opt.measurements.surfaceSize.height > opt.inspections.comfort.availableBottom) { // already in a switch process and this new position isn't good enough, go to the fallback of the last strategy position if (opt.switchFrom && isOcdkSurfaceStrategyComputeResultPosition(opt.switchFrom) && opt.switchFrom.position) { loggerSymmetry.log('[COMPUTE] already switched off but no enough space: continue with the fallback of bl-tl', opt.switchFrom); return opt.switchFrom.position.STRATEGIES.FALLBACK; } + if (opt.measurements.surfaceSize.width > opt.inspections.comfort.availableRight) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_RIGHT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT + } + }; + } return { cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.TOP_LEFT, origin: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT } }; + } else if (opt.measurements.surfaceSize.width > opt.inspections.comfort.availableRight) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT, + origin: OcdkSurfaceNormalizedCorner.TOP_RIGHT + } + }; } return; // no position switching: apply the current one } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.br-bl.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.br-bl.ts index 35c19468cd..d4a90a4ce7 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.br-bl.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.br-bl.ts @@ -36,7 +36,7 @@ export function ocdkSurfaceSymmetryBrBl(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableBottom, + maxHeight: (opt) => opt.inspections.comfort.availableTop, maxWidth: (opt) => opt.inspections.comfort.availableRight, verticalOffset: () => 0, verticalAlignment: 'bottom', @@ -71,12 +71,27 @@ export function ocdkSurfaceSymmetryBrBl(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableTop) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_LEFT, + origin: OcdkSurfaceNormalizedCorner.TOP_RIGHT + } + }; + } return { cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT, origin: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT } }; + } else if (opt.measurements.surfaceSize.height > opt.inspections.comfort.availableTop) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_RIGHT, + origin: OcdkSurfaceNormalizedCorner.TOP_LEFT + } + }; } return; // no position switching: apply the current one } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.br-tr.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.br-tr.ts index b53660eb5c..d219cff143 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.br-tr.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.br-tr.ts @@ -75,12 +75,27 @@ export function ocdkSurfaceSymmetryBrTr(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableLeft) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_LEFT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT + } + }; + } return { cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.TOP_RIGHT, origin: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT } }; + } else if (opt.measurements.surfaceSize.width > opt.inspections.comfort.availableLeft) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT, + origin: OcdkSurfaceNormalizedCorner.TOP_LEFT + } + }; } return; // no position switching: apply the current one } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tc-bc.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tc-bc.ts new file mode 100644 index 0000000000..7e6e1042ed --- /dev/null +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tc-bc.ts @@ -0,0 +1,122 @@ +import { OcdkSurfaceSymmetryConfig } from './ocdk-surface-symmetry-strategy'; +import { OcdkSurfaceNormalizedCorner } from '../../core/ocdk-surface-normalized-corner'; +import { OcdkLogger } from '../../../../logger/ocdk-logger'; +import { OcdkSurfaceSymmetryStrategyHelpers } from './ocdk-surface-symmetry-strategy.helpers'; +import { isOcdkSurfaceStrategyComputeResultPosition } from '../../core/system/ocdk-surface-strategy-compute-result-position'; +import { OcdkSurfaceOnePositionStrategy } from '../../core/ocdk-surface-one-position-strategy'; + +/** + * ``` + * +--surface--+ + * | | + * o-----------o + * o-----anchor-----o + * | | + * +----------------+ + * + * o = normalized corner + * x = reference for the position offset (at top/left - for verticalAlignment/horizontalAlignment) + * ``` + */ +export function ocdkSurfaceSymmetryTcBc(): OcdkSurfaceOnePositionStrategy { + const loggerSymmetry = new OcdkLogger('ocdkSurfaceSymmetryTcBc'); + const helpers = OcdkSurfaceSymmetryStrategyHelpers; + + return { + cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.TOP_CENTER, origin: OcdkSurfaceNormalizedCorner.BOTTOM_CENTER }, + STRATEGIES: { + standard: { + inspectors: { + comfort: { + availableTop: (opt) => opt.measurements.viewportDistance.top - opt.config.anchorMargin.top - opt.config.MARGIN_TO_EDGE_COMFORT, + availableBottom: (opt) => opt.measurements.viewportDistance.bottom - opt.config.anchorMargin.bottom - opt.config.MARGIN_TO_EDGE_COMFORT + opt.measurements.anchorSize.height, + availableLeft: (opt) => opt.measurements.viewportDistance.left - opt.config.anchorMargin.left - opt.config.MARGIN_TO_EDGE_COMFORT, + availableRight: (opt) => opt.measurements.viewportDistance.right - opt.config.anchorMargin.right - opt.config.MARGIN_TO_EDGE_COMFORT + opt.measurements.anchorSize.width, + } + }, + appliers: { + maxHeight: (opt) => opt.inspections.comfort.availableTop, + maxWidth: (opt) => opt.measurements.surfaceSize.width, + verticalOffset: (opt) => -opt.config.anchorMargin.top - opt.measurements.surfaceSize.height, + verticalAlignment: 'top', + // center surface + horizontalOffset: (opt) => (opt.measurements.anchorSize.width - opt.measurements.surfaceSize.width) / 2, + horizontalAlignment: 'right' + } + }, + FALLBACK: { + inspectors: { + comfort: { + availableTop: (opt) => opt.measurements.viewportSize.height - 2 * opt.config.MARGIN_TO_EDGE_COMFORT + }, + limit: { + availableTop: (opt) => opt.measurements.viewportSize.height - 2 * opt.config.MARGIN_TO_EDGE_LIMIT + } + }, + appliers: { + maxHeight: (opt) => helpers.symmetryFallbackMaxHeight(opt, opt.inspections.comfort.availableTop, opt.inspections.limit.availableTop, false), + maxWidth: (opt) => opt.measurements.surfaceSize.width, + verticalOffset: (opt) => helpers.symmetryFallbackVerticalOffset(opt, opt.inspections.comfort.availableTop, opt.inspections.limit.availableTop, false), + verticalAlignment: 'top', + horizontalOffset: (opt) => (opt.measurements.anchorSize.width - opt.measurements.surfaceSize.width) / 2, + horizontalAlignment: 'right' + } + }, + COMPUTE: (opt) => { + loggerSymmetry.log('[COMPUTE] position TOP_CENTER BOTTOM_CENTER'); + // no enough available space on top, trigger a position change to bottom instead + if (opt.measurements.surfaceSize.height > opt.inspections.comfort.availableTop) { + // already in a switch process and this new position isn't good enough, go to the fallback of the last strategy position + if (opt.switchFrom && isOcdkSurfaceStrategyComputeResultPosition(opt.switchFrom) && opt.switchFrom.position) { + loggerSymmetry.log('[COMPUTE] already switched off but no enough space: continue with the fallback of tc-bc', opt.switchFrom); + return opt.switchFrom.position.STRATEGIES.FALLBACK; + } + // Check available space on right and left + switch (true) { + case opt.measurements.surfaceSize.width > opt.inspections.comfort.availableRight: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT, + origin: OcdkSurfaceNormalizedCorner.TOP_RIGHT + } + }; + case opt.measurements.surfaceSize.width > opt.inspections.comfort.availableLeft: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT, + origin: OcdkSurfaceNormalizedCorner.TOP_LEFT + } + }; + default: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_CENTER, + origin: OcdkSurfaceNormalizedCorner.TOP_CENTER + } + }; + } + } + + // Check available space on right and left + switch (true) { + case opt.measurements.surfaceSize.width > opt.inspections.comfort.availableRight: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_RIGHT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT + } + }; + case opt.measurements.surfaceSize.width > opt.inspections.comfort.availableLeft: + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_LEFT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT + } + }; + } + return; // no position switching: apply the current one + } + + } + }; +} diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tl-bl.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tl-bl.ts index 073b0d8098..64379e4fe0 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tl-bl.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tl-bl.ts @@ -70,12 +70,27 @@ export function ocdkSurfaceSymmetryTlBl(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableRight) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT, + origin: OcdkSurfaceNormalizedCorner.TOP_RIGHT + } + }; + } return { cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT, origin: OcdkSurfaceNormalizedCorner.TOP_LEFT } }; + } else if (opt.measurements.surfaceSize.width > opt.inspections.comfort.availableRight) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_RIGHT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT + } + }; } return; // no position switching: apply the current one } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tl-tr.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tl-tr.ts index 7871549136..85ffc666da 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tl-tr.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tl-tr.ts @@ -70,12 +70,27 @@ export function ocdkSurfaceSymmetryTlTr(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableBottom) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT + } + }; + } return { cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.TOP_RIGHT, origin: OcdkSurfaceNormalizedCorner.TOP_LEFT } }; + } else if (opt.measurements.surfaceSize.height > opt.inspections.comfort.availableBottom) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT + } + }; } return; // no position switching: apply the current one } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tr-br.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tr-br.ts index e8ce4f900c..9c0c2e227d 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tr-br.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tr-br.ts @@ -73,12 +73,27 @@ export function ocdkSurfaceSymmetryTrBr(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableLeft) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT, + origin: OcdkSurfaceNormalizedCorner.TOP_LEFT + } + }; + } return { cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT, origin: OcdkSurfaceNormalizedCorner.TOP_RIGHT } }; + } else if (opt.measurements.surfaceSize.width > opt.inspections.comfort.availableLeft) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.TOP_LEFT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT + } + }; } return; // no position switching: apply the current one } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tr-tl.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tr-tl.ts index 7565738954..d0194183f6 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tr-tl.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/ocdk-surface-symmetry.tr-tl.ts @@ -70,12 +70,27 @@ export function ocdkSurfaceSymmetryTrTl(): OcdkSurfaceOnePositionStrategy opt.inspections.comfort.availableBottom) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT + } + }; + } return { cornerPoints: { anchor: OcdkSurfaceNormalizedCorner.TOP_LEFT, origin: OcdkSurfaceNormalizedCorner.TOP_RIGHT } }; + } else if (opt.measurements.surfaceSize.height > opt.inspections.comfort.availableBottom) { + return { + cornerPoints: { + anchor: OcdkSurfaceNormalizedCorner.BOTTOM_RIGHT, + origin: OcdkSurfaceNormalizedCorner.BOTTOM_LEFT + } + }; } return; // no position switching: apply the current one } diff --git a/packages/libraries/cdk/src/components/surface/strategies/symmetry/public-api.ts b/packages/libraries/cdk/src/components/surface/strategies/symmetry/public-api.ts index e429dc99e4..2e475d99a7 100644 --- a/packages/libraries/cdk/src/components/surface/strategies/symmetry/public-api.ts +++ b/packages/libraries/cdk/src/components/surface/strategies/symmetry/public-api.ts @@ -1,7 +1,9 @@ +export * from './ocdk-surface-symmetry.bc-tc'; export * from './ocdk-surface-symmetry.bl-br'; export * from './ocdk-surface-symmetry.bl-tl'; export * from './ocdk-surface-symmetry.br-bl'; export * from './ocdk-surface-symmetry.br-tr'; +export * from './ocdk-surface-symmetry.tc-bc'; export * from './ocdk-surface-symmetry.tl-bl'; export * from './ocdk-surface-symmetry.tr-br'; export * from './ocdk-surface-symmetry.tl-tr'; diff --git a/packages/tools/storybook/stories/cdk/overlay/examples/basic/overlay.basic.stories.tsx b/packages/tools/storybook/stories/cdk/overlay/examples/basic/overlay.basic.stories.tsx index f07a9a16ac..0043a6da53 100644 --- a/packages/tools/storybook/stories/cdk/overlay/examples/basic/overlay.basic.stories.tsx +++ b/packages/tools/storybook/stories/cdk/overlay/examples/basic/overlay.basic.stories.tsx @@ -5,8 +5,8 @@ import page from './overlay.basic.stories.page.mdx'; import { play } from './overlay.basic.stories.play'; import { OcdkSurfaceCorner, - OcdkSurfaceCornerPointNameList, } from '@ovhcloud/ods-cdk/src'; +import { OcdkSurfaceBasicPositionList } from '@ovhcloud/ods-cdk-dev/src'; import { olesIpsum, OlesIpsumGeneration } from '@ovhcloud/ods-core/src'; import { styleMap } from 'lit-html/directives/style-map'; @@ -24,10 +24,10 @@ const storyParams = { corners: { category: 'General', description: 'choose the anchor and surface position reference', - defaultValue: 'BOTTOM_START TOP_START', - options: OcdkSurfaceCornerPointNameList, + defaultValue: 'BOTTOM_LEFT TOP_LEFT', + options: OcdkSurfaceBasicPositionList, control: { type: 'select' }, - table: { defaultValue: { summary: 'BOTTOM_START TOP_START' } } + table: { defaultValue: { summary: 'BOTTOM_LEFT TOP_LEFT' } } }, animated: { category: 'General', @@ -96,7 +96,7 @@ export default { /* Default */ const Template = (args: any) => { - let corners = [OcdkSurfaceCorner.BOTTOM_START, OcdkSurfaceCorner.TOP_START]; + let corners = [OcdkSurfaceCorner.BOTTOM_LEFT, OcdkSurfaceCorner.TOP_LEFT]; if(args.corners) { const cornersFromArgs = args.corners.split(' '); if(cornersFromArgs && cornersFromArgs[0] && cornersFromArgs[1]) { @@ -142,7 +142,7 @@ const Template = (args: any) => {

${args.applyContent ? olesIpsum(OlesIpsumGeneration.paragraphs, 2) : ''}

my trigger
- My surface + My surface Content

${args.applyContent ? olesIpsum(OlesIpsumGeneration.paragraphs, 2) : ''}