ui-soxo-bootstrap-core 2.6.41 → 2.6.43

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.
@@ -123,7 +123,9 @@
123
123
  .right-section {
124
124
  margin-top: 0px;
125
125
  width: 100%;
126
- overflow-x: scroll;
126
+ /* `auto` so the horizontal scrollbar only appears when content genuinely
127
+ overflows — `scroll` forced it to show permanently on every page. */
128
+ overflow-x: auto;
127
129
  position: relative;
128
130
  padding: 15px;
129
131
  margin-left: calc(var(--sidemenu-width, 211px) + 1px);
@@ -526,7 +526,7 @@ function panelActions(item, model, setSelectedRecord, setDrawerTitle, setDrawerV
526
526
  <EditOutlined />
527
527
  </Button>
528
528
  )}
529
- <Button
529
+ {/* <Button
530
530
  size="small"
531
531
  type="default"
532
532
  onClick={() => {
@@ -536,7 +536,7 @@ function panelActions(item, model, setSelectedRecord, setDrawerTitle, setDrawerV
536
536
  }}
537
537
  >
538
538
  <CopyOutlined />
539
- </Button>
539
+ </Button> */}
540
540
  <Popconfirm title="Are you sure?" onConfirm={() => deleteRecord(item)}>
541
541
  <Button danger size="small" type="default">
542
542
  <DeleteOutlined />
@@ -11,7 +11,7 @@
11
11
  * - Renders a single active step view with compact breadcrumb controls.
12
12
  */
13
13
  import { ArrowLeftOutlined, ArrowRightOutlined, CompressOutlined, ExpandOutlined, SoundOutlined } from '@ant-design/icons';
14
- import { Empty, Select, Spin, message } from 'antd';
14
+ import { Empty, Select, Skeleton, message } from 'antd';
15
15
  import moment from 'moment';
16
16
  import { useEffect, useRef, useState } from 'react';
17
17
  import { ExternalWindow } from '../../components';
@@ -1290,7 +1290,27 @@ export default function ProcessStepsPage({ match, CustomComponents = {}, ...prop
1290
1290
  </div>
1291
1291
  )} */}
1292
1292
 
1293
- <div className="steps-top-bar">
1293
+ <div className={`steps-top-bar${isStepFullscreen ? ' is-fullscreen' : ''}`}>
1294
+ {/*
1295
+ Full-screen toggle is anchored to the far left of the bar so the
1296
+ step tabs can stretch across the middle and the primary CTA sits
1297
+ flush right (see design).
1298
+ */}
1299
+ <Button
1300
+ className="steps-fullscreen-toggle"
1301
+ type="dashed"
1302
+ icon={isStepFullscreen ? <CompressOutlined /> : <ExpandOutlined />}
1303
+ onClick={toggleStepFullscreen}
1304
+ aria-label={isStepFullscreen ? 'Exit Full Screen' : 'Full Screen'}
1305
+ title={isStepFullscreen ? 'Exit Full Screen' : 'Full Screen'}
1306
+ >
1307
+ {isStepFullscreen ? 'Exit Full Screen' : 'Full Screen'}
1308
+ </Button>
1309
+
1310
+ {/*
1311
+ Breadcrumb strip stays visible in fullscreen mode too so the
1312
+ user keeps the step timeline / navigation while presenting.
1313
+ */}
1294
1314
  <div className="steps-breadcrumb-strip">
