@momentum-design/components 0.80.4 → 0.81.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +638 -317
- package/dist/browser/index.js.map +4 -4
- package/dist/components/list/list.component.d.ts +1 -1
- package/dist/components/listitem/listitem.component.js +10 -3
- package/dist/components/menupopover/menupopover.component.js +2 -1
- package/dist/components/navitem/index.d.ts +11 -0
- package/dist/components/navitem/index.js +8 -0
- package/dist/components/navitem/navitem.component.d.ts +125 -0
- package/dist/components/navitem/navitem.component.js +251 -0
- package/dist/components/navitem/navitem.constants.d.ts +16 -0
- package/dist/components/navitem/navitem.constants.js +21 -0
- package/dist/components/navitem/navitem.styles.d.ts +2 -0
- package/dist/components/navitem/navitem.styles.js +146 -0
- package/dist/components/navitem/navitem.types.d.ts +11 -0
- package/dist/components/navitem/navitem.types.js +1 -0
- package/dist/components/navitemlist/index.d.ts +7 -0
- package/dist/components/navitemlist/index.js +4 -0
- package/dist/components/navitemlist/navitemlist.component.d.ts +51 -0
- package/dist/components/navitemlist/navitemlist.component.js +92 -0
- package/dist/components/navitemlist/navitemlist.constants.d.ts +2 -0
- package/dist/components/navitemlist/navitemlist.constants.js +3 -0
- package/dist/components/navitemlist/navitemlist.styles.d.ts +2 -0
- package/dist/components/navitemlist/navitemlist.styles.js +23 -0
- package/dist/components/sidenavigation/index.d.ts +10 -0
- package/dist/components/sidenavigation/index.js +7 -0
- package/dist/components/sidenavigation/sidenavigation.component.d.ts +144 -0
- package/dist/components/sidenavigation/sidenavigation.component.js +244 -0
- package/dist/components/sidenavigation/sidenavigation.constants.d.ts +11 -0
- package/dist/components/sidenavigation/sidenavigation.constants.js +12 -0
- package/dist/components/sidenavigation/sidenavigation.context.d.ts +15 -0
- package/dist/components/sidenavigation/sidenavigation.context.js +78 -0
- package/dist/components/sidenavigation/sidenavigation.styles.d.ts +2 -0
- package/dist/components/sidenavigation/sidenavigation.styles.js +68 -0
- package/dist/components/sidenavigation/sidenavigation.types.d.ts +7 -0
- package/dist/components/sidenavigation/sidenavigation.types.js +1 -0
- package/dist/components/skeleton/index.d.ts +7 -0
- package/dist/components/skeleton/index.js +4 -0
- package/dist/components/skeleton/skeleton.component.d.ts +46 -0
- package/dist/components/skeleton/skeleton.component.js +86 -0
- package/dist/components/skeleton/skeleton.constants.d.ts +11 -0
- package/dist/components/skeleton/skeleton.constants.js +12 -0
- package/dist/components/skeleton/skeleton.styles.d.ts +2 -0
- package/dist/components/skeleton/skeleton.styles.js +40 -0
- package/dist/components/skeleton/skeleton.types.d.ts +4 -0
- package/dist/components/skeleton/skeleton.types.js +1 -0
- package/dist/custom-elements.json +3766 -1696
- package/dist/index.d.ts +9 -3
- package/dist/index.js +7 -2
- package/dist/react/index.d.ts +7 -3
- package/dist/react/index.js +7 -3
- package/dist/react/navitem/index.d.ts +43 -0
- package/dist/react/navitem/index.js +51 -0
- package/dist/react/navitemlist/index.d.ts +13 -0
- package/dist/react/navitemlist/index.js +22 -0
- package/dist/react/sidenavigation/index.d.ts +56 -0
- package/dist/react/sidenavigation/index.js +64 -0
- package/dist/react/skeleton/index.d.ts +25 -0
- package/dist/react/skeleton/index.js +34 -0
- package/dist/utils/mixins/MenuMixin.js +39 -14
- package/dist/utils/roles.d.ts +1 -0
- package/dist/utils/roles.js +1 -0
- package/package.json +1 -1
@@ -0,0 +1,78 @@
|
|
1
|
+
import { createContext } from '@lit/context';
|
2
|
+
import { TAG_NAME as MENUPOPOVER_TAGNAME } from '../menupopover/menupopover.constants';
|
3
|
+
import { TAG_NAME as NAVITEM_TAGNAME } from '../navitem/navitem.constants';
|
4
|
+
import { POPOVER_PLACEMENT } from '../popover/popover.constants';
|
5
|
+
import { TAG_NAME } from './sidenavigation.constants';
|
6
|
+
class SideNavigationContext {
|
7
|
+
constructor(defaultVariant, defaultExpanded, defaultParentNavTooltipText) {
|
8
|
+
this.variant = defaultVariant;
|
9
|
+
this.expanded = defaultExpanded;
|
10
|
+
this.parentNavTooltipText = defaultParentNavTooltipText;
|
11
|
+
}
|
12
|
+
hasSiblingWithTriggerId(navItem) {
|
13
|
+
var _a, _b;
|
14
|
+
const id = navItem === null || navItem === void 0 ? void 0 : navItem.getAttribute('id');
|
15
|
+
if (!id)
|
16
|
+
return false;
|
17
|
+
const siblings = Array.from((_b = (_a = navItem === null || navItem === void 0 ? void 0 : navItem.parentElement) === null || _a === void 0 ? void 0 : _a.children) !== null && _b !== void 0 ? _b : []);
|
18
|
+
return siblings.some((sibling) => sibling !== navItem
|
19
|
+
&& sibling.tagName.toLowerCase() === MENUPOPOVER_TAGNAME
|
20
|
+
&& sibling.getAttribute('triggerid') === id);
|
21
|
+
}
|
22
|
+
getParentNavItems(navItem) {
|
23
|
+
if (!navItem)
|
24
|
+
return [];
|
25
|
+
const parents = [];
|
26
|
+
let current = navItem;
|
27
|
+
while (current) {
|
28
|
+
// Walk up to find the menupopover
|
29
|
+
const popover = current === null || current === void 0 ? void 0 : current.closest(MENUPOPOVER_TAGNAME);
|
30
|
+
if (!popover)
|
31
|
+
break;
|
32
|
+
const triggerId = popover.getAttribute('triggerid');
|
33
|
+
if (!triggerId)
|
34
|
+
break;
|
35
|
+
// Find the NavItem that triggered this menupopover
|
36
|
+
const triggeringNavItem = document.getElementById(triggerId);
|
37
|
+
if (triggeringNavItem && triggeringNavItem.tagName.toLowerCase() === NAVITEM_TAGNAME) {
|
38
|
+
parents.push(triggeringNavItem);
|
39
|
+
current = triggeringNavItem;
|
40
|
+
}
|
41
|
+
else {
|
42
|
+
break;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
return parents;
|
46
|
+
}
|
47
|
+
setCurrentActiveNavItem(navItem) {
|
48
|
+
var _a;
|
49
|
+
const isSameItem = ((_a = this.currentActiveNavItem) === null || _a === void 0 ? void 0 : _a.navId) === (navItem === null || navItem === void 0 ? void 0 : navItem.navId);
|
50
|
+
const shouldSkip = (navItem === null || navItem === void 0 ? void 0 : navItem.disableAriaCurrent) || this.hasSiblingWithTriggerId(navItem);
|
51
|
+
if (isSameItem || shouldSkip)
|
52
|
+
return;
|
53
|
+
// Clean up previous active item
|
54
|
+
if (this.currentActiveNavItem) {
|
55
|
+
this.currentActiveNavItem.removeAttribute('aria-current');
|
56
|
+
this.currentActiveNavItem.removeAttribute('active');
|
57
|
+
const previousParents = this.getParentNavItems(this.currentActiveNavItem);
|
58
|
+
previousParents.forEach((parent) => {
|
59
|
+
parent.removeAttribute('tooltip-text');
|
60
|
+
parent.removeAttribute('active');
|
61
|
+
});
|
62
|
+
}
|
63
|
+
// Apply attributes to new active item
|
64
|
+
if (!navItem)
|
65
|
+
return;
|
66
|
+
this.currentActiveNavItem = navItem;
|
67
|
+
navItem.setAttribute('aria-current', 'page');
|
68
|
+
navItem.setAttribute('active', '');
|
69
|
+
const newParents = this.getParentNavItems(navItem);
|
70
|
+
newParents.forEach((parent) => {
|
71
|
+
parent.setAttribute('tooltip-text', this.parentNavTooltipText || '');
|
72
|
+
parent.setAttribute('tooltip-placement', POPOVER_PLACEMENT.BOTTOM);
|
73
|
+
parent.setAttribute('active', '');
|
74
|
+
});
|
75
|
+
}
|
76
|
+
}
|
77
|
+
SideNavigationContext.context = createContext(TAG_NAME);
|
78
|
+
export default SideNavigationContext;
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import { css } from 'lit';
|
2
|
+
const styles = css `
|
3
|
+
:host {
|
4
|
+
--mdc-sidenavigation-expanded-width: 15rem;
|
5
|
+
--mdc-sidenavigation-collapsed-width: 4.5rem;
|
6
|
+
|
7
|
+
display: flex;
|
8
|
+
height: 100%;
|
9
|
+
}
|
10
|
+
|
11
|
+
:host([expanded]) {
|
12
|
+
width: var(--mdc-sidenavigation-expanded-width);
|
13
|
+
}
|
14
|
+
|
15
|
+
:host(:not([expanded])) {
|
16
|
+
width: var(--mdc-sidenavigation-collapsed-width);
|
17
|
+
}
|
18
|
+
|
19
|
+
:host::part(side-navigation-container) {
|
20
|
+
display: flex;
|
21
|
+
flex-direction: column;
|
22
|
+
width: 100%;
|
23
|
+
}
|
24
|
+
|
25
|
+
:host::part(scrollable-section) {
|
26
|
+
flex-grow: 1;
|
27
|
+
overflow: auto;
|
28
|
+
padding: 1rem 0;
|
29
|
+
min-height: 0;
|
30
|
+
}
|
31
|
+
|
32
|
+
:host::part(fixed-section) {
|
33
|
+
flex-shrink: 0;
|
34
|
+
display: flex;
|
35
|
+
flex-direction: column;
|
36
|
+
align-items: flex-start;
|
37
|
+
padding-bottom: 1rem;
|
38
|
+
gap: 0.5rem;
|
39
|
+
}
|
40
|
+
|
41
|
+
:host::part(brand-logo-container) {
|
42
|
+
display: flex;
|
43
|
+
align-items: center;
|
44
|
+
width: 100%;
|
45
|
+
gap: 0.5rem;
|
46
|
+
border-radius: 1.25rem;
|
47
|
+
}
|
48
|
+
|
49
|
+
:host(:dir(ltr))::part(brand-logo-container) {
|
50
|
+
padding: 0.5rem 0rem 0.5rem 1.5rem;
|
51
|
+
}
|
52
|
+
|
53
|
+
:host(:dir(rtl))::part(brand-logo-container) {
|
54
|
+
padding: 0.5rem 1.5rem 0.5rem 0rem;
|
55
|
+
}
|
56
|
+
|
57
|
+
::slotted([slot="brand-logo"]) {
|
58
|
+
width: 1.5rem;
|
59
|
+
height: 1.5rem;
|
60
|
+
flex-shrink: 0;
|
61
|
+
aspect-ratio: 1 / 1;
|
62
|
+
}
|
63
|
+
|
64
|
+
:host::part(separator) {
|
65
|
+
margin-bottom: 0.75rem;
|
66
|
+
}
|
67
|
+
`;
|
68
|
+
export default [styles];
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import type { PropertyValues } from 'lit';
|
2
|
+
import { CSSResult } from 'lit';
|
3
|
+
import { Component } from '../../models';
|
4
|
+
import type { SkeletonVariant } from './skeleton.types';
|
5
|
+
/**
|
6
|
+
* `mdc-skeleton` is a component that shows a grey placeholder area.
|
7
|
+
* It provides visual feedback to users that content is being loaded.
|
8
|
+
*
|
9
|
+
* **Skeleton Variants:**
|
10
|
+
* - **rectangular**: Default variant with 0.25rem border radius
|
11
|
+
* - **rounded**: Has 0.5rem border radius
|
12
|
+
* - **circular**: Has 50% border radius for circular shapes
|
13
|
+
* - **button**: Optimized for button placeholders with 1.25rem border radius
|
14
|
+
*
|
15
|
+
* **Sizing Behavior:**
|
16
|
+
* 1. If wrapping content, takes dimensions of wrapped content
|
17
|
+
* 2. Otherwise grows to fill parent container
|
18
|
+
*
|
19
|
+
* @tagname mdc-skeleton
|
20
|
+
*
|
21
|
+
* @slot - Content to wrap (optional). When provided, skeleton takes dimensions of this content.
|
22
|
+
*
|
23
|
+
* @cssproperty --mdc-skeleton-background-color - background color of the skeleton
|
24
|
+
* @cssproperty --mdc-skeleton-height - height of the skeleton
|
25
|
+
* @cssproperty --mdc-skeleton-width - width of the skeleton
|
26
|
+
*/
|
27
|
+
declare class Skeleton extends Component {
|
28
|
+
/**
|
29
|
+
* The variant of skeleton to display
|
30
|
+
* - **rectangular**: Default rectangular shape with 0.25rem border radius
|
31
|
+
* - **rounded**: Rounded rectangle with 0.5rem border radius
|
32
|
+
* - **circular**: Circular shape with 50% border radius
|
33
|
+
* - **button**: Button placeholder with 1.25rem border radius
|
34
|
+
* @default rectangular
|
35
|
+
*/
|
36
|
+
variant: SkeletonVariant;
|
37
|
+
/**
|
38
|
+
* Styles associated with this component.
|
39
|
+
*/
|
40
|
+
static styles: Array<CSSResult>;
|
41
|
+
connectedCallback(): void;
|
42
|
+
protected firstUpdated(changedProperties: PropertyValues): void;
|
43
|
+
private checkSlotContent;
|
44
|
+
protected render(): import("lit-html").TemplateResult<1>;
|
45
|
+
}
|
46
|
+
export default Skeleton;
|
@@ -0,0 +1,86 @@
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
6
|
+
};
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
9
|
+
};
|
10
|
+
import { html } from 'lit';
|
11
|
+
import { property } from 'lit/decorators.js';
|
12
|
+
import { Component } from '../../models';
|
13
|
+
import { DEFAULTS } from './skeleton.constants';
|
14
|
+
import styles from './skeleton.styles';
|
15
|
+
/**
|
16
|
+
* `mdc-skeleton` is a component that shows a grey placeholder area.
|
17
|
+
* It provides visual feedback to users that content is being loaded.
|
18
|
+
*
|
19
|
+
* **Skeleton Variants:**
|
20
|
+
* - **rectangular**: Default variant with 0.25rem border radius
|
21
|
+
* - **rounded**: Has 0.5rem border radius
|
22
|
+
* - **circular**: Has 50% border radius for circular shapes
|
23
|
+
* - **button**: Optimized for button placeholders with 1.25rem border radius
|
24
|
+
*
|
25
|
+
* **Sizing Behavior:**
|
26
|
+
* 1. If wrapping content, takes dimensions of wrapped content
|
27
|
+
* 2. Otherwise grows to fill parent container
|
28
|
+
*
|
29
|
+
* @tagname mdc-skeleton
|
30
|
+
*
|
31
|
+
* @slot - Content to wrap (optional). When provided, skeleton takes dimensions of this content.
|
32
|
+
*
|
33
|
+
* @cssproperty --mdc-skeleton-background-color - background color of the skeleton
|
34
|
+
* @cssproperty --mdc-skeleton-height - height of the skeleton
|
35
|
+
* @cssproperty --mdc-skeleton-width - width of the skeleton
|
36
|
+
*/
|
37
|
+
class Skeleton extends Component {
|
38
|
+
constructor() {
|
39
|
+
super(...arguments);
|
40
|
+
/**
|
41
|
+
* The variant of skeleton to display
|
42
|
+
* - **rectangular**: Default rectangular shape with 0.25rem border radius
|
43
|
+
* - **rounded**: Rounded rectangle with 0.5rem border radius
|
44
|
+
* - **circular**: Circular shape with 50% border radius
|
45
|
+
* - **button**: Button placeholder with 1.25rem border radius
|
46
|
+
* @default rectangular
|
47
|
+
*/
|
48
|
+
this.variant = DEFAULTS.VARIANT;
|
49
|
+
}
|
50
|
+
connectedCallback() {
|
51
|
+
super.connectedCallback();
|
52
|
+
this.setAttribute('aria-hidden', 'true');
|
53
|
+
}
|
54
|
+
firstUpdated(changedProperties) {
|
55
|
+
super.firstUpdated(changedProperties);
|
56
|
+
this.checkSlotContent();
|
57
|
+
}
|
58
|
+
checkSlotContent() {
|
59
|
+
var _a;
|
60
|
+
const slot = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot');
|
61
|
+
if (slot) {
|
62
|
+
const hasContent = slot.assignedNodes().length > 0;
|
63
|
+
if (hasContent) {
|
64
|
+
this.setAttribute('has-content', '');
|
65
|
+
}
|
66
|
+
else {
|
67
|
+
this.removeAttribute('has-content');
|
68
|
+
}
|
69
|
+
}
|
70
|
+
}
|
71
|
+
render() {
|
72
|
+
return html `<slot @slotchange=${this.checkSlotContent}></slot>`;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
/**
|
76
|
+
* Styles associated with this component.
|
77
|
+
*/
|
78
|
+
Skeleton.styles = [
|
79
|
+
...Component.styles,
|
80
|
+
styles,
|
81
|
+
];
|
82
|
+
__decorate([
|
83
|
+
property({ type: String, reflect: true }),
|
84
|
+
__metadata("design:type", String)
|
85
|
+
], Skeleton.prototype, "variant", void 0);
|
86
|
+
export default Skeleton;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
declare const TAG_NAME: "mdc-skeleton";
|
2
|
+
declare const SKELETON_VARIANTS: {
|
3
|
+
readonly BUTTON: "button";
|
4
|
+
readonly CIRCULAR: "circular";
|
5
|
+
readonly RECTANGULAR: "rectangular";
|
6
|
+
readonly ROUNDED: "rounded";
|
7
|
+
};
|
8
|
+
declare const DEFAULTS: {
|
9
|
+
VARIANT: "rectangular";
|
10
|
+
};
|
11
|
+
export { TAG_NAME, SKELETON_VARIANTS, DEFAULTS, };
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import utils from '../../utils/tag-name';
|
2
|
+
const TAG_NAME = utils.constructTagName('skeleton');
|
3
|
+
const SKELETON_VARIANTS = {
|
4
|
+
BUTTON: 'button',
|
5
|
+
CIRCULAR: 'circular',
|
6
|
+
RECTANGULAR: 'rectangular',
|
7
|
+
ROUNDED: 'rounded',
|
8
|
+
};
|
9
|
+
const DEFAULTS = {
|
10
|
+
VARIANT: SKELETON_VARIANTS.RECTANGULAR,
|
11
|
+
};
|
12
|
+
export { TAG_NAME, SKELETON_VARIANTS, DEFAULTS, };
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import { css } from 'lit';
|
2
|
+
const styles = css `
|
3
|
+
:host {
|
4
|
+
--mdc-skeleton-background-color: var(--mds-color-theme-background-skeleton-normal);
|
5
|
+
--mdc-skeleton-height: 100%;
|
6
|
+
--mdc-skeleton-width: 100%;
|
7
|
+
display: block;
|
8
|
+
overflow: hidden;
|
9
|
+
background-color: var(--mdc-skeleton-background-color);
|
10
|
+
height: var(--mdc-skeleton-height);
|
11
|
+
width: var(--mdc-skeleton-width);
|
12
|
+
}
|
13
|
+
|
14
|
+
:host([variant="rectangular"]) {
|
15
|
+
border-radius: 0.25rem;
|
16
|
+
}
|
17
|
+
|
18
|
+
:host([variant="rounded"]) {
|
19
|
+
border-radius: 0.5rem;
|
20
|
+
}
|
21
|
+
|
22
|
+
:host([variant="circular"]) {
|
23
|
+
border-radius: 50%;
|
24
|
+
}
|
25
|
+
|
26
|
+
:host([variant="button"]) {
|
27
|
+
border-radius: 1.25rem;
|
28
|
+
}
|
29
|
+
|
30
|
+
/* When there's slotted content, fit to content size */
|
31
|
+
:host([has-content]) {
|
32
|
+
width: fit-content;
|
33
|
+
height: fit-content;
|
34
|
+
}
|
35
|
+
|
36
|
+
::slotted(*) {
|
37
|
+
visibility: hidden;
|
38
|
+
}
|
39
|
+
`;
|
40
|
+
export default styles;
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|