diff --git a/packages/browser-sdk/package.json b/packages/browser-sdk/package.json index c6f58e10..74a041f9 100644 --- a/packages/browser-sdk/package.json +++ b/packages/browser-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@bucketco/browser-sdk", - "version": "3.3.1", + "version": "3.3.2", "packageManager": "yarn@4.1.1", "license": "MIT", "repository": { diff --git a/packages/browser-sdk/src/toolbar/Features.css b/packages/browser-sdk/src/toolbar/Features.css index c544c10d..00798842 100644 --- a/packages/browser-sdk/src/toolbar/Features.css +++ b/packages/browser-sdk/src/toolbar/Features.css @@ -63,6 +63,12 @@ } } +.feature-empty-cell { + width: 100%; + color: var(--gray500); + padding: 6px 0; +} + .feature-name-cell { white-space: nowrap; overflow: hidden; diff --git a/packages/browser-sdk/src/toolbar/Features.tsx b/packages/browser-sdk/src/toolbar/Features.tsx index a5d6eb09..0121c225 100644 --- a/packages/browser-sdk/src/toolbar/Features.tsx +++ b/packages/browser-sdk/src/toolbar/Features.tsx @@ -19,17 +19,42 @@ export function FeaturesTable({ isOpen: boolean; setIsEnabledOverride: (key: string, isEnabled: boolean | null) => void; }) { + const hasFeatures = features.length > 0; + const hasShownFeatures = features.some((feature) => + feature.key + .toLocaleLowerCase() + .includes(searchQuery?.toLocaleLowerCase() ?? ""), + ); + + // List features that match the search query first then alphabetically const searchedFeatures = searchQuery === null ? features - : [...features].sort((a, _b) => (a.key.includes(searchQuery) ? -1 : 1)); + : [...features].sort((a, b) => { + const aMatches = a.key.includes(searchQuery); + const bMatches = b.key.includes(searchQuery); + + // If both match or both don't match, sort alphabetically + if (aMatches === bMatches) { + return a.key.localeCompare(b.key); + } + + // Otherwise, matching features come first + return aMatches ? -1 : 1; + }); - if (searchedFeatures.length === 0) { - return
No features found
; - } return ( + {(!hasFeatures || !hasShownFeatures) && ( + + + + )} {searchedFeatures.map((feature, index) => ( (null); + const dialogContentRef = useRef(null); const [features, setFeatures] = useState([]); const updateFeatures = useCallback(() => { @@ -67,6 +68,7 @@ export default function Toolbar({ const [search, setSearch] = useState(null); const onSearch = (val: string) => { setSearch(val === "" ? null : val); + dialogContentRef.current?.scrollTo({ top: 0 }); }; const sortedFeatures = [...features].sort((a, b) => @@ -102,7 +104,7 @@ export default function Toolbar({ - + ; }) { - return
{children}
; + return ( +
+ {children} +
+ ); } export function DialogContent({ children, + innerRef, }: { children: preact.ComponentChildren; + innerRef?: Ref; }) { - return
{children}
; + return ( +
+ {children} +
+ ); } diff --git a/yarn.lock b/yarn.lock index 63de49f6..8b8b29b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -683,7 +683,19 @@ __metadata: languageName: node linkType: hard -"@bucketco/browser-sdk@npm:3.3.1, @bucketco/browser-sdk@workspace:packages/browser-sdk": +"@bucketco/browser-sdk@npm:3.3.1": + version: 3.3.1 + resolution: "@bucketco/browser-sdk@npm:3.3.1" + dependencies: + "@floating-ui/dom": "npm:^1.6.8" + canonical-json: "npm:^0.0.4" + js-cookie: "npm:^3.0.5" + preact: "npm:^10.22.1" + checksum: 10c0/30bd1fa0f084c7eee0a22f917bfe488667243013711787bc36c9befa0d3aa27a4aed6f0576416a098b3d3d64ff1cf873587022d4d9c07198e11d4f81f31380de + languageName: node + linkType: hard + +"@bucketco/browser-sdk@workspace:packages/browser-sdk": version: 0.0.0-use.local resolution: "@bucketco/browser-sdk@workspace:packages/browser-sdk" dependencies:
+ No features{" "} + {!hasShownFeatures ? `matching "${searchQuery} "` : ""} + found +