@covalent/components 0.0.0-COVALENT

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 (264) hide show
  1. package/.babelrc +10 -0
  2. package/.eslintrc.json +18 -0
  3. package/.storybook/main.js +34 -0
  4. package/.storybook/manager-head.html +62 -0
  5. package/.storybook/manager.js +1 -0
  6. package/.storybook/preview-head.html +20 -0
  7. package/.storybook/preview.js +20 -0
  8. package/README.md +179 -0
  9. package/component-config.json +313 -0
  10. package/index.html +288 -0
  11. package/jest.config.js +18 -0
  12. package/package.json +315 -0
  13. package/project.json +104 -0
  14. package/public/index.scss +1 -0
  15. package/public/reset.css +128 -0
  16. package/src/action-ribbon/_action-ribbon.theme.scss +90 -0
  17. package/src/action-ribbon/action-ribbon-base.ts +164 -0
  18. package/src/action-ribbon/action-ribbon.scss +20 -0
  19. package/src/action-ribbon/action-ribbon.spec.ts +11 -0
  20. package/src/action-ribbon/action-ribbon.stories.js +78 -0
  21. package/src/action-ribbon/action-ribbon.ts +26 -0
  22. package/src/alert/_alert.theme.scss +116 -0
  23. package/src/alert/alert-base.ts +175 -0
  24. package/src/alert/alert.scss +55 -0
  25. package/src/alert/alert.spec.ts +26 -0
  26. package/src/alert/alert.stories.js +76 -0
  27. package/src/alert/alert.ts +26 -0
  28. package/src/app-shell/app-shell.scss +387 -0
  29. package/src/app-shell/app-shell.stories.js +323 -0
  30. package/src/app-shell/app-shell.ts +388 -0
  31. package/src/badge/badge.scss +60 -0
  32. package/src/badge/badge.spec.ts +40 -0
  33. package/src/badge/badge.stories.js +88 -0
  34. package/src/badge/badge.ts +122 -0
  35. package/src/button/Overview.mdx +160 -0
  36. package/src/button/button.scss +28 -0
  37. package/src/button/button.spec.ts +11 -0
  38. package/src/button/button.stories.js +102 -0
  39. package/src/button/button.ts +17 -0
  40. package/src/card/card-base.ts +69 -0
  41. package/src/card/card.scss +45 -0
  42. package/src/card/card.spec.ts +11 -0
  43. package/src/card/card.ts +21 -0
  44. package/src/card/cards.stories.js +40 -0
  45. package/src/checkbox/checkbox.scss +8 -0
  46. package/src/checkbox/checkbox.spec.ts +11 -0
  47. package/src/checkbox/checkbox.stories.js +61 -0
  48. package/src/checkbox/checkbox.ts +18 -0
  49. package/src/chips/chip-base.ts +276 -0
  50. package/src/chips/chip-set-base.ts +184 -0
  51. package/src/chips/chip-set.scss +15 -0
  52. package/src/chips/chip-set.spec.ts +11 -0
  53. package/src/chips/chip-set.ts +27 -0
  54. package/src/chips/chip.scss +40 -0
  55. package/src/chips/chip.spec.ts +11 -0
  56. package/src/chips/chip.ts +26 -0
  57. package/src/chips/chips.stories.js +81 -0
  58. package/src/circular-progress/circular-progress.spec.ts +11 -0
  59. package/src/circular-progress/circular-progress.stories.js +40 -0
  60. package/src/circular-progress/circular-progress.ts +16 -0
  61. package/src/code-editor/code-editor.scss +20 -0
  62. package/src/code-editor/code-editor.spec.ts +11 -0
  63. package/src/code-editor/code-editor.stories.js +44 -0
  64. package/src/code-editor/code-editor.theme.ts +199 -0
  65. package/src/code-editor/code-editor.ts +231 -0
  66. package/src/code-snippet/code-snippet.scss +126 -0
  67. package/src/code-snippet/code-snippet.spec.ts +11 -0
  68. package/src/code-snippet/code-snippet.stories.js +134 -0
  69. package/src/code-snippet/code-snippet.ts +93 -0
  70. package/src/data-table/_data-table.theme.scss +39 -0
  71. package/src/data-table/data-table.stories.js +24 -0
  72. package/src/data-table/data-table.stories.scss +11 -0
  73. package/src/dialog/Overview.mdx +39 -0
  74. package/src/dialog/dialog.scss +17 -0
  75. package/src/dialog/dialog.spec.ts +11 -0
  76. package/src/dialog/dialog.stories.js +89 -0
  77. package/src/dialog/dialog.ts +44 -0
  78. package/src/drawer/drawer.scss +4 -0
  79. package/src/drawer/drawer.spec.ts +11 -0
  80. package/src/drawer/drawer.ts +18 -0
  81. package/src/empty-state/_empty-state.theme.scss +0 -0
  82. package/src/empty-state/empty-state.scss +67 -0
  83. package/src/empty-state/empty-state.spec.ts +11 -0
  84. package/src/empty-state/empty-state.stories.js +117 -0
  85. package/src/empty-state/empty-state.ts +61 -0
  86. package/src/expansion-panel/Overview.mdx +108 -0
  87. package/src/expansion-panel/expansion-panel-incorrect-example.png +0 -0
  88. package/src/expansion-panel/expansion-panel-item.scss +243 -0
  89. package/src/expansion-panel/expansion-panel-item.ts +95 -0
  90. package/src/expansion-panel/expansion-panel.spec.ts +11 -0
  91. package/src/expansion-panel/expansion-panel.stories.js +76 -0
  92. package/src/expansion-panel/expansion-panel.ts +94 -0
  93. package/src/focused-page/focused-page.scss +113 -0
  94. package/src/focused-page/focused-page.spec.ts +11 -0
  95. package/src/focused-page/focused-page.stories.js +167 -0
  96. package/src/focused-page/focused-page.ts +201 -0
  97. package/src/formfield/formfield.scss +8 -0
  98. package/src/formfield/formfield.spec.ts +11 -0
  99. package/src/formfield/formfield.ts +24 -0
  100. package/src/full-screen-dialog/full-screen-dialog.scss +37 -0
  101. package/src/full-screen-dialog/full-screen-dialog.spec.ts +11 -0
  102. package/src/full-screen-dialog/full-screen-dialog.stories.js +172 -0
  103. package/src/full-screen-dialog/full-screen-dialog.ts +84 -0
  104. package/src/icon/_icon-list.ts +316 -0
  105. package/src/icon/icon-demo.scss +25 -0
  106. package/src/icon/icon-demo.ts +37 -0
  107. package/src/icon/icon.spec.ts +11 -0
  108. package/src/icon/icon.stories.js +55 -0
  109. package/src/icon/icon.ts +16 -0
  110. package/src/icon-button/_icon-button.theme.scss +9 -0
  111. package/src/icon-button/icon-button.scss +12 -0
  112. package/src/icon-button/icon-button.spec.ts +11 -0
  113. package/src/icon-button/icon-button.stories.js +24 -0
  114. package/src/icon-button/icon-button.ts +19 -0
  115. package/src/icon-button-toggle/icon-button-toggle.scss +19 -0
  116. package/src/icon-button-toggle/icon-button-toggle.spec.ts +11 -0
  117. package/src/icon-button-toggle/icon-button-toggle.stories.js +32 -0
  118. package/src/icon-button-toggle/icon-button-toggle.ts +50 -0
  119. package/src/icon-checkbox/icon-check-toggle.ts +64 -0
  120. package/src/icon-checkbox/icon-check.spec.ts +11 -0
  121. package/src/icon-checkbox/icon-checkbox.scss +95 -0
  122. package/src/icon-checkbox/icon-checkbox.stories.js +77 -0
  123. package/src/icon-lockup/icon-lockup.scss +47 -0
  124. package/src/icon-lockup/icon-lockup.spec.ts +11 -0
  125. package/src/icon-lockup/icon-lockup.stories.js +93 -0
  126. package/src/icon-lockup/icon-lockup.ts +125 -0
  127. package/src/icon-radio/icon-radio-toggle.ts +43 -0
  128. package/src/icon-radio/icon-radio.scss +63 -0
  129. package/src/icon-radio/icon-radio.spec.ts +11 -0
  130. package/src/icon-radio/icon-radio.stories.js +23 -0
  131. package/src/index.scss +1 -0
  132. package/src/index.ts +57 -0
  133. package/src/linear-progress/linear-progress.scss +4 -0
  134. package/src/linear-progress/linear-progress.spec.ts +11 -0
  135. package/src/linear-progress/linear-progress.stories.js +43 -0
  136. package/src/linear-progress/linear-progress.ts +18 -0
  137. package/src/list/Overview.mdx +91 -0
  138. package/src/list/_list.theme.scss +100 -0
  139. package/src/list/check-list-item.spec.ts +11 -0
  140. package/src/list/check-list-item.ts +25 -0
  141. package/src/list/list-item.scss +56 -0
  142. package/src/list/list-item.spec.ts +11 -0
  143. package/src/list/list-item.ts +31 -0
  144. package/src/list/list.scss +25 -0
  145. package/src/list/list.stories.js +120 -0
  146. package/src/list/list.ts +23 -0
  147. package/src/list/nav-list-item.scss +159 -0
  148. package/src/list/nav-list-item.ts +223 -0
  149. package/src/list/radio-list-item.ts +25 -0
  150. package/src/menu/menu.scss +3 -0
  151. package/src/menu/menu.spec.ts +11 -0
  152. package/src/menu/menu.stories.js +110 -0
  153. package/src/menu/menu.ts +23 -0
  154. package/src/notebook-cell/notebook-cell.scss +185 -0
  155. package/src/notebook-cell/notebook-cell.spec.ts +11 -0
  156. package/src/notebook-cell/notebook-cell.stories.js +87 -0
  157. package/src/notebook-cell/notebook-cell.ts +300 -0
  158. package/src/radio/radio.scss +3 -0
  159. package/src/radio/radio.spec.ts +11 -0
  160. package/src/radio/radio.stories.js +56 -0
  161. package/src/radio/radio.ts +18 -0
  162. package/src/select/select.scss +16 -0
  163. package/src/select/select.spec.ts +11 -0
  164. package/src/select/select.stories.js +57 -0
  165. package/src/select/select.ts +18 -0
  166. package/src/side-sheet/side-sheet.scss +49 -0
  167. package/src/side-sheet/side-sheet.spec.ts +11 -0
  168. package/src/side-sheet/side-sheet.stories.js +96 -0
  169. package/src/side-sheet/side-sheet.ts +37 -0
  170. package/src/skeleton/_skeleton.styles.scss +24 -0
  171. package/src/skeleton/skeleton.stories.js +77 -0
  172. package/src/slider/slider-range.ts +16 -0
  173. package/src/slider/slider.spec.ts +11 -0
  174. package/src/slider/slider.stories.js +54 -0
  175. package/src/slider/slider.ts +16 -0
  176. package/src/snackbar/snackbar.scss +8 -0
  177. package/src/snackbar/snackbar.spec.ts +11 -0
  178. package/src/snackbar/snackbar.stories.js +42 -0
  179. package/src/snackbar/snackbar.ts +18 -0
  180. package/src/status-dialog/status-dialog.scss +204 -0
  181. package/src/status-dialog/status-dialog.spec.ts +48 -0
  182. package/src/status-dialog/status-dialog.stories.js +136 -0
  183. package/src/status-dialog/status-dialog.ts +188 -0
  184. package/src/status-header/_status-header.theme.scss +79 -0
  185. package/src/status-header/status-header-base.ts +42 -0
  186. package/src/status-header/status-header-item.scss +17 -0
  187. package/src/status-header/status-header-item.spec.ts +11 -0
  188. package/src/status-header/status-header-item.ts +32 -0
  189. package/src/status-header/status-header.scss +57 -0
  190. package/src/status-header/status-header.spec.ts +11 -0
  191. package/src/status-header/status-header.stories.js +114 -0
  192. package/src/status-header/status-header.ts +26 -0
  193. package/src/switch/switch.scss +17 -0
  194. package/src/switch/switch.spec.ts +11 -0
  195. package/src/switch/switch.stories.js +41 -0
  196. package/src/switch/switch.ts +18 -0
  197. package/src/tab/Overview.mdx +38 -0
  198. package/src/tab/tab-bar.spec.ts +11 -0
  199. package/src/tab/tab-bar.ts +16 -0
  200. package/src/tab/tab.scss +10 -0
  201. package/src/tab/tab.spec.ts +11 -0
  202. package/src/tab/tab.stories.js +30 -0
  203. package/src/tab/tab.ts +18 -0
  204. package/src/text-lockup/text-lockup.scss +66 -0
  205. package/src/text-lockup/text-lockup.spec.ts +11 -0
  206. package/src/text-lockup/text-lockup.stories.js +67 -0
  207. package/src/text-lockup/text-lockup.ts +55 -0
  208. package/src/textarea/textarea.spec.ts +11 -0
  209. package/src/textarea/textarea.stories.js +39 -0
  210. package/src/textarea/textarea.ts +19 -0
  211. package/src/textfield/textfield.scss +34 -0
  212. package/src/textfield/textfield.spec.ts +11 -0
  213. package/src/textfield/textfield.stories.js +60 -0
  214. package/src/textfield/textfield.ts +25 -0
  215. package/src/theme/_index.scss +46 -0
  216. package/src/theme/prebuilt/dark-theme.scss +17 -0
  217. package/src/theme/prebuilt/light-theme.scss +17 -0
  218. package/src/toolbar/toolbar.scss +37 -0
  219. package/src/toolbar/toolbar.spec.ts +11 -0
  220. package/src/toolbar/toolbar.stories.js +66 -0
  221. package/src/toolbar/toolbar.ts +27 -0
  222. package/src/tooltip/tooltip.scss +16 -0
  223. package/src/tooltip/tooltip.spec.ts +11 -0
  224. package/src/tooltip/tooltip.stories.js +72 -0
  225. package/src/tooltip/tooltip.ts +185 -0
  226. package/src/top-app-bar/top-app-bar-fixed.ts +23 -0
  227. package/src/top-app-bar/top-app-bar.scss +14 -0
  228. package/src/top-app-bar/top-app-bar.spec.ts +11 -0
  229. package/src/top-app-bar/top-app-bar.stories.js +41 -0
  230. package/src/top-app-bar/top-app-bar.ts +23 -0
  231. package/src/tree-list/tree-list-item.scss +96 -0
  232. package/src/tree-list/tree-list-item.spec.ts +11 -0
  233. package/src/tree-list/tree-list-item.ts +87 -0
  234. package/src/tree-list/tree-list.scss +13 -0
  235. package/src/tree-list/tree-list.spec.ts +11 -0
  236. package/src/tree-list/tree-list.stories.js +151 -0
  237. package/src/tree-list/tree-list.ts +53 -0
  238. package/src/typography/typography.scss +45 -0
  239. package/src/typography/typography.spec.ts +11 -0
  240. package/src/typography/typography.stories.js +23 -0
  241. package/src/typography/typography.ts +27 -0
  242. package/stories/Introduction.mdx +47 -0
  243. package/stories/color-use.mdx +509 -0
  244. package/stories/demos/dialog.component.html +187 -0
  245. package/stories/demos/dialog.component.js +57 -0
  246. package/stories/demos/grid.content.html +99 -0
  247. package/stories/demos/lorem-ipsum.content.html +338 -0
  248. package/stories/demos/material-web.content.html +2125 -0
  249. package/stories/demos/table-column-sorting.content.html +92 -0
  250. package/stories/demos/table-pagination.content.html +139 -0
  251. package/stories/demos/table-progress-indicator.content.html +77 -0
  252. package/stories/demos/table-row-selection.content.html +219 -0
  253. package/stories/demos/table.content.html +64 -0
  254. package/stories/demos/top-app-bar.component.js +57 -0
  255. package/stories/guide-representing-state.mdx +282 -0
  256. package/stories/info-and-help.mdx +484 -0
  257. package/stories/item-detail-and-editing.mdx +529 -0
  258. package/stories/markdown-elements.mdx +194 -0
  259. package/stories/writing-and-naming.mdx +157 -0
  260. package/tsconfig.json +34 -0
  261. package/tsconfig.lib.json +17 -0
  262. package/tsconfig.spec.json +14 -0
  263. package/types.d.ts +15 -0
  264. package/vite.config.js +58 -0
