From c13ff2287bc560c590dce0be532fbc865110d813 Mon Sep 17 00:00:00 2001 From: Ajax Davis Date: Fri, 28 Nov 2025 05:30:55 +1000 Subject: [PATCH] refactor: convert tool-search page from createElement to JSX --- apps/web/src/app/tool/tool-search/page.tsx | 550 ++++++++------------- 1 file changed, 219 insertions(+), 331 deletions(-) diff --git a/apps/web/src/app/tool/tool-search/page.tsx b/apps/web/src/app/tool/tool-search/page.tsx index cca524c..c9f9234 100644 --- a/apps/web/src/app/tool/tool-search/page.tsx +++ b/apps/web/src/app/tool/tool-search/page.tsx @@ -19,7 +19,7 @@ import { ProgressBar } from '@tpmjs/ui/ProgressBar/ProgressBar'; import { Select } from '@tpmjs/ui/Select/Select'; import { Tabs } from '@tpmjs/ui/Tabs/Tabs'; import Link from 'next/link'; -import { createElement, useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; interface Tool { id: string; @@ -38,7 +38,6 @@ interface Tool { * Tool Registry Search Page * * Fetches tools from the /api/tools endpoint and displays them in a searchable grid. - * Built with .ts-only React using createElement. */ export default function ToolSearchPage(): React.ReactElement { const [activeTab, setActiveTab] = useState('all'); @@ -112,351 +111,240 @@ export default function ToolSearchPage(): React.ReactElement { ? tools.filter((tool) => selectedTags.some((tag) => tool.tags.includes(tag))) : tools; - return createElement('div', { className: 'min-h-screen bg-background' }, [ - // Header - createElement(Header, { - key: 'header', - title: createElement('div', { className: 'flex items-center gap-2' }, [ - createElement('span', { key: 'title', className: 'text-2xl font-bold' }, 'TPMJS'), - createElement(Badge, { key: 'badge', variant: 'outline', size: 'sm' }, 'Beta'), - ]), - actions: createElement('div', { className: 'flex items-center gap-3' }, [ - createElement(Button, { key: 'docs', variant: 'ghost', size: 'sm' }, 'Docs'), - createElement( - 'a', - { - key: 'github', - href: 'https://github.com/tpmjs/tpmjs', - target: '_blank', - rel: 'noopener noreferrer', - className: 'text-foreground-secondary hover:text-foreground transition-colors', - }, - createElement(Icon, { icon: 'github', size: 'md' }) - ), - createElement(Button, { key: 'publish', variant: 'default', size: 'sm' }, 'Publish Tool'), - ]), - sticky: true, - size: 'md', - }), + return ( +
+ {/* Header */} +
+ TPMJS + + Beta + +
+ } + actions={ +
+ + + + + +
+ } + sticky={true} + size="md" + /> - // Main content - createElement(Container, { key: 'container', size: 'xl', padding: 'md', className: 'py-8' }, [ - // Page header - createElement('div', { key: 'page-header', className: 'space-y-4 mb-8' }, [ - createElement( - 'h1', - { key: 'title', className: 'text-4xl font-bold text-foreground' }, - 'Tool Registry' - ), - createElement( - 'p', - { key: 'description', className: 'text-lg text-foreground-secondary' }, - 'Discover, share, and integrate tools that give your AI agents superpowers.' - ), - ]), + {/* Main content */} + + {/* Page header */} +
+

Tool Registry

+

+ Discover, share, and integrate tools that give your AI agents superpowers. +

+
- // Search and filters section - createElement('div', { key: 'filters', className: 'space-y-4 mb-6' }, [ - // Search input - createElement(Input, { - key: 'search', - placeholder: 'Search tools...', - value: searchQuery, - onChange: (e) => setSearchQuery(e.target.value), - }), + {/* Search and filters section */} +
+ {/* Search input */} + setSearchQuery(e.target.value)} + /> - // Filter row - createElement('div', { key: 'filter-row', className: 'flex flex-wrap gap-4' }, [ - // Category filter - createElement( - 'div', - { key: 'category', className: 'flex items-center gap-2 min-w-[200px]' }, - [ - createElement( - 'span', - { key: 'label', className: 'text-sm font-medium text-foreground-secondary' }, - 'Category:' - ), - createElement(Select, { - key: 'select', - value: categoryFilter, - onChange: (e) => setCategoryFilter(e.target.value), - size: 'sm', - options: [ + {/* Filter row */} +
+ {/* Category filter */} +
+ Category: +