@salesforcedevs/dx-components 0.19.3 → 0.21.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/package.json +2 -2
- package/src/modules/dx/cardEvent/cardEvent.css +0 -4
- package/src/modules/dx/cardEvent/cardEvent.html +2 -1
- package/src/modules/dx/cardEvent/cardEvent.stories.ts +1 -0
- package/src/modules/dx/cardEvent/cardEvent.ts +2 -2
- package/src/modules/dx/codeBlock/codeBlock.ts +1 -1
- package/src/modules/dx/input/input.css +1 -0
- package/src/modules/dx/sidebarSearch/__tests__/mockPreloadedState.ts +938 -930
- package/src/modules/dx/sidebarSearch/__tests__/sidebarSearch.test.ts +74 -15
- package/src/modules/dx/sidebarSearch/sidebarSearch.ts +4 -0
- package/src/modules/dx/treeTile/treeTile.html +1 -1
- package/src/modules/dx/typeBadge/__tests__/typeBadge.test.ts +43 -29
- package/src/modules/dx/typeBadge/typeBadge.css +46 -31
- package/src/modules/dx/typeBadge/typeBadge.html +1 -1
- package/src/modules/dx/typeBadge/typeBadge.stories.ts +68 -33
- package/src/modules/dx/typeBadge/typeBadge.ts +51 -7
- package/src/modules/utils/css/css.ts +41 -0
|
@@ -3,6 +3,8 @@ import SidebarSearch from "dx/sidebarSearch";
|
|
|
3
3
|
import { createRenderComponent, renderLightningElement } from "utils/tests";
|
|
4
4
|
import { coveoXMLDocsConfig } from "utils/coveo";
|
|
5
5
|
import { mockQueryParameter, unmockQueryParameter } from "utils/jest";
|
|
6
|
+
import { SESSION_KEY } from "dx/sidebarSearch";
|
|
7
|
+
import mockPreloadedState from "./mockPreloadedState";
|
|
6
8
|
|
|
7
9
|
const TAG = "dx-sidebar-search";
|
|
8
10
|
const render = createRenderComponent(TAG, SidebarSearch);
|
|
@@ -11,8 +13,40 @@ const PROPS = coveoXMLDocsConfig;
|
|
|
11
13
|
const QUERY = "test";
|
|
12
14
|
|
|
13
15
|
describe(TAG, () => {
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
window.sessionStorage.clear();
|
|
18
|
+
jest.restoreAllMocks();
|
|
19
|
+
});
|
|
14
20
|
afterEach(unmockQueryParameter);
|
|
15
21
|
|
|
22
|
+
it("correctly sets coveo advanced configuration", () => {
|
|
23
|
+
const element = render(PROPS);
|
|
24
|
+
|
|
25
|
+
element.coveoAdvancedQueryConfig = JSON.stringify(
|
|
26
|
+
coveoXMLDocsConfig.coveoAdvancedQueryConfig
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
expect(element.coveoAdvancedQueryConfig).toEqual(
|
|
30
|
+
coveoXMLDocsConfig.coveoAdvancedQueryConfig
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
return expect(element).toBeAccessible();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("calls dispatchOnChangeEvent with empty query", () => {
|
|
37
|
+
const element = render(PROPS);
|
|
38
|
+
|
|
39
|
+
const mockOnChange = jest.fn();
|
|
40
|
+
|
|
41
|
+
element.addEventListener("change", mockOnChange);
|
|
42
|
+
|
|
43
|
+
element.setInputValue("reference");
|
|
44
|
+
element.setInputValue("");
|
|
45
|
+
|
|
46
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
47
|
+
return expect(element).toBeAccessible();
|
|
48
|
+
});
|
|
49
|
+
|
|
16
50
|
it("renders with the correct initial empty query", () => {
|
|
17
51
|
const element = render(PROPS);
|
|
18
52
|
|
|
@@ -90,24 +124,49 @@ describe(TAG, () => {
|
|
|
90
124
|
);
|
|
91
125
|
});
|
|
92
126
|
});
|
|
93
|
-
});
|
|
94
127
|
|
|
95
|
-
|
|
96
|
-
|
|
128
|
+
it("correctly consumes a valid session storage object", () => {
|
|
129
|
+
mockQueryParameter(mockPreloadedState.state.query.q);
|
|
97
130
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
131
|
+
window.sessionStorage.setItem(
|
|
132
|
+
SESSION_KEY,
|
|
133
|
+
JSON.stringify(mockPreloadedState)
|
|
134
|
+
);
|
|
102
135
|
|
|
103
|
-
|
|
136
|
+
const element = render(PROPS);
|
|
137
|
+
|
|
138
|
+
expect(window.sessionStorage.getItem(SESSION_KEY)).not.toBeNull();
|
|
139
|
+
|
|
140
|
+
expect(element).toBeAccessible();
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it("ignores and deletes a session storage object if query and config don't match", () => {
|
|
144
|
+
mockQueryParameter("test");
|
|
145
|
+
|
|
146
|
+
window.sessionStorage.setItem(
|
|
147
|
+
SESSION_KEY,
|
|
148
|
+
JSON.stringify(mockPreloadedState)
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
const element = render(PROPS);
|
|
104
152
|
|
|
105
|
-
|
|
106
|
-
// element.addEventListener("change", mockOnChange);
|
|
153
|
+
expect(window.sessionStorage.getItem(SESSION_KEY)).toBeNull();
|
|
107
154
|
|
|
108
|
-
|
|
109
|
-
|
|
155
|
+
expect(element).toBeAccessible();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it("ignores and deletes a session storage object on incorrect config", () => {
|
|
159
|
+
mockQueryParameter(mockPreloadedState.state.query.q);
|
|
160
|
+
|
|
161
|
+
window.sessionStorage.setItem(
|
|
162
|
+
SESSION_KEY,
|
|
163
|
+
JSON.stringify({ state: { query: { q: "test" } } })
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const element = render(PROPS);
|
|
167
|
+
|
|
168
|
+
expect(window.sessionStorage.getItem(SESSION_KEY)).toBeNull();
|
|
110
169
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
170
|
+
expect(element).toBeAccessible();
|
|
171
|
+
});
|
|
172
|
+
});
|
|
@@ -125,6 +125,7 @@ export default class SidebarSearch extends LightningElement {
|
|
|
125
125
|
renderedCallback() {
|
|
126
126
|
// in prod some of the critical coveo configuration attributes seem to arrive later
|
|
127
127
|
// so I needed to put this coveo startup flow here where we can wait for them to arrive
|
|
128
|
+
|
|
128
129
|
if (this.hasCorrectCoveoConfig && !this.engine) {
|
|
129
130
|
this.initializeUserSession();
|
|
130
131
|
this.initializeCoveo();
|
|
@@ -151,12 +152,14 @@ export default class SidebarSearch extends LightningElement {
|
|
|
151
152
|
|
|
152
153
|
private initializeUserSession() {
|
|
153
154
|
const stringified = window.sessionStorage.getItem(SESSION_KEY);
|
|
155
|
+
|
|
154
156
|
if (!stringified) {
|
|
155
157
|
return;
|
|
156
158
|
}
|
|
157
159
|
|
|
158
160
|
try {
|
|
159
161
|
const json = JSON.parse(stringified);
|
|
162
|
+
|
|
160
163
|
const hasSameConfig = Object.entries(
|
|
161
164
|
json.coveoAdvancedQueryConfig
|
|
162
165
|
).every(
|
|
@@ -164,6 +167,7 @@ export default class SidebarSearch extends LightningElement {
|
|
|
164
167
|
this.coveoAdvancedQueryConfig[key] === value
|
|
165
168
|
);
|
|
166
169
|
const hasSameQuery = json?.state?.query?.q === this.value;
|
|
170
|
+
|
|
167
171
|
if (hasSameConfig && hasSameQuery) {
|
|
168
172
|
this.preloadedState = json?.state;
|
|
169
173
|
} else {
|
|
@@ -1,63 +1,77 @@
|
|
|
1
1
|
import TypeBadge from "dx/typeBadge";
|
|
2
2
|
import { createRenderComponent } from "utils/tests";
|
|
3
|
+
import { TypeBadgeSize, BadgeType } from "typings/custom";
|
|
3
4
|
|
|
4
5
|
const TAG = "dx-type-badge";
|
|
5
6
|
const render = createRenderComponent(TAG, TypeBadge);
|
|
6
7
|
|
|
7
8
|
const value = "banana";
|
|
8
9
|
|
|
10
|
+
const assertContainerClasses = (
|
|
11
|
+
container: HTMLElement,
|
|
12
|
+
type: BadgeType = "metadata",
|
|
13
|
+
size: TypeBadgeSize = "default"
|
|
14
|
+
) => {
|
|
15
|
+
expect(container).not.toBeNull();
|
|
16
|
+
expect(container.classList).toHaveLength(3);
|
|
17
|
+
expect(container.classList).toContain("typebadge");
|
|
18
|
+
expect(container.classList).toContain(`typebadge_${type}`);
|
|
19
|
+
expect(container.classList).toContain(`size-${size}`);
|
|
20
|
+
};
|
|
21
|
+
|
|
9
22
|
describe(TAG, () => {
|
|
10
23
|
it("renders", () => {
|
|
11
24
|
const element = render({ value });
|
|
12
|
-
const el = element.shadowRoot.querySelector(".typebadge");
|
|
13
|
-
|
|
25
|
+
const el: HTMLElement = element.shadowRoot.querySelector(".typebadge");
|
|
26
|
+
assertContainerClasses(el);
|
|
14
27
|
expect(el.getAttribute("style")).toBe(null);
|
|
15
|
-
return expect(element).toBeAccessible();
|
|
16
|
-
});
|
|
17
28
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
expect(span.textContent).toEqual(value);
|
|
22
|
-
expect(element.getAttribute("style")).toBe(null);
|
|
29
|
+
const spanLabel = el.querySelector("span");
|
|
30
|
+
expect(spanLabel?.textContent).toBe(value);
|
|
31
|
+
|
|
23
32
|
return expect(element).toBeAccessible();
|
|
24
33
|
});
|
|
25
34
|
|
|
26
|
-
it("renders
|
|
27
|
-
const element = render({ value });
|
|
28
|
-
const el = element.shadowRoot.querySelector(".typebadge");
|
|
29
|
-
|
|
35
|
+
it("renders a content-type badge and size small", () => {
|
|
36
|
+
const element = render({ value, type: "content-type", size: "small" });
|
|
37
|
+
const el: HTMLElement = element.shadowRoot.querySelector(".typebadge");
|
|
38
|
+
assertContainerClasses(el, "content-type", "small");
|
|
30
39
|
expect(el.getAttribute("style")).toBe(null);
|
|
40
|
+
|
|
31
41
|
return expect(element).toBeAccessible();
|
|
32
42
|
});
|
|
33
43
|
|
|
34
|
-
it("
|
|
35
|
-
const element = render({
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
expect(
|
|
39
|
-
return expect(element).toBeAccessible();
|
|
44
|
+
it("renders as default type in case type is falsy", () => {
|
|
45
|
+
const element = render({ value, type: null });
|
|
46
|
+
const container = element.shadowRoot.querySelector(".typebadge");
|
|
47
|
+
assertContainerClasses(container);
|
|
48
|
+
expect(container.getAttribute("style")).toBe(null);
|
|
40
49
|
});
|
|
41
50
|
|
|
42
|
-
it("
|
|
43
|
-
const element = render({
|
|
51
|
+
it("renders with an specific color", () => {
|
|
52
|
+
const element = render({ value, color: "blue" });
|
|
53
|
+
const el: HTMLElement = element.shadowRoot.querySelector(".typebadge");
|
|
44
54
|
|
|
45
|
-
const el = element.shadowRoot.querySelector(".typebadge");
|
|
46
|
-
expect(el.className).toContain("size-small");
|
|
47
55
|
expect(el.getAttribute("style")).toContain(
|
|
48
|
-
|
|
56
|
+
"--background: var(--dx-g-blue-vibrant-95)"
|
|
49
57
|
);
|
|
50
58
|
expect(el.getAttribute("style")).toContain(
|
|
51
|
-
|
|
59
|
+
"--color: var(--dx-g-blue-vibrant-40)"
|
|
52
60
|
);
|
|
61
|
+
|
|
53
62
|
return expect(element).toBeAccessible();
|
|
54
63
|
});
|
|
55
64
|
|
|
56
|
-
it("can
|
|
57
|
-
const element = render({
|
|
65
|
+
it("can pass a brand as color", () => {
|
|
66
|
+
const element = render({ color: "industries", value });
|
|
67
|
+
|
|
58
68
|
const el = element.shadowRoot.querySelector(".typebadge");
|
|
59
|
-
expect(
|
|
60
|
-
|
|
69
|
+
expect(el.getAttribute("style")).toContain(
|
|
70
|
+
`--color: var(--dx-g-brand-industries-color)`
|
|
71
|
+
);
|
|
72
|
+
expect(el.getAttribute("style")).toContain(
|
|
73
|
+
`--background: var(--dx-g-brand-industries-color-background)`
|
|
74
|
+
);
|
|
61
75
|
return expect(element).toBeAccessible();
|
|
62
76
|
});
|
|
63
77
|
});
|
|
@@ -1,52 +1,67 @@
|
|
|
1
1
|
@import "helpers/reset";
|
|
2
2
|
|
|
3
|
-
:host {
|
|
4
|
-
--dx-c-type-badge-color: var(--dx-g-blue-vibrant-20);
|
|
5
|
-
--dx-c-type-badge-background: var(--dx-g-cloud-blue-natural-90);
|
|
6
|
-
--dx-c-type-badge-text-width: unset;
|
|
7
|
-
--dx-c-type-badge-border-radius: var(--dx-g-spacing-xs);
|
|
8
|
-
--dx-c-type-badge-text-transform: uppercase;
|
|
9
|
-
--dx-c-type-badge-height: var(--dx-g-spacing-xl);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
3
|
.typebadge {
|
|
13
|
-
display: flex;
|
|
14
4
|
align-items: center;
|
|
5
|
+
background: var(--dx-c-type-badge-background, var(--background));
|
|
6
|
+
border-radius: var(--dx-c-type-badge-border-radius, var(--border-radius));
|
|
7
|
+
color: var(--dx-c-type-badge-color, var(--color));
|
|
8
|
+
display: flex;
|
|
15
9
|
justify-content: center;
|
|
10
|
+
height: var(--dx-c-type-badge-height, var(--height));
|
|
11
|
+
text-align: center;
|
|
12
|
+
white-space: nowrap;
|
|
16
13
|
width: min-content;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
background: var(--dx-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.typebadge.typebadge_metadata {
|
|
17
|
+
--background: var(--dx-g-cloud-blue-natural-90);
|
|
18
|
+
--border-radius: var(--dx-g-spacing-xs);
|
|
19
|
+
--color: var(--dx-g-blue-vibrant-20);
|
|
20
|
+
--height: var(--dx-g-spacing-md);
|
|
21
|
+
--horizontal-spacing: var(--dx-g-spacing-sm);
|
|
22
|
+
|
|
24
23
|
font-family: var(--dx-g-font-display);
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
font-size: 10px;
|
|
25
|
+
letter-spacing: 0.6px;
|
|
26
|
+
text-transform: var(--dx-c-type-badge-text-transform, uppercase);
|
|
27
|
+
padding: 0 var(--horizontal-spacing);
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
.typebadge
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
.typebadge.typebadge_content-type {
|
|
31
|
+
--background: var(--sds-g-gray-3);
|
|
32
|
+
--border-radius: var(--dx-g-spacing-smd);
|
|
33
|
+
--color: var(--sds-g-gray-10);
|
|
34
|
+
--height: var(--dx-g-spacing-lg);
|
|
35
|
+
--horizontal-spacing: var(--dx-g-spacing-smd);
|
|
36
|
+
--vertical-spacing: var(--dx-g-spacing-xs);
|
|
37
|
+
|
|
38
|
+
font-family: var(--dx-g-font-sans);
|
|
39
|
+
font-size: var(--dx-g-text-xs);
|
|
40
|
+
font-weight: var(--dx-g-font-bold);
|
|
41
|
+
padding: var(--vertical-spacing) var(--horizontal-spacing);
|
|
33
42
|
}
|
|
34
43
|
|
|
35
|
-
.typebadge.size-small {
|
|
36
|
-
height: var(--dx-g-spacing-
|
|
37
|
-
|
|
44
|
+
.typebadge.typebadge_content-type.size-small {
|
|
45
|
+
--height: var(--dx-g-spacing-mlg);
|
|
46
|
+
--horizontal-spacing: var(--dx-g-spacing-sm);
|
|
47
|
+
|
|
38
48
|
font-size: 10px;
|
|
39
|
-
letter-spacing: 0.6px;
|
|
40
49
|
}
|
|
41
50
|
|
|
42
|
-
.typebadge.size-
|
|
43
|
-
height: var(--dx-g-spacing-md);
|
|
44
|
-
|
|
51
|
+
.typebadge.typebadge_metadata.size-small {
|
|
52
|
+
--height: var(--dx-g-spacing-md);
|
|
53
|
+
--horizontal-spacing: var(--dx-g-spacing-xs);
|
|
54
|
+
|
|
45
55
|
font-size: 8px;
|
|
46
56
|
letter-spacing: 0.5px;
|
|
47
57
|
}
|
|
48
58
|
|
|
49
|
-
.typebadge.
|
|
59
|
+
.typebadge.typebadge_metadata span {
|
|
60
|
+
transform: translateY(2px);
|
|
61
|
+
width: var(--dx-c-type-badge-text-width, unset);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.typebadge.typebadge_metadata.size-small span {
|
|
50
65
|
transform: translateY(1px);
|
|
51
66
|
}
|
|
52
67
|
|
|
@@ -1,15 +1,59 @@
|
|
|
1
1
|
import { html } from "lit-html";
|
|
2
|
+
import { TypeBadgeColor, TypeBadgeSize, BadgeType } from "typings/custom";
|
|
3
|
+
|
|
4
|
+
const BADGE_COLOR_OPTIONS: Array<TypeBadgeColor> = [
|
|
5
|
+
"default",
|
|
6
|
+
"hot-orange",
|
|
7
|
+
"orange",
|
|
8
|
+
"yellow",
|
|
9
|
+
"green",
|
|
10
|
+
"teal",
|
|
11
|
+
"cloud-blue",
|
|
12
|
+
"blue",
|
|
13
|
+
"indigo",
|
|
14
|
+
"purple",
|
|
15
|
+
"violet",
|
|
16
|
+
"pink",
|
|
17
|
+
"red",
|
|
18
|
+
"analytics",
|
|
19
|
+
"employees",
|
|
20
|
+
"marketing",
|
|
21
|
+
"partners",
|
|
22
|
+
"commerce",
|
|
23
|
+
"sales",
|
|
24
|
+
"success",
|
|
25
|
+
"integration",
|
|
26
|
+
"platform",
|
|
27
|
+
"industries",
|
|
28
|
+
"learning",
|
|
29
|
+
"service"
|
|
30
|
+
];
|
|
31
|
+
const SIZE_OPTIONS: Array<TypeBadgeSize> = ["default", "small"];
|
|
32
|
+
const BADGE_TYPE_OPTIONS: Array<BadgeType> = ["metadata", "content-type"];
|
|
2
33
|
|
|
3
34
|
export default {
|
|
4
35
|
title: "dx/dx-type-badge",
|
|
5
36
|
component: "dx-type-badge",
|
|
6
37
|
argTypes: {
|
|
7
|
-
|
|
38
|
+
color: {
|
|
8
39
|
control: {
|
|
9
|
-
type: "
|
|
10
|
-
}
|
|
40
|
+
type: "select"
|
|
41
|
+
},
|
|
42
|
+
options: BADGE_COLOR_OPTIONS
|
|
43
|
+
},
|
|
44
|
+
type: {
|
|
45
|
+
control: {
|
|
46
|
+
type: "select"
|
|
47
|
+
},
|
|
48
|
+
options: BADGE_TYPE_OPTIONS
|
|
49
|
+
},
|
|
50
|
+
size: {
|
|
51
|
+
control: {
|
|
52
|
+
type: "select"
|
|
53
|
+
},
|
|
54
|
+
options: SIZE_OPTIONS
|
|
11
55
|
},
|
|
12
|
-
|
|
56
|
+
value: {
|
|
13
57
|
control: {
|
|
14
58
|
type: "text"
|
|
15
59
|
}
|
|
@@ -19,43 +63,26 @@ export default {
|
|
|
19
63
|
|
|
20
64
|
export const Base = (args: any) => html`
|
|
21
65
|
<dx-type-badge
|
|
22
|
-
value="${args.value
|
|
23
|
-
|
|
66
|
+
value="${args.value}"
|
|
67
|
+
color="${args.color}"
|
|
68
|
+
size="${args.size}"
|
|
69
|
+
type="${args.type}"
|
|
24
70
|
></dx-type-badge>
|
|
25
71
|
`;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<dx-type-badge value="sales brand" brand="sales"></dx-type-badge>
|
|
33
|
-
|
|
34
|
-
<br />
|
|
35
|
-
|
|
36
|
-
<dx-type-badge value="partners brand" brand="partners"></dx-type-badge>
|
|
37
|
-
|
|
38
|
-
<br />
|
|
39
|
-
|
|
40
|
-
<dx-type-badge value="invalid brand" brand="invalid"></dx-type-badge>
|
|
41
|
-
`;
|
|
42
|
-
|
|
43
|
-
export const Small = (args: any) => html`
|
|
44
|
-
<dx-type-badge
|
|
45
|
-
size="small"
|
|
46
|
-
value="${args.value || "Analytics"}"
|
|
47
|
-
></dx-type-badge>
|
|
48
|
-
`;
|
|
49
|
-
|
|
50
|
-
export const XsWithCustomColorAndFixedWidth = (args: any) => html`
|
|
51
|
-
<dx-type-badge size="xs" value="${args.value || "POST"}"></dx-type-badge>
|
|
52
|
-
`;
|
|
72
|
+
Base.args = {
|
|
73
|
+
color: BADGE_COLOR_OPTIONS[0],
|
|
74
|
+
type: BADGE_TYPE_OPTIONS[0],
|
|
75
|
+
size: SIZE_OPTIONS[0],
|
|
76
|
+
value: "Developer Experience"
|
|
77
|
+
};
|
|
53
78
|
|
|
54
79
|
export const CSSHooked = () => html`
|
|
55
80
|
<style>
|
|
56
81
|
.hooks {
|
|
57
82
|
--dx-c-type-badge-color: var(--dx-g-green-vibrant-40);
|
|
58
83
|
--dx-c-type-badge-background: var(--dx-g-green-vibrant-90);
|
|
84
|
+
--dx-c-type-badge-border-radius: var(--dx-g-spacing-xl);
|
|
85
|
+
--dx-c-type-badge-height: var(--dx-g-spacing-xl);
|
|
59
86
|
}
|
|
60
87
|
.hookinfo {
|
|
61
88
|
color: gray;
|
|
@@ -70,6 +97,14 @@ export const CSSHooked = () => html`
|
|
|
70
97
|
<b>--dx-c-type-badge-background:</b>
|
|
71
98
|
<i>var(--dx-g-green-vibrant-90);</i>
|
|
72
99
|
</p>
|
|
100
|
+
<p class="hookinfo">
|
|
101
|
+
<b>--dx-c-type-badge-border-radius:</b>
|
|
102
|
+
<i>var(--dx-g-spacing-xl);</i>
|
|
103
|
+
</p>
|
|
104
|
+
<p class="hookinfo">
|
|
105
|
+
<b>--dx-c-type-badge-height:</b>
|
|
106
|
+
<i>var(--dx-g-spacing-xl);</i>
|
|
107
|
+
</p>
|
|
73
108
|
<br />
|
|
74
109
|
|
|
75
110
|
<dx-type-badge
|
|
@@ -1,21 +1,65 @@
|
|
|
1
1
|
import { LightningElement, api } from "lwc";
|
|
2
2
|
import cx from "classnames";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
TypeBadgeColor,
|
|
5
|
+
Color,
|
|
6
|
+
TypeBadgeSize,
|
|
7
|
+
BadgeType,
|
|
8
|
+
Brand
|
|
9
|
+
} from "typings/custom";
|
|
10
|
+
import { colorToDxColors } from "utils/css";
|
|
11
|
+
|
|
12
|
+
const DEFAULT_TYPE = "typebadge_metadata";
|
|
13
|
+
const VALID_BRANDS: Array<Brand> = [
|
|
14
|
+
"employees",
|
|
15
|
+
"marketing",
|
|
16
|
+
"partners",
|
|
17
|
+
"commerce",
|
|
18
|
+
"sales",
|
|
19
|
+
"success",
|
|
20
|
+
"integration",
|
|
21
|
+
"platform",
|
|
22
|
+
"industries",
|
|
23
|
+
"learning",
|
|
24
|
+
"service",
|
|
25
|
+
"analytics"
|
|
26
|
+
];
|
|
5
27
|
|
|
6
28
|
export default class TypeBadge extends LightningElement {
|
|
7
|
-
@api size: TypeBadgeSize = "
|
|
29
|
+
@api size: TypeBadgeSize = "default";
|
|
8
30
|
@api value: string = "";
|
|
9
|
-
@api
|
|
31
|
+
@api color?: TypeBadgeColor = "default";
|
|
32
|
+
@api type?: BadgeType = "metadata";
|
|
10
33
|
|
|
11
34
|
private get className(): string {
|
|
12
|
-
return cx(
|
|
35
|
+
return cx(
|
|
36
|
+
"typebadge",
|
|
37
|
+
`size-${this.size}`,
|
|
38
|
+
(this.type && `typebadge_${this.type}`) || DEFAULT_TYPE
|
|
39
|
+
);
|
|
13
40
|
}
|
|
14
41
|
|
|
15
42
|
private get style(): string {
|
|
16
|
-
if (this.
|
|
17
|
-
return
|
|
43
|
+
if (VALID_BRANDS.includes(this.color as Brand)) {
|
|
44
|
+
return this.buildStyleString({
|
|
45
|
+
background: `--dx-g-brand-${this.color}-color-background`,
|
|
46
|
+
color: `--dx-g-brand-${this.color}-color`
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const variables = colorToDxColors(this.color as Color);
|
|
50
|
+
if (variables) {
|
|
51
|
+
return this.buildStyleString(variables);
|
|
18
52
|
}
|
|
19
53
|
return "";
|
|
20
54
|
}
|
|
55
|
+
|
|
56
|
+
private buildStyleString({
|
|
57
|
+
background,
|
|
58
|
+
color
|
|
59
|
+
}: {
|
|
60
|
+
background: string;
|
|
61
|
+
color: string;
|
|
62
|
+
}): string {
|
|
63
|
+
return `--color: var(${color}); --background: var(${background})`;
|
|
64
|
+
}
|
|
21
65
|
}
|
|
@@ -1,2 +1,43 @@
|
|
|
1
|
+
import { Color } from "typings/custom";
|
|
2
|
+
|
|
3
|
+
const LABEL_TO_DX_VAR: { [key: string]: string } = {
|
|
4
|
+
blue: "blue-vibrant",
|
|
5
|
+
"cloud-blue": "cloud-blue-vibrant",
|
|
6
|
+
green: "green-vibrant",
|
|
7
|
+
"hot-orange": "hot-orange-vibrant",
|
|
8
|
+
indigo: "indigo-vibrant",
|
|
9
|
+
orange: "orange-vibrant",
|
|
10
|
+
pink: "pink-vibrant",
|
|
11
|
+
purple: "purple-vibrant",
|
|
12
|
+
red: "red-vibrant",
|
|
13
|
+
teal: "teal-natural",
|
|
14
|
+
violet: "violet-vibrant",
|
|
15
|
+
yellow: "yellow-natural"
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const DEFAULT_BACKGROUND_LEVEL = 95;
|
|
19
|
+
const DEFAULT_COLOR_LEVEL = 40;
|
|
20
|
+
|
|
21
|
+
export const colorToDxColors = (
|
|
22
|
+
color?: Color
|
|
23
|
+
): {
|
|
24
|
+
background: string;
|
|
25
|
+
color: string;
|
|
26
|
+
} | null => {
|
|
27
|
+
if (!color) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const dxVarColor = LABEL_TO_DX_VAR[color];
|
|
32
|
+
if (!dxVarColor) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
background: `--dx-g-${dxVarColor}-${DEFAULT_BACKGROUND_LEVEL}`,
|
|
38
|
+
color: `--dx-g-${dxVarColor}-${DEFAULT_COLOR_LEVEL}`
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
|
|
1
42
|
export const toDxColor = (color: string) =>
|
|
2
43
|
["white", "transparent"].includes(color) ? color : `var(--dx-g-${color})`;
|