@salesforcedevs/docs-components 0.0.2 → 0.0.3-edit

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 (108) hide show
  1. package/lwc.config.json +27 -2
  2. package/package.json +19 -8
  3. package/src/modules/README.md +41 -0
  4. package/src/modules/doc/amfModelParser/amfModelParser.ts +674 -0
  5. package/src/modules/doc/amfReference/amfReference.css +25 -0
  6. package/src/modules/doc/amfReference/amfReference.html +60 -0
  7. package/src/modules/doc/amfReference/amfReference.ts +1494 -0
  8. package/src/modules/doc/amfReference/constants.ts +76 -0
  9. package/src/modules/doc/amfReference/types.ts +125 -0
  10. package/src/modules/doc/amfTopic/amfTopic.css +21 -0
  11. package/src/modules/doc/amfTopic/amfTopic.html +3 -0
  12. package/src/modules/doc/amfTopic/amfTopic.ts +111 -0
  13. package/src/modules/doc/amfTopic/types.ts +56 -0
  14. package/src/modules/doc/amfTopic/utils.ts +136 -0
  15. package/src/modules/doc/breadcrumbItem/breadcrumbItem.css +51 -0
  16. package/src/modules/doc/breadcrumbItem/breadcrumbItem.html +5 -0
  17. package/src/modules/doc/breadcrumbItem/breadcrumbItem.ts +71 -0
  18. package/src/modules/doc/breadcrumbs/breadcrumbs.css +27 -0
  19. package/src/modules/doc/breadcrumbs/breadcrumbs.html +58 -0
  20. package/src/modules/doc/breadcrumbs/breadcrumbs.ts +183 -0
  21. package/src/modules/doc/chat/README.md +179 -0
  22. package/src/modules/doc/chat/chat.css +818 -0
  23. package/src/modules/doc/chat/chat.html +241 -0
  24. package/src/modules/doc/chat/chat.ts +586 -0
  25. package/src/modules/doc/componentPlayground/componentPlayground.css +22 -0
  26. package/src/modules/doc/componentPlayground/componentPlayground.html +20 -0
  27. package/src/modules/doc/componentPlayground/componentPlayground.ts +29 -0
  28. package/src/modules/doc/content/content.css +388 -4
  29. package/src/modules/doc/content/content.html +3 -2
  30. package/src/modules/doc/content/content.ts +319 -45
  31. package/src/modules/doc/contentCallout/contentCallout.css +59 -0
  32. package/src/modules/doc/contentCallout/contentCallout.html +22 -0
  33. package/src/modules/doc/contentCallout/contentCallout.ts +65 -0
  34. package/src/modules/doc/contentLayout/contentLayout.css +1 -0
  35. package/src/modules/doc/contentLayout/contentLayout.html +72 -0
  36. package/src/modules/doc/contentLayout/contentLayout.ts +531 -0
  37. package/src/modules/doc/contentMedia/contentMedia.css +49 -0
  38. package/src/modules/doc/contentMedia/contentMedia.html +23 -0
  39. package/src/modules/doc/contentMedia/contentMedia.ts +34 -0
  40. package/src/modules/doc/doDont/doDont.css +47 -0
  41. package/src/modules/doc/doDont/doDont.html +27 -0
  42. package/src/modules/doc/doDont/doDont.ts +17 -0
  43. package/src/modules/doc/editFile/editFile.css +505 -0
  44. package/src/modules/doc/editFile/editFile.html +164 -0
  45. package/src/modules/doc/editFile/editFile.ts +213 -0
  46. package/src/modules/doc/header/header.css +132 -0
  47. package/src/modules/doc/header/header.html +55 -0
  48. package/src/modules/doc/header/header.ts +120 -0
  49. package/src/modules/doc/heading/heading.css +33 -0
  50. package/src/modules/doc/heading/heading.html +14 -0
  51. package/src/modules/doc/heading/heading.ts +67 -0
  52. package/src/modules/doc/headingAnchor/headingAnchor.css +33 -0
  53. package/src/modules/doc/headingAnchor/headingAnchor.html +19 -0
  54. package/src/modules/doc/headingAnchor/headingAnchor.ts +43 -0
  55. package/src/modules/doc/headingContent/headingContent.css +53 -0
  56. package/src/modules/doc/headingContent/headingContent.html +13 -0
  57. package/src/modules/doc/headingContent/headingContent.ts +30 -0
  58. package/src/modules/doc/lwcContentLayout/lwcContentLayout.css +1 -0
  59. package/src/modules/doc/lwcContentLayout/lwcContentLayout.html +68 -0
  60. package/src/modules/doc/lwcContentLayout/lwcContentLayout.ts +168 -0
  61. package/src/modules/doc/nav/nav.css +8 -2
  62. package/src/modules/doc/nav/nav.html +10 -7
  63. package/src/modules/doc/nav/nav.ts +33 -29
  64. package/src/modules/doc/overview/overview.css +40 -0
  65. package/src/modules/doc/overview/overview.html +34 -0
  66. package/src/modules/doc/overview/overview.ts +12 -0
  67. package/src/modules/doc/phase/phase.css +70 -0
  68. package/src/modules/doc/phase/phase.html +38 -0
  69. package/src/modules/doc/phase/phase.ts +93 -0
  70. package/src/modules/doc/specificationContent/specificationContent.css +36 -0
  71. package/src/modules/doc/specificationContent/specificationContent.html +171 -0
  72. package/src/modules/doc/specificationContent/specificationContent.ts +127 -0
  73. package/src/modules/doc/sprigSurvey/sprigSurvey.html +20 -0
  74. package/src/modules/doc/sprigSurvey/sprigSurvey.scoped.css +16 -0
  75. package/src/modules/doc/sprigSurvey/sprigSurvey.ts +16 -0
  76. package/src/modules/doc/toc/toc.css +14 -0
  77. package/src/modules/doc/toc/toc.html +99 -22
  78. package/src/modules/doc/toc/toc.ts +11 -6
  79. package/src/modules/doc/toolbar/toolbar.css +8 -0
  80. package/src/modules/doc/toolbar/toolbar.html +32 -15
  81. package/src/modules/doc/toolbar/toolbar.ts +69 -30
  82. package/src/modules/doc/versionPicker/versionPicker.css +64 -0
  83. package/src/modules/doc/versionPicker/versionPicker.html +38 -0
  84. package/src/modules/doc/versionPicker/versionPicker.ts +65 -0
  85. package/src/modules/doc/xmlContent/types.ts +120 -0
  86. package/src/modules/doc/xmlContent/utils.ts +163 -0
  87. package/src/modules/doc/xmlContent/xmlContent.css +54 -0
  88. package/src/modules/doc/xmlContent/xmlContent.html +52 -0
  89. package/src/modules/doc/xmlContent/xmlContent.ts +792 -0
  90. package/src/modules/docHelpers/amfStyle/amfStyle.css +355 -0
  91. package/src/modules/docHelpers/contentLayoutStyle/contentLayoutStyle.css +131 -0
  92. package/src/modules/docHelpers/imgStyle/imgStyle.css +59 -0
  93. package/src/modules/docHelpers/status/status.css +22 -0
  94. package/src/modules/docUtils/searchSyncer/searchSyncer.ts +86 -0
  95. package/src/modules/docUtils/utils/__mocks__/coveo.analytics.ts +16 -0
  96. package/src/modules/docUtils/utils/coveo.analytics.d.ts +10 -0
  97. package/src/modules/docUtils/utils/utils.ts +32 -0
  98. package/src/modules/doc/container/__benchmarks__/container.benchmarkrenamed.js +0 -18
  99. package/src/modules/doc/container/container.css +0 -8
  100. package/src/modules/doc/container/container.html +0 -11
  101. package/src/modules/doc/container/container.stories.ts +0 -15
  102. package/src/modules/doc/container/container.ts +0 -164
  103. package/src/modules/doc/content/prismjs.css +0 -184
  104. package/src/modules/doc/content/prismjs.html +0 -3
  105. package/src/modules/doc/content/prismjs.ts +0 -853
  106. package/src/modules/doc/prismcss/prismcss.css +0 -184
  107. package/src/modules/doc/search/search.html +0 -1
  108. package/src/modules/doc/search/search.ts +0 -6
