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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/dist/_ustatic-vars-Cx6_uZJY.cjs +1 -0
  4. package/dist/_ustatic-vars-D2NgNZNI.js +4 -0
  5. package/dist/css/modules/align.css +1 -0
  6. package/dist/css/modules/animations.css +1 -0
  7. package/dist/css/modules/base.css +1 -0
  8. package/dist/css/modules/bg.css +1 -0
  9. package/dist/css/modules/border.css +1 -0
  10. package/dist/css/modules/cursor.css +1 -0
  11. package/dist/css/modules/display.css +1 -0
  12. package/dist/css/modules/effects.css +1 -0
  13. package/dist/css/modules/filters.css +1 -0
  14. package/dist/css/modules/flexbox.css +1 -0
  15. package/dist/css/modules/grid.css +1 -0
  16. package/dist/css/modules/hide.css +1 -0
  17. package/dist/css/modules/interactivity.css +1 -0
  18. package/dist/css/modules/outline.css +1 -0
  19. package/dist/css/modules/position.css +1 -0
  20. package/dist/css/modules/scroll.css +1 -0
  21. package/dist/css/modules/sizing.css +1 -0
  22. package/dist/css/modules/spacing.css +1 -0
  23. package/dist/css/modules/typography.css +1 -0
  24. package/dist/css/ustatic-vars.css +1 -0
  25. package/dist/css/ustatic.css +1 -0
  26. package/dist/js/index.cjs.js +9 -0
  27. package/dist/js/index.es.js +175 -0
  28. package/dist/types/package.json.d.ts +102 -0
  29. package/dist/types/src/index.d.ts +4 -0
  30. package/dist/types/src/index.d.ts.map +1 -0
  31. package/dist/types/src/plugins/vue.plugin.d.ts +15 -0
  32. package/dist/types/src/plugins/vue.plugin.d.ts.map +1 -0
  33. package/dist/types/src/utils/styleLoader.d.ts +35 -0
  34. package/dist/types/src/utils/styleLoader.d.ts.map +1 -0
  35. package/dist/types/src/utils/styleloader.classmap.d.ts +2 -0
  36. package/dist/types/src/utils/styleloader.classmap.d.ts.map +1 -0
  37. package/dist/types/src/utils/useCssProperties.d.ts +17 -0
  38. package/dist/types/src/utils/useCssProperties.d.ts.map +1 -0
  39. package/dist/types/src/utils/useTokens.d.ts +21 -0
  40. package/dist/types/src/utils/useTokens.d.ts.map +1 -0
  41. package/dist/ustatic-index-1SZfqZon.js +4 -0
  42. package/dist/ustatic-index-QcZrD98s.cjs +1 -0
  43. package/package.json +99 -0
  44. package/src/css/assets/tokens/_ustatic-list.scss +460 -0
  45. package/src/css/assets/tokens/_ustatic-prefix.scss +1 -0
  46. package/src/css/assets/tokens/_ustatic-vars.scss +757 -0
  47. package/src/css/modules/align/index.scss +17 -0
  48. package/src/css/modules/animations/index.scss +151 -0
  49. package/src/css/modules/base/index.scss +406 -0
  50. package/src/css/modules/base/scrollbar.scss +21 -0
  51. package/src/css/modules/bg/index.scss +60 -0
  52. package/src/css/modules/border/border.scss +88 -0
  53. package/src/css/modules/border/divider.scss +38 -0
  54. package/src/css/modules/border/index.scss +3 -0
  55. package/src/css/modules/border/rounded.scss +70 -0
  56. package/src/css/modules/cursor/index.scss +33 -0
  57. package/src/css/modules/display/index.scss +19 -0
  58. package/src/css/modules/effects/index.scss +35 -0
  59. package/src/css/modules/filters/index.scss +34 -0
  60. package/src/css/modules/flexbox/flex.scss +132 -0
  61. package/src/css/modules/flexbox/gap.scss +15 -0
  62. package/src/css/modules/flexbox/index.scss +2 -0
  63. package/src/css/modules/grid/index.scss +94 -0
  64. package/src/css/modules/hide/index.scss +27 -0
  65. package/src/css/modules/interactivity/index.scss +28 -0
  66. package/src/css/modules/outline/index.scss +63 -0
  67. package/src/css/modules/position/index.scss +94 -0
  68. package/src/css/modules/scroll/index.scss +68 -0
  69. package/src/css/modules/sizing/index.scss +91 -0
  70. package/src/css/modules/spacing/index.scss +56 -0
  71. package/src/css/modules/typography/index.scss +139 -0
  72. package/src/css/tokens/base/animations/underline.yaml +5 -0
  73. package/src/css/tokens/base/border/color.yaml +17 -0
  74. package/src/css/tokens/base/border/radius.yaml +33 -0
  75. package/src/css/tokens/base/border/width.yaml +19 -0
  76. package/src/css/tokens/base/color/accent.yaml +416 -0
  77. package/src/css/tokens/base/color/base.yaml +492 -0
  78. package/src/css/tokens/base/color/opacity.yaml +4 -0
  79. package/src/css/tokens/base/color/variant.yaml +18 -0
  80. package/src/css/tokens/base/cursor/base.yaml +18 -0
  81. package/src/css/tokens/base/font/weight.yaml +23 -0
  82. package/src/css/tokens/base/grid/base.yaml +9 -0
  83. package/src/css/tokens/base/position/base.yaml +253 -0
  84. package/src/css/tokens/base/rotation/base.yaml +20 -0
  85. package/src/css/tokens/base/screen/base.yaml +10 -0
  86. package/src/css/tokens/base/scroll/base.yaml +16 -0
  87. package/src/css/tokens/base/size/base.yaml +16 -0
  88. package/src/css/tokens/base/text/color.yaml +20 -0
  89. package/src/css/tokens/base/text/size.yaml +37 -0
  90. package/src/css/tokens/base/visibility/base.yaml +61 -0
  91. package/src/css/ustatic-index.scss +24 -0
  92. package/src/css/utils/_token.scss +56 -0
  93. package/src/css/variables.scss +359 -0
  94. package/src/index.ts +6 -0
  95. package/src/plugins/vue.plugin.ts +77 -0
  96. package/src/utils/styleLoader.ts +257 -0
  97. package/src/utils/styleloader.classmap.ts +109 -0
  98. package/src/utils/useCssProperties.ts +152 -0
  99. 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
+