@sakaniui/react 0.11.2 → 0.13.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.
Files changed (35) hide show
  1. package/AGENTS.md +20 -3
  2. package/CHANGELOG.md +106 -0
  3. package/dist/{TopBar-O_56x94F.js → TopBar-BcXAB1mf.js} +540 -514
  4. package/dist/TopBar-DeBSl4rq.cjs +1 -0
  5. package/dist/blocks.cjs +2 -2
  6. package/dist/blocks.mjs +2053 -2053
  7. package/dist/building-warehouse-BUtjAEPH.cjs +1 -0
  8. package/dist/{file-text-DSD625_l.js → building-warehouse-_n8EvYUt.js} +33 -39
  9. package/dist/components/ChainOfThought/ChainOfThought.d.ts +72 -0
  10. package/dist/components/ChainOfThought/SourceLogo.d.ts +13 -0
  11. package/dist/components/ChainOfThought/index.d.ts +6 -0
  12. package/dist/components/ChainOfThought/logoData.d.ts +93 -0
  13. package/dist/components/ChainOfThought/logoIcons.d.ts +11 -0
  14. package/dist/components/CommandMenu/CommandMenu.d.ts +175 -0
  15. package/dist/components/CommandMenu/index.d.ts +2 -0
  16. package/dist/emoji-index.json +1 -1
  17. package/dist/{help-circle-B0koiJUs.js → help-circle-qEEVeIea.js} +15 -9
  18. package/dist/help-circle-rtL4juBJ.cjs +1 -0
  19. package/dist/icon-index.json +1 -1
  20. package/dist/icons.cjs +1 -1
  21. package/dist/icons.mjs +3932 -3938
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.mjs +2944 -1529
  25. package/dist/lib/SakaniLogo.d.ts +2 -0
  26. package/dist/{logout-BW8ksDGk.js → logout-BLSXL3qV.js} +10 -4
  27. package/dist/logout-pQUABnfO.cjs +1 -0
  28. package/dist/manifest.json +1046 -98
  29. package/dist/style.css +1 -1
  30. package/dist/tokens.css +2 -0
  31. package/package.json +2 -1
  32. package/dist/TopBar-7GwvQXGS.cjs +0 -1
  33. package/dist/file-text-DEGE-_aO.cjs +0 -1
  34. package/dist/help-circle-0qi1skw5.cjs +0 -1
  35. package/dist/logout-DkdFsC2P.cjs +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 6,
3
3
  "name": "@sakaniui/react",
4
- "version": "0.11.2",
4
+ "version": "0.13.0",
5
5
  "description": "Machine-readable contract of the SakaniUI React library, generated from its TypeScript source.",
6
6
  "docs": "https://www.sakaniui.com",
7
7
  "guide": "https://www.sakaniui.com/llms-full.txt",
@@ -24,7 +24,7 @@
24
24
  "@sakaniui/react/emoji": "Fluent Emoji (full colour): EmojiName, one module each (1594 emoji, 311 with skin tones)."
25
25
  },
26
26
  "conventions": {
27
- "version": "This manifest describes @sakaniui/react@0.11.2. Each component has `since`, the first release that contained it; a prop added later has its own `since`, and a value added later is listed in the prop's `valuesSince`. If the project has an older version installed, anything newer than that does not exist there.",
27
+ "version": "This manifest describes @sakaniui/react@0.13.0. Each component has `since`, the first release that contained it; a prop added later has its own `since`, and a value added later is listed in the prop's `valuesSince`. If the project has an older version installed, anything newer than that does not exist there.",
28
28
  "acceptsNativeProps": "Components forward native HTML attributes (className, style, aria-*, event handlers) to their root element unless a prop says otherwise; only the props that are specific to SakaniUI are listed here.",
29
29
  "accessibleName": "When `contract.requiresAccessibleName` is true, a required prop (aria-label, aria-labelledby or an alt text) is the only thing that names the control or image. Do not omit it.",
30
30
  "tokens": "Use only the token names listed under `tokens`. Colour tokens follow the theme (the `.dark` class flips them); do not hard-code colours.",
@@ -195,7 +195,7 @@
195
195
  "wrap"
196
196
  ],
