@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.
Files changed (62) hide show
  1. package/dist/browser/index.js +638 -317
  2. package/dist/browser/index.js.map +4 -4
  3. package/dist/components/list/list.component.d.ts +1 -1
  4. package/dist/components/listitem/listitem.component.js +10 -3
  5. package/dist/components/menupopover/menupopover.component.js +2 -1
  6. package/dist/components/navitem/index.d.ts +11 -0
  7. package/dist/components/navitem/index.js +8 -0
  8. package/dist/components/navitem/navitem.component.d.ts +125 -0
  9. package/dist/components/navitem/navitem.component.js +251 -0
  10. package/dist/components/navitem/navitem.constants.d.ts +16 -0
  11. package/dist/components/navitem/navitem.constants.js +21 -0
  12. package/dist/components/navitem/navitem.styles.d.ts +2 -0
  13. package/dist/components/navitem/navitem.styles.js +146 -0
  14. package/dist/components/navitem/navitem.types.d.ts +11 -0
  15. package/dist/components/navitem/navitem.types.js +1 -0
  16. package/dist/components/navitemlist/index.d.ts +7 -0
  17. package/dist/components/navitemlist/index.js +4 -0
  18. package/dist/components/navitemlist/navitemlist.component.d.ts +51 -0
  19. package/dist/components/navitemlist/navitemlist.component.js +92 -0
  20. package/dist/components/navitemlist/navitemlist.constants.d.ts +2 -0
  21. package/dist/components/navitemlist/navitemlist.constants.js +3 -0
  22. package/dist/components/navitemlist/navitemlist.styles.d.ts +2 -0
  23. package/dist/components/navitemlist/navitemlist.styles.js +23 -0
  24. package/dist/components/sidenavigation/index.d.ts +10 -0
  25. package/dist/components/sidenavigation/index.js +7 -0
  26. package/dist/components/sidenavigation/sidenavigation.component.d.ts +144 -0
  27. package/dist/components/sidenavigation/sidenavigation.component.js +244 -0
  28. package/dist/components/sidenavigation/sidenavigation.constants.d.ts +11 -0
  29. package/dist/components/sidenavigation/sidenavigation.constants.js +12 -0
  30. package/dist/components/sidenavigation/sidenavigation.context.d.ts +15 -0
  31. package/dist/components/sidenavigation/sidenavigation.context.js +78 -0
  32. package/dist/components/sidenavigation/sidenavigation.styles.d.ts +2 -0
  33. package/dist/components/sidenavigation/sidenavigation.styles.js +68 -0
  34. package/dist/components/sidenavigation/sidenavigation.types.d.ts +7 -0
  35. package/dist/components/sidenavigation/sidenavigation.types.js +1 -0
  36. package/dist/components/skeleton/index.d.ts +7 -0
  37. package/dist/components/skeleton/index.js +4 -0
  38. package/dist/components/skeleton/skeleton.component.d.ts +46 -0
  39. package/dist/components/skeleton/skeleton.component.js +86 -0
  40. package/dist/components/skeleton/skeleton.constants.d.ts +11 -0
  41. package/dist/components/skeleton/skeleton.constants.js +12 -0
  42. package/dist/components/skeleton/skeleton.styles.d.ts +2 -0
  43. package/dist/components/skeleton/skeleton.styles.js +40 -0
  44. package/dist/components/skeleton/skeleton.types.d.ts +4 -0
  45. package/dist/components/skeleton/skeleton.types.js +1 -0
  46. package/dist/custom-elements.json +3766 -1696
  47. package/dist/index.d.ts +9 -3
  48. package/dist/index.js +7 -2
  49. package/dist/react/index.d.ts +7 -3
  50. package/dist/react/index.js +7 -3
  51. package/dist/react/navitem/index.d.ts +43 -0
  52. package/dist/react/navitem/index.js +51 -0
  53. package/dist/react/navitemlist/index.d.ts +13 -0
  54. package/dist/react/navitemlist/index.js +22 -0
  55. package/dist/react/sidenavigation/index.d.ts +56 -0
  56. package/dist/react/sidenavigation/index.js +64 -0
  57. package/dist/react/skeleton/index.d.ts +25 -0
  58. package/dist/react/skeleton/index.js +34 -0
  59. package/dist/utils/mixins/MenuMixin.js +39 -14
  60. package/dist/utils/roles.d.ts +1 -0
  61. package/dist/utils/roles.js +1 -0
  62. 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,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -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,7 @@
1
+ import type { ValueOf } from '../../utils/types';
2
+ import { VARIANTS } from './sidenavigation.constants';
3
+ type SideNavigationVariant = ValueOf<typeof VARIANTS>;
4
+ interface Events {
5
+ onActiveChangeEvent: Event;
6
+ }
7
+ export type { SideNavigationVariant, Events };
@@ -0,0 +1,7 @@
1
+ import Skeleton from './skeleton.component';
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ ['mdc-skeleton']: Skeleton;
5
+ }
6
+ }
7
+ export default Skeleton;
@@ -0,0 +1,4 @@
1
+ import Skeleton from './skeleton.component';
2
+ import { TAG_NAME } from './skeleton.constants';
3
+ Skeleton.register(TAG_NAME);
4
+ export default Skeleton;
@@ -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,2 @@
1
+ declare const styles: import("lit").CSSResult;
2
+ export default styles;
@@ -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,4 @@
1
+ import type { ValueOf } from '../../utils/types';
2
+ import { SKELETON_VARIANTS } from './skeleton.constants';
3
+ type SkeletonVariant = ValueOf<typeof SKELETON_VARIANTS>;
4
+ export type { SkeletonVariant };
@@ -0,0 +1 @@
1
+ export {};