@import "tailwindcss"; @source "../public"; @theme { --font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; --color-catalog-surface: #f4f6f8; --color-catalog-panel: #22272e; --color-catalog-panel-soft: #2d333b; --color-catalog-accent: #7ee34d; --color-catalog-accent-text: #10220b; --color-catalog-danger: #e02424; --color-catalog-focus: #2f6fed; } @layer base { *, ::before, ::after { box-sizing: border-box; } html { color-scheme: light; } html.dark { color-scheme: dark; } body { margin: 0; min-height: 100vh; font-family: var(--font-sans); color: #15181c; background: var(--color-catalog-surface); } button, input, select { font: inherit; } } @layer components { .catalog-screen { @apply relative grid min-h-screen bg-catalog-surface pl-72; --secondary-track: minmax(240px,292px); --workspace-track: minmax(0,1fr); grid-template-columns: var(--secondary-track) var(--workspace-track); } .catalog-screen.sidebar-collapsed { @apply pl-11; } .catalog-screen.secondary-collapsed { --secondary-track: 44px; } .catalog-screen.workspace-collapsed { --workspace-track: 44px; } .sidebar-drawer { @apply fixed inset-y-0 left-0 z-40 flex w-72 min-h-screen flex-col gap-1.5 overflow-y-auto bg-slate-900 p-1.5 text-[11px] text-slate-200 shadow-xl transition-transform duration-200 ease-out; } .panel-header, .sidebar-drawer-header, .column-header { @apply box-border flex h-7 min-h-7 items-center justify-between gap-1 border-b border-slate-700 bg-slate-900 px-1 text-[10px] font-semibold uppercase tracking-wide text-slate-300; } .sidebar-drawer-header { @apply -mx-1.5 -mt-1.5 mb-1.5; } .sidebar-drawer-title { @apply px-1 text-slate-300; } .sidebar-close-button, .sidebar-open-button { @apply inline-flex h-7 w-7 items-center justify-center rounded border border-slate-700 bg-slate-800 text-slate-200 shadow-sm transition hover:border-slate-500 hover:bg-slate-700; } .sidebar-close-button .sidebar-icon, .sidebar-open-button .sidebar-icon { @apply h-4 w-4; } .panel-control-button { @apply inline-flex h-5 w-5 shrink-0 items-center justify-center rounded border border-slate-400 bg-white text-sm leading-none text-slate-700 shadow-sm transition hover:border-slate-500 hover:bg-slate-200 focus:outline-none focus:ring-2 focus:ring-catalog-focus/25; } .sidebar-open-button { @apply fixed left-2 top-2 z-30; } .sidebar-overlay { @apply fixed inset-0 z-30 bg-slate-950/50; } .sidebar-overlay[hidden] { display: none; } .sidebar-drawer[aria-hidden="true"] { @apply -translate-x-full; } .sidebar-section { @apply border-t border-slate-700 pt-1; } .drawer-trigger { @apply flex min-h-8 w-full items-center gap-2 rounded border border-slate-700 bg-slate-800 px-2 text-left text-[11px] font-semibold text-slate-100 transition hover:border-slate-500 hover:bg-slate-700; } .drawer-trigger .drawer-chevron { @apply inline-flex h-2 w-2 border-b-2 border-r-2 text-[0px] leading-none; } .drawer-trigger .drawer-chevron { @apply ml-auto rotate-45 text-slate-300; } .drawer-trigger[aria-expanded="true"] .drawer-chevron { @apply rotate-[225deg]; } .parser-drawer[hidden] { display: none; } .sidebar-icon { @apply inline-flex h-4 w-4 shrink-0 items-center justify-center text-sm leading-none text-slate-300; } .action-button { @apply flex items-center justify-center gap-1.5; } .action-button .sidebar-icon { @apply text-slate-400; } .sidebar-footer { @apply mt-auto grid gap-1 border-t border-slate-700 pt-2; } .app-status { @apply rounded border border-slate-700 bg-slate-950 p-1 text-[10px] leading-tight text-slate-100; } .safe-mode, #modePill { @apply inline-block rounded bg-slate-100 px-1 py-0.5 text-[10px] font-semibold text-slate-800; } #databaseStatus.database-error { @apply bg-red-100 text-red-700; } .record-id { @apply flex h-10 items-center justify-center rounded border border-lime-700 bg-catalog-accent text-[26px] font-bold leading-none text-catalog-accent-text; } .arrow-row { @apply grid grid-cols-2 gap-1; } .arrow-button, .action-button, .input-like { @apply w-full rounded border border-slate-700 bg-slate-800 text-center text-slate-200 shadow-sm transition; } .arrow-button, .action-button { @apply min-h-7 px-1 text-[11px]; } .arrow-button { @apply relative text-slate-100; } .arrow-button::before, .column-toggle::before { content: ""; @apply block h-2 w-2 border-b-2 border-r-2; } .arrow-button::before { @apply absolute left-1/2 top-1/2 h-2 w-2 -translate-x-1/2 -translate-y-1/2 border-b-2 border-r-2; } .arrow-button-prev::before { @apply rotate-[135deg]; } .arrow-button-next::before { @apply rotate-[-45deg]; } .parser-actions { @apply grid gap-1; } .parser-actions .action-button { @apply min-h-7; } .action-button.primary { @apply min-h-8 font-semibold; } .arrow-button:hover:not(:disabled), .action-button:hover:not(:disabled) { @apply border-slate-500 bg-slate-700 text-white; } .arrow-button:disabled, .action-button:disabled { @apply cursor-not-allowed opacity-50; } .input-like { @apply h-7 px-1 text-[11px]; } .select-control { @apply relative w-full; } .select-control .input-like { @apply appearance-none pr-7; } .select-chevron { @apply pointer-events-none absolute right-3 top-1/2 h-2 w-2 -translate-y-1/2 rotate-45 border-b-2 border-r-2 text-slate-200; } .native-manufacturer-select { @apply hidden; } .manufacturer-picker { @apply relative; } .manufacturer-trigger { @apply flex h-7 w-full items-center justify-between rounded border border-slate-700 bg-slate-800 px-2 text-[11px] text-slate-200 shadow-sm; } .manufacturer-trigger:hover { @apply border-slate-500 bg-slate-700; } .manufacturer-trigger[aria-expanded="true"] { @apply border-catalog-focus ring-2 ring-catalog-focus/25; } .manufacturer-trigger span:first-child { @apply min-w-0 truncate; } .manufacturer-trigger .select-chevron { @apply static ml-2 translate-y-0; } .manufacturer-menu { @apply absolute left-0 right-0 top-full z-50 mt-1 rounded border border-slate-300 bg-white p-1 shadow-xl; } .manufacturer-menu[hidden] { display: none; } .manufacturer-search { @apply mb-1 h-7 w-full rounded border border-slate-300 px-2 text-[11px] text-slate-800 outline-none focus:border-catalog-focus focus:ring-2 focus:ring-catalog-focus/25; } .manufacturer-options { @apply max-h-60 overflow-y-auto; } .manufacturer-option { @apply block min-h-7 w-full truncate rounded px-2 py-1 text-left text-[11px] text-slate-700 hover:bg-slate-100; } .manufacturer-option[aria-selected="true"] { @apply bg-slate-200 font-medium text-slate-900; } .manufacturer-empty { @apply px-2 py-2 text-[11px] text-slate-500; } #scanInput { @apply bg-slate-700 placeholder:text-slate-400; } .input-like:focus { @apply border-catalog-focus outline-none ring-2 ring-catalog-focus/25; } .picture-slot { @apply aspect-square w-full overflow-hidden rounded border border-dashed border-slate-500 bg-catalog-panel-soft p-1 text-center text-[11px] text-slate-200; } .picture-slot img { @apply h-full w-full object-contain; } .mapping-box { @apply rounded border border-slate-500 bg-catalog-panel-soft; } .mapping-details summary { @apply grid cursor-pointer grid-cols-[minmax(0,1fr)_22px] items-center px-1 py-1 list-none; } .mapping-details summary::-webkit-details-marker { display: none; } .mapping-toggle::before { content: "›"; @apply inline-block text-center text-lg leading-none text-slate-100; } .mapping-details[open] .mapping-toggle::before { content: "⌄"; } .mapping-state { @apply block truncate rounded px-1 py-0.5 text-[10px] font-normal; } .mapping-state.is-ready { @apply bg-slate-100 text-slate-800; } .mapping-state.is-missing { @apply bg-red-100 text-red-700; } .mapping-list { @apply grid gap-0.5 px-1 pb-1; } .mapping-source-row { @apply grid grid-cols-[minmax(0,1fr)_auto] items-center gap-1 rounded bg-slate-100 px-1 py-0.5 text-[10px] text-slate-800; } .mapping-source-row.is-disabled { @apply opacity-50; } .mapping-source-name { @apply truncate; } .mapping-source-status { @apply rounded px-1 text-[9px] font-semibold; } .mapping-source-status.is-ok { @apply bg-emerald-100 text-emerald-700; } .mapping-source-status.is-bad { @apply bg-red-100 text-red-700; } .mapping-source-status.is-muted { @apply bg-slate-200 text-slate-600; } .secondary-panel { @apply min-w-0 border-r border-slate-400 bg-slate-300; } .column-header { @apply min-w-0; } .column-toggle { @apply inline-flex h-5 w-5 shrink-0 items-center justify-center rounded border border-slate-400 bg-white text-[0px] leading-none text-slate-700 shadow-sm transition hover:border-slate-500 hover:bg-slate-200 focus:outline-none focus:ring-2 focus:ring-catalog-focus/25; } #secondaryPanelToggle[aria-label="Collapse product details"]::before, #mainWorkspaceToggle[aria-label="Expand main workspace"]::before { transform: rotate(135deg); } #secondaryPanelToggle[aria-label="Expand product details"]::before, #mainWorkspaceToggle[aria-label="Collapse main workspace"]::before { transform: rotate(-45deg); } .secondary-panel .field-grid { @apply overflow-hidden; } .secondary-collapsed .secondary-panel .column-header { @apply h-full flex-col justify-start py-1; writing-mode: vertical-rl; } .secondary-collapsed .secondary-panel .column-header .column-toggle, .workspace-collapsed .main-workspace .workspace-header .column-toggle { writing-mode: horizontal-tb; } .secondary-collapsed .secondary-panel .field-grid { display: none; } .workspace-collapsed .main-workspace .workspace-header { @apply h-full flex-col justify-start py-1; writing-mode: vertical-rl; } .workspace-collapsed .main-workspace .workspace-header span, .workspace-collapsed .main-workspace .table-wrap { display: none; } .field-grid { @apply grid grid-cols-[132px_minmax(0,168px)] content-start; } .field-label, .field-value { @apply min-h-[22px] border-b border-slate-300 px-1 py-0.5 text-[11px] leading-tight; } .field-label { @apply bg-slate-200 text-slate-800; } .field-value { @apply bg-teal-50 text-right text-slate-900; } .field-value[data-field="manufacturer_name"] { @apply font-medium; } .main-workspace { @apply min-w-0 overflow-hidden bg-catalog-surface; } .data-panel { @apply min-w-0 overflow-hidden bg-catalog-surface; } .table-wrap { @apply h-full overflow-auto; } .variant-grid { @apply min-w-0 text-[11px]; min-width: var(--variant-min-width, 820px); } .variant-header, .variant-row { @apply grid; grid-template-columns: var(--variant-columns); } .variant-header { @apply sticky top-0 z-10; } .variant-header-cell { @apply h-[22px] whitespace-nowrap border-b border-r border-slate-300 bg-slate-200 px-1 py-0.5 font-medium text-slate-800; } .variant-row { @apply min-h-[22px] border-b border-slate-300; } .variant-row:nth-child(even) { @apply bg-slate-100; } .variant-row:hover { @apply bg-slate-200; } .variant-cell { @apply min-w-0 whitespace-nowrap border-r border-slate-300 px-1 py-0.5 text-center text-slate-800; } .variant-cell[data-label=""] { @apply p-0; } .empty-row { @apply py-4 text-center text-slate-500; } .variant-cell.problem-ean { @apply bg-red-600 font-semibold text-white; } .modal-backdrop { @apply fixed inset-0 z-50 flex items-center justify-center bg-slate-900/50 p-4; } .modal-backdrop[hidden] { display: none; } .suggested-dialog, .source-dialog, .settings-dialog { @apply max-h-[90vh] w-full overflow-hidden rounded-lg border border-slate-300 bg-slate-50 shadow-2xl; } .suggested-dialog { @apply max-w-2xl; } .source-dialog { @apply max-w-3xl; } .settings-dialog { @apply max-w-md; } .suggested-header { @apply flex items-center justify-between border-b border-slate-300 bg-slate-200 px-3 py-2; } .suggested-header h2 { @apply m-0 text-sm font-semibold text-slate-800; } .modal-close, .settings-test-button { @apply rounded border border-slate-300 bg-white px-2 py-1 text-[11px] text-slate-800 shadow-sm hover:bg-slate-100; } .suggested-list, .source-list, .settings-content { @apply max-h-[calc(90vh-48px)] overflow-y-auto p-2; } .settings-content { @apply grid gap-2; } .settings-group { @apply m-0 rounded border border-slate-300 p-2; } .settings-group legend { @apply px-1 text-xs font-semibold text-slate-700; } .settings-option { @apply flex items-center gap-1 py-0.5 text-[11px] text-slate-700; } .settings-option input { @apply accent-catalog-focus; } .settings-option input:disabled + span { @apply text-slate-400; } .local-db-fields { @apply grid gap-1; } .local-db-fields[hidden] { display: none; } .settings-field { @apply grid grid-cols-[72px_minmax(0,1fr)] items-center gap-2 text-[11px] text-slate-700; } .settings-field input { @apply min-w-0 rounded border border-slate-300 bg-white px-1 py-1 text-[11px]; } .settings-select { @apply min-w-0 rounded border border-slate-300 bg-white px-1 py-1 text-[11px] text-slate-800; } .settings-note, .settings-permissions { @apply m-0 text-[10px] leading-tight text-slate-500; } .settings-permissions { @apply grid gap-0.5; } .connection-ok { @apply text-emerald-700; } .connection-error { @apply text-red-700; } .suggested-row { @apply grid grid-cols-[40px_minmax(0,1fr)_auto] items-center gap-2 border-b border-slate-200 px-1 py-1 text-[11px]; } .suggested-row:nth-child(even) { @apply bg-slate-100; } .suggested-row img { @apply h-9 w-9 object-contain; } .suggested-id, .suggested-active { @apply text-slate-500; } .suggested-name, .suggested-reference { @apply min-w-0 truncate; } .suggested-pick, .source-row-action, .source-picture-action { @apply rounded border border-slate-300 bg-white px-1.5 py-0.5 text-[10px] hover:bg-slate-100; } .source-section { @apply mb-2 overflow-hidden rounded border border-slate-300; } .source-section-header, .source-row { @apply flex items-center justify-between gap-2 border-b border-slate-200 px-2 py-1 text-[11px]; } .source-section-header { @apply bg-slate-200 font-semibold; } .source-section-actions { @apply flex items-center gap-1; } .source-row { @apply bg-white hover:bg-slate-100; } .source-row-title { @apply min-w-0 flex-1 truncate; } .source-status, .source-row-action { @apply shrink-0 rounded px-1 text-[10px]; } .source-status.is-ok { @apply bg-emerald-100 text-emerald-700; } .source-status.is-muted { @apply bg-slate-200 text-slate-600; } .picture-candidate { @apply grid grid-cols-[72px_minmax(0,1fr)] items-center gap-2 border-b border-slate-200 p-1 text-[10px]; } .picture-candidate img { @apply h-16 w-[72px] object-contain; } .picture-candidate span { @apply min-w-0 truncate; } @media (max-width: 980px) { .catalog-screen { @apply flex flex-col pl-0; } .catalog-screen.sidebar-collapsed { @apply pl-0; } .sidebar-drawer { @apply w-[min(18rem,calc(100vw-1rem))] min-h-0; } .sidebar-drawer:not([aria-hidden="true"]) { @apply max-h-screen; } .sidebar-drawer[aria-hidden="true"] { @apply -translate-x-full; } .sidebar-open-button { @apply left-2 top-2; } .secondary-panel { @apply border-r-0 pt-0; } .secondary-panel { @apply order-1; } .main-workspace { @apply order-2; } .table-wrap { @apply max-h-[70vh]; } .column-header { @apply h-7; writing-mode: horizontal-tb; } .secondary-collapsed .secondary-panel .column-header, .workspace-collapsed .main-workspace .workspace-header { @apply h-7 flex-row py-0; writing-mode: horizontal-tb; } .secondary-collapsed .secondary-panel .column-header span, .workspace-collapsed .main-workspace .workspace-header span { display: inline; } .workspace-collapsed .main-workspace .table-wrap { display: none; } .variant-grid { @apply min-w-0; } .variant-header { @apply hidden; } .variant-row { @apply grid grid-cols-2 gap-x-2 border-b border-slate-300 p-2; grid-template-columns: repeat(2, minmax(0, 1fr)); } .variant-cell { @apply flex min-h-7 items-center justify-between gap-2 border-b border-slate-200 px-1 py-1 text-right; white-space: normal; } .variant-cell::before { content: attr(data-label); @apply shrink-0 text-left text-[10px] font-medium text-slate-500; } .variant-cell[data-label=""]::before { content: none; } .variant-cell[data-label=""] { @apply col-span-2; } .variant-message-row { @apply block; } html.dark .variant-row { @apply border-slate-700; } html.dark .variant-cell { @apply border-slate-700; } } @media (min-width: 981px) { .sidebar-overlay { display: none; } } html:not(.dark) .control-panel { @apply bg-slate-100 text-slate-700; } html:not(.dark) .sidebar-drawer-header, html:not(.dark) .sidebar-footer { @apply border-slate-300; } html:not(.dark) .panel-header, html:not(.dark) .sidebar-drawer-header, html:not(.dark) .column-header { @apply border-slate-300 bg-slate-100 text-slate-700; } html:not(.dark) .sidebar-drawer-title { @apply text-slate-700; } html:not(.dark) .drawer-trigger .drawer-chevron, html:not(.dark) .select-chevron { @apply text-slate-700; } html:not(.dark) .sidebar-close-button, html:not(.dark) .sidebar-open-button, html:not(.dark) .drawer-trigger, html:not(.dark) .arrow-button, html:not(.dark) .action-button, html:not(.dark) .input-like { @apply border-slate-300 bg-white text-slate-700; } html:not(.dark) .panel-control-button { @apply border-slate-400 bg-white text-slate-700; } html:not(.dark) .sidebar-close-button:hover, html:not(.dark) .sidebar-open-button:hover, html:not(.dark) .drawer-trigger:hover, html:not(.dark) .arrow-button:hover:not(:disabled), html:not(.dark) .action-button:hover:not(:disabled) { @apply border-slate-400 bg-slate-200 text-slate-900; } html:not(.dark) .arrow-button::before { @apply text-slate-700; } html:not(.dark) #scanInput { @apply bg-slate-200 placeholder:text-slate-500; } html:not(.dark) .picture-slot, html:not(.dark) .mapping-box { @apply border-slate-300 bg-white text-slate-600; } html:not(.dark) .mapping-toggle::before { @apply text-slate-700; } html:not(.dark) .app-status { @apply border-slate-300 bg-white text-slate-700; } html:not(.dark) .manufacturer-trigger { @apply border-slate-300 bg-white text-slate-700; } html:not(.dark) .manufacturer-trigger:hover { @apply border-slate-400 bg-slate-200; } html.contrast-light-high:not(.dark) .control-panel { @apply bg-slate-200 text-slate-900; } html.contrast-light-high:not(.dark) .action-button, html.contrast-light-high:not(.dark) .arrow-button, html.contrast-light-high:not(.dark) .input-like, html.contrast-light-high:not(.dark) .manufacturer-trigger { @apply border-slate-500 text-slate-900; } html.contrast-light-high:not(.dark) .sidebar-icon { @apply text-slate-700; } html.dark body { @apply bg-slate-950 text-slate-100; } html.dark .control-panel { @apply bg-slate-950; } html.dark .secondary-panel { @apply border-slate-700 bg-slate-800; } html.dark .data-panel { @apply bg-slate-950; } html.dark .field-label { @apply border-slate-700 bg-slate-800 text-slate-200; } html.dark .field-value { @apply border-slate-700 bg-slate-900 text-slate-100; } html.dark .variant-header-cell { @apply border-slate-700 bg-slate-800 text-slate-100; } html.dark .variant-row { @apply border-slate-700; } html.dark .variant-row:nth-child(even) { @apply bg-slate-800; } html.dark .variant-row:hover { @apply bg-slate-700; } html.dark .variant-cell { @apply border-slate-700 text-slate-200; } html.dark .arrow-button, html.dark .action-button, html.dark .input-like { @apply border-slate-600 bg-slate-800 text-slate-100; } html.dark .arrow-button:hover:not(:disabled), html.dark .action-button:hover:not(:disabled) { @apply border-slate-400 bg-slate-700; } html.dark #scanInput { @apply bg-slate-700 placeholder:text-slate-400; } html.dark .manufacturer-menu { @apply border-slate-700 bg-slate-900; } html.dark .manufacturer-search { @apply border-slate-600 bg-slate-800 text-slate-100; } html.dark .manufacturer-option { @apply text-slate-200 hover:bg-slate-800; } html.dark .manufacturer-option[aria-selected="true"] { @apply bg-slate-700 text-white; } html.dark .column-header { @apply border-slate-700 text-slate-300; } html.dark .panel-control-button, html.dark .column-toggle { @apply border-slate-600 bg-slate-800 text-slate-100 hover:border-slate-400 hover:bg-slate-700; } html.contrast-dark-high.dark .control-panel { @apply bg-slate-950 text-white; } html.contrast-dark-high.dark .action-button, html.contrast-dark-high.dark .arrow-button, html.contrast-dark-high.dark .input-like, html.contrast-dark-high.dark .manufacturer-trigger { @apply border-slate-500 bg-slate-700 text-white; } html.contrast-dark-high.dark .sidebar-icon { @apply text-slate-100; } html.dark .settings-dialog, html.dark .suggested-dialog, html.dark .source-dialog { @apply border-slate-700 bg-slate-900; } html.dark .suggested-header { @apply border-slate-700 bg-slate-800; } html.dark .suggested-header h2, html.dark .settings-group legend, html.dark .settings-option, html.dark .settings-field { @apply text-slate-100; } html.dark .settings-group { @apply border-slate-700; } html.dark .settings-field input { @apply border-slate-600 bg-slate-800 text-slate-100; } html.dark .modal-close, html.dark .settings-test-button, html.dark .suggested-pick, html.dark .source-row-action, html.dark .source-picture-action { @apply border-slate-600 bg-slate-800 text-slate-100 hover:bg-slate-700; } html.dark .source-section { @apply border-slate-700; } html.dark .source-section-header { @apply border-slate-700 bg-slate-800 text-slate-100; } html.dark .source-row { @apply border-slate-700 bg-slate-900 text-slate-100 hover:bg-slate-800; } html.dark .suggested-row, html.dark .picture-candidate { @apply border-slate-700; } html.dark .suggested-row:nth-child(even) { @apply bg-slate-800; } }