@kong/design-tokens 1.18.2 → 1.18.3-pr.613.b9dd522.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.
@@ -1,3 +1,4 @@
1
1
  import useProperToken from './rules/use-proper-token/index.mjs'
2
+ import useCssToken from './rules/use-css-token/index.mjs'
2
3
 
3
- export default [useProperToken]
4
+ export default [useProperToken, useCssToken]
@@ -0,0 +1,144 @@
1
+ import stylelint from 'stylelint'
2
+ import { KONG_TOKEN_PREFIX, RULE_NAME_PREFIX } from '../../utilities/index.mjs'
3
+
4
+ const { ruleMessages, validateOptions, report } = stylelint.utils
5
+ const ruleName = `${RULE_NAME_PREFIX}/use-css-token`
6
+ const messages = ruleMessages(ruleName, {
7
+ expected: 'SCSS tokens must be used as fallback values in CSS custom properties. Use format: var(--kui-design-token, $kui-design-token)',
8
+ })
9
+ const meta = {
10
+ url: 'https://github.com/Kong/design-tokens/blob/main/stylelint-plugin/README.md',
11
+ fixable: true,
12
+ }
13
+
14
+ // Convert SCSS token ($kui-token) to CSS token (--kui-token)
15
+ const getCssToken = (scssToken) => {
16
+ const tokenName = scssToken.substring(1) // Remove $
17
+ return `--${tokenName}`
18
+ }
19
+
20
+ // Create regex pattern to match var(--token, $token) format
21
+ const createProperUsagePattern = (cssToken, scssToken) => {
22
+ return new RegExp(`var\\(\\s*${cssToken}\\s*,\\s*${scssToken}\\s*\\)`)
23
+ }
24
+
25
+ // Find all occurrences of a token in a value
26
+ const findAllTokenOccurrences = (value, token) => {
27
+ const occurrences = []
28
+ let searchIndex = 0
29
+ while (true) {
30
+ const index = value.indexOf(token, searchIndex)
31
+ if (index === -1) {
32
+ break
33
+ }
34
+ occurrences.push(index)
35
+ searchIndex = index + 1
36
+ }
37
+ return occurrences
38
+ }
39
+
40
+ // Check if token at given position is properly wrapped in var()
41
+ const isTokenProperlyWrapped = (value, tokenIndex, token, pattern) => {
42
+ const windowStart = Math.max(0, tokenIndex - 100)
43
+ const windowEnd = Math.min(value.length, tokenIndex + token.length + 100)
44
+ const context = value.substring(windowStart, windowEnd)
45
+ return pattern.test(context)
46
+ }
47
+
48
+ const ruleFunction = () => {
49
+ return (postcssRoot, postcssResult) => {
50
+ const validOptions = validateOptions(postcssRoot, ruleName, {})
51
+
52
+ if (!validOptions) {
53
+ return
54
+ }
55
+
56
+ postcssRoot.walkDecls((decl) => {
57
+ const declValue = decl.value
58
+
59
+ // Extract all SCSS tokens (starting with $kui-)
60
+ const scssTokenRegex = new RegExp(`\\$${KONG_TOKEN_PREFIX}[a-z0-9-]+`, 'g')
61
+ const scssTokens = declValue.match(scssTokenRegex)
62
+
63
+ // If no SCSS tokens are used, skip validation
64
+ if (!scssTokens || scssTokens.length === 0) {
65
+ return
66
+ }
67
+
68
+ // Get unique SCSS tokens
69
+ const uniqueScssTokens = Array.from(new Set(scssTokens))
70
+
71
+ // Check if each SCSS token is properly wrapped in var()
72
+ // Pattern: var(--kui-token-name, $kui-token-name)
73
+ const improperlyUsedTokens = []
74
+
75
+ uniqueScssTokens.forEach((scssToken) => {
76
+ const cssToken = getCssToken(scssToken)
77
+ const properUsagePattern = createProperUsagePattern(cssToken, scssToken)
78
+ const tokenOccurrences = findAllTokenOccurrences(declValue, scssToken)
79
+
80
+ // Check each occurrence to see if it's properly wrapped
81
+ const hasImproperUsage = tokenOccurrences.some((tokenIndex) => {
82
+ return !isTokenProperlyWrapped(declValue, tokenIndex, scssToken, properUsagePattern)
83
+ })
84
+
85
+ if (hasImproperUsage) {
86
+ improperlyUsedTokens.push(scssToken)
87
+ }
88
+ })
89
+
90
+ if (improperlyUsedTokens.length > 0) {
91
+ // Create fix function
92
+ const fix = () => {
93
+ let fixedValue = declValue
94
+ const replacements = []
95
+
96
+ // First, identify all positions that need to be replaced
97
+ improperlyUsedTokens.forEach((scssToken) => {
98
+ const cssToken = getCssToken(scssToken)
99
+ const properUsagePattern = createProperUsagePattern(cssToken, scssToken)
100
+ const tokenOccurrences = findAllTokenOccurrences(fixedValue, scssToken)
101
+ const properFormat = `var(${cssToken}, ${scssToken})`
102
+
103
+ tokenOccurrences.forEach((index) => {
104
+ // Check if this occurrence is in proper format
105
+ if (!isTokenProperlyWrapped(fixedValue, index, scssToken, properUsagePattern)) {
106
+ // This occurrence needs to be replaced
107
+ replacements.push({
108
+ start: index,
109
+ end: index + scssToken.length,
110
+ replacement: properFormat,
111
+ })
112
+ }
113
+ })
114
+ })
115
+
116
+ // Sort replacements by position (descending) to avoid offset issues
117
+ replacements.sort((a, b) => b.start - a.start)
118
+
119
+ // Apply replacements from end to start
120
+ replacements.forEach(({ start, end, replacement }) => {
121
+ fixedValue = fixedValue.substring(0, start) + replacement + fixedValue.substring(end)
122
+ })
123
+
124
+ decl.value = fixedValue
125
+ }
126
+
127
+ report({
128
+ message: messages.expected,
129
+ node: decl,
130
+ result: postcssResult,
131
+ ruleName,
132
+ fix,
133
+ })
134
+ }
135
+ })
136
+ }
137
+ }
138
+
139
+ ruleFunction.ruleName = ruleName
140
+ ruleFunction.messages = messages
141
+ ruleFunction.meta = meta
142
+
143
+ export default stylelint.createPlugin(ruleName, ruleFunction)
144
+
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Do not edit directly, this file was auto-generated.
3
- * Generated on Tue, 25 Nov 2025 21:23:14 GMT
3
+ * Generated on Mon, 05 Jan 2026 16:56:03 GMT
4
4
  *
