ngwr 12.2.0 → 13.0.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.
Files changed (208) 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 +14 -5
  26. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  27. package/fesm2022/ngwr-breadcrumbs.mjs +15 -4
  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-context-menu.mjs +6 -2
  40. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  41. package/fesm2022/ngwr-date-picker.mjs +8 -0
  42. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  43. package/fesm2022/ngwr-dialog.mjs +22 -16
  44. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  45. package/fesm2022/ngwr-directives.mjs +5 -2
  46. package/fesm2022/ngwr-directives.mjs.map +1 -1
  47. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  48. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  49. package/fesm2022/ngwr-drawer.mjs +24 -18
  50. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  51. package/fesm2022/ngwr-dropdown.mjs +6 -2
  52. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  53. package/fesm2022/ngwr-falling-text.mjs +2 -2
  54. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  55. package/fesm2022/ngwr-file-upload.mjs +29 -8
  56. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  57. package/fesm2022/ngwr-form.mjs +48 -1
  58. package/fesm2022/ngwr-form.mjs.map +1 -1
  59. package/fesm2022/ngwr-fuzzy-text.mjs +21 -4
  60. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  61. package/fesm2022/ngwr-glitch-text.mjs +2 -2
  62. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  63. package/fesm2022/ngwr-gradient-text.mjs +11 -4
  64. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  65. package/fesm2022/ngwr-icon-adapters-feather.mjs +11 -0
  66. package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -1
  67. package/fesm2022/ngwr-icon-adapters-lucide.mjs +22 -2
  68. package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -1
  69. package/fesm2022/ngwr-icon.mjs +474 -37
  70. package/fesm2022/ngwr-icon.mjs.map +1 -1
  71. package/fesm2022/ngwr-input-otp.mjs +41 -3
  72. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  73. package/fesm2022/ngwr-knob.mjs +17 -2
  74. package/fesm2022/ngwr-knob.mjs.map +1 -1
  75. package/fesm2022/ngwr-lightbox.mjs +2 -2
  76. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  77. package/fesm2022/ngwr-list.mjs +2 -2
  78. package/fesm2022/ngwr-list.mjs.map +1 -1
  79. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  80. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  81. package/fesm2022/ngwr-markdown.mjs +63 -11
  82. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  83. package/fesm2022/ngwr-marquee.mjs +2 -2
  84. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  85. package/fesm2022/ngwr-overlay.mjs +36 -7
  86. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  87. package/fesm2022/ngwr-pagination.mjs +1 -1
  88. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  89. package/fesm2022/ngwr-qr.mjs +38 -1
  90. package/fesm2022/ngwr-qr.mjs.map +1 -1
  91. package/fesm2022/ngwr-radio.mjs +63 -8
  92. package/fesm2022/ngwr-radio.mjs.map +1 -1
  93. package/fesm2022/ngwr-rating.mjs +17 -2
  94. package/fesm2022/ngwr-rating.mjs.map +1 -1
  95. package/fesm2022/ngwr-segmented.mjs +22 -3
  96. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  97. package/fesm2022/ngwr-select.mjs +46 -12
  98. package/fesm2022/ngwr-select.mjs.map +1 -1
  99. package/fesm2022/ngwr-shiny-text.mjs +12 -5
  100. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  101. package/fesm2022/ngwr-slider.mjs +21 -6
  102. package/fesm2022/ngwr-slider.mjs.map +1 -1
  103. package/fesm2022/ngwr-spotlight-card.mjs +2 -2
  104. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  105. package/fesm2022/ngwr-star-border.mjs +2 -2
  106. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  107. package/fesm2022/ngwr-switch.mjs +44 -4
  108. package/fesm2022/ngwr-switch.mjs.map +1 -1
  109. package/fesm2022/ngwr-table.mjs +1 -1
  110. package/fesm2022/ngwr-table.mjs.map +1 -1
  111. package/fesm2022/ngwr-tabs.mjs +6 -2
  112. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  113. package/fesm2022/ngwr-textarea.mjs +5 -2
  114. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  115. package/fesm2022/ngwr-theme.mjs +41 -1
  116. package/fesm2022/ngwr-theme.mjs.map +1 -1
  117. package/fesm2022/ngwr-tilt-card.mjs +2 -2
  118. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  119. package/fesm2022/ngwr-transfer.mjs +38 -6
  120. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  121. package/fesm2022/ngwr-tree.mjs +33 -7
  122. package/fesm2022/ngwr-tree.mjs.map +1 -1
  123. package/fesm2022/ngwr-typewriter.mjs +2 -2
  124. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  125. package/fesm2022/ngwr-utils.mjs +107 -1
  126. package/fesm2022/ngwr-utils.mjs.map +1 -1
  127. package/fesm2022/ngwr-version.mjs +1 -1
  128. package/fesm2022/ngwr-version.mjs.map +1 -1
  129. package/fesm2022/ngwr-virtual-scroll.mjs +2 -2
  130. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  131. package/fesm2022/ngwr-waves.mjs +2 -2
  132. package/fesm2022/ngwr-waves.mjs.map +1 -1
  133. package/file-upload/styles/_index.scss +6 -0
  134. package/glitch-text/glitch-text.scss +1 -1
  135. package/glitch-text/styles/_index.scss +14 -164
  136. package/glitch-text/styles/_rules.scss +160 -0
  137. package/gradient-text/gradient-text.scss +1 -1
  138. package/gradient-text/styles/_index.scss +15 -118
  139. package/gradient-text/styles/_rules.scss +113 -0
  140. package/input/styles/_index.scss +13 -0
  141. package/input-otp/styles/_index.scss +8 -0
  142. package/lightbox/lightbox.scss +1 -1
  143. package/lightbox/styles/_index.scss +15 -191
  144. package/lightbox/styles/_rules.scss +198 -0
  145. package/list/list.scss +1 -1
  146. package/list/styles/_index.scss +15 -101
  147. package/list/styles/_rules.scss +108 -0
  148. package/llms-full.txt +4 -4
  149. package/loading-bar/loading-bar.scss +1 -1
  150. package/loading-bar/styles/_index.scss +15 -33
  151. package/loading-bar/styles/_rules.scss +28 -0
  152. package/marquee/marquee.scss +1 -1
  153. package/marquee/styles/_index.scss +15 -155
  154. package/marquee/styles/_rules.scss +150 -0
  155. package/package.json +3 -3
  156. package/segmented/styles/_index.scss +8 -0
  157. package/select/styles/_index.scss +17 -1
  158. package/shiny-text/shiny-text.scss +1 -1
  159. package/shiny-text/styles/_index.scss +14 -105
  160. package/shiny-text/styles/_rules.scss +101 -0
  161. package/slider/styles/_index.scss +8 -0
  162. package/spotlight-card/spotlight-card.scss +1 -1
  163. package/spotlight-card/styles/_index.scss +15 -52
  164. package/spotlight-card/styles/_rules.scss +47 -0
  165. package/star-border/star-border.scss +1 -1
  166. package/star-border/styles/_index.scss +15 -125
  167. package/star-border/styles/_rules.scss +120 -0
  168. package/switch/styles/_index.scss +7 -0
  169. package/theme/styles/_dark.scss +81 -4
  170. package/theme/styles/_index.scss +1 -0
  171. package/theme/styles/_motion.scss +94 -0
  172. package/tilt-card/styles/_index.scss +15 -45
  173. package/tilt-card/styles/_rules.scss +40 -0
  174. package/tilt-card/tilt-card.scss +1 -1
  175. package/tree/styles/_index.scss +15 -1
  176. package/types/ngwr-breadcrumbs.d.ts +1 -0
  177. package/types/ngwr-cascader.d.ts +17 -1
  178. package/types/ngwr-checkbox.d.ts +51 -3
  179. package/types/ngwr-color-picker.d.ts +19 -1
  180. package/types/ngwr-file-upload.d.ts +18 -1
  181. package/types/ngwr-form.d.ts +51 -2
  182. package/types/ngwr-fuzzy-text.d.ts +5 -0
  183. package/types/ngwr-icon-adapters-feather.d.ts +11 -0
  184. package/types/ngwr-icon.d.ts +42 -1
  185. package/types/ngwr-input-otp.d.ts +23 -1
  186. package/types/ngwr-knob.d.ts +14 -0
  187. package/types/ngwr-radio.d.ts +37 -2
  188. package/types/ngwr-rating.d.ts +14 -0
  189. package/types/ngwr-segmented.d.ts +18 -1
  190. package/types/ngwr-select.d.ts +17 -1
  191. package/types/ngwr-shiny-text.d.ts +1 -0
  192. package/types/ngwr-slider.d.ts +14 -1
  193. package/types/ngwr-switch.d.ts +26 -2
  194. package/types/ngwr-textarea.d.ts +3 -0
  195. package/types/ngwr-theme.d.ts +24 -0
  196. package/types/ngwr-transfer.d.ts +17 -1
  197. package/types/ngwr-tree.d.ts +21 -1
  198. package/types/ngwr-utils.d.ts +47 -1
  199. package/types/ngwr-version.d.ts +1 -1
  200. package/typewriter/styles/_index.scss +15 -38
  201. package/typewriter/styles/_rules.scss +33 -0
  202. package/typewriter/typewriter.scss +1 -1
  203. package/virtual-scroll/styles/_index.scss +15 -32
  204. package/virtual-scroll/styles/_rules.scss +27 -0
  205. package/virtual-scroll/virtual-scroll.scss +1 -1
  206. package/waves/styles/_index.scss +15 -50
  207. package/waves/styles/_rules.scss +45 -0
  208. package/waves/waves.scss +1 -1
