@flytedan/flytebot-design-system 0.51.3 → 0.51.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flytedan/flytebot-design-system",
3
- "version": "0.51.3",
3
+ "version": "0.51.5",
4
4
  "description": "flytedesk Design System — shared component library, tokens, and business-logic kits for flytedesk apps.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -2714,24 +2714,44 @@
2714
2714
  color: var(--text);
2715
2715
  font-size: var(--body-size);
2716
2716
  }
2717
- /* ToastProvider's stack: pinned to the bottom-right of the viewport (z-index is set inline
2718
- from OVERLAY_CEILING, above every layer). The region itself takes no clicks: it has a real
2719
- box wherever a toast is, including the gap between two stacked toasts and the shadow around
2720
- each, and without this a click aimed at the control underneath would land on it. Each toast
2721
- takes its clicks back, so its close button works. */
2722
- .fd-toast-region {
2717
+ /* The corner stack: the one bottom-right box every floating surface (the toasts, the job
2718
+ tray) renders into a slot of, so they lay out one above the next instead of each pinning
2719
+ itself to the same corner (z-index is set inline from OVERLAY_CEILING, above every layer).
2720
+ It is 340px wide, and on a phone the width between two gutters. The stack
2721
+ takes no clicks: it has a real box wherever a surface is, including the gaps between
2722
+ surfaces and the shadow around each, and without this a click aimed at the control
2723
+ underneath would land on it. Each surface takes its clicks back. Slots run bottom to top;
2724
+ two occupied slots are one gap apart, and an empty one (the toast region is always mounted
2725
+ for its live region) takes no room. */
2726
+ .fd-corner-stack {
2723
2727
  position: fixed;
2724
2728
  bottom: var(--s-lg);
2725
2729
  right: var(--s-lg);
2730
+ display: flex;
2731
+ flex-direction: column-reverse;
2732
+ width: 340px;
2733
+ pointer-events: none;
2734
+ }
2735
+ @media (max-width: 640px) {
2736
+ .fd-corner-stack {
2737
+ width: calc(100vw - 2 * var(--s-lg));
2738
+ }
2739
+ }
2740
+ .fd-corner-stack-slot:has(> :not(:empty)) ~ .fd-corner-stack-slot:has(> :not(:empty)) {
2741
+ margin-bottom: var(--s-sm);
2742
+ }
2743
+ /* ToastProvider's stack, in the corner stack's toasts slot. */
2744
+ .fd-toast-region {
2726
2745
  display: flex;
2727
2746
  flex-direction: column;
2728
2747
  gap: var(--s-sm);
2729
- max-width: calc(100vw - 2 * var(--s-lg));
2730
- pointer-events: none;
2731
2748
  }
2732
2749
  .fd-toast-region > * {
2733
2750
  pointer-events: auto;
2734
2751
  }
2752
+ .fd-toast-region > .fd-toast {
2753
+ width: auto;
2754
+ }
2735
2755
 
2736
2756
  /* ============ Flag / empty ============ */
2737
2757
  .fd-flag {
@@ -3003,20 +3023,23 @@
3003
3023
  }
3004
3024
 
3005
3025
  /* ============ FilterBar (MP-243, SMS-50) ============ */
3006
- /* The bar is two columns on one wrapping row: the MAIN column, which is the "Filter" trigger
3007
- (its own column, always first) beside the chips (a wrapping area of their own, taking the room
3008
- left over), and an optional `actions` slot pinned to the right edge (`margin-left: auto`).
3009
- The columns top-align, so however many lines the chips wrap onto, the trigger and the actions
3010
- never move. The main column never wraps its two children under each other, at any width; when
3011
- the row is too narrow for main and actions together (main keeps a floor of
3026
+ /* At 30rem and wider the bar is two columns on one wrapping row: the MAIN column, which is the
3027
+ "Filter" trigger (its own column, always first) beside the chips (a wrapping area of their own,
3028
+ taking the room left over), and an optional `actions` slot pinned to the right edge
3029
+ (`margin-left: auto`). The columns top-align, so however many lines the chips wrap onto, the
3030
+ trigger and the actions never move. The main column never wraps its two children under each
3031
+ other; when the row is too narrow for main and actions together (main keeps a floor of
3012
3032
  --filterbar-main-min), the actions wrap onto a row of their own and stay right-aligned.
3013
3033
 
3034
+ Below 30rem (a phone) there is no room for a column beside the button: the main column takes
3035
+ the whole row, the Filter button and Clear all share its first line, the chips wrap underneath
3036
+ on rows of their own, and the actions take the row below that. The switch is a container query
3037
+ on the bar itself, so it follows the room the bar is given, not the viewport.
3038
+
3014
3039
  It is a block-level flex box that fills the row it is put in, and `min-width: 0` lets it
3015
- shrink inside a flex parent instead of forcing that parent wider. (Until SMS-50 it was
3016
- inline-flex with `max-width: 100%`: an inline-flex box's shrink-to-fit width comes from its
3017
- UNWRAPPED content, so wrapping only worked once something capped it. A block-level flex box
3018
- takes its width from its container, which is what makes wrapping, and the chips column's
3019
- own width, well defined.) */
3040
+ shrink inside a flex parent instead of forcing that parent wider. A block-level flex box takes
3041
+ its width from its container, which is what makes wrapping, and the chips column's own width,
3042
+ well defined. */
3020
3043
  .fd-filterbar {
3021
3044
  --filterbar-main-min: 20rem;
3022
3045
  /* The most a chip may take. A longer value is shortened in the middle (MiddleEllipsis). */
@@ -3027,6 +3050,7 @@
3027
3050
  align-items: flex-start;
3028
3051
  gap: var(--s-sm) var(--s-md);
3029
3052
  min-width: 0;
3053
+ container: fd-filterbar / inline-size;
3030
3054
  }
3031
3055
  .fd-filterbar-main {
3032
3056
  flex: 1 1 var(--filterbar-main-min);
@@ -3091,6 +3115,24 @@
3091
3115
  gap: var(--s-sm) var(--s-md);
3092
3116
  max-width: 100%;
3093
3117
  }
3118
+ /* A phone-width bar: the main column is the whole row, stacked, with Filter and Clear all side
3119
+ by side on its first line and the chips wrapping underneath at up to their max width each.
3120
+ It follows the rules it overrides so the two never tie on source order. */
3121
+ @container fd-filterbar (width < 30rem) {
3122
+ .fd-filterbar-main {
3123
+ flex: 1 1 100%;
3124
+ flex-direction: column;
3125
+ align-items: stretch;
3126
+ }
3127
+ .fd-filterbar-trigger {
3128
+ flex-direction: row;
3129
+ flex-wrap: wrap;
3130
+ }
3131
+ .fd-filterbar-chips {
3132
+ flex: none;
3133
+ min-height: 0;
3134
+ }
3135
+ }
3094
3136
  /* MP-282: seen live at 375px — a chip whose value is long (a full campaign name) painted
3095
3137
  637px wide inside a 297px-wide bar instead of respecting it, because .fd-tag is `flex:
3096
3138
  none; white-space: nowrap; max-width: none` with nothing to clamp it, and the ONLY thing
@@ -7488,16 +7530,9 @@ button.fd-erow-metric:focus-visible {
7488
7530
  A stack of background-job cards (exports, syncs) and an ordered-phase display for the
7489
7531
  same kind of job. Both are entirely props-driven — no timers here, only layout. */
7490
7532
  .fd-job-tray{
7491
- position:fixed;
7492
- right:var(--s-16,16px);
7493
- bottom:var(--s-16,16px);
7494
- z-index:40;
7495
7533
  display:flex;
7496
7534
  flex-direction:column-reverse;
7497
7535
  gap:10px;
7498
- width:340px;
7499
- max-width:calc(100vw - 32px);
7500
- pointer-events:none;
7501
7536
  }
7502
7537
  .fd-job-tray>.fd-job-card{pointer-events:auto}
7503
7538
  .fd-job-card{
@@ -7519,16 +7554,6 @@ button.fd-erow-metric:focus-visible {
7519
7554
  .fd-job-card-done-note{display:block}
7520
7555
  .fd-job-card-failed{display:flex;align-items:flex-start;gap:8px;color:var(--danger-text);font-size:var(--body-sm-size)}
7521
7556
  .fd-job-card-failed .ph{flex:none;font-size:16px;margin-top:1px}
7522
- @media (max-width:640px){
7523
- .fd-job-tray{
7524
- left:16px;
7525
- right:16px;
7526
- bottom:0;
7527
- width:auto;
7528
- max-width:none;
7529
- padding-bottom:12px;
7530
- }
7531
- }
7532
7557
 
7533
7558
  .fd-phased-progress{display:flex;flex-direction:column;gap:12px}
7534
7559
  .fd-phase-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}