Skip to content
Snippets Groups Projects
BarbiTheme.svelte 4.21 KiB
Newer Older
<script lang="ts">
	export type CSSVariableName =
		| 'colour-background'
		| 'colour-white'
		| 'colour-black'
		| 'colour-contrast'
		| 'colour-primary'
		| 'colour-secondary'
		| 'colour-success'
		| 'colour-error'
		| 'colour-emphasis'
		| 'colour-concrete'
		| 'colour-brick'
		| 'colour-steel'
		| 'colour-neon'
		| 'colour-mustard'
		| 'colour-pastel'
		| 'colour-slate';

	type Overrides = {
		[key in CSSVariableName]?: string;
	};

	export type Props = {
		'no-reset'?: boolean;
	} & Overrides;

	const { 'no-reset': noReset, ...props }: Props = $props();
</script>

<svelte:head>
	{#if !noReset}
		<style id="barbi-reset">
			*,
			*::before,
			*::after {
				box-sizing: border-box;
				margin: 0;
				padding: 0;
			}

			h1,
			h2,
			h3,
			h4,
			h5,
			h6 {
				font-family: var(--font-family-heading);
				font-weight: bold;
				text-transform: uppercase;
			}

			h1 {
				font-size: var(--font-size-h1);
			}
			h2 {
				font-size: var(--font-size-h2);
			}
			h3 {
				font-size: var(--font-size-h3);
			}
			h4 {
				font-size: var(--font-size-h4);
			}

			button {
          font-family: var(--font-family-body);
          font-size: var(--font-size-base);
          color: var(--colour-text);
          line-height: 1.25;
			}

			/* Set core body defaults */
			body {
				font-family: var(--font-family-body);
				font-size: var(--font-size-base);
				color: var(--colour-text);
				background-color: var(--colour-background);
				line-height: 1.25;
			}
		</style>
	{/if}

	{@html `
		<style id="barbi-theme">
				:root {
					/* Primary Colours */
          --colour-primary: ${props['colour-primary'] ?? '#4ecdc4'};
          --colour-secondary: ${props['colour-secondary'] ?? '#ffd93d'};
          --colour-success: ${props['colour-success'] ?? '#6bff8c'};
          --colour-error: ${props['colour-error'] ?? '#ff6b6b'};
          --colour-emphasis: ${props['colour-emphasis'] ?? '#b967ff'};

					/* Shades */
          --colour-white: ${props['colour-white'] ?? '#ffffff'};
          --colour-background: ${props['colour-background'] ?? '#f0f0f0'};
          --colour-concrete: ${props['colour-concrete'] ?? '#c2c2c2'};
          --colour-steel: ${props['colour-steel'] ?? '#7f8c8d'};
          --colour-slate: ${props['colour-slate'] ?? '#34495e'};
          --colour-contrast: ${props['colour-contrast'] ?? '#1a1a1a'};
          --colour-black: ${props['colour-black'] ?? '#000000'};

          /* Alternate Colours */
          --colour-brick: ${props['colour-brick'] ?? '#e74c3c'};
          --colour-neon: ${props['colour-neon'] ?? '#39ff14'};
          --colour-mustard: ${props['colour-mustard'] ?? '#f39c12'};
          --colour-pastel: ${props['colour-pastel'] ?? '#fdcb6e'};

					--colour-text: var(--colour-contrast);
					--colour-shadow: var(--colour-contrast);

					--pattern-light: var(--colour-background);
					--pattern-dark: var(--colour-steel);

					--colour-button: var(--colour-primary);
					--colour-button-active: var(--colour-secondary);
					--colour-button-icon: var(--colour-contrast);
					--colour-button-icon-active: var(--colour-primary);

					/* Typography */
					--font-family-heading: "Arial Black", "Helvetica", sans-serif;
					--font-family-body: "Courier New", monospace;
					--font-size-base: 16px;
					--font-size-h1: 3rem;
					--font-size-h2: 2.5rem;
					--font-size-h3: 2rem;
					--font-size-h4: 1.5rem;
					--font-size-small: 0.875rem;

					/* Spacing */
					--spacing-xs: 0.25rem;
					--spacing-sm: 0.5rem;
					--spacing-md: 1rem;
					--spacing-lg: 2rem;
					--spacing-xl: 4rem;

					/* Shadows */
					--shadow-sm: 3px 3px 0 var(--colour-shadow);
					--shadow-md: 5px 5px 0 var(--colour-shadow);
					--shadow-lg: 8px 8px 0 var(--colour-shadow);

					/* Transitions */
					--transition-fast: 0.2s ease;
					--transition-medium: 0.3s ease;
					--transition-slow: 0.5s ease;

					/* Border */
					--border-width: 3px;
					--border-style: solid;
					--border-colour: var(--colour-contrast);

					/* Gradients */
					--gradient-hsl: linear-gradient(to right,
						hsl(0deg, 100%, 50%),
						hsl(60deg, 100%, 50%),
						hsl(120deg, 100%, 50%),
						hsl(180deg, 100%, 50%),
						hsl(240deg, 100%, 50%),
						hsl(300deg, 100%, 50%),
						hsl(360deg 100% 60%)
					);
				}
		</style>
	`}
</svelte:head>