Skip to content

Commit 73db0fb

Browse files
committed
refactor styles and update project layout with new button designs and font changes
1 parent 48c05a5 commit 73db0fb

File tree

9 files changed

+7972
-46
lines changed

9 files changed

+7972
-46
lines changed

_layouts/project.html

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
<!-- Favicon -->
99
<link rel="icon" type="image/x-icon" href="{{ '/assets/images/favicon.ico' | relative_url }}">
1010

11+
<!-- Fonts -->
12+
<link rel="preconnect" href="https://fonts.googleapis.com">
13+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14+
<link href="https://fonts.googleapis.com/css2?family=Inter:[email protected]&family=Red+Hat+Text:ital,wght@0,300..700;1,300..700&display=swap" rel="stylesheet">
15+
1116
<!-- CSS -->
1217
<link rel="stylesheet" href="{{ '/assets/css/main.css' | relative_url }}">
1318
<link rel="stylesheet" href="{{ '/assets/css/project.css' | relative_url }}">
14-
15-
<!-- Fonts -->
1619
</head>
1720
<body>
1821
<!-- Main Content -->
@@ -49,19 +52,52 @@ <h1 class="project-title">{{ page.title }}</h1>
4952
<!-- Links -->
5053
<div class="project-links">
5154
{% if page.paper_url and page.paper_url != "" %}
52-
<a href="{{ page.paper_url }}" class="btn btn-primary" target="_blank">Paper</a>
55+
<a href="{{ page.paper_url }}" class="btn btn-primary" target="_blank">
56+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
57+
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
58+
<polyline points="14 2 14 8 20 8"></polyline>
59+
<line x1="16" y1="13" x2="8" y2="13"></line>
60+
<line x1="16" y1="17" x2="8" y2="17"></line>
61+
<polyline points="10 9 9 9 8 9"></polyline>
62+
</svg>
63+
Paper
64+
</a>
5365
{% endif %}
5466
{% if page.code_url and page.code_url != "" %}
55-
<a href="{{ page.code_url }}" class="btn btn-outline" target="_blank">Code</a>
67+
<a href="{{ page.code_url }}" class="btn btn-outline" target="_blank">
68+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
69+
<polyline points="16 18 22 12 16 6"></polyline>
70+
<polyline points="8 6 2 12 8 18"></polyline>
71+
</svg>
72+
Code
73+
</a>
5674
{% endif %}
5775
{% if page.arxiv_url and page.arxiv_url != "" %}
58-
<a href="{{ page.arxiv_url }}" class="btn btn-outline" target="_blank">arXiv</a>
76+
<a href="{{ page.arxiv_url }}" class="btn btn-outline" target="_blank">
77+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
78+
<path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path>
79+
<path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path>
80+
</svg>
81+
arXiv
82+
</a>
5983
{% endif %}
6084
{% if page.dataset_url and page.dataset_url != "" %}
61-
<a href="{{ page.dataset_url }}" class="btn btn-outline" target="_blank">🤗 Dataset</a>
85+
<a href="{{ page.dataset_url }}" class="btn btn-outline" target="_blank">
86+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
87+
<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path>
88+
<polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline>
89+
<line x1="12" y1="22.08" x2="12" y2="12"></line>
90+
</svg>
91+
Dataset
92+
</a>
6293
{% endif %}
6394
{% if page.demo_url and page.demo_url != "" %}
64-
<a href="{{ page.demo_url }}" class="btn btn-outline" target="_blank">Demo</a>
95+
<a href="{{ page.demo_url }}" class="btn btn-outline" target="_blank">
96+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
97+
<polygon points="5 3 19 12 5 21 5 3"></polygon>
98+
</svg>
99+
Demo
100+
</a>
65101
{% endif %}
66102
</div>
67103
</div>

assets/css/main.css

Lines changed: 89 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ html {
1010
}
1111

