diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 9921e42..d91595a 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -10,7 +10,8 @@ "Bash(npx tsc:*)", "WebFetch(domain:github.com)", "Bash(npm install:*)", - "WebFetch(domain:raw.githubusercontent.com)" + "WebFetch(domain:raw.githubusercontent.com)", + "Bash(npm run css:analyze:*)" ], "deny": [], "ask": [] diff --git a/analyze-css.js b/analyze-css.js index f4d230e..1ffd7aa 100644 --- a/analyze-css.js +++ b/analyze-css.js @@ -19,11 +19,11 @@ console.log('šŸ“Š Running PurgeCSS analysis...'); async function runPurgeCSS() { const purgeCSSResults = await new PurgeCSS().purge({ content: [ - './src/**/*.ts', - './wwwroot/**/*.html' + './src/v2/**/*.ts', + './wwwroot/v2.html' ], css: [ - './wwwroot/css/*.css' + './wwwroot/css/v2/*.css' ], rejected: true, rejectedCss: true, @@ -110,13 +110,10 @@ async function runPurgeCSS() { console.log('\nšŸ“Š Running CSS Stats analysis...'); function runCSSStats() { const cssFiles = [ - './wwwroot/css/calendar-base-css.css', - './wwwroot/css/calendar-components-css.css', - './wwwroot/css/calendar-events-css.css', - './wwwroot/css/calendar-layout-css.css', - './wwwroot/css/calendar-month-css.css', - './wwwroot/css/calendar-popup-css.css', - './wwwroot/css/calendar-sliding-animation.css' + './wwwroot/css/v2/calendar-v2.css', + './wwwroot/css/v2/calendar-v2-base.css', + './wwwroot/css/v2/calendar-v2-layout.css', + './wwwroot/css/v2/calendar-v2-events.css' ]; const stats = {}; diff --git a/reports/css-analysis-report.html b/reports/css-analysis-report.html index 8091d64..586ad68 100644 --- a/reports/css-analysis-report.html +++ b/reports/css-analysis-report.html @@ -141,19 +141,19 @@
Total CSS Size
-
36.99 KB
+
17.00 KB
CSS Files
-
8
+
4
Unused CSS Rules
-
71
+
23
Potential Removal
-
0.22%
+
0.15%
@@ -174,73 +174,43 @@ - calendar-base-css.css - 5.14 KB - 242 - 25 - 29 - 107 - 27 - - - - calendar-components-css.css - 4.28 KB - 236 - 26 - 36 - 116 - 4 - - - - calendar-events-css.css - 6.50 KB - 308 - 41 - 45 - 139 - 4 - - - - calendar-layout-css.css - 10.59 KB - 1 - 84 - 84 - 237 - 12 - - - - calendar-month-css.css - 6.59 KB - 315 - 51 - 54 - 155 - 10 - - - - calendar-popup-css.css - 3.32 KB - 193 - 23 - 31 - 97 - 5 - - - - calendar-sliding-animation.css - 0.57 KB - 24 - 3 - 4 - 9 + calendar-v2.css + 0.18 KB + 7 0 + 0 + 1 + 0 + + + + calendar-v2-base.css + 1.66 KB + 67 + 3 + 3 + 47 + 32 + + + + calendar-v2-layout.css + 6.39 KB + 308 + 38 + 48 + 153 + 1 + + + + calendar-v2-events.css + 8.77 KB + 383 + 54 + 62 + 196 + 5 @@ -251,54 +221,33 @@

šŸ—‘ļø Unused CSS by File

-

test-nesting.css

-

- - 5 unused rules - - - Original: 154 | After purge: 0 - -

- -
- Show unused selectors -
- .test-container
.test-container .test-child
:is(.test-container .test-child):hover
.test-container .test-nested
:is(.test-container .test-nested) .deep-nested - -
-
- -
- -
-

calendar-sliding-animation.css

+

calendar-v2.css

0 unused rules - Original: 588 | After purge: 588 + Original: 186 | After purge: 186

āœ… No unused CSS found!

-

calendar-popup-css.css

+

calendar-v2-layout.css

- 5 unused rules + 3 unused rules - Original: 3023 | After purge: 2939 + Original: 6275 | After purge: 6203

Show unused selectors
- &[data-align="right"]
&[data-align="left"]
&:hover
&:active
&[data-action="close"]:hover + &:hover
&[data-levels="resource date"]
&[data-levels="team resource date"]
@@ -306,20 +255,21 @@
-

calendar-month-css.css

+

calendar-v2-events.css

- 15 unused rules + 20 unused rules - Original: 5925 | After purge: 5485 + Original: 7298 | After purge: 6810

Show unused selectors
- .month-event.category-meeting
.month-event.category-deadline
.month-event.category-work
.month-event.category-personal
.month-event.duration-30min
.month-event.duration-1h
.month-event.duration-1h30
.month-event.duration-2h
.month-event.duration-3h
.month-event.duration-4h
swp-calendar[data-view="month"][data-loading="true"] .month-grid
.month-grid.sliding-out-left
.month-grid.sliding-out-right
.month-grid.sliding-in-left
.month-grid.sliding-in-right + &:hover
&[data-continues-before="true"]
&[data-continues-after="true"]
swp-events-layer[data-filter-active="true"] swp-event
swp-events-layer[data-filter-active="true"] swp-event[data-matches="true"]
swp-event[data-stack-link]:not([data-stack-link*='"stackLevel":0'])
+swp-event-group[data-stack-link]:not([data-stack-link*='"stackLevel":0']) swp-event
.is-pink
.is-magenta
.is-violet
.is-deep-purple
.is-indigo
.is-light-blue
.is-cyan
.is-teal
.is-light-green
.is-lime
.is-yellow
.is-orange
.is-deep-orange
@@ -327,89 +277,16 @@
-

calendar-layout-css.css

+

calendar-v2-base.css

- 19 unused rules + 0 unused rules - Original: 9940 | After purge: 8956 + Original: 1701 | After purge: 1701

- -
- Show unused selectors -
- -out
swp-day-header[data-today=true]
swp-day-header[data-today=true] swp-day-name
swp-day-header[data-today=true] swp-day-date
swp-resource-avatar img
[data-type=meeting]:is(swp-allday-container swp-allday-event)
[data-type=meal]:is(swp-allday-container swp-allday-event)
[data-type=milestone]:is(swp-allday-container swp-allday-event)
[data-type=personal]:is(swp-allday-container swp-allday-event)
[data-type=deadline]:is(swp-allday-container swp-allday-event)
.highlight[data-type=meeting]:is(swp-allday-container swp-allday-event)
.highlight[data-type=meal]:is(swp-allday-container swp-allday-event)
.highlight[data-type=milestone]:is(swp-allday-container swp-allday-event)
.highlight[data-type=personal]:is(swp-allday-container swp-allday-event)
.highlight[data-type=deadline]:is(swp-allday-container swp-allday-event)
:is(swp-scrollable-content::-webkit-scrollbar-thumb):hover
swp-day-column[data-work-hours=off]
swp-day-column[data-work-hours=off]:after
swp-day-column[data-work-hours=off]:before - -
-
- -
- -
-

calendar-events-css.css

-

- - 15 unused rules - - - Original: 4815 | After purge: 4344 - -

- -
- Show unused selectors -
- &[data-type="meeting"]
&[data-type="meal"]
&[data-type="milestone"]
&[data-type="personal"]
&[data-type="deadline"]
&.hover[data-type="meeting"]
&.hover[data-type="meal"]
&.hover[data-type="milestone"]
&.hover[data-type="personal"]
&.hover[data-type="deadline"]
&[data-continues-before="true"]
&[data-continues-after="true"]
&:hover
swp-event[data-stack-link]:not([data-stack-link*='"stackLevel":0'])
-swp-event-group[data-stack-link]:not([data-stack-link*='"stackLevel":0']) swp-event - -
-
- -
- -
-

calendar-components-css.css

-

- - 8 unused rules - - - Original: 3476 | After purge: 3340 - -

- -
- Show unused selectors -
- &:hover
&:active
&:not(:last-child)
&:hover:not([disabled])
&[disabled]
&:focus
swp-calendar[data-searching="true"]
&[data-search-match="true"] - -
-
- -
- -
-

calendar-base-css.css

-

- - 4 unused rules - - - Original: 5066 | After purge: 4888 - -

- -
- Show unused selectors -
- swp-day-columns swp-event.text-selectable swp-day-columns swp-event-title
-swp-day-columns swp-event.text-selectable swp-day-columns swp-event-time
:focus
:focus:not(:focus-visible) - -
-
- +

āœ… No unused CSS found!

@@ -420,12 +297,12 @@ swp-day-columns swp-event.text-selectable swp-day-columns swp-event-time
:foc
  • āœ… CSS usage is relatively clean.
  • šŸ“¦ Consider consolidating similar styles to reduce duplication.
  • -
  • šŸŽØ Review color palette - found 62 unique colors across all files.
  • +
  • šŸŽØ Review color palette - found 38 unique colors across all files.
  • šŸ”„ Implement a build process to automatically remove unused CSS in production.
  • -

    Report generated: 1.11.2025, 23.12.02

    +

    Report generated: 11.12.2025, 00.08.52

    diff --git a/reports/css-stats.json b/reports/css-stats.json index c93a495..4ab1aeb 100644 --- a/reports/css-stats.json +++ b/reports/css-stats.json @@ -1,128 +1,65 @@ { - "calendar-base-css.css": { - "lines": 242, - "size": "5.14 KB", - "sizeBytes": 5267, - "rules": 25, - "selectors": 29, - "properties": 107, - "uniqueColors": 27, + "calendar-v2.css": { + "lines": 7, + "size": "0.18 KB", + "sizeBytes": 186, + "rules": 0, + "selectors": 0, + "properties": 1, + "uniqueColors": 0, + "colors": [], + "mediaQueries": 0 + }, + "calendar-v2-base.css": { + "lines": 67, + "size": "1.66 KB", + "sizeBytes": 1701, + "rules": 3, + "selectors": 3, + "properties": 47, + "uniqueColors": 32, "colors": [ - "#2196f3", - "#ff9800", - "#4caf50", - "#f44336", "#e0e0e0", - "rgba(0, 0, 0, 0.05)", - "rgba(0, 0, 0, 0.2)", - "rgba(255, 255, 255, 0.9)", - "#ff0000", - "#e8f5e8" + "#fff", + "#f5f5f5", + "#f0f0f0", + "#fafafa", + "#333333", + "#666", + "#1976d2", + "#e3f2fd", + "#1565c0" ], "mediaQueries": 0 }, - "calendar-components-css.css": { - "lines": 236, - "size": "4.28 KB", - "sizeBytes": 4381, - "rules": 26, - "selectors": 36, - "properties": 116, - "uniqueColors": 4, - "colors": [ - "rgba(0, 0, 0, 0.05)", - "rgba(0, 0, 0, 0.1)", - "rgba(33, 150, 243, 0.05)", - "rgba(33, 150, 243, 0.3)" - ], - "mediaQueries": 0 - }, - "calendar-events-css.css": { + "calendar-v2-layout.css": { "lines": 308, - "size": "6.50 KB", - "sizeBytes": 6657, - "rules": 41, - "selectors": 45, - "properties": 139, - "uniqueColors": 4, + "size": "6.39 KB", + "sizeBytes": 6548, + "rules": 38, + "selectors": 48, + "properties": 153, + "uniqueColors": 1, "colors": [ + "rgba(0, 0, 0, 0.05)" + ], + "mediaQueries": 0 + }, + "calendar-v2-events.css": { + "lines": 383, + "size": "8.77 KB", + "sizeBytes": 8977, + "rules": 54, + "selectors": 62, + "properties": 196, + "uniqueColors": 5, + "colors": [ + "rgba(0, 0, 0, 0.15)", "rgba(255, 255, 255, 0.9)", "rgba(0, 0, 0, 0.2)", "rgba(33, 150, 243, 0.1)", "rgba(0, 0, 0, 0.1)" ], "mediaQueries": 0 - }, - "calendar-layout-css.css": { - "lines": 1, - "size": "10.59 KB", - "sizeBytes": 10840, - "rules": 84, - "selectors": 84, - "properties": 237, - "uniqueColors": 12, - "colors": [ - "#666", - "rgba(0,0,0,.05)", - "#000", - "rgba(33,150,243,.1)", - "#08f", - "#fff", - "#e0e0e0", - "#999", - "#d0d0d0", - "#333" - ], - "mediaQueries": 0 - }, - "calendar-month-css.css": { - "lines": 315, - "size": "6.59 KB", - "sizeBytes": 6749, - "rules": 51, - "selectors": 54, - "properties": 155, - "uniqueColors": 10, - "colors": [ - "#f0f8ff", - "#fafbfc", - "#e3f2fd", - "#e8f5e8", - "#ffebee", - "#fff8e1", - "#f3e5f5", - "#7b1fa2", - "#9c27b0", - "rgba(33, 150, 243, 0.7)" - ], - "mediaQueries": 1 - }, - "calendar-popup-css.css": { - "lines": 193, - "size": "3.32 KB", - "sizeBytes": 3399, - "rules": 23, - "selectors": 31, - "properties": 97, - "uniqueColors": 5, - "colors": [ - "#f9f5f0", - "rgba(0, 0, 0, 0.1)", - "rgba(0, 0, 0, 0.05)", - "rgba(255, 255, 255, 0.9)", - "#f3f3f3" - ], - "mediaQueries": 1 - }, - "calendar-sliding-animation.css": { - "lines": 24, - "size": "0.57 KB", - "sizeBytes": 588, - "rules": 3, - "selectors": 4, - "properties": 9, - "uniqueColors": 0, - "colors": [], - "mediaQueries": 1 } } \ No newline at end of file diff --git a/reports/purgecss-report.json b/reports/purgecss-report.json index 32bed88..212f36b 100644 --- a/reports/purgecss-report.json +++ b/reports/purgecss-report.json @@ -1,138 +1,61 @@ { "summary": { - "totalFiles": 8, - "totalOriginalSize": 32987, - "totalPurgedSize": 30540, - "totalRejected": 71, - "percentageRemoved": "0.22%", - "potentialSavings": 2447 + "totalFiles": 4, + "totalOriginalSize": 15460, + "totalPurgedSize": 14900, + "totalRejected": 23, + "percentageRemoved": "0.15%", + "potentialSavings": 560 }, "fileDetails": { - "test-nesting.css": { - "originalSize": 154, - "purgedSize": 0, - "rejectedCount": 5, - "rejected": [ - ".test-container", - ".test-container .test-child", - ":is(.test-container .test-child):hover", - ".test-container .test-nested", - ":is(.test-container .test-nested) .deep-nested" - ] - }, - "calendar-sliding-animation.css": { - "originalSize": 588, - "purgedSize": 588, + "calendar-v2.css": { + "originalSize": 186, + "purgedSize": 186, "rejectedCount": 0, "rejected": [] }, - "calendar-popup-css.css": { - "originalSize": 3023, - "purgedSize": 2939, - "rejectedCount": 5, + "calendar-v2-layout.css": { + "originalSize": 6275, + "purgedSize": 6203, + "rejectedCount": 3, "rejected": [ - "&[data-align=\"right\"]", - "&[data-align=\"left\"]", "&:hover", - "&:active", - "&[data-action=\"close\"]:hover" + "&[data-levels=\"resource date\"]", + "&[data-levels=\"team resource date\"]" ] }, - "calendar-month-css.css": { - "originalSize": 5925, - "purgedSize": 5485, - "rejectedCount": 15, + "calendar-v2-events.css": { + "originalSize": 7298, + "purgedSize": 6810, + "rejectedCount": 20, "rejected": [ - ".month-event.category-meeting", - ".month-event.category-deadline", - ".month-event.category-work", - ".month-event.category-personal", - ".month-event.duration-30min", - ".month-event.duration-1h", - ".month-event.duration-1h30", - ".month-event.duration-2h", - ".month-event.duration-3h", - ".month-event.duration-4h", - "swp-calendar[data-view=\"month\"][data-loading=\"true\"] .month-grid", - ".month-grid.sliding-out-left", - ".month-grid.sliding-out-right", - ".month-grid.sliding-in-left", - ".month-grid.sliding-in-right" - ] - }, - "calendar-layout-css.css": { - "originalSize": 9940, - "purgedSize": 8956, - "rejectedCount": 19, - "rejected": [ - "-out", - "swp-day-header[data-today=true]", - "swp-day-header[data-today=true] swp-day-name", - "swp-day-header[data-today=true] swp-day-date", - "swp-resource-avatar img", - "[data-type=meeting]:is(swp-allday-container swp-allday-event)", - "[data-type=meal]:is(swp-allday-container swp-allday-event)", - "[data-type=milestone]:is(swp-allday-container swp-allday-event)", - "[data-type=personal]:is(swp-allday-container swp-allday-event)", - "[data-type=deadline]:is(swp-allday-container swp-allday-event)", - ".highlight[data-type=meeting]:is(swp-allday-container swp-allday-event)", - ".highlight[data-type=meal]:is(swp-allday-container swp-allday-event)", - ".highlight[data-type=milestone]:is(swp-allday-container swp-allday-event)", - ".highlight[data-type=personal]:is(swp-allday-container swp-allday-event)", - ".highlight[data-type=deadline]:is(swp-allday-container swp-allday-event)", - ":is(swp-scrollable-content::-webkit-scrollbar-thumb):hover", - "swp-day-column[data-work-hours=off]", - "swp-day-column[data-work-hours=off]:after", - "swp-day-column[data-work-hours=off]:before" - ] - }, - "calendar-events-css.css": { - "originalSize": 4815, - "purgedSize": 4344, - "rejectedCount": 15, - "rejected": [ - "&[data-type=\"meeting\"]", - "&[data-type=\"meal\"]", - "&[data-type=\"milestone\"]", - "&[data-type=\"personal\"]", - "&[data-type=\"deadline\"]", - "&.hover[data-type=\"meeting\"]", - "&.hover[data-type=\"meal\"]", - "&.hover[data-type=\"milestone\"]", - "&.hover[data-type=\"personal\"]", - "&.hover[data-type=\"deadline\"]", + "&:hover", "&[data-continues-before=\"true\"]", "&[data-continues-after=\"true\"]", - "&:hover", + "swp-events-layer[data-filter-active=\"true\"] swp-event", + "swp-events-layer[data-filter-active=\"true\"] swp-event[data-matches=\"true\"]", "swp-event[data-stack-link]:not([data-stack-link*='\"stackLevel\":0'])", - "\nswp-event-group[data-stack-link]:not([data-stack-link*='\"stackLevel\":0']) swp-event" + "\nswp-event-group[data-stack-link]:not([data-stack-link*='\"stackLevel\":0']) swp-event", + ".is-pink", + ".is-magenta", + ".is-violet", + ".is-deep-purple", + ".is-indigo", + ".is-light-blue", + ".is-cyan", + ".is-teal", + ".is-light-green", + ".is-lime", + ".is-yellow", + ".is-orange", + ".is-deep-orange" ] }, - "calendar-components-css.css": { - "originalSize": 3476, - "purgedSize": 3340, - "rejectedCount": 8, - "rejected": [ - "&:hover", - "&:active", - "&:not(:last-child)", - "&:hover:not([disabled])", - "&[disabled]", - "&:focus", - "swp-calendar[data-searching=\"true\"]", - "&[data-search-match=\"true\"]" - ] - }, - "calendar-base-css.css": { - "originalSize": 5066, - "purgedSize": 4888, - "rejectedCount": 4, - "rejected": [ - "swp-day-columns swp-event.text-selectable swp-day-columns swp-event-title", - "\nswp-day-columns swp-event.text-selectable swp-day-columns swp-event-time", - ":focus", - ":focus:not(:focus-visible)" - ] + "calendar-v2-base.css": { + "originalSize": 1701, + "purgedSize": 1701, + "rejectedCount": 0, + "rejected": [] } } } \ No newline at end of file