@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.
- 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
|
+
}
|