@visns-studio/visns-components 6.0.4 → 6.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 (26) hide show
  1. package/package.json +1 -1
  2. package/src/components/DataGrid.jsx +37 -12
  3. package/src/components/Navigation.jsx +59 -3
  4. package/src/components/auth/Login.jsx +203 -175
  5. package/src/components/columns/ColumnRenderers.jsx +34 -0
  6. package/src/components/generic/GenericDashboard.jsx +181 -1
  7. package/src/components/generic/GenericFormBuilder.jsx +735 -37
  8. package/src/components/generic/GenericIndex.jsx +15 -5
  9. package/src/components/generic/OutstandingRuleEditor.jsx +313 -0
  10. package/src/components/styles/DataGrid.module.scss +38 -22
  11. package/src/components/styles/Form.module.scss +32 -33
  12. package/src/components/styles/GenericDashboard.module.scss +155 -0
  13. package/src/components/styles/GenericDetail.module.scss +28 -30
  14. package/src/components/styles/GenericDynamic.module.scss +7 -21
  15. package/src/components/styles/GenericEditableTable.module.scss +5 -22
  16. package/src/components/styles/GenericFormBuilder.module.scss +605 -30
  17. package/src/components/styles/GenericIndex.module.scss +17 -32
  18. package/src/components/styles/GenericMain.module.scss +18 -6
  19. package/src/components/styles/GenericQuote.module.scss +7 -22
  20. package/src/components/styles/GenericReport.module.scss +5 -37
  21. package/src/components/styles/Login.module.scss +415 -239
  22. package/src/components/styles/Navigation.module.scss +124 -35
  23. package/src/components/styles/Profile.module.scss +5 -26
  24. package/src/components/styles/QuickAction.module.scss +34 -29
  25. package/src/components/styles/_controls.scss +139 -0
  26. package/src/components/styles/global.css +54 -15
