Skip to content

Commit 7e36583

Browse files
committed
Designer: Begin migration away from design token definition
1 parent 51234a2 commit 7e36583

File tree

6 files changed

+87
-59
lines changed

6 files changed

+87
-59
lines changed

packages/adaptive-ui-designer-figma-plugin/src/ui/app.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import type { PluginMessage} from "../core/messages.js";
1717
import SubtractIcon from "./assets/subtract.svg";
1818
import { UIController } from "./ui-controller.js";
1919
import { AppliedDesignTokenItem, StyleModuleDisplay, StyleModuleDisplayList } from "./ui-controller-styles.js";
20-
import { DesignTokenAdd, DesignTokensForm, Drawer, StyleTokenItem, TokenGlyph, TokenGlyphType } from "./components/index.js";
20+
import { AddEventDetail, DesignTokenAdd, DesignTokensForm, DetachEventDetail, Drawer, StyleTokenItem, TokenChangeEventDetail, TokenGlyph, TokenGlyphType } from "./components/index.js";
2121

2222
StyleTokenItem;
2323
TokenGlyph;
@@ -411,8 +411,8 @@ const template = html<App>`
411411
:designTokens=${(x) => x.controller.designTokens.availableDesignTokens}
412412
@add=${(x, c) =>
413413
x.controller.designTokens.setDesignToken(
414-
(c.event as CustomEvent).detail.definition,
415-
(c.event as CustomEvent).detail.value
414+
((c.event as CustomEvent).detail as AddEventDetail).token,
415+
((c.event as CustomEvent).detail as AddEventDetail).value
416416
)}
417417
></designer-design-token-add>
418418
<adaptive-divider></adaptive-divider>
@@ -422,10 +422,13 @@ const template = html<App>`
422422
:designTokens=${(x) => x.controller.designTokens.designTokenValues}
423423
@tokenChange=${(x, c) =>
424424
x.controller.designTokens.setDesignToken(
425-
(c.event as CustomEvent).detail.definition,
426-
(c.event as CustomEvent).detail.value
425+
((c.event as CustomEvent).detail as TokenChangeEventDetail).token,
426+
((c.event as CustomEvent).detail as TokenChangeEventDetail).value
427+
)}
428+
@detach=${(x, c) =>
429+
x.controller.designTokens.removeDesignToken(
430+
((c.event as CustomEvent).detail as DetachEventDetail)
427431
)}
428-
@detach=${(x, c) => x.controller.designTokens.removeDesignToken((c.event as CustomEvent).detail)}
429432
></designer-design-tokens-form>
430433
</div>
431434
</div>

packages/adaptive-ui-designer-figma-plugin/src/ui/components/design-token-add/index.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,24 @@ import {
88
ref,
99
repeat,
1010
} from "@microsoft/fast-element";
11-
import { staticallyCompose } from "@microsoft/fast-foundation";
12-
import { DesignTokenDefinition } from "@adaptive-web/adaptive-ui-designer-core";
11+
import { DesignToken, staticallyCompose } from "@microsoft/fast-foundation";
1312
import CheckmarkIcon from "../../assets/checkmark.svg";
1413
import { DesignTokenField } from "../design-token-field/index.js";
14+
import { UIDesignTokenValue } from "../../ui-controller-tokens.js";
15+
import { designTokenTitle } from "../../util.js";
1516

1617
DesignTokenField;
1718

