chore: release v0.36.0

This commit is contained in:
Ulas Kalayci
2026-04-29 21:15:26 +02:00
parent 5fd2ff80ad
commit 3f69c7c698
27 changed files with 424 additions and 182 deletions
+7
View File
@@ -332,6 +332,9 @@ function renderBody() {
`;
if (window.lucide) lucide.createIcons();
_container.querySelector('#empty-cta-budget')?.addEventListener('click', () => {
document.querySelector('.page-fab')?.click();
});
stagger(_container.querySelector('#budget-list')?.querySelectorAll('.budget-entry') ?? []);
_container.querySelector('#budget-list')?.addEventListener('click', async (e) => {
@@ -378,6 +381,10 @@ function renderEntries() {
<div class="empty-state__title">${t('budget.emptyTitle')}</div>
<div class="empty-state__description">${t('budget.emptyDescription')}</div>
<p class="empty-state__hint">${t('emptyHint.budget')}</p>
<button class="btn btn--primary empty-state__cta" id="empty-cta-budget">
<i data-lucide="plus" aria-hidden="true" class="icon-base"></i>
${t('budget.emptyAction')}
</button>
</div>`;
}
+7
View File
@@ -181,9 +181,16 @@ function renderList() {
<div class="empty-state__title">${t('contacts.emptyTitle')}</div>
<div class="empty-state__description">${t('contacts.emptyDescription')}</div>
<p class="empty-state__hint">${t('emptyHint.contacts')}</p>
<button class="btn btn--primary empty-state__cta" id="empty-cta-contacts">
<i data-lucide="plus" aria-hidden="true" class="icon-base"></i>
${t('contacts.emptyAction')}
</button>
</div>
`;
if (window.lucide) lucide.createIcons();
container.querySelector('#empty-cta-contacts')?.addEventListener('click', () => {
document.querySelector('.page-fab')?.click();
});
return;
}
+2 -2
View File
@@ -19,8 +19,8 @@ const ONBOARDING_KEY = 'oikos-onboarded';
function getOnboardingSteps() {
return [
{ icon: 'home', title: t('onboarding.step1Title'), body: t('onboarding.step1Body') },
{ icon: 'grid-2x2', title: t('onboarding.step2Title'), body: t('onboarding.step2Body') },
{ icon: 'circle-check', title: t('onboarding.step3Title'), body: t('onboarding.step3Body') },
{ icon: 'navigation', title: t('onboarding.step2Title'), body: t('onboarding.step2Body') },
{ icon: 'plus-circle', title: t('onboarding.step3Title'), body: t('onboarding.step3Body') },
];
}
+8 -1
View File
@@ -146,10 +146,17 @@ function renderGrid() {
</svg>
<div class="empty-state__title">${isFiltered ? t('notes.noResultsTitle') : t('notes.emptyTitle')}</div>
<div class="empty-state__description">${isFiltered ? t('notes.noResultsDescription', { query: state.filterQuery }) : t('notes.emptyDescription')}</div>
${!isFiltered ? `<p class="empty-state__hint">${t('emptyHint.notes')}</p>` : ''}
${!isFiltered ? `<p class="empty-state__hint">${t('emptyHint.notes')}</p>
<button class="btn btn--primary empty-state__cta" id="empty-cta-notes">
<i data-lucide="plus" aria-hidden="true" class="icon-base"></i>
${t('notes.emptyAction')}
</button>` : ''}
</div>
`;
if (window.lucide) lucide.createIcons();
grid.querySelector('#empty-cta-notes')?.addEventListener('click', () => {
document.querySelector('.page-fab')?.click();
});
return;
}
+9 -1
View File
@@ -131,8 +131,16 @@ function renderRecipeList() {
const emptyHint = document.createElement('p');
emptyHint.className = 'empty-state__hint';
emptyHint.textContent = t('emptyHint.recipes');
empty.append(emptyTitle, emptyDesc, emptyHint);
const emptyCta = document.createElement('button');
emptyCta.className = 'btn btn--primary empty-state__cta';
emptyCta.insertAdjacentHTML('afterbegin', '<i data-lucide="plus" aria-hidden="true" class="icon-base"></i>');
emptyCta.append(document.createTextNode(t('recipes.emptyAction')));
emptyCta.addEventListener('click', () => {
document.querySelector('.page-fab')?.click();
});
empty.append(emptyTitle, emptyDesc, emptyHint, emptyCta);
list.appendChild(empty);
if (window.lucide) window.lucide.createIcons({ el: empty });
return;
}
+7
View File
@@ -172,6 +172,10 @@ function renderItems() {
<div class="empty-state__title">${t('shopping.emptyList')}</div>
<div class="empty-state__description">${t('shopping.emptyListDescription')}</div>
<p class="empty-state__hint">${t('emptyHint.shopping')}</p>
<button class="btn btn--primary empty-state__cta" id="empty-cta-shopping">
<i data-lucide="plus" aria-hidden="true" class="icon-base"></i>
${t('shopping.emptyAction')}
</button>
</div>`;
}
@@ -527,6 +531,9 @@ function updateItemsList(container) {
stagger(listEl.querySelectorAll('.shopping-item'));
wireSwipeGestures(container);
maybeShowSwipeHint(container);
listEl.querySelector('#empty-cta-shopping')?.addEventListener('click', () => {
document.querySelector('.page-fab')?.click();
});
}
// clear-checked Button aktualisieren
const checkedCount = state.items.filter((i) => i.is_checked).length;
+7
View File
@@ -268,6 +268,10 @@ function renderTaskGroups(tasks, groupMode) {
<div class="empty-state__title">${t('tasks.emptyTitle')}</div>
<div class="empty-state__description">${t('tasks.emptyDescription')}</div>
<p class="empty-state__hint">${t('emptyHint.tasks')}</p>
<button class="btn btn--primary empty-state__cta" id="empty-cta-tasks">
<i data-lucide="plus" aria-hidden="true" class="icon-base"></i>
${t('tasks.emptyAction')}
</button>
</div>`;
}
@@ -1029,6 +1033,9 @@ function renderTaskList(container) {
updateOverdueBadge();
wireSwipeGestures(container);
maybeShowSwipeHint(container);
listEl.querySelector('#empty-cta-tasks')?.addEventListener('click', () => {
document.querySelector('.page-fab')?.click();
});
}
function renderFilters(container) {