/** * WC Licensed Product - Frontend Styles * Uses WordPress Global Styles CSS Custom Properties * * @package Jeremias\WcLicensedProduct */ /* ======================================== CSS Custom Properties Uses WordPress theme.json global styles with fallbacks ======================================== */ .woocommerce-licenses, .wclp-modal, #licensed-product-domain-field { /* Colors - inherit from WordPress global styles */ --wclp-color-base: var(--wp--preset--color--base, #FFFFFF); --wclp-color-contrast: var(--wp--preset--color--contrast, #111111); --wclp-color-accent-4: var(--wp--preset--color--accent-4, #686868); --wclp-color-accent-5: var(--wp--preset--color--accent-5, #f5f5f5); --wclp-color-accent-6: var(--wp--preset--color--accent-6, rgba(0, 0, 0, 0.1)); /* Typography - inherit from WordPress global styles */ --wclp-font-family: var(--wp--preset--font-family--body, inherit); --wclp-font-family-mono: var(--wp--preset--font-family--monospace, "Fira Code", Consolas, Monaco, monospace); --wclp-font-size-small: var(--wp--preset--font-size--small, 0.875rem); --wclp-font-size-medium: var(--wp--preset--font-size--medium, 1rem); /* Spacing - inherit from WordPress global styles */ --wclp-spacing-20: var(--wp--preset--spacing--20, 10px); --wclp-spacing-30: var(--wp--preset--spacing--30, 20px); --wclp-spacing-40: var(--wp--preset--spacing--40, 30px); /* Border radius */ --wclp-border-radius: 0.25rem; --wclp-border-radius-pill: 3.125rem; /* Derived colors using color-mix for transparency */ --wclp-border-color: color-mix(in srgb, var(--wclp-color-contrast) 15%, transparent); --wclp-border-color-hover: color-mix(in srgb, var(--wclp-color-contrast) 30%, transparent); --wclp-bg-subtle: color-mix(in srgb, var(--wclp-color-contrast) 3%, var(--wclp-color-base)); } /* ======================================== License Status Badges ======================================== */ .license-status { display: inline-block; padding: 0.35em 0.85em; font-size: var(--wclp-font-size-small); font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: var(--wclp-border-radius-pill); letter-spacing: 0.02em; } .license-status-active { background-color: color-mix(in srgb, green 15%, var(--wclp-color-base)); color: color-mix(in srgb, green 70%, var(--wclp-color-contrast)); } .license-status-inactive { background-color: color-mix(in srgb, orange 15%, var(--wclp-color-base)); color: color-mix(in srgb, orange 80%, var(--wclp-color-contrast)); } .license-status-expired { background-color: color-mix(in srgb, red 15%, var(--wclp-color-base)); color: color-mix(in srgb, red 70%, var(--wclp-color-contrast)); } .license-status-revoked { background-color: var(--wclp-bg-subtle); color: var(--wclp-color-accent-4); } /* ======================================== License Cards Container ======================================== */ .woocommerce-licenses { display: flex; flex-direction: column; gap: var(--wclp-spacing-40); font-family: var(--wclp-font-family); color: var(--wclp-color-contrast); } .woocommerce-licenses > p:first-child:last-child { color: var(--wclp-color-accent-4); font-style: italic; } /* ======================================== License Card ======================================== */ .license-card { border: 1px solid var(--wclp-border-color); border-radius: var(--wclp-border-radius); overflow: hidden; background: var(--wclp-color-base); transition: border-color 0.2s ease; } .license-card:hover { border-color: var(--wclp-border-color-hover); } /* License Header */ .license-header { display: flex; justify-content: space-between; align-items: center; padding: var(--wclp-spacing-30); background: var(--wclp-bg-subtle); border-bottom: 1px solid var(--wclp-border-color); gap: 1rem; } .license-header h3 { margin: 0; font-size: var(--wclp-font-size-medium); font-weight: 500; letter-spacing: -0.1px; color: var(--wclp-color-contrast); } .license-header h3 a { color: inherit; text-decoration: none; } .license-header h3 a:hover { text-decoration: underline; } /* License Details */ .license-details { padding: var(--wclp-spacing-30); background: var(--wclp-color-base); } /* License Key Row */ .license-key-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: var(--wclp-spacing-30); flex-wrap: wrap; } .license-key-row label { font-weight: 500; font-size: var(--wclp-font-size-small); color: var(--wclp-color-accent-4); } .license-key-row code, .license-key { font-family: var(--wclp-font-family-mono); background-color: var(--wclp-bg-subtle); padding: 0.5em 1em; border-radius: var(--wclp-border-radius); font-size: var(--wclp-font-size-small); font-weight: 400; letter-spacing: 0.05em; color: var(--wclp-color-contrast); border: 1px solid var(--wclp-border-color); } /* Copy Button */ .copy-license-btn { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 0; background: var(--wclp-color-base); border: 1px solid var(--wclp-border-color); border-radius: var(--wclp-border-radius); cursor: pointer; transition: all 0.2s ease; color: var(--wclp-color-accent-4); } .copy-license-btn:hover { background: var(--wclp-bg-subtle); border-color: var(--wclp-border-color-hover); color: var(--wclp-color-contrast); } .copy-license-btn .dashicons { font-size: 18px; width: 18px; height: 18px; } .copy-feedback { display: inline-block; margin-left: 0.5em; padding: 0.35em 0.75em; font-size: var(--wclp-font-size-small); border-radius: var(--wclp-border-radius-pill); animation: wclpFadeIn 0.2s ease; } @keyframes wclpFadeIn { from { opacity: 0; transform: translateY(-5px); } to { opacity: 1; transform: translateY(0); } } .copy-feedback.success { background: color-mix(in srgb, green 15%, var(--wclp-color-base)); color: color-mix(in srgb, green 70%, var(--wclp-color-contrast)); } .copy-feedback.error { background: color-mix(in srgb, red 15%, var(--wclp-color-base)); color: color-mix(in srgb, red 70%, var(--wclp-color-contrast)); } /* License Info Row */ .license-info-row { display: flex; gap: 2rem; color: var(--wclp-color-accent-4); font-size: var(--wclp-font-size-small); flex-wrap: wrap; } .license-info-row strong { font-weight: 500; color: var(--wclp-color-contrast); } .license-domain-display { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; } .domain-value { font-family: var(--wclp-font-family-mono); font-size: var(--wclp-font-size-small); } /* ======================================== Transfer Button ======================================== */ .wclp-transfer-btn { display: inline-flex; align-items: center; gap: 0.35em; padding: 0.4em 0.8em; background: var(--wclp-color-base); border: 1px solid var(--wclp-border-color); border-radius: var(--wclp-border-radius-pill); font-size: var(--wclp-font-size-small); font-weight: 500; color: var(--wclp-color-accent-4); cursor: pointer; transition: all 0.2s ease; } .wclp-transfer-btn:hover { background: var(--wclp-bg-subtle); border-color: var(--wclp-border-color-hover); color: var(--wclp-color-contrast); } .wclp-transfer-btn .dashicons { font-size: 14px; width: 14px; height: 14px; } /* ======================================== Downloads Section ======================================== */ .license-downloads { padding: var(--wclp-spacing-30); background: var(--wclp-bg-subtle); border-top: 1px solid var(--wclp-border-color); } .license-downloads h4 { margin: 0 0 var(--wclp-spacing-20) 0; font-size: var(--wclp-font-size-small); font-weight: 500; color: var(--wclp-color-contrast); text-transform: uppercase; letter-spacing: 0.5px; } .download-list { list-style: none; margin: 0; padding: 0; } .download-list li { display: flex; align-items: center; gap: 1rem; padding: 0.75rem 0; border-bottom: 1px solid var(--wclp-border-color); } .download-list li:last-child { border-bottom: none; padding-bottom: 0; } .download-list li:first-child { padding-top: 0; } .download-link { display: inline-flex; align-items: center; gap: 0.5em; color: var(--wclp-color-contrast); text-decoration: none; font-weight: 500; font-size: var(--wclp-font-size-medium); transition: opacity 0.2s ease; } .download-link:hover { text-decoration: underline; } .download-link .dashicons { font-size: 18px; width: 18px; height: 18px; color: var(--wclp-color-accent-4); } .download-version { background: var(--wclp-color-base); padding: 0.25em 0.65em; border-radius: var(--wclp-border-radius-pill); font-size: var(--wclp-font-size-small); font-family: var(--wclp-font-family-mono); color: var(--wclp-color-accent-4); border: 1px solid var(--wclp-border-color); } .download-date { color: var(--wclp-color-accent-4); font-size: var(--wclp-font-size-small); margin-left: auto; } /* ======================================== Domain Field at Checkout ======================================== */ #licensed-product-domain-field { margin-top: var(--wclp-spacing-40); padding: var(--wclp-spacing-30); background-color: var(--wclp-bg-subtle); border: 1px solid var(--wclp-border-color); border-radius: var(--wclp-border-radius); } #licensed-product-domain-field h3 { margin-top: 0; margin-bottom: var(--wclp-spacing-20); font-size: var(--wclp-font-size-medium); font-weight: 500; color: var(--wclp-color-contrast); } #licensed-product-domain-field .description { display: block; margin-top: 0.5em; font-size: var(--wclp-font-size-small); color: var(--wclp-color-accent-4); } #licensed-product-domain-field input[type="text"] { border-radius: var(--wclp-border-radius); border: 1px solid var(--wclp-border-color); padding: 0.75em 1em; font-size: var(--wclp-font-size-medium); font-family: var(--wclp-font-family); background: var(--wclp-color-base); color: var(--wclp-color-contrast); } #licensed-product-domain-field input[type="text"]:focus { border-color: var(--wclp-color-contrast); outline: none; box-shadow: 0 0 0 1px var(--wclp-color-contrast); } /* ======================================== Legacy Table (backwards compatibility) ======================================== */ .woocommerce-licenses-table { width: 100%; border-collapse: collapse; margin-bottom: 1em; font-size: var(--wclp-font-size-medium); font-family: var(--wclp-font-family); color: var(--wclp-color-contrast); } .woocommerce-licenses-table th, .woocommerce-licenses-table td { padding: 0.75em; text-align: left; border-bottom: 1px solid var(--wclp-border-color); } .woocommerce-licenses-table th { font-weight: 500; background-color: var(--wclp-bg-subtle); font-size: var(--wclp-font-size-small); text-transform: uppercase; letter-spacing: 0.5px; } .woocommerce-licenses-table code { font-family: var(--wclp-font-family-mono); background-color: var(--wclp-bg-subtle); padding: 0.3em 0.6em; border-radius: var(--wclp-border-radius); font-size: var(--wclp-font-size-small); } /* ======================================== Responsive Design ======================================== */ @media screen and (max-width: 768px) { .license-header { flex-direction: column; align-items: flex-start; gap: 0.75rem; } .license-key-row { flex-direction: column; align-items: flex-start; gap: 0.5rem; } .license-info-row { flex-direction: column; gap: 0.75rem; } .download-list li { flex-wrap: wrap; gap: 0.5rem; } .download-date { margin-left: 0; width: 100%; } .woocommerce-licenses-table, .woocommerce-licenses-table thead, .woocommerce-licenses-table tbody, .woocommerce-licenses-table th, .woocommerce-licenses-table td, .woocommerce-licenses-table tr { display: block; } .woocommerce-licenses-table thead tr { position: absolute; top: -9999px; left: -9999px; } .woocommerce-licenses-table tr { border: 1px solid var(--wclp-border-color); margin-bottom: 1em; border-radius: var(--wclp-border-radius); overflow: hidden; } .woocommerce-licenses-table td { border: none; position: relative; padding-left: 50%; border-bottom: 1px solid var(--wclp-border-color); } .woocommerce-licenses-table td:last-child { border-bottom: none; } .woocommerce-licenses-table td:before { content: attr(data-title); position: absolute; left: 0.75em; width: 45%; font-weight: 500; font-size: var(--wclp-font-size-small); color: var(--wclp-color-accent-4); } .license-domain-display { flex-wrap: wrap; } .wclp-transfer-btn { margin-top: 0.5em; } } /* ======================================== Transfer Modal ======================================== */ .wclp-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 100000; display: flex; align-items: center; justify-content: center; font-family: var(--wclp-font-family); } .wclp-modal-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: color-mix(in srgb, var(--wclp-color-contrast) 40%, transparent); backdrop-filter: blur(2px); } .wclp-modal-content { position: relative; background: var(--wclp-color-base); padding: var(--wclp-spacing-40); border-radius: var(--wclp-border-radius); max-width: 450px; width: 90%; max-height: 90vh; overflow-y: auto; box-shadow: 0 10px 40px color-mix(in srgb, var(--wclp-color-contrast) 20%, transparent); color: var(--wclp-color-contrast); } .wclp-modal-close { position: absolute; top: var(--wclp-spacing-20); right: var(--wclp-spacing-20); background: none; border: none; font-size: 1.5em; cursor: pointer; color: var(--wclp-color-accent-4); line-height: 1; padding: 0.25em; border-radius: var(--wclp-border-radius); transition: all 0.2s ease; } .wclp-modal-close:hover { color: var(--wclp-color-contrast); background: var(--wclp-bg-subtle); } .wclp-modal-content h3 { margin: 0 0 var(--wclp-spacing-30) 0; font-size: 1.25rem; font-weight: 500; letter-spacing: -0.1px; color: var(--wclp-color-contrast); } /* Form Styles */ .wclp-form-row { margin-bottom: var(--wclp-spacing-30); } .wclp-form-row label { display: block; font-weight: 500; margin-bottom: 0.5em; font-size: var(--wclp-font-size-small); color: var(--wclp-color-contrast); } .wclp-form-row input[type="text"] { width: 100%; padding: 0.875em 1em; border: 1px solid var(--wclp-border-color); border-radius: var(--wclp-border-radius); font-size: var(--wclp-font-size-medium); font-family: var(--wclp-font-family); background: var(--wclp-color-base); color: var(--wclp-color-contrast); transition: border-color 0.2s ease, box-shadow 0.2s ease; } .wclp-form-row input[type="text"]:focus { outline: none; border-color: var(--wclp-color-contrast); box-shadow: 0 0 0 1px var(--wclp-color-contrast); } .wclp-current-domain { margin: 0; } .wclp-current-domain code { font-family: var(--wclp-font-family-mono); background: var(--wclp-bg-subtle); padding: 0.5em 1em; border-radius: var(--wclp-border-radius); font-size: var(--wclp-font-size-medium); border: 1px solid var(--wclp-border-color); display: inline-block; color: var(--wclp-color-contrast); } .wclp-field-description { margin: 0.5em 0 0 0; font-size: var(--wclp-font-size-small); color: var(--wclp-color-accent-4); } /* Form Actions */ .wclp-form-actions { display: flex; gap: 1rem; margin-top: var(--wclp-spacing-40); } /* Primary Button - uses theme contrast color */ .wclp-btn-primary { background: var(--wclp-color-contrast) !important; border: none !important; color: var(--wclp-color-base) !important; padding: 1rem 2.25rem !important; border-radius: var(--wclp-border-radius) !important; font-size: var(--wclp-font-size-medium) !important; font-weight: 500 !important; font-family: var(--wclp-font-family) !important; cursor: pointer; transition: opacity 0.2s ease; } .wclp-btn-primary:hover { opacity: 0.85; } .wclp-btn-primary:disabled { opacity: 0.6; cursor: not-allowed; } /* Secondary/Cancel Button - outline style */ .wclp-modal-cancel { background: transparent !important; border: 1px solid var(--wclp-border-color-hover) !important; color: var(--wclp-color-contrast) !important; padding: calc(1rem - 1px) calc(2.25rem - 1px) !important; border-radius: var(--wclp-border-radius) !important; font-size: var(--wclp-font-size-medium) !important; font-weight: 500 !important; font-family: var(--wclp-font-family) !important; cursor: pointer; transition: background 0.2s ease; } .wclp-modal-cancel:hover { background: var(--wclp-bg-subtle) !important; } /* Message Styles */ .wclp-message { margin-top: var(--wclp-spacing-20); padding: 1em 1.25em; border-radius: var(--wclp-border-radius); font-size: var(--wclp-font-size-small); animation: wclpFadeIn 0.3s ease; } .wclp-message.success { background: color-mix(in srgb, green 15%, var(--wclp-color-base)); color: color-mix(in srgb, green 70%, var(--wclp-color-contrast)); } .wclp-message.error { background: color-mix(in srgb, red 15%, var(--wclp-color-base)); color: color-mix(in srgb, red 70%, var(--wclp-color-contrast)); }