Skip to content

Commit

Permalink
add dark mode
Browse files Browse the repository at this point in the history
  • Loading branch information
tkachuk committed Feb 3, 2024
1 parent 592462a commit 2ec004a
Show file tree
Hide file tree
Showing 7 changed files with 160 additions and 105 deletions.
8 changes: 0 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,3 @@
### demo

[demo](https://imhul.github.io/neumorphine.css)

### install:

Coming soon

### How to use:

Coming soon
18 changes: 9 additions & 9 deletions src/lib/components/Config/code.svelte
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script lang="ts">
import { cssData, angle } from '$lib/store';
import { cssData } from '$lib/store';
import Prism from 'prismjs';
import 'prismjs/themes/prism.min.css';
Expand All @@ -25,11 +25,11 @@
` box-shadow: inset ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` inset ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
`}\n .shape .shape-focused {\n` +
` background: linear-gradient(${$angle}, ${$cssData.gradientFocusedFrom}, ${$cssData.gradientFocusedTo});\n` +
` background: linear-gradient(${$cssData.angle}, ${$cssData.gradientFocusedFrom}, ${$cssData.gradientFocusedTo});\n` +
` box-shadow: ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
`}\n .shape .shape-disabled {\n` +
` background: linear-gradient(${$angle}, ${$cssData.gradientFocusedTo}, ${$cssData.gradientFocusedFrom});\n` +
` background: linear-gradient(${$cssData.angle}, ${$cssData.gradientFocusedTo}, ${$cssData.gradientFocusedFrom});\n` +
` box-shadow: ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
`}\n .text {\n` +
Expand All @@ -46,11 +46,11 @@
` box-shadow: inset ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` inset ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset}\n` +
` &-focused \n` +
` background: linear-gradient(${$angle}, ${$cssData.gradientFocusedFrom}, ${$cssData.gradientFocusedTo})\n` +
` background: linear-gradient(${$cssData.angle}, ${$cssData.gradientFocusedFrom}, ${$cssData.gradientFocusedTo})\n` +
` box-shadow: ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset}\n` +
` &-disabled \n` +
` background: linear-gradient(${$angle}, ${$cssData.gradientFocusedTo}, ${$cssData.gradientFocusedFrom})\n` +
` background: linear-gradient(${$cssData.angle}, ${$cssData.gradientFocusedTo}, ${$cssData.gradientFocusedFrom})\n` +
` box-shadow: ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset}\n` +
`.text \n` +
Expand All @@ -66,11 +66,11 @@
` box-shadow: inset ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` inset ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
` &-focused {\n` +
` background: linear-gradient(${$angle}, ${$cssData.gradientFocusedFrom}, ${$cssData.gradientFocusedTo});\n` +
` background: linear-gradient(${$cssData.angle}, ${$cssData.gradientFocusedFrom}, ${$cssData.gradientFocusedTo});\n` +
` box-shadow: ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
` &-disabled {\n` +
` background: linear-gradient(${$angle}, ${$cssData.gradientFocusedTo}, ${$cssData.gradientFocusedFrom});\n` +
` background: linear-gradient(${$cssData.angle}, ${$cssData.gradientFocusedTo}, ${$cssData.gradientFocusedFrom});\n` +
` box-shadow: ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
` }\n` +
Expand All @@ -88,11 +88,11 @@
` box-shadow: inset ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` inset ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
` &-focused {\n` +
` background: linear-gradient(${$angle}, ${$cssData.gradientFocusedFrom}, ${$cssData.gradientFocusedTo});\n` +
` background: linear-gradient(${$cssData.angle}, ${$cssData.gradientFocusedFrom}, ${$cssData.gradientFocusedTo});\n` +
` box-shadow: ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
` &-disabled {\n` +
` background: linear-gradient(${$angle}, ${$cssData.gradientFocusedTo}, ${$cssData.gradientFocusedFrom});\n` +
` background: linear-gradient(${$cssData.angle}, ${$cssData.gradientFocusedTo}, ${$cssData.gradientFocusedFrom});\n` +
` box-shadow: ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadow},\n` +
` ${$cssData.offsetY} ${$cssData.offsetX} ${$cssData.shadowWidth} ${$cssData.boxShadowInset};\n` +
` }\n` +
Expand Down
66 changes: 52 additions & 14 deletions src/lib/components/Config/index.svelte
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
<script lang="ts">
import {
mode,
color,
angle,
offset,
width,
coeff,
showIcons
showIcons,
lightColor,
darkColor,
defaults
} from '$lib/store';
import { tweened } from 'svelte/motion';
// components
Expand All @@ -15,6 +19,9 @@
let clicked = false;
let tweenedAngle = tweened($angle);
$: isResetRequired =
($mode && $lightColor !== defaults.lightColor) ||
(!$mode && $darkColor !== defaults.darkColor);
const onMouseMove = (event: any) => {
if (!clicked) return;
Expand All @@ -36,21 +43,43 @@
<div class="flex">
<div class="info title">Background Color</div>
<label class="circle-label">
<input
class="circle color-picker"
bind:value={$color}
type="color"
/>
{#if $mode}
<input
class="circle color-picker"
bind:value={$lightColor}
type="color"
/>
{:else}
<input
class="circle color-picker"
bind:value={$darkColor}
type="color"
/>
{/if}
</label>
<label class="info">
<div class="btn-wrapper">
{#if $color !== '#ffffff'}
{#if isResetRequired}
<Tooltip position="up" text="Reset">
<button
on:click={() => color.set('#ffffff')}
>
<Icon size={26} name="refresh" />
</button>
{#if $mode}
<button
on:click={() =>
lightColor.set(
defaults.lightColor
)}
>
<Icon size={26} name="refresh" />
</button>
{:else}
<button
on:click={() =>
darkColor.set(
defaults.darkColor
)}
>
<Icon size={26} name="refresh" />
</button>
{/if}
</Tooltip>
{/if}
</div>
Expand Down Expand Up @@ -184,13 +213,22 @@

<div class="switch-wrapper">
<input
id="toggle"
id="toggle-icons"
type="checkbox"
bind:checked={$showIcons}
/>
<label for="toggle" class="switch" />
<label for="toggle-icons" class="switch" />
<span>{$showIcons ? 'Hide' : 'Show'} demo icons</span>
</div>
<div class="switch-wrapper">
<input
id="toggle-mode"
type="checkbox"
bind:checked={$mode}
/>
<label for="toggle-mode" class="switch" />
<span>{$mode ? 'Light' : 'Dark'} mode</span>
</div>
<Code />
</aside>

Expand Down
70 changes: 17 additions & 53 deletions src/lib/components/Shapes/index.svelte
Original file line number Diff line number Diff line change
@@ -1,61 +1,25 @@
<script lang="ts">
import {
angle,
color,
offset,
width,
coeff,
cssData,
showIcons
} from '$lib/store';
import {
transformColor,
getOppositeColor
} from '$lib/utils/colors';
import { cssData } from '$lib/store';
import { shapes, states } from '$lib/utils/config';
import { getOffsetX, getOffsetY } from '$lib/utils/offset';
// components
import Icon from '$lib/components/Icon/index.svelte';
import Tooltip from '$lib/components/Tooltip/index.svelte';
$: shapeBg = transformColor($color, 10 + $coeff);
$: boxShadow = transformColor($color, 60 + $coeff);
$: boxShadowInset = transformColor($color, 20 + $coeff);
$: gradientFocusedFrom = transformColor($color, 50 + $coeff);
$: gradientFocusedTo = transformColor($color, 70 + $coeff);
$: offsetX = getOffsetX($angle, $offset);
$: offsetY = getOffsetY($angle, $offset);
$: textShadowWidth = ($width / 2).toFixed(1) + 'px';
$: iconColor = getOppositeColor($color);
$: styleObj = {
'--angle:': $angle,
'--offset-x:': offsetX + 'px',
'--offset-y:': offsetY + 'px',
'--color:': $color,
'--shape-bg:': shapeBg,
'--box-shadow:': boxShadow,
'--box-shadow-inset: ': boxShadowInset,
'--shadow-width:': $width + 'px',
'--text-shadow-width:': textShadowWidth,
'--gradient-focused-from:': gradientFocusedFrom,
'--gradient-focused-to:': gradientFocusedTo,
'--icon-color:': iconColor
'--angle:': $cssData.angle,
'--offset-x:': $cssData.offsetX,
'--offset-y:': $cssData.offsetY,
'--color:': $cssData.color,
'--shape-bg:': $cssData.shapeBg,
'--box-shadow:': $cssData.boxShadow,
'--box-shadow-inset: ': $cssData.boxShadowInset,
'--shadow-width:': $cssData.shadowWidth,
'--text-shadow-width:': $cssData.textShadowWidth,
'--gradient-focused-from:': $cssData.gradientFocusedFrom,
'--gradient-focused-to:': $cssData.gradientFocusedTo,
'--icon-color:': $cssData.iconColor
};
$: {
cssData.set({
...$cssData,
shapeBg,
boxShadow,
boxShadowInset,
textShadowWidth,
gradientFocusedFrom,
gradientFocusedTo,
offsetX: offsetX + 'px',
offsetY: offsetY + 'px',
shadowWidth: $width + 'px'
});
}
$: styles = Object.entries(styleObj)
.map(([key, value]) => `${key} ${value}`)
.join('; ');
Expand All @@ -70,7 +34,7 @@
class="shape {shape.title} shape-{state.title}"
>
<Tooltip text="{shape.title} {state.title}">
{#if $showIcons}
{#if $cssData.showIcons}
<Icon
size={40}
name="hashtag"
Expand All @@ -88,7 +52,7 @@
{#each states as state}
<Tooltip text="input {state.title}">
<input
value={$showIcons ? state.title : ''}
value={$cssData.showIcons ? state.title : ''}
type="text"
class="input shape shape-{state.title}"
/>
Expand Down Expand Up @@ -171,7 +135,7 @@
flex-direction: column;
font-size: rem(50);
background: var(--shape-bg);
color: var(--primary);
color: var(--icon-color);
@media screen and (min-width: rem(1024)) {
margin: 0 rem(25) rem(25);
Expand Down
77 changes: 58 additions & 19 deletions src/lib/store/index.ts
Original file line number Diff line number Diff line change
@@ -1,33 +1,72 @@
import { writable } from 'svelte/store';
import { writable, derived } from 'svelte/store';
import { getOffsetX, getOffsetY } from '$lib/utils/offset';
import {
getLightColor,
getDarkColor,
getOppositeColor
} from '$lib/utils/colors';

const defaults = {
color: '#ffffff',
export const defaults = {
lightColor: '#ffffff',
darkColor: '#263238',
angle: 45,
offset: 5,
offsetX: '',
offsetY: '',
coeff: 0,
width: 10,
shapeBg: '',
boxShadow: '',
boxShadowInset: '',
shadowWidth: '',
textShadowWidth: '',
gradientFocusedFrom: '',
gradientFocusedTo: '',
showIcons: true
showIcons: true,
mode: true // true for light, false for dark
};

export const color = writable(defaults.color);
export const mode = writable(defaults.mode);
export const lightColor = writable(defaults.lightColor);
export const darkColor = writable(defaults.darkColor);
export const color = derived(
[mode, lightColor, darkColor],
([$mode, $lightColor, $darkColor]) =>
$mode ? $lightColor : $darkColor
);

export const angle = writable(defaults.angle);

export const offset = writable(defaults.offset);

export const coeff = writable(defaults.coeff);

export const width = writable(defaults.width);

export const showIcons = writable(defaults.showIcons);

export const cssData = writable(defaults);
export const cssData = derived(
[mode, color, angle, offset, coeff, width, showIcons],
([
$mode,
$color,
$angle,
$offset,
$coeff,
$width,
$showIcons
]) => {
return {
color: $color,
angle: $angle,
showIcons: $showIcons,
shadowWidth: $width + 'px',
textShadowWidth: ($width / 2).toFixed(1) + 'px',
iconColor: getOppositeColor($color),
offsetX: getOffsetX($angle, $offset) + 'px',
offsetY: getOffsetY($angle, $offset) + 'px',
shapeBg: $mode
? getLightColor($color, 10 + $coeff)
: getDarkColor($color, 10 + $coeff),
boxShadow: $mode
? getLightColor($color, 60 + $coeff)
: getDarkColor($color, 60 + $coeff),
boxShadowInset: $mode
? getLightColor($color, 20 + $coeff)
: getDarkColor($color, 20 + $coeff),
gradientFocusedFrom: $mode
? getLightColor($color, 50 + $coeff)
: getDarkColor($color, 50 + $coeff),
gradientFocusedTo: $mode
? getLightColor($color, 70 + $coeff)
: getDarkColor($color, 70 + $coeff)
};
}
);
Loading

0 comments on commit 2ec004a

Please sign in to comment.