@emailmaker/filemanager 0.10.101 → 0.10.102

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/file-manager.css CHANGED
@@ -1,145 +1,3 @@
1
- @charset "UTF-8";
2
- .em-filemanager .root {
3
- padding: 16px 20px 24px;
4
- max-width: 520px;
5
- }
6
-
7
- .em-filemanager .controls {
8
- display: flex;
9
- flex-direction: column;
10
- gap: 20px;
11
- }
12
-
13
- .em-filemanager .segmentedControl {
14
- background-color: var(--ant-color-fill-secondary, rgba(0, 0, 0, 0.06));
15
- padding: 4px;
16
- }
17
-
18
- .em-filemanager .sizeRow {
19
- display: grid;
20
- grid-template-columns: 1fr 1fr;
21
- gap: 16px 24px;
22
- align-items: center;
23
- width: 100%;
24
- }
25
-
26
- .em-filemanager .sizeRowLabel {
27
- margin: 0;
28
- }
29
-
30
- /** InputNumber с prefix / suffix — ширина блока значения */
31
- .em-filemanager .sizeInputNumber {
32
- width: 100%;
33
- }
34
-
35
- .em-filemanager .sizeSuffix {
36
- color: var(--ant-color-text-tertiary, rgba(0, 0, 0, 0.45));
37
- font-size: 13px;
38
- line-height: 1;
39
- -webkit-user-select: none;
40
- user-select: none;
41
- }
42
-
43
- .em-filemanager .colorGrid {
44
- display: grid;
45
- grid-template-columns: 1fr 1fr;
46
- gap: 16px 24px;
47
- }
48
-
49
- .em-filemanager .colorCell {
50
- display: flex;
51
- flex-direction: column;
52
- align-items: stretch;
53
- gap: 8px;
54
- min-width: 0;
55
- }
56
-
57
- .em-filemanager .colorCellLabel {
58
- margin: 0 !important;
59
- white-space: nowrap;
60
- }
61
-
62
- .em-filemanager .colorPickerFull {
63
- width: 100%;
64
- justify-content: flex-start;
65
- }
66
-
67
- .em-filemanager .bgExtras {
68
- grid-column: 1/-1;
69
- margin-top: -8px;
70
- display: flex;
71
- flex-direction: column;
72
- gap: 12px;
73
- }
74
-
75
- .em-filemanager .bgWarning {
76
- margin: 0;
77
- }
78
-
79
- .em-filemanager .previewSection {
80
- display: flex;
81
- flex-direction: column;
82
- gap: 12px;
83
- }
84
-
85
- .em-filemanager .previewTitle {
86
- font-size: 14px;
87
- font-weight: 600;
88
- }
89
-
90
- .em-filemanager .previewWrap {
91
- display: flex;
92
- justify-content: center;
93
- align-items: center;
94
- min-height: 220px;
95
- padding: 16px;
96
- border: 1px solid var(--ant-color-border-secondary, #f0f0f0);
97
- border-radius: 8px;
98
- background-color: var(--ant-color-fill-quaternary, #fafafa);
99
- background-image: linear-gradient(45deg, #e8e8e8 25%, transparent 25%), linear-gradient(-45deg, #e8e8e8 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #e8e8e8 75%), linear-gradient(-45deg, transparent 75%, #e8e8e8 75%);
100
- background-size: 16px 16px;
101
- background-position: 0 0, 0 8px, 8px -8px, -8px 0;
102
- position: relative;
103
- overflow: hidden;
104
- }
105
-
106
- .em-filemanager .scanLine {
107
- position: absolute;
108
- top: 50%;
109
- left: 20%;
110
- right: 20%;
111
- height: 2px;
112
- background-color: #ff4d4f;
113
- box-shadow: 0 0 6px #ff4d4f;
114
- z-index: 10;
115
- pointer-events: none;
116
- }
117
-
118
- .em-filemanager .scanLineBarcode {
119
- left: 10%;
120
- right: 10%;
121
- }
122
-
123
- .em-filemanager .previewWrapBarcode {
124
- min-height: 104px;
125
- padding: 12px 16px;
126
- }
127
-
128
- .em-filemanager .previewCanvas {
129
- display: block;
130
- max-width: 100%;
131
- height: auto;
132
- background: transparent;
133
- }
134
-
135
- .em-filemanager .previewCanvasBarcode {
136
- max-height: 120px;
137
- width: auto;
138
- }
139
-
140
- .em-filemanager .actions {
141
- margin-top: 8px;
142
- }
143
1
  .em-filemanager .iconsTab {
144
2
  display: flex;
145
3
  flex-direction: column;
@@ -576,6 +434,148 @@
576
434
  background: rgba(255, 255, 255, 0.6);
577
435
  pointer-events: all;
578
436
  }
437
+ @charset "UTF-8";
438
+ .em-filemanager .root {
439
+ padding: 16px 20px 24px;
440
+ max-width: 520px;
441
+ }
442
+
443
+ .em-filemanager .controls {
444
+ display: flex;
445
+ flex-direction: column;
446
+ gap: 20px;
447
+ }
448
+
449
+ .em-filemanager .segmentedControl {
450
+ background-color: var(--ant-color-fill-secondary, rgba(0, 0, 0, 0.06));
451
+ padding: 4px;
452
+ }
453
+
454
+ .em-filemanager .sizeRow {
455
+ display: grid;
456
+ grid-template-columns: 1fr 1fr;
457
+ gap: 16px 24px;
458
+ align-items: center;
459
+ width: 100%;
460
+ }
461
+
462
+ .em-filemanager .sizeRowLabel {
463
+ margin: 0;
464
+ }
465
+
466
+ /** InputNumber с prefix / suffix — ширина блока значения */
467
+ .em-filemanager .sizeInputNumber {
468
+ width: 100%;
469
+ }
470
+
471
+ .em-filemanager .sizeSuffix {
472
+ color: var(--ant-color-text-tertiary, rgba(0, 0, 0, 0.45));
473
+ font-size: 13px;
474
+ line-height: 1;
475
+ -webkit-user-select: none;
476
+ user-select: none;
477
+ }
478
+
479
+ .em-filemanager .colorGrid {
480
+ display: grid;
481
+ grid-template-columns: 1fr 1fr;
482
+ gap: 16px 24px;
483
+ }
484
+
485
+ .em-filemanager .colorCell {
486
+ display: flex;
487
+ flex-direction: column;
488
+ align-items: stretch;
489
+ gap: 8px;
490
+ min-width: 0;
491
+ }
492
+
493
+ .em-filemanager .colorCellLabel {
494
+ margin: 0 !important;
495
+ white-space: nowrap;
496
+ }
497
+
498
+ .em-filemanager .colorPickerFull {
499
+ width: 100%;
500
+ justify-content: flex-start;
501
+ }
502
+
503
+ .em-filemanager .bgExtras {
504
+ grid-column: 1/-1;
505
+ margin-top: -8px;
506
+ display: flex;
507
+ flex-direction: column;
508
+ gap: 12px;
509
+ }
510
+
511
+ .em-filemanager .bgWarning {
512
+ margin: 0;
513
+ }
514
+
515
+ .em-filemanager .previewSection {
516
+ display: flex;
517
+ flex-direction: column;
518
+ gap: 12px;
519
+ }
520
+
521
+ .em-filemanager .previewTitle {
522
+ font-size: 14px;
523
+ font-weight: 600;
524
+ }
525
+
526
+ .em-filemanager .previewWrap {
527
+ display: flex;
528
+ justify-content: center;
529
+ align-items: center;
530
+ min-height: 220px;
531
+ padding: 16px;
532
+ border: 1px solid var(--ant-color-border-secondary, #f0f0f0);
533
+ border-radius: 8px;
534
+ background-color: var(--ant-color-fill-quaternary, #fafafa);
535
+ background-image: linear-gradient(45deg, #e8e8e8 25%, transparent 25%), linear-gradient(-45deg, #e8e8e8 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #e8e8e8 75%), linear-gradient(-45deg, transparent 75%, #e8e8e8 75%);
536
+ background-size: 16px 16px;
537
+ background-position: 0 0, 0 8px, 8px -8px, -8px 0;
538
+ position: relative;
539
+ overflow: hidden;
540
+ }
541
+
542
+ .em-filemanager .scanLine {
543
+ position: absolute;
544
+ top: 50%;
545
+ left: 20%;
546
+ right: 20%;
547
+ height: 2px;
548
+ background-color: #ff4d4f;
549
+ box-shadow: 0 0 6px #ff4d4f;
550
+ z-index: 10;
551
+ pointer-events: none;
552
+ }
553
+
554
+ .em-filemanager .scanLineBarcode {
555
+ left: 10%;
556
+ right: 10%;
557
+ }
558
+
559
+ .em-filemanager .previewWrapBarcode {
560
+ min-height: 104px;
561
+ padding: 12px 16px;
562
+ }
563
+
564
+ .em-filemanager .previewCanvas {
565
+ display: block;
566
+ max-width: 100%;
567
+ height: auto;
568
+ background: transparent;
569
+ }
570
+
571
+ .em-filemanager .previewCanvasBarcode {
572
+ max-height: 120px;
573
+ width: auto;
574
+ }
575
+
576
+ .em-filemanager .actions {
577
+ margin-top: 8px;
578
+ }
579
579
  .em-filemanager .noFilesContainer {
580
580
  text-align: center;
581
581
  }
@@ -1593,6 +1593,26 @@
1593
1593
  padding: 2px 0;
1594
1594
  min-width: 0; /* Позволяет flex-элементам сжиматься */
1595
1595
  }
1596
+
1597
+ /** Tab locked by the host (e.g. by subscription plan): still shown, but badged with a lock. */
1598
+ .em-filemanager .lockedTabIcon {
1599
+ position: relative;
1600
+ display: inline-flex;
1601
+ opacity: 0.55;
1602
+ }
1603
+
1604
+ .em-filemanager .lockedTabLock {
1605
+ position: absolute;
1606
+ right: -4px;
1607
+ bottom: -2px;
1608
+ opacity: 1;
1609
+ border-radius: 100%;
1610
+ background-color: var(--colorBgContainer);
1611
+ }
1612
+
1613
+ .em-filemanager .lockedTabLabel {
1614
+ opacity: 0.55;
1615
+ }
1596
1616
  @charset "UTF-8";
1597
1617
  .em-filemanager .uploadProgress {
1598
1618
  position: fixed;
@@ -1,2 +1,2 @@
1
- export{a1 as DEFAULT_FILE_MANAGER_CACHE_TTL_MS,a3 as DataSourceProxyBase,L as FailedRequestCache,A as FileContent,G as FileManagerApiError,z as FileManagerApp,t as FileManagerAppWithContext,B as FileModals,C as FolderSidebar,M as MutationRegistry,a4 as PathAwareStorageAdapter,P as PixieOnlyApp,X as TRASH_FOLDER_ID,$ as TreeCache,a0 as ViewCacheManager,I as buildAssetsPath,O as compareFileSystemItems,Y as createSystemFolderByPathResolver,y as default,Q as defaultChildrenViewFilterMatch,R as defaultFileSystemItemComparator,S as defaultHasSortValue,a2 as defaultIsFolderNotFoundError,a5 as fetchRemoteImageBlobByUrl,K as getAssetsBase,Z as getTrashFolderLookupCandidates,T as hasComparableSortValue,q as init,x as initFileManager,v as initPixieEditor,D as installResizeObserverErrorHandler,J as joinUrls,H as mapHttpStatusToErrorCode,U as matchesChildrenViewFilter,_ as normalizeSystemFolderPath,V as resolveSortParams,W as resolveViewStrategyOptions,E as uninstallResizeObserverErrorHandler,s as unmount,w as unmountPixieEditor}from"./file-manager-index-C_WmI5Gt.js";import"react/jsx-runtime";import"react";import"react-dom/client";import"antd";import"@ant-design/icons";import"@ant-design/cssinjs";import"react-dom";import"@untitledui/icons";import"browser-image-compression";import"pixie";
1
+ export{a1 as DEFAULT_FILE_MANAGER_CACHE_TTL_MS,a3 as DataSourceProxyBase,L as FailedRequestCache,A as FileContent,G as FileManagerApiError,z as FileManagerApp,t as FileManagerAppWithContext,B as FileModals,C as FolderSidebar,M as MutationRegistry,a4 as PathAwareStorageAdapter,P as PixieOnlyApp,X as TRASH_FOLDER_ID,$ as TreeCache,a0 as ViewCacheManager,I as buildAssetsPath,O as compareFileSystemItems,Y as createSystemFolderByPathResolver,y as default,Q as defaultChildrenViewFilterMatch,R as defaultFileSystemItemComparator,S as defaultHasSortValue,a2 as defaultIsFolderNotFoundError,a5 as fetchRemoteImageBlobByUrl,K as getAssetsBase,Z as getTrashFolderLookupCandidates,T as hasComparableSortValue,q as init,x as initFileManager,v as initPixieEditor,D as installResizeObserverErrorHandler,J as joinUrls,H as mapHttpStatusToErrorCode,U as matchesChildrenViewFilter,_ as normalizeSystemFolderPath,V as resolveSortParams,W as resolveViewStrategyOptions,E as uninstallResizeObserverErrorHandler,s as unmount,w as unmountPixieEditor}from"./file-manager-index-CVN64GK6.js";import"react/jsx-runtime";import"react";import"react-dom/client";import"antd";import"@ant-design/icons";import"@ant-design/cssinjs";import"react-dom";import"@untitledui/icons";import"browser-image-compression";import"pixie";
2
2
  //# sourceMappingURL=file-manager.esm.js.map
package/file-manager.js CHANGED
@@ -44543,6 +44543,8 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__7928__;
44543
44543
  /* harmony import */ var antd__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(550);
44544
44544
  /* harmony import */ var antd__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(antd__WEBPACK_IMPORTED_MODULE_2__);
44545
44545
  /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(133);
44546
+ /* harmony import */ var _utils_libraryTabLock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8546);
44547
+
44546
44548
 
44547
44549
 
44548
44550
 
@@ -44598,16 +44600,18 @@ const FileManagerProvider = ({ children, options }) => {
44598
44600
  const [currentMenuFile, setCurrentMenuFile] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)('');
44599
44601
  const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);
44600
44602
  const [activeLibraryItem, setActiveLibraryItem] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(_constants__WEBPACK_IMPORTED_MODULE_3__/* .MY_FILES */ .Zz);
44603
+ /** A locked tab must never become active — otherwise the host's lock would be bypassed. */
44604
+ const isLibraryItemOpenable = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((item) => isLibraryItemEnabled(item) && !(0,_utils_libraryTabLock__WEBPACK_IMPORTED_MODULE_4__/* .isLibraryTabLocked */ .v)(item, config), [config, isLibraryItemEnabled]);
44601
44605
  (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
44602
44606
  if ((config === null || config === void 0 ? void 0 : config.activeLibraryItem) && setActiveLibraryItem) {
44603
- setActiveLibraryItem(isLibraryItemEnabled(config.activeLibraryItem) ? config.activeLibraryItem : _constants__WEBPACK_IMPORTED_MODULE_3__/* .MY_FILES */ .Zz);
44607
+ setActiveLibraryItem(isLibraryItemOpenable(config.activeLibraryItem) ? config.activeLibraryItem : _constants__WEBPACK_IMPORTED_MODULE_3__/* .MY_FILES */ .Zz);
44604
44608
  }
44605
- }, [config === null || config === void 0 ? void 0 : config.activeLibraryItem, isLibraryItemEnabled, setActiveLibraryItem]);
44609
+ }, [config === null || config === void 0 ? void 0 : config.activeLibraryItem, isLibraryItemOpenable, setActiveLibraryItem]);
44606
44610
  (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
44607
- if (!isLibraryItemEnabled(activeLibraryItem)) {
44611
+ if (!isLibraryItemOpenable(activeLibraryItem)) {
44608
44612
  setActiveLibraryItem(_constants__WEBPACK_IMPORTED_MODULE_3__/* .MY_FILES */ .Zz);
44609
44613
  }
44610
- }, [activeLibraryItem, isLibraryItemEnabled]);
44614
+ }, [activeLibraryItem, isLibraryItemOpenable]);
44611
44615
  const [pagination, setPagination] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({
44612
44616
  current: 1,
44613
44617
  pageSize: 20,
@@ -44735,6 +44739,21 @@ const FileManagerProvider = ({ children, options }) => {
44735
44739
  };
44736
44740
 
44737
44741
 
44742
+ /***/ }),
44743
+
44744
+ /***/ 8546:
44745
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
44746
+
44747
+ "use strict";
44748
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
44749
+ /* harmony export */ v: () => (/* binding */ isLibraryTabLocked)
44750
+ /* harmony export */ });
44751
+ function isLibraryTabLocked(tab, config) {
44752
+ var _a;
44753
+ return Boolean((_a = config === null || config === void 0 ? void 0 : config.lockedTabs) === null || _a === void 0 ? void 0 : _a.includes(tab));
44754
+ }
44755
+
44756
+
44738
44757
  /***/ }),