197
197
  "tokens": {
198
- "count": 231,
198
+ "count": 233,
199
199
  "groups": {
200
200
  "bp": {
201
201
  "--bp-sm": "640px",
@@ -341,7 +341,9 @@
341
341
  "--space-16": "16px",
342
342
  "--space-20": "20px",
343
343
  "--space-24": "24px",
344
+ "--space-28": "28px",
344
345
  "--space-32": "32px",
346
+ "--space-36": "36px",
345
347
  "--space-40": "40px",
346
348
  "--space-48": "48px",
347
349
  "--space-64": "64px",
@@ -459,9 +461,9 @@
459
461
  }
460
462
  },
461
463
  "counts": {
462
- "components": 134,
464
+ "components": 142,
463
465
  "blocks": 42,
464
- "utilities": 8
466
+ "utilities": 10
465
467
  },
466
468
  "components": [
467
469
  {
@@ -2174,6 +2176,200 @@
2174
2176
  "since": "0.3.0",
2175
2177
  "example": "import { CartItem } from '@sakaniui/react';\n\n<CartItem image=\"/images/example.jpg\" name=\"Name\" price={49} quantity={1} />"
2176
2178
  },
2179
+ {
2180
+ "name": "ChainOfThought",
2181
+ "kind": "component",
2182
+ "category": "Composite",
2183
+ "import": "@sakaniui/react",
2184
+ "summary": "An AI agent's visible work: a header, steps joined by a rail (ChainOfThoughtStep), and a live Working line. `open` / `defaultOpen` toggles it; `status` and `elapsed` or `startedAt` drive the working line.",
2185
+ "props": [
2186
+ {
2187
+ "name": "title",
2188
+ "type": "ReactNode",
2189
+ "required": true,
2190
+ "description": "The header text, e.g. \"Ran 3 searches\" or \"Thinking\"."
2191
+ },
2192
+ {
2193
+ "name": "icon",
2194
+ "type": "IconComponent",
2195
+ "required": false,
2196
+ "description": "The header icon, drawn at 16px. Defaults to a magnifier."
2197
+ },
2198
+ {
2199
+ "name": "open",
2200
+ "type": "boolean",
2201
+ "required": false,
2202
+ "description": "Controlled open state. Omit it to let the component keep its own (see defaultOpen)."
2203
+ },
2204
+ {
2205
+ "name": "defaultOpen",
2206
+ "type": "boolean",
2207
+ "required": false,
2208
+ "default": true,
2209
+ "description": "Initial open state when uncontrolled. Defaults to true."
2210
+ },
2211
+ {
2212
+ "name": "onOpenChange",
2213
+ "type": "((open: boolean) => void)",
2214
+ "required": false,
2215
+ "description": "Called with the new state when the header is clicked."
2216
+ },
2217
+ {
2218
+ "name": "status",
2219
+ "type": "\"done\" | \"working\"",
2220
+ "required": false,
2221
+ "values": [
2222
+ "done",
2223
+ "working"
2224
+ ],
2225
+ "description": "Adds the working line under the steps: \"working\" (sparkle, shimmer) or \"done\" (\"Worked for 11.2s\")."
2226
+ },
2227
+ {
2228
+ "name": "elapsed",
2229
+ "type": "number",
2230
+ "required": false,
2231
+ "description": "Elapsed seconds for the working line."
2232
+ },
2233
+ {
2234
+ "name": "startedAt",
2235
+ "type": "number",
2236
+ "required": false,
2237
+ "description": "Epoch ms when the work started; the working line then counts up on its own."
2238
+ },
2239
+ {
2240
+ "name": "children",
2241
+ "type": "ReactNode",
2242
+ "required": false,
2243
+ "description": "ChainOfThoughtStep elements."
2244
+ },
2245
+ {
2246
+ "name": "className",
2247
+ "type": "string",
2248
+ "required": false
2249
+ }
2250
+ ],
2251
+ "contract": {
2252
+ "requiredProps": [
2253
+ "title"
2254
+ ],
2255
+ "requiresAccessibleName": false
2256
+ },
2257
+ "since": "0.12.0",
2258
+ "example": "import { ChainOfThought } from '@sakaniui/react';\n\n<ChainOfThought title=\"Title\" />",
2259
+ "recipes": [
2260
+ {
2261
+ "title": "Stream an agent run: steps arrive, the timer ticks, then it finishes",
2262
+ "description": "ChainOfThought is presentational. Keep the steps in state, append one as your agent starts it, mark the previous one `done`, and pass `status=\"working\"` with `startedAt` so the time counts up on its own. When the run ends switch to `status=\"done\"` with the final `elapsed` (seconds) and change the title. The rail stops at the last step by itself.",
2263
+ "code": "import React from 'react';\nimport { ChainOfThought, ChainOfThoughtStep, SourceStack } from '@sakaniui/react';\nimport { IconBrandReddit } from '@sakaniui/react/icons';\n\ntype Step = { id: string; label: string; query?: string; count?: string };\n\nexport const Example = ({ steps, finished, startedAt, elapsed }: { steps: Step[]; finished: boolean; startedAt: number; elapsed?: number }) => (\n <ChainOfThought\n title={finished ? `Ran ${steps.length} searches` : 'Researching'}\n status={finished ? 'done' : 'working'}\n startedAt={startedAt}\n elapsed={elapsed}\n >\n {steps.map((s, i) => (\n <ChainOfThoughtStep\n key={s.id}\n status={!finished && i === steps.length - 1 ? 'active' : 'done'}\n icon={IconBrandReddit}\n label={s.label}\n query={s.query}\n count={s.count}\n sources={<SourceStack sources={[{ label: 'Reddit', icon: IconBrandReddit }]} />}\n />\n ))}\n </ChainOfThought>\n);"
2264
+ }
2265
+ ],
2266
+ "aliases": [
2267
+ "thought chain",
2268
+ "reasoning steps",
2269
+ "reasoning trace",
2270
+ "agent steps",
2271
+ "agent activity",
2272
+ "agent trace",
2273
+ "thinking steps",
2274
+ "tool calls",
2275
+ "tool call log",
2276
+ "activity trace",
2277
+ "ai steps",
2278
+ "research steps"
2279
+ ]
2280
+ },
2281
+ {
2282
+ "name": "ChainOfThoughtStep",
2283
+ "kind": "component",
2284
+ "category": "Composite",
2285
+ "import": "@sakaniui/react",
2286
+ "summary": "One step of an agent run: an icon, a label, an optional monospace `query`, a `count` and a `sources` row. `status` is pending, active (read in full) or done (muted).",
2287
+ "props": [
2288
+ {
2289
+ "name": "status",
2290
+ "type": "\"active\" | \"done\" | \"pending\"",
2291
+ "required": false,
2292
+ "values": [
2293
+ "active",
2294
+ "done",
2295
+ "pending"
2296
+ ],
2297
+ "default": "done",
2298
+ "description": "pending (not started), active (in progress, read in full) or done (muted). Defaults to \"done\"."
2299
+ },
2300
+ {
2301
+ "name": "icon",
2302
+ "type": "IconComponent",
2303
+ "required": false,
2304
+ "description": "The step's icon, drawn at 16px. Defaults to a magnifier."
2305
+ },
2306
+ {
2307
+ "name": "label",
2308
+ "type": "ReactNode",
2309
+ "required": true,
2310
+ "description": "What happened, e.g. \"Searched X for\"."
2311
+ },
2312
+ {
2313
+ "name": "query",
2314
+ "type": "string",
2315
+ "required": false,
2316
+ "description": "The query or argument, shown in monospace after the label."
2317
+ },
2318
+ {
2319
+ "name": "count",
2320
+ "type": "ReactNode",
2321
+ "required": false,
2322
+ "description": "A result count on the right, e.g. \"7 posts\"."
2323
+ },
2324
+ {
2325
+ "name": "accent",
2326
+ "type": "string",
2327
+ "required": false,
2328
+ "description": "Colour of the spark that runs into the step while it is active. Defaults to the icon's brand colour when it is a logo from `sourceLogo()`.",
2329
+ "since": "0.13.0"
2330
+ },
2331
+ {
2332
+ "name": "sources",
2333
+ "type": "ReactNode",
2334
+ "required": false,
2335
+ "description": "A row under the step, usually a <SourceStack>."
2336
+ },
2337
+ {
2338
+ "name": "sourcesLabel",
2339
+ "type": "string",
2340
+ "required": false,
2341
+ "default": "Sources",
2342
+ "description": "Text before the sources. Defaults to \"Sources\"."
2343
+ },
2344
+ {
2345
+ "name": "onSourcesClick",
2346
+ "type": "(() => void)",
2347
+ "required": false,
2348
+ "description": "Makes the sources row a button with a chevron, so the sources can be opened."
2349
+ },
2350
+ {
2351
+ "name": "className",
2352
+ "type": "string",
2353
+ "required": false
2354
+ }
2355
+ ],
2356
+ "contract": {
2357
+ "requiredProps": [
2358
+ "label"
2359
+ ],
2360
+ "requiresAccessibleName": false
2361
+ },
2362
+ "since": "0.12.0",
2363
+ "example": "import { ChainOfThoughtStep } from '@sakaniui/react';\n\n<ChainOfThoughtStep label=\"Label\" />",
2364
+ "aliases": [
2365
+ "reasoning step",
2366
+ "thought step",
2367
+ "agent step",
2368
+ "tool call",
2369
+ "search step",
2370
+ "task step"
2371
+ ]
2372
+ },
2177
2373
  {
2178
2374
  "name": "ChatComposer",
2179
2375
  "kind": "component",
@@ -2412,9 +2608,546 @@
2412
2608
  "description": "Defaults to true. False renders a disabled, unclickable swatch."
2413
2609
  },
2414
2610
  {
2415
- "name": "onSelect",
2416
- "type": "(() => void)",
2417
- "required": false
2611
+ "name": "onSelect",
2612
+ "type": "(() => void)",
2613
+ "required": false
2614
+ },
2615
+ {
2616
+ "name": "className",
2617
+ "type": "string",
2618
+ "required": false
2619
+ }
2620
+ ],
2621
+ "contract": {
2622
+ "requiredProps": [
2623
+ "color",
2624
+ "label"
2625
+ ],
2626
+ "requiresAccessibleName": false
2627
+ },
2628
+ "since": "0.3.0",
2629
+ "example": "import { ColorSwatch } from '@sakaniui/react';\n\n<ColorSwatch color=\"var(--color-accent-default)\" label=\"Label\" />"
2630
+ },
2631
+ {
2632
+ "name": "Combobox",
2633
+ "kind": "component",
2634
+ "category": "Composite",
2635
+ "import": "@sakaniui/react",
2636
+ "summary": "Searchable select with single or multi-select.",
2637
+ "props": [
2638
+ {
2639
+ "name": "options",
2640
+ "type": "ComboboxOption[]",
2641
+ "required": true,
2642
+ "shape": {
2643
+ "type": "ComboboxOption",
2644
+ "collection": "array",
2645
+ "fields": [
2646
+ {
2647
+ "name": "value",
2648
+ "type": "string",
2649
+ "required": true
2650
+ },
2651
+ {
2652
+ "name": "label",
2653
+ "type": "string",
2654
+ "required": true
2655
+ },
2656
+ {
2657
+ "name": "icon",
2658
+ "type": "ReactNode",
2659
+ "required": false
2660
+ },
2661
+ {
2662
+ "name": "disabled",
2663
+ "type": "boolean",
2664
+ "required": false
2665
+ }
2666
+ ]
2667
+ }
2668
+ },
2669
+ {
2670
+ "name": "mode",
2671
+ "type": "\"single\" | \"multi\"",
2672
+ "required": false,
2673
+ "values": [
2674
+ "single",
2675
+ "multi"
2676
+ ],
2677
+ "default": "single"
2678
+ },
2679
+ {
2680
+ "name": "size",
2681
+ "type": "\"sm\" | \"md\" | \"lg\"",
2682
+ "required": false,
2683
+ "values": [
2684
+ "sm",
2685
+ "md",
2686
+ "lg"
2687
+ ],
2688
+ "default": "md"
2689
+ },
2690
+ {
2691
+ "name": "label",
2692
+ "type": "string",
2693
+ "required": false
2694
+ },
2695
+ {
2696
+ "name": "description",
2697
+ "type": "string",
2698
+ "required": false
2699
+ },
2700
+ {
2701
+ "name": "error",
2702
+ "type": "string",
2703
+ "required": false
2704
+ },
2705
+ {
2706
+ "name": "placeholder",
2707
+ "type": "string",
2708
+ "required": false,
2709
+ "default": "Select..."
2710
+ },
2711
+ {
2712
+ "name": "disabled",
2713
+ "type": "boolean",
2714
+ "required": false
2715
+ },
2716
+ {
2717
+ "name": "loading",
2718
+ "type": "boolean",
2719
+ "required": false
2720
+ },
2721
+ {
2722
+ "name": "value",
2723
+ "type": "string | string[]",
2724
+ "required": false,
2725
+ "description": "Controlled selected value(s)."
2726
+ },
2727
+ {
2728
+ "name": "onChange",
2729
+ "type": "((value: string | string[]) => void)",
2730
+ "required": false
2731
+ },
2732
+ {
2733
+ "name": "className",
2734
+ "type": "string",
2735
+ "required": false
2736
+ }
2737
+ ],
2738
+ "contract": {
2739
+ "requiredProps": [
2740
+ "options"
2741
+ ],
2742
+ "requiresAccessibleName": false
2743
+ },
2744
+ "since": "0.1.0",
2745
+ "example": "import { Combobox } from '@sakaniui/react';\n\n<Combobox options={[{ value: \"Value\", label: \"Label\" }]} />",
2746
+ "aliases": [
2747
+ "autocomplete",
2748
+ "typeahead",
2749
+ "searchable select",
2750
+ "multi select",
2751
+ "multiselect",
2752
+ "tag input"
2753
+ ]
2754
+ },
2755
+ {
2756
+ "name": "CommandMenu",
2757
+ "kind": "component",
2758
+ "category": "Composite",
2759
+ "import": "@sakaniui/react",
2760
+ "summary": "A ⌘K search and command palette: a field, scope tabs, grouped results (the matched letters in the strong weight), a footer of key hints, and loading, no-results and error states. Pass `groups` of `items` and handle `onSelect`; it filters as you type unless `filter={false}`. ⌘K opens it, ↑ ↓ move, ↵ chooses, ⌘↵ asks AI (with `onAskAI`), Tab switches scope, esc clears then closes. `variant=\"simple\"` is just the field, one group and the key hints.",
2761
+ "props": [
2762
+ {
2763
+ "name": "open",
2764
+ "type": "boolean",
2765
+ "required": false,
2766
+ "description": "Controlled open state."
2767
+ },
2768
+ {
2769
+ "name": "defaultOpen",
2770
+ "type": "boolean",
2771
+ "required": false,
2772
+ "default": false,
2773
+ "description": "Initial open state when uncontrolled."
2774
+ },
2775
+ {
2776
+ "name": "onOpenChange",
2777
+ "type": "((open: boolean) => void)",
2778
+ "required": false
2779
+ },
2780
+ {
2781
+ "name": "hotkey",
2782
+ "type": "string | false",
2783
+ "required": false,
2784
+ "default": "k",
2785
+ "description": "The key that opens it with ⌘ / Ctrl. `false` turns the shortcut off. Defaults to \"k\"."
2786
+ },
2787
+ {
2788
+ "name": "variant",
2789
+ "type": "\"default\" | \"simple\"",
2790
+ "required": false,
2791
+ "values": [
2792
+ "default",
2793
+ "simple"
2794
+ ],
2795
+ "default": "default",
2796
+ "description": "\"default\" has scopes and a workspace footer; \"simple\" is just the field, the rows and the key hints."
2797
+ },
2798
+ {
2799
+ "name": "query",
2800
+ "type": "string",
2801
+ "required": false,
2802
+ "description": "The field's text (controlled)."
2803
+ },
2804
+ {
2805
+ "name": "defaultQuery",
2806
+ "type": "string",
2807
+ "required": false,
2808
+ "default": ""
2809
+ },
2810
+ {
2811
+ "name": "onQueryChange",
2812
+ "type": "((query: string) => void)",
2813
+ "required": false
2814
+ },
2815
+ {
2816
+ "name": "placeholder",
2817
+ "type": "string",
2818
+ "required": false,
2819
+ "default": "Search or ask anything…"
2820
+ },
2821
+ {
2822
+ "name": "groups",
2823
+ "type": "CommandMenuGroup[]",
2824
+ "required": true,
2825
+ "description": "Results, in groups.",
2826
+ "shape": {
2827
+ "type": "CommandMenuGroup",
2828
+ "collection": "array",
2829
+ "fields": [
2830
+ {
2831
+ "name": "id",
2832
+ "type": "string",
2833
+ "required": true
2834
+ },
2835
+ {
2836
+ "name": "label",
2837
+ "type": "string",
2838
+ "required": false,
2839
+ "description": "The small heading above the items."
2840
+ },
2841
+ {
2842
+ "name": "action",
2843
+ "type": "{ label: string; onClick: () => void; }",
2844
+ "required": false,
2845
+ "description": "A link on the right of the heading, e.g. \"See all\"."
2846
+ },
2847
+ {
2848
+ "name": "items",
2849
+ "type": "CommandMenuItem[]",
2850
+ "required": true
2851
+ }
2852
+ ]
2853
+ }
2854
+ },
2855
+ {
2856
+ "name": "filter",
2857
+ "type": "boolean | ((item: CommandMenuItem, query: string) => boolean)",
2858
+ "required": false,
2859
+ "default": true,
2860
+ "description": "Filter the groups by the query, scope and tokens here. Pass a function to match your own way, or `false` to show `groups` as given. Defaults to true."
2861
+ },
2862
+ {
2863
+ "name": "highlightMatches",
2864
+ "type": "boolean",
2865
+ "required": false,
2866
+ "default": true,
2867
+ "description": "Wrap the matched letters of each label in the strong weight. Defaults to true."
2868
+ },
2869
+ {
2870
+ "name": "state",
2871
+ "type": "\"loading\" | \"ready\" | \"error\"",
2872
+ "required": false,
2873
+ "values": [
2874
+ "loading",
2875
+ "ready",
2876
+ "error"
2877
+ ],
2878
+ "default": "ready",
2879
+ "description": "\"loading\" shows skeleton rows, \"error\" the error message."
2880
+ },
2881
+ {
2882
+ "name": "onSelect",
2883
+ "type": "((item: CommandMenuItem) => void)",
2884
+ "required": false,
2885
+ "description": "Called when an item is chosen (click or ↵)."
2886
+ },
2887
+ {
2888
+ "name": "closeOnSelect",
2889
+ "type": "boolean",
2890
+ "required": false,
2891
+ "default": true,
2892
+ "description": "Close the menu when an item is chosen. Defaults to true."
2893
+ },
2894
+ {
2895
+ "name": "scopes",
2896
+ "type": "CommandMenuScope[]",
2897
+ "required": false,
2898
+ "description": "Scope tabs under the field (not shown in the simple variant).",
2899
+ "shape": {
2900
+ "type": "CommandMenuScope",
2901
+ "collection": "array",
2902
+ "fields": [
2903
+ {
2904
+ "name": "value",
2905
+ "type": "string",
2906
+ "required": true,
2907
+ "description": "\"all\" is the unfiltered scope."
2908
+ },
2909
+ {
2910
+ "name": "label",
2911
+ "type": "string",
2912
+ "required": true
2913
+ },
2914
+ {
2915
+ "name": "count",
2916
+ "type": "number | null",
2917
+ "required": false,
2918
+ "description": "The count shown on the tab. Computed from the items when you leave it out (and `filter` is on); `null` shows no count."
2919
+ }
2920
+ ]
2921
+ }
2922
+ },
2923
+ {
2924
+ "name": "scope",
2925
+ "type": "string",
2926
+ "required": false
2927
+ },
2928
+ {
2929
+ "name": "defaultScope",
2930
+ "type": "string",
2931
+ "required": false
2932
+ },
2933
+ {
2934
+ "name": "onScopeChange",
2935
+ "type": "((scope: string) => void)",
2936
+ "required": false
2937
+ },
2938
+ {
2939
+ "name": "filters",
2940
+ "type": "CommandMenuFilter[]",
2941
+ "required": false,
2942
+ "description": "Filter tokens shown in the field.",
2943
+ "shape": {
2944
+ "type": "CommandMenuFilter",
2945
+ "collection": "array",
2946
+ "fields": [
2947
+ {
2948
+ "name": "id",
2949
+ "type": "string",
2950
+ "required": true
2951
+ },
2952
+ {
2953
+ "name": "label",
2954
+ "type": "string",
2955
+ "required": true,
2956
+ "description": "Shown in the token, e.g. \"People\" or \"team: Design\"."
2957
+ },
2958
+ {
2959
+ "name": "value",
2960
+ "type": "string",
2961
+ "required": false,
2962
+ "description": "What `tags` are matched against. Defaults to the label."
2963
+ },
2964
+ {
2965
+ "name": "icon",
2966
+ "type": "IconComponent",
2967
+ "required": false
2968
+ }
2969
+ ]
2970
+ }
2971
+ },
2972
+ {
2973
+ "name": "onFiltersChange",
2974
+ "type": "((filters: CommandMenuFilter[]) => void)",
2975
+ "required": false
2976
+ },
2977
+ {
2978
+ "name": "filterKeys",
2979
+ "type": "string[]",
2980
+ "required": false,
2981
+ "description": "Typing `key:value` and a space turns it into a token for these keys, e.g. [\"team\", \"status\"]."
2982
+ },
2983
+ {
2984
+ "name": "onAskAI",
2985
+ "type": "((query: string) => void)",
2986
+ "required": false,
2987
+ "description": "Adds ⌘↵ and the \"Ask AI\" hint; called with the current query."
2988
+ },
2989
+ {
2990
+ "name": "answer",
2991
+ "type": "ReactNode",
2992
+ "required": false,
2993
+ "description": "Shown above the results (an answer card, a Chain of Thought)."
2994
+ },
2995
+ {
2996
+ "name": "renderPreview",
2997
+ "type": "((item: CommandMenuItem) => ReactNode)",
2998
+ "required": false,
2999
+ "description": "Shows a preview pane beside the list for the active item. Return null for no pane."
3000
+ },
3001
+ {
3002
+ "name": "previewActions",
3003
+ "type": "ReactNode | ((item: CommandMenuItem) => ReactNode)",
3004
+ "required": false,
3005
+ "description": "Buttons or links pinned to the bottom of the detail pane. They stay put while the content above changes from row to row (only `renderPreview`'s content cross-fades); pass a function to read the previewed row. Hidden when a row has no preview."
3006
+ },
3007
+ {
3008
+ "name": "previewEmpty",
3009
+ "type": "ReactNode",
3010
+ "required": false,
3011
+ "default": "Nothing to preview for this result",
3012
+ "description": "Shown in the detail pane when the active row has nothing to preview (`renderPreview` returned nothing)."
3013
+ },
3014
+ {
3015
+ "name": "emptyTitle",
3016
+ "type": "ReactNode",
3017
+ "required": false,
3018
+ "description": "The \"No results\" message."
3019
+ },
3020
+ {
3021
+ "name": "emptyDescription",
3022
+ "type": "ReactNode",
3023
+ "required": false
3024
+ },
3025
+ {
3026
+ "name": "suggestions",
3027
+ "type": "CommandMenuSuggestion[]",
3028
+ "required": false,
3029
+ "description": "Quick fixes under the empty message, e.g. \"Did you mean invoice?\".",
3030
+ "shape": {
3031
+ "type": "CommandMenuSuggestion",
3032
+ "collection": "array",
3033
+ "fields": [
3034
+ {
3035
+ "name": "label",
3036
+ "type": "string",
3037
+ "required": true
3038
+ },
3039
+ {
3040
+ "name": "icon",
3041
+ "type": "IconComponent",
3042
+ "required": false
3043
+ },
3044
+ {
3045
+ "name": "iconPosition",
3046
+ "type": "\"start\" | \"end\"",
3047
+ "required": false,
3048
+ "description": "Where the icon sits: before the label (default) or after it (e.g. the × on \"Remove the Files filter\")."
3049
+ },
3050
+ {
3051
+ "name": "emphasis",
3052
+ "type": "string",
3053
+ "required": false,
3054
+ "description": "A word inside `label` to set in the strong weight (\"invoice\" in \"Did you mean invoice?\")."
3055
+ },
3056
+ {
3057
+ "name": "onSelect",
3058
+ "type": "() => void",
3059
+ "required": true
3060
+ }
3061
+ ]
3062
+ }
3063
+ },
3064
+ {
3065
+ "name": "fallbackGroups",
3066
+ "type": "CommandMenuGroup[]",
3067
+ "required": false,
3068
+ "description": "Shown under the empty or error message, and navigable like any group (e.g. \"Try instead\").",
3069
+ "shape": {
3070
+ "type": "CommandMenuGroup",
3071
+ "collection": "array",
3072
+ "fields": [
3073
+ {
3074
+ "name": "id",
3075
+ "type": "string",
3076
+ "required": true
3077
+ },
3078
+ {
3079
+ "name": "label",
3080
+ "type": "string",
3081
+ "required": false,
3082
+ "description": "The small heading above the items."
3083
+ },
3084
+ {
3085
+ "name": "action",
3086
+ "type": "{ label: string; onClick: () => void; }",
3087
+ "required": false,
3088
+ "description": "A link on the right of the heading, e.g. \"See all\"."
3089
+ },
3090
+ {
3091
+ "name": "items",
3092
+ "type": "CommandMenuItem[]",
3093
+ "required": true
3094
+ }
3095
+ ]
3096
+ }
3097
+ },
3098
+ {
3099
+ "name": "errorTitle",
3100
+ "type": "ReactNode",
3101
+ "required": false,
3102
+ "default": "Search is unavailable"
3103
+ },
3104
+ {
3105
+ "name": "errorDescription",
3106
+ "type": "ReactNode",
3107
+ "required": false
3108
+ },
3109
+ {
3110
+ "name": "onRetry",
3111
+ "type": "(() => void)",
3112
+ "required": false
3113
+ },
3114
+ {
3115
+ "name": "onReport",
3116
+ "type": "(() => void)",
3117
+ "required": false,
3118
+ "description": "A second, quieter action beside \"Try again\" in the error state (\"Report\")."
3119
+ },
3120
+ {
3121
+ "name": "retryLabel",
3122
+ "type": "ReactNode",
3123
+ "required": false,
3124
+ "default": "Try again"
3125
+ },
3126
+ {
3127
+ "name": "reportLabel",
3128
+ "type": "ReactNode",
3129
+ "required": false,
3130
+ "default": "Report"
3131
+ },
3132
+ {
3133
+ "name": "workspace",
3134
+ "type": "ReactNode",
3135
+ "required": false,
3136
+ "description": "The workspace switcher in the footer (default variant)."
3137
+ },
3138
+ {
3139
+ "name": "hideFooter",
3140
+ "type": "boolean",
3141
+ "required": false,
3142
+ "default": false,
3143
+ "description": "Hide the footer of key hints."
3144
+ },
3145
+ {
3146
+ "name": "aria-label",
3147
+ "type": "string",
3148
+ "required": false,
3149
+ "default": "Command menu",
3150
+ "description": "Accessible name of the dialog. Defaults to \"Command menu\"."
2418
3151
  },
2419
3152
  {
2420
3153
  "name": "className",
@@ -2424,34 +3157,81 @@
2424
3157
  ],
2425
3158
  "contract": {
2426
3159
  "requiredProps": [
2427
- "color",
2428
- "label"
3160
+ "groups"
2429
3161
  ],
2430
3162
  "requiresAccessibleName": false
2431
3163
  },
2432
- "since": "0.3.0",
2433
- "example": "import { ColorSwatch } from '@sakaniui/react';\n\n<ColorSwatch color=\"var(--color-accent-default)\" label=\"Label\" />"
3164
+ "since": "0.13.0",
3165
+ "example": "import { CommandMenu } from '@sakaniui/react';\n\n<CommandMenu groups={[{ id: \"item-1\", items: [{ id: \"item-1\", label: \"Label\" }] }]} />",
3166
+ "recipes": [
3167
+ {
3168
+ "title": "A ⌘K search over your pages, people and actions",
3169
+ "description": "CommandMenu is controlled by you for what it shows and what happens: pass `groups` of `items`, handle `onSelect`, and give the menu `scopes` for the tabs. It opens on ⌘K by itself (`open` / `onOpenChange` to control it) and filters as you type. For results from a server pass `filter={false}`, set `state=\"loading\"` while you wait, and render the groups you got back. Put a `CommandMenuTrigger` in your top bar. Give every item a `label`; add `shortcut` for key hints and `description` or `meta` for context.",
3170
+ "code": "import React from 'react';\nimport { CommandMenu, CommandMenuTrigger } from '@sakaniui/react';\nimport { IconSettings, IconPlus } from '@sakaniui/react/icons';\n\nconst GROUPS = [\n {\n id: 'pages', label: 'Pages',\n items: [{ id: 'settings', type: 'page' as const, label: 'Settings', description: 'Workspace', icon: IconSettings }],\n },\n {\n id: 'actions', label: 'Actions',\n items: [{ id: 'new', type: 'action' as const, label: 'Create project', icon: IconPlus, shortcut: ['⌘', 'N'] }],\n },\n];\n\nexport const Example = () => {\n const [open, setOpen] = React.useState(false);\n return (\n <>\n <CommandMenuTrigger onClick={() => setOpen(true)} />\n <CommandMenu\n open={open}\n onOpenChange={setOpen}\n groups={GROUPS}\n scopes={[{ value: 'all', label: 'All' }, { value: 'pages', label: 'Pages' }, { value: 'actions', label: 'Actions' }]}\n onSelect={(item) => console.log(item.id)}\n />\n </>\n );\n};"
3171
+ }
3172
+ ],
3173
+ "aliases": [
3174
+ "command palette",
3175
+ "command bar",
3176
+ "cmd k",
3177
+ "cmdk",
3178
+ "search modal",
3179
+ "global search",
3180
+ "spotlight",
3181
+ "quick actions",
3182
+ "omnibar",
3183
+ "search palette",
3184
+ "advanced search",
3185
+ "quick switcher",
3186
+ "command k"
3187
+ ]
2434
3188
  },
2435
3189
  {
2436
- "name": "Combobox",
3190
+ "name": "CommandMenuAnswer",
2437
3191
  "kind": "component",
2438
3192
  "category": "Composite",
2439
3193
  "import": "@sakaniui/react",
2440
- "summary": "Searchable select with single or multi-select.",
3194
+ "summary": "An answer card for the CommandMenu's Ask AI state: the answer text, its sources as chips, and a follow-up. Pass it as the menu's `answer`.",
2441
3195
  "props": [
2442
3196
  {
2443
- "name": "options",
2444
- "type": "ComboboxOption[]",
3197
+ "name": "title",
3198
+ "type": "string",
3199
+ "required": false,
3200
+ "default": "SakaniUI AI"
3201
+ },
3202
+ {
3203
+ "name": "status",
3204
+ "type": "string",
3205
+ "required": false,
3206
+ "description": "e.g. \"Thought for 2.4s\". With `stream` it appears once the text has been written."
3207
+ },
3208
+ {
3209
+ "name": "children",
3210
+ "type": "ReactNode",
2445
3211
  "required": true,
3212
+ "description": "The answer text."
3213
+ },
3214
+ {
3215
+ "name": "stream",
3216
+ "type": "boolean",
3217
+ "required": false,
3218
+ "description": "Writes the answer in word by word, the way a chat reply arrives, and brings in the sources and the follow-up once it is written. Needs `children` to be a plain string; reduced motion shows it at once."
3219
+ },
3220
+ {
3221
+ "name": "onStreamEnd",
3222
+ "type": "(() => void)",
3223
+ "required": false,
3224
+ "description": "Called once when the text has been written (or at once when it is not streamed)."
3225
+ },
3226
+ {
3227
+ "name": "sources",
3228
+ "type": "{ label: string; icon?: IconComponent; }[]",
3229
+ "required": false,
3230
+ "description": "Sources as chips under the answer.",
2446
3231
  "shape": {
2447
- "type": "ComboboxOption",
3232
+ "type": "{ label: string; icon?: IconComponent | undefined; }",
2448
3233
  "collection": "array",
2449
3234
  "fields": [
2450
- {
2451
- "name": "value",
2452
- "type": "string",
2453
- "required": true
2454
- },
2455
3235
  {
2456
3236
  "name": "label",
2457
3237
  "type": "string",
@@ -2459,101 +3239,83 @@
2459
3239
  },
2460
3240
  {
2461
3241
  "name": "icon",
2462
- "type": "ReactNode",
2463
- "required": false
2464
- },
2465
- {
2466
- "name": "disabled",
2467
- "type": "boolean",
3242
+ "type": "IconComponent",
2468
3243
  "required": false
2469
3244
  }
2470
3245
  ]
2471
3246
  }
2472
3247
  },
2473
3248
  {
2474
- "name": "mode",
2475
- "type": "\"single\" | \"multi\"",
3249
+ "name": "onFollowUp",
3250
+ "type": "(() => void)",
2476
3251
  "required": false,
2477
- "values": [
2478
- "single",
2479
- "multi"
2480
- ],
2481
- "default": "single"
3252
+ "description": "Adds an \"Ask a follow-up\" button."
2482
3253
  },
2483
3254
  {
2484
- "name": "size",
2485
- "type": "\"sm\" | \"md\" | \"lg\"",
3255
+ "name": "onOpenInChat",
3256
+ "type": "(() => void)",
2486
3257
  "required": false,
2487
- "values": [
2488
- "sm",
2489
- "md",
2490
- "lg"
2491
- ],
2492
- "default": "md"
2493
- },
2494
- {
2495
- "name": "label",
2496
- "type": "string",
2497
- "required": false
3258
+ "description": "Adds an \"Open in chat\" hint with ⌘↵."
2498
3259
  },
2499
3260
  {
2500
- "name": "description",
2501
- "type": "string",
3261
+ "name": "onCopy",
3262
+ "type": "(() => void)",
2502
3263
  "required": false
2503
3264
  },
2504
3265
  {
2505
- "name": "error",
3266
+ "name": "className",
2506
3267
  "type": "string",
2507
3268
  "required": false
2508
- },
3269
+ }
3270
+ ],
3271
+ "contract": {
3272
+ "requiredProps": [
3273
+ "children"
3274
+ ],
3275
+ "requiresAccessibleName": false
3276
+ },
3277
+ "since": "0.13.0",
3278
+ "example": "import { CommandMenuAnswer } from '@sakaniui/react';\n\n<CommandMenuAnswer>Label</CommandMenuAnswer>",
3279
+ "aliases": [
3280
+ "ai answer",
3281
+ "answer card",
3282
+ "search answer"
3283
+ ]
3284
+ },
3285
+ {
3286
+ "name": "CommandMenuTrigger",
3287
+ "kind": "component",
3288
+ "category": "Composite",
3289
+ "import": "@sakaniui/react",
3290
+ "summary": "The ⌘K pill that opens a CommandMenu, for a top bar or sidebar. A button: give it `onClick`.",
3291
+ "props": [
2509
3292
  {
2510
3293
  "name": "placeholder",
2511
3294
  "type": "string",
2512
3295
  "required": false,
2513
- "default": "Select..."
2514
- },
2515
- {
2516
- "name": "disabled",
2517
- "type": "boolean",
2518
- "required": false
2519
- },
2520
- {
2521
- "name": "loading",
2522
- "type": "boolean",
2523
- "required": false
3296
+ "default": "Search or ask anything…",
3297
+ "description": "The text in the pill. Defaults to \"Search or jump to…\"."
2524
3298
  },
2525
3299
  {
2526
- "name": "value",
2527
- "type": "string | string[]",
3300
+ "name": "shortcut",
3301
+ "type": "string[]",
2528
3302
  "required": false,
2529
- "description": "Controlled selected value(s)."
2530
- },
2531
- {
2532
- "name": "onChange",
2533
- "type": "((value: string | string[]) => void)",
2534
- "required": false
2535
- },
2536
- {
2537
- "name": "className",
2538
- "type": "string",
2539
- "required": false
3303
+ "default": "['⌘', 'K']",
3304
+ "description": "The key caps on the right. Defaults to [\"⌘\", \"K\"]."
2540
3305
  }
2541
3306
  ],
2542
3307
  "contract": {
2543
- "requiredProps": [
2544
- "options"
2545
- ],
3308
+ "requiredProps": [],
2546
3309
  "requiresAccessibleName": false
2547
3310
  },
2548
- "since": "0.1.0",
2549
- "example": "import { Combobox } from '@sakaniui/react';\n\n<Combobox options={[{ value: \"Value\", label: \"Label\" }]} />",
3311
+ "since": "0.13.0",
3312
+ "example": "import { CommandMenuTrigger } from '@sakaniui/react';\n\n<CommandMenuTrigger />",
2550
3313
  "aliases": [
2551
- "autocomplete",
2552
- "typeahead",
2553
- "searchable select",
2554
- "multi select",
2555
- "multiselect",
2556
- "tag input"
3314
+ "search button",
3315
+ "cmd k trigger",
3316
+ "search pill",
3317
+ "search trigger",
3318
+ "command trigger"
2557
3319
  ]
2558
3320
  },
