@northstar-js/react 0.0.0-stage → 0.1.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 (104) hide show
  1. package/LICENSE +21 -0
  2. package/dist/actions.d.ts +32 -0
  3. package/dist/actions.d.ts.map +1 -0
  4. package/dist/actions.js +15 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/data.d.ts +80 -0
  7. package/dist/data.d.ts.map +1 -0
  8. package/dist/data.js +60 -0
  9. package/dist/data.js.map +1 -0
  10. package/dist/feedback.d.ts +50 -0
  11. package/dist/feedback.d.ts.map +1 -0
  12. package/dist/feedback.js +60 -0
  13. package/dist/feedback.js.map +1 -0
  14. package/dist/forms.d.ts +130 -0
  15. package/dist/forms.d.ts.map +1 -0
  16. package/dist/forms.js +241 -0
  17. package/dist/forms.js.map +1 -0
  18. package/dist/illustrations/data.d.ts +103 -0
  19. package/dist/illustrations/data.d.ts.map +1 -0
  20. package/dist/illustrations/data.js +3 -0
  21. package/dist/illustrations/data.js.map +1 -0
  22. package/dist/illustrations/index.d.ts +110 -0
  23. package/dist/illustrations/index.d.ts.map +1 -0
  24. package/dist/illustrations/index.js +54 -0
  25. package/dist/illustrations/index.js.map +1 -0
  26. package/dist/illustrations/types.d.ts +30 -0
  27. package/dist/illustrations/types.d.ts.map +1 -0
  28. package/dist/illustrations/types.js +2 -0
  29. package/dist/illustrations/types.js.map +1 -0
  30. package/dist/index.d.ts +18 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +9 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/internal/icons.d.ts +9 -0
  35. package/dist/internal/icons.d.ts.map +1 -0
  36. package/dist/internal/icons.js +12 -0
  37. package/dist/internal/icons.js.map +1 -0
  38. package/dist/internal/layers.d.ts +12 -0
  39. package/dist/internal/layers.d.ts.map +1 -0
  40. package/dist/internal/layers.js +108 -0
  41. package/dist/internal/layers.js.map +1 -0
  42. package/dist/internal/util.d.ts +9 -0
  43. package/dist/internal/util.d.ts.map +1 -0
  44. package/dist/internal/util.js +33 -0
  45. package/dist/internal/util.js.map +1 -0
  46. package/dist/layout.d.ts +34 -0
  47. package/dist/layout.d.ts.map +1 -0
  48. package/dist/layout.js +27 -0
  49. package/dist/layout.js.map +1 -0
  50. package/dist/navigation.d.ts +63 -0
  51. package/dist/navigation.d.ts.map +1 -0
  52. package/dist/navigation.js +87 -0
  53. package/dist/navigation.js.map +1 -0
  54. package/dist/northstar/BriefForm.d.ts +23 -0
  55. package/dist/northstar/BriefForm.d.ts.map +1 -0
  56. package/dist/northstar/BriefForm.js +40 -0
  57. package/dist/northstar/BriefForm.js.map +1 -0
  58. package/dist/northstar/ExportMenu.d.ts +14 -0
  59. package/dist/northstar/ExportMenu.d.ts.map +1 -0
  60. package/dist/northstar/ExportMenu.js +11 -0
  61. package/dist/northstar/ExportMenu.js.map +1 -0
  62. package/dist/northstar/PopulationPanel.d.ts +30 -0
  63. package/dist/northstar/PopulationPanel.d.ts.map +1 -0
  64. package/dist/northstar/PopulationPanel.js +18 -0
  65. package/dist/northstar/PopulationPanel.js.map +1 -0
  66. package/dist/northstar/ResearchBuilder.d.ts +26 -0
  67. package/dist/northstar/ResearchBuilder.d.ts.map +1 -0
  68. package/dist/northstar/ResearchBuilder.js +81 -0
  69. package/dist/northstar/ResearchBuilder.js.map +1 -0
  70. package/dist/northstar/ResponsesView.d.ts +20 -0
  71. package/dist/northstar/ResponsesView.d.ts.map +1 -0
  72. package/dist/northstar/ResponsesView.js +42 -0
  73. package/dist/northstar/ResponsesView.js.map +1 -0
  74. package/dist/northstar/Run.d.ts +35 -0
  75. package/dist/northstar/Run.d.ts.map +1 -0
  76. package/dist/northstar/Run.js +31 -0
  77. package/dist/northstar/Run.js.map +1 -0
  78. package/dist/northstar/StudyShell.d.ts +28 -0
  79. package/dist/northstar/StudyShell.d.ts.map +1 -0
  80. package/dist/northstar/StudyShell.js +14 -0
  81. package/dist/northstar/StudyShell.js.map +1 -0
  82. package/dist/northstar/StudyStatus.d.ts +15 -0
  83. package/dist/northstar/StudyStatus.d.ts.map +1 -0
  84. package/dist/northstar/StudyStatus.js +24 -0
  85. package/dist/northstar/StudyStatus.js.map +1 -0
  86. package/dist/northstar/index.d.ts +10 -0
  87. package/dist/northstar/index.d.ts.map +1 -0
  88. package/dist/northstar/index.js +10 -0
  89. package/dist/northstar/index.js.map +1 -0
  90. package/dist/northstar/messages.d.ts +84 -0
  91. package/dist/northstar/messages.d.ts.map +1 -0
  92. package/dist/northstar/messages.js +107 -0
  93. package/dist/northstar/messages.js.map +1 -0
  94. package/dist/overlays.d.ts +111 -0
  95. package/dist/overlays.d.ts.map +1 -0
  96. package/dist/overlays.js +421 -0
  97. package/dist/overlays.js.map +1 -0
  98. package/dist/provider.d.ts +53 -0
  99. package/dist/provider.d.ts.map +1 -0
  100. package/dist/provider.js +114 -0
  101. package/dist/provider.js.map +1 -0
  102. package/dist/styles.css +971 -0
  103. package/package.json +71 -3
  104. package/README.md +0 -3
