@mrintel/villain-ui 0.2.2 → 0.6.3

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 (159) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +3490 -1296
  3. package/dist/components/buttons/Button.svelte +27 -0
  4. package/dist/components/buttons/Button.svelte.d.ts +14 -0
  5. package/dist/components/buttons/ButtonGroup.svelte +17 -0
  6. package/dist/components/buttons/ButtonGroup.svelte.d.ts +8 -0
  7. package/dist/components/buttons/FloatingActionButton.svelte +20 -0
  8. package/dist/components/buttons/FloatingActionButton.svelte.d.ts +12 -0
  9. package/dist/components/buttons/IconButton.svelte +23 -0
  10. package/dist/components/buttons/IconButton.svelte.d.ts +14 -0
  11. package/dist/components/buttons/LinkButton.svelte +24 -0
  12. package/dist/components/buttons/LinkButton.svelte.d.ts +15 -0
  13. package/dist/components/buttons/buttonClasses.d.ts +15 -0
  14. package/dist/components/buttons/buttonClasses.js +15 -0
  15. package/dist/components/buttons/index.d.ts +5 -0
  16. package/dist/components/buttons/index.js +5 -0
  17. package/dist/components/cards/Card.svelte +60 -0
  18. package/dist/components/cards/Card.svelte.d.ts +15 -0
  19. package/dist/components/cards/Container.svelte +17 -0
  20. package/dist/components/cards/Container.svelte.d.ts +10 -0
  21. package/dist/components/cards/Divider.svelte +36 -0
  22. package/dist/components/cards/Divider.svelte.d.ts +11 -0
  23. package/dist/components/cards/Grid.svelte +55 -0
  24. package/dist/components/cards/Grid.svelte.d.ts +10 -0
  25. package/dist/components/cards/Panel.svelte +18 -0
  26. package/dist/components/cards/Panel.svelte.d.ts +11 -0
  27. package/dist/components/cards/SectionHeader.svelte +24 -0
  28. package/dist/components/cards/SectionHeader.svelte.d.ts +12 -0
  29. package/dist/components/cards/index.d.ts +6 -0
  30. package/dist/components/cards/index.js +6 -0
  31. package/dist/components/data/Avatar.svelte +48 -0
  32. package/dist/components/data/Avatar.svelte.d.ts +10 -0
  33. package/dist/components/data/Badge.svelte +45 -0
  34. package/dist/components/data/Badge.svelte.d.ts +14 -0
  35. package/dist/components/data/CalendarGrid.svelte +433 -0
  36. package/dist/components/data/CalendarGrid.svelte.d.ts +25 -0
  37. package/dist/components/data/CalendarGrid.types.d.ts +7 -0
  38. package/dist/components/data/CalendarGrid.types.js +1 -0
  39. package/dist/components/data/CodeBlock.svelte +119 -0
  40. package/dist/components/data/CodeBlock.svelte.d.ts +40 -0
  41. package/dist/components/data/List.svelte +87 -0
  42. package/dist/components/data/List.svelte.d.ts +15 -0
  43. package/dist/components/data/Pagination.svelte +121 -0
  44. package/dist/components/data/Pagination.svelte.d.ts +14 -0
  45. package/dist/components/data/Sparkline.svelte +117 -0
  46. package/dist/components/data/Sparkline.svelte.d.ts +43 -0
  47. package/dist/components/data/Stat.svelte +92 -0
  48. package/dist/components/data/Stat.svelte.d.ts +11 -0
  49. package/dist/components/data/Table.svelte +443 -0
  50. package/dist/components/data/Table.svelte.d.ts +30 -0
  51. package/dist/components/data/Table.types.d.ts +14 -0
  52. package/dist/components/data/Table.types.js +1 -0
  53. package/dist/components/data/Tag.svelte +51 -0
  54. package/dist/components/data/Tag.svelte.d.ts +13 -0
  55. package/dist/components/data/index.d.ts +12 -0
  56. package/dist/components/data/index.js +10 -0
  57. package/dist/components/forms/Checkbox.svelte +39 -0
  58. package/dist/components/forms/Checkbox.svelte.d.ts +12 -0
  59. package/dist/components/forms/DatePicker.svelte +61 -0
  60. package/dist/components/forms/DatePicker.svelte.d.ts +15 -0
  61. package/dist/components/forms/DateTimePicker.svelte +63 -0
  62. package/dist/components/forms/DateTimePicker.svelte.d.ts +16 -0
  63. package/dist/components/forms/FileUpload.svelte +136 -0
  64. package/dist/components/forms/FileUpload.svelte.d.ts +23 -0
  65. package/dist/components/forms/Input.svelte +282 -0
  66. package/dist/components/forms/Input.svelte.d.ts +19 -0
  67. package/dist/components/forms/InputGroup.svelte +7 -0
  68. package/dist/components/forms/InputGroup.svelte.d.ts +20 -0
  69. package/dist/components/forms/RadioGroup.svelte +77 -0
  70. package/dist/components/forms/RadioGroup.svelte.d.ts +17 -0
  71. package/dist/components/forms/RangeSlider.svelte +90 -0
  72. package/dist/components/forms/RangeSlider.svelte.d.ts +14 -0
  73. package/dist/components/forms/Select.svelte +106 -0
  74. package/dist/components/forms/Select.svelte.d.ts +18 -0
  75. package/dist/components/forms/Switch.svelte +44 -0
  76. package/dist/components/forms/Switch.svelte.d.ts +12 -0
  77. package/dist/components/forms/Textarea.svelte +52 -0
  78. package/dist/components/forms/Textarea.svelte.d.ts +15 -0
  79. package/dist/components/forms/TimePicker.svelte +63 -0
  80. package/dist/components/forms/TimePicker.svelte.d.ts +16 -0
  81. package/dist/components/forms/formClasses.d.ts +3 -0
  82. package/dist/components/forms/formClasses.js +3 -0
  83. package/dist/components/forms/index.d.ts +12 -0
  84. package/dist/components/forms/index.js +12 -0
  85. package/dist/components/navigation/Breadcrumbs.svelte +56 -0
  86. package/dist/components/navigation/Breadcrumbs.svelte.d.ts +15 -0
  87. package/dist/components/navigation/ContextMenu.svelte +133 -0
  88. package/dist/components/navigation/ContextMenu.svelte.d.ts +18 -0
  89. package/dist/components/navigation/DropdownMenu.svelte +139 -0
  90. package/dist/components/navigation/DropdownMenu.svelte.d.ts +17 -0
  91. package/dist/components/navigation/Menu.svelte +72 -0
  92. package/dist/components/navigation/Menu.svelte.d.ts +15 -0
  93. package/dist/components/navigation/Navbar.svelte +111 -0
  94. package/dist/components/navigation/Navbar.svelte.d.ts +15 -0
  95. package/dist/components/navigation/Sidebar.svelte +236 -0
  96. package/dist/components/navigation/Sidebar.svelte.d.ts +12 -0
  97. package/dist/components/navigation/Tabs.svelte +86 -0
  98. package/dist/components/navigation/Tabs.svelte.d.ts +19 -0
  99. package/dist/components/navigation/index.d.ts +7 -0
  100. package/dist/components/navigation/index.js +7 -0
  101. package/dist/components/overlays/Alert.svelte +81 -0
  102. package/dist/components/overlays/Alert.svelte.d.ts +15 -0
  103. package/dist/components/overlays/CommandPalette.svelte +182 -0
  104. package/dist/components/overlays/CommandPalette.svelte.d.ts +16 -0
  105. package/dist/components/overlays/Drawer.svelte +158 -0
  106. package/dist/components/overlays/Drawer.svelte.d.ts +16 -0
  107. package/dist/components/overlays/Dropdown.svelte +62 -0
  108. package/dist/components/overlays/Dropdown.svelte.d.ts +11 -0
  109. package/dist/components/overlays/Modal.svelte +125 -0
  110. package/dist/components/overlays/Modal.svelte.d.ts +15 -0
  111. package/dist/components/overlays/Popover.svelte +106 -0
  112. package/dist/components/overlays/Popover.svelte.d.ts +11 -0
  113. package/dist/components/overlays/ProgressBar.svelte +29 -0
  114. package/dist/components/overlays/ProgressBar.svelte.d.ts +10 -0
  115. package/dist/components/overlays/SkeletonLoader.svelte +66 -0
  116. package/dist/components/overlays/SkeletonLoader.svelte.d.ts +9 -0
  117. package/dist/components/overlays/Spinner.svelte +33 -0
  118. package/dist/components/overlays/Spinner.svelte.d.ts +7 -0
  119. package/dist/components/overlays/Toast.svelte +111 -0
  120. package/dist/components/overlays/Toast.svelte.d.ts +16 -0
  121. package/dist/components/overlays/Tooltip.svelte +94 -0
  122. package/dist/components/overlays/Tooltip.svelte.d.ts +12 -0
  123. package/dist/components/overlays/index.d.ts +11 -0
  124. package/dist/components/overlays/index.js +11 -0
  125. package/dist/components/typography/Code.svelte +10 -0
  126. package/dist/components/typography/Code.svelte.d.ts +6 -0
  127. package/dist/components/typography/Heading.svelte +15 -0
  128. package/dist/components/typography/Heading.svelte.d.ts +10 -0
  129. package/dist/components/typography/Text.svelte +21 -0
  130. package/dist/components/typography/Text.svelte.d.ts +10 -0
  131. package/dist/components/typography/index.d.ts +3 -0
  132. package/dist/components/typography/index.js +3 -0
  133. package/dist/components/utilities/Accordion.svelte +54 -0
  134. package/dist/components/utilities/Accordion.svelte.d.ts +17 -0
  135. package/dist/components/utilities/Carousel.svelte +124 -0
  136. package/dist/components/utilities/Carousel.svelte.d.ts +16 -0
  137. package/dist/components/utilities/Collapse.svelte +46 -0
  138. package/dist/components/utilities/Collapse.svelte.d.ts +10 -0
  139. package/dist/components/utilities/Hero.svelte +42 -0
  140. package/dist/components/utilities/Hero.svelte.d.ts +10 -0
  141. package/dist/components/utilities/Portal.svelte +47 -0
  142. package/dist/components/utilities/Portal.svelte.d.ts +21 -0
  143. package/dist/components/utilities/ScrollArea.svelte +33 -0
  144. package/dist/components/utilities/ScrollArea.svelte.d.ts +8 -0
  145. package/dist/components/utilities/SystemConsole.svelte +310 -0
  146. package/dist/components/utilities/SystemConsole.svelte.d.ts +20 -0
  147. package/dist/components/utilities/SystemInterface.svelte +726 -0
  148. package/dist/components/utilities/SystemInterface.svelte.d.ts +19 -0
  149. package/dist/components/utilities/index.d.ts +9 -0
  150. package/dist/components/utilities/index.js +8 -0
  151. package/dist/components/utilities/utilities.types.d.ts +46 -0
  152. package/dist/components/utilities/utilities.types.js +4 -0
  153. package/dist/index.d.ts +60 -175
  154. package/dist/index.js +24 -4560
  155. package/dist/lib/internal/id.d.ts +12 -0
  156. package/dist/lib/internal/id.js +15 -0
  157. package/dist/theme.css +2821 -0
  158. package/package.json +83 -75
  159. package/dist/index.css +0 -1
