Compare commits

3 Commits

Author SHA1 Message Date
c766e36b1e minimal serving size reduction by using hashed css classes
All checks were successful
CI / update (push) Successful in 1m22s
2026-01-25 20:51:46 +01:00
31c9f43114 refactor: replace shadow span with box-shadow on button_wrapper
All checks were successful
CI / update (push) Successful in 1m21s
Remove separate .button_wrapper_shadow element and apply box-shadow
directly to .button_wrapper in mobile view. Reduces DOM by 1 node.
2026-01-25 20:50:43 +01:00
3cc962f454 refactor: reduce DOM nesting and simplify templates
- Remove nested .wrapper div in recipe page using CSS Grid with full-bleed background
- Consolidate multiplier forms in IngredientsPage into single form
- Simplify fermentation conditionals in InstructionsPage with optional chaining
- Use conditional rendering instead of visibility wrapper in Search
- Remove unnecessary dialog wrapper in TitleImgParallax
2026-01-25 20:24:48 +01:00
7 changed files with 61 additions and 67 deletions

View File

@@ -212,17 +212,8 @@ footer{
} }
@media screen and (max-width: 800px) { @media screen and (max-width: 800px) {
.button_wrapper_shadow{
box-shadow: 0 1em 1rem 0rem rgba(0,0,0,0.4);
position: fixed;
width: 100%;
height: 4rem;
top: 0;
left: 0;
z-index: 9;
pointer-events: none;
}
.button_wrapper{ .button_wrapper{
box-shadow: 0 1em 1rem 0rem rgba(0,0,0,0.4);
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
@@ -322,7 +313,6 @@ footer{
</style> </style>
<div class=wrapper lang=de> <div class=wrapper lang=de>
<div> <div>
<span class=button_wrapper_shadow></span>
<div class=button_wrapper> <div class=button_wrapper>
<a href="/" aria-label="Home"><Symbol></Symbol></a> <a href="/" aria-label="Home"><Symbol></Symbol></a>
<div class="right-buttons"> <div class="right-buttons">

View File

@@ -400,24 +400,16 @@ font-family: sans-serif;
{/if} {/if}
<h3>{labels.adjustAmount}</h3> <h3>{labels.adjustAmount}</h3>
<div class=multipliers> <form method="get" class="multipliers">
{#each Array.from(currentParams.entries()) as [key, value]}
{#if key !== 'multiplier'}
<input type="hidden" name={key} {value} />
{/if}
{/each}
{#each multiplierOptions as opt} {#each multiplierOptions as opt}
<form method="get" style="display: inline;"> <button type="submit" name="multiplier" value={opt.value} class="g-pill g-btn-light g-interactive" class:selected={multiplier === opt.value} onclick={(e) => handleMultiplierClick(e, opt.value)}>{@html opt.label}</button>
<input type="hidden" name="multiplier" value={opt.value} />
{#each Array.from(currentParams.entries()) as [key, value]}
{#if key !== 'multiplier'}
<input type="hidden" name={key} {value} />
{/if}
{/each}
<button type="submit" class="g-pill g-btn-light g-interactive" class:selected={multiplier === opt.value} onclick={(e) => handleMultiplierClick(e, opt.value)}>{@html opt.label}</button>
</form>
{/each}
<form method="get" style="display: inline;" class="custom-multiplier g-pill g-btn-light g-interactive" onsubmit={handleCustomSubmit}>
{#each Array.from(currentParams.entries()) as [key, value]}
{#if key !== 'multiplier'}
<input type="hidden" name={key} {value} />
{/if}
{/each} {/each}
<span class="custom-multiplier g-pill g-btn-light g-interactive">
<input <input
type="text" type="text"
name="multiplier" name="multiplier"
@@ -429,8 +421,8 @@ font-family: sans-serif;
oninput={handleCustomInput} oninput={handleCustomInput}
/> />
<button type="submit" class="custom-button">x</button> <button type="submit" class="custom-button">x</button>
</form> </span>
</div> </form>
<h2>{labels.ingredients}</h2> <h2>{labels.ingredients}</h2>
{#each flattenedIngredients as list, listIndex} {#each flattenedIngredients as list, listIndex}

View File

@@ -162,17 +162,15 @@ h3{
{/if} {/if}
{#if data.fermentation} {#if data.fermentation?.bulk}
{#if data.fermentation.bulk}
<div><h3>{labels.bulkFermentation}</h3>{data.fermentation.bulk}</div> <div><h3>{labels.bulkFermentation}</h3>{data.fermentation.bulk}</div>
{/if}
{#if data.fermentation.final}
<div><h3>{labels.finalProof}</h3> {data.fermentation.final}</div>
{/if}
{/if} {/if}
{#if data.baking.temperature} {#if data.fermentation?.final}
<div><h3>{labels.finalProof}</h3> {data.fermentation.final}</div>
{/if}
{#if data.baking?.temperature}
<div><h3>{labels.baking}</h3> {data.baking.length} {labels.at} {data.baking.temperature} °C {data.baking.mode}</div> <div><h3>{labels.baking}</h3> {data.baking.length} {labels.at} {data.baking.temperature} °C {data.baking.mode}</div>
{/if} {/if}

View File

@@ -387,7 +387,7 @@ scale: 0.8 0.8;
</button> </button>
</form> </form>
<div style="visibility: {showFilters ? 'visible' : 'hidden'}; pointer-events: {showFilters ? 'auto' : 'none'};"> {#if showFilters}
<FilterPanel <FilterPanel
availableCategories={categories} availableCategories={categories}
{availableTags} {availableTags}
@@ -408,4 +408,4 @@ scale: 0.8 0.8;
onFavoritesToggle={handleFavoritesToggle} onFavoritesToggle={handleFavoritesToggle}
onLogicModeToggle={handleLogicModeToggle} onLogicModeToggle={handleLogicModeToggle}
/> />
</div> {/if}

View File

@@ -193,10 +193,8 @@ dialog button{
</section> </section>
<dialog id=img_carousel> <dialog id=img_carousel>
<div>
<img class:unblur={isloaded} {src} {alt}> <img class:unblur={isloaded} {src} {alt}>
<button class=action_button onkeydown={(event) => do_on_key(event, 'Enter', false, close_dialog_img)} onclick={close_dialog_img}> <button class=action_button onkeydown={(event) => do_on_key(event, 'Enter', false, close_dialog_img)} onclick={close_dialog_img}>
<Cross fill=white width=2rem height=2rem></Cross> <Cross fill=white width=2rem height=2rem></Cross>
</button> </button>
</div>
</dialog> </dialog>

View File

@@ -146,32 +146,45 @@ h2.section-label{
} }
.wrapper_wrapper{ .wrapper_wrapper{
background-color: #fbf9f3; --bg-color: #fbf9f3;
display: grid;
grid-template-columns: 1fr 2fr;
max-width: 1000px;
margin-inline: auto;
padding-top: 10rem; padding-top: 10rem;
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 3rem; margin-bottom: 3rem;
transform: translateY(-7rem); transform: translateY(-7rem);
z-index: -2; z-index: -2;
position: relative;
}
.wrapper_wrapper::before {
content: '';
position: absolute;
inset: 0;
left: 50%;
transform: translateX(-50%);
width: 100vw;
background-color: var(--bg-color);
z-index: -1;
}
.addendum, .date {
grid-column: 1 / -1;
justify-self: center;
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
.wrapper_wrapper{ .wrapper_wrapper{
background-color: var(--background-dark); --bg-color: var(--background-dark);
} }
} }
.wrapper{
display: flex;
flex-direction: row;
max-width: 1000px;
justify-content: center;
margin-inline: auto;
}
@media screen and (max-width: 700px){ @media screen and (max-width: 700px){
.wrapper{ .wrapper_wrapper{
flex-direction:column; display: flex;
flex-direction: column;
align-items: center;
}
.wrapper_wrapper > :global(.ingredients),
.wrapper_wrapper > :global(.instructions) {
width: 100%;
} }
} }
.title{ .title{
@@ -213,7 +226,7 @@ h2{
} }
.addendum{ .addendum{
max-width: 800px; max-width: 800px;
margin-inline: auto; justify-self: center;
padding-inline: 2rem; padding-inline: 2rem;
} }
@media screen and (max-width: 800px){ @media screen and (max-width: 800px){
@@ -327,10 +340,8 @@ h2{
</div> </div>
<div class=wrapper_wrapper> <div class=wrapper_wrapper>
<div class=wrapper>
<IngredientsPage {data}></IngredientsPage> <IngredientsPage {data}></IngredientsPage>
<InstructionsPage {data}></InstructionsPage> <InstructionsPage {data}></InstructionsPage>
</div>
<div class=addendum> <div class=addendum>
{#if data.addendum} {#if data.addendum}
{@html data.addendum} {@html data.addendum}

View File

@@ -6,6 +6,11 @@ const config = {
// Consult https://kit.svelte.dev/docs/integrations#preprocessors // Consult https://kit.svelte.dev/docs/integrations#preprocessors
// for more information about preprocessors // for more information about preprocessors
preprocess: [vitePreprocess()], preprocess: [vitePreprocess()],
compilerOptions: {
// Shorter CSS hash: "svelte-1abc123" (14 chars) → "abc12" (4 chars)
cssHash: ({ hash, css }) => `${hash(css).slice(0, 4)}`
},
kit: { kit: {
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported or you settled on a specific environment, switch out the adapter. // If your environment is not supported or you settled on a specific environment, switch out the adapter.