acrylblends 0.6.1 → 0.6.3

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 (217) hide show
  1. package/README.md +11 -6
  2. package/docs/framework/README.md +3 -2
  3. package/docs/framework/UPSTREAM.md +1 -1
  4. package/docs/framework/api/presets.md +0 -3
  5. package/docs/framework/cordis/acryl-in-a-cordis-app.md +9 -0
  6. package/docs/framework/getting-started/basic.md +5 -4
  7. package/docs/framework/getting-started/desktop.md +41 -0
  8. package/docs/framework/guides/jsx-dom.md +0 -3
  9. package/docs/framework/guides/jsx.md +1 -4
  10. package/docs/framework/guides/middleware.md +1 -1
  11. package/docs/framework/helpers/cookie.md +1 -1
  12. package/docs/framework/helpers/css.md +0 -3
  13. package/docs/framework/helpers/dev.md +0 -3
  14. package/docs/framework/helpers/jwt.md +1 -1
  15. package/docs/framework/helpers/proxy.md +0 -3
  16. package/docs/framework/middleware/builtin/basic-auth.md +6 -6
  17. package/docs/framework/middleware/builtin/cache.md +0 -3
  18. package/docs/framework/middleware/builtin/combine.md +1 -1
  19. package/docs/framework/middleware/builtin/ip-restriction.md +1 -1
  20. package/docs/framework/middleware/builtin/logger.md +1 -1
  21. package/docs/framework/middleware/builtin/mount.md +0 -3
  22. package/docs/framework/upstream.json +3 -3
  23. package/lib/accepts.d.ts +1 -1
  24. package/lib/acryl-base.d.ts +1 -1
  25. package/lib/adapter.d.ts +1 -1
  26. package/lib/{app-CmAYW1Al.d.ts → app-wFwpg-bt.d.ts} +1 -1
  27. package/lib/base-BpQy2Rk7.d.ts +783 -0
  28. package/lib/base-ddiVmiE7.js +721 -0
  29. package/lib/basic-auth.d.ts +1 -1
  30. package/lib/bearer-auth.d.ts +1 -1
  31. package/lib/body-limit.d.ts +1 -1
  32. package/lib/cache.d.ts +43 -0
  33. package/lib/cache.js +169 -0
  34. package/lib/client.d.ts +2 -2
  35. package/lib/combine.d.ts +1 -1
  36. package/lib/common-D8Z4JRCw.d.ts +46 -0
  37. package/lib/components-Ce5FRyHU.js +268 -0
  38. package/lib/components-DYZdxJIJ.js +24 -0
  39. package/lib/compress.d.ts +1 -1
  40. package/lib/conninfo.d.ts +2 -2
  41. package/lib/constants-BR9jM9BC.js +9 -0
  42. package/lib/{context-Bm7rI-oK.d.ts → context-DVQBjuns.d.ts} +1 -1
  43. package/lib/context-DxFdY_un.d.ts +250 -0
  44. package/lib/context-storage.d.ts +1 -1
  45. package/lib/{cookie-ClMaKDQf.d.ts → cookie-CCelEqky.d.ts} +1 -1
  46. package/lib/cookie.d.ts +3 -3
  47. package/lib/cors.d.ts +1 -1
  48. package/lib/csrf.d.ts +1 -1
  49. package/lib/css-D2jb7X8b.js +320 -0
  50. package/lib/css.d.ts +82 -0
  51. package/lib/css.js +134 -0
  52. package/lib/dev.d.ts +19 -0
  53. package/lib/dev.js +50 -0
  54. package/lib/etag.d.ts +1 -1
  55. package/lib/factory.d.ts +2 -2
  56. package/lib/hooks-Bq5q9IMl.js +762 -0
  57. package/lib/html-SllAe0YT.d.ts +46 -0
  58. package/lib/html.d.ts +1 -1
  59. package/lib/index-C850MeBA.d.ts +94 -0
  60. package/lib/{index-oOClm_Xk.d.ts → index-CUTfU69R.d.ts} +3 -3
  61. package/lib/{index-B-3F4wt2.d.ts → index-Cqcdluyn.d.ts} +2 -2
  62. package/lib/{index-UTBmM3GX.d.ts → index-CsvB-F9j.d.ts} +2 -2
  63. package/lib/index.d.ts +4 -4
  64. package/lib/ip-restriction.d.ts +2 -2
  65. package/lib/jsx/dom/client.d.ts +30 -0
  66. package/lib/jsx/dom/client.js +49 -0
  67. package/lib/jsx/dom/css.d.ts +84 -0
  68. package/lib/jsx/dom/css.js +2 -0
  69. package/lib/jsx/dom/jsx-dev-runtime.d.ts +3 -0
  70. package/lib/jsx/dom/jsx-dev-runtime.js +2 -0
  71. package/lib/jsx/dom/jsx-runtime.d.ts +3 -0
  72. package/lib/jsx/dom/jsx-runtime.js +2 -0
  73. package/lib/jsx/dom/server.d.ts +105 -0
  74. package/lib/jsx/dom/server.js +37 -0
  75. package/lib/jsx/dom.d.ts +5 -0
  76. package/lib/jsx/dom.js +74 -0
  77. package/lib/jsx/jsx-dev-runtime.d.ts +6 -0
  78. package/lib/jsx/jsx-dev-runtime.js +14 -0
  79. package/lib/jsx/jsx-runtime.d.ts +10 -0
  80. package/lib/jsx/jsx-runtime.js +30 -0
  81. package/lib/jsx/streaming.d.ts +2 -0
  82. package/lib/jsx/streaming.js +2 -0
  83. package/lib/jsx-dev-runtime-B22O-Npk.d.ts +7 -0
  84. package/lib/jsx-dev-runtime-kAhR_4C7.js +354 -0
  85. package/lib/jsx-runtime-BVVgDSdq.d.ts +1 -0
  86. package/lib/jsx.d.ts +3 -0
  87. package/lib/jsx.js +47 -0
  88. package/lib/jwk.d.ts +4 -4
  89. package/lib/{jwt-Dg493Tai.d.ts → jwt-BARhotDz.d.ts} +1 -1
  90. package/lib/jwt.d.ts +4 -4
  91. package/lib/language.d.ts +1 -1
  92. package/lib/linear-router-C3FPib6h.js +96 -0
  93. package/lib/logger.d.ts +1 -1
  94. package/lib/loopback-only.d.ts +1 -1
  95. package/lib/method-not-allowed.d.ts +2 -2
  96. package/lib/method-override.d.ts +2 -2
  97. package/lib/mount.d.ts +44 -0
  98. package/lib/mount.js +67 -0
  99. package/lib/node-server/conninfo.d.ts +1 -1
  100. package/lib/node-server/serve-static.d.ts +1 -1
  101. package/lib/node-server/serve-static.js +1 -1
  102. package/lib/node-server.d.ts +1 -1
  103. package/lib/node-server.js +1 -1
  104. package/lib/pattern-router-HZxjDGEQ.js +41 -0
  105. package/lib/powered-by.d.ts +1 -1
  106. package/lib/pretty-json.d.ts +1 -1
  107. package/lib/proxy.d.ts +72 -0
  108. package/lib/proxy.js +121 -0
  109. package/lib/quick.d.ts +8 -0
  110. package/lib/quick.js +17 -0
  111. package/lib/request-id.d.ts +1 -1
  112. package/lib/request.d.ts +1 -1
  113. package/lib/route.d.ts +1 -1
  114. package/lib/router/linear-router.js +1 -95
  115. package/lib/router/pattern-router.js +1 -40
  116. package/lib/schema-validator.d.ts +1 -1
  117. package/lib/secure-headers.d.ts +1 -1
  118. package/lib/{serve-static-Dw_m6KxR.js → serve-static-Cw23shXv.js} +1 -0
  119. package/lib/serve-static.d.ts +1 -1
  120. package/lib/streaming.d.ts +1 -1
  121. package/lib/testing.d.ts +4 -4
  122. package/lib/timeout.d.ts +1 -1
  123. package/lib/timing.d.ts +1 -1
  124. package/lib/tiny.d.ts +8 -0
  125. package/lib/tiny.js +15 -0
  126. package/lib/trailing-slash.d.ts +1 -1
  127. package/lib/{types-CHesD1KG.d.ts → types-CQiGmsWW.d.ts} +3 -3
  128. package/lib/{types-CwrQjlaM.d.ts → types-Lqx5BxQF.d.ts} +10 -1
  129. package/lib/{types-CDO6I3B0.d.ts → types-nEL8VPDC.d.ts} +1 -1
  130. package/lib/types.d.ts +1 -1
  131. package/lib/utils/body.d.ts +1 -1
  132. package/lib/utils/cookie.d.ts +1 -1
  133. package/lib/utils/crypto.d.ts +1 -1
  134. package/lib/utils/html.d.ts +1 -45
  135. package/lib/utils/ipaddr.d.ts +1 -1
  136. package/lib/utils/jwt.d.ts +1 -1
  137. package/lib/utils/types.d.ts +2 -2
  138. package/lib/validator.d.ts +2 -2
  139. package/lib/ws.d.ts +1 -1
  140. package/package.json +69 -1
  141. package/plugins/acryl-inspect/upstream.json +1 -1
  142. package/plugins/acryl-node-server/upstream.json +1 -1
  143. package/plugins/acryl-router/src/core/helper/css/common.case.test.tsx +506 -0
  144. package/plugins/acryl-router/src/core/helper/css/common.ts +337 -0
  145. package/plugins/acryl-router/src/core/helper/css/index.test.tsx +678 -0
  146. package/plugins/acryl-router/src/core/helper/css/index.ts +262 -0
  147. package/plugins/acryl-router/src/core/helper/dev/index.test.ts +181 -0
  148. package/plugins/acryl-router/src/core/helper/dev/index.ts +79 -0
  149. package/plugins/acryl-router/src/core/helper/proxy/index.test.ts +356 -0
  150. package/plugins/acryl-router/src/core/helper/proxy/index.ts +203 -0
  151. package/plugins/acryl-router/src/core/helper/streaming/sse.test.tsx +557 -0
  152. package/plugins/acryl-router/src/core/jsx/base.test.tsx +97 -0
  153. package/plugins/acryl-router/src/core/jsx/base.ts +490 -0
  154. package/plugins/acryl-router/src/core/jsx/children.test.ts +52 -0
  155. package/plugins/acryl-router/src/core/jsx/children.ts +20 -0
  156. package/plugins/acryl-router/src/core/jsx/components.test.tsx +936 -0
  157. package/plugins/acryl-router/src/core/jsx/components.ts +257 -0
  158. package/plugins/acryl-router/src/core/jsx/constants.ts +6 -0
  159. package/plugins/acryl-router/src/core/jsx/context-isolation.test.ts +655 -0
  160. package/plugins/acryl-router/src/core/jsx/context.ts +266 -0
  161. package/plugins/acryl-router/src/core/jsx/dom/client.test.tsx +128 -0
  162. package/plugins/acryl-router/src/core/jsx/dom/client.ts +89 -0
  163. package/plugins/acryl-router/src/core/jsx/dom/components.test.tsx +330 -0
  164. package/plugins/acryl-router/src/core/jsx/dom/components.ts +39 -0
  165. package/plugins/acryl-router/src/core/jsx/dom/context.test.tsx +184 -0
  166. package/plugins/acryl-router/src/core/jsx/dom/context.ts +52 -0
  167. package/plugins/acryl-router/src/core/jsx/dom/css.test.tsx +149 -0
  168. package/plugins/acryl-router/src/core/jsx/dom/css.ts +263 -0
  169. package/plugins/acryl-router/src/core/jsx/dom/hooks/index.test.tsx +172 -0
  170. package/plugins/acryl-router/src/core/jsx/dom/hooks/index.ts +91 -0
  171. package/plugins/acryl-router/src/core/jsx/dom/index.test.tsx +3681 -0
  172. package/plugins/acryl-router/src/core/jsx/dom/index.ts +170 -0
  173. package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.test.tsx +1344 -0
  174. package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.ts +438 -0
  175. package/plugins/acryl-router/src/core/jsx/dom/jsx-dev-runtime.ts +23 -0
  176. package/plugins/acryl-router/src/core/jsx/dom/jsx-runtime.ts +8 -0
  177. package/plugins/acryl-router/src/core/jsx/dom/render.ts +879 -0
  178. package/plugins/acryl-router/src/core/jsx/dom/server.test.tsx +199 -0
  179. package/plugins/acryl-router/src/core/jsx/dom/server.ts +76 -0
  180. package/plugins/acryl-router/src/core/jsx/dom/utils.ts +7 -0
  181. package/plugins/acryl-router/src/core/jsx/hooks/dom.test.tsx +859 -0
  182. package/plugins/acryl-router/src/core/jsx/hooks/index.ts +437 -0
  183. package/plugins/acryl-router/src/core/jsx/hooks/string.test.tsx +40 -0
  184. package/plugins/acryl-router/src/core/jsx/index.test.tsx +1744 -0
  185. package/plugins/acryl-router/src/core/jsx/index.ts +115 -0
  186. package/plugins/acryl-router/src/core/jsx/intrinsic-element/common.ts +23 -0
  187. package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.test.tsx +666 -0
  188. package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.ts +210 -0
  189. package/plugins/acryl-router/src/core/jsx/intrinsic-elements.ts +938 -0
  190. package/plugins/acryl-router/src/core/jsx/jsx-dev-runtime.ts +26 -0
  191. package/plugins/acryl-router/src/core/jsx/jsx-runtime.test.tsx +85 -0
  192. package/plugins/acryl-router/src/core/jsx/jsx-runtime.ts +51 -0
  193. package/plugins/acryl-router/src/core/jsx/streaming.test.tsx +1281 -0
  194. package/plugins/acryl-router/src/core/jsx/streaming.ts +231 -0
  195. package/plugins/acryl-router/src/core/jsx/types.ts +41 -0
  196. package/plugins/acryl-router/src/core/jsx/utils.test.ts +366 -0
  197. package/plugins/acryl-router/src/core/jsx/utils.ts +202 -0
  198. package/plugins/acryl-router/src/core/middleware/cache/index.test.ts +1211 -0
  199. package/plugins/acryl-router/src/core/middleware/cache/index.ts +323 -0
  200. package/plugins/acryl-router/src/core/middleware/mount/index.test.ts +334 -0
  201. package/plugins/acryl-router/src/core/middleware/mount/index.ts +108 -0
  202. package/plugins/acryl-router/src/core/preset/quick.test.ts +42 -0
  203. package/plugins/acryl-router/src/core/preset/quick.ts +24 -0
  204. package/plugins/acryl-router/src/core/preset/tiny.test.ts +42 -0
  205. package/plugins/acryl-router/src/core/preset/tiny.ts +20 -0
  206. package/plugins/acryl-router/src/core/utils/types.ts +9 -0
  207. package/plugins/acryl-router/src/helpers/index.ts +3 -0
  208. package/plugins/acryl-router/src/middleware/index.ts +2 -0
  209. package/plugins/acryl-router/src/service.ts +22 -5
  210. package/plugins/acryl-router/tests/jsx.spec.tsx +63 -0
  211. package/plugins/acryl-router/upstream.json +3 -3
  212. package/plugins/acryl-router-http/upstream.json +1 -1
  213. package/plugins/acryl-state/upstream.json +1 -1
  214. package/plugins/desktop/upstream.json +1 -1
  215. package/plugins/desktop-web/upstream.json +1 -1
  216. package/plugins/save/plugin.json +1 -1
  217. package/templates/todo/upstream.json +1 -1
