@auditcore/ui-core 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.
- package/LICENSE +21 -0
- package/README.md +1326 -0
- package/dist/account/camera.d.ts +8 -0
- package/dist/account/controller.d.ts +30 -0
- package/dist/account/index.d.ts +7 -0
- package/dist/account/messages.d.ts +2 -0
- package/dist/account/port.d.ts +10 -0
- package/dist/account/presentation.d.ts +9 -0
- package/dist/account/types.d.ts +42 -0
- package/dist/account/view.d.ts +12 -0
- package/dist/attributes/controller.d.ts +26 -0
- package/dist/attributes/index.d.ts +5 -0
- package/dist/attributes/messages.d.ts +3 -0
- package/dist/attributes/port.d.ts +4 -0
- package/dist/attributes/types.d.ts +60 -0
- package/dist/attributes/view.d.ts +49 -0
- package/dist/base/icons.d.ts +38 -0
- package/dist/base/index.d.ts +3 -0
- package/dist/base/types.d.ts +3 -0
- package/dist/batchchecks/controller.d.ts +60 -0
- package/dist/batchchecks/index.d.ts +7 -0
- package/dist/batchchecks/messages.d.ts +3 -0
- package/dist/batchchecks/model.d.ts +38 -0
- package/dist/batchchecks/port.d.ts +6 -0
- package/dist/batchchecks/rest-port.d.ts +4 -0
- package/dist/batchchecks/types.d.ts +121 -0
- package/dist/batchchecks/view.d.ts +58 -0
- package/dist/benford/chart.d.ts +49 -0
- package/dist/benford/controller.d.ts +48 -0
- package/dist/benford/index.d.ts +7 -0
- package/dist/benford/messages.d.ts +3 -0
- package/dist/benford/model.d.ts +32 -0
- package/dist/benford/rest-port.d.ts +4 -0
- package/dist/benford/types.d.ts +144 -0
- package/dist/benford/view.d.ts +45 -0
- package/dist/dataprotection/dsfa.d.ts +55 -0
- package/dist/dataprotection/dsfaView.d.ts +45 -0
- package/dist/dataprotection/exporters.d.ts +33 -0
- package/dist/dataprotection/index.d.ts +10 -0
- package/dist/dataprotection/messages.d.ts +5 -0
- package/dist/dataprotection/registerView.d.ts +47 -0
- package/dist/dataprotection/requests.d.ts +16 -0
- package/dist/dataprotection/rest-port.d.ts +4 -0
- package/dist/dataprotection/types.d.ts +291 -0
- package/dist/dataprotection/vvt.d.ts +69 -0
- package/dist/dbkanban/controller.d.ts +54 -0
- package/dist/dbkanban/index.d.ts +3 -0
- package/dist/dbkanban/messages.d.ts +5 -0
- package/dist/dbkanban/view.d.ts +39 -0
- package/dist/documents/controller.d.ts +63 -0
- package/dist/documents/form.d.ts +52 -0
- package/dist/documents/importing.d.ts +12 -0
- package/dist/documents/index.d.ts +6 -0
- package/dist/documents/list.d.ts +21 -0
- package/dist/documents/messages.d.ts +8 -0
- package/dist/documents/view.d.ts +36 -0
- package/dist/download.d.ts +14 -0
- package/dist/extraction/controller.d.ts +34 -0
- package/dist/extraction/index.d.ts +5 -0
- package/dist/extraction/messages.d.ts +3 -0
- package/dist/extraction/rest-port.d.ts +4 -0
- package/dist/extraction/types.d.ts +115 -0
- package/dist/extraction/view.d.ts +35 -0
- package/dist/extrapolation/controller-subsample.d.ts +20 -0
- package/dist/extrapolation/controller.d.ts +72 -0
- package/dist/extrapolation/index.d.ts +9 -0
- package/dist/extrapolation/messages.d.ts +3 -0
- package/dist/extrapolation/model-design.d.ts +28 -0
- package/dist/extrapolation/model-subsample.d.ts +40 -0
- package/dist/extrapolation/model.d.ts +92 -0
- package/dist/extrapolation/rest-port.d.ts +4 -0
- package/dist/extrapolation/types.d.ts +255 -0
- package/dist/extrapolation/view-details.d.ts +46 -0
- package/dist/extrapolation/view.d.ts +50 -0
- package/dist/focus.d.ts +10 -0
- package/dist/geo/controller.d.ts +87 -0
- package/dist/geo/index.d.ts +6 -0
- package/dist/geo/mapView.d.ts +30 -0
- package/dist/geo/messages.d.ts +3 -0
- package/dist/geo/model.d.ts +43 -0
- package/dist/geo/rest-port.d.ts +12 -0
- package/dist/geo/types.d.ts +195 -0
- package/dist/i18n.d.ts +29 -0
- package/dist/identifiers/controller.d.ts +63 -0
- package/dist/identifiers/index.d.ts +5 -0
- package/dist/identifiers/messages.d.ts +3 -0
- package/dist/identifiers/model.d.ts +87 -0
- package/dist/identifiers/rest-port.d.ts +4 -0
- package/dist/identifiers/types.d.ts +101 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +10676 -0
- package/dist/index.js.map +1 -0
- package/dist/kanban/index.d.ts +2 -0
- package/dist/kanban/messages.d.ts +6 -0
- package/dist/messages.d.ts +2 -0
- package/dist/reporting/controller.d.ts +46 -0
- package/dist/reporting/index.d.ts +5 -0
- package/dist/reporting/messages.d.ts +3 -0
- package/dist/reporting/rest-port.d.ts +4 -0
- package/dist/reporting/types.d.ts +72 -0
- package/dist/reporting/view.d.ts +12 -0
- package/dist/reporttemplates/controller.d.ts +46 -0
- package/dist/reporttemplates/index.d.ts +5 -0
- package/dist/reporttemplates/messages.d.ts +3 -0
- package/dist/reporttemplates/port.d.ts +4 -0
- package/dist/reporttemplates/types.d.ts +92 -0
- package/dist/reporttemplates/view.d.ts +27 -0
- package/dist/risk/controller.d.ts +54 -0
- package/dist/risk/format.d.ts +13 -0
- package/dist/risk/index.d.ts +7 -0
- package/dist/risk/labels.d.ts +9 -0
- package/dist/risk/messages.d.ts +3 -0
- package/dist/risk/port.d.ts +41 -0
- package/dist/risk/state.d.ts +61 -0
- package/dist/risk/types.d.ts +107 -0
- package/dist/runner/aktionen.d.ts +16 -0
- package/dist/runner/controller.d.ts +72 -0
- package/dist/runner/eingabe.d.ts +5 -0
- package/dist/runner/index.d.ts +9 -0
- package/dist/runner/messages.d.ts +3 -0
- package/dist/runner/port.d.ts +20 -0
- package/dist/runner/profil.d.ts +39 -0
- package/dist/runner/types.d.ts +109 -0
- package/dist/runner/view-listen.d.ts +32 -0
- package/dist/runner/view.d.ts +95 -0
- package/dist/samplesize/controller.d.ts +33 -0
- package/dist/samplesize/index.d.ts +7 -0
- package/dist/samplesize/messages.d.ts +3 -0
- package/dist/samplesize/model.d.ts +40 -0
- package/dist/samplesize/port.d.ts +9 -0
- package/dist/samplesize/types.d.ts +92 -0
- package/dist/samplesize/view.d.ts +39 -0
- package/dist/sampling/controller.d.ts +62 -0
- package/dist/sampling/index.d.ts +6 -0
- package/dist/sampling/messages.d.ts +3 -0
- package/dist/sampling/model.d.ts +63 -0
- package/dist/sampling/rest-port.d.ts +4 -0
- package/dist/sampling/types.d.ts +136 -0
- package/dist/sampling/view.d.ts +45 -0
- package/dist/screening/controller.d.ts +52 -0
- package/dist/screening/index.d.ts +8 -0
- package/dist/screening/messages.d.ts +7 -0
- package/dist/screening/rest-port.d.ts +4 -0
- package/dist/screening/runForm.d.ts +22 -0
- package/dist/screening/types.d.ts +295 -0
- package/dist/screening/view.d.ts +84 -0
- package/dist/store.d.ts +30 -0
- package/dist/synopsis/controller.d.ts +68 -0
- package/dist/synopsis/exporters.d.ts +16 -0
- package/dist/synopsis/index.d.ts +8 -0
- package/dist/synopsis/messages.d.ts +3 -0
- package/dist/synopsis/navigation.d.ts +5 -0
- package/dist/synopsis/port.d.ts +38 -0
- package/dist/synopsis/types.d.ts +121 -0
- package/dist/synopsis/viewModel.d.ts +74 -0
- package/dist/synopsis/wordDiff.d.ts +31 -0
- package/dist/table/index.d.ts +6 -0
- package/dist/tabular/index.d.ts +2 -0
- package/dist/tabular/messages.d.ts +3 -0
- package/dist/tabular/tableImport.d.ts +40 -0
- package/package.json +55 -0
- package/styles/account.css +37 -0
- package/styles/attributes.css +18 -0
- package/styles/base.css +116 -0
- package/styles/batchchecks.css +26 -0
- package/styles/benford.css +39 -0
- package/styles/dataprotection.css +68 -0
- package/styles/dbkanban.css +38 -0
- package/styles/documents.css +51 -0
- package/styles/extraction.css +25 -0
- package/styles/extrapolation.css +34 -0
- package/styles/geo.css +54 -0
- package/styles/identifiers.css +38 -0
- package/styles/index.css +24 -0
- package/styles/kanban.css +115 -0
- package/styles/reporting.css +22 -0
- package/styles/reporttemplates.css +21 -0
- package/styles/risk.css +92 -0
- package/styles/runner.css +54 -0
- package/styles/samplesize.css +27 -0
- package/styles/sampling.css +31 -0
- package/styles/screening.css +86 -0
- package/styles/synopsis.css +83 -0
- package/styles/table.css +17 -0
- package/styles/tabular.css +11 -0
- package/styles/tokens.css +121 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { MessageParams } from '../i18n';
|
|
2
|
+
import { SynopsisMessageKey } from './messages';
|
|
3
|
+
import { CompareRow, ComparisonResult, ConsolidatedParagraph, DiffField, RowStatus } from './types';
|
|
4
|
+
import { DiffSegment } from './wordDiff';
|
|
5
|
+
export type SynopsisTranslate = (key: SynopsisMessageKey, params?: MessageParams) => string;
|
|
6
|
+
export interface FieldView {
|
|
7
|
+
field: Exclude<DiffField, 'text'>;
|
|
8
|
+
label: string;
|
|
9
|
+
old: DiffSegment[];
|
|
10
|
+
new: DiffSegment[];
|
|
11
|
+
inline: DiffSegment[];
|
|
12
|
+
}
|
|
13
|
+
export interface RowView {
|
|
14
|
+
id: string;
|
|
15
|
+
status: RowStatus | string;
|
|
16
|
+
statusLabel: string;
|
|
17
|
+
location: string;
|
|
18
|
+
old: DiffSegment[];
|
|
19
|
+
new: DiffSegment[];
|
|
20
|
+
inline: DiffSegment[];
|
|
21
|
+
fields: FieldView[];
|
|
22
|
+
reason: string;
|
|
23
|
+
reasonSource: string;
|
|
24
|
+
reasonVerified: boolean | null;
|
|
25
|
+
reasonWarning: string;
|
|
26
|
+
selected: boolean;
|
|
27
|
+
isChange: boolean;
|
|
28
|
+
/** Suchtext: Fundstelle, beide Fassungen, Nebenfelder und Grund, kleingeschrieben. */
|
|
29
|
+
haystack: string;
|
|
30
|
+
}
|
|
31
|
+
export interface SynopsisView {
|
|
32
|
+
title: string;
|
|
33
|
+
oldLabel: string;
|
|
34
|
+
newLabel: string;
|
|
35
|
+
reasonLabel: string;
|
|
36
|
+
isArticleLaw: boolean;
|
|
37
|
+
countsText: string;
|
|
38
|
+
detectedText: string;
|
|
39
|
+
filesText: string;
|
|
40
|
+
hashesText: string;
|
|
41
|
+
createdAt: string;
|
|
42
|
+
notices: string[];
|
|
43
|
+
recognisedCommands: number;
|
|
44
|
+
openCommands: string[];
|
|
45
|
+
consolidated: readonly ConsolidatedParagraph[];
|
|
46
|
+
rows: RowView[];
|
|
47
|
+
}
|
|
48
|
+
export interface ViewOptions {
|
|
49
|
+
title?: string;
|
|
50
|
+
oldLabel?: string;
|
|
51
|
+
newLabel?: string;
|
|
52
|
+
/** Wortweise Hervorhebung; ohne sie bleiben Texte unmarkiert. */
|
|
53
|
+
highlight?: boolean;
|
|
54
|
+
}
|
|
55
|
+
export declare function statusLabel(status: string, t: SynopsisTranslate): string;
|
|
56
|
+
export declare function buildRowView(row: CompareRow, highlight: boolean, t: SynopsisTranslate): RowView;
|
|
57
|
+
export declare function buildSynopsisView(result: ComparisonResult, t: SynopsisTranslate, options?: ViewOptions): SynopsisView;
|
|
58
|
+
export interface SynopsisRowFilter {
|
|
59
|
+
statuses: readonly string[];
|
|
60
|
+
query: string;
|
|
61
|
+
onlySelected: boolean;
|
|
62
|
+
}
|
|
63
|
+
export declare const DEFAULT_SYNOPSIS_FILTER: SynopsisRowFilter;
|
|
64
|
+
export declare function filterRows(rows: readonly RowView[], filter: SynopsisRowFilter): RowView[];
|
|
65
|
+
/** Kennungen der Änderungszeilen in Anzeigereihenfolge (Ziel der Navigation). */
|
|
66
|
+
export declare function changeIds(rows: readonly RowView[]): string[];
|
|
67
|
+
/**
|
|
68
|
+
* Nächste bzw. vorige Änderung; ohne aktuelle Position beginnt `+1` bei der
|
|
69
|
+
* ersten und `-1` bei der letzten. Am Rand bleibt die Position stehen.
|
|
70
|
+
*/
|
|
71
|
+
export declare function stepChange(ids: readonly string[], current: string | null, direction: 1 | -1): string | null;
|
|
72
|
+
export declare function positionText(ids: readonly string[], current: string | null, t: SynopsisTranslate): string;
|
|
73
|
+
/** Zeilen mit lokalen Änderungen (Auswahl, Grund) zusammenführen. */
|
|
74
|
+
export declare function applyRowOverrides(rows: readonly CompareRow[], overrides: ReadonlyMap<string, Partial<CompareRow>>): CompareRow[];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wortdifferenz für die Anzeige, ohne Vue. Bevorzugt die vom Server gelieferte
|
|
3
|
+
* `difflib.ndiff`-Folge (`" "` gleich, `"- "` entfallen, `"+ "` neu,
|
|
4
|
+
* `"? "` Hinweis); fehlt sie (Gesetzessynopse), rechnet eine längste gemeinsame
|
|
5
|
+
* Teilfolge über Wörter nach – wie `regulierung/frontend/src/lib/textDiff.ts`
|
|
6
|
+
* mit einer Obergrenze, damit die Oberfläche nicht einfriert.
|
|
7
|
+
*/
|
|
8
|
+
export type SegmentKind = 'same' | 'removed' | 'added';
|
|
9
|
+
export type DiffSide = 'old' | 'new' | 'inline';
|
|
10
|
+
export interface DiffSegment {
|
|
11
|
+
text: string;
|
|
12
|
+
kind: SegmentKind;
|
|
13
|
+
}
|
|
14
|
+
/** Oberhalb dieser Wortzahl je Seite wird nicht wortweise verglichen. */
|
|
15
|
+
export declare const WORD_LIMIT = 1200;
|
|
16
|
+
type Operation = readonly [SegmentKind, string];
|
|
17
|
+
/** ndiff-Zeilen in Operationen übersetzen; Hinweiszeilen (`? `) entfallen. */
|
|
18
|
+
export declare function ndiffOperations(lines: readonly string[]): Operation[];
|
|
19
|
+
/** Längste gemeinsame Teilfolge über Wörter; `null` oberhalb von {@link WORD_LIMIT}. */
|
|
20
|
+
export declare function lcsOperations(oldText: string, newText: string): Operation[] | null;
|
|
21
|
+
/**
|
|
22
|
+
* Segmente einer Seite. `ndiff` hat Vorrang; ohne sie wird nachgerechnet.
|
|
23
|
+
* Ist keine Wortdifferenz möglich, bleibt der Text unmarkiert (seitenweise)
|
|
24
|
+
* bzw. erscheint inline als Streichung plus Einfügung.
|
|
25
|
+
*/
|
|
26
|
+
export declare function diffSegments(oldText: string, newText: string, side: DiffSide, ndiff?: readonly string[]): DiffSegment[];
|
|
27
|
+
/** Ganze Texte als Streichung und Einfügung (neue/entfallene Stellen, Rückfall). */
|
|
28
|
+
export declare function wholeSegments(oldText: string, newText: string): DiffSegment[];
|
|
29
|
+
export declare function plainSegments(text: string): DiffSegment[];
|
|
30
|
+
export declare function segmentsText(segments: readonly DiffSegment[]): string;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SortState, TableColumn, TableRow } from '@auditcore/common';
|
|
2
|
+
export declare function cellText(column: TableColumn, row: TableRow): string;
|
|
3
|
+
export declare function sortIcon(sort: SortState | null, key: string): 'sort' | 'sort-asc' | 'sort-desc';
|
|
4
|
+
/** Schlüssel einer Zeile aus `rowKey`, sonst Position. */
|
|
5
|
+
export declare function rowKeyOf(row: TableRow, rowKey: string, index: number): string;
|
|
6
|
+
export declare function cellAlignClass(column: TableColumn): string;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Texte des Datei-Imports (Stichprobe, Benford). */
|
|
2
|
+
export declare const tabularMessages: import('..').Catalogs<"apply" | "header" | "summary" | "decimal" | "none" | "tab" | "rejected" | "file" | "valueColumn" | "idColumn" | "stratumColumn" | "decimalComma" | "decimalDot" | "column">;
|
|
3
|
+
export type TabularMessageKey = keyof typeof tabularMessages.de;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { DecimalSeparator, ParsedTable } from '@auditcore/common';
|
|
2
|
+
/** Übernommene Spalten einer Datei. */
|
|
3
|
+
export interface ImportedColumns {
|
|
4
|
+
filename: string;
|
|
5
|
+
values: (number | null)[];
|
|
6
|
+
/** Kennungen und Schichten der übernommenen Zeilen (gleiche Länge wie `values`). */
|
|
7
|
+
ids: string[] | null;
|
|
8
|
+
strata: string[] | null;
|
|
9
|
+
rejected: number[];
|
|
10
|
+
}
|
|
11
|
+
export interface TableImportData {
|
|
12
|
+
filename: string;
|
|
13
|
+
text: string;
|
|
14
|
+
table: ParsedTable | null;
|
|
15
|
+
hasHeader: boolean;
|
|
16
|
+
valueColumn: number;
|
|
17
|
+
idColumn: number | null;
|
|
18
|
+
stratumColumn: number | null;
|
|
19
|
+
decimal: DecimalSeparator;
|
|
20
|
+
}
|
|
21
|
+
/** Vorschau der übernommenen Werte (reine Funktion). */
|
|
22
|
+
export declare function importPreview(state: TableImportData): ImportedColumns | null;
|
|
23
|
+
/** Anzeige des Trennzeichens („Tabulator“ für `\t`). */
|
|
24
|
+
export declare function importDelimiterText(table: ParsedTable | null, tab: string): string;
|
|
25
|
+
/** Die ersten zehn unlesbaren Zeilen als Liste. */
|
|
26
|
+
export declare function importRejectedLines(preview: ImportedColumns | null): string;
|
|
27
|
+
/** Optionale Spalte aus einem Auswahlwert (`''` = keine). */
|
|
28
|
+
export declare function importOptionalColumn(value: string): number | null;
|
|
29
|
+
export declare function createTableImportController(): {
|
|
30
|
+
store: import('..').Store<TableImportData>;
|
|
31
|
+
load: (filename: string, text: string) => void;
|
|
32
|
+
reparse: () => void;
|
|
33
|
+
read: (file: File) => Promise<void>;
|
|
34
|
+
setHasHeader: (hasHeader: boolean) => void;
|
|
35
|
+
setValueColumn: (valueColumn: number) => void;
|
|
36
|
+
setIdColumn: (idColumn: number | null) => void;
|
|
37
|
+
setStratumColumn: (stratumColumn: number | null) => void;
|
|
38
|
+
setDecimal: (decimal: DecimalSeparator) => void;
|
|
39
|
+
};
|
|
40
|
+
export type TableImportController = ReturnType<typeof createTableImportController>;
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@auditcore/ui-core",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Framework-freier Kern der FlowAudit-Oberflächen: Texte, REST-Verträge, View-Modelle, Zustandsautomaten und Stile für Vue und React",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/janpow77/auditcore.git",
|
|
9
|
+
"directory": "packages-js/ui-core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/janpow77/auditcore/tree/main/packages-js/ui-core#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/janpow77/auditcore/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"sideEffects": [
|
|
17
|
+
"**/*.css"
|
|
18
|
+
],
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"module": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"import": "./dist/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./style.css": "./styles/index.css",
|
|
28
|
+
"./styles/*": "./styles/*",
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"styles",
|
|
34
|
+
"LICENSE",
|
|
35
|
+
"README.md"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "vite build",
|
|
39
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
40
|
+
"test": "vitest run"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@auditcore/common": "0.1.1",
|
|
44
|
+
"@auditcore/kanban-core": "0.2.1",
|
|
45
|
+
"leaflet": "^1.9.4"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@testing-library/dom": "^10.4.2",
|
|
49
|
+
"@types/leaflet": "^1.9.22"
|
|
50
|
+
},
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public",
|
|
53
|
+
"registry": "https://registry.npmjs.org/"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* Gemeinsame Oberfläche für Vue, React und Custom Element. */
|
|
2
|
+
.fa-account { --account-border: var(--fa-color-border, #dbe3e8); --account-ink: var(--fa-color-text, #182f3b); color: var(--account-ink); font-family: var(--fa-font-sans, system-ui, sans-serif); max-width: 1200px; margin: auto; padding: clamp(16px, 3vw, 36px); background: var(--fa-color-bg, #f5f8fa); border-radius: 20px; }
|
|
3
|
+
.fa-account *, .fa-account *::before, .fa-account *::after { box-sizing: border-box; }
|
|
4
|
+
.fa-account__header { margin-bottom: 28px; }
|
|
5
|
+
.fa-account h2 { font-size: clamp(24px, 3vw, 32px); margin: 8px 0; letter-spacing: -.035em; }
|
|
6
|
+
.fa-account h3 { font-size: 24px; margin: 0 0 8px; }
|
|
7
|
+
.fa-account__eyebrow { text-transform: uppercase; letter-spacing: .15em; font-size: 11px; font-weight: 750; color: var(--fa-color-accent, #126875); }
|
|
8
|
+
.fa-account__layout { display: grid; grid-template-columns: minmax(180px, 230px) minmax(0, 1fr); gap: 28px; align-items: start; }
|
|
9
|
+
.fa-account__list { list-style: none; margin: 0; padding: 0; }
|
|
10
|
+
.fa-account__group { display: block; margin: 22px 12px 8px; font-weight: 650; color: var(--fa-color-text-muted, #526775); }
|
|
11
|
+
.fa-account button { font: inherit; cursor: pointer; border: 1px solid var(--account-border); border-radius: 8px; background: var(--fa-color-surface, #fff); color: inherit; padding: 10px 14px; min-height: 44px; }
|
|
12
|
+
.fa-account button:disabled { cursor: default; opacity: .55; }
|
|
13
|
+
.fa-account button:focus-visible, .fa-account input:focus-visible, .fa-account textarea:focus-visible, .fa-account select:focus-visible { outline: 3px solid var(--fa-color-accent, #126875); outline-offset: 3px; }
|
|
14
|
+
.fa-account button.fa-account__item { width: 100%; text-align: left; border-color: transparent; background: transparent; margin: 2px 0; }
|
|
15
|
+
.fa-account button.fa-account__item--selected { color: var(--fa-color-accent, #126875); background: var(--fa-color-surface, #fff); border-color: var(--account-border); font-weight: 650; }
|
|
16
|
+
.fa-account__card { min-width: 0; padding: clamp(18px, 3vw, 32px); border: 1px solid var(--account-border); border-radius: 16px; background: var(--fa-color-surface, #fff); box-shadow: 0 8px 30px #12334406; margin: 0; }
|
|
17
|
+
.fa-account__muted, .fa-account__field small { color: var(--fa-color-text-muted, #526775); line-height: 1.6; }
|
|
18
|
+
.fa-account__failure { color: var(--fa-color-danger, #a51d2d); padding: 14px; border: 1px solid currentColor; border-radius: 8px; }
|
|
19
|
+
.fa-account__fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 22px; padding: 22px 0; margin: 0; border: 0; }
|
|
20
|
+
.fa-account__field { display: flex; flex-direction: column; gap: 8px; font-size: 14px; font-weight: 550; min-width: 0; }
|
|
21
|
+
.fa-account__field input, .fa-account__field select, .fa-account__field textarea { width: 100%; min-width: 0; border: 1px solid var(--account-border); border-radius: 8px; padding: 11px 12px; font: inherit; color: inherit; background: var(--fa-color-surface, #fff); min-height: 44px; }
|
|
22
|
+
.fa-account__field input[type=color] { padding: 4px; }
|
|
23
|
+
.fa-account__field input[readonly] { background: var(--fa-color-bg, #f5f8fa); }
|
|
24
|
+
.fa-account__wide { grid-column: 1 / -1; }
|
|
25
|
+
.fa-account__actions { display: flex; justify-content: flex-end; gap: 12px; border-top: 1px solid var(--account-border); padding-top: 22px; flex-wrap: wrap; }
|
|
26
|
+
.fa-account button.fa-account__primary { background: var(--fa-color-accent, #126875); color: var(--fa-color-accent-contrast, #fff); border-color: transparent; }
|
|
27
|
+
.fa-account__preview, .fa-account__welcome { padding: 24px; margin-bottom: 22px; border-radius: 12px; overflow-wrap: anywhere; }
|
|
28
|
+
.fa-account__welcome { background: var(--fa-color-bg, #f5f8fa); white-space: pre-wrap; }
|
|
29
|
+
.fa-account__image { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
|
|
30
|
+
.fa-account__image img, .fa-account__avatar { border-radius: 24px; object-fit: contain; border: 1px solid var(--account-border); }
|
|
31
|
+
.fa-account__avatar { width: 96px; height: 96px; display: grid; place-content: center; font-size: 40px; background: var(--fa-color-bg, #f5f8fa); }
|
|
32
|
+
.fa-account__camera { width: 100%; }
|
|
33
|
+
.fa-account__camera video { display: block; max-width: 100%; width: 320px; margin-bottom: 12px; border-radius: 12px; }
|
|
34
|
+
@media (max-width: 720px) { .fa-account__layout { grid-template-columns: 1fr; } .fa-account__fields { grid-template-columns: 1fr; } .fa-account__actions button { flex: 1; } }
|
|
35
|
+
.fa-account__crop { display: grid; width: 100%; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
|
|
36
|
+
.fa-account__crop button { grid-column: 1 / -1; }
|
|
37
|
+
.fa-account__field select[multiple] { min-height: 150px; }
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* Merkmalsstichprobe – AttributeSampling (Vue) und FlowauditAttributeSampling (React). Farben nur aus --fa-*-Variablen. */
|
|
2
|
+
.fa-attributes { display: flex; flex-direction: column; gap: var(--fa-space-3); padding: var(--fa-space-4); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius-lg); background: var(--fa-color-surface); font: var(--fa-font-size-sm) / var(--fa-line-height) var(--fa-font-sans); color: var(--fa-color-text); }
|
|
3
|
+
.fa-attributes__heading { margin: 0; font-size: var(--fa-font-size-md); font-weight: 600; }
|
|
4
|
+
.fa-attributes__form { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: var(--fa-space-3); align-items: start; }
|
|
5
|
+
.fa-attributes__field { display: flex; flex-direction: column; gap: var(--fa-space-1); }
|
|
6
|
+
.fa-attributes__label { font-size: var(--fa-font-size-xs); font-weight: 600; color: var(--fa-color-text-muted); }
|
|
7
|
+
.fa-attributes__input, .fa-attributes__select { min-height: 2.25rem; width: 100%; box-sizing: border-box; padding: 0 var(--fa-space-2); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius); background: var(--fa-color-surface); color: var(--fa-color-text); font: inherit; }
|
|
8
|
+
.fa-attributes__input { text-align: end; font-variant-numeric: tabular-nums; }
|
|
9
|
+
.fa-attributes__input:focus-visible, .fa-attributes__select:focus-visible { outline: none; border-color: var(--fa-color-accent); box-shadow: var(--fa-focus-ring); }
|
|
10
|
+
.fa-attributes__input[aria-invalid="true"] { border-color: var(--fa-color-danger); }
|
|
11
|
+
.fa-attributes__error { color: var(--fa-color-danger); font-size: var(--fa-font-size-xs); }
|
|
12
|
+
.fa-attributes__actions { display: flex; flex-wrap: wrap; gap: var(--fa-space-2); align-items: center; }
|
|
13
|
+
.fa-attributes__metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); gap: var(--fa-space-2); margin: 0; }
|
|
14
|
+
.fa-attributes__metric { display: flex; flex-direction: column; gap: var(--fa-space-1); padding: var(--fa-space-2); border-radius: var(--fa-radius); background: var(--fa-color-surface-sunken); }
|
|
15
|
+
.fa-attributes__metric dt { font-size: var(--fa-font-size-xs); color: var(--fa-color-text-muted); }
|
|
16
|
+
.fa-attributes__metric dd { margin: 0; font-weight: 600; font-variant-numeric: tabular-nums; }
|
|
17
|
+
.fa-attributes__muted { margin: 0; color: var(--fa-color-text-muted); }
|
|
18
|
+
.fa-attributes__failure { margin: 0; padding: var(--fa-space-2) var(--fa-space-3); border-radius: var(--fa-radius); background: var(--fa-color-danger-soft); color: var(--fa-color-danger); }
|
package/styles/base.css
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/* Basiskomponenten (Symbol, Kennzeichen, Schaltfläche, Eingabefeld, Dialog) – gemeinsam für Vue und React. */
|
|
2
|
+
|
|
3
|
+
/* FaIcon */
|
|
4
|
+
.fa-icon {
|
|
5
|
+
flex: none;
|
|
6
|
+
stroke-width: var(--fa-icon-stroke, 1.75);
|
|
7
|
+
vertical-align: middle;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* FaBadge */
|
|
11
|
+
.fa-badge {
|
|
12
|
+
display: inline-flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
gap: var(--fa-space-1);
|
|
15
|
+
padding: 0.125rem var(--fa-space-2);
|
|
16
|
+
border-radius: 999px;
|
|
17
|
+
font: 600 var(--fa-font-size-xs) / 1.3 var(--fa-font-sans);
|
|
18
|
+
background: var(--fa-color-surface-sunken);
|
|
19
|
+
color: var(--fa-color-text-muted);
|
|
20
|
+
}
|
|
21
|
+
.fa-badge--accent { background: var(--fa-color-accent-soft); color: var(--fa-color-accent); }
|
|
22
|
+
.fa-badge--success { background: var(--fa-color-success-soft); color: var(--fa-color-success); }
|
|
23
|
+
.fa-badge--warning { background: var(--fa-color-warning-soft); color: var(--fa-color-warning); }
|
|
24
|
+
.fa-badge--danger { background: var(--fa-color-danger-soft); color: var(--fa-color-danger); }
|
|
25
|
+
|
|
26
|
+
/* FaButton */
|
|
27
|
+
.fa-button {
|
|
28
|
+
display: inline-flex;
|
|
29
|
+
align-items: center;
|
|
30
|
+
justify-content: center;
|
|
31
|
+
gap: var(--fa-space-2);
|
|
32
|
+
min-height: 2.25rem;
|
|
33
|
+
padding: 0 var(--fa-space-4);
|
|
34
|
+
border: 1px solid transparent;
|
|
35
|
+
border-radius: var(--fa-radius);
|
|
36
|
+
font: 500 var(--fa-font-size-sm) / 1 var(--fa-font-sans);
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
transition: background var(--fa-transition), border-color var(--fa-transition), color var(--fa-transition);
|
|
39
|
+
}
|
|
40
|
+
.fa-button:focus-visible { outline: none; box-shadow: var(--fa-focus-ring); }
|
|
41
|
+
.fa-button:disabled { cursor: not-allowed; opacity: 0.55; }
|
|
42
|
+
.fa-button--sm { min-height: 1.75rem; padding: 0 var(--fa-space-3); font-size: var(--fa-font-size-xs); }
|
|
43
|
+
.fa-button--icon-only { padding: 0; width: 2.25rem; }
|
|
44
|
+
.fa-button--sm.fa-button--icon-only { width: 1.75rem; }
|
|
45
|
+
.fa-button--primary { background: var(--fa-color-accent); color: var(--fa-color-accent-contrast); }
|
|
46
|
+
.fa-button--primary:hover:not(:disabled) { background: var(--fa-color-accent-hover); }
|
|
47
|
+
.fa-button--secondary { background: var(--fa-color-surface); border-color: var(--fa-color-border); color: var(--fa-color-text); }
|
|
48
|
+
.fa-button--secondary:hover:not(:disabled) { border-color: var(--fa-color-border-strong); }
|
|
49
|
+
.fa-button--ghost { background: transparent; color: var(--fa-color-text-muted); }
|
|
50
|
+
.fa-button--ghost:hover:not(:disabled), .fa-button--ghost[aria-pressed='true'] { background: var(--fa-color-surface-sunken); color: var(--fa-color-text); }
|
|
51
|
+
.fa-button--danger { background: var(--fa-color-danger); color: #fff; }
|
|
52
|
+
.fa-button--loading { cursor: progress; }
|
|
53
|
+
|
|
54
|
+
/* FaTextField */
|
|
55
|
+
.fa-field { display: flex; flex-direction: column; gap: var(--fa-space-1); font-family: var(--fa-font-sans); }
|
|
56
|
+
.fa-field__label { font-size: var(--fa-font-size-xs); font-weight: 600; color: var(--fa-color-text-muted); }
|
|
57
|
+
.fa-field__input {
|
|
58
|
+
min-height: 2.25rem;
|
|
59
|
+
padding: 0 var(--fa-space-3);
|
|
60
|
+
border: 1px solid var(--fa-color-border);
|
|
61
|
+
border-radius: var(--fa-radius);
|
|
62
|
+
background: var(--fa-color-surface);
|
|
63
|
+
color: var(--fa-color-text);
|
|
64
|
+
font: var(--fa-font-size-sm) var(--fa-font-sans);
|
|
65
|
+
}
|
|
66
|
+
.fa-field__input:focus-visible { outline: none; border-color: var(--fa-color-accent); box-shadow: var(--fa-focus-ring); }
|
|
67
|
+
.fa-field__note { margin: 0; font-size: var(--fa-font-size-xs); color: var(--fa-color-text-muted); }
|
|
68
|
+
.fa-field--error .fa-field__input { border-color: var(--fa-color-danger); }
|
|
69
|
+
.fa-field--error .fa-field__note { color: var(--fa-color-danger); }
|
|
70
|
+
|
|
71
|
+
/* FaDialog */
|
|
72
|
+
.fa-dialog {
|
|
73
|
+
position: fixed;
|
|
74
|
+
inset: 0;
|
|
75
|
+
z-index: 1000;
|
|
76
|
+
display: flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
justify-content: center;
|
|
79
|
+
padding: var(--fa-space-4);
|
|
80
|
+
background: var(--fa-color-overlay);
|
|
81
|
+
font-family: var(--fa-font-sans);
|
|
82
|
+
}
|
|
83
|
+
.fa-dialog--side { justify-content: flex-end; align-items: stretch; padding: 0; }
|
|
84
|
+
.fa-dialog__panel {
|
|
85
|
+
display: flex;
|
|
86
|
+
flex-direction: column;
|
|
87
|
+
width: 100%;
|
|
88
|
+
max-height: calc(100vh - 2 * var(--fa-space-4));
|
|
89
|
+
background: var(--fa-color-surface);
|
|
90
|
+
color: var(--fa-color-text);
|
|
91
|
+
border-radius: var(--fa-radius-lg);
|
|
92
|
+
box-shadow: var(--fa-shadow-lg);
|
|
93
|
+
outline: none;
|
|
94
|
+
}
|
|
95
|
+
.fa-dialog__panel--sm { max-width: 24rem; }
|
|
96
|
+
.fa-dialog__panel--md { max-width: 34rem; }
|
|
97
|
+
.fa-dialog__panel--lg { max-width: 52rem; }
|
|
98
|
+
.fa-dialog--side .fa-dialog__panel { max-height: none; height: 100%; border-radius: 0; max-width: 30rem; }
|
|
99
|
+
.fa-dialog__header {
|
|
100
|
+
display: flex;
|
|
101
|
+
align-items: flex-start;
|
|
102
|
+
justify-content: space-between;
|
|
103
|
+
gap: var(--fa-space-3);
|
|
104
|
+
padding: var(--fa-space-4) var(--fa-space-4) var(--fa-space-3) var(--fa-space-5);
|
|
105
|
+
border-bottom: 1px solid var(--fa-color-border);
|
|
106
|
+
}
|
|
107
|
+
.fa-dialog__title { margin: 0; font-size: var(--fa-font-size-lg); font-weight: 600; }
|
|
108
|
+
.fa-dialog__description { margin: var(--fa-space-1) 0 0; font-size: var(--fa-font-size-sm); color: var(--fa-color-text-muted); }
|
|
109
|
+
.fa-dialog__body { flex: 1; overflow-y: auto; padding: var(--fa-space-4) var(--fa-space-5); }
|
|
110
|
+
.fa-dialog__footer {
|
|
111
|
+
display: flex;
|
|
112
|
+
justify-content: flex-end;
|
|
113
|
+
gap: var(--fa-space-2);
|
|
114
|
+
padding: var(--fa-space-3) var(--fa-space-5);
|
|
115
|
+
border-top: 1px solid var(--fa-color-border);
|
|
116
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/* Bestandsprüfung – BatchChecks (Vue) und FlowauditBatchChecks (React). Farben nur aus --fa-*-Variablen. */
|
|
2
|
+
.fa-batchchecks { display: flex; flex-direction: column; gap: var(--fa-space-4); font: var(--fa-font-size-sm) / var(--fa-line-height) var(--fa-font-sans); color: var(--fa-color-text); }
|
|
3
|
+
.fa-batchchecks__card { display: flex; flex-direction: column; gap: var(--fa-space-3); padding: var(--fa-space-4); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius-lg); background: var(--fa-color-surface); box-shadow: var(--fa-shadow-sm); min-width: 0; }
|
|
4
|
+
.fa-batchchecks__heading { margin: 0; font-size: var(--fa-font-size-md); font-weight: 600; }
|
|
5
|
+
.fa-batchchecks__subheading { margin: 0; font-size: var(--fa-font-size-sm); font-weight: 600; }
|
|
6
|
+
.fa-batchchecks__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); gap: var(--fa-space-3); align-items: end; }
|
|
7
|
+
.fa-batchchecks__field { display: flex; flex-direction: column; gap: var(--fa-space-1); min-width: 0; }
|
|
8
|
+
.fa-batchchecks__label { font-size: var(--fa-font-size-xs); font-weight: 600; color: var(--fa-color-text-muted); }
|
|
9
|
+
.fa-batchchecks__input { min-height: 2.25rem; padding: 0 var(--fa-space-3); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius); background: var(--fa-color-surface); color: var(--fa-color-text); font: inherit; }
|
|
10
|
+
.fa-batchchecks__file { font: inherit; color: var(--fa-color-text); }
|
|
11
|
+
.fa-batchchecks__check { display: flex; gap: var(--fa-space-2); align-items: center; }
|
|
12
|
+
.fa-batchchecks__input:focus-visible, .fa-batchchecks__file:focus-visible, .fa-batchchecks__check input:focus-visible { outline: none; box-shadow: var(--fa-focus-ring); }
|
|
13
|
+
.fa-batchchecks__muted { margin: 0; color: var(--fa-color-text-muted); font-size: var(--fa-font-size-xs); }
|
|
14
|
+
.fa-batchchecks__error { margin: 0; font-size: var(--fa-font-size-xs); color: var(--fa-color-danger); }
|
|
15
|
+
.fa-batchchecks__failure { margin: 0; padding: var(--fa-space-2) var(--fa-space-3); border-radius: var(--fa-radius); background: var(--fa-color-danger-soft); color: var(--fa-color-danger); }
|
|
16
|
+
.fa-batchchecks__notice { margin: 0; padding: var(--fa-space-2) var(--fa-space-3); border-left: 3px solid var(--fa-color-accent); background: var(--fa-color-accent-soft); border-radius: var(--fa-radius-sm); }
|
|
17
|
+
.fa-batchchecks__summary { display: grid; grid-template-columns: max-content 1fr; gap: var(--fa-space-1) var(--fa-space-3); margin: 0; }
|
|
18
|
+
.fa-batchchecks__summary dt { font-weight: 600; color: var(--fa-color-text-muted); }
|
|
19
|
+
.fa-batchchecks__summary dd { margin: 0; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
|
|
20
|
+
.fa-batchchecks__actions { display: flex; flex-wrap: wrap; gap: var(--fa-space-2); }
|
|
21
|
+
.fa-batchchecks__scroll { overflow-x: auto; }
|
|
22
|
+
.fa-batchchecks__table { width: 100%; border-collapse: collapse; }
|
|
23
|
+
.fa-batchchecks__table th, .fa-batchchecks__table td { padding: var(--fa-space-2); border-bottom: 1px solid var(--fa-color-border); text-align: left; vertical-align: top; }
|
|
24
|
+
.fa-batchchecks__table thead th { font-size: var(--fa-font-size-xs); color: var(--fa-color-text-muted); font-weight: 600; }
|
|
25
|
+
.fa-batchchecks__table tbody th { font-weight: 600; white-space: nowrap; }
|
|
26
|
+
.fa-batchchecks__note { display: block; margin-top: var(--fa-space-1); color: var(--fa-color-text-muted); font-size: var(--fa-font-size-xs); }
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* Benford-Analyse – BenfordPanel (Vue) und FlowauditBenford (React). */
|
|
2
|
+
.fa-benford { display: flex; flex-direction: column; gap: var(--fa-space-4); font: var(--fa-font-size-sm) / var(--fa-line-height) var(--fa-font-sans); color: var(--fa-color-text); }
|
|
3
|
+
.fa-benford__inputs { display: grid; grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)); gap: var(--fa-space-4); align-items: start; }
|
|
4
|
+
.fa-benford__card { display: flex; flex-direction: column; gap: var(--fa-space-3); padding: var(--fa-space-4); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius-lg); background: var(--fa-color-surface); box-shadow: var(--fa-shadow-sm); min-width: 0; }
|
|
5
|
+
.fa-benford__heading { margin: 0; font-size: var(--fa-font-size-md); font-weight: 600; }
|
|
6
|
+
.fa-benford__field { display: flex; flex-direction: column; gap: var(--fa-space-1); }
|
|
7
|
+
.fa-benford__fieldset { display: flex; flex-direction: column; gap: var(--fa-space-1); margin: 0; padding: var(--fa-space-2) var(--fa-space-3); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius); }
|
|
8
|
+
.fa-benford__radio { display: inline-flex; gap: var(--fa-space-2); align-items: center; }
|
|
9
|
+
.fa-benford__label { font-size: var(--fa-font-size-xs); font-weight: 600; color: var(--fa-color-text-muted); }
|
|
10
|
+
.fa-benford__select { min-height: 2.25rem; padding: 0 var(--fa-space-3); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius); background: var(--fa-color-surface); color: var(--fa-color-text); font: inherit; }
|
|
11
|
+
.fa-benford__select:focus-visible, .fa-benford__radio input:focus-visible { outline: none; box-shadow: var(--fa-focus-ring); }
|
|
12
|
+
.fa-benford__muted, .fa-benford__source { margin: 0; color: var(--fa-color-text-muted); font-size: var(--fa-font-size-xs); }
|
|
13
|
+
.fa-benford__source p { margin: var(--fa-space-1) 0 0; overflow-wrap: anywhere; }
|
|
14
|
+
.fa-benford__error { margin: 0; font-size: var(--fa-font-size-xs); color: var(--fa-color-danger); }
|
|
15
|
+
.fa-benford__failure { margin: 0; padding: var(--fa-space-2) var(--fa-space-3); border-radius: var(--fa-radius); background: var(--fa-color-danger-soft); color: var(--fa-color-danger); }
|
|
16
|
+
.fa-benford__notice { margin: 0; padding: var(--fa-space-2) var(--fa-space-3); border-left: 3px solid var(--fa-color-accent); background: var(--fa-color-accent-soft); border-radius: var(--fa-radius-sm); }
|
|
17
|
+
.fa-benford__metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); gap: var(--fa-space-3); margin: 0; }
|
|
18
|
+
.fa-benford__metric { display: flex; flex-direction: column; gap: var(--fa-space-1); padding: var(--fa-space-3); border-radius: var(--fa-radius); background: var(--fa-color-surface-raised); border: 1px solid var(--fa-color-border); }
|
|
19
|
+
.fa-benford__metric dt { font-size: var(--fa-font-size-xs); font-weight: 600; color: var(--fa-color-text-muted); }
|
|
20
|
+
.fa-benford__metric dd { margin: 0; }
|
|
21
|
+
.fa-benford__value { font-size: var(--fa-font-size-lg); font-weight: 600; font-variant-numeric: tabular-nums; }
|
|
22
|
+
.fa-benford__detail { font-size: var(--fa-font-size-xs); color: var(--fa-color-text-muted); }
|
|
23
|
+
.fa-benford__figure { margin: 0; }
|
|
24
|
+
.fa-benford__chart { display: block; width: 100%; height: auto; font: var(--fa-font-size-xs) var(--fa-font-sans); }
|
|
25
|
+
.fa-benford__grid line { stroke: var(--fa-color-border); stroke-width: 1; }
|
|
26
|
+
.fa-benford__grid text, .fa-benford__axis text { fill: var(--fa-color-text-muted); }
|
|
27
|
+
.fa-benford__axis line { stroke: var(--fa-color-border-strong); }
|
|
28
|
+
.fa-benford__bar { fill: var(--fa-color-accent); opacity: 0.75; }
|
|
29
|
+
.fa-benford__bar--exceeds { fill: var(--fa-color-danger); opacity: 0.9; }
|
|
30
|
+
.fa-benford__expected { fill: none; stroke: var(--fa-color-text); stroke-width: 2; stroke-dasharray: 5 3; }
|
|
31
|
+
.fa-benford__expected-dot { fill: var(--fa-color-surface); stroke: var(--fa-color-text); stroke-width: 1.5; }
|
|
32
|
+
.fa-benford__legend { display: flex; flex-wrap: wrap; gap: var(--fa-space-4); margin-top: var(--fa-space-2); font-size: var(--fa-font-size-xs); color: var(--fa-color-text-muted); }
|
|
33
|
+
.fa-benford__legend span { display: inline-flex; align-items: center; gap: var(--fa-space-1); }
|
|
34
|
+
.fa-benford__swatch { display: inline-block; width: 0.9rem; height: 0.6rem; border-radius: 2px; background: var(--fa-color-accent); opacity: 0.75; }
|
|
35
|
+
.fa-benford__swatch--exceeds { background: var(--fa-color-danger); opacity: 0.9; }
|
|
36
|
+
.fa-benford__swatch--expected { height: 0; border-top: 2px dashed var(--fa-color-text); background: none; opacity: 1; }
|
|
37
|
+
.fa-benford__digits summary { cursor: pointer; font-weight: 600; margin-bottom: var(--fa-space-2); }
|
|
38
|
+
.fa-benford__flag { color: var(--fa-color-danger); font-weight: 600; }
|
|
39
|
+
@media (prefers-reduced-motion: no-preference) { .fa-benford__bar { transition: y var(--fa-transition), height var(--fa-transition); } }
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/* VVT und DSFA – nur --fa-*-Designtoken (hell/dunkel aus tokens.css). */
|
|
2
|
+
.fa-dataprotection {
|
|
3
|
+
font: var(--fa-font-size-sm) / var(--fa-line-height) var(--fa-font-sans);
|
|
4
|
+
color: var(--fa-color-text);
|
|
5
|
+
box-sizing: border-box;
|
|
6
|
+
}
|
|
7
|
+
.fa-dataprotection *, .fa-dataprotection *::before, .fa-dataprotection *::after { box-sizing: inherit; }
|
|
8
|
+
.fa-dataprotection h2 { font-size: var(--fa-font-size-lg); margin: 0; }
|
|
9
|
+
.fa-dataprotection h3 { font-size: var(--fa-font-size-md); margin: 0 0 var(--fa-space-2); }
|
|
10
|
+
.fa-dataprotection h4 { font-size: var(--fa-font-size-sm); margin: var(--fa-space-3) 0 var(--fa-space-2); color: var(--fa-color-text-muted); text-transform: uppercase; letter-spacing: 0.02em; }
|
|
11
|
+
.fa-dataprotection__header { display: flex; justify-content: space-between; align-items: baseline; gap: var(--fa-space-3); flex-wrap: wrap; margin-bottom: var(--fa-space-3); }
|
|
12
|
+
.fa-dataprotection__muted { color: var(--fa-color-text-muted); font-size: var(--fa-font-size-xs); }
|
|
13
|
+
.fa-dataprotection__panel { background: var(--fa-color-surface); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius); padding: var(--fa-space-3) var(--fa-space-4); margin-bottom: var(--fa-space-4); min-width: 0; box-shadow: var(--fa-shadow-sm); }
|
|
14
|
+
.fa-dataprotection__bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--fa-space-2) var(--fa-space-3); }
|
|
15
|
+
.fa-dataprotection__actions { display: flex; flex-wrap: wrap; gap: var(--fa-space-2); margin-left: auto; }
|
|
16
|
+
.fa-dataprotection__alert { border-radius: var(--fa-radius-sm); padding: var(--fa-space-2) var(--fa-space-3); margin: 0 0 var(--fa-space-3); background: var(--fa-color-danger-soft); color: var(--fa-color-danger); }
|
|
17
|
+
.fa-dataprotection__alert--warning { background: var(--fa-color-warning-soft); color: var(--fa-color-warning); }
|
|
18
|
+
.fa-dataprotection__alert--info { background: var(--fa-color-accent-soft); color: var(--fa-color-text); }
|
|
19
|
+
.fa-dataprotection__live { min-height: 1.2em; margin: 0 0 var(--fa-space-2); color: var(--fa-color-success); font-size: var(--fa-font-size-xs); }
|
|
20
|
+
.fa-dataprotection__table { width: 100%; border-collapse: collapse; }
|
|
21
|
+
.fa-dataprotection__table th, .fa-dataprotection__table td { text-align: left; padding: var(--fa-space-1) var(--fa-space-2); border-bottom: 1px solid var(--fa-color-border); vertical-align: top; overflow-wrap: anywhere; }
|
|
22
|
+
.fa-dataprotection__table th { color: var(--fa-color-text-muted); font-weight: 600; }
|
|
23
|
+
.fa-dataprotection__field { display: grid; gap: var(--fa-space-1); margin: 0 0 var(--fa-space-3); border: 0; padding: 0; min-width: 0; }
|
|
24
|
+
.fa-dataprotection__field > label, .fa-dataprotection__field > legend, .fa-dataprotection__label { font-weight: 600; font-size: var(--fa-font-size-sm); padding: 0; }
|
|
25
|
+
.fa-dataprotection__field input:not([type='radio']):not([type='checkbox']), .fa-dataprotection__field select, .fa-dataprotection__field textarea {
|
|
26
|
+
font: inherit; border: 1px solid var(--fa-color-border-strong); border-radius: var(--fa-radius-sm); padding: var(--fa-space-1) var(--fa-space-2); background: var(--fa-color-surface); color: var(--fa-color-text); width: 100%;
|
|
27
|
+
}
|
|
28
|
+
.fa-dataprotection__field textarea { min-height: 3.5rem; resize: vertical; }
|
|
29
|
+
.fa-dataprotection__field [aria-invalid='true'] { border-color: var(--fa-color-danger); }
|
|
30
|
+
.fa-dataprotection__field--required > label::after, .fa-dataprotection__field--required > legend::after { content: ' *'; color: var(--fa-color-danger); }
|
|
31
|
+
.fa-dataprotection__ref { color: var(--fa-color-text-muted); font-size: var(--fa-font-size-xs); }
|
|
32
|
+
.fa-dataprotection__note { margin: 0; font-size: var(--fa-font-size-xs); color: var(--fa-color-warning); }
|
|
33
|
+
.fa-dataprotection__note--blocking { color: var(--fa-color-danger); }
|
|
34
|
+
.fa-dataprotection__choices { display: flex; flex-wrap: wrap; gap: var(--fa-space-1) var(--fa-space-3); }
|
|
35
|
+
.fa-dataprotection__choice { display: inline-flex; align-items: center; gap: var(--fa-space-1); cursor: pointer; }
|
|
36
|
+
.fa-dataprotection button:focus-visible, .fa-dataprotection input:focus-visible, .fa-dataprotection select:focus-visible, .fa-dataprotection textarea:focus-visible, .fa-dataprotection summary:focus-visible { outline: none; box-shadow: var(--fa-focus-ring); }
|
|
37
|
+
.fa-dataprotection__chips { display: flex; flex-wrap: wrap; gap: var(--fa-space-1); list-style: none; margin: 0 0 var(--fa-space-2); padding: 0; }
|
|
38
|
+
.fa-dataprotection__chips li { display: inline-flex; align-items: center; gap: var(--fa-space-1); padding: 0 0 0 var(--fa-space-2); border-radius: 999px; background: var(--fa-color-surface-sunken); }
|
|
39
|
+
.fa-dataprotection__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 0 var(--fa-space-4); }
|
|
40
|
+
.fa-dataprotection__issues { margin: 0; padding-left: var(--fa-space-4); }
|
|
41
|
+
.fa-dataprotection__issues li { margin: 2px 0; }
|
|
42
|
+
.fa-dataprotection__issues .is-blocking { color: var(--fa-color-danger); }
|
|
43
|
+
.fa-dataprotection__dl { display: grid; grid-template-columns: minmax(140px, 32%) minmax(0, 1fr); gap: var(--fa-space-1) var(--fa-space-3); margin: 0; }
|
|
44
|
+
.fa-dataprotection__dl dt { font-weight: 600; color: var(--fa-color-text-muted); }
|
|
45
|
+
.fa-dataprotection__dl dd { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
46
|
+
.fa-vvt__layout { display: grid; grid-template-columns: minmax(240px, 320px) minmax(0, 1fr); gap: var(--fa-space-4); align-items: start; }
|
|
47
|
+
.fa-vvt__list { list-style: none; margin: 0 0 var(--fa-space-3); padding: 0; }
|
|
48
|
+
.fa-vvt__item { width: 100%; display: grid; gap: 2px; text-align: left; background: none; border: 0; border-left: 3px solid transparent; border-bottom: 1px solid var(--fa-color-border); padding: var(--fa-space-2); font: inherit; color: inherit; cursor: pointer; }
|
|
49
|
+
.fa-vvt__item:hover { background: var(--fa-color-surface-sunken); }
|
|
50
|
+
.fa-vvt__item[aria-current='true'] { border-left-color: var(--fa-color-accent); background: var(--fa-color-accent-soft); }
|
|
51
|
+
.fa-dsfa__tabs { display: flex; gap: var(--fa-space-1); border-bottom: 1px solid var(--fa-color-border); margin-bottom: var(--fa-space-3); flex-wrap: wrap; }
|
|
52
|
+
.fa-dsfa__tab { font: inherit; background: none; border: 0; border-bottom: 2px solid transparent; padding: var(--fa-space-2) var(--fa-space-3); color: var(--fa-color-text-muted); cursor: pointer; }
|
|
53
|
+
.fa-dsfa__tab[aria-selected='true'] { color: var(--fa-color-accent); border-bottom-color: var(--fa-color-accent); font-weight: 600; }
|
|
54
|
+
.fa-dsfa__question { border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius-sm); padding: var(--fa-space-2) var(--fa-space-3); margin: 0 0 var(--fa-space-2); }
|
|
55
|
+
.fa-dsfa__question legend { font-weight: 500; padding: 0 var(--fa-space-1); }
|
|
56
|
+
.fa-dsfa__question--yes { border-color: var(--fa-color-warning); }
|
|
57
|
+
.fa-dsfa__meta { display: flex; flex-wrap: wrap; gap: var(--fa-space-2); align-items: center; margin: var(--fa-space-1) 0; }
|
|
58
|
+
.fa-dsfa__scenario { border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius); padding: var(--fa-space-3); margin: 0 0 var(--fa-space-3); }
|
|
59
|
+
.fa-dsfa__measures { columns: 2 260px; margin: 0; padding: 0; list-style: none; }
|
|
60
|
+
.fa-dsfa__measures li { break-inside: avoid; margin: 2px 0; }
|
|
61
|
+
.fa-dsfa__result { display: flex; flex-wrap: wrap; gap: var(--fa-space-2); align-items: center; margin-top: var(--fa-space-2); }
|
|
62
|
+
@media (max-width: 860px) {
|
|
63
|
+
.fa-vvt__layout { grid-template-columns: minmax(0, 1fr); }
|
|
64
|
+
.fa-dataprotection__dl { grid-template-columns: minmax(0, 1fr); }
|
|
65
|
+
}
|
|
66
|
+
@media (prefers-reduced-motion: reduce) {
|
|
67
|
+
.fa-dataprotection * { transition: none !important; }
|
|
68
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* Datenbankansicht als Kanban (<flowaudit-db-kanban>) – gemeinsam für Vue und React. */
|
|
2
|
+
|
|
3
|
+
.fa-db-kanban { --fa-db-kanban-column-width: 16rem; display: flex; flex-direction: column; gap: var(--fa-space-3); color: var(--fa-color-text); font: var(--fa-font-size-md) / var(--fa-line-height) var(--fa-font-sans); }
|
|
4
|
+
.fa-db-kanban__toolbar { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--fa-space-3) var(--fa-space-4); }
|
|
5
|
+
.fa-db-kanban__title { margin: 0 auto 0 0; font-size: var(--fa-font-size-lg); line-height: 1.3; align-self: center; }
|
|
6
|
+
.fa-db-kanban__group { display: flex; flex-direction: column; gap: var(--fa-space-1); }
|
|
7
|
+
.fa-db-kanban__group label { font-size: var(--fa-font-size-xs); font-weight: 600; color: var(--fa-color-text-muted); }
|
|
8
|
+
.fa-db-kanban__group select { padding: var(--fa-space-2); border: 1px solid var(--fa-color-border-strong); border-radius: var(--fa-radius-sm); background: var(--fa-color-surface); color: var(--fa-color-text); font: inherit; font-size: var(--fa-font-size-sm); }
|
|
9
|
+
.fa-db-kanban__search { min-width: 14rem; }
|
|
10
|
+
.fa-db-kanban__readonly { padding: var(--fa-space-1) var(--fa-space-2); border-radius: var(--fa-radius-sm); background: var(--fa-color-warning-soft); font-size: var(--fa-font-size-xs); font-weight: 600; }
|
|
11
|
+
.fa-db-kanban__state { margin: 0; padding: var(--fa-space-4); border: 1px dashed var(--fa-color-border-strong); border-radius: var(--fa-radius); color: var(--fa-color-text-muted); text-align: center; }
|
|
12
|
+
.fa-db-kanban__state--error { border-style: solid; border-color: var(--fa-color-danger); background: var(--fa-color-danger-soft); color: var(--fa-color-danger); text-align: left; }
|
|
13
|
+
.fa-db-kanban__columns { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(var(--fa-db-kanban-column-width), 1fr); gap: var(--fa-space-3); overflow-x: auto; padding-bottom: var(--fa-space-2); align-items: start; }
|
|
14
|
+
.fa-db-kanban select:focus-visible, .fa-db-kanban button:focus-visible { outline: none; box-shadow: var(--fa-focus-ring); }
|
|
15
|
+
|
|
16
|
+
/* DbKanbanColumn */
|
|
17
|
+
.fa-db-kanban-column { display: flex; flex-direction: column; gap: var(--fa-space-2); min-height: 8rem; padding: var(--fa-space-2); border-radius: var(--fa-radius-lg); border-top: 3px solid var(--fa-color-accent); background: var(--fa-color-surface-sunken); transition: box-shadow var(--fa-transition); }
|
|
18
|
+
.fa-db-kanban-column--empty-value { border-top-color: var(--fa-color-border-strong); }
|
|
19
|
+
.fa-db-kanban-column--over { box-shadow: inset 0 0 0 2px var(--fa-color-accent); }
|
|
20
|
+
.fa-db-kanban-column__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--fa-space-2); padding: var(--fa-space-1) var(--fa-space-1) 0; }
|
|
21
|
+
.fa-db-kanban-column__name { margin: 0; font-size: var(--fa-font-size-sm); font-weight: 650; overflow-wrap: anywhere; }
|
|
22
|
+
.fa-db-kanban-column__count { flex: none; font-size: var(--fa-font-size-xs); font-weight: 600; color: var(--fa-color-text-muted); font-variant-numeric: tabular-nums; }
|
|
23
|
+
.fa-db-kanban-column__list { display: flex; flex-direction: column; gap: var(--fa-space-2); margin: 0; padding: 0; list-style: none; }
|
|
24
|
+
.fa-db-kanban-column__empty { margin: 0; padding: var(--fa-space-2); font-size: var(--fa-font-size-xs); color: var(--fa-color-text-muted); text-align: center; }
|
|
25
|
+
.fa-db-kanban-column__add { align-self: flex-start; }
|
|
26
|
+
|
|
27
|
+
/* DbKanbanCard */
|
|
28
|
+
.fa-db-kanban-card { padding: var(--fa-space-2) var(--fa-space-3); border: 1px solid var(--fa-color-border); border-radius: var(--fa-radius); background: var(--fa-color-surface); box-shadow: var(--fa-shadow-sm); cursor: grab; }
|
|
29
|
+
.fa-db-kanban-card[draggable='false'] { cursor: default; }
|
|
30
|
+
.fa-db-kanban-card:focus-visible { outline: none; box-shadow: var(--fa-focus-ring); }
|
|
31
|
+
.fa-db-kanban-card--dragging { opacity: 0.5; }
|
|
32
|
+
.fa-db-kanban-card__title { margin: 0; font-size: var(--fa-font-size-sm); font-weight: 600; overflow-wrap: anywhere; }
|
|
33
|
+
.fa-db-kanban-card__fields { display: flex; flex-direction: column; gap: 0.125rem; margin: var(--fa-space-1) 0 0; }
|
|
34
|
+
.fa-db-kanban-card__field { display: flex; flex-wrap: wrap; column-gap: var(--fa-space-2); font-size: var(--fa-font-size-xs); }
|
|
35
|
+
.fa-db-kanban-card__field dt { color: var(--fa-color-text-muted); }
|
|
36
|
+
.fa-db-kanban-card__field dt::after { content: ':'; }
|
|
37
|
+
.fa-db-kanban-card__field dd { margin: 0; min-width: 0; overflow-wrap: break-word; font-variant-numeric: tabular-nums; }
|
|
38
|
+
@media (prefers-reduced-motion: reduce) { .fa-db-kanban-column { transition: none; } }
|