diff --git a/.vscode/settings.json b/.vscode/settings.json index cabf3fcc..6c242e3c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,5 +22,12 @@ ], "[svelte]": { "editor.defaultFormatter": "esbenp.prettier-vscode" - } + }, + "cSpell.words": [ + "activedescendant", + "combobox", + "listbox", + "radiobox", + "viamrobotics" + ] } diff --git a/packages/core/.eslintrc.cjs b/packages/core/.eslintrc.cjs index c172db4b..baa52fdb 100644 --- a/packages/core/.eslintrc.cjs +++ b/packages/core/.eslintrc.cjs @@ -22,6 +22,8 @@ module.exports = { rules: { // TODO(mc, 2023-12-15): remove overrides, fix issues '@typescript-eslint/no-non-null-assertion': 'warn', + // TODO(mc, 2024-01-03): move to base config? + 'multiline-comment-style': 'off', }, overrides: [ { @@ -37,5 +39,12 @@ module.exports = { '@typescript-eslint/no-unsafe-assignment': 'off', }, }, + // TODO(mc, 2024-01-03): remove when no-non-null-assertion errors fixed + { + files: ['**/__tests__/**'], + rules: { + '@typescript-eslint/no-non-null-assertion': 'off', + }, + }, ], }; diff --git a/packages/core/src/lib/floating/floating-style.ts b/packages/core/src/lib/floating/floating-style.ts index fb1f34ff..8b16d4dd 100644 --- a/packages/core/src/lib/floating/floating-style.ts +++ b/packages/core/src/lib/floating/floating-style.ts @@ -6,6 +6,7 @@ import { flip as flipMiddleware, shift as shiftMiddleware, arrow as arrowMiddleware, + size as sizeMiddleware, type Placement, type Side, type ComputePositionConfig, @@ -46,6 +47,7 @@ export interface State { offset?: number; flip?: boolean; shift?: number; + matchWidth?: boolean; auto?: boolean; } @@ -109,7 +111,7 @@ const calculateStyle = async (state: State): Promise => { }; const getConfig = (state: State): ComputePositionConfig => { - const { arrowElement, placement, offset, flip, shift } = state; + const { arrowElement, placement, offset, flip, shift, matchWidth } = state; return { placement: placement ?? 'top', @@ -122,6 +124,14 @@ const getConfig = (state: State): ComputePositionConfig => { }), shift !== undefined && shiftMiddleware({ padding: shift }), arrowElement && arrowMiddleware({ element: arrowElement }), + matchWidth && + sizeMiddleware({ + apply({ rects, elements }) { + Object.assign(elements.floating.style, { + width: `${rects.reference.width}px`, + }); + }, + }), ], }; }; diff --git a/packages/core/src/lib/floating/floating.svelte b/packages/core/src/lib/floating/floating.svelte index a898d9e3..275041eb 100644 --- a/packages/core/src/lib/floating/floating.svelte +++ b/packages/core/src/lib/floating/floating.svelte @@ -7,18 +7,26 @@ import { type FloatingPlacement, } from './floating-style'; -export { className as cx }; -export let referenceElement: FloatingReferenceElement; +export let referenceElement: FloatingReferenceElement | undefined; export let placement: FloatingPlacement = 'bottom-start'; export let offset = 0; +export let matchWidth = false; export let onClickOutside: ((target: Element) => unknown) | undefined = undefined; +let className: cx.Argument = undefined; +export { className as cx }; + const style = floatingStyle(); let floatingElement: HTMLElement | undefined; -let className: cx.Argument = undefined; -$: style.register({ referenceElement, floatingElement, placement, offset }); +$: style.register({ + referenceElement, + floatingElement, + placement, + offset, + matchWidth, +});
- - -