ngwr 12.2.0 → 13.0.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 (174) hide show
  1. package/README.md +11 -1
  2. package/border-glow/border-glow.scss +1 -1
  3. package/border-glow/styles/_index.scss +15 -233
  4. package/border-glow/styles/_rules.scss +228 -0
  5. package/breadcrumbs/breadcrumbs.scss +1 -1
  6. package/breadcrumbs/styles/_index.scss +15 -78
  7. package/breadcrumbs/styles/_rules.scss +84 -0
  8. package/card/card.scss +1 -1
  9. package/card/styles/_index.scss +15 -96
  10. package/card/styles/_rules.scss +96 -0
  11. package/cascader/cascader.scss +1 -1
  12. package/cascader/styles/_index.scss +15 -244
  13. package/cascader/styles/_rules.scss +261 -0
  14. package/checkbox/styles/_index.scss +7 -0
  15. package/circular-text/circular-text.scss +1 -1
  16. package/circular-text/styles/_index.scss +15 -63
  17. package/circular-text/styles/_rules.scss +58 -0
  18. package/color-picker/styles/_index.scss +8 -0
  19. package/drag-drop/sortable-list.scss +1 -1
  20. package/drag-drop/styles/_index.scss +14 -143
  21. package/drag-drop/styles/_rules.scss +151 -0
  22. package/falling-text/falling-text.scss +1 -1
  23. package/falling-text/styles/_index.scss +15 -36
  24. package/falling-text/styles/_rules.scss +31 -0
  25. package/fesm2022/ngwr-border-glow.mjs +2 -2
  26. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  27. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  28. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  29. package/fesm2022/ngwr-card.mjs +2 -2
  30. package/fesm2022/ngwr-card.mjs.map +1 -1
  31. package/fesm2022/ngwr-cascader.mjs +27 -9
  32. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  33. package/fesm2022/ngwr-checkbox.mjs +86 -8
  34. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  35. package/fesm2022/ngwr-circular-text.mjs +2 -2
  36. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  37. package/fesm2022/ngwr-color-picker.mjs +57 -7
  38. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  39. package/fesm2022/ngwr-date-picker.mjs +8 -0
  40. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  41. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  42. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  43. package/fesm2022/ngwr-falling-text.mjs +2 -2
  44. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  45. package/fesm2022/ngwr-file-upload.mjs +29 -8
  46. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  47. package/fesm2022/ngwr-form.mjs +48 -1
  48. package/fesm2022/ngwr-form.mjs.map +1 -1
  49. package/fesm2022/ngwr-glitch-text.mjs +2 -2
  50. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  51. package/fesm2022/ngwr-gradient-text.mjs +2 -2
  52. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  53. package/fesm2022/ngwr-input-otp.mjs +41 -3
  54. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  55. package/fesm2022/ngwr-knob.mjs +17 -2
  56. package/fesm2022/ngwr-knob.mjs.map +1 -1
  57. package/fesm2022/ngwr-lightbox.mjs +2 -2
  58. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  59. package/fesm2022/ngwr-list.mjs +2 -2
  60. package/fesm2022/ngwr-list.mjs.map +1 -1
  61. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  62. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  63. package/fesm2022/ngwr-marquee.mjs +2 -2
  64. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  65. package/fesm2022/ngwr-pagination.mjs +1 -1
  66. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  67. package/fesm2022/ngwr-radio.mjs +63 -8
  68. package/fesm2022/ngwr-radio.mjs.map +1 -1
  69. package/fesm2022/ngwr-rating.mjs +17 -2
  70. package/fesm2022/ngwr-rating.mjs.map +1 -1
  71. package/fesm2022/ngwr-segmented.mjs +22 -3
  72. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  73. package/fesm2022/ngwr-select.mjs +46 -12
  74. package/fesm2022/ngwr-select.mjs.map +1 -1
  75. package/fesm2022/ngwr-shiny-text.mjs +2 -2
  76. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  77. package/fesm2022/ngwr-slider.mjs +21 -6
  78. package/fesm2022/ngwr-slider.mjs.map +1 -1
  79. package/fesm2022/ngwr-spotlight-card.mjs +2 -2
  80. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  81. package/fesm2022/ngwr-star-border.mjs +2 -2
  82. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  83. package/fesm2022/ngwr-switch.mjs +44 -4
  84. package/fesm2022/ngwr-switch.mjs.map +1 -1
  85. package/fesm2022/ngwr-table.mjs +1 -1
  86. package/fesm2022/ngwr-table.mjs.map +1 -1
  87. package/fesm2022/ngwr-textarea.mjs +5 -2
  88. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  89. package/fesm2022/ngwr-theme.mjs +41 -1
  90. package/fesm2022/ngwr-theme.mjs.map +1 -1
  91. package/fesm2022/ngwr-tilt-card.mjs +2 -2
  92. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  93. package/fesm2022/ngwr-transfer.mjs +38 -6
  94. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  95. package/fesm2022/ngwr-tree.mjs +33 -7
  96. package/fesm2022/ngwr-tree.mjs.map +1 -1
  97. package/fesm2022/ngwr-typewriter.mjs +2 -2
  98. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  99. package/fesm2022/ngwr-version.mjs +1 -1
  100. package/fesm2022/ngwr-version.mjs.map +1 -1
  101. package/fesm2022/ngwr-virtual-scroll.mjs +2 -2
  102. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  103. package/fesm2022/ngwr-waves.mjs +2 -2
  104. package/fesm2022/ngwr-waves.mjs.map +1 -1
  105. package/file-upload/styles/_index.scss +6 -0
  106. package/glitch-text/glitch-text.scss +1 -1
  107. package/glitch-text/styles/_index.scss +14 -164
  108. package/glitch-text/styles/_rules.scss +160 -0
  109. package/gradient-text/gradient-text.scss +1 -1
  110. package/gradient-text/styles/_index.scss +15 -118
  111. package/gradient-text/styles/_rules.scss +113 -0
  112. package/input/styles/_index.scss +13 -0
  113. package/input-otp/styles/_index.scss +8 -0
  114. package/lightbox/lightbox.scss +1 -1
  115. package/lightbox/styles/_index.scss +15 -191
  116. package/lightbox/styles/_rules.scss +198 -0
  117. package/list/list.scss +1 -1
  118. package/list/styles/_index.scss +15 -101
  119. package/list/styles/_rules.scss +108 -0
  120. package/llms-full.txt +3 -3
  121. package/loading-bar/loading-bar.scss +1 -1
  122. package/loading-bar/styles/_index.scss +15 -33
  123. package/loading-bar/styles/_rules.scss +28 -0
  124. package/marquee/marquee.scss +1 -1
  125. package/marquee/styles/_index.scss +15 -155
  126. package/marquee/styles/_rules.scss +150 -0
  127. package/package.json +1 -1
  128. package/segmented/styles/_index.scss +8 -0
  129. package/select/styles/_index.scss +17 -1
  130. package/shiny-text/shiny-text.scss +1 -1
  131. package/shiny-text/styles/_index.scss +14 -105
  132. package/shiny-text/styles/_rules.scss +101 -0
  133. package/slider/styles/_index.scss +8 -0
  134. package/spotlight-card/spotlight-card.scss +1 -1
  135. package/spotlight-card/styles/_index.scss +15 -52
  136. package/spotlight-card/styles/_rules.scss +47 -0
  137. package/star-border/star-border.scss +1 -1
  138. package/star-border/styles/_index.scss +15 -125
  139. package/star-border/styles/_rules.scss +120 -0
  140. package/switch/styles/_index.scss +7 -0
  141. package/theme/styles/_dark.scss +81 -4
  142. package/theme/styles/_index.scss +1 -0
  143. package/theme/styles/_motion.scss +94 -0
  144. package/tilt-card/styles/_index.scss +15 -45
  145. package/tilt-card/styles/_rules.scss +40 -0
  146. package/tilt-card/tilt-card.scss +1 -1
  147. package/tree/styles/_index.scss +15 -1
  148. package/types/ngwr-cascader.d.ts +17 -1
  149. package/types/ngwr-checkbox.d.ts +51 -3
  150. package/types/ngwr-color-picker.d.ts +19 -1
  151. package/types/ngwr-file-upload.d.ts +18 -1
  152. package/types/ngwr-form.d.ts +51 -2
  153. package/types/ngwr-input-otp.d.ts +23 -1
  154. package/types/ngwr-knob.d.ts +14 -0
  155. package/types/ngwr-radio.d.ts +37 -2
  156. package/types/ngwr-rating.d.ts +14 -0
  157. package/types/ngwr-segmented.d.ts +18 -1
  158. package/types/ngwr-select.d.ts +17 -1
  159. package/types/ngwr-slider.d.ts +14 -1
  160. package/types/ngwr-switch.d.ts +26 -2
  161. package/types/ngwr-textarea.d.ts +3 -0
  162. package/types/ngwr-theme.d.ts +24 -0
  163. package/types/ngwr-transfer.d.ts +17 -1
  164. package/types/ngwr-tree.d.ts +21 -1
  165. package/types/ngwr-version.d.ts +1 -1
  166. package/typewriter/styles/_index.scss +15 -38
  167. package/typewriter/styles/_rules.scss +33 -0
  168. package/typewriter/typewriter.scss +1 -1
  169. package/virtual-scroll/styles/_index.scss +15 -32
  170. package/virtual-scroll/styles/_rules.scss +27 -0
  171. package/virtual-scroll/virtual-scroll.scss +1 -1
  172. package/waves/styles/_index.scss +15 -50
  173. package/waves/styles/_rules.scss +45 -0
  174. package/waves/waves.scss +1 -1