1295
1315
  {steps.length ? (
1296
1316
  steps.map((stepItem, stepIndex) => {
@@ -1315,10 +1335,6 @@ export default function ProcessStepsPage({ match, CustomComponents = {}, ...prop
1315
1335
  </div>
1316
1336
 
1317
1337
  <div className="steps-nav-actions">
1318
- <Button type="dashed" icon={isStepFullscreen ? <CompressOutlined /> : <ExpandOutlined />} onClick={toggleStepFullscreen}>
1319
- {isStepFullscreen ? 'Exit Full Screen' : 'Full Screen'}
1320
- </Button>
1321
-
1322
1338
  {/*
1323
1339
  Previous-process button.
1324
1340
  - Only relevant at the start of a process (`activeStep === 0`)
@@ -1333,7 +1349,13 @@ export default function ProcessStepsPage({ match, CustomComponents = {}, ...prop
1333
1349
  )}
1334
1350
 
1335
1351
  {activeStep > 0 && (
1336
- <Button type="default" icon={<ArrowLeftOutlined />} onClick={handlePrevious}>
1352
+ <Button
1353
+ type="default"
1354
+ icon={<ArrowLeftOutlined />}
1355
+ onClick={handlePrevious}
1356
+ aria-label="Back"
1357
+ title="Back"
1358
+ >
1337
1359
  Back
1338
1360
  </Button>
1339
1361
  )}
@@ -1366,7 +1388,13 @@ export default function ProcessStepsPage({ match, CustomComponents = {}, ...prop
1366
1388
  )}
1367
1389
  </>
1368
1390
  ) : (
1369
- <Button type="primary" disabled={!isStepCompleted} onClick={handleNext}>
1391
+ <Button
1392
+ type="primary"
1393
+ disabled={!isStepCompleted}
1394
+ onClick={handleNext}
1395
+ aria-label={activeStep === 0 ? (FIRST_STEP_LABELS[processName?.trim().toLowerCase()] ?? 'Next') : 'Next'}
1396
+ title={activeStep === 0 ? (FIRST_STEP_LABELS[processName?.trim().toLowerCase()] ?? 'Next') : 'Next'}
1397
+ >
1370
1398
  {/*
1371
1399
  First-step label is resolved via FIRST_STEP_LABELS using
1372
1400
  the process name (lowercased + trimmed) as the key. Known
@@ -1464,10 +1492,10 @@ export default function ProcessStepsPage({ match, CustomComponents = {}, ...prop
1464
1492
  </button>
1465
1493
  </>
1466
1494
  ) : null}
1467
- <div
1495
+ {/* <div
1468
1496
  key={`${currentProcessId}_${activeStep}`}
1469
1497
  className={`steps-chat-step-card ${stepSlideDirection === 'backward' ? 'slide-backward' : 'slide-forward'}`}
1470
- >
1498
+ > */}
1471
1499
  {/* <div className="steps-chat-step-top">
1472
1500
  <span className="steps-index-pill">
1473
1501
  Step {Math.min(activeStep + 1, steps.length || 1)} of {steps.length || 1}
@@ -1476,15 +1504,17 @@ export default function ProcessStepsPage({ match, CustomComponents = {}, ...prop
1476
1504
  {currentStep?.step_description ? <p className="steps-description">{currentStep.step_description}</p> : null}
1477
1505
  </div> */}
1478
1506
 
1479
- <div className="steps-chat-step-component">
1507
+ {/* <div className="steps-chat-step-component"> */}
1480
1508
  {loading ? (
1481
1509
  <div className="steps-chat-loading">
1482
- <Spin />
1510
+ <div className="steps-chat-loading__card">
1511
+ <Skeleton active title={{ width: '32%' }} paragraph={{ rows: 6, width: ['90%', '82%', '86%', '70%', '78%', '60%'] }} />
1512
+ </div>
1483
1513
  </div>
1484
1514
  ) : null}
1485
1515
  {!loading ? renderDynamicStep() : null}
1486
- </div>
1487
- </div>
1516
+ {/* </div> */}
1517
+ {/* </div> */}
1488
1518
  </div>
1489
1519
  </div>
1490
1520
 
@@ -3,7 +3,13 @@
3
3
  .process-steps-page {
4
4
  display: flex;
5
5
  flex-direction: column;
6
- height: 100%;
6
+ /* The app shell's `.right-section` is `height: 100vh` with a fixed 56px header
7
+ (`.page-wrapper`) on top of it plus 15px padding. A plain `height: 100%`
8
+ makes this page a full 100vh — so its bottom runs past the viewport under the
9
+ header and forces a page scroll in normal view. Bound it to the space that is
10
+ actually visible below the header instead. (In full screen the promoted
11
+ `.steps-viewport` is 100vh via the Fullscreen API, so this doesn't apply.) */
12
+ height: calc(100vh - 86px);
7
13
  min-height: 0;
8
14
  width: 100%;
9
15
  max-width: 100%;
@@ -159,16 +165,19 @@
159
165
  flex: 0 0 auto;
160
166
  display: flex;
161
167
  align-items: center;
162
- gap: 8px;
163
- padding: 6px 12px;
164
- border-bottom: 1px solid #e8eef8;
165
- background: #f8fbff;
166
- min-height: 50px;
168
+ gap: 12px;
169
+ padding: 0 24px;
170
+ min-height: 70px;
167
171
  width: 100%;
168
172
  max-width: 100%;
169
173
  min-width: 0;
170
174
  box-sizing: border-box;
171
175
  overflow: hidden;
176
+ position: relative;
177
+ /* Clean solid header on the soft sage → ivory gradient (no glass/frost).
178
+ Matches the onboarding reference without the frosted-glass treatment. */
179
+ border-bottom: 1px solid rgba(255, 255, 255, 0.4);
180
+ background: linear-gradient(180deg, #a7c2c6 100%, #eff3e3 100%);
172
181
  }
173
182
 
174
183
  .steps-breadcrumb-strip {
@@ -176,13 +185,49 @@
176
185
  min-width: 0;
177
186
  display: flex;
178
187
  align-items: center;
179
- gap: 6px;
188
+ /* `safe center` keeps the steps centered when they fit, but falls back to
189
+ start-aligned when there are too many to fit (>6). Plain `center` would clip
190
+ BOTH ends on overflow — cutting off the active step's label (e.g. "Guest
191
+ Details") and making it unreachable even though the strip scrolls. */
192
+ justify-content: safe center;
193
+ gap: clamp(28px, 3vw, 52px);
180
194
  overflow-x: auto;
181
195
  overflow-y: hidden;
182
196
  white-space: nowrap;
183
- scrollbar-width: thin;
184
- scrollbar-color: #d0dff5 transparent;
185
- padding-bottom: 2px;
197
+ scrollbar-width: none;
198
+ padding: 0 8px;
199
+ }
200
+
201
+ .steps-breadcrumb-strip::-webkit-scrollbar {
202
+ height: 0;
203
+ display: none;
204
+ }
205
+
206
+ /* Full-screen toggle — grey frosted pill anchored to the far left. */
207
+ .steps-fullscreen-toggle {
208
+ flex: 0 0 auto;
209
+ }
210
+
211
+ .steps-fullscreen-toggle.ant-btn,
212
+ .steps-fullscreen-toggle.ant-btn-dashed {
213
+ height: 38px;
214
+ padding: 0 18px;
215
+ border-radius: 999px;
216
+ background: #07232E33;
217
+ border: 1px solid #dbe3e6;
218
+ color: #ffffff;
219
+ font-size: 13px;
220
+ font-weight: 500;
221
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
222
+ transition: all 0.2s ease;
223
+ }
224
+
225
+ .steps-fullscreen-toggle.ant-btn:hover,
226
+ .steps-fullscreen-toggle.ant-btn:focus {
227
+ background: #ffffff;
228
+ border-color: #ffffff;
229
+ color: #000000;
230
+ transform: translateY(-1px);
186
231
  }
187
232
 
188
233
  .steps-nav-actions {
@@ -190,20 +235,40 @@
190
235
  display: flex;
191
236
  align-items: center;
192
237
  gap: 6px;
238
+ /*
239
+ Anchors the Back + primary CTA to the far right. In fullscreen the
240
+ breadcrumb strip is not rendered, so this margin keeps the group pinned
241
+ right with only the Full Screen toggle sitting on the left.
242
+ */
243
+ margin-left: auto;
193
244
  }
194
245
 
195
246
  .steps-nav-actions .ant-btn {
196
- min-height: 34px;
197
- border-radius: 8px;
198
- padding: 0 14px;
247
+ min-height: 40px;
248
+ border-radius: 999px;
249
+ padding: 0 18px;
199
250
  font-size: 13px;
200
251
  font-weight: 600;
201
252
  touch-action: manipulation;
202
253
  -webkit-tap-highlight-color: transparent;
203
- transition: all 0.15s ease;
254
+ transition: all 0.2s ease;
204
255
  white-space: nowrap;
205
256
  }
206
257
 
258
+ /* Secondary (Back / previous-process) — solid white pill. */
259
+ .steps-nav-actions .ant-btn-default {
260
+ background: #ffffff;
261
+ border-color: #dbe3e6;
262
+ color: #4a5a68;
263
+ }
264
+
265
+ .steps-nav-actions .ant-btn-default:hover,
266
+ .steps-nav-actions .ant-btn-default:focus {
267
+ background: #f4f7f8;
268
+ border-color: #c3ccd0;
269
+ color: #253a5b;
270
+ }
271
+
207
272
  .steps-nav-actions .ant-btn:active {
208
273
  transform: scale(0.97);
209
274
  }
@@ -253,17 +318,23 @@
253
318
  }
254
319
 
255
320
  .steps-breadcrumb-item {
321
+ /* Compact, natural-width steps that sit centered with connector lines
322
+ between them — matching the onboarding reference. */
323
+ position: relative;
324
+ flex: 0 0 auto;
325
+ min-width: 0;
256
326
  display: inline-flex;
257
327
  align-items: center;
258
- gap: 7px;
259
- border: 1.5px solid #dce6f5;
260
- background: #f8fbff;
328
+ justify-content: flex-start;
329
+ gap: 8px;
330
+ border: none;
331
+ background: transparent;
261
332
  border-radius: 999px;
262
- padding: 6px 14px;
333
+ padding: 4px;
263
334
  cursor: pointer;
264
- transition: all 0.18s ease;
265
- color: #475569;
266
- font-size: 12px;
335
+ transition: all 0.2s ease;
336
+ color: #7a8792;
337
+ font-size: 13px;
267
338
  font-weight: 500;
268
339
  white-space: nowrap;
269
340
  min-height: 34px;
@@ -271,56 +342,110 @@
271
342
  -webkit-tap-highlight-color: transparent;
272
343
  }
273
344
 
274
- .steps-breadcrumb-item:hover {
275
- background: #eef5ff;
276
- border-color: #c8d9f6;
277
- color: #1d4ed8;
345
+ /* Thin connecting line drawn into the gap toward the next step.
346
+ Width matches the strip's gap so it spans the space without overhanging. */
347
+ .steps-breadcrumb-item:not(:last-child)::after {
348
+ content: '';
349
+ position: absolute;
350
+ left: 100%;
351
+ top: 50%;
352
+ width: clamp(28px, 3vw, 52px);
353
+ height: 1px;
354
+ background: rgba(37, 58, 91, 0.2);
355
+ transform: translateY(-50%);
278
356
  }
279
357
 
280
358
  .steps-breadcrumb-item:active {
281
- transform: scale(0.96);
359
+ transform: scale(0.97);
360
+ }
361
+
362
+ /* Number bubble — default (upcoming) solid muted circle. */
363
+ .steps-breadcrumb-index {
364
+ width: 26px;
365
+ height: 26px;
366
+ border-radius: 50%;
367
+ display: inline-flex;
368
+ align-items: center;
369
+ justify-content: center;
370
+ font-size: 12px;
371
+ font-weight: 600;
372
+ background: #ffffff;
373
+ border: 1px solid #d3dbdf;
374
+ color: #8a97a2;
375
+ flex: 0 0 auto;
376
+ transition: all 0.2s ease;
377
+ }
378
+
379
+ .steps-breadcrumb-item:hover .steps-breadcrumb-index {
380
+ border-color: rgba(37, 58, 91, 0.35);
381
+ color: #253a5b;
282
382
  }
283
383
 
384
+ /* Label is shown only for the active step (upcoming steps are circle-only,
385
+ as in the reference). */
386
+ .steps-breadcrumb-label {
387
+ display: none;
388
+ font-size: 13px;
389
+ font-weight: 500;
390
+ color: inherit;
391
+ min-width: 0;
392
+ overflow: hidden;
393
+ text-overflow: ellipsis;
394
+ white-space: nowrap;
395
+ }
396
+
397
+ /* ACTIVE — solid white rounded pill with dark navy text. */
284
398
  .steps-breadcrumb-item.active {
285
- background: #1e3a8a;
286
- border-color: #1e3a8a;
287
- color: #ffffff;
399
+ background: #ffffff;
400
+ padding: 4px 16px 4px 6px;
401
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.06);
402
+ color: #253a5b;
288
403
  font-weight: 600;
289
404
  }
290
405
 
291
- .steps-breadcrumb-item.completed {
292
- border-color: #86efac;
293
- background: #f0fdf4;
294
- color: #15803d;
406
+ .steps-breadcrumb-item.active .steps-breadcrumb-index {
407
+ background: #ffffff;
408
+ border-color: rgba(37, 58, 91, 0.25);
409
+ color: #253a5b;
410
+ }
411
+
412
+ .steps-breadcrumb-item.active .steps-breadcrumb-label {
413
+ display: inline;
414
+ color: #253a5b;
295
415
  }
296
416
 
417
+ /* COMPLETED — filled navy circle. */
297
418
  .steps-breadcrumb-item.completed .steps-breadcrumb-index {
298
- background: #16a34a;
419
+ background: #253a5b;
420
+ border-color: #253a5b;
299
421
  color: #ffffff;
300
422
  }
301
423
 
302
- .steps-breadcrumb-item.active .steps-breadcrumb-index {
303
- background: rgba(255, 255, 255, 0.22);
304
- color: #ffffff;
424
+ /* Primary CTA (Start / Verify Profile / Next / Finish) — dark navy pill. */
425
+ .steps-nav-actions .ant-btn-primary {
426
+ background: #253a5b;
427
+ border-color: #253a5b;
428
+ border-radius: 999px;
429
+ padding: 0 30px;
430
+ min-height: 40px;
431
+ box-shadow: 0 8px 20px rgba(37, 58, 91, 0.28);
305
432
  }
306
433
 
307
- .steps-breadcrumb-index {
308
- width: 20px;
309
- height: 20px;
310
- border-radius: 50%;
311
- display: inline-flex;
312
- align-items: center;
313
- justify-content: center;
314
- font-size: 11px;
315
- font-weight: 700;
316
- background: #e2e8f4;
317
- color: #1e293b;
318
- flex: 0 0 auto;
434
+ .steps-nav-actions .ant-btn-primary:hover,
435
+ .steps-nav-actions .ant-btn-primary:focus {
436
+ background: #1d3054;
437
+ border-color: #1d3054;
438
+ transform: translateY(-1px);
439
+ box-shadow: 0 12px 26px rgba(37, 58, 91, 0.36);
319
440
  }
320
441
 
321
- .steps-breadcrumb-label {
322
- font-size: 12px;
323
- font-weight: 600;
442
+ .steps-nav-actions .ant-btn-primary:disabled,
443
+ .steps-nav-actions .ant-btn-primary[disabled] {
444
+ background: #c8d0e0;
445
+ border-color: #c8d0e0;
446
+ color: #ffffff;
447
+ box-shadow: none;
448
+ transform: none;
324
449
  }
325
450
 
326
451
  .steps-breadcrumb-empty {
@@ -347,8 +472,8 @@
347
472
  padding: 10px 14px;
348
473
  box-sizing: border-box;
349
474
  position: relative;
475
+ background: linear-gradient(180deg, #a7c2c6 0%, #eff3e3 100%);
350
476
  }
351
-
352
477
  .steps-stage-body.is-swipe-enabled {
353
478
  touch-action: pan-y;
354
479
  }
@@ -712,10 +837,29 @@
712
837
  }
713
838
 
714
839
  .steps-chat-loading {
840
+ flex: 1 1 auto;
715
841
  min-height: 120px;
716
842
  display: flex;
717
- align-items: center;
843
+ align-items: stretch;
718
844
  justify-content: center;
845
+ padding: 20px;
846
+ box-sizing: border-box;
847
+ }
848
+
849
+ /* Frosted skeleton card that fills the stage while a step loads (replaces the
850
+ old centered spinner) — matches the soft gradient step surfaces. */
851
+ .steps-chat-loading__card {
852
+ width: 100%;
853
+ max-width: 1100px;
854
+ align-self: stretch;
855
+ padding: 28px 32px;
856
+ box-sizing: border-box;
857
+ border-radius: 16px;
858
+ background: rgba(255, 255, 255, 0.42);
859
+ border: 1px solid rgba(255, 255, 255, 0.6);
860
+ box-shadow: 0 2px 10px rgba(20, 50, 64, 0.05);
861
+ backdrop-filter: blur(4px);
862
+ -webkit-backdrop-filter: blur(4px);
719
863
  }
720
864
 
721
865
  /* ── Narration bar (hidden by default via NARRATION_CONTROLS_ENABLED) ── */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ui-soxo-bootstrap-core",
3
- "version": "2.6.41",
3
+ "version": "2.6.43",
4
4
  "description": "All the Core Components for you to start",
5
5
  "keywords": [
6
6
  "all in one"