@@ -0,0 +1,27 @@
1
+ <template>
2
+ <div class="container">
3
+ <div class="doc-do-dont-header">
4
+ <template lwc:if={isDo}>
5
+ <dx-icon
6
+ symbol="success"
7
+ size="large"
8
+ color="green-vibrant-50"
9
+ ></dx-icon>
10
+ <div class="doc-do-dont-label doc-do-color">Do</div>
11
+ </template>
12
+ <template lwc:else>
13
+ <dx-icon
14
+ symbol="clear"
15
+ size="large"
16
+ color="red-vibrant-30"
17
+ class="doc-do-dont-icon"
18
+ ></dx-icon>
19
+ <div class="doc-do-dont-label doc-dont-color">Don't</div>
20
+ </template>
21
+ </div>
22
+ <div class="do-dont-image-container">
23
+ <img class="doc-do-dont-img" src={imgSrc} alt={caption} />
24
+ </div>
25
+ <div class="dx-text-body-4">{caption}</div>
26
+ </div>
27
+ </template>
@@ -0,0 +1,17 @@
1
+ import { LightningElement, api } from "lwc";
2
+ import { normalizeBoolean } from "dxUtils/normalizers";
3
+
4
+ export default class DoDont extends LightningElement {
5
+ @api caption: string = "";
6
+ @api imgSrc!: string;
7
+ _isDo: boolean = false;
8
+
9
+ @api
10
+ get isDo(): boolean {
11
+ return this._isDo;
12
+ }
13
+
14
+ set isDo(value) {
15
+ this._isDo = normalizeBoolean(value);
16
+ }
17
+ }
@@ -0,0 +1,505 @@
1
+ /* Host container */
2
+ :host {
3
+ font-family: "Salesforce Sans", -apple-system, BlinkMacSystemFont,
4
+ "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",
5
+ sans-serif;
6
+ }
7
+
8
+ /* Edit File Trigger Button */
9
+ .edit-file-trigger {
10
+ background: linear-gradient(135deg, #0176d3 0%, #005fb2 100%);
11
+ color: white;
12
+ border: none;
13
+ border-radius: 12px;
14
+ padding: 12px 16px;
15
+ cursor: pointer;
16
+ display: flex;
17
+ align-items: center;
18
+ gap: 8px;
19
+ box-shadow: 0 4px 16px rgb(1 118 211 / 25%), 0 2px 8px rgb(1 118 211 / 15%);
20
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
21
+ font-size: 14px;
22
+ font-weight: 500;
23
+ letter-spacing: 0.02em;
24
+ }
25
+
26
+ .edit-file-trigger:hover:not(:disabled) {
27
+ background: linear-gradient(135deg, #005fb2 0%, #003e73 100%);
28
+ transform: translateY(-2px);
29
+ box-shadow: 0 6px 20px rgb(1 118 211 / 35%), 0 4px 12px rgb(1 118 211 / 25%);
30
+ }
31
+
32
+ .edit-file-trigger:active:not(:disabled) {
33
+ transform: translateY(0);
34
+ box-shadow: 0 2px 8px rgb(1 118 211 / 30%);
35
+ }
36
+
37
+ .edit-file-trigger:disabled {
38
+ background: #d8dde6;
39
+ color: #706e6b;
40
+ cursor: not-allowed;
41
+ transform: none;
42
+ box-shadow: 0 1px 3px rgb(0 0 0 / 12%);
43
+ }
44
+
45
+ .edit-file-icon {
46
+ width: 18px;
47
+ height: 18px;
48
+ flex-shrink: 0;
49
+ }
50
+
51
+ .edit-file-trigger-text {
52
+ font-weight: 500;
53
+ white-space: nowrap;
54
+ }
55
+
56
+ /* Overlay */
57
+ .edit-file-overlay {
58
+ position: fixed;
59
+ top: 0;
60
+ left: 0;
61
+ width: 100%;
62
+ height: 100%;
63
+ background: rgb(0 0 0 / 50%);
64
+ backdrop-filter: blur(4px);
65
+ z-index: 10000;
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ opacity: 0;
70
+ visibility: hidden;
71
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
72
+ padding: 20px;
73
+ box-sizing: border-box;
74
+ }
75
+
76
+ .edit-file-overlay_open {
77
+ opacity: 1;
78
+ visibility: visible;
79
+ }
80
+
81
+ /* Popover */
82
+ .edit-file-popover {
83
+ background: white;
84
+ border-radius: 16px;
85
+ box-shadow: 0 20px 60px rgb(0 0 0 / 20%), 0 8px 24px rgb(0 0 0 / 15%);
86
+ width: 100%;
87
+ max-width: 900px;
88
+ max-height: 90vh;
89
+ display: flex;
90
+ flex-direction: column;
91
+ transform: scale(0.9) translateY(20px);
92
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
93
+ overflow: hidden;
94
+ }
95
+
96
+ .edit-file-popover_open {
97
+ transform: scale(1) translateY(0);
98
+ }
99
+
100
+ /* Popover Header */
101
+ .edit-file-header {
102
+ padding: 24px 24px 20px;
103
+ border-bottom: 1px solid #e5e7ea;
104
+ display: flex;
105
+ align-items: flex-start;
106
+ justify-content: space-between;
107
+ gap: 16px;
108
+ background: linear-gradient(180deg, #fafbfc 0%, #f7f9fb 100%);
109
+ position: relative;
110
+ }
111
+
112
+ .edit-file-title {
113
+ margin: 0;
114
+ font-size: 24px;
115
+ font-weight: 700;
116
+ color: #181818;
117
+ letter-spacing: -0.02em;
118
+ }
119
+
120
+ .edit-file-filename {
121
+ margin: 8px 0 0;
122
+ font-size: 14px;
123
+ color: #706e6b;
124
+ display: flex;
125
+ align-items: center;
126
+ gap: 6px;
127
+ font-weight: 500;
128
+ }
129
+
130
+ .edit-file-file-icon {
131
+ width: 16px;
132
+ height: 16px;
133
+ color: #0176d3;
134
+ }
135
+
136
+ .edit-file-close {
137
+ width: 40px;
138
+ height: 40px;
139
+ border: none;
140
+ background: transparent;
141
+ border-radius: 10px;
142
+ cursor: pointer;
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
147
+ color: #706e6b;
148
+ flex-shrink: 0;
149
+ }
150
+
151
+ .edit-file-close:hover {
152
+ background: #f3f3f3;
153
+ color: #181818;
154
+ transform: scale(1.05);
155
+ }
156
+
157
+ .edit-file-close-icon {
158
+ width: 20px;
159
+ height: 20px;
160
+ }
161
+
162
+ /* Popover Content */
163
+ .edit-file-content {
164
+ flex: 1;
165
+ padding: 24px;
166
+ overflow-y: auto;
167
+ min-height: 0;
168
+ }
169
+
170
+ /* Loading State */
171
+ .edit-file-loading {
172
+ display: flex;
173
+ flex-direction: column;
174
+ align-items: center;
175
+ justify-content: center;
176
+ padding: 60px 20px;
177
+ gap: 16px;
178
+ }
179
+
180
+ .edit-file-spinner {
181
+ width: 32px;
182
+ height: 32px;
183
+ border: 3px solid #e5e7ea;
184
+ border-top: 3px solid #0176d3;
185
+ border-radius: 50%;
186
+ animation: edit-file-spin 1s linear infinite;
187
+ }
188
+
189
+ .edit-file-loading-text {
190
+ margin: 0;
191
+ color: #706e6b;
192
+ font-size: 16px;
193
+ font-weight: 500;
194
+ }
195
+
196
+ /* Error State */
197
+ .edit-file-error {
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 12px;
201
+ padding: 16px 20px;
202
+ background: #fef7f7;
203
+ border: 1px solid #fecaca;
204
+ border-radius: 12px;
205
+ color: #dc2626;
206
+ margin-bottom: 20px;
207
+ }
208
+
209
+ .edit-file-error-icon {
210
+ width: 20px;
211
+ height: 20px;
212
+ flex-shrink: 0;
213
+ }
214
+
215
+ .edit-file-error-text {
216
+ font-size: 14px;
217
+ font-weight: 500;
218
+ }
219
+
220
+ /* Editor */
221
+ .edit-file-editor {
222
+ width: 100%;
223
+ }
224
+
225
+ .edit-file-label {
226
+ display: block;
227
+ margin-bottom: 8px;
228
+ font-size: 14px;
229
+ font-weight: 600;
230
+ color: #181818;
231
+ }
232
+
233
+ .edit-file-textarea {
234
+ width: 100%;
235
+ min-height: 400px;
236
+ padding: 16px;
237
+ border: 2px solid #e5e7ea;
238
+ border-radius: 12px;
239
+ font-family: "SF Mono", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;
240
+ font-size: 14px;
241
+ line-height: 1.5;
242
+ resize: vertical;
243
+ outline: none;
244
+ background: #fafbfc;
245
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
246
+ box-sizing: border-box;
247
+ }
248
+
249
+ .edit-file-textarea:focus {
250
+ border-color: #0176d3;
251
+ background: white;
252
+ box-shadow: 0 0 0 3px rgb(1 118 211 / 10%);
253
+ }
254
+
255
+ .edit-file-textarea::placeholder {
256
+ color: #9ca3af;
257
+ }
258
+
259
+ /* Popover Footer */
260
+ .edit-file-footer {
261
+ padding: 20px 24px 24px;
262
+ border-top: 1px solid #e5e7ea;
263
+ display: flex;
264
+ align-items: center;
265
+ justify-content: space-between;
266
+ gap: 16px;
267
+ background: linear-gradient(180deg, #fafbfc 0%, #f7f9fb 100%);
268
+ }
269
+
270
+ /* Status Indicators */
271
+ .edit-file-status {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 8px;
275
+ font-size: 14px;
276
+ font-weight: 500;
277
+ }
278
+
279
+ .edit-file-saving {
280
+ display: flex;
281
+ align-items: center;
282
+ gap: 8px;
283
+ color: #0176d3;
284
+ }
285
+
286
+ .edit-file-mini-spinner {
287
+ width: 16px;
288
+ height: 16px;
289
+ border: 2px solid #e5e7ea;
290
+ border-top: 2px solid #0176d3;
291
+ border-radius: 50%;
292
+ animation: edit-file-spin 1s linear infinite;
293
+ }
294
+
295
+ .edit-file-unchanged {
296
+ color: #706e6b;
297
+ }
298
+
299
+ .edit-file-modified {
300
+ color: #059669;
301
+ position: relative;
302
+ }
303
+
304
+ .edit-file-modified::before {
305
+ content: "●";
306
+ margin-right: 6px;
307
+ color: #059669;
308
+ }
309
+
310
+ /* Action Buttons */
311
+ .edit-file-actions {
312
+ display: flex;
313
+ gap: 12px;
314
+ }
315
+
316
+ .edit-file-button {
317
+ padding: 12px 24px;
318
+ border-radius: 10px;
319
+ font-size: 14px;
320
+ font-weight: 600;
321
+ cursor: pointer;
322
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
323
+ display: flex;
324
+ align-items: center;
325
+ gap: 8px;
326
+ border: none;
327
+ white-space: nowrap;
328
+ }
329
+
330
+ .edit-file-button_secondary {
331
+ background: #f3f3f3;
332
+ color: #181818;
333
+ border: 1px solid #e5e7ea;
334
+ }
335
+
336
+ .edit-file-button_secondary:hover:not(:disabled) {
337
+ background: #e5e7ea;
338
+ transform: translateY(-1px);
339
+ }
340
+
341
+ .edit-file-button_primary {
342
+ background: linear-gradient(135deg, #0176d3 0%, #005fb2 100%);
343
+ color: white;
344
+ }
345
+
346
+ .edit-file-button_primary:hover:not(:disabled) {
347
+ background: linear-gradient(135deg, #005fb2 0%, #003e73 100%);
348
+ transform: translateY(-1px);
349
+ box-shadow: 0 4px 12px rgb(1 118 211 / 25%);
350
+ }
351
+
352
+ .edit-file-button_disabled {
353
+ background: #d8dde6 !important;
354
+ color: #706e6b !important;
355
+ cursor: not-allowed !important;
356
+ transform: none !important;
357
+ box-shadow: none !important;
358
+ }
359
+
360
+ .edit-file-button:disabled {
361
+ background: #d8dde6;
362
+ color: #706e6b;
363
+ cursor: not-allowed;
364
+ transform: none;
365
+ box-shadow: none;
366
+ }
367
+
368
+ .edit-file-button-spinner {
369
+ width: 16px;
370
+ height: 16px;
371
+ border: 2px solid transparent;
372
+ border-top: 2px solid currentColor;
373
+ border-radius: 50%;
374
+ animation: edit-file-spin 1s linear infinite;
375
+ }
376
+
377
+ /* Animations */
378
+ @keyframes edit-file-spin {
379
+ to {
380
+ transform: rotate(360deg);
381
+ }
382
+ }
383
+
384
+ /* Responsive Design */
385
+ @media (max-width: 768px) {
386
+ .edit-file-trigger {
387
+ padding: 10px 14px;
388
+ font-size: 13px;
389
+ }
390
+
391
+ .edit-file-trigger-text {
392
+ display: none;
393
+ }
394
+
395
+ .edit-file-overlay {
396
+ padding: 16px;
397
+ }
398
+
399
+ .edit-file-popover {
400
+ max-width: 100%;
401
+ max-height: 95vh;
402
+ }
403
+
404
+ .edit-file-header {
405
+ padding: 20px 20px 16px;
406
+ }
407
+
408
+ .edit-file-title {
409
+ font-size: 20px;
410
+ }
411
+
412
+ .edit-file-content {
413
+ padding: 20px;
414
+ }
415
+
416
+ .edit-file-textarea {
417
+ min-height: 300px;
418
+ font-size: 13px;
419
+ }
420
+
421
+ .edit-file-footer {
422
+ padding: 16px 20px 20px;
423
+ flex-direction: column;
424
+ align-items: stretch;
425
+ gap: 12px;
426
+ }
427
+
428
+ .edit-file-actions {
429
+ width: 100%;
430
+ justify-content: stretch;
431
+ }
432
+
433
+ .edit-file-button {
434
+ flex: 1;
435
+ justify-content: center;
436
+ }
437
+ }
438
+
439
+ @media (max-width: 480px) {
440
+ .edit-file-trigger {
441
+ padding: 8px 12px;
442
+ }
443
+
444
+ .edit-file-overlay {
445
+ padding: 12px;
446
+ }
447
+
448
+ .edit-file-header {
449
+ padding: 16px;
450
+ }
451
+
452
+ .edit-file-title {
453
+ font-size: 18px;
454
+ }
455
+
456
+ .edit-file-content {
457
+ padding: 16px;
458
+ }
459
+
460
+ .edit-file-footer {
461
+ padding: 12px 16px 16px;
462
+ }
463
+
464
+ .edit-file-textarea {
465
+ min-height: 250px;
466
+ padding: 12px;
467
+ }
468
+ }
469
+
470
+ /* Accessibility improvements */
471
+ @media (prefers-reduced-motion: reduce) {
472
+ .edit-file-trigger,
473
+ .edit-file-overlay,
474
+ .edit-file-popover,
475
+ .edit-file-close,
476
+ .edit-file-button,
477
+ .edit-file-textarea {
478
+ transition: none;
479
+ }
480
+
481
+ .edit-file-spinner,
482
+ .edit-file-mini-spinner,
483
+ .edit-file-button-spinner {
484
+ animation: none;
485
+ }
486
+ }
487
+
488
+ /* High contrast mode support */
489
+ @media (prefers-contrast: high) {
490
+ .edit-file-trigger {
491
+ border: 2px solid;
492
+ }
493
+
494
+ .edit-file-popover {
495
+ border: 2px solid #000;
496
+ }
497
+
498
+ .edit-file-textarea {
499
+ border: 2px solid #000;
500
+ }
501
+
502
+ .edit-file-button {
503
+ border: 2px solid;
504
+ }
505
+ }
@@ -0,0 +1,164 @@
1
+ <template>
2
+ <!-- Edit File Trigger Button -->
3
+ <button
4
+ class="edit-file-trigger"
5
+ onclick={handleEditClick}
6
+ disabled={disabled}
7
+ aria-label="Edit file"
8
+ title="Edit file"
9
+ >
10
+ <svg
11
+ class="edit-file-icon"
12
+ viewBox="0 0 24 24"
13
+ fill="none"
14
+ stroke="currentColor"
15
+ >
16
+ <path
17
+ stroke-linecap="round"
18
+ stroke-linejoin="round"
19
+ stroke-width="2"
20
+ d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"
21
+ />
22
+ </svg>
23
+ <span class="edit-file-trigger-text">Edit</span>
24
+ </button>
25
+
26
+ <!-- Popover Overlay -->
27
+ <template lwc:if={isPopoverOpen}>
28
+ <div
29
+ class={overlayClass}
30
+ onclick={handleOverlayClick}
31
+ >
32
+ <div class={popoverClass}>
33
+ <!-- Popover Header -->
34
+ <div class="edit-file-header">
35
+ <h2 class="edit-file-title">{title}</h2>
36
+ <template lwc:if={fileName}>
37
+ <p class="edit-file-filename">
38
+ <svg
39
+ class="edit-file-file-icon"
40
+ viewBox="0 0 24 24"
41
+ fill="none"
42
+ stroke="currentColor"
43
+ >
44
+ <path
45
+ stroke-linecap="round"
46
+ stroke-linejoin="round"
47
+ stroke-width="2"
48
+ d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"
49
+ />
50
+ </svg>
51
+ {fileName}
52
+ </p>
53
+ </template>
54
+ <button
55
+ class="edit-file-close"
56
+ onclick={handleCancel}
57
+ aria-label="Close editor"
58
+ >
59
+ <svg
60
+ class="edit-file-close-icon"
61
+ viewBox="0 0 24 24"
62
+ fill="none"
63
+ stroke="currentColor"
64
+ >
65
+ <path
66
+ stroke-linecap="round"
67
+ stroke-linejoin="round"
68
+ stroke-width="2"
69
+ d="M6 18L18 6M6 6l12 12"
70
+ />
71
+ </svg>
72
+ </button>
73
+ </div>
74
+
75
+ <!-- Popover Content -->
76
+ <div class="edit-file-content">
77
+ <!-- Loading State -->
78
+ <template lwc:if={isLoading}>
79
+ <div class="edit-file-loading">
80
+ <div class="edit-file-spinner"></div>
81
+ <p class="edit-file-loading-text">Loading file content...</p>
82
+ </div>
83
+ </template>
84
+
85
+ <!-- Error Message -->
86
+ <template lwc:if={errorMessage}>
87
+ <div class="edit-file-error">
88
+ <svg
89
+ class="edit-file-error-icon"
90
+ viewBox="0 0 24 24"
91
+ fill="none"
92
+ stroke="currentColor"
93
+ >
94
+ <circle cx="12" cy="12" r="10"></circle>
95
+ <line x1="15" y1="9" x2="9" y2="15"></line>
96
+ <line x1="9" y1="9" x2="15" y2="15"></line>
97
+ </svg>
98
+ <span class="edit-file-error-text">{errorMessage}</span>
99
+ </div>
100
+ </template>
101
+
102
+ <!-- Content Editor -->
103
+ <template lwc:if={fileContent}>
104
+ <div class="edit-file-editor">
105
+ <label class="edit-file-label" for="file-content">
106
+ File Content
107
+ </label>
108
+ <textarea
109
+ id="file-content"
110
+ class="edit-file-textarea"
111
+ value={fileContent}
112
+ oninput={handleContentChange}
113
+ placeholder="Enter file content..."
114
+ rows="20"
115
+ spellcheck="false"
116
+ ></textarea>
117
+ </div>
118
+ </template>
119
+ </div>
120
+
121
+ <!-- Popover Footer -->
122
+ <div class="edit-file-footer">
123
+ <div class="edit-file-status">
124
+ <template lwc:if={isSaving}>
125
+ <div class="edit-file-saving">
126
+ <div class="edit-file-mini-spinner"></div>
127
+ <span>Saving...</span>
128
+ </div>
129
+ </template>
130
+ <template lwc:elseif={isContentUnchanged}>
131
+ <span class="edit-file-unchanged">No changes</span>
132
+ </template>
133
+ <template lwc:else>
134
+ <span class="edit-file-modified">Modified</span>
135
+ </template>
136
+ </div>
137
+
138
+ <div class="edit-file-actions">
139
+ <button
140
+ class="edit-file-button edit-file-button_secondary"
141
+ onclick={handleCancel}
142
+ disabled={isSaving}
143
+ >
144
+ Cancel
145
+ </button>
146
+ <button
147
+ class={saveButtonClass}
148
+ onclick={handleSave}
149
+ disabled={isSaving}
150
+ >
151
+ <template lwc:if={isSaving}>
152
+ <div class="edit-file-button-spinner"></div>
153
+ Saving...
154
+ </template>
155
+ <template lwc:else>
156
+ Save
157
+ </template>
158
+ </button>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+ </template>
164
+ </template>