@@ -0,0 +1,310 @@
1
+ <script lang="ts">let { messages = [], prompt = '>', placeholder = 'Enter command...', height = '500px', maxHeight = '80vh', showTimestamps = false, autoScroll = true, typewriterEffect = false, typewriterSpeed = 50, showScanlines = true, glowEffect = true, onSubmit, disabled = false, class: className = '', ...restProps } = $props();
2
+ let inputValue = $state('');
3
+ let consoleContainer = $state();
4
+ let inputElement = $state();
5
+ // Typewriter state
6
+ let displayedMessages = $state(new Map());
7
+ // Scroll to bottom when messages change
8
+ $effect(() => {
9
+ if (autoScroll && consoleContainer && messages.length > 0) {
10
+ setTimeout(() => {
11
+ if (consoleContainer) {
12
+ consoleContainer.scrollTop = consoleContainer.scrollHeight;
13
+ }
14
+ }, 0);
15
+ }
16
+ });
17
+ // Typewriter effect for system messages
18
+ $effect(() => {
19
+ if (!typewriterEffect) {
20
+ // No animation, show all messages immediately
21
+ displayedMessages = new Map(messages.map(m => [m.id, m.content]));
22
+ return;
23
+ }
24
+ messages.forEach(message => {
25
+ if (message.role === 'user') {
26
+ // User messages appear instantly
27
+ displayedMessages.set(message.id, message.content);
28
+ }
29
+ else {
30
+ // System messages get typewriter effect
31
+ const currentContent = displayedMessages.get(message.id) || '';
32
+ if (currentContent.length < message.content.length) {
33
+ const interval = setInterval(() => {
34
+ const current = displayedMessages.get(message.id) || '';
35
+ if (current.length < message.content.length) {
36
+ displayedMessages.set(message.id, message.content.slice(0, current.length + 1));
37
+ displayedMessages = new Map(displayedMessages);
38
+ }
39
+ else {
40
+ clearInterval(interval);
41
+ }
42
+ }, 1000 / typewriterSpeed);
43
+ return () => clearInterval(interval);
44
+ }
45
+ }
46
+ });
47
+ });
48
+ function handleSubmit(e) {
49
+ e.preventDefault();
50
+ const trimmed = inputValue.trim();
51
+ if (!trimmed || !onSubmit)
52
+ return;
53
+ onSubmit(trimmed);
54
+ inputValue = '';
55
+ }
56
+ function handleKeyDown(e) {
57
+ if (e.key === 'Enter' && !e.shiftKey) {
58
+ e.preventDefault();
59
+ handleSubmit(e);
60
+ }
61
+ }
62
+ function getVariantClass(variant) {
63
+ const variants = {
64
+ default: 'text-[var(--color-text-soft)]',
65
+ success: 'text-[var(--color-success)]',
66
+ warning: 'text-[var(--color-warning)]',
67
+ error: 'text-[var(--color-error)]',
68
+ info: 'text-[var(--color-accent)]'
69
+ };
70
+ return variant ? variants[variant] : variants.default;
71
+ }
72
+ function formatTimestamp(date) {
73
+ if (!date)
74
+ return '';
75
+ const hours = date.getHours().toString().padStart(2, '0');
76
+ const minutes = date.getMinutes().toString().padStart(2, '0');
77
+ const seconds = date.getSeconds().toString().padStart(2, '0');
78
+ return `${hours}:${minutes}:${seconds}`;
79
+ }
80
+ const containerStyle = $derived(() => {
81
+ const styles = [];
82
+ if (height)
83
+ styles.push(`height: ${height}`);
84
+ if (maxHeight && !height)
85
+ styles.push(`max-height: ${maxHeight}`);
86
+ return styles.join('; ');
87
+ });
88
+ export {};
89
+ </script>
90
+
91
+ <div
92
+ class="system-console {className}"
93
+ class:scanlines={showScanlines}
94
+ class:glow={glowEffect}
95
+ style={containerStyle()}
96
+ {...restProps}
97
+ >
98
+ <!-- Message Display Area -->
99
+ <div class="console-output" bind:this={consoleContainer}>
100
+ {#each messages as message (message.id)}
101
+ <div class="console-message" class:user-message={message.role === 'user'}>
102
+ {#if showTimestamps && message.timestamp}
103
+ <span class="timestamp">[{formatTimestamp(message.timestamp)}]</span>
104
+ {/if}
105
+
106
+ {#if message.role === 'user'}
107
+ <span class="user-prompt">{prompt}</span>
108
+ <span class="user-input">{displayedMessages.get(message.id) || message.content}</span>
109
+ {:else}
110
+ <span class="system-output {getVariantClass(message.variant)}">
111
+ {displayedMessages.get(message.id) || message.content}
112
+ </span>
113
+ {#if typewriterEffect && (displayedMessages.get(message.id)?.length || 0) < message.content.length}
114
+ <span class="cursor">▋</span>
115
+ {/if}
116
+ {/if}
117
+ </div>
118
+ {/each}
119
+ </div>
120
+
121
+ <!-- Input Area -->
122
+ <form class="console-input-wrapper" onsubmit={handleSubmit}>
123
+ <span class="input-prompt">{prompt}</span>
124
+ <input
125
+ bind:this={inputElement}
126
+ bind:value={inputValue}
127
+ type="text"
128
+ class="console-input"
129
+ {placeholder}
130
+ {disabled}
131
+ onkeydown={handleKeyDown}
132
+ autocomplete="off"
133
+ spellcheck="false"
134
+ />
135
+ </form>
136
+ </div>
137
+
138
+ <style>
139
+ .system-console {
140
+ display: flex;
141
+ flex-direction: column;
142
+ background: #000000;
143
+ border: 2px solid var(--color-border);
144
+ border-radius: var(--radius-lg);
145
+ overflow: hidden;
146
+ font-family: var(--font-mono);
147
+ box-shadow:
148
+ 0 0 0 1px rgba(255, 255, 255, 0.03),
149
+ 0 8px 32px rgba(0, 0, 0, 0.8),
150
+ inset 0 0 80px rgba(0, 0, 0, 0.6);
151
+ position: relative;
152
+ }
153
+
154
+ /* CRT Glow Effect */
155
+ .system-console.glow {
156
+ box-shadow:
157
+ 0 0 0 1px var(--color-accent-overlay-20),
158
+ 0 0 20px var(--color-accent-overlay-10),
159
+ 0 8px 32px rgba(0, 0, 0, 0.8),
160
+ inset 0 0 80px rgba(0, 0, 0, 0.6);
161
+ }
162
+
163
+ /* Scanline Effect */
164
+ .system-console.scanlines::before {
165
+ content: '';
166
+ position: absolute;
167
+ top: 0;
168
+ left: 0;
169
+ right: 0;
170
+ bottom: 0;
171
+ background: repeating-linear-gradient(
172
+ 0deg,
173
+ rgba(0, 0, 0, 0.15),
174
+ rgba(0, 0, 0, 0.15) 1px,
175
+ transparent 1px,
176
+ transparent 2px
177
+ );
178
+ pointer-events: none;
179
+ z-index: 10;
180
+ }
181
+
182
+ .console-output {
183
+ flex: 1;
184
+ padding: 1.5rem;
185
+ overflow-y: auto;
186
+ overflow-x: hidden;
187
+ background: linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.9) 100%);
188
+ position: relative;
189
+ z-index: 1;
190
+ }
191
+
192
+ .console-message {
193
+ margin-bottom: 0.75rem;
194
+ font-size: var(--text-sm);
195
+ line-height: 1.6;
196
+ display: flex;
197
+ flex-wrap: wrap;
198
+ gap: 0.5rem;
199
+ word-wrap: break-word;
200
+ white-space: pre-wrap;
201
+ }
202
+
203
+ .timestamp {
204
+ color: var(--color-text-muted);
205
+ opacity: 0.5;
206
+ font-size: 0.75rem;
207
+ flex-shrink: 0;
208
+ }
209
+
210
+ .user-prompt,
211
+ .input-prompt {
212
+ color: var(--color-accent);
213
+ margin-right: 0.5rem;
214
+ user-select: none;
215
+ flex-shrink: 0;
216
+ text-shadow: 0 0 10px currentColor;
217
+ }
218
+
219
+ .user-input {
220
+ color: var(--color-text);
221
+ flex: 1;
222
+ }
223
+
224
+ .system-output {
225
+ flex: 1;
226
+ color: var(--color-text-soft);
227
+ }
228
+
229
+ .cursor {
230
+ color: var(--color-accent);
231
+ animation: blink 1s step-end infinite;
232
+ margin-left: 0.125rem;
233
+ text-shadow: 0 0 8px currentColor;
234
+ }
235
+
236
+ @keyframes blink {
237
+ 0%,
238
+ 50% {
239
+ opacity: 1;
240
+ }
241
+ 50.1%,
242
+ 100% {
243
+ opacity: 0;
244
+ }
245
+ }
246
+
247
+ /* Input Area */
248
+ .console-input-wrapper {
249
+ display: flex;
250
+ align-items: center;
251
+ padding: 1rem 1.5rem;
252
+ background: rgba(0, 0, 0, 0.5);
253
+ border-top: 1px solid var(--color-border);
254
+ position: relative;
255
+ z-index: 5;
256
+ }
257
+
258
+ .console-input {
259
+ flex: 1;
260
+ background: transparent;
261
+ border: none;
262
+ color: var(--color-text);
263
+ font-family: var(--font-mono);
264
+ font-size: var(--text-sm);
265
+ outline: none;
266
+ caret-color: var(--color-accent);
267
+ }
268
+
269
+ .console-input::placeholder {
270
+ color: var(--color-text-muted);
271
+ opacity: 0.3;
272
+ }
273
+
274
+ .console-input:disabled {
275
+ opacity: 0.5;
276
+ cursor: not-allowed;
277
+ }
278
+
279
+ /* Scrollbar */
280
+ .console-output::-webkit-scrollbar {
281
+ width: 0.5rem;
282
+ }
283
+
284
+ .console-output::-webkit-scrollbar-track {
285
+ background: rgba(0, 0, 0, 0.5);
286
+ }
287
+
288
+ .console-output::-webkit-scrollbar-thumb {
289
+ background: var(--color-accent-overlay-30);
290
+ border-radius: var(--radius-sm);
291
+ }
292
+
293
+ .console-output::-webkit-scrollbar-thumb:hover {
294
+ background: var(--color-accent-overlay-50);
295
+ }
296
+
297
+ /* CRT Flicker Effect (subtle) */
298
+ @keyframes flicker {
299
+ 0%,
300
+ 100% {
301
+ opacity: 1;
302
+ }
303
+ 50% {
304
+ opacity: 0.97;
305
+ }
306
+ }
307
+
308
+ .system-console.glow {
309
+ animation: flicker 0.15s infinite;
310
+ }</style>
@@ -0,0 +1,20 @@
1
+ import type { ConsoleMessage } from './utilities.types';
2
+ interface Props {
3
+ messages: ConsoleMessage[];
4
+ prompt?: string;
5
+ placeholder?: string;
6
+ height?: string;
7
+ maxHeight?: string;
8
+ showTimestamps?: boolean;
9
+ autoScroll?: boolean;
10
+ typewriterEffect?: boolean;
11
+ typewriterSpeed?: number;
12
+ showScanlines?: boolean;
13
+ glowEffect?: boolean;
14
+ onSubmit?: (input: string) => void;
15
+ disabled?: boolean;
16
+ class?: string;
17
+ }
18
+ declare const SystemConsole: import("svelte").Component<Props, {}, "">;
19
+ type SystemConsole = ReturnType<typeof SystemConsole>;
20
+ export default SystemConsole;