feat (v1.0.0): initial refactor and redesign
This commit is contained in:
parent
3058aa1ab4
commit
fe9b50b30e
134 changed files with 17792 additions and 3670 deletions
61
lib/devices/config.ts
Normal file
61
lib/devices/config.ts
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
/**
|
||||
* Device configuration constants and display labels.
|
||||
*
|
||||
* @remarks
|
||||
* This module provides configuration constants used throughout the device showcase
|
||||
* for consistent labeling and sizing of UI elements.
|
||||
*
|
||||
* @module lib/devices/config
|
||||
* @category Devices
|
||||
* @public
|
||||
*/
|
||||
|
||||
/**
|
||||
* Human-readable labels for device types.
|
||||
*
|
||||
* @remarks
|
||||
* Maps device type identifiers to their display labels for use in UI components.
|
||||
*
|
||||
* @example
|
||||
* ```tsx
|
||||
* import { deviceTypeLabels } from '@/lib/devices/config'
|
||||
*
|
||||
* const DeviceTypeBadge = ({ type }: { type: keyof typeof deviceTypeLabels }) => (
|
||||
* <span>{deviceTypeLabels[type]}</span>
|
||||
* )
|
||||
* ```
|
||||
*
|
||||
* @category Devices
|
||||
* @public
|
||||
*/
|
||||
export const deviceTypeLabels = {
|
||||
/** Label for mobile phone devices */
|
||||
mobile: 'Mobile device',
|
||||
/** Label for digital audio player devices */
|
||||
dap: 'Digital audio player'
|
||||
} as const
|
||||
|
||||
/**
|
||||
* Standard icon sizes for device components.
|
||||
*
|
||||
* @remarks
|
||||
* Provides consistent icon sizing across device stat displays and section headers.
|
||||
* All sizes are in pixels.
|
||||
*
|
||||
* @example
|
||||
* ```tsx
|
||||
* import { iconSizes } from '@/lib/devices/config'
|
||||
* import { Smartphone } from 'lucide-react'
|
||||
*
|
||||
* <Smartphone size={iconSizes.stat} />
|
||||
* ```
|
||||
*
|
||||
* @category Devices
|
||||
* @public
|
||||
*/
|
||||
export const iconSizes = {
|
||||
/** Icon size for device stat displays (60px) */
|
||||
stat: 60,
|
||||
/** Icon size for device section headers (60px) */
|
||||
section: 60
|
||||
} as const
|
||||
465
lib/devices/data.ts
Normal file
465
lib/devices/data.ts
Normal file
|
|
@ -0,0 +1,465 @@
|
|||
import {
|
||||
Battery,
|
||||
Bluetooth,
|
||||
Clock,
|
||||
Cast,
|
||||
Cpu,
|
||||
Gauge,
|
||||
HardDrive,
|
||||
Hash,
|
||||
Headphones,
|
||||
Layers,
|
||||
MemoryStick,
|
||||
Monitor,
|
||||
Music,
|
||||
Package,
|
||||
Radio,
|
||||
Ruler,
|
||||
ShieldCheck,
|
||||
Smartphone,
|
||||
Sparkles,
|
||||
SquarePen,
|
||||
Usb,
|
||||
Wifi,
|
||||
Zap
|
||||
} from 'lucide-react';
|
||||
import { FaYoutube } from 'react-icons/fa';
|
||||
import { MdOutlineAndroid } from 'react-icons/md';
|
||||
import { RiTelegram2Fill } from 'react-icons/ri';
|
||||
import { TbDeviceSdCard } from 'react-icons/tb';
|
||||
import { VscTerminalLinux } from 'react-icons/vsc';
|
||||
|
||||
import type { DeviceCollection } from '@/lib/types';
|
||||
|
||||
export const devices: DeviceCollection = {
|
||||
komodo: {
|
||||
slug: 'komodo',
|
||||
name: 'Pixel 9 Pro XL',
|
||||
shortName: 'Pixel 9 Pro XL',
|
||||
codename: 'komodo',
|
||||
type: 'mobile',
|
||||
manufacturer: 'Google',
|
||||
status: 'Android beta lab',
|
||||
releaseYear: 2024,
|
||||
heroImage: {
|
||||
src: '/img/komodo.png',
|
||||
alt: 'Google Pixel 9 Pro XL (komodo)',
|
||||
},
|
||||
tagline: 'Bleeding-edge Pixel tuned for experimentation and kernel tinkering.',
|
||||
summary: [
|
||||
'The Pixel 9 Pro XL is my sandbox for canary Android builds. It runs preview releases while staying rooted thanks to KernelSU-Next and a SUSFS-enabled kernel.',
|
||||
'I lean on it for testing new modules and automation ideas before they touch my day-to-day setup.',
|
||||
],
|
||||
stats: [
|
||||
{
|
||||
title: 'Core silicon',
|
||||
icon: Cpu,
|
||||
items: [
|
||||
{ label: 'SoC', value: 'Google Tensor G4' },
|
||||
{ label: 'RAM', value: '16 GB LPDDR5X' },
|
||||
{ label: 'Storage', value: '128 GB UFS 4.0' },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Software channel',
|
||||
icon: MdOutlineAndroid,
|
||||
items: [
|
||||
{
|
||||
label: 'ROM',
|
||||
value: 'Android 16 QPR2',
|
||||
href: 'https://developer.android.com/about/versions/16/qpr2',
|
||||
},
|
||||
{
|
||||
label: 'Kernel',
|
||||
value: '6.1.138 android14 (SUSFS Wild)',
|
||||
href: 'https://github.com/WildKernels/GKI_KernelSU_SUSFS',
|
||||
},
|
||||
{
|
||||
label: 'Root',
|
||||
value: 'KernelSU-Next',
|
||||
href: 'https://github.com/rifsxd/KernelSU-Next',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Media stack',
|
||||
icon: Music,
|
||||
items: [
|
||||
{ label: 'Streaming', value: 'Tidal', href: 'https://tidal.com' },
|
||||
{ label: 'Local files', value: 'MiXplorer', href: 'https://mixplorer.com/' },
|
||||
{ label: 'Video', value: 'ReVanced', href: 'https://revanced.app' },
|
||||
],
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
id: 'hardware',
|
||||
title: 'Hardware Snapshot',
|
||||
icon: Smartphone,
|
||||
rows: [
|
||||
{ label: 'Chipset', value: 'Google Tensor G4', icon: Cpu },
|
||||
{ label: 'RAM', value: '16 GB LPDDR5X', icon: MemoryStick },
|
||||
{ label: 'Storage', value: '128 GB UFS 4.0', icon: HardDrive },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'software',
|
||||
title: 'Software Stack',
|
||||
icon: MdOutlineAndroid,
|
||||
rows: [
|
||||
{
|
||||
label: 'ROM',
|
||||
value: 'Android 16 QPR2',
|
||||
icon: MdOutlineAndroid,
|
||||
href: 'https://developer.android.com/about/versions/16/qpr2',
|
||||
},
|
||||
{
|
||||
label: 'Kernel',
|
||||
value: '6.1.138 android14 (SUSFS Wild)',
|
||||
icon: VscTerminalLinux,
|
||||
href: 'https://github.com/WildKernels/GKI_KernelSU_SUSFS',
|
||||
},
|
||||
{
|
||||
label: 'Root',
|
||||
value: 'KernelSU-Next',
|
||||
icon: ShieldCheck,
|
||||
href: 'https://github.com/rifsxd/KernelSU-Next',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'apps',
|
||||
title: 'Daily Apps',
|
||||
icon: Package,
|
||||
rows: [
|
||||
{ label: 'Music', value: 'Tidal', icon: Music, href: 'https://tidal.com' },
|
||||
{ label: 'Files', value: 'MiXplorer', icon: Package, href: 'https://mixplorer.com/' },
|
||||
{ label: 'Telegram', value: 'AyuGram', icon: RiTelegram2Fill, href: 'https://t.me/AyuGramReleases' },
|
||||
{ label: 'YouTube', value: 'ReVanced', icon: FaYoutube, href: 'https://revanced.app' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'modules',
|
||||
title: 'Module Suite',
|
||||
icon: Layers,
|
||||
listItems: [
|
||||
{ label: 'bindhosts', href: 'https://modules.lol/module/kowx712-bindhosts' },
|
||||
{ label: 'Emoji Replacer', href: 'https://github.com/EmojiReplacer/Emoji-Replacer' },
|
||||
{ label: 'F-Droid Privileged Extension', href: 'https://modules.lol/module/entr0pia-f-droid-privileged-extension-installer' },
|
||||
{ label: 'SUSFS for KernelSU', href: 'https://modules.lol/module/sidex15-susfs' },
|
||||
{ label: 'Tricky Store', href: 'https://modules.lol/module/5ec1cff-tricky-store' },
|
||||
{ label: 'Yuri Keybox Manager', href: 'https://modules.lol/module/dpejoh-and-yuri-yurikey' },
|
||||
],
|
||||
}
|
||||
],
|
||||
},
|
||||
cheetah: {
|
||||
slug: 'cheetah',
|
||||
name: 'Pixel 7 Pro',
|
||||
shortName: 'Pixel 7 Pro',
|
||||
codename: 'cheetah',
|
||||
type: 'mobile',
|
||||
manufacturer: 'Google',
|
||||
status: 'Daily driver',
|
||||
releaseYear: 2022,
|
||||
heroImage: {
|
||||
src: '/img/cheetah.png',
|
||||
alt: 'Google Pixel 7 Pro (cheetah)',
|
||||
},
|
||||
tagline: 'Reliable flagship tuned for rooted daily use.',
|
||||
summary: [
|
||||
'My everyday carry balances performance and battery life with a stable crDroid build and KernelSU-Next for system-level tweaks.',
|
||||
'The camera stack and Tensor-only optimizations still impress, especially when paired with my media workflow.',
|
||||
],
|
||||
stats: [
|
||||
{
|
||||
title: 'Core hardware',
|
||||
icon: Cpu,
|
||||
items: [
|
||||
{ label: 'SoC', value: 'Google Tensor G2' },
|
||||
{ label: 'RAM', value: '12 GB LPDDR5' },
|
||||
{ label: 'Storage', value: '128 GB' },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Current build',
|
||||
icon: MdOutlineAndroid,
|
||||
items: [
|
||||
{ label: 'ROM', value: 'crDroid 11.6', href: 'https://crdroid.net' },
|
||||
{ label: 'Kernel', value: '6.1.99 android14' },
|
||||
{ label: 'Root', value: 'KernelSU-Next', href: 'https://github.com/rifsxd/KernelSU-Next' },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Media kit',
|
||||
icon: Music,
|
||||
items: [
|
||||
{ label: 'Streaming', value: 'Tidal', href: 'https://tidal.com' },
|
||||
{ label: 'Files', value: 'MiXplorer', href: 'https://mixplorer.com/' },
|
||||
{ label: 'YouTube', value: 'ReVanced', href: 'https://revanced.app' },
|
||||
],
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
id: 'hardware',
|
||||
title: 'Hardware Snapshot',
|
||||
icon: Smartphone,
|
||||
rows: [
|
||||
{ label: 'Chipset', value: 'Google Tensor G2', icon: Cpu },
|
||||
{ label: 'RAM', value: '12 GB LPDDR5', icon: MemoryStick },
|
||||
{ label: 'Storage', value: '128 GB', icon: HardDrive },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'software',
|
||||
title: 'Software Stack',
|
||||
icon: MdOutlineAndroid,
|
||||
rows: [
|
||||
{
|
||||
label: 'ROM',
|
||||
value: 'crDroid Android 11.6',
|
||||
icon: MdOutlineAndroid,
|
||||
href: 'https://crdroid.net',
|
||||
},
|
||||
{
|
||||
label: 'Kernel',
|
||||
value: '6.1.99 android14',
|
||||
icon: VscTerminalLinux,
|
||||
},
|
||||
{
|
||||
label: 'Root',
|
||||
value: 'KernelSU-Next',
|
||||
icon: ShieldCheck,
|
||||
href: 'https://github.com/rifsxd/KernelSU-Next',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'apps',
|
||||
title: 'App Loadout',
|
||||
icon: Package,
|
||||
rows: [
|
||||
{ label: 'Music', value: 'Tidal', icon: Music, href: 'https://tidal.com' },
|
||||
{ label: 'Files', value: 'MiXplorer', icon: Package, href: 'https://mixplorer.com/' },
|
||||
{ label: 'Telegram', value: 'AyuGram', icon: RiTelegram2Fill, href: 'https://t.me/AyuGramReleases' },
|
||||
{ label: 'YouTube', value: 'ReVanced', icon: FaYoutube, href: 'https://revanced.app' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'modules',
|
||||
title: 'Module Suite',
|
||||
icon: Layers,
|
||||
listItems: [
|
||||
{ label: 'bindhosts', href: 'https://github.com/bindhosts/bindhosts' },
|
||||
{ label: 'Emoji Replacer', href: 'https://github.com/EmojiReplacer/Emoji-Replacer' },
|
||||
{ label: 'ReZygisk', href: 'https://github.com/PerformanC/ReZygisk' },
|
||||
{ label: 'LSPosed JingMatrix', href: 'https://github.com/JingMatrix/LSPosed' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'review',
|
||||
title: 'Review',
|
||||
icon: SquarePen,
|
||||
rating: {
|
||||
value: 4.5,
|
||||
scale: 5,
|
||||
label: 'Personal score',
|
||||
},
|
||||
paragraphs: [
|
||||
'The jump from a Galaxy A32 5G was dramatic. Tensor silicon keeps the phone responsive, especially with 12 GB of RAM backing daily multitasking.',
|
||||
'Battery life wavers when Play Integrity tweaks are active, but the photo pipeline more than compensates—the Pixel still wins for quick captures.',
|
||||
'Hardware quirks aside (RIP volume rocker), Android makes on-screen controls painless, so the device stays an easy recommendation.',
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
bonito: {
|
||||
slug: 'bonito',
|
||||
name: 'Pixel 3a XL',
|
||||
shortName: 'Pixel 3a XL',
|
||||
codename: 'bonito',
|
||||
type: 'mobile',
|
||||
manufacturer: 'Google',
|
||||
status: 'Ubuntu Touch testing',
|
||||
releaseYear: 2019,
|
||||
heroImage: {
|
||||
src: '/img/bonito.png',
|
||||
alt: 'Google Pixel 3a XL (bonito)',
|
||||
},
|
||||
tagline: 'Legacy Pixel reborn as a sandbox for Ubuntu Touch.',
|
||||
summary: [
|
||||
'Retired from Android duty, the Pixel 3a XL now explores the Ubuntu Touch ecosystem as a daily development mule.',
|
||||
'It highlights what the community-driven OS can do on aging hardware while still handling lightweight messaging and media.',
|
||||
],
|
||||
stats: [
|
||||
{
|
||||
title: 'Core silicon',
|
||||
icon: Cpu,
|
||||
items: [
|
||||
{ label: 'Chipset', value: 'Snapdragon 670' },
|
||||
{ label: 'RAM', value: '4 GB' },
|
||||
{ label: 'Storage', value: '64 GB' },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Current build',
|
||||
icon: MdOutlineAndroid,
|
||||
items: [
|
||||
{
|
||||
label: 'OS',
|
||||
value: 'Ubuntu Touch stable',
|
||||
href: 'https://www.ubuntu-touch.io',
|
||||
},
|
||||
{ label: 'Kernel', value: '4.9.337' },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Essentials',
|
||||
icon: Package,
|
||||
items: [
|
||||
{ label: 'Music', value: 'uSonic', href: 'https://github.com/arubislander/uSonic' },
|
||||
{ label: 'Messaging', value: 'TELEports', href: 'https://open-store.io/app/teleports.ubports' },
|
||||
],
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
id: 'hardware',
|
||||
title: 'Hardware Snapshot',
|
||||
icon: Smartphone,
|
||||
rows: [
|
||||
{ label: 'Chipset', value: 'Qualcomm Snapdragon 670', icon: Cpu },
|
||||
{ label: 'RAM', value: '4 GB', icon: MemoryStick },
|
||||
{ label: 'Storage', value: '64 GB', icon: HardDrive },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'software',
|
||||
title: 'Software Stack',
|
||||
icon: MdOutlineAndroid,
|
||||
rows: [
|
||||
{
|
||||
label: 'OS',
|
||||
value: 'Ubuntu Touch',
|
||||
icon: MdOutlineAndroid,
|
||||
href: 'https://www.ubuntu-touch.io',
|
||||
},
|
||||
{ label: 'Kernel', value: '4.9.337', icon: VscTerminalLinux },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'apps',
|
||||
title: 'App Loadout',
|
||||
icon: Package,
|
||||
rows: [
|
||||
{ label: 'Music', value: 'uSonic', icon: Music, href: 'https://github.com/arubislander/uSonic' },
|
||||
{ label: 'Messaging', value: 'TELEports', icon: RiTelegram2Fill, href: 'https://open-store.io/app/teleports.ubports' },
|
||||
],
|
||||
}
|
||||
],
|
||||
},
|
||||
jm21: {
|
||||
slug: 'jm21',
|
||||
name: 'FiiO JM21',
|
||||
shortName: 'FiiO JM21',
|
||||
codename: 'jm21',
|
||||
type: 'dap',
|
||||
manufacturer: 'FiiO',
|
||||
status: 'Portable Hi-Fi rig',
|
||||
releaseYear: 2024,
|
||||
heroImage: {
|
||||
src: '/img/jm21.png',
|
||||
alt: 'FiiO JM21 digital audio player',
|
||||
},
|
||||
tagline: 'Compact Android DAP with a dual-DAC audio chain.',
|
||||
summary: [
|
||||
'The JM21 is my dedicated portable rig. Dual Cirrus Logic DACs and a balanced amp stage deliver more headroom than a typical phone stack.',
|
||||
'Android 13 keeps app support flexible, so streaming and offline libraries live together without compromise.',
|
||||
],
|
||||
stats: [
|
||||
{
|
||||
title: 'Audio pipeline',
|
||||
icon: Headphones,
|
||||
items: [
|
||||
{ label: 'DAC', value: 'Dual CS43198' },
|
||||
{ label: 'Amp', value: 'Dual SGM8262' },
|
||||
{ label: 'SNR', value: 'Up to 129 dB' },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Outputs',
|
||||
icon: Radio,
|
||||
items: [
|
||||
{ label: 'Single-ended', value: '3.5 mm' },
|
||||
{ label: 'Balanced', value: '4.4 mm' },
|
||||
{ label: 'Digital', value: 'USB-C / coaxial' },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Power & runtime',
|
||||
icon: Battery,
|
||||
items: [
|
||||
{ label: 'Power', value: '245 mW SE / 700 mW BAL @32Ω' },
|
||||
{ label: 'Battery', value: '2400 mAh' },
|
||||
{ label: 'Storage', value: '32 GB + microSD up to 2 TB' },
|
||||
],
|
||||
},
|
||||
],
|
||||
sections: [
|
||||
{
|
||||
id: 'core-specs',
|
||||
title: 'Core Specs',
|
||||
icon: Cpu,
|
||||
rows: [
|
||||
{ label: 'Processor', value: 'Qualcomm Snapdragon 680 (octa-core, 2.4 GHz)', icon: Cpu },
|
||||
{ label: 'RAM', value: '3 GB', icon: MemoryStick },
|
||||
{ label: 'Storage', value: '32 GB (≈22 GB usable)', icon: HardDrive },
|
||||
{ label: 'Expansion', value: 'microSD up to 2 TB', icon: TbDeviceSdCard },
|
||||
{ label: 'Display', value: '4.7" IPS, 1334 × 750', icon: Monitor },
|
||||
{ label: 'Dimensions', value: '120.7 × 68 × 13 mm', icon: Ruler },
|
||||
{ label: 'Weight', value: '156 g', icon: Gauge },
|
||||
{ label: 'Chassis', value: 'Ultra-thin 13 mm frame', icon: Layers },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'audio',
|
||||
title: 'Audio Hardware',
|
||||
icon: Headphones,
|
||||
rows: [
|
||||
{ label: 'DAC', value: 'Dual Cirrus Logic CS43198', icon: Headphones },
|
||||
{ label: 'Amplifier', value: 'Dual SGM8262', icon: Layers },
|
||||
{ label: 'Outputs', value: '3.5 mm SE, 4.4 mm BAL, coaxial, USB-C', icon: Radio },
|
||||
{ label: 'Power output', value: '245 mW SE / 700 mW BAL @32Ω (THD+N <1%)', icon: Zap },
|
||||
{ label: 'Impedance', value: '<1Ω SE, <1.5Ω BAL', icon: Hash },
|
||||
{ label: 'Frequency response', value: '20 Hz – 80 kHz (<0.7 dB)', icon: Music },
|
||||
{ label: 'Formats', value: 'PCM 384 kHz/32-bit, DSD256, full MQA', icon: Sparkles },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'connectivity',
|
||||
title: 'Connectivity & OS',
|
||||
icon: Wifi,
|
||||
rows: [
|
||||
{ label: 'OS', value: 'Custom Android 13', icon: MdOutlineAndroid },
|
||||
{ label: 'Bluetooth', value: 'v5.0 (SBC, AAC, aptX, aptX HD, LDAC, LHDC)', icon: Bluetooth },
|
||||
{ label: 'Wi-Fi', value: '802.11 a/b/g/n/ac, dual-band', icon: Wifi },
|
||||
{ label: 'USB DAC', value: 'Asynchronous, 384 kHz/32-bit', icon: Usb },
|
||||
{ label: 'AirPlay / DLNA', value: 'Supported', icon: Cast },
|
||||
{ label: 'Battery', value: '2400 mAh', icon: Battery },
|
||||
{ label: 'Charging', value: '≈2 h via 5V 2A', icon: Clock },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
export const deviceSlugs = Object.keys(devices);
|
||||
|
||||
export const mobileDevices = Object.values(devices).filter((device) => device.type === 'mobile');
|
||||
|
||||
export const dapDevices = Object.values(devices).filter((device) => device.type === 'dap');
|
||||
|
||||
export function getDeviceBySlug(slug: string) {
|
||||
return devices[slug];
|
||||
}
|
||||
13
lib/devices/index.ts
Normal file
13
lib/devices/index.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
/**
|
||||
* Device data exports for my portfolio showcase.
|
||||
*
|
||||
* @remarks
|
||||
* This module re-exports all device-related data from the data module.
|
||||
* Currently exports device specifications for display in the device showcase.
|
||||
*
|
||||
* @module lib/devices
|
||||
* @category Devices
|
||||
* @public
|
||||
*/
|
||||
|
||||
export * from './data';
|
||||
Loading…
Add table
Add a link
Reference in a new issue