2559
3321
  {
@@ -2749,12 +3511,12 @@
2749
3511
  "props": [
2750
3512
  {
2751
3513
  "name": "type",
2752
- "type": "\"no-data\" | \"no-results\" | \"error\"",
3514
+ "type": "\"error\" | \"no-data\" | \"no-results\"",
2753
3515
  "required": false,
2754
3516
  "values": [
3517
+ "error",
2755
3518
  "no-data",
2756
- "no-results",
2757
- "error"
3519
+ "no-results"
2758
3520
  ],
2759
3521
  "default": "no-data"
2760
3522
  },
@@ -4240,13 +5002,13 @@
4240
5002
  "description": "Returns the item located at the specified index."
4241
5003
  },
4242
5004
  {
4243
- "name": "__@iterator@12750",
5005
+ "name": "__@iterator@15607",
4244
5006
  "type": "() => ArrayIterator<number>",
4245
5007
  "required": true,
4246
5008
  "description": "Iterator"
4247
5009
  },
4248
5010
  {
4249
- "name": "__@unscopables@12780",
5011
+ "name": "__@unscopables@15637",
4250
5012
  "type": "{ [x: number]: boolean | undefined; length?: boolean | undefined; toString?: boolean | undefined; toLocaleString?: boolean | undefined; pop?: boolean | undefined; push?: boolean | undefined; concat?: boolean | undefined; join?: boolean | undefined; reverse?: boolean | undefined; shift?: boolean | undefined; slice?: boolean | undefined; sort?: boolean | undefined; splice?: boolean | undefined; unshift?: boolean | undefined; indexOf?: boolean | undefined; lastIndexOf?: boolean | undefined; every?: boolean | undefined; some?: boolean | undefined; forEach?: boolean | undefined; map?: boolean | undefined; filter?: boolean | undefined; reduce?: boolean | undefined; reduceRight?: boolean | undefined; find?: boolean | undefined; findIndex?: boolean | undefined; fill?: boolean | undefined; copyWithin?: boolean | undefined; entries?: boolean | undefined; keys?: boolean | undefined; values?: boolean | undefined; includes?: boolean | undefined; flatMap?: boolean | undefined; flat?: boolean | undefined; at?: boolean | undefined; [Symbol.iterator]?: boolean | undefined; readonly [Symbol.unscopables]?: boolean | undefined; }",
4251
5013
  "required": true,
4252
5014
  "description": "Is an object whose properties have the value 'true' when they will be absent when used in a 'with' statement."
@@ -4822,13 +5584,13 @@
4822
5584
  "description": "Returns the item located at the specified index."
4823
5585
  },
4824
5586
  {
4825
- "name": "__@iterator@12750",
5587
+ "name": "__@iterator@15607",
4826
5588
  "type": "() => ArrayIterator<number>",
4827
5589
  "required": true,
4828
5590
  "description": "Iterator"
4829
5591
  },
4830
5592
  {
4831
- "name": "__@unscopables@12780",
5593
+ "name": "__@unscopables@15637",
4832
5594
  "type": "{ [x: number]: boolean | undefined; length?: boolean | undefined; toString?: boolean | undefined; toLocaleString?: boolean | undefined; pop?: boolean | undefined; push?: boolean | undefined; concat?: boolean | undefined; join?: boolean | undefined; reverse?: boolean | undefined; shift?: boolean | undefined; slice?: boolean | undefined; sort?: boolean | undefined; splice?: boolean | undefined; unshift?: boolean | undefined; indexOf?: boolean | undefined; lastIndexOf?: boolean | undefined; every?: boolean | undefined; some?: boolean | undefined; forEach?: boolean | undefined; map?: boolean | undefined; filter?: boolean | undefined; reduce?: boolean | undefined; reduceRight?: boolean | undefined; find?: boolean | undefined; findIndex?: boolean | undefined; fill?: boolean | undefined; copyWithin?: boolean | undefined; entries?: boolean | undefined; keys?: boolean | undefined; values?: boolean | undefined; includes?: boolean | undefined; flatMap?: boolean | undefined; flat?: boolean | undefined; at?: boolean | undefined; [Symbol.iterator]?: boolean | undefined; readonly [Symbol.unscopables]?: boolean | undefined; }",
4833
5595
  "required": true,
4834
5596
  "description": "Is an object whose properties have the value 'true' when they will be absent when used in a 'with' statement."
@@ -5212,13 +5974,13 @@
5212
5974
  "description": "Returns the item located at the specified index."
5213
5975
  },
5214
5976
  {
5215
- "name": "__@iterator@12750",
5977
+ "name": "__@iterator@15607",
5216
5978
  "type": "() => ArrayIterator<number>",
5217
5979
  "required": true,
5218
5980
  "description": "Iterator"
5219
5981
  },
5220
5982
  {
5221
- "name": "__@unscopables@12780",
5983
+ "name": "__@unscopables@15637",
5222
5984
  "type": "{ [x: number]: boolean | undefined; length?: boolean | undefined; toString?: boolean | undefined; toLocaleString?: boolean | undefined; pop?: boolean | undefined; push?: boolean | undefined; concat?: boolean | undefined; join?: boolean | undefined; reverse?: boolean | undefined; shift?: boolean | undefined; slice?: boolean | undefined; sort?: boolean | undefined; splice?: boolean | undefined; unshift?: boolean | undefined; indexOf?: boolean | undefined; lastIndexOf?: boolean | undefined; every?: boolean | undefined; some?: boolean | undefined; forEach?: boolean | undefined; map?: boolean | undefined; filter?: boolean | undefined; reduce?: boolean | undefined; reduceRight?: boolean | undefined; find?: boolean | undefined; findIndex?: boolean | undefined; fill?: boolean | undefined; copyWithin?: boolean | undefined; entries?: boolean | undefined; keys?: boolean | undefined; values?: boolean | undefined; includes?: boolean | undefined; flatMap?: boolean | undefined; flat?: boolean | undefined; at?: boolean | undefined; [Symbol.iterator]?: boolean | undefined; readonly [Symbol.unscopables]?: boolean | undefined; }",
5223
5985
  "required": true,
5224
5986
  "description": "Is an object whose properties have the value 'true' when they will be absent when used in a 'with' statement."
@@ -5519,13 +6281,13 @@
5519
6281
  "description": "Returns the item located at the specified index."
5520
6282
  },
5521
6283
  {
5522
- "name": "__@iterator@12750",
6284
+ "name": "__@iterator@15607",
5523
6285
  "type": "() => ArrayIterator<number>",
5524
6286
  "required": true,
5525
6287
  "description": "Iterator"
5526
6288
  },
5527
6289
  {
5528
- "name": "__@unscopables@12780",
6290
+ "name": "__@unscopables@15637",
5529
6291
  "type": "{ [x: number]: boolean | undefined; length?: boolean | undefined; toString?: boolean | undefined; toLocaleString?: boolean | undefined; pop?: boolean | undefined; push?: boolean | undefined; concat?: boolean | undefined; join?: boolean | undefined; reverse?: boolean | undefined; shift?: boolean | undefined; slice?: boolean | undefined; sort?: boolean | undefined; splice?: boolean | undefined; unshift?: boolean | undefined; indexOf?: boolean | undefined; lastIndexOf?: boolean | undefined; every?: boolean | undefined; some?: boolean | undefined; forEach?: boolean | undefined; map?: boolean | undefined; filter?: boolean | undefined; reduce?: boolean | undefined; reduceRight?: boolean | undefined; find?: boolean | undefined; findIndex?: boolean | undefined; fill?: boolean | undefined; copyWithin?: boolean | undefined; entries?: boolean | undefined; keys?: boolean | undefined; values?: boolean | undefined; includes?: boolean | undefined; flatMap?: boolean | undefined; flat?: boolean | undefined; at?: boolean | undefined; [Symbol.iterator]?: boolean | undefined; readonly [Symbol.unscopables]?: boolean | undefined; }",
5530
6292
  "required": true,
5531
6293
  "description": "Is an object whose properties have the value 'true' when they will be absent when used in a 'with' statement."
@@ -8047,6 +8809,123 @@
8047
8809
  "range input"
8048
8810
  ]
8049
8811
  },
