aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHenry Jameson <me@hjkos.com>2024-01-18 14:35:25 +0200
committerHenry Jameson <me@hjkos.com>2024-01-18 14:35:25 +0200
commit521d308a6c6777a45c94183751f3305ce23bdad3 (patch)
tree665dea3c2015672d960f08f8ce410682028e8b91 /src
parent6391a6a4ead068455a5b23d7d11ce0cdf2ec87ea (diff)
themes 3 initial work
Diffstat (limited to 'src')
-rw-r--r--src/components/button.style.js18
-rw-r--r--src/components/icon.style.js3
-rw-r--r--src/components/panel.style.js8
-rw-r--r--src/components/text.style.js9
-rw-r--r--src/components/underlay.style.js6
-rw-r--r--src/services/theme_data/theme_data_3.service.js66
6 files changed, 110 insertions, 0 deletions
diff --git a/src/components/button.style.js b/src/components/button.style.js
new file mode 100644
index 00000000..8f2e8f82
--- /dev/null
+++ b/src/components/button.style.js
@@ -0,0 +1,18 @@
+export default {
+ name: 'Button',
+ states: {
+ hover: ':hover',
+ disabled: ':disabled',
+ pressed: ':active',
+ toggled: '.toggled'
+ },
+ variants: {
+ danger: '.danger',
+ unstyled: '.unstyled',
+ sublime: '.sublime'
+ },
+ validInnerComponents: [
+ 'Text',
+ 'Icon'
+ ]
+}
diff --git a/src/components/icon.style.js b/src/components/icon.style.js
new file mode 100644
index 00000000..1e2781d6
--- /dev/null
+++ b/src/components/icon.style.js
@@ -0,0 +1,3 @@
+export default {
+ name: 'Icon'
+}
diff --git a/src/components/panel.style.js b/src/components/panel.style.js
new file mode 100644
index 00000000..1666d923
--- /dev/null
+++ b/src/components/panel.style.js
@@ -0,0 +1,8 @@
+export default {
+ name: 'Panel',
+ validInnerComponents: [
+ 'Text',
+ 'Icon',
+ 'Button'
+ ]
+}
diff --git a/src/components/text.style.js b/src/components/text.style.js
new file mode 100644
index 00000000..f87268bb
--- /dev/null
+++ b/src/components/text.style.js
@@ -0,0 +1,9 @@
+export default {
+ name: 'Text',
+ states: {
+ faint: '.faint'
+ },
+ variants: {
+ green: '/.greentext'
+ }
+}
diff --git a/src/components/underlay.style.js b/src/components/underlay.style.js
new file mode 100644
index 00000000..bae9fc0b
--- /dev/null
+++ b/src/components/underlay.style.js
@@ -0,0 +1,6 @@
+export default {
+ name: 'Panel',
+ validInnerComponents: [
+ 'Panel'
+ ]
+}
diff --git a/src/services/theme_data/theme_data_3.service.js b/src/services/theme_data/theme_data_3.service.js
new file mode 100644
index 00000000..3a6fd552
--- /dev/null
+++ b/src/services/theme_data/theme_data_3.service.js
@@ -0,0 +1,66 @@
+import Underlay from 'src/components/underlay.style.js'
+import Panel from 'src/components/panel.style.js'
+import Button from 'src/components/button.style.js'
+import Text from 'src/components/text.style.js'
+import Icon from 'src/components/icon.style.js'
+
+const root = Underlay
+const components = {
+ Underlay,
+ Panel,
+ Button,
+ Text,
+ Icon
+}
+
+// This gives you an array of arrays of all possible unique (i.e. order-insensitive) combinations
+const getAllPossibleCombinations = (array) => {
+ const combos = [array.map(x => [x])]
+ for (let comboSize = 2; comboSize <= array.length; comboSize++) {
+ const previous = combos[combos.length - 1]
+ const selfSet = new Set()
+ const newCombos = previous.map(self => {
+ self.forEach(x => selfSet.add(x))
+ const nonSelf = array.filter(x => !selfSet.has(x))
+ return nonSelf.map(x => [...self, x])
+ })
+ const flatCombos = newCombos.reduce((acc, x) => [...acc, ...x], [])
+ combos.push(flatCombos)
+ }
+ return combos.reduce((acc, x) => [...acc, ...x], [])
+}
+
+export const init = () => {
+ const rootName = root.name
+ const rules = []
+
+ const processInnerComponent = (component, parent) => {
+ const {
+ validInnerComponents,
+ states: originalStates = {},
+ variants: originalVariants = {}
+ } = component
+
+ const states = { normal: '', ...originalStates }
+ const variants = { normal: '', ...originalVariants }
+ const innerComponents = validInnerComponents.map(name => components[name])
+
+ const stateCombinations = getAllPossibleCombinations(Object.keys(states))
+ const stateVariantCombination = Object.keys(variants).map(variant => {
+ return stateCombinations.map(state => ({ variant, state }))
+ }).reduce((acc, x) => [...acc, ...x], [])
+
+ stateVariantCombination.forEach(combination => {
+ rules.push(({
+ parent,
+ component: component.name,
+ state: combination.state,
+ variant: combination.variant
+ }))
+
+ innerComponents.forEach(innerComponent => processInnerComponent(innerComponent, combination))
+ })
+ }
+
+ processInnerComponent(components[rootName])
+}