Download web/src/app/globals.css from zlcy/abc: direct link, hf CLI and curl.
- Browser
- Download file 13.2 kB
-
https://huggingface.co/spaces/zlcy/abc/resolve/main/web/src/app/globals.css
- Command line
-
hf download hf://spaces/zlcy/abc/web/src/app/globals.css
-
curl -L -o globals.css https://huggingface.co/spaces/zlcy/abc/resolve/main/web/src/app/globals.css
13.2 kB
| @import "tailwindcss"; | |
| @import "tw-animate-css"; | |
| @import "@annotorious/react/annotorious-react.css"; | |
| @custom-variant dark (&:is(.dark *)); | |
| @theme inline { | |
| --color-background: var(--background); | |
| --color-foreground: var(--foreground); | |
| --font-sans: var(--font-geist-sans); | |
| --font-mono: var(--font-geist-mono); | |
| --color-sidebar-ring: var(--sidebar-ring); | |
| --color-sidebar-border: var(--sidebar-border); | |
| --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); | |
| --color-sidebar-accent: var(--sidebar-accent); | |
| --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); | |
| --color-sidebar-primary: var(--sidebar-primary); | |
| --color-sidebar-foreground: var(--sidebar-foreground); | |
| --color-sidebar: var(--sidebar); | |
| --color-chart-5: var(--chart-5); | |
| --color-chart-4: var(--chart-4); | |
| --color-chart-3: var(--chart-3); | |
| --color-chart-2: var(--chart-2); | |
| --color-chart-1: var(--chart-1); | |
| --color-ring: var(--ring); | |
| --color-input: var(--input); | |
| --color-border: var(--border); | |
| --color-destructive: var(--destructive); | |
| --color-accent-foreground: var(--accent-foreground); | |
| --color-accent: var(--accent); | |
| --color-muted-foreground: var(--muted-foreground); | |
| --color-muted: var(--muted); | |
| --color-secondary-foreground: var(--secondary-foreground); | |
| --color-secondary: var(--secondary); | |
| --color-primary-foreground: var(--primary-foreground); | |
| --color-primary: var(--primary); | |
| --color-popover-foreground: var(--popover-foreground); | |
| --color-popover: var(--popover); | |
| --color-card-foreground: var(--card-foreground); | |
| --color-card: var(--card); | |
| --radius-sm: calc(var(--radius) - 4px); | |
| --radius-md: calc(var(--radius) - 2px); | |
| --radius-lg: var(--radius); | |
| --radius-xl: calc(var(--radius) + 4px); | |
| } | |
| :root { | |
| --radius: 0.625rem; | |
| --ease-out-ui: cubic-bezier(0.23, 1, 0.32, 1); | |
| --ease-in-out-ui: cubic-bezier(0.77, 0, 0.175, 1); | |
| --background: oklch(1 0 0); | |
| --foreground: oklch(0.145 0 0); | |
| --card: oklch(1 0 0); | |
| --card-foreground: oklch(0.145 0 0); | |
| --popover: oklch(1 0 0); | |
| --popover-foreground: oklch(0.145 0 0); | |
| --primary: oklch(0.205 0 0); | |
| --primary-foreground: oklch(0.985 0 0); | |
| --secondary: oklch(0.97 0 0); | |
| --secondary-foreground: oklch(0.205 0 0); | |
| --muted: oklch(0.97 0 0); | |
| --muted-foreground: oklch(0.556 0 0); | |
| --accent: oklch(0.97 0 0); | |
| --accent-foreground: oklch(0.205 0 0); | |
| --destructive: oklch(0.577 0.245 27.325); | |
| --border: oklch(0.922 0 0); | |
| --input: oklch(0.922 0 0); | |
| --ring: oklch(0.708 0 0); | |
| --chart-1: oklch(0.646 0.222 41.116); | |
| --chart-2: oklch(0.6 0.118 184.704); | |
| --chart-3: oklch(0.398 0.07 227.392); | |
| --chart-4: oklch(0.828 0.189 84.429); | |
| --chart-5: oklch(0.769 0.188 70.08); | |
| --sidebar: oklch(0.985 0 0); | |
| --sidebar-foreground: oklch(0.145 0 0); | |
| --sidebar-primary: oklch(0.205 0 0); | |
| --sidebar-primary-foreground: oklch(0.985 0 0); | |
| --sidebar-accent: oklch(0.97 0 0); | |
| --sidebar-accent-foreground: oklch(0.205 0 0); | |
| --sidebar-border: oklch(0.922 0 0); | |
| --sidebar-ring: oklch(0.708 0 0); | |
| } | |
| .dark { | |
| --background: oklch(0.145 0 0); | |
| --foreground: oklch(0.985 0 0); | |
| --card: oklch(0.205 0 0); | |
| --card-foreground: oklch(0.985 0 0); | |
| --popover: oklch(0.205 0 0); | |
| --popover-foreground: oklch(0.985 0 0); | |
| --primary: oklch(0.922 0 0); | |
| --primary-foreground: oklch(0.205 0 0); | |
| --secondary: oklch(0.269 0 0); | |
| --secondary-foreground: oklch(0.985 0 0); | |
| --muted: oklch(0.269 0 0); | |
| --muted-foreground: oklch(0.708 0 0); | |
| --accent: oklch(0.269 0 0); | |
| --accent-foreground: oklch(0.985 0 0); | |
| --destructive: oklch(0.704 0.191 22.216); | |
| --border: oklch(1 0 0 / 10%); | |
| --input: oklch(1 0 0 / 15%); | |
| --ring: oklch(0.556 0 0); | |
| --chart-1: oklch(0.488 0.243 264.376); | |
| --chart-2: oklch(0.696 0.17 162.48); | |
| --chart-3: oklch(0.769 0.188 70.08); | |
| --chart-4: oklch(0.627 0.265 303.9); | |
| --chart-5: oklch(0.645 0.246 16.439); | |
| --sidebar: oklch(0.205 0 0); | |
| --sidebar-foreground: oklch(0.985 0 0); | |
| --sidebar-primary: oklch(0.488 0.243 264.376); | |
| --sidebar-primary-foreground: oklch(0.985 0 0); | |
| --sidebar-accent: oklch(0.269 0 0); | |
| --sidebar-accent-foreground: oklch(0.985 0 0); | |
| --sidebar-border: oklch(1 0 0 / 10%); | |
| --sidebar-ring: oklch(0.556 0 0); | |
| } | |
| @layer base { | |
| * { | |
| @apply border-border outline-ring/50; | |
| } | |
| /* 可点击控件统一手型光标(Tailwind v4 移除了按钮默认的 cursor: pointer) */ | |
| button:not(:disabled), | |
| [role="button"]:not(:disabled), | |
| [role="checkbox"]:not(:disabled), | |
| [role="radio"]:not(:disabled), | |
| [role="switch"]:not(:disabled), | |
| [role="combobox"]:not(:disabled), | |
| [role="tab"]:not(:disabled), | |
| [role="menuitem"]:not(:disabled), | |
| [role="menuitemcheckbox"]:not(:disabled), | |
| [role="menuitemradio"]:not(:disabled), | |
| [role="option"]:not(:disabled), | |
| summary, | |
| label[for] { | |
| cursor: pointer; | |
| } | |
| html, | |
| body { | |
| background: radial-gradient(circle at top left, rgba(255, 255, 255, 0.92), rgba(245, 239, 231, 0.96) 42%, rgba(240, 235, 227, 0.99) 100%); | |
| background-attachment: fixed; | |
| overscroll-behavior: none; | |
| } | |
| body { | |
| @apply text-foreground; | |
| } | |
| } | |
| @layer utilities { | |
| .ui-floating-surface { | |
| opacity: 1; | |
| scale: 1; | |
| transform-origin: var(--ui-transform-origin, bottom center); | |
| transition: opacity 180ms var(--ease-out-ui), scale 180ms var(--ease-out-ui); | |
| @starting-style { | |
| opacity: 0; | |
| scale: 0.97; | |
| } | |
| } | |
| .ui-menu-item { | |
| transition: background-color 140ms ease, color 140ms ease, transform 140ms var(--ease-out-ui); | |
| } | |
| .ui-menu-item:active { | |
| transform: scale(0.985); | |
| } | |
| .animate-spin { | |
| animation-duration: 650ms; | |
| } | |
| .app-page-background { | |
| background: radial-gradient(circle at top left, rgba(255, 255, 255, 0.92), rgba(245, 239, 231, 0.96) 42%, rgba(240, 235, 227, 0.99) 100%); | |
| background-attachment: fixed; | |
| } | |
| .hide-scrollbar { | |
| -ms-overflow-style: none; | |
| scrollbar-width: none; | |
| } | |
| .hide-scrollbar::-webkit-scrollbar { | |
| display: none; | |
| } | |
| .announcement-scrollbar { | |
| scrollbar-color: rgba(120, 113, 108, 0.45) transparent; | |
| scrollbar-width: thin; | |
| } | |
| .announcement-scrollbar::-webkit-scrollbar { | |
| width: 6px; | |
| } | |
| .announcement-scrollbar::-webkit-scrollbar-button, | |
| .announcement-scrollbar::-webkit-scrollbar-button:single-button, | |
| .announcement-scrollbar::-webkit-scrollbar-button:vertical:start:decrement, | |
| .announcement-scrollbar::-webkit-scrollbar-button:vertical:end:increment { | |
| display: none; | |
| width: 0; | |
| height: 0; | |
| background: transparent; | |
| } | |
| .announcement-scrollbar::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| .announcement-scrollbar::-webkit-scrollbar-thumb { | |
| border-radius: 999px; | |
| background: rgba(120, 113, 108, 0.45); | |
| } | |
| .announcement-unread-button { | |
| box-shadow: 0 0 0 1px rgba(244, 63, 94, 0.12), 0 10px 26px -18px rgba(244, 63, 94, 0.55); | |
| } | |
| .announcement-unread-bell { | |
| display: inline-flex; | |
| transform-origin: 50% 50%; | |
| animation: announcement-bell-swing 0.9s ease-in-out infinite; | |
| will-change: transform; | |
| } | |
| .announcement-unread-badge { | |
| transform-origin: center; | |
| animation: announcement-badge-shake 0.9s ease-in-out infinite; | |
| will-change: transform; | |
| } | |
| .announcement-unread-halo { | |
| animation: announcement-unread-halo 2.4s ease-out infinite; | |
| } | |
| @media (prefers-reduced-motion: reduce) { | |
| .ui-floating-surface, | |
| .ui-menu-item { | |
| transition: none; | |
| scale: 1; | |
| transform: none; | |
| } | |
| .announcement-unread-bell, | |
| .announcement-unread-badge, | |
| .announcement-unread-halo { | |
| animation: none; | |
| } | |
| } | |
| } | |
| @keyframes grow { | |
| from { transform: scaleX(0); } | |
| to { transform: scaleX(1); } | |
| } | |
| @keyframes image-sheen { | |
| 0% { transform: translateX(0); opacity: 0; } | |
| 20% { opacity: 1; } | |
| 100% { transform: translateX(320%); opacity: 0; } | |
| } | |
| @keyframes announcement-bell-swing { | |
| 0%, 100% { transform: translateX(0) rotate(0) scale(1); } | |
| 15% { transform: translateX(-3px) rotate(-18deg) scale(1.08); } | |
| 30% { transform: translateX(3px) rotate(18deg) scale(1.08); } | |
| 45% { transform: translateX(-2px) rotate(-12deg) scale(1.05); } | |
| 60% { transform: translateX(2px) rotate(12deg) scale(1.05); } | |
| 75% { transform: translateX(-1px) rotate(-6deg) scale(1.02); } | |
| } | |
| @keyframes announcement-badge-shake { | |
| 0%, 100% { transform: translateX(0) scale(1); } | |
| 20% { transform: translateX(2px) scale(1.12); } | |
| 40% { transform: translateX(-2px) scale(1.12); } | |
| 60% { transform: translateX(1px) scale(1.08); } | |
| 80% { transform: translateX(-1px) scale(1.08); } | |
| } | |
| @keyframes announcement-unread-halo { | |
| 0% { opacity: 0.38; transform: scale(1); } | |
| 70%, 100% { opacity: 0; transform: scale(1.9); } | |
| } | |
| /* App toast polish */ | |
| .app-toaster [data-sonner-toast].app-toast { | |
| width: min(22rem, calc(100vw - 2rem)); | |
| min-height: 3.25rem; | |
| padding: 0.75rem 0.875rem; | |
| gap: 0.625rem; | |
| border: 1px solid rgba(120, 113, 108, 0.18); | |
| border-radius: 1rem; | |
| background: rgba(255, 253, 250, 0.94); | |
| color: rgb(41, 37, 36); | |
| box-shadow: 0 18px 45px -26px rgba(41, 37, 36, 0.45), 0 2px 10px rgba(41, 37, 36, 0.06); | |
| backdrop-filter: blur(18px) saturate(1.12); | |
| -webkit-backdrop-filter: blur(18px) saturate(1.12); | |
| } | |
| .app-toaster [data-sonner-toast].app-toast[data-type="success"] { | |
| border-color: rgba(16, 185, 129, 0.22); | |
| } | |
| .app-toaster [data-sonner-toast].app-toast[data-type="success"] [data-icon] { | |
| color: rgb(16, 185, 129); | |
| } | |
| .app-toaster [data-sonner-toast].app-toast[data-type="success"] .app-toast-title, | |
| .app-toaster [data-sonner-toast].app-toast[data-type="success"] .app-toast-description { | |
| color: rgb(5, 150, 105); | |
| } | |
| .app-toaster [data-sonner-toast].app-toast[data-type="error"] { | |
| border-color: rgba(244, 63, 94, 0.22); | |
| } | |
| .app-toaster .app-toast-title { | |
| color: rgb(41, 37, 36); | |
| font-size: 0.875rem; | |
| font-weight: 650; | |
| line-height: 1.35; | |
| letter-spacing: -0.01em; | |
| } | |
| .app-toaster .app-toast-description { | |
| margin-top: 0.125rem; | |
| color: rgb(120, 113, 108); | |
| font-size: 0.8125rem; | |
| line-height: 1.45; | |
| } | |
| .app-toaster .app-toast-action, | |
| .app-toaster .app-toast-cancel { | |
| border-radius: 0.625rem; | |
| font-weight: 650; | |
| } | |
| .app-toaster .app-toast-close { | |
| border-color: rgba(120, 113, 108, 0.18); | |
| background: rgb(255, 253, 250); | |
| color: rgb(87, 83, 78); | |
| } | |
| @media (max-width: 640px) { | |
| .app-toaster [data-sonner-toast].app-toast { | |
| width: calc(100vw - 2rem); | |
| } | |
| } | |
| @media (prefers-reduced-motion: reduce) { | |
| .app-toaster [data-sonner-toast] { | |
| transition-duration: 0.01ms ; | |
| } | |
| } | |
| /* ===== react-canvas-masker 蒙版编辑器样式 ===== */ | |
| .react-mask-editor-outer { | |
| display: flex; | |
| flex-direction: column; | |
| justify-content: flex-start; | |
| align-items: stretch; | |
| width: 100%; | |
| height: 100%; | |
| min-height: 300px; | |
| margin: 0 auto; | |
| position: relative; | |
| /* Ensure positioning context */ | |
| overflow: hidden; | |
| /* Force each canvas to be a direct child of all-canvases to avoid stacking issues */ | |
| } | |
| .react-mask-editor-outer .react-mask-editor-inner { | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| position: relative; | |
| overflow: hidden; | |
| flex: 1 1 auto; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .react-mask-editor-outer .react-mask-editor-inner .canvas-container { | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| position: relative; | |
| box-sizing: border-box; | |
| width: 100%; | |
| height: 100%; | |
| min-height: 200px; | |
| overflow: hidden; | |
| /* Prevent overflow */ | |
| } | |
| .react-mask-editor-outer .react-mask-editor-inner .all-canvases { | |
| position: relative; | |
| will-change: transform; | |
| touch-action: none; | |
| width: auto; | |
| height: auto; | |
| display: block; | |
| /* Ensure proper display */ | |
| /* Enable hardware acceleration for smoother transforms */ | |
| transform-style: preserve-3d; | |
| backface-visibility: hidden; | |
| -webkit-transform-style: preserve-3d; | |
| -webkit-backface-visibility: hidden; | |
| /* Force GPU rendering */ | |
| transform: translateZ(0); | |
| -webkit-transform: translateZ(0); | |
| } | |
| .react-mask-editor-outer .all-canvases > canvas { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| display: block; | |
| /* Force rendering quality */ | |
| } | |
| .react-mask-editor-outer .react-mask-editor-base-canvas { | |
| z-index: 5; | |
| } | |
| .react-mask-editor-outer .react-mask-editor-mask-canvas { | |
| z-index: 10; | |
| } | |
| .react-mask-editor-outer .react-mask-editor-cursor-canvas { | |
| z-index: 20; | |
| background-color: transparent; | |
| pointer-events: auto ; | |
| /* Override to enable mouse events */ | |
| } | |
| body.panning-active { | |
| cursor: grabbing ; | |
| user-select: none; | |
| } | |
| .react-mask-editor-inner[style*="cursor: zoom-in"] { | |
| cursor: zoom-in; | |
| } | |
| @supports not (cursor: zoom-in) { | |
| .react-mask-editor-inner[style*="cursor: zoom-in"] { | |
| cursor: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"><circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"black\" stroke-width=\"1.5\" fill=\"white\" fill-opacity=\"0.5\"/><line x1=\"13\" y1=\"13\" x2=\"18\" y2=\"18\" stroke=\"black\" stroke-width=\"1.5\"/><line x1=\"6\" y1=\"8\" x2=\"10\" y2=\"8\" stroke=\"black\" stroke-width=\"1.5\"/><line x1=\"8\" y1=\"6\" x2=\"8\" y2=\"10\" stroke=\"black\" stroke-width=\"1.5\"/></svg>") 10 10, auto; | |
| } | |
| } | |