sparkdesign 0.4.0 → 0.4.2

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 (46) hide show
  1. package/cli/registry/{basic → __tests__/basic}/button.test.tsx +1 -1
  2. package/cli/registry/{chat → __tests__/chat}/markdown.test.tsx +1 -1
  3. package/cli/registry/{chat → __tests__/chat}/thinking-indicator.test.tsx +1 -1
  4. package/cli/registry/{chat → __tests__/chat}/tool-invocation-card.test.tsx +1 -1
  5. package/cli/registry/basic/shimmering-text.tsx +115 -0
  6. package/cli/registry/{chat → basic}/sidebar-menu.tsx +2 -2
  7. package/cli/registry/meta.json +1 -1
  8. package/dist/registry/basic/shimmering-text.d.ts +27 -0
  9. package/dist/scale/computed.css +103 -0
  10. package/dist/scale/config.css +110 -0
  11. package/dist/scale/index.css +30 -0
  12. package/dist/scale/presets/compact.css +30 -0
  13. package/dist/scale/presets/dense.css +64 -0
  14. package/dist/scale/presets/sharp.css +40 -0
  15. package/dist/scale/presets/soft.css +16 -0
  16. package/dist/spark-design.cjs.js +17 -17
  17. package/dist/spark-design.es.js +2198 -2146
  18. package/dist/src/components/{chat → basic}/CollapsibleCard/index.d.ts +1 -1
  19. package/dist/src/components/basic/ShimmeringText/index.d.ts +7 -0
  20. package/dist/src/components/{chat → basic}/SidebarMenu/index.d.ts +1 -1
  21. package/dist/src/components/index.d.ts +8 -6
  22. package/dist/src/lib/utils.d.ts +5 -5
  23. package/dist/theme-base.css +270 -0
  24. package/dist/themes/dark-parchment.css +133 -0
  25. package/dist/themes/dark-qoder.css +133 -0
  26. package/dist/themes/light-parchment.css +124 -0
  27. package/dist/themes/light-qoder.css +132 -0
  28. package/dist/tokens/CLAUDE.md +305 -0
  29. package/dist/tokens/index.css +35 -0
  30. package/dist/tokens/scale/computed.css +103 -0
  31. package/dist/tokens/scale/config.css +110 -0
  32. package/dist/tokens/scale/index.css +30 -0
  33. package/dist/tokens/scale/presets/compact.css +30 -0
  34. package/dist/tokens/scale/presets/dense.css +64 -0
  35. package/dist/tokens/scale/presets/sharp.css +40 -0
  36. package/dist/tokens/scale/presets/soft.css +16 -0
  37. package/dist/tokens/scale.css +13 -0
  38. package/dist/tokens/scrollbar-utility.css +35 -0
  39. package/dist/tokens/theme-base.css +270 -0
  40. package/dist/tokens/theme.css +17 -0
  41. package/dist/tokens/themes/dark-parchment.css +133 -0
  42. package/dist/tokens/themes/dark-qoder.css +133 -0
  43. package/dist/tokens/themes/light-parchment.css +124 -0
  44. package/dist/tokens/themes/light-qoder.css +132 -0
  45. package/package.json +6 -2
  46. /package/dist/registry/{chat → basic}/sidebar-menu.d.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, vi } from 'vitest'
2
2
  import { render, screen, fireEvent } from '@testing-library/react'
3
- import { Button } from './button'
3
+ import { Button } from '../../basic/button'
4
4
  import { createRef } from 'react'
5
5
 
