@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.
Files changed (148) hide show
  1. package/README.md +22 -8
  2. package/demo/index.css +7 -4
  3. package/demo/index.html +20 -36
  4. package/dist/{fixture-161dee0b.cjs.js → fixture-d5b55278.cjs.js} +3 -3
  5. package/dist/fixture-d5b55278.cjs.js.map +1 -0
  6. package/dist/{fixture-372df3b0.esm.js → fixture-df8b52d7.esm.js} +1 -1
  7. package/dist/index.cjs.js +1 -1
  8. package/dist/index.esm.js +1 -1
  9. package/dist/internal/animate.cjs.js +1 -1
  10. package/dist/internal/animate.cjs.js.map +1 -1
  11. package/dist/internal/animate.esm.js +1 -1
  12. package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
  13. package/dist/nile-accordion/nile-accordian.test.esm.js +1 -1
  14. package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
  15. package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
  16. package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
  17. package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
  18. package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
  19. package/dist/nile-badge/nile-badge.test.esm.js +1 -1
  20. package/dist/nile-button/nile-button.test.cjs.js +1 -1
  21. package/dist/nile-button/nile-button.test.esm.js +1 -1
  22. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
  23. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.esm.js +1 -1
  24. package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
  25. package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
  26. package/dist/nile-card/nile-card.test.cjs.js +1 -1
  27. package/dist/nile-card/nile-card.test.esm.js +1 -1
  28. package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
  29. package/dist/nile-checkbox/nile-checkbox.test.esm.js +1 -1
  30. package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
  31. package/dist/nile-chip/nile-chip.test.esm.js +1 -1
  32. package/dist/nile-code-editor/extensionSetup.cjs.js +1 -1
  33. package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
  34. package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
  35. package/dist/nile-code-editor/nile-code-editor.cjs.js +1 -1
  36. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  37. package/dist/nile-code-editor/nile-code-editor.esm.js +2 -2
  38. package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
  39. package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
  40. package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
  41. package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
  42. package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
  43. package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
  44. package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
  45. package/dist/nile-empty-state/nile-empty-state.test.esm.js +1 -1
  46. package/dist/nile-error-message/nile-error-message.cjs.js +1 -1
  47. package/dist/nile-error-message/nile-error-message.cjs.js.map +1 -1
  48. package/dist/nile-error-message/nile-error-message.css.cjs.js +1 -1
  49. package/dist/nile-error-message/nile-error-message.css.cjs.js.map +1 -1
  50. package/dist/nile-error-message/nile-error-message.css.esm.js +6 -4
  51. package/dist/nile-error-message/nile-error-message.esm.js +4 -4
  52. package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
  53. package/dist/nile-error-message/nile-error-message.test.esm.js +1 -1
  54. package/dist/nile-error-notification/nile-error-notification.css.cjs.js +1 -1
  55. package/dist/nile-error-notification/nile-error-notification.css.cjs.js.map +1 -1
  56. package/dist/nile-error-notification/nile-error-notification.css.esm.js +1 -1
  57. package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
  58. package/dist/nile-form-group/nile-form-group.test.esm.js +1 -1
  59. package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
  60. package/dist/nile-form-help-text/nile-form-help-text.test.esm.js +1 -1
  61. package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
  62. package/dist/nile-hero/nile-hero.test.esm.js +1 -1
  63. package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
  64. package/dist/nile-icon/nile-icon.test.esm.js +1 -1
  65. package/dist/nile-input/nile-input.test.cjs.js +1 -1
  66. package/dist/nile-input/nile-input.test.esm.js +1 -1
  67. package/dist/nile-link/nile-link.test.cjs.js +1 -1
  68. package/dist/nile-link/nile-link.test.esm.js +1 -1
  69. package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
  70. package/dist/nile-loader/nile-loader.test.esm.js +1 -1
  71. package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
  72. package/dist/nile-popover/nile-popover.test.esm.js +1 -1
  73. package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
  74. package/dist/nile-popup/nile-popup.test.esm.js +1 -1
  75. package/dist/nile-progress-bar/nile-progress-bar.css.cjs.js +1 -1
  76. package/dist/nile-progress-bar/nile-progress-bar.css.cjs.js.map +1 -1
  77. package/dist/nile-progress-bar/nile-progress-bar.css.esm.js +1 -0
  78. package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
  79. package/dist/nile-progress-bar/nile-progress-bar.test.esm.js +1 -1
  80. package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
  81. package/dist/nile-radio/nile-radio.test.esm.js +1 -1
  82. package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
  83. package/dist/nile-radio-group/nile-radio-group.test.esm.js +1 -1
  84. package/dist/nile-select/nile-select.test.cjs.js +1 -1
  85. package/dist/nile-select/nile-select.test.esm.js +1 -1
  86. package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
  87. package/dist/nile-slide-toggle/nile-slide-toggle.test.esm.js +1 -1
  88. package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
  89. package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
  90. package/dist/nile-table/nile-table.cjs.js.map +1 -1
  91. package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
  92. package/dist/nile-textarea/nile-textarea.test.esm.js +1 -1
  93. package/dist/nile-tooltip/index.cjs.js +1 -1
  94. package/dist/nile-tooltip/index.esm.js +1 -1
  95. package/dist/nile-tooltip/nile-tooltip-utils.cjs.js +2 -0
  96. package/dist/nile-tooltip/nile-tooltip-utils.cjs.js.map +1 -0
  97. package/dist/nile-tooltip/nile-tooltip-utils.esm.js +1 -0
  98. package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
  99. package/dist/nile-tooltip/nile-tooltip.cjs.js.map +1 -1
  100. package/dist/nile-tooltip/nile-tooltip.css.cjs.js +1 -1
  101. package/dist/nile-tooltip/nile-tooltip.css.cjs.js.map +1 -1
  102. package/dist/nile-tooltip/nile-tooltip.css.esm.js +78 -45
  103. package/dist/nile-tooltip/nile-tooltip.esm.js +23 -28
  104. package/dist/nile-tooltip/nile-tooltip.test.cjs.js +2 -0
  105. package/dist/nile-tooltip/nile-tooltip.test.cjs.js.map +1 -0
  106. package/dist/nile-tooltip/nile-tooltip.test.esm.js +47 -0
  107. package/dist/src/nile-code-editor/extensionSetup.d.ts +2 -1
  108. package/dist/src/nile-code-editor/extensionSetup.js +8 -0
  109. package/dist/src/nile-code-editor/extensionSetup.js.map +1 -1
  110. package/dist/src/nile-code-editor/nile-code-editor.d.ts +2 -0
  111. package/dist/src/nile-code-editor/nile-code-editor.js +12 -3
  112. package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
  113. package/dist/src/nile-error-message/nile-error-message.css.js +6 -4
  114. package/dist/src/nile-error-message/nile-error-message.css.js.map +1 -1
  115. package/dist/src/nile-error-message/nile-error-message.d.ts +4 -0
  116. package/dist/src/nile-error-message/nile-error-message.js +20 -0
  117. package/dist/src/nile-error-message/nile-error-message.js.map +1 -1
  118. package/dist/src/nile-error-notification/nile-error-notification.css.js +1 -1
  119. package/dist/src/nile-error-notification/nile-error-notification.css.js.map +1 -1
  120. package/dist/src/nile-progress-bar/nile-progress-bar.css.js +1 -0
  121. package/dist/src/nile-progress-bar/nile-progress-bar.css.js.map +1 -1
  122. package/dist/src/nile-table/nile-table.js.map +1 -1
  123. package/dist/src/nile-tooltip/nile-tooltip-utils.d.ts +18 -0
  124. package/dist/src/nile-tooltip/nile-tooltip-utils.js +216 -0
  125. package/dist/src/nile-tooltip/nile-tooltip-utils.js.map +1 -0
  126. package/dist/src/nile-tooltip/nile-tooltip.css.js +76 -43
  127. package/dist/src/nile-tooltip/nile-tooltip.css.js.map +1 -1
  128. package/dist/src/nile-tooltip/nile-tooltip.d.ts +24 -46
  129. package/dist/src/nile-tooltip/nile-tooltip.js +235 -232
  130. package/dist/src/nile-tooltip/nile-tooltip.js.map +1 -1
  131. package/dist/src/nile-tooltip/nile-tooltip.test.d.ts +1 -0
  132. package/dist/src/nile-tooltip/nile-tooltip.test.js +148 -0
  133. package/dist/src/nile-tooltip/nile-tooltip.test.js.map +1 -0
  134. package/dist/tsconfig.tsbuildinfo +1 -1
  135. package/package.json +1 -1
  136. package/src/nile-code-editor/extensionSetup.ts +13 -1
  137. package/src/nile-code-editor/nile-code-editor.ts +9 -4
  138. package/src/nile-error-message/nile-error-message.css.ts +6 -4
  139. package/src/nile-error-message/nile-error-message.ts +18 -0
  140. package/src/nile-error-notification/nile-error-notification.css.ts +1 -1
  141. package/src/nile-progress-bar/nile-progress-bar.css.ts +1 -0
  142. package/src/nile-table/nile-table.ts +2 -2
  143. package/src/nile-tooltip/nile-tooltip-utils.ts +271 -0
  144. package/src/nile-tooltip/nile-tooltip.css.ts +77 -44
  145. package/src/nile-tooltip/nile-tooltip.test.ts +168 -0
  146. package/src/nile-tooltip/nile-tooltip.ts +268 -230
  147. package/vscode-html-custom-data.json +103 -93
  148. 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.34",
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?: false;
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: 'error' }) error: boolean = false;
71
+ @property({ type: Boolean, reflect: true , attribute: true }) error: boolean = false;
72
72
 
