@maggioli-design-system/mds-input-tip 1.2.1 → 1.2.3
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/dist/cjs/{index-442db91d.js → index-66d8bb25.js} +143 -58
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/mds-input-tip.cjs.entry.js +7 -1
- package/dist/cjs/mds-input-tip.cjs.js +2 -2
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/common/aria.js +17 -1
- package/dist/collection/common/device.js +6 -0
- package/dist/collection/common/floating-controller.js +180 -0
- package/dist/collection/common/keyboard-manager.js +2 -2
- package/dist/collection/common/slot.js +19 -0
- package/dist/collection/components/mds-input-tip/mds-input-tip.js +10 -0
- package/dist/collection/dictionary/animation.js +5 -0
- package/dist/collection/dictionary/file-extensions.js +61 -56
- package/dist/collection/dictionary/text.js +60 -1
- package/dist/collection/dictionary/tree.js +13 -0
- package/dist/collection/fixtures/filenames.js +62 -1
- package/dist/collection/type/animation.js +1 -0
- package/dist/collection/type/tree.js +1 -0
- package/dist/collection/type/variant-file-format.js +5 -0
- package/dist/components/mds-input-tip.js +6 -0
- package/dist/documentation.d.ts +8 -0
- package/dist/documentation.json +8 -4
- package/dist/esm/{index-8fed469d.js → index-4e431d49.js} +143 -58
- package/dist/esm/loader.js +2 -2
- package/dist/esm/mds-input-tip.entry.js +7 -1
- package/dist/esm/mds-input-tip.js +3 -3
- package/dist/esm-es5/index-4e431d49.js +1 -0
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/mds-input-tip.entry.js +1 -1
- package/dist/esm-es5/mds-input-tip.js +1 -1
- package/dist/mds-input-tip/mds-input-tip.esm.js +1 -1
- package/dist/mds-input-tip/mds-input-tip.js +1 -1
- package/dist/mds-input-tip/{p-4486a5e4.entry.js → p-3bf85392.entry.js} +1 -1
- package/dist/mds-input-tip/{p-fadf816e.system.entry.js → p-5c7f52a4.system.entry.js} +1 -1
- package/dist/mds-input-tip/p-7eeec96b.system.js +2 -0
- package/dist/mds-input-tip/p-b8376582.js +2 -0
- package/dist/mds-input-tip/{p-c915dfb3.system.js → p-c7ede63a.system.js} +1 -1
- package/dist/stats.json +62 -36
- package/dist/types/common/aria.d.ts +3 -1
- package/dist/types/common/device.d.ts +2 -0
- package/dist/types/common/floating-controller.d.ts +46 -0
- package/dist/types/common/slot.d.ts +3 -0
- package/dist/types/dictionary/animation.d.ts +2 -0
- package/dist/types/dictionary/text.d.ts +3 -1
- package/dist/types/dictionary/tree.d.ts +4 -0
- package/dist/types/fixtures/filenames.d.ts +62 -1
- package/dist/types/type/animation.d.ts +1 -0
- package/dist/types/type/file-types.d.ts +1 -1
- package/dist/types/type/text.d.ts +2 -0
- package/dist/types/type/tree.d.ts +3 -0
- package/dist/types/type/variant-file-format.d.ts +1 -1
- package/documentation.json +57 -18
- package/package.json +4 -4
- package/src/common/aria.ts +22 -2
- package/src/common/device.ts +9 -0
- package/src/common/floating-controller.ts +263 -0
- package/src/common/keyboard-manager.ts +2 -2
- package/src/common/slot.ts +24 -0
- package/src/dictionary/animation.ts +8 -0
- package/src/dictionary/file-extensions.ts +61 -56
- package/src/dictionary/text.ts +64 -0
- package/src/dictionary/tree.ts +21 -0
- package/src/fixtures/filenames.ts +63 -0
- package/src/fixtures/icons.json +29 -0
- package/src/fixtures/iconsauce.json +11 -0
- package/src/meta/file-format/locale.el.json +44 -0
- package/src/meta/file-format/locale.en.json +44 -0
- package/src/meta/file-format/locale.es.json +44 -0
- package/src/meta/file-format/locale.it.json +44 -0
- package/src/type/animation.ts +3 -0
- package/src/type/file-types.ts +6 -0
- package/src/type/text.ts +59 -0
- package/src/type/tree.ts +12 -0
- package/src/type/variant-file-format.ts +6 -0
- package/www/build/mds-input-tip.esm.js +1 -1
- package/www/build/mds-input-tip.js +1 -1
- package/www/build/{p-4486a5e4.entry.js → p-3bf85392.entry.js} +1 -1
- package/www/build/{p-fadf816e.system.entry.js → p-5c7f52a4.system.entry.js} +1 -1
- package/www/build/p-7eeec96b.system.js +2 -0
- package/www/build/p-b8376582.js +2 -0
- package/www/build/{p-c915dfb3.system.js → p-c7ede63a.system.js} +1 -1
- package/dist/esm-es5/index-8fed469d.js +0 -1
- package/dist/mds-input-tip/p-37c61f56.system.js +0 -2
- package/dist/mds-input-tip/p-3e967425.js +0 -2
- package/www/build/p-37c61f56.system.js +0 -2
- package/www/build/p-3e967425.js +0 -2
package/documentation.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"timestamp": "
|
|
2
|
+
"timestamp": "2025-02-06T07:52:44",
|
|
3
3
|
"compiler": {
|
|
4
4
|
"name": "@stencil/core",
|
|
5
|
-
"version": "4.
|
|
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 | '
|
|
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/
|
|
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/
|
|
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.
|
|
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.
|
|
28
|
-
"@maggioli-design-system/styles": "15.
|
|
29
|
-
"@stencil/core": "4.
|
|
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": {
|
package/src/common/aria.ts
CHANGED
|
@@ -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
|
+
}
|