shadcn-glass-ui 1.0.0 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/README.md +128 -138
  3. package/dist/components.cjs +4 -4
  4. package/dist/components.js +1 -1
  5. package/dist/hooks.cjs +2 -2
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.js +1 -1
  8. package/dist/r/ai-card-glass.json +24 -0
  9. package/dist/r/alert-glass.json +42 -0
  10. package/dist/r/avatar-glass.json +43 -0
  11. package/dist/r/badge-glass.json +41 -0
  12. package/dist/r/base-progress-glass.json +23 -0
  13. package/dist/r/button-glass.json +45 -0
  14. package/dist/r/career-stats-glass.json +24 -0
  15. package/dist/r/career-stats-header-glass.json +24 -0
  16. package/dist/r/checkbox-glass.json +42 -0
  17. package/dist/r/circular-metric-glass.json +23 -0
  18. package/dist/r/circular-progress-glass.json +40 -0
  19. package/dist/r/combobox-glass.json +41 -0
  20. package/dist/r/contribution-metrics-glass.json +23 -0
  21. package/dist/r/dropdown-glass.json +43 -0
  22. package/dist/r/expandable-header-glass.json +23 -0
  23. package/dist/r/flag-alert-glass.json +23 -0
  24. package/dist/r/flags-section-glass.json +24 -0
  25. package/dist/r/form-field-wrapper.json +23 -0
  26. package/dist/r/glass-card.json +42 -0
  27. package/dist/r/header-branding-glass.json +24 -0
  28. package/dist/r/header-nav-glass.json +25 -0
  29. package/dist/r/icon-button-glass.json +25 -0
  30. package/dist/r/input-glass.json +43 -0
  31. package/dist/r/interactive-card.json +24 -0
  32. package/dist/r/language-bar-glass.json +23 -0
  33. package/dist/r/metric-card-glass.json +24 -0
  34. package/dist/r/metrics-grid-glass.json +23 -0
  35. package/dist/r/modal-glass.json +43 -0
  36. package/dist/r/notification-glass.json +44 -0
  37. package/dist/r/popover-glass.json +40 -0
  38. package/dist/r/profile-avatar-glass.json +23 -0
  39. package/dist/r/profile-header-glass.json +24 -0
  40. package/dist/r/progress-glass.json +25 -0
  41. package/dist/r/projects-list-glass.json +24 -0
  42. package/dist/r/rainbow-progress-glass.json +23 -0
  43. package/dist/r/registry.json +337 -0
  44. package/dist/r/repository-card-glass.json +23 -0
  45. package/dist/r/repository-header-glass.json +24 -0
  46. package/dist/r/repository-metadata-glass.json +23 -0
  47. package/dist/r/search-box-glass.json +23 -0
  48. package/dist/r/segmented-control-glass.json +23 -0
  49. package/dist/r/skeleton-glass.json +41 -0
  50. package/dist/r/slider-glass.json +42 -0
  51. package/dist/r/sort-dropdown-glass.json +25 -0
  52. package/dist/r/stat-item-glass.json +25 -0
  53. package/dist/r/status-indicator-glass.json +23 -0
  54. package/dist/r/tabs-glass.json +38 -0
  55. package/dist/r/theme-toggle-glass.json +25 -0
  56. package/dist/r/toggle-glass.json +42 -0
  57. package/dist/r/tooltip-glass.json +42 -0
  58. package/dist/r/touch-target.json +23 -0
  59. package/dist/r/trust-score-card-glass.json +24 -0
  60. package/dist/r/trust-score-display-glass.json +24 -0
  61. package/dist/r/user-info-glass.json +24 -0
  62. package/dist/r/user-stats-line-glass.json +24 -0
  63. package/dist/r/year-card-glass.json +25 -0
  64. package/dist/shadcn-glass-ui.css +1 -1
  65. package/dist/{theme-context-DrLak65e.cjs → theme-context-e3yxC7A6.cjs} +2 -2
  66. package/dist/{theme-context-DrLak65e.cjs.map → theme-context-e3yxC7A6.cjs.map} +1 -1
  67. package/dist/themes.cjs +1 -1
  68. package/dist/{trust-score-card-glass-DqaCKo1w.cjs → trust-score-card-glass-CZeCRkHL.cjs} +19 -17
  69. package/dist/trust-score-card-glass-CZeCRkHL.cjs.map +1 -0
  70. package/dist/{trust-score-card-glass-tJnNNzeS.js → trust-score-card-glass-DWrcNoI2.js} +16 -14
  71. package/dist/trust-score-card-glass-DWrcNoI2.js.map +1 -0
  72. package/dist/{use-focus-6xqfE5s6.cjs → use-focus-CUkhhBRX.cjs} +2 -2
  73. package/dist/{use-focus-6xqfE5s6.cjs.map → use-focus-CUkhhBRX.cjs.map} +1 -1
  74. package/dist/{use-wallpaper-tint-D1f3UGGs.cjs → use-wallpaper-tint-b9KAZtoy.cjs} +2 -2
  75. package/dist/{use-wallpaper-tint-D1f3UGGs.cjs.map → use-wallpaper-tint-b9KAZtoy.cjs.map} +1 -1
  76. package/dist/{utils-BNzkwPwE.cjs → utils-Ba5INf7M.cjs} +2 -2
  77. package/dist/{utils-BNzkwPwE.cjs.map → utils-Ba5INf7M.cjs.map} +1 -1
  78. package/dist/utils.cjs +1 -1
  79. package/package.json +5 -2
  80. package/dist/trust-score-card-glass-DqaCKo1w.cjs.map +0 -1
  81. package/dist/trust-score-card-glass-tJnNNzeS.js.map +0 -1
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "notification-glass",
4
+ "type": "registry:ui",
5
+ "title": "Notification Glass",
6
+ "description": "Glass-themed toast notification with:",
7
+ "dependencies": [
8
+ "class-variance-authority",
9
+ "lucide-react",
10
+ "react"
11
+ ],
12
+ "registryDependencies": [
13
+ "cn",
14
+ "primitives",
15
+ "use-hover",
16
+ "variants"
17
+ ],
18
+ "files": [
19
+ {
20
+ "path": "components/glass/ui/notification-glass.tsx",
21
+ "type": "registry:component",
22
+ "content": "/**\n * NotificationGlass Component\n *\n * Glass-themed toast notification with:\n * - Theme-aware styling (glass/light/aurora)\n * - Type variants (info/success/warning/error)\n * - Glow effect on hover\n * - Dismissible\n */\n\nimport { forwardRef, type CSSProperties } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { Info, CheckCircle, AlertTriangle, AlertCircle, X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { notificationVariants } from '@/lib/variants/notification-glass-variants';\nimport { ICON_SIZES } from '@/components/glass/primitives';\nimport '@/glass-theme.css';\n\nimport type { NotificationType } from '@/lib/variants/notification-glass-variants';\n\n// ========================================\n// CONSTANTS\n// ========================================\n\nconst NOTIFICATION_ICONS = {\n info: Info,\n success: CheckCircle,\n warning: AlertTriangle,\n error: AlertCircle,\n} as const;\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\nexport interface NotificationGlassProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'style'>,\n VariantProps<typeof notificationVariants> {\n readonly title: string;\n readonly message: string;\n /** Notification variant (shadcn/ui compatible) */\n readonly variant?: 'default' | 'destructive' | 'success' | 'warning';\n /** @deprecated Use variant prop instead. Will be removed in next major version. */\n readonly type?: NotificationType;\n readonly onClose: () => void;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\n// Type-specific CSS variable mapping\nconst getTypeVars = (notifType: NotificationType): { color: string; glow: string; iconBg: string } => {\n const configs: Record<NotificationType, { color: string; glow: string; iconBg: string }> = {\n info: { color: 'var(--notification-info-color)', glow: 'var(--notification-info-glow)', iconBg: 'var(--notification-info-icon-bg)' },\n success: { color: 'var(--notification-success-color)', glow: 'var(--notification-success-glow)', iconBg: 'var(--notification-success-icon-bg)' },\n warning: { color: 'var(--notification-warning-color)', glow: 'var(--notification-warning-glow)', iconBg: 'var(--notification-warning-icon-bg)' },\n error: { color: 'var(--notification-error-color)', glow: 'var(--notification-error-glow)', iconBg: 'var(--notification-error-icon-bg)' },\n };\n return configs[notifType];\n};\n\nexport const NotificationGlass = forwardRef<HTMLDivElement, NotificationGlassProps>(\n ({ variant: variantProp, type: typeProp, title, message, onClose, className, ...props }, ref) => {\n // Backward compatibility: support deprecated 'type' prop\n const variant = variantProp ?? typeProp ?? 'default';\n\n // Show deprecation warning in development\n if (process.env.NODE_ENV === 'development' && typeProp) {\n console.warn(\n 'NotificationGlass: The \"type\" prop is deprecated. Use \"variant\" instead. Example: <NotificationGlass variant=\"destructive\" />'\n );\n }\n\n // Map variant to internal notification type\n const variantToType: Record<string, NotificationType> = {\n default: 'info',\n destructive: 'error',\n success: 'success',\n warning: 'warning',\n // Backward compatibility aliases\n info: 'info',\n error: 'error',\n };\n\n const effectiveType: NotificationType = variantToType[variant] || 'info';\n\n const { isHovered, hoverProps } = useHover();\n const Icon = NOTIFICATION_ICONS[effectiveType];\n const config = getTypeVars(effectiveType);\n\n const containerStyles: CSSProperties = {\n background: 'var(--notification-bg)',\n border: '1px solid var(--notification-border)',\n boxShadow: isHovered ? config.glow : 'var(--notification-shadow)',\n transform: isHovered ? 'translateY(-2px)' : 'translateY(0)',\n };\n\n const iconContainerStyles: CSSProperties = {\n background: config.iconBg,\n boxShadow: isHovered ? config.glow : 'none',\n };\n\n return (\n <div\n ref={ref}\n className={cn(notificationVariants({ type: effectiveType }), className)}\n style={containerStyles}\n role=\"alert\"\n aria-live=\"polite\"\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n {...props}\n >\n {/* Icon with glow */}\n <div\n className=\"w-8 h-8 md:w-10 md:h-10 rounded-xl flex items-center justify-center shrink-0\"\n style={iconContainerStyles}\n >\n <Icon className=\"w-4 h-4 md:w-5 md:h-5\" style={{ color: config.color }} />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-semibold text-xs md:text-sm mb-0.5 md:mb-1\" style={{ color: 'var(--text-primary)' }}>\n {title}\n </p>\n <p className=\"text-xs md:text-sm\" style={{ color: 'var(--text-secondary)' }}>\n {message}\n </p>\n </div>\n\n {/* Close button */}\n <button\n onClick={onClose}\n className=\"p-1 md:p-1.5 rounded-lg shrink-0\"\n style={{ color: 'var(--text-muted)' }}\n type=\"button\"\n aria-label=\"Close notification\"\n >\n <X className={ICON_SIZES.md} />\n </button>\n </div>\n );\n }\n);\n\nNotificationGlass.displayName = 'NotificationGlass';\n"
23
+ }
24
+ ],
25
+ "categories": [
26
+ "ui"
27
+ ],
28
+ "cssVars": {
29
+ "light": {
30
+ "--glass-bg": "rgba(255, 255, 255, 0.1)",
31
+ "--glass-border": "rgba(255, 255, 255, 0.2)",
32
+ "--blur-sm": "8px",
33
+ "--blur-md": "16px",
34
+ "--blur-lg": "24px"
35
+ },
36
+ "dark": {
37
+ "--glass-bg": "rgba(255, 255, 255, 0.05)",
38
+ "--glass-border": "rgba(255, 255, 255, 0.1)",
39
+ "--blur-sm": "8px",
40
+ "--blur-md": "16px",
41
+ "--blur-lg": "24px"
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "popover-glass",
4
+ "type": "registry:ui",
5
+ "title": "Popover Glass",
6
+ "description": "Floating glass-themed container for tooltips, dropdowns, and overlays with:",
7
+ "dependencies": [
8
+ "@radix-ui/react-popover",
9
+ "react"
10
+ ],
11
+ "registryDependencies": [
12
+ "cn"
13
+ ],
14
+ "files": [
15
+ {
16
+ "path": "components/glass/ui/popover-glass.tsx",
17
+ "type": "registry:component",
18
+ "content": "/**\n * PopoverGlass Component\n *\n * Floating glass-themed container for tooltips, dropdowns, and overlays with:\n * - Theme-aware styling (glass/light/aurora)\n * - Smooth animations with fade-in effect\n * - Arrow pointer with glass styling\n * - ESC key and click-outside to close\n * - Focus trap for accessibility\n * - All position/alignment options (top/right/bottom/left × start/center/end)\n *\n * @example\n * ```tsx\n * <PopoverGlass\n * trigger={<ButtonGlass>Open</ButtonGlass>}\n * side=\"top\"\n * align=\"center\"\n * >\n * <div className=\"p-4\">Popover content</div>\n * </PopoverGlass>\n * ```\n */\n\nimport * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { cn } from '@/lib/utils';\nimport '@/glass-theme.css';\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\nexport interface PopoverGlassProps {\n /** The trigger element that opens the popover */\n readonly trigger: React.ReactNode;\n /** The content to display inside the popover */\n readonly children: React.ReactNode;\n /** The preferred side of the trigger to render against */\n readonly side?: 'top' | 'right' | 'bottom' | 'left';\n /** The preferred alignment against the trigger */\n readonly align?: 'start' | 'center' | 'end';\n /** The distance in pixels from the trigger */\n readonly sideOffset?: number;\n /** Controlled open state */\n readonly open?: boolean;\n /** Callback when open state changes */\n readonly onOpenChange?: (open: boolean) => void;\n /** Whether to show the arrow pointer */\n readonly showArrow?: boolean;\n /** Additional class name for the content wrapper */\n readonly className?: string;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const PopoverGlass = React.forwardRef<\n HTMLDivElement,\n PopoverGlassProps\n>(\n (\n {\n trigger,\n children,\n side = 'bottom',\n align = 'center',\n sideOffset = 8,\n open,\n onOpenChange,\n showArrow = true,\n className,\n },\n ref\n ) => {\n // Popover content styles with CSS variables\n const popoverStyles: React.CSSProperties = {\n background: 'var(--popover-bg)',\n border: '1px solid var(--popover-border)',\n boxShadow: 'var(--popover-shadow)',\n backdropFilter: 'blur(var(--blur-md))', // 16px - standard popover blur\n WebkitBackdropFilter: 'blur(var(--blur-md))',\n };\n\n // Arrow styles\n const arrowStyles: React.CSSProperties = {\n fill: 'var(--popover-arrow-bg)',\n };\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n side={side}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-[50003] rounded-2xl p-4',\n 'animate-in fade-in-0 zoom-in-95 duration-200',\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'outline-none',\n className\n )}\n style={popoverStyles}\n role=\"dialog\"\n aria-modal=\"false\"\n >\n {children}\n\n {showArrow && (\n <PopoverPrimitive.Arrow\n className=\"fill-current\"\n style={arrowStyles}\n width={16}\n height={8}\n />\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n }\n);\n\nPopoverGlass.displayName = 'PopoverGlass';\n"
19
+ }
20
+ ],
21
+ "categories": [
22
+ "ui"
23
+ ],
24
+ "cssVars": {
25
+ "light": {
26
+ "--glass-bg": "rgba(255, 255, 255, 0.1)",
27
+ "--glass-border": "rgba(255, 255, 255, 0.2)",
28
+ "--blur-sm": "8px",
29
+ "--blur-md": "16px",
30
+ "--blur-lg": "24px"
31
+ },
32
+ "dark": {
33
+ "--glass-bg": "rgba(255, 255, 255, 0.05)",
34
+ "--glass-border": "rgba(255, 255, 255, 0.1)",
35
+ "--blur-sm": "8px",
36
+ "--blur-md": "16px",
37
+ "--blur-lg": "24px"
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "profile-avatar-glass",
4
+ "type": "registry:component",
5
+ "title": "Profile Avatar Glass",
6
+ "description": "Profile Avatar Glass component with glass effects",
7
+ "dependencies": [
8
+ "react"
9
+ ],
10
+ "registryDependencies": [
11
+ "cn"
12
+ ],
13
+ "files": [
14
+ {
15
+ "path": "components/glass/specialized/profile-avatar-glass.tsx",
16
+ "type": "registry:component",
17
+ "content": "// ========================================\n// PROFILE AVATAR GLASS COMPONENT\n// Large avatar with glow animation for profiles\n// ========================================\n\nimport { forwardRef, useState, type CSSProperties } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport \"@/glass-theme.css\";\n\nexport type ProfileAvatarSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type ProfileAvatarStatus = \"online\" | \"offline\" | \"busy\" | \"away\";\n\nconst sizeClasses: Record<ProfileAvatarSize, string> = {\n sm: \"w-9 h-9 md:w-10 md:h-10 text-xs md:text-sm\",\n md: \"w-12 h-12 md:w-14 md:h-14 text-base md:text-lg\",\n lg: \"w-14 h-14 md:w-16 md:h-16 text-lg md:text-xl\",\n xl: \"w-18 h-18 md:w-20 md:h-20 text-xl md:text-2xl\",\n};\n\nconst statusSizeClasses: Record<ProfileAvatarSize, string> = {\n sm: \"w-2.5 h-2.5 md:w-3 md:h-3\",\n md: \"w-3 h-3 md:w-3.5 md:h-3.5\",\n lg: \"w-3.5 h-3.5 md:w-4 md:h-4\",\n xl: \"w-4 h-4 md:w-5 md:h-5\",\n};\n\nconst statusPositionClasses: Record<ProfileAvatarSize, string> = {\n sm: \"bottom-0 right-0\",\n md: \"bottom-0 right-0\",\n lg: \"-bottom-0.5 -right-0.5\",\n xl: \"-bottom-1 -right-1\",\n};\n\n// CSS variable maps for status colors (using semantic naming)\nconst statusVarMap: Record<ProfileAvatarStatus, string> = {\n online: \"var(--status-online)\",\n offline: \"var(--text-muted)\",\n busy: \"var(--status-busy)\",\n away: \"var(--status-away)\",\n};\n\nexport interface ProfileAvatarGlassProps extends React.HTMLAttributes<HTMLDivElement> {\n readonly initials: string;\n readonly size?: ProfileAvatarSize;\n readonly status?: ProfileAvatarStatus;\n readonly glowing?: boolean;\n}\n\nexport const ProfileAvatarGlass = forwardRef<HTMLDivElement, ProfileAvatarGlassProps>(\n ({ initials, size = \"lg\", status, glowing = true, className, ...props }, ref) => {\n const [isHovered, setIsHovered] = useState(false);\n\n const avatarStyles: CSSProperties = {\n boxShadow: isHovered ? \"var(--profile-avatar-glow)\" : \"none\",\n border: \"3px solid var(--profile-avatar-border)\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\"relative inline-flex\", className)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n <div\n className={cn(\n \"rounded-full bg-gradient-to-br from-blue-400 via-violet-500 to-indigo-500\",\n \"flex items-center justify-center text-white font-bold transition-all duration-300\",\n sizeClasses[size],\n glowing && \"animate-[glow-pulse_2s_ease-in-out_infinite]\"\n )}\n style={avatarStyles}\n role=\"img\"\n aria-label={`Profile avatar with initials ${initials}`}\n >\n {initials}\n </div>\n {status && (\n <span\n className={cn(\n \"absolute rounded-full\",\n statusPositionClasses[size],\n statusSizeClasses[size]\n )}\n style={{\n background: statusVarMap[status],\n border: \"none\",\n boxShadow: \"none\",\n }}\n role=\"status\"\n aria-label={`Status: ${status}`}\n />\n )}\n </div>\n );\n }\n);\n\nProfileAvatarGlass.displayName = \"ProfileAvatarGlass\";\n"
18
+ }
19
+ ],
20
+ "categories": [
21
+ "specialized"
22
+ ]
23
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "profile-header-glass",
4
+ "type": "registry:block",
5
+ "title": "Profile Header Glass",
6
+ "description": "Profile Header Glass component with glass effects",
7
+ "dependencies": [
8
+ "lucide-react",
9
+ "react"
10
+ ],
11
+ "registryDependencies": [
12
+ "cn"
13
+ ],
14
+ "files": [
15
+ {
16
+ "path": "components/glass/sections/profile-header-glass.tsx",
17
+ "type": "registry:component",
18
+ "content": "// ========================================\n// PROFILE HEADER GLASS COMPONENT\n// User profile header with avatar, stats, languages\n// ========================================\n\nimport { forwardRef } from \"react\";\nimport { Calendar, ExternalLink, FolderGit2, Users, User } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { GlassCard } from \"../ui/glass-card\";\nimport { ProfileAvatarGlass } from \"../specialized/profile-avatar-glass\";\nimport { LanguageBarGlass, type LanguageData } from \"../specialized/language-bar-glass\";\nimport { AICardGlass } from \"../composite/ai-card-glass\";\nimport \"@/glass-theme.css\";\n\nexport interface ProfileStats {\n readonly repos?: number;\n readonly followers?: number;\n readonly following?: number;\n}\n\nexport interface ProfileHeaderGlassProps extends React.HTMLAttributes<HTMLDivElement> {\n readonly name?: string;\n readonly username?: string;\n readonly joinDate?: string;\n readonly stats?: ProfileStats;\n readonly languages?: readonly LanguageData[];\n readonly onAIGenerate?: () => void;\n}\n\nexport const ProfileHeaderGlass = forwardRef<HTMLDivElement, ProfileHeaderGlassProps>(\n (\n {\n name = \"Artem Safronov\",\n username = \"Yhooi2\",\n joinDate = \"Jan 2023\",\n stats = {},\n languages = [],\n onAIGenerate,\n className,\n ...props\n },\n ref\n ) => {\n const s = { repos: 11, followers: 1, following: 5, ...stats };\n\n const getInitials = (fullName: string): string => {\n return fullName\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n };\n\n return (\n <GlassCard\n ref={ref}\n className={cn(\"p-5\", className)}\n intensity=\"strong\"\n glow=\"violet\"\n hover={false}\n {...props}\n >\n <div className=\"flex flex-col md:flex-row gap-3 md:gap-6\">\n <div className=\"flex-1\">\n <div className=\"flex gap-4\">\n <ProfileAvatarGlass\n initials={getInitials(name)}\n size=\"lg\"\n status=\"online\"\n />\n <div>\n <h1 className=\"text-lg md:text-xl font-bold\" style={{ color: \"var(--text-primary)\" }}>\n {name}\n </h1>\n <div\n className=\"flex items-center gap-2 text-sm mt-0.5\"\n style={{ color: \"var(--text-secondary)\" }}\n >\n <a\n href=\"#\"\n className=\"flex items-center gap-1 hover:underline\"\n style={{ color: \"var(--text-accent)\" }}\n >\n @{username} <ExternalLink className=\"w-3 h-3\" />\n </a>\n <span>·</span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"w-3 h-3\" /> Joined {joinDate}\n </span>\n </div>\n <div\n className=\"flex items-center gap-3 md:gap-4 mt-2 text-sm flex-wrap\"\n style={{ color: \"var(--text-secondary)\" }}\n >\n <span className=\"flex items-center gap-1\">\n <FolderGit2\n className=\"w-4 h-4\"\n style={{ color: \"var(--text-accent)\" }}\n />\n {s.repos} repos\n </span>\n <span className=\"flex items-center gap-1\">\n <Users className=\"w-4 h-4\" style={{ color: \"var(--text-accent)\" }} />\n {s.followers} followers\n </span>\n <span className=\"flex items-center gap-1\">\n <User className=\"w-4 h-4\" style={{ color: \"var(--text-accent)\" }} />\n {s.following} following\n </span>\n </div>\n </div>\n </div>\n {languages.length > 0 && (\n <div className=\"mt-4\">\n <LanguageBarGlass languages={languages} />\n </div>\n )}\n </div>\n <AICardGlass onGenerate={onAIGenerate} />\n </div>\n </GlassCard>\n );\n }\n);\n\nProfileHeaderGlass.displayName = \"ProfileHeaderGlass\";\n"
19
+ }
20
+ ],
21
+ "categories": [
22
+ "sections"
23
+ ]
24
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "progress-glass",
4
+ "type": "registry:component",
5
+ "title": "Progress Glass",
6
+ "description": "Glass-themed progress bar with:",
7
+ "dependencies": [
8
+ "class-variance-authority",
9
+ "react"
10
+ ],
11
+ "registryDependencies": [
12
+ "cn",
13
+ "variants"
14
+ ],
15
+ "files": [
16
+ {
17
+ "path": "components/glass/specialized/progress-glass.tsx",
18
+ "type": "registry:component",
19
+ "content": "/**\n * ProgressGlass Component\n *\n * Glass-themed progress bar with:\n * - Theme-aware styling (glass/light/aurora)\n * - Gradient fill with glow\n * - Size variants\n * - Optional label\n */\n\nimport { forwardRef, type CSSProperties } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\nimport { progressSizes, type ProgressGradient } from '@/lib/variants/progress-glass-variants';\nimport '@/glass-theme.css';\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\nexport interface ProgressGlassProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>,\n VariantProps<typeof progressSizes> {\n readonly value: number;\n readonly gradient?: ProgressGradient;\n readonly showLabel?: boolean;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\n// Gradient colors for the fill - CSS variable based\nconst getGradientColors = (gradient: ProgressGradient): { from: string; to: string; glowVar: string } => {\n const gradients: Record<ProgressGradient, { from: string; to: string; glowVar: string }> = {\n violet: { from: '#8b5cf6', to: '#a855f7', glowVar: '--progress-glow-violet' },\n blue: { from: '#3b82f6', to: '#60a5fa', glowVar: '--progress-glow-blue' },\n cyan: { from: '#06b6d4', to: '#22d3ee', glowVar: '--progress-glow-cyan' },\n amber: { from: '#f59e0b', to: '#fbbf24', glowVar: '--progress-glow-amber' },\n emerald: { from: '#10b981', to: '#34d399', glowVar: '--progress-glow-emerald' },\n rose: { from: '#f43f5e', to: '#fb7185', glowVar: '--progress-glow-rose' },\n };\n return gradients[gradient];\n};\n\nexport const ProgressGlass = forwardRef<HTMLDivElement, ProgressGlassProps>(\n (\n {\n className,\n size = 'md',\n value,\n gradient = 'violet',\n showLabel,\n ...props\n },\n ref\n ) => {\n const clampedValue = Math.min(100, Math.max(0, value));\n const gradientColors = getGradientColors(gradient);\n\n const trackStyles: CSSProperties = {\n background: 'var(--progress-bg)',\n };\n\n const fillStyles: CSSProperties = {\n width: `${clampedValue}%`,\n background: `linear-gradient(90deg, ${gradientColors.from}, ${gradientColors.to})`,\n boxShadow: `var(${gradientColors.glowVar})`,\n };\n\n return (\n <div ref={ref} className={cn('w-full', className)} {...props}>\n {showLabel && (\n <div className=\"flex justify-between mb-1 md:mb-1.5\">\n <span className=\"text-[10px] md:text-xs\" style={{ color: 'var(--text-muted)' }}>\n Progress\n </span>\n <span className=\"text-[10px] md:text-xs font-medium\" style={{ color: 'var(--text-secondary)' }}>\n {clampedValue}%\n </span>\n </div>\n )}\n <div className={cn(progressSizes({ size }))} style={trackStyles}>\n <div\n className=\"h-full rounded-full transition-all duration-700 ease-out\"\n style={fillStyles}\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Progress: ${clampedValue}%`}\n />\n </div>\n </div>\n );\n }\n);\n\nProgressGlass.displayName = 'ProgressGlass';\n"
20
+ }
21
+ ],
22
+ "categories": [
23
+ "specialized"
24
+ ]
25
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "projects-list-glass",
4
+ "type": "registry:block",
5
+ "title": "Projects List Glass",
6
+ "description": "Projects List Glass component with glass effects",
7
+ "dependencies": [
8
+ "lucide-react",
9
+ "react"
10
+ ],
11
+ "registryDependencies": [
12
+ "cn"
13
+ ],
14
+ "files": [
15
+ {
16
+ "path": "components/glass/sections/projects-list-glass.tsx",
17
+ "type": "registry:component",
18
+ "content": "// ========================================\n// PROJECTS LIST GLASS COMPONENT\n// List of repository cards with filtering, sorting, and ownership controls\n// ========================================\n\nimport { forwardRef, useState, useMemo, type CSSProperties } from \"react\";\nimport { FolderGit2, AlertTriangle } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { GlassCard } from \"../ui/glass-card\";\nimport { BadgeGlass } from \"../ui/badge-glass\";\nimport { RepositoryCardGlass, type RepositoryFlagType } from \"../composite/repository-card-glass\";\nimport { SegmentedControlGlass } from \"../specialized/segmented-control-glass\";\nimport { SortDropdownGlass, type SortField, type SortOrder } from \"../atomic\";\nimport \"@/glass-theme.css\";\n\n// ========================================\n// TYPES\n// ========================================\n\nexport type OwnershipFilter = 'your' | 'contrib' | 'all';\n\n// Re-export for convenience\nexport type { SortField, SortOrder } from \"../atomic\";\n\nexport interface Repository {\n readonly name: string;\n readonly languages: string;\n readonly commits: number;\n readonly contribution: number;\n readonly stars?: number;\n readonly flagType?: RepositoryFlagType;\n readonly issues?: readonly string[];\n readonly createdYear?: number;\n /** Ownership type for Your/Contrib filtering */\n readonly ownership?: 'your' | 'contrib';\n}\n\nexport interface ProjectsListGlassProps extends React.HTMLAttributes<HTMLDivElement> {\n /** List of repositories to display */\n readonly repositories: readonly Repository[];\n /** Show only flagged (non-green) repositories */\n readonly showFlaggedOnly?: boolean;\n /** Filter by creation year */\n readonly selectedYear?: number | null;\n /** Callback to clear all filters */\n readonly onClearFilters?: () => void;\n /** Custom title (overrides auto-generated) */\n readonly title?: string;\n\n // ======== NEW: Ownership Filter ========\n /** Current ownership filter */\n readonly ownershipFilter?: OwnershipFilter;\n /** Callback when ownership filter changes */\n readonly onOwnershipChange?: (filter: OwnershipFilter) => void;\n\n // ======== NEW: Sorting ========\n /** Current sort field */\n readonly sortBy?: SortField;\n /** Current sort order */\n readonly sortOrder?: SortOrder;\n /** Callback when sort changes */\n readonly onSortChange?: (field: SortField, order: SortOrder) => void;\n\n // ======== NEW: Controls ========\n /** Show header controls (sort dropdown, ownership filter). Default: true when callbacks provided */\n readonly showControls?: boolean;\n}\n\n// ========================================\n// OWNERSHIP FILTER OPTIONS\n// ========================================\n\nconst ownershipOptions = [\n { value: 'your' as const, label: 'Your' },\n { value: 'contrib' as const, label: 'Contrib' },\n];\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const ProjectsListGlass = forwardRef<HTMLDivElement, ProjectsListGlassProps>(\n (\n {\n repositories,\n showFlaggedOnly = false,\n selectedYear = null,\n onClearFilters,\n title,\n // New props\n ownershipFilter,\n onOwnershipChange,\n sortBy = 'commits',\n sortOrder = 'desc',\n onSortChange,\n showControls,\n className,\n ...props\n },\n ref\n ) => {\n const [expandedIndex, setExpandedIndex] = useState<number | null>(null);\n\n // Determine if controls should be shown\n const shouldShowControls = showControls ?? (onOwnershipChange !== undefined || onSortChange !== undefined);\n\n // Filter repositories\n const filteredRepos = useMemo(() => {\n return repositories.filter((repo) => {\n // Flag filter\n if (showFlaggedOnly && repo.flagType === \"green\") return false;\n // Year filter\n if (selectedYear && repo.createdYear !== selectedYear) return false;\n // Ownership filter\n if (ownershipFilter && ownershipFilter !== 'all' && repo.ownership !== ownershipFilter) return false;\n return true;\n });\n }, [repositories, showFlaggedOnly, selectedYear, ownershipFilter]);\n\n // Sort repositories\n const sortedRepos = useMemo(() => {\n if (!onSortChange) return filteredRepos;\n\n return [...filteredRepos].sort((a, b) => {\n const multiplier = sortOrder === 'asc' ? 1 : -1;\n switch (sortBy) {\n case 'commits':\n return (a.commits - b.commits) * multiplier;\n case 'stars':\n return ((a.stars ?? 0) - (b.stars ?? 0)) * multiplier;\n case 'name':\n return a.name.localeCompare(b.name) * multiplier;\n case 'contribution':\n return (a.contribution - b.contribution) * multiplier;\n default:\n return 0;\n }\n });\n }, [filteredRepos, sortBy, sortOrder, onSortChange]);\n\n // Generate title based on filters\n const displayTitle = title ?? (\n showFlaggedOnly\n ? \"Flagged\"\n : selectedYear\n ? `${selectedYear}`\n : \"All\"\n ) + \" Projects\";\n\n const emptyContainerStyles: CSSProperties = {\n background: \"var(--card-bg)\",\n };\n\n // Handle ownership change with type safety\n const handleOwnershipChange = (value: string): void => {\n if (onOwnershipChange && (value === 'your' || value === 'contrib')) {\n onOwnershipChange(value);\n }\n };\n\n return (\n <GlassCard\n ref={ref}\n intensity=\"medium\"\n className={cn(\"p-3 sm:p-4\", className)}\n {...props}\n >\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4\">\n {/* Left: Title + Badge */}\n <div className=\"flex items-center gap-2\">\n {showFlaggedOnly ? (\n <AlertTriangle className=\"w-4 h-4\" style={{ color: \"var(--status-away)\" }} />\n ) : (\n <FolderGit2 className=\"w-4 h-4\" style={{ color: \"var(--text-accent)\" }} />\n )}\n <h3\n className=\"font-semibold text-sm sm:text-base\"\n style={{ color: \"var(--text-primary)\" }}\n >\n {displayTitle}\n </h3>\n <BadgeGlass variant=\"info\">{sortedRepos.length} repos</BadgeGlass>\n </div>\n\n {/* Right: Controls */}\n {shouldShowControls && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {onSortChange && (\n <SortDropdownGlass\n sortBy={sortBy}\n sortOrder={sortOrder}\n onSortChange={onSortChange}\n />\n )}\n {onOwnershipChange && ownershipFilter && (\n <SegmentedControlGlass\n options={ownershipOptions}\n value={ownershipFilter}\n onChange={handleOwnershipChange}\n />\n )}\n </div>\n )}\n </div>\n\n {/* Content */}\n {sortedRepos.length === 0 ? (\n // Empty State\n <div className=\"text-center py-10\">\n <div\n className=\"w-16 h-16 mx-auto mb-3 rounded-2xl flex items-center justify-center\"\n style={emptyContainerStyles}\n >\n <FolderGit2 className=\"w-8 h-8\" style={{ color: \"var(--text-muted)\" }} />\n </div>\n <p\n className=\"text-sm\"\n style={{ color: \"var(--text-muted)\" }}\n >\n No repositories found\n </p>\n {onClearFilters && (\n <button\n onClick={onClearFilters}\n className=\"mt-2 text-sm underline transition-colors hover:opacity-80\"\n style={{ color: \"var(--text-accent)\" }}\n >\n Clear filters\n </button>\n )}\n </div>\n ) : (\n // Repository List\n <div className=\"space-y-2\">\n {sortedRepos.map((repo, index) => (\n <RepositoryCardGlass\n key={repo.name}\n name={repo.name}\n languages={repo.languages}\n commits={repo.commits}\n contribution={repo.contribution}\n stars={repo.stars}\n flagType={repo.flagType}\n issues={repo.issues}\n expanded={expandedIndex === index}\n onToggle={() => setExpandedIndex(expandedIndex === index ? null : index)}\n />\n ))}\n </div>\n )}\n </GlassCard>\n );\n }\n);\n\nProjectsListGlass.displayName = \"ProjectsListGlass\";\n"
19
+ }
20
+ ],
21
+ "categories": [
22
+ "sections"
23
+ ]
24
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "rainbow-progress-glass",
4
+ "type": "registry:component",
5
+ "title": "Rainbow Progress Glass",
6
+ "description": "Rainbow Progress Glass component with glass effects",
7
+ "dependencies": [
8
+ "react"
9
+ ],
10
+ "registryDependencies": [
11
+ "cn"
12
+ ],
13
+ "files": [
14
+ {
15
+ "path": "components/glass/specialized/rainbow-progress-glass.tsx",
16
+ "type": "registry:component",
17
+ "content": "// ========================================\n// RAINBOW PROGRESS GLASS COMPONENT\n// Animated rainbow gradient progress bar\n// ========================================\n\nimport { forwardRef, type CSSProperties } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport \"@/glass-theme.css\";\n\nexport type RainbowProgressSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface RainbowProgressGlassProps extends React.HTMLAttributes<HTMLDivElement> {\n readonly value: number;\n readonly size?: RainbowProgressSize;\n readonly showGlow?: boolean;\n}\n\nconst sizeClasses: Record<RainbowProgressSize, string> = {\n sm: \"h-2.5 md:h-2\",\n md: \"h-3.5 md:h-3\",\n lg: \"h-[1.125rem] md:h-4\",\n xl: \"h-6 md:h-5\",\n};\n\nexport const RainbowProgressGlass = forwardRef<HTMLDivElement, RainbowProgressGlassProps>(\n ({ value, size = \"lg\", showGlow = true, className, ...props }, ref) => {\n const clampedValue = Math.min(100, Math.max(0, value));\n\n const trackStyles: CSSProperties = {\n background: \"var(--progress-bg)\",\n };\n\n const fillStyles: CSSProperties = {\n width: `${clampedValue}%`,\n background:\n \"linear-gradient(90deg, #f59e0b, #fbbf24, #84cc16, #22c55e, #14b8a6, #06b6d4, #3b82f6)\",\n boxShadow: showGlow ? \"var(--rainbow-glow)\" : \"none\",\n animation: showGlow ? \"var(--rainbow-animation)\" : \"none\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\"rounded-full overflow-hidden\", sizeClasses[size], className)}\n style={trackStyles}\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Rainbow progress: ${clampedValue}%`}\n {...props}\n >\n <div\n className=\"h-full rounded-full transition-all duration-1000\"\n style={fillStyles}\n />\n </div>\n );\n }\n);\n\nRainbowProgressGlass.displayName = \"RainbowProgressGlass\";\n"
18
+ }
19
+ ],
20
+ "categories": [
21
+ "specialized"
22
+ ]
23
+ }
@@ -0,0 +1,337 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry.json",
3
+ "name": "shadcn-glass-ui",
4
+ "homepage": "https://yhooi2.github.io/shadcn-glass-ui-library/",
5
+ "items": [
6
+ {
7
+ "name": "tooltip-glass",
8
+ "type": "registry:ui",
9
+ "title": "Tooltip Glass",
10
+ "description": "Glass-themed tooltip with:"
11
+ },
12
+ {
13
+ "name": "toggle-glass",
14
+ "type": "registry:ui",
15
+ "title": "Toggle Glass",
16
+ "description": "Glass-themed toggle switch with:"
17
+ },
18
+ {
19
+ "name": "tabs-glass",
20
+ "type": "registry:ui",
21
+ "title": "Tabs Glass",
22
+ "description": "TabsGlass Component (Compound API only)"
23
+ },
24
+ {
25
+ "name": "slider-glass",
26
+ "type": "registry:ui",
27
+ "title": "Slider Glass",
28
+ "description": "Glass-themed range slider with:"
29
+ },
30
+ {
31
+ "name": "skeleton-glass",
32
+ "type": "registry:ui",
33
+ "title": "Skeleton Glass",
34
+ "description": "Glass-themed loading skeleton with:"
35
+ },
36
+ {
37
+ "name": "popover-glass",
38
+ "type": "registry:ui",
39
+ "title": "Popover Glass",
40
+ "description": "Floating glass-themed container for tooltips, dropdowns, and overlays with:"
41
+ },
42
+ {
43
+ "name": "notification-glass",
44
+ "type": "registry:ui",
45
+ "title": "Notification Glass",
46
+ "description": "Glass-themed toast notification with:"
47
+ },
48
+ {
49
+ "name": "modal-glass",
50
+ "type": "registry:ui",
51
+ "title": "Modal Glass",
52
+ "description": "ModalGlass Component (Compound API only)"
53
+ },
54
+ {
55
+ "name": "input-glass",
56
+ "type": "registry:ui",
57
+ "title": "Input Glass",
58
+ "description": "Glass-themed input with:"
59
+ },
60
+ {
61
+ "name": "glass-card",
62
+ "type": "registry:ui",
63
+ "title": "Glass Card",
64
+ "description": "Glass-themed container with:"
65
+ },
66
+ {
67
+ "name": "dropdown-glass",
68
+ "type": "registry:ui",
69
+ "title": "Dropdown Glass",
70
+ "description": "Glass-themed dropdown menu based on Radix UI with:"
71
+ },
72
+ {
73
+ "name": "combobox-glass",
74
+ "type": "registry:ui",
75
+ "title": "Combobox Glass",
76
+ "description": "Glass-themed combobox (searchable select) with:"
77
+ },
78
+ {
79
+ "name": "circular-progress-glass",
80
+ "type": "registry:ui",
81
+ "title": "Circular Progress Glass",
82
+ "description": "SVG-based circular progress indicator with:"
83
+ },
84
+ {
85
+ "name": "checkbox-glass",
86
+ "type": "registry:ui",
87
+ "title": "Checkbox Glass",
88
+ "description": "Glass-themed checkbox with:"
89
+ },
90
+ {
91
+ "name": "button-glass",
92
+ "type": "registry:ui",
93
+ "title": "Button Glass",
94
+ "description": "Glass-themed button with:"
95
+ },
96
+ {
97
+ "name": "badge-glass",
98
+ "type": "registry:ui",
99
+ "title": "Badge Glass",
100
+ "description": "Glass-themed badge with:"
101
+ },
102
+ {
103
+ "name": "avatar-glass",
104
+ "type": "registry:ui",
105
+ "title": "Avatar Glass",
106
+ "description": "Glass-themed avatar with:"
107
+ },
108
+ {
109
+ "name": "alert-glass",
110
+ "type": "registry:ui",
111
+ "title": "Alert Glass",
112
+ "description": "Glass-themed alert with:"
113
+ },
114
+ {
115
+ "name": "status-indicator-glass",
116
+ "type": "registry:component",
117
+ "title": "Status Indicator Glass",
118
+ "description": "Status Indicator Glass component with glass effects"
119
+ },
120
+ {
121
+ "name": "segmented-control-glass",
122
+ "type": "registry:component",
123
+ "title": "Segmented Control Glass",
124
+ "description": "Segmented Control Glass component with glass effects"
125
+ },
126
+ {
127
+ "name": "rainbow-progress-glass",
128
+ "type": "registry:component",
129
+ "title": "Rainbow Progress Glass",
130
+ "description": "Rainbow Progress Glass component with glass effects"
131
+ },
132
+ {
133
+ "name": "progress-glass",
134
+ "type": "registry:component",
135
+ "title": "Progress Glass",
136
+ "description": "Glass-themed progress bar with:"
137
+ },
138
+ {
139
+ "name": "profile-avatar-glass",
140
+ "type": "registry:component",
141
+ "title": "Profile Avatar Glass",
142
+ "description": "Profile Avatar Glass component with glass effects"
143
+ },
144
+ {
145
+ "name": "language-bar-glass",
146
+ "type": "registry:component",
147
+ "title": "Language Bar Glass",
148
+ "description": "Language Bar Glass component with glass effects"
149
+ },
150
+ {
151
+ "name": "flag-alert-glass",
152
+ "type": "registry:component",
153
+ "title": "Flag Alert Glass",
154
+ "description": "Flag Alert Glass component with glass effects"
155
+ },
156
+ {
157
+ "name": "base-progress-glass",
158
+ "type": "registry:component",
159
+ "title": "Base Progress Glass",
160
+ "description": "Base progress bar component used as foundation for:"
161
+ },
162
+ {
163
+ "name": "trust-score-card-glass",
164
+ "type": "registry:block",
165
+ "title": "Trust Score Card Glass",
166
+ "description": "Trust Score Card Glass component with glass effects"
167
+ },
168
+ {
169
+ "name": "projects-list-glass",
170
+ "type": "registry:block",
171
+ "title": "Projects List Glass",
172
+ "description": "Projects List Glass component with glass effects"
173
+ },
174
+ {
175
+ "name": "profile-header-glass",
176
+ "type": "registry:block",
177
+ "title": "Profile Header Glass",
178
+ "description": "Profile Header Glass component with glass effects"
179
+ },
180
+ {
181
+ "name": "header-nav-glass",
182
+ "type": "registry:block",
183
+ "title": "Header Nav Glass",
184
+ "description": "Header Nav Glass component with glass effects"
185
+ },
186
+ {
187
+ "name": "header-branding-glass",
188
+ "type": "registry:block",
189
+ "title": "Header Branding Glass",
190
+ "description": "Header Branding Glass component with glass effects"
191
+ },
192
+ {
193
+ "name": "flags-section-glass",
194
+ "type": "registry:block",
195
+ "title": "Flags Section Glass",
196
+ "description": "Flags Section Glass component with glass effects"
197
+ },
198
+ {
199
+ "name": "career-stats-glass",
200
+ "type": "registry:block",
201
+ "title": "Career Stats Glass",
202
+ "description": "Career Stats Glass component with glass effects"
203
+ },
204
+ {
205
+ "name": "touch-target",
206
+ "type": "registry:lib",
207
+ "title": "Touch Target",
208
+ "description": "Ensures minimum touch target size compliance with Apple Human Interface Guidelines.\n * Wraps interactive elements to guarantee accessibility on touch devices.\n *\n * Apple HIG recommends minimum 44×44pt (44×44px) touch targets.\n * Material Design recommends 48×48dp for better accessibility.\n *\n * @see https://developer.apple.com/design/human-interface-guidelines/layout"
209
+ },
210
+ {
211
+ "name": "interactive-card",
212
+ "type": "registry:lib",
213
+ "title": "Interactive Card",
214
+ "description": "Unified wrapper for card components with hover animations and glass effects.\n * Eliminates hover state duplication in MetricCardGlass, YearCardGlass,\n * AICardGlass, RepositoryCardGlass, and other card components.\n *\n * Features:"
215
+ },
216
+ {
217
+ "name": "form-field-wrapper",
218
+ "type": "registry:lib",
219
+ "title": "Form Field Wrapper",
220
+ "description": "Unified wrapper for form controls with label, validation states, and messages.\n * Eliminates code duplication across InputGlass, SliderGlass, ComboBoxGlass, etc.\n *\n * Handles:"
221
+ },
222
+ {
223
+ "name": "year-card-glass",
224
+ "type": "registry:block",
225
+ "title": "Year Card Glass",
226
+ "description": "Year Card Glass component with glass effects"
227
+ },
228
+ {
229
+ "name": "user-stats-line-glass",
230
+ "type": "registry:block",
231
+ "title": "User Stats Line Glass",
232
+ "description": "User Stats Line Glass component with glass effects"
233
+ },
234
+ {
235
+ "name": "user-info-glass",
236
+ "type": "registry:block",
237
+ "title": "User Info Glass",
238
+ "description": "User Info Glass component with glass effects"
239
+ },
240
+ {
241
+ "name": "trust-score-display-glass",
242
+ "type": "registry:block",
243
+ "title": "Trust Score Display Glass",
244
+ "description": "Trust Score Display Glass component with glass effects"
245
+ },
246
+ {
247
+ "name": "repository-metadata-glass",
248
+ "type": "registry:block",
249
+ "title": "Repository Metadata Glass",
250
+ "description": "Repository Metadata Glass component with glass effects"
251
+ },
252
+ {
253
+ "name": "repository-header-glass",
254
+ "type": "registry:block",
255
+ "title": "Repository Header Glass",
256
+ "description": "Repository Header Glass component with glass effects"
257
+ },
258
+ {
259
+ "name": "repository-card-glass",
260
+ "type": "registry:block",
261
+ "title": "Repository Card Glass",
262
+ "description": "Repository Card Glass component with glass effects"
263
+ },
264
+ {
265
+ "name": "metrics-grid-glass",
266
+ "type": "registry:block",
267
+ "title": "Metrics Grid Glass",
268
+ "description": "Metrics Grid Glass component with glass effects"
269
+ },
270
+ {
271
+ "name": "metric-card-glass",
272
+ "type": "registry:block",
273
+ "title": "Metric Card Glass",
274
+ "description": "Metric Card Glass component with glass effects"
275
+ },
276
+ {
277
+ "name": "contribution-metrics-glass",
278
+ "type": "registry:block",
279
+ "title": "Contribution Metrics Glass",
280
+ "description": "Contribution Metrics Glass component with glass effects"
281
+ },
282
+ {
283
+ "name": "circular-metric-glass",
284
+ "type": "registry:block",
285
+ "title": "Circular Metric Glass",
286
+ "description": "CircularMetricGlass - Compact circular progress metric display"
287
+ },
288
+ {
289
+ "name": "career-stats-header-glass",
290
+ "type": "registry:block",
291
+ "title": "Career Stats Header Glass",
292
+ "description": "Career Stats Header Glass component with glass effects"
293
+ },
294
+ {
295
+ "name": "ai-card-glass",
296
+ "type": "registry:block",
297
+ "title": "Ai Card Glass",
298
+ "description": "Ai Card Glass component with glass effects"
299
+ },
300
+ {
301
+ "name": "theme-toggle-glass",
302
+ "type": "registry:component",
303
+ "title": "Theme Toggle Glass",
304
+ "description": "Theme Toggle Glass component with glass effects"
305
+ },
306
+ {
307
+ "name": "stat-item-glass",
308
+ "type": "registry:component",
309
+ "title": "Stat Item Glass",
310
+ "description": "Stat Item Glass component with glass effects"
311
+ },
312
+ {
313
+ "name": "sort-dropdown-glass",
314
+ "type": "registry:component",
315
+ "title": "Sort Dropdown Glass",
316
+ "description": "Atomic component for sorting controls with:"
317
+ },
318
+ {
319
+ "name": "search-box-glass",
320
+ "type": "registry:component",
321
+ "title": "Search Box Glass",
322
+ "description": "Search Box Glass component with glass effects"
323
+ },
324
+ {
325
+ "name": "icon-button-glass",
326
+ "type": "registry:component",
327
+ "title": "Icon Button Glass",
328
+ "description": "Icon Button Glass component with glass effects"
329
+ },
330
+ {
331
+ "name": "expandable-header-glass",
332
+ "type": "registry:component",
333
+ "title": "Expandable Header Glass",
334
+ "description": "Expandable Header Glass component with glass effects"
335
+ }
336
+ ]
337
+ }