@@ -0,0 +1,337 @@
1
+ // provide utility functions for css helper both on server and client
2
+ export const PSEUDO_GLOBAL_SELECTOR = ':-acryl-global'
3
+ export const isPseudoGlobalSelectorRe = new RegExp(`^${PSEUDO_GLOBAL_SELECTOR}{(.*)}$`)
4
+ export const DEFAULT_STYLE_ID = 'acryl-css'
5
+
6
+ export const SELECTOR: unique symbol = Symbol()
7
+ export const CLASS_NAME: unique symbol = Symbol()
8
+ export const STYLE_STRING: unique symbol = Symbol()
9
+ export const SELECTORS: unique symbol = Symbol()
10
+ export const EXTERNAL_CLASS_NAMES: unique symbol = Symbol()
11
+ const CSS_ESCAPED: unique symbol = Symbol()
12
+
13
+ export interface CssClassName {
14
+ [SELECTOR]: string
15
+ [CLASS_NAME]: string
16
+ [STYLE_STRING]: string
17
+ [SELECTORS]: CssClassName[]
18
+ [EXTERNAL_CLASS_NAMES]: string[]
19
+ }
20
+
21
+ export const IS_CSS_ESCAPED = Symbol()
22
+
23
+ interface CssEscapedString {
24
+ [CSS_ESCAPED]: string
25
+ }
26
+
27
+ /**
28
+ * @experimental
29
+ * `rawCssString` is an experimental feature.
30
+ * The API might be changed.
31
+ */
32
+ export const rawCssString = (value: string): CssEscapedString => {
33
+ return {
34
+ [CSS_ESCAPED]: value,
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Used the goober'code as a reference:
40
+ * https://github.com/cristianbote/goober/blob/master/src/core/to-hash.js
41
+ * MIT License, Copyright (c) 2019 Cristian Bote
42
+ */
43
+ const toHash = (str: string): string => {
44
+ let i = 0,
45
+ out = 11
46
+ while (i < str.length) {
47
+ out = (101 * out + str.charCodeAt(i++)) >>> 0
48
+ }
49
+ return 'css-' + out
50
+ }
51
+
52
+ const normalizeLabel = (label: string): string => {
53
+ return label.trim().replace(/\s+/g, '-')
54
+ }
55
+
56
+ const isValidClassName = (name: string): boolean => /^-?[_a-zA-Z][_a-zA-Z0-9-]*$/.test(name)
57
+
58
+ // `<`, `{`, `}` never appear in valid class names but can break out of a <style> element
59
+ // or inject a CSS rule when an external cx() class name is used as a selector.
60
+ const hasUnsafeSelectorChar = (name: string): boolean => /[<{}]/.test(name)
61
+
62
+ // CSS-wide keywords that are invalid as @keyframes names per the spec
63
+ const RESERVED_KEYFRAME_NAMES = new Set([
64
+ 'default',
65
+ 'inherit',
66
+ 'initial',
67
+ 'none',
68
+ 'revert',
69
+ 'revert-layer',
70
+ 'unset',
71
+ ])
72
+ const isValidKeyframeName = (name: string): boolean =>
73
+ isValidClassName(name) && !RESERVED_KEYFRAME_NAMES.has(name.toLowerCase())
74
+
75
+ const defaultOnInvalidSlug = (slug: string) => {
76
+ console.warn(`Invalid slug: ${slug}`)
77
+ }
78
+
79
+ const cssStringReStr: string = [
80
+ '"(?:(?:\\\\[\\s\\S]|[^"\\\\])*)"', // double quoted string
81
+
82
+ "'(?:(?:\\\\[\\s\\S]|[^'\\\\])*)'", // single quoted string
83
+
84
+ 'url\\(\\s*[^)"\'\\s]*\\s*\\)', // unquoted url, which may contain "//"
85
+ ].join('|')
86
+ const minifyCssRe: RegExp = new RegExp(
87
+ [
88
+ '(' + cssStringReStr + ')', // $1: quoted string or unquoted url
89
+
90
+ '(?:' +
91
+ [
92
+ '^\\s+', // head whitespace
93
+ '\\/\\*.*?\\*\\/\\s*', // multi-line comment
94
+ '\\/\\/.*\\n\\s*', // single-line comment
95
+ '\\s+$', // tail whitespace
96
+ ].join('|') +
97
+ ')',
98
+
99
+ '\\s*;\\s*(}|$)\\s*', // $2: trailing semicolon
100
+ '\\s*([{};,])\\s*', // $3: whitespace around { } , ;
101
+ // $4: whitespace after : (the whitespace before it is a descendant combinator in a selector)
102
+ '(:)\\s*',
103
+ '(\\s)\\s+', // $5: 2+ spaces
104
+ ].join('|'),
105
+ 'g'
106
+ )
107
+
108
+ export const minify = (css: string): string => {
109
+ return css.replace(minifyCssRe, (_, $1, $2, $3, $4, $5) => $1 || $2 || $3 || $4 || $5 || '')
110
+ }
111
+
112
+ type CssVariableBasicType =
113
+ | CssClassName
114
+ | CssEscapedString
115
+ | string
116
+ | number
117
+ | boolean
118
+ | null
119
+ | undefined
120
+ type CssVariableAsyncType = Promise<CssVariableBasicType>
121
+ type CssVariableArrayType = (CssVariableBasicType | CssVariableAsyncType)[]
122
+ export type CssVariableType = CssVariableBasicType | CssVariableAsyncType | CssVariableArrayType
123
+
124
+ /**
125
+ * A function that customizes generated CSS class names.
126
+ *
127
+ * @param hash - The default hash-based class name (e.g. `css-1234567890`)
128
+ * @param label - The comment label extracted from the CSS template, may be empty.
129
+ * Whitespace is trimmed and inner spaces are replaced with hyphens.
130
+ * @param styleString - The minified CSS style string
131
+ * @returns The custom class name to use. Must be a safe CSS identifier;
132
+ * otherwise, the default hash is used as a fallback.
133
+ */
134
+ export type ClassNameSlug = (hash: string, label: string, styleString: string) => string
135
+
136
+ /**
137
+ * A callback function called when an invalid slug is returned from ClassNameSlug.
138
+ *
139
+ * @param slug - The invalid slug
140
+ */
141
+ export type OnInvalidSlug = (slug: string) => void
142
+
143
+ export const buildStyleString = (
144
+ strings: TemplateStringsArray,
145
+ values: CssVariableType[]
146
+ ): [string, string, CssClassName[], string[]] => {
147
+ const selectors: CssClassName[] = []
148
+ const externalClassNames: string[] = []
149
+
150
+ const label = strings[0].match(/^\s*\/\*(.*?)\*\//)?.[1] || ''
151
+ let styleString = ''
152
+ for (let i = 0, len = strings.length; i < len; i++) {
153
+ styleString += strings[i]
154
+ let vArray = values[i]
155
+ if (typeof vArray === 'boolean' || vArray === null || vArray === undefined) {
156
+ continue
157
+ }
158
+
159
+ if (!Array.isArray(vArray)) {
160
+ vArray = [vArray]
161
+ }
162
+ for (let j = 0, len = vArray.length; j < len; j++) {
163
+ let value = vArray[j]
164
+ if (typeof value === 'boolean' || value === null || value === undefined) {
165
+ continue
166
+ }
167
+ if (typeof value === 'string') {
168
+ if (/([\\"'\/])/.test(value)) {
169
+ styleString += value.replace(/([\\"']|(?<=<)\/)/g, '\\$1')
170
+ } else {
171
+ styleString += value
172
+ }
173
+ } else if (typeof value === 'number') {
174
+ styleString += value
175
+ } else if ((value as CssEscapedString)[CSS_ESCAPED]) {
176
+ styleString += (value as CssEscapedString)[CSS_ESCAPED]
177
+ } else if ((value as CssClassName)[CLASS_NAME].startsWith('@keyframes ')) {
178
+ selectors.push(value as CssClassName)
179
+ styleString += ` ${(value as CssClassName)[CLASS_NAME].substring(11)} `
180
+ } else {
181
+ if (strings[i + 1]?.match(/^\s*{/)) {
182
+ // assume this value is a class name
183
+ selectors.push(value as CssClassName)
184
+ value = `.${(value as CssClassName)[CLASS_NAME]}`
185
+ } else {
186
+ selectors.push(...(value as CssClassName)[SELECTORS])
187
+ externalClassNames.push(...(value as CssClassName)[EXTERNAL_CLASS_NAMES])
188
+ value = (value as CssClassName)[STYLE_STRING]
189
+ const valueLen = value.length
190
+ if (valueLen > 0) {
191
+ const lastChar = value[valueLen - 1]
192
+ if (lastChar !== ';' && lastChar !== '}') {
193
+ value += ';'
194
+ }
195
+ }
196
+ }
197
+ styleString += `${value || ''}`
198
+ }
199
+ }
200
+ }
201
+
202
+ return [label, minify(styleString), selectors, externalClassNames]
203
+ }
204
+
205
+ export const cssCommon = (
206
+ strings: TemplateStringsArray,
207
+ values: CssVariableType[],
208
+ classNameSlug?: ClassNameSlug,
209
+ onInvalidSlug?: OnInvalidSlug
210
+ ): CssClassName => {
211
+ let [label, thisStyleString, selectors, externalClassNames] = buildStyleString(strings, values)
212
+ const isPseudoGlobal = isPseudoGlobalSelectorRe.exec(thisStyleString)
213
+ if (isPseudoGlobal) {
214
+ thisStyleString = isPseudoGlobal[1]
215
+ }
216
+ const hash = toHash(label + thisStyleString)
217
+
218
+ let customSlug: string | undefined
219
+ if (classNameSlug) {
220
+ const slug = classNameSlug(hash, normalizeLabel(label), thisStyleString)
221
+ if (slug) {
222
+ if (isValidClassName(slug)) {
223
+ customSlug = slug
224
+ } else {
225
+ ;(onInvalidSlug || defaultOnInvalidSlug)(slug)
226
+ }
227
+ }
228
+ }
229
+
230
+ const selector = (isPseudoGlobal ? PSEUDO_GLOBAL_SELECTOR : '') + (customSlug || hash)
231
+ const className = (
232
+ isPseudoGlobal ? selectors.map((s) => s[CLASS_NAME]) : [selector, ...externalClassNames]
233
+ ).join(' ')
234
+
235
+ return {
236
+ [SELECTOR]: selector,
237
+ [CLASS_NAME]: className,
238
+ [STYLE_STRING]: thisStyleString,
239
+ [SELECTORS]: selectors,
240
+ [EXTERNAL_CLASS_NAMES]: externalClassNames,
241
+ }
242
+ }
243
+
244
+ export const cxCommon = (
245
+ args: (string | boolean | null | undefined | CssClassName)[]
246
+ ): (string | boolean | null | undefined | CssClassName)[] => {
247
+ for (let i = 0, len = args.length; i < len; i++) {
248
+ const arg = args[i]
249
+ if (typeof arg === 'string') {
250
+ args[i] = {
251
+ [SELECTOR]: '',
252
+ [CLASS_NAME]: '',
253
+ [STYLE_STRING]: '',
254
+ [SELECTORS]: [],
255
+ // drop names that are unsafe to emit as a selector
256
+ [EXTERNAL_CLASS_NAMES]: hasUnsafeSelectorChar(arg) ? [] : [arg],
257
+ }
258
+ }
259
+ }
260
+
261
+ return args
262
+ }
263
+
264
+ export const keyframesCommon = (
265
+ strings: TemplateStringsArray,
266
+ values: CssVariableType[],
267
+ classNameSlug?: ClassNameSlug,
268
+ onInvalidSlug?: OnInvalidSlug
269
+ ): CssClassName => {
270
+ const [label, styleString] = buildStyleString(strings, values)
271
+ const hash = toHash(label + styleString)
272
+
273
+ let customSlug: string | undefined
274
+ if (classNameSlug) {
275
+ const slug = classNameSlug(hash, normalizeLabel(label), styleString)
276
+ if (slug) {
277
+ if (isValidKeyframeName(slug)) {
278
+ customSlug = slug
279
+ } else {
280
+ ;(onInvalidSlug || defaultOnInvalidSlug)(slug)
281
+ }
282
+ }
283
+ }
284
+
285
+ return {
286
+ [SELECTOR]: '',
287
+ [CLASS_NAME]: `@keyframes ${customSlug || hash}`,
288
+ [STYLE_STRING]: styleString,
289
+ [SELECTORS]: [],
290
+ [EXTERNAL_CLASS_NAMES]: [],
291
+ }
292
+ }
293
+
294
+ type ViewTransitionType = {
295
+ (
296
+ strings: TemplateStringsArray,
297
+ values: CssVariableType[],
298
+ classNameSlug?: ClassNameSlug,
299
+ onInvalidSlug?: OnInvalidSlug
300
+ ): CssClassName
301
+ (content: CssClassName): CssClassName
302
+ (): CssClassName
303
+ }
304
+
305
+ let viewTransitionNameIndex = 0
306
+ export const viewTransitionCommon: ViewTransitionType = ((
307
+ strings: TemplateStringsArray | CssClassName | undefined,
308
+ values: CssVariableType[],
309
+ classNameSlug?: ClassNameSlug,
310
+ onInvalidSlug?: OnInvalidSlug
311
+ ): CssClassName => {
312
+ if (!strings) {
313
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
314
+ strings = [`/* h-v-t ${viewTransitionNameIndex++} */`] as any
315
+ }
316
+ const content = Array.isArray(strings)
317
+ ? cssCommon(strings as TemplateStringsArray, values, classNameSlug, onInvalidSlug)
318
+ : (strings as CssClassName)
319
+
320
+ const transitionName = content[CLASS_NAME]
321
+ const res = cssCommon(
322
+ ['view-transition-name:', ''] as any, // eslint-disable-line @typescript-eslint/no-explicit-any
323
+ [transitionName],
324
+ classNameSlug,
325
+ onInvalidSlug
326
+ )
327
+
328
+ content[CLASS_NAME] = PSEUDO_GLOBAL_SELECTOR + content[CLASS_NAME]
329
+ content[STYLE_STRING] = content[STYLE_STRING].replace(
330
+ /(?<=::view-transition(?:[a-z-]*)\()(?=\))/g,
331
+ transitionName
332
+ )
333
+ res[CLASS_NAME] = res[SELECTOR] = transitionName
334
+ res[SELECTORS] = [...content[SELECTORS], content]
335
+
336
+ return res
337
+ }) as ViewTransitionType