@seed-ship/mcp-ui-solid 4.3.2 → 4.3.4

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/index.cjs CHANGED
@@ -66,6 +66,7 @@ exports.DraggableGridItem = DraggableGridItem.DraggableGridItem;
66
66
  exports.ResizeHandle = ResizeHandle.ResizeHandle;
67
67
  exports.EditableUIResourceRenderer = EditableUIResourceRenderer.EditableUIResourceRenderer;
68
68
  exports.ExpandableWrapper = ExpandableWrapper.ExpandableWrapper;
69
+ exports.useExpanded = ExpandableWrapper.useExpanded;
69
70
  exports.ComponentToolbar = ComponentToolbar.ComponentToolbar;
70
71
  exports.ChatBusProvider = useChatBus.ChatBusProvider;
71
72
  exports.useChatBus = useChatBus.useChatBus;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.cts CHANGED
@@ -31,7 +31,7 @@ export { UIResourceRenderer, StreamingUIRenderer, GenerativeUIErrorBoundary } fr
31
31
  export { DraggableGridItem } from './components/DraggableGridItem';
32
32
  export { ResizeHandle } from './components/ResizeHandle';
33
33
  export { EditableUIResourceRenderer } from './components/EditableUIResourceRenderer';
34
- export { ExpandableWrapper } from './components/ExpandableWrapper';
34
+ export { ExpandableWrapper, useExpanded } from './components/ExpandableWrapper';
35
35
  export { ComponentToolbar } from './components/ComponentToolbar';
36
36
  export { ChatBusProvider, useChatBus } from './hooks/useChatBus';
37
37
  export { ChatPrompt } from './components/ChatPrompt';
package/dist/index.d.ts CHANGED
@@ -31,7 +31,7 @@ export { UIResourceRenderer, StreamingUIRenderer, GenerativeUIErrorBoundary } fr
31
31
  export { DraggableGridItem } from './components/DraggableGridItem';
32
32
  export { ResizeHandle } from './components/ResizeHandle';
33
33
  export { EditableUIResourceRenderer } from './components/EditableUIResourceRenderer';
34
- export { ExpandableWrapper } from './components/ExpandableWrapper';
34
+ export { ExpandableWrapper, useExpanded } from './components/ExpandableWrapper';
35
35
  export { ComponentToolbar } from './components/ComponentToolbar';
36
36
  export { ChatBusProvider, useChatBus } from './hooks/useChatBus';
37
37
  export { ChatPrompt } from './components/ChatPrompt';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ import { DataPreviewSection } from "./components/DataPreviewSection.js";
23
23
  import { DraggableGridItem } from "./components/DraggableGridItem.js";
24
24
  import { ResizeHandle } from "./components/ResizeHandle.js";
25
25
  import { EditableUIResourceRenderer } from "./components/EditableUIResourceRenderer.js";
26
- import { ExpandableWrapper } from "./components/ExpandableWrapper.js";
26
+ import { ExpandableWrapper, useExpanded } from "./components/ExpandableWrapper.js";
27
27
  import { ComponentToolbar } from "./components/ComponentToolbar.js";
28
28
  import { ChatBusProvider, useChatBus } from "./hooks/useChatBus.js";
29
29
  import { ChatPrompt } from "./components/ChatPrompt.js";
