27640fee35
Export des Projekts "DataMetric360 App Design" nach design/ - 80 Dateien: die beiden .dc.html-Entwurfsdateien, support.js, die verwendeten Icons, Logos, Typenschilder und Schriften sowie das kompilierte Bündel des Design-Systems, damit der Entwurf für sich allein darstellbar ist. Bewusst ein Zwischenstand, nicht der Endstand: dieser Export zeigt noch "Audi RS 6 Avant" statt des tatsächlichen RS 4 Avant competition und enthält erst die Hauptbildschirme. Die 16 fehlenden Seiten (Fahrzeugstatus, Batterieverlauf, Service, Reifen, Versicherung/Steuer und weitere, siehe SPECIFICATION.md §3) sind im Design-Projekt bereits nachbeauftragt. Beides ist in design/README.md festgehalten, damit der Stand nachvollziehbar bleibt; der Ordner wird beim nächsten Export ersetzt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
290 lines
12 KiB
JSON
290 lines
12 KiB
JSON
{
|
|
"plugins": [
|
|
"react",
|
|
"import"
|
|
],
|
|
"rules": {
|
|
"react/forbid-elements": [
|
|
"warn",
|
|
{
|
|
"forbid": []
|
|
}
|
|
],
|
|
"no-restricted-imports": [
|
|
"warn",
|
|
{
|
|
"patterns": [
|
|
{
|
|
"group": [
|
|
"components/accordion/LeafRow/**",
|
|
"components/general/Accordion/**",
|
|
"components/general/ActionButton/**",
|
|
"components/general/Feld/**",
|
|
"components/general/Fig/**",
|
|
"components/general/IconButton/**",
|
|
"components/general/ImagePlaceholder/**",
|
|
"components/general/Pill/**",
|
|
"components/general/Popup/**",
|
|
"components/general/PopupMenuItem/**",
|
|
"components/general/ProgressBar/**",
|
|
"components/general/ProgressRing/**",
|
|
"components/general/RowList/**",
|
|
"components/general/Seg/**",
|
|
"components/general/StatGrid/**",
|
|
"components/general/StatusRow/**",
|
|
"components/general/SwipeRow/**",
|
|
"components/general/Switch/**",
|
|
"components/general/TabBar/**",
|
|
"components/general/Tile/**"
|
|
],
|
|
"message": "Import design-system components from 'index.js', not component internals."
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"no-restricted-syntax": [
|
|
"warn",
|
|
{
|
|
"selector": "Literal[value=/#[0-9a-fA-F]{3,8}\\b/]",
|
|
"message": "Raw hex color — use a design-system color token via var()."
|
|
},
|
|
{
|
|
"selector": "Literal[value=/\\b\\d+px\\b/]",
|
|
"message": "Raw px value — use a design-system spacing token via var()."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Accordion'] > JSXAttribute > JSXIdentifier[name!=/^(?:title|summary|open|defaultOpen|onOpenChange|level|children|className|key|ref|className|style|children)$/]",
|
|
"message": "<Accordion> doesn't accept that prop. Declared props: title, summary, open, defaultOpen, onOpenChange, level, children, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='ActionButton'] > JSXAttribute > JSXIdentifier[name!=/^(?:children|onClick|variant|disabled|type|className|key|ref|className|style|children)$/]",
|
|
"message": "<ActionButton> doesn't accept that prop. Declared props: children, onClick, variant, disabled, type, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='ActionButton'] > JSXAttribute[name.name='variant'] > Literal[value!=/^(?:default|destructive)$/]",
|
|
"message": "<ActionButton> variant must be one of 'default' | 'destructive'."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='ActionButton'] > JSXAttribute[name.name='type'] > Literal[value!=/^(?:button|submit)$/]",
|
|
"message": "<ActionButton> type must be one of 'button' | 'submit'."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Feld'] > JSXAttribute > JSXIdentifier[name!=/^(?:label|value|children|unit|last|className|key|ref|className|style|children)$/]",
|
|
"message": "<Feld> doesn't accept that prop. Declared props: label, value, children, unit, last, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Fig'] > JSXAttribute > JSXIdentifier[name!=/^(?:value|unit|size|className|key|ref|className|style|children)$/]",
|
|
"message": "<Fig> doesn't accept that prop. Declared props: value, unit, size, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='IconButton'] > JSXAttribute > JSXIdentifier[name!=/^(?:onClick|children|disabled|className|key|ref|className|style|children)$/]",
|
|
"message": "<IconButton> doesn't accept that prop. Declared props: onClick, children, disabled, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='ImagePlaceholder'] > JSXAttribute > JSXIdentifier[name!=/^(?:src|alt|label|hint|icon|size|className|key|ref|className|style|children)$/]",
|
|
"message": "<ImagePlaceholder> doesn't accept that prop. Declared props: src, alt, label, hint, icon, size, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='ImagePlaceholder'] > JSXAttribute[name.name='size'] > Literal[value!=/^(?:default|mini|round)$/]",
|
|
"message": "<ImagePlaceholder> size must be one of 'default' | 'mini' | 'round'."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='LeafRow'] > JSXAttribute > JSXIdentifier[name!=/^(?:title|subTitle|value|subValue|onClick|className|key|ref|className|style|children)$/]",
|
|
"message": "<LeafRow> doesn't accept that prop. Declared props: title, subTitle, value, subValue, onClick, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Pill'] > JSXAttribute > JSXIdentifier[name!=/^(?:children|variant|className|key|ref|className|style|children)$/]",
|
|
"message": "<Pill> doesn't accept that prop. Declared props: children, variant, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Pill'] > JSXAttribute[name.name='variant'] > Literal[value!=/^(?:default|work)$/]",
|
|
"message": "<Pill> variant must be one of 'default' | 'work'."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Popup'] > JSXAttribute > JSXIdentifier[name!=/^(?:open|onClose|variant|anchor|children|className|portalTarget|key|ref|className|style|children)$/]",
|
|
"message": "<Popup> doesn't accept that prop. Declared props: open, onClose, variant, anchor, children, className, portalTarget."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Popup'] > JSXAttribute[name.name='variant'] > Literal[value!=/^(?:menu|form)$/]",
|
|
"message": "<Popup> variant must be one of 'menu' | 'form'."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='PopupMenuItem'] > JSXAttribute > JSXIdentifier[name!=/^(?:onClick|destructive|children|key|ref|className|style|children)$/]",
|
|
"message": "<PopupMenuItem> doesn't accept that prop. Declared props: onClick, destructive, children."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='ProgressBar'] > JSXAttribute > JSXIdentifier[name!=/^(?:percent|segments|showLegend|className|key|ref|className|style|children)$/]",
|
|
"message": "<ProgressBar> doesn't accept that prop. Declared props: percent, segments, showLegend, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='ProgressRing'] > JSXAttribute > JSXIdentifier[name!=/^(?:percent|value|unit|label|size|className|key|ref|className|style|children)$/]",
|
|
"message": "<ProgressRing> doesn't accept that prop. Declared props: percent, value, unit, label, size, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='RowList'] > JSXAttribute > JSXIdentifier[name!=/^(?:items|className|key|ref|className|style|children)$/]",
|
|
"message": "<RowList> doesn't accept that prop. Declared props: items, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Seg'] > JSXAttribute > JSXIdentifier[name!=/^(?:options|value|onChange|className|key|ref|className|style|children)$/]",
|
|
"message": "<Seg> doesn't accept that prop. Declared props: options, value, onChange, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='StatGrid'] > JSXAttribute > JSXIdentifier[name!=/^(?:items|columns|className|key|ref|className|style|children)$/]",
|
|
"message": "<StatGrid> doesn't accept that prop. Declared props: items, columns, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='StatusRow'] > JSXAttribute > JSXIdentifier[name!=/^(?:status|title|subtitle|onClick|className|key|ref|className|style|children)$/]",
|
|
"message": "<StatusRow> doesn't accept that prop. Declared props: status, title, subtitle, onClick, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='StatusRow'] > JSXAttribute[name.name='status'] > Literal[value!=/^(?:ok|warn|bad)$/]",
|
|
"message": "<StatusRow> status must be one of 'ok' | 'warn' | 'bad'."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='SwipeRow'] > JSXAttribute > JSXIdentifier[name!=/^(?:children|onDelete|deleteLabel|swiped|onSwipedChange|className|key|ref|className|style|children)$/]",
|
|
"message": "<SwipeRow> doesn't accept that prop. Declared props: children, onDelete, deleteLabel, swiped, onSwipedChange, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Switch'] > JSXAttribute > JSXIdentifier[name!=/^(?:checked|onChange|disabled|id|className|key|ref|className|style|children)$/]",
|
|
"message": "<Switch> doesn't accept that prop. Declared props: checked, onChange, disabled, id, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='TabBar'] > JSXAttribute > JSXIdentifier[name!=/^(?:items|activeKey|onChange|iconOnly|className|key|ref|className|style|children)$/]",
|
|
"message": "<TabBar> doesn't accept that prop. Declared props: items, activeKey, onChange, iconOnly, className."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Tile'] > JSXAttribute > JSXIdentifier[name!=/^(?:variant|chevron|onClick|className|children|key|ref|className|style|children)$/]",
|
|
"message": "<Tile> doesn't accept that prop. Declared props: variant, chevron, onClick, className, children."
|
|
},
|
|
{
|
|
"selector": "JSXOpeningElement[name.name='Tile'] > JSXAttribute[name.name='variant'] > Literal[value!=/^(?:default|button|flat)$/]",
|
|
"message": "<Tile> variant must be one of 'default' | 'button' | 'flat'."
|
|
}
|
|
]
|
|
},
|
|
"overrides": [
|
|
{
|
|
"files": [
|
|
"**/index.js"
|
|
],
|
|
"rules": {
|
|
"no-restricted-imports": "off"
|
|
}
|
|
}
|
|
],
|
|
"x-omelette": {
|
|
"components": {
|
|
"Accordion": {
|
|
"replaces": []
|
|
},
|
|
"ActionButton": {
|
|
"replaces": []
|
|
},
|
|
"Feld": {
|
|
"replaces": []
|
|
},
|
|
"Fig": {
|
|
"replaces": []
|
|
},
|
|
"IconButton": {
|
|
"replaces": []
|
|
},
|
|
"ImagePlaceholder": {
|
|
"replaces": []
|
|
},
|
|
"LeafRow": {
|
|
"replaces": []
|
|
},
|
|
"Pill": {
|
|
"replaces": []
|
|
},
|
|
"Popup": {
|
|
"replaces": []
|
|
},
|
|
"PopupMenuItem": {
|
|
"replaces": []
|
|
},
|
|
"ProgressBar": {
|
|
"replaces": []
|
|
},
|
|
"ProgressRing": {
|
|
"replaces": []
|
|
},
|
|
"RowList": {
|
|
"replaces": []
|
|
},
|
|
"Seg": {
|
|
"replaces": []
|
|
},
|
|
"StatGrid": {
|
|
"replaces": []
|
|
},
|
|
"StatusRow": {
|
|
"replaces": []
|
|
},
|
|
"SwipeRow": {
|
|
"replaces": []
|
|
},
|
|
"Switch": {
|
|
"replaces": []
|
|
},
|
|
"TabBar": {
|
|
"replaces": []
|
|
},
|
|
"Tile": {
|
|
"replaces": []
|
|
}
|
|
},
|
|
"tokens": [
|
|
"--bad",
|
|
"--canvas",
|
|
"--fg",
|
|
"--fg2",
|
|
"--fg3",
|
|
"--font-stack",
|
|
"--line",
|
|
"--line-strong",
|
|
"--ok",
|
|
"--r-func",
|
|
"--r-pill",
|
|
"--r-tile",
|
|
"--rahmen-hg",
|
|
"--red",
|
|
"--shade",
|
|
"--sp-1",
|
|
"--sp-2",
|
|
"--sp-3",
|
|
"--sp-4",
|
|
"--sp-5",
|
|
"--tile",
|
|
"--tile-2",
|
|
"--warn"
|
|
],
|
|
"tokenKinds": {
|
|
"--red": "color",
|
|
"--r-tile": "spacing",
|
|
"--r-pill": "spacing",
|
|
"--r-func": "spacing",
|
|
"--rahmen-hg": "color",
|
|
"--sp-1": "spacing",
|
|
"--sp-2": "spacing",
|
|
"--sp-3": "spacing",
|
|
"--sp-4": "spacing",
|
|
"--sp-5": "spacing",
|
|
"--canvas": "color",
|
|
"--tile": "color",
|
|
"--tile-2": "color",
|
|
"--line": "color",
|
|
"--line-strong": "color",
|
|
"--fg": "color",
|
|
"--fg2": "color",
|
|
"--fg3": "color",
|
|
"--ok": "color",
|
|
"--warn": "color",
|
|
"--bad": "color",
|
|
"--shade": "color",
|
|
"--font-stack": "font"
|
|
},
|
|
"fontFamilies": []
|
|
}
|
|
} |