@webority/theme 0.16.0 → 0.17.1

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": "@webority/theme",
3
- "version": "0.16.0",
3
+ "version": "0.17.1",
4
4
  "description": "Webority shared design system — Bootstrap 5.3 SCSS overrides, --wui-* tokens, and shared component CSS. The single source of brand chrome for React portals and Razor sites.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {
@@ -188,7 +188,9 @@
188
188
  background-size: 12px 12px;
189
189
  }
190
190
 
191
- // Switch — pill track + sliding knob (Bootstrap .form-switch only).
191
+ // Switch: pill track + sliding knob (Bootstrap .form-switch only). The default track has
192
+ // truly circular ends: the switch is a type="checkbox", which carries the checkbox's
193
+ // `corner-shape: squircle`, so it is reset to `round` here.
192
194
  .form-switch {
193
195
  padding-left: 0;
194
196
  }
@@ -196,6 +198,7 @@
196
198
  width: 40px;
197
199
  height: 22px;
198
200
  border-radius: 999px;
201
+ corner-shape: round;
199
202
  border-color: transparent;
200
203
  background-color: var(--color-border-strong);
201
204
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Ccircle cx='10' cy='10' r='7' fill='white'/%3E%3C/svg%3E");
@@ -227,10 +230,6 @@
227
230
  .form-switch-circle .form-check-input {
228
231
  width: 24px;
229
232
  height: 24px;
230
- // The switch is a type="checkbox", which carries `corner-shape: squircle` — on a square
231
- // that renders a rounded square, not a circle. Reset to a true round corner.
232
- corner-shape: round;
233
- border-radius: 999px;
234
233
  background-position: center;
235
234
  background-size: 10px 10px;
236
235
  }
@@ -238,13 +237,11 @@
238
237
  background-position: center;
239
238
  }
240
239
 