8812
+ {
8813
+ "name": "SourceLogo",
8814
+ "kind": "component",
8815
+ "category": "Composite",
8816
+ "import": "@sakaniui/react",
8817
+ "summary": "The real logo of a site an agent searched or read, in its brand colour: `<SourceLogo name=\"reddit\" />`, or `sourceLogo('reddit')` for any `icon` prop (a step's, a SourceStack chip's). Black brands draw in the text colour so they stay visible in dark mode.",
8818
+ "props": [
8819
+ {
8820
+ "name": "name",
8821
+ "type": "\"x\" | \"google\" | \"reddit\" | \"github\" | \"linkedin\" | \"youtube\" | \"hackernews\" | \"wikipedia\" | \"stackoverflow\" | \"producthunt\" | \"medium\" | \"notion\" | \"substack\" | \"arxiv\" | \"bluesky\" | \"perplexity\" | \"duckduckgo\"",
8822
+ "required": true,
8823
+ "values": [
8824
+ "x",
8825
+ "google",
8826
+ "reddit",
8827
+ "github",
8828
+ "linkedin",
8829
+ "youtube",
8830
+ "hackernews",
8831
+ "wikipedia",
8832
+ "stackoverflow",
8833
+ "producthunt",
8834
+ "medium",
8835
+ "notion",
8836
+ "substack",
8837
+ "arxiv",
8838
+ "bluesky",
8839
+ "perplexity",
8840
+ "duckduckgo"
8841
+ ],
8842
+ "description": "Which site: \"google\", \"x\", \"reddit\", \"github\", \"linkedin\", \"youtube\", \"hackernews\", \"wikipedia\", \"stackoverflow\", \"producthunt\", \"medium\", \"notion\", \"substack\", \"arxiv\", \"bluesky\", \"perplexity\" or \"duckduckgo\"."
8843
+ },
8844
+ {
8845
+ "name": "size",
8846
+ "type": "string | number",
8847
+ "required": false,
8848
+ "default": 16,
8849
+ "description": "Rendered size: px, or any CSS length. Default 16."
8850
+ },
8851
+ {
8852
+ "name": "title",
8853
+ "type": "string",
8854
+ "required": false,
8855
+ "description": "Accessible name. Without it the logo is decorative (aria-hidden), which is right next to a text label."
8856
+ }
8857
+ ],
8858
+ "contract": {
8859
+ "requiredProps": [
8860
+ "name"
8861
+ ],
8862
+ "requiresAccessibleName": false
8863
+ },
8864
+ "since": "0.13.0",
8865
+ "example": "import { SourceLogo } from '@sakaniui/react';\n\n<SourceLogo name=\"x\" />",
8866
+ "aliases": [
8867
+ "brand logo",
8868
+ "site logo",
8869
+ "favicon",
8870
+ "website logo",
8871
+ "social logo",
8872
+ "colour logo"
8873
+ ]
8874
+ },
8875
+ {
8876
+ "name": "SourceStack",
8877
+ "kind": "component",
8878
+ "category": "Composite",
8879
+ "import": "@sakaniui/react",
8880
+ "summary": "Overlapping site-icon chips for a step's sources: pass `sources` as { label, icon } (three to five read best).",
8881
+ "props": [
8882
+ {
8883
+ "name": "sources",
8884
+ "type": "SourceStackSource[]",
8885
+ "required": true,
8886
+ "description": "The sources, in order. Three to five read best.",
8887
+ "shape": {
8888
+ "type": "SourceStackSource",
8889
+ "collection": "array",
8890
+ "fields": [
8891
+ {
8892
+ "name": "label",
8893
+ "type": "string",
8894
+ "required": true,
8895
+ "description": "The site's name, e.g. \"Reddit\". Read out and shown as a tooltip."
8896
+ },
8897
+ {
8898
+ "name": "icon",
8899
+ "type": "IconComponent",
8900
+ "required": false,
8901
+ "description": "A brand or generic icon, drawn at 10px. Defaults to a globe."
8902
+ }
8903
+ ]
8904
+ }
8905
+ },
8906
+ {
8907
+ "name": "className",
8908
+ "type": "string",
8909
+ "required": false
8910
+ }
8911
+ ],
8912
+ "contract": {
8913
+ "requiredProps": [
8914
+ "sources"
8915
+ ],
8916
+ "requiresAccessibleName": false
8917
+ },
8918
+ "since": "0.12.0",
8919
+ "example": "import { SourceStack } from '@sakaniui/react';\n\n<SourceStack sources={[{ label: \"Label\" }]} />",
8920
+ "aliases": [
8921
+ "sources",
8922
+ "favicon stack",
8923
+ "source chips",
8924
+ "citations",
8925
+ "citation chips",
8926
+ "site icons"
8927
+ ]
8928
+ },
8050
8929
  {
8051
8930
  "name": "SpendingBalance",
8052
8931
  "kind": "component",
@@ -9708,6 +10587,63 @@
9708
10587
  "since": "0.3.0",
9709
10588
  "example": "import { WishlistButton } from '@sakaniui/react';\n\n<WishlistButton />"
9710
10589
  },
