aboutsummaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorHenry Jameson <me@hjkos.com>2024-02-11 23:11:28 +0200
committerHenry Jameson <me@hjkos.com>2024-02-11 23:11:28 +0200
commit98f972e557047a626880692189fdae68269a732e (patch)
tree398d38fc7a5712e9ba9613d008b0d250136aa35e /src/components
parent9ec61d0f0a26369196d9e9b4ac62f4a5b3c38ce1 (diff)
menu-item improvements
Diffstat (limited to 'src/components')
-rw-r--r--src/components/border.style.js13
-rw-r--r--src/components/button.style.js27
-rw-r--r--src/components/dropdown_menu.style.js19
-rw-r--r--src/components/menu_item.style.js45
-rw-r--r--src/components/modals.style.js8
-rw-r--r--src/components/nav_panel/nav_panel.vue6
-rw-r--r--src/components/navigation/navigation_entry.vue36
-rw-r--r--src/components/panel.style.js13
-rw-r--r--src/components/panel_header.style.js3
-rw-r--r--src/components/popover.style.js16
-rw-r--r--src/components/root.style.js4
-rw-r--r--src/components/underlay.style.js5
12 files changed, 118 insertions, 77 deletions
diff --git a/src/components/border.style.js b/src/components/border.style.js
new file mode 100644
index 00000000..a87ee9c8
--- /dev/null
+++ b/src/components/border.style.js
@@ -0,0 +1,13 @@
+export default {
+ name: 'Border',
+ selector: '/*border*/',
+ virtual: true,
+ defaultRules: [
+ {
+ directives: {
+ textColor: '$mod(--parent, 10)',
+ textAuto: 'no-auto'
+ }
+ }
+ ]
+}
diff --git a/src/components/button.style.js b/src/components/button.style.js
index c86fee64..84db88fb 100644
--- a/src/components/button.style.js
+++ b/src/components/button.style.js
@@ -23,28 +23,37 @@ const hoverGlow = {
export default {
name: 'Button', // Name of the component
selector: '.button', // CSS selector/prefix
- // States, system witll calculate ALL possible combinations of those and append a "normal" to them + standalone "normal" state
+ // outOfTreeSelector: '' // out-of-tree selector is used when other components are laid over it but it's not part of the tree, see Underlay component
+ // States, system witll calculate ALL possible combinations of those and prepend "normal" to them + standalone "normal" state
states: {
- // normal: state is implicitly added
+ // States are a bit expensive - the amount of combinations generated is about (1/6)n^3+n, so adding more state increased number of combination by an order of magnitude!
+ // All states inherit from "normal" state, there is no other inheirtance, i.e. hover+disabled only inherits from "normal", not from hover nor disabled.
+ // However, cascading still works, so resulting state will be result of merging of all relevant states/variants
+ // normal: '' // normal state is implicitly added, it is always included
disabled: ':disabled',
toggled: '.toggled',
pressed: ':active',
hover: ':hover',
focused: ':focus-within'
},
- // Variants are mutually exclusive, which saves on computation time
+ // Variants are mutually exclusive, each component implicitly has "normal" variant, and all other variants inherit from it.
variants: {
- normal: '-default', // you can override normal variant
- danger: '.danger',
- unstyled: '-unstyled'
+ // Variants save on computation time since adding new variant just adds one more "set".
+ normal: '-default', // you can override normal variant, it will be appenended to the main class
+ danger: '-default.danger'
+ // Overall the compuation difficulty is N*((1/6)M^3+M) where M is number of distinct states and N is number of variants.
+ // This (currently) is further multipled by number of places where component can exist.
},
+ // This lists all other components that can possibly exist within one. Recursion is currently not supported (and probably won't be supported ever).
validInnerComponents: [
'Text',
'Icon'
],
+ // Default rules, used as "default theme", essentially.
defaultRules: [
{
- component: 'Button',
+ // component: 'Button', // no need to specify components every time unless you're specifying how other component should look
+ // like within it
directives: {
background: '--fg',
shadow: [{
@@ -58,7 +67,6 @@ export default {
}
},
{
- component: 'Button',
variant: 'unstyled',
directives: {
background: '--fg',
@@ -66,14 +74,12 @@ export default {
}
},
{
- component: 'Button',
state: ['hover'],
directives: {
shadow: [hoverGlow, ...buttonInsetFakeBorders]
}
},
{
- component: 'Button',
state: ['hover', 'pressed'],
directives: {
background: '--accent,-24.2',
@@ -81,7 +87,6 @@ export default {
}
},
{
- component: 'Button',
state: ['disabled'],
directives: {
background: '$blend(--background, 0.25, --parent)',
diff --git a/src/components/dropdown_menu.style.js b/src/components/dropdown_menu.style.js
deleted file mode 100644
index 905984e9..00000000
--- a/src/components/dropdown_menu.style.js
+++ /dev/null
@@ -1,19 +0,0 @@
-export default {
- name: 'DropdownMenu',
- selector: '.dropdown',
- validInnerComponents: [
- 'Text',
- 'Icon',
- 'Input'
- ],
- states: {
- hover: ':hover'
- },
- defaultRules: [
- {
- directives: {
- background: '--fg'
- }
- }
- ]
-}
diff --git a/src/components/menu_item.style.js b/src/components/menu_item.style.js
new file mode 100644
index 00000000..43b5c35a
--- /dev/null
+++ b/src/components/menu_item.style.js
@@ -0,0 +1,45 @@
+export default {
+ name: 'MenuItem',
+ selector: '.menu-item',
+ validInnerComponents: [
+ 'Text',
+ 'Icon',
+ 'Input',
+ 'Border'
+ ],
+ states: {
+ hover: ':hover',
+ active: 'active'
+ },
+ defaultRules: [
+ {
+ directives: {
+ background: '--fg'
+ }
+ },
+ {
+ component: 'Text',
+ variant: 'normal',
+ parent: {
+ component: 'MenuItem',
+ state: ['normal', 'hover'],
+ variant: 'normal'
+ },
+ directives: {
+ textColor: '--link',
+ textAuto: 'no-preserve'
+ }
+ },
+ {
+ component: 'Icon',
+ parent: {
+ component: 'MenuItem',
+ state: ['hover']
+ },
+ directives: {
+ textColor: '--link',
+ textAuto: 'no-preserve'
+ }
+ }
+ ]
+}
diff --git a/src/components/modals.style.js b/src/components/modals.style.js
new file mode 100644
index 00000000..3cfddf2f
--- /dev/null
+++ b/src/components/modals.style.js
@@ -0,0 +1,8 @@
+export default {
+ name: 'Modals',
+ selector: '.modal-view',
+ validInnerComponents: [
+ 'Panel'
+ ],
+ defaultRules: []
+}
diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue
index 1a826cc4..33547a41 100644
--- a/src/components/nav_panel/nav_panel.vue
+++ b/src/components/nav_panel/nav_panel.vue
@@ -107,7 +107,7 @@
.NavPanel {
.panel {
overflow: hidden;
- box-shadow: var(--panelShadow);
+ box-shadow: var(--shadow);
}
ul {
@@ -124,14 +124,14 @@
}
> li {
- &:first-child .menu-item {
+ &:first-child.menu-item {
border-top-right-radius: $fallback--panelRadius;
border-top-right-radius: var(--panelRadius, $fallback--panelRadius);
border-top-left-radius: $fallback--panelRadius;
border-top-left-radius: var(--panelRadius, $fallback--panelRadius);
}
- &:last-child .menu-item {
+ &:last-child.menu-item {
border-bottom-right-radius: $fallback--panelRadius;
border-bottom-right-radius: var(--panelRadius, $fallback--panelRadius);
border-bottom-left-radius: $fallback--panelRadius;
diff --git a/src/components/navigation/navigation_entry.vue b/src/components/navigation/navigation_entry.vue
index 411ca536..59722f6c 100644
--- a/src/components/navigation/navigation_entry.vue
+++ b/src/components/navigation/navigation_entry.vue
@@ -1,7 +1,6 @@
<template>
<OptionalRouterLink
v-slot="{ isActive, href, navigate } = {}"
- ass="ass"
:to="routeTo"
>
<li
@@ -96,40 +95,5 @@
margin-right: -0.8em;
}
}
-
- &:hover {
- background-color: $fallback--lightBg;
- background-color: var(--selectedMenu, $fallback--lightBg);
- color: $fallback--link;
- color: var(--selectedMenuText, $fallback--link);
-
- --faint: var(--selectedMenuFaintText, $fallback--faint);
- --faintLink: var(--selectedMenuFaintLink, $fallback--faint);
- --lightText: var(--selectedMenuLightText, $fallback--lightText);
-
- .menu-icon {
- --icon: var(--text, $fallback--icon);
- }
- }
-
- &.-active {
- font-weight: bolder;
- background-color: $fallback--lightBg;
- background-color: var(--selectedMenu, $fallback--lightBg);
- color: $fallback--text;
- color: var(--selectedMenuText, $fallback--text);
-
- --faint: var(--selectedMenuFaintText, $fallback--faint);
- --faintLink: var(--selectedMenuFaintLink, $fallback--faint);
- --lightText: var(--selectedMenuLightText, $fallback--lightText);
-
- .menu-icon {
- --icon: var(--text, $fallback--icon);
- }
-
- &:hover {
- text-decoration: underline;
- }
- }
}
</style>
diff --git a/src/components/panel.style.js b/src/components/panel.style.js
index 7b7f7ccb..d680a58d 100644
--- a/src/components/panel.style.js
+++ b/src/components/panel.style.js
@@ -7,12 +7,21 @@ export default {
'Icon',
'Button',
'Input',
- 'PanelHeader'
+ 'PanelHeader',
+ 'MenuItem'
],
defaultRules: [
{
directives: {
- background: '--bg'
+ background: '--bg',
+ shadow: [{
+ x: 1,
+ y: 1,
+ blur: 4,
+ spread: 0,
+ color: '#000000',
+ alpha: 0.6
+ }]
}
}
]
diff --git a/src/components/panel_header.style.js b/src/components/panel_header.style.js
index e18fa799..1d89b4ce 100644
--- a/src/components/panel_header.style.js
+++ b/src/components/panel_header.style.js
@@ -11,7 +11,8 @@ export default {
{
component: 'PanelHeader',
directives: {
- background: '--fg'
+ background: '--fg',
+ shadow: []
}
}
]
diff --git a/src/components/popover.style.js b/src/components/popover.style.js
index 415795a8..9f1e6cf0 100644
--- a/src/components/popover.style.js
+++ b/src/components/popover.style.js
@@ -1,6 +1,10 @@
export default {
name: 'Popover',
selector: '.popover',
+ variants: {
+ tooltip: '.tooltip',
+ modal: '.modal'
+ },
validInnerComponents: [
'Text',
'Link',
@@ -8,12 +12,20 @@ export default {
'Button',
'Input',
'PanelHeader',
- 'DropdownMenu'
+ 'MenuItem'
],
defaultRules: [
{
directives: {
- background: '--fg'
+ background: '--bg',
+ shadow: [{
+ x: 2,
+ y: 2,
+ blur: 3,
+ spread: 0,
+ color: '#000000',
+ alpha: 0.5
+ }]
}
}
]
diff --git a/src/components/root.style.js b/src/components/root.style.js
index b762b2ba..53ee0ae1 100644
--- a/src/components/root.style.js
+++ b/src/components/root.style.js
@@ -3,8 +3,8 @@ export default {
selector: ':root',
validInnerComponents: [
'Underlay',
- 'TopBar',
- 'Popover'
+ 'Modals',
+ 'TopBar'
],
defaultRules: [
{
diff --git a/src/components/underlay.style.js b/src/components/underlay.style.js
index f879c530..68fd6c06 100644
--- a/src/components/underlay.style.js
+++ b/src/components/underlay.style.js
@@ -1,6 +1,9 @@
export default {
name: 'Underlay',
- selector: 'body', // Should be '#content' but for now this is better for testing until I have proper popovers and such...
+ selector: '#content',
+ // Out of tree selector: Most components are laid over underlay, but underlay itself is not part of the DOM tree,
+ // i.e. it's a separate absolutely-positioned component, so we need to treat it differently depending on whether
+ // we are searching for underlay specifically or for whatever is laid on top of it.
outOfTreeSelector: '.underlay',
validInnerComponents: [
'Panel'