44739
44758
 
44740
44759
  /***/ 8573:
@@ -48459,7 +48478,7 @@ var ___CSS_LOADER_API_SOURCEMAP_IMPORT___ = __webpack_require__(1354);
48459
48478
  var ___CSS_LOADER_API_IMPORT___ = __webpack_require__(6314);
48460
48479
  var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);
48461
48480
  // Module
48462
- ___CSS_LOADER_EXPORT___.push([module.id, `.FolderSidebar-module__button__Yf2rX.ant-btn.ant-btn-icon-only{padding:calc(var(--paddingXXS)*1px) calc(var(--paddingSM)*1px);cursor:pointer;color:var(--colorTextSecondary);display:flex;gap:calc(var(--marginXS)*1px);align-items:center;justify-content:center;border-radius:calc(var(--borderRadiusSM)*1px);transition:all var(--motionDurationFast);box-shadow:none;border:none;width:32px;height:32px}.FolderSidebar-module__button__Yf2rX.ant-btn.ant-btn-icon-only:hover{background-color:var(--colorBgLayout);color:inherit}.FolderSidebar-module__button__Yf2rX:hover{background-color:var(--colorBgContainer);color:var(--colorPrimary)}.FolderSidebar-module__foldersTitle__Uh6u7{display:flex;align-items:center;flex:1;cursor:pointer}.FolderSidebar-module__folderActions__qA2Bk{position:absolute;top:4px;right:4px;display:flex;align-items:center;gap:4px;z-index:10}.FolderSidebar-module__folderActions__qA2Bk .FolderSidebar-module__button__Yf2rX.FolderSidebar-module__ant-btn__LXAXm.FolderSidebar-module__ant-btn-icon-only__j_wVF{padding:calc(var(--paddingXXS)*1px) calc(var(--paddingSM)*1px);cursor:pointer;color:var(--colorTextSecondary);display:flex;gap:calc(var(--marginXS)*1px);align-items:center;justify-content:center;border-radius:calc(var(--borderRadiusSM)*1px);transition:all var(--motionDurationFast);box-shadow:none;border:none;width:32px;height:32px}.FolderSidebar-module__folderActions__qA2Bk .FolderSidebar-module__button__Yf2rX.FolderSidebar-module__ant-btn__LXAXm.FolderSidebar-module__ant-btn-icon-only__j_wVF:hover{background-color:var(--colorBgLayout);color:inherit}.FolderSidebar-module__customExpandIcon__IhZJl{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:8px;cursor:pointer;color:#666;font-size:10px;transition:transform .2s ease}.FolderSidebar-module__customExpandIcon__IhZJl:hover{color:var(--colorPrimary)}.FolderSidebar-module__fileCount__bD9DD{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:100%;padding:0 6px;margin-left:8px;color:#8d8d8d;font-size:14px;font-weight:500;transition:all .2s ease;white-space:nowrap;cursor:default;flex-shrink:0;margin-right:10px}.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:rgba(0,0,0,0) !important}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode-selected .folder-label span,.FolderSidebar-module__folderMenu__JCzLF .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected .folderLabelItem,.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode-selected .folderLabelItem,.FolderSidebar-module__folderMenu__JCzLF .ant-tree-node-selected .folderLabelItem{font-weight:600 !important}.FolderSidebar-module__uploadButton__QQUid{width:100%;justify-content:flex-start}.FolderSidebar-module__uploadButton__QQUid button:hover{background-color:var(--colorPrimaryHover) !important}.FolderSidebar-module__folderMenu__JCzLF{padding-left:0;padding-right:0}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode{display:flex;align-items:center;justify-content:space-between;padding:4px 0;border-radius:4px;transition:background-color .2s ease;width:100%;margin-bottom:0}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-node-content-wrapper{flex:1;align-items:center;padding:0;transition:background-color .2s ease}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-node-content-wrapper:hover{background-color:rgba(0,0,0,0)}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-switcher{height:24px;width:24px;margin-top:5px;display:flex !important;align-items:center;justify-content:center;transition:color .2s ease;flex-shrink:0}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-switcher-noop{width:24px}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-switcher-line-icon{color:#d9d9d9}.FolderSidebar-module__folderMenu__JCzLF .FolderSidebar-module__folderItemContainer__byl5b{width:100%;display:flex;align-items:center;justify-content:space-between;padding:2px 0;min-width:0}.FolderSidebar-module__folderMenu__JCzLF .folder-label{display:flex;align-items:center;flex:1;color:#595959;font-size:14px;min-width:0;overflow:hidden}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode[data-key="folders"]{border-bottom:1px solid var(--colorBorderSecondary);margin-bottom:8px;padding-bottom:8px}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode[data-key="folders"].ant-tree-treenode-selected{background-color:rgba(0,0,0,0) !important}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode[data-key="folders"] .ant-tree-node-content-wrapper{padding:0}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode[data-key="folders"] .ant-tree-node-content-wrapper:hover{background-color:rgba(0,0,0,0) !important}.FolderSidebar-module__folderMenu__JCzLF .ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.FolderSidebar-module__folderMenu__JCzLF .FolderSidebar-module__emptyFolderContainer__WK6tx{padding:20px;text-align:center}.FolderSidebar-module__folderMenu__JCzLF .ant-tree > .ant-tree-treenode{padding-left:0 !important}.FolderSidebar-module__folderIcon__UoZzH{margin-right:8px;font-size:18px;flex-shrink:0}.FolderSidebar-module__folderLabelItem__uJ062{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0;user-select:none}.FolderSidebar-module__foldersTitleItem__gapOI{display:flex;align-items:center;flex:1;cursor:pointer;min-width:0;overflow:hidden}.FolderSidebar-module__folderLabel__fHWMp{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden}.FolderSidebar-module__foldersContainer__zdBVU{position:relative;width:100%}.FolderSidebar-module__uploadButton__QQUid .FolderSidebar-module__ant-btn__LXAXm,.FolderSidebar-module__uploadButton__QQUid .ant-btn{display:flex;align-items:center;justify-content:center;gap:3px}.FolderSidebar-module__buttonWrapper__a9Qi5{margin-bottom:24px;display:flex;gap:4px}.FolderSidebar-module__buttonWrapper__a9Qi5>:first-child{flex:1;height:40px;padding-left:10px}.FolderSidebar-module__buttonWrapper__a9Qi5>:last-child{width:40px;height:40px;flex-shrink:0}.FolderSidebar-module__uploadByURLButton__epMiC.ant-btn.ant-btn-icon-only{width:40px;min-width:40px;height:40px;padding:0;flex-shrink:0}.FolderSidebar-module__uploadButtonIcon__mWQmq{font-size:20px}.FolderSidebar-module__uploadButtonTitle__wk_o6{line-height:1em}.FolderSidebar-module__emptyFolderContainer__WK6tx{user-select:none;cursor:default;color:var(--colorTextTertiary)}.FolderSidebar-module__folderItemContainer__byl5b{width:100%;display:flex;align-items:center;justify-content:space-between;padding:2px 0;min-width:0}`, "",{"version":3,"sources":["webpack://./src/components/FolderSidebar/FolderSidebar.module.scss"],"names":[],"mappings":"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","sourcesContent":[".button:global(.ant-btn.ant-btn-icon-only) {\r\n padding: calc(var(--paddingXXS) * 1px) calc(var(--paddingSM) * 1px);\r\n cursor: pointer;\r\n color: var(--colorTextSecondary);\r\n display: flex;\r\n gap: calc(var(--marginXS) * 1px);\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: calc(var(--borderRadiusSM) * 1px);\r\n transition: all var(--motionDurationFast);\r\n box-shadow: none;\r\n\r\n border: none;\r\n width: 32px;\r\n height: 32px;\r\n\r\n &:hover {\r\n background-color: var(--colorBgLayout);\r\n color: inherit;\r\n }\r\n}\r\n\r\n.button:hover {\r\n background-color: var(--colorBgContainer);\r\n color: var(--colorPrimary);\r\n}\r\n\r\n.foldersTitle {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.folderActions {\r\n position: absolute;\r\n top: 4px; /* Выравниваем по заголовку Folders */\r\n right: 4px;\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n z-index: 10;\r\n\r\n .button.ant-btn.ant-btn-icon-only {\r\n padding: calc(var(--paddingXXS) * 1px) calc(var(--paddingSM) * 1px);\r\n cursor: pointer;\r\n color: var(--colorTextSecondary);\r\n display: flex;\r\n gap: calc(var(--marginXS) * 1px);\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: calc(var(--borderRadiusSM) * 1px);\r\n transition: all var(--motionDurationFast);\r\n box-shadow: none;\r\n\r\n border: none;\r\n width: 32px;\r\n height: 32px;\r\n\r\n &:hover {\r\n background-color: var(--colorBgLayout);\r\n color: inherit;\r\n }\r\n }\r\n}\r\n\r\n.customExpandIcon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n margin-right: 8px;\r\n cursor: pointer;\r\n color: #666;\r\n font-size: 10px;\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.customExpandIcon:hover {\r\n color: var(--colorPrimary);\r\n}\r\n\r\n.fileCount {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 20px;\r\n height: 100%;\r\n padding: 0 6px;\r\n margin-left: 8px;\r\n color: #8D8D8D;\r\n font-size: 14px;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n white-space: nowrap;\r\n cursor: default;\r\n flex-shrink: 0; /* Запрещаем сжатие счетчика */\r\n margin-right: 10px;\r\n}\r\n\r\n// .fileCount:hover {\r\n// border-color: var(--colorPrimary);\r\n// color: var(--colorPrimary);\r\n// }\r\n\r\n:global(.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected) {\r\n background-color: transparent !important;\r\n}\r\n\r\n/* :global(.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected):hover {\r\n color: red !important;\r\n} */\r\n\r\n/* Стили для выделения текста в выбранной папке */\r\n.folderMenu :global(.ant-tree-treenode-selected .folder-label span),\r\n.folderMenu :global(.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected .folderLabelItem),\r\n.folderMenu :global(.ant-tree-treenode-selected .folderLabelItem),\r\n.folderMenu :global(.ant-tree-node-selected .folderLabelItem) {\r\n font-weight: 600 !important;\r\n}\r\n\r\n/* Стили для иконки в выбранной папке */\r\n/* .folderMenu :global(.ant-tree-treenode-selected .folderIcon),\r\n.folderMenu :global(.ant-tree-node-selected .folderIcon) {\r\n color: red !important;\r\n} */\r\n\r\n/* CSS переменные для упрощения расчетов */\r\n\r\n.uploadButton {\r\n width: 100%;\r\n justify-content: flex-start;\r\n\r\n & button:hover {\r\n background-color: var(--colorPrimaryHover) !important;\r\n }\r\n}\r\n\r\n.folderMenu {\r\n padding-left: 0;\r\n padding-right: 0; /* Место для кнопки справа */\r\n}\r\n\r\n.folderMenu :global(.ant-tree-treenode) {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 4px 0;\r\n border-radius: 4px;\r\n transition: background-color 0.2s ease;\r\n width: 100%;\r\n margin-bottom: 0;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-node-content-wrapper) {\r\n flex: 1;\r\n /* display: flex; */\r\n align-items: center;\r\n padding: 0;\r\n /* border-radius: 4px; */\r\n transition: background-color 0.2s ease;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-node-content-wrapper:hover) {\r\n background-color: transparent;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-switcher) {\r\n height: 24px;\r\n width: 24px;\r\n margin-top: 5px;\r\n display: flex !important;\r\n align-items: center;\r\n justify-content: center;\r\n transition: color 0.2s ease;\r\n flex-shrink: 0; /* Запрещаем сжатие переключателя */\r\n}\r\n\r\n.folderMenu :global(.ant-tree-switcher-noop) {\r\n width: 24px;\r\n}\r\n\r\n/* Стили для линий дерева */\r\n.folderMenu :global(.ant-tree-switcher-line-icon) {\r\n color: #d9d9d9;\r\n}\r\n\r\n/* Улучшение отображения folder-item-container */\r\n.folderMenu .folderItemContainer {\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 2px 0;\r\n min-width: 0; /* Позволяет flex-элементам сжиматься */\r\n}\r\n\r\n.folderMenu :global(.folder-label) {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n color: #595959;\r\n font-size: 14px;\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n/* Стили для корневого элемента Folders */\r\n.folderMenu :global(.ant-tree-treenode[data-key='folders']) {\r\n border-bottom: 1px solid var(--colorBorderSecondary);\r\n margin-bottom: 8px;\r\n padding-bottom: 8px;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-treenode[data-key='folders'].ant-tree-treenode-selected) {\r\n background-color: transparent !important;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-treenode[data-key='folders'] .ant-tree-node-content-wrapper) {\r\n padding: 0;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-treenode[data-key='folders'] .ant-tree-node-content-wrapper:hover) {\r\n background-color: transparent !important;\r\n}\r\n\r\n/* Стили для ellipsis - удаляем max-width для гибкости */\r\n.folderMenu :global(.ellipsis) {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n/* Стили для пустого состояния */\r\n.folderMenu .emptyFolderContainer {\r\n padding: 20px;\r\n text-align: center;\r\n}\r\n\r\n/* Убираем отступы у корневого узла */\r\n.folderMenu :global(.ant-tree > .ant-tree-treenode) {\r\n padding-left: 0 !important;\r\n}\r\n.folderIcon {\r\n margin-right: 8px;\r\n font-size: 18px;\r\n flex-shrink: 0; /* Запрещаем сжатие иконки */\r\n}\r\n\r\n.folderLabelItem {\r\n font-size: 14px;\r\n white-space: nowrap; /* Запрещаем перенос строк */\r\n overflow: hidden; /* Скрываем переполнение */\r\n text-overflow: ellipsis; /* Показываем троеточие */\r\n flex: 1; /* Занимает доступное место */\r\n min-width: 0; /* Позволяет сжиматься */\r\n user-select: none;\r\n}\r\n\r\n.foldersTitleItem {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n cursor: pointer;\r\n min-width: 0; /* Позволяет сжиматься */\r\n overflow: hidden; /* Скрываем переполнение */\r\n}\r\n\r\n/* .foldersTitleItem .folderLabelItem {\r\n font-weight: 500;\r\n color: #262626;\r\n} */\r\n\r\n/* Класс для заголовка папок */\r\n.folderLabel {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.foldersContainer {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n/* Дополнительные стили для улучшения визуала */\r\n/* .folderMenu :global(.ant-tree-treenode:hover .folder-label span) {\r\n color: #1890ff;\r\n} */\r\n\r\n/* Стили для дивайдера между папками */\r\n\r\n\r\n.uploadButton .ant-btn,\r\n.uploadButton :global(.ant-btn) {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 3px;\r\n}\r\n/* .folderMenu :global(.ant-tree-treenode-selected) .folderLabelItem {\r\n color: #1890ff !important;\r\n} */\r\n\r\n// .folderMenu :global(.ant-tree-treenode-selected) .folderLabel .folderLabelItem,\r\n// .folderMenu :global(.ant-tree-treenode-selected) .folderLabel .folderIcon,\r\n// .folderMenu :global(.ant-tree-treenode-selected) .folderLabelItem {\r\n// color: var(--colorLink);\r\n// }\r\n\r\n\r\n.buttonWrapper {\r\n // overflow: hidden;\r\n margin-bottom: 24px;\r\n display: flex;\r\n gap: 4px;\r\n // border-radius: calc(var(--borderRadius) * 1px);\r\n \r\n // Левая кнопка занимает всю доступную ширину\r\n > :first-child {\r\n flex: 1;\r\n height: 40px;\r\n padding-left: 10px;\r\n }\r\n \r\n // Правая кнопка строго 40px\r\n > :last-child {\r\n width: 40px;\r\n height: 40px;\r\n flex-shrink: 0;\r\n }\r\n}\r\n\r\n/* Кнопка «Загрузить по URL» — icon-only, поэтому хост-приложение может задать ей\r\n свои размеры глобальным правилом `.ant-btn.ant-btn-icon-only` (в emailmaker это\r\n --formControlHeight: 34) и она становится ниже кнопки «Загрузить файл».\r\n Три класса в селекторе перебивают такие правила без !important. */\r\n.uploadByURLButton:global(.ant-btn.ant-btn-icon-only) {\r\n width: 40px;\r\n min-width: 40px;\r\n height: 40px;\r\n padding: 0;\r\n flex-shrink: 0;\r\n}\r\n\r\n.uploadButtonIcon {\r\n font-size: 20px;\r\n}\r\n\r\n.uploadButtonTitle {\r\n line-height: 1em;\r\n}\r\n\r\n.emptyFolderContainer {\r\n user-select: none;\r\n cursor: default;\r\n color: var(--colorTextTertiary);\r\n}\r\n\r\n.folderItemContainer {\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 2px 0;\r\n min-width: 0; /* Позволяет flex-элементам сжиматься */\r\n}\r\n"],"sourceRoot":""}]);
48481
+ ___CSS_LOADER_EXPORT___.push([module.id, `.FolderSidebar-module__button__Yf2rX.ant-btn.ant-btn-icon-only{padding:calc(var(--paddingXXS)*1px) calc(var(--paddingSM)*1px);cursor:pointer;color:var(--colorTextSecondary);display:flex;gap:calc(var(--marginXS)*1px);align-items:center;justify-content:center;border-radius:calc(var(--borderRadiusSM)*1px);transition:all var(--motionDurationFast);box-shadow:none;border:none;width:32px;height:32px}.FolderSidebar-module__button__Yf2rX.ant-btn.ant-btn-icon-only:hover{background-color:var(--colorBgLayout);color:inherit}.FolderSidebar-module__button__Yf2rX:hover{background-color:var(--colorBgContainer);color:var(--colorPrimary)}.FolderSidebar-module__foldersTitle__Uh6u7{display:flex;align-items:center;flex:1;cursor:pointer}.FolderSidebar-module__folderActions__qA2Bk{position:absolute;top:4px;right:4px;display:flex;align-items:center;gap:4px;z-index:10}.FolderSidebar-module__folderActions__qA2Bk .FolderSidebar-module__button__Yf2rX.FolderSidebar-module__ant-btn__LXAXm.FolderSidebar-module__ant-btn-icon-only__j_wVF{padding:calc(var(--paddingXXS)*1px) calc(var(--paddingSM)*1px);cursor:pointer;color:var(--colorTextSecondary);display:flex;gap:calc(var(--marginXS)*1px);align-items:center;justify-content:center;border-radius:calc(var(--borderRadiusSM)*1px);transition:all var(--motionDurationFast);box-shadow:none;border:none;width:32px;height:32px}.FolderSidebar-module__folderActions__qA2Bk .FolderSidebar-module__button__Yf2rX.FolderSidebar-module__ant-btn__LXAXm.FolderSidebar-module__ant-btn-icon-only__j_wVF:hover{background-color:var(--colorBgLayout);color:inherit}.FolderSidebar-module__customExpandIcon__IhZJl{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:8px;cursor:pointer;color:#666;font-size:10px;transition:transform .2s ease}.FolderSidebar-module__customExpandIcon__IhZJl:hover{color:var(--colorPrimary)}.FolderSidebar-module__fileCount__bD9DD{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:100%;padding:0 6px;margin-left:8px;color:#8d8d8d;font-size:14px;font-weight:500;transition:all .2s ease;white-space:nowrap;cursor:default;flex-shrink:0;margin-right:10px}.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:rgba(0,0,0,0) !important}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode-selected .folder-label span,.FolderSidebar-module__folderMenu__JCzLF .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected .folderLabelItem,.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode-selected .folderLabelItem,.FolderSidebar-module__folderMenu__JCzLF .ant-tree-node-selected .folderLabelItem{font-weight:600 !important}.FolderSidebar-module__uploadButton__QQUid{width:100%;justify-content:flex-start}.FolderSidebar-module__uploadButton__QQUid button:hover{background-color:var(--colorPrimaryHover) !important}.FolderSidebar-module__folderMenu__JCzLF{padding-left:0;padding-right:0}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode{display:flex;align-items:center;justify-content:space-between;padding:4px 0;border-radius:4px;transition:background-color .2s ease;width:100%;margin-bottom:0}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-node-content-wrapper{flex:1;align-items:center;padding:0;transition:background-color .2s ease}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-node-content-wrapper:hover{background-color:rgba(0,0,0,0)}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-switcher{height:24px;width:24px;margin-top:5px;display:flex !important;align-items:center;justify-content:center;transition:color .2s ease;flex-shrink:0}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-switcher-noop{width:24px}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-switcher-line-icon{color:#d9d9d9}.FolderSidebar-module__folderMenu__JCzLF .FolderSidebar-module__folderItemContainer__byl5b{width:100%;display:flex;align-items:center;justify-content:space-between;padding:2px 0;min-width:0}.FolderSidebar-module__folderMenu__JCzLF .folder-label{display:flex;align-items:center;flex:1;color:#595959;font-size:14px;min-width:0;overflow:hidden}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode[data-key="folders"]{border-bottom:1px solid var(--colorBorderSecondary);margin-bottom:8px;padding-bottom:8px}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode[data-key="folders"].ant-tree-treenode-selected{background-color:rgba(0,0,0,0) !important}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode[data-key="folders"] .ant-tree-node-content-wrapper{padding:0}.FolderSidebar-module__folderMenu__JCzLF .ant-tree-treenode[data-key="folders"] .ant-tree-node-content-wrapper:hover{background-color:rgba(0,0,0,0) !important}.FolderSidebar-module__folderMenu__JCzLF .ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.FolderSidebar-module__folderMenu__JCzLF .FolderSidebar-module__emptyFolderContainer__WK6tx{padding:20px;text-align:center}.FolderSidebar-module__folderMenu__JCzLF .ant-tree > .ant-tree-treenode{padding-left:0 !important}.FolderSidebar-module__folderIcon__UoZzH{margin-right:8px;font-size:18px;flex-shrink:0}.FolderSidebar-module__folderLabelItem__uJ062{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0;user-select:none}.FolderSidebar-module__foldersTitleItem__gapOI{display:flex;align-items:center;flex:1;cursor:pointer;min-width:0;overflow:hidden}.FolderSidebar-module__folderLabel__fHWMp{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden}.FolderSidebar-module__foldersContainer__zdBVU{position:relative;width:100%}.FolderSidebar-module__uploadButton__QQUid .FolderSidebar-module__ant-btn__LXAXm,.FolderSidebar-module__uploadButton__QQUid .ant-btn{display:flex;align-items:center;justify-content:center;gap:3px}.FolderSidebar-module__buttonWrapper__a9Qi5{margin-bottom:24px;display:flex;gap:4px}.FolderSidebar-module__buttonWrapper__a9Qi5>:first-child{flex:1;height:40px;padding-left:10px}.FolderSidebar-module__buttonWrapper__a9Qi5>:last-child{width:40px;height:40px;flex-shrink:0}.FolderSidebar-module__uploadByURLButton__epMiC.ant-btn.ant-btn-icon-only{width:40px;min-width:40px;height:40px;padding:0;flex-shrink:0}.FolderSidebar-module__uploadButtonIcon__mWQmq{font-size:20px}.FolderSidebar-module__uploadButtonTitle__wk_o6{line-height:1em}.FolderSidebar-module__emptyFolderContainer__WK6tx{user-select:none;cursor:default;color:var(--colorTextTertiary)}.FolderSidebar-module__folderItemContainer__byl5b{width:100%;display:flex;align-items:center;justify-content:space-between;padding:2px 0;min-width:0}.FolderSidebar-module__lockedTabIcon__gYKRY{position:relative;display:inline-flex;opacity:.55}.FolderSidebar-module__lockedTabLock__rbkfX{position:absolute;right:-4px;bottom:-2px;opacity:1;border-radius:100%;background-color:var(--colorBgContainer)}.FolderSidebar-module__lockedTabLabel__gvifJ{opacity:.55}`, "",{"version":3,"sources":["webpack://./src/components/FolderSidebar/FolderSidebar.module.scss"],"names":[],"mappings":"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","sourcesContent":[".button:global(.ant-btn.ant-btn-icon-only) {\r\n padding: calc(var(--paddingXXS) * 1px) calc(var(--paddingSM) * 1px);\r\n cursor: pointer;\r\n color: var(--colorTextSecondary);\r\n display: flex;\r\n gap: calc(var(--marginXS) * 1px);\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: calc(var(--borderRadiusSM) * 1px);\r\n transition: all var(--motionDurationFast);\r\n box-shadow: none;\r\n\r\n border: none;\r\n width: 32px;\r\n height: 32px;\r\n\r\n &:hover {\r\n background-color: var(--colorBgLayout);\r\n color: inherit;\r\n }\r\n}\r\n\r\n.button:hover {\r\n background-color: var(--colorBgContainer);\r\n color: var(--colorPrimary);\r\n}\r\n\r\n.foldersTitle {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.folderActions {\r\n position: absolute;\r\n top: 4px; /* Выравниваем по заголовку Folders */\r\n right: 4px;\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n z-index: 10;\r\n\r\n .button.ant-btn.ant-btn-icon-only {\r\n padding: calc(var(--paddingXXS) * 1px) calc(var(--paddingSM) * 1px);\r\n cursor: pointer;\r\n color: var(--colorTextSecondary);\r\n display: flex;\r\n gap: calc(var(--marginXS) * 1px);\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: calc(var(--borderRadiusSM) * 1px);\r\n transition: all var(--motionDurationFast);\r\n box-shadow: none;\r\n\r\n border: none;\r\n width: 32px;\r\n height: 32px;\r\n\r\n &:hover {\r\n background-color: var(--colorBgLayout);\r\n color: inherit;\r\n }\r\n }\r\n}\r\n\r\n.customExpandIcon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n margin-right: 8px;\r\n cursor: pointer;\r\n color: #666;\r\n font-size: 10px;\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.customExpandIcon:hover {\r\n color: var(--colorPrimary);\r\n}\r\n\r\n.fileCount {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 20px;\r\n height: 100%;\r\n padding: 0 6px;\r\n margin-left: 8px;\r\n color: #8D8D8D;\r\n font-size: 14px;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n white-space: nowrap;\r\n cursor: default;\r\n flex-shrink: 0; /* Запрещаем сжатие счетчика */\r\n margin-right: 10px;\r\n}\r\n\r\n// .fileCount:hover {\r\n// border-color: var(--colorPrimary);\r\n// color: var(--colorPrimary);\r\n// }\r\n\r\n:global(.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected) {\r\n background-color: transparent !important;\r\n}\r\n\r\n/* :global(.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected):hover {\r\n color: red !important;\r\n} */\r\n\r\n/* Стили для выделения текста в выбранной папке */\r\n.folderMenu :global(.ant-tree-treenode-selected .folder-label span),\r\n.folderMenu :global(.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected .folderLabelItem),\r\n.folderMenu :global(.ant-tree-treenode-selected .folderLabelItem),\r\n.folderMenu :global(.ant-tree-node-selected .folderLabelItem) {\r\n font-weight: 600 !important;\r\n}\r\n\r\n/* Стили для иконки в выбранной папке */\r\n/* .folderMenu :global(.ant-tree-treenode-selected .folderIcon),\r\n.folderMenu :global(.ant-tree-node-selected .folderIcon) {\r\n color: red !important;\r\n} */\r\n\r\n/* CSS переменные для упрощения расчетов */\r\n\r\n.uploadButton {\r\n width: 100%;\r\n justify-content: flex-start;\r\n\r\n & button:hover {\r\n background-color: var(--colorPrimaryHover) !important;\r\n }\r\n}\r\n\r\n.folderMenu {\r\n padding-left: 0;\r\n padding-right: 0; /* Место для кнопки справа */\r\n}\r\n\r\n.folderMenu :global(.ant-tree-treenode) {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 4px 0;\r\n border-radius: 4px;\r\n transition: background-color 0.2s ease;\r\n width: 100%;\r\n margin-bottom: 0;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-node-content-wrapper) {\r\n flex: 1;\r\n /* display: flex; */\r\n align-items: center;\r\n padding: 0;\r\n /* border-radius: 4px; */\r\n transition: background-color 0.2s ease;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-node-content-wrapper:hover) {\r\n background-color: transparent;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-switcher) {\r\n height: 24px;\r\n width: 24px;\r\n margin-top: 5px;\r\n display: flex !important;\r\n align-items: center;\r\n justify-content: center;\r\n transition: color 0.2s ease;\r\n flex-shrink: 0; /* Запрещаем сжатие переключателя */\r\n}\r\n\r\n.folderMenu :global(.ant-tree-switcher-noop) {\r\n width: 24px;\r\n}\r\n\r\n/* Стили для линий дерева */\r\n.folderMenu :global(.ant-tree-switcher-line-icon) {\r\n color: #d9d9d9;\r\n}\r\n\r\n/* Улучшение отображения folder-item-container */\r\n.folderMenu .folderItemContainer {\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 2px 0;\r\n min-width: 0; /* Позволяет flex-элементам сжиматься */\r\n}\r\n\r\n.folderMenu :global(.folder-label) {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n color: #595959;\r\n font-size: 14px;\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n/* Стили для корневого элемента Folders */\r\n.folderMenu :global(.ant-tree-treenode[data-key='folders']) {\r\n border-bottom: 1px solid var(--colorBorderSecondary);\r\n margin-bottom: 8px;\r\n padding-bottom: 8px;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-treenode[data-key='folders'].ant-tree-treenode-selected) {\r\n background-color: transparent !important;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-treenode[data-key='folders'] .ant-tree-node-content-wrapper) {\r\n padding: 0;\r\n}\r\n\r\n.folderMenu :global(.ant-tree-treenode[data-key='folders'] .ant-tree-node-content-wrapper:hover) {\r\n background-color: transparent !important;\r\n}\r\n\r\n/* Стили для ellipsis - удаляем max-width для гибкости */\r\n.folderMenu :global(.ellipsis) {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n/* Стили для пустого состояния */\r\n.folderMenu .emptyFolderContainer {\r\n padding: 20px;\r\n text-align: center;\r\n}\r\n\r\n/* Убираем отступы у корневого узла */\r\n.folderMenu :global(.ant-tree > .ant-tree-treenode) {\r\n padding-left: 0 !important;\r\n}\r\n.folderIcon {\r\n margin-right: 8px;\r\n font-size: 18px;\r\n flex-shrink: 0; /* Запрещаем сжатие иконки */\r\n}\r\n\r\n.folderLabelItem {\r\n font-size: 14px;\r\n white-space: nowrap; /* Запрещаем перенос строк */\r\n overflow: hidden; /* Скрываем переполнение */\r\n text-overflow: ellipsis; /* Показываем троеточие */\r\n flex: 1; /* Занимает доступное место */\r\n min-width: 0; /* Позволяет сжиматься */\r\n user-select: none;\r\n}\r\n\r\n.foldersTitleItem {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n cursor: pointer;\r\n min-width: 0; /* Позволяет сжиматься */\r\n overflow: hidden; /* Скрываем переполнение */\r\n}\r\n\r\n/* .foldersTitleItem .folderLabelItem {\r\n font-weight: 500;\r\n color: #262626;\r\n} */\r\n\r\n/* Класс для заголовка папок */\r\n.folderLabel {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.foldersContainer {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n/* Дополнительные стили для улучшения визуала */\r\n/* .folderMenu :global(.ant-tree-treenode:hover .folder-label span) {\r\n color: #1890ff;\r\n} */\r\n\r\n/* Стили для дивайдера между папками */\r\n\r\n\r\n.uploadButton .ant-btn,\r\n.uploadButton :global(.ant-btn) {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 3px;\r\n}\r\n/* .folderMenu :global(.ant-tree-treenode-selected) .folderLabelItem {\r\n color: #1890ff !important;\r\n} */\r\n\r\n// .folderMenu :global(.ant-tree-treenode-selected) .folderLabel .folderLabelItem,\r\n// .folderMenu :global(.ant-tree-treenode-selected) .folderLabel .folderIcon,\r\n// .folderMenu :global(.ant-tree-treenode-selected) .folderLabelItem {\r\n// color: var(--colorLink);\r\n// }\r\n\r\n\r\n.buttonWrapper {\r\n // overflow: hidden;\r\n margin-bottom: 24px;\r\n display: flex;\r\n gap: 4px;\r\n // border-radius: calc(var(--borderRadius) * 1px);\r\n \r\n // Левая кнопка занимает всю доступную ширину\r\n > :first-child {\r\n flex: 1;\r\n height: 40px;\r\n padding-left: 10px;\r\n }\r\n \r\n // Правая кнопка строго 40px\r\n > :last-child {\r\n width: 40px;\r\n height: 40px;\r\n flex-shrink: 0;\r\n }\r\n}\r\n\r\n/* Кнопка «Загрузить по URL» — icon-only, поэтому хост-приложение может задать ей\r\n свои размеры глобальным правилом `.ant-btn.ant-btn-icon-only` (в emailmaker это\r\n --formControlHeight: 34) и она становится ниже кнопки «Загрузить файл».\r\n Три класса в селекторе перебивают такие правила без !important. */\r\n.uploadByURLButton:global(.ant-btn.ant-btn-icon-only) {\r\n width: 40px;\r\n min-width: 40px;\r\n height: 40px;\r\n padding: 0;\r\n flex-shrink: 0;\r\n}\r\n\r\n.uploadButtonIcon {\r\n font-size: 20px;\r\n}\r\n\r\n.uploadButtonTitle {\r\n line-height: 1em;\r\n}\r\n\r\n.emptyFolderContainer {\r\n user-select: none;\r\n cursor: default;\r\n color: var(--colorTextTertiary);\r\n}\r\n\r\n.folderItemContainer {\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 2px 0;\r\n min-width: 0; /* Позволяет flex-элементам сжиматься */\r\n}\r\n\r\n/** Tab locked by the host (e.g. by subscription plan): still shown, but badged with a lock. */\r\n.lockedTabIcon {\r\n position: relative;\r\n display: inline-flex;\r\n opacity: 0.55;\r\n}\r\n\r\n.lockedTabLock {\r\n position: absolute;\r\n right: -4px;\r\n bottom: -2px;\r\n opacity: 1;\r\n border-radius: 100%;\r\n background-color: var(--colorBgContainer);\r\n}\r\n\r\n.lockedTabLabel {\r\n opacity: 0.55;\r\n}\r\n"],"sourceRoot":""}]);
48463
48482
  // Exports
