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:
@@ -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}
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user