snap-ally 0.2.7-beta → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/A11yReportAssets.d.ts +5 -12
  2. package/dist/A11yReportAssets.js +16 -82
  3. package/dist/A11yScanner.d.ts +2 -21
  4. package/dist/A11yScanner.js +16 -22
  5. package/dist/A11yTimeUtils.js +11 -23
  6. package/dist/A11yVisualReporter.d.ts +50 -0
  7. package/dist/A11yVisualReporter.js +188 -0
  8. package/dist/AccessibilityReporterOptions.d.ts +24 -0
  9. package/dist/AccessibilityReporterOptions.js +5 -0
  10. package/dist/ResolvedColors.d.ts +15 -0
  11. package/dist/ResolvedColors.js +20 -0
  12. package/dist/SnapAllyReporter.d.ts +12 -72
  13. package/dist/SnapAllyReporter.js +218 -329
  14. package/dist/core/A11yHtmlRenderer.d.ts +17 -0
  15. package/dist/core/A11yHtmlRenderer.js +118 -0
  16. package/dist/core/A11yReportAssets.d.ts +30 -0
  17. package/dist/core/A11yReportAssets.js +127 -0
  18. package/dist/core/A11yScanner.d.ts +8 -0
  19. package/dist/core/A11yScanner.js +178 -0
  20. package/dist/core/A11yVisualReporter.d.ts +50 -0
  21. package/dist/core/A11yVisualReporter.js +188 -0
  22. package/dist/core/HtmlRenderer.d.ts +14 -0
  23. package/dist/core/HtmlRenderer.js +106 -0
  24. package/dist/core/ReportAssets.d.ts +29 -0
  25. package/dist/core/ReportAssets.js +126 -0
  26. package/dist/core/Scanner.d.ts +7 -0
  27. package/dist/core/Scanner.js +162 -0
  28. package/dist/core/VisualReporter.d.ts +54 -0
  29. package/dist/core/VisualReporter.js +192 -0
  30. package/dist/index.d.ts +6 -6
  31. package/dist/index.js +13 -12
  32. package/dist/models/A11yDataSource.d.ts +15 -0
  33. package/dist/models/A11yDataSource.js +2 -0
  34. package/dist/models/A11yError.d.ts +34 -0
  35. package/dist/models/A11yError.js +11 -0
  36. package/dist/models/A11yScannerOptions.d.ts +24 -0
  37. package/dist/models/A11yScannerOptions.js +2 -0
  38. package/dist/models/AccessibilityReporterOptions.d.ts +24 -0
  39. package/dist/models/AccessibilityReporterOptions.js +5 -0
  40. package/dist/models/DataSource.d.ts +15 -0
  41. package/dist/models/DataSource.js +2 -0
  42. package/dist/models/ImagePath.d.ts +5 -0
  43. package/dist/models/ImagePath.js +3 -0
  44. package/dist/models/ReportData.d.ts +24 -0
  45. package/dist/models/ReportData.js +2 -0
  46. package/dist/models/ReporterOptions.d.ts +24 -0
  47. package/dist/models/ReporterOptions.js +5 -0
  48. package/dist/models/ResolvedColors.d.ts +16 -0
  49. package/dist/models/ResolvedColors.js +24 -0
  50. package/dist/models/ScannerOptions.d.ts +30 -0
  51. package/dist/models/ScannerOptions.js +2 -0
  52. package/dist/models/Severity.d.ts +7 -0
  53. package/dist/models/Severity.js +11 -0
  54. package/dist/models/Target.d.ts +10 -0
  55. package/dist/models/Target.js +3 -0
  56. package/dist/models/TestResults.d.ts +41 -0
  57. package/dist/models/TestResults.js +2 -0
  58. package/dist/models/TestStatusIcon.d.ts +8 -0
  59. package/dist/models/TestStatusIcon.js +12 -0
  60. package/dist/models/TestSummary.d.ts +34 -0
  61. package/dist/models/TestSummary.js +2 -0
  62. package/dist/models/Violation.d.ts +13 -0
  63. package/dist/models/Violation.js +2 -0
  64. package/dist/models/index.d.ts +12 -113
  65. package/dist/models/index.js +26 -16
  66. package/dist/templates/accessibility-report.html +62 -95
  67. package/dist/templates/execution-summary.html +37 -103
  68. package/dist/templates/global-report-styles.css +400 -9
  69. package/dist/templates/report-app.js +170 -72
  70. package/dist/templates/test-execution-report.html +84 -121
  71. package/dist/utils/A11yTimeUtils.d.ts +13 -0
  72. package/dist/utils/A11yTimeUtils.js +40 -0
  73. package/dist/utils/TimeUtils.d.ts +13 -0
  74. package/dist/utils/TimeUtils.js +39 -0
  75. package/package.json +2 -2