@@ -99,6 +99,7 @@ export {
99
99
  useConfirmModal,
100
100
  useDataValidator,
101
101
  useDragDrop,
102
+ useExpanded,
102
103
  useFormPersistence,
103
104
  useMCPAction,
104
105
  useMCPActionSafe,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seed-ship/mcp-ui-solid",
3
- "version": "4.3.2",
3
+ "version": "4.3.4",
4
4
  "description": "SolidJS components for rendering MCP-generated UI resources",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -6,9 +6,15 @@
6
6
  * imperative components like ChartJS that bind instances to DOM nodes.
7
7
  */
8
8
 
9
- import { Component, Show, createSignal, createEffect, onCleanup, JSX } from 'solid-js'
9
+ import { Component, Show, createSignal, createEffect, onCleanup, JSX, createContext, useContext, Accessor } from 'solid-js'
10
10
  import { Portal } from 'solid-js/web'
11
11
 
12
+ /** Context for child components to know if they're in expanded/fullscreen view */
13
+ const ExpandedContext = createContext<Accessor<boolean>>(() => false)
14
+
15
+ /** Hook for child components to read expanded state */
16
+ export const useExpanded = () => useContext(ExpandedContext)
17
+
12
18
  export interface ExpandableWrapperProps {
13
19
  /** Content to render inline (and in expanded view) */
14
20
  children: JSX.Element
@@ -103,7 +109,9 @@ export const ExpandableWrapper: Component<ExpandableWrapperProps> = (props) => {
103
109
  {/* Inline slot — content lives here when not expanded */}
104
110
  <div ref={inlineSlotRef}>
105
111
  <div ref={contentRef}>
106
- {props.children}
112
+ <ExpandedContext.Provider value={isExpanded}>
113
+ {props.children}
114
+ </ExpandedContext.Provider>
107
115
  </div>
108
116
  </div>
109
117
 
@@ -21,7 +21,7 @@ import { ImageGalleryRenderer } from './ImageGalleryRenderer'
21
21
  import { VideoRenderer } from './VideoRenderer'
22
22
  import { CodeBlockRenderer } from './CodeBlockRenderer'
23
23
  import { MapRenderer } from './MapRenderer'
24
- import { ExpandableWrapper } from './ExpandableWrapper'
24
+ import { ExpandableWrapper, useExpanded } from './ExpandableWrapper'
25
25
  import { RenderProvider } from './RenderContext'
26
26
  import { useAction } from '../hooks/useAction'
27
27
  import { marked } from 'marked'
@@ -375,35 +375,72 @@ function TableRenderer(props: {
375
375
  return sortDir() === 'asc' ? '\u2191' : '\u2193'
376
376
  }
377
377
 
378
- // ─── Client-side pagination (v4.0.4, progressive mode v4.3.2) ─────
379
- const clientPageSize = () => tableParams.pageSize ?? 25
378
+ // ─── Client-side search filter (v4.3.3) ─────────────────────
379
+ const [searchQuery, setSearchQuery] = createSignal('')
380
+ const [debouncedQuery, setDebouncedQuery] = createSignal('')
381
+ let searchTimer: ReturnType<typeof setTimeout> | null = null
382
+
383
+ const isSearchable = () => tableParams.searchable === true || (tableParams.searchable !== false && allRows().length > 10)
384
+ const searchPlaceholder = () => tableParams.searchPlaceholder || 'Rechercher dans le tableau...'
385
+
386
+ const handleSearch = (value: string) => {
387
+ setSearchQuery(value)
388
+ if (searchTimer) clearTimeout(searchTimer)
389
+ searchTimer = setTimeout(() => {
390
+ setDebouncedQuery(value)
391
+ setClientPage(0)
392
+ setProgressivePages(1)
393
+ }, 200)
394
+ }
395
+
396
+ /** Normalize string for accent-insensitive matching */
397
+ const normalize = (s: string) => s.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase()
398
+
399
+ const filteredRows = createMemo(() => {
400
+ const q = normalize(debouncedQuery())
401
+ if (!q) return sortedRows()
402
+ const cols = columns()
403
+ return sortedRows().filter((row: any) =>
404
+ cols.some((col: any) => {
405
+ const val = row[col.key]
406
+ if (val == null) return false
407
+ return normalize(String(val)).includes(q)
408
+ })
409
+ )
410
+ })
411
+
412
+ // ─── Client-side pagination (v4.0.4, progressive v4.3.2, context-aware v4.3.4) ─────
413
+ const isExpanded = useExpanded()
414
+ const fullPageSize = () => tableParams.pageSize ?? 25
415
+ const chatPageSize = () => tableParams.chatPageSize ?? Math.min(10, fullPageSize())
416
+ const clientPageSize = () => isExpanded() ? fullPageSize() : chatPageSize()
380
417
  const hasServerPagination = () => !!tableParams.pagination
381
418
  const isProgressiveMode = () => !!tableParams.showAllLabel
382
419
  const needsClientPagination = () =>
383
- !hasServerPagination() && clientPageSize() > 0 && sortedRows().length > clientPageSize()
420
+ !hasServerPagination() && clientPageSize() > 0 && filteredRows().length > clientPageSize()
384
421
  const [clientPage, setClientPage] = createSignal(tableParams.initialPage ?? 0)
385
422
  // Progressive mode: track how many pages to show (append)
386
423
  const [progressivePages, setProgressivePages] = createSignal(1)
387
- const clientTotalPages = () => needsClientPagination() ? Math.ceil(sortedRows().length / clientPageSize()) : 1
424
+ const clientTotalPages = () => needsClientPagination() ? Math.ceil(filteredRows().length / clientPageSize()) : 1
388
425
  const clientVisibleRows = createMemo(() => {
389
- if (!needsClientPagination()) return sortedRows()
426
+ if (!needsClientPagination()) return filteredRows()
390
427
  if (isProgressiveMode()) {
391
428
  // Progressive: show first N * pageSize rows
392
- return sortedRows().slice(0, progressivePages() * clientPageSize())
429
+ return filteredRows().slice(0, progressivePages() * clientPageSize())
393
430
  }
394
431
  const start = clientPage() * clientPageSize()
395
- return sortedRows().slice(start, start + clientPageSize())
432
+ return filteredRows().slice(start, start + clientPageSize())
396
433
  })
397
434
  const clientRangeStart = () => needsClientPagination()
398
435
  ? (isProgressiveMode() ? 1 : clientPage() * clientPageSize() + 1)
399
436
  : 1
400
437
  const clientRangeEnd = () => needsClientPagination()
401
438
  ? (isProgressiveMode()
402
- ? Math.min(progressivePages() * clientPageSize(), sortedRows().length)
403
- : Math.min((clientPage() + 1) * clientPageSize(), sortedRows().length))
404
- : sortedRows().length
439
+ ? Math.min(progressivePages() * clientPageSize(), filteredRows().length)
440
+ : Math.min((clientPage() + 1) * clientPageSize(), filteredRows().length))
441
+ : filteredRows().length
405
442
  const progressiveHasMore = () => isProgressiveMode() && needsClientPagination() && progressivePages() < clientTotalPages()
406
- const progressiveRemaining = () => sortedRows().length - progressivePages() * clientPageSize()
443
+ const progressiveRemaining = () => filteredRows().length - progressivePages() * clientPageSize()
407
444
  const showMoreLabel = () => tableParams.showAllLabel || 'Show more'
408
445
 
409
446
  // ─── Virtualization ──────────────────────────────────────
@@ -640,6 +677,33 @@ function TableRenderer(props: {
640
677
  </h3>
641
678
  </Show>
642
679
 
680
+ {/* Search input (v4.3.3) */}
681
+ <Show when={isSearchable()}>
682
+ <div class="relative mb-3">
683
+ <span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 pointer-events-none text-sm">{'\uD83D\uDD0D'}</span>
684
+ <input
685
+ type="text"
686
+ value={searchQuery()}
687
+ onInput={(e) => handleSearch(e.currentTarget.value)}
688
+ placeholder={searchPlaceholder()}
689
+ class="w-full pl-8 pr-8 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none"
690
+ />
691
+ <Show when={searchQuery()}>
692
+ <button
693
+ type="button"
694
+ onClick={() => { handleSearch(''); setSearchQuery(''); setDebouncedQuery('') }}
695
+ class="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 text-sm"
696
+ aria-label="Clear search"
697
+ >&times;</button>
698
+ </Show>
699
+ </div>
700
+ <Show when={debouncedQuery() && filteredRows().length !== sortedRows().length}>
701
+ <p class="text-xs text-gray-500 dark:text-gray-400 mb-2">
702
+ {filteredRows().length} result{filteredRows().length !== 1 ? 's' : ''} on {sortedRows().length}
703
+ </p>
704
+ </Show>
705
+ </Show>
706
+
643
707
  <div
644
708
  ref={scrollContainerRef}
645
709
  class="overflow-x-auto"
@@ -704,7 +768,7 @@ function TableRenderer(props: {
704
768
  <Show when={needsClientPagination() && !isProgressiveMode()}>
705
769
  <div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400">
706
770
  <span>
707
- Showing {clientRangeStart()}&ndash;{clientRangeEnd()} of {allRows().length.toLocaleString('fr-FR')}
771
+ Showing {clientRangeStart()}&ndash;{clientRangeEnd()} of {filteredRows().length.toLocaleString('fr-FR')}
708
772
  </span>
709
773
  <div class="flex items-center gap-1">
710
774
  <button
@@ -730,7 +794,7 @@ function TableRenderer(props: {
730
794
  <Show when={needsClientPagination() && isProgressiveMode()}>
731
795
  <div class="mt-3 flex flex-col items-center gap-2 text-xs text-gray-500 dark:text-gray-400">
732
796
  <span>
733
- {clientRangeStart()}&ndash;{clientRangeEnd()} of {allRows().length.toLocaleString('fr-FR')}
797
+ {clientRangeStart()}&ndash;{clientRangeEnd()} of {filteredRows().length.toLocaleString('fr-FR')}
734
798
  </span>
735
799
  <Show when={progressiveHasMore()}>
736
800
  <button
package/src/index.ts CHANGED
@@ -35,7 +35,7 @@ export { UIResourceRenderer, StreamingUIRenderer, GenerativeUIErrorBoundary } fr
35
35
  export { DraggableGridItem } from './components/DraggableGridItem'
36
36
  export { ResizeHandle } from './components/ResizeHandle'
37
37
  export { EditableUIResourceRenderer } from './components/EditableUIResourceRenderer'
38
- export { ExpandableWrapper } from './components/ExpandableWrapper'
38
+ export { ExpandableWrapper, useExpanded } from './components/ExpandableWrapper'
39
39
  export { ComponentToolbar } from './components/ComponentToolbar'
40
40
 
41
41
  // Chat Bus (v2.4.0 — @experimental)