@@ -0,0 +1,971 @@
1
+ /* @northstar-js/react — component styles. Uses only --ns-* custom properties
2
+ from @northstar-js/tokens (load tokens.css first). */
3
+
4
+ /* ---------------------------------------------------------------- root */
5
+
6
+ .ns-root {
7
+ --ns-control-h: var(--ns-density-control-height);
8
+ --ns-row-h: var(--ns-density-row-height);
9
+ --ns-row-pad: var(--ns-density-row-padding);
10
+ color: var(--ns-color-text-1);
11
+ font-family: var(--ns-font-family-ui);
12
+ font-size: var(--ns-font-size-13);
13
+ line-height: var(--ns-font-line-height-13);
14
+ -webkit-font-smoothing: antialiased;
15
+ }
16
+ .ns-root:not(.ns-portal) {
17
+ background: var(--ns-color-ground);
18
+ }
19
+ .ns-root[data-density='compact'] {
20
+ --ns-control-h: var(--ns-density-compact-control-height);
21
+ --ns-row-h: var(--ns-density-compact-row-height);
22
+ --ns-row-pad: var(--ns-density-compact-row-padding);
23
+ }
24
+ .ns-root[data-density='comfortable'] {
25
+ --ns-control-h: var(--ns-density-comfortable-control-height);
26
+ --ns-row-h: var(--ns-density-comfortable-row-height);
27
+ --ns-row-pad: var(--ns-density-comfortable-row-padding);
28
+ }
29
+ .ns-root *,
30
+ .ns-root *::before,
31
+ .ns-root *::after {
32
+ box-sizing: border-box;
33
+ }
34
+ .ns-portal {
35
+ position: relative;
36
+ z-index: var(--ns-z-popover);
37
+ }
38
+
39
+ .ns-visually-hidden {
40
+ position: absolute !important;
41
+ width: 1px;
42
+ height: 1px;
43
+ margin: -1px;
44
+ padding: 0;
45
+ overflow: hidden;
46
+ clip: rect(0 0 0 0);
47
+ white-space: nowrap;
48
+ border: 0;
49
+ }
50
+
51
+ /* Focus: a 2px ring in the focus role, with Day's halo behind it. */
52
+ .ns-button:focus-visible,
53
+ .ns-link:focus-visible,
54
+ .ns-switch:focus-visible,
55
+ .ns-tabs__trigger:focus-visible,
56
+ .ns-tabs__content:focus-visible,
57
+ .ns-menu__item:focus-visible,
58
+ .ns-sidebar__item:focus-visible,
59
+ .ns-table__sort:focus-visible,
60
+ .ns-tag__remove:focus-visible,
61
+ .ns-input__clear:focus-visible,
62
+ .ns-skip-link:focus-visible,
63
+ .ns-dialog:focus-visible,
64
+ .ns-sheet:focus-visible,
65
+ .ns-popover:focus-visible,
66
+ .ns-slider:focus-visible,
67
+ .ns-check__input:focus-visible + .ns-check__box,
68
+ .ns-input:focus-within,
69
+ .ns-select:focus-within,
70
+ .ns-textarea:focus-visible {
71
+ outline: 2px solid var(--ns-color-focus);
72
+ outline-offset: 1px;
73
+ box-shadow: 0 0 0 4px var(--ns-color-focus-halo);
74
+ }
75
+ .ns-input:focus-within .ns-input__control:focus-visible,
76
+ .ns-select__control:focus-visible {
77
+ outline: none;
78
+ }
79
+
80
+ /* -------------------------------------------------------------- sizes */
81
+
82
+ .ns-size-sm { --ns-h: var(--ns-size-control-sm); --ns-px: var(--ns-space-8); }
83
+ .ns-size-md { --ns-h: var(--ns-control-h, var(--ns-size-control-md)); --ns-px: var(--ns-space-12); }
84
+ .ns-size-lg { --ns-h: var(--ns-size-control-lg); --ns-px: var(--ns-space-12); }
85
+ .ns-size-xl { --ns-h: var(--ns-size-control-xl); --ns-px: var(--ns-space-16); font-size: var(--ns-font-size-15); }
86
+
87
+ @media (pointer: coarse) {
88
+ .ns-button,
89
+ .ns-input,
90
+ .ns-select,
91
+ .ns-switch-label,
92
+ .ns-check,
93
+ .ns-menu__item,
94
+ .ns-tabs__trigger,
95
+ .ns-sidebar__item,
96
+ .ns-option {
97
+ min-height: var(--ns-size-target-coarse);
98
+ }
99
+ .ns-icon-button {
100
+ min-width: var(--ns-size-target-coarse);
101
+ }
102
+ }
103
+
104
+ /* ------------------------------------------------------------ buttons */
105
+
106
+ .ns-button {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ justify-content: center;
110
+ gap: var(--ns-space-6);
111
+ height: var(--ns-h, var(--ns-size-control-md));
112
+ padding: 0 var(--ns-px, var(--ns-space-12));
113
+ border: 1px solid var(--ns-color-line-2);
114
+ border-radius: var(--ns-radius-6);
115
+ background: var(--ns-color-surface-2);
116
+ color: var(--ns-color-text-1);
117
+ font: inherit;
118
+ font-weight: var(--ns-font-weight-medium);
119
+ white-space: nowrap;
120
+ cursor: pointer;
121
+ user-select: none;
122
+ transition: background-color var(--ns-motion-duration-120) var(--ns-motion-easing-settle),
123
+ border-color var(--ns-motion-duration-120) var(--ns-motion-easing-settle);
124
+ }
125
+ .ns-button:hover:not(:disabled) { background: var(--ns-color-surface-3); }
126
+ .ns-button:active:not(:disabled) { border-color: var(--ns-color-text-3); }
127
+ .ns-button:disabled {
128
+ cursor: not-allowed;
129
+ color: var(--ns-color-text-3);
130
+ background: var(--ns-color-surface-1);
131
+ border-color: var(--ns-color-line-1);
132
+ }
133
+ .ns-button--primary {
134
+ background: var(--ns-button-primary-bg);
135
+ border-color: var(--ns-button-primary-bg);
136
+ color: var(--ns-button-primary-fg);
137
+ }
138
+ .ns-button--primary:hover:not(:disabled) {
139
+ background: var(--ns-glacier-200);
140
+ border-color: var(--ns-glacier-200);
141
+ }
142
+ .ns-button--ghost {
143
+ background: transparent;
144
+ border-color: transparent;
145
+ color: var(--ns-color-text-2);
146
+ }
147
+ .ns-button--ghost:hover:not(:disabled) { color: var(--ns-color-text-1); background: var(--ns-color-surface-2); }
148
+ .ns-button--ghost:disabled { background: transparent; border-color: transparent; }
149
+ .ns-button[aria-current='page'] { color: var(--ns-color-text-1); background: var(--ns-color-surface-3); }
150
+ .ns-button.ns-tone-signal:not(.ns-button--primary) { color: var(--ns-color-signal); }
151
+ .ns-button[data-loading] { cursor: progress; }
152
+ .ns-button[data-loading] .ns-button__label { opacity: 0.7; }
153
+ .ns-icon-button { width: var(--ns-h, var(--ns-size-control-md)); padding: 0; }
154
+ .ns-icon-button svg { width: var(--ns-size-icon-sm); height: var(--ns-size-icon-sm); }
155
+
156
+ .ns-spinner {
157
+ width: 12px;
158
+ height: 12px;
159
+ border-radius: var(--ns-radius-full);
160
+ border: 1.5px solid currentColor;
161
+ border-right-color: transparent;
162
+ animation: ns-spin 700ms linear infinite;
163
+ }
164
+ @keyframes ns-spin { to { transform: rotate(360deg); } }
165
+
166
+ .ns-button-group { display: inline-flex; gap: var(--ns-space-6); }
167
+ .ns-button-group--attached { gap: 0; }
168
+ .ns-button-group--attached > .ns-button { border-radius: 0; }
169
+ .ns-button-group--attached > .ns-button + .ns-button { margin-left: -1px; }
170
+ .ns-button-group--attached > .ns-button:first-child { border-radius: var(--ns-radius-6) 0 0 var(--ns-radius-6); }
171
+ .ns-button-group--attached > .ns-button:last-child { border-radius: 0 var(--ns-radius-6) var(--ns-radius-6) 0; }
172
+ .ns-button-group--attached > .ns-button:focus-visible { position: relative; z-index: 1; }
173
+
174
+ .ns-link {
175
+ color: var(--ns-color-signal);
176
+ text-decoration: underline;
177
+ text-decoration-color: var(--ns-color-signal-edge);
178
+ text-underline-offset: 3px;
179
+ border-radius: var(--ns-radius-4);
180
+ }
181
+ .ns-link:hover { text-decoration-color: currentColor; }
182
+ .ns-link--neutral { color: var(--ns-color-text-1); text-decoration-color: var(--ns-color-line-2); }
183
+
184
+ /* -------------------------------------------------------------- forms */
185
+
186
+ .ns-field { display: flex; flex-direction: column; gap: var(--ns-space-6); }
187
+ .ns-field__label { color: var(--ns-color-text-1); font-weight: var(--ns-font-weight-medium); font-size: var(--ns-font-size-12); line-height: var(--ns-font-line-height-12); }
188
+ .ns-field__required { color: var(--ns-color-text-3); }
189
+ .ns-field__description,
190
+ .ns-field__error { margin: 0; font-size: var(--ns-font-size-12); line-height: var(--ns-font-line-height-12); color: var(--ns-color-text-2); }
191
+ .ns-field__error { color: var(--ns-color-text-1); font-weight: var(--ns-font-weight-medium); }
192
+
193
+ .ns-input,
194
+ .ns-select {
195
+ position: relative;
196
+ display: flex;
197
+ align-items: center;
198
+ gap: var(--ns-space-6);
199
+ height: var(--ns-h, var(--ns-size-control-md));
200
+ padding: 0 var(--ns-space-8);
201
+ border: 1px solid var(--ns-color-line-2);
202
+ border-radius: var(--ns-radius-6);
203
+ background: var(--ns-color-surface-1);
204
+ color: var(--ns-color-text-1);
205
+ min-width: 0;
206
+ }
207
+ .ns-input:hover:not(.ns-disabled),
208
+ .ns-select:hover { border-color: var(--ns-color-text-3); }
209
+ .ns-input__control,
210
+ .ns-select__control {
211
+ flex: 1;
212
+ min-width: 0;
213
+ height: 100%;
214
+ border: 0;
215
+ padding: 0;
216
+ background: transparent;
217
+ color: inherit;
218
+ font: inherit;
219
+ outline: none;
220
+ }
221
+ .ns-input__control::placeholder,
222
+ .ns-textarea::placeholder { color: var(--ns-color-text-3); }
223
+ .ns-input__control::-webkit-search-cancel-button { display: none; }
224
+ .ns-input__adornment { display: inline-flex; color: var(--ns-color-text-3); }
225
+ .ns-input__clear,
226
+ .ns-number__steppers button,
227
+ .ns-tag__remove {
228
+ display: inline-flex;
229
+ align-items: center;
230
+ justify-content: center;
231
+ padding: 2px;
232
+ border: 0;
233
+ border-radius: var(--ns-radius-4);
234
+ background: transparent;
235
+ color: var(--ns-color-text-3);
236
+ cursor: pointer;
237
+ }
238
+ .ns-input__clear:hover,
239
+ .ns-number__steppers button:hover:not(:disabled),
240
+ .ns-tag__remove:hover { color: var(--ns-color-text-1); background: var(--ns-color-surface-3); }
241
+ .ns-number__steppers { display: inline-flex; gap: var(--ns-space-2); }
242
+ .ns-number__steppers button:disabled { opacity: 0.4; cursor: not-allowed; }
243
+ .ns-number .ns-input__control { font-family: var(--ns-font-family-mono); font-variant-numeric: var(--ns-font-numeric-figures); }
244
+ .ns-invalid,
245
+ .ns-textarea.ns-invalid { border-color: var(--ns-color-text-1); border-style: dashed; }
246
+ .ns-disabled { opacity: 0.55; cursor: not-allowed; }
247
+
248
+ .ns-select { padding-right: var(--ns-space-24); }
249
+ .ns-select__control { appearance: none; cursor: pointer; }
250
+ .ns-select__control option { background: var(--ns-color-surface-2); color: var(--ns-color-text-1); }
251
+ .ns-select__chevron { position: absolute; right: var(--ns-space-8); display: inline-flex; color: var(--ns-color-text-3); pointer-events: none; }
252
+ .ns-combobox .ns-select__chevron { position: static; }
253
+
254
+ .ns-textarea {
255
+ min-height: 72px;
256
+ padding: var(--ns-space-8);
257
+ border: 1px solid var(--ns-color-line-2);
258
+ border-radius: var(--ns-radius-6);
259
+ background: var(--ns-color-surface-1);
260
+ color: var(--ns-color-text-1);
261
+ font: inherit;
262
+ resize: vertical;
263
+ }
264
+
265
+ .ns-combobox { position: relative; }
266
+ .ns-combobox__list,
267
+ .ns-combobox__empty {
268
+ position: absolute;
269
+ z-index: var(--ns-z-dropdown);
270
+ top: calc(100% + 4px);
271
+ left: 0;
272
+ right: 0;
273
+ max-height: 240px;
274
+ overflow: auto;
275
+ margin: 0;
276
+ padding: var(--ns-space-4);
277
+ list-style: none;
278
+ }
279
+ .ns-combobox__empty { padding: var(--ns-space-8); color: var(--ns-color-text-3); }
280
+ .ns-option {
281
+ display: flex;
282
+ align-items: center;
283
+ justify-content: space-between;
284
+ gap: var(--ns-space-8);
285
+ height: var(--ns-size-control-sm);
286
+ padding: 0 var(--ns-space-8);
287
+ border-radius: var(--ns-radius-4);
288
+ color: var(--ns-color-text-1);
289
+ cursor: pointer;
290
+ }
291
+ .ns-option[data-active] { background: var(--ns-color-surface-3); }
292
+ .ns-option[aria-disabled='true'] { color: var(--ns-color-text-3); cursor: not-allowed; }
293
+ .ns-option svg { color: var(--ns-color-signal); }
294
+
295
+ .ns-check { display: inline-flex; align-items: center; gap: var(--ns-space-8); cursor: pointer; position: relative; }
296
+ .ns-check__input { position: absolute; opacity: 0; width: 16px; height: 16px; margin: 0; cursor: inherit; }
297
+ .ns-check__box {
298
+ display: inline-flex;
299
+ align-items: center;
300
+ justify-content: center;
301
+ flex: none;
302
+ width: 16px;
303
+ height: 16px;
304
+ border: 1px solid var(--ns-color-line-2);
305
+ border-radius: var(--ns-radius-4);
306
+ background: var(--ns-color-surface-1);
307
+ color: var(--ns-button-primary-fg);
308
+ }
309
+ .ns-check__box svg { width: 12px; height: 12px; stroke-width: 2; visibility: hidden; }
310
+ .ns-check:hover .ns-check__box { border-color: var(--ns-color-text-3); }
311
+ .ns-check__input:checked + .ns-check__box,
312
+ .ns-check__input:indeterminate + .ns-check__box { background: var(--ns-color-signal-fill); border-color: var(--ns-color-signal-fill); }
313
+ .ns-check__input:checked + .ns-check__box svg,
314
+ .ns-check__input:indeterminate + .ns-check__box svg { visibility: visible; }
315
+ .ns-radio .ns-check__box { border-radius: var(--ns-radius-full); }
316
+ .ns-radio .ns-check__input:checked + .ns-check__box { background: var(--ns-color-surface-1); border-color: var(--ns-color-signal); border-width: 5px; }
317
+ .ns-check__label { color: var(--ns-color-text-1); }
318
+ .ns-radio-group { display: flex; gap: var(--ns-space-8); }
319
+ .ns-radio-group--vertical { flex-direction: column; }
320
+ .ns-radio-group--horizontal { flex-direction: row; gap: var(--ns-space-16); }
321
+
322
+ .ns-switch-label { display: inline-flex; align-items: center; gap: var(--ns-space-8); cursor: pointer; }
323
+ .ns-switch {
324
+ position: relative;
325
+ flex: none;
326
+ width: 28px;
327
+ height: 16px;
328
+ padding: 0;
329
+ border: 1px solid var(--ns-color-line-2);
330
+ border-radius: var(--ns-radius-full);
331
+ background: var(--ns-color-surface-3);
332
+ cursor: pointer;
333
+ transition: background-color var(--ns-motion-duration-120) var(--ns-motion-easing-settle);
334
+ }
335
+ .ns-switch__thumb {
336
+ position: absolute;
337
+ top: 1px;
338
+ left: 1px;
339
+ width: 12px;
340
+ height: 12px;
341
+ border-radius: var(--ns-radius-full);
342
+ background: var(--ns-color-text-2);
343
+ transition: transform var(--ns-motion-duration-120) var(--ns-motion-easing-settle);
344
+ }
345
+ .ns-switch[aria-checked='true'] { background: var(--ns-color-signal-fill); border-color: var(--ns-color-signal-fill); }
346
+ .ns-switch[aria-checked='true'] .ns-switch__thumb { transform: translateX(12px); background: var(--ns-button-primary-fg); }
347
+ .ns-switch:disabled { opacity: 0.55; cursor: not-allowed; }
348
+
349
+ .ns-slider {
350
+ appearance: none;
351
+ width: 100%;
352
+ height: 16px;
353
+ margin: 0;
354
+ background: transparent;
355
+ cursor: pointer;
356
+ border-radius: var(--ns-radius-full);
357
+ }
358
+ .ns-slider::-webkit-slider-runnable-track {
359
+ height: 4px;
360
+ border-radius: 2px;
361
+ background: linear-gradient(to right, var(--ns-color-signal) var(--ns-slider-fill, 0%), var(--ns-color-surface-3) var(--ns-slider-fill, 0%));
362
+ }
363
+ .ns-slider::-moz-range-track { height: 4px; border-radius: 2px; background: var(--ns-color-surface-3); }
364
+ .ns-slider::-moz-range-progress { height: 4px; border-radius: 2px; background: var(--ns-color-signal); }
365
+ .ns-slider::-webkit-slider-thumb {
366
+ appearance: none;
367
+ width: 14px;
368
+ height: 14px;
369
+ margin-top: -5px;
370
+ border-radius: var(--ns-radius-full);
371
+ background: var(--ns-color-text-1);
372
+ border: 2px solid var(--ns-color-ground);
373
+ }
374
+ .ns-slider::-moz-range-thumb { width: 12px; height: 12px; border-radius: var(--ns-radius-full); background: var(--ns-color-text-1); border: 2px solid var(--ns-color-ground); }
375
+ .ns-slider:disabled { opacity: 0.55; cursor: not-allowed; }
376
+
377
+ /* ----------------------------------------------------------- overlays */
378
+
379
+ .ns-pop {
380
+ border: 1px solid var(--ns-color-line-2);
381
+ border-radius: var(--ns-radius-8);
382
+ background: var(--ns-color-surface-2);
383
+ color: var(--ns-color-text-1);
384
+ box-shadow: var(--ns-elevation-2);
385
+ }
386
+ .ns-overlay {
387
+ position: fixed;
388
+ inset: 0;
389
+ background: var(--ns-color-ground);
390
+ opacity: 0.72;
391
+ animation: ns-fade var(--ns-motion-duration-200) var(--ns-motion-easing-enter);
392
+ }
393
+ .ns-overlay--dialog { z-index: var(--ns-z-dialog); }
394
+ .ns-overlay--sheet { z-index: var(--ns-z-sheet); }
395
+ @keyframes ns-fade { from { opacity: 0; } }
396
+ @keyframes ns-rise { from { opacity: 0; transform: translate(-50%, calc(-50% + 8px)); } }
397
+ @keyframes ns-slide-right { from { transform: translateX(16px); opacity: 0; } }
398
+ @keyframes ns-slide-left { from { transform: translateX(-16px); opacity: 0; } }
399
+ @keyframes ns-slide-up { from { transform: translateY(16px); opacity: 0; } }
400
+
401
+ .ns-dialog {
402
+ position: fixed;
403
+ z-index: var(--ns-z-dialog);
404
+ top: 50%;
405
+ left: 50%;
406
+ transform: translate(-50%, -50%);
407
+ display: flex;
408
+ flex-direction: column;
409
+ width: min(calc(100vw - 32px), 480px);
410
+ max-height: calc(100vh - 64px);
411
+ overflow: auto;
412
+ border: 1px solid var(--ns-color-line-2);
413
+ border-radius: var(--ns-radius-12);
414
+ background: var(--ns-color-surface-1);
415
+ box-shadow: var(--ns-elevation-3);
416
+ animation: ns-rise var(--ns-motion-duration-200) var(--ns-motion-easing-enter);
417
+ }
418
+ .ns-dialog--sm { width: min(calc(100vw - 32px), 360px); }
419
+ .ns-dialog--lg { width: min(calc(100vw - 32px), 720px); }
420
+ .ns-sheet {
421
+ position: fixed;
422
+ z-index: var(--ns-z-sheet);
423
+ display: flex;
424
+ flex-direction: column;
425
+ background: var(--ns-color-surface-1);
426
+ border: 0 solid var(--ns-color-line-2);
427
+ box-shadow: var(--ns-elevation-3);
428
+ overflow: auto;
429
+ }
430
+ .ns-sheet--right { top: 0; right: 0; bottom: 0; width: min(100vw, 420px); border-left-width: 1px; animation: ns-slide-right var(--ns-motion-duration-200) var(--ns-motion-easing-enter); }
431
+ .ns-sheet--left { top: 0; left: 0; bottom: 0; width: min(100vw, 420px); border-right-width: 1px; animation: ns-slide-left var(--ns-motion-duration-200) var(--ns-motion-easing-enter); }
432
+ .ns-sheet--bottom { left: 0; right: 0; bottom: 0; max-height: 80vh; border-top-width: 1px; border-radius: var(--ns-radius-12) var(--ns-radius-12) 0 0; animation: ns-slide-up var(--ns-motion-duration-200) var(--ns-motion-easing-enter); }
433
+ .ns-layer__header { display: flex; align-items: flex-start; gap: var(--ns-space-8); padding: var(--ns-space-16) var(--ns-space-16) var(--ns-space-8); }
434
+ .ns-layer__header > :first-child { flex: 1; }
435
+ .ns-layer__title { margin: 0; font-size: var(--ns-font-size-15); line-height: var(--ns-font-line-height-15); font-weight: var(--ns-font-weight-semibold); }
436
+ .ns-layer__description { margin: var(--ns-space-4) 0 0; color: var(--ns-color-text-2); }
437
+ .ns-layer__body { padding: var(--ns-space-8) var(--ns-space-16); flex: 1; }
438
+ .ns-layer__footer { display: flex; justify-content: flex-end; gap: var(--ns-space-8); padding: var(--ns-space-12) var(--ns-space-16); border-top: 1px solid var(--ns-color-line-1); }
439
+ .ns-layer__close { margin: -4px -4px 0 0; }
440
+ .ns-popover > .ns-layer__title { font-size: var(--ns-font-size-13); }
441
+
442
+ .ns-popover {
443
+ position: fixed;
444
+ z-index: var(--ns-z-popover);
445
+ min-width: 200px;
446
+ max-width: min(calc(100vw - 16px), 360px);
447
+ padding: var(--ns-space-12);
448
+ animation: ns-fade var(--ns-motion-duration-120) var(--ns-motion-easing-enter);
449
+ }
450
+ .ns-popover:focus { outline: none; }
451
+ .ns-menu {
452
+ position: fixed;
453
+ z-index: var(--ns-z-dropdown);
454
+ min-width: 180px;
455
+ padding: var(--ns-space-4);
456
+ animation: ns-fade var(--ns-motion-duration-120) var(--ns-motion-easing-enter);
457
+ }
458
+ .ns-menu:focus { outline: none; }
459
+ .ns-menu__item {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: var(--ns-space-8);
463
+ height: var(--ns-size-control-sm);
464
+ padding: 0 var(--ns-space-8);
465
+ border-radius: var(--ns-radius-4);
466
+ color: var(--ns-color-text-1);
467
+ cursor: pointer;
468
+ outline: none;
469
+ }
470
+ .ns-menu__item:focus,
471
+ .ns-menu__item:hover { background: var(--ns-color-surface-3); }
472
+ .ns-menu__item:focus-visible { outline-offset: -2px; box-shadow: none; }
473
+ .ns-menu__item[aria-disabled='true'] { color: var(--ns-color-text-3); cursor: not-allowed; background: transparent; }
474
+ .ns-menu__icon { display: inline-flex; color: var(--ns-color-text-2); }
475
+ .ns-menu__text { flex: 1; }
476
+ .ns-menu__shortcut { color: var(--ns-color-text-3); font-size: var(--ns-font-size-11); }
477
+ .ns-menu__separator { height: 1px; margin: var(--ns-space-4) calc(-1 * var(--ns-space-4)); background: var(--ns-color-line-1); }
478
+ .ns-menu__label { padding: var(--ns-space-4) var(--ns-space-8); color: var(--ns-color-text-3); font-size: var(--ns-font-size-11); font-weight: var(--ns-font-weight-medium); }
479
+
480
+ .ns-tooltip {
481
+ position: fixed;
482
+ z-index: var(--ns-z-tooltip);
483
+ max-width: 260px;
484
+ padding: var(--ns-space-4) var(--ns-space-8);
485
+ border: 1px solid var(--ns-color-line-2);
486
+ border-radius: var(--ns-radius-6);
487
+ background: var(--ns-color-surface-3);
488
+ color: var(--ns-color-text-1);
489
+ font-size: var(--ns-font-size-12);
490
+ line-height: var(--ns-font-line-height-12);
491
+ box-shadow: var(--ns-elevation-1);
492
+ pointer-events: none;
493
+ animation: ns-fade var(--ns-motion-duration-120) var(--ns-motion-easing-enter);
494
+ }
495
+
496
+ /* ------------------------------------------------------------- toasts */
497
+
498
+ .ns-toaster { position: fixed; z-index: var(--ns-z-toast); pointer-events: none; }
499
+ .ns-toaster--bottom-right { right: var(--ns-space-16); bottom: var(--ns-space-16); }
500
+ .ns-toaster--bottom-left { left: var(--ns-space-16); bottom: var(--ns-space-16); }
501
+ .ns-toaster--top-right { right: var(--ns-space-16); top: var(--ns-space-16); }
502
+ .ns-toaster--top-left { left: var(--ns-space-16); top: var(--ns-space-16); }
503
+ .ns-toaster--bottom-center { left: 50%; bottom: var(--ns-space-16); transform: translateX(-50%); }
504
+ .ns-toaster__list { display: flex; flex-direction: column; gap: var(--ns-space-8); margin: 0; padding: 0; list-style: none; }
505
+ .ns-toaster__item { pointer-events: auto; animation: ns-slide-up var(--ns-motion-duration-200) var(--ns-motion-easing-enter); }
506
+ .ns-toast {
507
+ display: flex;
508
+ align-items: center;
509
+ gap: var(--ns-space-12);
510
+ width: min(calc(100vw - 32px), 360px);
511
+ padding: var(--ns-space-12);
512
+ border: 1px solid var(--ns-color-line-2);
513
+ border-radius: var(--ns-radius-8);
514
+ background: var(--ns-color-surface-2);
515
+ box-shadow: var(--ns-elevation-2);
516
+ }
517
+ .ns-toast.ns-tone-signal { border-left: 2px solid var(--ns-color-signal); }
518
+ .ns-toast__text { flex: 1; min-width: 0; }
519
+ .ns-toast__title { font-weight: var(--ns-font-weight-medium); }
520
+ .ns-toast__description { color: var(--ns-color-text-2); }
521
+
522
+ .ns-banner {
523
+ position: relative;
524
+ z-index: var(--ns-z-banner);
525
+ display: flex;
526
+ align-items: flex-start;
527
+ gap: var(--ns-space-12);
528
+ padding: var(--ns-space-8) var(--ns-space-12);
529
+ border: 1px solid var(--ns-color-line-2);
530
+ border-radius: var(--ns-radius-8);
531
+ background: var(--ns-color-surface-1);
532
+ }
533
+ .ns-banner.ns-tone-signal { background: var(--ns-color-signal-wash); border-color: var(--ns-color-signal-edge); }
534
+ .ns-banner__icon { display: inline-flex; padding-top: 2px; color: var(--ns-color-text-2); }
535
+ .ns-tone-signal > .ns-banner__icon { color: var(--ns-color-signal); }
536
+ .ns-banner__text { flex: 1; display: flex; flex-wrap: wrap; gap: 0 var(--ns-space-8); padding: 4px 0; }
537
+ .ns-banner__title { font-weight: var(--ns-font-weight-semibold); }
538
+ .ns-banner__body { color: var(--ns-color-text-2); }
539
+ .ns-banner__actions { display: flex; gap: var(--ns-space-8); }
540
+
541
+ /* --------------------------------------------------- layout and nav */
542
+
543
+ .ns-stack { display: flex; }
544
+ .ns-stack:is(ul, ol) { margin: 0; padding: 0; list-style: none; }
545
+ .ns-grid { display: grid; }
546
+
547
+ .ns-app-shell {
548
+ display: grid;
549
+ grid-template-columns: auto minmax(0, 1fr);
550
+ min-height: 100vh;
551
+ background: var(--ns-color-ground);
552
+ }
553
+ .ns-app-shell--no-sidebar { grid-template-columns: minmax(0, 1fr); }
554
+ .ns-app-shell__sidebar { position: sticky; top: 0; height: 100vh; }
555
+ .ns-app-shell__column { display: flex; flex-direction: column; min-width: 0; }
556
+ .ns-app-shell__main { flex: 1; padding: var(--ns-space-24); outline: none; }
557
+ .ns-skip-link {
558
+ position: absolute;
559
+ z-index: var(--ns-z-tooltip);
560
+ left: var(--ns-space-8);
561
+ top: var(--ns-space-8);
562
+ padding: var(--ns-space-6) var(--ns-space-12);
563
+ border-radius: var(--ns-radius-6);
564
+ background: var(--ns-color-surface-3);
565
+ color: var(--ns-color-text-1);
566
+ transform: translateY(-200%);
567
+ }
568
+ .ns-skip-link:focus { transform: none; }
569
+
570
+ .ns-sidebar {
571
+ display: flex;
572
+ flex-direction: column;
573
+ width: 240px;
574
+ height: 100%;
575
+ border-right: 1px solid var(--ns-color-line-1);
576
+ background: var(--ns-color-surface-1);
577
+ }
578
+ .ns-sidebar__header { padding: var(--ns-space-12); }
579
+ .ns-sidebar__body { flex: 1; overflow: auto; padding: var(--ns-space-4) var(--ns-space-8); }
580
+ .ns-sidebar__footer { padding: var(--ns-space-8); border-top: 1px solid var(--ns-color-line-1); }
581
+ .ns-sidebar__section + .ns-sidebar__section { margin-top: var(--ns-space-16); }
582
+ .ns-sidebar__section ul { margin: 0; padding: 0; list-style: none; }
583
+ .ns-sidebar__title { padding: var(--ns-space-4) var(--ns-space-8); color: var(--ns-color-text-3); font-size: var(--ns-font-size-11); font-weight: var(--ns-font-weight-medium); }
584
+ .ns-sidebar__item {
585
+ display: flex;
586
+ align-items: center;
587
+ gap: var(--ns-space-8);
588
+ height: var(--ns-size-control-sm);
589
+ padding: 0 var(--ns-space-8);
590
+ border-radius: var(--ns-radius-6);
591
+ color: var(--ns-color-text-2);
592
+ text-decoration: none;
593
+ font-weight: var(--ns-font-weight-medium);
594
+ cursor: pointer;
595
+ }
596
+ .ns-sidebar__item:hover { background: var(--ns-color-surface-2); color: var(--ns-color-text-1); }
597
+ .ns-sidebar__item[aria-current='page'] { background: var(--ns-color-surface-3); color: var(--ns-color-text-1); }
598
+ .ns-sidebar__icon { display: inline-flex; color: var(--ns-color-text-3); }
599
+ .ns-sidebar__text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
600
+ .ns-sidebar__meta { color: var(--ns-color-text-3); font-family: var(--ns-font-family-mono); font-size: var(--ns-font-size-11); }
601
+
602
+ .ns-top-bar {
603
+ position: sticky;
604
+ top: 0;
605
+ z-index: var(--ns-z-banner);
606
+ display: flex;
607
+ align-items: center;
608
+ gap: var(--ns-space-12);
609
+ height: 48px;
610
+ padding: 0 var(--ns-space-16);
611
+ border-bottom: 1px solid var(--ns-color-line-1);
612
+ background: var(--ns-color-ground);
613
+ }
614
+ .ns-top-bar__center { flex: 1; min-width: 0; display: flex; align-items: center; gap: var(--ns-space-8); }
615
+ .ns-top-bar__start,
616
+ .ns-top-bar__end { display: flex; align-items: center; gap: var(--ns-space-8); }
617
+
618
+ .ns-tabs--vertical { display: flex; gap: var(--ns-space-16); }
619
+ .ns-tabs__list { display: flex; gap: var(--ns-space-4); border-bottom: 1px solid var(--ns-color-line-1); }
620
+ .ns-tabs--vertical .ns-tabs__list { flex-direction: column; border-bottom: 0; border-right: 1px solid var(--ns-color-line-1); padding-right: var(--ns-space-8); }
621
+ .ns-tabs__trigger {
622
+ position: relative;
623
+ height: var(--ns-control-h, var(--ns-size-control-md));
624
+ padding: 0 var(--ns-space-8);
625
+ border: 0;
626
+ background: transparent;
627
+ color: var(--ns-color-text-2);
628
+ font: inherit;
629
+ font-weight: var(--ns-font-weight-medium);
630
+ cursor: pointer;
631
+ border-radius: var(--ns-radius-4) var(--ns-radius-4) 0 0;
632
+ }
633
+ .ns-tabs__trigger:hover { color: var(--ns-color-text-1); }
634
+ .ns-tabs__trigger[aria-selected='true'] { color: var(--ns-color-text-1); }
635
+ .ns-tabs__trigger[aria-selected='true']::after {
636
+ content: '';
637
+ position: absolute;
638
+ left: var(--ns-space-8);
639
+ right: var(--ns-space-8);
640
+ bottom: -1px;
641
+ height: 2px;
642
+ background: var(--ns-color-signal);
643
+ }
644
+ .ns-tabs--vertical .ns-tabs__trigger { text-align: left; border-radius: var(--ns-radius-4); }
645
+ .ns-tabs--vertical .ns-tabs__trigger[aria-selected='true'] { background: var(--ns-color-surface-2); }
646
+ .ns-tabs--vertical .ns-tabs__trigger[aria-selected='true']::after { display: none; }
647
+ .ns-tabs__trigger:disabled { color: var(--ns-color-text-3); cursor: not-allowed; }
648
+ .ns-tabs__content { padding: var(--ns-space-16) 0; border-radius: var(--ns-radius-4); }
649
+
650
+ .ns-breadcrumbs ol { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ns-space-6); margin: 0; padding: 0; list-style: none; }
651
+ .ns-breadcrumbs li { display: inline-flex; align-items: center; gap: var(--ns-space-6); color: var(--ns-color-text-2); }
652
+ .ns-breadcrumbs a { color: var(--ns-color-text-2); text-decoration: none; border-radius: var(--ns-radius-4); }
653
+ .ns-breadcrumbs a:hover { color: var(--ns-color-text-1); }
654
+ .ns-breadcrumbs a:focus-visible { outline: 2px solid var(--ns-color-focus); outline-offset: 1px; }
655
+ .ns-breadcrumbs [aria-current='page'] { color: var(--ns-color-text-1); }
656
+ .ns-breadcrumbs__sep { color: var(--ns-color-text-3); }
657
+
658
+ .ns-pagination { display: flex; align-items: center; gap: var(--ns-space-4); }
659
+ .ns-pagination ul { display: flex; align-items: center; gap: var(--ns-space-2); margin: 0; padding: 0; list-style: none; }
660
+ .ns-pagination__page { min-width: var(--ns-size-control-sm); padding: 0 var(--ns-space-6); font-family: var(--ns-font-family-mono); font-variant-numeric: var(--ns-font-numeric-figures); }
661
+ .ns-pagination__gap { color: var(--ns-color-text-3); padding: 0 var(--ns-space-4); }
662
+
663
+ /* -------------------------------------------------------- data display */
664
+
665
+ .ns-table-wrap { overflow: auto; border: 1px solid var(--ns-color-line-1); border-radius: var(--ns-radius-8); background: var(--ns-color-surface-1); }
666
+ .ns-table { width: 100%; border-collapse: collapse; font-size: var(--ns-font-size-13); }
667
+ .ns-table__caption { padding: var(--ns-space-8) var(--ns-space-12); text-align: left; color: var(--ns-color-text-2); caption-side: top; }
668
+ .ns-table__th,
669
+ .ns-table__td { height: var(--ns-row-h, var(--ns-size-row-md)); padding: var(--ns-row-pad, var(--ns-space-6)) var(--ns-space-12); text-align: left; border-bottom: 1px solid var(--ns-color-line-1); }
670
+ .ns-table[data-density='compact'] { --ns-row-h: var(--ns-density-compact-row-height); --ns-row-pad: var(--ns-density-compact-row-padding); }
671
+ .ns-table[data-density='comfortable'] { --ns-row-h: var(--ns-density-comfortable-row-height); --ns-row-pad: var(--ns-density-comfortable-row-padding); }
672
+ .ns-table__th { color: var(--ns-color-text-2); font-size: var(--ns-font-size-12); font-weight: var(--ns-font-weight-medium); background: var(--ns-color-surface-1); white-space: nowrap; }
673
+ .ns-table--sticky .ns-table__th { position: sticky; top: 0; z-index: 1; }
674
+ .ns-table tbody .ns-table__row:last-child .ns-table__td { border-bottom: 0; }
675
+ .ns-table tbody .ns-table__row:hover { background: var(--ns-color-surface-2); }
676
+ .ns-table__row[aria-selected='true'] { background: var(--ns-color-signal-wash); }
677
+ .ns-numeric { text-align: right; font-family: var(--ns-font-family-mono); font-variant-numeric: var(--ns-font-numeric-figures); }
678
+ .ns-table__th.ns-numeric { font-family: inherit; }
679
+ .ns-table__sort { display: inline-flex; align-items: center; gap: var(--ns-space-4); padding: 0; border: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; border-radius: var(--ns-radius-4); }
680
+ .ns-table__sort:hover { color: var(--ns-color-text-1); }
681
+ .ns-table__sort-mark { color: var(--ns-color-text-3); }
682
+ [aria-sort='ascending'] .ns-table__sort-mark,
683
+ [aria-sort='descending'] .ns-table__sort-mark { color: var(--ns-color-signal); }
684
+
685
+ .ns-list { margin: 0; padding: 0; list-style: none; }
686
+ .ns-list--divided > .ns-list__item + .ns-list__item { border-top: 1px solid var(--ns-color-line-1); }
687
+ .ns-list__item { display: flex; align-items: center; gap: var(--ns-space-12); min-height: var(--ns-row-h, var(--ns-size-row-md)); padding: var(--ns-row-pad, var(--ns-space-6)) var(--ns-space-4); }
688
+ .ns-list__text { flex: 1; min-width: 0; display: flex; flex-direction: column; }
689
+ .ns-list__title { color: var(--ns-color-text-1); font-weight: var(--ns-font-weight-medium); }
690
+ .ns-list__description { color: var(--ns-color-text-2); font-size: var(--ns-font-size-12); }
691
+ .ns-list__start,
692
+ .ns-list__end { display: inline-flex; align-items: center; gap: var(--ns-space-8); color: var(--ns-color-text-2); }
693
+
694
+ .ns-tag {
695
+ display: inline-flex;
696
+ align-items: center;
697
+ gap: var(--ns-space-4);
698
+ height: 20px;
699
+ padding: 0 var(--ns-space-6);
700
+ border: 1px solid var(--ns-color-line-2);
701
+ border-radius: var(--ns-radius-4);
702
+ color: var(--ns-color-text-2);
703
+ font-size: var(--ns-font-size-11);
704
+ font-weight: var(--ns-font-weight-medium);
705
+ white-space: nowrap;
706
+ }
707
+ .ns-tag.ns-tone-signal { color: var(--ns-color-signal); border-color: var(--ns-color-signal-edge); background: var(--ns-color-signal-wash); }
708
+ .ns-tag__remove { padding: 0; margin-right: -2px; }
709
+ .ns-tag__remove svg { width: 12px; height: 12px; }
710
+
711
+ .ns-badge {
712
+ display: inline-flex;
713
+ align-items: center;
714
+ height: 18px;
715
+ min-width: 18px;
716
+ padding: 0 var(--ns-space-6);
717
+ border-radius: var(--ns-radius-full);
718
+ font-family: var(--ns-font-family-mono);
719
+ font-size: var(--ns-font-size-11);
720
+ font-variant-numeric: var(--ns-font-numeric-figures);
721
+ justify-content: center;
722
+ }
723
+ .ns-badge--outline { border: 1px solid var(--ns-color-line-2); color: var(--ns-color-text-2); }
724
+ .ns-badge--solid { background: var(--ns-color-surface-3); color: var(--ns-color-text-1); }
725
+ .ns-badge--outline.ns-tone-signal { border-color: var(--ns-color-signal-edge); color: var(--ns-color-signal); }
726
+ .ns-badge--solid.ns-tone-signal { background: var(--ns-color-signal-fill); color: var(--ns-button-primary-fg); }
727
+
728
+ .ns-avatar {
729
+ display: inline-flex;
730
+ align-items: center;
731
+ justify-content: center;
732
+ flex: none;
733
+ border-radius: var(--ns-radius-full);
734
+ background: var(--ns-color-surface-3);
735
+ border: 1px solid var(--ns-color-line-2);
736
+ color: var(--ns-color-text-1);
737
+ font-weight: var(--ns-font-weight-semibold);
738
+ letter-spacing: 0.02em;
739
+ user-select: none;
740
+ }
741
+ .ns-avatar--sm { width: 20px; height: 20px; font-size: 9px; }
742
+ .ns-avatar--md { width: 24px; height: 24px; font-size: var(--ns-font-size-11); }
743
+ .ns-avatar--lg { width: 32px; height: 32px; font-size: var(--ns-font-size-12); }
744
+
745
+ .ns-kbd {
746
+ display: inline-flex;
747
+ align-items: center;
748
+ justify-content: center;
749
+ min-width: 16px;
750
+ height: 16px;
751
+ padding: 0 3px;
752
+ border: 1px solid var(--ns-color-line-2);
753
+ border-radius: 3px;
754
+ background: var(--ns-color-surface-3);
755
+ color: var(--ns-color-text-2);
756
+ font-family: var(--ns-font-family-mono);
757
+ font-size: 10px;
758
+ line-height: 1;
759
+ }
760
+
761
+ .ns-empty { display: flex; flex-direction: column; align-items: center; gap: var(--ns-space-8); padding: var(--ns-space-40) var(--ns-space-24); text-align: center; }
762
+ .ns-empty__icon { color: var(--ns-color-text-3); }
763
+ .ns-empty__title { margin: 0; font-size: var(--ns-font-size-15); line-height: var(--ns-font-line-height-15); font-weight: var(--ns-font-weight-medium); }
764
+ .ns-empty__description { margin: 0; max-width: 40ch; color: var(--ns-color-text-2); }
765
+ .ns-empty__action { margin-top: var(--ns-space-8); }
766
+
767
+ .ns-skeleton {
768
+ display: block;
769
+ background: var(--ns-color-surface-3);
770
+ animation: ns-pulse 1600ms var(--ns-motion-easing-travel) infinite;
771
+ }
772
+ .ns-skeleton--line { height: 12px; border-radius: var(--ns-radius-4); }
773
+ .ns-skeleton--block { height: 64px; border-radius: var(--ns-radius-8); }
774
+ .ns-skeleton--circle { width: 24px; height: 24px; border-radius: var(--ns-radius-full); }
775
+ @keyframes ns-pulse { 50% { opacity: 0.5; } }
776
+
777
+ .ns-stale {
778
+ position: relative;
779
+ padding: var(--ns-space-24) var(--ns-space-12) var(--ns-space-12);
780
+ border: 1px dashed var(--ns-color-text-3);
781
+ border-radius: var(--ns-radius-8);
782
+ }
783
+ .ns-stale__label {
784
+ position: absolute;
785
+ top: var(--ns-space-6);
786
+ left: var(--ns-space-12);
787
+ color: var(--ns-color-text-2);
788
+ font-size: var(--ns-font-size-11);
789
+ font-weight: var(--ns-font-weight-medium);
790
+ line-height: var(--ns-font-line-height-11);
791
+ }
792
+ .ns-stale__detail { color: var(--ns-color-text-3); font-weight: var(--ns-font-weight-regular); }
793
+
794
+ /* ------------------------------------------------------ reduced motion */
795
+
796
+ @media (prefers-reduced-motion: reduce) {
797
+ .ns-root *,
798
+ .ns-root *::before,
799
+ .ns-root *::after {
800
+ animation-duration: 0ms !important;
801
+ animation-iteration-count: 1 !important;
802
+ transition-duration: 0ms !important;
803
+ }
804
+ .ns-skeleton { animation: none !important; }
805
+ .ns-spinner { animation: none !important; border-right-color: currentColor; border-style: dotted; }
806
+ }
807
+
808
+ /* ============================================== northstar: study workspace */
809
+
810
+ .ns-study-hint { font-size: var(--ns-font-size-12); line-height: var(--ns-font-line-height-12); color: var(--ns-color-text-3); }
811
+ .ns-study-label { font-size: var(--ns-font-size-12); font-weight: var(--ns-font-weight-medium); color: var(--ns-color-text-2); }
812
+ .ns-study-muted { color: var(--ns-color-text-3); }
813
+ .ns-study-signal { color: var(--ns-color-signal); }
814
+ .ns-study-mono { font-family: var(--ns-font-family-mono); font-variant-numeric: var(--ns-font-numeric-figures); }
815
+ .ns-study-id { flex: none; width: 22px; font-family: var(--ns-font-family-mono); font-size: var(--ns-font-size-12); color: var(--ns-color-text-3); }
816
+ .ns-study-divider { width: 1px; height: 20px; background: var(--ns-color-line-2); }
817
+ .ns-study-panel { border: 1px solid var(--ns-color-line-1); border-radius: var(--ns-radius-8); background: var(--ns-color-surface-1); overflow: hidden; }
818
+ .ns-study-panel__head { display: flex; align-items: center; gap: var(--ns-space-8); min-height: 36px; padding: 0 var(--ns-space-12); border-bottom: 1px solid var(--ns-color-line-1); }
819
+ .ns-study-panel__title { margin: 0; font-size: var(--ns-font-size-13); line-height: var(--ns-font-line-height-13); font-weight: var(--ns-font-weight-medium); color: var(--ns-color-text-1); }
820
+ .ns-study-panel__end,
821
+ .ns-study-panel__action { margin-left: auto; }
822
+ .ns-study-row { display: flex; align-items: center; gap: var(--ns-space-12); min-height: 36px; padding: 0 var(--ns-space-12); border-bottom: 1px solid var(--ns-color-line-1); }
823
+ .ns-study-row:last-child { border-bottom: 0; }
824
+ .ns-study-row:hover { background: var(--ns-color-surface-2); }
825
+ .ns-study-row__input,
826
+ .ns-brief__title,
827
+ .ns-brief__decision,
828
+ .ns-research__wording {
829
+ flex: 1;
830
+ min-width: 0;
831
+ border: 1px solid transparent;
832
+ border-radius: var(--ns-radius-6);
833
+ background: transparent;
834
+ color: var(--ns-color-text-1);
835
+ font: inherit;
836
+ padding: var(--ns-space-2) var(--ns-space-4);
837
+ margin-left: calc(-1 * var(--ns-space-4));
838
+ }
839
+ .ns-study-row__input:focus-visible,
840
+ .ns-brief__title:focus-visible,
841
+ .ns-brief__decision:focus-visible,
842
+ .ns-research__wording:focus-visible,
843
+ .ns-research__anchor-input:focus-visible { outline: none; border-color: var(--ns-color-focus); box-shadow: 0 0 0 3px var(--ns-color-focus-halo); }
844
+ .ns-study-row__ghost { flex: 1; border: 0; background: transparent; color: var(--ns-color-text-3); font: inherit; text-align: left; padding: var(--ns-space-6) 0; cursor: pointer; border-radius: var(--ns-radius-4); }
845
+ .ns-study-row__ghost:focus-visible,
846
+ .ns-study-icon-button:focus-visible,
847
+ .ns-research__select:focus-visible { outline: 2px solid var(--ns-color-focus); outline-offset: -2px; }
848
+ .ns-study-icon-button {
849
+ display: inline-flex; align-items: center; justify-content: center;
850
+ width: 24px; height: 24px; flex: none;
851
+ border: 0; border-radius: var(--ns-radius-4); background: transparent; color: var(--ns-color-text-3); cursor: pointer;
852
+ }
853
+ .ns-study-icon-button:hover { background: var(--ns-color-surface-3); color: var(--ns-color-text-1); }
854
+ .ns-study-icon-button:disabled { opacity: 0.4; cursor: not-allowed; background: transparent; }
855
+ @media (pointer: coarse) { .ns-study-icon-button { width: 44px; height: 44px; } }
856
+ .ns-study-callout {
857
+ display: flex; gap: var(--ns-space-8); align-items: flex-start;
858
+ padding: var(--ns-space-8) var(--ns-space-12);
859
+ border: 1px solid var(--ns-color-signal-edge); border-radius: var(--ns-radius-6);
860
+ background: var(--ns-color-signal-wash);
861
+ font-size: var(--ns-font-size-12); line-height: var(--ns-font-line-height-12); color: var(--ns-color-text-1);
862
+ max-width: 640px;
863
+ }
864
+ .ns-study-empty { display: flex; flex-direction: column; align-items: center; gap: var(--ns-space-6); padding: var(--ns-space-24); text-align: center; }
865
+ .ns-study-empty p { margin: 0; }
866
+ .ns-study-empty__title { font-weight: var(--ns-font-weight-semibold); color: var(--ns-color-text-1); }
867
+
868
+ /* StudyStatus */
869
+ .ns-study-status { display: inline-flex; align-items: center; gap: var(--ns-space-6); color: var(--ns-color-text-2); font-size: var(--ns-font-size-12); font-weight: var(--ns-font-weight-medium); white-space: nowrap; }
870
+ .ns-study-status--tag { height: 20px; padding: 0 var(--ns-space-6); border: 1px solid var(--ns-color-line-2); border-radius: var(--ns-radius-4); font-size: var(--ns-font-size-11); }
871
+ .ns-study-status__mark { flex: none; color: var(--ns-color-text-3); }
872
+ .ns-study-status--running .ns-study-status__mark,
873
+ .ns-study-status--failed .ns-study-status__mark { color: var(--ns-color-signal); }
874
+ .ns-study-status--complete .ns-study-status__mark { color: var(--ns-color-text-2); }
875
+ .ns-study-status--archived { color: var(--ns-color-text-3); }
876
+ .ns-study-status--running.ns-study-status--tag,
877
+ .ns-study-status--failed.ns-study-status--tag { border-style: dashed; }
878
+ .ns-study-status[data-motion='sweep'] .ns-study-status__mark { animation: ns-study-sweep 2.4s linear infinite; }
879
+ @keyframes ns-study-sweep { to { transform: rotate(360deg); } }
880
+
881
+ /* StudyShell */
882
+ .ns-study-shell { display: flex; flex-wrap: wrap; min-height: 100%; background: var(--ns-color-ground); color: var(--ns-color-text-1); }
883
+ .ns-study-shell__main { flex: 999 1 560px; min-width: 0; display: flex; flex-direction: column; }
884
+ .ns-study-shell__bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ns-space-8); min-height: 44px; padding: 0 var(--ns-space-16); border-bottom: 1px solid var(--ns-color-line-1); }
885
+ .ns-study-shell__crumb { display: flex; align-items: center; gap: var(--ns-space-6); color: var(--ns-color-text-3); }
886
+ .ns-study-shell__crumb b { color: var(--ns-color-text-1); font-weight: var(--ns-font-weight-medium); }
887
+ .ns-study-shell__spacer { flex: 1; }
888
+ .ns-study-shell__save { font-size: var(--ns-font-size-12); color: var(--ns-color-text-3); }
889
+ .ns-study-shell__tabs { display: flex; flex-direction: column; flex: 1; }
890
+ .ns-study-shell__tabbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ns-space-8); min-height: 40px; padding: 0 var(--ns-space-12); border-bottom: 1px solid var(--ns-color-line-1); }
891
+ .ns-study-shell__tablist.ns-tabs__list { border-bottom: 0; gap: var(--ns-space-2); }
892
+ .ns-study-shell__tab.ns-tabs__trigger { display: inline-flex; align-items: center; gap: var(--ns-space-6); height: 26px; padding: 0 var(--ns-space-12); border-radius: var(--ns-radius-6); }
893
+ .ns-study-shell__tab.ns-tabs__trigger:hover { background: var(--ns-color-surface-2); }
894
+ .ns-study-shell__tab.ns-tabs__trigger[aria-selected='true'] { background: var(--ns-color-surface-3); box-shadow: inset 0 0 0 1px var(--ns-color-line-2); }
895
+ .ns-study-shell__tab.ns-tabs__trigger[aria-selected='true']::after { display: none; }
896
+ .ns-study-shell__tab.ns-tabs__trigger:focus-visible { outline: 2px solid var(--ns-color-focus); outline-offset: 1px; }
897
+ .ns-study-shell__tab-meta { font-size: var(--ns-font-size-11); color: var(--ns-color-text-3); font-variant-numeric: var(--ns-font-numeric-figures); }
898
+ .ns-study-shell__tab-actions { margin-left: auto; display: flex; gap: var(--ns-space-8); }
899
+ .ns-study-shell__content.ns-tabs__content { flex: 1; padding: var(--ns-space-24) var(--ns-space-32); }
900
+ .ns-study-shell__content:focus-visible { outline: 2px solid var(--ns-color-focus); outline-offset: -2px; }
901
+ .ns-study-shell__aside { flex: 1 1 260px; max-width: 300px; border-left: 1px solid var(--ns-color-line-1); display: flex; flex-direction: column; }
902
+
903
+ /* BriefForm */
904
+ .ns-brief { display: flex; flex-direction: column; gap: var(--ns-space-20); max-width: 820px; }
905
+ .ns-brief__head { display: flex; flex-direction: column; gap: var(--ns-space-6); }
906
+ .ns-brief__title { font-size: var(--ns-font-size-18); line-height: var(--ns-font-line-height-18); font-weight: var(--ns-font-weight-semibold); }
907
+ .ns-brief__decision { resize: vertical; color: var(--ns-color-text-2); font-size: var(--ns-font-size-15); line-height: var(--ns-font-line-height-15); }
908
+ .ns-brief__toolbar { display: flex; flex-wrap: wrap; gap: var(--ns-space-8); align-items: center; }
909
+
910
+ /* PopulationPanel */
911
+ .ns-population { display: flex; flex-direction: column; gap: var(--ns-space-20); max-width: 900px; }
912
+ .ns-population__controls { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ns-space-12); }
913
+ .ns-population__market { display: inline-flex; align-items: center; gap: var(--ns-space-8); }
914
+ .ns-population__number { width: 120px; }
915
+ .ns-population__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
916
+ .ns-population__group { padding: var(--ns-space-8) var(--ns-space-12) var(--ns-space-12); border-bottom: 1px solid var(--ns-color-line-1); overflow: hidden; }
917
+ .ns-population__group-title { margin: 0 0 var(--ns-space-4); font-size: var(--ns-font-size-12); font-weight: var(--ns-font-weight-medium); color: var(--ns-color-text-3); }
918
+ .ns-population__group svg { max-width: 100%; height: auto; }
919
+
920
+ /* ResearchBuilder */
921
+ .ns-research { display: flex; flex-wrap: wrap; margin: calc(-1 * var(--ns-space-24)) calc(-1 * var(--ns-space-32)); min-height: 100%; }
922
+ .ns-research__list { flex: 1 1 360px; max-width: 420px; border-right: 1px solid var(--ns-color-line-1); display: flex; flex-direction: column; }
923
+ .ns-research__list-head { display: flex; align-items: center; gap: var(--ns-space-8); min-height: 40px; padding: 0 var(--ns-space-12); border-bottom: 1px solid var(--ns-color-line-1); color: var(--ns-color-text-3); font-size: var(--ns-font-size-12); font-weight: var(--ns-font-weight-medium); }
924
+ .ns-research__items { margin: 0; padding: 0; list-style: none; }
925
+ .ns-research__item { display: flex; align-items: center; border-bottom: 1px solid var(--ns-color-line-1); }
926
+ .ns-research__item:hover { background: var(--ns-color-surface-2); }
927
+ .ns-research__item--on,
928
+ .ns-research__item--on:hover { background: var(--ns-color-surface-3); }
929
+ .ns-research__select { flex: 1; min-width: 0; display: flex; align-items: center; gap: var(--ns-space-8); height: 36px; padding: 0 var(--ns-space-12); border: 0; background: transparent; color: var(--ns-color-text-1); font: inherit; text-align: left; cursor: pointer; }
930
+ .ns-research__q { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
931
+ .ns-research__tools { display: inline-flex; padding-right: var(--ns-space-6); }
932
+ .ns-research__editor { flex: 999 1 420px; min-width: 0; padding: var(--ns-space-20) var(--ns-space-24); display: flex; flex-direction: column; gap: var(--ns-space-16); }
933
+ .ns-research__editor-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ns-space-6); }
934
+ .ns-research__wording { resize: vertical; font-size: var(--ns-font-size-15); line-height: var(--ns-font-line-height-15); font-weight: var(--ns-font-weight-medium); }
935
+ .ns-research__anchors { margin: 0; padding: 0; border: 0; display: flex; flex-direction: column; gap: var(--ns-space-6); }
936
+ .ns-research__anchors legend { margin-bottom: var(--ns-space-8); }
937
+ .ns-research__anchor { display: grid; grid-template-columns: 20px minmax(0, 1fr) 20px; gap: var(--ns-space-8); align-items: center; }
938
+ .ns-research__anchor-input { height: var(--ns-size-control-sm); padding: 0 var(--ns-space-8); border: 1px solid var(--ns-color-line-2); border-radius: var(--ns-radius-6); background: var(--ns-color-surface-1); color: var(--ns-color-text-1); font: inherit; }
939
+ .ns-research__anchor-input.ns-invalid { border-color: var(--ns-color-signal-edge); background: var(--ns-color-signal-wash); }
940
+
941
+ /* ResponsesView */
942
+ .ns-responses { display: flex; flex-direction: column; gap: var(--ns-space-16); max-width: 1100px; }
943
+ .ns-responses__intro { margin: 0; max-width: 720px; }
944
+ .ns-responses__row { display: grid; grid-template-columns: 28px minmax(0, 1.2fr) 140px minmax(0, 1fr); gap: var(--ns-space-16); align-items: center; padding: var(--ns-space-12); border-bottom: 1px solid var(--ns-color-line-1); }
945
+ .ns-responses__row:last-child { border-bottom: 0; }
946
+ .ns-responses__dist { min-width: 0; overflow: hidden; }
947
+ .ns-responses__dist svg { max-width: 100%; height: auto; }
948
+ .ns-responses__extra { grid-column: 2 / -1; color: var(--ns-color-text-2); }
949
+ @media (max-width: 720px) {
950
+ .ns-responses__row { grid-template-columns: 28px minmax(0, 1fr); }
951
+ .ns-responses__figure,
952
+ .ns-responses__dist { grid-column: 2; }
953
+ }
954
+
955
+ /* RunCost, RunConfirm */
956
+ .ns-run-cost { display: flex; flex-direction: column; gap: var(--ns-space-8); }
957
+ .ns-run-cost__line { display: flex; justify-content: space-between; align-items: baseline; gap: var(--ns-space-12); }
958
+ .ns-run-cost__button { width: 100%; }
959
+ .ns-run-confirm__cost { padding: var(--ns-space-12) 0; }
960
+
961
+ /* Illustrations */
962
+ .ns-illustration { display: block; max-width: 100%; height: auto; }
963
+ .ns-illustration__orbit { animation: ns-study-sweep linear infinite; }
964
+ .ns-lockup { display: inline-flex; align-items: center; gap: 0.35em; color: var(--ns-color-text-1); line-height: 1; }
965
+ .ns-lockup svg { flex: none; }
966
+ .ns-lockup__word { font-family: 'Instrument Serif', Georgia, serif; font-size: 1.1em; letter-spacing: -0.01em; }
967
+
968
+ @media (prefers-reduced-motion: reduce) {
969
+ .ns-study-status[data-motion] .ns-study-status__mark,
970
+ .ns-illustration__orbit { animation: none !important; }
971
+ }