19+
export type AddEventDetail = UIDesignTokenValue;
20+
1821
const template = html<DesignTokenAdd>`
1922
<select @change="${(x, c) => x.selectHandler(c)}" ${ref("list")}>
2023
<option selected value="-">Add design token override...</option>
2124
${repeat(
2225
x => x.designTokens,
23-
html<DesignTokenDefinition, DesignTokenAdd>`
24-
<option value="${x => x.id}">
25-
${x => x.title} (${x => x.groupTitle})
26+
html<DesignToken<any>, DesignTokenAdd>`
27+
<option value="${x => x.name}">
28+
${x => designTokenTitle(x)}
2629
</option>
2730
`
2831
)}
@@ -67,38 +70,38 @@ const styles = css`
6770
})
6871
export class DesignTokenAdd extends FASTElement {
6972
@observable
70-
designTokens: DesignTokenDefinition[] = [];
73+
designTokens: DesignToken<any>[] = [];
7174

7275
@observable
73-
selectedDesignToken?: DesignTokenDefinition;
76+
selectedDesignToken?: DesignToken<any>;
7477

7578
list?: HTMLSelectElement;
7679

7780
field?: DesignTokenField;
7881

7982
selectHandler(c: ExecutionContext) {
80-
const selectedTokenId = (c.event.target as unknown as HTMLSelectElement).value;
83+
const selectedTokenName = (c.event.target as unknown as HTMLSelectElement).value;
8184

82-
if (selectedTokenId !== "-") {
85+
if (selectedTokenName !== "-") {
8386
this.selectedDesignToken = this.designTokens.find((token) => {
84-
return token.id === selectedTokenId;
87+
return token.name === selectedTokenName;
8588
});
8689
if (this.list) {
8790
this.list.value = "-";
8891
}
8992

9093
if (this.field) {
91-
this.field.value = "" + this.selectedDesignToken?.token.default;
94+
this.field.value = "" + this.selectedDesignToken?.default;
9295
}
9396
}
9497
}
9598

9699
addHandler() {
97100
if (this.field?.value) {
98101
this.$emit("add", {
99-
definition: this.selectedDesignToken,
102+
token: this.selectedDesignToken,
100103
value: this.field.value,
101-
});
104+
} as AddEventDetail);
102105

103106
this.selectedDesignToken = undefined;
104107
}

packages/adaptive-ui-designer-figma-plugin/src/ui/components/design-token-field/index.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
import { DesignToken } from "@microsoft/fast-foundation";
12
import { css, customElement, FASTElement, html, observable } from "@microsoft/fast-element";
23
import { twoWay } from "@microsoft/fast-element/binding/two-way.js";
3-
import { DesignTokenDefinition, FormControlId } from "@adaptive-web/adaptive-ui-designer-core";
4+
import { DesignTokenMetadata, DesignTokenType } from "@adaptive-web/adaptive-ui";
5+
import { designTokenTitle } from "../../util.js";
6+
7+
export type ChangeEventDetail = string;
48

59
const tokenTemplatesByType = {
610
default: html<DesignTokenField>`
@@ -36,7 +40,7 @@ const tokenTemplatesByType = {
3640

3741
const template = html<DesignTokenField>`
3842
<label>
39-
<span>${x => x.designToken?.title}</span>
43+
<span>${x => designTokenTitle(x.designToken)}</span>
4044
${x => x.selectTemplate()}
4145
</label>
4246
`;
@@ -79,19 +83,19 @@ const styles = css`
7983
})
8084
export class DesignTokenField extends FASTElement {
8185
@observable
82-
designToken?: DesignTokenDefinition;
86+
designToken?: DesignToken<any> & DesignTokenMetadata;
8387

8488
@observable
8589
value: string = "";
8690
valueChanged(prev: string, next: string) {
87-
this.$emit("change", this.value);
91+
this.$emit("change", this.value as ChangeEventDetail);
8892
}
8993

9094
selectTemplate() {
9195
if (this.designToken) {
92-
if (this.designToken.formControlId === FormControlId.color) {
96+
if (this.designToken.type === DesignTokenType.color) {
9397
return tokenTemplatesByType.color;
94-
} else if (this.designToken.id === "color.layer.fill.ramp.baseLuminance") {
98+
} else if (this.designToken.name === "color.layer.fill.ramp.baseLuminance") {
9599
return tokenTemplatesByType.luminance;
96100
}
97101
}

packages/adaptive-ui-designer-figma-plugin/src/ui/components/design-tokens-form/index.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,27 @@ import {
77
repeat,
88
when,
99
} from "@microsoft/fast-element";
10-
import { staticallyCompose } from "@microsoft/fast-foundation";
10+
import { DesignToken, staticallyCompose } from "@microsoft/fast-foundation";
1111
import SubtractIcon from "../../assets/subtract.svg";
1212
import type { UIDesignTokenValue } from "../../ui-controller-tokens.js";
13-
import { DesignTokenField } from "../design-token-field/index.js";
13+
import { ChangeEventDetail, DesignTokenField } from "../design-token-field/index.js";
1414

1515
DesignTokenField;
1616

17+
export type TokenChangeEventDetail = UIDesignTokenValue;
18+
export type DetachEventDetail = DesignToken<any>;
19+
1720
const template = html<DesignTokensForm>`
1821
<ul>
1922
${repeat(
2023
x => x.designTokens,
2124
html<UIDesignTokenValue, DesignTokensForm>`
2225
<li>
2326
<designer-design-token-field
24-
:designToken=${x => x.definition}
27+
:designToken=${x => x.token}
2528
:value=${x => x.value}
2629
@change="${(x, c) =>
27-
c.parent.changeHandler(x, c.event as CustomEvent)}"
30+
c.parent.changeHandler(x, (c.event as CustomEvent).detail as ChangeEventDetail)}"
2831
></designer-design-token-field>
2932
<adaptive-button
3033
appearance="stealth"
@@ -69,9 +72,9 @@ export class DesignTokensForm extends FASTElement {
6972
@observable
7073
designTokens: UIDesignTokenValue[] = [];
7174

72-
changeHandler(token: UIDesignTokenValue, e: CustomEvent) {
73-
token.value = e.detail;
74-
this.$emit("tokenChange", token);
75+
changeHandler(token: UIDesignTokenValue, value: string) {
76+
token.value = value;
77+
this.$emit("tokenChange", token as TokenChangeEventDetail);
7578
}
7679

7780
detachHandler(token: UIDesignTokenValue) {
@@ -83,6 +86,6 @@ export class DesignTokensForm extends FASTElement {
8386
});
8487
this.designTokens.splice(detachIndex, 1);
8588

86-
this.$emit("detach", token.definition);
89+
this.$emit("detach", token.token as DetachEventDetail);
8790
}
8891
}

packages/adaptive-ui-designer-figma-plugin/src/ui/ui-controller-tokens.ts

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { calc } from '@csstools/css-calc';
22
import { observable } from "@microsoft/fast-element";
3-
import { type DesignToken } from "@microsoft/fast-foundation";
3+
import { DesignToken } from "@microsoft/fast-foundation";
44
import { Color } from "@adaptive-web/adaptive-ui";
55
import { formatHex8 } from 'culori';
6-
import { DesignTokenDefinition, DesignTokenValue, PluginUINodeData } from "@adaptive-web/adaptive-ui-designer-core";
6+
import { DesignTokenValue, PluginUINodeData } from "@adaptive-web/adaptive-ui-designer-core";
77
import { UIController } from "./ui-controller.js";
88
import { ElementsController } from "./ui-controller-elements.js";
99

@@ -12,9 +12,9 @@ import { ElementsController } from "./ui-controller-elements.js";
1212
*/
1313
export interface UIDesignTokenValue {
1414
/**
15-
* The definition of the design token.
15+
* The design token.
1616
*/
17-
definition: DesignTokenDefinition;
17+
token: DesignToken<any>;
1818

1919
/**
2020
* Represents the design token value if all selected nodes have the same value.
@@ -41,7 +41,7 @@ export class DesignTokenController {
4141
* A list of all design tokens which are not already applied to the selected nodes.
4242
*/
4343
@observable
44-
public availableDesignTokens: DesignTokenDefinition[] | null = null;
44+
public availableDesignTokens: DesignToken<any>[] | null = null;
4545

4646
constructor(
4747
private readonly controller: UIController,
@@ -67,8 +67,8 @@ export class DesignTokenController {
6767

6868
// Get all design tokens that can be added, which is the full list except any already applied.
6969
this.availableDesignTokens = this.controller.designTokenRegistry.entries.filter((definition) =>
70-
this.designTokenValues?.find((appliedToken) => appliedToken.definition.id === definition.id) === undefined
71-
);
70+
this.designTokenValues?.find((appliedToken) => appliedToken.token.name === definition.id) === undefined
71+
).map(def => def.token);
7272
}
7373

7474
/**
@@ -92,12 +92,11 @@ export class DesignTokenController {
9292

9393
const allDesignTokens = this.controller.designTokenRegistry.entries;
9494

95-
allDesignTokens.forEach(designToken => {
96-
if (tokenValues.has(designToken.id)) {
97-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
98-
const set = tokenValues.get(designToken.id)!;
95+
allDesignTokens.forEach(def => {
96+
if (tokenValues.has(def.id)) {
97+
const set = tokenValues.get(def.id);
9998
designTokens.push({
100-
definition: designToken,
99+
token: def.token,
101100
value: set.size === 1 ? set.values().next().value : undefined,
102101
multipleValues: set.size > 1 ? [...set].join(", ") : undefined,
103102
});
@@ -135,57 +134,57 @@ export class DesignTokenController {
135134
return val;
136135
}
137136

138-
private setDesignTokenForNode(node: PluginUINodeData, definition: DesignTokenDefinition, value: any): void {
137+
private setDesignTokenForNode(node: PluginUINodeData, token: DesignToken<any>, value: any): void {
139138
if (value) {
140139
const designToken = new DesignTokenValue(value);
141-
node.designTokens.set(definition.id, designToken);
140+
node.designTokens.set(token.name, designToken);
142141
} else {
143-
node.designTokens.delete(definition.id);
142+
node.designTokens.delete(token.name);
144143
}
145144
// console.log(" after set designTokens", node.id, node.type, node.designTokens);
146145

147146
const element = this.elements.getElementForNode(node);
148-
this.elements.setDesignTokenForElement(element, definition.token, value);
147+
this.elements.setDesignTokenForElement(element, token, value);
149148
}
150149

151150
/**
152151
* Sets a design token value (override) for the selected nodes.
153152
*
154-
* @param definition - The design token definition
153+
* @param token - The design token definition
155154
* @param value - The value for this design token for the selected nodes
156155
*/
157-
public setDesignToken(definition: DesignTokenDefinition, value: any): void {
156+
public setDesignToken(token: DesignToken<any>, value: any): void {
158157
const nodes = this.controller.selectedNodes;
159158

160159
// console.log("--------------------------------");
161-
// console.log("DesignTokenController.setDesignToken", definition, value, typeof value, nodes);
160+
// console.log("DesignTokenController.setDesignToken", token, value, typeof value, nodes);
162161

163162
nodes.forEach(node =>
164-
this.setDesignTokenForNode(node, definition, value)
163+
this.setDesignTokenForNode(node, token, value)
165164
);
166165

167166
this.setupDesignTokenObservables();
168167

169-
this.controller.refreshSelectedNodes("setDesignToken " + definition.id);
168+
this.controller.refreshSelectedNodes("setDesignToken " + token.name);
170169
}
171170

172171
/**
173172
* Removes a design token value (override) from the selected nodes.
174173
*
175-
* @param definition - The design token definition
174+
* @param token - The design token definition
176175
*/
177-
public removeDesignToken(definition: DesignTokenDefinition): void {
176+
public removeDesignToken(token: DesignToken<any>): void {
178177
const nodes = this.controller.selectedNodes;
179178

180179
// console.log("--------------------------------");
181-
// console.log("DesignTokenController.removeDesignToken", definition.id, nodes);
180+
// console.log("DesignTokenController.removeDesignToken", token.name, nodes);
182181

183182
nodes.forEach(node =>
184-
this.setDesignTokenForNode(node, definition, null)
183+
this.setDesignTokenForNode(node, token, null)
185184
);
186185

187186
this.setupDesignTokenObservables();
188187

189-
this.controller.refreshSelectedNodes("removeDesignToken " + definition.id);
188+
this.controller.refreshSelectedNodes("removeDesignToken " + token.name);
190189
}
191190
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { sentenceCase } from "change-case";
2+
import { DesignToken } from "@microsoft/fast-foundation";
3+
4+
export function designTokenTitle(token?: DesignToken<any>): string {
5+
if (token === undefined || token.name === undefined) {
6+
console.log(token);
7+
8+
return "-";
9+
}
10+
11+
// Handle legacy non-hierarchical format for `custom-recipes.ts`.
12+
const name = token.name.indexOf(".") > -1 ? token.name.split(".").slice(1).join("-") : token.name;
13+
14+
const base = name.replace(/-/g, ' ').replace(/density_/, '');
15+
return sentenceCase(base);
16+
}

0 commit comments

Comments
 (0)