48464
48483
  ___CSS_LOADER_EXPORT___.locals = {
48465
48484
  "button": `FolderSidebar-module__button__Yf2rX`,
@@ -48484,7 +48503,10 @@ ___CSS_LOADER_EXPORT___.locals = {
48484
48503
  "uploadByURLButton": `FolderSidebar-module__uploadByURLButton__epMiC`,
48485
48504
  "uploadByUrlButton": `FolderSidebar-module__uploadByURLButton__epMiC`,
48486
48505
  "uploadButtonIcon": `FolderSidebar-module__uploadButtonIcon__mWQmq`,
48487
- "uploadButtonTitle": `FolderSidebar-module__uploadButtonTitle__wk_o6`
48506
+ "uploadButtonTitle": `FolderSidebar-module__uploadButtonTitle__wk_o6`,
48507
+ "lockedTabIcon": `FolderSidebar-module__lockedTabIcon__gYKRY`,
48508
+ "lockedTabLock": `FolderSidebar-module__lockedTabLock__rbkfX`,
48509
+ "lockedTabLabel": `FolderSidebar-module__lockedTabLabel__gvifJ`
48488
48510
  };
48489
48511
  module.exports = ___CSS_LOADER_EXPORT___;
48490
48512
 
@@ -51501,6 +51523,8 @@ const FileModals = ({ isModalVisible, handleModalOk, handleModalCancel, form, se
51501
51523
  }, closeIcon: (0,jsx_runtime.jsx)(icons_.CloseOutlined, { className: FileModals_module["default"].closeIcon }), centered: true, getContainer: getModalContainer, children: [(0,jsx_runtime.jsx)("div", { children: t('Are you sure you want to permanently delete all items from Trash?') }), isLoading && ((0,jsx_runtime.jsxs)("div", { className: FileModals_module["default"].clearTrashProgress, children: [(0,jsx_runtime.jsx)(external_root_antd_commonjs2_antd_commonjs_antd_amd_antd_.Progress, { percent: 99, status: "active", showInfo: false }), (0,jsx_runtime.jsx)("div", { className: FileModals_module["default"].progressText, children: t('Deleting items...') })] }))] })] }));
