@maggioli-design-system/mds-input-tip 1.2.1 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. package/dist/cjs/{index-442db91d.js → index-66d8bb25.js} +143 -58
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/mds-input-tip.cjs.entry.js +7 -1
  4. package/dist/cjs/mds-input-tip.cjs.js +2 -2
  5. package/dist/collection/collection-manifest.json +1 -1
  6. package/dist/collection/common/aria.js +17 -1
  7. package/dist/collection/common/device.js +6 -0
  8. package/dist/collection/common/floating-controller.js +180 -0
  9. package/dist/collection/common/keyboard-manager.js +2 -2
  10. package/dist/collection/common/slot.js +19 -0
  11. package/dist/collection/components/mds-input-tip/mds-input-tip.js +10 -0
  12. package/dist/collection/dictionary/animation.js +5 -0
  13. package/dist/collection/dictionary/file-extensions.js +61 -56
  14. package/dist/collection/dictionary/text.js +60 -1
  15. package/dist/collection/dictionary/tree.js +13 -0
  16. package/dist/collection/fixtures/filenames.js +62 -1
  17. package/dist/collection/type/animation.js +1 -0
  18. package/dist/collection/type/tree.js +1 -0
  19. package/dist/collection/type/variant-file-format.js +5 -0
  20. package/dist/components/mds-input-tip.js +6 -0
  21. package/dist/documentation.d.ts +8 -0
  22. package/dist/documentation.json +8 -4
  23. package/dist/esm/{index-8fed469d.js → index-4e431d49.js} +143 -58
  24. package/dist/esm/loader.js +2 -2
  25. package/dist/esm/mds-input-tip.entry.js +7 -1
  26. package/dist/esm/mds-input-tip.js +3 -3
  27. package/dist/esm-es5/index-4e431d49.js +1 -0
  28. package/dist/esm-es5/loader.js +1 -1
  29. package/dist/esm-es5/mds-input-tip.entry.js +1 -1
  30. package/dist/esm-es5/mds-input-tip.js +1 -1
  31. package/dist/mds-input-tip/mds-input-tip.esm.js +1 -1
  32. package/dist/mds-input-tip/mds-input-tip.js +1 -1
  33. package/dist/mds-input-tip/{p-4486a5e4.entry.js → p-3bf85392.entry.js} +1 -1
  34. package/dist/mds-input-tip/{p-fadf816e.system.entry.js → p-5c7f52a4.system.entry.js} +1 -1
  35. package/dist/mds-input-tip/p-7eeec96b.system.js +2 -0
  36. package/dist/mds-input-tip/p-b8376582.js +2 -0
  37. package/dist/mds-input-tip/{p-c915dfb3.system.js → p-c7ede63a.system.js} +1 -1
  38. package/dist/stats.json +62 -36
  39. package/dist/types/common/aria.d.ts +3 -1
  40. package/dist/types/common/device.d.ts +2 -0
  41. package/dist/types/common/floating-controller.d.ts +46 -0
  42. package/dist/types/common/slot.d.ts +3 -0
  43. package/dist/types/dictionary/animation.d.ts +2 -0
  44. package/dist/types/dictionary/text.d.ts +3 -1
  45. package/dist/types/dictionary/tree.d.ts +4 -0
  46. package/dist/types/fixtures/filenames.d.ts +62 -1
  47. package/dist/types/type/animation.d.ts +1 -0
  48. package/dist/types/type/file-types.d.ts +1 -1
  49. package/dist/types/type/text.d.ts +2 -0
  50. package/dist/types/type/tree.d.ts +3 -0
  51. package/dist/types/type/variant-file-format.d.ts +1 -1
  52. package/documentation.json +57 -18
  53. package/package.json +4 -4
  54. package/src/common/aria.ts +22 -2
  55. package/src/common/device.ts +9 -0
  56. package/src/common/floating-controller.ts +263 -0
  57. package/src/common/keyboard-manager.ts +2 -2
  58. package/src/common/slot.ts +24 -0
  59. package/src/dictionary/animation.ts +8 -0
  60. package/src/dictionary/file-extensions.ts +61 -56
  61. package/src/dictionary/text.ts +64 -0
  62. package/src/dictionary/tree.ts +21 -0
  63. package/src/fixtures/filenames.ts +63 -0
  64. package/src/fixtures/icons.json +29 -0
  65. package/src/fixtures/iconsauce.json +11 -0
  66. package/src/meta/file-format/locale.el.json +44 -0
  67. package/src/meta/file-format/locale.en.json +44 -0
  68. package/src/meta/file-format/locale.es.json +44 -0
  69. package/src/meta/file-format/locale.it.json +44 -0
  70. package/src/type/animation.ts +3 -0
  71. package/src/type/file-types.ts +6 -0
  72. package/src/type/text.ts +59 -0
  73. package/src/type/tree.ts +12 -0
  74. package/src/type/variant-file-format.ts +6 -0
  75. package/www/build/mds-input-tip.esm.js +1 -1
  76. package/www/build/mds-input-tip.js +1 -1
  77. package/www/build/{p-4486a5e4.entry.js → p-3bf85392.entry.js} +1 -1
  78. package/www/build/{p-fadf816e.system.entry.js → p-5c7f52a4.system.entry.js} +1 -1
  79. package/www/build/p-7eeec96b.system.js +2 -0
  80. package/www/build/p-b8376582.js +2 -0
  81. package/www/build/{p-c915dfb3.system.js → p-c7ede63a.system.js} +1 -1
  82. package/dist/esm-es5/index-8fed469d.js +0 -1
  83. package/dist/mds-input-tip/p-37c61f56.system.js +0 -2
  84. package/dist/mds-input-tip/p-3e967425.js +0 -2
  85. package/www/build/p-37c61f56.system.js +0 -2
  86. package/www/build/p-3e967425.js +0 -2
