ustatic-css 0.0.1
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/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/_ustatic-vars-Cx6_uZJY.cjs +1 -0
- package/dist/_ustatic-vars-D2NgNZNI.js +4 -0
- package/dist/css/modules/align.css +1 -0
- package/dist/css/modules/animations.css +1 -0
- package/dist/css/modules/base.css +1 -0
- package/dist/css/modules/bg.css +1 -0
- package/dist/css/modules/border.css +1 -0
- package/dist/css/modules/cursor.css +1 -0
- package/dist/css/modules/display.css +1 -0
- package/dist/css/modules/effects.css +1 -0
- package/dist/css/modules/filters.css +1 -0
- package/dist/css/modules/flexbox.css +1 -0
- package/dist/css/modules/grid.css +1 -0
- package/dist/css/modules/hide.css +1 -0
- package/dist/css/modules/interactivity.css +1 -0
- package/dist/css/modules/outline.css +1 -0
- package/dist/css/modules/position.css +1 -0
- package/dist/css/modules/scroll.css +1 -0
- package/dist/css/modules/sizing.css +1 -0
- package/dist/css/modules/spacing.css +1 -0
- package/dist/css/modules/typography.css +1 -0
- package/dist/css/ustatic-vars.css +1 -0
- package/dist/css/ustatic.css +1 -0
- package/dist/js/index.cjs.js +9 -0
- package/dist/js/index.es.js +175 -0
- package/dist/types/package.json.d.ts +102 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/plugins/vue.plugin.d.ts +15 -0
- package/dist/types/src/plugins/vue.plugin.d.ts.map +1 -0
- package/dist/types/src/utils/styleLoader.d.ts +35 -0
- package/dist/types/src/utils/styleLoader.d.ts.map +1 -0
- package/dist/types/src/utils/styleloader.classmap.d.ts +2 -0
- package/dist/types/src/utils/styleloader.classmap.d.ts.map +1 -0
- package/dist/types/src/utils/useCssProperties.d.ts +17 -0
- package/dist/types/src/utils/useCssProperties.d.ts.map +1 -0
- package/dist/types/src/utils/useTokens.d.ts +21 -0
- package/dist/types/src/utils/useTokens.d.ts.map +1 -0
- package/dist/ustatic-index-1SZfqZon.js +4 -0
- package/dist/ustatic-index-QcZrD98s.cjs +1 -0
- package/package.json +99 -0
- package/src/css/assets/tokens/_ustatic-list.scss +460 -0
- package/src/css/assets/tokens/_ustatic-prefix.scss +1 -0
- package/src/css/assets/tokens/_ustatic-vars.scss +757 -0
- package/src/css/modules/align/index.scss +17 -0
- package/src/css/modules/animations/index.scss +151 -0
- package/src/css/modules/base/index.scss +406 -0
- package/src/css/modules/base/scrollbar.scss +21 -0
- package/src/css/modules/bg/index.scss +60 -0
- package/src/css/modules/border/border.scss +88 -0
- package/src/css/modules/border/divider.scss +38 -0
- package/src/css/modules/border/index.scss +3 -0
- package/src/css/modules/border/rounded.scss +70 -0
- package/src/css/modules/cursor/index.scss +33 -0
- package/src/css/modules/display/index.scss +19 -0
- package/src/css/modules/effects/index.scss +35 -0
- package/src/css/modules/filters/index.scss +34 -0
- package/src/css/modules/flexbox/flex.scss +132 -0
- package/src/css/modules/flexbox/gap.scss +15 -0
- package/src/css/modules/flexbox/index.scss +2 -0
- package/src/css/modules/grid/index.scss +94 -0
- package/src/css/modules/hide/index.scss +27 -0
- package/src/css/modules/interactivity/index.scss +28 -0
- package/src/css/modules/outline/index.scss +63 -0
- package/src/css/modules/position/index.scss +94 -0
- package/src/css/modules/scroll/index.scss +68 -0
- package/src/css/modules/sizing/index.scss +91 -0
- package/src/css/modules/spacing/index.scss +56 -0
- package/src/css/modules/typography/index.scss +139 -0
- package/src/css/tokens/base/animations/underline.yaml +5 -0
- package/src/css/tokens/base/border/color.yaml +17 -0
- package/src/css/tokens/base/border/radius.yaml +33 -0
- package/src/css/tokens/base/border/width.yaml +19 -0
- package/src/css/tokens/base/color/accent.yaml +416 -0
- package/src/css/tokens/base/color/base.yaml +492 -0
- package/src/css/tokens/base/color/opacity.yaml +4 -0
- package/src/css/tokens/base/color/variant.yaml +18 -0
- package/src/css/tokens/base/cursor/base.yaml +18 -0
- package/src/css/tokens/base/font/weight.yaml +23 -0
- package/src/css/tokens/base/grid/base.yaml +9 -0
- package/src/css/tokens/base/position/base.yaml +253 -0
- package/src/css/tokens/base/rotation/base.yaml +20 -0
- package/src/css/tokens/base/screen/base.yaml +10 -0
- package/src/css/tokens/base/scroll/base.yaml +16 -0
- package/src/css/tokens/base/size/base.yaml +16 -0
- package/src/css/tokens/base/text/color.yaml +20 -0
- package/src/css/tokens/base/text/size.yaml +37 -0
- package/src/css/tokens/base/visibility/base.yaml +61 -0
- package/src/css/ustatic-index.scss +24 -0
- package/src/css/utils/_token.scss +56 -0
- package/src/css/variables.scss +359 -0
- package/src/index.ts +6 -0
- package/src/plugins/vue.plugin.ts +77 -0
- package/src/utils/styleLoader.ts +257 -0
- package/src/utils/styleloader.classmap.ts +109 -0
- package/src/utils/useCssProperties.ts +152 -0
- package/src/utils/useTokens.ts +287 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
|
|
2
|
+
import { prefix } from '../../package.json'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Преобразует имя токена в CSS-переменную с префиксом
|
|
6
|
+
* @param token - Имя токена в формате: "foo.bar.field"
|
|
7
|
+
* @returns CSS-переменная с префиксом
|
|
8
|
+
*/
|
|
9
|
+
const _getTokenName = (token: string): string => {
|
|
10
|
+
const variableName = token.replaceAll('.', '-').replaceAll('/', '-')
|
|
11
|
+
if (prefix) {
|
|
12
|
+
return `--${prefix}-${variableName}`
|
|
13
|
+
} else {
|
|
14
|
+
return `--${variableName}`
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Возвращает значение токена как var(--token) (используется при
|
|
20
|
+
* использовании значения токена в стилях, атрибуте style или внутри
|
|
21
|
+
* генерируемого класса
|
|
22
|
+
* @param token - Имя токена в формате: "foo.bar.field"
|
|
23
|
+
* @returns CSS-переменная в формате var(--token)
|
|
24
|
+
*/
|
|
25
|
+
const getCssTokenVar = (token: string): string => {
|
|
26
|
+
const tokenName = _getTokenName(token)
|
|
27
|
+
return `var(${tokenName})`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Позволяет получить значение токена, при использовании его в качестве значения
|
|
32
|
+
* для другого токена
|
|
33
|
+
* @param value - Если value начинается на 'T:' - то метод считает это значение
|
|
34
|
+
* кодом токена и пытается получить значение этого токена
|
|
35
|
+
* Иначе - возвращается само значение
|
|
36
|
+
* @returns Преобразованное значение токена
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const val = getValueFromForToken('foo.bar') // val == 'foo.bar'
|
|
40
|
+
* const val = getValueFromForToken('T:foo.bar') // val == 'var(--foo-bar)'
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
const getValueFromForToken = (value: string): string => {
|
|
44
|
+
let _value = value
|
|
45
|
+
const isValueToken = value.startsWith('T:')
|
|
46
|
+
|
|
47
|
+
if (isValueToken) {
|
|
48
|
+
_value = getCssTokenVar(value.slice(2))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return _value
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Получает значение CSS-токена из глобальной области переменных
|
|
56
|
+
* @param token - Имя токена в формате: "foo.bar.field"
|
|
57
|
+
* @returns Значение токена
|
|
58
|
+
*/
|
|
59
|
+
const getCssToken = (token: string): string => {
|
|
60
|
+
const tokenName = _getTokenName(token)
|
|
61
|
+
return getComputedStyle(document.documentElement).getPropertyValue(`${tokenName}`)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Создает значение токена как локальную переменную вида: --token: value
|
|
66
|
+
* применимо при задаче токенов в атрибуте style
|
|
67
|
+
* @param token - Имя токена в формате: "foo.bar.field"
|
|
68
|
+
* @param value - Значение токена
|
|
69
|
+
* @returns CSS-переменная в формате --token: value
|
|
70
|
+
*/
|
|
71
|
+
const setCssTokenVar = (token: string, value: string): string => {
|
|
72
|
+
const _value = getValueFromForToken(value)
|
|
73
|
+
const tokenName = _getTokenName(token)
|
|
74
|
+
return `${tokenName}: ${_value}`
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Хук для управления CSS-переменными через классы
|
|
79
|
+
* Позволяет устанавливать, получать и удалять CSS-токены как в глобальной области видимости, так и в рамках CSS-классов
|
|
80
|
+
* @returns Объект с методами для работы с токенами
|
|
81
|
+
*/
|
|
82
|
+
export const useTokens = () => {
|
|
83
|
+
const styleId = 'tokens-via-class'
|
|
84
|
+
|
|
85
|
+
const generalTokens: Set<string> = new Set()
|
|
86
|
+
const classes: Set<string> = new Set()
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Устанавливает значения переменных на основании имени токена и его значения
|
|
90
|
+
* @param className - Имя класса
|
|
91
|
+
* @param tokens - Словарь токенов, где ключ - имя токена, значение - значение токена
|
|
92
|
+
* @param options - Опции
|
|
93
|
+
* @param options.patch - Флаг, определяющий нужно ли сохранять существующие токены. По умолчанию false
|
|
94
|
+
* если patch == true, то существующие в классе токены сохраняются
|
|
95
|
+
* если patch == false, то существующие в классе токены перезатираются
|
|
96
|
+
* @info В случае применения кода токена в правой части, необходимо использовать префикс T:
|
|
97
|
+
*/
|
|
98
|
+
const setCssTokenViaClass = (className: string, tokens: Record<string, string>, options?: { patch: boolean}): void => {
|
|
99
|
+
const {
|
|
100
|
+
patch = false
|
|
101
|
+
} = options ?? {}
|
|
102
|
+
|
|
103
|
+
const classTokens = getCssTokensFromClass(className)
|
|
104
|
+
const classTokensList = patch
|
|
105
|
+
? Object.entries(classTokens)
|
|
106
|
+
?.map(([ key, value ]) => {
|
|
107
|
+
return `${key}: ${value};`
|
|
108
|
+
}) ?? []
|
|
109
|
+
: []
|
|
110
|
+
|
|
111
|
+
// Найти или создать тег <style> с нужным id
|
|
112
|
+
let styleTag = document.getElementById(styleId) as HTMLStyleElement
|
|
113
|
+
if (!styleTag) {
|
|
114
|
+
styleTag = document.createElement('style')
|
|
115
|
+
styleTag.id = styleId
|
|
116
|
+
document.head.appendChild(styleTag)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Создаем переменные для указанного класса
|
|
120
|
+
const classVariables = classTokensList
|
|
121
|
+
.concat(Object.entries(tokens)
|
|
122
|
+
.map(([ key, value ]) => {
|
|
123
|
+
const _value = getValueFromForToken(value)
|
|
124
|
+
const tokenName = _getTokenName(key)
|
|
125
|
+
return `${tokenName}: ${_value};`
|
|
126
|
+
}))
|
|
127
|
+
.join('\n ')
|
|
128
|
+
|
|
129
|
+
// Генерируем новый CSS-код для класса
|
|
130
|
+
const classContent = `.${className} {\n ${classVariables}\n}`
|
|
131
|
+
|
|
132
|
+
// Удаляем старую запись для этого класса, если она существует
|
|
133
|
+
let styleContent = styleTag.textContent || ''
|
|
134
|
+
const classRegex = new RegExp(`\\.${className}\\s*\\{[^}]*\\}`, 'g')
|
|
135
|
+
styleContent = styleContent.replace(classRegex, '')
|
|
136
|
+
|
|
137
|
+
// Добавляем обновлённый контент для класса
|
|
138
|
+
styleContent += `\n${classContent}`
|
|
139
|
+
// Обновляем содержимое тега <style>
|
|
140
|
+
styleTag.textContent = styleContent
|
|
141
|
+
|
|
142
|
+
classes.add(className)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Получает значения токенов из класса
|
|
147
|
+
* @param className - Имя класса
|
|
148
|
+
* @returns Словарь токенов, где ключ - имя токена, значение - значение токена
|
|
149
|
+
*/
|
|
150
|
+
const getCssTokensFromClass = (className: string): { [tokenName: string]: string } => {
|
|
151
|
+
const styleTag = document.getElementById(styleId) as HTMLStyleElement
|
|
152
|
+
if (!styleTag) {
|
|
153
|
+
return {}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const styleContent = styleTag.textContent
|
|
157
|
+
const classRegex = new RegExp(`\\.${className}\\s*\\{[^}]*\\}`, 'g')
|
|
158
|
+
const classContent = styleContent?.match(classRegex)
|
|
159
|
+
if (!classContent) {
|
|
160
|
+
return {}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const tokenRegex = /([a-zA-Z-]+):\s*([^;]+);/g
|
|
164
|
+
const matches = classContent[0].matchAll(tokenRegex)
|
|
165
|
+
const tokensList = Object.fromEntries(
|
|
166
|
+
Array.from(matches, (match) => [ match[1], match[2].trim() ])
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
return tokensList
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Получает значение токена из класса
|
|
174
|
+
* @param className - Имя класса
|
|
175
|
+
* @param token - Имя токена
|
|
176
|
+
* @returns Значение токена
|
|
177
|
+
*/
|
|
178
|
+
const getCssTokenViaClass = (className: string, token: string): string => {
|
|
179
|
+
const tokenName = _getTokenName(token)
|
|
180
|
+
|
|
181
|
+
// Найти или создать тег <style> с нужным id
|
|
182
|
+
const styleTag = document.getElementById(styleId) as HTMLStyleElement
|
|
183
|
+
if (!styleTag) {
|
|
184
|
+
return ''
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Получаем содержимое тега <style>
|
|
188
|
+
const styleContent = styleTag.textContent
|
|
189
|
+
// Ищем нужный класс в содержимом
|
|
190
|
+
const classRegex = new RegExp(`\\.${className}\\s*\\{[^}]*\\}`, 'g')
|
|
191
|
+
const classContent = styleContent?.match(classRegex)
|
|
192
|
+
if (!classContent) {
|
|
193
|
+
return ''
|
|
194
|
+
}
|
|
195
|
+
// Получаем значение токена
|
|
196
|
+
const tokenRegex = new RegExp(`${tokenName}:\\s*([^;]+);`, 'g')
|
|
197
|
+
const tokenStr = classContent[0].match(tokenRegex)?.[0]
|
|
198
|
+
if (!tokenStr) {
|
|
199
|
+
return ''
|
|
200
|
+
}
|
|
201
|
+
return tokenStr.split(':')[1].trim()
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Удаляет класс стилей
|
|
206
|
+
* @param className - Имя класса
|
|
207
|
+
*/
|
|
208
|
+
const removeClassWithTokens = (className:string): void => {
|
|
209
|
+
const styleTag = document.getElementById(styleId) as HTMLStyleElement
|
|
210
|
+
const isExist = classes.has(className)
|
|
211
|
+
if (!styleTag || !isExist) {
|
|
212
|
+
return
|
|
213
|
+
}
|
|
214
|
+
// Удаляем запись для этого класса, если она существует
|
|
215
|
+
let styleContent = styleTag.textContent || ''
|
|
216
|
+
const classRegex = new RegExp(`\\.${className}\\s*\\{[^}]*\\}`, 'g')
|
|
217
|
+
styleContent = styleContent.replace(classRegex, '')
|
|
218
|
+
// Обновляем содержимое тега <style>
|
|
219
|
+
styleTag.textContent = styleContent
|
|
220
|
+
// Удаляем класс из списка
|
|
221
|
+
classes.delete(className)
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Удаляет все классы со значениями токенов
|
|
226
|
+
*/
|
|
227
|
+
const clearClassWithTokens = (): void => {
|
|
228
|
+
classes.forEach(className => {
|
|
229
|
+
removeClassWithTokens(className)
|
|
230
|
+
})
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Устанавливает значение CSS-токена в глобальной области
|
|
235
|
+
* @param token - Имя токена в формате: "foo.bar.field"
|
|
236
|
+
* @param value - Значение токена
|
|
237
|
+
*/
|
|
238
|
+
const setCssToken = (token: string, value: string): void => {
|
|
239
|
+
const _value = getValueFromForToken(value)
|
|
240
|
+
const tokenName = _getTokenName(token)
|
|
241
|
+
generalTokens.add(token)
|
|
242
|
+
document.documentElement.style.setProperty(`${tokenName}`, _value)
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Удаляет CSS-токен из глобальной области
|
|
247
|
+
* @param token - Имя токена в формате: "foo.bar.field"
|
|
248
|
+
*/
|
|
249
|
+
const removeCssToken = (token: string): void => {
|
|
250
|
+
const tokenName = _getTokenName(token)
|
|
251
|
+
generalTokens.delete(token)
|
|
252
|
+
document.documentElement.style.removeProperty(`${tokenName}`)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Удаляет все CSS-токены из глобальной области
|
|
257
|
+
*/
|
|
258
|
+
const clearCssTokens = (): void => {
|
|
259
|
+
generalTokens.forEach(token => {
|
|
260
|
+
removeCssToken(token)
|
|
261
|
+
})
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Полная очистка всех изменений токенов
|
|
266
|
+
* Удаляет все токены из глобальной области и все классы со значениями токенов
|
|
267
|
+
*/
|
|
268
|
+
const clearAll = () => {
|
|
269
|
+
clearCssTokens()
|
|
270
|
+
clearClassWithTokens()
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return {
|
|
274
|
+
setCssTokenViaClass,
|
|
275
|
+
getCssTokenViaClass,
|
|
276
|
+
removeClassWithTokens,
|
|
277
|
+
clearClassWithTokens,
|
|
278
|
+
setCssToken,
|
|
279
|
+
removeCssToken,
|
|
280
|
+
clearCssTokens,
|
|
281
|
+
getCssToken,
|
|
282
|
+
getCssTokenVar,
|
|
283
|
+
setCssTokenVar,
|
|
284
|
+
clearAll
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|