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

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