mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-12 06:06:37 +03:00
Fix live picker sizing and divider detection
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { GENERIC_FONTS } from '../../shared/constants.mjs';
|
||||
import { isNeutralColor } from '../../shared/color.mjs';
|
||||
import { checkSourceDesignSystem } from '../../design-system.mjs';
|
||||
import { isFullPage } from '../../shared/page.mjs';
|
||||
import { finding } from '../../findings.mjs';
|
||||
@@ -37,10 +38,11 @@ function shouldRunPageAnalyzers(content, filePath) {
|
||||
}
|
||||
|
||||
function isNeutralBorderColor(str) {
|
||||
const m = str.match(/solid\s+(#[0-9a-f]{3,8}|rgba?\([^)]+\)|\w+)/i);
|
||||
const m = str.match(/solid\s+((?:rgba?|hsla?|oklch|oklab|lab|lch|hwb|color)\([^)]*\)|#[0-9a-f]{3,8}\b|[a-z]+)/i);
|
||||
if (!m) return false;
|
||||
const c = m[1].toLowerCase();
|
||||
if (['gray', 'grey', 'silver', 'white', 'black', 'transparent', 'currentcolor'].includes(c)) return true;
|
||||
if (/^(?:rgba?|hsla?|oklch|oklab|lab|lch|hwb)\(/i.test(c)) return isNeutralColor(c);
|
||||
const hex = c.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/);
|
||||
if (hex) {
|
||||
const [r, g, b] = [parseInt(hex[1], 16), parseInt(hex[2], 16), parseInt(hex[3], 16)];
|
||||
@@ -57,10 +59,10 @@ function isNeutralBorderColor(str) {
|
||||
const REGEX_MATCHERS = [
|
||||
// --- Side-tab ---
|
||||
{ id: 'side-tab', regex: /\bborder-[lrse]-(\d+)\b/g,
|
||||
test: (m, line) => { const n = +m[1]; return hasRounded(line) ? n >= 1 : n >= 4; },
|
||||
test: (m, line) => { const n = +m[1]; return hasRounded(line) ? n >= 2 : n >= 4; },
|
||||
fmt: (m) => m[0] },
|
||||
{ id: 'side-tab', regex: /border-(?:left|right)\s*:\s*(\d+)px\s+solid[^;]*/gi,
|
||||
test: (m, line) => { if (isSafeElement(line)) return false; if (isNeutralBorderColor(m[0])) return false; const n = +m[1]; return hasBorderRadius(line) ? n >= 1 : n >= 3; },
|
||||
test: (m, line) => { if (isSafeElement(line)) return false; if (isNeutralBorderColor(m[0])) return false; const n = +m[1]; return hasBorderRadius(line) ? n >= 2 : n >= 3; },
|
||||
fmt: (m) => m[0].replace(/\s*;?\s*$/, '') },
|
||||
{ id: 'side-tab', regex: /border-(?:left|right)-width\s*:\s*(\d+)px/gi,
|
||||
test: (m, line) => !isSafeElement(line) && +m[1] >= 3,
|
||||
|
||||
@@ -8289,14 +8289,23 @@ void main() {
|
||||
].filter(Boolean);
|
||||
}
|
||||
|
||||
function syncGlobalBarExpandedLabels(expanded = globalBarEl?.matches(':hover')) {
|
||||
function applyGlobalBarLabelState(expandInactive, forceCollapse = false) {
|
||||
globalBarModeToggles().forEach((toggle) => {
|
||||
if (expanded && !pageChatExpanded) toggle._expandLabel?.();
|
||||
else if (toggle.dataset.active === 'true') toggle._expandLabel?.();
|
||||
if (forceCollapse) toggle._collapseLabel?.(true);
|
||||
else if (expandInactive || toggle.dataset.active === 'true') toggle._expandLabel?.();
|
||||
else toggle._collapseLabel?.();
|
||||
});
|
||||
}
|
||||
|
||||
function syncGlobalBarExpandedLabels(expanded = globalBarEl?.matches(':hover')) {
|
||||
const expandInactive = !!(expanded && !pageChatExpanded);
|
||||
applyGlobalBarLabelState(expandInactive, pageChatExpanded);
|
||||
|
||||
if (expandInactive && globalBarEl && globalBarEl.scrollWidth > window.innerWidth - 16) {
|
||||
applyGlobalBarLabelState(false);
|
||||
}
|
||||
}
|
||||
|
||||
function pageChatCollapsedWidthPx() {
|
||||
const parsed = parseFloat(PAGE_CHAT_COLLAPSED_W);
|
||||
return Number.isFinite(parsed) ? parsed : 104;
|
||||
@@ -8305,7 +8314,7 @@ void main() {
|
||||
function pageChatExpandedWidth() {
|
||||
if (!pageChatEl || !globalBarEl) return PAGE_CHAT_EXPANDED_MAX_W + 'px';
|
||||
const currentChatWidth = pageChatEl.getBoundingClientRect().width || pageChatCollapsedWidthPx();
|
||||
const barWidth = globalBarEl.getBoundingClientRect().width || 0;
|
||||
const barWidth = Math.max(globalBarEl.getBoundingClientRect().width || 0, globalBarEl.scrollWidth || 0);
|
||||
const nonChatWidth = Math.max(0, barWidth - currentChatWidth);
|
||||
const available = window.innerWidth - 16 - nonChatWidth;
|
||||
const next = Math.max(pageChatCollapsedWidthPx(), Math.min(PAGE_CHAT_EXPANDED_MAX_W, available));
|
||||
@@ -9328,6 +9337,7 @@ void main() {
|
||||
zIndex: Z.bar + 5,
|
||||
display: 'flex', alignItems: 'stretch',
|
||||
gap: '0',
|
||||
width: 'max-content',
|
||||
background: P.surface,
|
||||
border: '1px solid ' + P.border,
|
||||
borderRadius: '8px',
|
||||
@@ -9385,8 +9395,7 @@ void main() {
|
||||
const inner = el('div', {
|
||||
display: 'flex', alignItems: 'center',
|
||||
padding: '4px 5px 4px ' + GLOBAL_BAR_INNER_PAD_LEFT + 'px', gap: GLOBAL_BAR_INNER_GAP + 'px',
|
||||
minWidth: '0',
|
||||
flex: '1 1 auto',
|
||||
flex: '0 0 auto',
|
||||
});
|
||||
inner.id = PREFIX + '-global-bar-inner';
|
||||
globalBarEl.appendChild(inner);
|
||||
@@ -9395,7 +9404,10 @@ void main() {
|
||||
function makeIconBtn({ id, svg, label, ariaLabel, labelFont, onClick }) {
|
||||
const b = el('button', {
|
||||
position: 'relative',
|
||||
display: 'inline-flex', alignItems: 'center',
|
||||
display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
|
||||
boxSizing: 'border-box',
|
||||
flex: '0 0 auto',
|
||||
minWidth: '30px',
|
||||
padding: '6px 8px', borderRadius: '7px',
|
||||
border: 'none', background: 'transparent',
|
||||
color: P.textDim, fontFamily: FONT, fontSize: '11.5px', fontWeight: '500',
|
||||
@@ -9414,8 +9426,8 @@ void main() {
|
||||
if (!labelEl) return;
|
||||
labelEl.style.maxWidth = '120px'; labelEl.style.opacity = '1'; labelEl.style.marginLeft = '6px'; labelEl.style.transform = 'translateX(0)';
|
||||
};
|
||||
const collapse = () => {
|
||||
if (!labelEl || b.dataset.active === 'true') return;
|
||||
const collapse = (force = false) => {
|
||||
if (!labelEl || (!force && b.dataset.active === 'true')) return;
|
||||
labelEl.style.maxWidth = '0'; labelEl.style.opacity = '0'; labelEl.style.marginLeft = '0'; labelEl.style.transform = 'translateX(-4px)';
|
||||
};
|
||||
// Per-button hover only changes color (no layout). The label expand/
|
||||
|
||||
Reference in New Issue
Block a user