cloud-ide-element 1.0.76 → 1.0.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/cloud-ide-element.mjs +369 -1
- package/fesm2022/cloud-ide-element.mjs.map +1 -1
- package/index.d.ts +140 -1
- package/package.json +1 -1
|
@@ -4508,6 +4508,374 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
4508
4508
|
type: Output
|
|
4509
4509
|
}] } });
|
|
4510
4510
|
|
|
4511
|
+
class CideEleFloatingFileUploaderComponent {
|
|
4512
|
+
destroyRef = inject(DestroyRef);
|
|
4513
|
+
fileManagerService = inject(CideEleFileManagerService);
|
|
4514
|
+
// Signals for reactive state
|
|
4515
|
+
isVisible = signal(false, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
|
|
4516
|
+
isMinimized = signal(false, ...(ngDevMode ? [{ debugName: "isMinimized" }] : []));
|
|
4517
|
+
uploadQueue = signal([], ...(ngDevMode ? [{ debugName: "uploadQueue" }] : []));
|
|
4518
|
+
isUploading = signal(false, ...(ngDevMode ? [{ debugName: "isUploading" }] : []));
|
|
4519
|
+
uploadProgress = signal(0, ...(ngDevMode ? [{ debugName: "uploadProgress" }] : []));
|
|
4520
|
+
currentUserId = signal('', ...(ngDevMode ? [{ debugName: "currentUserId" }] : []));
|
|
4521
|
+
// Computed values
|
|
4522
|
+
hasUploads = computed(() => this.uploadQueue().length > 0, ...(ngDevMode ? [{ debugName: "hasUploads" }] : []));
|
|
4523
|
+
pendingUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'pending'), ...(ngDevMode ? [{ debugName: "pendingUploads" }] : []));
|
|
4524
|
+
activeUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'uploading'), ...(ngDevMode ? [{ debugName: "activeUploads" }] : []));
|
|
4525
|
+
completedUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'completed'), ...(ngDevMode ? [{ debugName: "completedUploads" }] : []));
|
|
4526
|
+
failedUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'error'), ...(ngDevMode ? [{ debugName: "failedUploads" }] : []));
|
|
4527
|
+
// Animation states
|
|
4528
|
+
isAnimating = signal(false, ...(ngDevMode ? [{ debugName: "isAnimating" }] : []));
|
|
4529
|
+
constructor() {
|
|
4530
|
+
console.log('🚀 [FloatingFileUploader] Component initialized');
|
|
4531
|
+
}
|
|
4532
|
+
ngOnInit() {
|
|
4533
|
+
// Set up drag and drop listeners
|
|
4534
|
+
this.setupDragAndDrop();
|
|
4535
|
+
// Set up file input change listeners
|
|
4536
|
+
this.setupFileInputListeners();
|
|
4537
|
+
// Note: The file manager service uses signals, so we'll handle uploads directly
|
|
4538
|
+
// when files are added to the queue rather than subscribing to service state
|
|
4539
|
+
}
|
|
4540
|
+
ngOnDestroy() {
|
|
4541
|
+
console.log('🧹 [FloatingFileUploader] Component destroyed');
|
|
4542
|
+
this.removeDragAndDropListeners();
|
|
4543
|
+
this.removeFileInputListeners();
|
|
4544
|
+
}
|
|
4545
|
+
/**
|
|
4546
|
+
* Set up drag and drop functionality
|
|
4547
|
+
*/
|
|
4548
|
+
setupDragAndDrop() {
|
|
4549
|
+
document.addEventListener('dragover', this.handleDragOver.bind(this));
|
|
4550
|
+
document.addEventListener('dragleave', this.handleDragLeave.bind(this));
|
|
4551
|
+
document.addEventListener('drop', this.handleDrop.bind(this));
|
|
4552
|
+
}
|
|
4553
|
+
/**
|
|
4554
|
+
* Remove drag and drop listeners
|
|
4555
|
+
*/
|
|
4556
|
+
removeDragAndDropListeners() {
|
|
4557
|
+
document.removeEventListener('dragover', this.handleDragOver.bind(this));
|
|
4558
|
+
document.removeEventListener('dragleave', this.handleDragLeave.bind(this));
|
|
4559
|
+
document.removeEventListener('drop', this.handleDrop.bind(this));
|
|
4560
|
+
}
|
|
4561
|
+
/**
|
|
4562
|
+
* Set up file input change listeners
|
|
4563
|
+
*/
|
|
4564
|
+
setupFileInputListeners() {
|
|
4565
|
+
// Listen for file input change events globally
|
|
4566
|
+
document.addEventListener('change', this.handleFileInputChange.bind(this));
|
|
4567
|
+
}
|
|
4568
|
+
/**
|
|
4569
|
+
* Remove file input listeners
|
|
4570
|
+
*/
|
|
4571
|
+
removeFileInputListeners() {
|
|
4572
|
+
document.removeEventListener('change', this.handleFileInputChange.bind(this));
|
|
4573
|
+
}
|
|
4574
|
+
/**
|
|
4575
|
+
* Handle file input change events
|
|
4576
|
+
*/
|
|
4577
|
+
handleFileInputChange(event) {
|
|
4578
|
+
const target = event.target;
|
|
4579
|
+
// Check if this is a file input with files
|
|
4580
|
+
if (target.type === 'file' && target.files && target.files.length > 0) {
|
|
4581
|
+
console.log('📁 [FloatingFileUploader] File input change detected:', target.files.length, 'files');
|
|
4582
|
+
// Check if the input has a data-user-id attribute for user context
|
|
4583
|
+
const userId = target.getAttribute('data-user-id');
|
|
4584
|
+
if (userId && userId !== this.currentUserId()) {
|
|
4585
|
+
this.setCurrentUserId(userId);
|
|
4586
|
+
}
|
|
4587
|
+
// Handle the files
|
|
4588
|
+
this.handleFiles(Array.from(target.files));
|
|
4589
|
+
// Reset the input to allow selecting the same files again
|
|
4590
|
+
target.value = '';
|
|
4591
|
+
}
|
|
4592
|
+
}
|
|
4593
|
+
/**
|
|
4594
|
+
* Handle drag over event
|
|
4595
|
+
*/
|
|
4596
|
+
handleDragOver(event) {
|
|
4597
|
+
event.preventDefault();
|
|
4598
|
+
event.stopPropagation();
|
|
4599
|
+
// Show floating uploader when files are dragged over
|
|
4600
|
+
if (event.dataTransfer?.types.includes('Files')) {
|
|
4601
|
+
this.showWithAnimation();
|
|
4602
|
+
}
|
|
4603
|
+
}
|
|
4604
|
+
/**
|
|
4605
|
+
* Handle drag leave event
|
|
4606
|
+
*/
|
|
4607
|
+
handleDragLeave(event) {
|
|
4608
|
+
event.preventDefault();
|
|
4609
|
+
event.stopPropagation();
|
|
4610
|
+
// Only hide if leaving the entire document
|
|
4611
|
+
if (!event.relatedTarget || event.relatedTarget === document.body) {
|
|
4612
|
+
this.updateVisibility();
|
|
4613
|
+
}
|
|
4614
|
+
}
|
|
4615
|
+
/**
|
|
4616
|
+
* Handle drop event
|
|
4617
|
+
*/
|
|
4618
|
+
handleDrop(event) {
|
|
4619
|
+
event.preventDefault();
|
|
4620
|
+
event.stopPropagation();
|
|
4621
|
+
const files = event.dataTransfer?.files;
|
|
4622
|
+
if (files && files.length > 0) {
|
|
4623
|
+
this.handleFiles(Array.from(files));
|
|
4624
|
+
}
|
|
4625
|
+
}
|
|
4626
|
+
/**
|
|
4627
|
+
* Handle files from drag and drop or file input
|
|
4628
|
+
*/
|
|
4629
|
+
handleFiles(files) {
|
|
4630
|
+
console.log('📁 [FloatingFileUploader] Handling files:', files.length);
|
|
4631
|
+
// Add files to the file manager service queue
|
|
4632
|
+
files.forEach(file => {
|
|
4633
|
+
const fileId = this.generateFileId(file);
|
|
4634
|
+
// Create upload progress item
|
|
4635
|
+
const uploadItem = {
|
|
4636
|
+
fileId,
|
|
4637
|
+
fileName: file.name,
|
|
4638
|
+
progress: 0,
|
|
4639
|
+
status: 'pending'
|
|
4640
|
+
};
|
|
4641
|
+
// Add to local queue
|
|
4642
|
+
this.uploadQueue.update(queue => [...queue, uploadItem]);
|
|
4643
|
+
// Start upload using file manager service
|
|
4644
|
+
this.fileManagerService.uploadFile(file, {
|
|
4645
|
+
userId: this.currentUserId(),
|
|
4646
|
+
permissions: ['read', 'write'],
|
|
4647
|
+
tags: []
|
|
4648
|
+
}, (progress) => {
|
|
4649
|
+
this.updateUploadProgress(fileId, progress);
|
|
4650
|
+
})
|
|
4651
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
4652
|
+
.subscribe({
|
|
4653
|
+
next: (response) => {
|
|
4654
|
+
console.log('✅ [FloatingFileUploader] Upload completed:', response);
|
|
4655
|
+
this.updateUploadStatus(fileId, 'completed', 100, undefined, response);
|
|
4656
|
+
},
|
|
4657
|
+
error: (error) => {
|
|
4658
|
+
console.error('❌ [FloatingFileUploader] Upload failed:', error);
|
|
4659
|
+
this.updateUploadStatus(fileId, 'error', 0, error.message || 'Upload failed');
|
|
4660
|
+
}
|
|
4661
|
+
});
|
|
4662
|
+
});
|
|
4663
|
+
this.updateVisibility();
|
|
4664
|
+
}
|
|
4665
|
+
/**
|
|
4666
|
+
* Update visibility based on upload state
|
|
4667
|
+
*/
|
|
4668
|
+
updateVisibility() {
|
|
4669
|
+
const hasActiveUploads = this.activeUploads().length > 0;
|
|
4670
|
+
const hasPendingUploads = this.pendingUploads().length > 0;
|
|
4671
|
+
const hasCompletedUploads = this.completedUploads().length > 0;
|
|
4672
|
+
const hasFailedUploads = this.failedUploads().length > 0;
|
|
4673
|
+
// Show if there are active, pending, or recent completed/failed uploads
|
|
4674
|
+
const shouldShow = hasActiveUploads || hasPendingUploads || hasCompletedUploads || hasFailedUploads;
|
|
4675
|
+
if (shouldShow && !this.isVisible()) {
|
|
4676
|
+
this.showWithAnimation();
|
|
4677
|
+
}
|
|
4678
|
+
else if (!shouldShow && this.isVisible()) {
|
|
4679
|
+
this.hideWithAnimation();
|
|
4680
|
+
}
|
|
4681
|
+
}
|
|
4682
|
+
/**
|
|
4683
|
+
* Show with animation
|
|
4684
|
+
*/
|
|
4685
|
+
showWithAnimation() {
|
|
4686
|
+
this.isAnimating.set(true);
|
|
4687
|
+
this.isVisible.set(true);
|
|
4688
|
+
// Remove animation class after animation completes
|
|
4689
|
+
setTimeout(() => {
|
|
4690
|
+
this.isAnimating.set(false);
|
|
4691
|
+
}, 300);
|
|
4692
|
+
}
|
|
4693
|
+
/**
|
|
4694
|
+
* Hide with animation
|
|
4695
|
+
*/
|
|
4696
|
+
hideWithAnimation() {
|
|
4697
|
+
this.isAnimating.set(true);
|
|
4698
|
+
// Wait for animation to complete before hiding
|
|
4699
|
+
setTimeout(() => {
|
|
4700
|
+
this.isVisible.set(false);
|
|
4701
|
+
this.isAnimating.set(false);
|
|
4702
|
+
}, 300);
|
|
4703
|
+
}
|
|
4704
|
+
/**
|
|
4705
|
+
* Toggle minimize state
|
|
4706
|
+
*/
|
|
4707
|
+
toggleMinimize() {
|
|
4708
|
+
this.isMinimized.set(!this.isMinimized());
|
|
4709
|
+
}
|
|
4710
|
+
/**
|
|
4711
|
+
* Close the floating uploader
|
|
4712
|
+
*/
|
|
4713
|
+
close() {
|
|
4714
|
+
this.clearAllUploads();
|
|
4715
|
+
this.hideWithAnimation();
|
|
4716
|
+
}
|
|
4717
|
+
/**
|
|
4718
|
+
* Clear all uploads
|
|
4719
|
+
*/
|
|
4720
|
+
clearAllUploads() {
|
|
4721
|
+
this.uploadQueue.set([]);
|
|
4722
|
+
}
|
|
4723
|
+
/**
|
|
4724
|
+
* Clear completed uploads
|
|
4725
|
+
*/
|
|
4726
|
+
clearCompletedUploads() {
|
|
4727
|
+
this.uploadQueue.update(queue => queue.filter(upload => upload.status !== 'completed'));
|
|
4728
|
+
}
|
|
4729
|
+
/**
|
|
4730
|
+
* Cancel upload
|
|
4731
|
+
*/
|
|
4732
|
+
cancelUpload(fileId) {
|
|
4733
|
+
console.log('🚫 [FloatingFileUploader] Cancelling upload:', fileId);
|
|
4734
|
+
this.fileManagerService.cancelUpload(fileId);
|
|
4735
|
+
this.updateUploadStatus(fileId, 'cancelled', 0);
|
|
4736
|
+
}
|
|
4737
|
+
/**
|
|
4738
|
+
* Retry upload
|
|
4739
|
+
*/
|
|
4740
|
+
retryUpload(fileId) {
|
|
4741
|
+
console.log('🔄 [FloatingFileUploader] Retrying upload:', fileId);
|
|
4742
|
+
this.updateUploadStatus(fileId, 'pending', 0);
|
|
4743
|
+
// Note: Actual retry logic would need to be implemented based on stored file data
|
|
4744
|
+
}
|
|
4745
|
+
/**
|
|
4746
|
+
* Update upload progress
|
|
4747
|
+
*/
|
|
4748
|
+
updateUploadProgress(fileId, progress) {
|
|
4749
|
+
this.uploadQueue.update(queue => queue.map(upload => upload.fileId === fileId
|
|
4750
|
+
? { ...upload, progress, status: 'uploading' }
|
|
4751
|
+
: upload));
|
|
4752
|
+
}
|
|
4753
|
+
/**
|
|
4754
|
+
* Update upload status
|
|
4755
|
+
*/
|
|
4756
|
+
updateUploadStatus(fileId, status, progress, error, uploadedFile) {
|
|
4757
|
+
this.uploadQueue.update(queue => queue.map(upload => upload.fileId === fileId
|
|
4758
|
+
? { ...upload, status, progress, error, uploadedFile }
|
|
4759
|
+
: upload));
|
|
4760
|
+
}
|
|
4761
|
+
/**
|
|
4762
|
+
* Get status icon
|
|
4763
|
+
*/
|
|
4764
|
+
getStatusIcon(status) {
|
|
4765
|
+
switch (status) {
|
|
4766
|
+
case 'pending': return 'schedule';
|
|
4767
|
+
case 'uploading': return 'cloud_upload';
|
|
4768
|
+
case 'completed': return 'check_circle';
|
|
4769
|
+
case 'error': return 'error';
|
|
4770
|
+
case 'cancelled': return 'cancel';
|
|
4771
|
+
default: return 'help';
|
|
4772
|
+
}
|
|
4773
|
+
}
|
|
4774
|
+
/**
|
|
4775
|
+
* Get status class
|
|
4776
|
+
*/
|
|
4777
|
+
getStatusClass(status) {
|
|
4778
|
+
switch (status) {
|
|
4779
|
+
case 'pending': return 'status-pending';
|
|
4780
|
+
case 'uploading': return 'status-uploading';
|
|
4781
|
+
case 'completed': return 'status-completed';
|
|
4782
|
+
case 'error': return 'status-error';
|
|
4783
|
+
case 'cancelled': return 'status-cancelled';
|
|
4784
|
+
default: return 'status-unknown';
|
|
4785
|
+
}
|
|
4786
|
+
}
|
|
4787
|
+
/**
|
|
4788
|
+
* Get file size display
|
|
4789
|
+
*/
|
|
4790
|
+
getFileSizeDisplay(size) {
|
|
4791
|
+
if (size === 0)
|
|
4792
|
+
return '0 Bytes';
|
|
4793
|
+
const k = 1024;
|
|
4794
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
4795
|
+
const i = Math.floor(Math.log(size) / Math.log(k));
|
|
4796
|
+
return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
4797
|
+
}
|
|
4798
|
+
/**
|
|
4799
|
+
* Get overall progress percentage
|
|
4800
|
+
*/
|
|
4801
|
+
getOverallProgress() {
|
|
4802
|
+
const uploads = this.uploadQueue();
|
|
4803
|
+
if (uploads.length === 0)
|
|
4804
|
+
return 0;
|
|
4805
|
+
const totalProgress = uploads.reduce((sum, upload) => sum + upload.progress, 0);
|
|
4806
|
+
return Math.round(totalProgress / uploads.length);
|
|
4807
|
+
}
|
|
4808
|
+
/**
|
|
4809
|
+
* Get upload summary text
|
|
4810
|
+
*/
|
|
4811
|
+
getUploadSummary() {
|
|
4812
|
+
const active = this.activeUploads().length;
|
|
4813
|
+
const completed = this.completedUploads().length;
|
|
4814
|
+
const failed = this.failedUploads().length;
|
|
4815
|
+
const pending = this.pendingUploads().length;
|
|
4816
|
+
if (active > 0) {
|
|
4817
|
+
return `${active} uploading`;
|
|
4818
|
+
}
|
|
4819
|
+
else if (completed > 0 && failed === 0) {
|
|
4820
|
+
return `${completed} completed`;
|
|
4821
|
+
}
|
|
4822
|
+
else if (failed > 0) {
|
|
4823
|
+
return `${completed} completed, ${failed} failed`;
|
|
4824
|
+
}
|
|
4825
|
+
else if (pending > 0) {
|
|
4826
|
+
return `${pending} pending`;
|
|
4827
|
+
}
|
|
4828
|
+
return 'No uploads';
|
|
4829
|
+
}
|
|
4830
|
+
/**
|
|
4831
|
+
* Generate unique file ID
|
|
4832
|
+
*/
|
|
4833
|
+
generateFileId(file) {
|
|
4834
|
+
return `${file.name}_${file.size}_${Date.now()}`;
|
|
4835
|
+
}
|
|
4836
|
+
/**
|
|
4837
|
+
* Extract file name from file ID
|
|
4838
|
+
*/
|
|
4839
|
+
extractFileNameFromId(fileId) {
|
|
4840
|
+
// Extract filename from the fileId format: filename_size_timestamp
|
|
4841
|
+
const parts = fileId.split('_');
|
|
4842
|
+
if (parts.length >= 3) {
|
|
4843
|
+
// Remove the last two parts (size and timestamp) to get the filename
|
|
4844
|
+
return parts.slice(0, -2).join('_');
|
|
4845
|
+
}
|
|
4846
|
+
return fileId;
|
|
4847
|
+
}
|
|
4848
|
+
/**
|
|
4849
|
+
* Set current user ID
|
|
4850
|
+
*/
|
|
4851
|
+
setCurrentUserId(userId) {
|
|
4852
|
+
this.currentUserId.set(userId);
|
|
4853
|
+
this.fileManagerService.setUserId(userId);
|
|
4854
|
+
}
|
|
4855
|
+
/**
|
|
4856
|
+
* Public method to handle files from external sources
|
|
4857
|
+
* This can be called by other components to trigger the floating uploader
|
|
4858
|
+
*/
|
|
4859
|
+
handleExternalFiles(files, userId) {
|
|
4860
|
+
console.log('📁 [FloatingFileUploader] External files received:', files.length, 'files');
|
|
4861
|
+
// Set user ID if provided
|
|
4862
|
+
if (userId && userId !== this.currentUserId()) {
|
|
4863
|
+
this.setCurrentUserId(userId);
|
|
4864
|
+
}
|
|
4865
|
+
// Handle the files
|
|
4866
|
+
this.handleFiles(files);
|
|
4867
|
+
}
|
|
4868
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideEleFloatingFileUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
4869
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideEleFloatingFileUploaderComponent, isStandalone: true, selector: "cide-ele-floating-file-uploader", ngImport: i0, template: "<!-- Floating File Uploader Container -->\r\n@if (isVisible()) {\r\n<div class=\"floating-uploader\" \r\n [class.minimized]=\"isMinimized()\" \r\n [class.animating]=\"isAnimating()\"\r\n [class.uploading]=\"isUploading()\">\r\n\r\n <!-- Header -->\r\n <div class=\"uploader-header\">\r\n <div class=\"header-left\">\r\n <div class=\"upload-icon\">\r\n <cide-ele-icon size=\"sm\">cloud_upload</cide-ele-icon>\r\n </div>\r\n <div class=\"upload-info\">\r\n <div class=\"upload-title\">File Upload</div>\r\n <div class=\"upload-summary\">{{ getUploadSummary() }}</div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"header-actions\">\r\n <button class=\"action-btn minimize-btn\" (click)=\"toggleMinimize()\" [title]=\"isMinimized() ? 'Expand' : 'Minimize'\">\r\n <cide-ele-icon size=\"xs\">{{ isMinimized() ? 'expand_more' : 'expand_less' }}</cide-ele-icon>\r\n </button>\r\n <button class=\"action-btn close-btn\" (click)=\"close()\" title=\"Close\">\r\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Content (hidden when minimized) -->\r\n @if (!isMinimized()) {\r\n <div class=\"uploader-content\">\r\n \r\n <!-- Overall Progress Bar -->\r\n @if (isUploading()) {\r\n <div class=\"overall-progress\">\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"getOverallProgress()\"></div>\r\n </div>\r\n <div class=\"progress-text\">{{ getOverallProgress() }}%</div>\r\n </div>\r\n }\r\n\r\n <!-- Upload Queue -->\r\n @if (hasUploads()) {\r\n <div class=\"upload-queue\">\r\n @for (upload of uploadQueue(); track upload.fileId) {\r\n <div class=\"upload-item\" [class]=\"getStatusClass(upload.status)\">\r\n \r\n <!-- File Info -->\r\n <div class=\"file-info\">\r\n <cide-ele-icon class=\"status-icon\" size=\"xs\">{{ getStatusIcon(upload.status) }}</cide-ele-icon>\r\n <div class=\"file-details\">\r\n <div class=\"file-name\">{{ upload.fileName }}</div>\r\n <div class=\"file-status\">\r\n @switch (upload.status) {\r\n @case ('pending') {\r\n <span class=\"text-yellow-600\">Waiting...</span>\r\n }\r\n @case ('uploading') {\r\n <span class=\"text-blue-600\">Uploading...</span>\r\n }\r\n @case ('completed') {\r\n <span class=\"text-green-600\">Completed</span>\r\n }\r\n @case ('error') {\r\n <span class=\"text-red-600\">{{ upload.error || 'Failed' }}</span>\r\n }\r\n @case ('cancelled') {\r\n <span class=\"text-gray-600\">Cancelled</span>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Progress Bar (for uploading files) -->\r\n @if (upload.status === 'uploading') {\r\n <div class=\"file-progress\">\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"upload.progress\"></div>\r\n </div>\r\n <span class=\"progress-text\">{{ upload.progress }}%</span>\r\n </div>\r\n }\r\n\r\n <!-- Actions -->\r\n <div class=\"upload-actions\">\r\n @switch (upload.status) {\r\n @case ('pending') {\r\n <button class=\"action-btn cancel-btn\" (click)=\"cancelUpload(upload.fileId)\" title=\"Cancel\">\r\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('uploading') {\r\n <button class=\"action-btn cancel-btn\" (click)=\"cancelUpload(upload.fileId)\" title=\"Cancel\">\r\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('completed') {\r\n <button class=\"action-btn success-btn\" title=\"Completed\">\r\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('error') {\r\n <button class=\"action-btn retry-btn\" (click)=\"retryUpload(upload.fileId)\" title=\"Retry\">\r\n <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Hidden file input for drag & drop -->\r\n <div class=\"hidden-uploader\">\r\n <input type=\"file\" multiple style=\"display: none;\" id=\"floating-file-input\">\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Footer (always visible) -->\r\n <div class=\"uploader-footer\">\r\n <div class=\"footer-stats\">\r\n @if (activeUploads().length > 0) {\r\n <span class=\"stat uploading\">\r\n <cide-ele-icon size=\"xs\">cloud_upload</cide-ele-icon>\r\n {{ activeUploads().length }} uploading\r\n </span>\r\n }\r\n @if (completedUploads().length > 0) {\r\n <span class=\"stat completed\">\r\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\r\n {{ completedUploads().length }} completed\r\n </span>\r\n }\r\n @if (failedUploads().length > 0) {\r\n <span class=\"stat failed\">\r\n <cide-ele-icon size=\"xs\">error</cide-ele-icon>\r\n {{ failedUploads().length }} failed\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n", styles: [".floating-uploader{position:fixed;bottom:20px;right:20px;width:320px;max-height:500px;background:#fff;border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid rgba(0,0,0,.08);z-index:1000;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1);transform:translateY(0);opacity:1}.floating-uploader.animating{transition:all .3s cubic-bezier(.4,0,.2,1)}.floating-uploader.minimized .uploader-content{display:none}.floating-uploader.minimized .uploader-footer{border-top:none}.floating-uploader.uploading{border-color:#3b82f6;box-shadow:0 8px 32px #3b82f626}.floating-uploader .uploader-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.floating-uploader .uploader-header .header-left{display:flex;align-items:center;gap:8px}.floating-uploader .uploader-header .header-left .upload-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#3b82f6;border-radius:6px;color:#fff}.floating-uploader .uploader-header .header-left .upload-info .upload-title{font-size:14px;font-weight:600;color:#1e293b;margin:0}.floating-uploader .uploader-header .header-left .upload-info .upload-summary{font-size:12px;color:#64748b;margin:0}.floating-uploader .uploader-header .header-actions{display:flex;gap:4px}.floating-uploader .uploader-header .header-actions .action-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:background-color .2s;color:#64748b}.floating-uploader .uploader-header .header-actions .action-btn:hover{background:#e2e8f0;color:#1e293b}.floating-uploader .uploader-header .header-actions .action-btn.close-btn:hover{background:#fef2f2;color:#dc2626}.floating-uploader .uploader-content{max-height:400px;overflow-y:auto}.floating-uploader .uploader-content .overall-progress{padding:12px 16px;border-bottom:1px solid #e2e8f0}.floating-uploader .uploader-content .overall-progress .progress-bar{width:100%;height:4px;background:#e2e8f0;border-radius:2px;overflow:hidden;margin-bottom:4px}.floating-uploader .uploader-content .overall-progress .progress-bar .progress-fill{height:100%;background:#3b82f6;transition:width .3s ease}.floating-uploader .uploader-content .overall-progress .progress-text{font-size:12px;color:#64748b;text-align:center;display:block}.floating-uploader .uploader-content .upload-queue .upload-item{display:flex;align-items:center;padding:8px 16px;border-bottom:1px solid #f1f5f9;transition:background-color .2s}.floating-uploader .uploader-content .upload-queue .upload-item:last-child{border-bottom:none}.floating-uploader .uploader-content .upload-queue .upload-item.status-uploading{background:#f0f9ff}.floating-uploader .uploader-content .upload-queue .upload-item.status-completed{background:#f0fdf4}.floating-uploader .uploader-content .upload-queue .upload-item.status-error{background:#fef2f2}.floating-uploader .uploader-content .upload-queue .upload-item .file-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .status-icon{flex-shrink:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details{min-width:0;flex:1}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-name{font-size:13px;font-weight:500;color:#1e293b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-status{font-size:11px;margin:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-status span{font-weight:500}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress{display:flex;align-items:center;gap:8px;margin:0 8px;min-width:80px}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar{flex:1;height:3px;background:#e2e8f0;border-radius:2px;overflow:hidden}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar .progress-fill{height:100%;background:#3b82f6;transition:width .3s ease}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-text{font-size:10px;color:#64748b;min-width:24px;text-align:right}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions{display:flex;gap:4px}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:all .2s;color:#64748b}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn:hover{background:#e2e8f0}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.cancel-btn:hover{background:#fef2f2;color:#dc2626}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.retry-btn:hover{background:#f0f9ff;color:#3b82f6}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.success-btn{color:#16a34a}.floating-uploader .uploader-content .hidden-uploader{display:none}.floating-uploader .uploader-footer{padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0}.floating-uploader .uploader-footer .footer-stats{display:flex;gap:12px;font-size:11px}.floating-uploader .uploader-footer .footer-stats .stat{display:flex;align-items:center;gap:4px;color:#64748b}.floating-uploader .uploader-footer .footer-stats .stat.uploading{color:#3b82f6}.floating-uploader .uploader-footer .footer-stats .stat.completed{color:#16a34a}.floating-uploader .uploader-footer .footer-stats .stat.failed{color:#dc2626}@media (max-width: 640px){.floating-uploader{bottom:10px;right:10px;left:10px;width:auto;max-width:none}}@media (prefers-color-scheme: dark){.floating-uploader{background:#1e293b;border-color:#334155;box-shadow:0 8px 32px #0000004d}.floating-uploader.uploading{border-color:#3b82f6;box-shadow:0 8px 32px #3b82f633}.floating-uploader .uploader-header{background:#334155;border-bottom-color:#475569}.floating-uploader .uploader-header .header-left .upload-icon{background:#3b82f6}.floating-uploader .uploader-header .header-left .upload-info .upload-title{color:#f1f5f9}.floating-uploader .uploader-header .header-left .upload-info .upload-summary,.floating-uploader .uploader-header .header-actions .action-btn{color:#94a3b8}.floating-uploader .uploader-header .header-actions .action-btn:hover{background:#475569;color:#f1f5f9}.floating-uploader .uploader-header .header-actions .action-btn.close-btn:hover{background:#7f1d1d;color:#fca5a5}.floating-uploader .uploader-content .overall-progress{border-bottom-color:#475569}.floating-uploader .uploader-content .overall-progress .progress-bar{background:#475569}.floating-uploader .uploader-content .overall-progress .progress-bar .progress-fill{background:#3b82f6}.floating-uploader .uploader-content .overall-progress .progress-text{color:#94a3b8}.floating-uploader .uploader-content .upload-queue .upload-item{border-bottom-color:#334155}.floating-uploader .uploader-content .upload-queue .upload-item.status-uploading{background:#1e3a8a}.floating-uploader .uploader-content .upload-queue .upload-item.status-completed{background:#14532d}.floating-uploader .uploader-content .upload-queue .upload-item.status-error{background:#7f1d1d}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-name{color:#f1f5f9}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar{background:#475569}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar .progress-fill{background:#3b82f6}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-text,.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn{color:#94a3b8}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn:hover{background:#475569}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.cancel-btn:hover{background:#7f1d1d;color:#fca5a5}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.retry-btn:hover{background:#1e3a8a;color:#60a5fa}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.success-btn{color:#4ade80}.floating-uploader .uploader-footer{background:#334155;border-top-color:#475569}.floating-uploader .uploader-footer .footer-stats .stat{color:#94a3b8}.floating-uploader .uploader-footer .footer-stats .stat.uploading{color:#60a5fa}.floating-uploader .uploader-footer .footer-stats .stat.completed{color:#4ade80}.floating-uploader .uploader-footer .footer-stats .stat.failed{color:#fca5a5}}@keyframes slideInUp{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes slideOutDown{0%{transform:translateY(0);opacity:1}to{transform:translateY(100%);opacity:0}}.floating-uploader.animating{animation:slideInUp .3s cubic-bezier(.4,0,.2,1)}.floating-uploader.animating.hiding{animation:slideOutDown .3s cubic-bezier(.4,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }] });
|
|
4870
|
+
}
|
|
4871
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideEleFloatingFileUploaderComponent, decorators: [{
|
|
4872
|
+
type: Component,
|
|
4873
|
+
args: [{ selector: 'cide-ele-floating-file-uploader', standalone: true, imports: [
|
|
4874
|
+
CommonModule,
|
|
4875
|
+
CideIconComponent
|
|
4876
|
+
], template: "<!-- Floating File Uploader Container -->\r\n@if (isVisible()) {\r\n<div class=\"floating-uploader\" \r\n [class.minimized]=\"isMinimized()\" \r\n [class.animating]=\"isAnimating()\"\r\n [class.uploading]=\"isUploading()\">\r\n\r\n <!-- Header -->\r\n <div class=\"uploader-header\">\r\n <div class=\"header-left\">\r\n <div class=\"upload-icon\">\r\n <cide-ele-icon size=\"sm\">cloud_upload</cide-ele-icon>\r\n </div>\r\n <div class=\"upload-info\">\r\n <div class=\"upload-title\">File Upload</div>\r\n <div class=\"upload-summary\">{{ getUploadSummary() }}</div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"header-actions\">\r\n <button class=\"action-btn minimize-btn\" (click)=\"toggleMinimize()\" [title]=\"isMinimized() ? 'Expand' : 'Minimize'\">\r\n <cide-ele-icon size=\"xs\">{{ isMinimized() ? 'expand_more' : 'expand_less' }}</cide-ele-icon>\r\n </button>\r\n <button class=\"action-btn close-btn\" (click)=\"close()\" title=\"Close\">\r\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Content (hidden when minimized) -->\r\n @if (!isMinimized()) {\r\n <div class=\"uploader-content\">\r\n \r\n <!-- Overall Progress Bar -->\r\n @if (isUploading()) {\r\n <div class=\"overall-progress\">\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"getOverallProgress()\"></div>\r\n </div>\r\n <div class=\"progress-text\">{{ getOverallProgress() }}%</div>\r\n </div>\r\n }\r\n\r\n <!-- Upload Queue -->\r\n @if (hasUploads()) {\r\n <div class=\"upload-queue\">\r\n @for (upload of uploadQueue(); track upload.fileId) {\r\n <div class=\"upload-item\" [class]=\"getStatusClass(upload.status)\">\r\n \r\n <!-- File Info -->\r\n <div class=\"file-info\">\r\n <cide-ele-icon class=\"status-icon\" size=\"xs\">{{ getStatusIcon(upload.status) }}</cide-ele-icon>\r\n <div class=\"file-details\">\r\n <div class=\"file-name\">{{ upload.fileName }}</div>\r\n <div class=\"file-status\">\r\n @switch (upload.status) {\r\n @case ('pending') {\r\n <span class=\"text-yellow-600\">Waiting...</span>\r\n }\r\n @case ('uploading') {\r\n <span class=\"text-blue-600\">Uploading...</span>\r\n }\r\n @case ('completed') {\r\n <span class=\"text-green-600\">Completed</span>\r\n }\r\n @case ('error') {\r\n <span class=\"text-red-600\">{{ upload.error || 'Failed' }}</span>\r\n }\r\n @case ('cancelled') {\r\n <span class=\"text-gray-600\">Cancelled</span>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Progress Bar (for uploading files) -->\r\n @if (upload.status === 'uploading') {\r\n <div class=\"file-progress\">\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"upload.progress\"></div>\r\n </div>\r\n <span class=\"progress-text\">{{ upload.progress }}%</span>\r\n </div>\r\n }\r\n\r\n <!-- Actions -->\r\n <div class=\"upload-actions\">\r\n @switch (upload.status) {\r\n @case ('pending') {\r\n <button class=\"action-btn cancel-btn\" (click)=\"cancelUpload(upload.fileId)\" title=\"Cancel\">\r\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('uploading') {\r\n <button class=\"action-btn cancel-btn\" (click)=\"cancelUpload(upload.fileId)\" title=\"Cancel\">\r\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('completed') {\r\n <button class=\"action-btn success-btn\" title=\"Completed\">\r\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('error') {\r\n <button class=\"action-btn retry-btn\" (click)=\"retryUpload(upload.fileId)\" title=\"Retry\">\r\n <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Hidden file input for drag & drop -->\r\n <div class=\"hidden-uploader\">\r\n <input type=\"file\" multiple style=\"display: none;\" id=\"floating-file-input\">\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Footer (always visible) -->\r\n <div class=\"uploader-footer\">\r\n <div class=\"footer-stats\">\r\n @if (activeUploads().length > 0) {\r\n <span class=\"stat uploading\">\r\n <cide-ele-icon size=\"xs\">cloud_upload</cide-ele-icon>\r\n {{ activeUploads().length }} uploading\r\n </span>\r\n }\r\n @if (completedUploads().length > 0) {\r\n <span class=\"stat completed\">\r\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\r\n {{ completedUploads().length }} completed\r\n </span>\r\n }\r\n @if (failedUploads().length > 0) {\r\n <span class=\"stat failed\">\r\n <cide-ele-icon size=\"xs\">error</cide-ele-icon>\r\n {{ failedUploads().length }} failed\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n", styles: [".floating-uploader{position:fixed;bottom:20px;right:20px;width:320px;max-height:500px;background:#fff;border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid rgba(0,0,0,.08);z-index:1000;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1);transform:translateY(0);opacity:1}.floating-uploader.animating{transition:all .3s cubic-bezier(.4,0,.2,1)}.floating-uploader.minimized .uploader-content{display:none}.floating-uploader.minimized .uploader-footer{border-top:none}.floating-uploader.uploading{border-color:#3b82f6;box-shadow:0 8px 32px #3b82f626}.floating-uploader .uploader-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.floating-uploader .uploader-header .header-left{display:flex;align-items:center;gap:8px}.floating-uploader .uploader-header .header-left .upload-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#3b82f6;border-radius:6px;color:#fff}.floating-uploader .uploader-header .header-left .upload-info .upload-title{font-size:14px;font-weight:600;color:#1e293b;margin:0}.floating-uploader .uploader-header .header-left .upload-info .upload-summary{font-size:12px;color:#64748b;margin:0}.floating-uploader .uploader-header .header-actions{display:flex;gap:4px}.floating-uploader .uploader-header .header-actions .action-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:background-color .2s;color:#64748b}.floating-uploader .uploader-header .header-actions .action-btn:hover{background:#e2e8f0;color:#1e293b}.floating-uploader .uploader-header .header-actions .action-btn.close-btn:hover{background:#fef2f2;color:#dc2626}.floating-uploader .uploader-content{max-height:400px;overflow-y:auto}.floating-uploader .uploader-content .overall-progress{padding:12px 16px;border-bottom:1px solid #e2e8f0}.floating-uploader .uploader-content .overall-progress .progress-bar{width:100%;height:4px;background:#e2e8f0;border-radius:2px;overflow:hidden;margin-bottom:4px}.floating-uploader .uploader-content .overall-progress .progress-bar .progress-fill{height:100%;background:#3b82f6;transition:width .3s ease}.floating-uploader .uploader-content .overall-progress .progress-text{font-size:12px;color:#64748b;text-align:center;display:block}.floating-uploader .uploader-content .upload-queue .upload-item{display:flex;align-items:center;padding:8px 16px;border-bottom:1px solid #f1f5f9;transition:background-color .2s}.floating-uploader .uploader-content .upload-queue .upload-item:last-child{border-bottom:none}.floating-uploader .uploader-content .upload-queue .upload-item.status-uploading{background:#f0f9ff}.floating-uploader .uploader-content .upload-queue .upload-item.status-completed{background:#f0fdf4}.floating-uploader .uploader-content .upload-queue .upload-item.status-error{background:#fef2f2}.floating-uploader .uploader-content .upload-queue .upload-item .file-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .status-icon{flex-shrink:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details{min-width:0;flex:1}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-name{font-size:13px;font-weight:500;color:#1e293b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-status{font-size:11px;margin:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-status span{font-weight:500}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress{display:flex;align-items:center;gap:8px;margin:0 8px;min-width:80px}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar{flex:1;height:3px;background:#e2e8f0;border-radius:2px;overflow:hidden}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar .progress-fill{height:100%;background:#3b82f6;transition:width .3s ease}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-text{font-size:10px;color:#64748b;min-width:24px;text-align:right}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions{display:flex;gap:4px}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:all .2s;color:#64748b}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn:hover{background:#e2e8f0}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.cancel-btn:hover{background:#fef2f2;color:#dc2626}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.retry-btn:hover{background:#f0f9ff;color:#3b82f6}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.success-btn{color:#16a34a}.floating-uploader .uploader-content .hidden-uploader{display:none}.floating-uploader .uploader-footer{padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0}.floating-uploader .uploader-footer .footer-stats{display:flex;gap:12px;font-size:11px}.floating-uploader .uploader-footer .footer-stats .stat{display:flex;align-items:center;gap:4px;color:#64748b}.floating-uploader .uploader-footer .footer-stats .stat.uploading{color:#3b82f6}.floating-uploader .uploader-footer .footer-stats .stat.completed{color:#16a34a}.floating-uploader .uploader-footer .footer-stats .stat.failed{color:#dc2626}@media (max-width: 640px){.floating-uploader{bottom:10px;right:10px;left:10px;width:auto;max-width:none}}@media (prefers-color-scheme: dark){.floating-uploader{background:#1e293b;border-color:#334155;box-shadow:0 8px 32px #0000004d}.floating-uploader.uploading{border-color:#3b82f6;box-shadow:0 8px 32px #3b82f633}.floating-uploader .uploader-header{background:#334155;border-bottom-color:#475569}.floating-uploader .uploader-header .header-left .upload-icon{background:#3b82f6}.floating-uploader .uploader-header .header-left .upload-info .upload-title{color:#f1f5f9}.floating-uploader .uploader-header .header-left .upload-info .upload-summary,.floating-uploader .uploader-header .header-actions .action-btn{color:#94a3b8}.floating-uploader .uploader-header .header-actions .action-btn:hover{background:#475569;color:#f1f5f9}.floating-uploader .uploader-header .header-actions .action-btn.close-btn:hover{background:#7f1d1d;color:#fca5a5}.floating-uploader .uploader-content .overall-progress{border-bottom-color:#475569}.floating-uploader .uploader-content .overall-progress .progress-bar{background:#475569}.floating-uploader .uploader-content .overall-progress .progress-bar .progress-fill{background:#3b82f6}.floating-uploader .uploader-content .overall-progress .progress-text{color:#94a3b8}.floating-uploader .uploader-content .upload-queue .upload-item{border-bottom-color:#334155}.floating-uploader .uploader-content .upload-queue .upload-item.status-uploading{background:#1e3a8a}.floating-uploader .uploader-content .upload-queue .upload-item.status-completed{background:#14532d}.floating-uploader .uploader-content .upload-queue .upload-item.status-error{background:#7f1d1d}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-name{color:#f1f5f9}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar{background:#475569}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar .progress-fill{background:#3b82f6}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-text,.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn{color:#94a3b8}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn:hover{background:#475569}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.cancel-btn:hover{background:#7f1d1d;color:#fca5a5}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.retry-btn:hover{background:#1e3a8a;color:#60a5fa}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.success-btn{color:#4ade80}.floating-uploader .uploader-footer{background:#334155;border-top-color:#475569}.floating-uploader .uploader-footer .footer-stats .stat{color:#94a3b8}.floating-uploader .uploader-footer .footer-stats .stat.uploading{color:#60a5fa}.floating-uploader .uploader-footer .footer-stats .stat.completed{color:#4ade80}.floating-uploader .uploader-footer .footer-stats .stat.failed{color:#fca5a5}}@keyframes slideInUp{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes slideOutDown{0%{transform:translateY(0);opacity:1}to{transform:translateY(100%);opacity:0}}.floating-uploader.animating{animation:slideInUp .3s cubic-bezier(.4,0,.2,1)}.floating-uploader.animating.hiding{animation:slideOutDown .3s cubic-bezier(.4,0,.2,1)}\n"] }]
|
|
4877
|
+
}], ctorParameters: () => [] });
|
|
4878
|
+
|
|
4511
4879
|
class CideTextareaComponent {
|
|
4512
4880
|
label = '';
|
|
4513
4881
|
labelHide = false;
|
|
@@ -8746,5 +9114,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
8746
9114
|
* Generated bundle index. Do not edit.
|
|
8747
9115
|
*/
|
|
8748
9116
|
|
|
8749
|
-
export { CideCoreFileManagerService, CideEleButtonComponent, CideEleConfirmationModalComponent, CideEleDataGridComponent, CideEleDropdownComponent, CideEleFileImageDirective, CideEleFileInputComponent, CideEleFileManagerService, CideEleGlobalFileUploaderComponent, CideEleGlobalNotificationsComponent, CideEleJsonEditorComponent, CideEleResizerDirective, CideEleSkeletonLoaderComponent, CideEleTabComponent, CideEleToastNotificationComponent, CideElementsService, CideIconComponent, CideInputComponent, CideSelectComponent, CideSelectOptionComponent, CideSpinnerComponent, CideTextareaComponent, ConfirmationService, CoreFileManagerInsertUpdatePayload, DEFAULT_GRID_CONFIG, DropdownManagerService, ICoreCyfmSave, MFileManager, NotificationService, TooltipDirective };
|
|
9117
|
+
export { CideCoreFileManagerService, CideEleButtonComponent, CideEleConfirmationModalComponent, CideEleDataGridComponent, CideEleDropdownComponent, CideEleFileImageDirective, CideEleFileInputComponent, CideEleFileManagerService, CideEleFloatingFileUploaderComponent, CideEleGlobalFileUploaderComponent, CideEleGlobalNotificationsComponent, CideEleJsonEditorComponent, CideEleResizerDirective, CideEleSkeletonLoaderComponent, CideEleTabComponent, CideEleToastNotificationComponent, CideElementsService, CideIconComponent, CideInputComponent, CideSelectComponent, CideSelectOptionComponent, CideSpinnerComponent, CideTextareaComponent, ConfirmationService, CoreFileManagerInsertUpdatePayload, DEFAULT_GRID_CONFIG, DropdownManagerService, ICoreCyfmSave, MFileManager, NotificationService, TooltipDirective };
|
|
8750
9118
|
//# sourceMappingURL=cloud-ide-element.mjs.map
|