Add custom theme options for button roundedness and header color

This commit is contained in:
Andrew Kingston 2021-09-03 15:28:35 +01:00
parent 8ab0fc2d7f
commit d1e3dda05f
6 changed files with 76 additions and 12 deletions

View File

@ -24,6 +24,7 @@
<div> <div>
<Select <Select
autoWidth
value={$store.theme} value={$store.theme}
options={themeOptions} options={themeOptions}
placeholder={null} placeholder={null}
@ -34,6 +35,5 @@
<style> <style>
div { div {
width: 100px; width: 100px;
padding-right: 8px;
} }
</style> </style>

View File

@ -7,16 +7,39 @@
Layout, Layout,
ColorPicker, ColorPicker,
Label, Label,
Select,
} from "@budibase/bbui" } from "@budibase/bbui"
import { store } from "builderStore" import { store } from "builderStore"
import AppThemeSelect from "./AppThemeSelect.svelte"
let modal let modal
const defaultTheme = { const defaultTheme = {
primaryColor: "var(--spectrum-global-color-blue-600)", primaryColor: "var(--spectrum-global-color-blue-600)",
primaryColorHover: "var(--spectrum-global-color-blue-500)", primaryColorHover: "var(--spectrum-global-color-blue-500)",
buttonBorderRadius: "16px",
navBackground: "var(--spectrum-global-color-gray-100)",
} }
const buttonBorderRadiusOptions = [
{
label: "None",
value: "0",
},
{
label: "Small",
value: "4px",
},
{
label: "Medium",
value: "8px",
},
{
label: "Large",
value: "16px",
},
]
const updateProperty = property => { const updateProperty = property => {
return e => { return e => {
store.actions.customTheme.save({ store.actions.customTheme.save({
@ -28,7 +51,7 @@
</script> </script>
<div class="container"> <div class="container">
<ActionButton icon="Brush" on:click={modal.show}>Edit</ActionButton> <ActionButton icon="Brush" on:click={modal.show}>Theme</ActionButton>
</div> </div>
<Modal bind:this={modal}> <Modal bind:this={modal}>
<ModalContent <ModalContent
@ -37,9 +60,23 @@
showCloseIcon={false} showCloseIcon={false}
title="Theme settings" title="Theme settings"
> >
<Layout noPadding gap="XS"> <Layout noPadding gap="S">
<div class="setting"> <div class="setting">
<Label size="L">Primary Color</Label> <Label size="L">Theme</Label>
<AppThemeSelect />
</div>
<div class="setting">
<Label size="L">Button roundness</Label>
<Select
autoWidth
value={$store.customTheme?.buttonBorderRadius ||
defaultTheme.buttonBorderRadius}
on:change={updateProperty("buttonBorderRadius")}
options={buttonBorderRadiusOptions}
/>
</div>
<div class="setting">
<Label size="L">Primary color</Label>
<ColorPicker <ColorPicker
spectrumTheme={$store.theme} spectrumTheme={$store.theme}
value={$store.customTheme?.primaryColor || defaultTheme.primaryColor} value={$store.customTheme?.primaryColor || defaultTheme.primaryColor}
@ -47,7 +84,7 @@
/> />
</div> </div>
<div class="setting"> <div class="setting">
<Label size="L">Primary Color (Hover)</Label> <Label size="L">Primary color (hover)</Label>
<ColorPicker <ColorPicker
spectrumTheme={$store.theme} spectrumTheme={$store.theme}
value={$store.customTheme?.primaryColorHover || value={$store.customTheme?.primaryColorHover ||
@ -55,6 +92,15 @@
on:change={updateProperty("primaryColorHover")} on:change={updateProperty("primaryColorHover")}
/> />
</div> </div>
<div class="setting">
<Label size="L">Navigation bar background</Label>
<ColorPicker
spectrumTheme={$store.theme}
value={$store.customTheme?.navBackground ||
defaultTheme.navBackground}
on:change={updateProperty("navBackground")}
/>
</div>
</Layout> </Layout>
</ModalContent> </ModalContent>
</Modal> </Modal>

View File

@ -151,11 +151,10 @@
{#if $currentAsset} {#if $currentAsset}
<div class="preview-header"> <div class="preview-header">
<ComponentSelectionList /> <ComponentSelectionList />
{#if $store.clientFeatures.spectrumThemes}
<AppThemeSelect />
{/if}
{#if $store.clientFeatures.customThemes} {#if $store.clientFeatures.customThemes}
<ThemeEditor /> <ThemeEditor />
{:else if $store.clientFeatures.spectrumThemes}
<AppThemeSelect />
{/if} {/if}
</div> </div>
<div class="preview-content"> <div class="preview-content">

View File

@ -16,6 +16,7 @@
/* Buttons */ /* Buttons */
--spectrum-semantic-cta-color-background-default: var(--primaryColor); --spectrum-semantic-cta-color-background-default: var(--primaryColor);
--spectrum-semantic-cta-color-background-hover: var(--primaryColorHover); --spectrum-semantic-cta-color-background-hover: var(--primaryColorHover);
--spectrum-alias-item-rounded-border-radius-m: var(--buttonBorderRadius);
/* Loading spinners */ /* Loading spinners */
--spectrum-progresscircle-medium-track-fill-color: var(--primaryColor); --spectrum-progresscircle-medium-track-fill-color: var(--primaryColor);

View File

@ -142,7 +142,7 @@
flex-direction: row; flex-direction: row;
justify-content: center; justify-content: center;
align-items: stretch; align-items: stretch;
background: var(--spectrum-alias-background-color-primary); background: var(--navBackground);
z-index: 2; z-index: 2;
border-bottom: 1px solid var(--spectrum-global-color-gray-300); border-bottom: 1px solid var(--spectrum-global-color-gray-300);
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.05); box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.05);

View File

@ -9,6 +9,8 @@ const defaultTheme = "spectrum--light"
const defaultCustomTheme = { const defaultCustomTheme = {
primaryColor: "var(--spectrum-glo" + "bal-color-blue-600)", primaryColor: "var(--spectrum-glo" + "bal-color-blue-600)",
primaryColorHover: "var(--spectrum-glo" + "bal-color-blue-500)", primaryColorHover: "var(--spectrum-glo" + "bal-color-blue-500)",
buttonBorderRadius: "16px",
navBackground: "var(--spectrum-glo" + "bal-color-gray-100)",
} }
const createThemeStore = () => { const createThemeStore = () => {
@ -17,14 +19,30 @@ const createThemeStore = () => {
([$builderStore, $appStore]) => { ([$builderStore, $appStore]) => {
const theme = const theme =
$builderStore.theme || $appStore.application?.theme || defaultTheme $builderStore.theme || $appStore.application?.theme || defaultTheme
const customTheme = {
...defaultCustomTheme, // Delete and nullish keys from the custom theme
...($builderStore.customTheme || $appStore.application?.customTheme), let customTheme =
$builderStore.customTheme || $appStore.application?.customTheme
if (customTheme) {
Object.entries(customTheme).forEach(([key, value]) => {
if (value == null || value === "") {
delete customTheme[key]
}
})
} }
// Merge custom theme with defaults
customTheme = {
...defaultCustomTheme,
...customTheme,
}
// Build CSS string setting all custom variables
let customThemeCss = "" let customThemeCss = ""
Object.entries(customTheme).forEach(([key, value]) => { Object.entries(customTheme).forEach(([key, value]) => {
customThemeCss += `--${key}:${value};` customThemeCss += `--${key}:${value};`
}) })
return { return {
theme, theme,
customTheme, customTheme,