tabalyst 0.1.0__py3-none-any.whl
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.
- tabalyst/__init__.py +20 -0
- tabalyst/__main__.py +6 -0
- tabalyst/_version.py +23 -0
- tabalyst/analysis.py +786 -0
- tabalyst/cli.py +208 -0
- tabalyst/config.py +214 -0
- tabalyst/errors.py +17 -0
- tabalyst/execution_log.py +102 -0
- tabalyst/ingestion.py +86 -0
- tabalyst/models.py +174 -0
- tabalyst/reporting.py +54 -0
- tabalyst/service.py +134 -0
- tabalyst/static/report.js +500 -0
- tabalyst/static/theme.css +411 -0
- tabalyst/templates/report.html +318 -0
- tabalyst-0.1.0.dist-info/METADATA +208 -0
- tabalyst-0.1.0.dist-info/RECORD +21 -0
- tabalyst-0.1.0.dist-info/WHEEL +5 -0
- tabalyst-0.1.0.dist-info/entry_points.txt +2 -0
- tabalyst-0.1.0.dist-info/licenses/LICENSE +21 -0
- tabalyst-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
:root,
|
|
2
|
+
:root[data-theme="dark"] {
|
|
3
|
+
color-scheme: dark;
|
|
4
|
+
--font-title: "Oswald", "Arial Narrow", sans-serif;
|
|
5
|
+
--font-body: "Roboto", Arial, sans-serif;
|
|
6
|
+
--font-mono: Consolas, "Courier New", monospace;
|
|
7
|
+
--font-hand: "Caveat", cursive;
|
|
8
|
+
--canvas: #070a18;
|
|
9
|
+
--surface: #0d1228;
|
|
10
|
+
--surface-soft: #131a33;
|
|
11
|
+
--surface-hover: #18213e;
|
|
12
|
+
--text: #eef0f7;
|
|
13
|
+
--heading: #ffffff;
|
|
14
|
+
--muted: #a7afc4;
|
|
15
|
+
--border: #29314f;
|
|
16
|
+
--accent: #f98510;
|
|
17
|
+
--accent-ink: #00051a;
|
|
18
|
+
--danger: #bf211e;
|
|
19
|
+
--success: #0e9f8e;
|
|
20
|
+
--concept: #7652d4;
|
|
21
|
+
--interactive: #7652d4;
|
|
22
|
+
--interactive-ink: #ffffff;
|
|
23
|
+
--link: #ffad5c;
|
|
24
|
+
--band: #00051a;
|
|
25
|
+
--field: #101730;
|
|
26
|
+
--shadow: #00000066;
|
|
27
|
+
--report-name-column: 220px;
|
|
28
|
+
--bs-body-font-family: var(--font-body);
|
|
29
|
+
--bs-body-color: var(--text);
|
|
30
|
+
--bs-body-bg: var(--canvas);
|
|
31
|
+
--bs-link-color: var(--link);
|
|
32
|
+
--bs-link-hover-color: #ffad5c;
|
|
33
|
+
--bs-border-color: var(--border);
|
|
34
|
+
--bs-secondary-color: var(--muted);
|
|
35
|
+
--bs-tertiary-bg: var(--surface-soft);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
:root[data-theme="light"] {
|
|
39
|
+
color-scheme: light;
|
|
40
|
+
--canvas: #ffffff;
|
|
41
|
+
--surface: #ffffff;
|
|
42
|
+
--surface-soft: #f4f5f9;
|
|
43
|
+
--surface-hover: #f8f3ed;
|
|
44
|
+
--text: #1a1f36;
|
|
45
|
+
--heading: #050032;
|
|
46
|
+
--muted: #687086;
|
|
47
|
+
--border: #d9dce6;
|
|
48
|
+
--concept: #3a0ca3;
|
|
49
|
+
--interactive: #3a0ca3;
|
|
50
|
+
--interactive-ink: #ffffff;
|
|
51
|
+
--link: #3a0ca3;
|
|
52
|
+
--field: #ffffff;
|
|
53
|
+
--shadow: #00051a1f;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
* { box-sizing: border-box; letter-spacing: 0; }
|
|
57
|
+
html { background: var(--canvas); scroll-behavior: smooth; }
|
|
58
|
+
body { margin: 0; font-family: var(--font-body); color: var(--text); background: var(--canvas); font-size: 14px; }
|
|
59
|
+
a { color: var(--link); }
|
|
60
|
+
code, pre, kbd, samp { font-family: var(--font-mono); }
|
|
61
|
+
.report-container { width: min(1180px, calc(100% - 64px)); margin: 0 auto; }
|
|
62
|
+
|
|
63
|
+
.app-shell { display: flex; align-items: stretch; min-height: 100vh; }
|
|
64
|
+
.sidebar { position: sticky; top: 0; align-self: flex-start; width: 240px; height: 100dvh; flex: 0 0 240px; border-right: 1px solid #252c49; background: var(--band); color: #ffffff; }
|
|
65
|
+
.topbar-inner { display: flex; height: 100%; flex-direction: column; align-items: stretch; gap: 34px; padding: 28px 22px; }
|
|
66
|
+
.brand { display: inline-flex; gap: 9px; align-items: center; color: #ffffff; text-decoration: none; font-family: var(--font-title); font-weight: 600; font-size: 19px; }
|
|
67
|
+
.brand-mark { display: grid; place-items: center; width: 32px; height: 32px; background: var(--accent); color: var(--accent-ink); font-family: var(--font-title); font-size: 19px; border-radius: 4px; }
|
|
68
|
+
.sidebar nav { display: flex; flex-direction: column; gap: 3px; }
|
|
69
|
+
.sidebar .nav-label { margin: 14px 0 4px; color: #7f8aaf; font-family: var(--font-title); font-size: 11px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; }
|
|
70
|
+
.sidebar .nav-label:first-child { margin-top: 0; }
|
|
71
|
+
.sidebar nav a { position: relative; display: flex; align-items: center; min-height: 36px; padding: 7px 9px 7px 27px; border-radius: 6px; color: #c9ccda; font-size: 12px; font-weight: 500; text-decoration: none; }
|
|
72
|
+
.sidebar nav a::before { position: absolute; left: 10px; width: 7px; height: 7px; border: 1px solid currentColor; border-radius: 2px; content: ""; }
|
|
73
|
+
.sidebar .nav-count { margin-left: 3px; color: #7f8aaf; font: inherit; font-weight: 400; }
|
|
74
|
+
.sidebar nav a:hover .nav-count, .sidebar nav a:focus-visible .nav-count { color: #a7afc4; }
|
|
75
|
+
.sidebar nav a:hover, .sidebar nav a:focus-visible { background: #151d3c; color: #ffffff; outline: none; }
|
|
76
|
+
.topbar-actions { display: flex; margin-top: auto; align-items: center; justify-content: space-between; gap: 12px; }
|
|
77
|
+
.theme-toggle { display: grid; place-items: center; width: 34px; height: 34px; padding: 0; border: 1px solid #3b4260; border-radius: 4px; background: #0c1229; color: #ffffff; cursor: pointer; font-size: 18px; }
|
|
78
|
+
.theme-toggle:hover, .theme-toggle:focus-visible { border-color: var(--accent); outline: none; }
|
|
79
|
+
.report-page { min-width: 0; flex: 1; }
|
|
80
|
+
.report-content { width: 100%; min-height: calc(100vh - 73px); margin: 0; padding-inline: 32px; }
|
|
81
|
+
|
|
82
|
+
.report-section { padding: 32px 0; border-bottom: 1px solid var(--border); scroll-margin-top: 20px; }
|
|
83
|
+
.report-details { position: relative; padding-block: 24px; border-bottom: 1px solid var(--border); scroll-margin-top: 20px; }
|
|
84
|
+
.report-details:first-child { padding-top: 0; }
|
|
85
|
+
.report-details:last-child { border-bottom: 0; padding-bottom: 0; }
|
|
86
|
+
.report-details > summary { display: inline-flex; align-items: center; gap: 8px; width: fit-content; max-width: calc(100% - 76px); min-height: 31px; color: var(--heading); cursor: pointer; font-family: var(--font-title); font-size: 19px; font-weight: 600; line-height: 1.4; list-style: none; }
|
|
87
|
+
.report-details > summary::-webkit-details-marker { display: none; }
|
|
88
|
+
.report-details > summary::before { width: 9px; height: 9px; flex: 0 0 9px; border-right: 2px solid var(--heading); border-bottom: 2px solid var(--heading); content: ""; transform: rotate(-45deg); transform-origin: center; transition: transform 120ms ease-out; }
|
|
89
|
+
.report-details[open] > summary::before { transform: rotate(45deg); }
|
|
90
|
+
.report-details[data-collapsing] > summary::before { transform: rotate(-45deg); }
|
|
91
|
+
.quality-details[open] > .overview-grid { margin-top: 18px; }
|
|
92
|
+
.secondary-details { margin-top: 0; }
|
|
93
|
+
.report-heading, .section-heading { display: flex; gap: 20px; justify-content: space-between; align-items: center; margin-bottom: 24px; }
|
|
94
|
+
.report-heading > div { min-width: 0; }
|
|
95
|
+
.eyebrow { margin: 0 0 5px; color: var(--concept); font-family: var(--font-hand); font-size: 21px; font-weight: 500; }
|
|
96
|
+
h1, h2, summary, .table thead th, .number-filter-title { color: var(--heading); font-family: var(--font-title); }
|
|
97
|
+
h1 { font-size: 32px; line-height: 1.2; font-weight: 600; margin: 0 0 10px; overflow-wrap: anywhere; }
|
|
98
|
+
h2 { font-size: 19px; line-height: 1.4; font-weight: 600; margin: 0 0 16px; }
|
|
99
|
+
.section-heading h2 { margin: 0; }
|
|
100
|
+
.metadata, .muted { color: var(--muted); font-size: 12px; }
|
|
101
|
+
.metadata { margin: 0; overflow-wrap: anywhere; }
|
|
102
|
+
.metadata code { color: var(--text); }
|
|
103
|
+
.generation { text-align: right; font-size: 12px; white-space: nowrap; }
|
|
104
|
+
.generation time { display: block; margin-top: 6px; color: var(--muted); font-family: var(--font-mono); font-size: 11px; }
|
|
105
|
+
.status-dot { display: inline-block; background: var(--success); width: 7px; height: 7px; border-radius: 50%; margin-right: 5px; }
|
|
106
|
+
|
|
107
|
+
.metric-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border-block: 1px solid var(--border); margin: 0 0 32px; padding: 24px 0; }
|
|
108
|
+
.metric-grid > div { padding: 0 24px; border-left: 1px solid var(--border); min-width: 0; }
|
|
109
|
+
.metric-grid > div:first-child { padding-left: 0; border-left: 0; }
|
|
110
|
+
.metric-grid dt { color: var(--muted); font-family: var(--font-title); font-size: 13px; font-weight: 500; }
|
|
111
|
+
.metric-grid dd { color: var(--heading); font-family: var(--font-mono); font-size: 30px; font-weight: 700; line-height: 1.3; margin: 7px 0 4px; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
|
|
112
|
+
.metric-grid dd small { font-size: 18px; margin-left: 2px; }
|
|
113
|
+
.metric-grid span { color: var(--muted); font-size: 11px; display: block; }
|
|
114
|
+
.metric-grid .metric-warning { color: var(--danger); }
|
|
115
|
+
|
|
116
|
+
.overview-grid { display: grid; grid-template-columns: 1.5fr 1fr; gap: 60px; }
|
|
117
|
+
.overview-grid > div { min-width: 0; }
|
|
118
|
+
.section-count { color: var(--muted); font: inherit; font-weight: 400; }
|
|
119
|
+
.observations { list-style: none; margin: 0; padding: 0; }
|
|
120
|
+
.observations li { display: flex; gap: 10px; align-items: baseline; padding: 8px 0; border-bottom: 1px solid var(--border); font-size: 13px; }
|
|
121
|
+
.observations li:last-child { border-bottom: 0; }
|
|
122
|
+
.observations strong { margin-left: auto; font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
|
|
123
|
+
.observation-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; background: var(--danger); }
|
|
124
|
+
.observation-dot.info { background: var(--concept); }
|
|
125
|
+
.type-bar { height: 10px; display: flex; overflow: hidden; border-radius: 3px; margin-bottom: 16px; background: var(--surface-soft); }
|
|
126
|
+
.type-fill { height: 100%; }
|
|
127
|
+
.type-text { background: #7652d4; }
|
|
128
|
+
.type-integer { background: #4f7fe8; }
|
|
129
|
+
.type-number { background: #2f9cc1; }
|
|
130
|
+
.type-date { background: #0e9f8e; }
|
|
131
|
+
.type-boolean { background: #bf62aa; }
|
|
132
|
+
.type-mixed { background: var(--danger); }
|
|
133
|
+
.type-empty { background: #7d8498; }
|
|
134
|
+
.type-legend { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 24px; list-style: none; padding: 0; margin: 0; }
|
|
135
|
+
.type-legend li { display: flex; align-items: center; gap: 8px; font-size: 12px; }
|
|
136
|
+
.type-legend strong { margin-left: auto; font-family: var(--font-mono); }
|
|
137
|
+
.legend-dot { width: 8px; height: 8px; border-radius: 2px; }
|
|
138
|
+
|
|
139
|
+
.column-search { width: 230px; max-width: 100%; }
|
|
140
|
+
.form-control, .form-select { border-color: var(--border); background-color: var(--field); color: var(--text); }
|
|
141
|
+
.form-control::placeholder { color: var(--muted); opacity: 1; }
|
|
142
|
+
.form-control:focus, .form-select:focus { border-color: var(--border); background-color: var(--field); color: var(--text); box-shadow: 0 0 0 2px color-mix(in srgb, var(--interactive) 30%, transparent); }
|
|
143
|
+
.btn-outline-secondary { --bs-btn-color: var(--text); --bs-btn-border-color: var(--border); --bs-btn-hover-color: var(--interactive-ink); --bs-btn-hover-bg: var(--interactive); --bs-btn-hover-border-color: var(--interactive); --bs-btn-active-color: var(--interactive-ink); --bs-btn-active-bg: var(--interactive); --bs-btn-active-border-color: var(--interactive); }
|
|
144
|
+
.table-responsive { overflow-x: auto; max-width: 100%; }
|
|
145
|
+
.table { --bs-table-bg: transparent; --bs-table-color: var(--text); --bs-table-border-color: var(--border); --bs-table-hover-bg: var(--surface-hover); --bs-table-hover-color: var(--text); --bs-table-striped-bg: var(--surface-soft); --bs-table-striped-color: var(--text); margin-bottom: 0; }
|
|
146
|
+
.table thead th { color: var(--heading); background: var(--surface-soft); font-size: 13px; font-weight: 600; white-space: nowrap; padding-block: 11px; }
|
|
147
|
+
.table tbody th, .table tbody td { font-family: var(--font-mono); }
|
|
148
|
+
.column-table { min-width: 1080px; table-layout: fixed; font-size: 12px; }
|
|
149
|
+
.column-table thead th:nth-child(1) { width: var(--report-name-column) !important; }
|
|
150
|
+
.column-table thead th:nth-child(2) { width: 120px !important; max-width: 120px; }
|
|
151
|
+
.column-table thead th:nth-child(3) { width: 105px !important; max-width: 105px; }
|
|
152
|
+
.column-table thead th:nth-child(4), .column-table thead th:nth-child(5) { width: 135px !important; max-width: 135px; }
|
|
153
|
+
.column-table thead th:nth-child(6) { width: 115px !important; max-width: 115px; }
|
|
154
|
+
.column-table thead th:last-child { width: auto !important; }
|
|
155
|
+
.column-table tbody th, .column-table tbody td { padding-block: 13px; }
|
|
156
|
+
.column-table tbody th { font-weight: 700; overflow-wrap: anywhere; }
|
|
157
|
+
.column-index { display: inline-block; width: 26px; color: var(--muted); font-size: 10px; font-weight: 400; vertical-align: top; padding-top: 2px; }
|
|
158
|
+
.column-name { display: inline-block; max-width: calc(100% - 26px); }
|
|
159
|
+
.type-badge { display: inline-block; padding: 4px 8px; border: 0; border-radius: 4px; color: #d8ceff; background: color-mix(in srgb, var(--concept) 30%, transparent); font-family: var(--font-mono); font-size: 10px; font-weight: 700; }
|
|
160
|
+
:root[data-theme="light"] .type-badge { color: var(--concept); background: color-mix(in srgb, var(--concept) 9%, #ffffff); }
|
|
161
|
+
.badge-text { border-color: #7652d4; color: #d8ceff; background: #7652d433; }
|
|
162
|
+
.badge-integer { border-color: #4f7fe8; color: #bcd0ff; background: #4f7fe833; }
|
|
163
|
+
.badge-number { border-color: #2f9cc1; color: #aee8fb; background: #2f9cc133; }
|
|
164
|
+
.badge-date { border-color: #0e9f8e; color: #8ce1d6; background: #0e9f8e33; }
|
|
165
|
+
.badge-boolean { border-color: #bf62aa; color: #f0b9e4; background: #bf62aa33; }
|
|
166
|
+
.badge-mixed { border-color: color-mix(in srgb, var(--danger) 45%, transparent); color: #ffb8b6; background: color-mix(in srgb, var(--danger) 25%, transparent); }
|
|
167
|
+
:root[data-theme="light"] .badge-mixed { color: #8f1715; background: #fae7e7; }
|
|
168
|
+
.badge-empty { border-color: var(--border); color: var(--muted); background: var(--surface-soft); }
|
|
169
|
+
:root[data-theme="light"] .badge-text { border-color: #7652d4; color: #3a0ca3; background: #f0ebff; }
|
|
170
|
+
:root[data-theme="light"] .badge-integer { border-color: #4f7fe8; color: #234f9f; background: #e9f0ff; }
|
|
171
|
+
:root[data-theme="light"] .badge-number { border-color: #2f9cc1; color: #14637e; background: #e4f5fa; }
|
|
172
|
+
:root[data-theme="light"] .badge-date { border-color: #0e9f8e; color: #087c70; background: #e1f6f2; }
|
|
173
|
+
:root[data-theme="light"] .badge-boolean { border-color: #bf62aa; color: #83336f; background: #faeaf6; }
|
|
174
|
+
.semantic-separator { display: inline-block; margin: 0 4px; color: var(--muted); }
|
|
175
|
+
.semantic-badge { border-color: color-mix(in srgb, var(--concept) 65%, transparent); }
|
|
176
|
+
.semantic-enum { border-color: #9b7dea; color: #ded4ff; background: #7652d426; }
|
|
177
|
+
.semantic-date { border-color: #35bbaa; color: #9de8de; background: #0e9f8e26; }
|
|
178
|
+
:root[data-theme="light"] .semantic-enum { border-color: #7652d4; color: #3a0ca3; background: #f3efff; }
|
|
179
|
+
:root[data-theme="light"] .semantic-date { border-color: #0e9f8e; color: #087c70; background: #e8f8f5; }
|
|
180
|
+
.missing-value { display: flex; gap: 6px; justify-content: space-between; font-size: 11px; font-variant-numeric: tabular-nums; }
|
|
181
|
+
.missing-value small { color: var(--muted); }
|
|
182
|
+
.missing-track { height: 3px; margin-top: 5px; border-radius: 2px; background: var(--surface-soft); }
|
|
183
|
+
.missing-track div { height: 100%; background: var(--danger); border-radius: 2px; }
|
|
184
|
+
.percentage-value { display: flex; gap: 6px; justify-content: space-between; font-size: 11px; font-variant-numeric: tabular-nums; }
|
|
185
|
+
.percentage-value small { color: var(--muted); font: inherit; }
|
|
186
|
+
.percentage-track { height: 3px; margin-top: 5px; border-radius: 2px; background: var(--surface-soft); }
|
|
187
|
+
.percentage-track div { height: 100%; border-radius: 2px; }
|
|
188
|
+
.percentage-track.track-danger div { background: var(--danger); }
|
|
189
|
+
.percentage-track.track-concept div { background: var(--concept); }
|
|
190
|
+
.percentage-track.track-success div { background: var(--success); }
|
|
191
|
+
.percentage-track.track-accent div { background: var(--accent); }
|
|
192
|
+
.percentage-track.track-muted div { background: var(--muted); }
|
|
193
|
+
.table th.percentage-column, .table td.percentage-column,
|
|
194
|
+
.table th.dt-type-numeric, .table td.dt-type-numeric { padding-right: 28px !important; }
|
|
195
|
+
.tabular { font-variant-numeric: tabular-nums; }
|
|
196
|
+
.examples { position: relative; color: var(--muted); outline: none; }
|
|
197
|
+
.examples:focus-visible { box-shadow: inset 0 0 0 1px var(--interactive); }
|
|
198
|
+
.example-value { display: inline; overflow-wrap: anywhere; }
|
|
199
|
+
.example-value + .example-value::before { content: " / "; color: var(--border); }
|
|
200
|
+
.example-more { display: inline-block; margin-left: 7px; padding: 1px 5px; border: 1px solid var(--border); border-radius: 3px; color: var(--muted); font: 10px var(--font-mono); line-height: 1.4; }
|
|
201
|
+
.examples:hover .example-more, .examples:focus-within .example-more { border-color: var(--interactive); color: var(--heading); }
|
|
202
|
+
.examples-tooltip, .date-formats-tooltip { position: fixed; z-index: 1060; display: none; width: min(380px, calc(100vw - 24px)); max-height: min(420px, calc(100dvh - 24px)); overflow: hidden; border: 1px solid var(--border); border-radius: 5px; background: var(--surface-soft); box-shadow: 0 5px 18px var(--shadow); color: var(--text); font-family: var(--font-mono); font-size: 11px; }
|
|
203
|
+
.examples:hover .examples-tooltip, .examples:focus-within .examples-tooltip,
|
|
204
|
+
.date-formats-cell:hover .date-formats-tooltip, .date-formats-cell:focus-within .date-formats-tooltip { display: block; }
|
|
205
|
+
.examples-tooltip-title { display: flex; justify-content: space-between; gap: 16px; padding: 7px 9px; border-bottom: 1px solid var(--border); color: var(--heading); font-family: var(--font-title); font-size: 12px; font-weight: 500; }
|
|
206
|
+
.examples-tooltip-title span { color: var(--muted); font: inherit; font-weight: 400; }
|
|
207
|
+
.examples-tooltip-list { max-height: min(380px, calc(100dvh - 64px)); overflow-y: auto; padding: 4px 0; scrollbar-width: thin; scrollbar-color: var(--muted) var(--surface-soft); }
|
|
208
|
+
.examples-tooltip-list > div { display: grid; grid-template-columns: minmax(0, 1fr) max-content; gap: 12px; padding: 4px 9px; }
|
|
209
|
+
.examples-tooltip-list > div + div { border-top: 1px solid color-mix(in srgb, var(--border) 55%, transparent); }
|
|
210
|
+
.examples-tooltip-list span { overflow-wrap: anywhere; }
|
|
211
|
+
.examples-tooltip-list small { color: var(--muted); font: inherit; font-variant-numeric: tabular-nums; }
|
|
212
|
+
.filter-result { margin-top: 12px; }
|
|
213
|
+
.table-actions { display: flex; align-items: center; gap: 12px; max-width: 100%; }
|
|
214
|
+
.table-reset { flex-shrink: 0; font-size: 12px; border-radius: 4px; }
|
|
215
|
+
.report-details > .details-actions { position: absolute; top: 24px; right: 0; min-height: 31px; align-items: center; }
|
|
216
|
+
.report-details:first-child > .details-actions { top: 0; }
|
|
217
|
+
.report-details:not([open]) > .details-actions, .report-details[data-collapsing] > .details-actions { display: none; }
|
|
218
|
+
.columns-details > summary { max-width: calc(100% - 320px); }
|
|
219
|
+
.columns-details > .table-actions { position: absolute; top: 0; right: 0; }
|
|
220
|
+
.columns-details:not([open]) > .table-actions, .columns-details[data-collapsing] > .table-actions { display: none; }
|
|
221
|
+
.columns-details > .table-responsive { margin-top: 18px; }
|
|
222
|
+
.secondary-table-wrap { margin-top: 10px; }
|
|
223
|
+
.transformations-table { min-width: 760px; table-layout: fixed; font-size: 12px; }
|
|
224
|
+
.transformations-table thead th:first-child { width: var(--report-name-column) !important; }
|
|
225
|
+
.transformations-table thead th:not(:first-child) { width: 135px !important; max-width: 150px; }
|
|
226
|
+
.transformations-table td { font-variant-numeric: tabular-nums; }
|
|
227
|
+
.date-table { min-width: 1030px; table-layout: fixed; }
|
|
228
|
+
.date-table thead th:first-child { width: var(--report-name-column) !important; }
|
|
229
|
+
.date-table thead th:nth-child(2) { width: 135px !important; max-width: 135px; }
|
|
230
|
+
.date-table thead th:nth-child(n+3):not(:last-child) { width: 115px !important; max-width: 115px; }
|
|
231
|
+
.date-table thead th:last-child { width: auto !important; }
|
|
232
|
+
.date-table tbody th, .date-table tbody td { font-family: var(--font-mono); font-size: 12px; }
|
|
233
|
+
.date-table td { font-variant-numeric: tabular-nums; }
|
|
234
|
+
.date-formats-cell { position: relative; outline: none; }
|
|
235
|
+
.date-formats-cell:focus-visible { box-shadow: inset 0 0 0 1px var(--interactive); }
|
|
236
|
+
.date-format-count { color: var(--muted); font-size: 11px; white-space: nowrap; }
|
|
237
|
+
.date-formats-cell:hover .date-format-count, .date-formats-cell:focus-within .date-format-count { color: var(--interactive); }
|
|
238
|
+
.date-formats-tooltip .date-breakdown-invalid { margin-top: 6px; padding-top: 8px; border-top: 2px solid var(--border) !important; }
|
|
239
|
+
.date-status { text-transform: none; }
|
|
240
|
+
.status-valid, .status-multiple_formats { border-color: color-mix(in srgb, var(--success) 55%, transparent); color: #83dfd2; background: color-mix(in srgb, var(--success) 20%, transparent); }
|
|
241
|
+
.status-mixed, .status-invalid { border-color: color-mix(in srgb, var(--danger) 45%, transparent); color: #ffb8b6; background: color-mix(in srgb, var(--danger) 25%, transparent); }
|
|
242
|
+
.status-ambiguous { border-color: color-mix(in srgb, var(--accent) 55%, transparent); color: var(--link); background: color-mix(in srgb, var(--accent) 16%, transparent); }
|
|
243
|
+
:root[data-theme="light"] .status-mixed, :root[data-theme="light"] .status-invalid { color: #8f1715; background: #fae7e7; }
|
|
244
|
+
:root[data-theme="light"] .status-ambiguous { color: #8a4700; background: #fff1e2; }
|
|
245
|
+
:root[data-theme="light"] .status-valid, :root[data-theme="light"] .status-multiple_formats { color: #087c70; background: #e1f6f2; }
|
|
246
|
+
.string-very_short { color: #8ce1d6; background: #0e9f8e33; }
|
|
247
|
+
.string-short { border-color: #2f9cc1; color: #aee8fb; background: #2f9cc133; }
|
|
248
|
+
.string-medium { color: #bcd0ff; background: #4f7fe833; }
|
|
249
|
+
.string-long { border-color: #7652d4; color: #d8ceff; background: #7652d433; }
|
|
250
|
+
.string-very_long { border-color: #bf62aa; color: #f0b9e4; background: #bf62aa33; }
|
|
251
|
+
:root[data-theme="light"] .string-very_short { color: #087c70; background: #e1f6f2; }
|
|
252
|
+
:root[data-theme="light"] .string-short { border-color: #2f9cc1; color: #14637e; background: #e4f5fa; }
|
|
253
|
+
:root[data-theme="light"] .string-medium { color: #234f9f; background: #e9f0ff; }
|
|
254
|
+
:root[data-theme="light"] .string-long { border-color: #7652d4; color: #3a0ca3; background: #f0ebff; }
|
|
255
|
+
:root[data-theme="light"] .string-very_long { border-color: #bf62aa; color: #83336f; background: #faeaf6; }
|
|
256
|
+
|
|
257
|
+
.dt-container { width: 100%; }
|
|
258
|
+
table.dataTable thead th { text-align: left !important; }
|
|
259
|
+
table.dataTable thead .dt-column-header { gap: 6px !important; align-items: center; justify-content: flex-start !important; text-align: left; }
|
|
260
|
+
table.dataTable thead > tr > th.dt-type-numeric .dt-column-header { flex-direction: row; justify-content: flex-start !important; }
|
|
261
|
+
table.dataTable > thead > tr > th { background: var(--surface-soft); }
|
|
262
|
+
table.dataTable .dt-column-title { flex-grow: 0 !important; text-align: left; overflow-wrap: anywhere; }
|
|
263
|
+
.dtcc { margin-left: 0; flex-shrink: 0; }
|
|
264
|
+
table.dataTable thead .dt-column-header > .dt-column-title { order: 1; }
|
|
265
|
+
table.dataTable thead .dt-column-header > span.dtcc { display: contents; }
|
|
266
|
+
table.dataTable thead .dtcc-button_dropdown { order: 2; }
|
|
267
|
+
table.dataTable thead .dtcc-button_order { order: 3; }
|
|
268
|
+
table.dataTable thead .dt-column-header:has(.dtcc-button_active) > .dt-column-title { color: var(--heading); text-decoration: underline; text-decoration-color: var(--interactive); text-decoration-thickness: 2px; text-underline-offset: 4px; }
|
|
269
|
+
table.dataTable thead .dtcc-button_order,
|
|
270
|
+
table.dataTable thead .dtcc-button_dropdown { opacity: 0 !important; transition: opacity 120ms ease; }
|
|
271
|
+
table.dataTable thead .dt-column-header:hover .dtcc-button_order,
|
|
272
|
+
table.dataTable thead .dt-column-header:hover .dtcc-button_dropdown,
|
|
273
|
+
table.dataTable thead .dt-column-header:focus-within .dtcc-button_order,
|
|
274
|
+
table.dataTable thead .dt-column-header:focus-within .dtcc-button_dropdown,
|
|
275
|
+
table.dataTable thead .dtcc-button_order.dtcc-button_active,
|
|
276
|
+
table.dataTable thead .dtcc-button_dropdown.dtcc-button_active { opacity: 1 !important; }
|
|
277
|
+
table.dataTable span.dtcc button.dtcc-button { color: var(--muted); }
|
|
278
|
+
table.dataTable span.dtcc button.dtcc-button_dropdown.dtcc-button_active,
|
|
279
|
+
table.dataTable span.dtcc button.dtcc-button_order.dtcc-button_active { --dtcc-button-icon_color: var(--interactive-ink); color: var(--interactive-ink); background: var(--interactive) !important; }
|
|
280
|
+
|
|
281
|
+
div.dtcc-dropdown { --filter-bg: var(--surface-soft); --filter-active: var(--interactive); position: fixed; z-index: 1050; max-width: min(340px, calc(100vw - 24px)); max-height: calc(100dvh - 24px); overflow: hidden; border: 1px solid var(--border); border-radius: 5px; background: var(--filter-bg); box-shadow: 0 5px 18px var(--shadow); color: var(--text); font-family: var(--font-body); font-size: 12px; }
|
|
282
|
+
div.dtcc-dropdown { --dtcc-list-buttons_background: var(--filter-bg); --dtcc-list-buttons_max-height: min(260px, calc(100dvh - 180px)); --dtcc-search-input_background-color: var(--field); --dtcc-search-input_background: var(--field); --dtcc-search-input_border: 1px solid var(--border); --dtcc-search-input_border-radius: 3px; --dtcc-search-input_padding: 3px 7px; padding: 0; }
|
|
283
|
+
div.dtcc-dropdown div.dtcc-dropdown-liner { position: relative; padding: 8px; background: var(--filter-bg); overflow: hidden; }
|
|
284
|
+
div.dtcc-dropdown button.dtcc-button span.dtcc-button-text { white-space: normal; overflow-wrap: anywhere; min-width: 0; }
|
|
285
|
+
div.dtcc-dropdown .dtcc-list { max-height: none; overflow: hidden; background: var(--filter-bg); }
|
|
286
|
+
div.dtcc-dropdown div.dtcc-list div.dtcc-list-controls { background: var(--filter-bg); padding: 0 0 6px; grid-template-columns: max-content 1fr; gap: 4px; }
|
|
287
|
+
div.dtcc-dropdown .dtcc-list .dtcc-list-buttons { max-height: min(260px, calc(100dvh - 180px)); overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--muted) var(--filter-bg); background: var(--filter-bg); }
|
|
288
|
+
div.dtcc-dropdown .dtcc-list .dtcc-list-buttons::-webkit-scrollbar { width: 5px; }
|
|
289
|
+
div.dtcc-dropdown .dtcc-list .dtcc-list-buttons::-webkit-scrollbar-thumb { background: var(--muted); border-radius: 3px; }
|
|
290
|
+
div.dtcc-dropdown .dtcc-list .dtcc-list-buttons button.dtcc-button { display: flex; align-items: center; gap: 8px; padding: 5px 6px; background: var(--filter-bg); color: var(--text); font-size: 12px; }
|
|
291
|
+
div.dtcc-dropdown .dtcc-list .dtcc-list-buttons button.dtcc-button span.dtcc-button-state { display: grid; place-items: center; order: -1; width: 16px; height: 16px; border: 1px solid var(--muted); border-radius: 3px; flex-shrink: 0; }
|
|
292
|
+
div.dtcc-dropdown .dtcc-list .dtcc-list-buttons button.dtcc-button_active span.dtcc-button-state { color: var(--interactive-ink); background: var(--interactive); border-color: var(--interactive); }
|
|
293
|
+
div.dtcc-dropdown div.dtcc-list div.dtcc-list-controls button.dtcc-list-selectAll,
|
|
294
|
+
div.dtcc-dropdown div.dtcc-list div.dtcc-list-controls button.dtcc-list-selectNone,
|
|
295
|
+
div.dtcc-dropdown button.dtcc-button_searchClear { display: inline-flex; align-items: center; width: auto; min-height: 24px; padding: 2px 6px; margin: 2px 4px 2px 0; border: 1px solid var(--border); border-radius: 3px; background: var(--filter-bg); color: var(--muted); font-size: 11px; line-height: 18px; box-shadow: none; }
|
|
296
|
+
div.dtcc-dropdown div.dtcc-list div.dtcc-list-controls button { justify-self: start; }
|
|
297
|
+
div.dtcc-dropdown button.dtcc-button_searchClear { margin: 0; }
|
|
298
|
+
div.dtcc-dropdown button.filter-clear { position: absolute; top: 8px; right: 8px; z-index: 1; }
|
|
299
|
+
div.dtcc-dropdown button.filter-clear:not(.filter-clear-active) { display: none !important; }
|
|
300
|
+
div.dtcc-dropdown button.dtcc-button_searchClear .dtcc-button-icon { width: 13px; margin-right: 4px; }
|
|
301
|
+
div.dtcc-dropdown button.dtcc-button_searchClear svg { width: 13px; height: 13px; }
|
|
302
|
+
div.dtcc-dropdown input, div.dtcc-dropdown select { font-family: var(--font-mono); font-size: 12px; height: 28px; min-height: 28px; max-width: 100%; min-width: 0; padding: 3px 7px; border: 1px solid var(--border); border-radius: 3px; background-color: var(--field); color: var(--text); box-shadow: none; }
|
|
303
|
+
div.dtcc-dropdown input:focus, div.dtcc-dropdown select:focus { border-color: var(--border); box-shadow: none; outline: 1px solid var(--interactive); outline-offset: 1px; }
|
|
304
|
+
div.dtcc-dropdown .dtcc-search { padding: 0; background: var(--filter-bg); }
|
|
305
|
+
div.dtcc-dropdown .dtcc-list-buttons button.dtcc-button:hover,
|
|
306
|
+
div.dtcc-dropdown .dtcc-list-controls button:hover,
|
|
307
|
+
div.dtcc-dropdown .number-operators button:hover { position: relative; z-index: 1; border-color: var(--border); box-shadow: inset 0 0 0 1px var(--interactive) !important; }
|
|
308
|
+
div.dtcc-dropdown button.dtcc-list-selectAll:hover,
|
|
309
|
+
div.dtcc-dropdown button.dtcc-list-selectNone:hover,
|
|
310
|
+
div.dtcc-dropdown button.dtcc-button_searchClear:hover { border-color: var(--border); box-shadow: inset 0 0 0 1px var(--interactive) !important; }
|
|
311
|
+
div.dtcc-dropdown button:focus-visible { outline: 2px solid var(--interactive); outline-offset: -2px; }
|
|
312
|
+
.number-filter { width: 224px; max-width: 100%; }
|
|
313
|
+
.number-filter-title { color: var(--heading); font-size: 12px; font-weight: 500; margin-bottom: 6px; }
|
|
314
|
+
.number-operators { display: grid; grid-template-columns: repeat(6, 1fr); margin-bottom: 8px; }
|
|
315
|
+
.number-operators button { height: 28px; border: 1px solid var(--border); border-right-width: 0; background: transparent; color: var(--text); font-family: var(--font-mono); font-size: 16px; line-height: 1; }
|
|
316
|
+
.number-operators button:first-child { border-radius: 3px 0 0 3px; }
|
|
317
|
+
.number-operators button:last-child { border-right-width: 1px; border-radius: 0 3px 3px 0; }
|
|
318
|
+
.number-operators button[aria-pressed="true"] { color: var(--interactive-ink); background: var(--interactive); font-weight: 700; }
|
|
319
|
+
.number-fields { display: flex; gap: 8px; }
|
|
320
|
+
.number-fields input { flex: 1; width: 0; }
|
|
321
|
+
.number-filter-error { font-size: 11px; color: var(--danger); margin-top: 6px; }
|
|
322
|
+
.filter-option-count { margin-left: 5px; color: var(--muted); font-family: var(--font-mono); font-size: 11px; font-variant-numeric: tabular-nums; }
|
|
323
|
+
.filter-drag-handle { position: relative; height: 26px; display: flex; align-items: center; justify-content: center; gap: 6px; border-bottom: 1px solid var(--border); color: var(--muted); background: var(--filter-bg); cursor: move; user-select: none; touch-action: none; font-size: 10px; text-transform: uppercase; }
|
|
324
|
+
.filter-drag-handle::before { content: "\22ee\22ee"; font-size: 15px; line-height: 1; letter-spacing: -3px; transform: rotate(90deg); }
|
|
325
|
+
.filter-drag-handle:hover { color: var(--text); }
|
|
326
|
+
.filter-drag-handle .filter-close { position: absolute; right: 3px; top: 2px; display: grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 3px; background: transparent; color: var(--muted); cursor: pointer; font-size: 18px; line-height: 1; }
|
|
327
|
+
.filter-drag-handle .filter-close:hover { background: var(--surface-hover); color: var(--text); }
|
|
328
|
+
.filter-action-row { display: flex; min-height: 28px; align-items: center; gap: 12px; margin-bottom: 7px; padding-right: 72px; }
|
|
329
|
+
.filter-action-label { min-width: 0; overflow-wrap: anywhere; color: var(--heading); font-family: var(--font-title); font-size: 12px; font-weight: 500; }
|
|
330
|
+
.filter-action-row + .number-filter .number-filter-title { display: none; }
|
|
331
|
+
|
|
332
|
+
summary { width: fit-content; max-width: 100%; cursor: pointer; font-weight: 500; font-size: 14px; }
|
|
333
|
+
.numeric-table { table-layout: fixed; font-size: 12px; min-width: 700px; }
|
|
334
|
+
.numeric-table thead th:first-child { width: var(--report-name-column) !important; }
|
|
335
|
+
.numeric-table thead th:not(:first-child) { width: 120px !important; max-width: 120px; }
|
|
336
|
+
.numeric-table th { overflow-wrap: anywhere; }
|
|
337
|
+
.numeric-table td { font-variant-numeric: tabular-nums; }
|
|
338
|
+
.string-table { min-width: 1220px; table-layout: fixed; font-size: 12px; }
|
|
339
|
+
.string-table thead th:nth-child(1) { width: var(--report-name-column) !important; }
|
|
340
|
+
.string-table thead th:nth-child(2) { width: 125px !important; max-width: 125px; }
|
|
341
|
+
.string-table thead th:nth-child(n+3):not(:last-child) { width: 100px !important; max-width: 100px; }
|
|
342
|
+
.string-table thead th:last-child { width: auto !important; }
|
|
343
|
+
.string-table tbody th { overflow-wrap: anywhere; }
|
|
344
|
+
.string-table td { font-variant-numeric: tabular-nums; }
|
|
345
|
+
.length-examples { color: var(--muted); }
|
|
346
|
+
.length-examples-tooltip { width: min(460px, calc(100vw - 24px)); }
|
|
347
|
+
.length-tooltip-row { grid-template-columns: minmax(0, 1fr) 130px !important; align-items: center; }
|
|
348
|
+
.length-tooltip-copy { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
349
|
+
.length-tooltip-copy strong { color: var(--heading); }
|
|
350
|
+
.length-tooltip-copy span { color: var(--text); overflow-wrap: anywhere; }
|
|
351
|
+
.length-tooltip-frequency { min-width: 0; }
|
|
352
|
+
.sample-scroll { max-height: 390px; }
|
|
353
|
+
.sample-table { width: max-content; min-width: 100%; font-size: 12px; }
|
|
354
|
+
.sample-table th, .sample-table td { min-width: 72px; max-width: 220px; padding: 8px; overflow-wrap: anywhere; white-space: pre-wrap; }
|
|
355
|
+
.sample-table thead th { position: sticky; top: 0; z-index: 2; }
|
|
356
|
+
.sample-table .row-number { position: sticky; left: 0; min-width: 68px; width: 68px; background: var(--surface-soft); color: var(--muted); text-align: right; z-index: 1; }
|
|
357
|
+
.sample-table thead .row-number { z-index: 3; }
|
|
358
|
+
.settings-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px 40px; margin: 24px 0; font-size: 12px; }
|
|
359
|
+
.settings-grid dt { color: var(--heading); font-family: var(--font-title); font-weight: 500; margin-bottom: 4px; }
|
|
360
|
+
.settings-grid dd { margin: 0; color: var(--muted); overflow-wrap: anywhere; }
|
|
361
|
+
.source-hash { overflow-wrap: anywhere; }
|
|
362
|
+
.empty-state { color: var(--muted); padding: 16px 0; font-size: 13px; }
|
|
363
|
+
|
|
364
|
+
.footer { width: 100%; background: var(--band); color: #b8bdcf; }
|
|
365
|
+
.footer .report-container { width: 100%; margin: 0; padding-inline: 32px; }
|
|
366
|
+
.footer-inner { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 12px; padding-block: 24px; font-size: 11px; }
|
|
367
|
+
.footer-inner > span:first-child { color: #ffffff; font-family: var(--font-title); font-size: 14px; font-weight: 600; }
|
|
368
|
+
.footer a { color: #ffffff; }
|
|
369
|
+
.footer a:hover { color: #a9d8ff; }
|
|
370
|
+
|
|
371
|
+
@media (max-width: 800px) {
|
|
372
|
+
.app-shell { display: block; }
|
|
373
|
+
.sidebar { position: static; width: 100%; height: auto; border-right: 0; border-bottom: 1px solid #252c49; }
|
|
374
|
+
.topbar-inner { gap: 18px; padding: 18px 16px; }
|
|
375
|
+
.sidebar nav { flex-flow: row wrap; gap: 6px; }
|
|
376
|
+
.sidebar .nav-label { width: 100%; margin: 8px 0 1px; }
|
|
377
|
+
.sidebar nav a { min-height: 32px; padding: 6px 8px 6px 23px; }
|
|
378
|
+
.topbar-actions { margin-top: 0; }
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
@media (max-width: 700px) {
|
|
382
|
+
.report-container { width: calc(100% - 32px); }
|
|
383
|
+
.report-content { width: 100%; padding-inline: 16px; }
|
|
384
|
+
.footer .report-container { padding-inline: 16px; }
|
|
385
|
+
.report-heading { align-items: flex-start; flex-direction: column; gap: 12px; }
|
|
386
|
+
.generation { text-align: left; }
|
|
387
|
+
.generation time { display: inline; margin-left: 8px; }
|
|
388
|
+
.metric-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 24px; }
|
|
389
|
+
.metric-grid > div { padding: 0 12px; }
|
|
390
|
+
.metric-grid > div:nth-child(odd) { padding-left: 0; border-left: 0; }
|
|
391
|
+
.metric-grid dd { font-size: 27px; }
|
|
392
|
+
.overview-grid { grid-template-columns: 1fr; gap: 28px; }
|
|
393
|
+
.section-heading { align-items: flex-start; flex-wrap: wrap; gap: 12px; }
|
|
394
|
+
.table-actions { flex-wrap: wrap; }
|
|
395
|
+
.column-search { flex: 1; min-width: 170px; }
|
|
396
|
+
.settings-grid { grid-template-columns: 1fr; }
|
|
397
|
+
.report-section { padding-block: 26px; }
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
@media (prefers-reduced-motion: reduce) {
|
|
401
|
+
.report-details > summary::before { transition: none; }
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
@media print {
|
|
405
|
+
:root { color-scheme: light; --canvas: #ffffff; --surface: #ffffff; --surface-soft: #f4f5f9; --text: #1a1f36; --heading: #050032; --muted: #687086; --border: #d9dce6; }
|
|
406
|
+
.topbar, .theme-toggle, .column-search, .table-reset, .dtcc { display: none; }
|
|
407
|
+
.report-container { width: 100%; }
|
|
408
|
+
.table-responsive { overflow: visible; }
|
|
409
|
+
.sample-scroll { overflow: auto; }
|
|
410
|
+
.report-heading, .metric-grid { break-inside: avoid; }
|
|
411
|
+
}
|