@w6w/ui 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/LICENSE +21 -0
  3. package/README.md +275 -2
  4. package/dist/ActionTestForm.d.ts +76 -0
  5. package/dist/AddConnectionModal.d.ts +24 -0
  6. package/dist/AppPicker.d.ts +83 -0
  7. package/dist/CodeBlock-CZu4TFSi.cjs +15 -0
  8. package/dist/CodeBlock-CZu4TFSi.cjs.map +1 -0
  9. package/dist/CodeBlock-Dot3Pd7P.js +2889 -0
  10. package/dist/CodeBlock-Dot3Pd7P.js.map +1 -0
  11. package/dist/CodeBlock.d.ts +65 -0
  12. package/dist/CodeEditor.d.ts +42 -0
  13. package/dist/ConfirmModal-8avl9Nv8.cjs +11 -0
  14. package/dist/ConfirmModal-8avl9Nv8.cjs.map +1 -0
  15. package/dist/ConfirmModal-CD-P8mhN.js +6335 -0
  16. package/dist/ConfirmModal-CD-P8mhN.js.map +1 -0
  17. package/dist/Copyable-1niV9gUa.js +771 -0
  18. package/dist/Copyable-1niV9gUa.js.map +1 -0
  19. package/dist/Copyable-CYZU1o4X.cjs +2 -0
  20. package/dist/Copyable-CYZU1o4X.cjs.map +1 -0
  21. package/dist/JsonEditor.d.ts +60 -0
  22. package/dist/NodeConfigForm.d.ts +70 -0
  23. package/dist/ParamsForm.d.ts +56 -0
  24. package/dist/PropertyEntryForm.d.ts +56 -0
  25. package/dist/RetryPolicyFields.d.ts +18 -0
  26. package/dist/StepBuilderModal.d.ts +375 -0
  27. package/dist/TriggerFillForm.d.ts +52 -0
  28. package/dist/WaitEditor.d.ts +6 -0
  29. package/dist/WorkflowFlowEditor.d.ts +119 -0
  30. package/dist/YamlEditor.d.ts +46 -0
  31. package/dist/app-categories.d.ts +38 -0
  32. package/dist/app-pages.d.ts +111 -0
  33. package/dist/code.cjs +2 -0
  34. package/dist/code.cjs.map +1 -0
  35. package/dist/code.d.ts +29 -0
  36. package/dist/code.mjs +8 -0
  37. package/dist/code.mjs.map +1 -0
  38. package/dist/components/ApiCallsPanel.d.ts +41 -0
  39. package/dist/components/AppIcon.d.ts +25 -0
  40. package/dist/components/AuthFieldsForm.d.ts +22 -0
  41. package/dist/components/Combobox.d.ts +24 -0
  42. package/dist/components/ConfirmModal.d.ts +33 -0
  43. package/dist/components/Copyable.d.ts +51 -0
  44. package/dist/components/CopyableText.d.ts +40 -0
  45. package/dist/components/DeleteButton.d.ts +16 -0
  46. package/dist/components/EditButton.d.ts +10 -0
  47. package/dist/components/ExecutionDetail.d.ts +70 -0
  48. package/dist/components/ExecutionFilters.d.ts +59 -0
  49. package/dist/components/ExecutionList.d.ts +60 -0
  50. package/dist/components/ExecutionLogPanel.d.ts +98 -0
  51. package/dist/components/ExecutionStats.d.ts +47 -0
  52. package/dist/components/ExpressionEditorModal.d.ts +42 -0
  53. package/dist/components/ExpressionInput.d.ts +36 -0
  54. package/dist/components/ExpressionOptions.d.ts +185 -0
  55. package/dist/components/HealthStatusPill.d.ts +25 -0
  56. package/dist/components/HistoryTimeline.d.ts +56 -0
  57. package/dist/components/Icon.d.ts +34 -0
  58. package/dist/components/IconButton.d.ts +60 -0
  59. package/dist/components/InfoTip.d.ts +15 -0
  60. package/dist/components/InternalIcon.d.ts +19 -0
  61. package/dist/components/ListItem.d.ts +25 -0
  62. package/dist/components/Modal.d.ts +29 -0
  63. package/dist/components/RepoSyncIndicator.d.ts +29 -0
  64. package/dist/components/ResolvedParams.d.ts +31 -0
  65. package/dist/components/ServerResources.d.ts +47 -0
  66. package/dist/components/StepStatusPill.d.ts +51 -0
  67. package/dist/components/UptimeStrip.d.ts +56 -0
  68. package/dist/components/execution-format.d.ts +24 -0
  69. package/dist/components/expression-dom.d.ts +154 -0
  70. package/dist/components/expression-template.d.ts +86 -0
  71. package/dist/components/history-scale.d.ts +33 -0
  72. package/dist/components/icons.d.ts +41 -0
  73. package/dist/components/resolved-clip.d.ts +42 -0
  74. package/dist/components/server-resources-format.d.ts +68 -0
  75. package/dist/components/server-resources.fixture.d.ts +9 -0
  76. package/dist/components/use-copy.d.ts +14 -0
  77. package/dist/createW6WApi.d.ts +31 -0
  78. package/dist/flow-connect.d.ts +138 -0
  79. package/dist/flow-fanout.d.ts +15 -0
  80. package/dist/flow-types.d.ts +356 -0
  81. package/dist/flow-utils.d.ts +284 -0
  82. package/dist/flow.cjs +3 -0
  83. package/dist/flow.cjs.map +1 -0
  84. package/dist/flow.d.ts +24 -0
  85. package/dist/flow.mjs +1978 -0
  86. package/dist/flow.mjs.map +1 -0
  87. package/dist/index.cjs +2 -0
  88. package/dist/index.cjs.map +1 -0
  89. package/dist/index.d.ts +94 -0
  90. package/dist/index.mjs +1812 -0
  91. package/dist/index.mjs.map +1 -0
  92. package/dist/oauth-popup.d.ts +17 -0
  93. package/dist/output-shape.d.ts +58 -0
  94. package/dist/provider.d.ts +421 -0
  95. package/dist/resolve-params.d.ts +112 -0
  96. package/dist/resolved-json.d.ts +21 -0
  97. package/dist/run-visuals.d.ts +90 -0
  98. package/dist/step-preview-state.d.ts +143 -0
  99. package/dist/theme.d.ts +32 -0
  100. package/dist/trigger-fields.d.ts +56 -0
  101. package/dist/types.d.ts +413 -0
  102. package/dist/use-app-action-defs.d.ts +7 -0
  103. package/dist/use-enter-submit.d.ts +23 -0
  104. package/dist/use-seed-sources.d.ts +16 -0
  105. package/package.json +112 -3
  106. package/src/code.css +561 -0
  107. package/src/styles/_buttons.scss +38 -0
  108. package/src/styles/_chips.scss +210 -0
  109. package/src/styles/_code.scss +139 -0
  110. package/src/styles/_copyable.scss +147 -0
  111. package/src/styles/_data-vars.scss +38 -0
  112. package/src/styles/_execution-history.scss +282 -0
  113. package/src/styles/_execution-log.scss +178 -0
  114. package/src/styles/_expression-field.scss +65 -0
  115. package/src/styles/_expression-inline.scss +63 -0
  116. package/src/styles/_expression-modal.scss +292 -0
  117. package/src/styles/_fields.scss +161 -0
  118. package/src/styles/_flow.scss +217 -0
  119. package/src/styles/_fx.scss +158 -0
  120. package/src/styles/_health.scss +46 -0
  121. package/src/styles/_history-timeline.scss +156 -0
  122. package/src/styles/_icon-button.scss +22 -0
  123. package/src/styles/_icon.scss +15 -0
  124. package/src/styles/_icons.scss +31 -0
  125. package/src/styles/_incoming-state.scss +46 -0
  126. package/src/styles/_info-tip.scss +9 -0
  127. package/src/styles/_layout.scss +6 -0
  128. package/src/styles/_lists.scss +64 -0
  129. package/src/styles/_modal.scss +125 -0
  130. package/src/styles/_multiselect.scss +69 -0
  131. package/src/styles/_repo-sync-indicator.scss +99 -0
  132. package/src/styles/_scale.scss +70 -0
  133. package/src/styles/_sections.scss +36 -0
  134. package/src/styles/_server-resources.scss +163 -0
  135. package/src/styles/_step-builder.scss +376 -0
  136. package/src/styles/_step-config.scss +195 -0
  137. package/src/styles/_tabs.scss +54 -0
  138. package/src/styles/_tester.scss +111 -0
  139. package/src/styles/_tokens.scss +160 -0
  140. package/src/styles/_uptime.scss +61 -0
  141. package/src/styles.css +4894 -0
  142. package/src/styles.scss +61 -0
@@ -0,0 +1,69 @@
1
+ /* Material-style multi-select: chips live INSIDE a single input-like box,
2
+ followed by the dropdown which reads as the trailing placeholder. */
3
+ .w6w-multiselect {
4
+ display: flex;
5
+ flex-wrap: wrap;
6
+ align-items: center;
7
+ gap: var(--w6w-sp-1-5);
8
+ background: var(--w6w-panel-2);
9
+ border: 1px solid var(--w6w-border);
10
+ border-radius: 8px;
11
+ padding: 5px var(--w6w-sp-2);
12
+ min-height: 38px;
13
+ }
14
+ .w6w-multiselect:focus-within {
15
+ border-color: var(--w6w-accent);
16
+ }
17
+ .w6w-multiselect.is-readonly {
18
+ opacity: 0.7;
19
+ }
20
+ /* The add-dropdown blends into the box (no border/background) — compound
21
+ selector so it beats the global `.w6w-field select` styling. */
22
+ .w6w-field .w6w-multiselect-add,
23
+ .w6w-multiselect .w6w-multiselect-add {
24
+ flex: 1 1 90px;
25
+ min-width: 90px;
26
+ border: none;
27
+ background: transparent;
28
+ color: var(--w6w-muted);
29
+ font-size: var(--w6w-fs-sm);
30
+ font-family: inherit;
31
+ padding: var(--w6w-sp-0-5) 0;
32
+ outline: none;
33
+ cursor: pointer;
34
+ }
35
+ .w6w-multiselect .w6w-multiselect-add:disabled {
36
+ cursor: default;
37
+ opacity: 0.6;
38
+ }
39
+ /* A selected value, rendered as a filled chip inside the box. */
40
+ .w6w-chip {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ gap: var(--w6w-sp-1);
44
+ background: var(--w6w-panel);
45
+ border: 1px solid var(--w6w-border);
46
+ border-radius: 6px;
47
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-1) var(--w6w-sp-0-5) var(--w6w-sp-2);
48
+ font-size: 13px;
49
+ line-height: 1.4;
50
+ color: var(--w6w-text);
51
+ }
52
+ .w6w-chip-x {
53
+ display: inline-flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ width: 16px;
57
+ height: 16px;
58
+ border: none;
59
+ border-radius: 4px;
60
+ background: transparent;
61
+ color: var(--w6w-muted);
62
+ font-size: var(--w6w-fs-sm);
63
+ line-height: 1;
64
+ cursor: pointer;
65
+ }
66
+ .w6w-chip-x:hover {
67
+ background: var(--w6w-border);
68
+ color: var(--w6w-text);
69
+ }
@@ -0,0 +1,99 @@
1
+ .w6w-repo-sync {
2
+ position: relative;
3
+ display: inline-flex;
4
+ }
5
+ .w6w-repo-sync-trigger {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: var(--w6w-sp-2);
9
+ padding: var(--w6w-sp-1-5) var(--w6w-sp-3);
10
+ border: 1px solid var(--w6w-border);
11
+ border-radius: 999px;
12
+ background: var(--w6w-panel-2);
13
+ color: var(--w6w-text);
14
+ font-size: var(--w6w-fs-sm);
15
+ cursor: pointer;
16
+ }
17
+ .w6w-repo-sync-trigger:hover {
18
+ border-color: var(--w6w-accent);
19
+ }
20
+ .w6w-repo-sync-icon {
21
+ position: relative;
22
+ display: inline-flex;
23
+ }
24
+ .w6w-repo-sync-spin {
25
+ position: absolute;
26
+ bottom: calc(-1 * var(--w6w-sp-0-5));
27
+ right: calc(-1 * var(--w6w-sp-0-5));
28
+ width: 10px;
29
+ height: 10px;
30
+ background: var(--w6w-panel-2);
31
+ border-radius: 50%;
32
+ animation: w6w-spin 0.8s linear infinite;
33
+ }
34
+ @keyframes w6w-spin {
35
+ to {
36
+ transform: rotate(360deg);
37
+ }
38
+ }
39
+ @media (prefers-reduced-motion: reduce) {
40
+ .w6w-repo-sync-spin {
41
+ animation: none;
42
+ }
43
+ }
44
+ .w6w-repo-sync-branch {
45
+ font-weight: var(--w6w-fw-medium);
46
+ }
47
+ .w6w-repo-sync-sha {
48
+ color: var(--w6w-muted);
49
+ font-size: var(--w6w-fs-xs);
50
+ font-family: var(--w6w-font-mono);
51
+ }
52
+ .w6w-repo-sync-menu {
53
+ position: absolute;
54
+ top: calc(100% + var(--w6w-sp-1-5));
55
+ right: 0;
56
+ min-width: 220px;
57
+ background: var(--w6w-panel);
58
+ border: 1px solid var(--w6w-border);
59
+ border-radius: var(--w6w-radius);
60
+ padding: var(--w6w-sp-1-5);
61
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
62
+ z-index: 30;
63
+ display: flex;
64
+ flex-direction: column;
65
+ gap: var(--w6w-sp-0-5);
66
+ }
67
+ .w6w-repo-sync-detail {
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: var(--w6w-sp-0-5);
71
+ padding: var(--w6w-sp-2) var(--w6w-sp-2-5);
72
+ color: var(--w6w-muted);
73
+ font-size: var(--w6w-fs-xs);
74
+ }
75
+ .w6w-repo-sync-detail > :first-child {
76
+ color: var(--w6w-text);
77
+ font-size: var(--w6w-fs-sm);
78
+ font-weight: var(--w6w-fw-medium);
79
+ }
80
+ .w6w-repo-sync-item {
81
+ display: flex;
82
+ align-items: center;
83
+ width: 100%;
84
+ text-align: left;
85
+ background: transparent;
86
+ border: none;
87
+ border-radius: 8px;
88
+ padding: var(--w6w-sp-2) var(--w6w-sp-2-5);
89
+ color: var(--w6w-text);
90
+ font-size: var(--w6w-fs-sm);
91
+ cursor: pointer;
92
+ }
93
+ .w6w-repo-sync-item:hover:not(:disabled) {
94
+ background: var(--w6w-panel-2);
95
+ }
96
+ .w6w-repo-sync-item:disabled {
97
+ cursor: default;
98
+ opacity: 0.6;
99
+ }
@@ -0,0 +1,70 @@
1
+ /*
2
+ * @w6w/ui — the spacing / typography scale.
3
+ *
4
+ * Values are MIRRORED, not invented, from `packages/frontend/packages/web`'s
5
+ * `src/styles/global.css:83-130` — that file is the canonical reference (it
6
+ * arrived at the same 4px base independently); this block copies its
7
+ * `--sp-*`/`--fs-*`/`--fw-*`/`--lh-*`/`--font-*` values byte-for-byte under the
8
+ * `--w6w-*` namespace this package already uses for every other token.
9
+ * `--fs-hero`'s `clamp()` stays `web`-only (a marketing-page concern; `ui` has
10
+ * no hero). Colour tokens, `--radius*`, `--shadow-*` and `--transition-fast`
11
+ * are NOT part of this scale — see `_tokens.scss`.
12
+ *
13
+ * HALF-STEPS (`--w6w-sp-0-5` / `--w6w-sp-1-5` / `--w6w-sp-2-5`) are `ui`-only
14
+ * additions on top of `web`'s set — `web` has none. The rule that keeps this a
15
+ * system rather than a free-for-all: whole steps for new code; a half-step is
16
+ * only for preserving an existing measured value that does not sit on a 4px
17
+ * step. Parity with `web` is therefore DIRECTIONAL — `ui` ⊇ `web` on the
18
+ * shared key set (every `web` token here has a byte-identical `ui` counterpart;
19
+ * `ui` additionally declares the three half-steps `web` does not).
20
+ *
21
+ * One `:where(:root)` block, not colour's three-way light / prefers-color-scheme /
22
+ * [data-theme] split — the scale is not theme-dependent, so a single specificity-0
23
+ * block covers every mode. Positioning this partial's `@use` line immediately
24
+ * after `styles/tokens` (see `styles.scss`) is a readability convention, not a
25
+ * cascade constraint: CSS custom properties resolve at computed-value time, so
26
+ * definition order relative to consumption order does not matter here, unlike
27
+ * `_tokens.scss`'s internal prefers-color-scheme / [data-theme] ordering, which
28
+ * IS load-bearing.
29
+ */
30
+
31
+ :where(:root) {
32
+ /* Spacing — 4px ramp. Values mirror frontend/web's --sp-* verbatim. */
33
+ --w6w-sp-1: 4px; --w6w-sp-2: 8px; --w6w-sp-3: 12px; --w6w-sp-4: 16px;
34
+ --w6w-sp-5: 20px; --w6w-sp-6: 24px; --w6w-sp-8: 32px; --w6w-sp-10: 40px;
35
+ --w6w-sp-12: 48px; --w6w-sp-16: 64px; --w6w-sp-20: 80px;
36
+
37
+ /* Half-steps — ui-only, see the decision above. */
38
+ --w6w-sp-0-5: 2px; --w6w-sp-1-5: 6px; --w6w-sp-2-5: 10px;
39
+
40
+ /* Type ramp — rem, role names mirror frontend/web's --fs-*. */
41
+ --w6w-fs-xs: 0.75rem; --w6w-fs-sm: 0.875rem; --w6w-fs-base: 1rem;
42
+ --w6w-fs-lg: 1.125rem; --w6w-fs-xl: 1.25rem; --w6w-fs-2xl: 1.5rem;
43
+ --w6w-fs-3xl: 2rem;
44
+
45
+ --w6w-fw-regular: 400; --w6w-fw-medium: 500; --w6w-fw-semibold: 600; --w6w-fw-bold: 700;
46
+
47
+ --w6w-lh-tight: 1.2; --w6w-lh-normal: 1.5; --w6w-lh-relaxed: 1.7;
48
+
49
+ --w6w-font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
50
+ --w6w-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
51
+ }
52
+
53
+ /*
54
+ * Breakpoints — Sass variables, NOT CSS custom properties.
55
+ *
56
+ * `@media (min-width: var(--w6w-bp-md))` is invalid in every browser: a media
57
+ * query condition cannot read a custom property. So these live as Sass
58
+ * variables instead, resolved before the browser ever sees the stylesheet.
59
+ * `!default` lets a Sass consumer override one:
60
+ *
61
+ * @use "@w6w/ui/styles/scale" with ($w6w-bp-md: 960px);
62
+ *
63
+ * `ui` itself consumes none of these — it deliberately ships no layout media
64
+ * queries (the host owns page layout; `ui` owns component internals). They
65
+ * exist purely so a consumer stops inventing its own breakpoint values (seven
66
+ * uncoordinated ones exist across the four repos today).
67
+ */
68
+ $w6w-bp-sm: 640px !default;
69
+ $w6w-bp-md: 900px !default;
70
+ $w6w-bp-lg: 1200px !default;
@@ -0,0 +1,36 @@
1
+ .w6w-section {
2
+ border: 1px solid var(--w6w-border);
3
+ border-radius: 8px;
4
+ padding: var(--w6w-sp-2) var(--w6w-sp-2-5);
5
+ }
6
+ .w6w-section > summary {
7
+ cursor: pointer;
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: var(--w6w-sp-0-5);
11
+ }
12
+ .w6w-section-title {
13
+ color: var(--w6w-text);
14
+ font-weight: var(--w6w-fw-semibold);
15
+ }
16
+ .w6w-section-subtitle {
17
+ color: var(--w6w-muted);
18
+ font-size: 0.8em;
19
+ }
20
+ .w6w-section-body {
21
+ margin-top: var(--w6w-sp-2);
22
+ }
23
+
24
+ /* Inline "Test run" block in the step builder (sits above the footer). */
25
+ .w6w-steptest {
26
+ display: flex;
27
+ flex-direction: column;
28
+ gap: var(--w6w-sp-2);
29
+ flex-shrink: 0;
30
+ }
31
+ .w6w-steptest-bar {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: var(--w6w-sp-2-5);
35
+ }
36
+ /* A labeled test-run output block (Result vs Console). */
@@ -0,0 +1,163 @@
1
+ /*
2
+ * Server resources — the four presentational variants from
3
+ * `src/components/ServerResources.tsx` (card, small card, rail, badge).
4
+ *
5
+ * Spacing and type come from the `--w6w-sp-*` / `--w6w-fs-*` ramps only, so a
6
+ * host that re-tunes the scale re-tunes these too; box geometry (heights,
7
+ * track widths, radii) is deliberately literal, as everywhere else in this
8
+ * package. The only colour that is not a themed token reference is the
9
+ * sparkline stroke, which is `--w6w-accent` in both modes.
10
+ *
11
+ * The rail variant is the size-sensitive one: it lands in a ~200 px sidebar
12
+ * column, so every part of it is `min-width: 0`-safe and the sparkline is
13
+ * scaled by `preserveAspectRatio="none"` rather than given an intrinsic width.
14
+ */
15
+
16
+ .w6w-server-resources {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: var(--w6w-sp-2);
20
+ min-width: 0;
21
+ color: var(--w6w-text);
22
+ font-size: var(--w6w-fs-sm);
23
+ line-height: var(--w6w-lh-normal);
24
+ }
25
+
26
+ .w6w-server-resources__title {
27
+ margin: 0;
28
+ font-size: var(--w6w-fs-base);
29
+ font-weight: var(--w6w-fw-semibold);
30
+ line-height: var(--w6w-lh-tight);
31
+ }
32
+
33
+ .w6w-server-resources__rows {
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: var(--w6w-sp-2);
37
+ margin: 0;
38
+ padding: 0;
39
+ list-style: none;
40
+ }
41
+
42
+ .w6w-server-resources__row {
43
+ display: grid;
44
+ grid-template-columns: minmax(0, 1fr) auto;
45
+ align-items: baseline;
46
+ gap: var(--w6w-sp-1) var(--w6w-sp-2);
47
+ }
48
+
49
+ .w6w-server-resources__label {
50
+ color: var(--w6w-muted);
51
+ font-size: var(--w6w-fs-xs);
52
+ letter-spacing: 0.04em;
53
+ text-transform: uppercase;
54
+ }
55
+
56
+ .w6w-server-resources__value {
57
+ font-family: var(--w6w-font-mono);
58
+ font-size: var(--w6w-fs-sm);
59
+ font-variant-numeric: tabular-nums;
60
+ }
61
+
62
+ /* The line itself. `stroke` is repeated as a property (not only as the
63
+ polyline's presentation attribute) so a host stylesheet can re-colour it
64
+ without reaching into the SVG. */
65
+ .w6w-server-resources__spark {
66
+ grid-column: 1 / -1;
67
+ display: block;
68
+ width: 100%;
69
+ height: 28px;
70
+ stroke: var(--w6w-accent);
71
+ stroke-width: 2;
72
+ stroke-linejoin: round;
73
+ stroke-linecap: round;
74
+ overflow: visible;
75
+ }
76
+
77
+ .w6w-server-resources__meta {
78
+ margin: 0;
79
+ color: var(--w6w-muted);
80
+ font-family: var(--w6w-font-mono);
81
+ font-size: var(--w6w-fs-xs);
82
+ }
83
+
84
+ /* --- card ---------------------------------------------------------------- */
85
+
86
+ .w6w-server-resources--card {
87
+ gap: var(--w6w-sp-3);
88
+ padding: var(--w6w-sp-4);
89
+ border: 1px solid var(--w6w-border);
90
+ border-radius: var(--w6w-radius);
91
+ background: var(--w6w-panel);
92
+ }
93
+
94
+ /* --- small card ---------------------------------------------------------- */
95
+
96
+ .w6w-server-resources--small {
97
+ gap: var(--w6w-sp-1-5);
98
+ padding: var(--w6w-sp-3);
99
+ border: 1px solid var(--w6w-border);
100
+ border-radius: var(--w6w-radius);
101
+ background: var(--w6w-panel);
102
+ }
103
+
104
+ .w6w-server-resources--small .w6w-server-resources__title {
105
+ font-size: var(--w6w-fs-sm);
106
+ }
107
+
108
+ /* --- rail ---------------------------------------------------------------- */
109
+
110
+ .w6w-server-resources--rail {
111
+ gap: var(--w6w-sp-1);
112
+ padding: var(--w6w-sp-2);
113
+ border: 1px solid var(--w6w-border);
114
+ border-radius: var(--w6w-radius);
115
+ background: var(--w6w-panel);
116
+ }
117
+
118
+ .w6w-server-resources__rail-row {
119
+ display: grid;
120
+ grid-template-columns: auto minmax(0, 1fr);
121
+ align-items: baseline;
122
+ gap: 0 var(--w6w-sp-2);
123
+ }
124
+
125
+ .w6w-server-resources__rail-row .w6w-server-resources__value {
126
+ text-align: right;
127
+ }
128
+
129
+ .w6w-server-resources__rail-row .w6w-server-resources__spark {
130
+ height: 20px;
131
+ }
132
+
133
+ .w6w-server-resources__expand {
134
+ width: 100%;
135
+ padding: var(--w6w-sp-1) var(--w6w-sp-2);
136
+ border: 1px solid var(--w6w-border);
137
+ border-radius: var(--w6w-radius);
138
+ background: var(--w6w-panel-2);
139
+ color: var(--w6w-muted);
140
+ font-family: inherit;
141
+ font-size: var(--w6w-fs-xs);
142
+ cursor: pointer;
143
+ }
144
+
145
+ .w6w-server-resources__expand:hover {
146
+ color: var(--w6w-text);
147
+ border-color: var(--w6w-accent);
148
+ }
149
+
150
+ /* --- badge --------------------------------------------------------------- */
151
+
152
+ .w6w-server-resources--badge {
153
+ flex-direction: row;
154
+ gap: var(--w6w-sp-2);
155
+ align-items: center;
156
+ padding: 0 var(--w6w-sp-2);
157
+ border: 1px solid var(--w6w-border);
158
+ border-radius: 999px;
159
+ background: var(--w6w-panel-2);
160
+ font-family: var(--w6w-font-mono);
161
+ font-size: var(--w6w-fs-xs);
162
+ white-space: nowrap;
163
+ }