@@ -1,8 +1,8 @@
1
1
  {
2
- "timestamp": "2024-11-25T16:00:58",
2
+ "timestamp": "2025-02-06T07:52:44",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
- "version": "4.22.2",
5
+ "version": "4.25.1",
6
6
  "typescriptVersion": "5.5.4"
7
7
  },
8
8
  "components": [
@@ -38,7 +38,9 @@
38
38
  }
39
39
  ],
40
40
  "optional": true,
41
- "required": false
41
+ "required": false,
42
+ "getter": false,
43
+ "setter": false
42
44
  },
43
45
  {
44
46
  "name": "position",
@@ -74,7 +76,9 @@
74
76
  }
75
77
  ],
76
78
  "optional": true,
77
- "required": false
79
+ "required": false,
80
+ "getter": false,
81
+ "setter": false
78
82
  }
79
83
  ],
80
84
  "methods": [],
@@ -219,6 +223,11 @@
219
223
  "docstring": "",
220
224
  "path": "src/type/button.ts"
221
225
  },
226
+ "src/type/text.ts::TypographyTruncateType": {
227
+ "declaration": "export type TypographyTruncateType =\n | 'all'\n | 'none'\n | 'word'",
228
+ "docstring": "",
229
+ "path": "src/type/text.ts"
230
+ },
222
231
  "src/type/variant.ts::ChipVariantType": {
223
232
  "declaration": "export type ChipVariantType =\n | 'primary'\n | 'secondary'\n | 'dark'\n | 'error'\n | 'info'\n | 'success'\n | 'warning'",
224
233
  "docstring": "",
@@ -250,7 +259,7 @@
250
259
  "path": "src/components/mds-dropdown/meta/event-detail.ts"
251
260
  },
