/** * CannaIQ Modular Components CSS * * Styles for the modular component library. * Each component is independently styled and composable. * * @package CannaIQ_Menus * @since 2.0.0 */ /* ========================================================================== CSS Variables (Design Tokens) ========================================================================== */ :root { /* Strain Colors */ --cannaiq-sativa: #22c55e; --cannaiq-indica: #8b5cf6; --cannaiq-hybrid: #f97316; /* UI Colors */ --cannaiq-discount: #ef4444; --cannaiq-discount-bg: #fef2f2; --cannaiq-sale: #dc2626; --cannaiq-stock-in: #16a34a; --cannaiq-stock-out: #9ca3af; --cannaiq-price-original: #9ca3af; --cannaiq-price-sale: #dc2626; /* Neutrals */ --cannaiq-text-primary: #1f2937; --cannaiq-text-secondary: #6b7280; --cannaiq-text-muted: #9ca3af; --cannaiq-border: #e5e7eb; --cannaiq-bg-light: #f9fafb; /* Spacing */ --cannaiq-space-xs: 0.25rem; --cannaiq-space-sm: 0.5rem; --cannaiq-space-md: 0.75rem; --cannaiq-space-lg: 1rem; --cannaiq-space-xl: 1.5rem; /* Border Radius */ --cannaiq-radius-sm: 0.25rem; --cannaiq-radius-md: 0.375rem; --cannaiq-radius-lg: 0.5rem; --cannaiq-radius-xl: 0.75rem; --cannaiq-radius-full: 9999px; /* Shadows */ --cannaiq-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); --cannaiq-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1); --cannaiq-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1); } /* ========================================================================== Discount Ribbon ========================================================================== */ .cannaiq-discount-ribbon { display: inline-flex; align-items: center; justify-content: center; font-weight: 700; text-transform: uppercase; letter-spacing: 0.025em; white-space: nowrap; } /* Ribbon Style - Corner positioned */ .cannaiq-discount-ribbon--ribbon { position: absolute; top: 0; left: 0; background: var(--cannaiq-discount); color: white; padding: var(--cannaiq-space-xs) var(--cannaiq-space-md); font-size: 0.75rem; border-bottom-right-radius: var(--cannaiq-radius-md); z-index: 10; } /* Pill Style */ .cannaiq-discount-ribbon--pill { background: var(--cannaiq-discount); color: white; padding: var(--cannaiq-space-xs) var(--cannaiq-space-sm); font-size: 0.75rem; border-radius: var(--cannaiq-radius-full); } /* Text Style */ .cannaiq-discount-ribbon--text { color: var(--cannaiq-discount); font-size: 0.875rem; } /* Sizes */ .cannaiq-discount-ribbon--small { font-size: 0.625rem; padding: 2px var(--cannaiq-space-xs); } .cannaiq-discount-ribbon--large { font-size: 0.875rem; padding: var(--cannaiq-space-sm) var(--cannaiq-space-lg); } /* ========================================================================== Strain Badge ========================================================================== */ .cannaiq-strain-badge { display: inline-flex; align-items: center; gap: var(--cannaiq-space-xs); font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; border-radius: var(--cannaiq-radius-full); } /* Pill Style */ .cannaiq-strain-badge--pill { padding: var(--cannaiq-space-xs) var(--cannaiq-space-sm); font-size: 0.625rem; } /* Text Style */ .cannaiq-strain-badge--text { padding: 0; font-size: 0.75rem; } /* Strain Type Colors */ .cannaiq-strain-badge--sativa { background: var(--cannaiq-sativa); color: white; } .cannaiq-strain-badge--sativa.cannaiq-strain-badge--text { background: transparent; color: var(--cannaiq-sativa); } .cannaiq-strain-badge--indica { background: var(--cannaiq-indica); color: white; } .cannaiq-strain-badge--indica.cannaiq-strain-badge--text { background: transparent; color: var(--cannaiq-indica); } .cannaiq-strain-badge--hybrid { background: var(--cannaiq-hybrid); color: white; } .cannaiq-strain-badge--hybrid.cannaiq-strain-badge--text { background: transparent; color: var(--cannaiq-hybrid); } /* Sizes */ .cannaiq-strain-badge--small { font-size: 0.5rem; padding: 2px var(--cannaiq-space-xs); } .cannaiq-strain-badge--large { font-size: 0.75rem; padding: var(--cannaiq-space-sm) var(--cannaiq-space-md); } /* ========================================================================== THC/CBD Badge ========================================================================== */ .cannaiq-potency-badge { display: inline-flex; align-items: center; gap: var(--cannaiq-space-xs); font-weight: 600; } /* Badge Style */ .cannaiq-potency-badge--badge { background: var(--cannaiq-bg-light); border: 1px solid var(--cannaiq-border); padding: var(--cannaiq-space-xs) var(--cannaiq-space-sm); border-radius: var(--cannaiq-radius-md); font-size: 0.75rem; } /* Pill Style */ .cannaiq-potency-badge--pill { background: var(--cannaiq-text-primary); color: white; padding: var(--cannaiq-space-xs) var(--cannaiq-space-sm); border-radius: var(--cannaiq-radius-full); font-size: 0.75rem; } /* Text Style */ .cannaiq-potency-badge--text { color: var(--cannaiq-text-secondary); font-size: 0.875rem; } .cannaiq-potency-badge__label { color: var(--cannaiq-text-muted); font-size: 0.625rem; text-transform: uppercase; letter-spacing: 0.05em; } .cannaiq-potency-badge__value { font-weight: 700; } /* ========================================================================== THC/CBD Meter (Visual Progress Bar) ========================================================================== */ .cannaiq-potency-meter { display: flex; flex-direction: column; gap: var(--cannaiq-space-xs); } .cannaiq-potency-meter__header { display: flex; justify-content: space-between; align-items: center; font-size: 0.75rem; } .cannaiq-potency-meter__label { font-weight: 600; color: var(--cannaiq-text-secondary); text-transform: uppercase; letter-spacing: 0.05em; } .cannaiq-potency-meter__value { font-weight: 700; color: var(--cannaiq-text-primary); } .cannaiq-potency-meter__bar { height: 6px; background: var(--cannaiq-border); border-radius: var(--cannaiq-radius-full); overflow: hidden; } .cannaiq-potency-meter__fill { height: 100%; border-radius: var(--cannaiq-radius-full); transition: width 0.3s ease; } .cannaiq-potency-meter--thc .cannaiq-potency-meter__fill { background: linear-gradient(90deg, #22c55e 0%, #16a34a 100%); } .cannaiq-potency-meter--cbd .cannaiq-potency-meter__fill { background: linear-gradient(90deg, #3b82f6 0%, #2563eb 100%); } /* ========================================================================== Effects Display ========================================================================== */ .cannaiq-effects-container { display: flex; flex-wrap: wrap; gap: var(--cannaiq-space-sm); } .cannaiq-effect-chip { display: inline-flex; align-items: center; gap: var(--cannaiq-space-xs); background: color-mix(in srgb, var(--effect-color, #6b7280) 15%, white); border: 1px solid color-mix(in srgb, var(--effect-color, #6b7280) 30%, white); border-radius: var(--cannaiq-radius-full); padding: var(--cannaiq-space-xs) var(--cannaiq-space-sm); font-size: 0.75rem; font-weight: 500; color: var(--cannaiq-text-primary); transition: transform 0.15s ease, box-shadow 0.15s ease; } .cannaiq-effect-chip:hover { transform: translateY(-1px); box-shadow: var(--cannaiq-shadow-sm); } .cannaiq-effect-chip svg { flex-shrink: 0; } .cannaiq-effect-chip__label { white-space: nowrap; } /* Effect Chip Sizes */ .cannaiq-effect-chip--small { padding: 2px var(--cannaiq-space-xs); font-size: 0.625rem; gap: 2px; } .cannaiq-effect-chip--large { padding: var(--cannaiq-space-sm) var(--cannaiq-space-md); font-size: 0.875rem; } /* ========================================================================== Terpene Profile ========================================================================== */ .cannaiq-terpenes { display: flex; flex-direction: column; gap: var(--cannaiq-space-sm); } .cannaiq-terpenes--chips { flex-direction: row; flex-wrap: wrap; } .cannaiq-terpene-chip { display: inline-flex; align-items: center; gap: var(--cannaiq-space-xs); background: var(--cannaiq-bg-light); border: 1px solid var(--cannaiq-border); border-radius: var(--cannaiq-radius-full); padding: var(--cannaiq-space-xs) var(--cannaiq-space-sm); font-size: 0.75rem; } .cannaiq-terpene-chip__name { font-weight: 500; color: var(--cannaiq-text-primary); } .cannaiq-terpene-chip__percent { color: var(--cannaiq-text-secondary); } /* Terpene List Style */ .cannaiq-terpenes--list .cannaiq-terpene-item { display: flex; justify-content: space-between; align-items: center; padding: var(--cannaiq-space-xs) 0; border-bottom: 1px solid var(--cannaiq-border); } .cannaiq-terpenes--list .cannaiq-terpene-item:last-child { border-bottom: none; } /* ========================================================================== Price Block ========================================================================== */ .cannaiq-price-block { display: flex; align-items: baseline; gap: var(--cannaiq-space-sm); flex-wrap: wrap; } .cannaiq-price-block--stacked { flex-direction: column; align-items: flex-start; gap: var(--cannaiq-space-xs); } .cannaiq-price-block__original { color: var(--cannaiq-price-original); text-decoration: line-through; font-size: 0.875rem; } .cannaiq-price-block__sale { color: var(--cannaiq-price-sale); font-weight: 700; font-size: 1.25rem; } .cannaiq-price-block__regular { color: var(--cannaiq-text-primary); font-weight: 700; font-size: 1.25rem; } .cannaiq-price-block__weight { color: var(--cannaiq-text-muted); font-size: 0.875rem; } /* Price Sizes */ .cannaiq-price-block--small .cannaiq-price-block__sale, .cannaiq-price-block--small .cannaiq-price-block__regular { font-size: 1rem; } .cannaiq-price-block--small .cannaiq-price-block__original { font-size: 0.75rem; } .cannaiq-price-block--large .cannaiq-price-block__sale, .cannaiq-price-block--large .cannaiq-price-block__regular { font-size: 1.5rem; } /* ========================================================================== Cart Button ========================================================================== */ .cannaiq-cart-button { display: inline-flex; align-items: center; justify-content: center; gap: var(--cannaiq-space-sm); padding: var(--cannaiq-space-md) var(--cannaiq-space-xl); font-weight: 600; font-size: 0.875rem; text-decoration: none; border-radius: var(--cannaiq-radius-md); cursor: pointer; transition: all 0.15s ease; border: 2px solid transparent; text-transform: uppercase; letter-spacing: 0.025em; } /* Solid Style */ .cannaiq-cart-button--solid { background: var(--cannaiq-text-primary); color: white; border-color: var(--cannaiq-text-primary); } .cannaiq-cart-button--solid:hover { background: #374151; border-color: #374151; transform: translateY(-1px); box-shadow: var(--cannaiq-shadow-md); } /* Outline Style */ .cannaiq-cart-button--outline { background: transparent; color: var(--cannaiq-text-primary); border-color: var(--cannaiq-text-primary); } .cannaiq-cart-button--outline:hover { background: var(--cannaiq-text-primary); color: white; } /* Full Width */ .cannaiq-cart-button--full { width: 100%; } /* Sizes */ .cannaiq-cart-button--small { padding: var(--cannaiq-space-sm) var(--cannaiq-space-md); font-size: 0.75rem; } .cannaiq-cart-button--large { padding: var(--cannaiq-space-lg) var(--cannaiq-space-xl); font-size: 1rem; } /* ========================================================================== Stock Indicator ========================================================================== */ .cannaiq-stock-indicator { display: inline-flex; align-items: center; gap: var(--cannaiq-space-xs); font-size: 0.75rem; font-weight: 500; } .cannaiq-stock-indicator--in-stock { color: var(--cannaiq-stock-in); } .cannaiq-stock-indicator--out-of-stock { color: var(--cannaiq-stock-out); } /* Badge Style */ .cannaiq-stock-indicator--badge { padding: var(--cannaiq-space-xs) var(--cannaiq-space-sm); border-radius: var(--cannaiq-radius-md); } .cannaiq-stock-indicator--badge.cannaiq-stock-indicator--in-stock { background: #dcfce7; } .cannaiq-stock-indicator--badge.cannaiq-stock-indicator--out-of-stock { background: #f3f4f6; } /* Dot Indicator */ .cannaiq-stock-indicator__dot { width: 8px; height: 8px; border-radius: 50%; background: currentColor; } /* ========================================================================== Product Image with Overlays ========================================================================== */ .cannaiq-product-image { position: relative; overflow: hidden; border-radius: var(--cannaiq-radius-lg); background: var(--cannaiq-bg-light); } .cannaiq-product-image img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease; } .cannaiq-product-image:hover img { transform: scale(1.05); } .cannaiq-product-image__overlay { position: absolute; padding: var(--cannaiq-space-sm); } .cannaiq-product-image__overlay--top-left { top: 0; left: 0; } .cannaiq-product-image__overlay--top-right { top: 0; right: 0; } .cannaiq-product-image__overlay--bottom-left { bottom: 0; left: 0; } .cannaiq-product-image__overlay--bottom-right { bottom: 0; right: 0; } /* Badge Stack in Overlays */ .cannaiq-product-image__badges { display: flex; gap: var(--cannaiq-space-xs); flex-wrap: wrap; } /* ========================================================================== Weight Options Selector ========================================================================== */ .cannaiq-weight-options { display: flex; gap: var(--cannaiq-space-xs); flex-wrap: wrap; } .cannaiq-weight-option { padding: var(--cannaiq-space-xs) var(--cannaiq-space-sm); border: 1px solid var(--cannaiq-border); border-radius: var(--cannaiq-radius-md); font-size: 0.75rem; font-weight: 500; cursor: pointer; transition: all 0.15s ease; background: white; } .cannaiq-weight-option:hover { border-color: var(--cannaiq-text-primary); } .cannaiq-weight-option--selected { background: var(--cannaiq-text-primary); color: white; border-color: var(--cannaiq-text-primary); } .cannaiq-weight-option__price { color: var(--cannaiq-text-secondary); margin-left: var(--cannaiq-space-xs); } .cannaiq-weight-option--selected .cannaiq-weight-option__price { color: rgba(255, 255, 255, 0.8); } /* Dropdown Style */ .cannaiq-weight-options--dropdown { display: block; } .cannaiq-weight-options--dropdown select { width: 100%; padding: var(--cannaiq-space-sm) var(--cannaiq-space-md); border: 1px solid var(--cannaiq-border); border-radius: var(--cannaiq-radius-md); font-size: 0.875rem; background: white; cursor: pointer; } /* ========================================================================== Card Container (for premade templates) ========================================================================== */ .cannaiq-product-card { display: flex; flex-direction: column; background: white; border-radius: var(--cannaiq-radius-xl); overflow: hidden; box-shadow: var(--cannaiq-shadow-sm); transition: box-shadow 0.2s ease, transform 0.2s ease; } .cannaiq-product-card:hover { box-shadow: var(--cannaiq-shadow-lg); transform: translateY(-2px); } .cannaiq-product-card__image { position: relative; aspect-ratio: 1; overflow: hidden; } .cannaiq-product-card__body { padding: var(--cannaiq-space-lg); display: flex; flex-direction: column; gap: var(--cannaiq-space-sm); flex: 1; } .cannaiq-product-card__title { font-size: 1rem; font-weight: 700; color: var(--cannaiq-text-primary); margin: 0; line-height: 1.3; } .cannaiq-product-card__brand { font-size: 0.875rem; color: var(--cannaiq-text-secondary); margin: 0; } .cannaiq-product-card__footer { margin-top: auto; padding-top: var(--cannaiq-space-md); } /* ========================================================================== Utility Classes ========================================================================== */ .cannaiq-flex { display: flex; } .cannaiq-flex-wrap { flex-wrap: wrap; } .cannaiq-items-center { align-items: center; } .cannaiq-justify-between { justify-content: space-between; } .cannaiq-gap-xs { gap: var(--cannaiq-space-xs); } .cannaiq-gap-sm { gap: var(--cannaiq-space-sm); } .cannaiq-gap-md { gap: var(--cannaiq-space-md); } .cannaiq-gap-lg { gap: var(--cannaiq-space-lg); } .cannaiq-mt-auto { margin-top: auto; } .cannaiq-text-center { text-align: center; } .cannaiq-truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }