@scaleflex/uploader 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE +50 -0
  3. package/README.md +123 -0
  4. package/dist/auth/auth.service.d.ts +25 -0
  5. package/dist/auth/auth.service.d.ts.map +1 -0
  6. package/dist/auth/auth.types.d.ts +24 -0
  7. package/dist/auth/auth.types.d.ts.map +1 -0
  8. package/dist/auth/index.d.ts +3 -0
  9. package/dist/auth/index.d.ts.map +1 -0
  10. package/dist/components/actions-bar.d.ts +17 -0
  11. package/dist/components/actions-bar.d.ts.map +1 -0
  12. package/dist/components/camera-dialog.d.ts +27 -0
  13. package/dist/components/camera-dialog.d.ts.map +1 -0
  14. package/dist/components/drop-zone.d.ts +28 -0
  15. package/dist/components/drop-zone.d.ts.map +1 -0
  16. package/dist/components/file-item.d.ts +12 -0
  17. package/dist/components/file-item.d.ts.map +1 -0
  18. package/dist/components/file-list.d.ts +8 -0
  19. package/dist/components/file-list.d.ts.map +1 -0
  20. package/dist/components/import-divider.d.ts +6 -0
  21. package/dist/components/import-divider.d.ts.map +1 -0
  22. package/dist/components/index.d.ts +9 -0
  23. package/dist/components/index.d.ts.map +1 -0
  24. package/dist/components/provider-browser.d.ts +48 -0
  25. package/dist/components/provider-browser.d.ts.map +1 -0
  26. package/dist/components/screen-cast-dialog.d.ts +29 -0
  27. package/dist/components/screen-cast-dialog.d.ts.map +1 -0
  28. package/dist/components/search-provider-browser.d.ts +36 -0
  29. package/dist/components/search-provider-browser.d.ts.map +1 -0
  30. package/dist/components/source-pills.d.ts +11 -0
  31. package/dist/components/source-pills.d.ts.map +1 -0
  32. package/dist/components/success-card.d.ts +10 -0
  33. package/dist/components/success-card.d.ts.map +1 -0
  34. package/dist/components/url-dialog.d.ts +25 -0
  35. package/dist/components/url-dialog.d.ts.map +1 -0
  36. package/dist/connectors/companion-client.d.ts +58 -0
  37. package/dist/connectors/companion-client.d.ts.map +1 -0
  38. package/dist/connectors/connector.types.d.ts +56 -0
  39. package/dist/connectors/connector.types.d.ts.map +1 -0
  40. package/dist/connectors/index.d.ts +5 -0
  41. package/dist/connectors/index.d.ts.map +1 -0
  42. package/dist/connectors/provider-registry.d.ts +8 -0
  43. package/dist/connectors/provider-registry.d.ts.map +1 -0
  44. package/dist/connectors/token-store.d.ts +10 -0
  45. package/dist/connectors/token-store.d.ts.map +1 -0
  46. package/dist/controllers/store.controller.d.ts +14 -0
  47. package/dist/controllers/store.controller.d.ts.map +1 -0
  48. package/dist/define.cjs +1 -0
  49. package/dist/define.d.ts +2 -0
  50. package/dist/define.d.ts.map +1 -0
  51. package/dist/define.js +15 -0
  52. package/dist/engine/companion-upload.d.ts +23 -0
  53. package/dist/engine/companion-upload.d.ts.map +1 -0
  54. package/dist/engine/index.d.ts +2 -0
  55. package/dist/engine/index.d.ts.map +1 -0
  56. package/dist/engine/upload-engine.d.ts +56 -0
  57. package/dist/engine/upload-engine.d.ts.map +1 -0
  58. package/dist/engine/xhr-upload.d.ts +25 -0
  59. package/dist/engine/xhr-upload.d.ts.map +1 -0
  60. package/dist/events/event-bus.d.ts +38 -0
  61. package/dist/events/event-bus.d.ts.map +1 -0
  62. package/dist/events/public-events.d.ts +23 -0
  63. package/dist/events/public-events.d.ts.map +1 -0
  64. package/dist/index.cjs +1 -0
  65. package/dist/index.d.ts +17 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +21 -0
  68. package/dist/provider-browser-C-S_MPrC.js +832 -0
  69. package/dist/provider-browser-CmCwv0ph.cjs +581 -0
  70. package/dist/react.cjs +1 -0
  71. package/dist/react.d.ts +33 -0
  72. package/dist/react.d.ts.map +1 -0
  73. package/dist/react.js +125 -0
  74. package/dist/search-provider-browser-DxmLznEB.cjs +390 -0
  75. package/dist/search-provider-browser-jCOer2Y9.js +537 -0
  76. package/dist/sfx-uploader-BVDK-9xi.cjs +2029 -0
  77. package/dist/sfx-uploader-C2lWIRnU.js +3789 -0
  78. package/dist/sfx-uploader.d.ts +131 -0
  79. package/dist/sfx-uploader.d.ts.map +1 -0
  80. package/dist/store/helpers.d.ts +16 -0
  81. package/dist/store/helpers.d.ts.map +1 -0
  82. package/dist/store/index.d.ts +7 -0
  83. package/dist/store/index.d.ts.map +1 -0
  84. package/dist/store/store.d.ts +14 -0
  85. package/dist/store/store.d.ts.map +1 -0
  86. package/dist/store/store.types.d.ts +77 -0
  87. package/dist/store/store.types.d.ts.map +1 -0
  88. package/dist/test-utils.d.ts +5 -0
  89. package/dist/test-utils.d.ts.map +1 -0
  90. package/dist/types/source.types.d.ts +12 -0
  91. package/dist/types/source.types.d.ts.map +1 -0
  92. package/dist/utils/file-utils.d.ts +14 -0
  93. package/dist/utils/file-utils.d.ts.map +1 -0
  94. package/dist/utils/validate.d.ts +6 -0
  95. package/dist/utils/validate.d.ts.map +1 -0
  96. package/package.json +72 -0
