@northstar-js/react 0.0.0-stage → 0.2.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 (182) hide show
  1. package/LICENSE +21 -0
  2. package/dist/actions.d.ts +99 -0
  3. package/dist/actions.d.ts.map +1 -0
  4. package/dist/actions.js +61 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/backdrops/StarBackdrop.d.ts +31 -0
  7. package/dist/backdrops/StarBackdrop.d.ts.map +1 -0
  8. package/dist/backdrops/StarBackdrop.js +84 -0
  9. package/dist/backdrops/StarBackdrop.js.map +1 -0
  10. package/dist/backdrops/index.d.ts +7 -0
  11. package/dist/backdrops/index.d.ts.map +1 -0
  12. package/dist/backdrops/index.js +8 -0
  13. package/dist/backdrops/index.js.map +1 -0
  14. package/dist/backdrops/math.d.ts +39 -0
  15. package/dist/backdrops/math.d.ts.map +1 -0
  16. package/dist/backdrops/math.js +44 -0
  17. package/dist/backdrops/math.js.map +1 -0
  18. package/dist/backdrops/scenes.d.ts +20 -0
  19. package/dist/backdrops/scenes.d.ts.map +1 -0
  20. package/dist/backdrops/scenes.js +417 -0
  21. package/dist/backdrops/scenes.js.map +1 -0
  22. package/dist/backdrops.css +141 -0
  23. package/dist/data.d.ts +91 -0
  24. package/dist/data.d.ts.map +1 -0
  25. package/dist/data.js +69 -0
  26. package/dist/data.js.map +1 -0
  27. package/dist/effects/actions.d.ts +48 -0
  28. package/dist/effects/actions.d.ts.map +1 -0
  29. package/dist/effects/actions.js +80 -0
  30. package/dist/effects/actions.js.map +1 -0
  31. package/dist/effects/controls.d.ts +84 -0
  32. package/dist/effects/controls.d.ts.map +1 -0
  33. package/dist/effects/controls.js +121 -0
  34. package/dist/effects/controls.js.map +1 -0
  35. package/dist/effects/display.d.ts +92 -0
  36. package/dist/effects/display.d.ts.map +1 -0
  37. package/dist/effects/display.js +138 -0
  38. package/dist/effects/display.js.map +1 -0
  39. package/dist/effects/hooks.d.ts +13 -0
  40. package/dist/effects/hooks.d.ts.map +1 -0
  41. package/dist/effects/hooks.js +68 -0
  42. package/dist/effects/hooks.js.map +1 -0
  43. package/dist/effects/index.d.ts +14 -0
  44. package/dist/effects/index.d.ts.map +1 -0
  45. package/dist/effects/index.js +12 -0
  46. package/dist/effects/index.js.map +1 -0
  47. package/dist/effects/loaders.d.ts +67 -0
  48. package/dist/effects/loaders.d.ts.map +1 -0
  49. package/dist/effects/loaders.js +73 -0
  50. package/dist/effects/loaders.js.map +1 -0
  51. package/dist/effects/math.d.ts +23 -0
  52. package/dist/effects/math.d.ts.map +1 -0
  53. package/dist/effects/math.js +56 -0
  54. package/dist/effects/math.js.map +1 -0
  55. package/dist/effects/navigation.d.ts +55 -0
  56. package/dist/effects/navigation.d.ts.map +1 -0
  57. package/dist/effects/navigation.js +103 -0
  58. package/dist/effects/navigation.js.map +1 -0
  59. package/dist/effects/overlays.d.ts +34 -0
  60. package/dist/effects/overlays.d.ts.map +1 -0
  61. package/dist/effects/overlays.js +56 -0
  62. package/dist/effects/overlays.js.map +1 -0
  63. package/dist/effects.css +1659 -0
  64. package/dist/feedback.d.ts +55 -0
  65. package/dist/feedback.d.ts.map +1 -0
  66. package/dist/feedback.js +60 -0
  67. package/dist/feedback.js.map +1 -0
  68. package/dist/flow.d.ts +70 -0
  69. package/dist/flow.d.ts.map +1 -0
  70. package/dist/flow.js +118 -0
  71. package/dist/flow.js.map +1 -0
  72. package/dist/forms.d.ts +130 -0
  73. package/dist/forms.d.ts.map +1 -0
  74. package/dist/forms.js +241 -0
  75. package/dist/forms.js.map +1 -0
  76. package/dist/glass.d.ts +74 -0
  77. package/dist/glass.d.ts.map +1 -0
  78. package/dist/glass.js +139 -0
  79. package/dist/glass.js.map +1 -0
  80. package/dist/illustrations/data.d.ts +103 -0
  81. package/dist/illustrations/data.d.ts.map +1 -0
  82. package/dist/illustrations/data.js +3 -0
  83. package/dist/illustrations/data.js.map +1 -0
  84. package/dist/illustrations/index.d.ts +110 -0
  85. package/dist/illustrations/index.d.ts.map +1 -0
  86. package/dist/illustrations/index.js +54 -0
  87. package/dist/illustrations/index.js.map +1 -0
  88. package/dist/illustrations/types.d.ts +30 -0
  89. package/dist/illustrations/types.d.ts.map +1 -0
  90. package/dist/illustrations/types.js +2 -0
  91. package/dist/illustrations/types.js.map +1 -0
  92. package/dist/index.d.ts +27 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +13 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/internal/expand.d.ts +17 -0
  97. package/dist/internal/expand.d.ts.map +1 -0
  98. package/dist/internal/expand.js +23 -0
  99. package/dist/internal/expand.js.map +1 -0
  100. package/dist/internal/icons.d.ts +9 -0
  101. package/dist/internal/icons.d.ts.map +1 -0
  102. package/dist/internal/icons.js +12 -0
  103. package/dist/internal/icons.js.map +1 -0
  104. package/dist/internal/interaction.d.ts +21 -0
  105. package/dist/internal/interaction.d.ts.map +1 -0
  106. package/dist/internal/interaction.js +129 -0
  107. package/dist/internal/interaction.js.map +1 -0
  108. package/dist/internal/layers.d.ts +12 -0
  109. package/dist/internal/layers.d.ts.map +1 -0
  110. package/dist/internal/layers.js +108 -0
  111. package/dist/internal/layers.js.map +1 -0
  112. package/dist/internal/util.d.ts +9 -0
  113. package/dist/internal/util.d.ts.map +1 -0
  114. package/dist/internal/util.js +33 -0
  115. package/dist/internal/util.js.map +1 -0
  116. package/dist/layout.d.ts +34 -0
  117. package/dist/layout.d.ts.map +1 -0
  118. package/dist/layout.js +27 -0
  119. package/dist/layout.js.map +1 -0
  120. package/dist/motion.d.ts +36 -0
  121. package/dist/motion.d.ts.map +1 -0
  122. package/dist/motion.js +80 -0
  123. package/dist/motion.js.map +1 -0
  124. package/dist/navigation.d.ts +100 -0
  125. package/dist/navigation.d.ts.map +1 -0
  126. package/dist/navigation.js +154 -0
  127. package/dist/navigation.js.map +1 -0
  128. package/dist/northstar/BriefForm.d.ts +23 -0
  129. package/dist/northstar/BriefForm.d.ts.map +1 -0
  130. package/dist/northstar/BriefForm.js +40 -0
  131. package/dist/northstar/BriefForm.js.map +1 -0
  132. package/dist/northstar/ExportMenu.d.ts +16 -0
  133. package/dist/northstar/ExportMenu.d.ts.map +1 -0
  134. package/dist/northstar/ExportMenu.js +11 -0
  135. package/dist/northstar/ExportMenu.js.map +1 -0
  136. package/dist/northstar/PopulationPanel.d.ts +30 -0
  137. package/dist/northstar/PopulationPanel.d.ts.map +1 -0
  138. package/dist/northstar/PopulationPanel.js +18 -0
  139. package/dist/northstar/PopulationPanel.js.map +1 -0
  140. package/dist/northstar/ResearchBuilder.d.ts +26 -0
  141. package/dist/northstar/ResearchBuilder.d.ts.map +1 -0
  142. package/dist/northstar/ResearchBuilder.js +81 -0
  143. package/dist/northstar/ResearchBuilder.js.map +1 -0
  144. package/dist/northstar/ResponsesView.d.ts +20 -0
  145. package/dist/northstar/ResponsesView.d.ts.map +1 -0
  146. package/dist/northstar/ResponsesView.js +42 -0
  147. package/dist/northstar/ResponsesView.js.map +1 -0
  148. package/dist/northstar/Run.d.ts +37 -0
  149. package/dist/northstar/Run.d.ts.map +1 -0
  150. package/dist/northstar/Run.js +32 -0
  151. package/dist/northstar/Run.js.map +1 -0
  152. package/dist/northstar/StudyShell.d.ts +50 -0
  153. package/dist/northstar/StudyShell.d.ts.map +1 -0
  154. package/dist/northstar/StudyShell.js +18 -0
  155. package/dist/northstar/StudyShell.js.map +1 -0
  156. package/dist/northstar/StudyStatus.d.ts +17 -0
  157. package/dist/northstar/StudyStatus.d.ts.map +1 -0
  158. package/dist/northstar/StudyStatus.js +26 -0
  159. package/dist/northstar/StudyStatus.js.map +1 -0
  160. package/dist/northstar/index.d.ts +10 -0
  161. package/dist/northstar/index.d.ts.map +1 -0
  162. package/dist/northstar/index.js +10 -0
  163. package/dist/northstar/index.js.map +1 -0
  164. package/dist/northstar/messages.d.ts +84 -0
  165. package/dist/northstar/messages.d.ts.map +1 -0
  166. package/dist/northstar/messages.js +107 -0
  167. package/dist/northstar/messages.js.map +1 -0
  168. package/dist/overlays.d.ts +136 -0
  169. package/dist/overlays.d.ts.map +1 -0
  170. package/dist/overlays.js +447 -0
  171. package/dist/overlays.js.map +1 -0
  172. package/dist/provider.d.ts +82 -0
  173. package/dist/provider.d.ts.map +1 -0
  174. package/dist/provider.js +128 -0
  175. package/dist/provider.js.map +1 -0
  176. package/dist/styles.css +2033 -0
  177. package/dist/surface.d.ts +58 -0
  178. package/dist/surface.d.ts.map +1 -0
  179. package/dist/surface.js +39 -0
  180. package/dist/surface.js.map +1 -0
  181. package/package.json +81 -3
  182. package/README.md +0 -3
