Skip to content

Commit

Permalink
backstage: refactor o3-tooltip and create 2 components out of it inst…
Browse files Browse the repository at this point in the history
…ead of one

- update t sconfiguration
  • Loading branch information
akomiqaia committed Feb 21, 2024
1 parent 0b83102 commit 7029c88
Show file tree
Hide file tree
Showing 20 changed files with 287 additions and 253 deletions.
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"typescript.tsdk": "node_modules/typescript/lib"
}
17 changes: 9 additions & 8 deletions components/o3-tooltip/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@
o3-tooltip is a component usually used for annotating or highlighting bits of user interface.

- [o3-tooltip](#o3-tooltip)
- [Markup](#markup)
- [Branding](#branding)
- [JavaScript](#javascript)
- [css](#css)
- [JSX](#jsx)
- [Migration Guide](#migration-guide)
- [Contact](#contact)
- [Licence](#licence)
- [Markup](#markup)
- [JavaScript](#javascript)
- [css](#css)
- [JSX](#jsx)
- [Migration Guide](#migration-guide)
- [Contact](#contact)
- [Licence](#licence)

## Markup

We provide a custom element `<o3-tooltip>` to be used in your markup but we also provide [JSX component](#jsx) to be used in React.

`o3-tooltip` currently supports two variants, which is determined by `render-on-open` attribute on custom element. If attribute is enable the tooltip will be rendered once the DOM is loaded and will have a close button. Close button remove the tooltip from the DOM and it can re-triggered only reload.

If the attribute `render-on-open` is not present the tooltip will be rendered once the target element is hovered, focused or clicked. The tooltip will be removed from the DOM once the target element is no longer hovered, focused or clicked.
Expand Down
104 changes: 52 additions & 52 deletions components/o3-tooltip/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
font-display: swap;
}

o3-tooltip {
.o3-tooltip {
--_padding-top: var(--o3-spacing-3xs);
--_padding-right: var(--o3-spacing-2xs);
--_close-button-size: var(--o3-spacing-xs);
Expand All @@ -20,7 +20,7 @@ o3-tooltip {
z-index: 10;
}

o3-tooltip > .o3-tooltip-wrapper {
.o3-tooltip > .o3-tooltip-wrapper {
box-sizing: border-box;
width: max-content;
max-width: 250px;
Expand All @@ -47,33 +47,11 @@ o3-tooltip > .o3-tooltip-wrapper {
color: inherit;
margin-bottom: var(--o3-spacing-4xs);
}
/* CLOSE BUTTON */
.o3-tooltip-wrapper .o3-tooltip-close {
width: var(--_close-button-size);
height: var(--_close-button-size);
mask-image: var(--o3-icons-ft-icon-cross);
mask-repeat: no-repeat;
mask-size: contain;
display: inline-block;
background-color: var(--o3-color-palette-black-90);
position: absolute;
top: var(--_padding-top);
right: var(--_padding-right);
cursor: pointer;
user-select: none;
}

.o3-tooltip-wrapper .o3-tooltip-close:hover {
background-color: var(--o3-color-palette-black-30);
}

.o3-tooltip-wrapper .o3-tooltip-close:active {
background-color: var(--o3-color-palette-black-50);
}

/* ARROW STYLES */
o3-tooltip > .o3-tooltip-wrapper > [data-tooltip-arrow],
o3-tooltip > .o3-tooltip-wrapper > [data-tooltip-arrow]::before {
.o3-tooltip > .o3-tooltip-wrapper > [data-tooltip-arrow],
.o3-tooltip > .o3-tooltip-wrapper > [data-tooltip-arrow]::before {
--_arrow-size: 20px;
--_arrow-offset: calc(var(--_arrow-size) / 2);
--_negative-arrow-offset: calc(-1 * var(--_arrow-offset));
Expand All @@ -83,138 +61,160 @@ o3-tooltip > .o3-tooltip-wrapper > [data-tooltip-arrow]::before {
height: var(--_arrow-size);
background: inherit;
}
o3-tooltip > .o3-tooltip-wrapper > [data-tooltip-arrow]::before {
.o3-tooltip > .o3-tooltip-wrapper > [data-tooltip-arrow]::before {
visibility: visible;
content: '';
transform: rotate(45deg);
}

o3-tooltip [data-tooltip-arrow] {
.o3-tooltip [data-tooltip-arrow] {
visibility: hidden;
}

o3-tooltip[data-popper-placement^='top']
.o3-tooltip[data-popper-placement^='top']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
bottom: var(--_negative-arrow-offset);
}

o3-tooltip[data-popper-placement^='bottom']
.o3-tooltip[data-popper-placement^='bottom']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
top: var(--_negative-arrow-offset);
}

o3-tooltip[data-popper-placement^='left']
.o3-tooltip[data-popper-placement^='left']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
right: var(--_negative-arrow-offset);
}

o3-tooltip[data-popper-placement^='right']
.o3-tooltip[data-popper-placement^='right']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
left: var(--_negative-arrow-offset);
}

o3-tooltip[data-popper-placement='top-start']
.o3-tooltip[data-popper-placement='top-start']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
left: var(--_arrow-offset);
}

o3-tooltip[data-popper-placement='top-end']
.o3-tooltip[data-popper-placement='top-end']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
right: var(--_arrow-offset);
}

o3-tooltip[data-popper-placement='top']
.o3-tooltip[data-popper-placement='top']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
left: 50%;
transform: translateX(-50%);
}

o3-tooltip[data-popper-placement='bottom-start']
.o3-tooltip[data-popper-placement='bottom-start']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
left: var(--_arrow-offset);
}

o3-tooltip[data-popper-placement='bottom-end']
.o3-tooltip[data-popper-placement='bottom-end']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
right: var(--_arrow-offset);
}

o3-tooltip[data-popper-placement='bottom']
.o3-tooltip[data-popper-placement='bottom']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
left: 50%;
transform: translateX(-50%);
}

o3-tooltip[data-popper-placement='left-start']
.o3-tooltip[data-popper-placement='left-start']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
top: var(--_arrow-offset);
}

o3-tooltip[data-popper-placement='left-end']
.o3-tooltip[data-popper-placement='left-end']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
bottom: var(--_arrow-offset);
}

o3-tooltip[data-popper-placement='left']
.o3-tooltip[data-popper-placement='left']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
top: 50%;
transform: translateY(-50%);
}

o3-tooltip[data-popper-placement='right-start']
.o3-tooltip[data-popper-placement='right-start']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
top: var(--_arrow-offset);
}

o3-tooltip[data-popper-placement='right-end']
.o3-tooltip[data-popper-placement='right-end']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
bottom: var(--_arrow-offset);
}

o3-tooltip[data-popper-placement='right']
.o3-tooltip[data-popper-placement='right']
> .o3-tooltip-wrapper
> [data-tooltip-arrow] {
top: 50%;
transform: translateY(-50%);
}


/* CLOSE BUTTON */
.o3-tooltip-wrapper .o3-tooltip-close {
width: var(--_close-button-size);
height: var(--_close-button-size);
mask-image: var(--o3-icons-ft-icon-cross);
mask-repeat: no-repeat;
mask-size: contain;
display: inline-block;
background-color: var(--o3-color-palette-black-90);
position: absolute;
top: var(--_padding-top);
right: var(--_padding-right);
cursor: pointer;
user-select: none;
}

.o3-tooltip-wrapper .o3-tooltip-close:hover {
background-color: var(--o3-color-palette-black-30);
}

.o3-tooltip-wrapper .o3-tooltip-close:active {
background-color: var(--o3-color-palette-black-50);
}

/* ANIMATION */

o3-tooltip[render-on-open] > .o3-tooltip-wrapper {
o3-tooltip-onboarding > .o3-tooltip-wrapper {
--_first-bounce-offset: var(--o3-spacing-m); /* 32px */
--_negative-first-bounce-offset: calc(-1 * var(--_first-bounce-offset));
--_second-bounce-offset: calc(var(--_first-bounce-offset) / 2);
--_negative-second-bounce-offset: calc(-1 * var(--_second-bounce-offset));
}

o3-tooltip[data-popper-placement^='top'][render-on-open] > .o3-tooltip-wrapper {
o3-tooltip-onboarding[data-popper-placement^='top'] > .o3-tooltip-wrapper {
animation: bounce-top 0.8s ease;
}
o3-tooltip[data-popper-placement^='bottom'][render-on-open]
> .o3-tooltip-wrapper {
o3-tooltip-onboarding[data-popper-placement^='bottom'] > .o3-tooltip-wrapper {
animation: bounce-bottom 0.8s ease;
}
o3-tooltip[data-popper-placement^='left'][render-on-open]
> .o3-tooltip-wrapper {
o3-tooltip-onboarding[data-popper-placement^='left'] > .o3-tooltip-wrapper {
animation: bounce-left 0.8s ease;
}
o3-tooltip[data-popper-placement^='right'][render-on-open]
> .o3-tooltip-wrapper {
o3-tooltip-onboarding[data-popper-placement^='right'] > .o3-tooltip-wrapper {
animation: bounce-right 0.8s ease;
}

Expand Down
3 changes: 2 additions & 1 deletion components/o3-tooltip/src/ts/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
import './tooltip'
import './onboardingTooltip'
import './toggleTooltip'
37 changes: 37 additions & 0 deletions components/o3-tooltip/src/ts/onboardingTooltip.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import {ToolTip} from './tooltip';
import type {TooltipProps} from '../types';

export class OnboardingToolTip extends ToolTip implements TooltipProps {
private _closeButton!: HTMLElement;

connectedCallback() {
super.connectedCallback();
this._closeButton = this.querySelector('.o3-tooltip-close') as HTMLElement;
this._addEventListeners();
}

disconnectedCallback() {
super.disconnectedCallback();
this._removeEventListeners();
}

private _clickHandler = () => {
this.remove();
};

private _addEventListeners() {
this._closeButton.addEventListener('click', this._clickHandler);
}

private _removeEventListeners() {
this._closeButton.removeEventListener('click', this._clickHandler);
}
}

customElements.define('o3-tooltip-onboarding', OnboardingToolTip);

declare global {
interface HTMLElementTagNameMap {
'o3-tooltip-onboarding': OnboardingToolTip;
}
}
40 changes: 40 additions & 0 deletions components/o3-tooltip/src/ts/toggleTooltip.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import {ToolTip} from './tooltip';
import {TooltipProps} from '../types';

export class ToggleToolTip extends ToolTip implements TooltipProps {
connectedCallback() {
super.connectedCallback();
this._addEventListeners();
this.style.display = 'none';
}

disconnectedCallback() {
super.disconnectedCallback();
this._removeEventListeners();
}

private _clickHandler = () => {
if (this.style.display === 'none') {
this.render();
this.style.display = 'block';
return
}
this.style.display = 'none';
};

private _addEventListeners() {
this._targetNode.addEventListener('click', this._clickHandler);
}

private _removeEventListeners() {
this._targetNode.removeEventListener('click', this._clickHandler);
}
}

customElements.define('o3-tooltip-toggle', ToggleToolTip);

declare global {
interface HTMLElementTagNameMap {
'o3-tooltip-toggle': ToggleToolTip;
}
}
Loading

0 comments on commit 7029c88

Please sign in to comment.