73
- @property({ type: Boolean, reflect: true , attribute: 'noborder' }) noborder: boolean = false;
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: 12px;
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: 100px;
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: 12px;
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
  */
@@ -12,7 +12,7 @@ import { css } from 'lit';
12
12
  */
13
13
  export const styles = css`
14
14
  :host {
15
- --indication-color: var(--nile-colors-red-500);
15
+ --indication-color: var(--nile-colors-red-700);
16
16
  }
17
17
 
18
18
  .nile-error-notification {
@@ -15,6 +15,7 @@ export default css`
15
15
  display: flex;
16
16
  height: 6px;
17
17
  justify-content: space-between;
18
+ display: inline-block;
18
19
  }
19
20
 
20
21
  .nile-progress-bar__progress-bar li {
@@ -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
- .tooltip {
23
- --arrow-size: 6px;
24
- --arrow-color: var(--nile-tooltip-color-background);
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
- .tooltip::part(popup) {
28
- pointer-events: none;
29
- z-index: 1000;
30
- }
66
+
67
+ .tooltip.hide {
68
+ animation: fadeOut 100ms forwards;
69
+ }
31
70
 
32
- .tooltip[placement^='top']::part(popup) {
33
- transform-origin: bottom;
71
+
72
+ @keyframes fadeIn {
73
+ from {
74
+ opacity: 0;
75
+ transform: translateY(5px);
34
76
  }
35
-
36
- .tooltip[placement^='bottom']::part(popup) {
37
- transform-origin: top;
77
+ to {
78
+ opacity: 1;
79
+ transform: translateY(0);
38
80
  }
81
+ }
39
82
 
40
- .tooltip[placement^='left']::part(popup) {
41
- transform-origin: right;
83
+
84
+ @keyframes fadeOut {
85
+ from {
86
+ opacity: 1;
87
+ transform: translateY(0);
42
88
  }
43
-
44
- .tooltip[placement^='right']::part(popup) {
45
- transform-origin: left;
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
- .tooltip__body--large {
64
- font-size: var(--nile-tooltip-font-size-lg);
65
- line-height: var(--nile-tooltip-line-height-lg);
66
- font-weight: var(--nile-tooltip-font-weight-lg);
67
- }
96
+
97
+
98
+
99
+
100
+
68
101
  `;
69
102
 
70
- export default [styles];
103
+ export default [styles];