From ec82f515817413799d602ffc45e50ef9bf8931a8 Mon Sep 17 00:00:00 2001 From: Cybervoid Date: Thu, 14 Aug 2025 02:36:22 +0200 Subject: [PATCH 1/3] feat: Foundation page - Adjusted header typography styles in globals.css for improved responsiveness. - Consolidated utility imports in page.tsx for better organization. - Enhanced HeadingImage component with a link to the Foundation route for improved navigation. - Updated menu data to include new Foundation and Donators routes for better structure and accessibility. - Added new routes in routes-front.ts for Foundation and Donators, ensuring consistent navigation across the application. --- app/foundation/donators/page.tsx | 3 + app/foundation/page.tsx | 231 +++++++++++++++++++++ app/globals.css | 4 +- app/history/page.tsx | 3 +- components/heading-image/heading-image.tsx | 10 +- constants/menudata.ts | 34 ++- constants/routes-front.ts | 2 + 7 files changed, 269 insertions(+), 18 deletions(-) create mode 100644 app/foundation/donators/page.tsx create mode 100644 app/foundation/page.tsx diff --git a/app/foundation/donators/page.tsx b/app/foundation/donators/page.tsx new file mode 100644 index 00000000..4d5a9b50 --- /dev/null +++ b/app/foundation/donators/page.tsx @@ -0,0 +1,3 @@ +export default function Donators() { + return

Donators

+} diff --git a/app/foundation/page.tsx b/app/foundation/page.tsx new file mode 100644 index 00000000..793d479f --- /dev/null +++ b/app/foundation/page.tsx @@ -0,0 +1,231 @@ +import Image from 'next/image' +import Link from 'next/link' +import { cn } from '@/utils' +import { Separator } from '@/components/ui' +import { FrontRoutes } from '@/constants' + +const paragraphSx = 'mb-4 indent-8 text-left' +const sectionSx = 'mt-10' +const header3Sx = 'mb-5 mt-10' +const listSx = cn( + 'mb-1 ml-12 space-y-2 -indent-6', //layout + "[&>li]:before:mr-2 [&>li]:before:content-['—']", // dash-bullets + '[&>li]:after:content-[";"] [&>li]:last-of-type:after:content-["."]', // colons and full stop +) +const linkSx = 'decoration-muted-foreground hover:decoration-foreground underline' + +export default function Foundation() { + return ( + <> +
+

The Art of Weather Instruments Foundation

+

+ Preserving the Beauty and Function of Historical Weather Instruments +

+
+ +
+

Mission

+ Art of Weather Instruments Foundation +

+ The mission of the foundation is to preserve and expand the distinguished collection of + historical meteorological instruments assembled with dedication and expertise by its + founder, Leo Shirokov, in doing so fostering, promoting, and safeguarding the traditions + of decorative, applied, and artisanal arts, with a particular emphasis on Europe's + cultural and scientific heritage, and encouraging international collaboration and the + exchange of knowledge. +

+

The foundation seeks to achieve its objectives through:

+ +

+ Particular attention is given to the scholarly quality, public accessibility, and cultural + relevance of the foundation's activities. +

+
+
+

Message from the Founder

+

+ 'My journey into the world of antique barometers and other meteorological artifacts began + as a deeply personal quest — a way to connect with the beauty, ingenuity, and spirit of + past centuries. What started as a personal passion has grown into a cultural mission. I + founded The Art of Weather Instruments Foundation and developed it into a + cultural project dedicated to preserving and expanding this unique heritage, making it + accessible to collectors, researchers, designers, students, and the wider public.' +

+

+ 'This is not merely a private collection, but a living encyclopedia of the history of + science and aesthetics. These instruments are more than scientific tools — they are + tangible connections to the ingenuity, craftsmanship, and artistry of past centuries. By + investing your attention, time, or resources, you help ensure that this legacy is + documented, accessible, and alive, continuing to inspire future generations around the + world.' +

+

+ 'It is not simply a “display” — it is a comprehensive platform that connects people with + history through real, physical objects. In a world where the digital often displaces the + tangible, my project offers access to things that can be seen, understood, and experienced + as part of our material culture. It preserves the traditions of craftsmanship and design, + and in doing so, works not only to safeguard the past but also to inspire the future — for + artisans, artists, engineers, historians, and all who value the meeting of science and + beauty.' +

+

Leo Shirokov

+ +
+

Founding Board

+
+
+ Leo Shirokov +

Leo Shirokov — Chair & Co-Founder

+
+
+ Alex Shenshin +

+ Alex Shenshin — Treasurer/Secretary & Co-Founder +

+
+
+
+
+

Policy Plan

+ Culture code +

+ The Art of Weather Instruments Foundation is an independent, non-profit organization + dedicated to the preservation, study, and promotion of historical meteorological + instruments as part of Europe's cultural and scientific heritage. +

+

+ The Foundation's mission is to provide access to a collection of exceptional artistic + and historical value, comprising meteorological measuring instruments from various + periods, along with associated documents, contextual data, and accumulated expertise. + This access is intended for the general public, researchers, collectors, and museum + institutions — both in physical and digital form. +

+

Strategy

+

The Foundation aims to:

+
    +
  • + Ensure the safeguarding and long-term conservation of meteorological instruments and + related documents as carriers of scientific, artisanal, and cultural history +
  • +
  • + Research the provenance, dating, stylistic, and technical characteristics of the + collection's objects, including attribution and provenance documentation +
  • +
  • + Carry out professional cataloguing and systematic classification of the collection + according to museum standards +
  • +
  • + Provide digital access to the collection via the website{' '} + + www.barometers.info + + , including imagery and descriptions +
  • +
  • + Collaborate with museums, archives, private collectors, scientific institutions, + restorers, and cultural heritage funds +
  • +
  • + Foster public interest in meteorology as a visual, historical, and educational + phenomenon +
  • +
  • + Develop publications — catalogues, scholarly and popular science articles, books, and + studies on the collection and its broader context +
  • +
  • + Explore the possibility of establishing, in the future, an independent museum or + permanent exhibition space dedicated to meteorological instruments, with the aim of + engaging the public with the history of science, technology, and aesthetics in an + accessible and inspiring manner +
  • +
+

Activity plan

+

Over the next three years, the Foundation intends to:

+
    +
  • + Further expand the collection with objects of high historical value, rarity, or + uniqueness — including prototypes, signature works by renowned makers, and + under-documented types of instruments +
  • +
  • + Undertake restoration of instruments when necessary, in cooperation with qualified + professionals and in accordance with ethical heritage preservation guidelines +
  • +
  • + Develop and integrate a digital collection management database into the public website +
  • +
  • + Compile provenance dossiers and connect objects with their makers, owners, and + historical contexts +
  • +
  • + Organize temporary and online exhibitions in cooperation with other institutions +
  • +
  • Prepare, edit, and publish knowledge-based materials on the collection
  • +
  • + Inventory historical literature and archives, embedding them into the broader + knowledge framework of instrument production and distribution +
  • +
  • + Invite external experts and authors to contribute to research and public engagement +
  • +
  • + Participate in grant programs, strengthen international networks, and represent the + Foundation at relevant scientific and cultural forums +
  • +
+
+
+ + ) +} diff --git a/app/globals.css b/app/globals.css index 3297c274..153dd18a 100644 --- a/app/globals.css +++ b/app/globals.css @@ -230,11 +230,11 @@ } /* H2 is used for page headers */ h2 { - @apply text-2xl leading-tight font-semibold tracking-wider capitalize; + @apply xs:text-2xl text-xl leading-tight font-semibold tracking-wider capitalize; } h3 { - @apply text-xl leading-tight font-semibold tracking-wide capitalize; + @apply xs:text-xl text-lg leading-tight font-semibold tracking-wide capitalize; } h4 { diff --git a/app/history/page.tsx b/app/history/page.tsx index 1a8ca9b5..f9618c75 100644 --- a/app/history/page.tsx +++ b/app/history/page.tsx @@ -2,8 +2,7 @@ import 'server-only' import NextImage from 'next/image' import { ShowMore } from '../../components/showmore' -import { customImageLoader } from '@/utils' -import { cn } from '@/utils' +import { customImageLoader, cn } from '@/utils' export const dynamic = 'force-static' diff --git a/components/heading-image/heading-image.tsx b/components/heading-image/heading-image.tsx index 6b1e4360..30d790a2 100644 --- a/components/heading-image/heading-image.tsx +++ b/components/heading-image/heading-image.tsx @@ -1,6 +1,8 @@ import NextImage from 'next/image' import './animations.css' import { customImageLoader } from '@/utils' +import Link from 'next/link' +import { FrontRoutes } from '@/constants' export const HeadingImage = () => { return ( @@ -15,9 +17,11 @@ export const HeadingImage = () => { />
-

- Industrial Era Barometer Collection -

+ +

+ Art of weather instruments foundation +

+
diff --git a/constants/menudata.ts b/constants/menudata.ts index 3cd55ac4..28171321 100644 --- a/constants/menudata.ts +++ b/constants/menudata.ts @@ -9,10 +9,27 @@ export async function getMenuData(): Promise { { id: 0, label: 'Home', - link: '/', + link: FrontRoutes.Home, }, { id: 1, + label: 'Foundation', + link: FrontRoutes.Foundation, + children: [ + { + id: 6, + label: 'Foundation', + link: FrontRoutes.Foundation, + }, + { + id: 7, + label: 'Donators', + link: FrontRoutes.Donators, + }, + ], + }, + { + id: 2, label: 'Collection', link: '/collection', children: categories.map(cat => ({ @@ -21,25 +38,20 @@ export async function getMenuData(): Promise { label: cat.label, })), }, - { - id: 2, - label: 'Brands', - link: '/brands', - }, { id: 3, - label: 'History', - link: '/history', + label: 'Brands', + link: FrontRoutes.Brands, }, { id: 4, label: 'About', - link: '/about', + link: FrontRoutes.About, }, { - id: 10, + id: 5, label: 'Admin', - link: '/admin', + link: FrontRoutes.Admin, visibleFor: AccessRole.ADMIN, }, ] diff --git a/constants/routes-front.ts b/constants/routes-front.ts index c1a9f0f8..8f0c16be 100644 --- a/constants/routes-front.ts +++ b/constants/routes-front.ts @@ -1,6 +1,8 @@ export const FrontRoutes = { Home: '/', History: '/history/', + Foundation: '/foundation/', + Donators: '/foundation/donators/', About: '/about/', Brands: '/brands/', Terms: '/terms-and-conditions/', From bf96f3aa626a72015afe009115f0dc805caa8e2b Mon Sep 17 00:00:00 2001 From: Cybervoid Date: Fri, 15 Aug 2025 23:23:19 +0200 Subject: [PATCH 2/3] feat: enhance Foundation page with contact information and styling updates - Added a new contact information section to the Foundation page, including registration details and email. - Updated names of board members for accuracy and consistency. - Introduced new styling for contact text to improve visual presentation. - Adjusted theme provider settings to default to dark mode for better user experience. --- app/foundation/page.tsx | 33 ++++++++++++++++++++++++++++++--- providers/index.tsx | 7 +------ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/app/foundation/page.tsx b/app/foundation/page.tsx index 793d479f..8d5cd97c 100644 --- a/app/foundation/page.tsx +++ b/app/foundation/page.tsx @@ -13,6 +13,7 @@ const listSx = cn( '[&>li]:after:content-[";"] [&>li]:last-of-type:after:content-["."]', // colons and full stop ) const linkSx = 'decoration-muted-foreground hover:decoration-foreground underline' +const contactTxSx = 'text-sm text-muted-foreground' export default function Foundation() { return ( @@ -98,7 +99,7 @@ export default function Foundation() { artisans, artists, engineers, historians, and all who value the meeting of science and beauty.'

-

Leo Shirokov

+

L. Shirokov

Founding Board

@@ -111,7 +112,7 @@ export default function Foundation() { className="rounded-sm shadow-lg" alt="Leo Shirokov" /> -

Leo Shirokov — Chair & Co-Founder

+

Leonid Shirokov — Chair & Co-Founder

Alex Shenshin

- Alex Shenshin — Treasurer/Secretary & Co-Founder + Aleksandr Shenshin — Treasurer/Secretary & Co-Founder

@@ -225,6 +226,32 @@ export default function Foundation() {
+
+
+
+ Logo +

+ awif +

+
+
+

Reg. name

+

Stichting Art of Weather Instruments

+

Trade name

+

The Art of Weather Instruments Foundation

+

KVK

+

98055216

+

RSIN

+

868340911

+

Reg. address

+

Jonker Florislaan 64 Nuenen 5673ML Netherlands

+

E-mail

+ + post@barometers.info + +
+
+
) diff --git a/providers/index.tsx b/providers/index.tsx index 9a70dfc4..b86af3e3 100644 --- a/providers/index.tsx +++ b/providers/index.tsx @@ -12,12 +12,7 @@ export default function Providers({ children }: PropsWithChildren) { return ( - + {children} From 06485a645a61e569b3adb413dbf553f7fc55fc3b Mon Sep 17 00:00:00 2001 From: Cybervoid Date: Sat, 16 Aug 2025 00:58:53 +0200 Subject: [PATCH 3/3] feat: payment methods - Removed outdated content from the Foundation page to streamline information. - Deleted the Donators page to simplify navigation. - Updated menu data to reflect new labels and routes, changing 'Foundation' to 'About Us' and 'Donators' to 'Donate'. - Adjusted routing in routes-front.ts to align with the new navigation structure. --- app/foundation/donate/page.tsx | 75 +++++++++++++++++++ app/foundation/donators/page.tsx | 3 - app/foundation/layout.tsx | 19 +++++ app/foundation/page.tsx | 11 --- components/containers/header/tabs.tsx | 2 +- components/paypal-button/index.ts | 1 + .../paypal-button/paypal-stacked-button.tsx | 73 ++++++++++++++++++ constants/menudata.ts | 6 +- constants/routes-front.ts | 2 +- 9 files changed, 173 insertions(+), 19 deletions(-) create mode 100644 app/foundation/donate/page.tsx delete mode 100644 app/foundation/donators/page.tsx create mode 100644 app/foundation/layout.tsx create mode 100644 components/paypal-button/index.ts create mode 100644 components/paypal-button/paypal-stacked-button.tsx diff --git a/app/foundation/donate/page.tsx b/app/foundation/donate/page.tsx new file mode 100644 index 00000000..c9517dd6 --- /dev/null +++ b/app/foundation/donate/page.tsx @@ -0,0 +1,75 @@ +import Image from 'next/image' +import { cn } from '@/utils' +import { PayPalStackedButton } from '@/components/paypal-button' + +const paragraphSx = 'mb-4 indent-8 text-left' +const listSx = cn( + 'mb-1 ml-12 space-y-2 -indent-6', //layout + "[&>li]:before:mr-2 [&>li]:before:content-['—']", // dash-bullets + '[&>li]:after:content-[";"] [&>li]:last-of-type:after:content-["."]', // colons and full stop +) + +export default function Donate() { + return ( + <> +

Donate

+

+ Your generosity helps us safeguard and share the legacy of historical weather instruments + for future generations. Every donation — large or small — plays a vital role in conserving + our collection, supporting research, and making this heritage accessible to the public. +

+

You can support the Foundation through the following channels:

+
    +
  • Bitcoin (BTC) — wallet address and QR code below
  • +
  • + Ethereum Network — this includes ETH, USDT, USDC, and any other ERC-20 tokens (wallet + address and QR code below) +
  • +
  • PayPal — secure online donations via PayPal or credit card
  • +
  • + Additional giving options will be available soon, including direct bank transfers and + other convenient methods +
  • +
+ +
+
+ Bitcoin + Bitcoin +

bc1q6g0etsc0pu2s2zjk8t3rdej9624stxzq0hlm5f

+
+
+ Ethereum + Ethereum + {/* TODO: add copy button */} +

0x29B67cDAd027266Ed497b66a0c708e750d4436FA

+
+
+ + + ) +} diff --git a/app/foundation/donators/page.tsx b/app/foundation/donators/page.tsx deleted file mode 100644 index 4d5a9b50..00000000 --- a/app/foundation/donators/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Donators() { - return

Donators

-} diff --git a/app/foundation/layout.tsx b/app/foundation/layout.tsx new file mode 100644 index 00000000..a44a4759 --- /dev/null +++ b/app/foundation/layout.tsx @@ -0,0 +1,19 @@ +import { type PropsWithChildren } from 'react' + +export default function Layout({ children }: PropsWithChildren) { + return ( + <> +
+

The Art of Weather Instruments Foundation

+

+ Preserving the Beauty and Function of Historical Weather Instruments +

+
+ {children} + + ) +} diff --git a/app/foundation/page.tsx b/app/foundation/page.tsx index 8d5cd97c..40ccf54b 100644 --- a/app/foundation/page.tsx +++ b/app/foundation/page.tsx @@ -18,17 +18,6 @@ const contactTxSx = 'text-sm text-muted-foreground' export default function Foundation() { return ( <> -
-

The Art of Weather Instruments Foundation

-

- Preserving the Beauty and Function of Historical Weather Instruments -

-
-

Mission

-

{nestedItem.label}

+

{nestedItem.label}

diff --git a/components/paypal-button/index.ts b/components/paypal-button/index.ts new file mode 100644 index 00000000..114f6093 --- /dev/null +++ b/components/paypal-button/index.ts @@ -0,0 +1 @@ +export { PayPalStackedButton } from './paypal-stacked-button' diff --git a/components/paypal-button/paypal-stacked-button.tsx b/components/paypal-button/paypal-stacked-button.tsx new file mode 100644 index 00000000..52fad0b3 --- /dev/null +++ b/components/paypal-button/paypal-stacked-button.tsx @@ -0,0 +1,73 @@ +'use client' + +import { useCallback, useEffect, useRef, useState } from 'react' +import { cn } from '@/utils' +import Script from 'next/script' + +interface PayPalHostedButton { + hostedButtonId: string +} + +interface PayPalHostedButtons { + (config: PayPalHostedButton): { + render: (container: HTMLElement) => void + } +} + +declare global { + interface Window { + paypal?: { + HostedButtons: PayPalHostedButtons + } + } +} + +export function PayPalStackedButton({ + className, + ...divProps +}: React.HTMLAttributes) { + const containerRef = useRef(null) + const [isRendered, setIsRendered] = useState(false) + + const renderButton = useCallback(() => { + if (window.paypal && containerRef.current && !isRendered) { + // Clear container before rendering to avoid duplicates + containerRef.current.innerHTML = '' + + window.paypal + .HostedButtons({ + hostedButtonId: 'LEG7JKHVDZ6WA', + }) + .render(containerRef.current) + + setIsRendered(true) + } + }, [isRendered]) + + useEffect(() => { + // If PayPal is already loaded, render immediately + if (window.paypal) { + renderButton() + } + }, [renderButton]) + + return ( + <> +