Merge branch 'release/2.20.0'
This commit is contained in:
@@ -4,6 +4,7 @@ import { Metadata } from 'next';
|
||||
import Script from 'next/script';
|
||||
|
||||
export const metadata:Metadata = {
|
||||
title: 'rezije.app',
|
||||
alternates: {
|
||||
canonical: 'https://rezije.app',
|
||||
languages: {
|
||||
|
||||
@@ -1,50 +1,28 @@
|
||||
import { FC, ReactNode } from 'react';
|
||||
import { FC } from 'react';
|
||||
import { Main } from '@/app/ui/Main';
|
||||
|
||||
import { authConfig, myAuth } from "@/app/lib/auth";
|
||||
import { SignInButton } from '@/app/ui/SignInButton';
|
||||
import { myAuth } from "@/app/lib/auth";
|
||||
import Image from 'next/image';
|
||||
import { getTranslations, getLocale } from "next-intl/server";
|
||||
import isWebview from "is-ua-webview";
|
||||
import { headers } from 'next/headers';
|
||||
import { ExclamationTriangleIcon } from "@heroicons/react/24/outline";
|
||||
import Link from 'next/link';
|
||||
import { paragraphFormatFactory } from '../lib/paragraphFormatFactory';
|
||||
import { getAuthProviders } from '../lib/getProviders';
|
||||
import { EnterOrSignInButton } from '../ui/EnterOrSignInButton';
|
||||
|
||||
type Provider = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: string;
|
||||
style: {
|
||||
logo: string;
|
||||
bg: string;
|
||||
text: string;
|
||||
};
|
||||
};
|
||||
|
||||
function getProviders(): Provider[] {
|
||||
const providerKeys: (keyof Provider)[] = ["id", "name", "type", "style"];
|
||||
return authConfig.providers.map((provider) =>
|
||||
getKeyValuesFromObject<Provider>(provider, providerKeys)
|
||||
);
|
||||
}
|
||||
|
||||
function getKeyValuesFromObject<T>(obj: any, keys: (keyof T)[]): T {
|
||||
return keys.reduce((acc, key) => {
|
||||
if (obj[key]) {
|
||||
acc[key] = obj[key];
|
||||
}
|
||||
return acc;
|
||||
}, {} as T);
|
||||
}
|
||||
const h1ClassName = "text-3xl font-bold max-w-[38rem] mx-auto text-neutral-50";
|
||||
const h2ClassName = h1ClassName + " mt-8";
|
||||
|
||||
const Page: FC = async () => {
|
||||
|
||||
const session = await myAuth();
|
||||
const locale = await getLocale();
|
||||
const providers = await getProviders();
|
||||
const t = await getTranslations("login-page");
|
||||
// get userAgent from NextJS
|
||||
const paragraphFormat = paragraphFormatFactory(locale);
|
||||
|
||||
const t = await getTranslations("login-page");
|
||||
const session = await myAuth();
|
||||
const providers = getAuthProviders();
|
||||
|
||||
// get userAgent from NextJS
|
||||
const headersList = headers();
|
||||
const userAgent = headersList.get("user-agent") as string;
|
||||
|
||||
@@ -52,13 +30,14 @@ const Page:FC = async () => {
|
||||
|
||||
return (
|
||||
<Main>
|
||||
<h1 className="text-3xl font-bold text-center">
|
||||
<span className="text-neutral-50 mr-3">{t("main-card.title-1")}</span>
|
||||
<span className="text-indigo-400">{t("main-card.title-2")}</span>
|
||||
<span className="text-neutral-50 ml-3">{t("main-card.title-3")}</span>
|
||||
<h1 className={h1ClassName}>
|
||||
{t.rich("main-card.title", paragraphFormat)}
|
||||
</h1>
|
||||
<p className="p mt-[1em] text-center">{t("main-card.text-1")}</p>
|
||||
<p className="p mb-[1em] text-center">{t("main-card.text-2")}</p>
|
||||
{t.rich("main-card.text", paragraphFormat)}
|
||||
<Image src={t("main-card.image-url")} alt={t("main-card.image-alt")} className="m-auto mt-0" width={400} height={300} />
|
||||
|
||||
<EnterOrSignInButton session={session} locale={locale} providers={providers} />
|
||||
|
||||
{
|
||||
// Google will refuse OAuth signin if it's inside a webview (i.e. Facebook)
|
||||
insideWebeview &&
|
||||
@@ -67,54 +46,20 @@ const Page:FC = async () => {
|
||||
<ExclamationTriangleIcon className="text-red-600 self-start" />
|
||||
</figure>
|
||||
<div className="card-body pl-2">
|
||||
{
|
||||
t.rich("main-card.in-app-browser-warning", {
|
||||
br: () => <br />,
|
||||
strong: (chunks:ReactNode) => <strong className='text-indigo-300' >{chunks}</strong>,
|
||||
hint: (chunks:ReactNode) => <span className='text-indigo-300 block'> {chunks}</span>
|
||||
})
|
||||
}
|
||||
{t.rich("main-card.in-app-browser-warning", paragraphFormat)}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<span className="flex justify-center">
|
||||
{
|
||||
session ? (
|
||||
<Link
|
||||
href={`/${locale}/home`}
|
||||
className="btn btn-neutral btn-lg"
|
||||
>
|
||||
<Image src="/icon2.png" alt="logo" width={32} height={32} />
|
||||
{t("main-card.go-to-app")}
|
||||
</Link>
|
||||
) : (
|
||||
Object.values(providers).map((provider) => (
|
||||
<div key={provider.name}>
|
||||
<SignInButton provider={provider} />
|
||||
</div>
|
||||
))
|
||||
)
|
||||
}
|
||||
</span>
|
||||
<video className="m-auto mt-4" title={t("main-card.video-title")} role="img" data-js-id="hero" loop muted playsInline autoPlay poster={t("main-card.image-url")}>
|
||||
<source src={t("main-card.video-url")} type="video/webm" />
|
||||
</video>
|
||||
<h2 className={`${h2ClassName} text-xl`}>{t.rich("card-1.title", paragraphFormat)}</h2>
|
||||
{t.rich("card-1.text", paragraphFormat)}
|
||||
<Image src={t("card-1.image-url")} alt={t("card-1.image-alt")} className="m-auto mt-4" width={400} height={300} />
|
||||
|
||||
<h1 className="text-2xl font-bold text-neutral-50 my-5">{t("card-1.title")}</h1>
|
||||
<p className="p mt-[1em]">{t("card-1.text")}</p>
|
||||
<video className="m-auto mt-4" title={t("card-1.video-title")} role="img" data-js-id="hero" loop muted playsInline autoPlay poster={t("card-1.image-url")}>
|
||||
<source src={t("card-1.video-url")} type="video/webm" />
|
||||
</video>
|
||||
<h2 className={`${h2ClassName} text-xl`}>{t.rich("card-2.title", paragraphFormat)}</h2>
|
||||
{t.rich("card-2.text", paragraphFormat)}
|
||||
|
||||
<EnterOrSignInButton session={session} locale={locale} providers={providers} />
|
||||
|
||||
<h1 className="text-2xl font-bold text-neutral-50 my-5">{t("card-2.title")}</h1>
|
||||
<p className="p mt-[1em]">{t("card-2.text")}</p>
|
||||
<Image src="/status-color-demo.png" alt="Boje označavaju status računa" className="m-auto mt-4" width={423} height={145} />
|
||||
|
||||
<h1 className="text-2xl font-bold text-neutral-50 my-5">{t("card-3.title")}</h1>
|
||||
<p className="p mt-[1em]">{t("card-3.text")}</p>
|
||||
<video className="m-auto mt-4" title={t("card-3.video-title")} role="img" data-js-id="hero" loop muted playsInline autoPlay poster={t("card-3.image-url")}>
|
||||
<source src={t("card-3.video-url")} type="video/webm" />
|
||||
</video>
|
||||
</Main>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
import { Main } from "@/app/ui/Main";
|
||||
|
||||
const ConsentPage = () =>
|
||||
<Main>
|
||||
<article className="prose container mx-auto px-6">
|
||||
<h1>Application Privacy Policy for Home Utility Bills Tracking Web App</h1>
|
||||
<h2>1. Introduction</h2>
|
||||
<p>Welcome to our Home Utility Bills Tracking Web Application (“App”). This Privacy Policy is intended to inform you about how we collect, use, and disclose your personal information through the operation of the App.</p>
|
||||
<h2>2. Information We Collect</h2>
|
||||
<ol>
|
||||
<li><strong>Information You Provide</strong>: This includes the billing locations, bill names, attached documents, and any other data you enter into the App.</li>
|
||||
<li><strong>Information from Google OAuth</strong>: When you authenticate using Google OAuth, we receive your email address and OAuth ID.</li>
|
||||
</ol>
|
||||
<h2>3. How We Use Your Information</h2>
|
||||
<ol>
|
||||
<li><strong>To Provide Our Service</strong>: We use your information to operate, maintain, and provide to you the features and functionality of the App.</li>
|
||||
<li><strong>Communication</strong>: We may use your email address to communicate with you, for example, to send you notifications about your account or updates to our Privacy Policy.</li>
|
||||
</ol>
|
||||
<h2>4. How We Store Your Information</h2>
|
||||
<p>Your information is stored on secure servers and is only accessible to a limited number of persons who have special access rights to such systems.</p>
|
||||
<h2>5. Sharing of Your Information</h2>
|
||||
<p>We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our website, conducting our business, or servicing you, so long as those parties agree to keep this information confidential.</p>
|
||||
<h2>6. Security</h2>
|
||||
<p>We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information.</p>
|
||||
<h2>7. Your Choices and Rights</h2>
|
||||
<p>You have the right to access, update or request the deletion of your personal information. Please contact us directly to exercise these rights.</p>
|
||||
<h2>8. Data Retention</h2>
|
||||
<p>We will retain your information for as long as your account is active or as needed to provide you services. We will also retain and use your information as necessary to comply with our legal obligations, resolve disputes, and enforce our agreements.</p>
|
||||
<h2>9. Changes to Our Privacy Policy</h2>
|
||||
<p>We may update this privacy policy to reflect changes to our information practices. If we make any material changes, we will notify you by email (sent to the e-mail address specified in your account) or by means of a notice on this App prior to the change becoming effective.</p>
|
||||
<h2>10. Contact Us</h2>
|
||||
<p>If you have any questions about this Privacy Policy, please contact us at <a href="mail:support@rezije.app">support@rezije.app</a>.</p>
|
||||
<h2>11. Consent</h2>
|
||||
<p>By using our App, you consent to our privacy policy.</p>
|
||||
</article>
|
||||
</Main>;
|
||||
|
||||
export default ConsentPage;
|
||||
107
app/[locale]/privacy-policy/page.tsx
Normal file
107
app/[locale]/privacy-policy/page.tsx
Normal file
@@ -0,0 +1,107 @@
|
||||
import { Main } from "@/app/ui/Main";
|
||||
import { ClassNames } from "@emotion/react";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import Link from "next/link";
|
||||
|
||||
const PrivacyPolicyPage = async () => {
|
||||
const t = await getTranslations("privacy-policy-page");
|
||||
|
||||
const richTextFormat = {
|
||||
strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,
|
||||
emailLink: (chunks: React.ReactNode) => <Link href={`mailto:${chunks}`} className="no-underline hover:underline">{chunks}</Link>
|
||||
};
|
||||
|
||||
return (
|
||||
<Main>
|
||||
<article className="prose container mx-auto px-6">
|
||||
<h1>{t("title")}</h1>
|
||||
|
||||
<h2>{t("section-1.heading")}</h2>
|
||||
<p>{t("section-1.content")}</p>
|
||||
|
||||
<h2>{t("section-2.heading")}</h2>
|
||||
<p>{t.rich("section-2.paragraph-1", richTextFormat)}</p>
|
||||
<p>{t.rich("section-2.paragraph-2", richTextFormat)}</p>
|
||||
|
||||
<h2>{t("section-3.heading")}</h2>
|
||||
<p>{t("section-3.intro")}</p>
|
||||
<ol>
|
||||
<li>{t.rich("section-3.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-3.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-3.item-3", richTextFormat)}</li>
|
||||
<li>{t.rich("section-3.item-4", richTextFormat)}</li>
|
||||
<li>{t.rich("section-3.item-5", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-4.heading")}</h2>
|
||||
<p>{t("section-4.intro")}</p>
|
||||
<ol>
|
||||
<li>{t.rich("section-4.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-4.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-4.item-3", richTextFormat)}</li>
|
||||
<li>{t.rich("section-4.item-4", richTextFormat)}</li>
|
||||
<li>{t.rich("section-4.item-5", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-5.heading")}</h2>
|
||||
<p>{t.rich("section-5.paragraph-1", richTextFormat)}</p>
|
||||
<p>{t.rich("section-5.paragraph-2", richTextFormat)}</p>
|
||||
|
||||
<h2>{t("section-6.heading")}</h2>
|
||||
<p>{t("section-6.content")}</p>
|
||||
|
||||
<h2>{t("section-7.heading")}</h2>
|
||||
<p>{t("section-7.intro")}</p>
|
||||
<ol>
|
||||
<li>{t.rich("section-7.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-7.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-7.item-3", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-8.heading")}</h2>
|
||||
<p>{t("section-8.content")}</p>
|
||||
|
||||
<h2>{t("section-9.heading")}</h2>
|
||||
<p>{t("section-9.content")}</p>
|
||||
|
||||
<h2>{t("section-10.heading")}</h2>
|
||||
<p>{t("section-10.intro")}</p>
|
||||
<ol>
|
||||
<li>{t.rich("section-10.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-10.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-10.item-3", richTextFormat)}</li>
|
||||
<li>{t.rich("section-10.item-4", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-11.heading")}</h2>
|
||||
<p>{t("section-11.intro")}</p>
|
||||
<ol>
|
||||
<li>{t.rich("section-11.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-11.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-11.item-3", richTextFormat)}</li>
|
||||
<li>{t.rich("section-11.item-4", richTextFormat)}</li>
|
||||
<li>{t.rich("section-11.item-5", richTextFormat)}</li>
|
||||
<li>{t.rich("section-11.item-6", richTextFormat)}</li>
|
||||
<li>{t.rich("section-11.item-7", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-12.heading")}</h2>
|
||||
<p>{t.rich("section-12.content", richTextFormat)}</p>
|
||||
|
||||
<h2>{t("section-13.heading")}</h2>
|
||||
<p>{t("section-13.content")}</p>
|
||||
|
||||
<h2>{t("section-14.heading")}</h2>
|
||||
<p>{t("section-14.content")}</p>
|
||||
|
||||
<h2>{t("section-15.heading")}</h2>
|
||||
<p>{t("section-15.content")}</p>
|
||||
|
||||
<h2>{t("section-16.heading")}</h2>
|
||||
<p>{t.rich("section-16.content", richTextFormat)}</p>
|
||||
</article>
|
||||
</Main>
|
||||
);
|
||||
};
|
||||
|
||||
export default PrivacyPolicyPage;
|
||||
138
app/[locale]/terms-of-service/page.tsx
Normal file
138
app/[locale]/terms-of-service/page.tsx
Normal file
@@ -0,0 +1,138 @@
|
||||
import { Main } from "@/app/ui/Main";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import Link from "next/link";
|
||||
|
||||
const TermsPage = async () => {
|
||||
const t = await getTranslations("terms-of-service-page");
|
||||
|
||||
const richTextFormat = {
|
||||
strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,
|
||||
emailLink: (chunks: React.ReactNode) => <Link href={`mailto:${chunks}`} className="no-underline hover:underline">{chunks}</Link>
|
||||
};
|
||||
|
||||
return (
|
||||
<Main>
|
||||
<article className="prose container">
|
||||
<h1>{t("title")}</h1>
|
||||
|
||||
<h2>{t("section-1.heading")}</h2>
|
||||
<p>{t("section-1.content")}</p>
|
||||
|
||||
<h2>{t("section-2.heading")}</h2>
|
||||
<ol>
|
||||
<li>{t.rich("section-2.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-2.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-2.item-3", richTextFormat)}</li>
|
||||
<li>{t.rich("section-2.item-4", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-3.heading")}</h2>
|
||||
<ol>
|
||||
<li>{t.rich("section-3.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-3.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-3.item-3", richTextFormat)}</li>
|
||||
<li>{t.rich("section-3.item-4", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-4.heading")}</h2>
|
||||
<p>{t("section-4.paragraph-1")}</p>
|
||||
<p>{t("section-4.paragraph-2")}</p>
|
||||
|
||||
<h2>{t("section-5.heading")}</h2>
|
||||
<ol>
|
||||
<li>{t.rich("section-5.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-5.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-5.item-3", richTextFormat)}</li>
|
||||
<li>{t.rich("section-5.item-4", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-6.heading")}</h2>
|
||||
<p>{t.rich("section-6.paragraph-1", richTextFormat)}</p>
|
||||
<p>{t("section-6.paragraph-2")}</p>
|
||||
<p>{t("section-6.paragraph-3")}</p>
|
||||
<p>{t("section-6.paragraph-4")}</p>
|
||||
<p>{t("section-6.paragraph-5")}</p>
|
||||
|
||||
<h2>{t("section-7.heading")}</h2>
|
||||
<p>{t("section-7.paragraph-1")}</p>
|
||||
<p>{t.rich("section-7.paragraph-2", richTextFormat)}</p>
|
||||
<p>{t("section-7.paragraph-3")}</p>
|
||||
|
||||
<h2>{t("section-8.heading")}</h2>
|
||||
<p>{t("section-8.intro")}</p>
|
||||
<ol>
|
||||
<li>{t("section-8.item-1")}</li>
|
||||
<li>{t("section-8.item-2")}</li>
|
||||
<li>{t("section-8.item-3")}</li>
|
||||
<li>{t("section-8.item-4")}</li>
|
||||
<li>{t("section-8.item-5")}</li>
|
||||
<li>{t("section-8.item-6")}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-9.heading")}</h2>
|
||||
<p>{t("section-9.paragraph-1")}</p>
|
||||
<p>{t("section-9.paragraph-2")}</p>
|
||||
|
||||
<h2>{t("section-10.heading")}</h2>
|
||||
<ol>
|
||||
<li>{t.rich("section-10.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-10.item-2", richTextFormat)}</li>
|
||||
<li>{t.rich("section-10.item-3", richTextFormat)}</li>
|
||||
<li>{t.rich("section-10.item-4", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-11.heading")}</h2>
|
||||
<p>{t("section-11.paragraph-1")}</p>
|
||||
<p>{t("section-11.paragraph-2")}</p>
|
||||
<p>{t("section-11.paragraph-3")}</p>
|
||||
<p>{t("section-11.paragraph-4")}</p>
|
||||
|
||||
<h2>{t("section-12.heading")}</h2>
|
||||
<p>{t("section-12.paragraph-1")}</p>
|
||||
<p>{t("section-12.paragraph-2")}</p>
|
||||
|
||||
<h2>{t("section-13.heading")}</h2>
|
||||
<p>{t.rich("section-13.paragraph-1", richTextFormat)}</p>
|
||||
<p>{t("section-13.paragraph-2")}</p>
|
||||
<p>{t("section-13.paragraph-3")}</p>
|
||||
|
||||
<h2>{t("section-14.heading")}</h2>
|
||||
<p>{t("section-14.paragraph-1")}</p>
|
||||
<p>{t("section-14.paragraph-2")}</p>
|
||||
|
||||
<h2>{t("section-15.heading")}</h2>
|
||||
<p>{t("section-15.paragraph-1")}</p>
|
||||
<p>{t("section-15.paragraph-2")}</p>
|
||||
<p>{t("section-15.paragraph-3")}</p>
|
||||
|
||||
<h2>{t("section-16.heading")}</h2>
|
||||
<p>{t("section-16.content")}</p>
|
||||
|
||||
<h2>{t("section-17.heading")}</h2>
|
||||
<p>{t("section-17.content")}</p>
|
||||
|
||||
<h2>{t("section-18.heading")}</h2>
|
||||
<p>{t("section-18.paragraph-1")}</p>
|
||||
<p>{t("section-18.paragraph-2")}</p>
|
||||
<p>{t("section-18.paragraph-3")}</p>
|
||||
|
||||
<h2>{t("section-19.heading")}</h2>
|
||||
<p>{t("section-19.content")}</p>
|
||||
|
||||
<h2>{t("section-20.heading")}</h2>
|
||||
<ol>
|
||||
<li>{t.rich("section-20.item-1", richTextFormat)}</li>
|
||||
<li>{t.rich("section-20.item-2", richTextFormat)}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{t("section-21.heading")}</h2>
|
||||
<p>{t("section-21.content")}</p>
|
||||
|
||||
<h2>{t("section-22.heading")}</h2>
|
||||
<p>{t.rich("section-22.content", richTextFormat)}</p>
|
||||
</article>
|
||||
</Main>
|
||||
);
|
||||
};
|
||||
|
||||
export default TermsPage;
|
||||
@@ -1,52 +0,0 @@
|
||||
import { Main } from "@/app/ui/Main";
|
||||
|
||||
const TermsPage = () =>
|
||||
<Main>
|
||||
<article className="prose container">
|
||||
<h1>Terms of Service for Home Utility Bills Tracking Web Application</h1>
|
||||
<h2>1. Introduction</h2>
|
||||
<p>Welcome to our Home Utility Bills Tracking Web Application (“App”). These Terms of Service (“Terms”) govern your access to and use of our App. By accessing or using the App, you agree to be bound by these Terms.</p>
|
||||
<h2>2. Use of the Service</h2>
|
||||
<ol>
|
||||
<li><strong>Eligibility</strong>: You must be at least 18 years old to use the App.</li>
|
||||
<li><strong>Account Registration</strong>: You must register for an account through Google OAuth to access the App.</li>
|
||||
<li><strong>User Responsibilities</strong>: You are responsible for all activities conducted under your account and for keeping your password confidential.</li>
|
||||
</ol>
|
||||
<h2>3. User Content</h2>
|
||||
<ol>
|
||||
<li><strong>Ownership</strong>: You retain all rights to the data you enter into the App, including billing locations, bill names, and attached documents.</li>
|
||||
<li><strong>Licenses</strong>: You grant us a license to use, store, and display the data you enter into the App for the purpose of providing the service.</li>
|
||||
</ol>
|
||||
<h2>4. Prohibited Conduct</h2>
|
||||
<p>You agree not to use the App in a way that:</p>
|
||||
<ol>
|
||||
<li>Violates any law or regulation.</li>
|
||||
<li>Is harmful, fraudulent, deceptive, threatening, harassing, defamatory, obscene, or otherwise objectionable.</li>
|
||||
<li>Jeopardizes the security of your account or anyone else's account.</li>
|
||||
</ol>
|
||||
<h2>5. Modifications to the App</h2>
|
||||
<p>We reserve the right to modify or discontinue, temporarily or permanently, the App (or any part thereof) with or without notice.</p>
|
||||
<h2>6. Termination</h2>
|
||||
<p>We may terminate or suspend your access to the App immediately, without prior notice or liability, for any reason whatsoever, including without limitation if you breach the Terms.</p>
|
||||
|
||||
<h2>7. Disclaimers</h2>
|
||||
<p>The App is provided on an “AS IS” and “AS AVAILABLE” basis. We disclaim all warranties of any kind, whether express or implied, including, but not limited to, the implied warranties of merchantability, fitness for a particular purpose, and non-infringement.</p>
|
||||
<p><strong>2D Barcode Information Disclaimer:</strong> We do not assume responsibility for the information contained within the 2D barcodes presented by the App. The content encoded in 2D barcodes is generated based on the information provided by the users or derived from the documents uploaded by the user, and we do not verify or guarantee its accuracy or completeness. Users are advised to review and confirm the correctness of such content before using it. We are not liable for any losses or damages resulting from the use of the 2D barcodes, including but not limited to transactions or payments initiated based on the information contained in these barcodes that may be detrimental to the user.</p>
|
||||
|
||||
<h2>8. Limitation of Liability</h2>
|
||||
<p>In no event shall we be liable for any indirect, incidental, special, consequential or punitive damages, or any loss of profits or revenues, whether incurred directly or indirectly, or any loss of data, use, goodwill, or other intangible losses, resulting from:</p>
|
||||
<ol>
|
||||
<li>your access to or use of or inability to access or use the App;</li>
|
||||
<li>any conduct or content of any third party on the App;</li>
|
||||
<li>the information contained within the 2D barcodes generated or presented by the App.</li>
|
||||
</ol>
|
||||
<h2>9. Governing Law</h2>
|
||||
<p>These Terms shall be governed and construed in accordance with the laws of Croatia, without regard to its conflict of law provisions.</p>
|
||||
<h2>10. Changes</h2>
|
||||
<p>We reserve the right, at our sole discretion, to modify or replace these Terms at any time. We will try to provide at least 10 days' notice prior to any new terms taking effect.</p>
|
||||
<h2>11. Contact Us</h2>
|
||||
<p>If you have any questions about these Terms, please contact us at <a href="mail:support@rezije.app">support@rezije.app</a>.</p>
|
||||
</article>
|
||||
</Main>;
|
||||
|
||||
export default TermsPage;
|
||||
28
app/lib/getProviders.ts
Normal file
28
app/lib/getProviders.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { authConfig } from "./auth";
|
||||
|
||||
export type AuthProvider = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: string;
|
||||
style: {
|
||||
logo: string;
|
||||
bg: string;
|
||||
text: string;
|
||||
};
|
||||
};
|
||||
|
||||
export function getAuthProviders(): AuthProvider[] {
|
||||
const providerKeys: (keyof AuthProvider)[] = ["id", "name", "type", "style"];
|
||||
return authConfig.providers.map((provider) =>
|
||||
getKeyValuesFromObject<AuthProvider>(provider, providerKeys)
|
||||
);
|
||||
}
|
||||
|
||||
export function getKeyValuesFromObject<T>(obj: any, keys: (keyof T)[]): T {
|
||||
return keys.reduce((acc, key) => {
|
||||
if (obj[key]) {
|
||||
acc[key] = obj[key];
|
||||
}
|
||||
return acc;
|
||||
}, {} as T);
|
||||
}
|
||||
13
app/lib/paragraphFormatFactory.tsx
Normal file
13
app/lib/paragraphFormatFactory.tsx
Normal file
@@ -0,0 +1,13 @@
|
||||
import Link from "next/link";
|
||||
import { ReactNode } from "react"
|
||||
|
||||
export const paragraphFormatFactory = (locale: string) => ({
|
||||
strong: (chunks: ReactNode) => <strong className='text-indigo-400 font-semibold' >{chunks}</strong>,
|
||||
bold: (chunks: ReactNode) => <strong className='text-bold' >{chunks}</strong>,
|
||||
indigo: (chunks: ReactNode) => <span className="text-indigo-400"> {chunks} </span>,
|
||||
p: (chunks: ReactNode) => <p className="p mt-[1em] max-w-[38rem] mx-auto text-justify">{chunks}</p>,
|
||||
disclaimer: (chunks: ReactNode) => <p className="p mt-[1em] max-w-[30rem] mx-auto text-center text-sm text-neutral-500">{chunks}</p>,
|
||||
hint: (chunks: ReactNode) => <span className='text-indigo-400 block'> {chunks}</span>,
|
||||
linkTermsOfService: (chunks: ReactNode) => <Link href={`/${locale}/terms-of-service`} className="hover:underline italic">{chunks}</Link>,
|
||||
linkPrivacyPolicy: (chunks: ReactNode) => <Link href={`/${locale}/privacy-policy`} className="hover:underline italic">{chunks}</Link>
|
||||
});
|
||||
38
app/ui/EnterOrSignInButton.tsx
Normal file
38
app/ui/EnterOrSignInButton.tsx
Normal file
@@ -0,0 +1,38 @@
|
||||
import { FC } from 'react';
|
||||
|
||||
import { SignInButton } from '@/app/ui/SignInButton';
|
||||
import Image from 'next/image';
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import Link from 'next/link';
|
||||
import { paragraphFormatFactory } from '../lib/paragraphFormatFactory';
|
||||
import { AuthProvider } from '../lib/getProviders';
|
||||
|
||||
export const EnterOrSignInButton: FC<{ session: any, locale: string, providers: AuthProvider[] }> = async ({ session, locale, providers }) => {
|
||||
const paragraphFormat = paragraphFormatFactory(locale);
|
||||
|
||||
const t = await getTranslations("login-page");
|
||||
|
||||
return (
|
||||
<>
|
||||
<span className="flex justify-center mt-4">
|
||||
{
|
||||
session ? (
|
||||
<Link
|
||||
href={`/${locale}/home`}
|
||||
className="btn btn-neutral btn-lg"
|
||||
>
|
||||
<Image src="/icon2.png" alt="logo" width={32} height={32} />
|
||||
{t("main-card.go-to-app")}
|
||||
</Link>
|
||||
) : (
|
||||
Object.values(providers).map((provider) => (
|
||||
<div key={provider.name}>
|
||||
<SignInButton provider={provider} />
|
||||
</div>
|
||||
))
|
||||
)
|
||||
}
|
||||
</span>
|
||||
{t.rich("disclaimer", paragraphFormat)}
|
||||
</>);
|
||||
};
|
||||
6
app/ui/MultiParagrpahText.tsx
Normal file
6
app/ui/MultiParagrpahText.tsx
Normal file
@@ -0,0 +1,6 @@
|
||||
import React from "react";
|
||||
|
||||
|
||||
export const MultiParagraphText: React.FC<{ text: string }> = ({ text }) =>
|
||||
text.split("\n").map((line, index) => (
|
||||
<p key={index} className="p mt-[1em] max-w-[38em] mx-auto text-justify">{line}</p>));
|
||||
@@ -2,10 +2,12 @@ import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
import React from "react";
|
||||
import { useTranslations } from "next-intl";
|
||||
import { getLocale } from "next-intl/server";
|
||||
|
||||
export const PageFooter: React.FC = () => {
|
||||
export const PageFooter: React.FC = async () => {
|
||||
|
||||
const t = useTranslations("PageFooter");
|
||||
const locale = await getLocale();
|
||||
|
||||
return(
|
||||
<div className="bg-base-100 text-base-content mt-10">
|
||||
@@ -15,18 +17,13 @@ export const PageFooter: React.FC = () => {
|
||||
<Image src="/icon4.png" alt="logo" width={64} height={64}></Image>
|
||||
<div className="font-title inline-flex text-3xl font-black ml-2">Režije</div>
|
||||
</div>
|
||||
<p className="text-base-content/70 mb-5">{t('app-description')}</p>
|
||||
<Link href="/home" className="link link-hover">{t('links.home')}</Link>
|
||||
<Link href="/policy/" className="link link-hover">{t('links.privacy-policy')}</Link>
|
||||
<Link href="/terms/" className="link link-hover">{t('links.terms-of-service')}</Link>
|
||||
<p>{t('app-description')}</p>
|
||||
<div className="flex gap-4">
|
||||
<Link href="/" className="link link-hover">{t('links.home')}</Link>
|
||||
<Link href={`/${locale}/privacy-policy/`} className="link link-hover">{t('links.privacy-policy')}</Link>
|
||||
<Link href={`/${locale}/terms-of-service/`} className="link link-hover">{t('links.terms-of-service')}</Link>
|
||||
</div>
|
||||
<div>
|
||||
<span className="footer-title opacity-70">documents</span>
|
||||
<a href="https://tailwindcss.com/docs/" target="_blank" className="link link-hover">tailwindcss.com</a>
|
||||
<a href="https://heroicons.com/" target="_blank" className="link link-hover">heroicons.com</a>
|
||||
<a href="https://daisyui.com/components/" target="_blank" className="link link-hover">daisyui.com</a>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
|
||||
308
messages/en.json
308
messages/en.json
@@ -18,38 +18,29 @@
|
||||
},
|
||||
"login-page": {
|
||||
"main-card": {
|
||||
"title-1": "Which bills are due?",
|
||||
"title-2": "Which are payed?",
|
||||
"title-3": "How much are my expenses?",
|
||||
"text-1": "These are the questions this simple and free app will help you with ...",
|
||||
"text-2": "... try it & use it completly free!",
|
||||
"title": "Bill management made easy<indigo> for landlords</indigo>",
|
||||
"text": "<p>The best part of renting out an apartment or house is when the <strong>rent hits your account</strong>. Dealing with utility bills, though? <strong>Not so much.</strong></p><p>Bills show up one by one, <strong>papers start piling up</strong>, and suddenly you're sorting, checking what came in, what's paid, and what's still outstanding...</p><p>Then you've got to gather everything, send it to the tenant, and keep track of whether they paid. <strong>It's boring, and it needs you to be annoyingly precise.</strong></p>",
|
||||
"go-to-app": "Go to the App",
|
||||
"in-app-browser-warning": "<strong>WARNING:</strong> we detected you're using an in-app browser.<br></br>This might prevent this app to work properly.<hint>Please use a regular browser to sign in (rezije.app) 😉</hint>",
|
||||
"in-app-browser-warning": "<strong>WARNING!</strong> We detected that the website is opened in an in-app browser. This may cause issues with this web application. <hint>Please open the web application in a regular web browser (rezije.app) 😉</hint>",
|
||||
"image-url": "/man-burried-under-paper.png",
|
||||
"image-alt": "Man buried under papers",
|
||||
"video-url": "/welcome-demo-vp9-25fps-1500bps.webm",
|
||||
"image-url": "/hero.png",
|
||||
"video-title": "Demo osnovnih koraka u aplikaciji"
|
||||
"video-title": "Demo of basic steps in the application"
|
||||
},
|
||||
"card-1": {
|
||||
"title": "Easy copy of expenditures",
|
||||
"text": "All your realestate and utilitys are automatically copied to the next month, so you don't neeed to do it by hand.",
|
||||
"title": "Can it get better?",
|
||||
"text": "<p>You're in luck - <strong>rezije.app</strong> is a free tool built to <strong>solve exactly these problems</strong>!</p><p>This tool will enable you to easily and <strong>clearly track due and paid bills</strong>. All digital, efficient, and meticulous!</p><p>In addition, this tool offers the possibility of <strong>automatic sending</strong> of monthly statements to tenants, which includes a barcode for quick <strong>payment of rent and utilities to your IBAN or Revolut.</strong></p>",
|
||||
"video-url": "/kopiranje-mjeseca-demo.webm",
|
||||
"image-url": "/status-color-demo.png",
|
||||
"video-title": "Demo kopiranja mjeseca"
|
||||
"image-url": "/robot-sorting-papers.png",
|
||||
"image-alt": "Robot sorting papers",
|
||||
"video-title": "Demo of month copying"
|
||||
},
|
||||
"card-2": {
|
||||
"title": "Color signals status",
|
||||
"text": "Each of the utility bills is color coded - at a glance you can see which bill was received and which one is payed.",
|
||||
"image-url": "/bar-code-demo.png",
|
||||
"image-alt": "Boje označavaju status računa"
|
||||
"title": "What do I need to get started?",
|
||||
"text": "<p>All you need is a <strong>Gmail account to sign in</strong> and you can start using the tool right away!</p><p>You don't need to fill out registration forms or confirm your email address - it's a <strong>turnkey solution!</strong></p>"
|
||||
},
|
||||
"card-3": {
|
||||
"title": "Color signals status",
|
||||
"text": "If the attached dokument contains a 2D bar code, it is automatically extracted and shown on the page, so you can scan it without opening the PDF document.",
|
||||
"video-url": "/welcome-demo-vp9-25fps-1500bps.webm",
|
||||
"image-url": "/bar-code-demo.png",
|
||||
"video-title": "Demo osnovnih koraka u aplikaciji"
|
||||
},
|
||||
"sign-in-button": "Sign in with"
|
||||
"sign-in-button": "Sign in with",
|
||||
"disclaimer": "<disclaimer><bold>Note:</bold> by signing in to this web application, you accept the <linkTermsOfService>Terms of Service</linkTermsOfService> and <linkPrivacyPolicy>Privacy Policy</linkPrivacyPolicy>.</disclaimer>"
|
||||
},
|
||||
"home-page": {
|
||||
"add-location-button": {
|
||||
@@ -107,7 +98,9 @@
|
||||
"bill-deleted-message": "Bill deleted successfully",
|
||||
"location-saved-message": "Location saved successfully",
|
||||
"location-deleted-message": "Location deleted successfully",
|
||||
"bill-multi-edit-save-success-message": "Changes saved successfully"
|
||||
"bill-multi-edit-save-success-message": "Changes saved successfully",
|
||||
"bill-multi-edit-save-error-message": "Error saving changes",
|
||||
"bill-multi-edit-load-error-message": "Error loading data"
|
||||
},
|
||||
"bill-delete-form": {
|
||||
"text": "Please confirm deletion of bill \"<strong>{bill_name}</strong>\" at \"<strong>{location_name}</strong>\".",
|
||||
@@ -175,6 +168,8 @@
|
||||
"tenant-payment-instructions-method--iban-disabled": "payment via IBAN - disabled in app settings",
|
||||
"tenant-payment-instructions-method--revolut": "🅡 payment via Revolut",
|
||||
"tenant-payment-instructions-method--revolut-disabled": "payment via Revolut - disabled in app settings",
|
||||
"tenant-payment-instructions-method--disabled-message": "This option is unavailable because it is not enabled in the application settings.",
|
||||
"iban-payment--form-title": "Payment information for IBAN",
|
||||
"iban-payment--tenant-name-label": "Tenant First and Last Name",
|
||||
"iban-payment--tenant-name-placeholder": "enter tenant's first and last name",
|
||||
"iban-payment--tenant-street-label": "Tenant Street and House Number",
|
||||
@@ -278,5 +273,268 @@
|
||||
"cancel-button": "Cancel",
|
||||
"back-to-home-button": "Back to Home",
|
||||
"save-error-message": "Error saving changes"
|
||||
},
|
||||
"terms-of-service-page": {
|
||||
"title": "Terms of Service for the Utility Bill Tracking Web App \"rezije.app\"",
|
||||
"meta": {
|
||||
"effective-date": "{{EFFECTIVE_DATE}}",
|
||||
"last-updated": "{{LAST_UPDATED_DATE}}",
|
||||
"provider": {
|
||||
"name": "{{SERVICE_PROVIDER_NAME}}",
|
||||
"address": "{{ADDRESS}}",
|
||||
"oib": "{{TAX_ID_OR_REGISTRATION_NUMBER}}",
|
||||
"email": "support@rezije.app"
|
||||
},
|
||||
"data-hosting": "EU",
|
||||
"analytics": "Self-hosted web analytics"
|
||||
},
|
||||
"section-1": {
|
||||
"heading": "1. Introduction",
|
||||
"content": "These Terms of Service (\"Terms\") govern your access to and use of the utility bill tracking web application (the \"Application\"). The service provider is \"rezije.app\" (\"we\", \"us\", \"our\"). By accessing or using the Application, you confirm that you have read, understood, and agree to be bound by these Terms. If you do not agree to these Terms, do not use the Application."
|
||||
},
|
||||
"section-2": {
|
||||
"heading": "2. Definitions",
|
||||
"item-1": "<strong>\"User\"</strong> means any person who accesses or uses the Application.",
|
||||
"item-2": "<strong>\"Account\"</strong> means a user account created via Google OAuth.",
|
||||
"item-3": "<strong>\"User Content\"</strong> means any data you enter into or upload to the Application (e.g., billing locations, account names, amounts, dates, documents, photos, PDFs).",
|
||||
"item-4": "<strong>\"Service\"</strong> means the Application's features and functionality, including storing, displaying, and organizing utility-related data and generating/displaying 2D barcodes."
|
||||
},
|
||||
"section-3": {
|
||||
"heading": "3. Eligibility and Registration",
|
||||
"item-1": "<strong>Age</strong>: You must be at least 18 years old (or the age of majority under applicable law) to use the Application.",
|
||||
"item-2": "<strong>Registration</strong>: Access to the Application requires creating an Account via Google OAuth. We do not control Google's authentication process.",
|
||||
"item-3": "<strong>Accuracy</strong>: You agree to provide accurate and up-to-date information where applicable.",
|
||||
"item-4": "<strong>Account Security</strong>: You are responsible for all activity conducted through your Account. You agree to notify us promptly if you suspect any unauthorized access."
|
||||
},
|
||||
"section-4": {
|
||||
"heading": "4. Scope and Purpose of the Service",
|
||||
"paragraph-1": "The Application is a tool for personal tracking and organization of utility bill data. We do not provide financial, tax, or legal advice, and we do not guarantee the Application is fit for any specific purpose.",
|
||||
"paragraph-2": "We may add, change, or remove features over time. Certain features may be experimental or in beta."
|
||||
},
|
||||
"section-5": {
|
||||
"heading": "5. User Content and Rights",
|
||||
"item-1": "<strong>Ownership</strong>: You retain all rights to the User Content you enter into or upload to the Application.",
|
||||
"item-2": "<strong>License to Provide the Service</strong>: You grant us a non-exclusive, time-limited (for the duration of your use of the Service), royalty-free license—transferable only to our processors/subcontractors—to use, process, store, back up, and display your User Content solely to provide, maintain, and improve the Service.",
|
||||
"item-3": "<strong>Your Responsibility</strong>: You are responsible for the legality, accuracy, and rights associated with your User Content (e.g., you have the right to upload documents).",
|
||||
"item-4": "<strong>Prohibited Content</strong>: You must not upload content that violates applicable laws or third-party rights."
|
||||
},
|
||||
"section-6": {
|
||||
"heading": "6. Privacy, Cookies, and Data Protection",
|
||||
"paragraph-1": "Personal data processing is governed by our <strong>Privacy Policy</strong> (the \"Privacy Policy\"), which forms an integral part of these Terms.",
|
||||
"paragraph-2": "The Application is hosted on infrastructure located within the European Union. Data is processed and stored in the EU unless explicitly stated otherwise in the Privacy Policy.",
|
||||
"paragraph-3": "To measure usage and improve the Service, we use <strong>self-hosted web analytics</strong> (on our own server) for aggregated analytics (e.g., traffic, page views, session duration). We do not use analytics for advertising purposes or to build marketing profiles of users.",
|
||||
"paragraph-4": "The Application may use cookies and/or similar technologies necessary for functionality (e.g., login/session and security). Analytics cookies, if used, are described in the Privacy Policy (including purpose, duration, and options for managing settings).",
|
||||
"paragraph-5": "If you upload documents containing personal data of third parties, you are responsible for ensuring a lawful basis for such processing and for providing any required notices to those individuals, where applicable."
|
||||
},
|
||||
"section-7": {
|
||||
"heading": "7. 2D Barcodes and Information Accuracy",
|
||||
"paragraph-1": "The Application may generate or display 2D barcodes (e.g., for payment). Such content may be created based on information you provide and/or derived from documents you upload.",
|
||||
"paragraph-2": "<strong>You are responsible</strong> for verifying the accuracy, completeness, and relevance of information in 2D barcodes before using them, including before initiating transactions or payments.",
|
||||
"paragraph-3": "We do not guarantee that all barcodes will be accepted by all banking applications or payment systems, nor that the content will always match the format expected by a third party."
|
||||
},
|
||||
"section-8": {
|
||||
"heading": "8. Acceptable Use and Prohibited Conduct",
|
||||
"intro": "You agree not to use the Application in any way that:",
|
||||
"item-1": "violates any law, regulation, or third-party rights;",
|
||||
"item-2": "is harmful, fraudulent, deceptive, threatening, harassing, defamatory, obscene, or otherwise inappropriate;",
|
||||
"item-3": "attempts unauthorized access to systems, accounts, or other users' data;",
|
||||
"item-4": "introduces malicious code (viruses, malware), performs automated data extraction (scraping) without authorization, or interferes with the Application's operation;",
|
||||
"item-5": "bypasses security measures or access restrictions;",
|
||||
"item-6": "uses the Application to provide services to third parties in a manner not intended by the Service (e.g., resale) without our prior written consent."
|
||||
},
|
||||
"section-9": {
|
||||
"heading": "9. Fees and Subscriptions (if applicable)",
|
||||
"paragraph-1": "The basic version of the Application may be free, and certain features may be available for a fee (\"Paid Features\"). Pricing, duration, and billing terms will be displayed before you activate Paid Features.",
|
||||
"paragraph-2": "Where applicable, subscriptions may automatically renew until you cancel, in accordance with the terms presented at purchase and applicable consumer protection laws."
|
||||
},
|
||||
"section-10": {
|
||||
"heading": "10. Third-Party Services and Integrations",
|
||||
"item-1": "<strong>Google OAuth</strong>: Login and authentication rely on Google's services. We are not responsible for the availability or security of Google services, and Google's terms and policies apply.",
|
||||
"item-2": "<strong>Hosting</strong>: We host the Service on infrastructure within the European Union. We may use infrastructure and technical service providers (\"Processors\") solely for hosting, maintenance, and security, as described in the Privacy Policy.",
|
||||
"item-3": "<strong>Analytics</strong>: We use self-hosted web analytics (our own server). Analytics data is used solely to improve the Service, as described in the Privacy Policy.",
|
||||
"item-4": "<strong>Links</strong>: The Application may contain links to third-party websites. We do not control and are not responsible for their content."
|
||||
},
|
||||
"section-11": {
|
||||
"heading": "11. Availability, Maintenance, and Backups",
|
||||
"paragraph-1": "We strive to keep the Application available, but we do not guarantee uninterrupted, timely, secure, or error-free operation. We may perform maintenance, upgrades, or emergency work from time to time.",
|
||||
"paragraph-2": "We may create backups for business continuity. Backups are stored within the EU unless explicitly stated otherwise in the Privacy Policy.",
|
||||
"paragraph-3": "We will implement reasonable technical and organizational safeguards, but no system is 100% secure. By using the Application, you accept this risk.",
|
||||
"paragraph-4": "We recommend that users keep their own copies of important documents as needed."
|
||||
},
|
||||
"section-12": {
|
||||
"heading": "12. Intellectual Property",
|
||||
"paragraph-1": "The Application, including its design, code, databases, visual identity, and texts (excluding User Content), is protected by copyright and/or other intellectual property rights and belongs to us or our licensors.",
|
||||
"paragraph-2": "You do not acquire any ownership rights in the Application. Copying, decompiling, reverse engineering, or distributing the Application is prohibited unless expressly permitted by law."
|
||||
},
|
||||
"section-13": {
|
||||
"heading": "13. Termination, Account Deletion, and Data Retention",
|
||||
"paragraph-1": "You may stop using the Application at any time. To delete your Account or data, use the available options in the Application (if any) or contact us at <emailLink>support@rezije.app</emailLink>.",
|
||||
"paragraph-2": "We may suspend or terminate access to the Application without prior notice if we reasonably suspect a breach of these Terms, abuse, or if necessary for security or legal compliance.",
|
||||
"paragraph-3": "After Account deletion, User Content may be deleted or anonymized within a reasonable time, unless we are required to retain certain data for legal compliance, dispute resolution, or enforcement of these Terms (as further described in the Privacy Policy)."
|
||||
},
|
||||
"section-14": {
|
||||
"heading": "14. Disclaimer of Warranties",
|
||||
"paragraph-1": "The Application is provided \"AS IS\" and \"AS AVAILABLE\". To the maximum extent permitted by law, we disclaim all warranties of any kind, whether express or implied, including implied warranties of merchantability, fitness for a particular purpose, and non-infringement.",
|
||||
"paragraph-2": "We do not warrant that the Application will meet your requirements, be compatible with all devices or integrations, or that any data (including 2D barcodes) will be accurate or error-free."
|
||||
},
|
||||
"section-15": {
|
||||
"heading": "15. Limitation of Liability",
|
||||
"paragraph-1": "To the maximum extent permitted by law, we will not be liable for any indirect, incidental, special, consequential, or punitive damages, or any loss of profits, revenue, data, use, goodwill, or other intangible losses, arising out of or related to your use of, or inability to use, the Application.",
|
||||
"paragraph-2": "The limitations in this section do not apply to liability that cannot be excluded or limited under applicable law (e.g., willful misconduct or gross negligence, and other mandatory consumer rights under applicable law).",
|
||||
"paragraph-3": "In particular, we are not liable for damages resulting from the use of information in 2D barcodes if the user did not verify its accuracy before the transaction, nor for actions of third parties (banks, payment apps, bill issuers)."
|
||||
},
|
||||
"section-16": {
|
||||
"heading": "16. Indemnification",
|
||||
"content": "To the extent permitted by law, you agree to indemnify and hold us harmless from any claims, damages, liabilities, losses, and expenses (including reasonable attorneys' fees) arising out of your breach of these Terms, misuse of the Application, or violation of third-party rights through your User Content."
|
||||
},
|
||||
"section-17": {
|
||||
"heading": "17. Force Majeure",
|
||||
"content": "We will not be liable for any delay or failure to perform resulting from causes beyond our reasonable control (e.g., network failures, third-party service outages, natural disasters, war, strikes, epidemics, or actions of governmental authorities)."
|
||||
},
|
||||
"section-18": {
|
||||
"heading": "18. Governing Law and Dispute Resolution",
|
||||
"paragraph-1": "These Terms are governed by and construed in accordance with the laws of the Republic of Croatia, without regard to conflict of law provisions.",
|
||||
"paragraph-2": "If you are a consumer, nothing in these Terms affects your mandatory rights under applicable consumer protection laws.",
|
||||
"paragraph-3": "The parties will try to resolve disputes amicably. If an amicable resolution is not possible, the competent court in {{PLACE_OF_JURISDICTION}} shall have jurisdiction."
|
||||
},
|
||||
"section-19": {
|
||||
"heading": "19. Changes to the Terms",
|
||||
"content": "We reserve the right to modify or replace these Terms at any time. If changes are material, we will use reasonable efforts to provide at least 10 days' prior notice before they take effect. By continuing to use the Application after the effective date of the updated Terms, you agree to the revised Terms."
|
||||
},
|
||||
"section-20": {
|
||||
"heading": "20. Severability and Assignment",
|
||||
"item-1": "<strong>Severability</strong>: If any provision of these Terms is held invalid or unenforceable, the remaining provisions will remain in full force and effect.",
|
||||
"item-2": "<strong>Assignment</strong>: We may assign our rights and obligations under these Terms to a third party (e.g., in connection with a reorganization or sale), subject to applicable law. You may not assign your rights or obligations without our prior written consent."
|
||||
},
|
||||
"section-21": {
|
||||
"heading": "21. Entire Agreement",
|
||||
"content": "These Terms (together with the Privacy Policy) constitute the entire agreement between you and us regarding your use of the Application and supersede all prior or contemporaneous understandings, whether written or oral, relating to the subject matter of these Terms."
|
||||
},
|
||||
"section-22": {
|
||||
"heading": "22. Contact",
|
||||
"content": "If you have any questions about these Terms, please contact us at <emailLink>support@rezije.app</emailLink>."
|
||||
}
|
||||
},
|
||||
"privacy-policy-page": {
|
||||
"title": "Privacy Policy for the Utility Bill Tracking Web App",
|
||||
"meta": {
|
||||
"effective-date": "{{EFFECTIVE_DATE}}",
|
||||
"last-updated": "{{LAST_UPDATED_DATE}}",
|
||||
"controller": {
|
||||
"name": "rezije.app",
|
||||
"address": "{{ADDRESS}}",
|
||||
"contact-email": "support@rezije.app"
|
||||
},
|
||||
"data-hosting": "EU",
|
||||
"analytics": "Self-hosted web analytics (cookie-less)",
|
||||
"backup-retention-days": 7,
|
||||
"processors": "No additional processors other than the EU infrastructure/hosting provider."
|
||||
},
|
||||
|
||||
"section-1": {
|
||||
"heading": "1. Introduction",
|
||||
"content": "This Privacy Policy (\"Policy\") explains how rezije.app (\"we\", \"us\", \"our\") collects, uses, and protects personal data in connection with the use of the utility bill tracking web application (the \"Application\"). This Policy applies to personal data of users of the Application."
|
||||
},
|
||||
|
||||
"section-2": {
|
||||
"heading": "2. Data Controller and Contact",
|
||||
"paragraph-1": "The data controller for personal data processed in connection with the Application is rezije.app. The Application is published and maintained by a private individual (not a company).",
|
||||
"paragraph-2": "For privacy-related questions and to exercise your rights, you can contact us at <emailLink>support@rezije.app</emailLink>."
|
||||
},
|
||||
|
||||
"section-3": {
|
||||
"heading": "3. Personal Data We Collect",
|
||||
"intro": "We may collect the following categories of data:",
|
||||
"item-1": "<strong>Account data (Google OAuth)</strong>: your email address and the identifier (OAuth ID) assigned by Google, and other basic data necessary for authentication and account management.",
|
||||
"item-2": "<strong>Data you enter in the Application</strong>: billing locations, account names, amounts, dates, notes, and any other data you voluntarily enter.",
|
||||
"item-3": "<strong>Uploaded documents</strong>: documents and files you upload (e.g., bills, PDFs, photos). Such documents may contain personal data (yours or third parties'), depending on their content.",
|
||||
"item-4": "<strong>Technical data and logs</strong>: basic technical data required for operation and security (e.g., login logs, error logs, and security event logs).",
|
||||
"item-5": "<strong>Aggregated analytics data (cookie-less)</strong>: aggregated usage data (e.g., visit counts, page views, session duration) collected via self-hosted web analytics that does not use cookies."
|
||||
},
|
||||
|
||||
"section-4": {
|
||||
"heading": "4. How We Use Your Data and Legal Bases",
|
||||
"intro": "We process personal data only when we have a lawful basis, for the following purposes:",
|
||||
"item-1": "<strong>Providing and maintaining the Service</strong> (performance of a contract / steps prior to entering into a contract): enabling login, providing Application features, storing and displaying your data.",
|
||||
"item-2": "<strong>Security and abuse prevention</strong> (legitimate interests): protecting the Application, detecting and preventing fraud, incidents, and unauthorized access.",
|
||||
"item-3": "<strong>Improving the Application</strong> (legitimate interests): analyzing aggregated usage to improve performance and user experience.",
|
||||
"item-4": "<strong>User communications</strong> (legitimate interests and/or performance of a contract): sending account-related communications, security notices, and important updates about the Application or this Policy.",
|
||||
"item-5": "<strong>Legal obligations</strong> (legal obligation): retaining and disclosing data where necessary to comply with applicable law or lawful requests by authorities."
|
||||
},
|
||||
|
||||
"section-5": {
|
||||
"heading": "5. Cookies and Similar Technologies",
|
||||
"paragraph-1": "The Application uses cookies and/or similar technologies that are necessary for functionality (e.g., authentication/session and security).",
|
||||
"paragraph-2": "For analytics, we use <strong>cookie-less</strong>, self-hosted web analytics. We do not use analytics for advertising purposes or to build marketing profiles of users."
|
||||
},
|
||||
|
||||
"section-6": {
|
||||
"heading": "6. Hosting and Processing Location (EU)",
|
||||
"content": "The Application is hosted on infrastructure located within the European Union. Data is processed and stored in the EU."
|
||||
},
|
||||
|
||||
"section-7": {
|
||||
"heading": "7. Data Sharing and Recipients",
|
||||
"intro": "We do not sell your personal data. We may share data only in the following cases:",
|
||||
"item-1": "<strong>EU infrastructure/hosting provider</strong>: we use an infrastructure/hosting provider to operate, keep available, and secure the Application. That provider may have technical access to data only to the extent necessary to deliver the service and under confidentiality obligations.",
|
||||
"item-2": "<strong>Authentication</strong>: login via Google OAuth involves exchanging data necessary for authentication with Google, in accordance with Google’s policies.",
|
||||
"item-3": "<strong>Legal requirements</strong>: where necessary to comply with law, a court order, or a lawful request by authorities, or to protect our rights and the safety of users."
|
||||
},
|
||||
|
||||
"section-8": {
|
||||
"heading": "8. Transfers Outside the EU/EEA",
|
||||
"content": "As a rule, we do not transfer personal data outside the EU/EEA as part of operating the Application. However, certain processing related to Google OAuth is performed in accordance with Google’s policies and may involve transfers outside the EU/EEA. In such cases, Google’s safeguards and rules apply."
|
||||
},
|
||||
|
||||
"section-9": {
|
||||
"heading": "9. Security",
|
||||
"content": "We implement reasonable technical and organizational measures to protect personal data against unauthorized access, loss, misuse, and disclosure. However, no method of transmission or storage is completely secure, and we cannot guarantee absolute security."
|
||||
},
|
||||
|
||||
"section-10": {
|
||||
"heading": "10. Data Retention",
|
||||
"intro": "We retain data only as long as necessary for the purposes for which it was collected:",
|
||||
"item-1": "<strong>Account data</strong>: while your account is active and until the account is deleted, unless retention is required to comply with legal obligations or resolve disputes.",
|
||||
"item-2": "<strong>Data you enter and uploaded documents</strong>: until you delete them or until the account is deleted, with a reasonable period for technical removal from active systems.",
|
||||
"item-3": "<strong>Technical logs</strong>: retained for a limited time for security and diagnostics and then deleted or anonymized, unless longer retention is needed to investigate an incident or comply with legal obligations.",
|
||||
"item-4": "<strong>Backups</strong>: backups are retained for up to 7 days and then automatically overwritten or deleted. Due to the nature of backups, deleted data may remain in backups until the retention period expires."
|
||||
},
|
||||
|
||||
"section-11": {
|
||||
"heading": "11. Your Rights (GDPR)",
|
||||
"intro": "Depending on applicable law, you may have the following rights:",
|
||||
"item-1": "<strong>Right of access</strong>: request confirmation whether we process your data and obtain a copy.",
|
||||
"item-2": "<strong>Right to rectification</strong>: request correction of inaccurate data or completion of incomplete data.",
|
||||
"item-3": "<strong>Right to erasure</strong> (\"right to be forgotten\"): request deletion of your data where the conditions are met.",
|
||||
"item-4": "<strong>Right to restriction</strong>: request restriction of processing in certain cases.",
|
||||
"item-5": "<strong>Right to data portability</strong>: request your data in a structured, commonly used, machine-readable format, where applicable.",
|
||||
"item-6": "<strong>Right to object</strong>: object to processing based on legitimate interests, including analytics, where applicable.",
|
||||
"item-7": "<strong>Right to withdraw consent</strong>: if processing is based on consent, you may withdraw it at any time (withdrawal does not affect the lawfulness of processing before withdrawal)."
|
||||
},
|
||||
|
||||
"section-12": {
|
||||
"heading": "12. How to Exercise Your Rights",
|
||||
"content": "To exercise your rights, contact us at <emailLink>support@rezije.app</emailLink>. To protect personal data, we may request additional information to verify your identity before responding to your request."
|
||||
},
|
||||
|
||||
"section-13": {
|
||||
"heading": "13. Right to Lodge a Complaint",
|
||||
"content": "If you believe that the processing of your personal data violates applicable law, you have the right to lodge a complaint with a supervisory authority. In the Republic of Croatia, the supervisory authority is the Croatian Personal Data Protection Agency (AZOP)."
|
||||
},
|
||||
|
||||
"section-14": {
|
||||
"heading": "14. Children’s Privacy",
|
||||
"content": "The Application is not intended for persons under 18 years of age, and we do not knowingly collect personal data from children. If you become aware that a child has provided us with personal data, please contact us so we can take appropriate measures."
|
||||
},
|
||||
|
||||
"section-15": {
|
||||
"heading": "15. Changes to This Policy",
|
||||
"content": "We may update this Policy from time to time to reflect changes in our practices or to comply with law. If we make material changes, we will notify you via a notice in the Application and/or by email (sent to the address associated with your account) before the changes take effect."
|
||||
},
|
||||
|
||||
"section-16": {
|
||||
"heading": "16. Contact",
|
||||
"content": "If you have any questions about this Privacy Policy, please contact us at <emailLink>support@rezije.app</emailLink>."
|
||||
}
|
||||
}
|
||||
}
|
||||
298
messages/hr.json
298
messages/hr.json
@@ -18,38 +18,29 @@
|
||||
},
|
||||
"login-page": {
|
||||
"main-card": {
|
||||
"title-1": "Koji računi su stigli?",
|
||||
"title-2": "Koji su plaćeni?",
|
||||
"title-3": "Koliki su mi troškovi?",
|
||||
"text-1": "To su pitanja na koja će ti ova jednostavna aplikacija odgovoriti ...",
|
||||
"text-2": "... isprobaj je i koristi potpuno besplatno!",
|
||||
"title": "Upravljanje režijama<indigo> za najmodavce</indigo>",
|
||||
"text": "<p>Svima koji imaju rentaju stan ili kuću, <strong>najdraži trenutak</strong> je kada podstanar plati najam. Vođenje režija međutim je <strong>mrzak posao</strong>.</p><p>Računi kapaju jedan po jedan, <strong>papiri se gomilaju</strong>, treba ih razvrstati, pratiti što je stiglo, što je plaćeno, a što nije...</p><p>Slijedi prikupljanje i <strong>slanje računa podstanaru</strong>, vođenje evidencije o tome je li platio ... dosadan posao koji <strong>traži preciznost</strong>.</p><p></p>",
|
||||
"go-to-app": "Uđi u Aplikaciju",
|
||||
"in-app-browser-warning": "<strong>UPOZORENJE!</strong><br></br>Detektirali smo da je web stranica otvorena u in-app pregledniku. To može dovesti do probleme u radu ove web aplikacije. <hint>Molimo otvori web aplikaciju u normalnom web pregledniku (rezije.app) 😉</hint>",
|
||||
"in-app-browser-warning": "<strong>UPOZORENJE!</strong> Detektirali smo da je web stranica otvorena u in-app pregledniku. To može dovesti do probleme u radu ove web aplikacije. <hint>Molimo otvori web aplikaciju u normalnom web pregledniku (rezije.app) 😉</hint>",
|
||||
"image-url": "/man-burried-under-paper.png",
|
||||
"image-alt": "Čovjek zatrpan papirima",
|
||||
"video-url": "/welcome-demo-vp9-25fps-1500bps.webm",
|
||||
"image-url": "/hero.png",
|
||||
"video-title": "Demo osnovnih koraka u aplikaciji"
|
||||
},
|
||||
"card-1": {
|
||||
"title": "Prijenos režija u idući mjesec",
|
||||
"text": "Sve tvoje nekretnine i pripadajuće režije se automatski prenose u idući mjesec, tako da ne moraš svaki mjesec ponovno unositi iste podatke.",
|
||||
"title": "Može li bolje?",
|
||||
"text": "<p>Imate sreće - <strong>režije.app</strong> je besplatna aplikacija je izrađen da <strong>rješava upravo navedene probleme</strong>!</p><p>Ova aplikacija će vam omogućiti laku i <strong>preglednu evidenciju dospjelih i plaćenih računa</strong>. Sve digitalno, efikasno i pedantno!</p><p>Uz to ovu aplikaciju nudi moogućnost <strong>automatskog slanja</strong> mjesečnog obračuna podstanarima, koji uključuje bar koda za brzo <strong>plaćanje najamnine i režija na vaš IBAN ili Revolute.</strong></p>",
|
||||
"video-url": "/kopiranje-mjeseca-demo.webm",
|
||||
"image-url": "/status-color-demo.png",
|
||||
"image-url": "/robot-sorting-papers.png",
|
||||
"image-alt": "Robot sortira papire",
|
||||
"video-title": "Demo kopiranja mjeseca"
|
||||
},
|
||||
"card-2": {
|
||||
"title": "Boja signalizira status",
|
||||
"text": "Jednim pogledom možete vidjeti koji računi su plaćeni, a koji nisu. U tome vam pomaže boja koja označava status računa.",
|
||||
"image-url": "/bar-code-demo.png",
|
||||
"image-alt": "Boje označavaju status računa"
|
||||
"title": "Što mi treba za početak?",
|
||||
"text": "<p>Dovoljan je samo <strong>Gmail račun za prijavu</strong> i možete odmah početi koristiti aplikaciju!</p><p>Ne morate popunjavati formulate za registraciju, ni potvrđivati svoju email adresu - <strong>sjedi i vozi, ključ u ruke!</strong></p>"
|
||||
},
|
||||
"card-3": {
|
||||
"title": "Prikaz bar koda za plaćanje",
|
||||
"text": "Ako priloženi dokument sadrži 2D barkod, on se automatski izvlači i prikazuje na stranici, tako da ga možete skenirati bez otvaranja PDF dokumenta.",
|
||||
"video-url": "/bar-code-demo.webm",
|
||||
"image-url": "/bar-code-demo.png",
|
||||
"video-title": "Demo osnovnih koraka u aplikaciji"
|
||||
},
|
||||
"sign-in-button": "Prijavi se pomoću"
|
||||
"sign-in-button": "Prijavi se pomoću",
|
||||
"disclaimer": "<disclaimer><bold>Napomena:</bold> činom prijave u ovu web aplikaciju prihvaćate <linkTermsOfService>Uvjete korištenja</linkTermsOfService> i <linkPrivacyPolicy>Pravila privatnosti</linkPrivacyPolicy>.</disclaimer>"
|
||||
},
|
||||
"home-page": {
|
||||
"add-location-button": {
|
||||
@@ -279,5 +270,268 @@
|
||||
"cancel-button": "Odustani",
|
||||
"back-to-home-button": "Povratak na početnu",
|
||||
"save-error-message": "Greška pri spremanju promjena"
|
||||
},
|
||||
"terms-of-service-page": {
|
||||
"title": "Uvjeti korištenja web aplikacije za evidenciju režija \"rezije.app\"",
|
||||
"meta": {
|
||||
"effective-date": "{{DATUM_STUPANJA_NA_SNAGU}}",
|
||||
"last-updated": "{{DATUM_ZADNJE_IZMJENE}}",
|
||||
"provider": {
|
||||
"name": "{{NAZIV_PRUZATELJA_USLUGE}}",
|
||||
"address": "{{ADRESA}}",
|
||||
"oib": "{{OIB}}",
|
||||
"email": "support@rezije.app"
|
||||
},
|
||||
"data-hosting": "EU",
|
||||
"analytics": "Self-hosted web analitika"
|
||||
},
|
||||
"section-1": {
|
||||
"heading": "1. Uvod",
|
||||
"content": "Ovi uvjeti korištenja (\"Uvjeti\") uređuju vaš pristup i korištenje web aplikacije za evidenciju režija (\"Aplikacija\"). Pružatelj usluge je \"rezije.app\" (\"mi\", \"nas\", \"naše\"). Pristupom ili korištenjem Aplikacije potvrđujete da ste pročitali, razumjeli i prihvaćate ove Uvjete. Ako se ne slažete s Uvjetima, nemojte koristiti Aplikaciju."
|
||||
},
|
||||
"section-2": {
|
||||
"heading": "2. Definicije",
|
||||
"item-1": "<strong>\"Korisnik\"</strong> znači svaka osoba koja pristupa ili koristi Aplikaciju.",
|
||||
"item-2": "<strong>\"Račun\"</strong> znači korisnički račun kreiran putem Google OAuth-a.",
|
||||
"item-3": "<strong>\"Korisnički sadržaj\"</strong> znači svi podaci koje unesete ili učitate u Aplikaciju (npr. lokacije naplate, nazivi računa, iznosi, datumi, dokumenti, fotografije, PDF-ovi).",
|
||||
"item-4": "<strong>\"Usluga\"</strong> znači funkcionalnosti Aplikacije, uključujući pohranu, prikaz i organizaciju podataka o režijama te generiranje/prikaz 2D barkodova."
|
||||
},
|
||||
"section-3": {
|
||||
"heading": "3. Prihvatljivost i registracija",
|
||||
"item-1": "<strong>Dob</strong>: Morate imati najmanje 18 godina ili biti punoljetni prema važećim propisima kako biste koristili Aplikaciju.",
|
||||
"item-2": "<strong>Registracija</strong>: Za pristup Aplikaciji potrebno je kreirati Račun putem Google OAuth-a. Nemamo kontrolu nad postupkom autentikacije Googlea.",
|
||||
"item-3": "<strong>Točnost podataka</strong>: Obvezujete se davati točne i ažurne podatke gdje je to primjenjivo.",
|
||||
"item-4": "<strong>Sigurnost računa</strong>: Odgovorni ste za sve aktivnosti provedene putem vašeg Računa. Obvezujete se odmah nas obavijestiti ako sumnjate na neovlašten pristup."
|
||||
},
|
||||
"section-4": {
|
||||
"heading": "4. Opseg usluge i namjena",
|
||||
"paragraph-1": "Aplikacija je alat za osobnu evidenciju i organizaciju podataka o režijama. Ne pružamo financijsko, porezno ili pravno savjetovanje, niti jamčimo da je Aplikacija prikladna za specifičnu svrhu korisnika.",
|
||||
"paragraph-2": "Možemo s vremenom dodavati, mijenjati ili uklanjati funkcionalnosti. Određene funkcionalnosti mogu biti eksperimentalne ili u beta fazi."
|
||||
},
|
||||
"section-5": {
|
||||
"heading": "5. Korisnički sadržaj i prava",
|
||||
"item-1": "<strong>Vlasništvo</strong>: Zadržavate sva prava na Korisnički sadržaj koji unosite ili učitate u Aplikaciju.",
|
||||
"item-2": "<strong>Licenca za pružanje usluge</strong>: Dajete nam neisključivu, vremenski ograničenu (na trajanje korištenja Usluge), prenosivu isključivo na naše izvršitelje obrade/podizvođače i bez naknade licencu za korištenje, obradu, pohranu, sigurnosno kopiranje i prikaz Korisničkog sadržaja isključivo radi pružanja, održavanja i unaprjeđenja Usluge.",
|
||||
"item-3": "<strong>Odgovornost za sadržaj</strong>: Vi ste odgovorni za zakonitost, točnost i prava vezana uz Korisnički sadržaj (npr. imate pravo učitati dokumente).",
|
||||
"item-4": "<strong>Zabrana nezakonitog sadržaja</strong>: Ne smijete učitavati sadržaj koji krši prava trećih osoba ili važeće propise."
|
||||
},
|
||||
"section-6": {
|
||||
"heading": "6. Privatnost, kolačići i zaštita podataka",
|
||||
"paragraph-1": "Obrada osobnih podataka provodi se u skladu s našim dokumentom <strong>Politika privatnosti</strong> (\"Politika privatnosti\"), koji je sastavni dio ovih Uvjeta.",
|
||||
"paragraph-2": "Aplikacija se hosta na infrastrukturi unutar Europske unije. Podaci se obrađuju i pohranjuju u EU, osim ako je u Politici privatnosti izričito navedeno drukčije.",
|
||||
"paragraph-3": "Za mjerenje korištenja i poboljšanje Usluge koristimo <strong>self-hosted web analitiku</strong> (na vlastitom poslužitelju) u svrhu agregirane analitike (npr. posjećenost, pregledane stranice, trajanje sesije) radi unaprjeđenja Usluge. Ne koristimo analitiku za oglašavanje niti za izradu profila korisnika u marketinške svrhe.",
|
||||
"paragraph-4": "Aplikacija može koristiti kolačiće i/ili slične tehnologije nužne za funkcionalnost (npr. prijava/sesija i sigurnost). Analitički kolačići, ako se koriste, opisani su u Politici privatnosti (uključujući svrhu, trajanje i opcije upravljanja postavkama).",
|
||||
"paragraph-5": "Ako učitavate dokumente koji sadrže osobne podatke trećih osoba, vi ste odgovorni osigurati zakonitu osnovu za takvu obradu i informiranje tih osoba, gdje je primjenjivo."
|
||||
},
|
||||
"section-7": {
|
||||
"heading": "7. 2D barkodovi i točnost informacija",
|
||||
"paragraph-1": "Aplikacija može generirati ili prikazivati 2D barkodove (npr. za plaćanje). Takav sadržaj može biti kreiran na temelju podataka koje korisnik unese i/ili izveden iz dokumenata koje korisnik učita.",
|
||||
"paragraph-2": "<strong>Vaša je odgovornost provjeriti</strong> točnost, potpunost i relevantnost informacija u 2D barkodovima prije korištenja, uključujući prije pokretanja transakcija ili plaćanja.",
|
||||
"paragraph-3": "Ne jamčimo da će svi barkodovi biti prihvaćeni od svih bankarskih aplikacija ili sustava plaćanja, niti da će sadržaj uvijek odgovarati formatu koji očekuje treća strana."
|
||||
},
|
||||
"section-8": {
|
||||
"heading": "8. Dopuštena uporaba i zabranjeno ponašanje",
|
||||
"intro": "Slažete se da nećete koristiti Aplikaciju na način koji:",
|
||||
"item-1": "krši bilo koji zakon, propis ili prava trećih osoba;",
|
||||
"item-2": "je štetan, prijevaran, obmanjujući, prijeteći, uznemirujući, klevetnički, opscen ili na drugi način neprimjeren;",
|
||||
"item-3": "pokušava neovlašteno pristupiti sustavima, računima ili podacima drugih korisnika;",
|
||||
"item-4": "uvodi zlonamjerni kod (virusi, malware), provodi automatizirano prikupljanje podataka (scraping) bez odobrenja ili ometa rad Aplikacije;",
|
||||
"item-5": "zaobilazi mjere sigurnosti ili ograničenja pristupa;",
|
||||
"item-6": "koristi Aplikaciju za pružanje usluga trećima na način koji nije predviđen Uslugom (npr. preprodaja) bez našeg pisanog odobrenja."
|
||||
},
|
||||
"section-9": {
|
||||
"heading": "9. Naknade i pretplate (ako je primjenjivo)",
|
||||
"paragraph-1": "Osnovna verzija Aplikacije može biti besplatna, a određene funkcionalnosti mogu biti dostupne uz naknadu (\"Plaćene značajke\"). Detalji cijena, trajanja i uvjeta naplate bit će prikazani prije aktivacije Plaćenih značajki.",
|
||||
"paragraph-2": "Ako se primjenjuje, pretplate se mogu automatski obnavljati dok ih ne otkažete, sukladno uvjetima prikazanim pri kupnji i važećim propisima o zaštiti potrošača."
|
||||
},
|
||||
"section-10": {
|
||||
"heading": "10. Treće strane i integracije",
|
||||
"item-1": "<strong>Google OAuth</strong>: Prijava i autentikacija ovise o uslugama Googlea. Ne odgovaramo za dostupnost ili sigurnost Google usluga, već se primjenjuju uvjeti i pravila Googlea.",
|
||||
"item-2": "<strong>Hosting</strong>: Uslugu hostamo na infrastrukturi unutar Europske unije. Možemo koristiti pružatelje infrastrukture i tehničkih usluga (\"Izvršitelji\") isključivo radi hostinga, održavanja i sigurnosti, sukladno Politici privatnosti.",
|
||||
"item-3": "<strong>Analitika</strong>: Za analitiku koristimo self-hosted web analitiku (vlastiti poslužitelj). Podaci analitike koriste se isključivo za poboljšanje Usluge, kako je opisano u Politici privatnosti.",
|
||||
"item-4": "<strong>Poveznice</strong>: Aplikacija može sadržavati poveznice na web-stranice trećih strana. Ne kontroliramo njihov sadržaj niti preuzimamo odgovornost za njih."
|
||||
},
|
||||
"section-11": {
|
||||
"heading": "11. Dostupnost, održavanje i sigurnosne kopije",
|
||||
"paragraph-1": "Nastojimo osigurati dostupnost Aplikacije, no ne jamčimo neprekidan, pravodoban ili bezgrešan rad. Povremeno možemo provoditi održavanje, nadogradnje ili hitne intervencije.",
|
||||
"paragraph-2": "Možemo izrađivati sigurnosne kopije podataka radi kontinuiteta poslovanja. Sigurnosne kopije pohranjuju se unutar EU, osim ako je u Politici privatnosti izričito navedeno drukčije.",
|
||||
"paragraph-3": "Poduzet ćemo razumne tehničke i organizacijske mjere zaštite, ali nijedan sustav nije 100% siguran. Korištenjem Aplikacije prihvaćate taj rizik.",
|
||||
"paragraph-4": "Preporučujemo da korisnici po potrebi zadrže vlastite kopije važnih dokumenata."
|
||||
},
|
||||
"section-12": {
|
||||
"heading": "12. Intelektualno vlasništvo",
|
||||
"paragraph-1": "Aplikacija, uključujući njezin dizajn, kod, baze podataka, vizualni identitet i tekstove (osim Korisničkog sadržaja), zaštićeni su autorskim i/ili drugim pravima intelektualnog vlasništva te pripadaju nama ili našim davateljima licence.",
|
||||
"paragraph-2": "Ne stječete nikakva prava vlasništva nad Aplikacijom. Zabranjeno je kopiranje, dekompilacija, obrnuti inženjering ili distribucija Aplikacije, osim ako je to izričito dopušteno zakonom."
|
||||
},
|
||||
"section-13": {
|
||||
"heading": "13. Raskid, brisanje računa i zadržavanje podataka",
|
||||
"paragraph-1": "Možete prestati koristiti Aplikaciju u bilo kojem trenutku. Za brisanje Računa ili podataka možete koristiti dostupne opcije u Aplikaciji (ako postoje) ili nas kontaktirati na <emailLink>support@rezije.app</emailLink>.",
|
||||
"paragraph-2": "Možemo suspendirati ili raskinuti pristup Aplikaciji bez prethodne obavijesti ako (razumno) posumnjamo na kršenje ovih Uvjeta ili zlouporabu, ili ako je to potrebno radi sigurnosti ili usklađenosti sa zakonom.",
|
||||
"paragraph-3": "Nakon brisanja Računa, Korisnički sadržaj može biti uklonjen ili anonimiziran u razumnom roku, osim ako smo obvezni zadržati određene podatke radi usklađenosti sa zakonom, rješavanja sporova ili provedbe Uvjeta (što se detaljnije uređuje Politikom privatnosti)."
|
||||
},
|
||||
"section-14": {
|
||||
"heading": "14. Odricanje od jamstava",
|
||||
"paragraph-1": "Aplikacija se pruža \"KAKVA JEST\" i \"KAKVA JE DOSTUPNA\". U najvećoj mjeri dopuštenoj zakonom, odričemo se svih jamstava, bilo izričitih ili implicitnih, uključujući implicitna jamstva trgovinske valjanosti, prikladnosti za određenu svrhu i nekršenja prava trećih osoba.",
|
||||
"paragraph-2": "Ne jamčimo da će Aplikacija zadovoljiti vaše zahtjeve, biti kompatibilna sa svim uređajima ili integracijama, niti da će svi podaci (uključujući 2D barkodove) biti točni ili bez grešaka."
|
||||
},
|
||||
"section-15": {
|
||||
"heading": "15. Ograničenje odgovornosti",
|
||||
"paragraph-1": "U najvećoj mjeri dopuštenoj zakonom, ne odgovaramo za bilo kakvu neizravnu, slučajnu, posebnu, posljedičnu ili kaznenu štetu, niti za gubitak dobiti, prihoda, podataka, korištenja, ugleda ili druge nematerijalne gubitke, koji proizlaze iz ili su povezani s korištenjem ili nemogućnošću korištenja Aplikacije.",
|
||||
"paragraph-2": "Ograničenja iz ove točke ne primjenjuju se na odgovornost koja se prema važećim propisima ne može isključiti ili ograničiti (npr. namjera ili gruba nepažnja, te druga obvezna prava potrošača prema mjerodavnom pravu).",
|
||||
"paragraph-3": "Posebno, ne odgovaramo za štete nastale korištenjem informacija u 2D barkodovima ako korisnik prije transakcije nije provjerio njihovu ispravnost, niti za postupke trećih strana (banke, platne aplikacije, izdavatelji računa)."
|
||||
},
|
||||
"section-16": {
|
||||
"heading": "16. Obeštećenje",
|
||||
"content": "Slažete se da ćete nas obeštetiti i zaštititi od svih potraživanja, šteta, obveza, gubitaka i troškova (uključujući razumne odvjetničke troškove) koji proizlaze iz vašeg kršenja ovih Uvjeta, zlouporabe Aplikacije ili povrede prava trećih osoba putem Korisničkog sadržaja, u mjeri dopuštenoj zakonom."
|
||||
},
|
||||
"section-17": {
|
||||
"heading": "17. Viša sila",
|
||||
"content": "Nećemo biti odgovorni za kašnjenja ili neispunjenje obveza uzrokovano okolnostima izvan naše razumne kontrole (npr. kvarovi mreže, prekidi usluga trećih strana, prirodne nepogode, rat, štrajkovi, epidemije, mjere nadležnih tijela)."
|
||||
},
|
||||
"section-18": {
|
||||
"heading": "18. Mjerodavno pravo i rješavanje sporova",
|
||||
"paragraph-1": "Ovi Uvjeti uređuju se i tumače u skladu sa zakonima Republike Hrvatske, neovisno o odredbama o sukobu zakona.",
|
||||
"paragraph-2": "Ako ste potrošač, ništa u ovim Uvjetima ne utječe na vaša obvezna prava prema propisima o zaštiti potrošača.",
|
||||
"paragraph-3": "Strane će sporove nastojati riješiti mirnim putem. Ako mirno rješenje nije moguće, nadležan je stvarno nadležni sud u {{MJESTO_NADLEZNOSTI}}."
|
||||
},
|
||||
"section-19": {
|
||||
"heading": "19. Izmjene Uvjeta",
|
||||
"content": "Zadržavamo pravo izmijeniti ili zamijeniti ove Uvjete u bilo kojem trenutku. Ako su izmjene materijalne, nastojat ćemo osigurati najmanje 10 dana prethodne obavijesti prije stupanja na snagu. Nastavkom korištenja Aplikacije nakon stupanja izmjena na snagu prihvaćate izmijenjene Uvjete."
|
||||
},
|
||||
"section-20": {
|
||||
"heading": "20. Razdvojivost i prijenos",
|
||||
"item-1": "<strong>Razdvojivost</strong>: Ako se bilo koja odredba ovih Uvjeta proglasi ništetnom ili neprovedivom, preostale odredbe ostaju na snazi.",
|
||||
"item-2": "<strong>Prijenos</strong>: Možemo prenijeti naša prava i obveze iz ovih Uvjeta na treću stranu (npr. u slučaju reorganizacije ili prodaje), uz poštovanje važećih propisa. Vi ne možete prenijeti svoja prava ili obveze bez našeg prethodnog pisanog odobrenja."
|
||||
},
|
||||
"section-21": {
|
||||
"heading": "21. Cjelokupni ugovor",
|
||||
"content": "Ovi Uvjeti (zajedno s Politikom privatnosti) čine cjelokupni ugovor između vas i nas u vezi s korištenjem Aplikacije te zamjenjuju sve prethodne dogovore ili razumijevanja, bilo usmena ili pisana, u vezi s predmetom ovih Uvjeta."
|
||||
},
|
||||
"section-22": {
|
||||
"heading": "22. Kontakt",
|
||||
"content": "Ako imate bilo kakvih pitanja o ovim Uvjetima, kontaktirajte nas na <emailLink>support@rezije.app</emailLink>."
|
||||
}
|
||||
},
|
||||
"privacy-policy-page": {
|
||||
"title": "Politika privatnosti za web aplikaciju za evidenciju režija",
|
||||
"meta": {
|
||||
"effective-date": "{{DATUM_STUPANJA_NA_SNAGU}}",
|
||||
"last-updated": "{{DATUM_ZADNJE_IZMJENE}}",
|
||||
"controller": {
|
||||
"name": "rezije.app",
|
||||
"address": "{{ADRESA}}",
|
||||
"contact-email": "support@rezije.app"
|
||||
},
|
||||
"data-hosting": "EU",
|
||||
"analytics": "Self-hosted web analitika (bez kolačića)",
|
||||
"backup-retention-days": 7,
|
||||
"processors": "Nema drugih procesora osim pružatelja infrastrukture/hostinga u EU."
|
||||
},
|
||||
|
||||
"section-1": {
|
||||
"heading": "1. Uvod",
|
||||
"content": "Ova Politika privatnosti (\"Politika\") objašnjava kako rezije.app (\"mi\", \"nas\", \"naše\") prikuplja, koristi i štiti osobne podatke u vezi s korištenjem web aplikacije za evidenciju režija (\"Aplikacija\"). Politika se primjenjuje na osobne podatke korisnika Aplikacije."
|
||||
},
|
||||
|
||||
"section-2": {
|
||||
"heading": "2. Voditelj obrade i kontakt",
|
||||
"paragraph-1": "Voditelj obrade osobnih podataka u vezi s Aplikacijom je rezije.app. Aplikaciju objavljuje i održava privatna osoba (ne kao trgovačko društvo).",
|
||||
"paragraph-2": "Za pitanja vezana uz privatnost i ostvarivanje prava možete nas kontaktirati na <emailLink>support@rezije.app</emailLink>."
|
||||
},
|
||||
|
||||
"section-3": {
|
||||
"heading": "3. Koje podatke prikupljamo",
|
||||
"intro": "Možemo prikupljati sljedeće kategorije podataka:",
|
||||
"item-1": "<strong>Podaci o računu (Google OAuth)</strong>: adresa e-pošte i identifikator (OAuth ID) koji Google dodjeljuje vašem računu, te osnovni podaci nužni za autentikaciju i upravljanje računom.",
|
||||
"item-2": "<strong>Podaci koje unosite u Aplikaciju</strong>: lokacije naplate, nazivi računa, iznosi, datumi, bilješke i drugi podaci koje dobrovoljno unesete.",
|
||||
"item-3": "<strong>Učitani dokumenti</strong>: dokumenti i datoteke koje učitate (npr. računi, PDF-ovi, fotografije). Takvi dokumenti mogu sadržavati osobne podatke (vaše ili trećih osoba), ovisno o sadržaju dokumenta.",
|
||||
"item-4": "<strong>Tehnički podaci i zapisi</strong>: osnovni tehnički podaci nužni za rad i sigurnost (npr. logovi o prijavi, greškama i sigurnosnim događajima).",
|
||||
"item-5": "<strong>Agregirani analitički podaci (bez kolačića)</strong>: podaci o korištenju Aplikacije u agregiranom obliku (npr. broj posjeta, pregledane stranice, trajanje sesije), prikupljeni putem self-hosted web analitike koja ne koristi kolačiće."
|
||||
},
|
||||
|
||||
"section-4": {
|
||||
"heading": "4. U koje svrhe i na temelju kojih pravnih osnova obrađujemo podatke",
|
||||
"intro": "Vaše osobne podatke obrađujemo samo kada imamo pravnu osnovu te u sljedeće svrhe:",
|
||||
"item-1": "<strong>Pružanje i održavanje usluge</strong> (izvršavanje ugovora / poduzimanje radnji na vaš zahtjev prije sklapanja ugovora): omogućavanje prijave, korištenja značajki Aplikacije, pohrana i prikaz vaših podataka.",
|
||||
"item-2": "<strong>Sigurnost i sprječavanje zlouporabe</strong> (legitimni interes): zaštita Aplikacije, otkrivanje i sprječavanje prijevara, incidenta i neovlaštenog pristupa.",
|
||||
"item-3": "<strong>Unaprjeđenje Aplikacije</strong> (legitimni interes): analiza korištenja u agregiranom obliku radi poboljšanja performansi i korisničkog iskustva.",
|
||||
"item-4": "<strong>Komunikacija s korisnicima</strong> (legitimni interes i/ili izvršavanje ugovora): slanje obavijesti vezanih uz račun, sigurnosnih obavijesti i važnih promjena vezanih uz Aplikaciju ili ovu Politiku.",
|
||||
"item-5": "<strong>Zakonske obveze</strong> (pravna obveza): zadržavanje i otkrivanje podataka kada je to nužno radi usklađenosti s važećim propisima ili zakonitim zahtjevima nadležnih tijela."
|
||||
},
|
||||
|
||||
"section-5": {
|
||||
"heading": "5. Kolačići i slične tehnologije",
|
||||
"paragraph-1": "Aplikacija koristi kolačiće i/ili slične tehnologije koje su nužne za funkcioniranje (npr. autentikacija/sesija i sigurnost).",
|
||||
"paragraph-2": "Za analitiku koristimo self-hosted web analitiku <strong>bez kolačića</strong>. Ne koristimo analitiku za oglašavanje niti za izradu marketinških profila korisnika."
|
||||
},
|
||||
|
||||
"section-6": {
|
||||
"heading": "6. Hosting i lokacija obrade (EU)",
|
||||
"content": "Aplikacija se hosta na infrastrukturi unutar Europske unije. Podaci se obrađuju i pohranjuju u EU."
|
||||
},
|
||||
|
||||
"section-7": {
|
||||
"heading": "7. Dijeljenje podataka i primatelji",
|
||||
"intro": "Ne prodajemo vaše osobne podatke. Vaše podatke možemo dijeliti samo u sljedećim slučajevima:",
|
||||
"item-1": "<strong>Pružatelj infrastrukture/hostinga (EU)</strong>: koristimo pružatelja infrastrukture/hostinga radi rada, dostupnosti i sigurnosti Aplikacije. Taj pružatelj može imati tehnički pristup podacima isključivo u mjeri potrebnoj za održavanje usluge i uz obvezu povjerljivosti.",
|
||||
"item-2": "<strong>Autentikacija</strong>: prijava putem Google OAuth-a uključuje razmjenu podataka potrebnih za autentikaciju s Googleom, sukladno Google pravilima.",
|
||||
"item-3": "<strong>Zakonski zahtjevi</strong>: kada je to potrebno radi poštivanja zakona, sudskog naloga ili zakonitog zahtjeva nadležnog tijela, ili radi zaštite naših prava i sigurnosti korisnika."
|
||||
},
|
||||
|
||||
"section-8": {
|
||||
"heading": "8. Prijenosi izvan EU/EEA",
|
||||
"content": "U pravilu ne prenosimo osobne podatke izvan EU/EEA u okviru rada Aplikacije. Ipak, određene obrade povezane s Google OAuth-om provode se u skladu s Googleovim pravilima i mogu uključivati prijenose izvan EU/EEA. U takvim slučajevima primjenjuju se zaštitne mjere i pravila Googlea."
|
||||
},
|
||||
|
||||
"section-9": {
|
||||
"heading": "9. Sigurnost",
|
||||
"content": "Primjenjujemo razumne tehničke i organizacijske mjere kako bismo zaštitili osobne podatke od neovlaštenog pristupa, gubitka, zlouporabe i otkrivanja. Ipak, nijedan sustav prijenosa ili pohrane nije potpuno siguran te ne možemo jamčiti apsolutnu sigurnost."
|
||||
},
|
||||
|
||||
"section-10": {
|
||||
"heading": "10. Zadržavanje podataka",
|
||||
"intro": "Podatke čuvamo samo onoliko dugo koliko je potrebno za svrhe za koje su prikupljeni:",
|
||||
"item-1": "<strong>Podaci o računu</strong>: dok je vaš račun aktivan, odnosno do brisanja računa, osim ako je zadržavanje nužno radi zakonskih obveza ili rješavanja sporova.",
|
||||
"item-2": "<strong>Podaci koje unosite i učitani dokumenti</strong>: dok ih ne obrišete vi ili dok ne obrišemo račun, uz razuman rok za tehničko uklanjanje iz aktivnih sustava.",
|
||||
"item-3": "<strong>Tehnički logovi</strong>: čuvaju se ograničeno vrijeme radi sigurnosti i dijagnostike te se potom brišu ili anonimiziraju, osim ako je potrebno dulje čuvanje radi istrage incidenta ili zakonskih obveza.",
|
||||
"item-4": "<strong>Sigurnosne kopije</strong>: sigurnosne kopije čuvaju se do 7 dana, nakon čega se automatski prepisuju ili brišu. Zbog prirode sigurnosnih kopija moguće je da se obrisani podaci privremeno zadrže unutar kopija do isteka navedenog roka."
|
||||
},
|
||||
|
||||
"section-11": {
|
||||
"heading": "11. Vaša prava (GDPR)",
|
||||
"intro": "Ovisno o primjenjivim propisima, možete ostvariti sljedeća prava:",
|
||||
"item-1": "<strong>Pravo na pristup</strong>: zatražiti potvrdu obrađujemo li vaše podatke i dobiti kopiju podataka.",
|
||||
"item-2": "<strong>Pravo na ispravak</strong>: zatražiti ispravak netočnih ili dopunu nepotpunih podataka.",
|
||||
"item-3": "<strong>Pravo na brisanje</strong> (\"pravo na zaborav\"): zatražiti brisanje podataka kada su ispunjeni uvjeti.",
|
||||
"item-4": "<strong>Pravo na ograničenje obrade</strong>: zatražiti ograničenje obrade u određenim slučajevima.",
|
||||
"item-5": "<strong>Pravo na prenosivost</strong>: zatražiti prijenos podataka u strukturiranom, uobičajeno korištenom i strojno čitljivom formatu, kada je primjenjivo.",
|
||||
"item-6": "<strong>Pravo na prigovor</strong>: uložiti prigovor obradi koja se temelji na legitimnom interesu, uključujući analitiku, kada je primjenjivo.",
|
||||
"item-7": "<strong>Pravo na povlačenje privole</strong>: ako se obrada temelji na privoli, možete je povući u bilo kojem trenutku (povlačenje ne utječe na zakonitost obrade prije povlačenja)."
|
||||
},
|
||||
|
||||
"section-12": {
|
||||
"heading": "12. Kako ostvariti prava",
|
||||
"content": "Za ostvarivanje prava kontaktirajte nas na <emailLink>support@rezije.app</emailLink>. Radi zaštite podataka možemo zatražiti dodatne informacije za potvrdu identiteta prije postupanja po zahtjevu."
|
||||
},
|
||||
|
||||
"section-13": {
|
||||
"heading": "13. Pravo na pritužbu nadzornom tijelu",
|
||||
"content": "Ako smatrate da obrada vaših osobnih podataka krši važeće propise, imate pravo podnijeti pritužbu nadzornom tijelu. U Republici Hrvatskoj nadzorno tijelo je Agencija za zaštitu osobnih podataka (AZOP)."
|
||||
},
|
||||
|
||||
"section-14": {
|
||||
"heading": "14. Privatnost djece",
|
||||
"content": "Aplikacija nije namijenjena osobama mlađima od 18 godina i ne prikupljamo svjesno osobne podatke djece. Ako saznate da su nam dostavljeni osobni podaci djeteta, kontaktirajte nas kako bismo poduzeli odgovarajuće mjere."
|
||||
},
|
||||
|
||||
"section-15": {
|
||||
"heading": "15. Izmjene ove Politike",
|
||||
"content": "Ovu Politiku možemo povremeno ažurirati kako bismo odražavali promjene u našim praksama ili radi usklađivanja sa zakonom. Ako napravimo materijalne promjene, obavijestit ćemo vas putem obavijesti u Aplikaciji i/ili putem e-pošte (poslane na adresu povezanu s vašim računom) prije nego što promjene stupe na snagu."
|
||||
},
|
||||
|
||||
"section-16": {
|
||||
"heading": "16. Kontakt",
|
||||
"content": "Ako imate bilo kakvih pitanja o ovoj Politici privatnosti, kontaktirajte nas na <emailLink>support@rezije.app</emailLink>."
|
||||
}
|
||||
}
|
||||
}
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "evidencija-rezija",
|
||||
"version": "2.19.0",
|
||||
"version": "2.20.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"version": "2.19.0",
|
||||
"version": "2.20.0",
|
||||
"dependencies": {
|
||||
"@emotion/react": "^11.14.0",
|
||||
"@emotion/styled": "^11.14.1",
|
||||
|
||||
@@ -58,5 +58,5 @@
|
||||
"engines": {
|
||||
"node": ">=18.17.0"
|
||||
},
|
||||
"version": "2.19.0"
|
||||
"version": "2.20.0"
|
||||
}
|
||||
|
||||
BIN
public/man-burried-under-paper.png
Normal file
BIN
public/man-burried-under-paper.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
BIN
public/robot-sorting-papers.png
Normal file
BIN
public/robot-sorting-papers.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 786 KiB |
Reference in New Issue
Block a user