6
6
  describe('Button', () => {
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest'
2
2
  import { render, screen } from '@testing-library/react'
3
- import { MarkdownBody } from './markdown'
3
+ import { MarkdownBody } from '../../chat/markdown'
4
4
 
5
5
  describe('MarkdownBody', () => {
6
6
  // ============================================================
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest'
2
2
  import { render, screen } from '@testing-library/react'
3
- import { ThinkingIndicator } from './thinking-indicator'
3
+ import { ThinkingIndicator } from '../../chat/thinking-indicator'
4
4
 
5
5
  describe('ThinkingIndicator', () => {
6
6
  // ============================================================
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest'
2
2
  import { render, screen, fireEvent } from '@testing-library/react'
3
- import { ToolInvocationCard } from './tool-invocation-card'
3
+ import { ToolInvocationCard } from '../../chat/tool-invocation-card'
4
4
 
5
5
  describe('ToolInvocationCard', () => {
6
6
  // ============================================================
@@ -0,0 +1,115 @@
1
+ import { useMemo, forwardRef, useRef } from 'react'
2
+ import { motion, useInView, type HTMLMotionProps } from 'framer-motion'
3
+ import { cn } from '../lib/utils'
4
+
5
+ export interface ShimmeringTextProps extends Omit<HTMLMotionProps<'span'>, 'children'> {
6
+ /** Required. Text to display with shimmer effect */
7
+ text: string
8
+ /** Animation duration in seconds. Default: 2 */
9
+ duration?: number
10
+ /** Delay before starting animation in seconds. Default: 0 */
11
+ delay?: number
12
+ /** Whether to repeat the animation. Default: true */
13
+ repeat?: boolean
14
+ /** Pause duration between repeats in seconds. Default: 0.5 */
15
+ repeatDelay?: number
16
+ /** Whether to start animation when entering viewport. Default: true */
17
+ startOnView?: boolean
18
+ /** Whether to animate only once. Default: false */
19
+ once?: boolean
20
+ /** Margin for viewport detection (e.g., "0px 0px -10%"). Default: undefined */
21
+ inViewMargin?: string
22
+ /** Shimmer spread multiplier. Default: 2 */
23
+ spread?: number
24
+ /** Base text color (CSS color value) */
25
+ color?: string
26
+ /** Shimmer gradient color (CSS color value) */
27
+ shimmerColor?: string
28
+ }
29
+
30
+ const ShimmeringText = forwardRef<HTMLSpanElement, ShimmeringTextProps>(
31
+ (
32
+ {
33
+ text,
34
+ duration = 2,
35
+ delay = 0,
36
+ repeat = true,
37
+ repeatDelay = 0.5,
38
+ startOnView = true,
39
+ once = false,
40
+ inViewMargin,
41
+ spread = 2,
42
+ color,
43
+ shimmerColor,
44
+ className,
45
+ style,
46
+ ...props
47
+ },
48
+ ref
49
+ ) => {
50
+ const containerRef = useRef<HTMLSpanElement>(null)
51
+ const isInView = useInView(containerRef, {
52
+ once: once,
53
+ margin: inViewMargin as `${number}px ${number}px ${number}px ${number}px` | undefined,
54
+ })
55
+
56
+ const shouldAnimate = startOnView ? isInView : true
57
+
58
+ const dynamicSpread = useMemo(() => {
59
+ return text.length * spread
60
+ }, [text, spread])
61
+
62
+ const baseColor = color || 'var(--color-text-secondary)'
63
+ const highlightColor = shimmerColor || 'var(--color-text)'
64
+
65
+ const backgroundStyle = useMemo(() => {
66
+ return {
67
+ backgroundImage: `linear-gradient(90deg, transparent calc(50% - ${dynamicSpread}px), ${highlightColor}, transparent calc(50% + ${dynamicSpread}px)), linear-gradient(${baseColor}, ${baseColor})`,
68
+ }
69
+ }, [dynamicSpread, highlightColor, baseColor])
70
+
71
+ const combinedRef = (node: HTMLSpanElement | null) => {
72
+ ;(containerRef as React.MutableRefObject<HTMLSpanElement | null>).current = node
73
+ if (typeof ref === 'function') {
74
+ ref(node)
75
+ } else if (ref) {
76
+ ref.current = node
77
+ }
78
+ }
79
+
80
+ return (
81
+ <motion.span
82
+ ref={combinedRef}
83
+ className={cn(
84
+ 'relative inline-block bg-clip-text text-transparent',
85
+ 'bg-[length:250%_100%,auto] bg-no-repeat',
86
+ className
87
+ )}
88
+ style={{
89
+ ...backgroundStyle,
90
+ ...style,
91
+ }}
92
+ initial={{ backgroundPosition: '100% center' }}
93
+ animate={
94
+ shouldAnimate
95
+ ? { backgroundPosition: '0% center' }
96
+ : { backgroundPosition: '100% center' }
97
+ }
98
+ transition={{
99
+ repeat: repeat && !once ? Infinity : 0,
100
+ repeatDelay: repeatDelay,
101
+ duration: duration,
102
+ delay: delay,
103
+ ease: 'linear',
104
+ }}
105
+ {...props}
106
+ >
107
+ {text}
108
+ </motion.span>
109
+ )
110
+ }
111
+ )
112
+
113
+ ShimmeringText.displayName = 'ShimmeringText'
114
+
115
+ export { ShimmeringText }
@@ -6,8 +6,8 @@ import {
6
6
  DropdownMenuContent,
7
7
  DropdownMenuItem,
8
8
  DropdownMenuTrigger,
9
- } from '../basic/dropdown-menu'
10
- import { MoreLine } from '../basic/icons-inline'
9
+ } from './dropdown-menu'
10
+ import { MoreLine } from './icons-inline'
11
11
 
12
12
  export interface SidebarMenuItemAction {
13
13
  id: string
@@ -1 +1 @@
1
- {"button":{"files":["basic/button.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"icon-button":{"files":["basic/icon-button.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"tooltip":{"files":["basic/tooltip.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-tooltip","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"dropdown-menu":{"files":["basic/dropdown-menu.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-dropdown-menu","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"alert-dialog":{"files":["basic/alert-dialog.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-alert-dialog","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"progress":{"files":["basic/progress.tsx"],"dependencies":["@radix-ui/react-progress","clsx"],"peerDependencies":["react","react-dom"]},"skeleton":{"files":["basic/skeleton.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"kbd":{"files":["basic/kbd.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"tag":{"files":["basic/tag.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"tabs":{"files":["basic/tabs.tsx"],"dependencies":["@radix-ui/react-tabs","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"switch":{"files":["basic/switch.tsx"],"dependencies":["@radix-ui/react-switch","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"avatar":{"files":["basic/avatar.tsx"],"dependencies":["@radix-ui/react-avatar","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"collapse":{"files":["basic/collapse.tsx","basic/icons-inline.tsx"],"dependencies":["@radix-ui/react-accordion","clsx"],"peerDependencies":["react","react-dom"]},"slider":{"files":["basic/slider.tsx"],"dependencies":["@radix-ui/react-slider","clsx"],"peerDependencies":["react","react-dom"]},"select":{"files":["basic/select.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-select","clsx"],"peerDependencies":["react","react-dom"]},"table":{"files":["basic/table.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"toggle":{"files":["basic/toggle.tsx"],"dependencies":["@radix-ui/react-toggle","@radix-ui/react-toggle-group","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"radio-group":{"files":["basic/radio-group.tsx"],"dependencies":["@radix-ui/react-radio-group","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"typography":{"files":["basic/typography.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"spinner":{"files":["basic/spinner.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"pagination":{"files":["basic/pagination.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"option-list":{"files":["basic/option-list.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"collapsible":{"files":["basic/collapsible.tsx"],"dependencies":["@radix-ui/react-collapsible","clsx"],"peerDependencies":["react","react-dom"]},"resizable":{"files":["basic/resizable.tsx"],"dependencies":["react-resizable-panels","clsx"],"peerDependencies":["react","react-dom"]},"scrollbar":{"files":["basic/scrollbar.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"sonner":{"files":["basic/sonner.tsx","basic/theme-from-document.ts"],"dependencies":["sonner"],"peerDependencies":["react","react-dom"]},"send-button":{"files":["chat/send-button.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"folder-button":{"files":["chat/folder-button.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"file-attachment":{"files":["chat/file-attachment.tsx","basic/tag.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"image-attachment":{"files":["chat/image-attachment.tsx","basic/icon-button.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"file-card":{"files":["chat/file-card.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"request":{"files":["chat/request.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"related-prompts":{"files":["chat/related-prompts.tsx","basic/tooltip.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-tooltip","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"permission-card":{"files":["chat/permission-card.tsx","basic/button.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"suggestion-part":{"files":["chat/suggestion-part.tsx","basic/button.tsx","basic/dropdown-menu.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-dropdown-menu","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"generation-status-bar":{"files":["chat/generation-status-bar.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"queue-indicator":{"files":["chat/queue-indicator.tsx","basic/tooltip.tsx","basic/icon-button.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-tooltip","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"tool-invocation-card":{"files":["chat/tool-invocation-card.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"reasoning-step":{"files":["chat/reasoning-step.tsx","basic/icons-inline.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"sidebar-menu":{"files":["chat/sidebar-menu.tsx","basic/dropdown-menu.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-dropdown-menu","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"user-question-answer":{"files":["chat/user-question-answer.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"generated-images-grid":{"files":["chat/generated-images-grid.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"thinking-indicator":{"files":["chat/thinking-indicator.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"image-generating":{"files":["chat/image-generating.tsx","basic/icons-inline.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"markdown":{"files":["chat/markdown.tsx"],"dependencies":["react-markdown","remark-gfm","remark-math","rehype-katex","clsx"],"peerDependencies":["react","react-dom"]},"streaming-markdown-block":{"files":["chat/streaming-markdown-block.tsx","chat/markdown.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"response":{"files":["chat/response.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"chat-input":{"files":["chat/chat-input/index.tsx","chat/chat-input/types.ts","chat/chat-input/useAutoResizeTextarea.ts","chat/chat-input/chat-input-textarea.tsx","chat/chat-input/chat-input-folder-selector.tsx","chat/chat-input/chat-input-model-switcher.tsx","chat/chat-input/folder-permission-dialog.tsx","chat/send-button.tsx","chat/folder-button.tsx","chat/generation-status-bar.tsx","basic/icon-button.tsx","basic/dropdown-menu.tsx","basic/alert-dialog.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"user-question":{"files":["chat/user-question.tsx","basic/button.tsx","basic/icon-button.tsx","basic/option-list.tsx","basic/kbd.tsx","basic/icons-inline.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]}}
1
+ {"shimmering-text":{"files":["basic/shimmering-text.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"button":{"files":["basic/button.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"icon-button":{"files":["basic/icon-button.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"tooltip":{"files":["basic/tooltip.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-tooltip","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"dropdown-menu":{"files":["basic/dropdown-menu.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-dropdown-menu","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"alert-dialog":{"files":["basic/alert-dialog.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-alert-dialog","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"progress":{"files":["basic/progress.tsx"],"dependencies":["@radix-ui/react-progress","clsx"],"peerDependencies":["react","react-dom"]},"skeleton":{"files":["basic/skeleton.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"kbd":{"files":["basic/kbd.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"tag":{"files":["basic/tag.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"tabs":{"files":["basic/tabs.tsx"],"dependencies":["@radix-ui/react-tabs","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"switch":{"files":["basic/switch.tsx"],"dependencies":["@radix-ui/react-switch","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"avatar":{"files":["basic/avatar.tsx"],"dependencies":["@radix-ui/react-avatar","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"collapse":{"files":["basic/collapse.tsx","basic/icons-inline.tsx"],"dependencies":["@radix-ui/react-accordion","clsx"],"peerDependencies":["react","react-dom"]},"slider":{"files":["basic/slider.tsx"],"dependencies":["@radix-ui/react-slider","clsx"],"peerDependencies":["react","react-dom"]},"select":{"files":["basic/select.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-select","clsx"],"peerDependencies":["react","react-dom"]},"table":{"files":["basic/table.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"toggle":{"files":["basic/toggle.tsx"],"dependencies":["@radix-ui/react-toggle","@radix-ui/react-toggle-group","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"radio-group":{"files":["basic/radio-group.tsx"],"dependencies":["@radix-ui/react-radio-group","class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"typography":{"files":["basic/typography.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"spinner":{"files":["basic/spinner.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"pagination":{"files":["basic/pagination.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"option-list":{"files":["basic/option-list.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"collapsible":{"files":["basic/collapsible.tsx"],"dependencies":["@radix-ui/react-collapsible","clsx"],"peerDependencies":["react","react-dom"]},"resizable":{"files":["basic/resizable.tsx"],"dependencies":["react-resizable-panels","clsx"],"peerDependencies":["react","react-dom"]},"scrollbar":{"files":["basic/scrollbar.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"sonner":{"files":["basic/sonner.tsx","basic/theme-from-document.ts"],"dependencies":["sonner"],"peerDependencies":["react","react-dom"]},"send-button":{"files":["chat/send-button.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"folder-button":{"files":["chat/folder-button.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"file-attachment":{"files":["chat/file-attachment.tsx","basic/tag.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"image-attachment":{"files":["chat/image-attachment.tsx","basic/icon-button.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"file-card":{"files":["chat/file-card.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"request":{"files":["chat/request.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"related-prompts":{"files":["chat/related-prompts.tsx","basic/tooltip.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-tooltip","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"permission-card":{"files":["chat/permission-card.tsx","basic/button.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"suggestion-part":{"files":["chat/suggestion-part.tsx","basic/button.tsx","basic/dropdown-menu.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-dropdown-menu","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"generation-status-bar":{"files":["chat/generation-status-bar.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"queue-indicator":{"files":["chat/queue-indicator.tsx","basic/tooltip.tsx","basic/icon-button.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-tooltip","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"tool-invocation-card":{"files":["chat/tool-invocation-card.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"reasoning-step":{"files":["chat/reasoning-step.tsx","basic/icons-inline.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"sidebar-menu":{"files":["basic/sidebar-menu.tsx","basic/dropdown-menu.tsx","basic/icons-inline.tsx","basic/theme-from-document.ts"],"dependencies":["@radix-ui/react-dropdown-menu","class-variance-authority","clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"user-question-answer":{"files":["chat/user-question-answer.tsx","basic/icons-inline.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"generated-images-grid":{"files":["chat/generated-images-grid.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"thinking-indicator":{"files":["chat/thinking-indicator.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"image-generating":{"files":["chat/image-generating.tsx","basic/icons-inline.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"markdown":{"files":["chat/markdown.tsx"],"dependencies":["react-markdown","remark-gfm","remark-math","rehype-katex","clsx"],"peerDependencies":["react","react-dom"]},"streaming-markdown-block":{"files":["chat/streaming-markdown-block.tsx","chat/markdown.tsx"],"dependencies":["clsx"],"peerDependencies":["react","react-dom"]},"response":{"files":["chat/response.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]},"chat-input":{"files":["chat/chat-input/index.tsx","chat/chat-input/types.ts","chat/chat-input/useAutoResizeTextarea.ts","chat/chat-input/chat-input-textarea.tsx","chat/chat-input/chat-input-folder-selector.tsx","chat/chat-input/chat-input-model-switcher.tsx","chat/chat-input/folder-permission-dialog.tsx","chat/send-button.tsx","chat/folder-button.tsx","chat/generation-status-bar.tsx","basic/icon-button.tsx","basic/dropdown-menu.tsx","basic/alert-dialog.tsx","basic/icons-inline.tsx"],"dependencies":["class-variance-authority","clsx"],"peerDependencies":["react","react-dom"]},"user-question":{"files":["chat/user-question.tsx","basic/button.tsx","basic/icon-button.tsx","basic/option-list.tsx","basic/kbd.tsx","basic/icons-inline.tsx"],"dependencies":["clsx","framer-motion"],"peerDependencies":["react","react-dom"]}}
@@ -0,0 +1,27 @@
1
+ import { type HTMLMotionProps } from 'framer-motion';
2
+ export interface ShimmeringTextProps extends Omit<HTMLMotionProps<'span'>, 'children'> {
3
+ /** Required. Text to display with shimmer effect */
4
+ text: string;
5
+ /** Animation duration in seconds. Default: 2 */
6
+ duration?: number;
7
+ /** Delay before starting animation in seconds. Default: 0 */
8
+ delay?: number;
9
+ /** Whether to repeat the animation. Default: true */
10
+ repeat?: boolean;
11
+ /** Pause duration between repeats in seconds. Default: 0.5 */
12
+ repeatDelay?: number;
13
+ /** Whether to start animation when entering viewport. Default: true */
14
+ startOnView?: boolean;
15
+ /** Whether to animate only once. Default: false */
16
+ once?: boolean;
17
+ /** Margin for viewport detection (e.g., "0px 0px -10%"). Default: undefined */
18
+ inViewMargin?: string;
19
+ /** Shimmer spread multiplier. Default: 2 */
20
+ spread?: number;
21
+ /** Base text color (CSS color value) */
22
+ color?: string;
23
+ /** Shimmer gradient color (CSS color value) */
24
+ shimmerColor?: string;
25
+ }
26
+ declare const ShimmeringText: import("react").ForwardRefExoticComponent<Omit<ShimmeringTextProps, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
27
+ export { ShimmeringText };
@@ -0,0 +1,103 @@
1
+ /* ============================================
2
+ * Scale Computed - 应用配置,产出实际变量
3
+ *
4
+ * 此文件将 --config-* 映射到 --spacing-* / --radius-* / --font-size-*
5
+ * 组件和样式使用这些实际变量,不直接使用 --config-*
6
+ * ============================================ */
7
+
8
+ :root,
9
+ [data-style="neutral"] {
10
+ /* ============================================
11
+ Spacing (从配置映射)
12
+ ============================================ */
13
+ --spacing: var(--config-spacing-1);
14
+ --spacing-0: var(--config-spacing-0);
15
+ --spacing-px: var(--config-spacing-px);
16
+ --spacing-0\.5: var(--config-spacing-0\.5);
17
+ --spacing-1: var(--config-spacing-1);
18
+ --spacing-1\.5: var(--config-spacing-1\.5);
19
+ --spacing-2: var(--config-spacing-2);
20
+ --spacing-2\.5: var(--config-spacing-2\.5);
21
+ --spacing-3: var(--config-spacing-3);
22
+ --spacing-3\.5: var(--config-spacing-3\.5);
23
+ --spacing-4: var(--config-spacing-4);
24
+ --spacing-5: var(--config-spacing-5);
25
+ --spacing-6: var(--config-spacing-6);
26
+ --spacing-7: var(--config-spacing-7);
27
+ --spacing-8: var(--config-spacing-8);
28
+ --spacing-9: var(--config-spacing-9);
29
+ --spacing-10: var(--config-spacing-10);
30
+ --spacing-11: var(--config-spacing-11);
31
+ --spacing-12: var(--config-spacing-12);
32
+ --spacing-14: var(--config-spacing-14);
33
+ --spacing-16: var(--config-spacing-16);
34
+ --spacing-20: var(--config-spacing-20);
35
+ --spacing-24: var(--config-spacing-24);
36
+ --spacing-28: var(--config-spacing-28);
37
+ --spacing-32: var(--config-spacing-32);
38
+ --spacing-36: var(--config-spacing-36);
39
+ --spacing-40: var(--config-spacing-40);
40
+ --spacing-44: var(--config-spacing-44);
41
+ --spacing-48: var(--config-spacing-48);
42
+ --spacing-52: var(--config-spacing-52);
43
+ --spacing-56: var(--config-spacing-56);
44
+ --spacing-60: var(--config-spacing-60);
45
+ --spacing-64: var(--config-spacing-64);
46
+ --spacing-72: var(--config-spacing-72);
47
+ --spacing-80: var(--config-spacing-80);
48
+ --spacing-96: var(--config-spacing-96);
49
+
50
+ /* ============================================
51
+ Radius (从配置映射)
52
+ ============================================ */
53
+ --radius-none: var(--config-radius-none);
54
+ --radius-sm: var(--config-radius-sm);
55
+ --radius-DEFAULT: var(--config-radius-default);
56
+ --radius-md: var(--config-radius-md);
57
+ --radius-lg: var(--config-radius-lg);
58
+ --radius-xl: var(--config-radius-xl);
59
+ --radius-2xl: var(--config-radius-2xl);
60
+ --radius-3xl: var(--config-radius-3xl);
61
+ --radius-full: var(--config-radius-full);
62
+ --radius: var(--radius-DEFAULT);
63
+
64
+ /* ============================================
65
+ Font Size (从配置映射)
66
+ ============================================ */
67
+ --font-size-xs: var(--config-font-size-xs);
68
+ --font-size-xs--line-height: var(--config-font-size-xs-lh);
69
+ --font-size-sm: var(--config-font-size-sm);
70
+ --font-size-sm--line-height: var(--config-font-size-sm-lh);
71
+ --font-size-base: var(--config-font-size-base);
72
+ --font-size-base--line-height: var(--config-font-size-base-lh);
73
+ --font-size-lg: var(--config-font-size-lg);
74
+ --font-size-lg--line-height: var(--config-font-size-lg-lh);
75
+ --font-size-xl: var(--config-font-size-xl);
76
+ --font-size-xl--line-height: var(--config-font-size-xl-lh);
77
+ --font-size-2xl: var(--config-font-size-2xl);
78
+ --font-size-2xl--line-height: var(--config-font-size-2xl-lh);
79
+ --font-size-3xl: var(--config-font-size-3xl);
80
+ --font-size-3xl--line-height: var(--config-font-size-3xl-lh);
81
+ --font-size-4xl: var(--config-font-size-4xl);
82
+ --font-size-4xl--line-height: var(--config-font-size-4xl-lh);
83
+ --font-size-5xl: var(--config-font-size-5xl);
84
+ --font-size-5xl--line-height: var(--config-font-size-5xl-lh);
85
+ --font-size-6xl: var(--config-font-size-6xl);
86
+ --font-size-6xl--line-height: var(--config-font-size-6xl-lh);
87
+ --font-size-7xl: var(--config-font-size-7xl);
88
+ --font-size-7xl--line-height: var(--config-font-size-7xl-lh);
89
+ --font-size-8xl: var(--config-font-size-8xl);
90
+ --font-size-8xl--line-height: var(--config-font-size-8xl-lh);
91
+ --font-size-9xl: var(--config-font-size-9xl);
92
+ --font-size-9xl--line-height: var(--config-font-size-9xl-lh);
93
+
94
+ /* ============================================
95
+ Motion (从配置映射)
96
+ ============================================ */
97
+ --motion-duration-fast: var(--config-motion-duration-fast);
98
+ --motion-duration-base: var(--config-motion-duration-base);
99
+ --motion-duration-slow: var(--config-motion-duration-slow);
100
+ --motion-ease-standard: var(--config-motion-ease-standard);
101
+ --motion-ease-emphasized: var(--config-motion-ease-emphasized);
102
+ --motion-ease-out: var(--config-motion-ease-out);
103
+ }
@@ -0,0 +1,110 @@
1
+ /* ============================================
2
+ * Scale Config - 可配置的布局基础变量
3
+ *
4
+ * 用户可覆盖这些变量来自定义布局风格:
5
+ * :root {
6
+ * --config-radius-default: 10px; // 自定义默认圆角
7
+ * --config-spacing-4: 18px; // 自定义 spacing-4
8
+ * }
9
+ * ============================================ */
10
+
11
+ :root {
12
+ /* ============================================
13
+ Spacing 配置 (Tailwind 兼容)
14
+ ============================================ */
15
+ --config-spacing-unit: 4px; /* 基础单位 */
16
+ --config-spacing-0: 0;
17
+ --config-spacing-px: 1px;
18
+ --config-spacing-0\.5: 2px;
19
+ --config-spacing-1: 4px;
20
+ --config-spacing-1\.5: 6px;
21
+ --config-spacing-2: 8px;
22
+ --config-spacing-2\.5: 10px;
23
+ --config-spacing-3: 12px;
24
+ --config-spacing-3\.5: 14px;
25
+ --config-spacing-4: 16px;
26
+ --config-spacing-5: 20px;
27
+ --config-spacing-6: 24px;
28
+ --config-spacing-7: 28px;
29
+ --config-spacing-8: 32px;
30
+ --config-spacing-9: 36px;
31
+ --config-spacing-10: 40px;
32
+ --config-spacing-11: 44px;
33
+ --config-spacing-12: 48px;
34
+ --config-spacing-14: 56px;
35
+ --config-spacing-16: 64px;
36
+ --config-spacing-20: 80px;
37
+ --config-spacing-24: 96px;
38
+ --config-spacing-28: 112px;
39
+ --config-spacing-32: 128px;
40
+ --config-spacing-36: 144px;
41
+ --config-spacing-40: 160px;
42
+ --config-spacing-44: 176px;
43
+ --config-spacing-48: 192px;
44
+ --config-spacing-52: 208px;
45
+ --config-spacing-56: 224px;
46
+ --config-spacing-60: 240px;
47
+ --config-spacing-64: 256px;
48
+ --config-spacing-72: 288px;
49
+ --config-spacing-80: 320px;
50
+ --config-spacing-96: 384px;
51
+
52
+ /* ============================================
53
+ Radius 配置
54
+ ============================================ */
55
+ --config-radius-none: 0;
56
+ --config-radius-sm: 4px;
57
+ --config-radius-default: 6px;
58
+ --config-radius-md: 6px;
59
+ --config-radius-lg: 8px;
60
+ --config-radius-xl: 12px;
61
+ --config-radius-2xl: 16px;
62
+ --config-radius-3xl: 24px;
63
+ --config-radius-full: 9999px;
64
+
65
+ /* ============================================
66
+ Font Size 配置
67
+ ============================================ */
68
+ --config-font-size-xs: 12px;
69
+ --config-font-size-xs-lh: 16px;
70
+ --config-font-size-sm: 14px;
71
+ --config-font-size-sm-lh: 20px;
72
+ --config-font-size-base: 14px;
73
+ --config-font-size-base-lh: 20px;
74
+ --config-font-size-lg: 16px;
75
+ --config-font-size-lg-lh: 24px;
76
+ --config-font-size-xl: 18px;
77
+ --config-font-size-xl-lh: 24px;
78
+ --config-font-size-2xl: 20px;
79
+ --config-font-size-2xl-lh: 24px;
80
+ --config-font-size-3xl: 24px;
81
+ --config-font-size-3xl-lh: 28px;
82
+ --config-font-size-4xl: 30px;
83
+ --config-font-size-4xl-lh: 32px;
84
+ --config-font-size-5xl: 36px;
85
+ --config-font-size-5xl-lh: 36px;
86
+ --config-font-size-6xl: 48px;
87
+ --config-font-size-6xl-lh: 1;
88
+ --config-font-size-7xl: 60px;
89
+ --config-font-size-7xl-lh: 1;
90
+ --config-font-size-8xl: 72px;
91
+ --config-font-size-8xl-lh: 1;
92
+ --config-font-size-9xl: 96px;
93
+ --config-font-size-9xl-lh: 1;
94
+
95
+ /* ============================================
96
+ Motion 配置
97
+ ============================================ */
98
+ --config-motion-duration-fast: 150ms;
99
+ --config-motion-duration-base: 200ms;
100
+ --config-motion-duration-slow: 300ms;
101
+ --config-motion-ease-standard: cubic-bezier(0.16, 1, 0.3, 1);
102
+ --config-motion-ease-emphasized: cubic-bezier(0.2, 0.8, 0.2, 1);
103
+ --config-motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
104
+
105
+ /* ============================================
106
+ Font Family 配置
107
+ ============================================ */
108
+ --config-font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
109
+ --config-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
110
+ }
@@ -0,0 +1,30 @@
1
+ /* ============================================
2
+ * Scale 布局风格系统 - 统一入口
3
+ *
4
+ * 引入方式:
5
+ * 1. 全量引入(推荐): @import "./scale/index.css";
6
+ * 2. 按需引入:
7
+ * @import "./scale/config.css";
8
+ * @import "./scale/computed.css";
9
+ * @import "./scale/presets/compact.css";
10
+ *
11
+ * 自定义配置:
12
+ * @import "./scale/config.css";
13
+ * @import "./scale/computed.css";
14
+ * :root {
15
+ * --config-radius-default: 10px; // 自定义圆角
16
+ * --config-spacing-4: 18px; // 自定义间距
17
+ * }
18
+ * ============================================ */
19
+
20
+ /* 配置层:可覆盖的基础变量 */
21
+ @import "./config.css";
22
+
23
+ /* 计算层:映射到实际变量 */
24
+ @import "./computed.css";
25
+
26
+ /* 预设风格 */
27
+ @import "./presets/compact.css";
28
+ @import "./presets/soft.css";
29
+ @import "./presets/sharp.css";
30
+ @import "./presets/dense.css";
@@ -0,0 +1,30 @@
1
+ /* ============================================
2
+ * Preset: Compact - 紧凑风格
3
+ * 优化效率,适合信息密集场景
4
+ * ============================================ */
5
+
6
+ [data-style="compact"] {
7
+ /* Spacing (紧凑比例) */
8
+ --spacing-3: 10px;
9
+ --spacing-4: 14px;
10
+ --spacing-9: 32px;
11
+ --spacing-11: 40px;
12
+
13
+ /* Radius (略小) */
14
+ --radius-xl: 10px;
15
+ --radius-2xl: 12px;
16
+ --radius-3xl: 16px;
17
+
18
+ /* Font Size (略小) */
19
+ --font-size-sm: 12px;
20
+ --font-size-lg: 14px;
21
+ --font-size-xl: 16px;
22
+ --font-size-2xl: 18px;
23
+ --font-size-3xl: 22px;
24
+ --font-size-4xl: 28px;
25
+ --font-size-5xl: 34px;
26
+ --font-size-6xl: 44px;
27
+ --font-size-7xl: 56px;
28
+ --font-size-8xl: 64px;
29
+ --font-size-9xl: 88px;
30
+ }
@@ -0,0 +1,64 @@
1
+ /* ============================================
2
+ * Preset: Dense - 密集风格
3
+ * 信息密集,最大化内容展示
4
+ * ============================================ */
5
+
6
+ [data-style="dense"] {
7
+ /* Spacing (压缩比例) */
8
+ --spacing-2: 6px;
9
+ --spacing-2\.5: 8px;
10
+ --spacing-3: 8px;
11
+ --spacing-3\.5: 10px;
12
+ --spacing-4: 12px;
13
+ --spacing-5: 16px;
14
+ --spacing-6: 20px;
15
+ --spacing-7: 20px;
16
+ --spacing-8: 28px;
17
+ --spacing-9: 28px;
18
+ --spacing-10: 32px;
19
+ --spacing-11: 32px;
20
+ --spacing-12: 40px;
21
+ --spacing-14: 48px;
22
+ --spacing-16: 56px;
23
+ --spacing-20: 64px;
24
+ --spacing-24: 80px;
25
+ --spacing-28: 96px;
26
+ --spacing-32: 112px;
27
+ --spacing-36: 128px;
28
+ --spacing-40: 144px;
29
+ --spacing-44: 160px;
30
+ --spacing-48: 176px;
31
+ --spacing-52: 192px;
32
+ --spacing-56: 208px;
33
+ --spacing-60: 224px;
34
+ --spacing-64: 240px;
35
+ --spacing-72: 272px;
36
+ --spacing-80: 304px;
37
+ --spacing-96: 368px;
38
+
39
+ /* Radius (小圆角) */
40
+ --radius-sm: 2px;
41
+ --radius-DEFAULT: 4px;
42
+ --radius-md: 4px;
43
+ --radius-lg: 6px;
44
+ --radius-xl: 6px;
45
+ --radius-2xl: 8px;
46
+ --radius-3xl: 8px;
47
+ --radius: var(--radius-DEFAULT);
48
+
49
+ /* ChatInput 特殊配置 */
50
+ --chat-status-overlap: 4px;
51
+
52
+ /* Font Size (更小) */
53
+ --font-size-base: 12px;
54
+ --font-size-lg: 14px;
55
+ --font-size-xl: 14px;
56
+ --font-size-2xl: 16px;
57
+ --font-size-3xl: 18px;
58
+ --font-size-4xl: 22px;
59
+ --font-size-5xl: 28px;
60
+ --font-size-6xl: 36px;
61
+ --font-size-7xl: 44px;
62
+ --font-size-8xl: 56px;
63
+ --font-size-9xl: 72px;
64
+ }
@@ -0,0 +1,40 @@
1
+ /* ============================================
2
+ * Preset: Sharp - 锐利风格
3
+ * 几何精度,无圆角 + 等宽字体
4
+ * ============================================ */
5
+
6
+ [data-style="sharp"] {
7
+ /* Spacing (与 compact 相同) */
8
+ --spacing-3: 10px;
9
+ --spacing-4: 14px;
10
+ --spacing-9: 32px;
11
+ --spacing-11: 40px;
12
+
13
+ /* Radius (全部为 0) */
14
+ --radius-sm: 0;
15
+ --radius-DEFAULT: 0;
16
+ --radius-md: 0;
17
+ --radius-lg: 0;
18
+ --radius-xl: 0;
19
+ --radius-2xl: 0;
20
+ --radius-3xl: 0;
21
+ --radius-full: 0;
22
+ --radius: 0;
23
+
24
+ /* Font (等宽字体) */
25
+ --font-sans: var(--config-font-mono);
26
+ font-family: var(--font-sans);
27
+
28
+ /* Font Size (与 compact 相同) */
29
+ --font-size-sm: 12px;
30
+ --font-size-lg: 14px;
31
+ --font-size-xl: 16px;
32
+ --font-size-2xl: 18px;
33
+ --font-size-3xl: 22px;
34
+ --font-size-4xl: 28px;
35
+ --font-size-5xl: 34px;
36
+ --font-size-6xl: 44px;
37
+ --font-size-7xl: 56px;
38
+ --font-size-8xl: 64px;
39
+ --font-size-9xl: 88px;
40
+ }
@@ -0,0 +1,16 @@
1
+ /* ============================================
2
+ * Preset: Soft - 柔和风格
3
+ * 舒适至上,适合阅读和休闲场景
4
+ * ============================================ */
5
+
6
+ [data-style="soft"] {
7
+ /* 只覆盖 Radius (大圆角) */
8
+ --radius-sm: 8px;
9
+ --radius-DEFAULT: 12px;
10
+ --radius-md: 12px;
11
+ --radius-lg: 16px;
12
+ --radius-xl: 20px;
13
+ --radius-2xl: 24px;
14
+ --radius-3xl: 28px;
15
+ --radius: var(--radius-DEFAULT);
16
+ }