@jobber/components 8.21.0 → 8.22.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 (59) hide show
  1. package/Dialog.d.ts +1 -0
  2. package/Dialog.js +17 -0
  3. package/dist/BottomSheet-cjs.js +34 -7
  4. package/dist/BottomSheet-es.js +34 -8
  5. package/dist/Card/index.cjs +1 -0
  6. package/dist/Card/index.mjs +1 -0
  7. package/dist/ComboboxChipRemove-es.js +3 -3
  8. package/dist/DataDump/index.cjs +1 -0
  9. package/dist/DataDump/index.mjs +1 -0
  10. package/dist/Dialog/Dialog.d.ts +3 -0
  11. package/dist/Dialog/Dialog.types.d.ts +205 -0
  12. package/dist/Dialog/DialogBottomSheet.d.ts +28 -0
  13. package/dist/Dialog/DialogModal.d.ts +20 -0
  14. package/dist/Dialog/constants.d.ts +1 -0
  15. package/dist/Dialog/dialogComposableShared.d.ts +53 -0
  16. package/dist/Dialog/dialogReturnFocus.d.ts +43 -0
  17. package/dist/Dialog/index.cjs +32 -0
  18. package/dist/Dialog/index.d.ts +4 -0
  19. package/dist/Dialog/index.mjs +24 -0
  20. package/dist/DrawerDescription-cjs.js +409 -0
  21. package/dist/DrawerDescription-es.js +382 -0
  22. package/dist/DrawerTitle-cjs.js +116 -0
  23. package/dist/DrawerTitle-es.js +92 -0
  24. package/dist/InputNumberExperimental-es.js +1 -1
  25. package/dist/InternalBackdrop-es.js +2 -2
  26. package/dist/Menu/index.cjs +1 -0
  27. package/dist/Menu/index.mjs +1 -0
  28. package/dist/Menu-cjs.js +5 -3
  29. package/dist/Menu-es.js +5 -3
  30. package/dist/MenuSubmenuTrigger-cjs.js +49 -91
  31. package/dist/MenuSubmenuTrigger-es.js +51 -91
  32. package/dist/NumberFieldInput-es.js +1 -1
  33. package/dist/Page/index.cjs +1 -0
  34. package/dist/Page/index.mjs +1 -0
  35. package/dist/ScrollAreaViewport-cjs.js +938 -935
  36. package/dist/ScrollAreaViewport-es.js +938 -938
  37. package/dist/dialogReturnFocus-cjs.js +427 -0
  38. package/dist/dialogReturnFocus-es.js +423 -0
  39. package/dist/docs/Icon/Icon.md +1 -0
  40. package/dist/index.cjs +13 -7
  41. package/dist/index.d.mts +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.mjs +10 -7
  44. package/dist/primitives/BottomSheet/BottomSheet.d.ts +19 -1
  45. package/dist/primitives/BottomSheet/BottomSheet.types.d.ts +8 -0
  46. package/dist/primitives/BottomSheet/index.cjs +1 -0
  47. package/dist/primitives/BottomSheet/index.d.ts +1 -1
  48. package/dist/primitives/BottomSheet/index.mjs +1 -1
  49. package/dist/primitives/index.cjs +1 -0
  50. package/dist/primitives/index.mjs +1 -1
  51. package/dist/styles.css +360 -0
  52. package/dist/unstyledPrimitives/index.cjs +32 -249
  53. package/dist/unstyledPrimitives/index.d.ts +1 -0
  54. package/dist/unstyledPrimitives/index.mjs +30 -248
  55. package/dist/useButton-es.js +1 -1
  56. package/dist/useCompositeListItem-es.js +2 -2
  57. package/dist/useLabel-es.js +1 -1
  58. package/dist/utils/meta/meta.json +11 -1
  59. package/package.json +3 -3
package/dist/styles.css CHANGED
@@ -3567,6 +3567,27 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3567
3567
  z-index: var(--elevation-modal);
3568
3568
  }
