一個現代化的 UI 元件庫,專注於實現 Apple Liquid Glass 效果。
GlassHeartUI 提供多個框架的獨立套件:
套件 | 描述 | 安裝 | CDN |
---|---|---|---|
glassheart-ui-core |
核心 CSS 樣式 | npm install glassheart-ui-core |
https://unpkg.com/[email protected]/dist/index.css |
glassheart-ui-react |
React 元件 | npm install glassheart-ui-react |
https://unpkg.com/[email protected]/dist/index.js |
glassheart-ui-vue |
Vue 元件 | npm install glassheart-ui-vue |
https://unpkg.com/[email protected]/dist/index.js |
glassheart-ui-svelte |
Svelte 元件 | npm install glassheart-ui-svelte |
https://unpkg.com/[email protected]/dist/index.js |
glassheart-ui-angular |
Angular 元件 | npm install glassheart-ui-angular |
- |
glassheart-ui |
原生 JavaScript | npm install glassheart-ui |
https://unpkg.com/[email protected]/dist/index.js |
最簡單的方式是通過 CDN 直接引入:
<!DOCTYPE html>
<html>
<head>
<!-- 引入核心樣式 -->
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/index.css">
<!-- 引入 JavaScript 組件 -->
<script src="https://unpkg.com/[email protected]/dist/index.js"></script>
</head>
<body>
<div id="app"></div>
<script>
const { GlassCard, GlassButton, GlassInput, GlassTypography } = window.GlassHeartUI;
// 創建組件
const card = new GlassCard({
size: 'lg',
liquid: true,
interactive: true,
content: '<h3>Hello GlassHeartUI!</h3><p>Beautiful glass effects</p>'
});
// 渲染到頁面
card.render('#app');
</script>
</body>
</html>
📖 詳細 CDN 使用指南:查看 CDN_GUIDE.md 獲取完整的 CDN 使用說明和範例。
🎮 範例:查看 examples/cdn-demo.html 體驗完整的 CDN 使用範例。
import {
GlassCard,
GlassButton,
GlassInput,
GlassTypography,
GlassContainer,
GlassNavigation,
GlassNavigationBrand,
GlassNavigationMenu,
GlassNavigationItem,
GlassNavigationToggle
} from 'glassheart-ui-react';
function App() {
return (
<div>
<GlassNavigation variant="default" glass="medium" sticky>
<GlassNavigationBrand href="#">
GlassHeartUI
</GlassNavigationBrand>
<GlassNavigationMenu>
<GlassNavigationItem href="#" active>首頁</GlassNavigationItem>
<GlassNavigationItem href="#">產品</GlassNavigationItem>
<GlassNavigationItem href="#">服務</GlassNavigationItem>
</GlassNavigationMenu>
<GlassNavigationToggle />
</GlassNavigation>
<GlassTypography
variant="h1"
size="3xl"
weight="bold"
glass="heavy"
glow
gradient
>
Welcome to GlassHeartUI
</GlassTypography>
<GlassContainer size="lg" glass="medium" liquid interactive>
<GlassCard liquid interactive>
<GlassCardHeader>
<GlassCardTitle>Hello GlassHeartUI</GlassCardTitle>
</GlassCardHeader>
<GlassCardContent>
<GlassInput placeholder="Enter your name" />
<GlassButton variant="primary" liquid>Submit</GlassButton>
</GlassCardContent>
</GlassCard>
</GlassContainer>
</div>
);
}
<template>
<div>
<GlassNavigation variant="default" glass="medium" sticky>
<GlassNavigationBrand href="#">
GlassHeartUI
</GlassNavigationBrand>
<GlassNavigationMenu>
<GlassNavigationItem href="#" active>首頁</GlassNavigationItem>
<GlassNavigationItem href="#">產品</GlassNavigationItem>
<GlassNavigationItem href="#">服務</GlassNavigationItem>
</GlassNavigationMenu>
<GlassNavigationToggle />
</GlassNavigation>
<GlassTypography
variant="h1"
size="3xl"
weight="bold"
glass="heavy"
glow
gradient
>
Welcome to GlassHeartUI
</GlassTypography>
<GlassContainer size="lg" glass="medium" liquid interactive>
<GlassCard liquid interactive>
<GlassCardHeader>
<GlassCardTitle>Hello GlassHeartUI</GlassCardTitle>
</GlassCardHeader>
<GlassCardContent>
<GlassInput placeholder="Enter your name" />
<GlassButton variant="primary" liquid>Submit</GlassButton>
</GlassCardContent>
</GlassCard>
</GlassContainer>
</div>
</template>
<script setup>
import {
GlassCard,
GlassCardHeader,
GlassCardTitle,
GlassCardContent,
GlassInput,
GlassButton,
GlassTypography,
GlassContainer,
GlassNavigation,
GlassNavigationBrand,
GlassNavigationMenu,
GlassNavigationItem,
GlassNavigationToggle
} from 'glassheart-ui-vue';
</script>
<script>
import {
GlassCard,
GlassCardHeader,
GlassCardTitle,
GlassCardContent,
GlassInput,
GlassButton,
GlassTypography,
GlassContainer,
GlassNavigation,
GlassNavigationBrand,
GlassNavigationMenu,
GlassNavigationItem,
GlassNavigationToggle
} from 'glassheart-ui-svelte';
</script>
<div>
<GlassNavigation variant="default" glass="medium" sticky>
<GlassNavigationBrand href="#">
GlassHeartUI
</GlassNavigationBrand>
<GlassNavigationMenu>
<GlassNavigationItem href="#" active>首頁</GlassNavigationItem>
<GlassNavigationItem href="#">產品</GlassNavigationItem>
<GlassNavigationItem href="#">服務</GlassNavigationItem>
</GlassNavigationMenu>
<GlassNavigationToggle />
</GlassNavigation>
<GlassTypography
variant="h1"
size="3xl"
weight="bold"
glass="heavy"
glow
gradient
>
Welcome to GlassHeartUI
</GlassTypography>
<GlassContainer size="lg" glass="medium" liquid interactive>
<GlassCard liquid interactive>
<GlassCardHeader>
<GlassCardTitle>Hello GlassHeartUI</GlassCardTitle>
</GlassCardHeader>
<GlassCardContent>
<GlassInput placeholder="Enter your name" />
<GlassButton variant="primary" liquid>Submit</GlassButton>
</GlassCardContent>
</GlassCard>
</GlassContainer>
</div>
import {
GlassCard,
GlassButton,
GlassInput,
GlassTypography,
GlassContainer,
GlassNavigation,
GlassNavigationItem,
initTheme
} from 'glassheart-ui';
// 初始化主題
initTheme();
// 創建導航
const navigation = new GlassNavigation({
variant: 'default',
glass: 'medium',
position: 'top',
sticky: true
});
// 添加品牌
navigation.addBrand('GlassHeartUI', '#');
// 添加導航項目
navigation.addItem({
text: '首頁',
href: '#',
active: true
});
navigation.addItem({
text: '產品',
href: '#'
});
navigation.addItem({
text: '服務',
href: '#'
});
// 添加切換按鈕
navigation.addToggle();
// 創建毛玻璃文字
const typography = new GlassTypography({
children: 'Welcome to GlassHeartUI',
variant: 'h1',
size: '3xl',
weight: 'bold',
glass: 'heavy',
glow: true,
gradient: true
});
// 創建元件
const card = new GlassCard({
size: 'lg',
variant: 'default',
liquid: true,
interactive: true
});
// 渲染到頁面
navigation.render('body');
document.body.appendChild(typography.getElement());
card.render('#app');
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/index.css">
<script src="https://unpkg.com/[email protected]/dist/index.js"></script>
<script>
const {
GlassCard,
GlassButton,
GlassInput,
GlassTypography,
GlassContainer,
GlassNavigation,
GlassNavigationItem,
initTheme
} = window.GlassHeartUI;
initTheme();
// 創建導航
const navigation = new GlassNavigation({
variant: 'default',
glass: 'medium',
position: 'top',
sticky: true
});
navigation.addBrand('GlassHeartUI', '#');
navigation.addItem({ text: '首頁', href: '#', active: true });
navigation.addItem({ text: '產品', href: '#' });
navigation.addItem({ text: '服務', href: '#' });
navigation.addToggle();
// 創建毛玻璃文字
const typography = new GlassTypography({
children: 'Welcome to GlassHeartUI',
variant: 'h1',
size: '3xl',
weight: 'bold',
glass: 'heavy',
glow: true,
gradient: true
});
// 渲染到頁面
navigation.render('body');
document.body.appendChild(typography.getElement());
</script>
<!-- 導航 -->
<nav class="gh-navigation gh-navigation-default gh-glass-medium gh-navigation-top gh-navigation-sticky">
<div class="gh-navigation-container">
<a href="#" class="gh-navigation-brand">GlassHeartUI</a>
<div class="gh-navigation-menu">
<a href="#" class="gh-navigation-item gh-navigation-item-active">首頁</a>
<a href="#" class="gh-navigation-item">產品</a>
<a href="#" class="gh-navigation-item">服務</a>
</div>
<button class="gh-navigation-toggle" aria-label="Toggle navigation menu">
<span class="gh-navigation-toggle-line"></span>
<span class="gh-navigation-toggle-line"></span>
<span class="gh-navigation-toggle-line"></span>
</button>
</div>
</nav>
<!-- 容器 -->
<div class="gh-container gh-container-lg gh-glass-medium gh-liquid-flow gh-p-lg gh-rounded-lg gh-shadow-lg">
<h3>容器標題</h3>
<p>這是一個具有玻璃效果的容器</p>
</div>
<!-- 卡片 -->
<div class="gh-card gh-card-lg gh-glass-medium gh-liquid-flow">
<div class="gh-card-header">
<h3 class="gh-card-title">Liquid Glass Card</h3>
</div>
<div class="gh-card-content">
<input class="gh-input gh-input-md gh-glass-medium" placeholder="Enter text...">
<button class="gh-btn gh-btn-primary gh-btn-md gh-glass-medium">Click me</button>
</div>
</div>
💡 向後兼容性:為了確保現有代碼不會中斷,所有套件都保留了舊的組件名稱作為別名。您可以使用
Card
或GlassCard
,兩者完全相同。
<GlassCard
size="lg"
variant="default"
liquid
liquidGlass
liquidGlassOptions={{
strength: 80,
chromaticAberration: 0,
blur: 3,
debug: false
}}
interactive
>
<GlassCardHeader>
<GlassCardTitle>Card Title</GlassCardTitle>
<GlassCardDescription>Card description</GlassCardDescription>
</GlassCardHeader>
<GlassCardContent>
<p>Card content goes here</p>
</GlassCardContent>
<GlassCardFooter>
<GlassButton variant="primary">Action</GlassButton>
</GlassCardFooter>
</GlassCard>
Props:
size
: 'sm' | 'md' | 'lg' | 'xl'variant
: 'default' | 'outline' | 'solid'interactive
: booleanliquid
: booleanliquidGlass
: boolean - 啟用 LiquidGlass 效果liquidGlassOptions
: object - LiquidGlass 效果參數loading
: boolean<GlassButton
variant="primary"
size="md"
glass="medium"
liquid
liquidGlass
liquidGlassOptions={{
strength: 100,
chromaticAberration: 0,
blur: 2,
debug: false
}}
loading={false}
>
Click me
</GlassButton>
Props:
variant
: 'default' | 'primary' | 'secondary' | 'accent' | 'destructive' | 'outline' | 'ghost' | 'link'size
: 'xs' | 'sm' | 'md' | 'lg' | 'xl'glass
: 'light' | 'medium' | 'heavy'liquid
: booleanliquidGlass
: boolean - 啟用 LiquidGlass 效果liquidGlassOptions
: object - LiquidGlass 效果參數strength
: number - 位移強度 (預設: 100)chromaticAberration
: number - 色差效果 (預設: 0)blur
: number - 模糊程度 (預設: 2)debug
: boolean - 調試模式,顯示位移映射 (預設: false)loading
: boolean<GlassInput
size="md"
variant="default"
glass="medium"
liquid
placeholder="Enter text..."
icon={<SearchIcon />}
/>
Props:
size
: 'xs' | 'sm' | 'md' | 'lg' | 'xl'variant
: 'default' | 'outline' | 'solid'glass
: 'light' | 'medium' | 'heavy'liquid
: booleanicon
: ReactNodeiconPosition
: 'left' | 'right'<GlassContainer
size="lg"
variant="default"
glass="medium"
interactive
liquid
animated
padding="lg"
rounded="lg"
shadow="lg"
>
<h3>容器內容</h3>
<p>這是一個具有玻璃效果的容器組件</p>
</GlassContainer>
Props:
size
: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'variant
: 'default' | 'outline' | 'solid' | 'transparent'glass
: 'light' | 'medium' | 'heavy'interactive
: booleanliquid
: booleananimated
: booleanpadding
: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'margin
: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'rounded
: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full'shadow
: 'none' | 'sm' | 'md' | 'lg' | 'xl'overflow
: 'visible' | 'hidden' | 'scroll' | 'auto'position
: 'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'zIndex
: number<GlassNavigation
variant="default"
glass="medium"
position="top"
size="md"
sticky
liquid
animated
>
<GlassNavigationBrand href="#">
Dudu
</GlassNavigationBrand>
<GlassNavigationMenu>
<GlassNavigationItem href="#" active>
Home
</GlassNavigationItem>
<GlassNavigationItem href="#">
Works
</GlassNavigationItem>
<GlassNavigationItem href="#">
Labs
</GlassNavigationItem>
<GlassNavigationItem href="#">
Study
</GlassNavigationItem>
<GlassNavigationItem href="#">
About
</GlassNavigationItem>
</GlassNavigationMenu>
<GlassNavigationToggle />
</GlassNavigation>
特色功能:
Props:
variant
: 'default' | 'transparent' | 'solid' | 'floating'glass
: 'light' | 'medium' | 'heavy'position
: 'top' | 'bottom' | 'left' | 'right'size
: 'sm' | 'md' | 'lg'sticky
: booleanfixed
: booleanliquid
: booleananimated
: booleanblur
: booleanshadow
: 'none' | 'sm' | 'md' | 'lg' | 'xl'padding
: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'rounded
: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full'zIndex
: numberimport { applyTheme, toggleTheme, initTheme } from 'glassheart-ui';
// 初始化主題系統
initTheme({
theme: 'light',
glassIntensity: 'medium',
animationSpeed: 'normal'
});
// 切換主題
toggleTheme();
// 手動設定主題
applyTheme('dark');
:root {
--gh-primary: 59 130 246; /* 主色調 */
--gh-glass-opacity: 0.1; /* 玻璃透明度 */
--gh-glass-blur: 20px; /* 模糊程度 */
--gh-animation-duration: 0.3s; /* 動畫速度 */
}
<!-- 玻璃效果 -->
<div class="gh-glass gh-glass-light">Light glass</div>
<div class="gh-glass gh-glass-medium">Medium glass</div>
<div class="gh-glass gh-glass-heavy">Heavy glass</div>
<!-- 液態流動效果 -->
<div class="gh-liquid-flow">Liquid animation</div>
<!-- 動畫效果 -->
<div class="gh-animate-in">Fade in</div>
<div class="gh-animate-slide-up">Slide up</div>
<div class="gh-animate-scale">Scale animation</div>
<!-- 毛玻璃文字 -->
<div class="gh-typography gh-typography-h1 gh-typography-2xl gh-glass-medium gh-glow">
Glass Typography
</div>
<!-- 毛玻璃文字 - 完整示例 -->
<div class="gh-typography gh-typography-h1 gh-typography-3xl gh-typography-bold gh-glass-heavy gh-glow gh-gradient">
Welcome to GlassHeartUI
</div>
<!-- 容器 -->
<div class="gh-container gh-container-lg gh-glass-medium gh-liquid-flow gh-p-lg gh-rounded-lg gh-shadow-lg">
<h3>容器標題</h3>
<p>這是一個具有玻璃效果的容器</p>
</div>
<!-- 卡片 -->
<div class="gh-card gh-card-lg gh-glass-medium gh-liquid-flow">
<div class="gh-card-header">
<h3 class="gh-card-title">Title</h3>
</div>
<div class="gh-card-content">Content</div>
</div>
<!-- 按鈕 -->
<button class="gh-btn gh-btn-primary gh-btn-md gh-glass-medium">
Button
</button>
<!-- 輸入框 -->
<input class="gh-input gh-input-md gh-glass-medium" placeholder="Input">
.gh-glass-custom {
--gh-glass-opacity: 0.15;
}
.gh-glass-custom {
--gh-glass-blur: 25px;
}
.gh-glass-custom {
--gh-animation-duration: 0.5s;
}
.gh-glass-custom {
--gh-primary: 139 92 246; /* 紫色 */
--gh-accent: 236 72 153; /* 粉色 */
}
<div class="gh-card gh-card-sm md:gh-card-md lg:gh-card-lg">
Responsive card
</div>
prefers-reduced-motion
媒體查詢不支援 IE
完整的元件文檔和範例請查看 Storybook
# 克隆項目
git clone https://github.com/your-username/glassheart-ui.git
cd glassheart-ui
# 安裝依賴
npm install
# 啟動 Storybook
npm run storybook
# 構建靜態文件
npm run build-storybook
# 靜態文件將生成在 storybook-static/ 目錄
LiquidGlass 是我們最新的高級視覺效果,基於 SVG 位移映射技術實現的液體玻璃效果。
// 啟用 LiquidGlass 效果
<GlassButton liquidGlass>
Liquid Glass Button
</GlassButton>
// 自定義 LiquidGlass 參數
<GlassCard
liquidGlass
liquidGlassOptions={{
strength: 120, // 位移強度 (0-200)
chromaticAberration: 10, // 色差效果 (0-50)
blur: 3, // 模糊程度 (0-10)
debug: false // 調試模式
}}
>
Liquid Glass Card
</GlassCard>
所有主要組件都支援 LiquidGlass 效果:
參數 | 類型 | 預設值 | 描述 |
---|---|---|---|
liquidGlass |
boolean |
false |
是否啟用 LiquidGlass 效果 |
liquidGlassOptions |
object |
{} |
LiquidGlass 效果參數 |
liquidGlassOptions.strength |
number |
100 |
位移強度 (0-200) |
liquidGlassOptions.chromaticAberration |
number |
0 |
色差效果 (0-50) |
liquidGlassOptions.blur |
number |
2 |
模糊程度 (0-10) |
liquidGlassOptions.debug |
boolean |
false |
調試模式,顯示位移映射 |
啟用調試模式可以查看位移映射,幫助調整效果參數:
<GlassButton
liquidGlass
liquidGlassOptions={{ debug: true }}
>
Debug Mode
</GlassButton>
GlassTypography 是我們最新的組件,使用 HTML5 Canvas 渲染高級毛玻璃文字效果。
// React
<GlassTypography
variant="h1"
size="3xl"
weight="bold"
glass="heavy"
glow
gradient
liquid
animated
>
Beautiful Glass Text
</GlassTypography>
<!-- Vue -->
<GlassTypography
variant="h1"
size="3xl"
weight="bold"
glass="heavy"
glow
gradient
>
Beautiful Glass Text
</GlassTypography>
屬性 | 類型 | 預設值 | 描述 |
---|---|---|---|
children |
string |
- | 要顯示的文字內容 |
variant |
'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div' |
'p' |
文字變體 |
size |
'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' |
'md' |
文字尺寸 |
weight |
'light' | 'normal' | 'medium' | 'semibold' | 'bold' | 'extrabold' | 'black' |
'normal' |
字重 |
glass |
'light' | 'medium' | 'heavy' |
'medium' |
玻璃效果強度 |
liquid |
boolean |
false |
是否啟用液體流動效果 |
gradient |
boolean |
false |
是否啟用漸變效果 |
animated |
boolean |
false |
是否啟用動畫效果 |
glow |
boolean |
false |
是否啟用發光效果 |
glowColor |
string |
'#ffffff' |
發光顏色 |
glowIntensity |
number |
0.8 |
發光強度 (0-2) |
// 發光效果
<GlassTypography glow glowColor="#00ff88" glowIntensity={1.2}>
Glowing Text
</GlassTypography>
// 液體流動效果
<GlassTypography liquid animated>
Liquid Flow Text
</GlassTypography>
// 漸變效果
<GlassTypography gradient glass="heavy">
Gradient Glass Text
</GlassTypography>
// 組合效果
<GlassTypography
variant="h1"
size="4xl"
weight="bold"
glass="heavy"
glow
gradient
liquid
animated
glowColor="#ff6b6b"
glowIntensity={1.5}
>
Ultimate Glass Text
</GlassTypography>
歡迎提交 Issue 和 Pull Request!
MIT License