/* ==========================================================================
WPSubscription Admin Components (prefix: wpsubs-)
Design reference: WP SmartPay sp-layout.css
========================================================================== */
/* --------------------------------------------------------------------------
Design tokens
-------------------------------------------------------------------------- */
:root {
--wpsubs-brand: #2271b1;
--wpsubs-brand-dark: #135e96;
--wpsubs-brand-light: #eef4fb;
--wpsubs-brand-ring: rgba(34, 113, 177, 0.2);
--wpsubs-surface: #ffffff;
--wpsubs-surface-muted: #f9fafb;
--wpsubs-border: #e5e7eb;
--wpsubs-border-strong: #d1d5db;
--wpsubs-text: #374151;
--wpsubs-text-muted: #6b7280;
--wpsubs-text-subtle: #9ca3af;
--wpsubs-radius: 8px;
--wpsubs-radius-sm: 5px;
--wpsubs-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
--wpsubs-shadow-md: 0 4px 16px rgba(0, 0, 0, 0.1), 0 1px 4px rgba(0, 0, 0, 0.06);
}
/* --------------------------------------------------------------------------
Page layout wrapper
-------------------------------------------------------------------------- */
.wpsubs-layout {
max-width: 80rem;
margin: 0 auto;
padding: 24px 0 48px;
box-sizing: border-box;
}
/* --------------------------------------------------------------------------
Toolbar
-------------------------------------------------------------------------- */
.wpsubs-toolbar {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 16px;
}
.wpsubs-toolbar__spacer {
flex: 1;
min-width: 8px;
}
/* --------------------------------------------------------------------------
Base input
-------------------------------------------------------------------------- */
.wpsubs-input {
display: block;
width: 100%;
height: 36px;
min-height: 36px !important;
padding: 0 12px;
border: 1px solid var(--wpsubs-border) !important;
border-radius: var(--wpsubs-radius-sm) !important;
background: var(--wpsubs-surface) !important;
font-size: 13px !important;
font-family: inherit !important;
color: var(--wpsubs-text) !important;
outline: none !important;
box-shadow: none !important;
box-sizing: border-box;
transition:
border-color 0.15s,
box-shadow 0.15s;
}
.wpsubs-input:focus {
border-color: var(--wpsubs-brand) !important;
box-shadow: 0 0 0 3px var(--wpsubs-brand-ring) !important;
}
.wpsubs-input::placeholder {
color: var(--wpsubs-text-subtle) !important;
}
.wpsubs-input:disabled {
opacity: 0.55;
cursor: not-allowed;
background: var(--wpsubs-surface-muted) !important;
}
/* --------------------------------------------------------------------------
Input with icon (.wpsubs-input-wrap)
Usage:
Modifiers: --icon-l (icon on left) --icon-r (icon on right)
-------------------------------------------------------------------------- */
.wpsubs-input-wrap {
position: relative;
display: inline-flex;
align-items: center;
width: 100%;
}
.wpsubs-input-wrap .wpsubs-input-icon {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 15px;
height: 15px;
color: var(--wpsubs-text-subtle);
pointer-events: none;
flex-shrink: 0;
}
.wpsubs-input-wrap--icon-l .wpsubs-input-icon {
left: 10px;
}
.wpsubs-input-wrap--icon-l .wpsubs-input {
padding-left: 34px !important;
}
.wpsubs-input-wrap--icon-r .wpsubs-input-icon {
right: 10px;
}
.wpsubs-input-wrap--icon-r .wpsubs-input {
padding-right: 34px !important;
}
/* --------------------------------------------------------------------------
Input group (.wpsubs-input-group)
A flex row that snaps children edge-to-edge with shared borders.
Children: .wpsubs-input, .wpsubs-btn, .wpsubs-select, .wpsubs-adv-select
Usage:
-------------------------------------------------------------------------- */
.wpsubs-input-group {
display: inline-flex;
align-items: stretch;
}
.wpsubs-input-group > .wpsubs-input,
.wpsubs-input-group > .wpsubs-btn,
.wpsubs-input-group > .wpsubs-tooltip > .wpsubs-btn,
.wpsubs-input-group > .wpsubs-select,
.wpsubs-input-group > .wpsubs-adv-select > .wpsubs-adv-select__trigger {
border-radius: 0 !important;
}
/* Normalise button height to match input height inside a group */
.wpsubs-input-group > .wpsubs-btn,
.wpsubs-input-group > .wpsubs-tooltip > .wpsubs-btn {
height: 36px;
}
/* Restore radius on first and last direct children */
.wpsubs-input-group > :first-child,
.wpsubs-input-group > :first-child > .wpsubs-adv-select__trigger {
border-top-left-radius: var(--wpsubs-radius-sm) !important;
border-bottom-left-radius: var(--wpsubs-radius-sm) !important;
}
.wpsubs-input-group > :last-child,
.wpsubs-input-group > :last-child > .wpsubs-adv-select__trigger,
.wpsubs-input-group > :last-child > .wpsubs-btn {
border-top-right-radius: var(--wpsubs-radius-sm) !important;
border-bottom-right-radius: var(--wpsubs-radius-sm) !important;
}
/* Collapse adjacent borders */
.wpsubs-input-group > *:not(:first-child),
.wpsubs-input-group > .wpsubs-adv-select:not(:first-child) > .wpsubs-adv-select__trigger {
margin-left: -1px;
}
/* Bring focused item to front so its border ring shows fully */
.wpsubs-input-group > .wpsubs-input:focus,
.wpsubs-input-group > .wpsubs-btn:focus,
.wpsubs-input-group > .wpsubs-tooltip > .wpsubs-btn:focus,
.wpsubs-input-group > .wpsubs-select:focus,
.wpsubs-input-group > .wpsubs-adv-select--open > .wpsubs-adv-select__trigger {
position: relative;
z-index: 1;
}
/* --------------------------------------------------------------------------
Search — convenience wrapper around input-wrap (backward compat kept)
-------------------------------------------------------------------------- */
.wpsubs-search {
min-width: 180px;
max-width: 280px;
}
.wpsubs-search .wpsubs-input-wrap {
width: 100%;
}
/* --------------------------------------------------------------------------
Buttons
-------------------------------------------------------------------------- */
.wpsubs-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 5px;
height: 40px;
padding: 0 14px;
border-radius: var(--wpsubs-radius-sm);
font-size: 13px;
font-weight: 500;
font-family: inherit;
cursor: pointer;
white-space: nowrap;
text-decoration: none;
transition:
background 0.12s,
border-color 0.12s,
color 0.12s;
border: 1px solid transparent;
line-height: 1;
vertical-align: middle;
box-shadow: none;
}
.wpsubs-btn:focus,
.wpsubs-btn:focus-visible,
.wpsubs-btn:active {
outline: none !important;
box-shadow: none !important;
border-radius: var(--wpsubs-radius-sm) !important;
}
.wpsubs-btn--outline {
background: var(--wpsubs-surface);
border-color: var(--wpsubs-border);
color: var(--wpsubs-text);
}
.wpsubs-btn--outline:hover {
border-color: var(--wpsubs-border-strong);
background: var(--wpsubs-surface-muted);
color: var(--wpsubs-text);
text-decoration: none;
}
.wpsubs-btn--primary {
background: var(--wpsubs-brand);
border-color: var(--wpsubs-brand);
color: #fff;
}
.wpsubs-btn--primary:hover {
background: var(--wpsubs-brand-dark);
border-color: var(--wpsubs-brand-dark);
color: #fff;
text-decoration: none;
}
/* Icon-only square button */
.wpsubs-btn--icon {
width: 36px;
height: 36px;
padding: 0;
flex-shrink: 0;
}
.wpsubs-btn--sm {
height: 30px;
padding: 0 10px;
font-size: 12px;
}
/* --------------------------------------------------------------------------
Tooltip (wpsubs-tooltip)
CSS-only. Wrap any element with .wpsubs-tooltip and set data-tip="text".
-------------------------------------------------------------------------- */
.wpsubs-tooltip {
position: relative;
display: inline-flex;
}
.wpsubs-tooltip::after {
content: attr(data-tip);
position: absolute;
bottom: calc(100% + 6px);
left: 50%;
transform: translateX(-50%);
background: #1f2937;
color: #fff;
font-size: 12px;
font-weight: 400;
font-family: inherit;
line-height: 1.4;
padding: 5px 9px;
border-radius: 5px;
white-space: nowrap;
pointer-events: none;
opacity: 0;
transition: opacity 0.15s;
z-index: 9999;
}
/* Arrow — base sits 4px inside the element so tip meets bubble bottom edge exactly */
.wpsubs-tooltip::before {
content: "";
position: absolute;
bottom: calc(100% - 4px);
left: 50%;
transform: translateX(-50%);
border: 5px solid transparent;
border-top-color: #1f2937;
pointer-events: none;
opacity: 0;
transition: opacity 0.15s;
z-index: 9999;
}
.wpsubs-tooltip:hover::after,
.wpsubs-tooltip:hover::before {
opacity: 1;
}
/* Placement variants */
.wpsubs-tooltip--bottom::after {
bottom: auto;
top: calc(100% + 6px);
}
.wpsubs-tooltip--bottom::before {
bottom: auto;
top: calc(100% - 4px);
border-top-color: transparent;
border-bottom-color: #1f2937;
}
.wpsubs-btn--danger {
background: var(--wpsubs-surface);
border-color: #fca5a5;
color: #dc2626;
}
.wpsubs-btn--danger:hover {
background: #fef2f2;
border-color: #f87171;
color: #b91c1c;
text-decoration: none;
}
/* --------------------------------------------------------------------------
Advanced Select (wpsubs-adv-select)
Drop-in replacement for native