@@ -1,3 +1,8 @@
1
+ @use 'controls' as *;
2
+
3
+ .btn {
4
+ @include button-primary;
5
+ }
1
6
  .grid {
2
7
  &__row {
3
8
  width: 100%;
@@ -138,7 +143,10 @@
138
143
  border: 1px solid var(--border-color);
139
144
  box-sizing: border-box;
140
145
  padding: 0;
141
- margin: 5px;
146
+ /* Zero, not 5px: the breadcrumb above uses .crmtitle, which sets
147
+ margin:0 and therefore sits 5px wider on each side. The two panels
148
+ have to share an edge or the page looks misaligned. */
149
+ margin: 0;
142
150
  height: auto;
143
151
  position: relative;
144
152
 
@@ -777,28 +785,9 @@ select:not(:placeholder-shown) + .fi__span {
777
785
  }
778
786
 
779
787
  /* Adding btn class */
780
- .btn {
781
- width: max-content;
782
- display: inline-block;
783
- position: relative;
784
- padding: 0.65rem 1rem;
785
- cursor: pointer;
786
- font-size: 1rem;
787
- color: var(--tertiary-color);
788
- text-decoration: none;
789
- overflow: hidden;
790
- background: var(--primary-color);
791
- border: 1px solid rgba(var(--primary-rgb), 1.1);
792
- border-radius: var(--br);
793
- outline: none;
794
- transition: all 0.2s cubic-bezier(0.85, 0, 0.15, 1) 0s;
795
- }
796
788
 
797
- .btn:hover {
798
- color: var(--tertiary-color);
799
- background: var(--secondary-color);
800
- border: 1px solid rgba(var(--secondary-color-rgb), 1.1);
801
- }
789
+
790
+
802
791
 
803
792
  /* Floating action buttons */
804
793
  .polActions {
@@ -1594,17 +1583,43 @@ select:not(:placeholder-shown) + .fi__span {
1594
1583
  }
1595
1584
 
1596
1585
  .emptyState {
1597
- padding: 4rem 2rem;
1586
+ /* Full width of the panel. It previously sat inside a two-column grid and
1587
+ inherited the 216px rail column, which squeezed the message into a
1588
+ narrow box with every word on its own line. */
1589
+ width: 100%;
1590
+ max-width: 460px;
1591
+ margin: 3rem auto;
1592
+ padding: 2.5rem 2rem;
1598
1593
  text-align: center;
1599
- color: rgba(var(--paragraph-color-rgb), 0.5);
1600
- font-size: 0.95rem;
1601
- background: rgba(var(--primary-rgb), 0.02);
1602
- border: 2px dashed rgba(var(--primary-rgb), 0.12);
1603
- border-radius: var(--br);
1604
- margin: 1.5rem;
1594
+ background: rgba(var(--primary-rgb), 0.03);
1595
+ border: 1px dashed rgba(var(--primary-rgb), 0.2);
1596
+ border-radius: 12px;
1597
+
1598
+ &__icon {
1599
+ display: inline-flex;
1600
+ align-items: center;
1601
+ justify-content: center;
1602
+ width: 52px;
1603
+ height: 52px;
1604
+ border-radius: 50%;
1605
+ background: rgba(var(--primary-rgb), 0.1);
1606
+ color: var(--primary-color);
1607
+ margin-bottom: 1rem;
1608
+ }
1609
+
1610
+ h3 {
1611
+ margin: 0 0 0.4rem;
1612
+ font-size: 15px;
1613
+ font-weight: 700;
1614
+ color: var(--paragraph-color);
1615
+ }
1605
1616
 
1606
1617
  p {
1607
- margin: 0;
1618
+ margin: 0 auto 1.25rem;
1619
+ max-width: 320px;
1620
+ font-size: 13px;
1621
+ line-height: 1.55;
1622
+ color: rgba(var(--paragraph-rgb), 0.6);
1608
1623
  }
1609
1624
  }
1610
1625
 
@@ -2260,6 +2275,66 @@ select:not(:placeholder-shown) + .fi__span {
2260
2275
  }
2261
2276
  }
2262
2277
 
2278
+ // Outstanding item rule — a per-answer switch inside the options editor, plus
2279
+ // its hint and stale-reference warning. All of it renders only when the
2280
+ // consuming app enables `outstandingItems` in its builder config.
2281
+ .outstandingHint {
2282
+ font-size: 0.78rem;
2283
+ line-height: 1.45;
2284
+ color: rgba(var(--paragraph-color-rgb), 0.65);
2285
+ padding: 0 0 6px;
2286
+ }
2287
+
2288
+ .outstandingStale {
2289
+ background: #fff8e1;
2290
+ border: 1px solid #f4c544;
2291
+ border-radius: 6px;
2292
+ padding: 8px 12px;
2293
+ margin-bottom: 6px;
2294
+ color: #7a5c00;
2295
+ font-size: 0.8rem;
2296
+ line-height: 1.45;
2297
+ }
2298
+
2299
+ .outstandingFlag {
2300
+ flex-shrink: 0;
2301
+ display: inline-flex;
2302
+ align-items: center;
2303
+ gap: 5px;
2304
+ padding: 4px 9px;
2305
+ border: 1px solid rgba(var(--primary-rgb), 0.15);
2306
+ border-radius: 6px;
2307
+ background: white;
2308
+ font-size: 0.72rem;
2309
+ font-weight: 600;
2310
+ text-transform: uppercase;
2311
+ letter-spacing: 0.04em;
2312
+ color: rgba(var(--paragraph-color-rgb), 0.45);
2313
+ cursor: pointer;
2314
+ user-select: none;
2315
+ transition: all 0.2s ease;
2316
+
2317
+ &:hover {
2318
+ border-color: var(--primary-color);
2319
+ color: var(--paragraph-color);
2320
+ }
2321
+
2322
+ // The modal forces a 44px min-height on every input; a tick box must opt out.
2323
+ input[type='checkbox'] {
2324
+ margin: 0;
2325
+ width: auto !important;
2326
+ height: auto !important;
2327
+ min-height: 0 !important;
2328
+ cursor: pointer;
2329
+ }
2330
+ }
2331
+
2332
+ .outstandingFlagOn {
2333
+ border-color: #e0a800;
2334
+ background: #fff8e1;
2335
+ color: #7a5c00;
2336
+ }
2337
+
2263
2338
  .btnCancel {
2264
2339
  background: rgba(var(--paragraph-color-rgb), 0.08) !important;
2265
2340
  color: var(--paragraph-color) !important;
@@ -2269,3 +2344,503 @@ select:not(:placeholder-shown) + .fi__span {
2269
2344
  background: rgba(var(--paragraph-color-rgb), 0.15) !important;
2270
2345
  }
2271
2346
  }
2347
+
2348
+ /* ============================================================
2349
+ Builder layout: outline rail, compact rows, mode switch
2350
+ ============================================================ */
2351
+
2352
+ /* Only the page header, never a section bar — the two share
2353
+ .gridtxt__header, so these rules must not be applied to it directly. */
2354
+ .builderBar {
2355
+ display: flex;
2356
+ align-items: center;
2357
+ justify-content: space-between;
2358
+ gap: 1rem;
2359
+ flex-wrap: wrap;
2360
+ /* Full-bleed across the panel.
2361
+ width must be auto: .gridtxt__header sets width:100%, which pins the
2362
+ box to the parent's content width, so negative margins SHIFT it left
2363
+ instead of widening it — leaving a gap on the right only. */
2364
+ width: auto !important;
2365
+ margin: 0 -1.15rem !important;
2366
+ padding: 0.7rem 1.15rem !important;
2367
+ border-radius: 0 !important;
2368
+ }
2369
+
2370
+ .builderTools {
2371
+ display: flex;
2372
+ align-items: center;
2373
+ gap: 0.6rem;
2374
+ font-weight: 400;
2375
+ }
2376
+
2377
+ .fieldCount {
2378
+ font-size: 11.5px;
2379
+ color: rgba(var(--paragraph-rgb), 0.65);
2380
+ white-space: nowrap;
2381
+ }
2382
+
2383
+ .toolBtn {
2384
+ display: inline-flex;
2385
+ align-items: center;
2386
+ gap: 0.35rem;
2387
+ height: 28px;
2388
+ padding: 0 0.6rem;
2389
+ border: 1px solid rgba(var(--primary-rgb), 0.25);
2390
+ border-radius: 6px;
2391
+ background: #fff;
2392
+ color: var(--primary-color);
2393
+ font: inherit;
2394
+ font-size: 12px;
2395
+ font-weight: 600;
2396
+ cursor: pointer;
2397
+ }
2398
+
2399
+ .toolBtnOn {
2400
+ background: var(--primary-color);
2401
+ color: #fff;
2402
+ border-color: var(--primary-color);
2403
+ }
2404
+
2405
+ /* Edit / Preview. Compact editing is the default; the live render is the
2406
+ thing you opt into, not the thing you scroll past. */
2407
+ .modeSwitch {
2408
+ display: inline-flex;
2409
+ border: 1px solid rgba(var(--primary-rgb), 0.25);
2410
+ border-radius: 6px;
2411
+ overflow: hidden;
2412
+
2413
+ button {
2414
+ height: 28px;
2415
+ padding: 0 0.7rem;
2416
+ border: none;
2417
+ background: #fff;
2418
+ color: var(--primary-color);
2419
+ font: inherit;
2420
+ font-size: 12px;
2421
+ font-weight: 600;
2422
+ cursor: pointer;
2423
+ }
2424
+ }
2425
+
2426
+ .modeOn {
2427
+ background: var(--primary-color) !important;
2428
+ color: #fff !important;
2429
+ }
2430
+
2431
+ /* ---- outline rail ---- */
2432
+
2433
+ /* Base layout. Spacing lives here rather than only on the with-rail variant,
2434
+ so hiding the outline does not drop the padding and jump the list up
2435
+ against the toolbar. */
2436
+ /* Body inset.
2437
+ No top padding: the grey toolbar is the first child of this container, so
2438
+ padding-top lands ABOVE the bar rather than between it and the content —
2439
+ which is why the chips ended up flush against it. Spacing below the bar is
2440
+ owned by whatever follows it. */
2441
+ .formSplit {
2442
+ padding: 0 1.15rem 1.5rem;
2443
+ }
2444
+
2445
+ /**
2446
+ * Toolbar and section strip pinned together.
2447
+ *
2448
+ * One sticky element rather than two: separately, the strip's offset had to
2449
+ * equal the toolbar's height, a number that breaks silently whenever the
2450
+ * toolbar's padding or type size changes.
2451
+ *
2452
+ * The offset is the app header's measured height — it is position:fixed in
2453
+ * the host project with no declared height, so top:0 parks this underneath
2454
+ * it. See the measuring effect in GenericFormBuilder.
2455
+ */
2456
+ .stickyHead {
2457
+ position: sticky;
2458
+ top: var(--fb-sticky-top, 0px);
2459
+ z-index: 30;
2460
+ /* Below the app header's own stacking context (995). */
2461
+ background: #fff;
2462
+ margin: 0 -1.15rem;
2463
+ padding: 0 1.15rem;
2464
+ }
2465
+
2466
+ /* Children already carry their own full-bleed margins; inside the wrapper
2467
+ that would double up. */
2468
+ .stickyHead > .builderBar,
2469
+ .stickyHead > .sectionNav {
2470
+ margin-left: -1.15rem !important;
2471
+ margin-right: -1.15rem !important;
2472
+ }
2473
+
2474
+
2475
+ /* The header and search span both columns; only the rail and canvas sit
2476
+ side by side. */
2477
+
2478
+ /* ---- section chips ----
2479
+ Five short sections did not justify a 216px column, and the rail's tinted
2480
+ surface stopped dead after the last item. A strip costs about 40px of
2481
+ height and hands the full width back to the list. */
2482
+ .sectionNav {
2483
+ display: flex;
2484
+ flex-wrap: wrap;
2485
+ align-items: center;
2486
+ gap: 0.4rem;
2487
+ /* Clear air below the toolbar, and the rule pulled out to the panel edges
2488
+ so it divides the strip from the list rather than floating inside it. */
2489
+ width: auto;
2490
+ margin: 0 -1.15rem 1.15rem;
2491
+ padding: 1rem 1.15rem;
2492
+ /* Opaque: a translucent tint would let field rows show through while
2493
+ this is stuck. */
2494
+ background: #f7f9fc;
2495
+ border-bottom: 1px solid var(--border-color);
2496
+ }
2497
+
2498
+ .sectionChip {
2499
+ display: inline-flex;
2500
+ align-items: center;
2501
+ gap: 0.4rem;
2502
+ height: 30px;
2503
+ padding: 0 0.5rem 0 0.65rem;
2504
+ border: 1px solid rgba(var(--primary-rgb), 0.22);
2505
+ /* Matches the buttons and rows around it. */
2506
+ border-radius: 7px;
2507
+ background: #fff;
2508
+ color: var(--paragraph-color);
2509
+ font: inherit;
2510
+ font-size: 12px;
2511
+ cursor: pointer;
2512
+ max-width: 260px;
2513
+
2514
+ &:hover {
2515
+ border-color: var(--primary-color);
2516
+ background: rgba(var(--primary-rgb), 0.06);
2517
+ }
2518
+
2519
+ &__label {
2520
+ overflow: hidden;
2521
+ text-overflow: ellipsis;
2522
+ white-space: nowrap;
2523
+ }
2524
+
2525
+ &__count {
2526
+ font-size: 10.5px;
2527
+ font-variant-numeric: tabular-nums;
2528
+ font-weight: 700;
2529
+ color: rgba(var(--paragraph-rgb), 0.5);
2530
+ background: rgba(var(--paragraph-rgb), 0.08);
2531
+ border-radius: 4px;
2532
+ padding: 1px 5px;
2533
+ }
2534
+ }
2535
+
2536
+ .sectionChipActive {
2537
+ background: var(--primary-color);
2538
+ border-color: var(--primary-color);
2539
+ color: #fff;
2540
+ font-weight: 600;
2541
+
2542
+ .sectionChip__count {
2543
+ color: #fff;
2544
+ background: rgba(255, 255, 255, 0.22);
2545
+ }
2546
+
2547
+ &:hover {
2548
+ background: var(--primary-dark-color, var(--primary-color));
2549
+ }
2550
+ }
2551
+
2552
+ /* A collapsed section is still navigable, but should not look the same as
2553
+ one you can actually see. */
2554
+ .sectionChipCollapsed {
2555
+ border-style: dashed;
2556
+ opacity: 0.65;
2557
+ }
2558
+
2559
+ /* ---- search ---- */
2560
+
2561
+ .searchBarTop {
2562
+ /* Inline in the toolbar: no band, no divider, sized to sit beside the
2563
+ other controls rather than above them. */
2564
+ background: transparent !important;
2565
+ border-bottom: none !important;
2566
+ padding: 0 !important;
2567
+ margin: 0 !important;
2568
+ position: relative;
2569
+ width: 240px;
2570
+ flex: 0 0 auto;
2571
+
2572
+ .searchIcon {
2573
+ position: absolute;
2574
+ left: 9px;
2575
+ top: 50%;
2576
+ transform: translateY(-50%);
2577
+ z-index: 1;
2578
+ pointer-events: none;
2579
+ color: rgba(var(--paragraph-rgb), 0.45);
2580
+ }
2581
+
2582
+ .searchInput {
2583
+ width: 100%;
2584
+ padding: 0 2rem 0 1.9rem !important;
2585
+ height: 28px !important;
2586
+ min-height: 28px !important;
2587
+ border-radius: 6px !important;
2588
+ border-color: rgba(var(--primary-rgb), 0.25) !important;
2589
+ font-size: 12px !important;
2590
+
2591
+ &::placeholder {
2592
+ color: rgba(var(--paragraph-rgb), 0.45);
2593
+ }
2594
+
2595
+ &:focus {
2596
+ border-color: var(--primary-color) !important;
2597
+ box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.12) !important;
2598
+ }
2599
+ }
2600
+
2601
+ .searchCount {
2602
+ position: absolute;
2603
+ right: 1.9rem;
2604
+ top: 50%;
2605
+ transform: translateY(-50%);
2606
+ background: none;
2607
+ padding: 0;
2608
+ font-size: 10.5px;
2609
+ font-weight: 600;
2610
+ color: rgba(var(--paragraph-rgb), 0.5);
2611
+ }
2612
+
2613
+ .searchClear {
2614
+ position: absolute;
2615
+ right: 0.3rem;
2616
+ top: 50%;
2617
+ transform: translateY(-50%);
2618
+ padding: 2px;
2619
+ }
2620
+ }
2621
+
2622
+ /* ---- compact rows ---- */
2623
+
2624
+
2625
+
2626
+
2627
+ .duplicateBtn {
2628
+ display: flex;
2629
+ align-items: center;
2630
+ padding: 2px;
2631
+ border: none;
2632
+ background: none;
2633
+ color: rgba(var(--paragraph-rgb), 0.55);
2634
+ cursor: pointer;
2635
+
2636
+ &:hover {
2637
+ color: var(--primary-color);
2638
+ }
2639
+ }
2640
+
2641
+ @media (max-width: 900px) {
2642
+ /* Chips scroll sideways rather than stacking into a tall block that
2643
+ pushes the list off screen. */
2644
+ .sectionNav {
2645
+ flex-wrap: nowrap;
2646
+ overflow-x: auto;
2647
+ padding-bottom: 0.65rem;
2648
+ }
2649
+
2650
+ .sectionChip {
2651
+ flex: 0 0 auto;
2652
+ }
2653
+ }
2654
+
2655
+ .cRow {
2656
+ display: flex;
2657
+ align-items: center;
2658
+ gap: 0.5rem;
2659
+ width: 100%;
2660
+ min-height: 34px;
2661
+ padding: 0 0.5rem;
2662
+ box-sizing: border-box;
2663
+ background: #fff;
2664
+ border: 1px solid var(--border-color);
2665
+ border-radius: 6px;
2666
+ font-size: 13px;
2667
+
2668
+ &:hover {
2669
+ border-color: rgba(var(--primary-rgb), 0.45);
2670
+ background: rgba(var(--primary-rgb), 0.03);
2671
+ }
2672
+ }
2673
+
2674
+ .cRowDragging {
2675
+ opacity: 0.5;
2676
+ box-shadow: 0 8px 20px -8px rgba(0, 0, 0, 0.3);
2677
+ }
2678
+
2679
+ /* Sections read as headings, not as another entry in the list. */
2680
+ .cRowSection {
2681
+ margin-top: 0.75rem;
2682
+ background: rgba(var(--primary-rgb), 0.09);
2683
+ border: none;
2684
+ border-left: 3px solid var(--primary-color);
2685
+ border-radius: 4px;
2686
+ min-height: 36px;
2687
+
2688
+ .cLabel {
2689
+ font-weight: 700;
2690
+ text-transform: uppercase;
2691
+ letter-spacing: 0.04em;
2692
+ font-size: 11.5px;
2693
+ color: var(--primary-color);
2694
+ }
2695
+
2696
+ &:hover {
2697
+ background: rgba(var(--primary-rgb), 0.14);
2698
+ }
2699
+ }
2700
+
2701
+ .cGrip {
2702
+ flex: 0 0 auto;
2703
+ display: flex;
2704
+ align-items: center;
2705
+ color: rgba(var(--paragraph-rgb), 0.4);
2706
+ cursor: grab;
2707
+
2708
+ &:active {
2709
+ cursor: grabbing;
2710
+ }
2711
+ }
2712
+
2713
+ .cNum {
2714
+ flex: 0 0 auto;
2715
+ min-width: 24px;
2716
+ text-align: right;
2717
+ font-size: 10.5px;
2718
+ color: rgba(var(--paragraph-rgb), 0.45);
2719
+ font-variant-numeric: tabular-nums;
2720
+ }
2721
+
2722
+ .cCollapse {
2723
+ flex: 0 0 auto;
2724
+ display: flex;
2725
+ align-items: center;
2726
+ padding: 0;
2727
+ border: none;
2728
+ background: none;
2729
+ color: var(--primary-color);
2730
+ cursor: pointer;
2731
+ }
2732
+
2733
+ .cLabel {
2734
+ flex: 1 1 auto;
2735
+ min-width: 0;
2736
+ font-weight: 600;
2737
+ color: var(--paragraph-color);
2738
+ overflow: hidden;
2739
+ text-overflow: ellipsis;
2740
+ white-space: nowrap;
2741
+
2742
+ em {
2743
+ font-weight: 400;
2744
+ opacity: 0.55;
2745
+ }
2746
+ }
2747
+
2748
+ .cMeta {
2749
+ flex: 0 0 auto;
2750
+ font-size: 10.5px;
2751
+ color: rgba(var(--paragraph-rgb), 0.55);
2752
+ white-space: nowrap;
2753
+ }
2754
+
2755
+ /* Actions stay out of the way until the row is hovered, so 87 rows are not
2756
+ 87 clusters of icons competing with the labels. */
2757
+ .cActions {
2758
+ flex: 0 0 auto;
2759
+ display: flex;
2760
+ align-items: center;
2761
+ gap: 1px;
2762
+ opacity: 0;
2763
+ transition: opacity 0.12s linear;
2764
+
2765
+ button {
2766
+ display: flex;
2767
+ align-items: center;
2768
+ padding: 4px;
2769
+ border: none;
2770
+ background: none;
2771
+ color: rgba(var(--paragraph-rgb), 0.55);
2772
+ cursor: pointer;
2773
+ border-radius: 4px;
2774
+
2775
+ &:hover {
2776
+ color: var(--primary-color);
2777
+ background: rgba(var(--primary-rgb), 0.1);
2778
+ }
2779
+ }
2780
+ }
2781
+
2782
+ .cRow:hover .cActions,
2783
+ .cActions:focus-within {
2784
+ opacity: 1;
2785
+ }
2786
+
2787
+ .cDelete:hover {
2788
+ color: var(--secondary-color) !important;
2789
+ background: rgba(var(--secondary-rgb), 0.1) !important;
2790
+ }
2791
+
2792
+ /* ============================================================
2793
+ Preview mode — the form as a supervisor sees it
2794
+ ============================================================ */
2795
+
2796
+ .pvForm {
2797
+ /* Sections span the full width and break the row, so each group starts
2798
+ on its own line the way it will in the field app. */
2799
+ align-items: flex-start;
2800
+ padding: 0.5rem 0.25rem 1rem;
2801
+ }
2802
+
2803
+ .pvItem {
2804
+ padding: 0.35rem 0.5rem;
2805
+ box-sizing: border-box;
2806
+
2807
+ /* None of the authoring affordances belong here: no hover outline, no
2808
+ grab cursor, nothing that suggests this view is editable. */
2809
+ cursor: default;
2810
+
2811
+ &:hover {
2812
+ background: none;
2813
+ border-color: transparent;
2814
+ }
2815
+
2816
+ /* Any editing furniture that a shared child style might still emit. */
2817
+ .fieldIndex,
2818
+ .fieldInfo,
2819
+ .fieldControls,
2820
+ .dragHandle {
2821
+ display: none !important;
2822
+ }
2823
+
2824
+ .fieldContent {
2825
+ padding-top: 0 !important;
2826
+ border: none;
2827
+ min-height: 0;
2828
+ }
2829
+ }
2830
+
2831
+ /* Section bars read as headings in preview, full width and self-contained. */
2832
+ .pvForm .fwBuilderItem:has(.gridtxt__header) {
2833
+ width: 100% !important;
2834
+ margin: 1.25rem 0 0.35rem;
2835
+ padding-left: 0;
2836
+ padding-right: 0;
2837
+ }
2838
+
2839
+ /* A dynamic template is not an unfinished one — it should not wear the
2840
+ dashed "something is missing" treatment. */
2841
+ .emptyStateDynamic {
2842
+ border-style: solid;
2843
+ border-color: rgba(var(--primary-rgb), 0.15);
2844
+ background: rgba(var(--primary-rgb), 0.04);
2845
+ max-width: 520px;
2846
+ }