241
- // Rounded-pill variant (shape="round") — the same sliding pill, but with truly circular
242
- // ends. The switch is a type=checkbox, so it inherits the checkbox's default
243
- // `corner-shape: squircle`, which superellipses the pill's ends; reset it to `round` for
244
- // the fully semicircular track in the reference. Only the corner shape changes — size,
245
- // knob and slide are the base pill's.
246
- .form-switch-round .form-check-input {
247
- corner-shape: round;
240
+ // Squircle-pill variant (shape="pill"): the same sliding pill with superellipse ends, the
241
+ // checkbox's own corner shape. Only the corner shape changes; size, knob and slide are the
242
+ // base switch's.
243
+ .form-switch-pill .form-check-input {
244
+ corner-shape: squircle;
248
245
  }
249
246
  @media (prefers-reduced-motion: reduce) {
250
247
  .form-check-input,
@@ -550,8 +550,8 @@ a.info-row:hover .info-value {
550
550
  }
551
551
  // Borderless (bordered={false} / bordered="false") — the selected pill keeps its tint and primary
552
552
  // label but drops the ring, on both the sliding thumb and the no-JS per-option pill.
553
- .segmented-borderless .segmented-thumb,
554
- .segmented-borderless .segmented-option:has(.segmented-input:checked) {
553
+ .wui-segmented-borderless .segmented-thumb,
554
+ .wui-segmented-borderless .segmented-option:has(.segmented-input:checked) {
555
555
  box-shadow: none;
556
556
  }
557
557
  // Icon pop — the selected segment's glyph springs up a touch as it becomes active.
@@ -561,7 +561,7 @@ a.info-row:hover .info-value {
561
561
  }
562
562
  .segmented-sm .segmented-thumb,
563
563
  .segmented-lg .segmented-thumb,
564
- .segmented-xl .segmented-thumb {
564
+ .wui-segmented-xl .segmented-thumb {
565
565
  top: 3px;
566
566
  bottom: 3px;
567
567
  }
@@ -574,7 +574,7 @@ a.info-row:hover .info-value {
574
574
  --segmented-icon: 15px;
575
575
  --segmented-note: 11px;
576
576
  }
577
- .segmented-xl {
577
+ .wui-segmented-xl {
578
578
  --segmented-option-h: 36px;
579
579
  --segmented-icon: 17px;
580
580
  --segmented-note: 12px;
@@ -588,7 +588,7 @@ a.info-row:hover .info-value {
588
588
  padding: 4px 16px;
589
589
  font-size: 13px;
590
590
  }
591
- .segmented-xl .segmented-option {
591
+ .wui-segmented-xl .segmented-option {
592
592
  gap: 7px;
593
593
  padding: 4px 20px;
594
594
  font-size: 15px;
@@ -9,17 +9,26 @@
9
9
  // AppSidebarMenu — react-bootstrap Offcanvas mapped onto the app tokens plus
10
10
  // a flex column layout for the header / scrolling body / sticky footer.
11
11
  .app-sidebar-menu.offcanvas {
12
- --bs-offcanvas-width: var(--asm-width, 420px);
12
+ // Phone first: a side panel fills the screen, because a 420px panel on a 430px phone leaves a
13
+ // sliver of page that reads as a rendering fault. From sm up it takes its own width (below).
14
+ --bs-offcanvas-width: 100vw;
13
15
  --bs-offcanvas-bg: var(--color-surface);
14
16
  --bs-offcanvas-color: var(--color-text);
15
17
  --bs-offcanvas-border-color: var(--color-border);
16
18
  --bs-offcanvas-border-width: 1px;
17
19
  --bs-offcanvas-padding-x: 0;
18
20
  --bs-offcanvas-padding-y: 0;
19
- max-width: var(--asm-max-width, 92vw);
21
+ // A caller's own maxWidth still caps the panel on a phone.
22
+ max-width: var(--asm-max-width, 100vw);
20
23
  display: flex;
21
24
  flex-direction: column;
22
25
  }
26
+ @include media-breakpoint-up(sm) {
27
+ .app-sidebar-menu.offcanvas {
28
+ --bs-offcanvas-width: var(--asm-width, 420px);
29
+ max-width: var(--asm-max-width, 92vw);
30
+ }
31
+ }
23
32
  .app-sidebar-menu .offcanvas-body {
24
33
  // Inset the content to the same 20px gutter as the header/footer so plain body
25
34
  // content doesn't stick to the panel edge. Full-bleed content (edge-to-edge nav
@@ -249,7 +249,11 @@
249
249
  // hover, so dismissing reads as the destructive-ish gesture it is. The corner is
250
250
  // fixed across states: only the tint animates, so the button never morphs into a
251
251
  // circle. Slower on the way in than the way out.
252
- .wui-modal-close {
252
+ //
253
+ // The drawer (AppSidebarMenu) header close shares the rule, so the two overlays dismiss with
254
+ // the same control.
255
+ .wui-modal-close,
256
+ .wui-drawer-close {
253
257
  margin-left: auto;
254
258
  display: grid;
255
259
  place-items: center;
@@ -268,20 +272,24 @@
268
272
  background 180ms cubic-bezier(0.4, 0, 0.2, 1),
269
273
  color 180ms cubic-bezier(0.4, 0, 0.2, 1);
270
274
  }
271
- .wui-modal-close:hover {
275
+ .wui-modal-close:hover,
276
+ .wui-drawer-close:hover {
272
277
  background: var(--color-danger-soft);
273
278
  color: var(--color-danger-text);
274
279
  transition:
275
280
  background 280ms cubic-bezier(0.16, 1, 0.3, 1),
276
281
  color 280ms cubic-bezier(0.16, 1, 0.3, 1);
277
282
  }
278
- .wui-modal-close:focus-visible {
283
+ .wui-modal-close:focus-visible,
284
+ .wui-drawer-close:focus-visible {
279
285
  outline: 2px solid var(--color-primary);
280
286
  outline-offset: 2px;
281
287
  }
282
288
  @media (prefers-reduced-motion: reduce) {
283
289
  .wui-modal-close,
284
- .wui-modal-close:hover {
290
+ .wui-modal-close:hover,
291
+ .wui-drawer-close,
292
+ .wui-drawer-close:hover {
285
293
  transition:
286
294
  background 1ms linear,
287
295
  color 1ms linear;