@webority/theme 0.9.13 → 0.9.15

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.
@@ -404,16 +404,18 @@
404
404
  // It sits above the element; for a collision-aware / richer tooltip, use AppTooltip /
405
405
  // <app-tooltip> instead.
406
406
  //
407
- // Two users, for different reasons:
408
- // - `.wui-icon-tip`, the wrapper the `tooltip` prop on AppIcon / <app-icon> puts around a
409
- // glyph (it adds the inline-flex layout below).
410
- // - <app-tabs> tab buttons, which CANNOT use a Bootstrap tooltip: the button already owns a
411
- // `bs.tab` instance and Bootstrap permits only one instance per element, so binding
412
- // `bs.Tooltip` to it logs "Bootstrap doesn't allow more than one instance per element"
413
- // and the tab instance is never registered.
407
+ // Sole remaining user: <app-tabs> tab buttons, which CANNOT use a Bootstrap tooltip — the button
408
+ // already owns a `bs.tab` instance and Bootstrap permits only one instance per element, so binding
409
+ // `bs.Tooltip` to it logs "Bootstrap doesn't allow more than one instance per element" and the tab
410
+ // instance is never registered. Everything else with a `tooltip` prop (AppIcon / <app-icon>
411
+ // included) now routes through the shared collision-aware AppTooltip / Bootstrap-tooltip (Popper)
412
+ // engine instead.
414
413
  [data-wui-tip] {
415
414
  position: relative;
416
415
  }
416
+ // The wrapper the `tooltip` prop on AppIcon / <app-icon> puts around a glyph — now just the
417
+ // inline-flex layout; the tooltip itself rides the shared Popper engine (Bootstrap-tooltip
418
+ // data-attributes on this span, AppTooltip on React), not the CSS bubble above.
417
419
  .wui-icon-tip {
418
420
  display: inline-flex;
419
421
  vertical-align: -0.125em;
@@ -424,7 +426,11 @@
424
426
  bottom: calc(100% + 8px);
425
427
  left: 50%;
426
428
  transform: translateX(-50%);
427
- z-index: var(--wui-z-menu, 1080);
429
+ // Sits on the dedicated tooltip rung — above menus/popovers/modals, below toasts — so it is
430
+ // never stacked under an overlay it is meant to annotate. This is a fixed-position CSS bubble
431
+ // (always above); for a collision-aware tooltip that flips to stay on-screen, use AppTooltip /
432
+ // <app-tooltip> (Popper), which AppActionIcon wraps for exactly that reason.
433
+ z-index: var(--wui-z-tooltip, 1650);
428
434
  width: max-content;
429
435
  max-width: 240px;
430
436
  padding: 7px 11px;
@@ -430,8 +430,16 @@
430
430
  // passwordRequirements) opens on focus. Rendered identically by React (a JSX <ul>) and Razor
431
431
  // (the same <ul> built in webority-ui.js), so both surfaces read the same. `.pw-popover` is the
432
432
  // custom class both put on Bootstrap's `.popover` panel.
433
+ // The card surface — header and body alike — is pure white, lifted off the page with the shared
434
+ // overlay shadow (the one ink menus/popovers/modals use; not a hand-rolled per-component shadow).
435
+ .pw-popover {
436
+ --bs-popover-bg: var(--wui-bg-light);
437
+ --bs-popover-header-bg: var(--wui-bg-light);
438
+ box-shadow: var(--wui-shadow-overlay);
439
+ }
433
440
  .pw-popover .popover-body {
434
- padding: 12px 14px;
441
+ padding: 14px 16px;
442
+ min-width: 232px;
435
443
  }
436
444
  .pw-criteria {
437
445
  list-style: none;
@@ -439,37 +447,45 @@
439
447
  padding: 0;
440
448
  display: flex;
441
449
  flex-direction: column;
442
- gap: 8px;
450
+ gap: 9px;
443
451
  }
444
452
  .pw-criteria .pw-rule {
445
453
  display: flex;
446
454
  align-items: center;
447
- gap: 8px;
455
+ gap: 9px;
448
456
  font-size: 13px;
449
- line-height: 1.3;
457
+ line-height: 1.35;
458
+ font-weight: 500;
459
+ transition: color 0.15s ease;
450
460
  }
451
- // The state mark is a baked-colour circled ✓/✕ — matched to the AA status ramp. The list TEXT
452
- // uses the -text token for contrast; the mark itself needs less and uses the vivid ramp value.
461
+ // The state mark is a single mask tinted by the rule's own text colour (`currentColor`), so it
462
+ // tracks the met/unmet colour automatically and stays theme-aware — no baked hex, no light/dark
463
+ // fork. An UNMET rule is a calm hollow circle (a pending step, not an error); it turns into a
464
+ // filled green check the moment the rule is satisfied. Red is deliberately NOT used for "not yet
465
+ // typed" — an empty field should read as a to-do list, not a wall of validation failures.
453
466
  .pw-criteria .pw-mark {
454
467
  flex: none;
455
- width: 18px;
456
- height: 18px;
457
- background: center / contain no-repeat;
468
+ width: 17px;
469
+ height: 17px;
470
+ background-color: currentColor;
471
+ -webkit-mask: center / contain no-repeat;
472
+ mask: center / contain no-repeat;
473
+ -webkit-mask-image: var(--pw-mark);
474
+ mask-image: var(--pw-mark);
475
+ transition: background-color 0.15s ease;
458
476
  }
459
477
  .pw-criteria .pw-rule-text {
460
478
  min-width: 0;
461
479
  }
462
- .pw-criteria .pw-rule.met {
463
- color: var(--color-success-text);
464
- }
465
- .pw-criteria .pw-rule.met .pw-mark {
466
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2317C653' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='m8 12 2.5 2.5 5.5-6'/%3E%3C/svg%3E");
467
- }
480
+ // Unmet: muted, low-emphasis — a hollow ring.
468
481
  .pw-criteria .pw-rule.unmet {
469
- color: var(--color-danger-text);
482
+ color: var(--color-text-subtle);
483
+ --pw-mark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8'%3E%3Ccircle cx='12' cy='12' r='8.25'/%3E%3C/svg%3E");
470
484
  }
471
- .pw-criteria .pw-rule.unmet .pw-mark {
472
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23F8285A' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='m9 9 6 6m0-6-6 6'/%3E%3C/svg%3E");
485
+ // Met: success-green — a filled circle with a knocked-out check.
486
+ .pw-criteria .pw-rule.met {
487
+ color: var(--color-success-text);
488
+ --pw-mark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm4.03-11.28a.9.9 0 0 0-1.32-1.22l-4.02 4.35-1.4-1.5a.9.9 0 1 0-1.32 1.22l2.06 2.22a.9.9 0 0 0 1.32 0l4.68-5.07Z' clip-rule='evenodd'/%3E%3C/svg%3E");
473
489
  }
474
490
  // The checklist opens with a PLAIN FADE only — no drop / zoom / scale. It opts out of the shared
475
491
  // menu-open motion (_menu-motion.scss animates every `.popover.show`) and lets Bootstrap's own