@kodaris/krubble-components 1.0.43 → 1.0.44
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/custom-elements.json +753 -39
- package/dist/file-list/file-list.d.ts +49 -0
- package/dist/file-list/file-list.d.ts.map +1 -0
- package/dist/file-list/file-list.js +269 -0
- package/dist/file-list/file-list.js.map +1 -0
- package/dist/file-preview/file-preview.d.ts +77 -0
- package/dist/file-preview/file-preview.d.ts.map +1 -0
- package/dist/file-preview/file-preview.js +498 -0
- package/dist/file-preview/file-preview.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/krubble-components.bundled.js +846 -87
- package/dist/krubble-components.bundled.js.map +1 -1
- package/dist/krubble-components.bundled.min.js +467 -111
- package/dist/krubble-components.bundled.min.js.map +1 -1
- package/dist/krubble-components.umd.js +846 -87
- package/dist/krubble-components.umd.js.map +1 -1
- package/dist/krubble-components.umd.min.js +484 -128
- package/dist/krubble-components.umd.min.js.map +1 -1
- package/package.json +9 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export interface KRFile {
|
|
3
|
+
name: string;
|
|
4
|
+
url?: string;
|
|
5
|
+
date?: string;
|
|
6
|
+
id?: string | number;
|
|
7
|
+
meta?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A file list component that displays files with extension-based icons,
|
|
11
|
+
* download/delete actions, and built-in file preview.
|
|
12
|
+
*
|
|
13
|
+
* Clicking a file name opens a full-screen preview via `KRFilePreview.open()`.
|
|
14
|
+
*
|
|
15
|
+
* @fires file-click - Fired when a file name is clicked. Detail: `{ file }`
|
|
16
|
+
* @fires download - Fired when the download icon is clicked. Detail: `{ file }`
|
|
17
|
+
* @fires delete - Fired when the delete icon is clicked. Detail: `{ file }`
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import '@kodaris/krubble-components/file-list';
|
|
22
|
+
*
|
|
23
|
+
* const list = document.querySelector('kr-file-list');
|
|
24
|
+
* list.files = [
|
|
25
|
+
* { name: 'photo.png', url: '/files/photo.png', date: '2024-01-15' },
|
|
26
|
+
* { name: 'report.pdf', url: '/files/report.pdf', date: '2024-01-10' },
|
|
27
|
+
* ];
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class KRFileList extends LitElement {
|
|
31
|
+
static styles: import("lit").CSSResult;
|
|
32
|
+
/** Array of file objects to display */
|
|
33
|
+
files: KRFile[];
|
|
34
|
+
/** Message displayed when the file list is empty */
|
|
35
|
+
emptyMessage: string;
|
|
36
|
+
private _handleFileClick;
|
|
37
|
+
private _handleDownload;
|
|
38
|
+
private _handleDelete;
|
|
39
|
+
private _getExtension;
|
|
40
|
+
private _getExtClass;
|
|
41
|
+
private _getExtIcon;
|
|
42
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
43
|
+
}
|
|
44
|
+
declare global {
|
|
45
|
+
interface HTMLElementTagNameMap {
|
|
46
|
+
'kr-file-list': KRFileList;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=file-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-list.d.ts","sourceRoot":"","sources":["../../src/file-list/file-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBACa,UAAW,SAAQ,UAAU;IAExC,OAAgB,MAAM,0BAqHpB;IAEF,uCAAuC;IAEvC,KAAK,EAAE,MAAM,EAAE,CAAM;IAErB,oDAAoD;IAEpD,YAAY,SAAc;IAE1B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;IAmBV,MAAM;CA2BhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,UAAU,CAAC;KAC5B;CACF"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { LitElement, html, css } from 'lit';
|
|
8
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
9
|
+
import { KRFilePreview } from '../file-preview/file-preview.js';
|
|
10
|
+
/**
|
|
11
|
+
* A file list component that displays files with extension-based icons,
|
|
12
|
+
* download/delete actions, and built-in file preview.
|
|
13
|
+
*
|
|
14
|
+
* Clicking a file name opens a full-screen preview via `KRFilePreview.open()`.
|
|
15
|
+
*
|
|
16
|
+
* @fires file-click - Fired when a file name is clicked. Detail: `{ file }`
|
|
17
|
+
* @fires download - Fired when the download icon is clicked. Detail: `{ file }`
|
|
18
|
+
* @fires delete - Fired when the delete icon is clicked. Detail: `{ file }`
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import '@kodaris/krubble-components/file-list';
|
|
23
|
+
*
|
|
24
|
+
* const list = document.querySelector('kr-file-list');
|
|
25
|
+
* list.files = [
|
|
26
|
+
* { name: 'photo.png', url: '/files/photo.png', date: '2024-01-15' },
|
|
27
|
+
* { name: 'report.pdf', url: '/files/report.pdf', date: '2024-01-10' },
|
|
28
|
+
* ];
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
let KRFileList = class KRFileList extends LitElement {
|
|
32
|
+
constructor() {
|
|
33
|
+
super(...arguments);
|
|
34
|
+
/** Array of file objects to display */
|
|
35
|
+
this.files = [];
|
|
36
|
+
/** Message displayed when the file list is empty */
|
|
37
|
+
this.emptyMessage = 'No files';
|
|
38
|
+
}
|
|
39
|
+
_handleFileClick(file) {
|
|
40
|
+
this.dispatchEvent(new CustomEvent('file-click', {
|
|
41
|
+
bubbles: true,
|
|
42
|
+
composed: true,
|
|
43
|
+
detail: { file },
|
|
44
|
+
}));
|
|
45
|
+
if (file.url) {
|
|
46
|
+
KRFilePreview.open({ src: file.url, name: file.name });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
_handleDownload(file) {
|
|
50
|
+
this.dispatchEvent(new CustomEvent('download', {
|
|
51
|
+
bubbles: true,
|
|
52
|
+
composed: true,
|
|
53
|
+
detail: { file },
|
|
54
|
+
}));
|
|
55
|
+
if (file.url) {
|
|
56
|
+
fetch(file.url)
|
|
57
|
+
.then(response => response.blob())
|
|
58
|
+
.then(blob => {
|
|
59
|
+
const blobUrl = URL.createObjectURL(blob);
|
|
60
|
+
const a = document.createElement('a');
|
|
61
|
+
a.href = blobUrl;
|
|
62
|
+
a.download = file.name || 'file';
|
|
63
|
+
a.click();
|
|
64
|
+
URL.revokeObjectURL(blobUrl);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
_handleDelete(file) {
|
|
69
|
+
this.dispatchEvent(new CustomEvent('delete', {
|
|
70
|
+
bubbles: true,
|
|
71
|
+
composed: true,
|
|
72
|
+
detail: { file },
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
_getExtension(name) {
|
|
76
|
+
return name.split('.').pop()?.toLowerCase() || '';
|
|
77
|
+
}
|
|
78
|
+
_getExtClass(ext) {
|
|
79
|
+
if (['pdf'].includes(ext)) {
|
|
80
|
+
return 'file-list__ext--pdf';
|
|
81
|
+
}
|
|
82
|
+
if (['doc', 'docx', 'rtf', 'txt'].includes(ext)) {
|
|
83
|
+
return 'file-list__ext--doc';
|
|
84
|
+
}
|
|
85
|
+
if (['xls', 'xlsx', 'csv'].includes(ext)) {
|
|
86
|
+
return 'file-list__ext--xls';
|
|
87
|
+
}
|
|
88
|
+
if (['zip', 'rar', '7z', 'gz', 'tar'].includes(ext)) {
|
|
89
|
+
return 'file-list__ext--zip';
|
|
90
|
+
}
|
|
91
|
+
if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp'].includes(ext)) {
|
|
92
|
+
return 'file-list__ext--img';
|
|
93
|
+
}
|
|
94
|
+
return 'file-list__ext--default';
|
|
95
|
+
}
|
|
96
|
+
_getExtIcon(ext) {
|
|
97
|
+
if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp'].includes(ext)) {
|
|
98
|
+
return html `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86-3 3.87L9 13.14 6 17h12l-3.86-5.14z"/></svg>`;
|
|
99
|
+
}
|
|
100
|
+
if (['pdf'].includes(ext)) {
|
|
101
|
+
return html `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8.5 7.5c0 .83-.67 1.5-1.5 1.5H9v2H7.5V7H10c.83 0 1.5.67 1.5 1.5v1zm5 2c0 .83-.67 1.5-1.5 1.5h-2.5V7H15c.83 0 1.5.67 1.5 1.5v3zm4-3H19v1h1.5V11H19v2h-1.5V7h3v1.5zM9 9.5h1v-1H9v1zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm10 5.5h1v-3h-1v3z"/></svg>`;
|
|
102
|
+
}
|
|
103
|
+
if (['doc', 'docx', 'rtf', 'txt'].includes(ext)) {
|
|
104
|
+
return html `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zM6 20V4h7v5h5v11H6zm2-6h8v2H8v-2zm0-4h8v2H8v-2zm0 8h5v2H8v-2z"/></svg>`;
|
|
105
|
+
}
|
|
106
|
+
if (['xls', 'xlsx', 'csv'].includes(ext)) {
|
|
107
|
+
return html `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 2v3H5V5h14zm0 5v4H5v-4h14zM5 19v-3h14v3H5zm2-8h4v2H7v-2zm0 5h4v2H7v-2z"/></svg>`;
|
|
108
|
+
}
|
|
109
|
+
if (['zip', 'rar', '7z', 'gz', 'tar'].includes(ext)) {
|
|
110
|
+
return html `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M20 6h-8l-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V6h5.17l2 2H20v10zm-8-4h2v2h-2v-2zm0-4h2v2h-2v-2zm-2 2h2v2h-2v-2z"/></svg>`;
|
|
111
|
+
}
|
|
112
|
+
return html `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11z"/></svg>`;
|
|
113
|
+
}
|
|
114
|
+
render() {
|
|
115
|
+
if (!this.files.length) {
|
|
116
|
+
return html `<div class="file-list__empty">${this.emptyMessage}</div>`;
|
|
117
|
+
}
|
|
118
|
+
return html `
|
|
119
|
+
<div class="file-list">
|
|
120
|
+
${this.files.map(file => {
|
|
121
|
+
const ext = this._getExtension(file.name);
|
|
122
|
+
const metaText = file.meta || file.date || '';
|
|
123
|
+
return html `
|
|
124
|
+
<div class="file-list__item">
|
|
125
|
+
<div class="file-list__ext ${this._getExtClass(ext)}">${this._getExtIcon(ext)}</div>
|
|
126
|
+
<div class="file-list__info">
|
|
127
|
+
<a class="file-list__name" @click=${() => this._handleFileClick(file)}>${file.name}</a>
|
|
128
|
+
${metaText ? html `<div class="file-list__meta">${metaText}</div>` : ''}
|
|
129
|
+
</div>
|
|
130
|
+
<div class="file-list__actions">
|
|
131
|
+
<svg class="file-list__action" @click=${() => this._handleDownload(file)} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" title="Download"><path d="M19 9h-4V3H9v6H5l7 7 7-7zm-8 2V5h2v6h1.17L12 13.17 9.83 11H11zm-6 7h14v2H5v-2z"/></svg>
|
|
132
|
+
<svg class="file-list__action file-list__action--delete" @click=${() => this._handleDelete(file)} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" title="Delete"><path d="M16 9v10H8V9h8m-1.5-6h-5l-1 1H5v2h14V4h-3.5l-1-1zM18 7H6v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7z"/></svg>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
`;
|
|
136
|
+
})}
|
|
137
|
+
</div>
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
KRFileList.styles = css `
|
|
142
|
+
*,
|
|
143
|
+
*::after,
|
|
144
|
+
*::before,
|
|
145
|
+
:host {
|
|
146
|
+
box-sizing: border-box;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
:host {
|
|
150
|
+
display: block;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.file-list {
|
|
154
|
+
display: flex;
|
|
155
|
+
flex-direction: column;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.file-list__item {
|
|
159
|
+
display: flex;
|
|
160
|
+
align-items: center;
|
|
161
|
+
gap: 16px;
|
|
162
|
+
padding: 16px 20px;
|
|
163
|
+
background: white;
|
|
164
|
+
transition: background 0.15s;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.file-list__item:not(:last-child) {
|
|
168
|
+
border-bottom: 1px solid #eeeff1;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.file-list__item:hover {
|
|
172
|
+
background: #f8f9fa;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.file-list__ext {
|
|
176
|
+
width: 36px;
|
|
177
|
+
height: 36px;
|
|
178
|
+
flex-shrink: 0;
|
|
179
|
+
border-radius: 6px;
|
|
180
|
+
display: flex;
|
|
181
|
+
align-items: center;
|
|
182
|
+
justify-content: center;
|
|
183
|
+
font-size: 11px;
|
|
184
|
+
font-weight: 700;
|
|
185
|
+
text-transform: uppercase;
|
|
186
|
+
letter-spacing: 0.3px;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.file-list__ext svg {
|
|
190
|
+
width: 20px;
|
|
191
|
+
height: 20px;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.file-list__ext--img { background: #fde8e8; color: #d93025; }
|
|
195
|
+
.file-list__ext--pdf { background: #fde8e8; color: #c0392b; }
|
|
196
|
+
.file-list__ext--doc { background: #dbeafe; color: #2563eb; }
|
|
197
|
+
.file-list__ext--xls { background: #d1fae5; color: #16a34a; }
|
|
198
|
+
.file-list__ext--zip { background: #fef3c7; color: #b45309; }
|
|
199
|
+
.file-list__ext--default { background: #f4f5f7; color: #555; }
|
|
200
|
+
|
|
201
|
+
.file-list__info {
|
|
202
|
+
flex: 1;
|
|
203
|
+
min-width: 0;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.file-list__name {
|
|
207
|
+
font-weight: 500;
|
|
208
|
+
color: #000;
|
|
209
|
+
text-decoration: none;
|
|
210
|
+
cursor: pointer;
|
|
211
|
+
overflow: hidden;
|
|
212
|
+
text-overflow: ellipsis;
|
|
213
|
+
white-space: nowrap;
|
|
214
|
+
display: block;
|
|
215
|
+
font-size: 14px;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.file-list__name:hover {
|
|
219
|
+
color: #000;
|
|
220
|
+
text-decoration: underline;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.file-list__meta {
|
|
224
|
+
font-size: 13px;
|
|
225
|
+
color: #000;
|
|
226
|
+
margin-top: 6px;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.file-list__actions {
|
|
230
|
+
display: flex;
|
|
231
|
+
align-items: center;
|
|
232
|
+
gap: 12px;
|
|
233
|
+
flex-shrink: 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.file-list__action {
|
|
237
|
+
width: 24px;
|
|
238
|
+
height: 24px;
|
|
239
|
+
fill: #666;
|
|
240
|
+
cursor: pointer;
|
|
241
|
+
transition: fill 0.15s;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.file-list__action:hover {
|
|
245
|
+
fill: #000;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.file-list__action--delete:hover {
|
|
249
|
+
fill: #dc3545;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.file-list__empty {
|
|
253
|
+
color: #000;
|
|
254
|
+
font-size: 14px;
|
|
255
|
+
font-style: italic;
|
|
256
|
+
padding: 20px;
|
|
257
|
+
}
|
|
258
|
+
`;
|
|
259
|
+
__decorate([
|
|
260
|
+
property({ type: Array })
|
|
261
|
+
], KRFileList.prototype, "files", void 0);
|
|
262
|
+
__decorate([
|
|
263
|
+
property({ type: String, attribute: 'empty-message' })
|
|
264
|
+
], KRFileList.prototype, "emptyMessage", void 0);
|
|
265
|
+
KRFileList = __decorate([
|
|
266
|
+
customElement('kr-file-list')
|
|
267
|
+
], KRFileList);
|
|
268
|
+
export { KRFileList };
|
|
269
|
+
//# sourceMappingURL=file-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-list.js","sourceRoot":"","sources":["../../src/file-list/file-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import '../button/button.js';
|
|
3
|
+
export interface KRFilePreviewOptions {
|
|
4
|
+
/** URL of the file to preview */
|
|
5
|
+
src: string;
|
|
6
|
+
/** Display name shown in the toolbar */
|
|
7
|
+
name: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A full-screen file preview overlay.
|
|
11
|
+
*
|
|
12
|
+
* Supports image files with zoom/pan, PDFs via iframe, and a download
|
|
13
|
+
* fallback for other file types. Use the static `open()` method to show
|
|
14
|
+
* the preview imperatively.
|
|
15
|
+
*
|
|
16
|
+
* @fires close - Fired when the preview is closed
|
|
17
|
+
* @fires download - Fired when the download button is clicked. Detail: `{ src, name }`
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { KRFilePreview } from '@kodaris/krubble-components/file-preview';
|
|
22
|
+
*
|
|
23
|
+
* KRFilePreview.open({ src: '/files/photo.png', name: 'photo.png' });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class KRFilePreview extends LitElement {
|
|
27
|
+
static styles: import("lit").CSSResult;
|
|
28
|
+
private static _activePreview;
|
|
29
|
+
/**
|
|
30
|
+
* Open a file preview overlay.
|
|
31
|
+
* @param options - The file source URL and display name
|
|
32
|
+
* @returns The created file-preview element
|
|
33
|
+
*/
|
|
34
|
+
static open(options: KRFilePreviewOptions): KRFilePreview;
|
|
35
|
+
private _zoom;
|
|
36
|
+
private _panX;
|
|
37
|
+
private _panY;
|
|
38
|
+
private _dragging;
|
|
39
|
+
private _dragStartX;
|
|
40
|
+
private _dragStartY;
|
|
41
|
+
private _panStartX;
|
|
42
|
+
private _panStartY;
|
|
43
|
+
/** URL of the file to preview */
|
|
44
|
+
src: string;
|
|
45
|
+
/** Display name shown in the toolbar */
|
|
46
|
+
name: string;
|
|
47
|
+
private _zoomLevel;
|
|
48
|
+
private _textContent;
|
|
49
|
+
connectedCallback(): void;
|
|
50
|
+
disconnectedCallback(): void;
|
|
51
|
+
private _handleKeydown;
|
|
52
|
+
private _close;
|
|
53
|
+
private _handleDownload;
|
|
54
|
+
private _handleZoomIn;
|
|
55
|
+
private _handleZoomOut;
|
|
56
|
+
private _handleZoomReset;
|
|
57
|
+
private _handleDragStart;
|
|
58
|
+
private _handleDragMove;
|
|
59
|
+
private _handleDragEnd;
|
|
60
|
+
private _handleBackdropClick;
|
|
61
|
+
private _getExtension;
|
|
62
|
+
private _isImage;
|
|
63
|
+
private _isPdf;
|
|
64
|
+
private _isText;
|
|
65
|
+
private _isCsv;
|
|
66
|
+
private _loadTextContent;
|
|
67
|
+
private _formatCsv;
|
|
68
|
+
private _getFallbackIconClass;
|
|
69
|
+
private _getFallbackIcon;
|
|
70
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
71
|
+
}
|
|
72
|
+
declare global {
|
|
73
|
+
interface HTMLElementTagNameMap {
|
|
74
|
+
'kr-file-preview': KRFilePreview;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=file-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-preview.d.ts","sourceRoot":"","sources":["../../src/file-preview/file-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAErD,OAAO,qBAAqB,CAAC;AAE7B,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,aAAc,SAAQ,UAAU;IAE3C,OAAgB,MAAM,0BAoLpB;IAEF,OAAO,CAAC,MAAM,CAAC,cAAc,CAA8B;IAE3D;;;;OAIG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;IAazD,OAAO,CAAC,KAAK,CAAO;IACpB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAK;IAEvB,iCAAiC;IAEjC,GAAG,SAAM;IAET,wCAAwC;IAExC,IAAI,SAAM;IAGV,OAAO,CAAC,UAAU,CAAO;IAGzB,OAAO,CAAC,YAAY,CAAuB;IAElC,iBAAiB;IASjB,oBAAoB;IAK7B,OAAO,CAAC,cAAc,CAIpB;IAEF,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,eAAe,CAOrB;IAEF,OAAO,CAAC,cAAc,CAIpB;IAEF,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,gBAAgB;IAaf,MAAM;CAkEhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,aAAa,CAAC;KAClC;CACF"}
|