{ "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": " 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": " 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": " variant must be one of 'default' | 'destructive'." }, { "selector": "JSXOpeningElement[name.name='ActionButton'] > JSXAttribute[name.name='type'] > Literal[value!=/^(?:button|submit)$/]", "message": " 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": " 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": " 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": " 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": " 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": " 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": " 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": " doesn't accept that prop. Declared props: children, variant, className." }, { "selector": "JSXOpeningElement[name.name='Pill'] > JSXAttribute[name.name='variant'] > Literal[value!=/^(?:default|work)$/]", "message": " 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": " 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": " variant must be one of 'menu' | 'form'." }, { "selector": "JSXOpeningElement[name.name='PopupMenuItem'] > JSXAttribute > JSXIdentifier[name!=/^(?:onClick|destructive|children|key|ref|className|style|children)$/]", "message": " 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": " 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": " 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": " 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": " 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": " 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": " 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": " 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": " 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": " 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": " 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": " 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": " 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": [] } }