51502
51524
  };
51503
51525
 
51526
+ // EXTERNAL MODULE: ./src/utils/libraryTabLock.ts
51527
+ var libraryTabLock = __webpack_require__(8546);
51504
51528
  // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!./node_modules/sass-loader/dist/cjs.js!./src/components/FolderSidebar/FolderSidebar.module.scss
51505
51529
  var FolderSidebar_module = __webpack_require__(9287);
51506
51530
  var FolderSidebar_module_default = /*#__PURE__*/__webpack_require__.n(FolderSidebar_module);
@@ -51543,6 +51567,7 @@ var FolderSidebar_module_update = injectStylesIntoStyleTag_default()((FolderSide
51543
51567
 
51544
51568
 
51545
51569
 
51570
+
51546
51571
  const FolderSidebar = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.memo)((0,external_root_React_commonjs2_react_commonjs_react_amd_react_.forwardRef)(({ selectedFolder, generateMenuItems, onFolderSelect, folders,
51547
51572
  // fetchFolders,
51548
51573
  fetchChildFolders, handleAddFile, setIsUrlModalVisible, handleCreateFolder, activeLibraryItem, setActiveLibraryItem, }, ref) => {
@@ -51560,6 +51585,17 @@ fetchChildFolders, handleAddFile, setIsUrlModalVisible, handleCreateFolder, acti
51560
51585
  const isIconStockEnabled = ((_c = config === null || config === void 0 ? void 0 : config.features) === null || _c === void 0 ? void 0 : _c.enableIconStock) !== false && (!(config === null || config === void 0 ? void 0 : config.enabledTabs) || config.enabledTabs.includes('icons'));
51561
51586
  const isImageCodesEnabled = ((_d = config === null || config === void 0 ? void 0 : config.features) === null || _d === void 0 ? void 0 : _d.enableQrBarcodeTab) !== false &&
51562
51587
  (!(config === null || config === void 0 ? void 0 : config.enabledTabs) || config.enabledTabs.includes('codes'));
51588
+ /** Wraps a tab icon with a lock badge when the host marked that tab as locked. */
51589
+ const withLockBadge = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useCallback)((icon, tab) => {
51590
+ if (!(0,libraryTabLock/* isLibraryTabLocked */.v)(tab, config)) {
51591
+ return icon;
51592
+ }
51593
+ return ((0,jsx_runtime.jsxs)("span", { className: FolderSidebar_FolderSidebar_module.lockedTabIcon, children: [icon, (0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.Lock01, { size: 12, strokeWidth: 2.5, className: FolderSidebar_FolderSidebar_module.lockedTabLock })] }));
51594
+ }, [config]);
51595
+ /** Dims the tab label the same way as its icon, so a locked tab reads as one muted item. */
51596
+ const withLockedLabel = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useCallback)((label, tab) => (0,libraryTabLock/* isLibraryTabLocked */.v)(tab, config) ?
51597
+ (0,jsx_runtime.jsx)("span", { className: FolderSidebar_FolderSidebar_module.lockedTabLabel, children: label })
51598
+ : label, [config]);
51563
51599
  // кастомные иконки не используются в этом блоке
51564
51600
  const getAllFolderKeys = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useCallback)((menuItems) => {
51565
51601
  const keys = [];
@@ -51769,37 +51805,37 @@ fetchChildFolders, handleAddFile, setIsUrlModalVisible, handleCreateFolder, acti
51769
51805
  const libraryMenuItems = [
51770
51806
  {
51771
51807
  key: constants/* MY_FILES */.Zz,
51772
- label: t('My files'),
51773
- icon: (0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.Image03, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }),
51808
+ label: withLockedLabel(t('My files'), constants/* MY_FILES */.Zz),
51809
+ icon: withLockBadge((0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.Image03, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }), constants/* MY_FILES */.Zz),
51774
51810
  },
51775
51811
  {
51776
51812
  key: constants/* GIF */.xI,
51777
- label: t('GIF'),
51778
- icon: (0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.PlaySquare, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }),
51813
+ label: withLockedLabel(t('GIF'), constants/* GIF */.xI),
51814
+ icon: withLockBadge((0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.PlaySquare, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }), constants/* GIF */.xI),
51779
51815
  disabled: !isGifEnabled,
51780
51816
  },
