aboutsummaryrefslogtreecommitdiff
path: root/src/services/theme_data/iss_serializer.js
diff options
context:
space:
mode:
authorHenry Jameson <me@hjkos.com>2024-09-26 01:10:57 +0300
committerHenry Jameson <me@hjkos.com>2024-09-26 01:10:57 +0300
commit6fc929a0a040bfdf3b403c5f2b708ab4a51fe2e8 (patch)
treec85c68d9e09826a9d81b4ef21706f782c5a9a5d6 /src/services/theme_data/iss_serializer.js
parent22cc96705ab3af42a6373ccab6df473ba1243fed (diff)
parent05c0b16a935c2799ece31845897d3a29d39e3eee (diff)
Merge remote-tracking branch 'origin/develop' into shadow-control-2.0
Diffstat (limited to 'src/services/theme_data/iss_serializer.js')
-rw-r--r--src/services/theme_data/iss_serializer.js48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/services/theme_data/iss_serializer.js b/src/services/theme_data/iss_serializer.js
new file mode 100644
index 00000000..8b7cf5d8
--- /dev/null
+++ b/src/services/theme_data/iss_serializer.js
@@ -0,0 +1,48 @@
+import { unroll } from './iss_utils.js'
+
+const serializeShadow = s => {
+ if (typeof s === 'object') {
+ return `${s.inset ? 'inset ' : ''}${s.x} ${s.y} ${s.blur} ${s.spread} ${s.color} / ${s.alpha}`
+ } else {
+ return s
+ }
+}
+
+export const serialize = (ruleset) => {
+ return ruleset.map((rule) => {
+ if (Object.keys(rule.directives || {}).length === 0) return false
+
+ const header = unroll(rule).reverse().map(rule => {
+ const { component } = rule
+ const newVariant = (rule.variant == null || rule.variant === 'normal') ? '' : ('.' + rule.variant)
+ const newState = (rule.state || []).filter(st => st !== 'normal')
+
+ return `${component}${newVariant}${newState.map(st => ':' + st).join('')}`
+ }).join(' ')
+
+ const content = Object.entries(rule.directives).map(([directive, value]) => {
+ if (directive.startsWith('--')) {
+ const [valType, newValue] = value.split('|') // only first one! intentional!
+ switch (valType) {
+ case 'shadow':
+ return ` ${directive}: ${valType.trim()} | ${newValue.map(serializeShadow).map(s => s.trim()).join(', ')}`
+ default:
+ return ` ${directive}: ${valType.trim()} | ${newValue.trim()}`
+ }
+ } else {
+ switch (directive) {
+ case 'shadow':
+ if (value.length > 0) {
+ return ` ${directive}: ${value.map(serializeShadow).join(', ')}`
+ } else {
+ return ` ${directive}: none`
+ }
+ default:
+ return ` ${directive}: ${value}`
+ }
+ }
+ })
+
+ return `${header} {\n${content.join(';\n')}\n}`
+ }).filter(x => x).join('\n\n')
+}