@wwtdev/bsds-css 3.0.0-rc.44 → 3.0.0-rc.46

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.
@@ -5110,14 +5110,23 @@ a.bs-text-button {
5110
5110
  --step-color: var(--bs-ink-negative);
5111
5111
  --progress-step-bg: var(--bs-negative-base);
5112
5112
  }
5113
- .bs-vertical-nav {
5113
+ .bs-vertical-nav-wrapper {
5114
5114
  --active-color: rgba(255, 255, 255, 0.25);
5115
5115
  --bg-color: var(--bs-navy-base);
5116
5116
  --border-color: var(--bs-border-dark);
5117
+ --text-color: var(--bs-white);
5118
+ --link-color: var(--bs-white);
5119
+ --link-hover-color: var(--bs-white);
5120
+ --link-active-color: var(--bs-white);
5121
+ --toggle-bg-color: var(--bg-color);
5122
+ --toggle-color: var(--bs-white);
5117
5123
  --top-offset: 48px;
5124
+ }
5125
+ .bs-vertical-nav {
5118
5126
  -ms-overflow-style: none; /* Internet Explorer 10+ */
5119
5127
  background-color: var(--bg-color);
5120
- color: var(--bs-white);
5128
+ border-inline-end: 1px solid var(--border-color);
5129
+ color: var(--text-color);
5121
5130
  display: flex;
5122
5131
  flex-direction: column;
5123
5132
  height: 100dvh;
@@ -5143,22 +5152,22 @@ a.bs-text-button {
5143
5152
  opacity: 1;
5144
5153
  visibility: visible;
5145
5154
  }
5146
- .dark .bs-vertical-nav {
5155
+ .bs-vertical-nav:where([data-collapsible="true"]) {
5156
+ transition: opacity 200ms ease 10ms, width 350ms cubic-bezier(0.4, 0, 0.2, 1);
5157
+ }
5158
+ .dark .bs-vertical-nav-wrapper {
5147
5159
  --active-color: rgba(255, 255, 255, 0.25);
5148
5160
  --bg-color: var(--bs-bg-base);
5149
- --border-color: var(--bs-border-dark);
5150
- border-right: 1px solid var(--bs-border-medium);
5161
+ --border-color: var(--bs-border-medium);
5151
5162
  }
5152
5163
  @media (min-width: 1166px) {
5153
5164
  .bs-vertical-nav {
5154
- border-right: 1px solid var(--bg-color);
5155
5165
  opacity: 1;
5156
5166
  padding-bottom: 1rem;
5157
5167
  padding-left: 0.5rem;
5158
5168
  padding-right: 0.5rem;
5159
5169
  padding-top: 1rem;
5160
5170
  right: auto;
5161
- transition: none;
5162
5171
  visibility: visible;
5163
5172
  width: var(--bs-vertical-nav-width);
5164
5173
  }
@@ -5166,10 +5175,58 @@ a.bs-text-button {
5166
5175
  .bs-vertical-nav:where([data-narrow="true"]) {
5167
5176
  width: var(--bs-vertical-nav-narrow-width);
5168
5177
  }
5178
+
5179
+ .bs-vertical-nav:where([data-collapsed="true"]) {
5180
+ width: var(--bs-vertical-nav-collapsed-width);
5181
+ }
5169
5182
  }
5170
5183
  .bs-vertical-nav::-webkit-scrollbar {
5171
5184
  display: none; /* Safari and Chrome */
5172
5185
  }
5186
+ /* ===== Collapse Toggle Button ===== */
5187
+ .bs-vertical-nav-toggle {
5188
+ align-items: center;
5189
+ background: var(--toggle-bg-color);
5190
+ border: 1px solid var(--border-color);
5191
+ border-radius: 100px;
5192
+ color: var(--toggle-color);
5193
+ cursor: pointer;
5194
+ display: none; /* Hidden by default on mobile */
5195
+ height: 24px;
5196
+ width: 24px;
5197
+ justify-content: center;
5198
+ padding: 0;
5199
+ position: fixed;
5200
+ left: calc(var(--bs-vertical-nav-width) - 0.5rem);
5201
+ pointer-events: auto; /* Ensure button is clickable */
5202
+ top: calc(var(--top-offset) + 3rem); /* top-offset + 3rem */
5203
+ transition: left 300ms ease-out, opacity 100ms ease-out;
5204
+ z-index: 1002; /* Above nav to prevent hover conflicts */
5205
+ }
5206
+ @media (min-width: 1166px) {
5207
+ .bs-vertical-nav-toggle {
5208
+ display: flex;
5209
+ opacity: 1;
5210
+ transition: left 300ms ease-out, opacity 100ms ease-out;
5211
+ }
5212
+
5213
+ .bs-vertical-nav-toggle:where([data-collapsed="true"]) {
5214
+ left: calc(var(--bs-vertical-nav-collapsed-width) - 0.5rem);
5215
+ }
5216
+
5217
+ /* Adjust position for narrow variant when NOT collapsed */
5218
+ .bs-vertical-nav-toggle:where([data-narrow="true"]:not([data-collapsed="true"])) {
5219
+ left: calc(var(--bs-vertical-nav-narrow-width) - 0.5rem);
5220
+ }
5221
+ }
5222
+ .bs-vertical-nav-toggle-icon {
5223
+ height: 8px;
5224
+ width: 8px;
5225
+ color: inherit;
5226
+ transition: transform 200ms var(--bs-transition-ease);
5227
+ will-change: transform;
5228
+ flex-shrink: 0;
5229
+ }
5173
5230
  /* ===== Sections ===== */
5174
5231
  .bs-vertical-nav :where(.bs-vertical-nav-section) {
5175
5232
  border-top: 2px solid var(--border-color);
@@ -5181,6 +5238,10 @@ a.bs-text-button {
5181
5238
  margin-top: 0.25rem;
5182
5239
  }
5183
5240
  }
5241
+ /* Divider-only sections have no additional padding since no toggle button */
5242
+ .bs-vertical-nav :where(.bs-vertical-nav-section[data-divider-only="true"]) {
5243
+ padding-top: 0.25rem;
5244
+ }
5184
5245
  /* Don't show border if the very first item is a section */
5185
5246
  .bs-vertical-nav :where(ul li:first-child) {
5186
5247
  border-top: none;
@@ -5249,54 +5310,64 @@ a.bs-text-button {
5249
5310
  .bs-vertical-nav :where(ul li a) {
5250
5311
  align-items: center;
5251
5312
  border-radius: 4px;
5252
- color: var(--bs-white);
5313
+ color: var(--link-color);
5253
5314
  cursor: pointer;
5254
5315
  display: flex;
5255
5316
  font-size: 1rem;
5256
5317
  font-weight: 400;
5257
5318
  gap: 0.5rem;
5258
5319
  height: 100%;
5259
- padding-bottom: 0.75rem;
5260
- padding-left: 0.75rem;
5261
- padding-right: 0.75rem;
5262
- padding-top: 0.75rem;
5320
+ padding: 0.5rem 0.75rem;
5321
+ position: relative;
5263
5322
  text-decoration: none;
5264
- width: 100%;
5323
+ }
5324
+ /* Narrow variant - text always visible on desktop (overrides collapsed state) */
5325
+ @media (min-width: 1166px) {
5326
+ .bs-vertical-nav:where([data-narrow="true"]) :where(ul li a > span:last-child) {
5327
+ opacity: 1;
5328
+ visibility: visible;
5329
+ width: auto;
5330
+ }
5265
5331
  }
5266
5332
  @media (min-width: 1166px) {
5267
5333
  .bs-vertical-nav :where(ul li a) {
5268
5334
  font-size: 0.875rem;
5269
- padding-bottom: 0.5rem;
5270
- padding-top: 0.5rem;
5335
+ min-height: 2.5rem; /* Fixed minimum height to prevent height changes */
5336
+ padding: 0.5rem 0.75rem; /* Explicit padding for consistency */
5271
5337
  /* nav width - nav left padding - nav right padding */
5272
5338
  width: calc(var(--bs-vertical-nav-width) - 0.5rem - 0.5rem);
5273
5339
  }
5274
5340
 
5341
+ /* Collapsed state width */
5342
+ .bs-vertical-nav:where([data-collapsed="true"]) :where(ul li a) {
5343
+ /* collapsed width - nav left padding - nav right padding */
5344
+ width: calc(var(--bs-vertical-nav-collapsed-width) - 0.5rem - 0.5rem);
5345
+ }
5346
+
5275
5347
  /* Text overflow - normal width - no icon */
5276
5348
  .bs-vertical-nav :where(ul li a:not(:has(.bs-vertical-nav-link-icon)) span:first-child) {
5277
5349
  overflow: hidden;
5278
5350
  text-overflow: ellipsis;
5351
+ white-space: nowrap;
5279
5352
  /* nav width - nav left padding - nav right padding - link left padding - link right padding */
5280
- width: calc(var(--bs-vertical-nav-width) - 0.5rem - 0.5rem - 0.75rem - 0.75rem);
5353
+ width: calc(var(--bs-vertical-nav-width) - 0.5rem - 0.5rem - 0.75rem - 0.75rem);
5281
5354
  }
5282
5355
 
5283
5356
  /* Text overflow - normal width - with icon */
5284
5357
  .bs-vertical-nav :where(ul li a:has(.bs-vertical-nav-link-icon) span:nth-child(2)) {
5285
5358
  overflow: hidden;
5286
5359
  text-overflow: ellipsis;
5360
+ white-space: nowrap;
5287
5361
  /* nav width - nav left padding - nav right padding - link left padding - link right padding - icon width - icon gap */
5288
- width: calc(var(--bs-vertical-nav-width) - 0.5rem - 0.5rem - 0.75rem - 0.75rem - 0.875rem - 0.5rem);
5362
+ width: calc(var(--bs-vertical-nav-width) - 0.5rem - 0.5rem - 0.75rem - 0.75rem - 1rem - 0.5rem);
5289
5363
  }
5290
5364
 
5291
5365
  .bs-vertical-nav:where([data-narrow="true"]) :where(ul li a) {
5292
5366
  flex-direction: column;
5293
5367
  font-size: 0.6875rem;
5294
- gap: 0.25rem;
5368
+ gap: 0.5rem; /* 8px - matches Figma */
5295
5369
  line-height: 1.3;
5296
- padding-bottom: 0.75rem;
5297
- padding-left: 0.25rem;
5298
- padding-right: 0.25rem;
5299
- padding-top: 0.75rem;
5370
+ padding: 0.5rem 0.75rem; /* 8px 12px - matches Figma */
5300
5371
  text-align: center;
5301
5372
  /* nav width - nav left padding - nav right padding */
5302
5373
  width: calc(var(--bs-vertical-nav-narrow-width) - 0.5rem - 0.5rem);
@@ -5307,32 +5378,118 @@ a.bs-text-button {
5307
5378
  .bs-vertical-nav:where([data-narrow="true"]) :where(ul li a:has(.bs-vertical-nav-link-icon) span:nth-child(2)) {
5308
5379
  overflow: hidden;
5309
5380
  text-overflow: ellipsis;
5381
+ white-space: nowrap;
5310
5382
  /* nav width - nav left padding - nav right padding - link left padding */
5311
5383
  width: calc(var(--bs-vertical-nav-narrow-width) - 0.5rem - 0.5rem);
5312
5384
  }
5313
5385
  }
5314
5386
  .bs-vertical-nav :where(ul li a:hover) {
5387
+ color: var(--link-hover-color);
5315
5388
  font-weight: 600;
5316
5389
  }
5317
5390
  .bs-vertical-nav :where(ul li a[data-active="true"]) {
5318
5391
  background-color: var(--active-color);
5392
+ color: var(--link-active-color);
5319
5393
  font-weight: 600;
5394
+ transition: background-color 200ms ease-out;
5320
5395
  }
5396
+ /* Icon sizing - mobile/default */
5321
5397
  .bs-vertical-nav :where(.bs-vertical-nav-link-icon) {
5322
5398
  height: 1rem;
5323
5399
  width: 1rem;
5400
+ flex-shrink: 0; /* Prevent icon from shrinking */
5324
5401
  }
5325
5402
  @media (min-width: 1166px) {
5326
- .bs-vertical-nav :where(.bs-vertical-nav-link-icon) {
5403
+ /* Wide and collapsible variant icons - 14px */
5404
+ .bs-vertical-nav:not([data-narrow="true"]) :where(.bs-vertical-nav-link-icon) {
5327
5405
  height: 0.875rem;
5328
5406
  width: 0.875rem;
5407
+ margin-left: 0.25rem; /* Visual centering adjustment */
5329
5408
  }
5330
5409
 
5410
+ /* Narrow variant icons - 16px (inherits from base) */
5331
5411
  .bs-vertical-nav:where([data-narrow="true"]) :where(.bs-vertical-nav-link-icon) {
5332
5412
  height: 1rem;
5333
5413
  width: 1rem;
5334
5414
  }
5335
5415
  }
5416
+ /* Default: Show text on mobile */
5417
+ .bs-vertical-nav :where(ul li a > span:last-child) {
5418
+ opacity: 1;
5419
+ visibility: visible;
5420
+ width: auto;
5421
+ }
5422
+ /* Desktop: Show text when NOT collapsed */
5423
+ @media (min-width: 1166px) {
5424
+ .bs-vertical-nav:not([data-collapsed="true"]) :where(ul li a > span:last-child) {
5425
+ opacity: 1;
5426
+ visibility: visible;
5427
+ width: auto;
5428
+ /* Immediate visibility when appropriate */
5429
+ transition: opacity 150ms ease, visibility 0ms linear;
5430
+ }
5431
+ }
5432
+ /* Desktop: Hide text when collapsed */
5433
+ @media (min-width: 1166px) {
5434
+ .bs-vertical-nav:where([data-collapsed="true"]) :where(ul li a > span:last-child) {
5435
+ opacity: 0;
5436
+ visibility: hidden;
5437
+ width: 0;
5438
+ overflow: hidden;
5439
+ white-space: nowrap;
5440
+ /* Delay visibility to prevent flash during breakpoint transition */
5441
+ transition: opacity 150ms ease, visibility 0ms linear 150ms;
5442
+ }
5443
+ }
5444
+ /* Keep icons visible when collapsed */
5445
+ .bs-vertical-nav:where([data-collapsed="true"]) :where(.bs-vertical-nav-link-icon) {
5446
+ display: block;
5447
+ }
5448
+ /* Hide section toggle when collapsed */
5449
+ .bs-vertical-nav:where([data-collapsed="true"]) :where(.bs-vertical-nav-section-toggle) {
5450
+ display: none;
5451
+ }
5452
+ /* ===== Hover Expansion (CSS-only) ===== */
5453
+ @media (min-width: 1166px) {
5454
+ /* Expand nav on hover when collapsed and collapsible - but NOT when hovering the toggle button */
5455
+ .bs-vertical-nav-wrapper:where(:hover:not(:has(.bs-vertical-nav-toggle:hover))) :where(.bs-vertical-nav[data-collapsed="true"][data-collapsible="true"]) {
5456
+ width: var(--bs-vertical-nav-width);
5457
+ }
5458
+
5459
+ /* Narrow variant should respect narrow width on hover */
5460
+ .bs-vertical-nav-wrapper:where(:hover:not(:has(.bs-vertical-nav-toggle:hover))) :where(.bs-vertical-nav[data-collapsed="true"][data-narrow="true"]) {
5461
+ width: var(--bs-vertical-nav-narrow-width);
5462
+ }
5463
+
5464
+ /* Expand link widths on hover when collapsed */
5465
+ .bs-vertical-nav-wrapper:where(:hover:not(:has(.bs-vertical-nav-toggle:hover))) :where(.bs-vertical-nav[data-collapsed="true"]) :where(ul li a) {
5466
+ width: calc(var(--bs-vertical-nav-width) - 0.5rem - 0.5rem);
5467
+ }
5468
+
5469
+ /* Narrow variant links should respect narrow width on hover */
5470
+ .bs-vertical-nav-wrapper:where(:hover:not(:has(.bs-vertical-nav-toggle:hover))) :where(.bs-vertical-nav[data-collapsed="true"][data-narrow="true"]) :where(ul li a) {
5471
+ width: calc(var(--bs-vertical-nav-narrow-width) - 0.5rem - 0.5rem);
5472
+ }
5473
+
5474
+ /* Show text on hover when collapsed */
5475
+ .bs-vertical-nav-wrapper:where(:hover:not(:has(.bs-vertical-nav-toggle:hover))) :where(.bs-vertical-nav[data-collapsed="true"]) :where(ul li a > span:last-child) {
5476
+ opacity: 1;
5477
+ visibility: visible;
5478
+ width: auto;
5479
+ overflow: visible;
5480
+ }
5481
+
5482
+ /* Hide toggle button on hover when collapsed - but NOT when hovering the button itself */
5483
+ .bs-vertical-nav-wrapper:where(:hover:not(:has(.bs-vertical-nav-toggle:hover))) :where(.bs-vertical-nav-toggle[data-collapsed="true"]) {
5484
+ opacity: 0;
5485
+ pointer-events: none; /* Prevent interaction when hidden */
5486
+ }
5487
+
5488
+ /* Show section toggles on hover when collapsed */
5489
+ .bs-vertical-nav-wrapper:where(:hover:not(:has(.bs-vertical-nav-toggle:hover))) :where(.bs-vertical-nav[data-collapsed="true"]) :where(.bs-vertical-nav-section-toggle) {
5490
+ display: flex;
5491
+ }
5492
+ }
5336
5493
  /* ===== End Items ===== */
5337
5494
  .bs-vertical-nav :where(.bs-vertical-nav-end-items) {
5338
5495
  display: flex;
@@ -5340,11 +5497,23 @@ a.bs-text-button {
5340
5497
  gap: 0.25rem;
5341
5498
  margin-top: auto;
5342
5499
  }
5500
+ /* End items visibility for collapsible variant (desktop only) */
5501
+ @media (min-width: 1166px) {
5502
+ /* Hide end items when collapsible variant is collapsed */
5503
+ .bs-vertical-nav:where([data-collapsible="true"][data-collapsed="true"]) :where(.bs-vertical-nav-end-items) {
5504
+ display: none;
5505
+ }
5506
+
5507
+ /* Show end items on hover when collapsible variant is collapsed */
5508
+ .bs-vertical-nav-wrapper:where(:hover:not(:has(.bs-vertical-nav-toggle:hover))) :where(.bs-vertical-nav[data-collapsible="true"][data-collapsed="true"]) :where(.bs-vertical-nav-end-items) {
5509
+ display: flex;
5510
+ }
5511
+ }
5343
5512
  .bs-vertical-nav :where(.bs-vertical-nav-end-items > *) {
5344
- color: var(--bs-white);
5513
+ color: var(--text-color);
5345
5514
  }
5346
5515
  .bs-vertical-nav :where(.bs-vertical-nav-end-items > *:not(button)) {
5347
- color: var(--bs-white);
5516
+ color: var(--text-color);
5348
5517
  padding-bottom: 0.5rem;
5349
5518
  padding-left: 0.75rem;
5350
5519
  padding-right: 0.75rem;
@@ -5361,9 +5530,16 @@ a.bs-text-button {
5361
5530
  margin-right: 0.75rem;
5362
5531
  margin-top: 0.5rem;
5363
5532
  }
5533
+ /* Hide end items in narrow variant (all screen sizes) */
5364
5534
  .bs-vertical-nav:where([data-narrow="true"]) :where(.bs-vertical-nav-end-items) {
5365
5535
  display: none;
5366
5536
  }
5537
+ /* ===== CSS-Only Page Layout Support ===== */
5538
+ /* Apply to any element that needs to adjust for navigation width (e.g., headers, main content) */
5539
+ .bs-header-with-nav {
5540
+ margin-inline-start: var(--bs-page-nav-width);
5541
+ transition: margin-inline-start 350ms cubic-bezier(0.4, 0, 0.2, 1);
5542
+ }
5367
5543
  /*
5368
5544
  POP SYSTEM COMPONENTS
5369
5545
  Components that are built on top of BsPopover. The popover.css must come first.