51781
51817
  {
51782
51818
  key: constants/* STOCK_IMAGES */.SM,
51783
- label: t('Stock images'),
51784
- icon: (0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.Colors, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }),
51819
+ label: withLockedLabel(t('Stock images'), constants/* STOCK_IMAGES */.SM),
51820
+ icon: withLockBadge((0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.Colors, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }), constants/* STOCK_IMAGES */.SM),
51785
51821
  disabled: !isStockImagesEnabled,
51786
51822
  },
51787
51823
  {
51788
51824
  key: constants/* ICONS */.Ze,
51789
- label: t('Icons'),
51790
- icon: (0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.ThumbsUp, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }),
51825
+ label: withLockedLabel(t('Icons'), constants/* ICONS */.Ze),
51826
+ icon: withLockBadge((0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.ThumbsUp, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }), constants/* ICONS */.Ze),
51791
51827
  disabled: !isIconStockEnabled,
51792
51828
  },
51793
51829
  {
51794
51830
  key: constants/* IMAGE_CODES */.jY,
51795
- label: t('QR & Barcode'),
51796
- icon: (0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.QrCode02, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }),
51831
+ label: withLockedLabel(t('QR & Barcode'), constants/* IMAGE_CODES */.jY),
51832
+ icon: withLockBadge((0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.QrCode02, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }), constants/* IMAGE_CODES */.jY),
51797
51833
  disabled: !isImageCodesEnabled,