5
5
  * Kong Design Tokens
6
6
  * GitHub: https://github.com/Kong/design-tokens
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Do not edit directly, this file was auto-generated.
3
- * Generated on Tue, 25 Nov 2025 21:23:14 GMT
3
+ * Generated on Mon, 05 Jan 2026 16:56:03 GMT
4
4
  *
5
5
  * Kong Design Tokens
6
6
  * GitHub: https://github.com/Kong/design-tokens
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Do not edit directly, this file was auto-generated.
3
- * Generated on Tue, 25 Nov 2025 21:23:14 GMT
3
+ * Generated on Mon, 05 Jan 2026 16:56:03 GMT
4
4
  *
5
5
  * Kong Design Tokens
6
6
  * GitHub: https://github.com/Kong/design-tokens
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Do not edit directly, this file was auto-generated.
3
- * Generated on Tue, 25 Nov 2025 21:23:14 GMT
3
+ * Generated on Mon, 05 Jan 2026 16:56:03 GMT
4
4
  *
5
5
  * Kong Design Tokens
6
6
  * GitHub: https://github.com/Kong/design-tokens
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Do not edit directly, this file was auto-generated.
3
- * Generated on Tue, 25 Nov 2025 21:23:14 GMT
3
+ * Generated on Mon, 05 Jan 2026 16:56:03 GMT
4
4
  *
5
5
  * Kong Design Tokens
6
6
  * GitHub: https://github.com/Kong/design-tokens
@@ -1,6 +1,6 @@
1
1
 
2
2
  // Do not edit directly, this file was auto-generated.
