@knymbus/voxel-ui 1.0.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 (115) hide show
  1. package/.storybook/main.ts +17 -0
  2. package/.storybook/preview.ts +23 -0
  3. package/debug-storybook.log +40 -0
  4. package/dist/chunks/jsx-runtime-Boo2vksn.js +182 -0
  5. package/dist/chunks/resizable-ImB8dfG_.js +112 -0
  6. package/dist/chunks/tabs-MaVN00hJ.js +86 -0
  7. package/dist/components/button/Button.d.ts +31 -0
  8. package/dist/components/button/ButtonGroup.d.ts +12 -0
  9. package/dist/components/button/SplitActionButton.d.ts +2 -0
  10. package/dist/components/button/index.d.ts +5 -0
  11. package/dist/components/button/split-types.d.ts +16 -0
  12. package/dist/components/button/types.d.ts +9 -0
  13. package/dist/components/icons/AddIcon.d.ts +2 -0
  14. package/dist/components/icons/BlankDocIcon.d.ts +2 -0
  15. package/dist/components/icons/ChatIcon.d.ts +2 -0
  16. package/dist/components/icons/ChevronDownIcon.d.ts +2 -0
  17. package/dist/components/icons/CloseIcon.d.ts +2 -0
  18. package/dist/components/icons/CommentIcon.d.ts +2 -0
  19. package/dist/components/icons/DeleteChatIcon.d.ts +2 -0
  20. package/dist/components/icons/DocumentIcon.d.ts +2 -0
  21. package/dist/components/icons/ExpandIcon.d.ts +2 -0
  22. package/dist/components/icons/FolderIcon.d.ts +2 -0
  23. package/dist/components/icons/GroupIcon.d.ts +2 -0
  24. package/dist/components/icons/MinimizeIcon.d.ts +2 -0
  25. package/dist/components/icons/MinusIcon.d.ts +2 -0
  26. package/dist/components/icons/MoreIcon.d.ts +2 -0
  27. package/dist/components/icons/OpenFolderIcon.d.ts +2 -0
  28. package/dist/components/icons/PersonIcon.d.ts +2 -0
  29. package/dist/components/icons/PlusChatIcon.d.ts +2 -0
  30. package/dist/components/icons/PlusCommentIcon.d.ts +2 -0
  31. package/dist/components/icons/PlusDocBadgeIcon.d.ts +8 -0
  32. package/dist/components/icons/PlusDocIcon.d.ts +2 -0
  33. package/dist/components/icons/PlusPersonIcon.d.ts +2 -0
  34. package/dist/components/icons/RefreshIcon.d.ts +2 -0
  35. package/dist/components/icons/SearchIcon.d.ts +2 -0
  36. package/dist/components/icons/TerminalIcon.d.ts +2 -0
  37. package/dist/components/icons/TrashIcon.d.ts +2 -0
  38. package/dist/components/icons/TruckIcon.d.ts +2 -0
  39. package/dist/components/icons/index.d.ts +26 -0
  40. package/dist/components/icons/types.d.ts +5 -0
  41. package/dist/components/resizable/ResizablePanel.d.ts +10 -0
  42. package/dist/components/resizable/index.d.ts +1 -0
  43. package/dist/components/resizable/index.js +2 -0
  44. package/dist/components/search/SearchInput.d.ts +10 -0
  45. package/dist/components/search/index.d.ts +2 -0
  46. package/dist/components/search/types.d.ts +19 -0
  47. package/dist/components/tabs/TabButton.d.ts +12 -0
  48. package/dist/components/tabs/TabButtonGroup.d.ts +9 -0
  49. package/dist/components/tabs/TabPanel.d.ts +8 -0
  50. package/dist/components/tabs/TabPanelList.d.ts +11 -0
  51. package/dist/components/tabs/index.d.ts +5 -0
  52. package/dist/components/tabs/index.js +2 -0
  53. package/dist/components/tabs/types.d.ts +9 -0
  54. package/dist/components/tabs/useTab.d.ts +5 -0
  55. package/dist/index.d.ts +5 -0
  56. package/dist/index.js +1071 -0
  57. package/package.json +68 -0
  58. package/src/components/button/Button.stories.tsx +70 -0
  59. package/src/components/button/Button.tsx +108 -0
  60. package/src/components/button/ButtonGroup.stories.tsx +63 -0
  61. package/src/components/button/ButtonGroup.tsx +62 -0
  62. package/src/components/button/SplitActionButton.tsx +116 -0
  63. package/src/components/button/SplitButton.stories.tsx +55 -0
  64. package/src/components/button/index.ts +7 -0
  65. package/src/components/button/split-types.ts +18 -0
  66. package/src/components/button/types.ts +10 -0
  67. package/src/components/icons/AddIcon.tsx +10 -0
  68. package/src/components/icons/BlankDocIcon.tsx +10 -0
  69. package/src/components/icons/ChatIcon.tsx +9 -0
  70. package/src/components/icons/ChevronDownIcon.tsx +9 -0
  71. package/src/components/icons/CloseIcon.tsx +23 -0
  72. package/src/components/icons/CommentIcon.tsx +9 -0
  73. package/src/components/icons/DeleteChatIcon.tsx +10 -0
  74. package/src/components/icons/DocumentIcon.tsx +13 -0
  75. package/src/components/icons/ExpandIcon.tsx +12 -0
  76. package/src/components/icons/FolderIcon.tsx +9 -0
  77. package/src/components/icons/GroupIcon.tsx +12 -0
  78. package/src/components/icons/Icon.stories.tsx +122 -0
  79. package/src/components/icons/MinimizeIcon.tsx +12 -0
  80. package/src/components/icons/MinusIcon.tsx +9 -0
  81. package/src/components/icons/MoreIcon.tsx +11 -0
  82. package/src/components/icons/OpenFolderIcon.tsx +37 -0
  83. package/src/components/icons/PersonIcon.tsx +10 -0
  84. package/src/components/icons/PlusChatIcon.tsx +11 -0
  85. package/src/components/icons/PlusCommentIcon.tsx +11 -0
  86. package/src/components/icons/PlusDocBadgeIcon.tsx +74 -0
  87. package/src/components/icons/PlusDocIcon.tsx +12 -0
  88. package/src/components/icons/PlusPersonIcon.tsx +12 -0
  89. package/src/components/icons/RefreshIcon.tsx +9 -0
  90. package/src/components/icons/SearchIcon.tsx +10 -0
  91. package/src/components/icons/TerminalIcon.tsx +11 -0
  92. package/src/components/icons/TrashIcon.tsx +12 -0
  93. package/src/components/icons/TruckIcon.tsx +12 -0
  94. package/src/components/icons/index.ts +26 -0
  95. package/src/components/icons/types.ts +6 -0
  96. package/src/components/resizable/ResizablePanel.tsx +183 -0
  97. package/src/components/resizable/index.ts +1 -0
  98. package/src/components/search/SearchInput.stories.tsx +91 -0
  99. package/src/components/search/SearchInput.tsx +254 -0
  100. package/src/components/search/index.ts +2 -0
  101. package/src/components/search/types.ts +21 -0
  102. package/src/components/tabs/TabButton.tsx +56 -0
  103. package/src/components/tabs/TabButtonGroup.tsx +82 -0
  104. package/src/components/tabs/TabPanel.tsx +44 -0
  105. package/src/components/tabs/TabPanelList.tsx +31 -0
  106. package/src/components/tabs/Tabs.stories.tsx +71 -0
  107. package/src/components/tabs/index.ts +5 -0
  108. package/src/components/tabs/types.ts +10 -0
  109. package/src/components/tabs/useTab.ts +33 -0
  110. package/src/index.css +35 -0
  111. package/src/index.ts +5 -0
  112. package/src/vite-env.d.ts +5 -0
  113. package/tsconfig.json +47 -0
  114. package/vite.config.ts +64 -0
  115. package/vitest.shims.d.ts +1 -0
