@aquera/nile-elements 0.1.34 → 0.1.35-beta-1.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.
- package/README.md +22 -8
- package/demo/index.css +7 -4
- package/demo/index.html +20 -36
- package/dist/{fixture-161dee0b.cjs.js → fixture-d5b55278.cjs.js} +3 -3
- package/dist/fixture-d5b55278.cjs.js.map +1 -0
- package/dist/{fixture-372df3b0.esm.js → fixture-df8b52d7.esm.js} +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/internal/animate.cjs.js +1 -1
- package/dist/internal/animate.cjs.js.map +1 -1
- package/dist/internal/animate.esm.js +1 -1
- package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
- package/dist/nile-accordion/nile-accordian.test.esm.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
- package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.test.esm.js +1 -1
- package/dist/nile-button/nile-button.test.cjs.js +1 -1
- package/dist/nile-button/nile-button.test.esm.js +1 -1
- package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
- package/dist/nile-button-toggle-group/nile-button-toggle-group.test.esm.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
- package/dist/nile-card/nile-card.test.cjs.js +1 -1
- package/dist/nile-card/nile-card.test.esm.js +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.esm.js +1 -1
- package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.test.esm.js +1 -1
- package/dist/nile-code-editor/extensionSetup.cjs.js +1 -1
- package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
- package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
- package/dist/nile-code-editor/nile-code-editor.cjs.js +1 -1
- package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
- package/dist/nile-code-editor/nile-code-editor.esm.js +2 -2
- package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
- package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
- package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
- package/dist/nile-empty-state/nile-empty-state.test.esm.js +1 -1
- package/dist/nile-error-message/nile-error-message.cjs.js +1 -1
- package/dist/nile-error-message/nile-error-message.cjs.js.map +1 -1
- package/dist/nile-error-message/nile-error-message.css.cjs.js +1 -1
- package/dist/nile-error-message/nile-error-message.css.cjs.js.map +1 -1
- package/dist/nile-error-message/nile-error-message.css.esm.js +6 -4
- package/dist/nile-error-message/nile-error-message.esm.js +4 -4
- package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
- package/dist/nile-error-message/nile-error-message.test.esm.js +1 -1
- package/dist/nile-error-notification/nile-error-notification.css.cjs.js +1 -1
- package/dist/nile-error-notification/nile-error-notification.css.cjs.js.map +1 -1
- package/dist/nile-error-notification/nile-error-notification.css.esm.js +1 -1
- package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
- package/dist/nile-form-group/nile-form-group.test.esm.js +1 -1
- package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
- package/dist/nile-form-help-text/nile-form-help-text.test.esm.js +1 -1
- package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.test.esm.js +1 -1
- package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
- package/dist/nile-icon/nile-icon.test.esm.js +1 -1
- package/dist/nile-input/nile-input.test.cjs.js +1 -1
- package/dist/nile-input/nile-input.test.esm.js +1 -1
- package/dist/nile-link/nile-link.test.cjs.js +1 -1
- package/dist/nile-link/nile-link.test.esm.js +1 -1
- package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
- package/dist/nile-loader/nile-loader.test.esm.js +1 -1
- package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
- package/dist/nile-popover/nile-popover.test.esm.js +1 -1
- package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
- package/dist/nile-popup/nile-popup.test.esm.js +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.css.cjs.js +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.css.cjs.js.map +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.css.esm.js +1 -0
- package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.test.esm.js +1 -1
- package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
- package/dist/nile-radio/nile-radio.test.esm.js +1 -1
- package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
- package/dist/nile-radio-group/nile-radio-group.test.esm.js +1 -1
- package/dist/nile-select/nile-select.test.cjs.js +1 -1
- package/dist/nile-select/nile-select.test.esm.js +1 -1
- package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
- package/dist/nile-slide-toggle/nile-slide-toggle.test.esm.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
- package/dist/nile-table/nile-table.cjs.js.map +1 -1
- package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
- package/dist/nile-textarea/nile-textarea.test.esm.js +1 -1
- package/dist/nile-tooltip/index.cjs.js +1 -1
- package/dist/nile-tooltip/index.esm.js +1 -1
- package/dist/nile-tooltip/nile-tooltip-utils.cjs.js +2 -0
- package/dist/nile-tooltip/nile-tooltip-utils.cjs.js.map +1 -0
- package/dist/nile-tooltip/nile-tooltip-utils.esm.js +1 -0
- package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
- package/dist/nile-tooltip/nile-tooltip.cjs.js.map +1 -1
- package/dist/nile-tooltip/nile-tooltip.css.cjs.js +1 -1
- package/dist/nile-tooltip/nile-tooltip.css.cjs.js.map +1 -1
- package/dist/nile-tooltip/nile-tooltip.css.esm.js +78 -45
- package/dist/nile-tooltip/nile-tooltip.esm.js +23 -28
- package/dist/nile-tooltip/nile-tooltip.test.cjs.js +2 -0
- package/dist/nile-tooltip/nile-tooltip.test.cjs.js.map +1 -0
- package/dist/nile-tooltip/nile-tooltip.test.esm.js +47 -0
- package/dist/src/nile-code-editor/extensionSetup.d.ts +2 -1
- package/dist/src/nile-code-editor/extensionSetup.js +8 -0
- package/dist/src/nile-code-editor/extensionSetup.js.map +1 -1
- package/dist/src/nile-code-editor/nile-code-editor.d.ts +2 -0
- package/dist/src/nile-code-editor/nile-code-editor.js +12 -3
- package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
- package/dist/src/nile-error-message/nile-error-message.css.js +6 -4
- package/dist/src/nile-error-message/nile-error-message.css.js.map +1 -1
- package/dist/src/nile-error-message/nile-error-message.d.ts +4 -0
- package/dist/src/nile-error-message/nile-error-message.js +20 -0
- package/dist/src/nile-error-message/nile-error-message.js.map +1 -1
- package/dist/src/nile-error-notification/nile-error-notification.css.js +1 -1
- package/dist/src/nile-error-notification/nile-error-notification.css.js.map +1 -1
- package/dist/src/nile-progress-bar/nile-progress-bar.css.js +1 -0
- package/dist/src/nile-progress-bar/nile-progress-bar.css.js.map +1 -1
- package/dist/src/nile-table/nile-table.js.map +1 -1
- package/dist/src/nile-tooltip/nile-tooltip-utils.d.ts +18 -0
- package/dist/src/nile-tooltip/nile-tooltip-utils.js +216 -0
- package/dist/src/nile-tooltip/nile-tooltip-utils.js.map +1 -0
- package/dist/src/nile-tooltip/nile-tooltip.css.js +76 -43
- package/dist/src/nile-tooltip/nile-tooltip.css.js.map +1 -1
- package/dist/src/nile-tooltip/nile-tooltip.d.ts +24 -46
- package/dist/src/nile-tooltip/nile-tooltip.js +235 -232
- package/dist/src/nile-tooltip/nile-tooltip.js.map +1 -1
- package/dist/src/nile-tooltip/nile-tooltip.test.d.ts +1 -0
- package/dist/src/nile-tooltip/nile-tooltip.test.js +148 -0
- package/dist/src/nile-tooltip/nile-tooltip.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-code-editor/extensionSetup.ts +13 -1
- package/src/nile-code-editor/nile-code-editor.ts +9 -4
- package/src/nile-error-message/nile-error-message.css.ts +6 -4
- package/src/nile-error-message/nile-error-message.ts +18 -0
- package/src/nile-error-notification/nile-error-notification.css.ts +1 -1
- package/src/nile-progress-bar/nile-progress-bar.css.ts +1 -0
- package/src/nile-table/nile-table.ts +2 -2
- package/src/nile-tooltip/nile-tooltip-utils.ts +271 -0
- package/src/nile-tooltip/nile-tooltip.css.ts +77 -44
- package/src/nile-tooltip/nile-tooltip.test.ts +168 -0
- package/src/nile-tooltip/nile-tooltip.ts +268 -230
- package/vscode-html-custom-data.json +103 -93
- package/dist/fixture-161dee0b.cjs.js.map +0 -1
package/package.json
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
"description": "Webcomponent nile-elements following open-wc recommendations",
|
4
4
|
"license": "MIT",
|
5
5
|
"author": "nile-elements",
|
6
|
-
"version": "0.1.
|
6
|
+
"version": "0.1.35-beta-1.0",
|
7
7
|
"main": "dist/src/index.js",
|
8
8
|
"type": "module",
|
9
9
|
"module": "dist/src/index.js",
|
@@ -56,7 +56,8 @@ export interface BasicSetupOptions extends MinimalSetupOptions {
|
|
56
56
|
completionKeymap?: boolean;
|
57
57
|
lintKeymap?: boolean;
|
58
58
|
tabSize?: number;
|
59
|
-
readonly?:
|
59
|
+
readonly?: boolean;
|
60
|
+
enableSearch?: boolean;
|
60
61
|
}
|
61
62
|
|
62
63
|
export const isValidSetup = (item: any) => {
|
@@ -88,6 +89,17 @@ export const basicSetup = (options: BasicSetupOptions = {}): Extension[] => {
|
|
88
89
|
isValidSetup(options.crosshairCursor) && extensions.push(crosshairCursor());
|
89
90
|
isValidSetup(options.highlightActiveLine) && extensions.push(highlightActiveLine());
|
90
91
|
isValidSetup(options.highlightSelectionMatches) && extensions.push(highlightSelectionMatches());
|
92
|
+
|
93
|
+
if(!options.enableSearch){
|
94
|
+
extensions.push(
|
95
|
+
keymap.of([{
|
96
|
+
key: "Mod-f", // Ctrl+F (Cmd+F on Mac)
|
97
|
+
run: () => {
|
98
|
+
return true;
|
99
|
+
}
|
100
|
+
}]))
|
101
|
+
}
|
102
|
+
|
91
103
|
if (options.tabSize && typeof options.tabSize === 'number')
|
92
104
|
extensions.push(indentUnit.of(' '.repeat(options.tabSize)));
|
93
105
|
return extensions.concat([keymap.of(keymaps.flat())]).filter(Boolean);
|
@@ -68,9 +68,11 @@ export class NileCodeEditor extends NileElement {
|
|
68
68
|
|
69
69
|
@property({ type: String, reflect: true , attribute: 'error-message' }) errorMessage: string = '';
|
70
70
|
|
71
|
-
@property({ type: Boolean, reflect: true , attribute:
|
71
|
+
@property({ type: Boolean, reflect: true , attribute: true }) error: boolean = false;
|
72
72
|
|
73
|
-
@property({ type: Boolean, reflect: true , attribute:
|
73
|
+
@property({ type: Boolean, reflect: true , attribute: true }) enableSearch: boolean = false;
|
74
|
+
|
75
|
+
@property({ type: Boolean, reflect: true , attribute: true }) noborder: boolean = false;
|
74
76
|
|
75
77
|
@property({ type: Boolean, reflect: true , attribute: true }) multiline: boolean = false;
|
76
78
|
|
@@ -96,6 +98,8 @@ export class NileCodeEditor extends NileElement {
|
|
96
98
|
|
97
99
|
@property({ type: Number, reflect: true , attribute: true}) debounceTimeout: number = 200;
|
98
100
|
|
101
|
+
@property({ type: Boolean, reflect: true , attribute: true}) aboveCursor: boolean = false;
|
102
|
+
|
99
103
|
public view: EditorView;
|
100
104
|
public viewState:EditorState;
|
101
105
|
private timeOut: any = null;
|
@@ -262,6 +266,7 @@ export class NileCodeEditor extends NileElement {
|
|
262
266
|
basicSetup({
|
263
267
|
highlightActiveLine: false,
|
264
268
|
foldGutter: this.enableFoldGutters,
|
269
|
+
enableSearch:this.enableSearch
|
265
270
|
}),
|
266
271
|
lineNumbersExtension,
|
267
272
|
readOnlyExtension,
|
@@ -269,7 +274,7 @@ export class NileCodeEditor extends NileElement {
|
|
269
274
|
customAutoCompletions,
|
270
275
|
placeholderExtension,
|
271
276
|
defaultSyntaxHighlightingExtension,
|
272
|
-
autocompletion(),
|
277
|
+
autocompletion({aboveCursor: this.aboveCursor}),
|
273
278
|
language,
|
274
279
|
customThemeExtension,
|
275
280
|
EditorView.updateListener.of((v: ViewUpdate) => {
|
@@ -565,4 +570,4 @@ function convertToSingleLine(code: string) {
|
|
565
570
|
if (!code) return '';
|
566
571
|
// Remove line breaks and unnecessary whitespace
|
567
572
|
return code.replace(/\s+/g, ' ').trim();
|
568
|
-
}
|
573
|
+
}
|
@@ -16,11 +16,11 @@ export const styles = css`
|
|
16
16
|
|
17
17
|
.nile-error-message {
|
18
18
|
width: 100%;
|
19
|
-
word-break: break-all;
|
20
19
|
font-size: var(--nile-font-size-small);
|
21
20
|
letter-spacing: 0.2px;
|
22
21
|
font-weight: var(--nile-font-weight-regular);
|
23
22
|
line-height: var(--nile-font-size-small);
|
23
|
+
max-width: var(--nile-error-max-width, 535px);
|
24
24
|
}
|
25
25
|
|
26
26
|
.nile-error-message__error {
|
@@ -32,6 +32,8 @@ export const styles = css`
|
|
32
32
|
color: var(--nile-colors-dark-500);
|
33
33
|
margin-top:6px;
|
34
34
|
line-height: 16px;
|
35
|
+
max-height: var(--nile-error-max-height, 48px);
|
36
|
+
overflow-x: auto;
|
35
37
|
}
|
36
38
|
|
37
39
|
.nile-error-message__icon {
|
@@ -54,7 +56,7 @@ export const styles = css`
|
|
54
56
|
border: 1px solid var(--nile-colors-red-500);
|
55
57
|
border-left: 6px solid var(--nile-colors-red-500);
|
56
58
|
border-radius: 4px;
|
57
|
-
margin-top:
|
59
|
+
margin-top: 8px;
|
58
60
|
padding: 12px;
|
59
61
|
background: var(--nile-colors-neutral-100);
|
60
62
|
}
|
@@ -81,10 +83,10 @@ export const styles = css`
|
|
81
83
|
}
|
82
84
|
|
83
85
|
.nile-error-message__response-expanded.expanded {
|
84
|
-
max-height:
|
86
|
+
max-height: var(--nile-error-max-dialog-height, 48px);
|
85
87
|
transition: max-height 0.3s ease-in-out;
|
86
88
|
visibility: visible;
|
87
|
-
padding:
|
89
|
+
padding: 8px;
|
88
90
|
}
|
89
91
|
`;
|
90
92
|
|
@@ -32,6 +32,12 @@ export class NileErrorMessage extends LitElement {
|
|
32
32
|
@property({ type: Boolean })
|
33
33
|
isExpanded: boolean = false;
|
34
34
|
|
35
|
+
@property({ type: String }) maxWidth: string;
|
36
|
+
|
37
|
+
@property({ type: String }) maxHeight: string;
|
38
|
+
|
39
|
+
@property({ type: String }) maxDialogHeight: string;
|
40
|
+
|
35
41
|
// The maximum length before truncation.
|
36
42
|
private readonly MAX_LENGTH: number = 100;
|
37
43
|
|
@@ -46,6 +52,18 @@ export class NileErrorMessage extends LitElement {
|
|
46
52
|
return this.errorResponse;
|
47
53
|
}
|
48
54
|
|
55
|
+
updated(changedProperties: Map<string, any>) {
|
56
|
+
if (changedProperties.has('maxWidth')) {
|
57
|
+
this.style.setProperty('--nile-error-max-width', this.maxWidth);
|
58
|
+
}
|
59
|
+
if (changedProperties.has('maxHeight')) {
|
60
|
+
this.style.setProperty('--nile-error-max-height', this.maxHeight);
|
61
|
+
}
|
62
|
+
if (changedProperties.has('maxDialogHeight')) {
|
63
|
+
this.style.setProperty('--nile-error-max-dialog-height', this.maxDialogHeight);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
49
67
|
/**
|
50
68
|
* Toggle the expanded state of the error response.
|
51
69
|
*/
|
@@ -74,7 +74,7 @@ export class NileTable extends NileElement {
|
|
74
74
|
handleBodyCssUpdate(){
|
75
75
|
if (this.rows.length<2) return;
|
76
76
|
const tableBodies = this.rows;
|
77
|
-
const firstEl=tableBodies[0].shadowRoot?.querySelector<HTMLDivElement>('div.base')
|
77
|
+
const firstEl=tableBodies[0].shadowRoot?.querySelector<HTMLDivElement>('div.base');
|
78
78
|
if(firstEl) {
|
79
79
|
firstEl.style.borderTopRightRadius="var(--nile-radius-radius-xl)";
|
80
80
|
firstEl.style.borderTopLeftRadius = 'var(--nile-radius-radius-xl)';
|
@@ -84,7 +84,7 @@ export class NileTable extends NileElement {
|
|
84
84
|
}
|
85
85
|
tableBodies.forEach((tb,i)=>{
|
86
86
|
if(i>0 && i<tableBodies.length-1){
|
87
|
-
const el=tb.shadowRoot?.querySelector<HTMLDivElement>('div.base')
|
87
|
+
const el=tb.shadowRoot?.querySelector<HTMLDivElement>('div.base');
|
88
88
|
if(el) {
|
89
89
|
el.style.borderTopRightRadius="0px";
|
90
90
|
el.style.borderTopLeftRadius = "0px";
|
@@ -0,0 +1,271 @@
|
|
1
|
+
export function isInViewport(element: HTMLElement): boolean {
|
2
|
+
const rect = element.getBoundingClientRect();
|
3
|
+
return (
|
4
|
+
rect.top >= 0 &&
|
5
|
+
rect.left >= 0 &&
|
6
|
+
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
|
7
|
+
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
|
8
|
+
);
|
9
|
+
}
|
10
|
+
|
11
|
+
|
12
|
+
export function getValidTooltipPosition(
|
13
|
+
triggerRect: DOMRect,
|
14
|
+
tooltipRect: DOMRect,
|
15
|
+
originalPlacement: string,
|
16
|
+
distance: number,
|
17
|
+
skidding: number,
|
18
|
+
caretSize: number,
|
19
|
+
viewportWidth: number,
|
20
|
+
viewportHeight: number
|
21
|
+
): { top: number; left: number; placement: string } {
|
22
|
+
const triggerCenterX = triggerRect.left + triggerRect.width / 2;
|
23
|
+
|
24
|
+
const getCandidatePosition = (placement: string) => {
|
25
|
+
let top = 0;
|
26
|
+
let left = 0;
|
27
|
+
|
28
|
+
switch (placement) {
|
29
|
+
case 'top':
|
30
|
+
top = triggerRect.top - tooltipRect.height - distance;
|
31
|
+
left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2 + skidding;
|
32
|
+
break;
|
33
|
+
case 'top-start': {
|
34
|
+
top = triggerRect.top - tooltipRect.height - distance;
|
35
|
+
const centeredLeft = triggerRect.left + (triggerRect.width / 2) - (tooltipRect.width / 2) + skidding;
|
36
|
+
left = Math.max(triggerRect.left + skidding, centeredLeft);
|
37
|
+
break;
|
38
|
+
}
|
39
|
+
case 'top-end': {
|
40
|
+
top = triggerRect.top - tooltipRect.height - distance;
|
41
|
+
const centeredLeft = triggerRect.left + (triggerRect.width / 2) - (tooltipRect.width / 2) + skidding;
|
42
|
+
const maxLeft = triggerRect.right - tooltipRect.width + skidding;
|
43
|
+
left = Math.min(centeredLeft, maxLeft);
|
44
|
+
break;
|
45
|
+
}
|
46
|
+
|
47
|
+
case 'bottom':
|
48
|
+
top = triggerRect.bottom + distance;
|
49
|
+
left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2 + skidding;
|
50
|
+
break;
|
51
|
+
case 'bottom-start': {
|
52
|
+
top = triggerRect.bottom + distance;
|
53
|
+
const centeredLeft = triggerRect.left + (triggerRect.width / 2) - (tooltipRect.width / 2) + skidding;
|
54
|
+
left = Math.max(triggerRect.left + skidding, centeredLeft);
|
55
|
+
|
56
|
+
break;
|
57
|
+
}
|
58
|
+
|
59
|
+
case 'bottom-end': {
|
60
|
+
top = triggerRect.bottom + distance;
|
61
|
+
const centeredLeft = triggerRect.left + (triggerRect.width / 2) - (tooltipRect.width / 2) + skidding;
|
62
|
+
const maxLeft = triggerRect.right - tooltipRect.width + skidding;
|
63
|
+
left = Math.min(centeredLeft, maxLeft);
|
64
|
+
break;
|
65
|
+
}
|
66
|
+
|
67
|
+
case 'left':
|
68
|
+
top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2 + skidding;
|
69
|
+
left = triggerRect.left - tooltipRect.width - distance;
|
70
|
+
break;
|
71
|
+
case 'left-start': {
|
72
|
+
const triggerCenterY = triggerRect.top + triggerRect.height / 2;
|
73
|
+
top = triggerCenterY - tooltipRect.height / 2;
|
74
|
+
left = triggerRect.left - tooltipRect.width - distance;
|
75
|
+
if (top < triggerRect.top) {
|
76
|
+
top = triggerRect.top;
|
77
|
+
}
|
78
|
+
break;
|
79
|
+
}
|
80
|
+
|
81
|
+
case 'left-end': {
|
82
|
+
const triggerCenterY = triggerRect.top + triggerRect.height / 2;
|
83
|
+
top = triggerCenterY - tooltipRect.height / 2;
|
84
|
+
left = triggerRect.left - tooltipRect.width - distance;
|
85
|
+
if (top + tooltipRect.height > triggerRect.bottom) {
|
86
|
+
top = triggerRect.bottom - tooltipRect.height;
|
87
|
+
}
|
88
|
+
|
89
|
+
break;
|
90
|
+
}
|
91
|
+
|
92
|
+
case 'right':
|
93
|
+
top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2 + skidding;
|
94
|
+
left = triggerRect.right + distance;
|
95
|
+
break;
|
96
|
+
case 'right-start': {
|
97
|
+
const triggerCenterY = triggerRect.top + triggerRect.height / 2;
|
98
|
+
top = triggerCenterY - tooltipRect.height / 2;
|
99
|
+
left = triggerRect.right + distance;
|
100
|
+
if (top < triggerRect.top) {
|
101
|
+
top = triggerRect.top;
|
102
|
+
}
|
103
|
+
|
104
|
+
break;
|
105
|
+
}
|
106
|
+
|
107
|
+
case 'right-end': {
|
108
|
+
const triggerCenterY = triggerRect.top + triggerRect.height / 2;
|
109
|
+
top = triggerCenterY - tooltipRect.height / 2;
|
110
|
+
left = triggerRect.right + distance;
|
111
|
+
if (top + tooltipRect.height > triggerRect.bottom) {
|
112
|
+
top = triggerRect.bottom - tooltipRect.height;
|
113
|
+
}
|
114
|
+
|
115
|
+
break;
|
116
|
+
}
|
117
|
+
|
118
|
+
default:
|
119
|
+
top = triggerRect.top - tooltipRect.height - distance;
|
120
|
+
left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2 + skidding;
|
121
|
+
}
|
122
|
+
|
123
|
+
return { top, left };
|
124
|
+
};
|
125
|
+
|
126
|
+
const candidateFits = (top: number, left: number) =>
|
127
|
+
top >= 0 &&
|
128
|
+
left >= 0 &&
|
129
|
+
top + tooltipRect.height <= viewportHeight &&
|
130
|
+
left + tooltipRect.width <= viewportWidth;
|
131
|
+
|
132
|
+
let placement = originalPlacement;
|
133
|
+
let candidate = getCandidatePosition(placement);
|
134
|
+
|
135
|
+
if (!candidateFits(candidate.top, candidate.left)) {
|
136
|
+
if (['top', 'top-start', 'top-end'].includes(originalPlacement)) {
|
137
|
+
placement = 'bottom';
|
138
|
+
} else if (['bottom', 'bottom-start', 'bottom-end'].includes(originalPlacement)) {
|
139
|
+
placement = 'top';
|
140
|
+
} else if (['right', 'right-start', 'right-end'].includes(originalPlacement)) {
|
141
|
+
placement = 'left';
|
142
|
+
} else if (['left', 'left-start', 'left-end'].includes(originalPlacement)) {
|
143
|
+
placement = 'right';
|
144
|
+
}
|
145
|
+
candidate = getCandidatePosition(placement);
|
146
|
+
const leftCandidate = getCandidatePosition('left');
|
147
|
+
const bottomCandidate = getCandidatePosition('bottom');
|
148
|
+
const topCandidate = getCandidatePosition('top');
|
149
|
+
if (
|
150
|
+
!candidateFits(leftCandidate.top, leftCandidate.left) &&
|
151
|
+
!candidateFits(bottomCandidate.top, bottomCandidate.left) &&
|
152
|
+
!candidateFits(topCandidate.top, topCandidate.left)
|
153
|
+
) {
|
154
|
+
placement = 'right';
|
155
|
+
candidate = getCandidatePosition(placement);
|
156
|
+
}
|
157
|
+
else {
|
158
|
+
const rightCandidate = getCandidatePosition('right');
|
159
|
+
if (
|
160
|
+
!candidateFits(rightCandidate.top, rightCandidate.left) &&
|
161
|
+
!candidateFits(bottomCandidate.top, bottomCandidate.left) &&
|
162
|
+
!candidateFits(topCandidate.top, topCandidate.left)
|
163
|
+
) {
|
164
|
+
placement = 'left';
|
165
|
+
candidate = getCandidatePosition(placement);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
|
170
|
+
if (candidate.left < 0) {
|
171
|
+
candidate.left = 5;
|
172
|
+
} else if (candidate.left + tooltipRect.width > viewportWidth) {
|
173
|
+
candidate.left = viewportWidth - tooltipRect.width - 5;
|
174
|
+
}
|
175
|
+
|
176
|
+
if (candidate.top < 0) {
|
177
|
+
candidate.top = 5;
|
178
|
+
} else if (candidate.top + tooltipRect.height > viewportHeight) {
|
179
|
+
candidate.top = viewportHeight - tooltipRect.height - 5;
|
180
|
+
}
|
181
|
+
|
182
|
+
return { ...candidate, placement };
|
183
|
+
}
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
export interface CaretPositionInput {
|
188
|
+
placement: string;
|
189
|
+
tooltipRect: DOMRect;
|
190
|
+
triggerRect: DOMRect;
|
191
|
+
caretSize: number;
|
192
|
+
left: number;
|
193
|
+
top: number;
|
194
|
+
}
|
195
|
+
|
196
|
+
export function getCaretPosition({
|
197
|
+
placement,
|
198
|
+
tooltipRect,
|
199
|
+
triggerRect,
|
200
|
+
caretSize,
|
201
|
+
left,
|
202
|
+
top
|
203
|
+
}: CaretPositionInput): { caretLeft: number; caretTop: number } {
|
204
|
+
const triggerCenterX = triggerRect.left + triggerRect.width / 2;
|
205
|
+
const triggerCenterY = triggerRect.top + triggerRect.height / 2;
|
206
|
+
|
207
|
+
const [primaryPlacement, secondaryPlacement] = placement.split('-');
|
208
|
+
|
209
|
+
let caretLeft = 0;
|
210
|
+
let caretTop = 0;
|
211
|
+
|
212
|
+
switch (primaryPlacement) {
|
213
|
+
case 'top':
|
214
|
+
caretTop = tooltipRect.height - caretSize;
|
215
|
+
caretLeft = triggerCenterX - left - caretSize;
|
216
|
+
if (placement === 'top-end') {
|
217
|
+
caretLeft = triggerCenterX - left - caretSize;
|
218
|
+
} else if (secondaryPlacement === 'start') {
|
219
|
+
caretLeft = triggerCenterX - left - caretSize;
|
220
|
+
} else if (secondaryPlacement === 'end') {
|
221
|
+
caretLeft = tooltipRect.width - 2 * caretSize + 8;
|
222
|
+
}
|
223
|
+
caretLeft = Math.max(caretSize, Math.min(caretLeft, tooltipRect.width - 2 * caretSize));
|
224
|
+
break;
|
225
|
+
|
226
|
+
case 'bottom':
|
227
|
+
caretTop = -caretSize;
|
228
|
+
caretLeft = triggerCenterX - left - caretSize;
|
229
|
+
break;
|
230
|
+
|
231
|
+
case 'left':
|
232
|
+
caretLeft = tooltipRect.width - caretSize;
|
233
|
+
if (secondaryPlacement === 'start') {
|
234
|
+
const computedCaretTop = triggerCenterY - top - caretSize;
|
235
|
+
const minCaretTop = triggerRect.top - top;
|
236
|
+
caretTop = Math.max(computedCaretTop, minCaretTop);
|
237
|
+
} else if (secondaryPlacement === 'end') {
|
238
|
+
const computedCaretTop = triggerCenterY - top - caretSize;
|
239
|
+
const maxCaretTop = triggerRect.bottom - top - 2 * caretSize;
|
240
|
+
caretTop = Math.min(computedCaretTop, maxCaretTop);
|
241
|
+
} else {
|
242
|
+
caretTop = triggerCenterY - top - caretSize;
|
243
|
+
}
|
244
|
+
caretTop = Math.max(caretSize, Math.min(caretTop, tooltipRect.height - 2 * caretSize));
|
245
|
+
break;
|
246
|
+
|
247
|
+
|
248
|
+
case 'right':
|
249
|
+
caretLeft = -caretSize;
|
250
|
+
if (secondaryPlacement === 'start') {
|
251
|
+
const computedCaretTop = triggerCenterY - top - caretSize;
|
252
|
+
const minCaretTop = triggerRect.top - top;
|
253
|
+
caretTop = Math.max(computedCaretTop, minCaretTop);
|
254
|
+
} else if (secondaryPlacement === 'end') {
|
255
|
+
const computedCaretTop = triggerCenterY - top - caretSize;
|
256
|
+
const maxCaretTop = triggerRect.bottom - top - 2 * caretSize;
|
257
|
+
caretTop = Math.min(computedCaretTop, maxCaretTop);
|
258
|
+
} else {
|
259
|
+
caretTop = triggerCenterY - top - caretSize;
|
260
|
+
}
|
261
|
+
caretTop = Math.max(caretSize, Math.min(caretTop, tooltipRect.height - 2 * caretSize));
|
262
|
+
break;
|
263
|
+
|
264
|
+
|
265
|
+
default:
|
266
|
+
caretLeft = tooltipRect.width / 2 - caretSize;
|
267
|
+
caretTop = tooltipRect.height / 2 - caretSize;
|
268
|
+
}
|
269
|
+
|
270
|
+
return { caretLeft, caretTop };
|
271
|
+
}
|
@@ -11,60 +11,93 @@ import { css } from 'lit';
|
|
11
11
|
* Tooltip CSS
|
12
12
|
*/
|
13
13
|
export const styles = css`
|
14
|
-
:host {
|
15
|
-
--max-width: 20rem;
|
16
|
-
--hide-delay: 0ms;
|
17
|
-
--show-delay: 150ms;
|
18
14
|
|
19
|
-
display: contents;
|
20
|
-
}
|
21
15
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
:host {
|
17
|
+
position: relative;
|
18
|
+
display: inline-block;
|
19
|
+
}
|
20
|
+
.tooltip {
|
21
|
+
position: fixed;
|
22
|
+
z-index: 1000;
|
23
|
+
background-color: var(--nile-tooltip-color-background, #333);
|
24
|
+
color: var(--nile-colors-white-base, #fff);
|
25
|
+
padding: 6px 10px;
|
26
|
+
border-radius: 4px;
|
27
|
+
font-size: var(--nile-tooltip-font-size-sm, 14px);
|
28
|
+
line-height: var(--nile-tooltip-line-height-sm, 1.5);
|
29
|
+
opacity: 0;
|
30
|
+
transition: opacity 0.2s, transform 0.2s;
|
31
|
+
pointer-events: none;
|
32
|
+
white-space: normal;
|
33
|
+
visibility: hidden;
|
34
|
+
overflow: visible;
|
35
|
+
|
36
|
+
}
|
37
|
+
:host([open]) .tooltip {
|
38
|
+
opacity: 1;
|
39
|
+
visibility: visible;
|
40
|
+
pointer-events: auto;
|
41
|
+
}
|
42
|
+
.tooltip-content {
|
43
|
+
overflow: auto;
|
44
|
+
max-width: 250px;
|
45
|
+
max-height: 116px;
|
46
|
+
}
|
47
|
+
.tooltip-caret {
|
48
|
+
position: absolute;
|
49
|
+
width: calc(2 * var(--caret-size, 6px));
|
50
|
+
height: calc(2 * var(--caret-size, 6px));
|
51
|
+
background-color: inherit;
|
52
|
+
transform: rotate(45deg);
|
53
|
+
z-index: -1;
|
54
|
+
}
|
55
|
+
.trigger-container {
|
56
|
+
display: inline-block;
|
57
|
+
}
|
58
|
+
|
59
|
+
|
60
|
+
:host([open]) .tooltip {
|
61
|
+
visibility: visible;
|
62
|
+
pointer-events: auto;
|
63
|
+
animation: fadeIn 150ms forwards;
|
64
|
+
}
|
26
65
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
66
|
+
|
67
|
+
.tooltip.hide {
|
68
|
+
animation: fadeOut 100ms forwards;
|
69
|
+
}
|
31
70
|
|
32
|
-
|
33
|
-
|
71
|
+
|
72
|
+
@keyframes fadeIn {
|
73
|
+
from {
|
74
|
+
opacity: 0;
|
75
|
+
transform: translateY(5px);
|
34
76
|
}
|
35
|
-
|
36
|
-
|
37
|
-
transform
|
77
|
+
to {
|
78
|
+
opacity: 1;
|
79
|
+
transform: translateY(0);
|
38
80
|
}
|
81
|
+
}
|
39
82
|
|
40
|
-
|
41
|
-
|
83
|
+
|
84
|
+
@keyframes fadeOut {
|
85
|
+
from {
|
86
|
+
opacity: 1;
|
87
|
+
transform: translateY(0);
|
42
88
|
}
|
43
|
-
|
44
|
-
|
45
|
-
transform
|
89
|
+
to {
|
90
|
+
opacity: 0;
|
91
|
+
transform: translateY(5px);
|
46
92
|
}
|
93
|
+
}
|
47
94
|
|
48
|
-
.tooltip__body {
|
49
|
-
display: block;
|
50
|
-
width: max-content;
|
51
|
-
max-width: var(--max-width);
|
52
|
-
border-radius: 4px;
|
53
|
-
background-color: var(--nile-tooltip-color-background);
|
54
|
-
font-size: var(--nile-tooltip-font-size-sm);
|
55
|
-
font-weight: var(--nile-tooltip-font-weight-sm);
|
56
|
-
line-height: var(--nile-tooltip-line-height-sm);
|
57
|
-
padding: var(--nile-tooltip-padding-y) var(--nile-tooltip-padding-x);
|
58
|
-
color: var(--nile-colors-white-base);
|
59
|
-
pointer-events: none;
|
60
|
-
word-break: break-word;
|
61
|
-
}
|
62
95
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
68
101
|
`;
|
69
102
|
|
70
|
-
export default [styles];
|
103
|
+
export default [styles];
|