252
261
  "src/type/file-types.ts::ExtensionSuffixType": {
253
- "declaration": "export type ExtensionSuffixType =\n | '7z'\n | 'ace'\n | 'ai'\n | 'db'\n | 'default'\n | 'dmg'\n | 'doc'\n | 'docm'\n | 'docx'\n | 'eml'\n | 'eps'\n | 'exe'\n | 'flac'\n | 'gif'\n | 'heic'\n | 'htm'\n | 'html'\n | 'jpe'\n | 'jpeg'\n | 'jpg'\n | 'js'\n | 'json'\n | 'jsx'\n | 'm2v'\n | 'mp2'\n | 'mp3'\n | 'mp4'\n | 'mp4v'\n | 'mpeg'\n | 'mpg'\n | 'mpg4'\n | 'mpga'\n | 'odp'\n | 'ods'\n | 'odt'\n | 'pdf'\n | 'php'\n | 'png'\n | 'ppt'\n | 'rar'\n | 'rtf'\n | 'sass'\n | 'shtml'\n | 'svg'\n | 'tar'\n | 'tiff'\n | 'ts'\n | 'txt'\n | 'wav'\n | 'webp'\n | 'xar'\n | 'xls'\n | 'xlsx'\n | 'zip'",
262
+ "declaration": "export type ExtensionSuffixType =\n | '7z'\n | 'ace'\n | 'ai'\n | 'db'\n | 'default'\n | 'dmg'\n | 'doc'\n | 'docm'\n | 'docx'\n | 'eml'\n | 'eps'\n | 'exe'\n | 'flac'\n | 'gif'\n | 'heic'\n | 'htm'\n | 'html'\n | 'jpe'\n | 'jpeg'\n | 'jpg'\n | 'js'\n | 'json'\n | 'jsx'\n | 'm2v'\n | 'mp2'\n | 'mp3'\n | 'mp4'\n | 'mp4v'\n | 'mpeg'\n | 'mpg'\n | 'mpg4'\n | 'mpga'\n | 'odf'\n | 'odp'\n | 'ods'\n | 'odt'\n | 'odt'\n | 'ole'\n | 'p7m'\n | 'pdf'\n | 'php'\n | 'png'\n | 'ppt'\n | 'rar'\n | 'rtf'\n | 'sass'\n | 'shtml'\n | 'svg'\n | 'tar'\n | 'tiff'\n | 'ts'\n | 'tsd'\n | 'txt'\n | 'wav'\n | 'webp'\n | 'xar'\n | 'xls'\n | 'xlsx'\n | 'xml'\n | 'zip'",
254
263
  "docstring": "",
255
264
  "path": "src/type/file-types.ts"
256
265
  },
@@ -259,11 +268,6 @@
259
268
  "docstring": "",
260
269
  "path": "src/components/mds-file/meta/event-detail.ts"
261
270
  },
262
- "src/type/text.ts::TypographyTruncateType": {
263
- "declaration": "export type TypographyTruncateType =\n | 'all'\n | 'none'\n | 'word'",
264
- "docstring": "",
265
- "path": "src/type/text.ts"
266
- },
267
271
  "src/components/mds-file-preview/meta/event-detail.ts::MdsFilePreviewEventDetail": {
268
272
  "declaration": "export interface MdsFilePreviewEventDetail {\n extension: string\n filename: string\n target: HTMLMdsFilePreviewElement\n}",
269
273
  "docstring": "",
@@ -489,11 +493,6 @@
489
493
  "docstring": "",
490
494
  "path": "src/components/mds-progress/meta/types.ts"
491
495
  },
492
- "src/type/date.ts::ISO8601Date": {
493
- "declaration": "type ISO8601Date = ISO8601DateFormat<string, 'ISO8601Date'>",
494
- "docstring": "",
495
- "path": "src/type/date.ts"
496
- },
497
496
  "src/components/mds-push-notification/meta/types.ts::NotificationDateFormatType": {
498
497
  "declaration": "string",
499
498
  "docstring": "",
@@ -509,6 +508,11 @@
509
508
  "docstring": "",
510
509
  "path": "src/components/mds-push-notification/meta/event-detail.ts"
511
510
  },
