Some checks failed
CI Pipeline / Code Quality & Typecheck (push) Waiting to run
CI Pipeline / Test Suite (macos-latest) (push) Blocked by required conditions
CI Pipeline / Test Suite (ubuntu-latest) (push) Blocked by required conditions
CI Pipeline / Test Suite (windows-latest) (push) Blocked by required conditions
CI Pipeline / Build Validation (admin) (push) Blocked by required conditions
CI Pipeline / Build Validation (desktop) (push) Blocked by required conditions
Deploy Landing Page / deploy (push) Blocked by required conditions
Deploy Landing Page / build (push) Waiting to run
Release & Packaging Pipeline / Build & Publish Admin Docker Image (push) Failing after 8s
Release & Code Signing CA Pipeline / build-and-sign-windows (push) Failing after 1m51s
Build macOS / Build & Package (macOS) (push) Failing after 4s
Build macOS / Build & Package (macOS)-1 (push) Failing after 5s
Release & Code Signing CA Pipeline / build-and-sign-macos (push) Failing after 3s
Release & Packaging Pipeline / Package macOS Desktop App (push) Failing after 4s
Release & Packaging Pipeline / Package Windows Desktop App (push) Failing after 2m28s
Release & Packaging Pipeline / Publish Official GitHub Release (push) Has been skipped
101 lines
3.3 KiB
TypeScript
101 lines
3.3 KiB
TypeScript
'use client'
|
|
|
|
// packages/ui/src/components/ds/DoubleBezelCard.tsx
|
|
// High-End Agency / Awwwards-Tier Double-Bezel (Doppelrand) Enclosure Component
|
|
// Outer Shell: Precision machined tray with outer radius & ambient hairline
|
|
// Inner Core: Floating glass plate with concentric inner radius, specular highlight & blur
|
|
|
|
import React from 'react'
|
|
import { Box, type BoxProps } from '@mui/material'
|
|
import { d3roPalette, d3roShadow, d3roRadius } from '../../theme'
|
|
|
|
export interface DoubleBezelCardProps extends Omit<BoxProps, 'component'> {
|
|
/** Outer padding between tray and core (default: 6px) */
|
|
bezelPadding?: number | string
|
|
/** Whether the card shows an interactive lift / glow on hover */
|
|
interactive?: boolean
|
|
/** Inner core padding (default: 3 / 24px) */
|
|
innerPadding?: number | string
|
|
/** Content to render inside the inner core */
|
|
children?: React.ReactNode
|
|
}
|
|
|
|
export function DoubleBezelCard({
|
|
bezelPadding = '6px',
|
|
interactive = false,
|
|
innerPadding = 3,
|
|
children,
|
|
sx,
|
|
...boxProps
|
|
}: DoubleBezelCardProps): React.ReactElement {
|
|
return (
|
|
<Box
|
|
{...boxProps}
|
|
sx={{
|
|
position: 'relative',
|
|
borderRadius: d3roRadius.doubleBezelOuter,
|
|
p: bezelPadding,
|
|
bgcolor: d3roPalette.glass.raised,
|
|
border: `1px solid ${d3roPalette.glass.hairline}`,
|
|
boxShadow: interactive ? d3roShadow.card : 'none',
|
|
transition: 'transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.3s ease, border-color 0.3s ease',
|
|
...(interactive
|
|
? {
|
|
cursor: 'pointer',
|
|
'&:hover': {
|
|
borderColor: d3roPalette.glass.hairlineStrong,
|
|
boxShadow: d3roShadow.glowCardHover,
|
|
transform: 'translateY(-2px)',
|
|
'& .d3-inner-core': {
|
|
bgcolor: d3roPalette.bg.cardHover,
|
|
},
|
|
},
|
|
'&:active': {
|
|
transform: 'translateY(0px) scale(0.99)',
|
|
},
|
|
}
|
|
: {}),
|
|
...sx,
|
|
}}
|
|
>
|
|
{/* Inner Core Container */}
|
|
<Box
|
|
className="d3-inner-core"
|
|
sx={{
|
|
position: 'relative',
|
|
borderRadius: d3roRadius.doubleBezelInner,
|
|
bgcolor: d3roPalette.glass.surface,
|
|
backdropFilter: `blur(${d3roPalette.glass.blur})`,
|
|
boxShadow: `${d3roShadow.inset}, ${d3roShadow.glowCard}`,
|
|
p: innerPadding,
|
|
overflow: 'hidden',
|
|
transition: 'background-color 0.25s ease',
|
|
// Top Sheen + Specular highlight
|
|
'&::before': {
|
|
content: '""',
|
|
position: 'absolute',
|
|
inset: 0,
|
|
borderRadius: 'inherit',
|
|
background: d3roPalette.glass.sheen,
|
|
pointerEvents: 'none',
|
|
},
|
|
// 1px Gradient Hairline Rim
|
|
'&::after': {
|
|
content: '""',
|
|
position: 'absolute',
|
|
inset: 0,
|
|
borderRadius: 'inherit',
|
|
padding: '1px',
|
|
background: d3roPalette.glass.borderGradient,
|
|
WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',
|
|
WebkitMaskComposite: 'xor',
|
|
maskComposite: 'exclude',
|
|
pointerEvents: 'none',
|
|
},
|
|
}}
|
|
>
|
|
<Box sx={{ position: 'relative', zIndex: 1 }}>{children}</Box>
|
|
</Box>
|
|
</Box>
|
|
)
|
|
}
|