@@ -0,0 +1,185 @@
1
+ import { css, html, LitElement, PropertyValues, unsafeCSS } from 'lit';
2
+ import { customElement, property, query } from 'lit/decorators.js';
3
+ import { addHasRemoveClass } from '@material/mwc-base/base-element';
4
+ import { MDCTooltipAdapter, events } from '@material/tooltip';
5
+ import { MDCTooltipFoundation } from '@material/tooltip/foundation';
6
+ import styles from './tooltip.scss?inline';
7
+
8
+ declare global {
9
+ interface HTMLElementTagNameMap {
10
+ 'cv-tooltip': CovalentTooltip;
11
+ }
12
+ }
13
+
14
+ @customElement('cv-tooltip')
15
+ export class CovalentTooltip extends LitElement {
16
+ protected mdcFoundation!: MDCTooltipFoundation;
17
+ protected readonly mdcFoundationClass = MDCTooltipFoundation;
18
+ static override styles = [
19
+ css`
20
+ ${unsafeCSS(styles)}
21
+ `,
22
+ ];
23
+
24
+ @query('.mdc-tooltip') protected mdcRoot!: HTMLElement;
25
+ @query('.mdc-tooltip__surface') protected mdcSurface!: HTMLElement;
26
+
27
+ @property({ type: Object }) anchor?: HTMLElement;
28
+ @property() richTitle?: string;
29
+ @property({ type: Boolean, reflect: true }) rich?: boolean;
30
+ @property({ type: Boolean, reflect: true }) persistent?: HTMLElement;
31
+ @property({ type: Number }) showDelay?: number;
32
+ @property({ type: Number }) hideDelay?: number;
33
+
34
+ protected createAdapter(): MDCTooltipAdapter {
35
+ return {
36
+ ...addHasRemoveClass(this.mdcRoot),
37
+ getAttribute: (attr: string) => this.mdcRoot.getAttribute(attr),
38
+ setAttribute: (attr: string, value: string) =>
39
+ this.mdcRoot.setAttribute(attr, value),
40
+ removeAttribute: (attr: string) => this.mdcRoot.removeAttribute(attr),
41
+ getComputedStyleProperty: (propertyName: string) =>
42
+ getComputedStyle(this.mdcRoot, propertyName).cssText,
43
+ setStyleProperty: (propertyName: string, value: string) =>
44
+ this.mdcRoot.style.setProperty(propertyName, value),
45
+ setSurfaceAnimationStyleProperty: (propertyName: string, value: string) =>
46
+ this.mdcSurface.style.setProperty(propertyName, value),
47
+ getViewportWidth: () =>
48
+ Math.max(
49
+ document.documentElement.clientWidth || 0,
50
+ window.innerWidth || 0
51
+ ),
52
+ getViewportHeight: () =>
53
+ Math.max(
54
+ document.documentElement.clientHeight || 0,
55
+ window.innerHeight || 0
56
+ ),
57
+ getTooltipSize: () =>
58
+ Object.assign({
59
+ width: this.mdcRoot.clientWidth,
60
+ height: this.mdcRoot.clientHeight,
61
+ }),
62
+ getTooltipCaretBoundingRect: () => this.mdcRoot.getBoundingClientRect() ?? null,
63
+ getAnchorBoundingRect: () => this.anchor?.getBoundingClientRect() ?? null,
64
+ getParentBoundingRect: () =>
65
+ this.renderRoot.getRootNode().parentElement?.getBoundingClientRect() ??
66
+ null,
67
+ getAnchorAttribute: (attr: string) =>
68
+ this.anchor?.getAttribute(attr) ?? null,
69
+ setAnchorAttribute: (attr: string, value: string) =>
70
+ this.anchor?.setAttribute(attr, value),
71
+ isRTL: () => false,
72
+ isInstanceOfElement:(eventTarget: EventTarget | null) => eventTarget instanceof Element,
73
+ anchorContainsElement: (element: HTMLElement) =>
74
+ this.anchor?.contains(element) ?? false,
75
+ tooltipContainsElement: (element: HTMLElement) => this.contains(element),
76
+ focusAnchorElement: () => this.anchor?.focus(),
77
+ registerEventHandler: (evtType, handler) =>
78
+ this.mdcRoot?.addEventListener(evtType, handler),
79
+ deregisterEventHandler: (evtType, handler) =>
80
+ this.mdcRoot?.removeEventListener(evtType, handler),
81
+ registerAnchorEventHandler: (evtType, handler) =>
82
+ this.anchor?.addEventListener(evtType, handler),
83
+ deregisterAnchorEventHandler: (evtType, handler) =>
84
+ this.anchor?.removeEventListener(evtType, handler),
85
+ registerDocumentEventHandler: (evtType, handler) =>
86
+ document.addEventListener(evtType, handler),
87
+ deregisterDocumentEventHandler: (evtType, handler) =>
88
+ document.removeEventListener(evtType, handler),
89
+ registerWindowEventHandler: (evtType, handler) =>
90
+ window.addEventListener(evtType, handler),
91
+ deregisterWindowEventHandler: (evtType, handler) =>
92
+ window.removeEventListener(evtType, handler),
93
+ notifyHidden: () => this.dispatchEvent(new Event(events.HIDDEN)),
94
+ notifyShown: () => this.dispatchEvent(new Event(events.SHOWN)),
95
+ setTooltipCaretStyle: () => {
96
+ //
97
+ },
98
+ clearTooltipCaretStyles: () => {
99
+ //
100
+ },
101
+ getActiveElement: () => document.activeElement,
102
+ };
103
+ }
104
+
105
+ protected updated(changedProps: PropertyValues): void {
106
+ super.updated(changedProps);
107
+ if (this.showDelay !== undefined && !isNaN(this.showDelay)) {
108
+ this.mdcFoundation.setShowDelay(this.showDelay);
109
+ }
110
+
111
+ if (this.hideDelay !== undefined && !isNaN(this.hideDelay)) {
112
+ this.mdcFoundation.setHideDelay(this.hideDelay);
113
+ }
114
+ }
115
+
116
+ protected override async firstUpdated() {
117
+ if (this.mdcFoundation !== undefined) {
118
+ this.mdcFoundation.destroy();
119
+ }
120
+ this.mdcFoundation = new this.mdcFoundationClass(this.createAdapter());
121
+
122
+ this.anchor?.addEventListener('click', () =>
123
+ this.mdcFoundation.handleAnchorClick()
124
+ );
125
+ this.anchor?.addEventListener('mouseenter', () =>
126
+ this.mdcFoundation.handleAnchorMouseEnter()
127
+ );
128
+ this.anchor?.addEventListener('touchstart', () =>
129
+ this.mdcFoundation.handleAnchorTouchstart()
130
+ );
131
+
132
+ if (!this.persistent) {
133
+ this.anchor?.addEventListener('mouseleave', () =>
134
+ this.mdcFoundation.handleAnchorMouseLeave()
135
+ );
136
+ this.anchor?.addEventListener('touchend', () =>
137
+ this.mdcFoundation.handleAnchorTouchend()
138
+ );
139
+ }
140
+ }
141
+
142
+ disconnectedCallback(): void {
143
+ super.connectedCallback();
144
+ this.anchor?.removeEventListener('click', () =>
145
+ this.mdcFoundation.handleAnchorClick()
146
+ );
147
+ this.anchor?.removeEventListener('mouseenter', () =>
148
+ this.mdcFoundation.handleAnchorMouseEnter()
149
+ );
150
+ this.anchor?.removeEventListener('mouseleave', () =>
151
+ this.mdcFoundation.handleAnchorMouseLeave()
152
+ );
153
+ this.anchor?.removeEventListener('touchstart', () =>
154
+ this.mdcFoundation.handleAnchorTouchstart()
155
+ );
156
+ this.anchor?.removeEventListener('touchend', () =>
157
+ this.mdcFoundation.handleAnchorTouchend()
158
+ );
159
+ }
160
+
161
+ override render() {
162
+ return html`
163
+ <div
164
+ class="mdc-tooltip ${this.rich ? 'mdc-tooltip--rich' : ''}"
165
+ role="tooltip"
166
+ aria-hidden="true"
167
+ data-mdc-tooltip-persistent="true"
168
+ >
169
+ <div class="mdc-tooltip__surface mdc-tooltip__surface-animation">
170
+ ${this.rich
171
+ ? html`<div class="mdc-tooltip__title">${this.richTitle}</div>
172
+ <div class="mdc-tooltip__content">
173
+ <slot></slot>
174
+ </div>
175
+ <div class="mdc-tooltip--rich-actions">
176
+ <slot name="actionItems"></slot>
177
+ </div>`
178
+ : html`<slot></slot>`}
179
+ </div>
180
+ </div>
181
+ `;
182
+ }
183
+ }
184
+
185
+ export default CovalentTooltip;
@@ -0,0 +1,23 @@
1
+ import { css, unsafeCSS } from 'lit';
2
+ import { customElement } from 'lit/decorators.js';
3
+ import { TopAppBarFixedBase } from '@material/mwc-top-app-bar-fixed/mwc-top-app-bar-fixed-base';
4
+ import { styles } from '@material/mwc-top-app-bar/mwc-top-app-bar.css';
5
+ import baseStyles from './top-app-bar.scss?inline';
6
+
7
+ declare global {
8
+ interface HTMLElementTagNameMap {
9
+ 'cv-top-app-bar-fixed': CovalentTopAppBarFixed;
10
+ }
11
+ }
12
+
13
+ @customElement('cv-top-app-bar-fixed')
14
+ export class CovalentTopAppBarFixed extends TopAppBarFixedBase {
15
+ static override styles = [
16
+ styles,
17
+ css`
18
+ ${unsafeCSS(baseStyles)}
19
+ `,
20
+ ];
21
+ }
22
+
23
+ export default CovalentTopAppBarFixed;
@@ -0,0 +1,14 @@
1
+ :host {
2
+ --mdc-theme-primary: var(--mdc-theme-surface);
3
+ --mdc-theme-on-primary: var(--mdc-theme-text-primary-on-background);
4
+
5
+ ::slotted(cv-button) {
6
+ --mdc-theme-primary: var(--mdc-theme-primary);
7
+ --mdc-theme-on-primary: var(--mdc-theme-on-primary);
8
+ }
9
+ }
10
+
11
+ .mdc-top-app-bar {
12
+ background: var(--mdc-theme-surface);
13
+ color: var(--mdc-theme-on-surface);
14
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { it, describe, expect } from 'vitest';
5
+ import { CovalentTopAppBar } from './top-app-bar';
6
+
7
+ describe('Top app bar', () => {
8
+ it('should work', () => {
9
+ expect(new CovalentTopAppBar()).toBeDefined();
10
+ });
11
+ });
@@ -0,0 +1,41 @@
1
+ import './top-app-bar';
2
+ import './top-app-bar-fixed';
3
+ import topAppBarComponent from '../../stories/demos/top-app-bar.component';
4
+ import '../data-table/data-table.stories.scss';
5
+
6
+ export default {
7
+ title: 'Components/Top App Bar',
8
+ argTypes: {
9
+ showContent: {
10
+ options: ['table', 'tableWithSelection', 'loremIpsum'],
11
+ control: { type: 'radio' },
12
+ },
13
+ showActionItems: {
14
+ options: ['buttons', 'icons'],
15
+ control: { type: 'radio' },
16
+ },
17
+ },
18
+ args: {
19
+ centerTitle: false,
20
+ dense: false,
21
+ prominent: false,
22
+ showContent: 'table',
23
+ showActionItems: 'icons',
24
+ },
25
+ parameters: {
26
+ layout: 'fullscreen',
27
+ },
28
+ };
29
+
30
+ export const Basic = topAppBarComponent.bind({});
31
+ Basic.args = {};
32
+
33
+ export const BasicWithButtons = topAppBarComponent.bind({});
34
+ BasicWithButtons.args = {
35
+ showActionItems: 'buttons',
36
+ };
37
+
38
+ export const Fixed = topAppBarComponent.bind({});
39
+ Fixed.parameters = {
40
+ fixed: true,
41
+ };
@@ -0,0 +1,23 @@
1
+ import { css, unsafeCSS } from 'lit';
2
+ import { customElement } from 'lit/decorators.js';
3
+ import { TopAppBarBase } from '@material/mwc-top-app-bar/mwc-top-app-bar-base';
4
+ import { styles } from '@material/mwc-top-app-bar/mwc-top-app-bar.css';
5
+ import baseStyles from './top-app-bar.scss?inline';
6
+
7
+ declare global {
8
+ interface HTMLElementTagNameMap {
9
+ 'cv-top-app-bar': CovalentTopAppBar;
10
+ }
11
+ }
12
+
13
+ @customElement('cv-top-app-bar')
14
+ export class CovalentTopAppBar extends TopAppBarBase {
15
+ static override styles = [
16
+ styles,
17
+ css`
18
+ ${unsafeCSS(baseStyles)}
19
+ `,
20
+ ];
21
+ }
22
+
23
+ export default CovalentTopAppBar;
@@ -0,0 +1,96 @@
1
+ @use '@material/ripple';
2
+
3
+ .mdc-ripple-surface {
4
+ @include ripple.surface;
5
+ @include ripple.radius-bounded(50%);
6
+ @include ripple.states;
7
+ }
8
+
9
+ .mdc-ripple-surface::after,
10
+ .mdc-ripple-surface::before {
11
+ border-radius: 0 16px 16px 0;
12
+ }
13
+
14
+ .itemContent {
15
+ // .itemContent is a div so its width will be the width of its parent.
16
+ padding: 0 32px 0 var(--indent);
17
+ margin-right: 16px;
18
+ }
19
+
20
+ .itemContent:hover {
21
+ cursor: pointer;
22
+ background-color: var(--mdc-theme-surface-neutral-highlight-hover);
23
+ border-radius: 0 16px 16px 0;
24
+ }
25
+
26
+ .selected {
27
+ background-color: var(--mdc-theme-surface-primary-highlight);
28
+ color: var(--mdc-theme-primary);
29
+ border-radius: 0 16px 16px 0;
30
+ }
31
+
32
+ .selected:hover {
33
+ background-color: var(--mdc-theme-surface-primary-highlight-hover);
34
+ }
35
+
36
+ .mainContent {
37
+ display: flex;
38
+ flex-direction: row;
39
+ padding: 4px 0;
40
+ }
41
+
42
+ [name='label']::slotted(*) {
43
+ font-family: var(--mdc-typography-body1-font-family);
44
+ font-size: var(--mdc-typography-body1-font-size);
45
+ font-weight: var(--mdc-typography-body1-font-weight);
46
+ line-height: var(--mdc-typography-body1-line-height);
47
+ letter-spacing: 0.25px;
48
+ padding-left: 16px;
49
+ }
50
+
51
+ [name='extraContent']::slotted(*) {
52
+ padding-left: 64px;
53
+ padding-bottom: 4px;
54
+ margin-top: -4px;
55
+ letter-spacing: 0.4px;
56
+ color: var(--mdc-theme-text-secondary-on-background);
57
+ font-family: var(--mdc-typography-caption-font-family);
58
+ font-size: var(--mdc-typography-caption-font-size);
59
+ font-weight: var(--mdc-typography-caption-font-weight);
60
+ line-height: var(--mdc-typography-caption-line-height);
61
+ }
62
+
63
+ .hidden {
64
+ display: none;
65
+ }
66
+
67
+ .visible {
68
+ display: flex;
69
+ flex-direction: column;
70
+ }
71
+
72
+ .endOfNest {
73
+ padding: 8px;
74
+ padding-left: calc(var(--indent) + 20px);
75
+ letter-spacing: 0.4px;
76
+ user-select: none;
77
+ color: var(--mdc-theme-text-disabled-on-background);
78
+ font-family: var(--mdc-typography-caption-font-family);
79
+ font-size: var(--mdc-typography-caption-font-size);
80
+ font-weight: var(--mdc-typography-caption-font-weight);
81
+ line-height: var(--mdc-typography-caption-line-height);
82
+ }
83
+
84
+ .arrowIcon {
85
+ color: var(--mdc-theme-text-primary-on-background);
86
+ }
87
+
88
+ .open {
89
+ transition: transform 100ms ease-out;
90
+ transform: rotate(90deg);
91
+ }
92
+
93
+ .close {
94
+ transition: transform 100ms ease-in;
95
+ transform: rotate(0deg);
96
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { it, describe, expect } from 'vitest';
5
+ import { CovalentTreeListItem } from './tree-list-item';
6
+
7
+ describe('Tree list item', () => {
8
+ it('should work', () => {
9
+ expect(new CovalentTreeListItem()).toBeDefined();
10
+ });
11
+ });
@@ -0,0 +1,87 @@
1
+ import { css, html, LitElement, unsafeCSS } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+ import { classMap } from 'lit/directives/class-map.js';
4
+ import styles from './tree-list-item.scss?inline';
5
+
6
+ import '../icon/icon';
7
+
8
+ declare global {
9
+ interface HTMLElementTagNameMap {
10
+ 'cv-tree-list-item': CovalentTreeListItem;
11
+ }
12
+ }
13
+
14
+ @customElement('cv-tree-list-item')
15
+ export class CovalentTreeListItem extends LitElement {
16
+ static override styles = [
17
+ css`
18
+ ${unsafeCSS(styles)}
19
+ `,
20
+ ];
21
+ // Check if a list item is open.
22
+ @property({ type: Boolean }) isOpen = false;
23
+ // Optional icon for each list item.
24
+ @property({ type: String }) icon = '';
25
+ // Indicates which nest level a list item is at.
26
+ @property({ type: Number }) indentLevel = 0;
27
+ // How much left padding (px) to add for nested elements.
28
+ @property({ type: Number }) indentMultiple = 16;
29
+ override render() {
30
+ // Class map for showing/hiding an item's content.
31
+ const classes = {
32
+ hidden: !this.isOpen,
33
+ visible: this.isOpen,
34
+ };
35
+ // Class map for animating the arrows.
36
+ const animation = {
37
+ open: this.isOpen,
38
+ close: !this.isOpen,
39
+ };
40
+ const arrowIcon = 'arrow_right';
41
+ const icon = html`<cv-icon>${this.icon}</cv-icon>`;
42
+ const arrow = html`<cv-icon class="${classMap(animation)} arrowIcon"
43
+ >${arrowIcon}</cv-icon
44
+ >`;
45
+
46
+ // The nest slot should only take cv-tree-list-item components. Otherwise use default value and display "No results".
47
+ return html`
48
+ <div
49
+ class="itemContent mdc-ripple-surface"
50
+ @click="${this._handleClick}"
51
+ style="--indent:${this.indentLevel * this.indentMultiple + 8}px"
52
+ >
53
+ <div class="mainContent">
54
+ ${arrow} ${icon}
55
+ <slot name="label"></slot>
56
+ </div>
57
+ <slot name="extraContent"></slot>
58
+ </div>
59
+ <slot name="nest" class="${classMap(classes)}">
60
+ <div
61
+ class="endOfNest"
62
+ style="--indent:${this.indentLevel * this.indentMultiple +
63
+ this.indentMultiple}px"
64
+ >
65
+ No results
66
+ </div>
67
+ </slot>
68
+ `;
69
+ }
70
+ private _handleClick() {
71
+ // Toggles the dropdown for a list item.
72
+ this.isOpen = !this.isOpen;
73
+
74
+ // Create and emit the select event; the tree-list component is listening for this.
75
+ const event = new CustomEvent('select', {
76
+ detail: {
77
+ message: `Emitting an event from ${this}`,
78
+ },
79
+ // bubbles and composed are required in order to allow custom event to pass through shadow DOM boundary to cv-tree-list.
80
+ bubbles: true,
81
+ composed: true,
82
+ });
83
+ this.dispatchEvent(event);
84
+ }
85
+ }
86
+
87
+ export default CovalentTreeListItem;
@@ -0,0 +1,13 @@
1
+ @use '@material/typography/mdc-typography';
2
+
3
+ .container {
4
+ overflow-x: auto;
5
+ }
6
+
7
+ .content {
8
+ color: var(--mdc-theme-text-primary-on-background);
9
+ // Inline-block width is based on children.
10
+ display: inline-block;
11
+ // Set the min-width to 100% so the menu items always extend edge to edge.
12
+ min-width: 100%;
13
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { it, describe, expect } from 'vitest';
5
+ import { CovalentTreeList } from './tree-list';
6
+
7
+ describe('Tree list', () => {
8
+ it('should work', () => {
9
+ expect(new CovalentTreeList()).toBeDefined();
10
+ });
11
+ });
@@ -0,0 +1,151 @@
1
+ import './tree-list';
2
+ import './tree-list-item';
3
+ export default {
4
+ title: 'Components/Tree List',
5
+ args: {
6
+ icon: 'description',
7
+ },
8
+ parameters: {
9
+ layout: 'centered',
10
+ },
11
+ };
12
+
13
+ export const TreeList = ({ icon }) => {
14
+ return `
15
+ <cv-tree-list>
16
+ <cv-tree-list-item icon="${icon}">
17
+ <div slot="label">PDCRAdmin</div>
18
+ </cv-tree-list-item>
19
+ <cv-tree-list-item icon="${icon}" isOpen="true">
20
+ <div slot="label">PDCRAdmin</div>
21
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="1">
22
+ <div slot="label">PDCRAdmin</div>
23
+ </cv-tree-list-item>
24
+ <cv-tree-list-item icon="${icon}" slot="nest" isOpen="true" indentLevel="1">
25
+ <div slot="label">PDCRAdmin</div>
26
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="2">
27
+ <div slot="label">PDCRAdmin</div>
28
+ </cv-tree-list-item>
29
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="2">
30
+ <div slot="label">PDCRAdmin</div>
31
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="3">
32
+ <div slot="label">PDCRAdmin</div>
33
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="4">
34
+ <div slot="label">PDCRAdmin</div>
35
+ </cv-tree-list-item>
36
+ </cv-tree-list-item>
37
+ </cv-tree-list-item>
38
+ </cv-tree-list-item>
39
+ </cv-tree-list-item>
40
+ <cv-tree-list-item icon="${icon}">
41
+ <div slot="label">PDCRAdmin</div>
42
+ </cv-tree-list-item>
43
+ <cv-tree-list-item icon="${icon}">
44
+ <div slot="label">PDCRAdmin</div>
45
+ </cv-tree-list-item>
46
+ </cv-tree-list>
47
+ `;
48
+ };
49
+
50
+ export const TwoLineItems = ({ icon }) => {
51
+ return `
52
+ <cv-tree-list>
53
+ <cv-tree-list-item icon="${icon}">
54
+ <div slot="label">PDCRAdmin</div>
55
+ </cv-tree-list-item>
56
+ <cv-tree-list-item icon="${icon}" isOpen="true">
57
+ <div slot="label">PDCRAdmin</div>
58
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="1">
59
+ <div slot="label">PDCRAdmin</div>
60
+ </cv-tree-list-item>
61
+ <cv-tree-list-item icon="${icon}" slot="nest" isOpen="true" indentLevel="1">
62
+ <div slot="label">PDCRAdmin</div>
63
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="2">
64
+ <div slot="label">PDCRAdmin</div>
65
+ <div slot="extraContent">VARCHAR(8)</div>
66
+ </cv-tree-list-item>
67
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="2">
68
+ <div slot="label">PDCRAdmin</div>
69
+ <div slot="extraContent">VARCHAR(8)</div>
70
+ </cv-tree-list-item>
71
+ </cv-tree-list-item>
72
+ </cv-tree-list-item>
73
+ <cv-tree-list-item icon="${icon}">
74
+ <div slot="label">PDCRAdmin</div>
75
+ </cv-tree-list-item>
76
+ <cv-tree-list-item icon="${icon}">
77
+ <div slot="label">PDCRAdmin</div>
78
+ </cv-tree-list-item>
79
+ </cv-tree-list>
80
+ `;
81
+ };
82
+
83
+ export const EmptyState = ({ icon }) => {
84
+ return `
85
+ <cv-tree-list>
86
+ <cv-tree-list-item icon="${icon}">
87
+ <div slot="label">PDCRAdmin</div>
88
+ </cv-tree-list-item>
89
+ <cv-tree-list-item icon="${icon}" isOpen="true">
90
+ <div slot="label">PDCRAdmin</div>
91
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="1">
92
+ <div slot="label">PDCRAdmin</div>
93
+ </cv-tree-list-item>
94
+ <cv-tree-list-item icon="${icon}" slot="nest" isOpen="true" indentLevel="1">
95
+ <div slot="label">PDCRAdmin</div>
96
+ <cv-tree-list-item icon="${icon}" slot="nest" isOpen="true" indentLevel="2">
97
+ <div slot="label">PDCRAdmin</div>
98
+ </cv-tree-list-item>
99
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="2">
100
+ <div slot="label">PDCRAdmin</div>
101
+ </cv-tree-list-item>
102
+ </cv-tree-list-item>
103
+ </cv-tree-list-item>
104
+ <cv-tree-list-item icon="${icon}">
105
+ <div slot="label">PDCRAdmin</div>
106
+ </cv-tree-list-item>
107
+ <cv-tree-list-item icon="${icon}">
108
+ <div slot="label">PDCRAdmin</div>
109
+ </cv-tree-list-item>
110
+ </cv-tree-list>
111
+ `;
112
+ };
113
+ // Putting the tree list into a container that has a set width.
114
+ export const OverflowTest = ({ icon }) => {
115
+ return `
116
+ <div style="width: 300px; border-left: solid white 1px; border-right: solid white 1px">
117
+ <cv-tree-list>
118
+ <cv-tree-list-item icon="${icon}">
119
+ <div slot="label">PDCRAdmin</div>
120
+ </cv-tree-list-item>
121
+ <cv-tree-list-item icon="${icon}">
122
+ <div slot="label">PDCRAdmin</div>
123
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="1">
124
+ <div slot="label">PDCRAdmin</div>
125
+ </cv-tree-list-item>
126
+ <cv-tree-list-item icon="${icon}" slot="nest" isOpen="true" indentLevel="1">
127
+ <div slot="label">PDCRAdmin</div>
128
+ <cv-tree-list-item icon="${icon}" slot="nest" indentLevel="2">
129
+ <div slot="label">PDCRAdmin</div>
130
+ </cv-tree-list-item>
131
+ <cv-tree-list-item icon="${icon}" slot="nest" isOpen="true" indentLevel="2">
132
+ <div slot="label">PDCRAdmin</div>
133
+ <cv-tree-list-item icon="${icon}" slot="nest" isOpen="true" indentLevel="3">
134
+ <div slot="label">PDCRAdmin</div>
135
+ <cv-tree-list-item icon="${icon}" slot="nest" isOpen="true" indentLevel="4">
136
+ <div slot="label">AReallyLongLabelAReallyLongLabelAReallyLongLabelAReallyLongLabelAReallyLongLabelAReallyLongLabelAReallyLongLabel</div>
137
+ </cv-tree-list-item>
138
+ </cv-tree-list-item>
139
+ </cv-tree-list-item>
140
+ </cv-tree-list-item>
141
+ </cv-tree-list-item>
142
+ <cv-tree-list-item icon="${icon}">
143
+ <div slot="label">PDCRAdmin</div>
144
+ </cv-tree-list-item>
145
+ <cv-tree-list-item icon="${icon}">
146
+ <div slot="label">PDCRAdmin</div>
147
+ </cv-tree-list-item>
148
+ </cv-tree-list>
149
+ </div>
150
+ `;
151
+ };