1212
body {
13-
font-family: 'Google Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
13+
font-family: "Red Hat Text", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
14+
font-optical-sizing: auto;
1415
line-height: 1.7;
1516
color: #2d3748;
1617
background-color: #ffffff;
@@ -26,6 +27,8 @@ body {
2627

2728
/* Typography */
2829
h1, h2, h3, h4, h5, h6 {
30+
font-family: "Red Hat Text", sans-serif;
31+
font-optical-sizing: auto;
2932
font-weight: 600;
3033
line-height: 1.3;
3134
margin-bottom: 1.5rem;
@@ -198,56 +201,112 @@ pre {
198201
box-shadow: 0 20px 40px rgba(0,0,0,0.2);
199202
}
200203

201-
/* Buttons */
204+
/* Buttons - Material Design Inspired */
202205
.btn {
203-
display: inline-block;
204-
padding: 14px 28px;
205-
border-radius: 8px;
206-
font-weight: 600;
206+
display: inline-flex;
207+
align-items: center;
208+
justify-content: center;
209+
gap: 6px;
210+
padding: 10px 20px;
211+
border-radius: 6px;
212+
font-weight: 500;
207213
text-align: center;
208-
transition: all 0.2s ease;
209-
border: 2px solid transparent;
214+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
215+
border: none;
210216
cursor: pointer;
211217
text-decoration: none;
212-
font-size: 1rem;
218+
font-size: 0.9rem;
219+
position: relative;
220+
overflow: hidden;
221+
letter-spacing: 0.0125em;
222+
}
223+
224+
.btn::before {
225+
content: '';
226+
position: absolute;
227+
top: 50%;
228+
left: 50%;
229+
width: 0;
230+
height: 0;
231+
border-radius: 50%;
232+
background: rgba(255, 255, 255, 0.3);
233+
transform: translate(-50%, -50%);
234+
transition: width 0.6s, height 0.6s;
235+
}
236+
237+
.btn:hover::before {
238+
width: 300px;
239+
height: 300px;
213240
}
214241

215242
.btn-primary {
216-
background-color: #3182ce;
243+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
217244
color: white;
218-
border-color: #3182ce;
245+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(102, 126, 234, 0.2);
219246
}
220247

221248
.btn-primary:hover {
222-
background-color: #2c5282;
223-
border-color: #2c5282;
249+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15), 0 8px 20px rgba(102, 126, 234, 0.35);
250+
transform: translateY(-2px);
224251
color: white;
225-
transform: translateY(-1px);
226-
box-shadow: 0 4px 12px rgba(49, 130, 206, 0.3);
252+
}
253+
254+
.btn-primary:active {
255+
transform: translateY(0);
256+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(102, 126, 234, 0.2);
227257
}
228258

229259
.btn-outline {
230-
background-color: transparent;
231-
color: #3182ce;
232-
border-color: #3182ce;
260+
background-color: white;
261+
color: #667eea;
262+
border: 1.5px solid #e2e8f0;
263+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.06);
233264
}
234265

235266
.btn-outline:hover {
236-
background-color: #3182ce;
237-
color: white;
238-
transform: translateY(-1px);
267+
background-color: #f8f9ff;
268+
border-color: #667eea;
269+
color: #5568d3;
270+
transform: translateY(-2px);
271+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(102, 126, 234, 0.15);
272+
}
273+
274+
.btn-outline:active {
275+
transform: translateY(0);
276+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.06);
239277
}
240278

241279
.btn-light {
242280
background-color: rgba(255, 255, 255, 0.2);
243281
color: white;
244-
border-color: rgba(255, 255, 255, 0.3);
282+
border: 1.5px solid rgba(255, 255, 255, 0.3);
283+
backdrop-filter: blur(10px);
245284
}
246285

247286
.btn-light:hover {
248287
background-color: rgba(255, 255, 255, 0.3);
288+
border-color: rgba(255, 255, 255, 0.5);
249289
color: white;
250-
transform: translateY(-1px);
290+
transform: translateY(-2px);
291+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
292+
}
293+
294+
/* Button icons */
295+
.btn svg {
296+
position: relative;
297+
z-index: 1;
298+
flex-shrink: 0;
299+
}
300+
301+
.btn > * {
302+
position: relative;
303+
z-index: 1;
304+
}
305+
306+
/* Focused button state for accessibility */
307+
.btn:focus-visible {
308+
outline: 3px solid rgba(102, 126, 234, 0.4);
309+
outline-offset: 2px;
251310
}
252311

253312
/* Content Sections */
@@ -390,8 +449,13 @@ blockquote {
390449
}
391450

392451
.btn {
393-
padding: 12px 24px;
394-
font-size: 0.95rem;
452+
padding: 10px 20px;
453+
font-size: 0.9rem;
454+
}
455+
456+
.btn svg {
457+
width: 16px;
458+
height: 16px;
395459
}
396460
}
397461

assets/css/project.css

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,15 @@
7272
.project-links {
7373
display: flex;
7474
flex-wrap: wrap;
75-
gap: 12px;
75+
gap: 14px;
7676
justify-content: center;
7777
margin-top: 2rem;
78+
align-items: center;
79+
}
80+
81+
.project-links .btn {
82+
min-width: 100px;
83+
padding: 10px 20px;
7884
}
7985

8086
/* Content Section */
248 KB
Loading

assets/images/language-module.png

741 KB
Loading

assets/images/ui-detector.png

546 KB
Loading

assets/plotly/ccs-2025-llm-eval-category.html

Lines changed: 3888 additions & 0 deletions
Large diffs are not rendered by default.

assets/plotly/ccs-2025-llm-eval-subtype.html

Lines changed: 3888 additions & 0 deletions
Large diffs are not rendered by default.

