@design-factory/design-factory 20.0.0-next.0 → 20.0.0-next.2
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/design-factory-initial-branding.css +1 -1
- package/design-factory-initial-branding.scss +1 -1
- package/design-factory.css +2 -2
- package/fesm2022/design-factory-design-factory-tokens-style-dictionary.mjs +358 -0
- package/fesm2022/design-factory-design-factory-tokens-style-dictionary.mjs.map +1 -0
- package/fesm2022/design-factory.mjs +433 -530
- package/fesm2022/design-factory.mjs.map +1 -1
- package/index.d.ts +46 -168
- package/package.json +14 -2
- package/schematics/migrations/15_0_0/remove-ngx-slider/index.js +11 -5
- package/schematics/migrations/16_0_0/revert-to-old-brand/index.js +2 -2
- package/schematics/migrations/20_0_0/colors-new-branding/index.d.ts +14 -0
- package/schematics/migrations/20_0_0/colors-new-branding/index.js +108 -0
- package/schematics/migrations/20_0_0/navbar-toggler-logo-svg/index.js +6 -5
- package/schematics/migrations/20_0_0/spinner-new-branding/index.d.ts +7 -0
- package/schematics/migrations/20_0_0/spinner-new-branding/index.js +41 -0
- package/schematics/migrations/helpers.js +1 -1
- package/schematics/migrations/migration.json +12 -0
- package/schematics/migrations/utils/component-resource-collector.js +2 -2
- package/schematics/migrations/utils/project_tsconfig_paths.js +4 -0
- package/schematics/migrations/utils/style-updater.js +3 -1
- package/schematics/migrations/utils/template-updater.js +3 -1
- package/schematics/migrations/utils/typescript/compiler_host.js +6 -4
- package/schematics/ng-add/index.js +3 -6
- package/styles/scss/_common.root.scss +20 -3
- package/styles/scss/_common.scss +1 -1
- package/styles/scss/_common.variables.scss +2 -1
- package/styles/scss/_variables.scss +1 -0
- package/styles/scss/agnosui/_variables.scss +1 -1
- package/styles/scss/bootstrap/_utilities-override.scss +14 -8
- package/styles/scss/bootstrap/_variables.scss +2 -2
- package/styles/scss/components/accordion/_accordion.scss +7 -0
- package/styles/scss/components/alert/_alert.scss +32 -17
- package/styles/scss/components/badge/_badge.mixins.scss +12 -4
- package/styles/scss/components/badge/_badge.scss +191 -71
- package/styles/scss/components/badge/_badge.variables.scss +8 -0
- package/styles/scss/components/brand-color/_brand-color.mixins.scss +2 -2
- package/styles/scss/components/breadcrumbs/_breadcrumbs.scss +4 -1
- package/styles/scss/components/breadcrumbs/_breadcrumbs.variables.scss +3 -1
- package/styles/scss/components/button/_button.scss +389 -74
- package/styles/scss/components/button/_button.utils.scss +20 -1
- package/styles/scss/components/button/_button_container.scss +22 -5
- package/styles/scss/components/card/_card.scss +42 -10
- package/styles/scss/components/card/_card.variables.scss +2 -0
- package/styles/scss/components/carousel/_carousel.scss +2 -2
- package/styles/scss/components/checkbox/_checkbox.scss +2 -1
- package/styles/scss/components/datepicker/_datepicker.scss +2 -1
- package/styles/scss/components/dropdown/_dropdown.scss +18 -1
- package/styles/scss/components/fonts/_font-faces.mixins.scss +108 -54
- package/styles/scss/components/icon/_amadeus-icon.scss +2 -2
- package/styles/scss/components/inputs/_inputs.mixin.scss +2 -2
- package/styles/scss/components/inputs/_inputs.root.scss +1 -1
- package/styles/scss/components/inputs/_inputs.scss +10 -4
- package/styles/scss/components/link/_link.mixins.scss +7 -3
- package/styles/scss/components/link/_link.scss +6 -0
- package/styles/scss/components/media/_media.scss +4 -0
- package/styles/scss/components/media/_media.variables.scss +1 -0
- package/styles/scss/components/modal/_modal.scss +54 -14
- package/styles/scss/components/modal/_modal.variables.scss +1 -0
- package/styles/scss/components/navbar/_navbar.scss +12 -0
- package/styles/scss/components/pagination/_pagination.scss +5 -0
- package/styles/scss/components/pagination/_pagination_container.scss +1 -1
- package/styles/scss/components/progressbar/_progressbar.variables.scss +13 -4
- package/styles/scss/components/rating/_rating.scss +18 -2
- package/styles/scss/components/rating/_rating.variables.scss +1 -1
- package/styles/scss/components/scrollspy/_scrollspy.scss +1 -1
- package/styles/scss/components/select/_select.scss +14 -19
- package/styles/scss/components/separator/_separator.variables.scss +1 -1
- package/styles/scss/components/sidenav/_sidenav.scss +3 -3
- package/styles/scss/components/sidenav/_sidenav.variables.scss +6 -4
- package/styles/scss/components/spinner/_spinner.scss +14 -0
- package/styles/scss/components/spinner/_spinner.variables.scss +7 -4
- package/styles/scss/components/stepper/_stepper.variables.scss +3 -3
- package/styles/scss/components/tabs/_tabs.scss +8 -1
- package/styles/scss/components/timepicker/_timepicker.scss +5 -0
- package/styles/scss/components/timepicker/_timepicker.variables.scss +1 -0
- package/styles/scss/components/toast/_toast.scss +21 -30
- package/styles/scss/components/toggle/_toggle.scss +2 -1
- package/styles/scss/components/toggle/_toggle.variables.scss +1 -0
- package/styles/scss/components/tooltip/_tooltip.scss +5 -0
- package/styles/scss/components/tooltip/_tooltip.variables.scss +4 -0
- package/styles/scss/components/tooltip/_tooltip_container.scss +17 -13
- package/styles/scss/df-styles.scss +1 -0
- package/styles/scss/themes/brand2023/_variables.scss +161 -38
- package/styles/scss/themes/brand2023/tokens/_mapping.gen.scss +156 -186
- package/styles/scss/themes/brand2023/tokens/_root.gen.scss +1708 -0
- package/styles/scss/themes/brand2023/tokens/_sass-vars.gen.scss +1467 -0
- package/styles/scss/utilities/_common.utilities.scss +3 -10
- package/styles/scss/utilities/_rgb.scss +10 -0
- package/tokens/style-dictionary/index.d.ts +60 -0
- package/styles/scss/themes/brand2023/tokens/_figma.gen.scss +0 -3028
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import StyleDictionary from 'style-dictionary';
|
|
2
|
+
import { transformTypes, transforms as transforms$1 } from 'style-dictionary/enums';
|
|
3
|
+
import { fileHeader, sortByReference, usesReferences } from 'style-dictionary/utils';
|
|
4
|
+
import Color from 'colorjs.io';
|
|
5
|
+
import { EOL } from 'os';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Determines the best contrasting color from a list of foreground colors against a given background color.
|
|
9
|
+
*
|
|
10
|
+
* @param backgroundColor - The background color to compare against.
|
|
11
|
+
* @param foregroundColors - An array of tuples where each tuple contains a color name and its corresponding color value.
|
|
12
|
+
* @returns A tuple containing the name and value of the best contrasting color.
|
|
13
|
+
*
|
|
14
|
+
* The function iterates through the provided foreground colors and calculates the contrast ratio
|
|
15
|
+
* against the background color. If a color with a contrast ratio greater than 4.5 is found, it is
|
|
16
|
+
* immediately returned. If no such color is found, the color with the highest contrast ratio is returned.
|
|
17
|
+
*
|
|
18
|
+
* The function logs a message if no color meets the minimum contrast ratio of 4.5:1.
|
|
19
|
+
*/
|
|
20
|
+
function getContrastedColor(backgroundColor, foregroundColors) {
|
|
21
|
+
const minContrast = 4.5;
|
|
22
|
+
const ratios = [];
|
|
23
|
+
let bestContrast = 0;
|
|
24
|
+
let bestMatch = ['', ''];
|
|
25
|
+
const refColor = new Color(backgroundColor);
|
|
26
|
+
for (const color of foregroundColors) {
|
|
27
|
+
if (color[1]) {
|
|
28
|
+
const contrast = refColor.contrast(new Color(color[1]), 'WCAG21');
|
|
29
|
+
if (contrast > minContrast) {
|
|
30
|
+
return color;
|
|
31
|
+
}
|
|
32
|
+
if (contrast > bestContrast) {
|
|
33
|
+
bestContrast = contrast;
|
|
34
|
+
bestMatch = color;
|
|
35
|
+
}
|
|
36
|
+
ratios.push(contrast.toFixed(2));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/*console.log(
|
|
40
|
+
`Found no color leading to ${minContrast}:1 contrast ratio against ${backgroundColor}. Best contrast ratio found: ${bestContrast.toFixed(2)}`
|
|
41
|
+
);
|
|
42
|
+
console.log(`Found ratios: ${ratios.join(', ')}, best match returned: ${bestMatch}`);*/
|
|
43
|
+
return bestMatch;
|
|
44
|
+
}
|
|
45
|
+
const hexaColorRegExp = /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/;
|
|
46
|
+
/**
|
|
47
|
+
* Converts a hexadecimal color string to an RGB array.
|
|
48
|
+
*
|
|
49
|
+
* @param hex - The hexadecimal color string (e.g., "#RRGGBB" or "#RGB").
|
|
50
|
+
* @returns An array containing the RGB values [r, g, b] if the input is valid, otherwise `undefined`.
|
|
51
|
+
*/
|
|
52
|
+
function hexToRgb(hex) {
|
|
53
|
+
hex = hex.replace(/^#/, '');
|
|
54
|
+
if (!hexaColorRegExp.test(hex)) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
if (hex.length === 3) {
|
|
58
|
+
hex = hex
|
|
59
|
+
.split('')
|
|
60
|
+
.map((char) => char + char)
|
|
61
|
+
.join('');
|
|
62
|
+
}
|
|
63
|
+
const r = parseInt(hex.substring(0, 2), 16);
|
|
64
|
+
const g = parseInt(hex.substring(2, 4), 16);
|
|
65
|
+
const b = parseInt(hex.substring(4, 6), 16);
|
|
66
|
+
return [r, g, b];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Generates computed theme colors.
|
|
70
|
+
* This function helps manage rgb values, as bootstrap requies rgb values for colors.
|
|
71
|
+
* It also computes the best foreground color for each theme background color.
|
|
72
|
+
*/
|
|
73
|
+
function getComputedThemeColors(tokens) {
|
|
74
|
+
const computedColors = [];
|
|
75
|
+
const dfThemeNeutral = tokens['df']['theme']?.['neutral'];
|
|
76
|
+
const foregroundColors = [
|
|
77
|
+
[`df-theme-neutral-0`, dfThemeNeutral?.['0']?.$value ?? '#ffffff'],
|
|
78
|
+
[`df-theme-neutral-100`, dfThemeNeutral?.['100']?.$value ?? '#1a1a1a'],
|
|
79
|
+
[`df-theme-neutral-110`, dfThemeNeutral?.['110']?.$value ?? '#000000']
|
|
80
|
+
];
|
|
81
|
+
for (const [name, values] of Object.entries(tokens['df']['theme'] ?? {})) {
|
|
82
|
+
for (const [key, value] of Object.entries(values)) {
|
|
83
|
+
const color = value.$value;
|
|
84
|
+
computedColors.push({
|
|
85
|
+
name: `df-theme-${name}-${key}-rgb`,
|
|
86
|
+
$type: 'rgbRef',
|
|
87
|
+
$ref: `df-theme-${name}-${key}`,
|
|
88
|
+
$value: hexToRgb(color)?.join(', ') || ''
|
|
89
|
+
});
|
|
90
|
+
// Compute the best foreground color
|
|
91
|
+
const foregroundVar = getContrastedColor(color, foregroundColors)[0];
|
|
92
|
+
computedColors.push({
|
|
93
|
+
name: `df-theme-${name}-${key}-color`,
|
|
94
|
+
$type: 'ref',
|
|
95
|
+
$ref: foregroundVar
|
|
96
|
+
});
|
|
97
|
+
computedColors.push({
|
|
98
|
+
name: `df-theme-${name}-${key}-color-rgb`,
|
|
99
|
+
$type: 'ref',
|
|
100
|
+
$ref: `${foregroundVar}-rgb`
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return computedColors;
|
|
105
|
+
}
|
|
106
|
+
const tier3ScopingMap = {
|
|
107
|
+
button: `.btn,${EOL} .btn-close`, //needing .btn-close because the alert uses it// TODO: remove when wrapping alert
|
|
108
|
+
badge: '.badge',
|
|
109
|
+
footer: '.df-app-footer',
|
|
110
|
+
navbar: '.navbar',
|
|
111
|
+
link: `a,${EOL} .df-app-footer,${EOL} button.df-collapse` //collapse is a button styled as a link
|
|
112
|
+
};
|
|
113
|
+
const splitTokens = (allTokens) => {
|
|
114
|
+
const rootTokens = [];
|
|
115
|
+
const tier3Tokens = [];
|
|
116
|
+
// divide tokens in tier 3 and root tokens (all the remaining)
|
|
117
|
+
allTokens.forEach((token) => {
|
|
118
|
+
if (token.path[1] && Object.keys(tier3ScopingMap).includes(token.path[1])) {
|
|
119
|
+
tier3Tokens.push(token);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
rootTokens.push(token);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
//grouping tokens into on object having as key the tier3 key and value the array of tokens
|
|
126
|
+
const groupedT3 = tier3Tokens.reduce((acc, token) => {
|
|
127
|
+
const key = token.path[1];
|
|
128
|
+
if (acc[key]) {
|
|
129
|
+
acc[key].push(token);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
acc[key] = [token];
|
|
133
|
+
}
|
|
134
|
+
return acc;
|
|
135
|
+
}, {});
|
|
136
|
+
return { rootTokens, groupedT3 };
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const FONT_WEIGHT_FIGMA2CSS = {
|
|
140
|
+
light: '300',
|
|
141
|
+
regular: '400',
|
|
142
|
+
medium: '500',
|
|
143
|
+
bold: '700'
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Design Factory custom Style-Dictionary transforms
|
|
147
|
+
*/
|
|
148
|
+
const transforms = {
|
|
149
|
+
/**
|
|
150
|
+
* Transform used to quote wrap font-family tokens.
|
|
151
|
+
* This is required as the font-family tokens exported from the Figma Plugin do not have the proper $type.
|
|
152
|
+
*/
|
|
153
|
+
fontFamily: '@design-factory/font-family',
|
|
154
|
+
/**
|
|
155
|
+
* Transform used to map font-weight tokens into useable css values.
|
|
156
|
+
* This is required as the font-weight tokens exported from the Figma Plugin do not have the proper $type.
|
|
157
|
+
*/
|
|
158
|
+
fontWeight: '@design-factory/font-weight',
|
|
159
|
+
/**
|
|
160
|
+
* Transform used to create token names based on DF token naming convention.
|
|
161
|
+
*/
|
|
162
|
+
tokenName: '@design-factory/token-name'
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Design Factory custom Style-Dictionary transform group
|
|
166
|
+
*/
|
|
167
|
+
const transformGroups = {
|
|
168
|
+
/**
|
|
169
|
+
* Transform group that applies standard scss transforms and custom Design Factory transforms.
|
|
170
|
+
*/
|
|
171
|
+
designFactory: '@design-factory'
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Design Factory custom Style-Dictionary filters
|
|
175
|
+
*/
|
|
176
|
+
const filters = {
|
|
177
|
+
/**
|
|
178
|
+
* Filter removing invalid font-weight tokens. Should be used with {@link formats.scssVars}
|
|
179
|
+
*/
|
|
180
|
+
scssVars: '@design-factory/scss-vars-filter',
|
|
181
|
+
/**
|
|
182
|
+
* Filter removing invalid font-weight tokens and t0 tokens. Should be used with {@link formats.cssRoot}
|
|
183
|
+
*/
|
|
184
|
+
cssRoot: '@design-factory/root-filter'
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Design Factory custom Style-Dictionary formats
|
|
188
|
+
*/
|
|
189
|
+
const formats = {
|
|
190
|
+
/**
|
|
191
|
+
* Format to print a sass file containing tokens as sass variables. Should be used with {@link filters.scssVars}
|
|
192
|
+
*/
|
|
193
|
+
scssVars: '@design-factory/scss-vars',
|
|
194
|
+
/**
|
|
195
|
+
* Format to print a css file printing tokens as css variables. Should be used with {@link filters.cssRoot}
|
|
196
|
+
*/
|
|
197
|
+
cssRoot: '@design-factory/css-root'
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Registers Design Factory custom transforms, formats and filters with Style Dictionary.
|
|
201
|
+
*/
|
|
202
|
+
const registerDf = () => {
|
|
203
|
+
/**
|
|
204
|
+
* Our font-family tokens do not have the expected $type font-family property, so we have to manage them manually
|
|
205
|
+
**/
|
|
206
|
+
StyleDictionary.registerTransform({
|
|
207
|
+
name: transforms.fontFamily,
|
|
208
|
+
type: transformTypes.value,
|
|
209
|
+
filter: (token) => token.name.includes('-font-') && (token.name.includes('family') || token.name.includes('Family')),
|
|
210
|
+
transform: (token) => `'${token.$value}'`
|
|
211
|
+
});
|
|
212
|
+
/**
|
|
213
|
+
* Our font tokens do not have the expected $type property, so we have to manage them manually
|
|
214
|
+
**/
|
|
215
|
+
StyleDictionary.registerTransform({
|
|
216
|
+
name: transforms.fontWeight,
|
|
217
|
+
type: transformTypes.value,
|
|
218
|
+
filter: (token) => token.name.startsWith('df-typo-weight-'),
|
|
219
|
+
transform: (token) => FONT_WEIGHT_FIGMA2CSS[token.$value.trim().toLowerCase()] || token.$value
|
|
220
|
+
});
|
|
221
|
+
/**
|
|
222
|
+
* Cannot use style-dictionary camelCase transform as we have some a specific naming convention for our tokens
|
|
223
|
+
**/
|
|
224
|
+
StyleDictionary.registerTransform({
|
|
225
|
+
name: transforms.tokenName,
|
|
226
|
+
type: transformTypes.name,
|
|
227
|
+
transform: (token) => token.path.join('-')
|
|
228
|
+
});
|
|
229
|
+
/**
|
|
230
|
+
* This is the Design Factory transform group, including DF custom transforms.
|
|
231
|
+
*/
|
|
232
|
+
StyleDictionary.registerTransformGroup({
|
|
233
|
+
name: transformGroups.designFactory,
|
|
234
|
+
transforms: [
|
|
235
|
+
transforms$1.attributeCti,
|
|
236
|
+
transforms.tokenName,
|
|
237
|
+
transforms$1.timeSeconds,
|
|
238
|
+
transforms$1.htmlIcon,
|
|
239
|
+
transforms$1.sizeRem,
|
|
240
|
+
transforms$1.sizePxToRem,
|
|
241
|
+
transforms$1.colorCss,
|
|
242
|
+
transforms$1.assetUrl,
|
|
243
|
+
transforms.fontFamily,
|
|
244
|
+
transforms.fontWeight,
|
|
245
|
+
transforms$1.cubicBezierCss,
|
|
246
|
+
// object-value tokens
|
|
247
|
+
transforms$1.strokeStyleCssShorthand,
|
|
248
|
+
transforms$1.borderCssShorthand,
|
|
249
|
+
transforms$1.typographyCssShorthand,
|
|
250
|
+
transforms$1.transitionCssShorthand,
|
|
251
|
+
transforms$1.shadowCssShorthand
|
|
252
|
+
]
|
|
253
|
+
});
|
|
254
|
+
/**
|
|
255
|
+
* This filter removes tokens ending with 'Italic' as italic styles are handled completely differently.
|
|
256
|
+
*/
|
|
257
|
+
StyleDictionary.registerFilter({
|
|
258
|
+
name: filters.scssVars,
|
|
259
|
+
filter: (token) => !token.name.endsWith('Italic')
|
|
260
|
+
});
|
|
261
|
+
/**
|
|
262
|
+
* This filter removes colorPalette tokens from the dictionary.
|
|
263
|
+
* To be used with the @design-factory/css-root format.
|
|
264
|
+
*/
|
|
265
|
+
StyleDictionary.registerFilter({
|
|
266
|
+
name: filters.cssRoot,
|
|
267
|
+
filter: (token) => !token.name.endsWith('Italic') && !token.name.startsWith('df-colorPalette')
|
|
268
|
+
});
|
|
269
|
+
/**
|
|
270
|
+
* Then we register the DF custom formats
|
|
271
|
+
*/
|
|
272
|
+
/**
|
|
273
|
+
* This format generates a SCSS file with all the tokens as sass variables.
|
|
274
|
+
* For references, it will not map to the original token sass var, but to the original token as a CSS var.
|
|
275
|
+
*/
|
|
276
|
+
StyleDictionary.registerFormat({
|
|
277
|
+
name: formats.scssVars,
|
|
278
|
+
format: async ({ dictionary, options, file }) => {
|
|
279
|
+
const { usesDtcg, withDefault, outputReferences } = options;
|
|
280
|
+
const header = await fileHeader({
|
|
281
|
+
file,
|
|
282
|
+
formatting: { lineSeparator: EOL, header: `/**${EOL}`, footer: `${EOL} */${EOL}${EOL}` }
|
|
283
|
+
});
|
|
284
|
+
const tokens = dictionary.tokens;
|
|
285
|
+
let allTokens = dictionary.allTokens;
|
|
286
|
+
allTokens = [...allTokens].sort(sortByReference(tokens, { unfilteredTokens: dictionary.unfilteredTokens, usesDtcg }));
|
|
287
|
+
return (`${header}${outputReferences ? `$prefix: df- !default;${EOL}${EOL}` : ''}` +
|
|
288
|
+
allTokens.reduce((acc, token) => {
|
|
289
|
+
let value = token.$value;
|
|
290
|
+
if (outputReferences && usesReferences(token.original.$value)) {
|
|
291
|
+
if (token.original.$value.startsWith('{df.')) {
|
|
292
|
+
value = `var(--#{$prefix}${token.original.$value.slice(4, -1).replace(/\./g, '-')})`;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
value = `var(--${token.original.$value.slice(1, -1).replace(/\./g, '-')})`;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return `${acc}$${token.name}: ${value}${withDefault ? ' !default' : ''};${EOL}`;
|
|
299
|
+
}, ''));
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
/**
|
|
303
|
+
* This format generates a CSS file with all tokens applied in root.
|
|
304
|
+
* Should be used with the @design-factory/root-filter filter.
|
|
305
|
+
*/
|
|
306
|
+
StyleDictionary.registerFormat({
|
|
307
|
+
name: formats.cssRoot,
|
|
308
|
+
format: async ({ dictionary, options, file }) => {
|
|
309
|
+
const { usesDtcg, outputReferences, prefix = 'df-', selector = 'html:root' } = options;
|
|
310
|
+
const header = await fileHeader({
|
|
311
|
+
file,
|
|
312
|
+
formatting: { lineSeparator: EOL, header: `/**${EOL}`, footer: `${EOL} */${EOL}${EOL}` }
|
|
313
|
+
});
|
|
314
|
+
const tokens = dictionary.tokens;
|
|
315
|
+
let allTokens = dictionary.allTokens;
|
|
316
|
+
allTokens = [...allTokens].sort(sortByReference(tokens, { unfilteredTokens: dictionary.unfilteredTokens, usesDtcg }));
|
|
317
|
+
const { rootTokens, groupedT3 } = splitTokens(allTokens);
|
|
318
|
+
const getValueName = (token) => {
|
|
319
|
+
let value = token.$value;
|
|
320
|
+
if (outputReferences && usesReferences(token.original.$value)) {
|
|
321
|
+
value = `var(--${prefix}${token.original.$value.slice(4, -1).replace(/\./g, '-')})`;
|
|
322
|
+
}
|
|
323
|
+
const name = token.name.startsWith('df-') ? `${prefix}${token.name.slice(3)}` : token.name;
|
|
324
|
+
return { value, name };
|
|
325
|
+
};
|
|
326
|
+
const computedThemeColors = getComputedThemeColors(dictionary.tokens);
|
|
327
|
+
return (`${header}${selector} {${EOL}` +
|
|
328
|
+
rootTokens.reduce((acc, token) => {
|
|
329
|
+
const { value, name } = getValueName(token);
|
|
330
|
+
return `${acc} --${name}: ${value};${EOL}`;
|
|
331
|
+
}, '') +
|
|
332
|
+
(computedThemeColors.length
|
|
333
|
+
? ` /* Computed theme colors */${EOL}${computedThemeColors.reduce((acc, token) => {
|
|
334
|
+
return `${acc} --${prefix}${token.name.slice(3)}: ${token.$type === 'rgbRef' ? token.$value : `var(--${prefix}${token.$ref.slice(3)})`};${EOL}`;
|
|
335
|
+
}, '')}`
|
|
336
|
+
: '') +
|
|
337
|
+
(Object.keys(groupedT3).length
|
|
338
|
+
? `${EOL} /* Tier 3 Scoped tokens */${EOL}` +
|
|
339
|
+
Object.entries(groupedT3).reduce((acc, [key, tokens]) => {
|
|
340
|
+
return (`${acc} ${tier3ScopingMap[key]} {${EOL}` +
|
|
341
|
+
tokens.reduce((innerAcc, token) => {
|
|
342
|
+
const { value, name } = getValueName(token);
|
|
343
|
+
return `${innerAcc} --${name}: ${value};${EOL}`;
|
|
344
|
+
}, '') +
|
|
345
|
+
` }${EOL}`);
|
|
346
|
+
}, '')
|
|
347
|
+
: '') +
|
|
348
|
+
`}${EOL}`);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Generated bundle index. Do not edit.
|
|
355
|
+
*/
|
|
356
|
+
|
|
357
|
+
export { filters, formats, registerDf, transformGroups, transforms };
|
|
358
|
+
//# sourceMappingURL=design-factory-design-factory-tokens-style-dictionary.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-factory-design-factory-tokens-style-dictionary.mjs","sources":["../../../projects/design-factory/tokens/style-dictionary/utils.ts","../../../projects/design-factory/tokens/style-dictionary/config.ts","../../../projects/design-factory/tokens/style-dictionary/design-factory-design-factory-tokens-style-dictionary.ts"],"sourcesContent":["import Color from 'colorjs.io';\nimport type { TransformedToken, TransformedTokens } from 'style-dictionary/types';\nimport { EOL } from 'os';\n\n/**\n * Determines the best contrasting color from a list of foreground colors against a given background color.\n *\n * @param backgroundColor - The background color to compare against.\n * @param foregroundColors - An array of tuples where each tuple contains a color name and its corresponding color value.\n * @returns A tuple containing the name and value of the best contrasting color.\n *\n * The function iterates through the provided foreground colors and calculates the contrast ratio\n * against the background color. If a color with a contrast ratio greater than 4.5 is found, it is\n * immediately returned. If no such color is found, the color with the highest contrast ratio is returned.\n *\n * The function logs a message if no color meets the minimum contrast ratio of 4.5:1.\n */\nfunction getContrastedColor(backgroundColor: string, foregroundColors: [string, string | undefined][]) {\n const minContrast = 4.5;\n const ratios = [];\n let bestContrast = 0;\n let bestMatch: [string, string] = ['', ''];\n const refColor = new Color(backgroundColor);\n for (const color of foregroundColors) {\n if (color[1]) {\n const contrast = refColor.contrast(new Color(color[1]), 'WCAG21');\n if (contrast > minContrast) {\n return color;\n }\n if (contrast > bestContrast) {\n bestContrast = contrast;\n bestMatch = color as [string, string];\n }\n ratios.push(contrast.toFixed(2));\n }\n }\n /*console.log(\n `Found no color leading to ${minContrast}:1 contrast ratio against ${backgroundColor}. Best contrast ratio found: ${bestContrast.toFixed(2)}`\n );\n console.log(`Found ratios: ${ratios.join(', ')}, best match returned: ${bestMatch}`);*/\n return bestMatch;\n}\n\nconst hexaColorRegExp = /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/;\n\n/**\n * Converts a hexadecimal color string to an RGB array.\n *\n * @param hex - The hexadecimal color string (e.g., \"#RRGGBB\" or \"#RGB\").\n * @returns An array containing the RGB values [r, g, b] if the input is valid, otherwise `undefined`.\n */\nfunction hexToRgb(hex: string) {\n hex = hex.replace(/^#/, '');\n\n if (!hexaColorRegExp.test(hex)) {\n return undefined;\n }\n\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((char) => char + char)\n .join('');\n }\n\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n\n return [r, g, b];\n}\n\nexport type ComputedThemeColor =\n | { name: string; $type: 'ref'; $ref: string }\n | { name: string; $type: 'rgbRef'; $ref: string; $value: string };\n\n/**\n * Generates computed theme colors.\n * This function helps manage rgb values, as bootstrap requies rgb values for colors.\n * It also computes the best foreground color for each theme background color.\n */\nexport function getComputedThemeColors(tokens: TransformedTokens): ComputedThemeColor[] {\n const computedColors: ComputedThemeColor[] = [];\n const dfThemeNeutral = tokens['df']['theme']?.['neutral'];\n const foregroundColors: [string, string | undefined][] = [\n [`df-theme-neutral-0`, dfThemeNeutral?.['0']?.$value ?? '#ffffff'],\n [`df-theme-neutral-100`, dfThemeNeutral?.['100']?.$value ?? '#1a1a1a'],\n [`df-theme-neutral-110`, dfThemeNeutral?.['110']?.$value ?? '#000000']\n ];\n for (const [name, values] of Object.entries(tokens['df']['theme'] ?? {})) {\n for (const [key, value] of Object.entries(values as object)) {\n const color = value.$value;\n computedColors.push({\n name: `df-theme-${name}-${key}-rgb`,\n $type: 'rgbRef',\n $ref: `df-theme-${name}-${key}`,\n $value: hexToRgb(color)?.join(', ') || ''\n });\n\n // Compute the best foreground color\n const foregroundVar = getContrastedColor(color, foregroundColors)[0];\n computedColors.push({\n name: `df-theme-${name}-${key}-color`,\n $type: 'ref',\n $ref: foregroundVar\n });\n computedColors.push({\n name: `df-theme-${name}-${key}-color-rgb`,\n $type: 'ref',\n $ref: `${foregroundVar}-rgb`\n });\n }\n }\n return computedColors;\n}\n\nexport type Tier3Key = keyof typeof tier3ScopingMap;\nexport const tier3ScopingMap = {\n button: `.btn,${EOL} .btn-close`, //needing .btn-close because the alert uses it// TODO: remove when wrapping alert\n badge: '.badge',\n footer: '.df-app-footer',\n navbar: '.navbar',\n link: `a,${EOL} .df-app-footer,${EOL} button.df-collapse` //collapse is a button styled as a link\n};\n\nexport const splitTokens = (allTokens: TransformedToken[]) => {\n const rootTokens: TransformedToken[] = [];\n const tier3Tokens: TransformedToken[] = [];\n\n // divide tokens in tier 3 and root tokens (all the remaining)\n allTokens.forEach((token) => {\n if (token.path[1] && Object.keys(tier3ScopingMap).includes(token.path[1])) {\n tier3Tokens.push(token);\n } else {\n rootTokens.push(token);\n }\n });\n\n //grouping tokens into on object having as key the tier3 key and value the array of tokens\n const groupedT3 = tier3Tokens.reduce(\n (acc, token) => {\n const key = token.path[1] as Tier3Key;\n if (acc[key]) {\n acc[key].push(token);\n } else {\n acc[key] = [token];\n }\n return acc;\n },\n {} as Record<Tier3Key, TransformedToken[]>\n );\n\n return { rootTokens, groupedT3 };\n};\n","import StyleDictionary, { type TransformedToken } from 'style-dictionary';\nimport { transforms as sdTransforms, transformTypes } from 'style-dictionary/enums';\nimport { fileHeader, sortByReference, usesReferences } from 'style-dictionary/utils';\nimport { getComputedThemeColors, splitTokens, Tier3Key, tier3ScopingMap } from './utils';\nimport { EOL } from 'os';\n\nconst FONT_WEIGHT_FIGMA2CSS: Record<string, string> = {\n light: '300',\n regular: '400',\n medium: '500',\n bold: '700'\n};\n\n/**\n * Design Factory custom Style-Dictionary transforms\n */\nexport const transforms = {\n /**\n * Transform used to quote wrap font-family tokens.\n * This is required as the font-family tokens exported from the Figma Plugin do not have the proper $type.\n */\n fontFamily: '@design-factory/font-family',\n /**\n * Transform used to map font-weight tokens into useable css values.\n * This is required as the font-weight tokens exported from the Figma Plugin do not have the proper $type.\n */\n fontWeight: '@design-factory/font-weight',\n /**\n * Transform used to create token names based on DF token naming convention.\n */\n tokenName: '@design-factory/token-name'\n} as const;\n\n/**\n * Design Factory custom Style-Dictionary transform group\n */\nexport const transformGroups = {\n /**\n * Transform group that applies standard scss transforms and custom Design Factory transforms.\n */\n designFactory: '@design-factory'\n} as const;\n\n/**\n * Design Factory custom Style-Dictionary filters\n */\nexport const filters = {\n /**\n * Filter removing invalid font-weight tokens. Should be used with {@link formats.scssVars}\n */\n scssVars: '@design-factory/scss-vars-filter',\n /**\n * Filter removing invalid font-weight tokens and t0 tokens. Should be used with {@link formats.cssRoot}\n */\n cssRoot: '@design-factory/root-filter'\n} as const;\n\n/**\n * Design Factory custom Style-Dictionary formats\n */\nexport const formats = {\n /**\n * Format to print a sass file containing tokens as sass variables. Should be used with {@link filters.scssVars}\n */\n scssVars: '@design-factory/scss-vars',\n /**\n * Format to print a css file printing tokens as css variables. Should be used with {@link filters.cssRoot}\n */\n cssRoot: '@design-factory/css-root'\n} as const;\n\n/**\n * Registers Design Factory custom transforms, formats and filters with Style Dictionary.\n */\nexport const registerDf = () => {\n /**\n * Our font-family tokens do not have the expected $type font-family property, so we have to manage them manually\n **/\n StyleDictionary.registerTransform({\n name: transforms.fontFamily,\n type: transformTypes.value,\n filter: (token) =>\n token.name.includes('-font-') && (token.name.includes('family') || token.name.includes('Family')),\n transform: (token) => `'${token.$value}'`\n });\n /**\n * Our font tokens do not have the expected $type property, so we have to manage them manually\n **/\n StyleDictionary.registerTransform({\n name: transforms.fontWeight,\n type: transformTypes.value,\n filter: (token) => token.name.startsWith('df-typo-weight-'),\n transform: (token) => FONT_WEIGHT_FIGMA2CSS[token.$value.trim().toLowerCase()] || token.$value\n });\n\n /**\n * Cannot use style-dictionary camelCase transform as we have some a specific naming convention for our tokens\n **/\n StyleDictionary.registerTransform({\n name: transforms.tokenName,\n type: transformTypes.name,\n transform: (token) => token.path.join('-')\n });\n\n /**\n * This is the Design Factory transform group, including DF custom transforms.\n */\n StyleDictionary.registerTransformGroup({\n name: transformGroups.designFactory,\n transforms: [\n sdTransforms.attributeCti,\n transforms.tokenName,\n sdTransforms.timeSeconds,\n sdTransforms.htmlIcon,\n sdTransforms.sizeRem,\n sdTransforms.sizePxToRem,\n sdTransforms.colorCss,\n sdTransforms.assetUrl,\n transforms.fontFamily,\n transforms.fontWeight,\n sdTransforms.cubicBezierCss,\n // object-value tokens\n sdTransforms.strokeStyleCssShorthand,\n sdTransforms.borderCssShorthand,\n sdTransforms.typographyCssShorthand,\n sdTransforms.transitionCssShorthand,\n sdTransforms.shadowCssShorthand\n ]\n });\n\n /**\n * This filter removes tokens ending with 'Italic' as italic styles are handled completely differently.\n */\n StyleDictionary.registerFilter({\n name: filters.scssVars,\n filter: (token) => !token.name.endsWith('Italic')\n });\n /**\n * This filter removes colorPalette tokens from the dictionary.\n * To be used with the @design-factory/css-root format.\n */\n StyleDictionary.registerFilter({\n name: filters.cssRoot,\n filter: (token) => !token.name.endsWith('Italic') && !token.name.startsWith('df-colorPalette')\n });\n\n /**\n * Then we register the DF custom formats\n */\n\n /**\n * This format generates a SCSS file with all the tokens as sass variables.\n * For references, it will not map to the original token sass var, but to the original token as a CSS var.\n */\n StyleDictionary.registerFormat({\n name: formats.scssVars,\n format: async ({ dictionary, options, file }) => {\n const { usesDtcg, withDefault, outputReferences } = options;\n const header = await fileHeader({\n file,\n formatting: { lineSeparator: EOL, header: `/**${EOL}`, footer: `${EOL} */${EOL}${EOL}` }\n });\n\n const tokens = dictionary.tokens;\n let allTokens = dictionary.allTokens;\n allTokens = [...allTokens].sort(\n sortByReference(tokens, { unfilteredTokens: dictionary.unfilteredTokens, usesDtcg })\n );\n\n return (\n `${header}${outputReferences ? `$prefix: df- !default;${EOL}${EOL}` : ''}` +\n allTokens.reduce((acc, token) => {\n let value = token.$value;\n if (outputReferences && usesReferences(token.original.$value)) {\n if (token.original.$value.startsWith('{df.')) {\n value = `var(--#{$prefix}${token.original.$value.slice(4, -1).replace(/\\./g, '-')})`;\n } else {\n value = `var(--${token.original.$value.slice(1, -1).replace(/\\./g, '-')})`;\n }\n }\n return `${acc}$${token.name}: ${value}${withDefault ? ' !default' : ''};${EOL}`;\n }, '')\n );\n }\n });\n /**\n * This format generates a CSS file with all tokens applied in root.\n * Should be used with the @design-factory/root-filter filter.\n */\n StyleDictionary.registerFormat({\n name: formats.cssRoot,\n format: async ({ dictionary, options, file }) => {\n const { usesDtcg, outputReferences, prefix = 'df-', selector = 'html:root' } = options;\n const header = await fileHeader({\n file,\n formatting: { lineSeparator: EOL, header: `/**${EOL}`, footer: `${EOL} */${EOL}${EOL}` }\n });\n\n const tokens = dictionary.tokens;\n let allTokens = dictionary.allTokens;\n allTokens = [...allTokens].sort(\n sortByReference(tokens, { unfilteredTokens: dictionary.unfilteredTokens, usesDtcg })\n );\n\n const { rootTokens, groupedT3 } = splitTokens(allTokens);\n\n const getValueName = (token: TransformedToken) => {\n let value = token.$value;\n if (outputReferences && usesReferences(token.original.$value)) {\n value = `var(--${prefix}${token.original.$value.slice(4, -1).replace(/\\./g, '-')})`;\n }\n const name = token.name.startsWith('df-') ? `${prefix}${token.name.slice(3)}` : token.name;\n return { value, name };\n };\n\n const computedThemeColors = getComputedThemeColors(dictionary.tokens);\n return (\n `${header}${selector} {${EOL}` +\n rootTokens.reduce((acc, token) => {\n const { value, name } = getValueName(token);\n return `${acc} --${name}: ${value};${EOL}`;\n }, '') +\n (computedThemeColors.length\n ? ` /* Computed theme colors */${EOL}${computedThemeColors.reduce((acc, token) => {\n return `${acc} --${prefix}${token.name.slice(3)}: ${token.$type === 'rgbRef' ? token.$value : `var(--${prefix}${token.$ref.slice(3)})`};${EOL}`;\n }, '')}`\n : '') +\n (Object.keys(groupedT3).length\n ? `${EOL} /* Tier 3 Scoped tokens */${EOL}` +\n Object.entries(groupedT3).reduce((acc, [key, tokens]) => {\n return (\n `${acc} ${tier3ScopingMap[key as Tier3Key]} {${EOL}` +\n tokens.reduce((innerAcc, token) => {\n const { value, name } = getValueName(token);\n return `${innerAcc} --${name}: ${value};${EOL}`;\n }, '') +\n ` }${EOL}`\n );\n }, '')\n : '') +\n `}${EOL}`\n );\n }\n });\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './config';\n"],"names":["sdTransforms"],"mappings":"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"}
|