3569
3569
 
3570
+ /*
3571
+ * Explicit, documented Base UI Menu backdrop. Base UI renders a transparent
3572
+ * internal backdrop for modal menus to capture outside presses, but that
3573
+ * internal backdrop has no z-index. When a Menu opens inside an overlay that
3574
+ * sets its own stacking (e.g. Dialog's backdrop at --elevation-modal), the
3575
+ * overlay paints above the internal backdrop and steals the dismissing click —
3576
+ * closing the overlay instead of just the menu. Rendering Menu.Backdrop at the
3577
+ * same elevation lets the menu's backdrop win by DOM order and intercept the
3578
+ * click, so an outside press dismisses only the menu.
3579
+ */
3580
+
3581
+ .wqvf3hcDMM0- {
3582
+ position: fixed;
3583
+ top: 0;
3584
+ right: 0;
3585
+ bottom: 0;
3586
+ left: 0;
3587
+ z-index: 1001;
3588
+ z-index: var(--elevation-modal);
3589
+ }
3590
+
3570
3591
  .-DayvgvIcVo- {
3571
3592
  --menu-space: var(--space-small);
3572
3593
  --menu-item-gap: var(--space-small);
@@ -10054,6 +10075,345 @@ h2.react-datepicker__current-month {
10054
10075
  flex: 1 1 40%;
10055
10076
  }
10056
10077
 
10078
+ /* Dialog Sizes */
10079
+ .uYYyCR3l6E8- {
10080
+ --dialog-popup-max-width: 440px;
10081
+ }
10082
+ .X1jGz-sLWf4- {
10083
+ --dialog-popup-max-width: 720px;
10084
+ }
10085
+ ._4zFf2PkFhaA- {
10086
+ --dialog-popup-max-width: 1032px;
10087
+ }
10088
+ .nJoCr8oWJ7w- {
10089
+ --dialog-popup-width: 100vw;
10090
+ --dialog-popup-max-width: 100vw;
10091
+ --dialog-popup-min-height: 100dvh;
10092
+ /* No margins full screen — the viewport also drops its padding-block for
10093
+ fullScreen (below) so the popup sits flush against every edge. Zeroing the
10094
+ gap here also makes the sticky-scroll cap resolve to a flush 100dvh. */
10095
+ --dialog-popup-margin-block: 0;
10096
+ --dialog-popup-radius: 0;
10097
+ --dialog-viewport-gap: 0px;
10098
+ }
10099
+ /* Header — commonly a title on the left and a dismiss button on the right.
10100
+ Pinned via flex when it's a sibling of the scroll region (the default); it
10101
+ scrolls when placed inside a `Dialog.ScrollArea`. `flex: 0 0 auto` keeps a
10102
+ sticky header from shrinking. */
10103
+ .XFKiCQ8QbQU- {
10104
+ display: -ms-flexbox;
10105
+ display: flex;
10106
+ -ms-flex: 0 0 auto;
10107
+ flex: 0 0 auto;
10108
+ -ms-flex-align: center;
10109
+ align-items: center;
10110
+ -ms-flex-pack: justify;
10111
+ justify-content: space-between;
10112
+ gap: 8px;
10113
+ gap: var(--space-small);
10114
+ padding: 20px 24px 0;
10115
+ padding: 20px var(--space-large) 0;
10116
+ }
10117
+ .FDOhnO0TT08- {
10118
+ -ms-flex-item-align: start;
10119
+ align-self: flex-start;
10120
+ }
10121
+ /* ScrollArea.Root — the scroll region. A `Dialog.Body` wraps itself in one; a
10122
+ `Dialog.ScrollArea` is one placed explicitly. It fills the space between the
10123
+ sticky regions and scrolls its content. */
10124
+ ._8DjYA23vHXA- {
10125
+ display: -ms-flexbox;
10126
+ display: flex;
10127
+ -ms-flex: 1 1 auto;
10128
+ flex: 1 1 auto;
10129
+ min-height: 0;
10130
+ -ms-flex-direction: column;
10131
+ flex-direction: column;
10132
+ }
10133
+ /* The ScrollArea.Viewport — the scrollable element. */
10134
+ .Bwr9IUYpLfM- {
10135
+ -ms-flex: 1 1 auto;
10136
+ flex: 1 1 auto;
10137
+ min-height: 0;
10138
+ }
10139
+ /* Re-enable the browser's native scrollbar — BaseUI hides it by default for its
10140
+ own custom scrollbar. */
10141
+ ._8DjYA23vHXA- .Bwr9IUYpLfM- {
10142
+ scrollbar-width: auto;
10143
+ }
10144
+ ._8DjYA23vHXA- .Bwr9IUYpLfM-::-webkit-scrollbar {
10145
+ display: revert;
10146
+ }
10147
+ .zp9kx9uue2I- {
10148
+ box-sizing: border-box;
10149
+ padding: 24px;
10150
+ padding: var(--space-large);
10151
+ }
10152
+ .EhtwBTy1ai4- {
10153
+ padding: 0;
10154
+ }
10155
+ /* Footer — generic bottom region; owns padding only. Pinned via flex when it's
10156
+ a sibling of the scroll region (the default); it scrolls when placed inside a
10157
+ `Dialog.ScrollArea`. */
10158
+ .DRIJhI1knKw- {
10159
+ -ms-flex: 0 0 auto;
10160
+ flex: 0 0 auto;
10161
+ padding: 0 24px 24px;
10162
+ padding: 0 var(--space-large) var(--space-large);
10163
+ }
10164
+ /* Slide the bottom sheet up from the bottom on open/close. */
10165
+ .vmcZRwOcNMo- {
10166
+ -webkit-transform: translateY(0px);
10167
+ -webkit-transform: translateY(var(--drawer-swipe-movement-y, 0px));
10168
+ transform: translateY(0px);
10169
+ transform: translateY(var(--drawer-swipe-movement-y, 0px));
10170
+ transition: -webkit-transform 200ms ease;
10171
+ transition: -webkit-transform var(--timing-base) ease;
10172
+ transition: transform 200ms ease;
10173
+ transition: transform var(--timing-base) ease;
10174
+ transition: transform 200ms ease, -webkit-transform 200ms ease;
10175
+ transition: transform var(--timing-base) ease, -webkit-transform var(--timing-base) ease;
10176
+ }
10177
+ .vmcZRwOcNMo-[data-starting-style],
10178
+ .vmcZRwOcNMo-[data-ending-style] {
10179
+ -webkit-transform: translateY(100%);
10180
+ transform: translateY(100%);
10181
+ }
10182
+ /* Full-screen bottom sheet */
10183
+ .vmcZRwOcNMo-[data-size="fullScreen"] {
10184
+ height: 100dvh;
10185
+ max-height: 100dvh;
10186
+ border-radius: 0;
10187
+ }
10188
+ /* Scroll divider — shown on a sticky Header/Footer only while the scroll region
10189
+ actually overflows (BaseUI sets `data-has-overflow-y` on the ScrollArea root
10190
+ when its content overflows). */
10191
+ .mFX7qDCd17I-:has([data-has-overflow-y]) .XFKiCQ8QbQU-[data-sticky],
10192
+ .vmcZRwOcNMo-:has([data-has-overflow-y]) .XFKiCQ8QbQU-[data-sticky] {
10193
+ padding-bottom: 16px;
10194
+ padding-bottom: var(--space-base);
10195
+ border-bottom: 1px solid hsl(200, 13%, 87%);
10196
+ border-bottom: var(--border-base) solid var(--color-border);
10197
+ }
10198
+ .mFX7qDCd17I-:has([data-has-overflow-y]) .DRIJhI1knKw-[data-sticky],
10199
+ .vmcZRwOcNMo-:has([data-has-overflow-y]) .DRIJhI1knKw-[data-sticky] {
10200
+ padding-top: 16px;
10201
+ padding-top: var(--space-base);
10202
+ border-top: 1px solid hsl(200, 13%, 87%);
10203
+ border-top: var(--border-base) solid var(--color-border);
10204
+ }
10205
+ /* Base backdrop styling */
10206
+ .NE-BIsVE-hE- {
10207
+ position: fixed;
10208
+ top: 0;
10209
+ right: 0;
10210
+ bottom: 0;
10211
+ left: 0;
10212
+
10213
+ /*
10214
+ * Use a high (modal) z-index so the dialog and its dimmed backdrop render on
10215
+ * top of the app's nav bars, headers, and other fixed UI instead of behind
10216
+ * them. Every dialog renders its own backdrop at this same elevation (see the
10217
+ * `forceRender` in DialogModal.tsx), so the frontmost dialog — portaled last —
10218
+ * wins by DOM order: it both catches the dismissing outside press and lays its
10219
+ * dim over the dialog beneath it.
10220
+ */
10221
+ z-index: 1001;
10222
+ z-index: var(--elevation-modal);
10223
+ background-color: rgba(121, 119, 114, 0.48);
10224
+ backdrop-filter: blur(2px);
10225
+ transition: opacity 200ms ease;
10226
+ transition: opacity var(--timing-base) ease;
10227
+ }
10228
+ .NE-BIsVE-hE-[data-starting-style],
10229
+ .NE-BIsVE-hE-[data-ending-style] {
10230
+ opacity: 0;
10231
+ }
10232
+ /*
10233
+ * A nested dialog's backdrop (Base UI marks its viewport `data-nested`) must
10234
+ * not transition: the outer dialog supplies the dim as it opens and closes, so the
10235
+ * nested backdrop appears at full dim instantly and snaps away on close. A
10236
+ * transition would flash the undimmed page on open and add extra dim on close.
10237
+ */
10238
+ .NE-BIsVE-hE-:has(~ .hp70o-3Cf-w-[data-nested]) {
10239
+ transition: none;
10240
+ }
10241
+ .NE-BIsVE-hE-[data-starting-style]:has(~ .hp70o-3Cf-w-[data-nested]) {
10242
+ opacity: 1;
10243
+ }
10244
+ /*
10245
+ * Only the frontmost dialog shows the dim overlay. When a dialog has another
10246
+ * dialog open within it, Base UI marks its popup with `data-nested-dialog-open`;
10247
+ * we make that dialog's backdrop fully transparent (no dim, no blur) so the dim
10248
+ * is supplied solely by the frontmost dialog's backdrop. This keeps the dimming
10249
+ * from compounding as dialogs stack. The popup lives inside the viewport,
10250
+ * which is the backdrop's sibling.
10251
+ */
10252
+ .NE-BIsVE-hE-:has(~ .hp70o-3Cf-w- .mFX7qDCd17I-[data-nested-dialog-open]) {
10253
+ background-color: transparent;
10254
+ backdrop-filter: none;
10255
+ }
10256
+ /* Bottom sheet backdrop */
10257
+ [data-testid="ATL-BottomSheet-Backdrop"]:has(~ [data-dialog-variant="sheet"]) {
10258
+ background-color: rgba(121, 119, 114, 0.48);
10259
+ backdrop-filter: blur(2px);
10260
+ }
10261
+ .hp70o-3Cf-w- {
10262
+ /* Gap between the popup and the viewport edge. Used here as the viewport
10263
+ `padding-block`, and by the popup's `max-height` to cap it so the dialog
10264
+ fits within the same gap (the var inherits down to the popup). */
10265
+ --dialog-viewport-gap: var(--space-larger);
10266
+
10267
+ display: -ms-flexbox;
10268
+
10269
+ display: flex;
10270
+ position: fixed;
10271
+ z-index: 1001;
10272
+ z-index: var(--elevation-modal);
10273
+ top: 0;
10274
+ right: 0;
10275
+ bottom: 0;
10276
+ left: 0;
10277
+ -ms-flex-direction: column;
10278
+ flex-direction: column;
10279
+ /* Vertical centering is done by the popup's `margin-block: auto`, not by
10280
+ `place-items: center`. A centered grid/flex item taller than the viewport
10281
+ drops its block-end gap when scrolled to the bottom (and plain `center`
10282
+ would also push the top under the popup's `overflow: hidden` and clip it).
10283
+ With `align-items: center` on the inline axis + the popup's auto block
10284
+ margins, the popup centers when it fits and top-aligns when it overflows,
10285
+ and this `padding-block` gap is preserved at *both* scroll ends. */
10286
+ -ms-flex-align: center;
10287
+ align-items: center;
10288
+ padding-top: 32px;
10289
+ padding-bottom: 32px;
10290
+ padding-top: var(--dialog-viewport-gap);
10291
+ padding-bottom: var(--dialog-viewport-gap);
10292
+ overflow-y: auto;
10293
+ }
10294
+ /* Full screen sits flush against every edge — drop the viewport's gap. */
10295
+ .hp70o-3Cf-w-:has(.nJoCr8oWJ7w-) {
10296
+ padding-top: 0;
10297
+ padding-bottom: 0;
10298
+ }
10299
+ .mFX7qDCd17I- {
10300
+ display: -ms-flexbox;
10301
+ display: flex;
10302
+ position: relative;
10303
+ width: calc(100vw - 2 * 16px);
10304
+ width: var(--dialog-popup-width, calc(100vw - 2 * var(--space-base)));
10305
+ max-width: 720px;
10306
+ max-width: var(--dialog-popup-max-width, 720px);
10307
+ /* Uncapped by default: with no sticky region the popup grows with its content
10308
+ and the window (viewport) scrolls the whole dialog. A sticky Header/Footer
10309
+ caps it (`.popup:has([data-sticky])` below) so the body scrolls inside. */
10310
+ max-height: none;
10311
+ max-height: var(--dialog-popup-max-height, none);
10312
+ min-height: auto;
10313
+ min-height: var(--dialog-popup-min-height, auto);
10314
+ box-shadow: 0px 16px 16px 0px rgba(0, 0, 0, 0.075), 0px 0px 8px 0px rgba(0, 0, 0, 0.05);
10315
+ box-shadow: var(--shadow-high);
10316
+ box-sizing: border-box;
10317
+ border-radius: 8px;
10318
+ border-radius: var(--dialog-popup-radius, var(--radius-base));
10319
+ outline: none;
10320
+ /* Clip content to the rounded corners so full-bleed panes (e.g. a split
10321
+ view's coloured media pane) don't square them off. The popup's own
10322
+ box-shadow (drop shadow + focus ring) is unaffected by its own overflow. */
10323
+ overflow: hidden;
10324
+ background-color: rgba(255, 255, 255, 1);
10325
+ background-color: var(--color-surface);
10326
+ transition: opacity 200ms ease, -webkit-transform 200ms ease;
10327
+ transition: opacity var(--timing-base) ease, -webkit-transform var(--timing-base) ease;
10328
+ transition: opacity 200ms ease, transform 200ms ease;
10329
+ transition: opacity var(--timing-base) ease, transform var(--timing-base) ease;
10330
+ transition: opacity 200ms ease, transform 200ms ease, -webkit-transform 200ms ease;
10331
+ transition: opacity var(--timing-base) ease, transform var(--timing-base) ease, -webkit-transform var(--timing-base) ease;
10332
+ /* `auto` centers the popup vertically in the flex-column viewport when it
10333
+ fits, and collapses to 0 when it overflows (so it top-aligns and scrolls).
10334
+ fullScreen overrides this var to offset the viewport padding. */
10335
+ margin-top: auto;
10336
+ margin-bottom: auto;
10337
+ margin-top: var(--dialog-popup-margin-block, auto);
10338
+ margin-bottom: var(--dialog-popup-margin-block, auto);
10339
+ -ms-flex-direction: column;
10340
+ flex-direction: column;
10341
+ /* Don't shrink — holding content height lets an uncapped (no sticky region)
10342
+ dialog grow so the window scrolls the whole dialog, while a dialog with a
10343
+ sticky Header/Footer is capped by `max-height` and scrolls its body. */
10344
+ -ms-flex-negative: 0;
10345
+ flex-shrink: 0;
10346
+ }
10347
+ .mFX7qDCd17I-:focus-visible {
10348
+ box-shadow: 0px 0px 0px 2px rgba(255, 255, 255, 1), 0px 0px 0px 4px hsl(198, 12%, 57%);
10349
+ box-shadow: var(--shadow-focus);
10350
+ }
10351
+ .mFX7qDCd17I-[data-starting-style],
10352
+ .mFX7qDCd17I-[data-ending-style] {
10353
+ opacity: 0;
10354
+ -webkit-transform: scale(0.97);
10355
+ transform: scale(0.97);
10356
+ }
10357
+ /* Inside-scroll — when a Header/Footer is sticky (`[data-sticky]`), cap the
10358
+ popup to the viewport (minus the edge gap) so the body scrolls inside between
10359
+ the sticky regions. With nothing sticky the popup stays uncapped and grows,
10360
+ and the window scrolls the whole dialog. */
10361
+ .mFX7qDCd17I-:has([data-sticky]) {
10362
+ --dialog-popup-max-height: calc(100dvh - 2 * var(--dialog-viewport-gap));
10363
+ }
10364
+ /* Honor reduced-motion: drop the backdrop fade, the modal popup scale/fade, and
10365
+ the sheet slide so the dialog appears and dismisses instantly. */
10366
+ @media (prefers-reduced-motion: reduce) {
10367
+ .NE-BIsVE-hE-,
10368
+ .mFX7qDCd17I-,
10369
+ .vmcZRwOcNMo- {
10370
+ transition: none;
10371
+ }
10372
+ }
10373
+
10374
+ /* Action-button layout used inside a Dialog.Footer — tertiary on the left,
10375
+ primary/secondary grouped on the right. */
10376
+ .hKVNddbxkmo- {
10377
+ display: -ms-flexbox;
10378
+ display: flex;
10379
+ -ms-flex-align: center;
10380
+ align-items: center;
10381
+ gap: 8px;
10382
+ gap: var(--space-small);
10383
+ width: 100%;
10384
+ }
10385
+ .nslrozOH-v4- {
10386
+ -ms-flex: 0 0 auto;
10387
+ flex: 0 0 auto;
10388
+ }
10389
+ .BrXAnQBttWE- {
10390
+ display: -ms-flexbox;
10391
+ display: flex;
10392
+ -ms-flex: 1 1 0px;
10393
+ flex: 1 1 0;
10394
+ -ms-flex-align: center;
10395
+ align-items: center;
10396
+ gap: 8px;
10397
+ gap: var(--space-small);
10398
+ -ms-flex-pack: end;
10399
+ justify-content: flex-end;
10400
+ }
10401
+ ._9Vgd-3YJxlI- {
10402
+ -ms-flex-pack: start;
10403
+ justify-content: flex-start;
10404
+ }
10405
+ ._8HC9NqvmJdo- {
10406
+ -ms-flex-pack: end;
10407
+ justify-content: flex-end;
10408
+ }
10409
+ .ZZ3XuxGv6ow- > *,
10410
+ .ZZ3XuxGv6ow- > .BrXAnQBttWE- > *,
10411
+ .ZZ3XuxGv6ow- > .nslrozOH-v4- > *
10412
+ {
10413
+ -ms-flex: 1 1 0px;
10414
+ flex: 1 1 0;
10415
+ }
10416
+
10057
10417
  .VMuRkKeqAs8- {
10058
10418
  -webkit-transform-origin: 50% 47.5% 0;
10059
10419
  transform-origin: 50% 47.5% 0;