511
+ "src/type/text.ts::TypographyHeadingTagType": {
512
+ "declaration": "export type TypographyHeadingTagType =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'",
513
+ "docstring": "",
514
+ "path": "src/type/text.ts"
515
+ },
512
516
  "src/components/mds-stepper-bar/meta/event-detail.ts::MdsStepperBarEventDetail": {
513
517
  "declaration": "export interface MdsStepperBarEventDetail {\n step: number\n value: string\n}",
514
518
  "docstring": "",
@@ -519,6 +523,11 @@
519
523
  "docstring": "",
520
524
  "path": "src/components/mds-stepper-bar-item/meta/event-detail.ts"
521
525
  },
526
+ "src/type/animation.ts::HorizontalActionsAnimationType": {
527
+ "declaration": "export type HorizontalActionsAnimationType =\n | 'fade'\n | 'slide'",
528
+ "docstring": "",
529
+ "path": "src/type/animation.ts"
530
+ },
522
531
  "src/components/mds-tab/meta/event-detail.ts::MdsTabEventDetail": {
523
532
  "declaration": "export interface MdsTabEventDetail {\n id: number\n value?: string\n}",
524
533
  "docstring": "",
@@ -539,8 +548,18 @@
539
548
  "docstring": "",
540
549
  "path": "src/components/mds-tab-item/meta/event-detail.ts"
541
550
  },
551
+ "src/components/mds-table/meta/event-detail.ts::MdsTableSelectionEventDetail": {
552
+ "declaration": "export interface MdsTableSelectionEventDetail {\n rows: MdsTableRowSelection[]\n}",
553
+ "docstring": "",
554
+ "path": "src/components/mds-table/meta/event-detail.ts"
555
+ },
556
+ "src/components/mds-table/meta/type.ts::MdsTableRowSelection": {
557
+ "declaration": "{\n index: number\n value?: string | number\n}",
558
+ "docstring": "",
559
+ "path": "src/components/mds-table/meta/type.ts"
560
+ },
542
561
  "src/components/mds-table-header-cell/meta/types.ts::SortDirectionType": {
543
- "declaration": "export type SortDirectionType =\n | 'asc'\n | 'desc'\n | 'none'",
562
+ "declaration": "export type SortDirectionType =\n | 'ascending'\n | 'descending'\n | 'none'",
544
563
  "docstring": "",
545
564
  "path": "src/components/mds-table-header-cell/meta/types.ts"
546
565
  },
@@ -549,10 +568,10 @@
549
568
  "docstring": "",
550
569
  "path": "src/components/mds-text/meta/types.ts"
551
570
  },
