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
This commit is contained in:
2026-01-25 20:24:45 +01:00
parent 5824993b18
commit 3cc962f454
5 changed files with 55 additions and 56 deletions

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 multiplierOptions as opt} {#each Array.from(currentParams.entries()) as [key, value]}
<form method="get" style="display: inline;"> {#if key !== 'multiplier'}
<input type="hidden" name="multiplier" value={opt.value} /> <input type="hidden" name={key} {value} />
{#each Array.from(currentParams.entries()) as [key, value]} {/if}
{#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} {/each}
<form method="get" style="display: inline;" class="custom-multiplier g-pill g-btn-light g-interactive" onsubmit={handleCustomSubmit}> {#each multiplierOptions as opt}
{#each Array.from(currentParams.entries()) as [key, value]} <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>
{#if key !== 'multiplier'} {/each}
<input type="hidden" name={key} {value} /> <span class="custom-multiplier g-pill g-btn-light g-interactive">
{/if}
{/each}
<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

@@ -110,8 +110,8 @@
background-size: cover; background-size: cover;
background-position: 50% 20%; background-position: 50% 20%;
position: absolute; position: absolute;
width: min(1000px, 100dvw); width: min(1000px, 100dvw);
height: max(60dvh,600px); height: max(60dvh,600px);
z-index: -2; z-index: -2;
} }
.placeholder_blur{ .placeholder_blur{
@@ -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}