package/README.md CHANGED
@@ -162,6 +162,16 @@ Opt-in utilities (not part of `@use 'ngwr'`):
162
162
  `ngwr/typography-utilities` is the utility-class sheet — not `ngwr/typography`,
163
163
  which is the larger `wrTypography` component entry.
164
164
 
165
+ ### What you may style, and what may move
166
+
167
+ Components render with `ViewEncapsulation.None`, so their `.wr-*` BEM classes and
168
+ their `--wr-*` custom properties are reachable — and both are treated as public
169
+ API: renaming one is a breaking change carrying a migration note. The DOM *shape*
170
+ is not. Which element holds which class, how deeply they nest, whether a wrapper
171
+ exists — all of that may move in a minor. A rule keyed on one class survives; a
172
+ descendant selector that encodes a structure (`.wr-select__trigger > span > svg`)
173
+ does not. See [Theming](https://ngwr.dev/guides/theming) for the full statement.
174
+
165
175
  ## Quick start
166
176
 
167
177
  ```ts
@@ -260,7 +270,7 @@ Plus [icon](https://ngwr.dev/reference/components/icon), the experimental [squir
260
270
 
261
271
  ### Animations
262
272
 
263
- Animated UI effects. Mix of in-house components + ports of [reactbits.dev](https://www.reactbits.dev) — each port carries a credit chip on its docs page. Defaults are theme-aware (light + dark), and every component honors `prefers-reduced-motion` — the one exception is `spotlight-card`, whose highlight only tracks the pointer.
273
+ Animated UI effects. Mix of in-house components + ports of [reactbits.dev](https://www.reactbits.dev) — each port carries a credit chip on its docs page. Defaults are theme-aware (light + dark), and every component in **this section** honors `prefers-reduced-motion` — the one exception is `spotlight-card`, whose highlight only tracks the pointer. The scope of that sentence is the thing to read carefully: it says nothing about the rest of the catalog, and until v13 it was inviting a reader to over-generalise. The always-on chrome — the spinner and skeleton that animate on essentially every page, plus the enter animations on dialog, drawer, dropdown, popconfirm, toast, lightbox and the responsive bottom sheet — had no guard at all. It has one now, in the theme layer (`theme/styles/_motion.scss`) rather than per component, so the set is reviewable in one place.
264
274
 
265
275
  [aurora](https://ngwr.dev/animations/aurora), [blur-text](https://ngwr.dev/animations/blur-text), [border-glow](https://ngwr.dev/animations/border-glow), [circular-text](https://ngwr.dev/animations/circular-text), [click-spark](https://ngwr.dev/animations/click-spark), [confetti](https://ngwr.dev/animations/confetti), [decrypt-text](https://ngwr.dev/animations/decrypt-text), [falling-text](https://ngwr.dev/animations/falling-text), [fuzzy-text](https://ngwr.dev/animations/fuzzy-text), [glitch-text](https://ngwr.dev/animations/glitch-text), [gradient-text](https://ngwr.dev/animations/gradient-text), [marquee](https://ngwr.dev/animations/marquee), [rotating-text](https://ngwr.dev/animations/rotating-text), [shiny-text](https://ngwr.dev/animations/shiny-text), [splash-cursor](https://ngwr.dev/animations/splash-cursor), [split-text](https://ngwr.dev/animations/split-text), [spotlight-card](https://ngwr.dev/animations/spotlight-card), [star-border](https://ngwr.dev/animations/star-border), [tilt-card](https://ngwr.dev/animations/tilt-card), [typewriter](https://ngwr.dev/animations/typewriter), [waves](https://ngwr.dev/animations/waves).
266
276
 
@@ -1,4 +1,4 @@
1
1
  // Component-scoped, but the lib uses `ViewEncapsulation.None` everywhere so
2
2
  // the selector starts with `.wr-border-glow` — the same as the umbrella
3
3
  // stylesheet entry. Importing the lib styles or just this file works.
4
- @forward './styles';
4
+ @forward './styles/rules';
@@ -1,233 +1,15 @@
1
- // Pull the whole theme so a standalone `@use 'ngwr/<name>'` brings in every
2
- // design token this stylesheet references. Sass deduplicates `@use` per
3
- // compilation, so the umbrella sheet still emits the theme only once.
4
- @use '../../theme/styles' as theme;
5
-
6
- // Cursor-tracked border glow — ports the reactbits.dev BorderGlow effect.
7
- // All visual state is driven by two custom properties the component writes:
8
- // --wr-border-glow-edge-proximity 0..100, scales with pointer-to-edge distance
9
- // --wr-border-glow-angle 0deg..360deg, pointer-from-centre angle
10
- // Plus a colour/geometry bag set once from inputs (see border-glow.ts).
11
-
12
- .wr-border-glow {
13
- --wr-border-glow-edge-proximity: 0;
14
- --wr-border-glow-angle: 45deg;
15
- // Theme-default halo (overridden inline when `[glowColor]` is set):
16
- // deep amber that reads on white. Dark theme swaps to the pale pastel.
17
- --wr-border-glow-color: hsl(40deg 90% 45% / 100%);
18
- --wr-border-glow-color-60: hsl(40deg 90% 45% / 60%);
19
- --wr-border-glow-color-50: hsl(40deg 90% 45% / 50%);
20
- --wr-border-glow-color-40: hsl(40deg 90% 45% / 40%);
21
- --wr-border-glow-color-30: hsl(40deg 90% 45% / 30%);
22
- --wr-border-glow-color-20: hsl(40deg 90% 45% / 20%);
23
- --wr-border-glow-color-10: hsl(40deg 90% 45% / 10%);
24
- // Theme-default mesh palette (overridden inline when `[colors]` is set):
25
- // deep tones that read on white. Dark theme restores the pastels below.
26
- --wr-border-glow-gradient-one: radial-gradient(at 80% 55%, hsl(268deg 80% 50%) 0px, transparent 50%);
27
- --wr-border-glow-gradient-two: radial-gradient(at 69% 34%, hsl(349deg 85% 52%) 0px, transparent 50%);
28
- --wr-border-glow-gradient-three: radial-gradient(at 8% 6%, hsl(136deg 70% 38%) 0px, transparent 50%);
29
- --wr-border-glow-gradient-four: radial-gradient(at 41% 38%, hsl(192deg 90% 40%) 0px, transparent 50%);
30
- --wr-border-glow-gradient-five: radial-gradient(at 86% 85%, hsl(186deg 90% 38%) 0px, transparent 50%);
31
- --wr-border-glow-gradient-six: radial-gradient(at 82% 18%, hsl(40deg 95% 45%) 0px, transparent 50%);
32
- --wr-border-glow-gradient-seven: radial-gradient(at 51% 4%, hsl(12deg 90% 50%) 0px, transparent 50%);
33
- --wr-border-glow-gradient-base: linear-gradient(hsl(262deg 70% 50%) 0 100%);
34
- --wr-border-glow-edge-sensitivity: 30;
35
- --wr-border-glow-color-sensitivity: calc(var(--wr-border-glow-edge-sensitivity) + 20);
36
- --wr-border-glow-radius: 28px;
37
- --wr-border-glow-padding: 40px;
38
- --wr-border-glow-cone-spread: 25;
39
-
40
- position: relative;
41
- display: grid;
42
- border-radius: var(--wr-border-glow-radius);
43
- background: var(--wr-border-glow-bg, var(--wr-color-surface, #fff));
44
- overflow: visible;
45
- isolation: isolate;
46
- transform: translate3d(0, 0, 0.01px); // create a new layer to keep blends tidy
47
- // The faint static outline uses `box-shadow inset` instead of `border:` —
48
- // CSS borders + `border-radius` leave 1px subpixel notches at the corners
49
- // where the mask layers meet the curve, but inset shadows hug the radius
50
- // pixel-perfect.
51
- box-shadow: inset 0 0 0 1px var(--wr-border-glow-outline, var(--wr-color-outline, rgb(255 255 255 / 15%)));
52
-
53
- &::before,
54
- &::after,
55
- & > .wr-border-glow__edge {
56
- content: '';
57
- position: absolute;
58
- inset: 0;
59
- border-radius: inherit;
60
- transition: opacity 0.25s ease-out;
61
- z-index: -1;
62
- }
63
-
64
- // Hide the glow layers when the cursor isn't engaged AND the one-shot
65
- // sweep isn't running.
66
- &:not(:hover):not(.wr-border-glow--sweeping) {
67
- &::before,
68
- &::after,
69
- & > .wr-border-glow__edge {
70
- opacity: 0;
71
- transition: opacity 0.75s ease-in-out;
72
- }
73
- }
74
-
75
- // Coloured mesh-gradient slice of the border (the visible "cone" along
76
- // the perimeter under the cursor).
77
- &::before {
78
- border: 1px solid transparent;
79
- background:
80
- linear-gradient(var(--wr-border-glow-bg, var(--wr-color-surface, #fff)) 0 100%) padding-box,
81
- linear-gradient(rgb(255 255 255 / 0%) 0 100%) border-box,
82
- var(--wr-border-glow-gradient-one, radial-gradient(at 80% 55%, hsl(268deg 100% 76%) 0px, transparent 50%))
83
- border-box,
84
- var(--wr-border-glow-gradient-two, radial-gradient(at 69% 34%, hsl(349deg 100% 74%) 0px, transparent 50%))
85
- border-box,
86
- var(--wr-border-glow-gradient-three, radial-gradient(at 8% 6%, hsl(136deg 100% 78%) 0px, transparent 50%))
87
- border-box,
88
- var(--wr-border-glow-gradient-four, radial-gradient(at 41% 38%, hsl(192deg 100% 64%) 0px, transparent 50%))
89
- border-box,
90
- var(--wr-border-glow-gradient-five, radial-gradient(at 86% 85%, hsl(186deg 100% 74%) 0px, transparent 50%))
91
- border-box,
92
- var(--wr-border-glow-gradient-six, radial-gradient(at 82% 18%, hsl(52deg 100% 65%) 0px, transparent 50%))
93
- border-box,
94
- var(--wr-border-glow-gradient-seven, radial-gradient(at 51% 4%, hsl(12deg 100% 72%) 0px, transparent 50%))
95
- border-box,
96
- var(--wr-border-glow-gradient-base, linear-gradient(#c299ff 0 100%)) border-box;
97
-
98
- opacity: calc(
99
- (var(--wr-border-glow-edge-proximity) - var(--wr-border-glow-color-sensitivity)) /
100
- (100 - var(--wr-border-glow-color-sensitivity))
101
- );
102
-
103
- mask-image: conic-gradient(
104
- from var(--wr-border-glow-angle) at center,
105
- black calc(var(--wr-border-glow-cone-spread) * 1%),
106
- transparent calc((var(--wr-border-glow-cone-spread) + 15) * 1%),
107
- transparent calc((100 - var(--wr-border-glow-cone-spread) - 15) * 1%),
108
- black calc((100 - var(--wr-border-glow-cone-spread)) * 1%)
109
- );
110
- }
111
-
112
- // Soft interior bloom — same mesh, blended with the card content.
113
- &::after {
114
- border: 1px solid transparent;
115
- background:
116
- var(--wr-border-glow-gradient-one, radial-gradient(at 80% 55%, hsl(268deg 100% 76%) 0px, transparent 50%))
117
- padding-box,
118
- var(--wr-border-glow-gradient-two, radial-gradient(at 69% 34%, hsl(349deg 100% 74%) 0px, transparent 50%))
119
- padding-box,
120
- var(--wr-border-glow-gradient-three, radial-gradient(at 8% 6%, hsl(136deg 100% 78%) 0px, transparent 50%))
121
- padding-box,
122
- var(--wr-border-glow-gradient-four, radial-gradient(at 41% 38%, hsl(192deg 100% 64%) 0px, transparent 50%))
123
- padding-box,
124
- var(--wr-border-glow-gradient-five, radial-gradient(at 86% 85%, hsl(186deg 100% 74%) 0px, transparent 50%))
125
- padding-box,
126
- var(--wr-border-glow-gradient-six, radial-gradient(at 82% 18%, hsl(52deg 100% 65%) 0px, transparent 50%))
127
- padding-box,
128
- var(--wr-border-glow-gradient-seven, radial-gradient(at 51% 4%, hsl(12deg 100% 72%) 0px, transparent 50%))
129
- padding-box,
130
- var(--wr-border-glow-gradient-base, linear-gradient(#c299ff 0 100%)) padding-box;
131
-
132
- mask-image:
133
- linear-gradient(to bottom, black, black), radial-gradient(ellipse at 50% 50%, black 40%, transparent 65%),
134
- radial-gradient(ellipse at 66% 66%, black 5%, transparent 40%),
135
- radial-gradient(ellipse at 33% 33%, black 5%, transparent 40%),
136
- radial-gradient(ellipse at 66% 33%, black 5%, transparent 40%),
137
- radial-gradient(ellipse at 33% 66%, black 5%, transparent 40%),
138
- conic-gradient(from var(--wr-border-glow-angle) at center, transparent 5%, black 15%, black 85%, transparent 95%);
139
- mask-composite: subtract, add, add, add, add, add;
140
-
141
- // `--wr-border-glow-fill-scale` keeps the interior bloom subtle on
142
- // light surfaces — at full strength the multiply wash darkens the
143
- // whole card and the cone's surface wedge shows against it.
144
- opacity: calc(
145
- var(--wr-border-glow-fill-opacity, 0.5) * var(--wr-border-glow-fill-scale, 0.25) *
146
- (var(--wr-border-glow-edge-proximity) - var(--wr-border-glow-color-sensitivity)) /
147
- (100 - var(--wr-border-glow-color-sensitivity))
148
- );
149
- mix-blend-mode: var(--wr-border-glow-fill-blend, multiply);
150
- }
151
-
152
- // Outer halo — stacked box-shadows on a separate child so we can mask
153
- // the shadows to the cone without affecting the host's content.
154
- & > .wr-border-glow__edge {
155
- inset: calc(var(--wr-border-glow-padding) * -1);
156
- pointer-events: none;
157
- z-index: 1;
158
-
159
- mask-image: conic-gradient(
160
- from var(--wr-border-glow-angle) at center,
161
- black 2.5%,
162
- transparent 10%,
163
- transparent 90%,
164
- black 97.5%
165
- );
166
- opacity: calc(
167
- (var(--wr-border-glow-edge-proximity) - var(--wr-border-glow-edge-sensitivity)) /
168
- (100 - var(--wr-border-glow-edge-sensitivity))
169
- );
170
- // `plus-lighter` saturates to white on a light page — light theme
171
- // paints the halo as plain colored shadows instead (see block below).
172
- mix-blend-mode: var(--wr-border-glow-halo-blend, normal);
173
-
174
- &::before {
175
- content: '';
176
- position: absolute;
177
- inset: var(--wr-border-glow-padding);
178
- border-radius: inherit;
179
- // Light theme keeps only the outward halo — the inset half washes
180
- // amber over the card interior without additive blending. Dark
181
- // restores the full reactbits stack (see block below).
182
- box-shadow: var(
183
- --wr-border-glow-edge-shadow,
184
- inset 0 0 0 1px var(--wr-border-glow-color, hsl(40deg 80% 80% / 100%)),
185
- 0 0 1px 0 var(--wr-border-glow-color-60, hsl(40deg 80% 80% / 60%)),
186
- 0 0 3px 0 var(--wr-border-glow-color-50, hsl(40deg 80% 80% / 50%)),
187
- 0 0 6px 0 var(--wr-border-glow-color-40, hsl(40deg 80% 80% / 40%)),
188
- 0 0 15px 0 var(--wr-border-glow-color-30, hsl(40deg 80% 80% / 30%)),
189
- 0 0 25px 2px var(--wr-border-glow-color-20, hsl(40deg 80% 80% / 20%)),
190
- 0 0 50px 2px var(--wr-border-glow-color-10, hsl(40deg 80% 80% / 10%))
191
- );
192
- }
193
- }
194
-
195
- &__inner {
196
- position: relative;
197
- z-index: 1;
198
- display: flex;
199
- flex-direction: column;
200
- }
201
- }
202
-
203
- // Dark theme: restore the reactbits look — pale halo + additive blends.
204
- [data-theme='dark'] .wr-border-glow {
205
- --wr-border-glow-outline: rgb(255 255 255 / 15%);
206
- --wr-border-glow-halo-blend: plus-lighter;
207
- --wr-border-glow-fill-blend: soft-light;
208
- --wr-border-glow-fill-scale: 1;
209
- /* stylelint-disable-next-line */
210
- --wr-border-glow-edge-shadow:
211
- inset 0 0 0 1px var(--wr-border-glow-color), inset 0 0 1px 0 var(--wr-border-glow-color-60),
212
- inset 0 0 3px 0 var(--wr-border-glow-color-50), inset 0 0 6px 0 var(--wr-border-glow-color-40),
213
- inset 0 0 15px 0 var(--wr-border-glow-color-30), inset 0 0 25px 2px var(--wr-border-glow-color-20),
214
- inset 0 0 50px 2px var(--wr-border-glow-color-10), 0 0 1px 0 var(--wr-border-glow-color-60),
215
- 0 0 3px 0 var(--wr-border-glow-color-50), 0 0 6px 0 var(--wr-border-glow-color-40),
216
- 0 0 15px 0 var(--wr-border-glow-color-30), 0 0 25px 2px var(--wr-border-glow-color-20),
217
- 0 0 50px 2px var(--wr-border-glow-color-10);
218
- --wr-border-glow-color: hsl(40deg 80% 80% / 100%);
219
- --wr-border-glow-color-60: hsl(40deg 80% 80% / 60%);
220
- --wr-border-glow-color-50: hsl(40deg 80% 80% / 50%);
221
- --wr-border-glow-color-40: hsl(40deg 80% 80% / 40%);
222
- --wr-border-glow-color-30: hsl(40deg 80% 80% / 30%);
223
- --wr-border-glow-color-20: hsl(40deg 80% 80% / 20%);
224
- --wr-border-glow-color-10: hsl(40deg 80% 80% / 10%);
225
- --wr-border-glow-gradient-one: radial-gradient(at 80% 55%, hsl(268deg 100% 76%) 0px, transparent 50%);
226
- --wr-border-glow-gradient-two: radial-gradient(at 69% 34%, hsl(349deg 100% 74%) 0px, transparent 50%);
227
- --wr-border-glow-gradient-three: radial-gradient(at 8% 6%, hsl(136deg 100% 78%) 0px, transparent 50%);
228
- --wr-border-glow-gradient-four: radial-gradient(at 41% 38%, hsl(192deg 100% 64%) 0px, transparent 50%);
229
- --wr-border-glow-gradient-five: radial-gradient(at 86% 85%, hsl(186deg 100% 74%) 0px, transparent 50%);
230
- --wr-border-glow-gradient-six: radial-gradient(at 82% 18%, hsl(52deg 100% 65%) 0px, transparent 50%);
231
- --wr-border-glow-gradient-seven: radial-gradient(at 51% 4%, hsl(12deg 100% 72%) 0px, transparent 50%);
232
- --wr-border-glow-gradient-base: linear-gradient(#c299ff 0 100%);
233
- }
1
+ // Public Sass entry for `@use 'ngwr/border-glow'`.
2
+ //
3
+ // Pulls the whole theme so a standalone import still brings in every design
4
+ // token these rules reference, then loads the rules themselves from `_rules`.
5
+ //
6
+ // The split is what keeps the token layer out of the JavaScript bundle.
7
+ // `border-glow.scss` is the component's `styleUrl`, and a component stylesheet is
8
+ // its OWN Sass compilation — `@use` only deduplicates within one. So while the
9
+ // umbrella sheet emits the theme once, forwarding it from here would inline a
10
+ // second, byte-identical copy of `:root`, `[data-theme='dark']` and the
11
+ // box-sizing reset into the compiled component styles, which ng-packagr then
12
+ // embeds in the FESM bundle as a string. `border-glow.scss` forwards `_rules`
13
+ // instead, so it carries this component's own CSS and nothing else.
14
+ @use '../../theme/styles';
15
+ @forward 'rules';
@@ -0,0 +1,228 @@
1
+ // Cursor-tracked border glow — ports the reactbits.dev BorderGlow effect.
2
+ // All visual state is driven by two custom properties the component writes:
3
+ // --wr-border-glow-edge-proximity 0..100, scales with pointer-to-edge distance
4
+ // --wr-border-glow-angle 0deg..360deg, pointer-from-centre angle
5
+ // Plus a colour/geometry bag set once from inputs (see border-glow.ts).
6
+
7
+ .wr-border-glow {
8
+ --wr-border-glow-edge-proximity: 0;
9
+ --wr-border-glow-angle: 45deg;
10
+ // Theme-default halo (overridden inline when `[glowColor]` is set):
11
+ // deep amber that reads on white. Dark theme swaps to the pale pastel.
12
+ --wr-border-glow-color: hsl(40deg 90% 45% / 100%);
13
+ --wr-border-glow-color-60: hsl(40deg 90% 45% / 60%);
14
+ --wr-border-glow-color-50: hsl(40deg 90% 45% / 50%);
15
+ --wr-border-glow-color-40: hsl(40deg 90% 45% / 40%);
16
+ --wr-border-glow-color-30: hsl(40deg 90% 45% / 30%);
17
+ --wr-border-glow-color-20: hsl(40deg 90% 45% / 20%);
18
+ --wr-border-glow-color-10: hsl(40deg 90% 45% / 10%);
19
+ // Theme-default mesh palette (overridden inline when `[colors]` is set):
20
+ // deep tones that read on white. Dark theme restores the pastels below.
21
+ --wr-border-glow-gradient-one: radial-gradient(at 80% 55%, hsl(268deg 80% 50%) 0px, transparent 50%);
22
+ --wr-border-glow-gradient-two: radial-gradient(at 69% 34%, hsl(349deg 85% 52%) 0px, transparent 50%);
23
+ --wr-border-glow-gradient-three: radial-gradient(at 8% 6%, hsl(136deg 70% 38%) 0px, transparent 50%);
24
+ --wr-border-glow-gradient-four: radial-gradient(at 41% 38%, hsl(192deg 90% 40%) 0px, transparent 50%);
25
+ --wr-border-glow-gradient-five: radial-gradient(at 86% 85%, hsl(186deg 90% 38%) 0px, transparent 50%);
26
+ --wr-border-glow-gradient-six: radial-gradient(at 82% 18%, hsl(40deg 95% 45%) 0px, transparent 50%);
27
+ --wr-border-glow-gradient-seven: radial-gradient(at 51% 4%, hsl(12deg 90% 50%) 0px, transparent 50%);
28
+ --wr-border-glow-gradient-base: linear-gradient(hsl(262deg 70% 50%) 0 100%);
29
+ --wr-border-glow-edge-sensitivity: 30;
30
+ --wr-border-glow-color-sensitivity: calc(var(--wr-border-glow-edge-sensitivity) + 20);
31
+ --wr-border-glow-radius: 28px;
32
+ --wr-border-glow-padding: 40px;
33
+ --wr-border-glow-cone-spread: 25;
34
+
35
+ position: relative;
36
+ display: grid;
37
+ border-radius: var(--wr-border-glow-radius);
38
+ background: var(--wr-border-glow-bg, var(--wr-color-surface, #fff));
39
+ overflow: visible;
40
+ isolation: isolate;
41
+ transform: translate3d(0, 0, 0.01px); // create a new layer to keep blends tidy
42
+ // The faint static outline uses `box-shadow inset` instead of `border:` —
43
+ // CSS borders + `border-radius` leave 1px subpixel notches at the corners
44
+ // where the mask layers meet the curve, but inset shadows hug the radius
45
+ // pixel-perfect.
46
+ box-shadow: inset 0 0 0 1px var(--wr-border-glow-outline, var(--wr-color-outline, rgb(255 255 255 / 15%)));
47
+
48
+ &::before,
49
+ &::after,
50
+ & > .wr-border-glow__edge {
51
+ content: '';
52
+ position: absolute;
53
+ inset: 0;
54
+ border-radius: inherit;
55
+ transition: opacity 0.25s ease-out;
56
+ z-index: -1;
57
+ }
58
+
59
+ // Hide the glow layers when the cursor isn't engaged AND the one-shot
60
+ // sweep isn't running.
61
+ &:not(:hover):not(.wr-border-glow--sweeping) {
62
+ &::before,
63
+ &::after,
64
+ & > .wr-border-glow__edge {
65
+ opacity: 0;
66
+ transition: opacity 0.75s ease-in-out;
67
+ }
68
+ }
69
+
70
+ // Coloured mesh-gradient slice of the border (the visible "cone" along
71
+ // the perimeter under the cursor).
72
+ &::before {
73
+ border: 1px solid transparent;
74
+ background:
75
+ linear-gradient(var(--wr-border-glow-bg, var(--wr-color-surface, #fff)) 0 100%) padding-box,
76
+ linear-gradient(rgb(255 255 255 / 0%) 0 100%) border-box,
77
+ var(--wr-border-glow-gradient-one, radial-gradient(at 80% 55%, hsl(268deg 100% 76%) 0px, transparent 50%))
78
+ border-box,
79
+ var(--wr-border-glow-gradient-two, radial-gradient(at 69% 34%, hsl(349deg 100% 74%) 0px, transparent 50%))
80
+ border-box,
81
+ var(--wr-border-glow-gradient-three, radial-gradient(at 8% 6%, hsl(136deg 100% 78%) 0px, transparent 50%))
82
+ border-box,
83
+ var(--wr-border-glow-gradient-four, radial-gradient(at 41% 38%, hsl(192deg 100% 64%) 0px, transparent 50%))
84
+ border-box,
85
+ var(--wr-border-glow-gradient-five, radial-gradient(at 86% 85%, hsl(186deg 100% 74%) 0px, transparent 50%))
86
+ border-box,
87
+ var(--wr-border-glow-gradient-six, radial-gradient(at 82% 18%, hsl(52deg 100% 65%) 0px, transparent 50%))
88
+ border-box,
89
+ var(--wr-border-glow-gradient-seven, radial-gradient(at 51% 4%, hsl(12deg 100% 72%) 0px, transparent 50%))
90
+ border-box,
91
+ var(--wr-border-glow-gradient-base, linear-gradient(#c299ff 0 100%)) border-box;
92
+
93
+ opacity: calc(
94
+ (var(--wr-border-glow-edge-proximity) - var(--wr-border-glow-color-sensitivity)) /
95
+ (100 - var(--wr-border-glow-color-sensitivity))
96
+ );
97
+
98
+ mask-image: conic-gradient(
99
+ from var(--wr-border-glow-angle) at center,
100
+ black calc(var(--wr-border-glow-cone-spread) * 1%),
101
+ transparent calc((var(--wr-border-glow-cone-spread) + 15) * 1%),
102
+ transparent calc((100 - var(--wr-border-glow-cone-spread) - 15) * 1%),
103
+ black calc((100 - var(--wr-border-glow-cone-spread)) * 1%)
104
+ );
105
+ }
106
+
107
+ // Soft interior bloom — same mesh, blended with the card content.
108
+ &::after {
109
+ border: 1px solid transparent;
110
+ background:
111
+ var(--wr-border-glow-gradient-one, radial-gradient(at 80% 55%, hsl(268deg 100% 76%) 0px, transparent 50%))
112
+ padding-box,
113
+ var(--wr-border-glow-gradient-two, radial-gradient(at 69% 34%, hsl(349deg 100% 74%) 0px, transparent 50%))
114
+ padding-box,
115
+ var(--wr-border-glow-gradient-three, radial-gradient(at 8% 6%, hsl(136deg 100% 78%) 0px, transparent 50%))
116
+ padding-box,
117
+ var(--wr-border-glow-gradient-four, radial-gradient(at 41% 38%, hsl(192deg 100% 64%) 0px, transparent 50%))
118
+ padding-box,
119
+ var(--wr-border-glow-gradient-five, radial-gradient(at 86% 85%, hsl(186deg 100% 74%) 0px, transparent 50%))
120
+ padding-box,
121
+ var(--wr-border-glow-gradient-six, radial-gradient(at 82% 18%, hsl(52deg 100% 65%) 0px, transparent 50%))
122
+ padding-box,
123
+ var(--wr-border-glow-gradient-seven, radial-gradient(at 51% 4%, hsl(12deg 100% 72%) 0px, transparent 50%))
124
+ padding-box,
125
+ var(--wr-border-glow-gradient-base, linear-gradient(#c299ff 0 100%)) padding-box;
126
+
127
+ mask-image:
128
+ linear-gradient(to bottom, black, black), radial-gradient(ellipse at 50% 50%, black 40%, transparent 65%),
129
+ radial-gradient(ellipse at 66% 66%, black 5%, transparent 40%),
130
+ radial-gradient(ellipse at 33% 33%, black 5%, transparent 40%),
131
+ radial-gradient(ellipse at 66% 33%, black 5%, transparent 40%),
132
+ radial-gradient(ellipse at 33% 66%, black 5%, transparent 40%),
133
+ conic-gradient(from var(--wr-border-glow-angle) at center, transparent 5%, black 15%, black 85%, transparent 95%);
134
+ mask-composite: subtract, add, add, add, add, add;
135
+
136
+ // `--wr-border-glow-fill-scale` keeps the interior bloom subtle on
137
+ // light surfaces — at full strength the multiply wash darkens the
138
+ // whole card and the cone's surface wedge shows against it.
139
+ opacity: calc(
140
+ var(--wr-border-glow-fill-opacity, 0.5) * var(--wr-border-glow-fill-scale, 0.25) *
141
+ (var(--wr-border-glow-edge-proximity) - var(--wr-border-glow-color-sensitivity)) /
142
+ (100 - var(--wr-border-glow-color-sensitivity))
143
+ );
144
+ mix-blend-mode: var(--wr-border-glow-fill-blend, multiply);
145
+ }
146
+
147
+ // Outer halo — stacked box-shadows on a separate child so we can mask
148
+ // the shadows to the cone without affecting the host's content.
149
+ & > .wr-border-glow__edge {
150
+ inset: calc(var(--wr-border-glow-padding) * -1);
151
+ pointer-events: none;
152
+ z-index: 1;
153
+
154
+ mask-image: conic-gradient(
155
+ from var(--wr-border-glow-angle) at center,
156
+ black 2.5%,
157
+ transparent 10%,
158
+ transparent 90%,
159
+ black 97.5%
160
+ );
161
+ opacity: calc(
162
+ (var(--wr-border-glow-edge-proximity) - var(--wr-border-glow-edge-sensitivity)) /
163
+ (100 - var(--wr-border-glow-edge-sensitivity))
164
+ );
165
+ // `plus-lighter` saturates to white on a light page — light theme
166
+ // paints the halo as plain colored shadows instead (see block below).
167
+ mix-blend-mode: var(--wr-border-glow-halo-blend, normal);
168
+
169
+ &::before {
170
+ content: '';
171
+ position: absolute;
172
+ inset: var(--wr-border-glow-padding);
173
+ border-radius: inherit;
174
+ // Light theme keeps only the outward halo — the inset half washes
175
+ // amber over the card interior without additive blending. Dark
176
+ // restores the full reactbits stack (see block below).
177
+ box-shadow: var(
178
+ --wr-border-glow-edge-shadow,
179
+ inset 0 0 0 1px var(--wr-border-glow-color, hsl(40deg 80% 80% / 100%)),
180
+ 0 0 1px 0 var(--wr-border-glow-color-60, hsl(40deg 80% 80% / 60%)),
181
+ 0 0 3px 0 var(--wr-border-glow-color-50, hsl(40deg 80% 80% / 50%)),
182
+ 0 0 6px 0 var(--wr-border-glow-color-40, hsl(40deg 80% 80% / 40%)),
183
+ 0 0 15px 0 var(--wr-border-glow-color-30, hsl(40deg 80% 80% / 30%)),
184
+ 0 0 25px 2px var(--wr-border-glow-color-20, hsl(40deg 80% 80% / 20%)),
185
+ 0 0 50px 2px var(--wr-border-glow-color-10, hsl(40deg 80% 80% / 10%))
186
+ );
187
+ }
188
+ }
189
+
190
+ &__inner {
191
+ position: relative;
192
+ z-index: 1;
193
+ display: flex;
194
+ flex-direction: column;
195
+ }
196
+ }
197
+
198
+ // Dark theme: restore the reactbits look — pale halo + additive blends.
199
+ [data-theme='dark'] .wr-border-glow {
200
+ --wr-border-glow-outline: rgb(255 255 255 / 15%);
201
+ --wr-border-glow-halo-blend: plus-lighter;
202
+ --wr-border-glow-fill-blend: soft-light;
203
+ --wr-border-glow-fill-scale: 1;
204
+ /* stylelint-disable-next-line */
205
+ --wr-border-glow-edge-shadow:
206
+ inset 0 0 0 1px var(--wr-border-glow-color), inset 0 0 1px 0 var(--wr-border-glow-color-60),
207
+ inset 0 0 3px 0 var(--wr-border-glow-color-50), inset 0 0 6px 0 var(--wr-border-glow-color-40),
208
+ inset 0 0 15px 0 var(--wr-border-glow-color-30), inset 0 0 25px 2px var(--wr-border-glow-color-20),
209
+ inset 0 0 50px 2px var(--wr-border-glow-color-10), 0 0 1px 0 var(--wr-border-glow-color-60),
210
+ 0 0 3px 0 var(--wr-border-glow-color-50), 0 0 6px 0 var(--wr-border-glow-color-40),
211
+ 0 0 15px 0 var(--wr-border-glow-color-30), 0 0 25px 2px var(--wr-border-glow-color-20),
212
+ 0 0 50px 2px var(--wr-border-glow-color-10);
213
+ --wr-border-glow-color: hsl(40deg 80% 80% / 100%);
214
+ --wr-border-glow-color-60: hsl(40deg 80% 80% / 60%);
215
+ --wr-border-glow-color-50: hsl(40deg 80% 80% / 50%);
216
+ --wr-border-glow-color-40: hsl(40deg 80% 80% / 40%);
217
+ --wr-border-glow-color-30: hsl(40deg 80% 80% / 30%);
218
+ --wr-border-glow-color-20: hsl(40deg 80% 80% / 20%);
219
+ --wr-border-glow-color-10: hsl(40deg 80% 80% / 10%);
220
+ --wr-border-glow-gradient-one: radial-gradient(at 80% 55%, hsl(268deg 100% 76%) 0px, transparent 50%);
221
+ --wr-border-glow-gradient-two: radial-gradient(at 69% 34%, hsl(349deg 100% 74%) 0px, transparent 50%);
222
+ --wr-border-glow-gradient-three: radial-gradient(at 8% 6%, hsl(136deg 100% 78%) 0px, transparent 50%);
223
+ --wr-border-glow-gradient-four: radial-gradient(at 41% 38%, hsl(192deg 100% 64%) 0px, transparent 50%);
224
+ --wr-border-glow-gradient-five: radial-gradient(at 86% 85%, hsl(186deg 100% 74%) 0px, transparent 50%);
225
+ --wr-border-glow-gradient-six: radial-gradient(at 82% 18%, hsl(52deg 100% 65%) 0px, transparent 50%);
226
+ --wr-border-glow-gradient-seven: radial-gradient(at 51% 4%, hsl(12deg 100% 72%) 0px, transparent 50%);
227
+ --wr-border-glow-gradient-base: linear-gradient(#c299ff 0 100%);
228
+ }
@@ -1 +1 @@
1
- @forward './styles';
1
+ @forward './styles/rules';
@@ -1,78 +1,15 @@
1
- // Breadcrumbs. The separator glyph comes from `--wr-breadcrumbs-separator`
2
- // (set by the component from the `[separator]` input). All items except
3
- // the first prepend the glyph via a `::before` pseudo-element.
4
-
5
- @use '../../theme/styles' as theme;
6
-
7
- .wr-breadcrumbs {
8
- --wr-breadcrumbs-separator: '/';
9
- --wr-breadcrumbs-gap: 0.5rem;
10
- --wr-breadcrumbs-color: rgba(var(--wr-color-on-surface-rgb), 0.6);
11
- --wr-breadcrumbs-current-color: var(--wr-color-on-surface);
12
- --wr-breadcrumbs-link-color: var(--wr-color-primary-ink);
13
- --wr-breadcrumbs-separator-color: rgba(var(--wr-color-on-surface-rgb), 0.3);
14
-
15
- display: block;
16
- font-family: var(--wr-font-family-base);
17
- font-size: var(--wr-text-sm);
18
- color: var(--wr-breadcrumbs-color);
19
-
20
- &__nav {
21
- display: block;
22
- }
23
-
24
- &__list {
25
- display: flex;
26
- flex-wrap: wrap;
27
- align-items: center;
28
- gap: var(--wr-breadcrumbs-gap);
29
- margin: 0;
30
- padding: 0;
31
- list-style: none;
32
- }
33
-
34
- &__item {
35
- display: inline-flex;
36
- align-items: center;
37
- gap: var(--wr-breadcrumbs-gap);
38
-
39
- // Separator before every item except the first.
40
- &:not(:first-child)::before {
41
- content: var(--wr-breadcrumbs-separator);
42
- color: var(--wr-breadcrumbs-separator-color);
43
- user-select: none;
44
- }
45
- }
46
-
47
- &__link {
48
- display: inline-flex;
49
- align-items: center;
50
- gap: 0.375rem;
51
- color: var(--wr-breadcrumbs-link-color);
52
- text-decoration: none;
53
- border-radius: var(--wr-border-radius-sm);
54
- transition: color 0.15s ease;
55
-
56
- &:hover {
57
- text-decoration: underline;
58
- }
59
-
60
- &:focus-visible {
61
- @include theme.focus-ring;
62
- outline-offset: 2px;
63
- }
64
- }
65
-
66
- &__current {
67
- display: inline-flex;
68
- align-items: center;
69
- gap: 0.375rem;
70
- color: var(--wr-breadcrumbs-current-color);
71
- font-weight: 600;
72
- }
73
-
74
- &__icon {
75
- --wr-icon-size: 1rem;
76
- flex: 0 0 auto;
77
- }
78
- }
1
+ // Public Sass entry for `@use 'ngwr/breadcrumbs'`.
2
+ //
3
+ // Pulls the whole theme so a standalone import still brings in every design
4
+ // token these rules reference, then loads the rules themselves from `_rules`.
5
+ //
6
+ // The split is what keeps the token layer out of the JavaScript bundle.
7
+ // `breadcrumbs.scss` is the component's `styleUrl`, and a component stylesheet is
8
+ // its OWN Sass compilation — `@use` only deduplicates within one. So while the
9
+ // umbrella sheet emits the theme once, forwarding it from here would inline a
10
+ // second, byte-identical copy of `:root`, `[data-theme='dark']` and the
11
+ // box-sizing reset into the compiled component styles, which ng-packagr then
12
+ // embeds in the FESM bundle as a string. `breadcrumbs.scss` forwards `_rules`
13
+ // instead, so it carries this component's own CSS and nothing else.
14
+ @use '../../theme/styles';
15
+ @forward 'rules';