10590
+ {
10591
+ "name": "WorkingIndicator",
10592
+ "kind": "component",
10593
+ "category": "Composite",
10594
+ "import": "@sakaniui/react",
10595
+ "summary": "The live status line under an agent's steps: a sparkle, \"Working\" and the elapsed time (`startedAt` ticks on its own), or a check and \"Worked for 11s\" when done.",
10596
+ "props": [
10597
+ {
10598
+ "name": "status",
10599
+ "type": "\"done\" | \"working\"",
10600
+ "required": false,
10601
+ "values": [
10602
+ "done",
10603
+ "working"
10604
+ ],
10605
+ "default": "working",
10606
+ "description": "\"working\" shows a sparkle and a shimmering label; \"done\" shows a check. Defaults to \"working\"."
10607
+ },
10608
+ {
10609
+ "name": "label",
10610
+ "type": "string",
10611
+ "required": false,
10612
+ "description": "Replaces the default label (\"Working\" / \"Worked for\")."
10613
+ },
10614
+ {
10615
+ "name": "elapsed",
10616
+ "type": "number",
10617
+ "required": false,
10618
+ "description": "Elapsed seconds. Takes precedence over startedAt."
10619
+ },
10620
+ {
10621
+ "name": "startedAt",
10622
+ "type": "number",
10623
+ "required": false,
10624
+ "description": "Epoch ms when the work started; while \"working\" the time ticks on its own."
10625
+ },
10626
+ {
10627
+ "name": "className",
10628
+ "type": "string",
10629
+ "required": false
10630
+ }
10631
+ ],
10632
+ "contract": {
10633
+ "requiredProps": [],
10634
+ "requiresAccessibleName": false
10635
+ },
10636
+ "since": "0.12.0",
10637
+ "example": "import { WorkingIndicator } from '@sakaniui/react';\n\n<WorkingIndicator />",
10638
+ "aliases": [
10639
+ "thinking indicator",
10640
+ "working status",
10641
+ "agent status",
10642
+ "typing status",
10643
+ "elapsed timer",
10644
+ "shimmer label"
10645
+ ]
10646
+ },
9711
10647
  {
9712
10648
  "name": "XIcon",
9713
10649
  "kind": "component",
@@ -12785,6 +13721,18 @@
12785
13721
  "import": "@sakaniui/react",
12786
13722
  "since": "0.3.0"
12787
13723
  },
13724
+ {
13725
+ "name": "sourceLogo",
13726
+ "kind": "helper",
13727
+ "import": "@sakaniui/react",
13728
+ "since": "0.13.0"
13729
+ },
13730
+ {
13731
+ "name": "sourceLogoNames",
13732
+ "kind": "helper",
13733
+ "import": "@sakaniui/react",
13734
+ "since": "0.13.0"
13735
+ },
12788
13736
  {
12789
13737
  "name": "syncLiquidBackdrop",
12790
13738
  "kind": "helper",