@@ -0,0 +1,9 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function CommentIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M3 21l1.9-5.7a8.5 8.5 0 1 1 3.8 3.8z" />
7
+ </svg>
8
+ );
9
+ }
@@ -0,0 +1,10 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function DeleteChatIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
7
+ <line x1="9" y1="10" x2="15" y2="10" />
8
+ </svg>
9
+ );
10
+ }
@@ -0,0 +1,13 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function DocumentIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
7
+ <polyline points="14 2 14 8 20 8" />
8
+ <line x1="16" y1="13" x2="8" y2="13" />
9
+ <line x1="16" y1="17" x2="8" y2="17" />
10
+ <polyline points="10 9 9 9 8 9" />
11
+ </svg>
12
+ );
13
+ }
@@ -0,0 +1,12 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function ExpandIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <polyline points="15 3 21 3 21 9" />
7
+ <polyline points="9 21 3 21 3 15" />
8
+ <line x1="21" y1="3" x2="14" y2="10" />
9
+ <line x1="3" y1="21" x2="10" y2="14" />
10
+ </svg>
11
+ );
12
+ }
@@ -0,0 +1,9 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function FolderIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" />
7
+ </svg>
8
+ );
9
+ }
@@ -0,0 +1,12 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function GroupIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
7
+ <circle cx="9" cy="7" r="4" />
8
+ <path d="M23 21v-2a4 4 0 0 0-3-3.87" />
9
+ <path d="M16 3.13a4 4 0 0 1 0 7.75" />
10
+ </svg>
11
+ );
12
+ }
@@ -0,0 +1,122 @@
1
+ import React, { useState } from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import * as Icons from './index';
4
+ import { Search } from './index';
5
+
6
+ const meta: Meta = {
7
+ title: 'Design Tokens/VoxelIconsSystem',
8
+ parameters: {
9
+ layout: 'padded',
10
+ },
11
+ };
12
+ export default meta;
13
+
14
+ const IconsGalleryWrapper = () => {
15
+ const [searchTerm, setSearchTerm] = useState<string>('');
16
+ const [iconSize, setIconSize] = useState<number>(16);
17
+
18
+ // Extract all icon components dynamically from our barrel index export map
19
+ const allIcons = Object.entries(Icons);
20
+ console.log("[ALL ICONS] ", allIcons)
21
+
22
+ const filteredIcons = allIcons.filter(([name]) =>
23
+ name.toLowerCase().includes(searchTerm.toLowerCase())
24
+ );
25
+
26
+ const handleCopyToClipboard = (componentName: string) => {
27
+ const importString = `import { ${componentName} } from '@voxel-ui/icons';`;
28
+ navigator.clipboard.writeText(importString);
29
+ alert(`Copied path to clipboard:\n${importString}`);
30
+ };
31
+
32
+ return (
33
+ <div className="p-6 bg-vsc-bg border border-vsc-border rounded-md text-vsc-text font-sans max-w-4xl select-none mx-auto shadow-sm">
34
+
35
+ {/* Interactive Controls Header Bar */}
36
+ <div className="flex flex-col md:flex-row items-stretch md:items-center justify-between gap-4 border-b border-vsc-border pb-6 mb-6">
37
+ <div>
38
+ <h2 className="text-base font-bold text-vsc-text">Voxel Iconography Workspace</h2>
39
+ <p className="text-xs text-vsc-muted mt-0.5">Pixel-perfect, high-density SVG vectors for data layout frames.</p>
40
+ </div>
41
+
42
+ <div className="flex flex-wrap items-center gap-4">
43
+ {/* Real-time Search Box */}
44
+ <div className="relative w-48">
45
+ <input
46
+ type="text"
47
+ value={searchTerm}
48
+ onChange={(e) => setSearchTerm(e.target.value)}
49
+ placeholder="Search icons..."
50
+ className="w-full text-xs pl-8 pr-3 py-1.5 bg-vsc-bg-input text-vsc-text border border-vsc-border rounded focus:outline-none focus:border-vsc-accent placeholder-vsc-muted"
51
+ />
52
+ <Search size={12} className="absolute left-2.5 top-2.5 text-vsc-muted" />
53
+ </div>
54
+
55
+ {/* Dynamic Size Scaling Slider Selector */}
56
+ <div className="flex items-center space-x-2 bg-vsc-sidebar px-3 py-1 border border-vsc-border rounded h-8">
57
+ <span className="text-[10px] font-bold text-vsc-muted uppercase tracking-wider">Size:</span>
58
+ <input
59
+ type="range"
60
+ min="12"
61
+ max="48"
62
+ value={iconSize}
63
+ onChange={(e) => setIconSize(parseInt(e.target.value, 10))}
64
+ className="w-24 accent-vsc-accent cursor-pointer h-1 bg-vsc-border rounded-lg appearance-none"
65
+ />
66
+ <span className="text-[10px] font-mono font-bold text-vsc-text w-8 text-right">
67
+ {iconSize}px
68
+ </span>
69
+ </div>
70
+ </div>
71
+ </div>
72
+
73
+ {/* Grid Canvas Output Area */}
74
+ {filteredIcons.length === 0 ? (
75
+ <div className="text-center py-12 border border-dashed border-vsc-border rounded bg-vsc-sidebar">
76
+ <p className="text-xs text-vsc-muted italic">No voxel icons found matching your filter criteria strings.</p>
77
+ </div>
78
+ ) : (
79
+ <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3">
80
+ {filteredIcons.map(([name, IconComponent]) => {
81
+ // Explicitly cast to prevent TypeScript expression evaluation blocks
82
+ const Component = IconComponent as React.ComponentType<{ size: number; className?: string }>;
83
+
84
+ return (
85
+ <div
86
+ key={name}
87
+ onClick={() => handleCopyToClipboard(name)}
88
+ className="group p-4 border border-vsc-border bg-vsc-sidebar hover:bg-vsc-hover hover:border-vsc-accent rounded flex flex-col items-center justify-center text-center cursor-pointer transition-all duration-150 h-32 relative overflow-hidden"
89
+ title="Click to copy library import code statement"
90
+ >
91
+ {/* Scalable Vector Asset Render Node Box */}
92
+ <div className="flex-1 flex items-center justify-center text-vsc-text group-hover:text-vsc-accent transition-colors">
93
+ <Component size={iconSize} />
94
+ </div>
95
+
96
+ {/* Metadata Identifier Label */}
97
+ <div className="w-full shrink-0 mt-2">
98
+ <p className="text-[11px] font-mono font-bold text-vsc-text truncate px-1">
99
+ {name}
100
+ </p>
101
+ <p className="text-[9px] text-vsc-muted opacity-0 group-hover:opacity-100 transition-opacity uppercase tracking-wider font-semibold mt-0.5">
102
+ Click to Copy
103
+ </p>
104
+ </div>
105
+ </div>
106
+ );
107
+ })}
108
+ </div>
109
+ )}
110
+
111
+ {/* Footer Diagnostic Bar */}
112
+ <div className="mt-6 pt-3 border-t border-vsc-border flex justify-between text-[10px] font-mono text-vsc-muted">
113
+ <span>Total Library Index: {allIcons.length}</span>
114
+ <span>Filtered View: {filteredIcons.length}</span>
115
+ </div>
116
+ </div>
117
+ );
118
+ };
119
+
120
+ export const IconsSystemAudit: StoryObj = {
121
+ render: () => <IconsGalleryWrapper />,
122
+ };
@@ -0,0 +1,12 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function MinimizeIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <polyline points="4 14 10 14 10 20" />
7
+ <polyline points="20 10 14 10 14 4" />
8
+ <line x1="14" y1="10" x2="21" y2="3" />
9
+ <line x1="10" y1="14" x2="3" y2="21" />
10
+ </svg>
11
+ );
12
+ }
@@ -0,0 +1,9 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function MinusIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <line x1="5" y1="12" x2="19" y2="12" />
7
+ </svg>
8
+ );
9
+ }
@@ -0,0 +1,11 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function MoreIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <circle cx="12" cy="12" r="1" />
7
+ <circle cx="19" cy="12" r="1" />
8
+ <circle cx="5" cy="12" r="1" />
9
+ </svg>
10
+ );
11
+ }
@@ -0,0 +1,37 @@
1
+ import { IconProps } from './types';
2
+
3
+ export default function OpenFolderIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg
6
+ xmlns="http://w3.org"
7
+ width={size}
8
+ height={size}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2.5" /* Strong, clean line weight matching your design reference image */
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ className={`shrink-0 select-none ${className}`.trim()}
16
+ {...props}
17
+ >
18
+ {/*
19
+ 1. THE REAR PLATE BACKDROP:
20
+ Draws the rigid back wall, index tab corner curve, and the bottom bounding floor.
21
+ */}
22
+ <path d="M4 20h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-6.17a2 2 0 0 1-1.42-.59l-1.64-1.64A2 2 0 0 0 5.34 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2z" />
23
+
24
+ {/*
25
+ 2. THE FRONT PERSPECTIVE OPEN FLAP:
26
+ Matches your image's unique structure: starts lower down on the left (y=11),
27
+ extends horizontally, rounds the top-right corner smoothly, and slants cleanly
28
+ downward into the front baseline floor.
29
+ */}
30
+ <path
31
+ d="M2 11h15.26a2 2 0 0 1 1.9 1.37l2.48 7.44A1 1 0 0 1 20.7 21H5.34a2 2 0 0 1-1.9-1.37L2 11z"
32
+ fill="currentColor"
33
+ fillOpacity="0.05" /* Gives a premium, subtle inner pocket depth contrast */
34
+ />
35
+ </svg>
36
+ );
37
+ }
@@ -0,0 +1,10 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function PersonIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" />
7
+ <circle cx="12" cy="7" r="4" />
8
+ </svg>
9
+ );
10
+ }
@@ -0,0 +1,11 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function PlusChatIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
7
+ <line x1="12" y1="7" x2="12" y2="13" />
8
+ <line x1="9" y1="10" x2="15" y2="10" />
9
+ </svg>
10
+ );
11
+ }
@@ -0,0 +1,11 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function PlusCommentIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M3 21l1.9-5.7a8.5 8.5 0 1 1 3.8 3.8z" />
7
+ <line x1="12" y1="8" x2="12" y2="14" />
8
+ <line x1="9" y1="11" x2="15" y2="11" />
9
+ </svg>
10
+ );
11
+ }
@@ -0,0 +1,74 @@
1
+
2
+ import { IconProps } from './types';
3
+
4
+ interface PlusDocBadgeIconProps extends IconProps {
5
+ circleBg?: string;
6
+ circleStroke?: string;
7
+ plusStroke?: string;
8
+ }
9
+
10
+ export default function PlusDocBadgeIcon({
11
+ size = 16,
12
+ className = '',
13
+ // ⚡ Defaults to your matte gray VSC hover token for a high-density feel
14
+ circleBg = 'var(--color-vsc-hover)',
15
+ circleStroke = 'var(--color-vsc-border)',
16
+ plusStroke = 'var(--color-vsc-muted)',
17
+ ...props
18
+ }: PlusDocBadgeIconProps) {
19
+ return (
20
+ <svg
21
+ xmlns="http://w3.org"
22
+ width={size}
23
+ height={size}
24
+ viewBox="0 0 24 24"
25
+ fill="none"
26
+ stroke="currentColor"
27
+ strokeWidth="2.2"
28
+ strokeLinecap="round"
29
+ strokeLinejoin="round"
30
+ /*
31
+ ⚡ Declaring 'group' here lets children components listen
32
+ for hover events across the entire icon frame bounds.
33
+ */
34
+ className={`shrink-0 select-none group ${className}`.trim()}
35
+ {...props}
36
+ >
37
+ {/* Primary Blank Document Sheet Base */}
38
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
39
+ <polyline points="14 2 14 8 20 8" />
40
+
41
+ {/*
42
+ ⚡ Upgraded Badge Circle: Radius increased from 4.5 to 6.
43
+ The hover modifier dynamically swaps borders to match your theme.
44
+ */}
45
+ <circle
46
+ cx="18"
47
+ cy="18"
48
+ r="6"
49
+ fill={circleBg}
50
+ stroke={circleStroke}
51
+ strokeWidth="1.5"
52
+ className="transition-colors duration-150 group-hover:stroke-vsc-accent/40"
53
+ />
54
+
55
+ {/*
56
+ ⚡ Perfect centered Plus (+) vector stroke lines.
57
+ Swaps from muted gray to rich VSC Accent blue on hover!
58
+ */}
59
+ <line
60
+ x1="18" y1="15" x2="18" y2="21"
61
+ stroke={plusStroke}
62
+ strokeWidth="1.8"
63
+ className="transition-colors duration-150 group-hover:stroke-vsc-accent"
64
+ />
65
+ <line
66
+ x1="15" y1="18" x2="21" y2="18"
67
+ stroke={plusStroke}
68
+ strokeWidth="1.8"
69
+ className="transition-colors duration-150 group-hover:stroke-vsc-accent"
70
+ />
71
+ </svg>
72
+ );
73
+ }
74
+
@@ -0,0 +1,12 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function PlusDocIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
7
+ <polyline points="14 2 14 8 20 8" />
8
+ <line x1="12" y1="11" x2="12" y2="17" />
9
+ <line x1="9" y1="14" x2="15" y2="14" />
10
+ </svg>
11
+ );
12
+ }
@@ -0,0 +1,12 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function PlusPersonIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
7
+ <circle cx="8.5" cy="7" r="4" />
8
+ <line x1="20" y1="8" x2="20" y2="14" />
9
+ <line x1="17" y1="11" x2="23" y2="11" />
10
+ </svg>
11
+ );
12
+ }
@@ -0,0 +1,9 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function RefreshIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <path d="M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67" />
7
+ </svg>
8
+ );
9
+ }
@@ -0,0 +1,10 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function SearchIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <circle cx="11" cy="11" r="8" />
7
+ <line x1="21" y1="21" x2="16.65" y2="16.65" />
8
+ </svg>
9
+ );
10
+ }
@@ -0,0 +1,11 @@
1
+ import { IconProps } from "./types";
2
+
3
+
4
+ export default function TerminalIcon({ size = 16, className = '', ...props }: IconProps) {
5
+ return (
6
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
7
+ <polyline points="4 17 10 11 4 5" />
8
+ <line x1="12" y1="19" x2="20" y2="19" />
9
+ </svg>
10
+ );
11
+ }
@@ -0,0 +1,12 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function TrashIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <polyline points="3 6 5 6 21 6" />
7
+ <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
8
+ <line x1="10" y1="11" x2="10" y2="17" />
9
+ <line x1="14" y1="11" x2="14" y2="17" />
10
+ </svg>
11
+ );
12
+ }
@@ -0,0 +1,12 @@
1
+ import { IconProps } from "./types";
2
+
3
+ export default function TruckIcon({ size = 16, className = '', ...props }: IconProps) {
4
+ return (
5
+ <svg xmlns="http://w3.org" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" className={`shrink-0 select-none ${className}`.trim()} {...props}>
6
+ <rect x="1" y="3" width="15" height="13" />
7
+ <polygon points="16 8 20 8 23 11 23 16 16 16 16 8" />
8
+ <circle cx="5.5" cy="18.5" r="2.5" />
9
+ <circle cx="18.5" cy="18.5" r="2.5" />
10
+ </svg>
11
+ );
12
+ }
@@ -0,0 +1,26 @@
1
+ export { default as Close } from './CloseIcon';
2
+ export { default as Terminal } from './TerminalIcon';
3
+ export { default as Document } from './DocumentIcon';
4
+ export { default as Folder } from './FolderIcon';
5
+ export { default as Search } from './SearchIcon';
6
+ export { default as Refresh } from './RefreshIcon';
7
+ export { default as Trash } from './TrashIcon';
8
+ export { default as ChevronDown } from './ChevronDownIcon';
9
+ export { default as Add } from './AddIcon'
10
+ export { default as Minus } from './MinusIcon'
11
+ export { default as Expand } from './ExpandIcon'
12
+ export { default as Minimize } from './MinimizeIcon'
13
+ export { default as BlankDoc } from './BlankDocIcon'
14
+ export { default as PlusDoc } from './PlusDocIcon'
15
+ export { default as Chat } from './ChatIcon'
16
+ export { default as PlusChat } from './PlusChatIcon'
17
+ export { default as DeleteChat } from './DeleteChatIcon'
18
+ export { default as Comment } from './CommentIcon'
19
+ export { default as PlusComment } from './PlusCommentIcon'
20
+ export { default as OpenFolder } from './OpenFolderIcon'
21
+ export { default as More } from './MoreIcon'
22
+ export { default as Truck } from './TruckIcon'
23
+ export { default as Person } from './PersonIcon'
24
+ export { default as PlusPerson } from './PlusPersonIcon'
25
+ export { default as Group } from './GroupIcon'
26
+ export { default as PlusDocBadge } from './PlusDocBadgeIcon'
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+
3
+ export interface IconProps extends React.SVGProps<SVGSVGElement> {
4
+ size?: number | string;
5
+ className?: string;
6
+ }