@@ -0,0 +1,1659 @@
1
+ /* @northstar-js/react/effects.css: the opt-in effects layer. Load after
2
+ tokens.css and styles.css. Uses only --ns-* custom properties. Every
3
+ moving part animates transform or opacity; under prefers-reduced-motion
4
+ nothing moves and every state stays visible. */
5
+
6
+ :root {
7
+ /* Half a cosine: the exact ease-in-out-sine curve. */
8
+ --ns-fx-sine: cubic-bezier(0.37, 0, 0.63, 1);
9
+ --ns-fx-glide: var(--ns-motion-easing-glide, cubic-bezier(0.22, 1, 0.36, 1));
10
+ --ns-fx-spring: var(--ns-motion-spring-settle, cubic-bezier(0.22, 1.24, 0.36, 1));
11
+ --ns-fx-pop: var(--ns-motion-spring-release, cubic-bezier(0.34, 1.56, 0.64, 1));
12
+ --ns-fx-sheen: var(--ns-color-signal-wash);
13
+ }
14
+ [data-theme='day'] {
15
+ --ns-fx-sheen: var(--ns-color-ground);
16
+ }
17
+ @media (prefers-color-scheme: light) {
18
+ :root:not([data-theme]) {
19
+ --ns-fx-sheen: var(--ns-color-ground);
20
+ }
21
+ }
22
+
23
+ .ns-fx-sr {
24
+ position: absolute !important;
25
+ width: 1px;
26
+ height: 1px;
27
+ margin: -1px;
28
+ padding: 0;
29
+ overflow: hidden;
30
+ clip: rect(0 0 0 0);
31
+ white-space: nowrap;
32
+ border: 0;
33
+ }
34
+ .ns-fx-is-disabled {
35
+ opacity: 0.5;
36
+ cursor: not-allowed;
37
+ }
38
+
39
+ /* One focus ring for every effect control. */
40
+ .ns-fx-starlink:focus-visible,
41
+ .ns-fx-cbutton:focus-visible,
42
+ .ns-fx-compass:focus-visible .ns-fx-compass__track,
43
+ .ns-fx-sslider__input:focus-visible ~ .ns-fx-sslider__rail .ns-fx-sslider__thumb,
44
+ .ns-fx-ccheck__input:focus-visible + .ns-fx-ccheck__box,
45
+ .ns-fx-rorbit__input:focus-visible + .ns-fx-rorbit__mark,
46
+ .ns-fx-mtabs__tab:focus-visible,
47
+ .ns-fx-mtabs__panel:focus-visible,
48
+ .ns-fx-spage button:focus-visible,
49
+ .ns-fx-crumbs__link:focus-visible,
50
+ .ns-fx-tag__remove:focus-visible,
51
+ .ns-fx-sine__trigger:focus-visible,
52
+ .ns-fx-comet__close:focus-visible {
53
+ outline: 2px solid var(--ns-color-focus);
54
+ outline-offset: 2px;
55
+ box-shadow: 0 0 0 5px var(--ns-color-focus-halo);
56
+ }
57
+
58
+ @keyframes ns-fx-spin { to { transform: rotate(360deg); } }
59
+ @keyframes ns-fx-orbit-once { from { transform: rotate(-360deg); } }
60
+ @keyframes ns-fx-twinkle { 50% { transform: scale(0.72) rotate(45deg); } }
61
+ @keyframes ns-fx-dim { to { opacity: 0.15; } }
62
+
63
+ /* ------------------------------------------------------------- StarLink */
64
+
65
+ .ns-fx-starlink {
66
+ display: inline-flex;
67
+ align-items: baseline;
68
+ gap: 3px;
69
+ color: var(--ns-color-signal);
70
+ text-decoration: none;
71
+ border-radius: 2px;
72
+ cursor: pointer;
73
+ }
74
+ .ns-fx-starlink--neutral {
75
+ color: var(--ns-color-text-1);
76
+ }
77
+ .ns-fx-starlink__text {
78
+ position: relative;
79
+ }
80
+ .ns-fx-starlink__text::before,
81
+ .ns-fx-starlink__text::after {
82
+ content: '';
83
+ position: absolute;
84
+ left: 0;
85
+ right: 0;
86
+ bottom: -2px;
87
+ height: 1px;
88
+ background: currentColor;
89
+ }
90
+ .ns-fx-starlink__text::before {
91
+ opacity: 0.3;
92
+ }
93
+ .ns-fx-starlink--neutral .ns-fx-starlink__text::after {
94
+ background: var(--ns-color-signal);
95
+ }
96
+ .ns-fx-starlink__text::after {
97
+ transform: scaleX(0);
98
+ transform-origin: left;
99
+ transition: transform var(--ns-motion-duration-reveal) var(--ns-fx-glide);
100
+ }
101
+ .ns-fx-starlink__point {
102
+ position: absolute;
103
+ left: 0;
104
+ right: 0;
105
+ bottom: -4px;
106
+ height: 5px;
107
+ background: radial-gradient(circle at calc(100% - 2.5px) 50%, var(--ns-color-signal) 1.6px, transparent 2.4px);
108
+ transform: translateX(-100%);
109
+ opacity: 0;
110
+ pointer-events: none;
111
+ }
112
+ .ns-fx-starlink__star {
113
+ align-self: center;
114
+ flex: none;
115
+ color: var(--ns-color-signal);
116
+ opacity: 0;
117
+ transform: scale(0) rotate(-90deg);
118
+ transition:
119
+ transform var(--ns-motion-duration-settle) var(--ns-fx-spring) 120ms,
120
+ opacity var(--ns-motion-duration-200) ease 120ms;
121
+ }
122
+ .ns-fx-starlink:is(:hover, :focus-visible) .ns-fx-starlink__text::after {
123
+ transform: scaleX(1);
124
+ }
125
+ .ns-fx-starlink:is(:hover, :focus-visible) .ns-fx-starlink__point {
126
+ animation: ns-fx-trace var(--ns-motion-duration-reveal) var(--ns-fx-glide) both;
127
+ }
128
+ .ns-fx-starlink:is(:hover, :focus-visible) .ns-fx-starlink__star {
129
+ opacity: 1;
130
+ transform: scale(1) rotate(0deg);
131
+ }
132
+ @keyframes ns-fx-trace {
133
+ 0% { transform: translateX(-100%); opacity: 0; }
134
+ 20% { opacity: 1; }
135
+ 80% { opacity: 1; }
136
+ 100% { transform: translateX(0); opacity: 0; }
137
+ }
138
+
139
+ /* -------------------------------------------------- ConstellationButton */
140
+
141
+ .ns-fx-cbutton {
142
+ position: relative;
143
+ isolation: isolate;
144
+ display: inline-flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ gap: 8px;
148
+ height: var(--ns-size-control-md);
149
+ padding: 0 16px;
150
+ border: 1px solid var(--ns-color-line-2);
151
+ border-radius: var(--ns-radius-control-pill);
152
+ background: var(--ns-color-surface-2);
153
+ color: var(--ns-color-text-1);
154
+ font: inherit;
155
+ font-size: var(--ns-font-size-13);
156
+ font-weight: var(--ns-font-weight-medium);
157
+ cursor: pointer;
158
+ transition:
159
+ transform var(--ns-motion-duration-release) var(--ns-fx-pop),
160
+ background-color var(--ns-motion-duration-120) ease;
161
+ }
162
+ .ns-fx-cbutton:hover {
163
+ background: var(--ns-color-surface-3);
164
+ }
165
+ .ns-fx-cbutton:active {
166
+ transform: scale(0.97);
167
+ transition-duration: var(--ns-motion-duration-press);
168
+ }
169
+ .ns-fx-cbutton:disabled {
170
+ opacity: 0.5;
171
+ cursor: not-allowed;
172
+ }
173
+ .ns-fx-cbutton--primary {
174
+ border-color: transparent;
175
+ background: var(--ns-button-primary-bg);
176
+ color: var(--ns-button-primary-fg);
177
+ }
178
+ .ns-fx-cbutton--primary:hover {
179
+ background: var(--ns-button-primary-bg);
180
+ box-shadow: 0 0 0 4px var(--ns-color-signal-wash);
181
+ }
182
+ .ns-fx-size-sm { height: var(--ns-size-control-sm); padding: 0 12px; font-size: var(--ns-font-size-12); }
183
+ .ns-fx-size-lg { height: var(--ns-size-control-lg); padding: 0 20px; }
184
+ .ns-fx-cbutton--rounded { border-radius: var(--ns-radius-control-rounded); }
185
+ /* The soft finish (finish="soft"): the same tactile texture as every soft
186
+ button (styles.css), brushed lines, a soft top highlight and a low bevel,
187
+ under the label and the burst. The default machined spin finish lives in
188
+ styles.css with every other button's and overrides this. */
189
+ .ns-fx-cbutton::after {
190
+ content: '';
191
+ position: absolute;
192
+ inset: 0;
193
+ z-index: -1;
194
+ border-radius: inherit;
195
+ pointer-events: none;
196
+ background:
197
+ linear-gradient(180deg, var(--ns-material-texture-top), transparent 56%),
198
+ repeating-linear-gradient(180deg, var(--ns-material-texture-light) 0 1px, transparent 1px 3px),
199
+ repeating-linear-gradient(180deg, var(--ns-material-texture-dark) 0 1px, transparent 1px 5px);
200
+ box-shadow: inset 0 1px 0 var(--ns-material-texture-bevel-hi), inset 0 -1px 0 var(--ns-material-texture-bevel-lo);
201
+ }
202
+ .ns-fx-cbutton--primary::after {
203
+ background:
204
+ linear-gradient(180deg, var(--ns-material-texture-signal-top), transparent 56%),
205
+ repeating-linear-gradient(180deg, var(--ns-material-texture-signal-light) 0 1px, transparent 1px 3px),
206
+ repeating-linear-gradient(180deg, var(--ns-material-texture-signal-dark) 0 1px, transparent 1px 5px);
207
+ box-shadow: inset 0 1px 0 var(--ns-material-texture-signal-bevel-hi), inset 0 -1px 0 var(--ns-material-texture-signal-bevel-lo);
208
+ }
209
+ .ns-fx-cbutton:active::after { box-shadow: inset 0 1px 2px var(--ns-material-texture-bevel-lo); }
210
+ .ns-fx-cbutton:disabled::after { display: none; }
211
+ @media (prefers-reduced-transparency: reduce) {
212
+ .ns-fx-cbutton::after { background: none; }
213
+ }
214
+ @media (prefers-contrast: more) {
215
+ .ns-fx-cbutton::after { display: none; }
216
+ }
217
+ .ns-fx-burst {
218
+ position: absolute;
219
+ left: 0;
220
+ top: 0;
221
+ z-index: 1;
222
+ width: 0;
223
+ height: 0;
224
+ color: var(--ns-color-signal);
225
+ transform: translate(var(--ns-fx-x), var(--ns-fx-y));
226
+ pointer-events: none;
227
+ }
228
+ .ns-fx-burst__pt,
229
+ .ns-fx-burst__ln {
230
+ position: absolute;
231
+ left: 0;
232
+ top: 0;
233
+ background: currentColor;
234
+ }
235
+ .ns-fx-burst__pt {
236
+ width: 4px;
237
+ height: 4px;
238
+ margin: -2px 0 0 -2px;
239
+ border-radius: 50%;
240
+ box-shadow: 0 0 6px currentColor;
241
+ animation: ns-fx-pt 1s var(--ns-fx-glide) calc(var(--ns-fx-i) * 45ms) both;
242
+ }
243
+ .ns-fx-burst__ln {
244
+ width: var(--ns-fx-len);
245
+ height: 1px;
246
+ margin-top: -0.5px;
247
+ transform-origin: 0 50%;
248
+ animation: ns-fx-ln 1s var(--ns-fx-glide) calc(140ms + var(--ns-fx-i) * 70ms) both;
249
+ }
250
+ @keyframes ns-fx-pt {
251
+ 0% { transform: translate(0, 0) scale(0); opacity: 1; }
252
+ 35% { transform: translate(var(--ns-fx-px), var(--ns-fx-py)) scale(1); }
253
+ 70% { opacity: 1; }
254
+ 100% { transform: translate(var(--ns-fx-px), var(--ns-fx-py)) scale(0.5); opacity: 0; }
255
+ }
256
+ @keyframes ns-fx-ln {
257
+ 0% { transform: translate(var(--ns-fx-px), var(--ns-fx-py)) rotate(var(--ns-fx-ang)) scaleX(0); opacity: 0.7; }
258
+ 40% { transform: translate(var(--ns-fx-px), var(--ns-fx-py)) rotate(var(--ns-fx-ang)) scaleX(1); }
259
+ 65% { opacity: 0.7; }
260
+ 100% { transform: translate(var(--ns-fx-px), var(--ns-fx-py)) rotate(var(--ns-fx-ang)) scaleX(1); opacity: 0; }
261
+ }
262
+
263
+ /* ------------------------------------------------------------- KbdKeycap */
264
+
265
+ .ns-fx-keycap {
266
+ position: relative;
267
+ display: inline-block;
268
+ padding-bottom: 3px;
269
+ border-radius: 5px;
270
+ background: var(--ns-color-line-2);
271
+ font-family: var(--ns-font-family-mono);
272
+ font-size: var(--ns-font-size-11);
273
+ line-height: 1;
274
+ vertical-align: middle;
275
+ }
276
+ .ns-fx-keycap__top {
277
+ display: inline-flex;
278
+ align-items: center;
279
+ justify-content: center;
280
+ min-width: 22px;
281
+ height: 20px;
282
+ padding: 0 6px;
283
+ border: 1px solid var(--ns-color-line-2);
284
+ border-radius: 5px;
285
+ background: var(--ns-color-surface-2);
286
+ box-shadow: inset 0 1px 0 var(--ns-material-hairline);
287
+ color: var(--ns-color-text-1);
288
+ transition: transform var(--ns-motion-duration-release) var(--ns-fx-pop);
289
+ }
290
+ .ns-fx-keycap[data-pressed] .ns-fx-keycap__top {
291
+ transform: translateY(2.5px);
292
+ transition-duration: var(--ns-motion-duration-press);
293
+ transition-timing-function: ease-out;
294
+ }
295
+ .ns-fx-keycap[data-pressed] {
296
+ outline: 1px solid var(--ns-color-signal-edge);
297
+ outline-offset: 1px;
298
+ }
299
+
300
+ /* ---------------------------------------------------------------- Loaders */
301
+
302
+ .ns-fx-loader {
303
+ display: inline-flex;
304
+ align-items: center;
305
+ gap: 8px;
306
+ color: var(--ns-color-signal);
307
+ vertical-align: middle;
308
+ }
309
+ .ns-fx-loader > svg {
310
+ flex: none;
311
+ width: var(--ns-fx-size);
312
+ height: var(--ns-fx-size);
313
+ overflow: visible;
314
+ }
315
+ .ns-fx-loader__label {
316
+ position: absolute;
317
+ width: 1px;
318
+ height: 1px;
319
+ margin: -1px;
320
+ overflow: hidden;
321
+ clip: rect(0 0 0 0);
322
+ white-space: nowrap;
323
+ }
324
+ .ns-fx-orbit__ring,
325
+ .ns-fx-liss__track {
326
+ fill: none;
327
+ stroke: var(--ns-color-line-2);
328
+ stroke-width: 0.75;
329
+ }
330
+ .ns-fx-orbit__star,
331
+ .ns-fx-orbit__planet,
332
+ .ns-fx-seed,
333
+ .ns-fx-liss__dot {
334
+ fill: currentColor;
335
+ }
336
+ .ns-fx-orbit__planet--far {
337
+ fill: var(--ns-color-text-2);
338
+ }
339
+ .ns-fx-orbit__arm {
340
+ transform-box: view-box;
341
+ transform-origin: 16px 16px;
342
+ animation: ns-fx-spin var(--ns-fx-t) linear infinite;
343
+ }
344
+ .ns-fx-seed {
345
+ opacity: 0.22;
346
+ animation: ns-fx-seed 1.8s var(--ns-fx-sine) calc(var(--ns-fx-k) * -1.8s) infinite;
347
+ }
348
+ @keyframes ns-fx-seed { 50% { opacity: 1; } }
349
+ .ns-fx-liss__x {
350
+ animation: ns-fx-lx var(--ns-fx-d) var(--ns-fx-sine) var(--ns-fx-lag) infinite alternate;
351
+ }
352
+ .ns-fx-liss__y {
353
+ animation: ns-fx-ly var(--ns-fx-d) var(--ns-fx-sine) var(--ns-fx-lag) infinite alternate;
354
+ }
355
+ @keyframes ns-fx-lx { from { transform: translateX(16px); } to { transform: translateX(-16px); } }
356
+ @keyframes ns-fx-ly { from { transform: translateY(-16px); } to { transform: translateY(16px); } }
357
+
358
+ /* --------------------------------------------------------- PrimeSkeleton */
359
+
360
+ .ns-fx-pskel {
361
+ display: grid;
362
+ gap: 8px;
363
+ }
364
+ .ns-fx-pskel__line {
365
+ position: relative;
366
+ display: block;
367
+ height: var(--ns-fx-h);
368
+ overflow: hidden;
369
+ border-radius: var(--ns-radius-4);
370
+ background: var(--ns-color-surface-3);
371
+ }
372
+ .ns-fx-pskel__line::after {
373
+ content: '';
374
+ position: absolute;
375
+ inset: 0;
376
+ background: linear-gradient(90deg, transparent, var(--ns-fx-sheen), transparent);
377
+ transform: translateX(-100%);
378
+ animation: ns-fx-sweep var(--ns-fx-t) var(--ns-fx-sine) infinite;
379
+ }
380
+ @keyframes ns-fx-sweep {
381
+ 0% { transform: translateX(-100%); }
382
+ 45%, 100% { transform: translateX(100%); }
383
+ }
384
+
385
+ /* ------------------------------------------------------- ProgressSextant */
386
+
387
+ .ns-fx-sextant {
388
+ display: inline-grid;
389
+ justify-items: center;
390
+ color: var(--ns-color-signal);
391
+ }
392
+ .ns-fx-sextant svg {
393
+ display: block;
394
+ width: 100%;
395
+ height: auto;
396
+ overflow: visible;
397
+ }
398
+ .ns-fx-sextant__tick {
399
+ stroke: var(--ns-color-line-2);
400
+ stroke-width: 1;
401
+ stroke-linecap: round;
402
+ }
403
+ .ns-fx-sextant__tick--major {
404
+ stroke: var(--ns-color-text-3);
405
+ }
406
+ .ns-fx-sextant__lit {
407
+ stroke: currentColor;
408
+ stroke-width: 1.5;
409
+ stroke-linecap: round;
410
+ opacity: 0;
411
+ transition: opacity var(--ns-motion-duration-200) ease calc(var(--ns-fx-i) * 14ms);
412
+ }
413
+ .ns-fx-sextant__lit[data-on] {
414
+ opacity: 1;
415
+ }
416
+ .ns-fx-sextant__arm {
417
+ transform-box: view-box;
418
+ transform-origin: 60px 66px;
419
+ transform: rotate(var(--ns-fx-rot));
420
+ transition: transform var(--ns-motion-duration-layout) var(--ns-fx-spring);
421
+ }
422
+ .ns-fx-sextant__arm line {
423
+ stroke: var(--ns-color-text-2);
424
+ stroke-width: 1;
425
+ }
426
+ .ns-fx-sextant__arm path {
427
+ fill: currentColor;
428
+ }
429
+ .ns-fx-sextant__pivot {
430
+ fill: var(--ns-color-ground);
431
+ stroke: var(--ns-color-text-2);
432
+ }
433
+ .ns-fx-sextant__readout {
434
+ margin-top: 2px;
435
+ color: var(--ns-color-text-1);
436
+ font-family: var(--ns-font-family-mono);
437
+ font-size: var(--ns-font-size-13);
438
+ font-variant-numeric: tabular-nums;
439
+ }
440
+
441
+ /* --------------------------------------------------------- CompassSwitch */
442
+
443
+ .ns-fx-compass {
444
+ display: inline-flex;
445
+ align-items: center;
446
+ gap: 10px;
447
+ padding: 2px;
448
+ border: 0;
449
+ border-radius: var(--ns-radius-full);
450
+ background: none;
451
+ color: var(--ns-color-text-1);
452
+ font: inherit;
453
+ font-size: var(--ns-font-size-13);
454
+ cursor: pointer;
455
+ }
456
+ .ns-fx-compass:focus-visible {
457
+ outline: none;
458
+ }
459
+ .ns-fx-compass:disabled {
460
+ opacity: 0.5;
461
+ cursor: not-allowed;
462
+ }
463
+ .ns-fx-compass__track {
464
+ position: relative;
465
+ flex: none;
466
+ width: 44px;
467
+ height: 24px;
468
+ border: 1px solid var(--ns-color-line-2);
469
+ border-radius: var(--ns-radius-full);
470
+ background: var(--ns-color-surface-3);
471
+ transition: background-color var(--ns-motion-duration-200) ease, border-color var(--ns-motion-duration-200) ease;
472
+ }
473
+ .ns-fx-compass__thumb {
474
+ position: absolute;
475
+ top: 1px;
476
+ left: 1px;
477
+ width: 20px;
478
+ height: 20px;
479
+ border-radius: 50%;
480
+ background: var(--ns-color-ground);
481
+ box-shadow: 0 0 0 1px var(--ns-color-line-2), var(--ns-elevation-1);
482
+ transition: transform var(--ns-motion-duration-settle) var(--ns-fx-spring);
483
+ }
484
+ .ns-fx-compass__thumb svg {
485
+ display: block;
486
+ width: 100%;
487
+ height: 100%;
488
+ }
489
+ .ns-fx-compass__tick {
490
+ stroke: var(--ns-color-line-2);
491
+ stroke-width: 0.8;
492
+ }
493
+ .ns-fx-compass__tick--card {
494
+ stroke: var(--ns-color-text-3);
495
+ }
496
+ .ns-fx-compass__needle {
497
+ transform-box: view-box;
498
+ transform-origin: 10px 10px;
499
+ transform: rotate(-90deg);
500
+ transition: transform var(--ns-motion-duration-reveal) var(--ns-fx-spring);
501
+ }
502
+ .ns-fx-compass__north { fill: var(--ns-color-text-3); }
503
+ .ns-fx-compass__south { fill: var(--ns-color-line-2); }
504
+ .ns-fx-compass__hub { fill: var(--ns-color-text-2); }
505
+ .ns-fx-compass[data-state='on'] .ns-fx-compass__track {
506
+ border-color: var(--ns-color-signal-edge);
507
+ background: var(--ns-color-signal-wash);
508
+ }
509
+ .ns-fx-compass[data-state='on'] .ns-fx-compass__thumb {
510
+ transform: translateX(20px);
511
+ }
512
+ .ns-fx-compass[data-state='on'] .ns-fx-compass__needle {
513
+ transform: rotate(0deg);
514
+ }
515
+ .ns-fx-compass[data-state='on'] .ns-fx-compass__north {
516
+ fill: var(--ns-color-signal);
517
+ }
518
+
519
+ /* --------------------------------------------------------- SextantSlider */
520
+
521
+ .ns-fx-sslider {
522
+ --ns-fx-thumb: 16px;
523
+ display: grid;
524
+ gap: 4px;
525
+ min-width: 200px;
526
+ }
527
+ .ns-fx-sslider__label {
528
+ color: var(--ns-color-text-2);
529
+ font-size: var(--ns-font-size-12);
530
+ font-weight: var(--ns-font-weight-medium);
531
+ }
532
+ .ns-fx-sslider__scale {
533
+ position: relative;
534
+ height: 56px;
535
+ margin: 0 calc(var(--ns-fx-thumb) / 2);
536
+ }
537
+ .ns-fx-sslider__input {
538
+ position: absolute;
539
+ z-index: 2;
540
+ bottom: 0;
541
+ left: calc(var(--ns-fx-thumb) / -2);
542
+ width: calc(100% + var(--ns-fx-thumb));
543
+ height: 40px;
544
+ margin: 0;
545
+ opacity: 0;
546
+ cursor: pointer;
547
+ appearance: none;
548
+ background: none;
549
+ }
550
+ .ns-fx-sslider__input::-webkit-slider-thumb {
551
+ width: var(--ns-fx-thumb);
552
+ height: 40px;
553
+ appearance: none;
554
+ }
555
+ .ns-fx-sslider__input::-moz-range-thumb {
556
+ width: var(--ns-fx-thumb);
557
+ height: 40px;
558
+ border: 0;
559
+ }
560
+ .ns-fx-sslider__input:disabled {
561
+ cursor: not-allowed;
562
+ }
563
+ .ns-fx-sslider__ticks {
564
+ position: absolute;
565
+ left: 0;
566
+ right: 0;
567
+ bottom: 14px;
568
+ height: 14px;
569
+ }
570
+ .ns-fx-sslider__tick {
571
+ position: absolute;
572
+ bottom: 0;
573
+ width: 1px;
574
+ height: 5px;
575
+ margin-left: -0.5px;
576
+ background: var(--ns-color-line-2);
577
+ transform-origin: bottom;
578
+ transform: scaleY(var(--ns-fx-lift));
579
+ transition: transform var(--ns-motion-duration-200) var(--ns-fx-sine);
580
+ }
581
+ .ns-fx-sslider__tick--major {
582
+ height: 8px;
583
+ background: var(--ns-color-text-3);
584
+ }
585
+ .ns-fx-sslider__tick--past {
586
+ background: var(--ns-color-signal);
587
+ }
588
+ .ns-fx-sslider__detent {
589
+ position: absolute;
590
+ bottom: 22px;
591
+ width: 8px;
592
+ height: 8px;
593
+ margin-left: -4px;
594
+ fill: var(--ns-color-text-3);
595
+ transition: transform var(--ns-motion-duration-settle) var(--ns-fx-spring);
596
+ }
597
+ .ns-fx-sslider__detent[data-on] {
598
+ fill: var(--ns-color-signal);
599
+ transform: scale(1.35) rotate(90deg);
600
+ }
601
+ .ns-fx-sslider__rail {
602
+ position: absolute;
603
+ left: 0;
604
+ right: 0;
605
+ bottom: 9px;
606
+ height: 2px;
607
+ border-radius: 1px;
608
+ background: var(--ns-color-line-1);
609
+ }
610
+ .ns-fx-sslider__rail::before {
611
+ content: '';
612
+ position: absolute;
613
+ inset: 0;
614
+ border-radius: inherit;
615
+ background: var(--ns-color-signal);
616
+ transform-origin: left;
617
+ transform: scaleX(calc(var(--ns-fx-p) / 100));
618
+ }
619
+ .ns-fx-sslider__index {
620
+ position: absolute;
621
+ inset: 0;
622
+ transform: translateX(calc(var(--ns-fx-p) * 1%));
623
+ }
624
+ .ns-fx-sslider__thumb {
625
+ position: absolute;
626
+ left: calc(var(--ns-fx-thumb) / -2);
627
+ top: calc(1px - var(--ns-fx-thumb) / 2);
628
+ width: var(--ns-fx-thumb);
629
+ height: var(--ns-fx-thumb);
630
+ border: 1.5px solid var(--ns-color-signal);
631
+ border-radius: 50%;
632
+ background: var(--ns-color-ground);
633
+ box-shadow: var(--ns-elevation-1);
634
+ transition: transform var(--ns-motion-duration-200) var(--ns-fx-pop);
635
+ }
636
+ .ns-fx-sslider__input:hover ~ .ns-fx-sslider__rail .ns-fx-sslider__thumb {
637
+ transform: scale(1.12);
638
+ }
639
+ .ns-fx-sslider__thumb--detent {
640
+ animation: ns-fx-detent var(--ns-motion-duration-320) var(--ns-fx-pop);
641
+ }
642
+ @keyframes ns-fx-detent { 40% { transform: scale(0.82); } }
643
+ .ns-fx-sslider__readout {
644
+ position: absolute;
645
+ left: 0;
646
+ bottom: 36px;
647
+ padding: 1px 5px;
648
+ border-radius: var(--ns-radius-4);
649
+ background: var(--ns-color-surface-2);
650
+ color: var(--ns-color-text-1);
651
+ font-family: var(--ns-font-family-mono);
652
+ font-size: var(--ns-font-size-12);
653
+ font-variant-numeric: tabular-nums;
654
+ line-height: var(--ns-font-line-height-12);
655
+ white-space: nowrap;
656
+ transform: translateX(-50%);
657
+ }
658
+
659
+ /* -------------------------------------------------- ConstellationCheckbox */
660
+
661
+ .ns-fx-ccheck,
662
+ .ns-fx-rorbit__option {
663
+ position: relative;
664
+ display: inline-flex;
665
+ align-items: center;
666
+ gap: 8px;
667
+ color: var(--ns-color-text-1);
668
+ font-size: var(--ns-font-size-13);
669
+ cursor: pointer;
670
+ }
671
+ .ns-fx-ccheck__input,
672
+ .ns-fx-rorbit__input {
673
+ position: absolute;
674
+ top: 0;
675
+ left: 0;
676
+ width: 18px;
677
+ height: 18px;
678
+ margin: 0;
679
+ opacity: 0;
680
+ cursor: inherit;
681
+ }
682
+ .ns-fx-ccheck__box {
683
+ display: grid;
684
+ flex: none;
685
+ width: 18px;
686
+ height: 18px;
687
+ border: 1px solid var(--ns-color-line-2);
688
+ border-radius: var(--ns-radius-4);
689
+ background: var(--ns-color-surface-1);
690
+ transition: border-color var(--ns-motion-duration-200) ease, background-color var(--ns-motion-duration-200) ease;
691
+ }
692
+ .ns-fx-ccheck__box svg {
693
+ width: 100%;
694
+ height: 100%;
695
+ overflow: visible;
696
+ }
697
+ .ns-fx-ccheck:not([data-state='off']) .ns-fx-ccheck__box {
698
+ border-color: var(--ns-color-signal-edge);
699
+ background: var(--ns-color-signal-wash);
700
+ }
701
+ .ns-fx-ccheck__ln {
702
+ stroke: var(--ns-color-signal);
703
+ stroke-width: 1.3;
704
+ stroke-linecap: round;
705
+ transform-box: fill-box;
706
+ transform-origin: 0 0;
707
+ transform: scale(0);
708
+ transition: transform var(--ns-motion-duration-200) var(--ns-fx-sine);
709
+ }
710
+ .ns-fx-ccheck__ln--b {
711
+ transform-origin: 0 100%;
712
+ }
713
+ .ns-fx-ccheck__mixed .ns-fx-ccheck__ln {
714
+ transform-origin: 0 50%;
715
+ }
716
+ .ns-fx-ccheck__st {
717
+ fill: var(--ns-color-signal);
718
+ transform-box: fill-box;
719
+ transform-origin: center;
720
+ transform: scale(0);
721
+ transition: transform var(--ns-motion-duration-320) var(--ns-fx-pop);
722
+ }
723
+ .ns-fx-ccheck:not([data-state='off']) :is(.ns-fx-ccheck__ln, .ns-fx-ccheck__st) {
724
+ transform: scale(1);
725
+ }
726
+ .ns-fx-ccheck[data-state='on'] .ns-fx-ccheck__ln--a { transition-delay: 60ms; }
727
+ .ns-fx-ccheck[data-state='on'] .ns-fx-ccheck__st--b { transition-delay: 150ms; }
728
+ .ns-fx-ccheck[data-state='on'] .ns-fx-ccheck__ln--b { transition-delay: 200ms; }
729
+ .ns-fx-ccheck[data-state='on'] .ns-fx-ccheck__st--c { transition-delay: 330ms; }
730
+
731
+ /* ------------------------------------------------------------ RadioOrbit */
732
+
733
+ .ns-fx-rorbit {
734
+ min-width: 0;
735
+ margin: 0;
736
+ padding: 0;
737
+ border: 0;
738
+ }
739
+ .ns-fx-rorbit__legend {
740
+ margin-bottom: 8px;
741
+ padding: 0;
742
+ color: var(--ns-color-text-2);
743
+ font-size: var(--ns-font-size-12);
744
+ font-weight: var(--ns-font-weight-medium);
745
+ }
746
+ .ns-fx-rorbit__options {
747
+ display: grid;
748
+ gap: 4px;
749
+ }
750
+ .ns-fx-rorbit--horizontal .ns-fx-rorbit__options {
751
+ display: flex;
752
+ flex-wrap: wrap;
753
+ gap: 4px 20px;
754
+ }
755
+ .ns-fx-rorbit__option {
756
+ align-items: flex-start;
757
+ gap: 10px;
758
+ padding: 4px 0;
759
+ }
760
+ .ns-fx-rorbit__input {
761
+ top: 4px;
762
+ width: 20px;
763
+ height: 20px;
764
+ }
765
+ .ns-fx-rorbit__mark {
766
+ flex: none;
767
+ width: 20px;
768
+ height: 20px;
769
+ border-radius: 50%;
770
+ }
771
+ .ns-fx-rorbit__mark svg {
772
+ display: block;
773
+ width: 100%;
774
+ height: 100%;
775
+ overflow: visible;
776
+ }
777
+ .ns-fx-rorbit__ring {
778
+ fill: none;
779
+ stroke: var(--ns-color-line-2);
780
+ stroke-width: 1;
781
+ }
782
+ .ns-fx-rorbit__planet {
783
+ fill: var(--ns-color-signal);
784
+ transform-box: fill-box;
785
+ transform-origin: center;
786
+ transform: scale(0);
787
+ transition: transform var(--ns-motion-duration-320) var(--ns-fx-pop);
788
+ }
789
+ .ns-fx-rorbit__arm {
790
+ transform-box: view-box;
791
+ transform-origin: 10px 10px;
792
+ opacity: 0;
793
+ }
794
+ .ns-fx-rorbit__moon {
795
+ fill: var(--ns-color-text-2);
796
+ }
797
+ .ns-fx-rorbit__option[data-state='on'] .ns-fx-rorbit__ring {
798
+ stroke: var(--ns-color-signal-edge);
799
+ }
800
+ .ns-fx-rorbit__option[data-state='on'] .ns-fx-rorbit__planet {
801
+ transform: scale(1);
802
+ }
803
+ .ns-fx-rorbit__option[data-state='on'] .ns-fx-rorbit__arm {
804
+ opacity: 1;
805
+ animation: ns-fx-orbit-once 1.1s var(--ns-fx-glide);
806
+ }
807
+ .ns-fx-rorbit__text {
808
+ display: grid;
809
+ gap: 2px;
810
+ padding-top: 1px;
811
+ }
812
+ .ns-fx-rorbit__desc {
813
+ color: var(--ns-color-text-3);
814
+ font-size: var(--ns-font-size-12);
815
+ }
816
+
817
+ /* --------------------------------------------------------- GraticuleInput */
818
+
819
+ .ns-fx-ginput {
820
+ display: grid;
821
+ gap: 6px;
822
+ }
823
+ .ns-fx-ginput__label {
824
+ color: var(--ns-color-text-2);
825
+ font-size: var(--ns-font-size-12);
826
+ font-weight: var(--ns-font-weight-medium);
827
+ }
828
+ .ns-fx-ginput__field {
829
+ position: relative;
830
+ display: block;
831
+ margin-bottom: 6px;
832
+ }
833
+ .ns-fx-ginput__input {
834
+ width: 100%;
835
+ height: var(--ns-size-control-md);
836
+ padding: 0 10px;
837
+ border: 1px solid var(--ns-color-line-2);
838
+ border-radius: var(--ns-radius-6);
839
+ outline: none;
840
+ background: var(--ns-color-surface-1);
841
+ color: var(--ns-color-text-1);
842
+ font: inherit;
843
+ font-size: var(--ns-font-size-13);
844
+ transition: border-color var(--ns-motion-duration-200) ease, box-shadow var(--ns-motion-duration-200) ease;
845
+ }
846
+ .ns-fx-ginput__input::placeholder {
847
+ color: var(--ns-color-text-3);
848
+ }
849
+ .ns-fx-ginput__input:focus-visible {
850
+ border-color: var(--ns-color-focus);
851
+ box-shadow: 0 0 0 3px var(--ns-color-focus-halo);
852
+ }
853
+ .ns-fx-ginput__rule {
854
+ position: absolute;
855
+ left: 6px;
856
+ right: 6px;
857
+ bottom: -8px;
858
+ height: 6px;
859
+ overflow: hidden;
860
+ pointer-events: none;
861
+ }
862
+ .ns-fx-ginput__rule::before {
863
+ content: '';
864
+ position: absolute;
865
+ inset: 0;
866
+ background:
867
+ linear-gradient(var(--ns-color-signal), var(--ns-color-signal)) left top / 100% 1px no-repeat,
868
+ repeating-linear-gradient(90deg, var(--ns-color-signal) 0 1px, transparent 1px 30px) left top / 100% 6px no-repeat,
869
+ repeating-linear-gradient(90deg, var(--ns-color-signal-edge) 0 1px, transparent 1px 6px) left top / 100% 3px no-repeat;
870
+ transform: translateX(-101%);
871
+ transition: transform var(--ns-motion-duration-reveal) var(--ns-fx-glide);
872
+ }
873
+ .ns-fx-ginput__field:focus-within .ns-fx-ginput__rule::before {
874
+ transform: translateX(0);
875
+ }
876
+ .ns-fx-ginput--invalid .ns-fx-ginput__rule::before {
877
+ background: repeating-linear-gradient(90deg, var(--ns-color-text-2) 0 4px, transparent 4px 7px) left top / 100% 1px no-repeat;
878
+ transform: translateX(0);
879
+ }
880
+ .ns-fx-ginput--invalid .ns-fx-ginput__input {
881
+ border-style: dashed;
882
+ border-color: var(--ns-color-text-3);
883
+ }
884
+ .ns-fx-ginput__hint {
885
+ color: var(--ns-color-text-3);
886
+ font-size: var(--ns-font-size-12);
887
+ }
888
+ .ns-fx-ginput__error {
889
+ display: inline-flex;
890
+ align-items: center;
891
+ gap: 6px;
892
+ color: var(--ns-color-text-1);
893
+ font-size: var(--ns-font-size-12);
894
+ }
895
+ .ns-fx-ginput__error::before {
896
+ content: '';
897
+ width: 6px;
898
+ height: 6px;
899
+ border: 1.5px solid currentColor;
900
+ transform: rotate(45deg);
901
+ }
902
+
903
+ /* ----------------------------------------------------------- MeridianTabs */
904
+
905
+ .ns-fx-mtabs__list {
906
+ position: relative;
907
+ display: flex;
908
+ gap: 2px;
909
+ padding-top: 16px;
910
+ border-bottom: 1px solid var(--ns-color-line-1);
911
+ }
912
+ .ns-fx-mtabs__tab {
913
+ padding: 8px 12px;
914
+ border: 0;
915
+ border-radius: var(--ns-radius-6) var(--ns-radius-6) 0 0;
916
+ background: none;
917
+ color: var(--ns-color-text-2);
918
+ font: inherit;
919
+ font-size: var(--ns-font-size-13);
920
+ font-weight: var(--ns-font-weight-medium);
921
+ cursor: pointer;
922
+ transition: color var(--ns-motion-duration-120) ease;
923
+ }
924
+ .ns-fx-mtabs__tab:hover,
925
+ .ns-fx-mtabs__tab[aria-selected='true'] {
926
+ color: var(--ns-color-text-1);
927
+ }
928
+ .ns-fx-mtabs__tab:disabled {
929
+ opacity: 0.4;
930
+ cursor: not-allowed;
931
+ }
932
+ .ns-fx-mtabs__tab:focus-visible {
933
+ outline-offset: -2px;
934
+ }
935
+ .ns-fx-mtabs__track {
936
+ position: absolute;
937
+ left: 0;
938
+ bottom: -1px;
939
+ width: 100px;
940
+ height: 0;
941
+ transform: translateX(var(--ns-fx-x));
942
+ pointer-events: none;
943
+ }
944
+ .ns-fx-mtabs__bar {
945
+ position: absolute;
946
+ left: 0;
947
+ bottom: 0;
948
+ width: 100px;
949
+ height: 2px;
950
+ background: var(--ns-color-signal);
951
+ transform-origin: left;
952
+ transform: scaleX(calc(var(--ns-fx-w) / 100));
953
+ }
954
+ .ns-fx-mtabs__carrier {
955
+ position: absolute;
956
+ left: -5px;
957
+ bottom: -4px;
958
+ width: 10px;
959
+ height: 10px;
960
+ transform: translateX(calc(var(--ns-fx-w) * 0.5px));
961
+ }
962
+ .ns-fx-mtabs__hop {
963
+ display: block;
964
+ width: 10px;
965
+ height: 10px;
966
+ fill: var(--ns-color-signal);
967
+ }
968
+ .ns-fx-mtabs__hop svg {
969
+ display: block;
970
+ }
971
+ .ns-fx-mtabs[data-ready] :is(.ns-fx-mtabs__track, .ns-fx-mtabs__bar, .ns-fx-mtabs__carrier) {
972
+ transition: transform var(--ns-motion-duration-layout) var(--ns-motion-easing-travel);
973
+ }
974
+ .ns-fx-mtabs__hop--go {
975
+ animation: ns-fx-hop var(--ns-motion-duration-layout) var(--ns-fx-sine);
976
+ }
977
+ @keyframes ns-fx-hop {
978
+ 50% { transform: translateY(-18px) rotate(90deg) scale(1.25); }
979
+ }
980
+ .ns-fx-mtabs__panel {
981
+ padding-top: 14px;
982
+ color: var(--ns-color-text-2);
983
+ font-size: var(--ns-font-size-13);
984
+ border-radius: var(--ns-radius-4);
985
+ }
986
+
987
+ /* --------------------------------------------------------- StarPagination */
988
+
989
+ .ns-fx-spage {
990
+ display: inline-flex;
991
+ flex-wrap: wrap;
992
+ align-items: center;
993
+ gap: 6px;
994
+ max-width: 100%;
995
+ }
996
+ .ns-fx-spage__step {
997
+ display: grid;
998
+ place-items: center;
999
+ width: 28px;
1000
+ height: 28px;
1001
+ border: 1px solid var(--ns-color-line-2);
1002
+ border-radius: var(--ns-radius-6);
1003
+ background: transparent;
1004
+ color: var(--ns-color-text-2);
1005
+ cursor: pointer;
1006
+ }
1007
+ .ns-fx-spage__step:hover:not(:disabled) {
1008
+ background: var(--ns-color-surface-2);
1009
+ color: var(--ns-color-text-1);
1010
+ }
1011
+ .ns-fx-spage__step:disabled {
1012
+ opacity: 0.4;
1013
+ cursor: default;
1014
+ }
1015
+ .ns-fx-spage__dots {
1016
+ display: flex;
1017
+ gap: 0;
1018
+ margin: 0;
1019
+ padding: 0;
1020
+ list-style: none;
1021
+ }
1022
+ .ns-fx-spage__dot {
1023
+ position: relative;
1024
+ display: grid;
1025
+ place-items: center;
1026
+ width: 24px;
1027
+ height: 28px;
1028
+ padding: 0;
1029
+ border: 0;
1030
+ border-radius: var(--ns-radius-4);
1031
+ background: none;
1032
+ cursor: pointer;
1033
+ }
1034
+ .ns-fx-spage__point {
1035
+ width: 4px;
1036
+ height: 4px;
1037
+ border-radius: 50%;
1038
+ background: var(--ns-color-text-3);
1039
+ transition: transform var(--ns-motion-duration-320) var(--ns-fx-pop), opacity var(--ns-motion-duration-200) ease;
1040
+ }
1041
+ .ns-fx-spage__star {
1042
+ position: absolute;
1043
+ top: 8px;
1044
+ left: 6px;
1045
+ width: 12px;
1046
+ height: 12px;
1047
+ fill: var(--ns-color-signal);
1048
+ opacity: 0;
1049
+ transform: scale(0) rotate(-90deg);
1050
+ transition: transform var(--ns-motion-duration-settle) var(--ns-fx-spring), opacity var(--ns-motion-duration-200) ease;
1051
+ }
1052
+ .ns-fx-spage__dot:hover .ns-fx-spage__point {
1053
+ transform: scale(1.6);
1054
+ }
1055
+ .ns-fx-spage__dot--edge .ns-fx-spage__point {
1056
+ opacity: 0.5;
1057
+ transform: scale(0.6);
1058
+ }
1059
+ .ns-fx-spage__dot[aria-current] .ns-fx-spage__point {
1060
+ opacity: 0;
1061
+ transform: scale(0);
1062
+ }
1063
+ .ns-fx-spage__dot[aria-current] .ns-fx-spage__star {
1064
+ opacity: 1;
1065
+ transform: scale(1) rotate(0deg);
1066
+ }
1067
+ .ns-fx-spage__readout {
1068
+ margin-left: 6px;
1069
+ white-space: nowrap;
1070
+ color: var(--ns-color-text-3);
1071
+ font-family: var(--ns-font-family-mono);
1072
+ font-size: var(--ns-font-size-12);
1073
+ font-variant-numeric: tabular-nums;
1074
+ }
1075
+
1076
+ /* ------------------------------------------------ ConstellationBreadcrumb */
1077
+
1078
+ .ns-fx-crumbs__list {
1079
+ display: flex;
1080
+ flex-wrap: wrap;
1081
+ align-items: center;
1082
+ margin: 0;
1083
+ padding: 0;
1084
+ list-style: none;
1085
+ }
1086
+ .ns-fx-crumbs__item {
1087
+ position: relative;
1088
+ display: inline-flex;
1089
+ align-items: center;
1090
+ gap: 6px;
1091
+ font-size: var(--ns-font-size-13);
1092
+ }
1093
+ .ns-fx-crumbs__item + .ns-fx-crumbs__item {
1094
+ padding-left: 30px;
1095
+ }
1096
+ .ns-fx-crumbs__item + .ns-fx-crumbs__item::before {
1097
+ content: '';
1098
+ position: absolute;
1099
+ left: 6px;
1100
+ top: 50%;
1101
+ width: 18px;
1102
+ height: 1px;
1103
+ background: var(--ns-color-line-2);
1104
+ }
1105
+ .ns-fx-crumbs__star {
1106
+ flex: none;
1107
+ width: calc(6px + 5px * var(--ns-fx-mag));
1108
+ height: calc(6px + 5px * var(--ns-fx-mag));
1109
+ fill: var(--ns-color-text-3);
1110
+ opacity: var(--ns-fx-mag);
1111
+ transition: transform var(--ns-motion-duration-settle) var(--ns-fx-spring), opacity var(--ns-motion-duration-200) ease;
1112
+ }
1113
+ .ns-fx-crumbs__link {
1114
+ border-radius: 2px;
1115
+ color: var(--ns-color-text-2);
1116
+ text-decoration: none;
1117
+ }
1118
+ .ns-fx-crumbs__link:hover {
1119
+ color: var(--ns-color-text-1);
1120
+ }
1121
+ .ns-fx-crumbs__item:is(:hover, :focus-within) .ns-fx-crumbs__star {
1122
+ opacity: 1;
1123
+ fill: var(--ns-color-signal);
1124
+ transform: scale(1.3) rotate(90deg);
1125
+ }
1126
+ .ns-fx-crumbs__current {
1127
+ color: var(--ns-color-text-1);
1128
+ font-weight: var(--ns-font-weight-medium);
1129
+ }
1130
+ .ns-fx-crumbs__item:last-child .ns-fx-crumbs__star {
1131
+ fill: var(--ns-color-signal);
1132
+ }
1133
+
1134
+ /* ---------------------------------------------------------- RollingNumber */
1135
+
1136
+ .ns-fx-roll {
1137
+ display: inline-flex;
1138
+ font-family: var(--ns-font-family-mono);
1139
+ font-variant-numeric: tabular-nums;
1140
+ line-height: 1.25;
1141
+ }
1142
+ .ns-fx-roll__reels {
1143
+ display: inline-flex;
1144
+ }
1145
+ .ns-fx-roll__col {
1146
+ display: inline-block;
1147
+ height: 1.25em;
1148
+ overflow: hidden;
1149
+ -webkit-mask-image: linear-gradient(transparent, #000 12%, #000 88%, transparent);
1150
+ mask-image: linear-gradient(transparent, #000 12%, #000 88%, transparent);
1151
+ }
1152
+ .ns-fx-roll__reel {
1153
+ display: flex;
1154
+ flex-direction: column;
1155
+ transform: translateY(calc(var(--ns-fx-d) * -10%));
1156
+ transition: transform var(--ns-motion-duration-reveal) var(--ns-fx-glide) calc(var(--ns-fx-place) * 55ms);
1157
+ }
1158
+ .ns-fx-roll__reel > span {
1159
+ display: block;
1160
+ height: 1.25em;
1161
+ text-align: center;
1162
+ }
1163
+
1164
+ /* --------------------------------------------------------- HorizonDivider */
1165
+
1166
+ .ns-fx-horizon {
1167
+ display: flex;
1168
+ align-items: center;
1169
+ gap: 10px;
1170
+ width: 100%;
1171
+ margin: 8px 0;
1172
+ color: var(--ns-color-text-2);
1173
+ font-size: var(--ns-font-size-12);
1174
+ }
1175
+ .ns-fx-horizon__line {
1176
+ flex: 1;
1177
+ height: 1px;
1178
+ background: linear-gradient(90deg, transparent, var(--ns-color-line-2) 35%, var(--ns-color-data-horizon));
1179
+ transform-origin: right;
1180
+ }
1181
+ .ns-fx-horizon__line--end {
1182
+ background: linear-gradient(90deg, var(--ns-color-data-horizon), var(--ns-color-line-2) 65%, transparent);
1183
+ transform-origin: left;
1184
+ }
1185
+ .ns-fx-horizon__star {
1186
+ flex: none;
1187
+ width: 10px;
1188
+ height: 10px;
1189
+ fill: var(--ns-color-data-horizon);
1190
+ }
1191
+ .ns-fx-horizon--rise .ns-fx-horizon__line {
1192
+ animation: ns-fx-rise 900ms var(--ns-fx-glide) both;
1193
+ }
1194
+ .ns-fx-horizon--rise .ns-fx-horizon__star {
1195
+ animation: ns-fx-star-in var(--ns-motion-duration-reveal) var(--ns-fx-spring) 300ms both;
1196
+ }
1197
+ @keyframes ns-fx-rise { from { transform: scaleX(0); opacity: 0; } }
1198
+ @keyframes ns-fx-star-in { from { transform: scale(0) rotate(-90deg); opacity: 0; } }
1199
+
1200
+ /* ----------------------------------------------------- StarfieldEmptyState */
1201
+
1202
+ .ns-fx-starfield {
1203
+ position: relative;
1204
+ isolation: isolate;
1205
+ display: grid;
1206
+ place-items: center;
1207
+ min-height: 260px;
1208
+ padding: 40px 24px;
1209
+ overflow: hidden;
1210
+ border: 1px solid var(--ns-color-line-1);
1211
+ border-radius: var(--ns-radius-12);
1212
+ background: var(--ns-color-surface-1);
1213
+ }
1214
+ .ns-fx-starfield__sky {
1215
+ position: absolute;
1216
+ inset: 0;
1217
+ z-index: -1;
1218
+ width: 100%;
1219
+ height: 100%;
1220
+ color: var(--ns-color-data-star);
1221
+ -webkit-mask-image: radial-gradient(ellipse 60% 55% at 50% 50%, transparent 25%, #000 75%);
1222
+ mask-image: radial-gradient(ellipse 60% 55% at 50% 50%, transparent 25%, #000 75%);
1223
+ }
1224
+ .ns-fx-starfield__star {
1225
+ fill: currentColor;
1226
+ }
1227
+ .ns-fx-starfield__lines {
1228
+ fill: none;
1229
+ stroke: var(--ns-color-signal-edge);
1230
+ stroke-width: 0.6;
1231
+ opacity: 0.5;
1232
+ }
1233
+ .ns-fx-starfield__layer--0 { animation: ns-fx-drift-a 37s var(--ns-fx-sine) infinite alternate; }
1234
+ .ns-fx-starfield__layer--1 { animation: ns-fx-drift-b 31s var(--ns-fx-sine) infinite alternate; }
1235
+ .ns-fx-starfield__layer--2 { animation: ns-fx-drift-c 23s var(--ns-fx-sine) infinite alternate; }
1236
+ @keyframes ns-fx-drift-a { to { transform: translate(-7px, 3px); } }
1237
+ @keyframes ns-fx-drift-b { to { transform: translate(5px, -4px); } }
1238
+ @keyframes ns-fx-drift-c { to { transform: translate(-3px, -3px); } }
1239
+ .ns-fx-starfield__star--twinkle {
1240
+ animation: ns-fx-dim var(--ns-fx-t) var(--ns-fx-sine) infinite alternate;
1241
+ }
1242
+ .ns-fx-starfield__body {
1243
+ display: grid;
1244
+ justify-items: center;
1245
+ gap: 8px;
1246
+ max-width: 380px;
1247
+ text-align: center;
1248
+ }
1249
+ .ns-fx-starfield__north {
1250
+ width: 20px;
1251
+ height: 20px;
1252
+ margin-bottom: 4px;
1253
+ fill: var(--ns-color-signal);
1254
+ animation: ns-fx-star-in var(--ns-motion-duration-reveal) var(--ns-fx-spring) both;
1255
+ }
1256
+ .ns-fx-starfield__title {
1257
+ margin: 0;
1258
+ color: var(--ns-color-text-1);
1259
+ font-size: var(--ns-font-size-15);
1260
+ font-weight: var(--ns-font-weight-semibold);
1261
+ line-height: var(--ns-font-line-height-15);
1262
+ }
1263
+ .ns-fx-starfield__desc {
1264
+ margin: 0;
1265
+ color: var(--ns-color-text-2);
1266
+ font-size: var(--ns-font-size-13);
1267
+ line-height: var(--ns-font-line-height-13);
1268
+ }
1269
+ .ns-fx-starfield__action {
1270
+ margin-top: 8px;
1271
+ }
1272
+
1273
+ /* ------------------------------------------------------------ OrbitAvatar */
1274
+
1275
+ .ns-fx-oavatar {
1276
+ position: relative;
1277
+ display: inline-grid;
1278
+ flex: none;
1279
+ place-items: center;
1280
+ width: var(--ns-fx-s);
1281
+ height: var(--ns-fx-s);
1282
+ vertical-align: middle;
1283
+ }
1284
+ .ns-fx-oavatar__face {
1285
+ display: grid;
1286
+ place-items: center;
1287
+ width: 100%;
1288
+ height: 100%;
1289
+ border-radius: 50%;
1290
+ background: var(--ns-color-surface-3);
1291
+ color: var(--ns-color-text-1);
1292
+ font-size: calc(var(--ns-fx-s) * 0.38);
1293
+ font-weight: var(--ns-font-weight-semibold);
1294
+ letter-spacing: 0.02em;
1295
+ }
1296
+ .ns-fx-oavatar__orbit {
1297
+ position: absolute;
1298
+ inset: -5px;
1299
+ width: calc(100% + 10px);
1300
+ height: calc(100% + 10px);
1301
+ overflow: visible;
1302
+ pointer-events: none;
1303
+ }
1304
+ .ns-fx-oavatar__ring {
1305
+ fill: none;
1306
+ stroke: var(--ns-color-line-2);
1307
+ stroke-width: 1;
1308
+ stroke-dasharray: 1 3.2;
1309
+ opacity: 0;
1310
+ transition: opacity var(--ns-motion-duration-200) ease;
1311
+ }
1312
+ .ns-fx-oavatar__arm {
1313
+ transform-box: view-box;
1314
+ transform-origin: 20px 20px;
1315
+ opacity: 0;
1316
+ transition: opacity var(--ns-motion-duration-200) ease;
1317
+ }
1318
+ .ns-fx-oavatar__moon {
1319
+ fill: var(--ns-color-signal);
1320
+ }
1321
+ :is(.ns-fx-oavatar:hover, .ns-fx-orbit-host:is(:hover, :focus-visible) .ns-fx-oavatar) :is(.ns-fx-oavatar__ring, .ns-fx-oavatar__arm) {
1322
+ opacity: 1;
1323
+ }
1324
+ :is(.ns-fx-oavatar:hover, .ns-fx-orbit-host:is(:hover, :focus-visible) .ns-fx-oavatar) .ns-fx-oavatar__arm {
1325
+ animation: ns-fx-orbit-once 1.4s var(--ns-fx-glide);
1326
+ }
1327
+
1328
+ /* --------------------------------------------------------------- TagOrbit */
1329
+
1330
+ .ns-fx-tag {
1331
+ display: inline-flex;
1332
+ align-items: center;
1333
+ gap: 6px;
1334
+ height: 24px;
1335
+ padding: 0 10px 0 8px;
1336
+ border: 1px solid var(--ns-color-line-2);
1337
+ border-radius: var(--ns-radius-full);
1338
+ background: var(--ns-color-surface-1);
1339
+ color: var(--ns-color-text-1);
1340
+ font-size: var(--ns-font-size-12);
1341
+ vertical-align: middle;
1342
+ }
1343
+ .ns-fx-tag:has(.ns-fx-tag__remove) {
1344
+ padding-right: 3px;
1345
+ }
1346
+ .ns-fx-tag__star {
1347
+ flex: none;
1348
+ width: 8px;
1349
+ height: 8px;
1350
+ fill: var(--ns-color-signal);
1351
+ }
1352
+ .ns-fx-tag__remove {
1353
+ display: grid;
1354
+ place-items: center;
1355
+ width: 18px;
1356
+ height: 18px;
1357
+ padding: 0;
1358
+ border: 0;
1359
+ border-radius: 50%;
1360
+ background: transparent;
1361
+ color: var(--ns-color-text-3);
1362
+ cursor: pointer;
1363
+ }
1364
+ .ns-fx-tag__remove:hover {
1365
+ background: var(--ns-color-surface-3);
1366
+ color: var(--ns-color-text-1);
1367
+ }
1368
+ .ns-fx-tag[data-leaving] {
1369
+ animation: ns-fx-fold 360ms var(--ns-motion-easing-exit) both;
1370
+ }
1371
+ .ns-fx-tag[data-leaving] .ns-fx-tag__star {
1372
+ animation: ns-fx-star-out 300ms var(--ns-motion-easing-exit) both;
1373
+ }
1374
+ @keyframes ns-fx-fold { 40% { opacity: 1; } to { opacity: 0; transform: scale(0.88); } }
1375
+ @keyframes ns-fx-star-out { 40% { transform: scale(1.7) rotate(45deg); opacity: 1; } to { transform: scale(0.2) rotate(90deg); opacity: 0; } }
1376
+
1377
+ /* ------------------------------------------------- SineDisclosure / Accordion */
1378
+
1379
+ .ns-fx-accordion {
1380
+ border-top: 1px solid var(--ns-color-line-1);
1381
+ }
1382
+ .ns-fx-accordion > .ns-fx-sine {
1383
+ border-bottom: 1px solid var(--ns-color-line-1);
1384
+ }
1385
+ .ns-fx-sine__heading {
1386
+ margin: 0;
1387
+ font: inherit;
1388
+ }
1389
+ .ns-fx-sine__trigger {
1390
+ display: flex;
1391
+ align-items: center;
1392
+ justify-content: space-between;
1393
+ gap: 12px;
1394
+ width: 100%;
1395
+ padding: 12px 4px;
1396
+ border: 0;
1397
+ border-radius: var(--ns-radius-4);
1398
+ background: none;
1399
+ color: var(--ns-color-text-1);
1400
+ font: inherit;
1401
+ font-size: var(--ns-font-size-13);
1402
+ font-weight: var(--ns-font-weight-medium);
1403
+ text-align: left;
1404
+ cursor: pointer;
1405
+ }
1406
+ .ns-fx-sine__trigger:disabled {
1407
+ opacity: 0.5;
1408
+ cursor: not-allowed;
1409
+ }
1410
+ .ns-fx-sine__mark {
1411
+ flex: none;
1412
+ width: 16px;
1413
+ height: 16px;
1414
+ fill: none;
1415
+ stroke: var(--ns-color-text-3);
1416
+ stroke-width: 1;
1417
+ transition: transform var(--ns-motion-duration-reveal) var(--ns-fx-sine);
1418
+ }
1419
+ .ns-fx-sine__meridian {
1420
+ transform-box: fill-box;
1421
+ transform-origin: center;
1422
+ transition: transform var(--ns-motion-duration-reveal) var(--ns-fx-sine);
1423
+ }
1424
+ .ns-fx-sine__trigger:hover .ns-fx-sine__mark,
1425
+ .ns-fx-sine[data-state='open'] .ns-fx-sine__mark {
1426
+ stroke: var(--ns-color-signal);
1427
+ }
1428
+ .ns-fx-sine[data-state='open'] .ns-fx-sine__mark {
1429
+ transform: rotate(90deg);
1430
+ }
1431
+ .ns-fx-sine[data-state='open'] .ns-fx-sine__meridian {
1432
+ transform: scaleX(0.15);
1433
+ }
1434
+ .ns-fx-sine__inner {
1435
+ padding: 0 4px 14px;
1436
+ color: var(--ns-color-text-2);
1437
+ font-size: var(--ns-font-size-13);
1438
+ line-height: var(--ns-font-line-height-13);
1439
+ }
1440
+ .ns-fx-sine__inner > * {
1441
+ margin-top: 0;
1442
+ }
1443
+ .ns-fx-sine[data-state='open'] .ns-fx-sine__inner,
1444
+ .ns-fx-sine[data-state='open'] .ns-fx-sine__inner > * {
1445
+ animation: ns-fx-sine-in 520ms var(--ns-fx-sine) both;
1446
+ }
1447
+ .ns-fx-sine__inner > :nth-child(2) { animation-delay: 80ms !important; }
1448
+ .ns-fx-sine__inner > :nth-child(3) { animation-delay: 160ms !important; }
1449
+ .ns-fx-sine__inner > :nth-child(n + 4) { animation-delay: 240ms !important; }
1450
+ @keyframes ns-fx-sine-in { from { opacity: 0; transform: translateY(6px); } }
1451
+
1452
+ /* --------------------------------------------------------- TooltipCompass */
1453
+
1454
+ .ns-fx-tipc {
1455
+ --ns-fx-tip-y: 4px;
1456
+ --ns-fx-base: 0deg;
1457
+ position: relative;
1458
+ display: inline-flex;
1459
+ }
1460
+ .ns-fx-tipc[data-side='bottom'] {
1461
+ --ns-fx-tip-y: -4px;
1462
+ --ns-fx-base: 180deg;
1463
+ }
1464
+ .ns-fx-tipc__bubble {
1465
+ position: absolute;
1466
+ bottom: calc(100% + 16px);
1467
+ left: 50%;
1468
+ z-index: var(--ns-z-tooltip);
1469
+ width: max-content;
1470
+ max-width: 240px;
1471
+ padding: 6px 10px;
1472
+ border: 1px solid var(--ns-color-line-2);
1473
+ border-radius: var(--ns-radius-6);
1474
+ background: var(--ns-color-surface-3);
1475
+ box-shadow: var(--ns-elevation-2);
1476
+ color: var(--ns-color-text-1);
1477
+ font-size: var(--ns-font-size-12);
1478
+ line-height: var(--ns-font-line-height-12);
1479
+ pointer-events: none;
1480
+ transform: translateX(-50%);
1481
+ animation: ns-fx-tip-in var(--ns-motion-duration-200) var(--ns-motion-easing-enter) both;
1482
+ }
1483
+ .ns-fx-tipc[data-side='bottom'] .ns-fx-tipc__bubble {
1484
+ top: calc(100% + 16px);
1485
+ bottom: auto;
1486
+ }
1487
+ @keyframes ns-fx-tip-in { from { opacity: 0; transform: translate(-50%, var(--ns-fx-tip-y)); } }
1488
+ .ns-fx-tipc__needle {
1489
+ position: absolute;
1490
+ top: calc(100% + 1px);
1491
+ left: 50%;
1492
+ width: 10px;
1493
+ height: 16px;
1494
+ margin-left: -5px;
1495
+ overflow: visible;
1496
+ transform: rotate(var(--ns-fx-base));
1497
+ animation: ns-fx-needle var(--ns-motion-duration-reveal) var(--ns-fx-glide) both;
1498
+ }
1499
+ .ns-fx-tipc[data-side='bottom'] .ns-fx-tipc__needle {
1500
+ top: auto;
1501
+ bottom: calc(100% + 1px);
1502
+ }
1503
+ @keyframes ns-fx-needle {
1504
+ 0% { transform: rotate(calc(var(--ns-fx-base) - 55deg)); }
1505
+ 40% { transform: rotate(calc(var(--ns-fx-base) + 20deg)); }
1506
+ 65% { transform: rotate(calc(var(--ns-fx-base) - 8deg)); }
1507
+ 85% { transform: rotate(calc(var(--ns-fx-base) + 3deg)); }
1508
+ 100% { transform: rotate(var(--ns-fx-base)); }
1509
+ }
1510
+ .ns-fx-tipc__tail { fill: var(--ns-color-text-3); }
1511
+ .ns-fx-tipc__head { fill: var(--ns-color-signal); }
1512
+
1513
+ /* ------------------------------------------------------------- ToastComet */
1514
+
1515
+ .ns-fx-comet {
1516
+ position: relative;
1517
+ width: 360px;
1518
+ max-width: 100%;
1519
+ }
1520
+ .ns-fx-comet__x {
1521
+ animation: ns-fx-comet-x 640ms cubic-bezier(0.16, 1, 0.3, 1) both;
1522
+ }
1523
+ .ns-fx-comet__y {
1524
+ position: relative;
1525
+ animation: ns-fx-comet-y 640ms cubic-bezier(0.7, 0, 0.84, 0.4) both;
1526
+ }
1527
+ @keyframes ns-fx-comet-x { from { transform: translateX(72px); } }
1528
+ @keyframes ns-fx-comet-y { from { transform: translateY(-36px); } }
1529
+ .ns-fx-comet__card {
1530
+ position: relative;
1531
+ display: flex;
1532
+ align-items: flex-start;
1533
+ gap: 10px;
1534
+ padding: 12px 10px 12px 14px;
1535
+ border: 1px solid var(--ns-color-line-2);
1536
+ border-radius: 10px;
1537
+ background: var(--ns-color-surface-2);
1538
+ box-shadow: var(--ns-elevation-2);
1539
+ animation: ns-fx-fade-in 240ms ease both;
1540
+ }
1541
+ @keyframes ns-fx-fade-in { from { opacity: 0; } }
1542
+ .ns-fx-comet__tail {
1543
+ position: absolute;
1544
+ top: 0;
1545
+ right: 6px;
1546
+ z-index: -1;
1547
+ width: 140px;
1548
+ height: 2px;
1549
+ border-radius: 1px;
1550
+ background: linear-gradient(90deg, var(--ns-color-signal), var(--ns-color-signal-wash) 40%, transparent);
1551
+ transform-origin: 0 50%;
1552
+ opacity: 0;
1553
+ pointer-events: none;
1554
+ animation: ns-fx-tail 900ms var(--ns-fx-glide) both;
1555
+ }
1556
+ @keyframes ns-fx-tail {
1557
+ 0% { opacity: 0.95; transform: rotate(-27deg) scaleX(1); }
1558
+ 100% { opacity: 0; transform: rotate(-27deg) scaleX(0.05); }
1559
+ }
1560
+ .ns-fx-comet__head {
1561
+ flex: none;
1562
+ width: 6px;
1563
+ height: 6px;
1564
+ margin-top: 6px;
1565
+ border-radius: 50%;
1566
+ background: var(--ns-color-signal);
1567
+ box-shadow: 0 0 0 3px var(--ns-color-signal-wash);
1568
+ }
1569
+ .ns-fx-comet__text {
1570
+ flex: 1;
1571
+ min-width: 0;
1572
+ }
1573
+ .ns-fx-comet__title {
1574
+ color: var(--ns-color-text-1);
1575
+ font-size: var(--ns-font-size-13);
1576
+ font-weight: var(--ns-font-weight-semibold);
1577
+ line-height: var(--ns-font-line-height-13);
1578
+ }
1579
+ .ns-fx-comet__desc {
1580
+ margin-top: 2px;
1581
+ color: var(--ns-color-text-2);
1582
+ font-size: var(--ns-font-size-12);
1583
+ line-height: var(--ns-font-line-height-12);
1584
+ }
1585
+ .ns-fx-comet__close {
1586
+ display: grid;
1587
+ flex: none;
1588
+ place-items: center;
1589
+ width: 24px;
1590
+ height: 24px;
1591
+ padding: 0;
1592
+ border: 0;
1593
+ border-radius: var(--ns-radius-6);
1594
+ background: transparent;
1595
+ color: var(--ns-color-text-3);
1596
+ cursor: pointer;
1597
+ }
1598
+ .ns-fx-comet__close:hover {
1599
+ background: var(--ns-color-surface-3);
1600
+ color: var(--ns-color-text-1);
1601
+ }
1602
+ .ns-fx-comet[data-leaving] .ns-fx-comet__card {
1603
+ animation: ns-fx-comet-out 220ms var(--ns-motion-easing-exit) both;
1604
+ }
1605
+ @keyframes ns-fx-comet-out { to { opacity: 0; transform: translateX(18px); } }
1606
+
1607
+ /* -------------------------------------------------- Reduced motion, forced colours */
1608
+
1609
+ @media (prefers-reduced-motion: reduce) {
1610
+ [class*='ns-fx-'],
1611
+ [class*='ns-fx-']::before,
1612
+ [class*='ns-fx-']::after {
1613
+ animation: none !important;
1614
+ transition: none !important;
1615
+ }
1616
+ /* Loaders stop and say what they are doing. */
1617
+ .ns-fx-loader__label {
1618
+ position: static;
1619
+ width: auto;
1620
+ height: auto;
1621
+ margin: 0;
1622
+ overflow: visible;
1623
+ clip: auto;
1624
+ color: var(--ns-color-text-2);
1625
+ font-size: var(--ns-font-size-12);
1626
+ }
1627
+ .ns-fx-seed {
1628
+ opacity: 0.75;
1629
+ }
1630
+ .ns-fx-liss__x:not(:first-of-type) {
1631
+ display: none;
1632
+ }
1633
+ }
1634
+
1635
+ @media (forced-colors: active) {
1636
+ .ns-fx-cbutton::after {
1637
+ display: none;
1638
+ }
1639
+ .ns-fx-starlink__star,
1640
+ .ns-fx-mtabs__hop,
1641
+ .ns-fx-spage__star,
1642
+ .ns-fx-crumbs__star,
1643
+ .ns-fx-tag__star,
1644
+ .ns-fx-horizon__star,
1645
+ .ns-fx-ccheck__st,
1646
+ .ns-fx-rorbit__planet,
1647
+ .ns-fx-compass__north,
1648
+ .ns-fx-tipc__head {
1649
+ fill: CanvasText;
1650
+ }
1651
+ .ns-fx-ccheck__ln,
1652
+ .ns-fx-sextant__lit {
1653
+ stroke: CanvasText;
1654
+ }
1655
+ .ns-fx-mtabs__bar,
1656
+ .ns-fx-sslider__rail::before {
1657
+ background: Highlight;
1658
+ }
1659
+ }