@@ -0,0 +1,41 @@
1
+ import { Violation } from './Violation';
2
+ /** Aggregated results for a single test run. */
3
+ export interface TestResults {
4
+ num: number;
5
+ folderName: string;
6
+ title: string;
7
+ fileName: string;
8
+ timeDuration: number;
9
+ duration: string;
10
+ description: string;
11
+ status: string;
12
+ pageUrl?: string;
13
+ browser: string;
14
+ adoOrganization?: string;
15
+ adoProject?: string;
16
+ adoAreaPath?: string;
17
+ timestamp?: string;
18
+ tags: string[];
19
+ preConditions: string[];
20
+ steps: string[];
21
+ postConditions: string[];
22
+ statusIcon: string;
23
+ /** Relative paths to videos for the test execution. */
24
+ videoPath: string | string[] | null;
25
+ screenshotPaths: string[];
26
+ attachments: {
27
+ path: string;
28
+ name: string;
29
+ }[];
30
+ errors: string[];
31
+ a11yReportPath?: string;
32
+ executionReportPath?: string;
33
+ a11yErrors?: Violation[];
34
+ a11yErrorCount?: number;
35
+ colors?: {
36
+ critical?: string;
37
+ serious?: string;
38
+ moderate?: string;
39
+ minor?: string;
40
+ };
41
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ /** Standard icons for test statuses in the report. */
2
+ export declare enum TestStatusIcon {
3
+ passed = "check_circle",
4
+ failed = "cancel",
5
+ skipped = "remove_circle",
6
+ timedOut = "alarm_off",
7
+ interrupted = "block"
8
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /** Standard icons for test statuses in the report. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TestStatusIcon = void 0;
5
+ var TestStatusIcon;
6
+ (function (TestStatusIcon) {
7
+ TestStatusIcon["passed"] = "check_circle";
8
+ TestStatusIcon["failed"] = "cancel";
9
+ TestStatusIcon["skipped"] = "remove_circle";
10
+ TestStatusIcon["timedOut"] = "alarm_off";
11
+ TestStatusIcon["interrupted"] = "block";
12
+ })(TestStatusIcon || (exports.TestStatusIcon = TestStatusIcon = {}));
@@ -0,0 +1,34 @@
1
+ import { TestResults } from './TestResults';
2
+ /** Final execution summary data structure. */
3
+ export interface TestSummary {
4
+ date?: string;
5
+ duration: string;
6
+ status: string;
7
+ statusIcon: string;
8
+ total: number;
9
+ totalPassed: number;
10
+ totalFailed: number;
11
+ totalFlaky: number;
12
+ totalSkipped: number;
13
+ groupedResults: {
14
+ [key: string]: TestResults[];
15
+ };
16
+ wcagErrors: {
17
+ [key: string]: {
18
+ count: number;
19
+ severity: string;
20
+ helpUrl?: string;
21
+ description?: string;
22
+ };
23
+ };
24
+ totalA11yErrorCount: number;
25
+ browserSummaries?: {
26
+ [browser: string]: TestSummary;
27
+ };
28
+ colors?: {
29
+ critical?: string;
30
+ serious?: string;
31
+ moderate?: string;
32
+ minor?: string;
33
+ };
34
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { Target } from './Target';
2
+ /** Grouped error entry for a specific accessibility violation. */
3
+ export interface Violation {
4
+ id: string;
5
+ description: string;
6
+ wcagRule: string;
7
+ severity: string;
8
+ help: string;
9
+ helpUrl: string;
10
+ guideline: string;
11
+ total: number;
12
+ target: Target[];
13
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,113 +1,12 @@
1
- export interface ReportData {
2
- pageKey: string;
3
- pageUrl?: string;
4
- accessibilityScore: number;
5
- video?: string;
6
- a11yErrors: A11yError[];
7
- criticalColor: string;
8
- seriousColor: string;
9
- moderateColor: string;
10
- minorColor: string;
11
- adoOrganization?: string;
12
- adoProject?: string;
13
- adoAreaPath?: string;
14
- adoPat?: string;
15
- timestamp?: string;
16
- }
17
- export interface A11yError {
18
- id: string;
19
- description: string;
20
- wcagRule: string;
21
- severity: string;
22
- help: string;
23
- helpUrl: string;
24
- guideline: string;
25
- total: number;
26
- target: Target[];
27
- }
28
- export interface Target {
29
- element: string;
30
- snippet: string;
31
- html: string;
32
- screenshot: string;
33
- steps: string[];
34
- stepsJson: string;
35
- screenshotBase64: string;
36
- }
37
- export interface ImagePath {
38
- srcPath: string;
39
- fileName: string;
40
- }
41
- export declare enum Severity {
42
- minor = "minor",
43
- moderate = "moderate",
44
- serious = "serious",
45
- critical = "critical"
46
- }
47
- export interface TestResults {
48
- num: number;
49
- folderName: string;
50
- title: string;
51
- fileName: string;
52
- timeDuration: number;
53
- duration: string;
54
- description: string;
55
- status: string;
56
- pageUrl?: string;
57
- browser: string;
58
- tags: string[];
59
- preConditions: string[];
60
- steps: string[];
61
- postConditions: string[];
62
- statusIcon: string;
63
- videoPath: string | null;
64
- screenshotPaths: string[];
65
- attachments: {
66
- path: string;
67
- name: string;
68
- }[];
69
- errors: string[];
70
- a11yReportPath?: string;
71
- executionReportPath?: string;
72
- a11yErrors?: A11yError[];
73
- a11yErrorCount?: number;
74
- colors?: {
75
- critical?: string;
76
- serious?: string;
77
- moderate?: string;
78
- minor?: string;
79
- };
80
- }
81
- export interface TestSummary {
82
- date?: string;
83
- duration: string;
84
- status: string;
85
- statusIcon: string;
86
- total: number;
87
- totalPassed: number;
88
- totalFailed: number;
89
- totalFlaky: number;
90
- totalSkipped: number;
91
- groupedResults: {
92
- [key: string]: TestResults[];
93
- };
94
- wcagErrors: {
95
- [key: string]: {
96
- count: number;
97
- severity: string;
98
- helpUrl?: string;
99
- description?: string;
100
- };
101
- };
102
- totalA11yErrorCount: number;
103
- browserSummaries?: {
104
- [browser: string]: TestSummary;
105
- };
106
- }
107
- export declare enum TestStatusIcon {
108
- passed = "check_circle",
109
- failed = "cancel",
110
- skipped = "remove_circle",
111
- timedOut = "alarm_off",
112
- interrupted = "block"
113
- }
1
+ export * from './Violation';
2
+ export * from './ReportData';
3
+ export * from './TestResults';
4
+ export * from './ScannerOptions';
5
+ export * from './DataSource';
6
+ export * from './ReporterOptions';
7
+ export * from './ResolvedColors';
8
+ export * from './Target';
9
+ export * from './Severity';
10
+ export * from './TestStatusIcon';
11
+ export * from './TestSummary';
12
+ export * from './ImagePath';
@@ -1,18 +1,28 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TestStatusIcon = exports.Severity = void 0;
4
- var Severity;
5
- (function (Severity) {
6
- Severity["minor"] = "minor";
7
- Severity["moderate"] = "moderate";
8
- Severity["serious"] = "serious";
9
- Severity["critical"] = "critical";
10
- })(Severity || (exports.Severity = Severity = {}));
11
- var TestStatusIcon;
12
- (function (TestStatusIcon) {
13
- TestStatusIcon["passed"] = "check_circle";
14
- TestStatusIcon["failed"] = "cancel";
15
- TestStatusIcon["skipped"] = "remove_circle";
16
- TestStatusIcon["timedOut"] = "alarm_off";
17
- TestStatusIcon["interrupted"] = "block";
18
- })(TestStatusIcon || (exports.TestStatusIcon = TestStatusIcon = {}));
17
+ __exportStar(require("./Violation"), exports);
18
+ __exportStar(require("./ReportData"), exports);
19
+ __exportStar(require("./TestResults"), exports);
20
+ __exportStar(require("./ScannerOptions"), exports);
21
+ __exportStar(require("./DataSource"), exports);
22
+ __exportStar(require("./ReporterOptions"), exports);
23
+ __exportStar(require("./ResolvedColors"), exports);
24
+ __exportStar(require("./Target"), exports);
25
+ __exportStar(require("./Severity"), exports);
26
+ __exportStar(require("./TestStatusIcon"), exports);
27
+ __exportStar(require("./TestSummary"), exports);
28
+ __exportStar(require("./ImagePath"), exports);
@@ -26,39 +26,27 @@
26
26
  </head>
27
27
 
28
28
  <body>
29
- <div
30
- id="loader-overlay"
31
- style="
32
- position: fixed;
33
- inset: 0;
34
- background: #fff;
35
- z-index: 10000;
36
- display: flex;
37
- flex-direction: column;
38
- justify-content: center;
39
- align-items: center;
40
- transition: opacity 0.5s ease;
41
- display: none;
42
- "
43
- >
29
+ <a href="#accessibility-report-root" class="skip-link">Skip to main content</a>
30
+
31
+ <div id="loader-overlay" class="loader-overlay hidden" aria-live="polite" aria-busy="true">
44
32
  <div class="loader-pulse">
45
- <span class="material-symbols-outlined" style="font-size: 32px">query_stats</span>
33
+ <span class="material-symbols-outlined fs-32" aria-hidden="true">query_stats</span>
46
34
  </div>
47
35
  <div class="loader-text">Compiling Audit Results</div>
48
36
  </div>
49
37
 
50
- <header>
51
- <a href="#" class="brand" style="cursor: default; text-decoration: none">
52
- <div class="brand-icon">
53
- <span class="material-symbols-outlined" style="font-size: 22px"
38
+ <header role="banner">
39
+ <div class="brand">
40
+ <div class="brand-icon" aria-hidden="true">
41
+ <span class="material-symbols-outlined fs-6"
54
42
  >accessibility_new</span
55
43
  >
56
44
  </div>
57
45
  <h1 class="brand-text">Accessibility Audit</h1>
58
- </a>
59
- <div class="header-actions" style="display: flex; gap: 16px; align-items: center">
46
+ </div>
47
+ <nav class="header-actions d-flex-align-center gap-16" aria-label="Quick Actions">
60
48
  <a href="../summary.html" class="btn btn-link btn-sm btn-back">
61
- <span class="material-symbols-outlined btn-back-icon">arrow_back</span>
49
+ <span class="material-symbols-outlined btn-back-icon" aria-hidden="true">arrow_back</span>
62
50
  Back to Summary
63
51
  </a>
64
52
  <button
@@ -66,33 +54,39 @@
66
54
  class="btn btn-outline-primary btn-sm btn-token"
67
55
  data-bs-toggle="modal"
68
56
  data-bs-target="#tokenModal"
69
- >
70
- <span class="material-symbols-outlined btn-token-icon">key</span>
57
+ aria-label="Manage ADO Token">
58
+ <span class="material-symbols-outlined btn-token-icon" aria-hidden="true">key</span>
71
59
  ADO Token
72
60
  </button>
73
- </div>
61
+ </nav>
74
62
  </header>
75
63
 
76
- <div class="container" id="accessibility-report-root" style="display: none">
64
+ <main class="container hidden" id="accessibility-report-root">
77
65
  <!-- Hero Section -->
78
66
  <section class="page-hero">
79
67
  <div class="hero-content">
80
68
  <h2>Target Resource</h2>
81
69
  <p class="page-url" id="a11y-page-url"></p>
70
+ <div
71
+ class="hero-meta mt-2 hidden"
72
+ id="a11y-browser-container"
73
+ style="font-size: 0.9rem; opacity: 0.8; font-family: Inter, sans-serif;"
74
+ >
75
+ <b>Browser:</b> <span id="a11y-browser-text"></span>
76
+ </div>
82
77
  </div>
83
78
  <div class="stats-pills">
84
79
  <div
85
- class="stat-pill stat-pill-passed"
80
+ class="stat-pill stat-pill-passed hidden"
86
81
  id="a11y-pill-passed"
87
- style="display: none"
88
82
  >
89
- <span class="material-symbols-outlined" style="font-size: 20px"
83
+ <span class="material-symbols-outlined fs-20"
90
84
  >verified</span
91
85
  >
92
86
  No Violations
93
87
  </div>
94
88
 
95
- <div class="stat-pill" id="a11y-pill-failed" style="display: none">
89
+ <div class="stat-pill stat-pill-failed hidden" id="a11y-pill-failed">
96
90
  <span class="material-symbols-outlined stat-pill-icon">bug_report</span>
97
91
  <span><span id="a11y-failed-count"></span> Issues</span>
98
92
  </div>
@@ -100,23 +94,20 @@
100
94
  </section>
101
95
 
102
96
  <!-- Video Card -->
103
- <div class="video-card" id="a11y-video-card" style="display: none">
97
+ <div class="video-card hidden" id="a11y-video-card">
104
98
  <div class="video-header">
105
99
  <div class="video-icon-wrap">
106
100
  <span class="material-symbols-outlined">videocam</span>
107
101
  </div>
108
102
  <h2 class="video-title">Execution Recording</h2>
109
103
  </div>
110
- <div class="video-container">
111
- <video controls>
112
- <source id="a11y-video-source" type="video/webm" />
113
- Your browser does not support the video tag.
114
- </video>
104
+ <div class="video-container" id="a11y-videos-list">
105
+ <!-- Multiple videos will be injected here if available -->
115
106
  </div>
116
107
  </div>
117
108
 
118
109
  <!-- Success State -->
119
- <div class="success-verified-card" id="a11y-success-card" style="display: none">
110
+ <div class="success-verified-card hidden" id="a11y-success-card">
120
111
  <div class="success-content-layout">
121
112
  <div class="success-icon-container">
122
113
  <span class="material-symbols-outlined">verified_user</span>
@@ -142,7 +133,7 @@
142
133
  <span class="violation-rule-info">
143
134
  <span class="rule-name"></span>
144
135
  <span class="rule-sep">•</span>
145
- <span class="rule-wcag-tags" style="margin-left: 8px"></span>
136
+ <span class="rule-wcag-tags ms-2"></span>
146
137
  </span>
147
138
  </div>
148
139
  <span class="severity-badge"></span>
@@ -165,7 +156,7 @@
165
156
  </div>
166
157
  </div>
167
158
 
168
- <div class="instances-list" style="margin-top: 16px">
159
+ <div class="instances-list mt-16">
169
160
  <h4 class="instances-title">
170
161
  <span class="material-symbols-outlined instances-icon"
171
162
  >preview</span
@@ -187,17 +178,17 @@
187
178
  data-bs-target=""
188
179
  aria-expanded="false"
189
180
  >
190
- <div class="d-flex align-items-center gap-3" style="max-width: 75%">
181
+ <div class="d-flex-align-center gap-3 max-w-75">
191
182
  <span class="material-symbols-outlined chevron">expand_more</span>
192
183
  <div class="bug-snippet">
193
- <strong style="color: var(--primary)" class="bug-rule-name"></strong
184
+ <strong class="text-primary bug-rule-name"></strong
194
185
  >:
195
186
  <span class="bug-snippet-text"></span>
196
187
  </div>
197
188
  </div>
198
189
  <div class="d-flex gap-2">
199
190
  <button class="btn btn-sm btn-bug log-bug-btn" type="button">
200
- <span class="material-symbols-outlined" style="font-size: 16px"
191
+ <span class="material-symbols-outlined fs-16"
201
192
  >bug_report</span
202
193
  >
203
194
  Log Bug
@@ -208,18 +199,16 @@
208
199
  <div id="" class="collapse bug-item-body-collapse">
209
200
  <div class="bug-details-body">
210
201
  <!-- Left: Repro Steps -->
211
- <div style="margin-bottom: 16px">
202
+ <div class="mb-3">
212
203
  <div class="bug-section-title">Reproduction Steps</div>
213
- <div class="bug-content-box bug-failure-summary">
214
- <span style="color: var(--text-muted); font-style: italic"
215
- >No interaction steps recorded. Issue found via static
216
- scan.</span
217
- >
204
+ <div class="bug-content-box bug-failure-summary text-muted fst-italic">
205
+ No interaction steps recorded. Issue found via static
206
+ scan.
218
207
  </div>
219
208
  </div>
220
209
 
221
210
  <!-- Right: Visual -->
222
- <div class="visual-evidence-section" style="display: none">
211
+ <div class="visual-evidence-section hidden">
223
212
  <div class="bug-section-title">Visual Evidence</div>
224
213
  <div class="screenshot-container">
225
214
  <img class="bug-screenshot" alt="Violation Evidence" />
@@ -242,6 +231,7 @@
242
231
  type="button"
243
232
  class="btn-close"
244
233
  data-bs-dismiss="modal"
234
+ aria-label="Close"
245
235
  ></button>
246
236
  </div>
247
237
  <div class="modal-body modal-body-custom">
@@ -257,6 +247,7 @@
257
247
  class="form-control token-input"
258
248
  id="tokenInput"
259
249
  placeholder="Enter PAT Token"
250
+ aria-label="Personal Access Token"
260
251
  required
261
252
  />
262
253
  </div>
@@ -279,8 +270,7 @@
279
270
  <div class="modal-header">
280
271
  <div class="modal-title">
281
272
  <span
282
- class="material-symbols-outlined"
283
- style="color: #cc293d; font-size: 24px"
273
+ class="material-symbols-outlined text-critical fs-24"
284
274
  >bug_report</span
285
275
  >
286
276
  New Bug Entry - Azure DevOps
@@ -294,7 +284,7 @@
294
284
  </div>
295
285
  <div class="modal-body">
296
286
  <div class="ado-field-group">
297
- <label class="ado-form-label">Title</label>
287
+ <label class="ado-form-label" for="bugTitleInput">Title</label>
298
288
  <input
299
289
  type="text"
300
290
  id="bugTitleInput"
@@ -306,7 +296,7 @@
306
296
  <div class="row">
307
297
  <div class="col-md-6">
308
298
  <div class="ado-field-group">
309
- <label class="ado-form-label">Severity</label>
299
+ <label class="ado-form-label" for="bugSeverityInput">Severity</label>
310
300
  <select id="bugSeverityInput" class="ado-form-input">
311
301
  <option value="critical">Critical (Priority 1)</option>
312
302
  <option value="serious">Serious (Priority 2)</option>
@@ -317,7 +307,7 @@
317
307
  </div>
318
308
  <div class="col-md-6">
319
309
  <div class="ado-field-group">
320
- <label class="ado-form-label">Target Area</label>
310
+ <label class="ado-form-label" for="bugAreaInput">Target Area</label>
321
311
  <input
322
312
  type="text"
323
313
  id="bugAreaInput"
@@ -332,23 +322,17 @@
332
322
  <label class="ado-form-label">Reproduction Steps & Description</label>
333
323
  <div
334
324
  id="bugReproPreview"
335
- class="ado-repro-preview"
336
- style="min-height: 150px"
325
+ class="ado-repro-preview min-h-150"
337
326
  ></div>
338
327
  </div>
339
328
 
340
329
  <!-- Visual Evidence - Single Column Full Width -->
341
330
  <div
342
- class="ado-field-group"
343
- id="screenshotThumbContainer"
344
- style="display: none"
345
- >
331
+ class="ado-field-group hidden"
332
+ id="screenshotThumbContainer">
346
333
  <label class="ado-form-label">
347
334
  <span
348
- class="material-symbols-outlined"
349
- style="font-size: 14px; vertical-align: middle"
350
- >image</span
351
- >
335
+ class="material-symbols-outlined fs-14 v-align-middle">image</span>
352
336
  Violation Screenshot
353
337
  </label>
354
338
  <img
@@ -359,13 +343,10 @@
359
343
  />
360
344
  </div>
361
345
 
362
- <div class="ado-field-group" id="videoThumbContainer" style="display: none">
346
+ <div class="ado-field-group hidden" id="videoThumbContainer">
363
347
  <label class="ado-form-label">
364
348
  <span
365
- class="material-symbols-outlined"
366
- style="font-size: 14px; vertical-align: middle"
367
- >videocam</span
368
- >
349
+ class="material-symbols-outlined fs-14 v-align-middle">videocam</span>
369
350
  Session Recording
370
351
  </label>
371
352
  <video id="bugVideoPreview" class="video-preview-player" controls>
@@ -373,51 +354,37 @@
373
354
  </video>
374
355
  </div>
375
356
 
376
- <div class="ado-field-group" style="margin-bottom: 0">
377
- <div
378
- class="ado-repro-preview"
379
- style="
380
- font-size: 0.75rem;
381
- background: #fffcf0;
382
- border-color: #f9f0c3;
383
- padding: 12px;
384
- line-height: 1.5;
385
- "
386
- >
387
- <b>Environment:</b> Playwright engine • <b>URL:</b>
388
- <span
389
- id="bugUrlPreview"
390
- style="word-break: break-all; color: var(--primary)"
391
- ></span>
357
+ <div class="ado-field-group mb-0">
358
+ <div class="ado-repro-preview ado-repro-env">
359
+ <b>Environment:</b> Playwright engine •
360
+ <b>Browser:</b> <span id="bugBrowserPreview" class="text-primary me-2"></span>
361
+ <b>URL:</b>
362
+ <span id="bugUrlPreview" class="text-primary break-all"></span>
392
363
  </div>
393
364
  </div>
394
365
  </div>
395
366
  <div class="modal-footer">
396
367
  <button
397
368
  type="button"
398
- class="btn-ado-secondary btn btn-outline-secondary"
399
- data-bs-dismiss="modal"
400
- style="border-radius: 12px; font-weight: 700"
401
- >
369
+ class="btn-ado-secondary btn btn-outline-secondary rounded-12 fw-bold"
370
+ data-bs-dismiss="modal">
402
371
  Cancel
403
372
  </button>
404
373
  <button
405
374
  type="button"
406
375
  id="confirmBugBtn"
407
- class="btn-ado-primary btn btn-primary"
408
- style="border-radius: 12px; font-weight: 700"
409
- >
376
+ class="btn-ado-primary btn btn-primary rounded-12 fw-bold">
410
377
  Create Bug
411
378
  </button>
412
379
  </div>
413
380
  </div>
414
381
  </div>
415
- </div>
382
+ </main>
416
383
 
417
384
  <footer>
418
385
  <div class="powered-by">Generated by <span class="badge-tool">Snap Ally</span></div>
419
386
  <div>
420
- <span style="opacity: 0.7">&copy; <span id="year"></span> Snap Ally</span>
387
+ <span class="opacity-75">&copy; <span id="year"></span> Snap Ally</span>
421
388
  </div>
422
389
  </footer>
423
390