552
- "src/components/mds-text/meta/types.ts::TypographyTagType": {
571
+ "src/type/text.ts::TypographyTagType": {
553
572
  "declaration": "export type TypographyTagType =\n | 'abbr'\n | 'address'\n | 'article'\n | 'b'\n | 'bdo'\n | 'blockquote'\n | 'cite'\n | 'code'\n | 'dd'\n | 'del'\n | 'details'\n | 'dfn'\n | 'div'\n | 'dl'\n | 'dt'\n | 'em'\n | 'figcaption'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'i'\n | 'ins'\n | 'kbd'\n | 'label'\n | 'legend'\n | 'li'\n | 'mark'\n | 'ol'\n | 'p'\n | 'pre'\n | 'q'\n | 'rb'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'small'\n | 'span'\n | 'strong'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'time'\n | 'u'\n | 'ul'\n | 'var'",
554
573
  "docstring": "",
555
- "path": "src/components/mds-text/meta/types.ts"
574
+ "path": "src/type/text.ts"
556
575
  },
557
576
  "src/type/variant.ts::ThemeLuminanceVariantType": {
558
577
  "declaration": "export type ThemeLuminanceVariantType =\n | 'dark'\n | 'light'",
@@ -569,6 +588,26 @@
569
588
  "docstring": "",
570
589
  "path": "src/type/typography.ts"
571
590
  },
591
+ "src/type/tree.ts::TreeAppearance": {
592
+ "declaration": "export type TreeAppearance =\n | 'none'\n | 'depth'",
593
+ "docstring": "",
594
+ "path": "src/type/tree.ts"
595
+ },
596
+ "src/type/tree.ts::TreeIcon": {
597
+ "declaration": "export type TreeIcon =\n | 'folder'\n | 'chevron'",
598
+ "docstring": "",
599
+ "path": "src/type/tree.ts"
600
+ },
601
+ "src/type/tree.ts::TreeActions": {
602
+ "declaration": "export type TreeActions =\n | 'auto'\n | 'visible'",
603
+ "docstring": "",
604
+ "path": "src/type/tree.ts"
605
+ },
606
+ "src/components/mds-tree-item/meta/event-detail.ts::MdsTreeItemEventDetail": {
607
+ "declaration": "export interface MdsTreeItemEventDetail {\n element: HTMLMdsTreeItemElement\n}",
608
+ "docstring": "",
609
+ "path": "src/components/mds-tree-item/meta/event-detail.ts"
610
+ },
572
611
  "src/components/mds-usage/meta/types.ts::UsageType": {
573
612
  "declaration": "export type UsageType =\n | 'do'\n | 'dont'\n | 'info'\n | 'warn'",
574
613
  "docstring": "",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maggioli-design-system/mds-input-tip",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "mds-input-tip is a web-component from Magma Design System, built with StencilJS, TypeScript, Storybook. It's based on the web-component standard and it's designed to be agnostic from the JavaScript framework you are using.",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.js",
@@ -24,9 +24,9 @@
24
24
  "test": "stencil test --spec --e2e"
25
25
  },
26
26
  "dependencies": {
27
- "@maggioli-design-system/mds-input-tip-item": "1.2.1",
28
- "@maggioli-design-system/styles": "15.5.0",
29
- "@stencil/core": "4.22.2"
27
+ "@maggioli-design-system/mds-input-tip-item": "1.2.3",
28
+ "@maggioli-design-system/styles": "15.7.0",
29
+ "@stencil/core": "4.25.1"
30
30
  },
31
31
  "license": "MIT",
32
32
  "author": {
@@ -20,6 +20,24 @@ const setAttributeIfEmpty = (element: HTMLElement, attribute: string, value: str
20
20
  return value
21
21
  }
22
22
 
23
+ const removeAttributesIf = (element: HTMLElement, attribute: string, valueCheck: string = 'true', cleanAttributes: string | string[]): boolean => {
24
+ if (ifAttribute(element, attribute, valueCheck)) {
25
+ const attributesList = Array.isArray(cleanAttributes) ? cleanAttributes : [cleanAttributes]
26
+ attributesList.forEach(attributeToRemove => {
27
+ element.removeAttribute(attributeToRemove)
28
+ })
29
+ return true
30
+ }
31
+ return false
32
+ }
33
+
34
+ const ifAttribute = (element: HTMLElement, attribute: string, valueCheck: string = 'true'): boolean => {
35
+ if (element.hasAttribute(attribute) && element.getAttribute(attribute) === valueCheck) {
36
+ return true
37
+ }
38
+ return false
39
+ }
40
+
23
41
  const hashValue = (value: string): string => `${value}-${hash(value)}`
24
42
 
25
43
  const hashRandomValue = (value?: string): string => {
@@ -32,8 +50,10 @@ const hashRandomValue = (value?: string): string => {
32
50
  }
33
51
 
34
52
  export {
35
- unslugName,
36
- setAttributeIfEmpty,
37
53
  hashRandomValue,
38
54
  hashValue,
55
+ removeAttributesIf,
56
+ setAttributeIfEmpty,
57
+ ifAttribute,
58
+ unslugName,
39
59
  }
@@ -0,0 +1,9 @@
1
+ const isMobileDevice = (): boolean => {
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera
4
+ return /android|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent)
5
+ }
6
+
7
+ export {
8
+ isMobileDevice,
9
+ }
@@ -0,0 +1,263 @@
1
+ import {
2
+ arrow,
3
+ autoPlacement,
4
+ autoUpdate,
5
+ computePosition,
6
+ flip,
7
+ Middleware,
8
+ MiddlewareData,
9
+ offset,
10
+ shift,
11
+ } from '@floating-ui/dom'
12
+ import { FloatingUIPlacement, FloatingUIStrategy } from '@type/floating-ui'
13
+ import { cssDurationToMilliseconds } from './unit'
14
+ import { setAttributeIfEmpty } from './aria'
15
+ import { HTMLStencilElement } from '@stencil/core/internal'
16
+
17
+ export interface FloatingElement extends PositionOptions {
18
+ host: HTMLFloatingElement,
19
+ }
20
+
21
+ export interface HTMLFloatingElement extends HTMLStencilElement, PositionOptions {
22
+ visible: boolean,
23
+ }
24
+
25
+ export interface PositionOptions {
26
+ arrow: boolean;
27
+ arrowPadding: number;
28
+ autoPlacement: boolean;
29
+ flip: boolean;
30
+ offset: number;
31
+ placement: FloatingUIPlacement;
32
+ shift: boolean;
33
+ shiftPadding: number;
34
+ strategy: FloatingUIStrategy;
35
+ }
36
+
37
+ export class FloatingController {
38
+ private _caller: HTMLElement
39
+ private readonly _host: HTMLFloatingElement
40
+ arrowEl: HTMLElement | undefined
41
+
42
+ private cleanupAutoUpdate: () => void
43
+
44
+ constructor (host: HTMLFloatingElement, arrowEl?: HTMLElement) {
45
+ this._host = host
46
+ this.arrowEl = arrowEl
47
+ }
48
+
49
+ updateCaller (target: string): HTMLElement {
50
+ // search caller in document or rootNode of host (if target is in shadowDOM)
51
+ const caller = (this._host.parentElement?.shadowRoot?.querySelector(target) as HTMLElement) ??
52
+ ((this._host.getRootNode() as HTMLElement).querySelector(target) as HTMLElement)
53
+
54
+ if (!caller) {
55
+ throw Error(`Target not found: ${target}`)
56
+ }
57
+
58
+ this._caller = caller
59
+
60
+ setAttributeIfEmpty(this._caller, 'aria-haspopup', 'true')
61
+ setAttributeIfEmpty(this._caller, 'aria-controls', target)
62
+ setAttributeIfEmpty(this._host, 'role', 'menu')
63
+ setAttributeIfEmpty(this._host, 'aria-labelledby', target)
64
+ return caller
65
+ }
66
+
67
+ private readonly arrowInset = (
68
+ middleware: MiddlewareData,
69
+ arrowPosition: string,
70
+ ): { bottom?: string; left?: string; right?: string; top?: string } => {
71
+ const { arrow } = middleware
72
+ const inset = { bottom: '', left: '', right: '', top: '' }
73
+
74
+ if (arrow === undefined) {
75
+ return {}
76
+ }
77
+
78
+ switch (arrowPosition) {
79
+ case 'bottom':
80
+ inset.left = arrow.x !== null ? `${arrow.x}px` : ''
81
+ inset.top = '100%'
82
+ break
83
+ case 'left':
84
+ inset.right = '100%'
85
+ inset.top = arrow.y !== null ? `${arrow.y}px` : ''
86
+ break
87
+ case 'right':
88
+ inset.left = '100%'
89
+ inset.top = arrow.y !== null ? `${arrow.y}px` : ''
90
+ break
91
+ case 'top':
92
+ inset.left = arrow.x !== null ? `${arrow.x}px` : ''
93
+ inset.top = ''
94
+ break
95
+ default:
96
+ break
97
+ }
98
+ return inset
99
+ }
100
+
101
+ private readonly arrowTransform = (
102
+ arrowPosition: string,
103
+ ): { transform: string } => {
104
+ let transformProps = this._host.arrow && this._host.visible ? 'scale(1)' : 'scale(0)'
105
+ switch (arrowPosition) {
106
+ case 'bottom':
107
+ transformProps = `rotate(180deg) ${transformProps} translate(0, -100%)`
108
+ break
109
+ case 'left':
110
+ transformProps = `rotate(-90deg) ${transformProps} translate(50%, -50%)`
111
+ break
112
+ case 'right':
113
+ transformProps = `rotate(90deg) ${transformProps} translate(-50%, -50%)`
114
+ break
115
+ case 'top':
116
+ transformProps = `rotate(0deg) ${transformProps} translate(0, 0)`
117
+ break
118
+ default:
119
+ break
120
+ }
121
+ return { transform: transformProps }
122
+ }
123
+
124
+ private readonly arrowTransformOrigin = (
125
+ arrowPosition: string,
126
+ ): { transformOrigin: string } => {
127
+ switch (arrowPosition) {
128
+ case 'bottom':
129
+ return { transformOrigin: 'center top' }
130
+ case 'left':
131
+ return { transformOrigin: 'right center' }
132
+ case 'right':
133
+ return { transformOrigin: 'left center' }
134
+ case 'top':
135
+ return { transformOrigin: 'center bottom' }
136
+ default:
137
+ return { transformOrigin: 'center top' }
138
+ }
139
+ }
140
+
141
+ private readonly calculatePosition = (): void => {
142
+ if (!this._caller) return
143
+
144
+ const middleware: Middleware[] = new Array<Middleware>()
145
+ const config: { padding?: number } = {}
146
+
147
+ if (this._host.shiftPadding) {
148
+ config.padding = this._host.shiftPadding
149
+ }
150
+
151
+ if (this._host.autoPlacement) {
152
+ middleware.push(autoPlacement())
153
+ }
154
+
155
+ if (this._host.offset) {
156
+ middleware.push(offset(this._host.offset))
157
+ }
158
+
159
+ if (!this._host.autoPlacement && this._host.flip) {
160
+ middleware.push(flip(config))
161
+ }
162
+
163
+ if (this._host.shift) {
164
+ middleware.push(shift(config))
165
+ }
166
+
167
+ if (this.arrowEl && this._host.arrow) {
168
+ middleware.push(
169
+ arrow({
170
+ element: this.arrowEl,
171
+ padding: this._host.arrowPadding,
172
+ }),
173
+ )
174
+ }
175
+
176
+ computePosition(this._caller, this._host, {
177
+ middleware,
178
+ placement: this._host.placement,
179
+ strategy: this._host.strategy,
180
+ }).then(({ x, y, placement, middlewareData }) => {
181
+ Object.assign(this._host.style, {
182
+ left: `${x}px`,
183
+ top: `${y}px`,
184
+ })
185
+
186
+ const arrowStyle = {}
187
+ const arrowPosition = {
188
+ top: 'bottom',
189
+ right: 'left',
190
+ bottom: 'top',
191
+ left: 'right',
192
+ }[placement.split('-')[0]]
193
+
194
+ if (arrowPosition && this.arrowEl) {
195
+ Object.assign(arrowStyle, this.arrowTransform(arrowPosition))
196
+ Object.assign(
197
+ arrowStyle,
198
+ this.arrowInset(middlewareData, arrowPosition),
199
+ )
200
+ Object.assign(arrowStyle, this.arrowTransformOrigin(arrowPosition))
201
+ Object.assign(this.arrowEl.style, arrowStyle)
202
+ }
203
+ })
204
+ }
205
+
206
+ updatePosition (): void {
207
+ if (this.cleanupAutoUpdate) this.cleanupAutoUpdate()
208
+ this.cleanupAutoUpdate = autoUpdate(this._caller, this._host, this.calculatePosition)
209
+ }
210
+
211
+ dismiss (): void {
212
+ this.cleanupAutoUpdate()
213
+ }
214
+ }
215
+
216
+ export class Backdrop {
217
+ private readonly defaultBackdropId = 'mds-backdrop'
218
+ private readonly backdropBackgroundVisible = 'rgba(var(--magma-backdrop-color, 0 0 0) / var(--magma-backdrop-opacity, 0.1))'
219
+ private readonly backdropBackgroundHidden = 'rgba(var(--magma-backdrop-color, 0 0 0) / 0)'
220
+
221
+ private readonly backdropId
222
+ private readonly cssBackdropZIndex
223
+ private readonly cssBackdropDuration
224
+
225
+ private backdropEl: HTMLElement
226
+ private backdropTimer: NodeJS.Timeout
227
+
228
+ constructor (backdropId?: string) {
229
+ this.backdropId = backdropId ?? this.defaultBackdropId
230
+ this.cssBackdropZIndex = `var(--${this.backdropId}-z-index)`
231
+ this.cssBackdropDuration = `var(--${this.backdropId}-duration)`
232
+ }
233
+
234
+ attachBackdrop (): void {
235
+ if (!this.backdropEl) {
236
+ this.backdropEl = document.createElement('div')
237
+ this.backdropEl.className = this.backdropId
238
+ this.backdropEl.style.inset = '0'
239
+ this.backdropEl.style.pointerEvents = 'none'
240
+ this.backdropEl.style.position = 'fixed'
241
+ this.backdropEl.style.transition = `background-color ${this.cssBackdropDuration} ease-out`
242
+ this.backdropEl.style.zIndex = this.cssBackdropZIndex
243
+ }
244
+ this.backdropEl.style.backgroundColor = this.backdropBackgroundHidden
245
+ document.body.appendChild(this.backdropEl)
246
+
247
+ clearTimeout(this.backdropTimer)
248
+ this.backdropTimer = setTimeout(() => {
249
+ this.backdropEl.style.backgroundColor = this.backdropBackgroundVisible
250
+ }, 1)
251
+ }
252
+
253
+ detachBackdrop (): void {
254
+ if (!this.backdropEl) {
255
+ return
256
+ }
257
+ this.backdropEl.style.backgroundColor = 'transparent'
258
+ clearTimeout(this.backdropTimer)
259
+ this.backdropTimer = setTimeout(() => {
260
+ this.backdropEl.remove()
261
+ }, cssDurationToMilliseconds(this.cssBackdropDuration))
262
+ }
263
+ }
@@ -36,14 +36,14 @@ export class KeyboardManager {
36
36
 
37
37
  attachEscapeBehavior = (callback: () => void): void => {
38
38
  this.escapeCallback = callback
39
- if (window !== undefined) {
39
+ if (typeof window !== 'undefined') {
40
40
  window.addEventListener('keydown', this.handleEscapeBehaviorDispatchEvent.bind(this))
41
41
  }
42
42
  }
43
43
 
44
44
  detachEscapeBehavior = (): void => {
45
45
  this.escapeCallback = () => { return }
46
- if (window !== undefined) {
46
+ if (typeof window !== 'undefined') {
47
47
  window.removeEventListener('keydown', this.handleEscapeBehaviorDispatchEvent.bind(this))
48
48
  }
49
49
  }
@@ -0,0 +1,24 @@
1
+ const hasSlottedElements = (el: HTMLElement, name?: string): boolean => {
2
+ const query = name ? `slot[name="${name}"]` : 'slot:not([name])'
3
+
4
+ const slot: HTMLSlotElement = el.shadowRoot?.querySelector(query) as HTMLSlotElement
5
+ if (slot) {
6
+ return slot.assignedElements({ flatten: true }).length > 0
7
+ }
8
+ return false
9
+ }
10
+
11
+ const hasSlottedNodes = (el: HTMLElement, name?: string): boolean => {
12
+ const query = name ? `slot[name="${name}"]` : 'slot:not([name])'
13
+
14
+ const slot: HTMLSlotElement = el.shadowRoot?.querySelector(query) as HTMLSlotElement
15
+ if (slot) {
16
+ return slot.assignedNodes().length > 0
17
+ }
18
+ return false
19
+ }
20
+
21
+ export {
22
+ hasSlottedElements,
23
+ hasSlottedNodes,
24
+ }
@@ -0,0 +1,8 @@
1
+ const horizontalActionsAnimationDictionary = [
2
+ 'fade',
3
+ 'slide',
4
+ ]
5
+
6
+ export {
7
+ horizontalActionsAnimationDictionary,
8
+ }