@adea-ai/ui 0.106.2 → 0.108.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/dist/components/composites/appearance-editor/appearance-editor.d.ts +9 -3
- package/dist/components/composites/appearance-editor/appearance-editor.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/appearance-editor.js +61 -29
- package/dist/components/composites/appearance-editor/appearance-editor.js.map +1 -1
- package/dist/components/composites/appearance-editor/appearance-types.d.ts +2 -0
- package/dist/components/composites/appearance-editor/appearance-types.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/index.d.ts +1 -1
- package/dist/components/composites/appearance-editor/index.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/index.js +2 -2
- package/dist/components/layout/contextual-sidebar/contextual-sidebar.d.ts +55 -0
- package/dist/components/layout/contextual-sidebar/contextual-sidebar.d.ts.map +1 -0
- package/dist/components/layout/contextual-sidebar/contextual-sidebar.js +199 -0
- package/dist/components/layout/contextual-sidebar/contextual-sidebar.js.map +1 -0
- package/dist/components/layout/contextual-sidebar/index.d.ts +3 -0
- package/dist/components/layout/contextual-sidebar/index.d.ts.map +1 -0
- package/dist/components/layout/contextual-sidebar/index.js +3 -0
- package/dist/components/layout/pixel-resize-handle/index.d.ts +2 -0
- package/dist/components/layout/pixel-resize-handle/index.d.ts.map +1 -0
- package/dist/components/layout/pixel-resize-handle/index.js +2 -0
- package/dist/components/layout/pixel-resize-handle/pixel-resize-handle.d.ts +29 -0
- package/dist/components/layout/pixel-resize-handle/pixel-resize-handle.d.ts.map +1 -0
- package/dist/components/layout/pixel-resize-handle/pixel-resize-handle.js +183 -0
- package/dist/components/layout/pixel-resize-handle/pixel-resize-handle.js.map +1 -0
- package/dist/components/layout/sidebar-nav/sidebar-nav-resize-handle.d.ts +3 -19
- package/dist/components/layout/sidebar-nav/sidebar-nav-resize-handle.d.ts.map +1 -1
- package/dist/components/layout/sidebar-nav/sidebar-nav-resize-handle.js +8 -76
- package/dist/components/layout/sidebar-nav/sidebar-nav-resize-handle.js.map +1 -1
- package/dist/components/ui/badge/badge.d.ts.map +1 -1
- package/dist/components/ui/badge/badge.js +9 -5
- package/dist/components/ui/badge/badge.js.map +1 -1
- package/dist/components/ui/combobox/combobox.d.ts.map +1 -1
- package/dist/components/ui/combobox/combobox.js +2 -2
- package/dist/components/ui/combobox/combobox.js.map +1 -1
- package/dist/components/ui/context-menu/context-menu.d.ts.map +1 -1
- package/dist/components/ui/context-menu/context-menu.js +3 -3
- package/dist/components/ui/context-menu/context-menu.js.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.js +7 -4
- package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/ui/menubar/menubar.d.ts.map +1 -1
- package/dist/components/ui/menubar/menubar.js +3 -3
- package/dist/components/ui/menubar/menubar.js.map +1 -1
- package/dist/components/ui/popover/popover.d.ts.map +1 -1
- package/dist/components/ui/popover/popover.js +2 -2
- package/dist/components/ui/popover/popover.js.map +1 -1
- package/dist/components/ui/resizable/resizable.d.ts.map +1 -1
- package/dist/components/ui/resizable/resizable.js +2 -2
- package/dist/components/ui/resizable/resizable.js.map +1 -1
- package/dist/components/ui/select/select.d.ts.map +1 -1
- package/dist/components/ui/select/select.js +2 -2
- package/dist/components/ui/select/select.js.map +1 -1
- package/dist/components/ui/sheet/sheet.d.ts +16 -0
- package/dist/components/ui/sheet/sheet.d.ts.map +1 -1
- package/dist/components/ui/sheet/sheet.js +82 -16
- package/dist/components/ui/sheet/sheet.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/lib/overlay.d.ts +15 -0
- package/dist/lib/overlay.d.ts.map +1 -1
- package/dist/lib/overlay.js +14 -1
- package/dist/lib/overlay.js.map +1 -1
- package/dist/lint/index.d.ts.map +1 -1
- package/dist/lint.js +154 -20
- package/dist/lint.js.map +1 -1
- package/dist/r/appearance-editor.json +1 -1
- package/dist/r/contextual-sidebar.json +25 -0
- package/dist/r/pixel-resize-handle.json +23 -0
- package/dist/r/registry.json +50 -2
- package/dist/r/sidebar-nav.json +1 -1
- package/dist/r/src/components/composites/appearance-editor/appearance-editor.tsx +55 -33
- package/dist/r/src/components/composites/appearance-editor/appearance-types.ts +2 -0
- package/dist/r/src/components/composites/appearance-editor/index.ts +1 -1
- package/dist/r/src/components/layout/contextual-sidebar/contextual-sidebar.tsx +180 -0
- package/dist/r/src/components/layout/contextual-sidebar/index.ts +6 -0
- package/dist/r/src/components/layout/pixel-resize-handle/index.ts +1 -0
- package/dist/r/src/components/layout/pixel-resize-handle/pixel-resize-handle.tsx +177 -0
- package/dist/r/src/components/layout/sidebar-nav/sidebar-nav-resize-handle.tsx +7 -55
- package/dist/r/src/components/ui/badge/badge.tsx +9 -5
- package/dist/r/src/components/ui/combobox/combobox.tsx +2 -1
- package/dist/r/src/components/ui/context-menu/context-menu.tsx +3 -0
- package/dist/r/src/components/ui/dropdown-menu/dropdown-menu.tsx +9 -0
- package/dist/r/src/components/ui/menubar/menubar.tsx +3 -0
- package/dist/r/src/components/ui/popover/popover.tsx +8 -1
- package/dist/r/src/components/ui/resizable/resizable.tsx +4 -2
- package/dist/r/src/components/ui/select/select.tsx +2 -1
- package/dist/r/src/components/ui/sheet/sheet.tsx +78 -15
- package/dist/r/src/lib/overlay.ts +14 -0
- package/dist/r/src/styles/base.css +13 -0
- package/package.json +3 -1
- package/registry.json +50 -2
- package/src/components/composites/appearance-editor/appearance-editor.tsx +55 -33
- package/src/components/composites/appearance-editor/appearance-types.ts +2 -0
- package/src/components/composites/appearance-editor/index.ts +1 -1
- package/src/components/layout/contextual-sidebar/contextual-sidebar.tsx +180 -0
- package/src/components/layout/contextual-sidebar/index.ts +6 -0
- package/src/components/layout/pixel-resize-handle/index.ts +1 -0
- package/src/components/layout/pixel-resize-handle/pixel-resize-handle.tsx +177 -0
- package/src/components/layout/sidebar-nav/sidebar-nav-resize-handle.tsx +7 -55
- package/src/components/ui/badge/badge.tsx +9 -5
- package/src/components/ui/combobox/combobox.tsx +2 -1
- package/src/components/ui/context-menu/context-menu.tsx +3 -0
- package/src/components/ui/dropdown-menu/dropdown-menu.tsx +9 -0
- package/src/components/ui/menubar/menubar.tsx +3 -0
- package/src/components/ui/popover/popover.tsx +8 -1
- package/src/components/ui/resizable/resizable.tsx +4 -2
- package/src/components/ui/select/select.tsx +2 -1
- package/src/components/ui/sheet/sheet.tsx +78 -15
- package/src/index.ts +1 -0
- package/src/lib/overlay.ts +14 -0
- package/src/lint/index.ts +234 -22
- package/src/styles/base.css +13 -0
package/dist/lint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","names":[],"sources":["../src/lint/index.ts"],"sourcesContent":["/*\n * The design system's own oxlint plugin.\n *\n * The styling rules live in `@shadcn/lint`; what that plugin cannot know is which\n * *elements* the design system owns. This is the other half of the contract, for\n * the applications that consume the library: an interactive element this package\n * provides is not re-implemented at the application layer, and the primitive\n * libraries this package is built from are not imported around it.\n *\n * Loaded as an oxlint jsPlugin:\n *\n * // .oxlintrc.json\n * { \"jsPlugins\": [\"@adea-ai/ui/lint\"], \"rules\": { \"adea/no-raw-interactive-elements\": \"error\" } }\n *\n * Rules are errors by intent. A violation means an application composed its own\n * control out of raw markup — unreachable focus behaviour, an absent keyboard\n * story, a second implementation of a decision this package exists to make once.\n */\n\ntype Json = string | number | boolean | null | Json[] | { [key: string]: Json }\n\n/** The raw elements this package replaces, and the primitive that replaces them. */\nconst ELEMENT_PRIMITIVES: Readonly<Record<string, { primitive: string; path: string }>> =\n Object.freeze({\n button: { primitive: 'Button', path: '@adea-ai/ui/components/ui/button' },\n input: { primitive: 'Input', path: '@adea-ai/ui/components/ui/input' },\n textarea: { primitive: 'Textarea', path: '@adea-ai/ui/components/ui/textarea' },\n select: { primitive: 'Select', path: '@adea-ai/ui/components/ui/select' },\n option: { primitive: 'Select', path: '@adea-ai/ui/components/ui/select' },\n label: { primitive: 'Label', path: '@adea-ai/ui/components/ui/label' },\n })\n\ntype RuleModule = {\n meta: {\n type: 'problem'\n docs: { description: string }\n schema: Json[]\n messages: Record<string, string>\n }\n create: (context: LintContext) => Record<string, (node: any) => void>\n}\n\ninterface LintContext {\n options?: unknown[]\n sourceCode?: {\n getScope?: (node: unknown) => LintScope | undefined\n }\n report: (descriptor: {\n node: unknown\n messageId?: string\n message?: string\n data?: Record<string, Json>\n }) => void\n}\n\ninterface LintScope {\n set?: Map<string, any>\n upper?: LintScope\n}\n\ninterface LintVariable {\n defs?: { type?: string; parent?: { kind?: string }; node?: { init?: unknown } }[]\n identifiers?: object[]\n}\n\nconst variableOf = (node: any, context: LintContext): LintVariable | null => {\n if (node?.type !== 'Identifier' && node?.type !== 'JSXIdentifier') return null\n for (let scope = context.sourceCode?.getScope?.(node); scope; scope = scope.upper) {\n const variable = scope.set?.get(node.name)\n if (variable) return variable\n }\n return null\n}\n\n/** Reads a static object-property key without evaluating a computed expression. */\nconst staticPropertyKey = (node: any, computed: boolean): string | null => {\n if (!computed && node?.type === 'Identifier') return node.name\n if (node?.type === 'Literal' && typeof node.value === 'string') return node.value\n if (node?.type === 'TemplateLiteral' && node.expressions.length === 0)\n return node.quasis[0].value.cooked ?? node.quasis[0].value.raw\n return null\n}\n\n/** Detects named props in a literal JSX spread, including nested literal spreads. */\nconst objectHasStaticProperty = (node: any, name: string, seen = new Set<unknown>()): boolean => {\n if (!node || seen.has(node)) return false\n seen.add(node)\n if (\n node.type === 'TSAsExpression' ||\n node.type === 'TSSatisfiesExpression' ||\n node.type === 'TSNonNullExpression'\n )\n return objectHasStaticProperty(node.expression, name, seen)\n if (node.type !== 'ObjectExpression') return false\n return node.properties.some((property: any) => {\n if (property.type === 'Property')\n return staticPropertyKey(property.key, property.computed === true) === name\n if (property.type === 'SpreadElement')\n return objectHasStaticProperty(property.argument, name, seen)\n return false\n })\n}\n\n/** Returns literal values for a statically named property in an object spread. */\nconst staticObjectPropertyValues = (node: any, name: string, seen = new Set<unknown>()): any[] => {\n if (!node || seen.has(node)) return []\n seen.add(node)\n if (\n node.type === 'TSAsExpression' ||\n node.type === 'TSSatisfiesExpression' ||\n node.type === 'TSNonNullExpression'\n )\n return staticObjectPropertyValues(node.expression, name, seen)\n if (node.type !== 'ObjectExpression') return []\n return node.properties.flatMap((property: any) => {\n if (property.type === 'Property')\n return staticPropertyKey(property.key, property.computed === true) === name\n ? [property.value]\n : []\n if (property.type === 'SpreadElement')\n return staticObjectPropertyValues(property.argument, name, seen)\n return []\n })\n}\n\nconst noInlineStyles: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Consumer components cannot set appearance or layout with JSX style props; use shared variants and token-backed classes.',\n },\n schema: [],\n messages: {\n inlineStyle:\n 'JSX style attributes are not permitted, including layout values and CSS custom properties. Use shared variants and token-backed classes.',\n inlineStyleElement:\n 'A JSX style element bypasses the shared design system. Use shared variants and token-backed classes.',\n inlineStyleSpread:\n 'A JSX spread contains a style prop. Pass named shared component props instead of hiding inline styles in a spread.',\n },\n },\n create(context) {\n return {\n JSXAttribute(node: any) {\n if (node.name?.type === 'JSXIdentifier' && node.name.name === 'style')\n context.report({ node, messageId: 'inlineStyle' })\n },\n JSXOpeningElement(node: any) {\n if (node.name?.type === 'JSXIdentifier' && node.name.name === 'style')\n context.report({ node, messageId: 'inlineStyleElement' })\n },\n JSXSpreadAttribute(node: any) {\n if (objectHasStaticProperty(node.argument, 'style'))\n context.report({ node, messageId: 'inlineStyleSpread' })\n },\n }\n },\n}\n\nconst noClassList: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Solid classList props hide conditional classes from static design-system lint; use cn() with its object-key form.',\n },\n schema: [],\n messages: {\n classList:\n 'classList hides classes from design-system lint. Use cn() with its object-key form and statically readable class names.',\n classListSpread:\n 'A JSX spread contains classList. Use cn() with its object-key form instead of hiding classes in a spread.',\n },\n },\n create(context) {\n return {\n JSXAttribute(node: any) {\n if (node.name?.type === 'JSXIdentifier' && node.name.name === 'classList')\n context.report({ node, messageId: 'classList' })\n },\n JSXSpreadAttribute(node: any) {\n if (objectHasStaticProperty(node.argument, 'classList'))\n context.report({ node, messageId: 'classListSpread' })\n },\n }\n },\n}\n\ninterface RawElementOptions {\n /** Element names this rule should not report (rare; prefer fixing the file). */\n allow?: string[]\n /** Replaces the default report message. */\n message?: string\n}\n\nconst noRawInteractiveElements: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Interactive elements this package provides (button, input, textarea, select, option, label), including statically known Solid Dynamic tags, are composed from the package, not written as raw markup.',\n },\n schema: [\n {\n type: 'object',\n properties: {\n allow: { type: 'array', items: { type: 'string' } },\n message: { type: 'string' },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n rawElement:\n '{{element}} is provided by the design system: use {{primitive}} from {{path}}. A raw element has no keyboard story, no focus behaviour and no token styling — that is the work the primitive already did.',\n },\n },\n create(context) {\n const options = (context.options?.[0] ?? {}) as RawElementOptions\n const allowed = new Set(options.allow ?? [])\n const dynamicImports: SolidDynamicImports = {\n named: new WeakSet(),\n namespaces: new WeakSet(),\n }\n const emit = (node: unknown, element: string) => {\n const target = ELEMENT_PRIMITIVES[element]!\n context.report({\n node,\n messageId: 'rawElement',\n data: { element, primitive: target.primitive, path: target.path },\n ...(options.message ? { message: options.message } : {}),\n })\n }\n return {\n Program(node: any) {\n collectSolidDynamicImports(node, dynamicImports)\n },\n JSXOpeningElement(node: any) {\n for (const element of jsxElementNames(node, dynamicImports, context)) {\n if (!(element in ELEMENT_PRIMITIVES) || allowed.has(element)) continue\n emit(node, element)\n }\n },\n }\n },\n}\n\ninterface PrimitiveImportOptions {\n /** Package prefixes this rule reports. Defaults to the primitive libraries the ui package wraps. */\n packages?: string[]\n /** Replaces the default report message. */\n message?: string\n}\n\nconst DEFAULT_PRIMITIVE_PACKAGES = Object.freeze([\n '@kobalte/core',\n '@corvu',\n 'cmdk-solid',\n '@ark-ui',\n '@zag-js',\n '@radix-ui',\n 'radix-ui',\n '@base-ui-components',\n '@base-ui',\n])\n\n/**\n * The interactive ARIA roles an application can dress a generic element in, and\n * the published primitive that owns each role. Native anchors are not generic\n * elements, so their built-in link semantics are unaffected by the `link` entry.\n */\nconst ROLE_PRIMITIVES: Readonly<Record<string, { primitive: string; path: string }>> =\n Object.freeze({\n button: { primitive: 'Button', path: '@adea-ai/ui/components/ui/button' },\n link: { primitive: 'TextLink', path: '@adea-ai/ui/components/ui/text-link' },\n checkbox: { primitive: 'Checkbox', path: '@adea-ai/ui/components/ui/checkbox' },\n radio: { primitive: 'RadioGroupItem', path: '@adea-ai/ui/components/ui/radio-group' },\n radiogroup: { primitive: 'RadioGroup', path: '@adea-ai/ui/components/ui/radio-group' },\n switch: { primitive: 'Switch', path: '@adea-ai/ui/components/ui/switch' },\n tab: { primitive: 'TabsTrigger', path: '@adea-ai/ui/components/ui/tabs' },\n tablist: { primitive: 'TabsList', path: '@adea-ai/ui/components/ui/tabs' },\n tabpanel: { primitive: 'TabsContent', path: '@adea-ai/ui/components/ui/tabs' },\n option: { primitive: 'SelectItem', path: '@adea-ai/ui/components/ui/select' },\n listbox: { primitive: 'Select', path: '@adea-ai/ui/components/ui/select' },\n combobox: { primitive: 'Combobox', path: '@adea-ai/ui/components/ui/combobox' },\n searchbox: { primitive: 'Input', path: '@adea-ai/ui/components/ui/input' },\n menu: { primitive: 'DropdownMenuContent', path: '@adea-ai/ui/components/ui/dropdown-menu' },\n menuitem: { primitive: 'DropdownMenuItem', path: '@adea-ai/ui/components/ui/dropdown-menu' },\n menuitemcheckbox: {\n primitive: 'DropdownMenuCheckboxItem',\n path: '@adea-ai/ui/components/ui/dropdown-menu',\n },\n menuitemradio: {\n primitive: 'DropdownMenuRadioItem',\n path: '@adea-ai/ui/components/ui/dropdown-menu',\n },\n textbox: { primitive: 'Input', path: '@adea-ai/ui/components/ui/input' },\n tree: { primitive: 'Tree', path: '@adea-ai/ui/components/composites/tree' },\n treeitem: { primitive: 'TreeRow', path: '@adea-ai/ui/components/composites/tree' },\n })\n\n/**\n * The elements whose only job is layout or text. A click handler or a tabindex on\n * one of these is a control being hand-built out of a non-control.\n */\nconst GENERIC_ELEMENTS: ReadonlySet<string> = new Set([\n 'div',\n 'span',\n 'li',\n 'ul',\n 'ol',\n 'td',\n 'th',\n 'p',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'section',\n 'article',\n 'aside',\n 'header',\n 'footer',\n 'nav',\n 'main',\n 'img',\n 'svg',\n])\n\nconst CLICK_HANDLERS: ReadonlySet<string> = new Set(\n [\n 'onClick',\n 'onDblClick',\n 'onDoubleClick',\n 'onPointerDown',\n 'onPointerUp',\n 'onMouseDown',\n 'onMouseUp',\n 'onTouchStart',\n 'onTouchEnd',\n 'on:click',\n 'on:dblclick',\n 'on:pointerdown',\n 'on:pointerup',\n 'on:mousedown',\n 'on:mouseup',\n 'on:touchstart',\n 'on:touchend',\n ].flatMap((handler) => [handler, handler.toLowerCase()])\n)\n\ninterface InteractiveWrapperOptions {\n /** Element names this rule should not report (rare; prefer fixing the file). */\n allow?: string[]\n /** Also reject opaque generic-element props and Solid Dynamic tag overrides. */\n rejectUnknownSpreads?: boolean\n /** Replaces the default report message. */\n message?: string\n}\n\n/** Returns a const binding's immutable initializer, when its value is statically knowable. */\nconst constInitializer = (node: any, context: LintContext): any => {\n const variable = variableOf(node, context)\n const definition = variable?.defs?.[0]\n if (definition?.type !== 'Variable' || definition.parent?.kind !== 'const') return null\n return definition.node?.init ?? null\n}\n\n/** Reads literal strings through static branches and local const aliases. */\nconst staticStrings = (node: any, context?: LintContext, seen = new Set<unknown>()): string[] => {\n if (!node || seen.has(node)) return []\n seen.add(node)\n if (\n node.type === 'TSAsExpression' ||\n node.type === 'TSSatisfiesExpression' ||\n node.type === 'TSNonNullExpression'\n )\n return staticStrings(node.expression, context, seen)\n if (node?.type === 'Literal' && typeof node.value === 'string') return [node.value]\n if (node?.type === 'JSXExpressionContainer') return staticStrings(node.expression, context, seen)\n if (node?.type === 'ConditionalExpression')\n return [\n ...staticStrings(node.consequent, context, new Set(seen)),\n ...staticStrings(node.alternate, context, new Set(seen)),\n ]\n if (node?.type === 'LogicalExpression')\n return [\n ...staticStrings(node.left, context, new Set(seen)),\n ...staticStrings(node.right, context, new Set(seen)),\n ]\n if (node?.type === 'TemplateLiteral' && node.expressions.length === 0)\n return [node.quasis[0].value.cooked ?? node.quasis[0].value.raw]\n if (node?.type === 'Identifier' && context) {\n const initializer = constInitializer(node, context)\n return initializer ? staticStrings(initializer, context, seen) : []\n }\n return []\n}\n\ninterface SolidDynamicImports {\n named: WeakSet<object>\n namespaces: WeakSet<object>\n}\n\nconst collectSolidDynamicImport = (node: any, imports: SolidDynamicImports): void => {\n if (node.source?.value !== 'solid-js/web') return\n for (const specifier of node.specifiers ?? []) {\n if (specifier.type === 'ImportNamespaceSpecifier' && specifier.local)\n imports.namespaces.add(specifier.local)\n if (specifier.type !== 'ImportSpecifier') continue\n const imported = specifier.imported?.name ?? specifier.imported?.value\n if (imported === 'Dynamic' && specifier.local) imports.named.add(specifier.local)\n }\n}\n\nconst collectSolidDynamicImports = (program: any, imports: SolidDynamicImports): void => {\n for (const statement of program.body ?? [])\n if (statement.type === 'ImportDeclaration') collectSolidDynamicImport(statement, imports)\n}\n\nconst isImportedBinding = (node: any, bindings: WeakSet<object>, context: LintContext): boolean =>\n variableOf(node, context)?.identifiers?.some((identifier: object) => bindings.has(identifier)) ??\n false\n\nconst isSolidDynamic = (name: any, imports: SolidDynamicImports, context: LintContext): boolean => {\n if (name?.type === 'JSXIdentifier') return isImportedBinding(name, imports.named, context)\n return (\n name?.type === 'JSXMemberExpression' &&\n name.property?.name === 'Dynamic' &&\n name.object?.type === 'JSXIdentifier' &&\n isImportedBinding(name.object, imports.namespaces, context)\n )\n}\n\ninterface DynamicComponentResolution {\n values: any[]\n opaqueAfterKnownIntrinsic: boolean\n}\n\nconst valuesIncludeKnownIntrinsic = (values: any[], context: LintContext): boolean =>\n values\n .flatMap((value) => staticStrings(value, context))\n .some((element) => GENERIC_ELEMENTS.has(element) || element in ELEMENT_PRIMITIVES)\n\n/** Applies `component` assignments made by a spread, tracking opaque overrides. */\nconst applyDynamicComponentSpread = (\n node: any,\n resolution: DynamicComponentResolution,\n context: LintContext\n): DynamicComponentResolution => {\n while (\n node?.type === 'TSAsExpression' ||\n node?.type === 'TSSatisfiesExpression' ||\n node?.type === 'TSNonNullExpression'\n )\n node = node.expression\n if (!node || node.type !== 'ObjectExpression')\n return {\n values: [],\n opaqueAfterKnownIntrinsic:\n resolution.opaqueAfterKnownIntrinsic ||\n valuesIncludeKnownIntrinsic(resolution.values, context),\n }\n\n let current = resolution\n for (const property of node.properties ?? []) {\n if (property.type === 'SpreadElement') {\n current = applyDynamicComponentSpread(property.argument, current, context)\n continue\n }\n if (property.type !== 'Property') continue\n const key = staticPropertyKey(property.key, property.computed === true)\n if (key === 'component')\n current = { values: [property.value], opaqueAfterKnownIntrinsic: false }\n else if (property.computed && key === null)\n current = {\n values: [],\n opaqueAfterKnownIntrinsic:\n current.opaqueAfterKnownIntrinsic || valuesIncludeKnownIntrinsic(current.values, context),\n }\n }\n return current\n}\n\nconst dynamicComponentResolution = (\n node: any,\n context: LintContext\n): DynamicComponentResolution => {\n let resolution: DynamicComponentResolution = {\n values: [],\n opaqueAfterKnownIntrinsic: false,\n }\n for (const attribute of node.attributes ?? []) {\n if (attribute.type === 'JSXAttribute' && attribute.name?.name === 'component') {\n resolution = {\n values: attribute.value ? [attribute.value] : [],\n opaqueAfterKnownIntrinsic: false,\n }\n continue\n }\n if (attribute.type === 'JSXSpreadAttribute')\n resolution = applyDynamicComponentSpread(attribute.argument, resolution, context)\n }\n return resolution\n}\n\n/** Resolves native tags passed to Solid Dynamic while leaving component values alone. */\nconst jsxElementNames = (\n node: any,\n imports: SolidDynamicImports,\n context: LintContext\n): string[] => {\n if (isSolidDynamic(node.name, imports, context))\n return [\n ...new Set(\n dynamicComponentResolution(node, context).values.flatMap((value) =>\n staticStrings(value, context)\n )\n ),\n ]\n if (node.name?.type === 'JSXIdentifier') return [node.name.name]\n return []\n}\n\nconst roleOf = (node: any, context: LintContext): string | null => {\n for (const attribute of node.attributes ?? []) {\n if (attribute.type === 'JSXSpreadAttribute') {\n const role = staticObjectPropertyValues(attribute.argument, 'role')\n .flatMap((value) => staticStrings(value, context))\n .flatMap((value) => value.split(/\\s+/))\n .find((value) => value in ROLE_PRIMITIVES)\n if (role) return role\n continue\n }\n if (attribute.type !== 'JSXAttribute' || attribute.name?.name !== 'role') continue\n return (\n staticStrings(attribute.value, context)\n .flatMap((role) => role.split(/\\s+/))\n .find((role) => role in ROLE_PRIMITIVES) ?? null\n )\n }\n return null\n}\n\n/** Whether the element carries the attribute, by name. */\nconst has = (node: any, name: string): boolean =>\n (node.attributes ?? []).some(\n (attribute: any) =>\n (attribute.type === 'JSXAttribute' &&\n (attribute.name?.type === 'JSXNamespacedName'\n ? `${attribute.name.namespace.name}:${attribute.name.name.name}`\n : attribute.name?.name) === name) ||\n (attribute.type === 'JSXSpreadAttribute' && objectHasStaticProperty(attribute.argument, name))\n )\n\nconst tabStopValue = (value: any): boolean => {\n const expression = value?.type === 'JSXExpressionContainer' ? value.expression : value\n if (expression?.type === 'Literal') return !(Number(expression.value) < 0)\n if (\n expression?.type === 'UnaryExpression' &&\n expression.operator === '-' &&\n expression.argument?.type === 'Literal'\n )\n return !(Number(expression.argument.value) > 0)\n return true\n}\n\nconst hasTabStop = (node: any): boolean =>\n (node.attributes ?? []).some((attribute: any) => {\n if (\n attribute.type === 'JSXAttribute' &&\n ['tabIndex', 'tabindex'].includes(attribute.name?.name)\n )\n return tabStopValue(attribute.value)\n if (attribute.type === 'JSXSpreadAttribute')\n return ['tabIndex', 'tabindex'].some((name) =>\n staticObjectPropertyValues(attribute.argument, name).some(tabStopValue)\n )\n return false\n })\n\n/** Unknown/computed props make a JSX object spread opaque to interaction checks. */\nconst opaqueSpread = (node: any, seen = new Set<unknown>()): boolean => {\n while (\n node?.type === 'TSAsExpression' ||\n node?.type === 'TSSatisfiesExpression' ||\n node?.type === 'TSNonNullExpression'\n )\n node = node.expression\n if (!node || seen.has(node) || node.type !== 'ObjectExpression') return true\n seen.add(node)\n return node.properties.some((property: any) => {\n if (property.type === 'SpreadElement') return opaqueSpread(property.argument, seen)\n if (property.type !== 'Property') return true\n return staticPropertyKey(property.key, property.computed === true) === null\n })\n}\n\nconst hasOpaqueSpread = (node: any): boolean =>\n (node.attributes ?? []).some(\n (attribute: any) => attribute.type === 'JSXSpreadAttribute' && opaqueSpread(attribute.argument)\n )\n\nconst noInteractiveWrappers: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Generic elements dressed as interactive controls — an interactive role, a click handler or a tabindex on a layout element — re-implement a primitive by hand. Compose the real component.',\n },\n schema: [\n {\n type: 'object',\n properties: {\n allow: { type: 'array', items: { type: 'string' } },\n rejectUnknownSpreads: { type: 'boolean' },\n message: { type: 'string' },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n roleWrapper:\n 'A {{element}} with role=\"{{role}}\" hand-builds {{primitive}}: use {{primitive}} from {{path}}. The primitive brings keyboard activation, focus behaviour and ARIA wiring; the wrapper re-implements them badly.',\n clickWrapper:\n 'A click handler on {{element}} composes {{primitive}} by hand: use {{primitive}} from {{path}}. A div that reacts to clicks is a button that cannot be reached by keyboard.',\n tabindexWrapper:\n 'A tabindex on {{element}} makes a layout element focusable, which is focus management the primitives already own: compose the real component instead.',\n opaqueSpreadWrapper:\n 'A spread on {{element}} may hide a role, activation handler, or tab stop. Pass statically named props or compose the shared component instead.',\n opaqueDynamicComponentWrapper:\n 'An opaque spread follows a known raw design-system or generic tag on Solid Dynamic and may replace the tag or hide interactive props. Pass statically named props or a shared component so the interaction rule can inspect the final component.',\n },\n },\n create(context) {\n const options = (context.options?.[0] ?? {}) as InteractiveWrapperOptions\n const allowed = new Set(options.allow ?? [])\n const dynamicImports: SolidDynamicImports = {\n named: new WeakSet(),\n namespaces: new WeakSet(),\n }\n return {\n Program(node: any) {\n collectSolidDynamicImports(node, dynamicImports)\n },\n JSXOpeningElement(node: any) {\n if (options.rejectUnknownSpreads && isSolidDynamic(node.name, dynamicImports, context)) {\n const resolution = dynamicComponentResolution(node, context)\n if (resolution.opaqueAfterKnownIntrinsic) {\n context.report({\n node,\n messageId: 'opaqueDynamicComponentWrapper',\n ...(options.message ? { message: options.message } : {}),\n })\n return\n }\n }\n\n for (const element of jsxElementNames(node, dynamicImports, context)) {\n if (allowed.has(element) || element in ELEMENT_PRIMITIVES) continue\n // Capitalized JSX components are composed controls, not raw elements.\n // Solid Dynamic is resolved above only when its component is a known tag.\n if (element[0] === element[0]?.toUpperCase()) continue\n if (!GENERIC_ELEMENTS.has(element)) continue\n\n if (options.rejectUnknownSpreads && hasOpaqueSpread(node)) {\n context.report({\n node,\n messageId: 'opaqueSpreadWrapper',\n data: { element },\n ...(options.message ? { message: options.message } : {}),\n })\n break\n }\n\n const role = roleOf(node, context)\n if (role && role in ROLE_PRIMITIVES) {\n const target = ROLE_PRIMITIVES[role]!\n context.report({\n node,\n messageId: 'roleWrapper',\n data: { element, role, primitive: target.primitive, path: target.path },\n ...(options.message ? { message: options.message } : {}),\n })\n continue\n }\n\n const click = [...CLICK_HANDLERS].find((handler) => has(node, handler))\n if (click) {\n const target = ROLE_PRIMITIVES.button!\n context.report({\n node,\n messageId: 'clickWrapper',\n data: { element, primitive: target.primitive, path: target.path },\n ...(options.message ? { message: options.message } : {}),\n })\n continue\n }\n if (hasTabStop(node))\n context.report({\n node,\n messageId: 'tabindexWrapper',\n data: { element },\n ...(options.message ? { message: options.message } : {}),\n })\n }\n },\n }\n },\n}\n\nconst BUTTON_MODULE = '@adea-ai/ui/components/ui/button'\nconst ACTION_BUTTON_MODULE = '@adea-ai/ui/components/composites/action-button'\nconst ICON_BUTTON_SIZES: ReadonlySet<string> = new Set([\n 'icon-2xs',\n 'icon-xs',\n 'icon-sm',\n 'icon-md',\n 'icon-lg',\n 'icon-xl',\n 'icon-2xl',\n])\n\nconst staticJsxValues = (value: any): any[] =>\n value?.type === 'JSXExpressionContainer' ? [value.expression] : value ? [value] : []\n\nconst attributeValues = (node: any, name: string): any[] => {\n const values: any[] = []\n for (const attribute of node.attributes ?? []) {\n if (attribute.type === 'JSXAttribute' && attribute.name?.name === name)\n values.splice(0, values.length, ...staticJsxValues(attribute.value))\n if (attribute.type === 'JSXSpreadAttribute') {\n const spreadValues = staticObjectPropertyValues(attribute.argument, name)\n if (spreadValues.length > 0) values.splice(0, values.length, spreadValues.at(-1))\n }\n }\n return values\n}\n\nconst staticStringValue = (node: any): string | null => {\n if (node?.type === 'Literal' && typeof node.value === 'string') return node.value\n if (node?.type === 'TemplateLiteral' && node.expressions.length === 0)\n return node.quasis[0].value.cooked ?? node.quasis[0].value.raw\n return null\n}\n\nconst isIconButtonSize = (node: any): boolean =>\n attributeValues(node, 'size').some((value) => {\n const size = staticStringValue(value)\n return size !== null && ICON_BUTTON_SIZES.has(size)\n })\n\nconst actionTooltipStatus = (node: any): 'valid' | 'blank' | 'unknown' | 'missing' => {\n const values = attributeValues(node, 'tooltip')\n if (values.length === 0) return 'missing'\n const strings = values.map(staticStringValue)\n if (strings.some((value) => value !== null && value.trim().length > 0)) return 'valid'\n if (strings.every((value) => value !== null)) return 'blank'\n return 'unknown'\n}\n\nconst isImportedComponent = (identifier: any, imports: Set<string>): boolean =>\n identifier?.type === 'Identifier' && imports.has(identifier.name)\n\n/** Requires shared icon actions to carry the shared explanatory-tooltip contract. */\nconst requireActionButtonTooltip: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Consumer icon-size shared Button actions use ActionButton with a nonblank tooltip; dynamic values remain a review boundary.',\n },\n schema: [],\n messages: {\n useActionButton:\n 'Icon-size Button actions use ActionButton with a nonblank tooltip. Keep the control name in aria-label; the tooltip explains the action.',\n missingTooltip:\n 'An icon-size ActionButton needs a supplied nonblank tooltip. Keep its accessible name in aria-label as well.',\n },\n },\n create(context) {\n const buttons = new Set<string>()\n const actionButtons = new Set<string>()\n const recordImports = (node: any) => {\n const source = node.source?.value\n const target =\n source === BUTTON_MODULE ? buttons : source === ACTION_BUTTON_MODULE ? actionButtons : null\n if (!target) return\n for (const specifier of node.specifiers ?? []) {\n if (specifier.type !== 'ImportSpecifier') continue\n const imported = specifier.imported?.name ?? specifier.imported?.value\n if (\n (source === BUTTON_MODULE && imported === 'Button') ||\n (source === ACTION_BUTTON_MODULE && imported === 'ActionButton')\n )\n target.add(specifier.local?.name)\n }\n }\n\n return {\n ImportDeclaration: recordImports,\n JSXOpeningElement(node: any) {\n if (!isIconButtonSize(node)) return\n const name = node.name?.type === 'JSXIdentifier' ? node.name.name : null\n const isButton = name !== null && buttons.has(name)\n const isActionButton = name !== null && actionButtons.has(name)\n const asValues = attributeValues(node, 'as')\n const targetsButton = asValues.some((value) => isImportedComponent(value, buttons))\n const targetsActionButton = asValues.some((value) =>\n isImportedComponent(value, actionButtons)\n )\n if (isButton || targetsButton) {\n context.report({ node, messageId: 'useActionButton' })\n return\n }\n if (!isActionButton && !targetsActionButton) return\n const status = actionTooltipStatus(node)\n if (status === 'missing' || status === 'blank')\n context.report({ node, messageId: 'missingTooltip' })\n },\n }\n },\n}\n\nconst noPrimitiveLibraryImports: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'The primitive libraries the design system is built on (Kobalte and friends) are its internal affair — compose the exported components instead of importing the primitives.',\n },\n schema: [\n {\n type: 'object',\n properties: {\n packages: { type: 'array', items: { type: 'string' } },\n message: { type: 'string' },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n primitiveImport:\n 'Import from the design system, not from {{package}}: the primitives it wraps carry the focus, keyboard and ARIA behaviour the components exist to provide.',\n },\n },\n create(context) {\n const options = (context.options?.[0] ?? {}) as PrimitiveImportOptions\n const prefixes = options.packages ?? DEFAULT_PRIMITIVE_PACKAGES\n const offender = (source: unknown): string | null => {\n const name = String(source ?? '')\n return prefixes.find((prefix) => name === prefix || name.startsWith(`${prefix}/`)) ?? null\n }\n const report = (node: unknown, source: unknown) => {\n const pkg = offender(source)!\n context.report({\n node,\n messageId: 'primitiveImport',\n data: { package: pkg },\n ...(options.message ? { message: options.message } : {}),\n })\n }\n return {\n ImportDeclaration(node: any) {\n if (offender(node.source?.value)) report(node, node.source.value)\n },\n ImportExpression(node: any) {\n if (typeof node.source?.value === 'string' && offender(node.source.value))\n report(node, node.source.value)\n },\n ExportNamedDeclaration(node: any) {\n if (offender(node.source?.value)) report(node, node.source.value)\n },\n ExportAllDeclaration(node: any) {\n if (offender(node.source?.value)) report(node, node.source.value)\n },\n CallExpression(node: any) {\n if (node.callee?.type !== 'Identifier' || node.callee.name !== 'require') return\n const source = node.arguments?.[0]?.value\n if (typeof source === 'string' && offender(source)) report(node, source)\n },\n }\n },\n}\n\nconst plugin = {\n meta: { name: 'adea' },\n rules: {\n 'no-inline-styles': noInlineStyles,\n 'no-class-list': noClassList,\n 'no-raw-interactive-elements': noRawInteractiveElements,\n 'no-primitive-library-imports': noPrimitiveLibraryImports,\n 'no-interactive-wrappers': noInteractiveWrappers,\n 'require-action-button-tooltip': requireActionButtonTooltip,\n },\n}\n\nexport default plugin\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lint.js","names":[],"sources":["../src/lint/index.ts"],"sourcesContent":["/*\n * The design system's own oxlint plugin.\n *\n * The styling rules live in `@shadcn/lint`; what that plugin cannot know is which\n * *elements* the design system owns. This is the other half of the contract, for\n * the applications that consume the library: an interactive element this package\n * provides is not re-implemented at the application layer, and the primitive\n * libraries this package is built from are not imported around it.\n *\n * Loaded as an oxlint jsPlugin:\n *\n * // .oxlintrc.json\n * { \"jsPlugins\": [\"@adea-ai/ui/lint\"], \"rules\": { \"adea/no-raw-interactive-elements\": \"error\" } }\n *\n * Rules are errors by intent. A violation means an application composed its own\n * control out of raw markup — unreachable focus behaviour, an absent keyboard\n * story, a second implementation of a decision this package exists to make once.\n */\n\ntype Json = string | number | boolean | null | Json[] | { [key: string]: Json }\n\n/** The raw elements this package replaces, and the primitive that replaces them. */\nconst ELEMENT_PRIMITIVES: Readonly<Record<string, { primitive: string; path: string }>> =\n Object.freeze({\n button: { primitive: 'Button', path: '@adea-ai/ui/components/ui/button' },\n input: { primitive: 'Input', path: '@adea-ai/ui/components/ui/input' },\n textarea: { primitive: 'Textarea', path: '@adea-ai/ui/components/ui/textarea' },\n select: { primitive: 'Select', path: '@adea-ai/ui/components/ui/select' },\n option: { primitive: 'Select', path: '@adea-ai/ui/components/ui/select' },\n label: { primitive: 'Label', path: '@adea-ai/ui/components/ui/label' },\n })\n\ntype RuleModule = {\n meta: {\n type: 'problem'\n docs: { description: string }\n schema: Json[]\n messages: Record<string, string>\n }\n create: (context: LintContext) => Record<string, (node: any) => void>\n}\n\ninterface LintContext {\n options?: unknown[]\n sourceCode?: {\n getScope?: (node: unknown) => LintScope | undefined\n }\n report: (descriptor: {\n node: unknown\n messageId?: string\n message?: string\n data?: Record<string, Json>\n }) => void\n}\n\ninterface LintScope {\n set?: Map<string, any>\n upper?: LintScope\n}\n\ninterface LintVariable {\n defs?: { type?: string; parent?: { kind?: string }; node?: { init?: unknown } }[]\n identifiers?: object[]\n}\n\nconst variableOf = (node: any, context: LintContext): LintVariable | null => {\n if (node?.type !== 'Identifier' && node?.type !== 'JSXIdentifier') return null\n for (let scope = context.sourceCode?.getScope?.(node); scope; scope = scope.upper) {\n const variable = scope.set?.get(node.name)\n if (variable) return variable\n }\n return null\n}\n\n/** Reads a static object-property key without evaluating a computed expression. */\nconst staticPropertyKey = (node: any, computed: boolean): string | null => {\n if (!computed && node?.type === 'Identifier') return node.name\n if (node?.type === 'Literal' && typeof node.value === 'string') return node.value\n if (node?.type === 'TemplateLiteral' && node.expressions.length === 0)\n return node.quasis[0].value.cooked ?? node.quasis[0].value.raw\n return null\n}\n\n/** Detects named props in a literal JSX spread, including nested literal spreads. */\nconst objectHasStaticProperty = (node: any, name: string, seen = new Set<unknown>()): boolean => {\n if (!node || seen.has(node)) return false\n seen.add(node)\n if (\n node.type === 'TSAsExpression' ||\n node.type === 'TSSatisfiesExpression' ||\n node.type === 'TSNonNullExpression'\n )\n return objectHasStaticProperty(node.expression, name, seen)\n if (node.type !== 'ObjectExpression') return false\n return node.properties.some((property: any) => {\n if (property.type === 'Property')\n return staticPropertyKey(property.key, property.computed === true) === name\n if (property.type === 'SpreadElement')\n return objectHasStaticProperty(property.argument, name, seen)\n return false\n })\n}\n\n/** Returns literal values for a statically named property in an object spread. */\nconst staticObjectPropertyValues = (node: any, name: string, seen = new Set<unknown>()): any[] => {\n if (!node || seen.has(node)) return []\n seen.add(node)\n if (\n node.type === 'TSAsExpression' ||\n node.type === 'TSSatisfiesExpression' ||\n node.type === 'TSNonNullExpression'\n )\n return staticObjectPropertyValues(node.expression, name, seen)\n if (node.type !== 'ObjectExpression') return []\n return node.properties.flatMap((property: any) => {\n if (property.type === 'Property')\n return staticPropertyKey(property.key, property.computed === true) === name\n ? [property.value]\n : []\n if (property.type === 'SpreadElement')\n return staticObjectPropertyValues(property.argument, name, seen)\n return []\n })\n}\n\nconst noInlineStyles: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Consumer components cannot set appearance or layout with JSX style props; use shared variants and token-backed classes.',\n },\n schema: [],\n messages: {\n inlineStyle:\n 'JSX style attributes are not permitted, including layout values and CSS custom properties. Use shared variants and token-backed classes.',\n inlineStyleElement:\n 'A JSX style element bypasses the shared design system. Use shared variants and token-backed classes.',\n inlineStyleSpread:\n 'A JSX spread contains a style prop. Pass named shared component props instead of hiding inline styles in a spread.',\n },\n },\n create(context) {\n return {\n JSXAttribute(node: any) {\n if (node.name?.type === 'JSXIdentifier' && node.name.name === 'style')\n context.report({ node, messageId: 'inlineStyle' })\n },\n JSXOpeningElement(node: any) {\n if (node.name?.type === 'JSXIdentifier' && node.name.name === 'style')\n context.report({ node, messageId: 'inlineStyleElement' })\n },\n JSXSpreadAttribute(node: any) {\n if (objectHasStaticProperty(node.argument, 'style'))\n context.report({ node, messageId: 'inlineStyleSpread' })\n },\n }\n },\n}\n\nconst noClassList: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Solid classList props hide conditional classes from static design-system lint; use cn() with its object-key form.',\n },\n schema: [],\n messages: {\n classList:\n 'classList hides classes from design-system lint. Use cn() with its object-key form and statically readable class names.',\n classListSpread:\n 'A JSX spread contains classList. Use cn() with its object-key form instead of hiding classes in a spread.',\n },\n },\n create(context) {\n return {\n JSXAttribute(node: any) {\n if (node.name?.type === 'JSXIdentifier' && node.name.name === 'classList')\n context.report({ node, messageId: 'classList' })\n },\n JSXSpreadAttribute(node: any) {\n if (objectHasStaticProperty(node.argument, 'classList'))\n context.report({ node, messageId: 'classListSpread' })\n },\n }\n },\n}\n\ninterface RawElementOptions {\n /** Element names this rule should not report (rare; prefer fixing the file). */\n allow?: string[]\n /** Replaces the default report message. */\n message?: string\n}\n\nconst noRawInteractiveElements: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Interactive elements this package provides (button, input, textarea, select, option, label), including statically known Solid Dynamic tags, are composed from the package, not written as raw markup.',\n },\n schema: [\n {\n type: 'object',\n properties: {\n allow: { type: 'array', items: { type: 'string' } },\n message: { type: 'string' },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n rawElement:\n '{{element}} is provided by the design system: use {{primitive}} from {{path}}. A raw element has no keyboard story, no focus behaviour and no token styling — that is the work the primitive already did.',\n },\n },\n create(context) {\n const options = (context.options?.[0] ?? {}) as RawElementOptions\n const allowed = new Set(options.allow ?? [])\n const dynamicImports: SolidDynamicImports = {\n named: new WeakSet(),\n namespaces: new WeakSet(),\n }\n const emit = (node: unknown, element: string) => {\n const target = ELEMENT_PRIMITIVES[element]!\n context.report({\n node,\n messageId: 'rawElement',\n data: { element, primitive: target.primitive, path: target.path },\n ...(options.message ? { message: options.message } : {}),\n })\n }\n return {\n Program(node: any) {\n collectSolidDynamicImports(node, dynamicImports)\n },\n JSXOpeningElement(node: any) {\n for (const element of jsxElementNames(node, dynamicImports, context)) {\n if (!(element in ELEMENT_PRIMITIVES) || allowed.has(element)) continue\n emit(node, element)\n }\n },\n }\n },\n}\n\ninterface PrimitiveImportOptions {\n /** Package prefixes this rule reports. Defaults to the primitive libraries the ui package wraps. */\n packages?: string[]\n /** Replaces the default report message. */\n message?: string\n}\n\nconst DEFAULT_PRIMITIVE_PACKAGES = Object.freeze([\n '@kobalte/core',\n '@corvu',\n 'cmdk-solid',\n '@ark-ui',\n '@zag-js',\n '@radix-ui',\n 'radix-ui',\n '@base-ui-components',\n '@base-ui',\n])\n\n/**\n * The interactive ARIA roles an application can dress a generic element in, and\n * the published primitive that owns each role. Native anchors are not generic\n * elements, so their built-in link semantics are unaffected by the `link` entry.\n */\nconst ROLE_PRIMITIVES: Readonly<Record<string, { primitive: string; path: string }>> =\n Object.freeze({\n button: { primitive: 'Button', path: '@adea-ai/ui/components/ui/button' },\n link: { primitive: 'TextLink', path: '@adea-ai/ui/components/ui/text-link' },\n checkbox: { primitive: 'Checkbox', path: '@adea-ai/ui/components/ui/checkbox' },\n radio: { primitive: 'RadioGroupItem', path: '@adea-ai/ui/components/ui/radio-group' },\n radiogroup: { primitive: 'RadioGroup', path: '@adea-ai/ui/components/ui/radio-group' },\n switch: { primitive: 'Switch', path: '@adea-ai/ui/components/ui/switch' },\n tab: { primitive: 'TabsTrigger', path: '@adea-ai/ui/components/ui/tabs' },\n tablist: { primitive: 'TabsList', path: '@adea-ai/ui/components/ui/tabs' },\n tabpanel: { primitive: 'TabsContent', path: '@adea-ai/ui/components/ui/tabs' },\n option: { primitive: 'SelectItem', path: '@adea-ai/ui/components/ui/select' },\n listbox: { primitive: 'Select', path: '@adea-ai/ui/components/ui/select' },\n combobox: { primitive: 'Combobox', path: '@adea-ai/ui/components/ui/combobox' },\n searchbox: { primitive: 'Input', path: '@adea-ai/ui/components/ui/input' },\n menu: { primitive: 'DropdownMenuContent', path: '@adea-ai/ui/components/ui/dropdown-menu' },\n menuitem: { primitive: 'DropdownMenuItem', path: '@adea-ai/ui/components/ui/dropdown-menu' },\n menuitemcheckbox: {\n primitive: 'DropdownMenuCheckboxItem',\n path: '@adea-ai/ui/components/ui/dropdown-menu',\n },\n menuitemradio: {\n primitive: 'DropdownMenuRadioItem',\n path: '@adea-ai/ui/components/ui/dropdown-menu',\n },\n textbox: { primitive: 'Input', path: '@adea-ai/ui/components/ui/input' },\n tree: { primitive: 'Tree', path: '@adea-ai/ui/components/composites/tree' },\n treeitem: { primitive: 'TreeRow', path: '@adea-ai/ui/components/composites/tree' },\n })\n\n/**\n * The elements whose only job is layout or text. A click handler or a tabindex on\n * one of these is a control being hand-built out of a non-control.\n */\nconst GENERIC_ELEMENTS: ReadonlySet<string> = new Set([\n 'div',\n 'span',\n 'li',\n 'ul',\n 'ol',\n 'td',\n 'th',\n 'p',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'section',\n 'article',\n 'aside',\n 'header',\n 'footer',\n 'nav',\n 'main',\n 'img',\n 'svg',\n])\n\nconst CLICK_HANDLERS: ReadonlySet<string> = new Set(\n [\n 'onClick',\n 'onDblClick',\n 'onDoubleClick',\n 'onPointerDown',\n 'onPointerUp',\n 'onMouseDown',\n 'onMouseUp',\n 'onTouchStart',\n 'onTouchEnd',\n 'on:click',\n 'on:dblclick',\n 'on:pointerdown',\n 'on:pointerup',\n 'on:mousedown',\n 'on:mouseup',\n 'on:touchstart',\n 'on:touchend',\n ].flatMap((handler) => [handler, handler.toLowerCase()])\n)\n\ninterface InteractiveWrapperOptions {\n /** Element names this rule should not report (rare; prefer fixing the file). */\n allow?: string[]\n /** Also reject opaque generic-element props and Solid Dynamic tag overrides. */\n rejectUnknownSpreads?: boolean\n /** Replaces the default report message. */\n message?: string\n}\n\n/** Returns a const binding's immutable initializer, when its value is statically knowable. */\nconst constInitializer = (node: any, context: LintContext): any => {\n const variable = variableOf(node, context)\n const definition = variable?.defs?.[0]\n if (definition?.type !== 'Variable' || definition.parent?.kind !== 'const') return null\n return definition.node?.init ?? null\n}\n\n/** Reads literal strings through static branches and local const aliases. */\nconst staticStrings = (node: any, context?: LintContext, seen = new Set<unknown>()): string[] => {\n if (!node || seen.has(node)) return []\n seen.add(node)\n if (\n node.type === 'TSAsExpression' ||\n node.type === 'TSSatisfiesExpression' ||\n node.type === 'TSNonNullExpression'\n )\n return staticStrings(node.expression, context, seen)\n if (node?.type === 'Literal' && typeof node.value === 'string') return [node.value]\n if (node?.type === 'JSXExpressionContainer') return staticStrings(node.expression, context, seen)\n if (node?.type === 'ConditionalExpression')\n return [\n ...staticStrings(node.consequent, context, new Set(seen)),\n ...staticStrings(node.alternate, context, new Set(seen)),\n ]\n if (node?.type === 'LogicalExpression')\n return [\n ...staticStrings(node.left, context, new Set(seen)),\n ...staticStrings(node.right, context, new Set(seen)),\n ]\n if (node?.type === 'TemplateLiteral' && node.expressions.length === 0)\n return [node.quasis[0].value.cooked ?? node.quasis[0].value.raw]\n if (node?.type === 'Identifier' && context) {\n const initializer = constInitializer(node, context)\n return initializer ? staticStrings(initializer, context, seen) : []\n }\n return []\n}\n\ninterface SolidDynamicImports {\n named: WeakSet<object>\n namespaces: WeakSet<object>\n}\n\nconst collectSolidDynamicImport = (node: any, imports: SolidDynamicImports): void => {\n if (node.source?.value !== 'solid-js/web') return\n for (const specifier of node.specifiers ?? []) {\n if (specifier.type === 'ImportNamespaceSpecifier' && specifier.local)\n imports.namespaces.add(specifier.local)\n if (specifier.type !== 'ImportSpecifier') continue\n const imported = specifier.imported?.name ?? specifier.imported?.value\n if (imported === 'Dynamic' && specifier.local) imports.named.add(specifier.local)\n }\n}\n\nconst collectSolidDynamicImports = (program: any, imports: SolidDynamicImports): void => {\n for (const statement of program.body ?? [])\n if (statement.type === 'ImportDeclaration') collectSolidDynamicImport(statement, imports)\n}\n\nconst isImportedBinding = (node: any, bindings: WeakSet<object>, context: LintContext): boolean =>\n variableOf(node, context)?.identifiers?.some((identifier: object) => bindings.has(identifier)) ??\n false\n\nconst isSolidDynamic = (name: any, imports: SolidDynamicImports, context: LintContext): boolean => {\n if (name?.type === 'JSXIdentifier') return isImportedBinding(name, imports.named, context)\n return (\n name?.type === 'JSXMemberExpression' &&\n name.property?.name === 'Dynamic' &&\n name.object?.type === 'JSXIdentifier' &&\n isImportedBinding(name.object, imports.namespaces, context)\n )\n}\n\ninterface DynamicComponentResolution {\n values: any[]\n opaqueAfterKnownIntrinsic: boolean\n}\n\nconst valuesIncludeKnownIntrinsic = (values: any[], context: LintContext): boolean =>\n values\n .flatMap((value) => staticStrings(value, context))\n .some((element) => GENERIC_ELEMENTS.has(element) || element in ELEMENT_PRIMITIVES)\n\n/** Applies `component` assignments made by a spread, tracking opaque overrides. */\nconst applyDynamicComponentSpread = (\n node: any,\n resolution: DynamicComponentResolution,\n context: LintContext\n): DynamicComponentResolution => {\n while (\n node?.type === 'TSAsExpression' ||\n node?.type === 'TSSatisfiesExpression' ||\n node?.type === 'TSNonNullExpression'\n )\n node = node.expression\n if (!node || node.type !== 'ObjectExpression')\n return {\n values: [],\n opaqueAfterKnownIntrinsic:\n resolution.opaqueAfterKnownIntrinsic ||\n valuesIncludeKnownIntrinsic(resolution.values, context),\n }\n\n let current = resolution\n for (const property of node.properties ?? []) {\n if (property.type === 'SpreadElement') {\n current = applyDynamicComponentSpread(property.argument, current, context)\n continue\n }\n if (property.type !== 'Property') continue\n const key = staticPropertyKey(property.key, property.computed === true)\n if (key === 'component')\n current = { values: [property.value], opaqueAfterKnownIntrinsic: false }\n else if (property.computed && key === null)\n current = {\n values: [],\n opaqueAfterKnownIntrinsic:\n current.opaqueAfterKnownIntrinsic || valuesIncludeKnownIntrinsic(current.values, context),\n }\n }\n return current\n}\n\nconst dynamicComponentResolution = (\n node: any,\n context: LintContext\n): DynamicComponentResolution => {\n let resolution: DynamicComponentResolution = {\n values: [],\n opaqueAfterKnownIntrinsic: false,\n }\n for (const attribute of node.attributes ?? []) {\n if (attribute.type === 'JSXAttribute' && attribute.name?.name === 'component') {\n resolution = {\n values: attribute.value ? [attribute.value] : [],\n opaqueAfterKnownIntrinsic: false,\n }\n continue\n }\n if (attribute.type === 'JSXSpreadAttribute')\n resolution = applyDynamicComponentSpread(attribute.argument, resolution, context)\n }\n return resolution\n}\n\n/** Resolves native tags passed to Solid Dynamic while leaving component values alone. */\nconst jsxElementNames = (\n node: any,\n imports: SolidDynamicImports,\n context: LintContext\n): string[] => {\n if (isSolidDynamic(node.name, imports, context))\n return [\n ...new Set(\n dynamicComponentResolution(node, context).values.flatMap((value) =>\n staticStrings(value, context)\n )\n ),\n ]\n if (node.name?.type === 'JSXIdentifier') return [node.name.name]\n return []\n}\n\nconst roleOf = (node: any, context: LintContext): string | null => {\n for (const attribute of node.attributes ?? []) {\n if (attribute.type === 'JSXSpreadAttribute') {\n const role = staticObjectPropertyValues(attribute.argument, 'role')\n .flatMap((value) => staticStrings(value, context))\n .flatMap((value) => value.split(/\\s+/))\n .find((value) => value in ROLE_PRIMITIVES)\n if (role) return role\n continue\n }\n if (attribute.type !== 'JSXAttribute' || attribute.name?.name !== 'role') continue\n return (\n staticStrings(attribute.value, context)\n .flatMap((role) => role.split(/\\s+/))\n .find((role) => role in ROLE_PRIMITIVES) ?? null\n )\n }\n return null\n}\n\n/** Whether the element carries the attribute, by name. */\nconst has = (node: any, name: string): boolean =>\n (node.attributes ?? []).some(\n (attribute: any) =>\n (attribute.type === 'JSXAttribute' &&\n (attribute.name?.type === 'JSXNamespacedName'\n ? `${attribute.name.namespace.name}:${attribute.name.name.name}`\n : attribute.name?.name) === name) ||\n (attribute.type === 'JSXSpreadAttribute' && objectHasStaticProperty(attribute.argument, name))\n )\n\nconst tabStopValue = (value: any): boolean => {\n const expression = value?.type === 'JSXExpressionContainer' ? value.expression : value\n if (expression?.type === 'Literal') return !(Number(expression.value) < 0)\n if (\n expression?.type === 'UnaryExpression' &&\n expression.operator === '-' &&\n expression.argument?.type === 'Literal'\n )\n return !(Number(expression.argument.value) > 0)\n return true\n}\n\nconst hasTabStop = (node: any): boolean =>\n (node.attributes ?? []).some((attribute: any) => {\n if (\n attribute.type === 'JSXAttribute' &&\n ['tabIndex', 'tabindex'].includes(attribute.name?.name)\n )\n return tabStopValue(attribute.value)\n if (attribute.type === 'JSXSpreadAttribute')\n return ['tabIndex', 'tabindex'].some((name) =>\n staticObjectPropertyValues(attribute.argument, name).some(tabStopValue)\n )\n return false\n })\n\n/** Unknown/computed props make a JSX object spread opaque to interaction checks. */\nconst opaqueSpread = (node: any, seen = new Set<unknown>()): boolean => {\n while (\n node?.type === 'TSAsExpression' ||\n node?.type === 'TSSatisfiesExpression' ||\n node?.type === 'TSNonNullExpression'\n )\n node = node.expression\n if (!node || seen.has(node) || node.type !== 'ObjectExpression') return true\n seen.add(node)\n return node.properties.some((property: any) => {\n if (property.type === 'SpreadElement') return opaqueSpread(property.argument, seen)\n if (property.type !== 'Property') return true\n return staticPropertyKey(property.key, property.computed === true) === null\n })\n}\n\nconst hasOpaqueSpread = (node: any): boolean =>\n (node.attributes ?? []).some(\n (attribute: any) => attribute.type === 'JSXSpreadAttribute' && opaqueSpread(attribute.argument)\n )\n\nconst noInteractiveWrappers: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Generic elements dressed as interactive controls — an interactive role, a click handler or a tabindex on a layout element — re-implement a primitive by hand. Compose the real component.',\n },\n schema: [\n {\n type: 'object',\n properties: {\n allow: { type: 'array', items: { type: 'string' } },\n rejectUnknownSpreads: { type: 'boolean' },\n message: { type: 'string' },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n roleWrapper:\n 'A {{element}} with role=\"{{role}}\" hand-builds {{primitive}}: use {{primitive}} from {{path}}. The primitive brings keyboard activation, focus behaviour and ARIA wiring; the wrapper re-implements them badly.',\n clickWrapper:\n 'A click handler on {{element}} composes {{primitive}} by hand: use {{primitive}} from {{path}}. A div that reacts to clicks is a button that cannot be reached by keyboard.',\n tabindexWrapper:\n 'A tabindex on {{element}} makes a layout element focusable, which is focus management the primitives already own: compose the real component instead.',\n opaqueSpreadWrapper:\n 'A spread on {{element}} may hide a role, activation handler, or tab stop. Pass statically named props or compose the shared component instead.',\n opaqueDynamicComponentWrapper:\n 'An opaque spread follows a known raw design-system or generic tag on Solid Dynamic and may replace the tag or hide interactive props. Pass statically named props or a shared component so the interaction rule can inspect the final component.',\n },\n },\n create(context) {\n const options = (context.options?.[0] ?? {}) as InteractiveWrapperOptions\n const allowed = new Set(options.allow ?? [])\n const dynamicImports: SolidDynamicImports = {\n named: new WeakSet(),\n namespaces: new WeakSet(),\n }\n return {\n Program(node: any) {\n collectSolidDynamicImports(node, dynamicImports)\n },\n JSXOpeningElement(node: any) {\n if (options.rejectUnknownSpreads && isSolidDynamic(node.name, dynamicImports, context)) {\n const resolution = dynamicComponentResolution(node, context)\n if (resolution.opaqueAfterKnownIntrinsic) {\n context.report({\n node,\n messageId: 'opaqueDynamicComponentWrapper',\n ...(options.message ? { message: options.message } : {}),\n })\n return\n }\n }\n\n for (const element of jsxElementNames(node, dynamicImports, context)) {\n if (allowed.has(element) || element in ELEMENT_PRIMITIVES) continue\n // Capitalized JSX components are composed controls, not raw elements.\n // Solid Dynamic is resolved above only when its component is a known tag.\n if (element[0] === element[0]?.toUpperCase()) continue\n if (!GENERIC_ELEMENTS.has(element)) continue\n\n if (options.rejectUnknownSpreads && hasOpaqueSpread(node)) {\n context.report({\n node,\n messageId: 'opaqueSpreadWrapper',\n data: { element },\n ...(options.message ? { message: options.message } : {}),\n })\n break\n }\n\n const role = roleOf(node, context)\n if (role && role in ROLE_PRIMITIVES) {\n const target = ROLE_PRIMITIVES[role]!\n context.report({\n node,\n messageId: 'roleWrapper',\n data: { element, role, primitive: target.primitive, path: target.path },\n ...(options.message ? { message: options.message } : {}),\n })\n continue\n }\n\n const click = [...CLICK_HANDLERS].find((handler) => has(node, handler))\n if (click) {\n const target = ROLE_PRIMITIVES.button!\n context.report({\n node,\n messageId: 'clickWrapper',\n data: { element, primitive: target.primitive, path: target.path },\n ...(options.message ? { message: options.message } : {}),\n })\n continue\n }\n if (hasTabStop(node))\n context.report({\n node,\n messageId: 'tabindexWrapper',\n data: { element },\n ...(options.message ? { message: options.message } : {}),\n })\n }\n },\n }\n },\n}\n\nconst BUTTON_MODULE = '@adea-ai/ui/components/ui/button'\nconst ACTION_BUTTON_MODULE = '@adea-ai/ui/components/composites/action-button'\nconst ICON_BUTTON_SIZES: ReadonlySet<string> = new Set([\n 'icon-2xs',\n 'icon-xs',\n 'icon-sm',\n 'icon-md',\n 'icon-lg',\n 'icon-xl',\n 'icon-2xl',\n])\n\nconst staticJsxValues = (value: any): any[] =>\n value?.type === 'JSXExpressionContainer' ? [value.expression] : value ? [value] : []\n\nconst attributeValues = (node: any, name: string): any[] => {\n const values: any[] = []\n for (const attribute of node.attributes ?? []) {\n if (attribute.type === 'JSXAttribute' && attribute.name?.name === name)\n values.splice(0, values.length, ...staticJsxValues(attribute.value))\n if (attribute.type === 'JSXSpreadAttribute') {\n const spreadValues = staticObjectPropertyValues(attribute.argument, name)\n if (spreadValues.length > 0) values.splice(0, values.length, spreadValues.at(-1))\n }\n }\n return values\n}\n\nconst staticStringValue = (node: any): string | null => {\n if (node?.type === 'Literal' && typeof node.value === 'string') return node.value\n if (node?.type === 'TemplateLiteral' && node.expressions.length === 0)\n return node.quasis[0].value.cooked ?? node.quasis[0].value.raw\n return null\n}\n\ninterface ImportedJsxBindings {\n named: WeakSet<object>\n namespaces: WeakSet<object>\n}\n\nconst isImportedJsxComponent = (\n name: any,\n imports: ImportedJsxBindings,\n context: LintContext,\n namespaceExport?: string\n): boolean => {\n if (name?.type === 'JSXIdentifier' || name?.type === 'Identifier')\n return isImportedBinding(name, imports.named, context)\n const memberName = name?.property?.name\n return (\n (name?.type === 'JSXMemberExpression' || name?.type === 'MemberExpression') &&\n (name.object?.type === 'JSXIdentifier' || name.object?.type === 'Identifier') &&\n (name.property?.type === 'JSXIdentifier' || name.property?.type === 'Identifier') &&\n (namespaceExport ? memberName === namespaceExport : /^[A-Z]/.test(memberName ?? '')) &&\n isImportedBinding(name.object, imports.namespaces, context)\n )\n}\n\ntype IconChildKind = 'empty' | 'icon' | 'text' | 'unknown'\n\nconst CONTENT_OVERRIDE_PROPS = new Set([\n 'children',\n 'dangerouslySetInnerHTML',\n 'innerHTML',\n 'textContent',\n])\n\n/** Opaque spreads and objects containing content props may override children. */\nconst spreadMayOverrideContent = (argument: any): boolean => {\n while (\n argument?.type === 'TSAsExpression' ||\n argument?.type === 'TSSatisfiesExpression' ||\n argument?.type === 'TSNonNullExpression'\n )\n argument = argument.expression\n if (argument?.type !== 'ObjectExpression') return true\n return argument.properties.some((property: any) => {\n if (property.type !== 'Property') return true\n const key = staticPropertyKey(property.key, property.computed === true)\n return key === null || CONTENT_OVERRIDE_PROPS.has(key)\n })\n}\n\nconst hasContentOverride = (openingElement: any): boolean =>\n (openingElement?.attributes ?? []).some((attribute: any) => {\n if (attribute.type === 'JSXSpreadAttribute') return spreadMayOverrideContent(attribute.argument)\n return (\n attribute.type === 'JSXAttribute' &&\n attribute.name?.type === 'JSXIdentifier' &&\n CONTENT_OVERRIDE_PROPS.has(attribute.name.name)\n )\n })\n\nconst iconChildrenKind = (\n children: any[],\n icons: ImportedJsxBindings,\n context: LintContext\n): IconChildKind => {\n let hasIcon = false\n for (const child of children) {\n const kind = iconChildKind(child, icons, context)\n if (kind === 'text' || kind === 'unknown') return kind\n if (kind === 'icon') hasIcon = true\n }\n return hasIcon ? 'icon' : 'empty'\n}\n\nconst SVG_TEXT_CONTAINERS = new Set(['text', 'foreignObject'])\n\n/** A raw SVG may be labelled or contain dynamic text instead of an icon. */\nconst svgMayContainVisibleText = (children: any[]): boolean => {\n for (const child of children) {\n if (!child) return true\n if (child.type === 'JSXText') {\n if (String(child.value ?? '').trim()) return true\n continue\n }\n if (child.type === 'JSXFragment') {\n if (svgMayContainVisibleText(child.children ?? [])) return true\n continue\n }\n if (child.type === 'JSXExpressionContainer') {\n const expression = child.expression\n if (!expression || expression.type === 'JSXEmptyExpression') continue\n if (expression.type === 'JSXElement' || expression.type === 'JSXFragment') {\n if (\n svgMayContainVisibleText(\n expression.type === 'JSXElement' ? [expression] : (expression.children ?? [])\n )\n )\n return true\n continue\n }\n const text = staticStringValue(expression)\n if (text !== null) {\n if (text.trim()) return true\n continue\n }\n if (\n expression.type === 'Literal' &&\n (expression.value === null || typeof expression.value === 'boolean')\n )\n continue\n return true\n }\n if (child.type !== 'JSXElement') return true\n\n const name = child.openingElement?.name\n if (name?.type !== 'JSXIdentifier') return true\n if (SVG_TEXT_CONTAINERS.has(name.name)) return true\n if (hasContentOverride(child.openingElement)) return true\n if (name.name === 'title' || name.name === 'desc') continue\n if (!/^[a-z]/.test(name.name) || name.name.includes('-')) return true\n if (svgMayContainVisibleText(child.children ?? [])) return true\n }\n return false\n}\n\n/**\n * Proves only the uncomplicated icon-only forms that can be read without\n * executing Solid expressions: imported Lucide components, raw SVG, fragments,\n * whitespace, and spans that contain only those forms.\n */\nconst iconChildKind = (\n child: any,\n icons: ImportedJsxBindings,\n context: LintContext\n): IconChildKind => {\n if (!child) return 'unknown'\n if (child.type === 'JSXText') return String(child.value ?? '').trim() ? 'text' : 'empty'\n if (child.type === 'JSXFragment') return iconChildrenKind(child.children ?? [], icons, context)\n if (child.type === 'JSXExpressionContainer') {\n const expression = child.expression\n if (!expression || expression.type === 'JSXEmptyExpression') return 'empty'\n if (expression.type === 'JSXElement' || expression.type === 'JSXFragment')\n return iconChildKind(expression, icons, context)\n const text = staticStringValue(expression)\n if (text !== null) return text.trim() ? 'text' : 'empty'\n if (\n expression.type === 'Literal' &&\n (expression.value === null || typeof expression.value === 'boolean')\n )\n return 'empty'\n if (expression.type === 'Literal' && typeof expression.value === 'number') return 'text'\n return 'unknown'\n }\n if (child.type !== 'JSXElement') return 'unknown'\n\n const name = child.openingElement?.name\n if (name?.type === 'JSXIdentifier' && name.name === 'svg')\n return hasContentOverride(child.openingElement) ||\n svgMayContainVisibleText(child.children ?? [])\n ? 'unknown'\n : 'icon'\n if (isImportedJsxComponent(name, icons, context))\n return hasContentOverride(child.openingElement) ? 'unknown' : 'icon'\n if (name?.type === 'JSXIdentifier' && name.name === 'span') {\n if (hasContentOverride(child.openingElement)) return 'unknown'\n return iconChildrenKind(child.children ?? [], icons, context)\n }\n return 'unknown'\n}\n\nconst hasStaticallyIconOnlyChildren = (\n node: any,\n icons: ImportedJsxBindings,\n context: LintContext\n): boolean => {\n return (\n !hasContentOverride(node.openingElement) &&\n iconChildrenKind(node.children ?? [], icons, context) === 'icon'\n )\n}\n\nconst isIconButtonSize = (node: any): boolean =>\n attributeValues(node, 'size').some((value) => {\n const size = staticStringValue(value)\n return size !== null && ICON_BUTTON_SIZES.has(size)\n })\n\nconst actionTooltipStatus = (node: any): 'valid' | 'blank' | 'unknown' | 'missing' => {\n const values = attributeValues(node, 'tooltip')\n if (values.length === 0) return 'missing'\n const strings = values.map(staticStringValue)\n if (strings.some((value) => value !== null && value.trim().length > 0)) return 'valid'\n if (strings.every((value) => value !== null)) return 'blank'\n return 'unknown'\n}\n\n/** Requires shared icon actions to carry the shared explanatory-tooltip contract. */\nconst requireActionButtonTooltip: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Icon-sized shared Buttons and statically proven icon-only Buttons use ActionButton with a tooltip; icon-only ActionButtons need one too.',\n },\n schema: [],\n messages: {\n useActionButton:\n 'Icon-size or icon-only Button actions must use ActionButton with a nonblank tooltip. Keep the control name in aria-label; the tooltip explains the action.',\n missingTooltip:\n 'An icon-size or icon-only ActionButton needs a supplied nonblank tooltip. Keep its accessible name in aria-label as well.',\n },\n },\n create(context) {\n const buttons: ImportedJsxBindings = { named: new WeakSet(), namespaces: new WeakSet() }\n const actionButtons: ImportedJsxBindings = { named: new WeakSet(), namespaces: new WeakSet() }\n const icons: ImportedJsxBindings = { named: new WeakSet(), namespaces: new WeakSet() }\n const recordImports = (node: any) => {\n const source = node.source?.value\n const target =\n source === BUTTON_MODULE ? buttons : source === ACTION_BUTTON_MODULE ? actionButtons : null\n if (source === 'lucide-solid') {\n if (node.importKind === 'type') return\n for (const specifier of node.specifiers ?? []) {\n if (!specifier.local || specifier.importKind === 'type') continue\n if (specifier.type === 'ImportNamespaceSpecifier') icons.namespaces.add(specifier.local)\n else if (specifier.type === 'ImportSpecifier') {\n const imported = specifier.imported?.name ?? specifier.imported?.value\n if (typeof imported === 'string' && /^[A-Z]/.test(imported))\n icons.named.add(specifier.local)\n }\n }\n return\n }\n if (!target) return\n if (node.importKind === 'type') return\n for (const specifier of node.specifiers ?? []) {\n if (specifier.type === 'ImportNamespaceSpecifier' && specifier.local) {\n target.namespaces.add(specifier.local)\n continue\n }\n if (\n specifier.type !== 'ImportSpecifier' ||\n !specifier.local ||\n specifier.importKind === 'type'\n )\n continue\n const imported = specifier.imported?.name ?? specifier.imported?.value\n if (\n (source === BUTTON_MODULE && imported === 'Button') ||\n (source === ACTION_BUTTON_MODULE && imported === 'ActionButton')\n )\n target.named.add(specifier.local)\n }\n }\n\n return {\n Program(node: any) {\n for (const statement of node.body ?? [])\n if (statement.type === 'ImportDeclaration') recordImports(statement)\n },\n JSXElement(node: any) {\n const opening = node.openingElement\n const isButton = isImportedJsxComponent(opening.name, buttons, context, 'Button')\n const isActionButton = isImportedJsxComponent(\n opening.name,\n actionButtons,\n context,\n 'ActionButton'\n )\n const asValues = attributeValues(opening, 'as')\n const targetsButton = asValues.some((value) =>\n isImportedJsxComponent(value, buttons, context, 'Button')\n )\n const targetsActionButton = asValues.some((value) =>\n isImportedJsxComponent(value, actionButtons, context, 'ActionButton')\n )\n if (!isButton && !isActionButton && !targetsButton && !targetsActionButton) return\n const iconSized = isIconButtonSize(opening)\n if (!iconSized && !hasStaticallyIconOnlyChildren(node, icons, context)) return\n if (isButton || targetsButton) {\n context.report({ node: opening, messageId: 'useActionButton' })\n return\n }\n if (!isActionButton && !targetsActionButton) return\n const status = actionTooltipStatus(opening)\n if (status === 'missing' || status === 'blank')\n context.report({ node: opening, messageId: 'missingTooltip' })\n },\n }\n },\n}\n\nconst noPrimitiveLibraryImports: RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'The primitive libraries the design system is built on (Kobalte and friends) are its internal affair — compose the exported components instead of importing the primitives.',\n },\n schema: [\n {\n type: 'object',\n properties: {\n packages: { type: 'array', items: { type: 'string' } },\n message: { type: 'string' },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n primitiveImport:\n 'Import from the design system, not from {{package}}: the primitives it wraps carry the focus, keyboard and ARIA behaviour the components exist to provide.',\n },\n },\n create(context) {\n const options = (context.options?.[0] ?? {}) as PrimitiveImportOptions\n const prefixes = options.packages ?? DEFAULT_PRIMITIVE_PACKAGES\n const offender = (source: unknown): string | null => {\n const name = String(source ?? '')\n return prefixes.find((prefix) => name === prefix || name.startsWith(`${prefix}/`)) ?? null\n }\n const report = (node: unknown, source: unknown) => {\n const pkg = offender(source)!\n context.report({\n node,\n messageId: 'primitiveImport',\n data: { package: pkg },\n ...(options.message ? { message: options.message } : {}),\n })\n }\n return {\n ImportDeclaration(node: any) {\n if (offender(node.source?.value)) report(node, node.source.value)\n },\n ImportExpression(node: any) {\n if (typeof node.source?.value === 'string' && offender(node.source.value))\n report(node, node.source.value)\n },\n ExportNamedDeclaration(node: any) {\n if (offender(node.source?.value)) report(node, node.source.value)\n },\n ExportAllDeclaration(node: any) {\n if (offender(node.source?.value)) report(node, node.source.value)\n },\n CallExpression(node: any) {\n if (node.callee?.type !== 'Identifier' || node.callee.name !== 'require') return\n const source = node.arguments?.[0]?.value\n if (typeof source === 'string' && offender(source)) report(node, source)\n },\n }\n },\n}\n\nconst plugin = {\n meta: { name: 'adea' },\n rules: {\n 'no-inline-styles': noInlineStyles,\n 'no-class-list': noClassList,\n 'no-raw-interactive-elements': noRawInteractiveElements,\n 'no-primitive-library-imports': noPrimitiveLibraryImports,\n 'no-interactive-wrappers': noInteractiveWrappers,\n 'require-action-button-tooltip': requireActionButtonTooltip,\n },\n}\n\nexport default plugin\n"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "contextual-sidebar",
|
|
3
|
+
"type": "registry:ui",
|
|
4
|
+
"title": "Contextual Sidebar",
|
|
5
|
+
"description": "",
|
|
6
|
+
"dependencies": [],
|
|
7
|
+
"registryDependencies": [
|
|
8
|
+
"@adea-ai/ui/pixel-resize-handle",
|
|
9
|
+
"@adea-ai/ui/sheet",
|
|
10
|
+
"@adea-ai/ui/sidebar-nav",
|
|
11
|
+
"lib"
|
|
12
|
+
],
|
|
13
|
+
"files": [
|
|
14
|
+
{
|
|
15
|
+
"path": "src/components/layout/contextual-sidebar/contextual-sidebar.tsx",
|
|
16
|
+
"type": "registry:ui",
|
|
17
|
+
"target": "components/layout/contextual-sidebar/contextual-sidebar.tsx"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "src/components/layout/contextual-sidebar/index.ts",
|
|
21
|
+
"type": "registry:ui",
|
|
22
|
+
"target": "components/layout/contextual-sidebar/index.ts"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pixel-resize-handle",
|
|
3
|
+
"type": "registry:ui",
|
|
4
|
+
"title": "Pixel Resize Handle",
|
|
5
|
+
"description": "",
|
|
6
|
+
"dependencies": [],
|
|
7
|
+
"registryDependencies": [
|
|
8
|
+
"@adea-ai/ui/resizable",
|
|
9
|
+
"lib"
|
|
10
|
+
],
|
|
11
|
+
"files": [
|
|
12
|
+
{
|
|
13
|
+
"path": "src/components/layout/pixel-resize-handle/index.ts",
|
|
14
|
+
"type": "registry:ui",
|
|
15
|
+
"target": "components/layout/pixel-resize-handle/index.ts"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"path": "src/components/layout/pixel-resize-handle/pixel-resize-handle.tsx",
|
|
19
|
+
"type": "registry:ui",
|
|
20
|
+
"target": "components/layout/pixel-resize-handle/pixel-resize-handle.tsx"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
package/dist/r/registry.json
CHANGED
|
@@ -1555,6 +1555,31 @@
|
|
|
1555
1555
|
}
|
|
1556
1556
|
]
|
|
1557
1557
|
},
|
|
1558
|
+
{
|
|
1559
|
+
"name": "contextual-sidebar",
|
|
1560
|
+
"type": "registry:ui",
|
|
1561
|
+
"title": "Contextual Sidebar",
|
|
1562
|
+
"description": "",
|
|
1563
|
+
"dependencies": [],
|
|
1564
|
+
"registryDependencies": [
|
|
1565
|
+
"@adea-ai/ui/pixel-resize-handle",
|
|
1566
|
+
"@adea-ai/ui/sheet",
|
|
1567
|
+
"@adea-ai/ui/sidebar-nav",
|
|
1568
|
+
"lib"
|
|
1569
|
+
],
|
|
1570
|
+
"files": [
|
|
1571
|
+
{
|
|
1572
|
+
"path": "src/components/layout/contextual-sidebar/contextual-sidebar.tsx",
|
|
1573
|
+
"type": "registry:ui",
|
|
1574
|
+
"target": "components/layout/contextual-sidebar/contextual-sidebar.tsx"
|
|
1575
|
+
},
|
|
1576
|
+
{
|
|
1577
|
+
"path": "src/components/layout/contextual-sidebar/index.ts",
|
|
1578
|
+
"type": "registry:ui",
|
|
1579
|
+
"target": "components/layout/contextual-sidebar/index.ts"
|
|
1580
|
+
}
|
|
1581
|
+
]
|
|
1582
|
+
},
|
|
1558
1583
|
{
|
|
1559
1584
|
"name": "floating-preview",
|
|
1560
1585
|
"type": "registry:ui",
|
|
@@ -1652,6 +1677,29 @@
|
|
|
1652
1677
|
}
|
|
1653
1678
|
]
|
|
1654
1679
|
},
|
|
1680
|
+
{
|
|
1681
|
+
"name": "pixel-resize-handle",
|
|
1682
|
+
"type": "registry:ui",
|
|
1683
|
+
"title": "Pixel Resize Handle",
|
|
1684
|
+
"description": "",
|
|
1685
|
+
"dependencies": [],
|
|
1686
|
+
"registryDependencies": [
|
|
1687
|
+
"@adea-ai/ui/resizable",
|
|
1688
|
+
"lib"
|
|
1689
|
+
],
|
|
1690
|
+
"files": [
|
|
1691
|
+
{
|
|
1692
|
+
"path": "src/components/layout/pixel-resize-handle/index.ts",
|
|
1693
|
+
"type": "registry:ui",
|
|
1694
|
+
"target": "components/layout/pixel-resize-handle/index.ts"
|
|
1695
|
+
},
|
|
1696
|
+
{
|
|
1697
|
+
"path": "src/components/layout/pixel-resize-handle/pixel-resize-handle.tsx",
|
|
1698
|
+
"type": "registry:ui",
|
|
1699
|
+
"target": "components/layout/pixel-resize-handle/pixel-resize-handle.tsx"
|
|
1700
|
+
}
|
|
1701
|
+
]
|
|
1702
|
+
},
|
|
1655
1703
|
{
|
|
1656
1704
|
"name": "side-rail",
|
|
1657
1705
|
"type": "registry:ui",
|
|
@@ -1687,11 +1735,11 @@
|
|
|
1687
1735
|
"title": "Sidebar Nav",
|
|
1688
1736
|
"description": "",
|
|
1689
1737
|
"dependencies": [
|
|
1690
|
-
"@corvu/resizable@^0.2.5",
|
|
1691
1738
|
"@kobalte/core@^0.13.14",
|
|
1692
1739
|
"lucide-solid@^1.51.0"
|
|
1693
1740
|
],
|
|
1694
1741
|
"registryDependencies": [
|
|
1742
|
+
"@adea-ai/ui/pixel-resize-handle",
|
|
1695
1743
|
"lib"
|
|
1696
1744
|
],
|
|
1697
1745
|
"files": [
|
|
@@ -1918,7 +1966,7 @@
|
|
|
1918
1966
|
"@adea-ai/ui/button",
|
|
1919
1967
|
"@adea-ai/ui/dropdown-menu",
|
|
1920
1968
|
"@adea-ai/ui/input",
|
|
1921
|
-
"@adea-ai/ui/
|
|
1969
|
+
"@adea-ai/ui/sheet",
|
|
1922
1970
|
"@adea-ai/ui/switch",
|
|
1923
1971
|
"@adea-ai/ui/theme",
|
|
1924
1972
|
"lib"
|
package/dist/r/sidebar-nav.json
CHANGED
|
@@ -41,12 +41,15 @@ import { DEFAULT_APPEARANCE_EDITOR_FONT_SETTINGS } from '../../../lib/appearance
|
|
|
41
41
|
|
|
42
42
|
import { Switch } from '../../ui/switch/switch'
|
|
43
43
|
import {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
Sheet,
|
|
45
|
+
SheetBody,
|
|
46
|
+
SheetContent,
|
|
47
|
+
SheetDescription,
|
|
48
|
+
SheetFooter,
|
|
49
|
+
SheetHeader,
|
|
50
|
+
SheetTitle,
|
|
51
|
+
SheetTrigger,
|
|
52
|
+
} from '../../ui/sheet/sheet'
|
|
50
53
|
import type { AppearanceEditorProps, AppearancePopoverProps } from './appearance-types'
|
|
51
54
|
import { ModeChoices, AccentChoices, GlassChoices, isCustomAccent } from './appearance-choices'
|
|
52
55
|
import { SettingsRow, TerminalRow, ThemeRow } from './appearance-rows'
|
|
@@ -61,7 +64,6 @@ import { SettingsRow, TerminalRow, ThemeRow } from './appearance-rows'
|
|
|
61
64
|
*/
|
|
62
65
|
export function AppearanceEditor(props: AppearanceEditorProps) {
|
|
63
66
|
const errorId = createUniqueId()
|
|
64
|
-
const saveReasonId = createUniqueId()
|
|
65
67
|
const custom = () => isCustomAccent(props)
|
|
66
68
|
const accentDescription = () => {
|
|
67
69
|
if (props.draft.accent === 'theme') return "Theme default · Uses the palette's intended color."
|
|
@@ -188,15 +190,35 @@ export function AppearanceEditor(props: AppearanceEditorProps) {
|
|
|
188
190
|
</Button>
|
|
189
191
|
</SettingsRow>
|
|
190
192
|
</div>
|
|
193
|
+
<Show when={!props.hideActions}>
|
|
194
|
+
{/* Sticky so Save/Cancel stay reachable in a tall scroll container: the
|
|
195
|
+
editor scrolls with its host panel, and actions parked at the bottom
|
|
196
|
+
of a long form were unreachable without scrolling past every row. */}
|
|
197
|
+
<div class="sticky bottom-0 z-10 mt-2 border-t bg-background px-4 py-3">
|
|
198
|
+
<AppearanceEditorActions {...props} />
|
|
199
|
+
</div>
|
|
200
|
+
</Show>
|
|
201
|
+
</div>
|
|
202
|
+
)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Reset, Cancel and Save, with the reason Save is unavailable. Rendered by the
|
|
207
|
+
* editor itself, or — with `hideActions` — by a host that pins them in its own
|
|
208
|
+
* footer, as `AppearancePopover` does.
|
|
209
|
+
*/
|
|
210
|
+
export function AppearanceEditorActions(props: AppearanceEditorProps) {
|
|
211
|
+
const saveReasonId = createUniqueId()
|
|
212
|
+
return (
|
|
213
|
+
<div class="flex w-full flex-col gap-2">
|
|
191
214
|
<Show when={props.saveDisabledReason}>
|
|
192
|
-
<p id={saveReasonId} role="status" class="
|
|
215
|
+
<p id={saveReasonId} role="status" class="text-xs text-muted-foreground">
|
|
193
216
|
{props.saveDisabledReason}
|
|
194
217
|
</p>
|
|
195
218
|
</Show>
|
|
196
|
-
{/*
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
<div class="global-appearance-editor-actions sticky bottom-0 z-10 mt-2 flex flex-wrap items-center gap-2 border-t bg-background px-4 py-3">
|
|
219
|
+
{/* `global-appearance-editor-actions` lets these buttons grow with the UI
|
|
220
|
+
font preference, like the rest of Appearance's own controls. */}
|
|
221
|
+
<div class="global-appearance-editor-actions flex flex-wrap items-center gap-2">
|
|
200
222
|
<Button
|
|
201
223
|
type="button"
|
|
202
224
|
size="sm"
|
|
@@ -232,19 +254,15 @@ export function AppearanceEditor(props: AppearanceEditorProps) {
|
|
|
232
254
|
)
|
|
233
255
|
}
|
|
234
256
|
|
|
235
|
-
/**
|
|
236
|
-
*
|
|
237
|
-
*
|
|
257
|
+
/** The editor in an inset Sheet docked beside the main view: the body scrolls and
|
|
258
|
+
* Reset/Cancel/Save sit in the panel's full-width footer, always reachable.
|
|
259
|
+
* Dismissal (Escape, the close button, an outside click) is `onDismiss`. */
|
|
238
260
|
export function AppearancePopover(props: AppearancePopoverProps) {
|
|
239
261
|
const [menuPortalMount, setMenuPortalMount] = createSignal<HTMLElement>()
|
|
240
262
|
|
|
241
263
|
return (
|
|
242
|
-
<
|
|
243
|
-
|
|
244
|
-
modal
|
|
245
|
-
onOpenChange={(open) => (open ? props.onOpen() : props.onDismiss())}
|
|
246
|
-
>
|
|
247
|
-
<PopoverTrigger
|
|
264
|
+
<Sheet open={props.open} onOpenChange={(open) => (open ? props.onOpen() : props.onDismiss())}>
|
|
265
|
+
<SheetTrigger
|
|
248
266
|
as={Button}
|
|
249
267
|
type="button"
|
|
250
268
|
variant="ghost"
|
|
@@ -252,17 +270,21 @@ export function AppearancePopover(props: AppearancePopoverProps) {
|
|
|
252
270
|
aria-label="Appearance settings"
|
|
253
271
|
>
|
|
254
272
|
<Palette />
|
|
255
|
-
</
|
|
256
|
-
<
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
273
|
+
</SheetTrigger>
|
|
274
|
+
<SheetContent side="end" closeLabel="Close appearance settings" ref={setMenuPortalMount}>
|
|
275
|
+
<SheetHeader>
|
|
276
|
+
<SheetTitle>Appearance</SheetTitle>
|
|
277
|
+
<SheetDescription>
|
|
278
|
+
Changes preview immediately. Save keeps them; Cancel restores the previous appearance.
|
|
279
|
+
</SheetDescription>
|
|
280
|
+
</SheetHeader>
|
|
281
|
+
<SheetBody>
|
|
282
|
+
<AppearanceEditor {...props} menuPortalMount={menuPortalMount()} hideActions />
|
|
283
|
+
</SheetBody>
|
|
284
|
+
<SheetFooter>
|
|
285
|
+
<AppearanceEditorActions {...props} />
|
|
286
|
+
</SheetFooter>
|
|
287
|
+
</SheetContent>
|
|
288
|
+
</Sheet>
|
|
267
289
|
)
|
|
268
290
|
}
|
|
@@ -55,6 +55,8 @@ export type AppearanceEditorProps = {
|
|
|
55
55
|
/** Mount nested font menus inside the containing overlay when one exists. */
|
|
56
56
|
menuPortalMount?: HTMLElement
|
|
57
57
|
class?: string
|
|
58
|
+
/** Leave Reset/Cancel/Save to the host, which renders `AppearanceEditorActions`. */
|
|
59
|
+
hideActions?: boolean
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
export type AppearancePopoverProps = AppearanceEditorProps & {
|