@@ -0,0 +1,84 @@
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
+ // `focus` is the one theme partial these rules still load that emits CSS of its
6
+ // own — the shared ring mixin lives in the same file as the baseline
7
+ // `.wr-*:focus-visible` rules, and there is no mixin-only module to take it from.
8
+ // That is ~4 KB of rules identical to the global sheet's, against the ~24 KB token
9
+ // layer the split removes, and it is the honest trade: hand-rolling the three
10
+ // declarations here is what the shared mixin exists to prevent.
11
+ @use '../../theme/styles/focus';
12
+
13
+ .wr-breadcrumbs {
14
+ --wr-breadcrumbs-separator: '/';
15
+ --wr-breadcrumbs-gap: 0.5rem;
16
+ --wr-breadcrumbs-color: rgba(var(--wr-color-on-surface-rgb), 0.6);
17
+ --wr-breadcrumbs-current-color: var(--wr-color-on-surface);
18
+ --wr-breadcrumbs-link-color: var(--wr-color-primary-ink);
19
+ --wr-breadcrumbs-separator-color: rgba(var(--wr-color-on-surface-rgb), 0.3);
20
+
21
+ display: block;
22
+ font-family: var(--wr-font-family-base);
23
+ font-size: var(--wr-text-sm);
24
+ color: var(--wr-breadcrumbs-color);
25
+
26
+ &__nav {
27
+ display: block;
28
+ }
29
+
30
+ &__list {
31
+ display: flex;
32
+ flex-wrap: wrap;
33
+ align-items: center;
34
+ gap: var(--wr-breadcrumbs-gap);
35
+ margin: 0;
36
+ padding: 0;
37
+ list-style: none;
38
+ }
39
+
40
+ &__item {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ gap: var(--wr-breadcrumbs-gap);
44
+
45
+ // Separator before every item except the first.
46
+ &:not(:first-child)::before {
47
+ content: var(--wr-breadcrumbs-separator);
48
+ color: var(--wr-breadcrumbs-separator-color);
49
+ user-select: none;
50
+ }
51
+ }
52
+
53
+ &__link {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ gap: 0.375rem;
57
+ color: var(--wr-breadcrumbs-link-color);
58
+ text-decoration: none;
59
+ border-radius: var(--wr-border-radius-sm);
60
+ transition: color 0.15s ease;
61
+
62
+ &:hover {
63
+ text-decoration: underline;
64
+ }
65
+
66
+ &:focus-visible {
67
+ @include focus.focus-ring;
68
+ outline-offset: 2px;
69
+ }
70
+ }
71
+
72
+ &__current {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ gap: 0.375rem;
76
+ color: var(--wr-breadcrumbs-current-color);
77
+ font-weight: 600;
78
+ }
79
+
80
+ &__icon {
81
+ --wr-icon-size: 1rem;
82
+ flex: 0 0 auto;
83
+ }
84
+ }
package/card/card.scss CHANGED
@@ -1 +1 @@
1
- @forward './styles';
1
+ @forward './styles/rules';
@@ -1,96 +1,15 @@
1
- @use '../../theme/styles' as theme;
2
-
3
- .wr-card {
4
- --wr-card-bg: var(--wr-color-surface);
5
- --wr-card-color: var(--wr-color-on-surface);
6
- --wr-card-border: var(--wr-color-outline);
7
- --wr-card-radius: var(--wr-border-radius-base);
8
- --wr-card-padding-y: 1rem;
9
- --wr-card-padding-x: 1.25rem;
10
- --wr-card-shadow: var(--wr-shadow-xs);
11
- --wr-card-shadow-hover: var(--wr-shadow-overlay);
12
-
13
- position: relative;
14
- display: flex;
15
- flex-direction: column;
16
- background: var(--wr-card-bg);
17
- color: var(--wr-card-color);
18
- @include theme.smooth-br(var(--wr-card-radius));
19
- box-shadow: var(--wr-card-shadow);
20
- font-family: var(--wr-font-family-base);
21
- transition:
22
- box-shadow var(--wr-transition-base),
23
- transform var(--wr-transition-base);
24
-
25
- &--bordered {
26
- border: 1px solid var(--wr-card-border);
27
- }
28
-
29
- &--hoverable {
30
- cursor: pointer;
31
-
32
- &:hover {
33
- box-shadow: var(--wr-card-shadow-hover);
34
- transform: translateY(-1px);
35
- }
36
- }
37
-
38
- &--compact {
39
- --wr-card-padding-y: 0.5rem;
40
- --wr-card-padding-x: 0.75rem;
41
- }
42
-
43
- &--loading &__body {
44
- opacity: 0.6;
45
- }
46
-
47
- &__header {
48
- display: flex;
49
- align-items: center;
50
- justify-content: space-between;
51
- gap: 0.5rem;
52
- padding: var(--wr-card-padding-y) var(--wr-card-padding-x);
53
- border-bottom: 1px solid var(--wr-card-border);
54
- font-weight: 500;
55
- }
56
-
57
- &__body {
58
- flex: 1 1 auto;
59
- padding: var(--wr-card-padding-y) var(--wr-card-padding-x);
60
- }
61
-
62
- &__footer {
63
- display: flex;
64
- align-items: center;
65
- justify-content: flex-end;
66
- gap: 0.5rem;
67
- padding: var(--wr-card-padding-y) var(--wr-card-padding-x);
68
- border-top: 1px solid var(--wr-card-border);
69
- }
70
-
71
- &__loading {
72
- position: absolute;
73
- inset: 0;
74
- display: flex;
75
- align-items: center;
76
- justify-content: center;
77
- @include theme.smooth-br(var(--wr-card-radius));
78
- background: rgba(var(--wr-color-surface-rgb), 0.5);
79
- pointer-events: none;
80
- }
81
-
82
- &__spinner {
83
- width: 1.5rem;
84
- height: 1.5rem;
85
- border: 2px solid rgb(var(--wr-color-on-surface-muted-rgb) / 30%);
86
- border-top-color: var(--wr-color-primary);
87
- border-radius: 50%;
88
- animation: wr-card-spin 0.7s linear infinite;
89
- }
90
- }
91
-
92
- @keyframes wr-card-spin {
93
- to {
94
- transform: rotate(360deg);
95
- }
96
- }
1
+ // Public Sass entry for `@use 'ngwr/card'`.
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
+ // `card.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. `card.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,96 @@
1
+ @use '../../theme/styles/mixins' as theme;
2
+
3
+ .wr-card {
4
+ --wr-card-bg: var(--wr-color-surface);
5
+ --wr-card-color: var(--wr-color-on-surface);
6
+ --wr-card-border: var(--wr-color-outline);
7
+ --wr-card-radius: var(--wr-border-radius-base);
8
+ --wr-card-padding-y: 1rem;
9
+ --wr-card-padding-x: 1.25rem;
10
+ --wr-card-shadow: var(--wr-shadow-xs);
11
+ --wr-card-shadow-hover: var(--wr-shadow-overlay);
12
+
13
+ position: relative;
14
+ display: flex;
15
+ flex-direction: column;
16
+ background: var(--wr-card-bg);
17
+ color: var(--wr-card-color);
18
+ @include theme.smooth-br(var(--wr-card-radius));
19
+ box-shadow: var(--wr-card-shadow);
20
+ font-family: var(--wr-font-family-base);
21
+ transition:
22
+ box-shadow var(--wr-transition-base),
23
+ transform var(--wr-transition-base);
24
+
25
+ &--bordered {
26
+ border: 1px solid var(--wr-card-border);
27
+ }
28
+
29
+ &--hoverable {
30
+ cursor: pointer;
31
+
32
+ &:hover {
33
+ box-shadow: var(--wr-card-shadow-hover);
34
+ transform: translateY(-1px);
35
+ }
36
+ }
37
+
38
+ &--compact {
39
+ --wr-card-padding-y: 0.5rem;
40
+ --wr-card-padding-x: 0.75rem;
41
+ }
42
+
43
+ &--loading &__body {
44
+ opacity: 0.6;
45
+ }
46
+
47
+ &__header {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: space-between;
51
+ gap: 0.5rem;
52
+ padding: var(--wr-card-padding-y) var(--wr-card-padding-x);
53
+ border-bottom: 1px solid var(--wr-card-border);
54
+ font-weight: 500;
55
+ }
56
+
57
+ &__body {
58
+ flex: 1 1 auto;
59
+ padding: var(--wr-card-padding-y) var(--wr-card-padding-x);
60
+ }
61
+
62
+ &__footer {
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: flex-end;
66
+ gap: 0.5rem;
67
+ padding: var(--wr-card-padding-y) var(--wr-card-padding-x);
68
+ border-top: 1px solid var(--wr-card-border);
69
+ }
70
+
71
+ &__loading {
72
+ position: absolute;
73
+ inset: 0;
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ @include theme.smooth-br(var(--wr-card-radius));
78
+ background: rgba(var(--wr-color-surface-rgb), 0.5);
79
+ pointer-events: none;
80
+ }
81
+
82
+ &__spinner {
83
+ width: 1.5rem;
84
+ height: 1.5rem;
85
+ border: 2px solid rgb(var(--wr-color-on-surface-muted-rgb) / 30%);
86
+ border-top-color: var(--wr-color-primary);
87
+ border-radius: 50%;
88
+ animation: wr-card-spin 0.7s linear infinite;
89
+ }
90
+ }
91
+
92
+ @keyframes wr-card-spin {
93
+ to {
94
+ transform: rotate(360deg);
95
+ }
96
+ }
@@ -1 +1 @@
1
- @forward './styles';
1
+ @forward './styles/rules';
@@ -1,244 +1,15 @@
1
- // Cascader. The trigger reuses the wr-select look-and-feel; the panel
2
- // is a horizontal row of columns where each column lists the children
3
- // of the previously-active node. Picking a leaf commits the path.
4
-
5
- @use '../../theme/styles' as theme;
6
-
7
- .wr-cascader {
8
- --wr-cascader-color: var(--wr-color-on-surface);
9
- --wr-cascader-bg: var(--wr-color-surface);
10
- --wr-cascader-border: var(--wr-color-outline);
11
- --wr-cascader-radius: var(--wr-control-radius-md);
12
- --wr-cascader-padding-y: var(--wr-control-padding-y-md);
13
- --wr-cascader-padding-x: var(--wr-control-padding-x-md);
14
- --wr-cascader-font-size: var(--wr-control-font-size-md);
15
- --wr-cascader-line-height: var(--wr-control-line-height-md);
16
- --wr-cascader-col-width: 12rem;
17
- --wr-cascader-max-height: 16rem;
18
-
19
- display: inline-flex;
20
- vertical-align: middle;
21
-
22
- &--disabled {
23
- --wr-cascader-color: var(--wr-color-on-surface-muted);
24
- --wr-cascader-bg: var(--wr-color-fill);
25
- }
26
-
27
- // Sizes — trigger on the control contract (sm 22 / md 30 / lg 36).
28
- &--sm {
29
- --wr-cascader-radius: var(--wr-control-radius-sm);
30
- --wr-cascader-padding-y: var(--wr-control-padding-y-sm);
31
- --wr-cascader-padding-x: var(--wr-control-padding-x-sm);
32
- --wr-cascader-font-size: var(--wr-control-font-size-sm);
33
- --wr-cascader-line-height: var(--wr-control-line-height-sm);
34
- }
35
-
36
- &--lg {
37
- --wr-cascader-radius: var(--wr-control-radius-lg);
38
- --wr-cascader-padding-y: var(--wr-control-padding-y-lg);
39
- --wr-cascader-padding-x: var(--wr-control-padding-x-lg);
40
- --wr-cascader-font-size: var(--wr-control-font-size-lg);
41
- --wr-cascader-line-height: var(--wr-control-line-height-lg);
42
- }
43
-
44
- &__trigger {
45
- display: inline-flex;
46
- align-items: center;
47
- gap: 0.5rem;
48
- width: 100%;
49
- min-width: 12rem;
50
- appearance: none;
51
- background: var(--wr-cascader-bg);
52
- color: var(--wr-cascader-color);
53
- border: 1px solid var(--wr-cascader-border);
54
- border-radius: var(--wr-cascader-radius);
55
- // Density-multiplied like select / input / textarea / button: the trigger
56
- // sources the same `--wr-control-padding-*` contract they do, so without
57
- // the multiplier it held its md height (30px) while its neighbours grew —
58
- // measured at 35.59px for input / select under `touch`.
59
- padding: calc(var(--wr-cascader-padding-y) * var(--wr-density-y, 1))
60
- calc(var(--wr-cascader-padding-x) * var(--wr-density-x, 1));
61
- font-family: var(--wr-font-family-base);
62
- font-size: var(--wr-cascader-font-size);
63
- line-height: var(--wr-cascader-line-height);
64
- cursor: pointer;
65
- text-align: start;
66
- transition:
67
- border-color var(--wr-transition-base),
68
- box-shadow var(--wr-transition-base);
69
-
70
- &:focus-visible {
71
- border-color: var(--wr-color-primary);
72
- @include theme.focus-ring;
73
- }
74
-
75
- &:disabled {
76
- cursor: not-allowed;
77
- }
78
- }
79
-
80
- &--open &__trigger {
81
- border-color: var(--wr-color-primary);
82
- box-shadow: 0 0 0 3px rgba(var(--wr-color-primary-rgb), 0.15);
83
- }
84
-
85
- &__value,
86
- &__placeholder {
87
- flex: 1 1 auto;
88
- overflow: hidden;
89
- text-overflow: ellipsis;
90
- white-space: nowrap;
91
- }
92
-
93
- &__placeholder {
94
- color: var(--wr-color-text-muted);
95
- }
96
-
97
- &__chevron {
98
- --wr-icon-size: 1rem;
99
- flex: 0 0 auto;
100
- color: var(--wr-color-on-surface-muted);
101
- transition: transform var(--wr-transition-base);
102
- }
103
-
104
- &--open &__chevron {
105
- transform: rotate(180deg);
106
- }
107
-
108
- &__clear {
109
- --wr-icon-size: 0.875rem;
110
- display: inline-flex;
111
- align-items: center;
112
- justify-content: center;
113
- width: 1.125rem;
114
- height: 1.125rem;
115
- border-radius: 999px;
116
- color: var(--wr-color-on-surface-muted);
117
- cursor: pointer;
118
- transition:
119
- background 0.12s ease,
120
- color 0.12s ease;
121
-
122
- &:hover {
123
- background: rgba(var(--wr-color-on-surface-rgb), 0.06);
124
- color: var(--wr-color-on-surface);
125
- }
126
- }
127
- }
128
-
129
- .wr-cascader-overlay {
130
- padding-top: 0.25rem;
131
- }
132
-
133
- .wr-cascader-panel {
134
- // Option sizing — mirrored from the trigger size (panel is portaled, so it
135
- // can't inherit the host size class). Default md.
136
- --wr-cascader-opt-font: var(--wr-control-font-size-md);
137
- --wr-cascader-opt-py: 0.5rem;
138
-
139
- display: flex;
140
- background: var(--wr-color-surface);
141
- border: 1px solid var(--wr-color-outline);
142
- border-radius: var(--wr-border-radius-base);
143
- box-shadow: var(--wr-shadow-overlay);
144
- font-family: var(--wr-font-family-base);
145
- font-size: var(--wr-cascader-opt-font);
146
- overflow: hidden;
147
-
148
- &--sm {
149
- --wr-cascader-opt-font: var(--wr-control-font-size-sm);
150
- --wr-cascader-opt-py: 0.375rem;
151
- }
152
-
153
- &--lg {
154
- --wr-cascader-opt-font: var(--wr-control-font-size-lg);
155
- --wr-cascader-opt-py: 0.625rem;
156
- }
157
-
158
- .wr-cascader__col {
159
- list-style: none;
160
- margin: 0;
161
- // Inset padding so options read as rounded pills, matching the select panel.
162
- padding: 0.25rem;
163
- width: var(--wr-cascader-col-width, 12rem);
164
- max-height: var(--wr-cascader-max-height, 16rem);
165
- overflow-y: auto;
166
- display: flex;
167
- flex-direction: column;
168
- gap: 0.125rem;
169
-
170
- + .wr-cascader__col {
171
- border-inline-start: 1px solid var(--wr-color-outline);
172
- }
173
- }
174
-
175
- // Options mirror .wr-option (rounded pill, soft primary tint when active).
176
- .wr-cascader__opt {
177
- display: flex;
178
- align-items: center;
179
- gap: 0.5rem;
180
- padding: var(--wr-cascader-opt-py) 0.625rem;
181
- border-radius: var(--wr-border-radius-sm);
182
- color: var(--wr-color-on-surface);
183
- cursor: pointer;
184
- transition: background var(--wr-transition-short);
185
-
186
- &:hover {
187
- background: var(--wr-color-hover);
188
- }
189
-
190
- &--active {
191
- background: var(--wr-color-primary-soft);
192
- // Text on the intent's own `-soft` tint, which is exactly what `-ink` is
193
- // calibrated against. Bare measured 4.17:1 light / 3.65:1 dark.
194
- color: var(--wr-color-primary-ink);
195
- font-weight: 500;
196
- }
197
-
198
- &--disabled {
199
- color: var(--wr-color-on-surface-muted);
200
- cursor: not-allowed;
201
- opacity: var(--wr-disabled-opacity);
202
-
203
- &:hover {
204
- background: transparent;
205
- }
206
- }
207
- }
208
-
209
- .wr-cascader__opt-label {
210
- flex: 1 1 auto;
211
- overflow: hidden;
212
- text-overflow: ellipsis;
213
- white-space: nowrap;
214
- }
215
-
216
- .wr-cascader__opt-arrow {
217
- --wr-icon-size: 0.875rem;
218
- flex: 0 0 auto;
219
- color: var(--wr-color-on-surface-muted);
220
- }
221
-
222
- // The panel is a flex row, so its columns cascade toward the inline end —
223
- // leftward under `dir="rtl"`. The branch arrow is drawn pointing physically
224
- // right, so turn it around with them, the way the carousel's arrows do.
225
- [dir='rtl'] & .wr-cascader__opt-arrow {
226
- transform: scaleX(-1);
227
- }
228
- }
229
-
230
- // Touch pointers: grow the clear button and make the column option rows ~44px
231
- // tall so each is a comfortable tap target. Fine pointers keep the compact
232
- // desktop sizing above.
233
- @media (pointer: coarse) {
234
- .wr-cascader__clear {
235
- --wr-icon-size: 1.125rem;
236
- width: 2rem;
237
- height: 2rem;
238
- }
239
-
240
- .wr-cascader-panel .wr-cascader__opt {
241
- padding-top: 0.75rem;
242
- padding-bottom: 0.75rem;
243
- }
244
- }
1
+ // Public Sass entry for `@use 'ngwr/cascader'`.
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
+ // `cascader.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. `cascader.scss` forwards `_rules`
13
+ // instead, so it carries this component's own CSS and nothing else.
14
+ @use '../../theme/styles';
15
+ @forward 'rules';