Feat v0.6.11 CSS deduplication (#46)
Some checks failed
CI/CD / detect-changes (pull_request) Successful in 4s
CI/CD / test-sqlite (pull_request) Has been cancelled
CI/CD / build-and-deploy (pull_request) Has been cancelled
CI/CD / test-go-pg (pull_request) Has been cancelled
CI/CD / test-frontend (pull_request) Has been cancelled
Some checks failed
CI/CD / detect-changes (pull_request) Successful in 4s
CI/CD / test-sqlite (pull_request) Has been cancelled
CI/CD / build-and-deploy (pull_request) Has been cancelled
CI/CD / test-go-pg (pull_request) Has been cancelled
CI/CD / test-frontend (pull_request) Has been cancelled
Retire old primitives.css button/toast/popup-menu/dropdown/tabs systems.
sw-primitives.css is now the single source of truth.
- Migrate 29 files from .btn-* to .sw-btn .sw-btn--{variant} .sw-btn--{size}
- Delete old toast, popup-menu, dropdown, tabs CSS (no JS references)
- Resolve .sw-dropdown and .sw-tabs class name collisions
- Resolve .settings-section duplicate (modals.css removed, surfaces.css authoritative)
- Add .sw-btn--success variant, --bg-active CSS variable
- Fix sdk-test-runner wrong variable names, icd-test-runner button fallbacks
- Add scripts/audit-css-collisions.sh
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
74
scripts/audit-css-collisions.sh
Normal file
74
scripts/audit-css-collisions.sh
Normal file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env bash
|
||||
# audit-css-collisions.sh — Find duplicate class selectors across kernel CSS files
|
||||
# Outputs a JSON collision report to stdout.
|
||||
# Usage: bash scripts/audit-css-collisions.sh [css-dir]
|
||||
|
||||
set -euo pipefail
|
||||
CSS_DIR="${1:-src/css}"
|
||||
|
||||
# Extract class selectors from CSS files and track their file + line
|
||||
declare -A SEEN # selector -> "file:line file:line ..."
|
||||
|
||||
for f in "$CSS_DIR"/*.css; do
|
||||
[ -f "$f" ] || continue
|
||||
lineno=0
|
||||
while IFS= read -r line; do
|
||||
lineno=$((lineno + 1))
|
||||
# Extract class selectors (e.g. .foo-bar, .foo__bar--baz)
|
||||
# Skip lines that are comments, inside @keyframes, or @media queries
|
||||
[[ "$line" =~ ^[[:space:]]*/\* ]] && continue
|
||||
[[ "$line" =~ ^[[:space:]]*@keyframes ]] && continue
|
||||
|
||||
# Match class selectors at the start of a rule
|
||||
while [[ "$line" =~ \.([a-zA-Z_][a-zA-Z0-9_-]*) ]]; do
|
||||
cls=".${BASH_REMATCH[1]}"
|
||||
entry="$(basename "$f"):$lineno"
|
||||
if [ -n "${SEEN[$cls]:-}" ]; then
|
||||
SEEN[$cls]="${SEEN[$cls]} $entry"
|
||||
else
|
||||
SEEN[$cls]="$entry"
|
||||
fi
|
||||
# Remove the matched portion to find more classes on the same line
|
||||
line="${line#*${BASH_REMATCH[0]}}"
|
||||
done
|
||||
done < "$f"
|
||||
done
|
||||
|
||||
# Build JSON: only emit selectors defined in more than one file
|
||||
echo "["
|
||||
first=true
|
||||
for cls in "${!SEEN[@]}"; do
|
||||
locations="${SEEN[$cls]}"
|
||||
# Get unique files
|
||||
files=()
|
||||
for loc in $locations; do
|
||||
file="${loc%%:*}"
|
||||
found=false
|
||||
for f in "${files[@]:-}"; do
|
||||
[ "$f" = "$file" ] && found=true && break
|
||||
done
|
||||
$found || files+=("$file")
|
||||
done
|
||||
|
||||
# Only report if defined in 2+ different files
|
||||
[ ${#files[@]} -lt 2 ] && continue
|
||||
|
||||
if $first; then first=false; else echo ","; fi
|
||||
|
||||
# Build locations array
|
||||
locs_json=""
|
||||
for loc in $locations; do
|
||||
[ -n "$locs_json" ] && locs_json="$locs_json, "
|
||||
locs_json="$locs_json\"$loc\""
|
||||
done
|
||||
|
||||
files_json=""
|
||||
for f in "${files[@]}"; do
|
||||
[ -n "$files_json" ] && files_json="$files_json, "
|
||||
files_json="$files_json\"$f\""
|
||||
done
|
||||
|
||||
printf ' {"selector": "%s", "files": [%s], "locations": [%s]}' "$cls" "$files_json" "$locs_json"
|
||||
done
|
||||
echo ""
|
||||
echo "]"
|
||||
Reference in New Issue
Block a user