3
- // Generated on Tue, 25 Nov 2025 21:23:14 GMT
3
+ // Generated on Mon, 05 Jan 2026 16:56:03 GMT
4
4
  //
5
5
  // Kong Design Tokens
6
6
  // GitHub: https://github.com/Kong/design-tokens
@@ -1,7 +1,7 @@
1
1
 
2
2
  /**
3
3
  * Do not edit directly, this file was auto-generated.
4
- * Generated on Tue, 25 Nov 2025 21:23:14 GMT
4
+ * Generated on Mon, 05 Jan 2026 16:56:03 GMT
5
5
  *
6
6
  * Kong Design Tokens
7
7
  * GitHub: https://github.com/Kong/design-tokens
@@ -1,6 +1,6 @@
1
1
 
2
2
  // Do not edit directly, this file was auto-generated.
3
- // Generated on Tue, 25 Nov 2025 21:23:14 GMT
3
+ // Generated on Mon, 05 Jan 2026 16:56:03 GMT
4
4
  //
5
5
  // Kong Design Tokens
6
6
  // GitHub: https://github.com/Kong/design-tokens
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kong/design-tokens",
3
- "version": "1.18.2",
3
+ "version": "1.18.3-pr.613.b9dd522.0",
4
4
  "description": "Kong UI Design Tokens and style dictionary",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -53,30 +53,30 @@
53
53
  "url": "https://github.com/Kong/design-tokens/issues"
54
54
  },
55
55
  "devDependencies": {
56
- "@commitlint/cli": "^20.1.0",
57
- "@commitlint/config-conventional": "^20.0.0",
56
+ "@commitlint/cli": "^20.2.0",
57
+ "@commitlint/config-conventional": "^20.2.0",
58
58
  "@digitalroute/cz-conventional-changelog-for-jira": "^8.0.1",
59
- "@evilmartians/lefthook": "^2.0.2",
60
- "@kong/eslint-config-kong-ui": "^1.5.6",
59
+ "@evilmartians/lefthook": "^2.0.13",
60
+ "@kong/eslint-config-kong-ui": "^1.6.0",
61
61
  "@semantic-release/changelog": "^6.0.3",
62
62
  "@semantic-release/git": "^10.0.1",
63
- "@vitejs/plugin-vue": "^6.0.1",
63
+ "@vitejs/plugin-vue": "^6.0.3",
64
64
  "chokidar-cli": "^3.0.0",
65
65
  "commitizen": "^4.3.1",
66
66
  "cz-conventional-changelog": "^3.3.0",
67
- "eslint": "^9.39.1",
67
+ "eslint": "^9.39.2",
68
68
  "npm-run-all2": "^8.0.4",
69
- "rimraf": "^6.1.0",
70
- "sass": "^1.93.3",
71
- "semantic-release": "^25.0.1",
69
+ "rimraf": "^6.1.2",
70
+ "sass": "^1.97.1",
71
+ "semantic-release": "^25.0.2",
72
72
  "shx": "^0.4.0",
73
73
  "style-dictionary": "^4.4.0",
74
74
  "typescript": "^5.9.3",
75
- "vite": "^7.1.12",
75
+ "vite": "^7.3.0",
76
76
  "vite-plugin-restart": "^2.0.0",
77
- "vite-plugin-vue-devtools": "^8.0.3",
78
- "vue": "^3.5.22",
79
- "vue-router": "^4.6.3"
77
+ "vite-plugin-vue-devtools": "^8.0.5",
78
+ "vue": "^3.5.26",
79
+ "vue-router": "^4.6.4"
80
80
  },
81
81
  "release": {
82
82
  "branches": [
@@ -126,13 +126,13 @@
126
126
  "jiraAppend": "]"
127
127
  }
128
128
  },
129
- "packageManager": "pnpm@10.20.0",
129
+ "packageManager": "pnpm@10.26.2",
130
130
  "engines": {
131
131
  "node": ">=20.19.5",
132
132
  "pnpm": ">=9.14.4 || >=10.1.0"
133
133
  },
134
134
  "volta": {
135
- "node": "24.11.0"
135
+ "node": "24.12.0"
136
136
  },
137
137
  "pnpm": {
138
138
  "onlyBuiltDependencies": [