index.md

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ layout: project
33
title: "Automatically Detecting Online Deceptive Patterns"
44
authors: '<a href="https://asmitnayak.com" target="_blank">Asmit Nayak</a>, <a href="https://wiscprivacy.com/member/member_yash/" target="_blank">Yash Wani*</a>, <a href="https://www.annienobear.com/" target="_blank">Shirley Zhang</a>*, Rishabh Khandelwal, <a href="https://kassemfawaz.com" target="_blank">Kassem Fawaz</a>'
55
affiliation: "University of Wisconsin - Madison"
6-
venue: "ACM CHI 2025"
6+
venue: "ACM CCS 2025"
77
equal_contribution: "*Indicates Equal Contribution"
88
paper_url: "https://arxiv.org/pdf/2411.07441"
99
code_url: ""
@@ -13,10 +13,9 @@ demo_url: "https://huggingface.co/spaces/WIPI/DeceptivePatternDetector"
1313
description: "AutoBot accurately identifies and localizes deceptive patterns from website screenshots without relying on HTML code, achieving an F1-score of 0.93."
1414
permalink: /
1515
bibtex: |
16-
@article{nayak2024autobot,
16+
@article{nayak2025autobot,
1717
title={Automatically Detecting Online Deceptive Patterns},
18-
author={Nayak, Asmit and Zhang, Shirley and Wani, Yash and Khandelwal, Rishabh and Fawaz, Kassem},
19-
journal={arXiv preprint arXiv:2411.07441},
18+
author={Nayak, Asmit and Wani, Yash and Zhang, Shirley and Khandelwal, Rishabh and Fawaz, Kassem},
2019
year={2024}
2120
}
2221
---
@@ -38,9 +37,13 @@ bibtex: |
3837
<div class="abstract">
3938
<p>We introduce our <strong>AutoBot framework</strong> to address this gap and help web stakeholders navigate and mitigate online deceptive patterns. AutoBot accurately identifies and localizes deceptive patterns from a screenshot of a website without relying on the underlying HTML code. AutoBot employs a two-stage pipeline that leverages the capabilities of specialized vision models to analyze website screenshots, identify interactive elements, and extract textual features. Next, using a large language model, AutoBot understands the context surrounding these elements to determine the presence of deceptive patterns.</p>
4039

41-
<p>We also use AutoBot to create a synthetic dataset to distill knowledge from 'teacher' LLMs to smaller language models. Through extensive evaluation, we demonstrate AutoBot's effectiveness in detecting deceptive patterns on the web, achieving an <strong>F1-score of 0.93</strong> when detecting deceptive patterns, underscoring its potential as an essential tool for mitigating online deceptive patterns.</p>
40+
<p>We also use AutoBot to create a synthetic dataset to distill knowledge from 'teacher' LLMs to smaller language models. Through extensive evaluation, we demonstrate AutoBot's effectiveness in detecting deceptive patterns on the web, achieving an <strong>F1-score of 0.93</strong> when detecting deceptive patterns, underscoring its potential as an essential tool for mitigating online deceptive patterns. We implement AutoBot across three downstream applications targeting different web stakeholders:</p>
4241

43-
<p>We implement AutoBot across three downstream applications targeting different web stakeholders: **(1)** a local browser extension providing users with real-time feedback, **(2)** a Lighthouse audit to inform developers of potential deceptive patterns on their sites, and **(3)** a measurement tool designed for researchers and regulators.</p>
42+
<ol>
43+
<li> A local browser extension providing users with real-time feedback </li>
44+
<li> A Lighthouse audit to inform developers of potential deceptive patterns on their sites </li>
45+
<li> A measurement tool designed for researchers and regulators </li>
46+
</ol>
4447
</div>
4548

4649

@@ -51,15 +54,56 @@ bibtex: |
5154
<figcaption>AutoBot's two-stage pipeline: (1) Vision Module to localize UI elements and extract features, (2) Language Module to detect deceptive patterns.</figcaption>
5255
</div>
5356

54-
AutoBot adopts a modular design, breaking down the task into two distinct modules:
57+
AutoBot adopts a modular design, breaking down the task into two distinct modules: a Vision Module for element localization and feature extraction, and a Language Module for deceptive pattern detection. This approach allows AutoBot to work with screenshots alone, without requiring access to the underlying HTML code, which tends to be less stable across different webpage implementations.
5558

56-
1. **Vision Module**: Analyzes screenshots to accurately localize UI elements, extracting essential features including text, visual attributes, and spatial relationships.
59+
### Vision Module
5760

58-
2. **Language Module**: Leverages large language models to understand the context surrounding these elements and determine the presence of deceptive patterns.
61+
To address high false positive rates and localization issues, the Vision Module parses a webpage screenshot and maps it to a tabular representation we call *ElementMap*. As illustrated in the figure above, the *ElementMap* contains the text associated with each UI element, along with its features: element type, bounding box coordinates, font size, background color, and font color. For UI element detection, we train a YOLOv10 model on a synthetically generated dataset. The evaluation of our model is presented below.
5962

60-
This approach allows AutoBot to work with screenshots alone, without requiring access to the underlying HTML code, which tends to be less stable across different webpage implementations.
63+
<div class="project-figure">
64+
<div style="display: flex; gap: 20px; justify-content: center; align-items: flex-end;">
65+
<div style="width: 48%; display: flex; flex-direction: column; align-items: center;">
66+
<img src="{{ '/assets/images/ui-detector.png' | relative_url }}" alt="UI Detector" style="width: 100%;">
67+
<figcaption style="margin-top: 10px; font-size: 0.9em; text-align: center;">(a) Synthetic dataset generation pipeline for training the Web-UI Detector</figcaption>
68+
</div>
69+
<div style="width: 48%; display: flex; flex-direction: column; align-items: center;">
70+
<img src="{{ '/assets/images/ccs-2025-vision-eval.png' | relative_url }}" alt="Vision Module Evaluation" style="width: 100%;">
71+
<figcaption style="margin-top: 10px; font-size: 0.9em; text-align: center;">(b) Evaluation of YOLO (Ours) vs Molmo across different UI element types</figcaption>
72+
</div>
73+
</div>
74+
<figcaption>The Vision Module processes screenshots to extract UI elements and their features into an <em>ElementMap</em> representation.</figcaption>
75+
</div>
76+
77+
### Language Module
78+
79+
The Language Module takes the *ElementMap* as input and maps each element to a deceptive pattern from our taxonomy. This module reasons about each element considering its spatial context and visual features. We explore different instantiations of this module—such as distilling smaller models like Qwen and T5 from a larger teacher model like Gemini—to achieve various trade-offs in terms of cost, need for training, and accuracy.
80+
81+
<div class="project-figure">
82+
<img src="{{ '/assets/images/language-module.png' | relative_url }}" alt="Language Module Detection">
83+
<figcaption>The Language Module analyzes <em>ElementMap data</em> to identify and classify deceptive patterns in context.</figcaption>
84+
</div>
85+
86+
## E2E Evaluation
87+
88+
We evaluate AutoBot's end-to-end performance by comparing different instantiations of our Language Module on the task of deceptive pattern detection. The interactive visualization below presents the performance metrics of *AutoBot* using a range of LLM -- Gemini, distilled Qwen-2.5-1.5B and distilled T5-base models. These results demonstrate how different model choices affect detection accuracy, precision, and recall across our deceptive pattern taxonomy.
89+
90+
<div class="project-figure" style="margin: 30px auto !important; text-align: center; display: flex; flex-direction: column; align-items: center;">
91+
<iframe src="{{ '/assets/plotly/ccs-2025-llm-eval-category.html' | relative_url }}"
92+
style="width: 100%; max-width:90vw; height: 531px; border: none;"
93+
frameborder="0">
94+
</iframe>
95+
<figcaption style="max-width:90vw;">Interactive comparison of performance of <em>AutoBot</em>(with three underlying language models: Gemini, Qwen, and T5) at the Category Level.</figcaption>
96+
</div>
97+
98+
<div class="project-figure" style="margin: 30px auto !important; text-align: center; display: flex; flex-direction: column; align-items: center;">
99+
<iframe src="{{ '/assets/plotly/ccs-2025-llm-eval-subtype.html' | relative_url }}"
100+
style="width: 1510px; max-width:90vw; height: 531px; border: none;"
101+
frameborder="0">
102+
</iframe>
103+
<figcaption style="">Interactive comparison of performance of <em>AutoBot</em>(with three underlying language models: Gemini, Qwen, and T5) and <em>DPGuard</em> at the Subtype Level</figcaption>
104+
</div>
61105

62-
## Key Results
106+
<!-- ## Key Results
63107
64108
### Performance Metrics
65109
@@ -165,7 +209,7 @@ Our user study with real participants demonstrates that:
165209
166210
- AutoBot's visual highlighting significantly improves user awareness of deceptive patterns
167211
- The highlighting system does not negatively impact perceived website usability
168-
- Users appreciate the real-time feedback and find it helpful for making informed decisions
212+
- Users appreciate the real-time feedback and find it helpful for making informed decisions
169213
170214
## Knowledge Distillation
171215
@@ -188,4 +232,4 @@ AutoBot represents a significant step forward in combating deceptive patterns on
188232
Future work includes:
189233
- Expanding the taxonomy to cover emerging deceptive pattern types
190234
- Improving multilingual support for global deployment
191-
- Developing automated remediation suggestions for developers
235+
- Developing automated remediation suggestions for developers -->

0 commit comments

Comments
 (0)