51798
51834
  },
51799
51835
  {
51800
51836
  key: constants.AI,
51801
- label: t('AI'),
51802
- icon: (0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.Stars02, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }),
51837
+ label: withLockedLabel(t('AI'), constants.AI),
51838
+ icon: withLockBadge((0,jsx_runtime.jsx)(icons_amd_untitledui_icons_.Stars02, { size: 20, strokeWidth: config === null || config === void 0 ? void 0 : config.iconStrokeWidth }), constants.AI),
51803
51839
  disabled: !(config === null || config === void 0 ? void 0 : config.sseQuery),
51804
51840
  },
51805
51841
  ].filter(item => !item.disabled);
@@ -51818,8 +51854,14 @@ fetchChildFolders, handleAddFile, setIsUrlModalVisible, handleCreateFolder, acti
51818
51854
  await (fetchChildFolders === null || fetchChildFolders === void 0 ? void 0 : fetchChildFolders(key === 'folders' ? null : key));
51819
51855
  }, [onFolderSelect, activeLibraryItem, setActiveLibraryItem, fetchChildFolders]);
51820
51856
  const handleOpenLibraryChange = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useCallback)(({ key }) => {
51857
+ var _a;
51858
+ // A locked tab stays closed: the host decides what to show instead (e.g. an upsell).
51859
+ if ((0,libraryTabLock/* isLibraryTabLocked */.v)(key, config)) {
51860
+ (_a = config === null || config === void 0 ? void 0 : config.onLockedTabClick) === null || _a === void 0 ? void 0 : _a.call(config, key);
51861
+ return;
51862
+ }
51821
51863
  setActiveLibraryItem(key);
51822
- }, [setActiveLibraryItem]);
51864
+ }, [config, setActiveLibraryItem]);
51823
51865
  const handleTreeExpand = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useCallback)(async (keys, info) => {
51824
51866
  var _a;
51825
51867
  setExpandedKeys(keys);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emailmaker/filemanager",
3
- "version": "0.10.101",
3
+ "version": "0.10.102",
4
4
  "main": "./file-manager.js",
5
5
  "module": "./file-manager.esm.js",
6
6
  "types": "./index.d.ts",
package/types.d.ts CHANGED
@@ -463,6 +463,14 @@ export interface Config {
463
463
  /** Включить удаление */
464
464
  enableDelete?: boolean;
465
465
  };
466
+ /**
467
+ * Library tabs shown with a lock badge instead of being usable — for hosts that gate features
468
+ * by subscription plan. Clicking a locked tab fires `onLockedTabClick` and does not open it.
469
+ * Absent or empty: nothing is locked (previous behaviour).
470
+ */
471
+ lockedTabs?: LibraryMenuKey[];
472
+ /** Called when the user clicks a tab listed in `lockedTabs`, e.g. to show an upsell dialog. */
473
+ onLockedTabClick?: (tab: LibraryMenuKey) => void;
466
474
  dataProcessingMode?: 'server' | 'client' | 'auto';
467
475
  enableClientSideProcessing?: boolean;
468
476
  disablePagination?: boolean;
@@ -0,0 +1,11 @@
1
+ import type { LibraryMenuKey } from '../types';
2
+ /** Subset of the file manager config that controls locked library tabs. */
3
+ export interface LibraryTabLockConfig {
4
+ /**
5
+ * Tabs the host wants shown with a lock badge instead of being usable, e.g. when the user's
6
+ * plan does not include stock images. Absent or empty list means nothing is locked, so hosts
7
+ * that never set it keep the previous behaviour.
8
+ */
9
+ lockedTabs?: LibraryMenuKey[];
10
+ }
11
+ export declare function isLibraryTabLocked(tab: LibraryMenuKey, config: LibraryTabLockConfig | undefined): boolean;
@@ -0,0 +1 @@
1
+ export {};