package/dist/react.js ADDED
@@ -0,0 +1,125 @@
1
+ import { forwardRef as ee, useRef as c, useLayoutEffect as T, useImperativeHandle as te, useEffect as A, createElement as re } from "react";
2
+ typeof customElements < "u" && import("./define.js");
3
+ const ce = ee(
4
+ function({
5
+ config: w,
6
+ open: j,
7
+ onFileAdded: H,
8
+ onFileRemoved: I,
9
+ onFileRejected: U,
10
+ onUploadStarted: b,
11
+ onUploadProgress: k,
12
+ onUploadComplete: q,
13
+ onUploadError: z,
14
+ onUploadRetry: B,
15
+ onAllComplete: D,
16
+ onTotalProgress: G,
17
+ onOpen: J,
18
+ onClose: K,
19
+ onCancel: M,
20
+ className: P,
21
+ style: C
22
+ }, R) {
23
+ const d = c(null), o = c(H), u = c(I), i = c(U), f = c(b), v = c(k), p = c(q), E = c(z), x = c(B), m = c(D), L = c(G), h = c(J), g = c(K), y = c(M);
24
+ return T(() => {
25
+ o.current = H, u.current = I, i.current = U, f.current = b, v.current = k, p.current = q, E.current = z, x.current = B, m.current = D, L.current = G, h.current = J, g.current = K, y.current = M;
26
+ }), te(R, () => ({
27
+ get element() {
28
+ return d.current;
29
+ },
30
+ open() {
31
+ var e;
32
+ (e = d.current) == null || e.open();
33
+ },
34
+ close() {
35
+ var e;
36
+ (e = d.current) == null || e.close();
37
+ },
38
+ upload() {
39
+ var e;
40
+ (e = d.current) == null || e.upload();
41
+ },
42
+ addFiles(e) {
43
+ var l;
44
+ (l = d.current) == null || l.addFiles(e);
45
+ },
46
+ resumeUpload(e) {
47
+ var l;
48
+ (l = d.current) == null || l.resumeUpload(e);
49
+ },
50
+ cancelUpload() {
51
+ var e;
52
+ (e = d.current) == null || e.cancelUpload();
53
+ }
54
+ })), T(() => {
55
+ const e = d.current;
56
+ e && (e.config = w);
57
+ }, [w]), A(() => {
58
+ const e = d.current;
59
+ e && (j === !0 ? e.open() : j === !1 && e.close());
60
+ }, [j]), A(() => {
61
+ const e = d.current;
62
+ if (!e) return;
63
+ const l = (t) => {
64
+ var r;
65
+ const { file: n } = t.detail;
66
+ (r = o.current) == null || r.call(o, n);
67
+ }, N = (t) => {
68
+ var r;
69
+ const { file: n } = t.detail;
70
+ (r = u.current) == null || r.call(u, n);
71
+ }, Q = (t) => {
72
+ var s;
73
+ const { file: n, reason: r } = t.detail;
74
+ (s = i.current) == null || s.call(i, n, r);
75
+ }, V = (t) => {
76
+ var r;
77
+ const { files: n } = t.detail;
78
+ (r = f.current) == null || r.call(f, n);
79
+ }, W = (t) => {
80
+ var a;
81
+ const { file: n, progress: r, speed: s } = t.detail;
82
+ (a = v.current) == null || a.call(v, n, r, s);
83
+ }, X = (t) => {
84
+ var s;
85
+ const { file: n, response: r } = t.detail;
86
+ (s = p.current) == null || s.call(p, n, r);
87
+ }, Y = (t) => {
88
+ var s;
89
+ const { file: n, error: r } = t.detail;
90
+ (s = E.current) == null || s.call(E, n, r);
91
+ }, Z = (t) => {
92
+ var s;
93
+ const { successful: n, failed: r } = t.detail;
94
+ (s = m.current) == null || s.call(m, n, r);
95
+ }, _ = (t) => {
96
+ var s;
97
+ const { file: n, attempt: r } = t.detail;
98
+ (s = x.current) == null || s.call(x, n, r);
99
+ }, $ = (t) => {
100
+ var a;
101
+ const { percentage: n, speed: r, eta: s } = t.detail;
102
+ (a = L.current) == null || a.call(L, n, r, s);
103
+ }, F = () => {
104
+ var t;
105
+ (t = h.current) == null || t.call(h);
106
+ }, O = () => {
107
+ var t;
108
+ (t = g.current) == null || t.call(g);
109
+ }, S = () => {
110
+ var t;
111
+ (t = y.current) == null || t.call(y);
112
+ };
113
+ return e.addEventListener("sfx-file-added", l), e.addEventListener("sfx-file-removed", N), e.addEventListener("sfx-file-rejected", Q), e.addEventListener("sfx-upload-started", V), e.addEventListener("sfx-upload-progress", W), e.addEventListener("sfx-upload-complete", X), e.addEventListener("sfx-upload-error", Y), e.addEventListener("sfx-upload-retry", _), e.addEventListener("sfx-all-complete", Z), e.addEventListener("sfx-total-progress", $), e.addEventListener("sfx-open", F), e.addEventListener("sfx-close", O), e.addEventListener("sfx-cancel", S), () => {
114
+ e.removeEventListener("sfx-file-added", l), e.removeEventListener("sfx-file-removed", N), e.removeEventListener("sfx-file-rejected", Q), e.removeEventListener("sfx-upload-started", V), e.removeEventListener("sfx-upload-progress", W), e.removeEventListener("sfx-upload-complete", X), e.removeEventListener("sfx-upload-error", Y), e.removeEventListener("sfx-upload-retry", _), e.removeEventListener("sfx-all-complete", Z), e.removeEventListener("sfx-total-progress", $), e.removeEventListener("sfx-open", F), e.removeEventListener("sfx-close", O), e.removeEventListener("sfx-cancel", S);
115
+ };
116
+ }, []), re("sfx-uploader", {
117
+ ref: d,
118
+ className: P,
119
+ style: C
120
+ });
121
+ }
122
+ );
123
+ export {
124
+ ce as Uploader
125
+ };
@@ -0,0 +1,390 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("lit"),n=require("lit/decorators.js"),l=require("./sfx-uploader-BVDK-9xi.cjs");var u=Object.defineProperty,a=(c,t,e,s)=>{for(var i=void 0,d=c.length-1,h;d>=0;d--)(h=c[d])&&(i=h(t,e,i)||i);return i&&u(t,e,i),i};const p=class p extends r.LitElement{constructor(){super(...arguments),this.provider="unsplash",this.companionUrl="",this._loading=!1,this._loadingMore=!1,this._items=[],this._selectedIds=new Set,this._error=null,this._searchQuery="",this._nextPageQuery=null,this._searched=!1,this._onResultsScroll=t=>{if(!this._nextPageQuery||this._loadingMore)return;const e=t.target;e.scrollHeight-e.scrollTop-e.clientHeight<200&&this._onLoadMore()},this._onSearchInput=t=>{this._searchQuery=t.target.value},this._onSearchKeydown=t=>{t.key==="Enter"&&this._doSearch()},this._onAddSelected=()=>{const e=this._items.filter(s=>this._selectedIds.has(s.id)).map(s=>({companionUrl:this.companionUrl,provider:this.provider,token:"",requestPath:s.requestPath,fileId:s.id,name:s.name||s.id,mimeType:s.mimeType,size:s.size,thumbnail:s.thumbnail}));this.dispatchEvent(new CustomEvent("connector-files-selected",{detail:{files:e},bubbles:!0,composed:!0}))},this._onClose=()=>{this.dispatchEvent(new CustomEvent("connector-close",{bubbles:!0,composed:!0}))}}get _providerLabel(){var e;return((e=l.getProviderSources([this.provider])[0])==null?void 0:e.label)??this.provider}async _doSearch(){const t=this._searchQuery.trim();if(t){this._loading=!0,this._error=null,this._items=[],this._selectedIds=new Set,this._nextPageQuery=null,this._searched=!0;try{const e=await l.searchProvider(this.companionUrl,this.provider,t),s=new Set;this._items=e.items.filter(i=>s.has(i.id)?!1:(s.add(i.id),!0)),this._nextPageQuery=e.nextPageQuery}catch(e){this._error=e instanceof Error?e.message:"Search failed"}finally{this._loading=!1}}}async _onLoadMore(){if(!(!this._nextPageQuery||this._loadingMore)){this._loadingMore=!0;try{const t=await l.searchProvider(this.companionUrl,this.provider,this._searchQuery.trim(),this._nextPageQuery),e=new Set(this._items.map(i=>i.id)),s=t.items.filter(i=>!e.has(i.id));this._items=[...this._items,...s],this._nextPageQuery=t.nextPageQuery}catch{}finally{this._loadingMore=!1}}}_toggleSelect(t){const e=new Set(this._selectedIds);e.has(t.id)?e.delete(t.id):e.add(t.id),this._selectedIds=e}render(){return r.html`
2
+ ${this._renderHeader()}
3
+ ${this._renderSearchBar()}
4
+ ${this._loading?this._renderLoading():this._error?this._renderError():this._renderResults()}
5
+ `}_renderHeader(){return r.html`
6
+ <div class="browser-header">
7
+ <button class="back-btn" @click=${this._onClose}>
8
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
9
+ <polyline points="15 18 9 12 15 6" />
10
+ </svg>
11
+ </button>
12
+ <span class="browser-title">${this._providerLabel}</span>
13
+ </div>
14
+ `}_renderSearchBar(){return r.html`
15
+ <div class="search-bar">
16
+ <input
17
+ class="search-input"
18
+ type="text"
19
+ placeholder="Search for images..."
20
+ .value=${this._searchQuery}
21
+ @input=${this._onSearchInput}
22
+ @keydown=${this._onSearchKeydown}
23
+ />
24
+ <button
25
+ class="search-btn"
26
+ ?disabled=${!this._searchQuery.trim()||this._loading}
27
+ @click=${()=>this._doSearch()}
28
+ >
29
+ Search
30
+ </button>
31
+ </div>
32
+ `}_renderLoading(){return r.html`
33
+ <div class="loading">
34
+ <div class="spinner"></div>
35
+ </div>
36
+ `}_renderError(){return r.html`
37
+ <div class="error-view">
38
+ <div class="error-text">${this._error}</div>
39
+ <button class="retry-btn" @click=${()=>this._doSearch()}>Retry</button>
40
+ </div>
41
+ `}_renderResults(){const t=this._selectedIds.size;return this._searched?this._items.length===0?r.html`
42
+ <div class="empty-state">
43
+ <div class="empty-text">No results found</div>
44
+ </div>
45
+ `:r.html`
46
+ <div class="results" @scroll=${this._onResultsScroll}>
47
+ <div class="results-grid">
48
+ ${this._items.map(e=>{var s;return r.html`
49
+ <div
50
+ class="result-item ${this._selectedIds.has(e.id)?"selected":""}"
51
+ @click=${()=>this._toggleSelect(e)}
52
+ >
53
+ ${e.thumbnail?r.html`<img src=${e.thumbnail} alt=${e.name} loading="lazy" referrerpolicy="no-referrer" />`:r.nothing}
54
+ <div class="check">
55
+ ${this._selectedIds.has(e.id)?r.html`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><polyline points="20 6 9 17 4 12" /></svg>`:r.nothing}
56
+ </div>
57
+ ${(s=e.author)!=null&&s.name?r.html`<div class="author">${e.author.name}</div>`:r.nothing}
58
+ </div>
59
+ `})}
60
+ </div>
61
+ ${this._loadingMore?r.html`<div class="loading" style="padding:16px 0"><div class="spinner"></div></div>`:r.nothing}
62
+ </div>
63
+
64
+ ${this._items.length>0?r.html`
65
+ <div class="browser-footer">
66
+ <span class="selected-count">
67
+ ${t>0?`${t} image${t===1?"":"s"} selected`:"Select images to add"}
68
+ </span>
69
+ <button
70
+ class="add-btn"
71
+ ?disabled=${t===0}
72
+ @click=${this._onAddSelected}
73
+ >
74
+ Add ${t>0?t:""} image${t===1?"":"s"}
75
+ </button>
76
+ </div>
77
+ `:r.nothing}
78
+ `:r.html`
79
+ <div class="empty-state">
80
+ <div class="empty-text">Enter text to search for images</div>
81
+ </div>
82
+ `}};p.styles=r.css`
83
+ :host {
84
+ display: flex;
85
+ flex-direction: column;
86
+ height: 100%;
87
+ min-height: 300px;
88
+ font-family: var(--sfx-up-font, 'Inter', system-ui, -apple-system, sans-serif);
89
+ color: var(--sfx-up-text, #1e293b);
90
+ }
91
+
92
+ .browser-header {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: 10px;
96
+ padding: 14px 20px;
97
+ border-bottom: 1px solid var(--sfx-up-border-light, #f1f5f9);
98
+ flex-shrink: 0;
99
+ }
100
+
101
+ .back-btn {
102
+ width: 32px;
103
+ height: 32px;
104
+ border: none;
105
+ background: none;
106
+ border-radius: 8px;
107
+ cursor: pointer;
108
+ display: flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+ color: var(--sfx-up-text-muted, #94a3b8);
112
+ transition: all 0.15s;
113
+ flex-shrink: 0;
114
+ }
115
+
116
+ .back-btn:hover {
117
+ background: #f1f5f9;
118
+ color: var(--sfx-up-text, #1e293b);
119
+ }
120
+
121
+ .back-btn svg {
122
+ width: 18px;
123
+ height: 18px;
124
+ }
125
+
126
+ .browser-title {
127
+ font-size: 14px;
128
+ font-weight: 600;
129
+ flex: 1;
130
+ }
131
+
132
+ /* --- Search bar --- */
133
+ .search-bar {
134
+ display: flex;
135
+ align-items: center;
136
+ gap: 8px;
137
+ padding: 12px 20px;
138
+ border-bottom: 1px solid var(--sfx-up-border-light, #f1f5f9);
139
+ flex-shrink: 0;
140
+ }
141
+
142
+ .search-input {
143
+ flex: 1;
144
+ height: 36px;
145
+ padding: 0 12px;
146
+ border: 1.5px solid var(--sfx-up-border, #e8edf5);
147
+ border-radius: 9px;
148
+ font-family: inherit;
149
+ font-size: 13px;
150
+ color: var(--sfx-up-text, #1e293b);
151
+ background: #fff;
152
+ outline: none;
153
+ transition: border-color 0.15s;
154
+ }
155
+
156
+ .search-input:focus {
157
+ border-color: var(--sfx-up-primary, #2563eb);
158
+ }
159
+
160
+ .search-input::placeholder {
161
+ color: var(--sfx-up-text-muted, #94a3b8);
162
+ }
163
+
164
+ .search-btn {
165
+ height: 36px;
166
+ padding: 0 16px;
167
+ border: none;
168
+ border-radius: 9px;
169
+ background: linear-gradient(135deg, var(--sfx-up-primary, #2563eb), var(--sfx-up-primary-mid, #3b82f6));
170
+ color: #fff;
171
+ font-family: inherit;
172
+ font-size: 13px;
173
+ font-weight: 600;
174
+ cursor: pointer;
175
+ transition: all 0.18s;
176
+ flex-shrink: 0;
177
+ }
178
+
179
+ .search-btn:hover:not(:disabled) {
180
+ transform: translateY(-1px);
181
+ }
182
+
183
+ .search-btn:disabled {
184
+ opacity: 0.5;
185
+ cursor: not-allowed;
186
+ }
187
+
188
+ /* --- Results grid --- */
189
+ .results {
190
+ flex: 1;
191
+ overflow-y: auto;
192
+ padding: 8px 12px;
193
+ min-height: 0;
194
+ }
195
+
196
+ .results-grid {
197
+ display: grid;
198
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
199
+ gap: 8px;
200
+ }
201
+
202
+ .result-item {
203
+ position: relative;
204
+ aspect-ratio: 1;
205
+ border-radius: 10px;
206
+ overflow: hidden;
207
+ cursor: pointer;
208
+ border: 2px solid transparent;
209
+ transition: border-color 0.15s;
210
+ }
211
+
212
+ .result-item.selected {
213
+ border-color: var(--sfx-up-primary, #2563eb);
214
+ }
215
+
216
+ .result-item img {
217
+ width: 100%;
218
+ height: 100%;
219
+ object-fit: cover;
220
+ display: block;
221
+ }
222
+
223
+ .result-item .check {
224
+ position: absolute;
225
+ top: 6px;
226
+ left: 6px;
227
+ width: 22px;
228
+ height: 22px;
229
+ border-radius: 6px;
230
+ background: rgba(255, 255, 255, 0.85);
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: center;
234
+ opacity: 0;
235
+ transition: opacity 0.15s;
236
+ }
237
+
238
+ .result-item:hover .check,
239
+ .result-item.selected .check {
240
+ opacity: 1;
241
+ }
242
+
243
+ .result-item.selected .check {
244
+ background: var(--sfx-up-primary, #2563eb);
245
+ color: #fff;
246
+ }
247
+
248
+ .check svg {
249
+ width: 14px;
250
+ height: 14px;
251
+ }
252
+
253
+ .result-item .author {
254
+ position: absolute;
255
+ bottom: 0;
256
+ left: 0;
257
+ right: 0;
258
+ padding: 4px 8px;
259
+ background: linear-gradient(transparent, rgba(0,0,0,0.5));
260
+ font-size: 10px;
261
+ color: #fff;
262
+ white-space: nowrap;
263
+ overflow: hidden;
264
+ text-overflow: ellipsis;
265
+ opacity: 0;
266
+ transition: opacity 0.15s;
267
+ }
268
+
269
+ .result-item:hover .author {
270
+ opacity: 1;
271
+ }
272
+
273
+ /* --- Footer --- */
274
+ .browser-footer {
275
+ display: flex;
276
+ align-items: center;
277
+ justify-content: space-between;
278
+ padding: 12px 20px;
279
+ border-top: 1px solid var(--sfx-up-border-light, #f1f5f9);
280
+ flex-shrink: 0;
281
+ }
282
+
283
+ .selected-count {
284
+ font-size: 13px;
285
+ color: var(--sfx-up-text-secondary, #475569);
286
+ font-weight: 500;
287
+ }
288
+
289
+ .add-btn {
290
+ height: 36px;
291
+ padding: 0 20px;
292
+ border: none;
293
+ border-radius: 9px;
294
+ background: linear-gradient(135deg, var(--sfx-up-primary, #2563eb), var(--sfx-up-primary-mid, #3b82f6));
295
+ color: #fff;
296
+ font-family: inherit;
297
+ font-size: 13px;
298
+ font-weight: 600;
299
+ cursor: pointer;
300
+ transition: all 0.18s;
301
+ box-shadow: 0 2px 10px rgba(37, 99, 235, 0.28);
302
+ }
303
+
304
+ .add-btn:hover:not(:disabled) {
305
+ transform: translateY(-1px);
306
+ box-shadow: 0 4px 16px rgba(37, 99, 235, 0.38);
307
+ }
308
+
309
+ .add-btn:disabled {
310
+ opacity: 0.5;
311
+ cursor: not-allowed;
312
+ }
313
+
314
+ /* --- States --- */
315
+ .loading, .error-view, .empty-state {
316
+ flex: 1;
317
+ display: flex;
318
+ flex-direction: column;
319
+ align-items: center;
320
+ justify-content: center;
321
+ gap: 12px;
322
+ padding: 40px 24px;
323
+ text-align: center;
324
+ }
325
+
326
+ .spinner {
327
+ width: 28px;
328
+ height: 28px;
329
+ border: 3px solid var(--sfx-up-border, #e8edf5);
330
+ border-top-color: var(--sfx-up-primary, #2563eb);
331
+ border-radius: 50%;
332
+ animation: spin 0.7s linear infinite;
333
+ }
334
+
335
+ .error-text {
336
+ font-size: 14px;
337
+ color: var(--sfx-up-error, #dc2626);
338
+ }
339
+
340
+ .retry-btn {
341
+ height: 34px;
342
+ padding: 0 16px;
343
+ border: 1.5px solid var(--sfx-up-border, #e8edf5);
344
+ background: none;
345
+ border-radius: 8px;
346
+ font-family: inherit;
347
+ font-size: 13px;
348
+ font-weight: 600;
349
+ cursor: pointer;
350
+ color: var(--sfx-up-text-secondary, #475569);
351
+ transition: all 0.15s;
352
+ }
353
+
354
+ .retry-btn:hover {
355
+ background: #f8faff;
356
+ border-color: #d1dff0;
357
+ }
358
+
359
+ .empty-text {
360
+ font-size: 14px;
361
+ color: var(--sfx-up-text-muted, #94a3b8);
362
+ }
363
+
364
+ .load-more-btn {
365
+ display: block;
366
+ margin: 12px auto;
367
+ padding: 8px 20px;
368
+ border: 1.5px solid var(--sfx-up-border, #e8edf5);
369
+ background: none;
370
+ border-radius: 8px;
371
+ font-family: inherit;
372
+ font-size: 13px;
373
+ font-weight: 500;
374
+ cursor: pointer;
375
+ color: var(--sfx-up-primary, #2563eb);
376
+ transition: all 0.15s;
377
+ }
378
+
379
+ .load-more-btn:hover {
380
+ background: var(--sfx-up-primary-bg, #eff6ff);
381
+ }
382
+
383
+ @keyframes spin {
384
+ to { transform: rotate(360deg); }
385
+ }
386
+
387
+ @media (prefers-reduced-motion: reduce) {
388
+ .spinner { animation: none; }
389
+ }
390
+ `;let o=p;a([n.property({type:String})],o.prototype,"provider");a([n.property({type:String})],o.prototype,"companionUrl");a([n.state()],o.prototype,"_loading");a([n.state()],o.prototype,"_loadingMore");a([n.state()],o.prototype,"_items");a([n.state()],o.prototype,"_selectedIds");a([n.state()],o.prototype,"_error");a([n.state()],o.prototype,"_searchQuery");a([n.state()],o.prototype,"_nextPageQuery");a([n.state()],o.prototype,"_searched");exports.SfxSearchProviderBrowser=o;