@pm7/core
Version:
The First UI Library Built for AI Coding Agents - Core CSS and JavaScript
2,085 lines (1,677 loc) • 123 kB
CSS
/* PM7 UI Core Styles */
/* Import design tokens */
/* PM7 Color Design Tokens */
:root {
/* Primary colors */
--pm7-primary: #1C86EF;
--pm7-primary-hover: #1976D2;
--pm7-primary-active: #1565C0;
--pm7-primary-foreground: #ffffff;
/* Neutral colors */
--pm7-background: #ffffff;
--pm7-foreground: #000000;
--pm7-muted: #f5f5f5;
--pm7-muted-foreground: #333333;
/* Border colors */
--pm7-border: #e0e0e0;
--pm7-border-hover: #c0c0c0;
/* Status colors */
--pm7-success: #22c55e;
--pm7-success-foreground: #ffffff;
--pm7-success-light: #dcfce7;
--pm7-success-dark: #166534;
--pm7-warning: #f59e0b;
--pm7-warning-foreground: #ffffff;
--pm7-warning-light: #fef3c7;
--pm7-warning-dark: #92400e;
--pm7-error: #ef4444;
--pm7-error-foreground: #ffffff;
--pm7-info: #3b82f6;
--pm7-info-foreground: #ffffff;
--pm7-info-light: #dbeafe;
--pm7-info-dark: #1e40af;
/* Destructive alias */
--pm7-destructive: var(--pm7-error);
--pm7-destructive-foreground: var(--pm7-error-foreground);
/* Surface colors */
--pm7-surface: #ffffff;
--pm7-surface-hover: #f9f9f9;
--pm7-surface-active: #f0f0f0;
/* Text colors */
--pm7-text-primary: var(--pm7-foreground);
--pm7-text-secondary: var(--pm7-muted-foreground);
--pm7-text-disabled: #999999;
/* Component specific */
--pm7-menu-bg: var(--pm7-surface);
--pm7-menu-hover: var(--pm7-primary);
--pm7-menu-hover-text: var(--pm7-primary-foreground);
--pm7-card-footer-bg: #f7fafc;
--pm7-tooltip-bg: #1a1a1a;
--pm7-tooltip-color: #ffffff;
/* Focus ring */
--pm7-ring: var(--pm7-primary);
--pm7-ring-offset: #ffffff;
/* Input */
--pm7-input: #ffffff;
/* Documentation site */
--pm7-sidebar-bg: #F3F4F6;
--pm7-sidebar-item-hover: #ffffff;
--pm7-footer-bg: #f5f5f5;
--pm7-footer-text: var(--pm7-text-secondary);
--pm7-header-bg: var(--pm7-surface);
/* PM7 specific brand colors */
--pm7-primary-light: #e6f2ff;
/* Theme Switch colors */
--pm7-theme-switch-bg: var(--pm7-background);
--pm7-theme-switch-thumb-bg-light: #FFD43B;
--pm7-theme-switch-thumb-bg-dark: #6E6E6E;
--pm7-theme-switch-icon-light: var(--pm7-foreground);
--pm7-theme-switch-icon-dark: var(--pm7-background);
--pm7-theme-switch-sun-color: #FFB800;
--pm7-theme-switch-moon-color: #4A5568;
}
/* Dark mode - System preference */
@media (prefers-color-scheme: dark) {
:root {
/* Main colors from old site */
--pm7-background: #121212;
--pm7-foreground: #e0e0e0;
--pm7-text-primary: #e0e0e0;
--pm7-text-secondary: #999999;
/* Primary color adjusted for dark mode */
--pm7-primary: #3b9eff;
--pm7-primary-hover: #2a8fe5;
--pm7-primary-active: #1976D2;
--pm7-primary-foreground: #ffffff;
/* Neutral colors */
--pm7-muted: #2d2d2d;
--pm7-muted-foreground: #e6e6e6;
/* Border colors */
--pm7-border: #444;
--pm7-border-hover: #666666;
/* Surface colors */
--pm7-surface: #1e1e1e;
--pm7-surface-hover: #2a2a2a;
--pm7-surface-active: #333;
/* Component specific */
--pm7-menu-bg: #1e1e1e;
--pm7-ring-offset: #121212;
--pm7-input: #1e1e1e;
/* Card specific */
--pm7-card-footer-bg: #1a1a1a;
/* Additional dark mode colors from old site */
--pm7-sidebar-bg: #1E1E1E;
--pm7-sidebar-item-hover: var(--pm7-surface-hover);
--pm7-sidebar-item-hover-dark: var(--pm7-surface-hover);
--pm7-sidebar-active: #2a2a2a;
--pm7-header-bg: var(--pm7-surface);
--pm7-header-dark-bg: #0a4b87;
--pm7-footer-bg: #1a1a1a;
--pm7-footer-text: #e0e0e0;
--pm7-tab-active-bg: #333;
--pm7-tab-active-border: #3b9eff;
--pm7-code-bg: #2d2d2d;
/* Tooltip stays same in dark mode - already dark */
--pm7-tooltip-bg: #1a1a1a;
--pm7-tooltip-color: #ffffff;
/* Status colors adjusted for dark mode */
--pm7-success-light: #052e16;
--pm7-success-dark: #22c55e;
--pm7-warning-light: #451a03;
--pm7-warning-dark: #f59e0b;
--pm7-info-light: #1e3a8a;
--pm7-info-dark: #3b82f6;
/* Component focus shadows for dark mode */
--pm7-focus-shadow: 0 0 0 3px rgba(59, 158, 255, 0.2);
--pm7-error-focus-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2);
--pm7-success-focus-shadow: 0 0 0 3px rgba(34, 197, 94, 0.2);
/* Menu hover shadow for dark mode */
--pm7-menu-hover-shadow: rgba(255, 255, 255, 0.05) 0px 5px 15px 0px, rgba(255, 255, 255, 0.1) 0px 15px 35px -5px;
/* Scrollbar colors for dark mode */
--pm7-scrollbar-thumb: rgba(255, 255, 255, 0.2);
--pm7-scrollbar-thumb-hover: rgba(255, 255, 255, 0.3);
/* Theme Switch colors for dark mode */
--pm7-theme-switch-bg: var(--pm7-background);
--pm7-theme-switch-thumb-bg-light: #FFD43B;
--pm7-theme-switch-thumb-bg-dark: #6E6E6E;
--pm7-theme-switch-icon-light: var(--pm7-foreground);
--pm7-theme-switch-icon-dark: var(--pm7-background);
--pm7-theme-switch-sun-color: #FFB800;
--pm7-theme-switch-moon-color: #93C5FD;
}
}
/* Dark mode class override - Using colors from old site */
.dark {
/* Main colors from old site */
--pm7-background: #121212;
--pm7-foreground: #e0e0e0;
--pm7-text-primary: #e0e0e0;
--pm7-text-secondary: #999999;
/* Primary color adjusted for dark mode */
--pm7-primary: #3b9eff;
--pm7-primary-hover: #2a8fe5;
--pm7-primary-active: #1976D2;
--pm7-primary-foreground: #ffffff;
/* Neutral colors */
--pm7-muted: #2d2d2d;
--pm7-muted-foreground: #e6e6e6;
/* Border colors */
--pm7-border: #444;
--pm7-border-hover: #666666;
/* Surface colors */
--pm7-surface: #1e1e1e;
--pm7-surface-hover: #2a2a2a;
--pm7-surface-active: #333;
/* Component specific */
--pm7-menu-bg: #1e1e1e;
--pm7-ring-offset: #121212;
--pm7-input: #1e1e1e;
/* Card specific */
--pm7-card-footer-bg: #1a1a1a;
/* Additional dark mode colors from old site */
--pm7-sidebar-bg: #1E1E1E;
--pm7-sidebar-item-hover: var(--pm7-surface-hover);
--pm7-sidebar-item-hover-dark: var(--pm7-surface-hover);
--pm7-sidebar-active: #2a2a2a;
--pm7-header-bg: var(--pm7-surface);
--pm7-header-dark-bg: #0a4b87;
--pm7-footer-bg: #1a1a1a;
--pm7-footer-text: #e0e0e0;
--pm7-tab-active-bg: #333;
--pm7-tab-active-border: #3b9eff;
--pm7-code-bg: #2d2d2d;
/* Tooltip stays same in dark mode - already dark */
--pm7-tooltip-bg: #1a1a1a;
--pm7-tooltip-color: #ffffff;
/* Status colors adjusted for dark mode */
--pm7-success-light: #052e16;
--pm7-success-dark: #22c55e;
--pm7-warning-light: #451a03;
--pm7-warning-dark: #f59e0b;
--pm7-info-light: #1e3a8a;
--pm7-info-dark: #3b82f6;
/* Component focus shadows */
--pm7-focus-shadow: 0 0 0 3px rgba(28, 134, 239, 0.1);
--pm7-error-focus-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
--pm7-success-focus-shadow: 0 0 0 3px rgba(34, 197, 94, 0.1);
/* Menu hover shadow */
--pm7-menu-hover-shadow: rgba(0, 0, 0, 0.08) 0px 5px 15px 0px, rgba(25, 28, 33, 0.2) 0px 15px 35px -5px;
/* Scrollbar colors */
--pm7-scrollbar-thumb: rgba(0, 0, 0, 0.2);
--pm7-scrollbar-thumb-hover: rgba(0, 0, 0, 0.3);
/* Theme Switch colors for dark mode */
--pm7-theme-switch-bg: var(--pm7-background);
--pm7-theme-switch-thumb-bg-light: #FFD43B;
--pm7-theme-switch-thumb-bg-dark: #6E6E6E;
--pm7-theme-switch-icon-light: var(--pm7-foreground);
--pm7-theme-switch-icon-dark: var(--pm7-background);
--pm7-theme-switch-sun-color: #FFB800;
--pm7-theme-switch-moon-color: #93C5FD;
}
/* PM7 Spacing Design Tokens */
:root {
/* Base spacing unit (4px) */
--pm7-spacing-unit: 0.25rem;
/* Spacing scale */
--pm7-spacing-0: 0;
--pm7-spacing-1: calc(var(--pm7-spacing-unit) * 1); /* 4px */
--pm7-spacing-2: calc(var(--pm7-spacing-unit) * 2); /* 8px */
--pm7-spacing-3: calc(var(--pm7-spacing-unit) * 3); /* 12px */
--pm7-spacing-4: calc(var(--pm7-spacing-unit) * 4); /* 16px */
--pm7-spacing-5: calc(var(--pm7-spacing-unit) * 5); /* 20px */
--pm7-spacing-6: calc(var(--pm7-spacing-unit) * 6); /* 24px */
--pm7-spacing-8: calc(var(--pm7-spacing-unit) * 8); /* 32px */
--pm7-spacing-10: calc(var(--pm7-spacing-unit) * 10); /* 40px */
--pm7-spacing-12: calc(var(--pm7-spacing-unit) * 12); /* 48px */
--pm7-spacing-16: calc(var(--pm7-spacing-unit) * 16); /* 64px */
--pm7-spacing-20: calc(var(--pm7-spacing-unit) * 20); /* 80px */
--pm7-spacing-24: calc(var(--pm7-spacing-unit) * 24); /* 96px */
/* Component specific spacing */
--pm7-button-padding-x: var(--pm7-spacing-4);
--pm7-button-padding-y: var(--pm7-spacing-2);
--pm7-button-padding-x-sm: var(--pm7-spacing-3);
--pm7-button-padding-y-sm: var(--pm7-spacing-1);
--pm7-button-padding-x-lg: var(--pm7-spacing-6);
--pm7-button-padding-y-lg: var(--pm7-spacing-3);
--pm7-menu-padding-x: var(--pm7-spacing-4);
--pm7-menu-padding-y: var(--pm7-spacing-2);
--pm7-menu-item-gap: var(--pm7-spacing-2);
--pm7-card-padding: var(--pm7-spacing-6);
--pm7-card-padding-sm: var(--pm7-spacing-4);
--pm7-card-padding-lg: var(--pm7-spacing-8);
--pm7-input-padding-x: var(--pm7-spacing-3);
--pm7-input-padding-y: var(--pm7-spacing-2);
/* Layout spacing */
--pm7-container-padding: var(--pm7-spacing-4);
--pm7-section-gap: var(--pm7-spacing-8);
--pm7-element-gap: var(--pm7-spacing-4);
}
/* PM7 Typography Design Tokens */
:root {
/* Font families */
--pm7-font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
--pm7-font-serif: Georgia, serif;
--pm7-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
/* Font sizes */
--pm7-text-xs: 0.75rem; /* 12px */
--pm7-text-sm: 0.875rem; /* 14px */
--pm7-text-base: 1rem; /* 16px */
--pm7-text-lg: 1.125rem; /* 18px */
--pm7-text-xl: 1.25rem; /* 20px */
--pm7-text-2xl: 1.5rem; /* 24px */
--pm7-text-3xl: 1.875rem; /* 30px */
--pm7-text-4xl: 2.25rem; /* 36px */
--pm7-text-5xl: 3rem; /* 48px */
/* Line heights */
--pm7-leading-none: 1;
--pm7-leading-tight: 1.25;
--pm7-leading-snug: 1.375;
--pm7-leading-normal: 1.5;
--pm7-leading-relaxed: 1.625;
--pm7-leading-loose: 2;
/* Font weights */
--pm7-font-thin: 100;
--pm7-font-light: 300;
--pm7-font-normal: 400;
--pm7-font-medium: 500;
--pm7-font-semibold: 600;
--pm7-font-bold: 700;
--pm7-font-extrabold: 800;
--pm7-font-black: 900;
/* Letter spacing */
--pm7-tracking-tighter: -0.05em;
--pm7-tracking-tight: -0.025em;
--pm7-tracking-normal: 0;
--pm7-tracking-wide: 0.025em;
--pm7-tracking-wider: 0.05em;
--pm7-tracking-widest: 0.1em;
/* Font size aliases for components */
--pm7-font-size-xs: var(--pm7-text-xs);
--pm7-font-size-sm: var(--pm7-text-sm);
--pm7-font-size-base: var(--pm7-text-base);
--pm7-font-size-lg: var(--pm7-text-lg);
--pm7-font-size-xl: var(--pm7-text-xl);
/* Line height aliases for components */
--pm7-line-height-xs: var(--pm7-leading-tight);
--pm7-line-height-sm: var(--pm7-leading-snug);
--pm7-line-height-base: var(--pm7-leading-normal);
--pm7-line-height-lg: var(--pm7-leading-relaxed);
--pm7-line-height-xl: var(--pm7-leading-loose);
/* Component specific typography */
--pm7-button-font-size: var(--pm7-text-sm);
--pm7-button-font-weight: var(--pm7-font-medium);
--pm7-button-line-height: var(--pm7-leading-normal);
--pm7-menu-font-size: var(--pm7-text-sm);
--pm7-menu-font-weight: var(--pm7-font-normal);
--pm7-menu-line-height: var(--pm7-leading-normal);
--pm7-input-font-size: var(--pm7-text-base);
--pm7-input-font-weight: var(--pm7-font-normal);
--pm7-input-line-height: var(--pm7-leading-normal);
--pm7-heading-font-weight: var(--pm7-font-bold);
--pm7-heading-line-height: var(--pm7-leading-tight);
}
/* PM7 Shadow Design Tokens */
:root {
/* Shadow values */
--pm7-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--pm7-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--pm7-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--pm7-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--pm7-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
--pm7-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
--pm7-shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
--pm7-shadow-none: 0 0 #0000;
/* Component specific shadows */
--pm7-button-shadow: var(--pm7-shadow-sm);
--pm7-button-shadow-hover: var(--pm7-shadow);
--pm7-button-shadow-active: var(--pm7-shadow-none);
--pm7-card-shadow: var(--pm7-shadow);
--pm7-card-shadow-hover: var(--pm7-shadow-md);
--pm7-menu-shadow: var(--pm7-shadow-lg);
--pm7-menu-hover-shadow: rgba(0, 0, 0, 0.08) 0px 5px 15px 0px, rgba(25, 28, 33, 0.2) 0px 15px 35px -5px;
--pm7-dialog-shadow: var(--pm7-shadow-xl);
--pm7-toast-shadow: var(--pm7-shadow-lg);
/* Focus shadow */
--pm7-focus-shadow: 0 0 0 3px rgb(28 134 239 / 0.2);
}
/* Dark mode adjustments */
@media (prefers-color-scheme: dark) {
:root {
--pm7-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.1);
--pm7-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.2), 0 1px 2px -1px rgb(0 0 0 / 0.2);
--pm7-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.2), 0 2px 4px -2px rgb(0 0 0 / 0.2);
--pm7-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.3), 0 4px 6px -4px rgb(0 0 0 / 0.2);
--pm7-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.3), 0 8px 10px -6px rgb(0 0 0 / 0.2);
--pm7-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5);
}
}
.dark {
--pm7-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.1);
--pm7-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.2), 0 1px 2px -1px rgb(0 0 0 / 0.2);
--pm7-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.2), 0 2px 4px -2px rgb(0 0 0 / 0.2);
--pm7-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.3), 0 4px 6px -4px rgb(0 0 0 / 0.2);
--pm7-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.3), 0 8px 10px -6px rgb(0 0 0 / 0.2);
--pm7-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5);
--pm7-menu-hover-shadow: rgba(255, 255, 255, 0.05) 0px 5px 15px 0px, rgba(255, 255, 255, 0.1) 0px 15px 35px -5px;
}
/* PM7 Border Design Tokens */
:root {
/* Border radius */
--pm7-radius-none: 0;
--pm7-radius-sm: 0.125rem; /* 2px */
--pm7-radius: 0.375rem; /* 6px */
--pm7-radius-md: 0.5rem; /* 8px */
--pm7-radius-lg: 0.75rem; /* 12px */
--pm7-radius-xl: 1rem; /* 16px */
--pm7-radius-2xl: 1.5rem; /* 24px */
--pm7-radius-full: 9999px;
/* Border width */
--pm7-border-width-0: 0;
--pm7-border-width: 1px;
--pm7-border-width-2: 2px;
--pm7-border-width-4: 4px;
--pm7-border-width-8: 8px;
/* Component specific borders */
--pm7-button-radius: var(--pm7-radius);
--pm7-button-border-width: 1px;
--pm7-menu-radius: var(--pm7-radius);
--pm7-menu-border-width: 1px;
--pm7-card-radius: var(--pm7-radius-md);
--pm7-card-border-width: 1px;
--pm7-input-radius: var(--pm7-radius);
--pm7-input-border-width: 1px;
--pm7-dialog-radius: var(--pm7-radius-lg);
--pm7-toast-radius: var(--pm7-radius);
}
/* Import base styles */
/* PM7 CSS Reset - Minimal reset for consistent cross-browser styling */
/* Box sizing */
*,
*::before,
*::after {
box-sizing: border-box;
}
/* Remove default margin */
body,
h1,
h2,
h3,
h4,
h5,
h6,
p,
figure,
blockquote,
dl,
dd {
margin: 0;
}
/* Remove list styles on ul, ol elements with a list role */
ul[role='list'],
ol[role='list'] {
list-style: none;
padding: 0;
margin: 0;
}
/* Set core root defaults */
html:focus-within {
scroll-behavior: smooth;
}
/* Set core body defaults */
body {
min-height: 100vh;
text-rendering: optimizeSpeed;
line-height: 1.5;
}
/* A elements that don't have a class get default styles */
a:not([class]) {
-webkit-text-decoration-skip: ink;
text-decoration-skip-ink: auto;
}
/* Make images easier to work with */
img,
picture,
video,
canvas,
svg {
display: block;
max-width: 100%;
}
/* Inherit fonts for inputs and buttons */
input,
button,
textarea,
select {
font: inherit;
}
/* Remove all animations, transitions and smooth scroll for people that prefer not to see them */
@media (prefers-reduced-motion: reduce) {
html:focus-within {
scroll-behavior: auto;
}
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
/* PM7 Root Styles */
:root {
/* Apply font family */
font-family: var(--pm7-font-sans);
font-size: 16px;
line-height: var(--pm7-leading-normal);
font-weight: var(--pm7-font-normal);
/* Text rendering */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
/* Colors */
background-color: var(--pm7-background);
color: var(--pm7-foreground);
}
/* Selection colors */
::-moz-selection {
background-color: var(--pm7-primary);
color: var(--pm7-primary-foreground);
}
::selection {
background-color: var(--pm7-primary);
color: var(--pm7-primary-foreground);
}
/* Focus visible */
:focus-visible {
outline: 2px solid var(--pm7-ring);
outline-offset: 2px;
}
/* Remove focus for mouse users */
:focus:not(:focus-visible) {
outline: none;
}
/* Scrollbar styling */
::-webkit-scrollbar {
width: 12px;
height: 12px;
}
::-webkit-scrollbar-track {
background: var(--pm7-muted);
}
::-webkit-scrollbar-thumb {
background: var(--pm7-border);
border-radius: var(--pm7-radius);
border: 3px solid var(--pm7-muted);
}
::-webkit-scrollbar-thumb:hover {
background: var(--pm7-border-hover);
}
/* Firefox scrollbar */
* {
scrollbar-width: thin;
scrollbar-color: var(--pm7-border) var(--pm7-muted);
}
/* Import component styles */
/* PM7 Button Component */
.pm7-button {
/* Base styles */
display: inline-flex;
align-items: center;
justify-content: center;
white-space: nowrap;
border-radius: var(--pm7-button-radius);
font-size: var(--pm7-button-font-size);
font-weight: var(--pm7-button-font-weight);
line-height: var(--pm7-button-line-height);
padding: var(--pm7-button-padding-y) var(--pm7-button-padding-x);
transition-property: color, background-color, border-color, box-shadow, transform;
transition-duration: 200ms;
transition-timing-function: ease;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
cursor: pointer;
border: var(--pm7-button-border-width) solid transparent;
text-decoration: none;
position: relative;
overflow: hidden;
/* Focus */
--pm7-button-focus-shadow: 0 0 0 3px rgb(28 134 239 / 0.2);
}
/* Remove button defaults */
.pm7-button {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-color: transparent;
background-image: none;
}
/* Focus styles */
.pm7-button:focus-visible {
outline: 2px solid transparent;
outline-offset: 2px;
box-shadow: var(--pm7-button-focus-shadow);
}
/* Dark mode focus shadow */
.dark .pm7-button {
--pm7-button-focus-shadow: 0 0 0 3px rgb(59 158 255 / 0.3);
}
/* Ensure anchor tags with button classes override link styles */
a.pm7-button,
a.pm7-button:link,
a.pm7-button:visited,
a.pm7-button:hover,
a.pm7-button:active,
a.pm7-button:focus {
text-decoration: none !important;
color: inherit !important;
}
/* Disabled state */
.pm7-button:disabled,
.pm7-button[disabled],
.pm7-button[aria-disabled="true"] {
pointer-events: none;
opacity: 0.5;
cursor: not-allowed;
background-color: var(--pm7-muted) !important;
color: var(--pm7-muted-foreground) !important;
border-color: var(--pm7-muted) !important;
}
/* Dark mode disabled state - handled by CSS variables */
/* Active state */
.pm7-button:active:not(:disabled) {
transform: translateY(1px);
}
/* Button variants */
/* Primary (default) */
.pm7-button--primary,
.pm7-button--default {
background-color: var(--pm7-primary);
color: var(--pm7-primary-foreground);
box-shadow: var(--pm7-button-shadow);
}
/* Ensure primary buttons maintain white text when used as links */
a.pm7-button--primary,
a.pm7-button--primary:link,
a.pm7-button--primary:visited,
a.pm7-button--primary:hover,
a.pm7-button--primary:active,
a.pm7-button--primary:focus {
color: var(--pm7-primary-foreground) !important;
}
.pm7-button--primary:hover:not(:disabled),
.pm7-button--default:hover:not(:disabled) {
background-color: var(--pm7-primary-hover);
box-shadow: var(--pm7-button-shadow-hover);
}
.pm7-button--primary:active:not(:disabled),
.pm7-button--default:active:not(:disabled) {
background-color: var(--pm7-primary-active);
box-shadow: var(--pm7-button-shadow-active);
}
/* Secondary */
.pm7-button--secondary {
background-color: var(--pm7-muted);
color: var(--pm7-foreground);
}
.pm7-button--secondary:hover:not(:disabled) {
background-color: var(--pm7-muted-foreground);
color: var(--pm7-background);
}
/* Outline */
.pm7-button--outline {
border-color: var(--pm7-border);
background-color: transparent;
color: var(--pm7-foreground);
}
.pm7-button--outline:hover:not(:disabled) {
background-color: var(--pm7-muted);
border-color: var(--pm7-border-hover);
}
/* Ghost */
.pm7-button--ghost {
background-color: transparent;
color: var(--pm7-foreground);
}
.pm7-button--ghost:hover:not(:disabled) {
background-color: var(--pm7-muted);
color: var(--pm7-foreground);
}
/* On Dark Background Modifier - for buttons on dark backgrounds in light mode */
.pm7-button--on-dark.pm7-button--outline {
color: white;
border-color: rgba(255, 255, 255, 0.3);
}
.pm7-button--on-dark.pm7-button--outline:hover:not(:disabled) {
background-color: rgba(255, 255, 255, 0.1);
border-color: rgba(255, 255, 255, 0.5);
color: white;
}
.pm7-button--on-dark.pm7-button--ghost {
color: white;
}
.pm7-button--on-dark.pm7-button--ghost:hover:not(:disabled) {
background-color: rgba(255, 255, 255, 0.1);
color: white;
}
/* Destructive */
.pm7-button--destructive {
background-color: var(--pm7-error);
color: var(--pm7-error-foreground);
}
.pm7-button--destructive:hover:not(:disabled) {
background-color: var(--pm7-error);
opacity: 0.9;
}
/* Link */
.pm7-button--link {
background-color: transparent;
color: var(--pm7-primary);
text-decoration: underline;
text-underline-offset: 4px;
padding: 0;
height: auto;
}
.pm7-button--link:hover:not(:disabled) {
text-decoration: none;
}
/* Button sizes */
/* Small */
.pm7-button--sm {
height: 36px;
padding: var(--pm7-button-padding-y-sm) var(--pm7-button-padding-x-sm);
font-size: var(--pm7-text-sm);
}
/* Medium (default) */
.pm7-button--md {
height: 40px;
}
/* Large */
.pm7-button--lg {
height: 48px;
padding: var(--pm7-button-padding-y-lg) var(--pm7-button-padding-x-lg);
font-size: var(--pm7-text-base);
}
/* Icon button */
.pm7-button--icon {
padding: 0;
width: 40px;
height: 40px;
}
.pm7-button--icon.pm7-button--sm {
width: 36px;
height: 36px;
}
.pm7-button--icon.pm7-button--lg {
width: 48px;
height: 48px;
}
/* Button with icon */
.pm7-button > svg {
width: 1em;
height: 1em;
flex-shrink: 0;
}
.pm7-button > svg:first-child:not(:last-child) {
margin-right: var(--pm7-spacing-2);
}
.pm7-button > svg:last-child:not(:first-child) {
margin-left: var(--pm7-spacing-2);
}
/* Full width */
.pm7-button--full {
width: 100%;
}
/* Button group */
.pm7-button-group {
display: inline-flex;
isolation: isolate;
}
.pm7-button-group > .pm7-button {
border-radius: 0;
margin-right: -1px;
position: relative;
}
.pm7-button-group > .pm7-button:first-child {
border-top-left-radius: var(--pm7-button-radius);
border-bottom-left-radius: var(--pm7-button-radius);
}
.pm7-button-group > .pm7-button:last-child {
border-top-right-radius: var(--pm7-button-radius);
border-bottom-right-radius: var(--pm7-button-radius);
margin-right: 0;
}
.pm7-button-group > .pm7-button:hover,
.pm7-button-group > .pm7-button:focus {
z-index: 1;
}
/* 6stars effect */
.pm7-button__6stars {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
pointer-events: none;
opacity: 0;
/* Faster transition for better responsiveness */
transition: opacity 0.15s ease;
}
.pm7-button--primary:hover .pm7-button__6stars,
.pm7-button--default:hover .pm7-button__6stars {
opacity: 1;
}
.pm7-button__6stars .star {
position: absolute;
width: 4px;
height: 4px;
background: var(--pm7-primary-foreground);
border-radius: 50%;
animation: pm7-star-float 3s linear infinite;
opacity: 0;
}
.pm7-button__6stars .star:nth-child(1) {
top: 20%;
left: 10%;
animation-delay: 0s;
}
.pm7-button__6stars .star:nth-child(2) {
top: 80%;
left: 80%;
animation-delay: 0.5s;
}
.pm7-button__6stars .star:nth-child(3) {
top: 10%;
left: 50%;
animation-delay: 1s;
}
.pm7-button__6stars .star:nth-child(4) {
top: 50%;
left: 20%;
animation-delay: 1.5s;
}
.pm7-button__6stars .star:nth-child(5) {
top: 60%;
left: 70%;
animation-delay: 2s;
}
.pm7-button__6stars .star:nth-child(6) {
top: 30%;
left: 90%;
animation-delay: 2.5s;
}
@keyframes pm7-star-float {
0% {
transform: translateY(0) scale(0);
opacity: 0;
}
10% {
opacity: 1;
transform: translateY(-10px) scale(1);
}
90% {
opacity: 1;
transform: translateY(-80px) scale(1);
}
100% {
transform: translateY(-100px) scale(0);
opacity: 0;
}
}
/* Slider Button */
.pm7-button--slider {
position: relative;
padding: 0;
width: 280px;
height: 56px;
background: var(--pm7-muted);
border: 2px solid var(--pm7-border);
overflow: hidden;
cursor: default;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
transition: background-color 0.3s ease, border-color 0.3s ease;
}
.pm7-button--slider:hover {
background: var(--pm7-muted);
}
.pm7-button--slider:active {
transform: none;
}
.pm7-button--slider.pm7-button--sm {
width: 220px;
height: 44px;
}
.pm7-button--slider.pm7-button--lg {
width: 340px;
height: 64px;
}
/* Slider track */
.pm7-button--slider::before {
content: '';
position: absolute;
top: 50%;
left: 4px;
right: 4px;
height: calc(100% - 8px);
background: transparent;
border-radius: calc(var(--pm7-button-radius) - 2px);
transform: translateY(-50%);
pointer-events: none;
}
/* Slider text */
.pm7-button--slider-text {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: var(--pm7-muted-foreground);
font-size: var(--pm7-button-font-size);
font-weight: var(--pm7-button-font-weight);
white-space: nowrap;
pointer-events: none;
transition: opacity 0.3s ease;
z-index: 1;
}
/* Slider handle */
.pm7-button--slider-handle {
position: absolute;
top: 4px;
left: 4px;
width: 48px;
height: calc(100% - 8px);
background: var(--pm7-primary);
border-radius: calc(var(--pm7-button-radius) - 2px);
display: flex;
align-items: center;
justify-content: center;
cursor: grab;
transition: transform 0.1s ease, background-color 0.2s ease, width 0.2s ease;
z-index: 2;
}
.pm7-button--slider.pm7-button--sm .pm7-button--slider-handle {
width: 36px;
}
.pm7-button--slider.pm7-button--lg .pm7-button--slider-handle {
width: 56px;
}
.pm7-button--slider-handle:active {
cursor: grabbing;
}
.pm7-button--slider-handle::after {
content: '';
display: block;
width: 16px;
height: 16px;
background: var(--pm7-primary-foreground);
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E");
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E");
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-position: center;
mask-position: center;
}
/* Slider states */
.pm7-button--slider[data-pm7-slider-dragging="true"] .pm7-button--slider-handle {
transition: none;
}
.pm7-button--slider[data-pm7-slider-complete="true"] {
background: var(--pm7-success-light);
border-color: var(--pm7-success);
}
.pm7-button--slider[data-pm7-slider-complete="true"] .pm7-button--slider-text {
opacity: 0;
}
.pm7-button--slider[data-pm7-slider-complete="true"] .pm7-button--slider-handle {
background: var(--pm7-success);
}
/* Success check animation */
.pm7-button--slider-handle::before {
content: '';
position: absolute;
width: 20px;
height: 20px;
background: var(--pm7-primary-foreground);
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-position: center;
mask-position: center;
opacity: 0;
transform: scale(0.5);
transition: opacity 0.3s ease, transform 0.3s ease;
}
.pm7-button--slider[data-pm7-slider-complete="true"] .pm7-button--slider-handle::before {
opacity: 1;
transform: scale(1);
}
.pm7-button--slider[data-pm7-slider-complete="true"] .pm7-button--slider-handle::after {
opacity: 0;
}
/* Disabled state */
.pm7-button--slider:disabled,
.pm7-button--slider[disabled],
.pm7-button--slider[aria-disabled="true"] {
cursor: not-allowed;
}
.pm7-button--slider:disabled .pm7-button--slider-handle,
.pm7-button--slider[disabled] .pm7-button--slider-handle,
.pm7-button--slider[aria-disabled="true"] .pm7-button--slider-handle {
cursor: not-allowed;
background: var(--pm7-muted-foreground);
}
/* Dark mode adjustments */
.dark .pm7-button--slider[data-pm7-slider-complete="true"] {
background: rgba(34, 197, 94, 0.2);
}
/* PM7 Menu Component */
/* Menu bar container for application-style menus */
.pm7-menu-bar {
display: flex;
align-items: center;
gap: 0; /* No gap between menu items for seamless hover */
background: var(--pm7-surface);
border: 1px solid var(--pm7-border);
border-radius: var(--pm7-radius);
padding: 2px;
}
/* Borderless variant for traditional toolbar appearance */
.pm7-menu-bar--borderless {
border: none;
background: transparent;
padding: 0;
border-radius: 0;
}
/* Menu items in a menu bar */
.pm7-menu-bar .pm7-menu-trigger {
border-radius: 4px;
border: none;
height: 100%;
margin: 2px;
padding: 4px 10px;
}
/* Hover state for ALL menu bar triggers - higher specificity to override button styles */
.pm7-menu-bar .pm7-menu-trigger.pm7-button:hover,
.pm7-menu-bar .pm7-menu-trigger.pm7-button--ghost:hover {
background-color: var(--pm7-menu-hover) !important;
color: var(--pm7-menu-hover-text) !important;
box-shadow: var(--pm7-menu-hover-shadow) !important;
position: relative;
z-index: 1;
}
/* Active state (open menu) - comes AFTER hover to override it */
.pm7-menu-bar .pm7-menu-trigger.pm7-button[aria-expanded="true"] {
background-color: var(--pm7-muted);
color: var(--pm7-foreground);
border-radius: 4px;
box-shadow: none;
}
/* Base menu container */
.pm7-menu {
position: relative;
display: inline-block;
}
/* Menu trigger button */
.pm7-menu-trigger {
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
padding: var(--pm7-spacing-2);
background: transparent;
border-radius: var(--pm7-radius);
color: var(--pm7-foreground);
}
/* Only remove border when not using button classes that have borders */
.pm7-menu-trigger:not(.pm7-button--outline):not(.pm7-button--secondary) {
border: none;
}
/* Override button transition for instant menu feedback */
.pm7-menu-trigger.pm7-button {
transition: none !important;
}
.pm7-menu-trigger.pm7-button:hover {
background-color: var(--pm7-menu-hover);
color: var(--pm7-menu-hover-text);
box-shadow: var(--pm7-menu-hover-shadow);
position: relative;
z-index: 1;
}
.pm7-menu-trigger:focus-visible {
outline: 2px solid var(--pm7-ring);
outline-offset: 2px;
}
/* Menu content dropdown */
.pm7-menu-content {
position: absolute;
top: 100%;
left: 0;
z-index: 50;
min-width: 12rem;
max-width: 18.8rem;
margin-top: 4px;
padding: 0.5rem;
background-color: var(--pm7-menu-bg);
border: 1px solid var(--pm7-border);
border-radius: var(--pm7-menu-radius);
box-shadow: var(--pm7-menu-shadow);
/* Hard display none/block */
display: none;
}
/* Menu open state */
.pm7-menu-content--open,
.pm7-menu-content[data-state="open"] {
display: block;
}
/* Menu alignment */
/* These classes are dynamically added by JavaScript based on data-position */
.pm7-menu[data-position="bottom-end"] .pm7-menu-content {
left: auto;
right: 0;
}
.pm7-menu[data-position="bottom-start"] .pm7-menu-content {
left: 0;
right: auto;
}
.pm7-menu[data-position="top-start"] .pm7-menu-content {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: 4px;
left: 0;
right: auto;
}
.pm7-menu[data-position="top-end"] .pm7-menu-content {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: 4px;
left: auto;
right: 0;
}
.pm7-menu[data-position="left-start"] .pm7-menu-content {
left: auto;
right: 100%;
top: 0;
margin-right: 4px;
}
.pm7-menu[data-position="left-end"] .pm7-menu-content {
left: auto;
right: 100%;
bottom: 0;
margin-right: 4px;
}
.pm7-menu[data-position="right-start"] .pm7-menu-content {
left: 100%;
right: auto;
top: 0;
margin-left: 4px;
}
.pm7-menu[data-position="right-end"] .pm7-menu-content {
left: 100%;
right: auto;
bottom: 0;
margin-left: 4px;
}
.pm7-menu[data-position="center"] .pm7-menu-content {
left: 50%;
transform: translateX(-50%);
right: auto;
}
/* Start alignment (explicit left) */
.pm7-menu-content--start {
left: 0;
right: auto;
}
/* Menu items */
.pm7-menu-item {
display: flex;
align-items: center;
gap: var(--pm7-menu-item-gap);
padding: var(--pm7-menu-padding-y) var(--pm7-menu-padding-x);
margin: 2px 0;
border-radius: calc(var(--pm7-menu-radius) - 2px);
font-size: var(--pm7-menu-font-size);
font-weight: var(--pm7-menu-font-weight);
line-height: var(--pm7-menu-line-height);
color: var(--pm7-foreground);
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
text-decoration: none;
background: transparent;
border: none;
width: 100%;
text-align: left;
}
.pm7-menu-item:not(.pm7-menu-item--clicking):hover {
background-color: var(--pm7-menu-hover);
color: var(--pm7-menu-hover-text);
/* Original PM7 shadow effect */
box-shadow: var(--pm7-menu-hover-shadow);
position: relative;
z-index: 1;
}
/* Remove all effects when clicking */
.pm7-menu-item--clicking {
background-color: transparent !important;
color: var(--pm7-foreground) !important;
box-shadow: none !important;
}
/* Active/selected state */
.pm7-menu-item[data-active="true"] {
background-color: var(--pm7-primary);
color: var(--pm7-primary-foreground);
}
.pm7-menu-item:focus-visible {
outline: 2px solid var(--pm7-ring);
outline-offset: -2px;
}
/* Disabled menu items */
.pm7-menu-item:disabled,
.pm7-menu-item[disabled],
.pm7-menu-item[aria-disabled="true"] {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
/* Destructive menu items - ensure proper contrast on hover */
.pm7-menu-item--destructive:not(.pm7-menu-item--clicking):hover {
color: var(--pm7-destructive-foreground) !important; /* Use proper contrast color */
}
/* Menu item icons */
.pm7-menu-item-icon {
width: 1rem;
height: 1rem;
flex-shrink: 0;
}
.pm7-menu-item-icon svg {
width: 100%;
height: 100%;
}
/* Menu separator */
.pm7-menu-separator {
height: 1px;
background-color: var(--pm7-border);
margin: 8px 0;
border: none;
display: block;
width: 100%;
}
/* Keyboard shortcut hint */
.pm7-menu-shortcut {
margin-left: auto;
padding-left: 2rem;
color: var(--pm7-muted-foreground);
font-size: 0.75rem;
opacity: 0.7;
}
/* Ensure shortcut inherits hover color */
.pm7-menu-item:hover .pm7-menu-shortcut {
color: inherit;
opacity: 0.9;
}
/* Dark mode styles */
.dark .pm7-menu-item:not(.pm7-menu-item--clicking):hover {
/* Adjusted shadow for dark mode */
box-shadow: var(--pm7-menu-hover-shadow);
}
/* Menu label - small uppercase labels */
.pm7-menu-label {
padding: var(--pm7-menu-padding-y) var(--pm7-menu-padding-x);
font-size: var(--pm7-text-xs);
font-weight: var(--pm7-font-semibold);
color: var(--pm7-muted-foreground);
text-transform: uppercase;
letter-spacing: var(--pm7-tracking-wider);
}
/* Menu section title - larger prominent headings */
.pm7-menu-section-title {
padding: 12px 16px 8px;
font-size: 16px;
font-weight: 600;
color: var(--pm7-foreground);
margin: 0;
line-height: 1.2;
}
/* Performance optimizations */
.pm7-menu-content {
/* Use transform for better performance */
will-change: transform, opacity;
/* Enable hardware acceleration */
transform: translateZ(0);
backface-visibility: hidden;
-webkit-font-smoothing: antialiased;
}
.pm7-menu-item {
/* Optimize repaints */
will-change: background-color;
/* Prevent text shifting on hover */
-webkit-font-smoothing: subpixel-antialiased;
}
/* Checkbox menu item */
.pm7-menu-item--checkbox {
position: relative;
padding-left: calc(var(--pm7-menu-padding-x) + 1.5rem); /* Space for checkmark */
}
.pm7-menu-item--checkbox::before {
content: '';
position: absolute;
left: var(--pm7-menu-padding-x);
top: 50%;
transform: translateY(-50%);
width: 1rem;
height: 1rem;
border: 1px solid var(--pm7-border);
border-radius: 50%; /* Make it round like radio button */
background-color: var(--pm7-background);
transition: none;
}
.pm7-menu-item--checkbox[data-checked="true"]::before {
background-color: var(--pm7-primary);
border-color: var(--pm7-primary);
}
.pm7-menu-item--checkbox[data-checked="true"]::after {
content: '';
position: absolute;
left: calc(var(--pm7-menu-padding-x) + 0.3125rem);
top: 50%;
width: 0.375rem;
height: 0.375rem;
background-color: var(--pm7-primary-foreground);
border-radius: 50%;
transform: translateY(-50%);
}
/* Checkbox hover state - invert colors for visibility */
.pm7-menu-item--checkbox:hover::before {
background-color: var(--pm7-menu-hover-text);
border-color: var(--pm7-menu-hover-text);
}
.pm7-menu-item--checkbox[data-checked="true"]:hover::before {
background-color: var(--pm7-menu-hover-text);
border-color: var(--pm7-menu-hover-text);
}
.pm7-menu-item--checkbox[data-checked="true"]:hover::after {
background-color: var(--pm7-menu-hover);
}
/* Radio menu item */
.pm7-menu-item--radio {
position: relative;
padding-left: calc(var(--pm7-menu-padding-x) + 1.5rem); /* Space for radio dot */
}
.pm7-menu-item--radio::before {
content: '';
position: absolute;
left: var(--pm7-menu-padding-x);
top: 50%;
transform: translateY(-50%);
width: 1rem;
height: 1rem;
border: 1px solid var(--pm7-border);
border-radius: 50%;
background-color: var(--pm7-background);
transition: none;
}
.pm7-menu-item--radio[data-checked="true"]::before {
background-color: var(--pm7-primary);
border-color: var(--pm7-primary);
}
.pm7-menu-item--radio[data-checked="true"]::after {
content: '';
position: absolute;
left: calc(var(--pm7-menu-padding-x) + 0.3125rem);
top: 50%;
width: 0.375rem;
height: 0.375rem;
background-color: var(--pm7-primary-foreground);
border-radius: 50%;
transform: translateY(-50%);
}
/* Radio hover state - invert colors for visibility */
.pm7-menu-item--radio:hover::before {
background-color: var(--pm7-menu-hover-text);
border-color: var(--pm7-menu-hover-text);
}
.pm7-menu-item--radio[data-checked="true"]:hover::before {
background-color: var(--pm7-menu-hover-text);
border-color: var(--pm7-menu-hover-text);
}
.pm7-menu-item--radio[data-checked="true"]:hover::after {
background-color: var(--pm7-menu-hover);
}
/* Switch menu item */
.pm7-menu-item--switch {
display: flex;
align-items: center;
justify-content: space-between;
}
.pm7-menu-switch {
position: relative;
width: 2.5rem; /* 40px */
height: 1.25rem; /* 20px */
background-color: var(--pm7-muted);
border-radius: 0.625rem; /* 10px */
transition: background-color 0.2s ease;
flex-shrink: 0;
}
.pm7-menu-switch::before {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 1rem; /* 16px */
height: 1rem; /* 16px */
background-color: var(--pm7-background);
border-radius: 50%;
transition: transform 0.2s ease;
box-shadow: var(--pm7-shadow-sm);
}
.pm7-menu-item--switch[data-checked="true"] .pm7-menu-switch {
background-color: var(--pm7-primary);
}
.pm7-menu-item--switch[data-checked="true"] .pm7-menu-switch::before {
transform: translateX(1.25rem); /* 20px */
}
/* Submenu */
.pm7-menu-item--has-submenu {
position: relative;
}
.pm7-menu-item--has-submenu::after {
content: '\25B6'; /* Right-pointing triangle */
margin-left: auto;
font-size: 0.75rem;
opacity: 0.7;
transition: transform 0.2s;
}
.pm7-menu-item--has-submenu[data-submenu-open="true"]::after {
transform: rotate(90deg);
}
/* Submenu container */
.pm7-submenu {
position: absolute;
top: -8px;
left: 100%;
min-width: 180px;
margin-left: 4px; /* Visual separation */
padding: 0.5rem;
background-color: var(--pm7-menu-bg);
border: 1px solid var(--pm7-border);
border-radius: var(--pm7-menu-radius);
box-shadow: var(--pm7-menu-shadow);
display: none;
z-index: 100;
}
/* Create invisible bridge to maintain hover state */
.pm7-submenu::before {
content: '';
position: absolute;
top: 0;
right: 100%;
width: 8px; /* Bridge width - covers the margin-left gap */
height: 100%;
background: transparent;
z-index: 1; /* Above submenu background */
}
/* Reset positioning for submenus - they should not inherit parent menu positioning */
.pm7-submenu.pm7-menu-content--top {
top: -8px !important;
bottom: auto !important;
margin-bottom: 0 !important;
margin-top: 0 !important;
}
/* Show submenu on hover or when active */
.pm7-menu-item--has-submenu:hover > .pm7-submenu,
.pm7-menu-item--has-submenu[data-submenu-open="true"] > .pm7-submenu,
.pm7-submenu:hover {
display: block;
}
/* Dark mode submenu */
@media (prefers-color-scheme: dark) {
.pm7-submenu {
border-color: var(--pm7-border-dark);
}
}
/* Mobile responsive breakpoint */
@media (max-width: 640px) {
.pm7-menu-content {
position: fixed;
left: var(--pm7-spacing-4);
right: var(--pm7-spacing-4);
max-width: none;
}
.pm7-submenu {
position: relative;
top: auto;
left: auto;
margin-left: 0;
margin-top: var(--pm7-spacing-2);
}
}
/* Menu icon */
.pm7-menu-icon {
margin-left: var(--pm7-spacing-2);
transition: transform 0.2s ease;
}
.pm7-menu-trigger[aria-expanded="true"] .pm7-menu-icon {
transform: rotate(180deg);
}
/* RTL support */
[dir="rtl"] .pm7-menu-item {
text-align: right;
}
[dir="rtl"] .pm7-menu-item-icon {
margin-right: 0;
margin-left: var(--pm7-menu-item-gap);
}
[dir="rtl"] .pm7-menu-item--has-submenu::after {
content: '\25C0'; /* Left-pointing triangle */
margin-left: 0;
margin-right: auto;
}
[dir="rtl"] .pm7-submenu {
left: auto;
right: 100%;
margin-left: 0;
margin-right: 4px;
}
/* RTL bridge positioning */
[dir="rtl"] .pm7-submenu::before {
right: auto;
left: 100%;
}
/* Flat variant without shadows - at end for highest specificity */
/* Individual flat menu */
.pm7-menu--flat .pm7-menu-content {
box-shadow: none !important;
border: 1px solid var(--pm7-border);
}
.pm7-menu--flat .pm7-menu-trigger.pm7-button:hover {
box-shadow: none !important;
}
.pm7-menu--flat .pm7-menu-trigger.pm7-button[aria-expanded="true"] {
box-shadow: none !important;
}
.pm7-menu--flat .pm7-menu-item:not(.pm7-menu-item--clicking):hover {
box-shadow: none !important;
}
.pm7-menu--flat .pm7-submenu {
box-shadow: none !important;
border: 1px solid var(--pm7-border);
}
/* Flat menu bar - applies to all menus within */
.pm7-menu-bar--flat .pm7-menu-content {
box-shadow: none !important;
border: 1px solid var(--pm7-border);
}
.pm7-menu-bar--flat .pm7-menu-trigger.pm7-button:hover,
.pm7-menu-bar--flat .pm7-menu-trigger.pm7-button--ghost:hover {
box-shadow: none !important;
}
.pm7-menu-bar--flat .pm7-menu-trigger.pm7-button[aria-expanded="true"] {
box-shadow: none !important;
}
.pm7-menu-bar--flat .pm7-menu-item:not(.pm7-menu-item--clicking):hover {
box-shadow: none !important;
}
.pm7-menu-bar--flat .pm7-submenu {
box-shadow: none !important;
border: 1px solid var(--pm7-border);
}
/* Flat hover variant - only removes hover shadows, keeps dropdown shadows */
/* Individual flat hover menu */
.pm7-menu--flat-hover .pm7-menu-trigger.pm7-button:hover {
box-shadow: none !important;
}
.pm7-menu--flat-hover .pm7-menu-trigger.pm7-button[aria-expanded="true"] {
box-shadow: none !important;
}
.pm7-menu--flat-hover .pm7-menu-item:not(.pm7-menu-item--clicking):hover {
box-shadow: none !important;
}
/* Flat hover menu bar - applies to all menus within */
.pm7-menu-bar--flat-hover .pm7-menu-trigger.pm7-button:hover,
.pm7-menu-bar--flat-hover .pm7-menu-trigger.pm7-button--ghost:hover {
box-shadow: none !important;
}
.pm7-menu-bar--flat-hover .pm7-menu-trigger.pm7-button[aria-expanded="true"] {
box-shadow: none !important;
}
.pm7-menu-bar--flat-hover .pm7-menu-item:not(.pm7-menu-item--clicking):hover {
box-shadow: none !important;
}
/* PM7 Dialog Component */
/* Dialog backdrop */
.pm7-dialog-overlay {
position: fixed;
inset: 0;
z-index: 10000;
background-color: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
opacity: 0;
visibility: hidden;
transition: opacity 200ms, visibility 200ms;
}
.pm7-dialog-overlay--open,
.pm7-dialog[data-state="open"] .pm7-dialog-overlay {
opacity: 1;
visibility: visible;
}
/* Dialog container */
.pm7-dialog {
position: fixed;
inset: 0;
z-index: 10000;
display: none;
pointer-events: none; /* Prevent blocking when hidden */
}
/* Hide original dialog structure before transformation */
[data-pm7-dialog] {
display: none;
}
/* Show when open */
[data-pm7-dialog][data-state="open"] {
display: block !important;
}
/* Hide dialog content until transformed */
.pm7-dialog:not([data-state]) {
display: none;
}
.pm7-dialog[data-state="closed"] {
display: none;
}
.pm7-dialog[data-state="open"] {
display: block;
pointer-events: auto; /* Re-enable when visible */
}
/* Closing state - keep visible for animation */
.pm7-dialog[data-state="closing"] {
display: block;
pointer-events: none;
}
/* Ensure content stays centered during close */
.pm7-dialog[data-state="closing"] .pm7-dialog-content {
opacity: 0;
visibility: hidden;
transition: opacity 200ms, visibility 200ms;
transform: translate(-50%, -50%);
}
/* Dialog content */
.pm7-dialog-content {
position: fixed;
left: 50%;
top: 50%;
z-index: 10001;
transform: translate(-50%, -50%);
width: 100%;
max-width: 600px;
max-height: 90vh;
background-color: var(--pm7-background);
border: 1px solid var(--pm7-border);
border-radius: var(--pm7-radius-lg);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
opacity: 0;
visibility: hidden;
transition: opacity 200ms, visibility 200ms;
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Dark mode overlay */
.dark .pm7-dialog-overlay {
background-color: rgba(0, 0, 0, 0.7);
}
/* Dark mode content shadow */
.dark .pm7-dialog-content {
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 10px 10px -5px rgba(0, 0, 0, 0.3);
}
.pm7-dialog--open .pm7-dialog-content,
.pm7-dialog[data-state="open"] .pm7-dialog-content {
opacity: 1;
visibility: visible;
}
/* Dialog sizes - using compound selectors for higher specificity */
.pm7-dialog-content.pm7-dialog-content--sm {
max-width: 400px;
}
.pm7-dialog-content.pm7-dialog-content--md {
max-width: 600px;
}
.pm7-dialog-content.pm7-dialog-content--lg {
max-width: 800px;
}
.pm7-dialog-content.pm7-dialog-content--xl {
max-width: 1000px;
}
.pm7-dialog-content.pm7-dialog-content--full {
width: calc(100vw - 2rem);
height: calc(100vh - 2rem);
max-width: none;
max-height: none;
}
/* Dialog header */
.pm7-dialog-header {
position: relative;
padding: var(--pm7-spacing-6);
padding-right: calc(var(--pm7-spacing-6) + 2.25rem + var(--pm7-spacing-2)); /* Adjust for icon + close button + gap */
display: flex;
justify-content: space-between;
align-items: flex-start;
flex-shrink: 0;
}
.pm7-dialog-header-text {
flex-grow: 1;
}
.pm7-dialog-header-actions {
display: flex;
align-items: center;
gap: var(--pm7-spacing-2);