@w6w/ui 0.1.1 → 0.2.11

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 (87) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +7 -5
  3. package/dist/AppPicker.d.ts +48 -2
  4. package/dist/CanvasLayer.d.ts +38 -0
  5. package/dist/{CodeBlock-Dot3Pd7P.js → CodeBlock-BqXDA35P.js} +2 -2
  6. package/dist/{CodeBlock-Dot3Pd7P.js.map → CodeBlock-BqXDA35P.js.map} +1 -1
  7. package/dist/{CodeBlock-CZu4TFSi.cjs → CodeBlock-CulfbnZD.cjs} +2 -2
  8. package/dist/{CodeBlock-CZu4TFSi.cjs.map → CodeBlock-CulfbnZD.cjs.map} +1 -1
  9. package/dist/ConfirmModal-Ln99S9NT.js +7919 -0
  10. package/dist/ConfirmModal-Ln99S9NT.js.map +1 -0
  11. package/dist/ConfirmModal-fjHW5rN-.cjs +14 -0
  12. package/dist/ConfirmModal-fjHW5rN-.cjs.map +1 -0
  13. package/dist/ConnectionHeader.d.ts +19 -0
  14. package/dist/Copyable-DA6eiU7w.cjs +2 -0
  15. package/dist/Copyable-DA6eiU7w.cjs.map +1 -0
  16. package/dist/{Copyable-1niV9gUa.js → Copyable-F4NTaG77.js} +91 -15
  17. package/dist/Copyable-F4NTaG77.js.map +1 -0
  18. package/dist/EditConnectionModal.d.ts +26 -0
  19. package/dist/JsonEditor.d.ts +8 -0
  20. package/dist/Markdown.d.ts +25 -0
  21. package/dist/ParamsForm.d.ts +7 -1
  22. package/dist/StepBuilderModal.d.ts +23 -5
  23. package/dist/WorkflowFlowEditor.d.ts +14 -3
  24. package/dist/app-pages.d.ts +5 -0
  25. package/dist/canvas-types.d.ts +36 -0
  26. package/dist/canvas-utils.d.ts +44 -0
  27. package/dist/code.cjs +1 -1
  28. package/dist/code.mjs +2 -2
  29. package/dist/components/AuthFieldsForm.d.ts +19 -1
  30. package/dist/components/BudgetMeter.d.ts +15 -0
  31. package/dist/components/CallableList.d.ts +58 -0
  32. package/dist/components/Combobox.d.ts +8 -1
  33. package/dist/components/ConnectionList.d.ts +43 -0
  34. package/dist/components/CredentialPicker.d.ts +35 -0
  35. package/dist/components/DataTable.d.ts +27 -0
  36. package/dist/components/EmptyState.d.ts +9 -0
  37. package/dist/components/ListItem.d.ts +16 -6
  38. package/dist/components/ReliabilityChart.d.ts +10 -0
  39. package/dist/components/ReliabilityList.d.ts +47 -0
  40. package/dist/components/icons.d.ts +1 -1
  41. package/dist/connection-app-meta.d.ts +32 -0
  42. package/dist/dynamic-fields.d.ts +60 -0
  43. package/dist/editor-theme.d.ts +24 -0
  44. package/dist/flow-fanout.d.ts +2 -2
  45. package/dist/flow-types.d.ts +18 -1
  46. package/dist/flow-utils.d.ts +10 -3
  47. package/dist/flow.cjs +2 -2
  48. package/dist/flow.cjs.map +1 -1
  49. package/dist/flow.d.ts +9 -0
  50. package/dist/flow.mjs +1519 -1138
  51. package/dist/flow.mjs.map +1 -1
  52. package/dist/index.cjs +1 -1
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.ts +30 -2
  55. package/dist/index.mjs +2053 -1005
  56. package/dist/index.mjs.map +1 -1
  57. package/dist/note-markdown.d.ts +22 -0
  58. package/dist/provider.d.ts +73 -5
  59. package/dist/reliability-board-layout.d.ts +121 -0
  60. package/dist/resolve-params.d.ts +5 -0
  61. package/dist/run-visuals.d.ts +4 -1
  62. package/dist/step-problems.d.ts +34 -0
  63. package/dist/types.d.ts +117 -3
  64. package/dist/use-dynamic-fields.d.ts +23 -0
  65. package/package.json +5 -3
  66. package/src/styles/_budget-meter.scss +46 -0
  67. package/src/styles/_callable-list.scss +69 -0
  68. package/src/styles/_canvas.scss +318 -0
  69. package/src/styles/_connections.scss +88 -0
  70. package/src/styles/_data-table.scss +55 -0
  71. package/src/styles/_empty-state.scss +21 -0
  72. package/src/styles/_flow.scss +11 -0
  73. package/src/styles/_fx.scss +23 -0
  74. package/src/styles/_layout.scss +10 -0
  75. package/src/styles/_lists.scss +4 -0
  76. package/src/styles/_markdown.scss +20 -0
  77. package/src/styles/_reliability.scss +339 -0
  78. package/src/styles/_tester.scss +1 -14
  79. package/src/styles.css +1142 -17
  80. package/src/styles.scss +8 -0
  81. package/dist/ConfirmModal-8avl9Nv8.cjs +0 -11
  82. package/dist/ConfirmModal-8avl9Nv8.cjs.map +0 -1
  83. package/dist/ConfirmModal-CD-P8mhN.js +0 -6335
  84. package/dist/ConfirmModal-CD-P8mhN.js.map +0 -1
  85. package/dist/Copyable-1niV9gUa.js.map +0 -1
  86. package/dist/Copyable-CYZU1o4X.cjs +0 -2
  87. package/dist/Copyable-CYZU1o4X.cjs.map +0 -1
package/src/styles.css CHANGED
@@ -914,6 +914,15 @@ svg.react-flow__connectionline {
914
914
  * uncoordinated ones exist across the four repos today).
915
915
  */
916
916
  /* Layout helpers */
917
+ /* A vertical column whose direct children are cards/panels. ONE gap, from the
918
+ shared spacing scale — never a per-screen number and never a second gap: do
919
+ not add this class to a container whose parent already gaps its children. */
920
+ .w6w-card-stack {
921
+ display: flex;
922
+ flex-direction: column;
923
+ gap: var(--w6w-sp-4);
924
+ }
925
+
917
926
  .w6w-stack {
918
927
  display: flex;
919
928
  flex-direction: column;
@@ -1804,6 +1813,32 @@ select optgroup {
1804
1813
  color: var(--w6w-accent);
1805
1814
  }
1806
1815
 
1816
+ /* The json param's ƒx rides INSIDE the editor box, top-right, as the editor's
1817
+ `overlay` (same mechanism as the `copyable` button in `_step-config.scss`).
1818
+ Opaque backdrop because it sits on line 1; the text keeps right padding so
1819
+ it is never covered; with `copyable` on it steps left of the copy button. */
1820
+ .w6w-json-editor > .w6w-expr-fx {
1821
+ position: absolute;
1822
+ top: var(--w6w-sp-1);
1823
+ right: var(--w6w-sp-1);
1824
+ z-index: 1;
1825
+ border: none;
1826
+ background: var(--w6w-panel);
1827
+ border-radius: 6px;
1828
+ }
1829
+
1830
+ .w6w-json-editor:has(> .w6w-expr-fx) .cm-content {
1831
+ padding-right: var(--w6w-sp-10);
1832
+ }
1833
+
1834
+ .w6w-json-editor:has(> .w6w-copyable-btn) > .w6w-expr-fx {
1835
+ right: calc(var(--w6w-sp-1) * 2 + var(--w6w-sp-8));
1836
+ }
1837
+
1838
+ .w6w-json-editor:has(> .w6w-copyable-btn):has(> .w6w-expr-fx) .cm-content {
1839
+ padding-right: var(--w6w-sp-20);
1840
+ }
1841
+
1807
1842
  /* Copyable — an in-box copy affordance decorating a value-displaying control
1808
1843
  (an <input>, a <textarea>, or CodeBlock's <pre>). Mirrors `.w6w-fx-wrap`
1809
1844
  (`_fx.scss:1-88`): the WRAPPER owns the box chrome and every child it holds
@@ -2378,6 +2413,11 @@ button.w6w-list-item {
2378
2413
  font-size: var(--w6w-fs-sm);
2379
2414
  }
2380
2415
 
2416
+ a.w6w-list-item {
2417
+ text-decoration: none;
2418
+ color: inherit;
2419
+ }
2420
+
2381
2421
  .w6w-list-item:hover {
2382
2422
  background: var(--w6w-panel-2);
2383
2423
  }
@@ -3439,6 +3479,17 @@ dialog.w6w-modal.w6w-modal-fullscreen .w6w-modal-header {
3439
3479
  white-space: nowrap;
3440
3480
  }
3441
3481
 
3482
+ /* A trigger node's card (ControlNodeCard, `isTrigger`) — a half-pill: fully
3483
+ rounded entry (left) edge, the ordinary 4px corner on the exit (right) edge,
3484
+ so a run's start reads apart from the steps it feeds. No radius token
3485
+ exists beyond --w6w-radius (10px), hence the literals. Wider left inset
3486
+ clears the curve. */
3487
+ .w6w-flow .w6w-node-trigger {
3488
+ border-radius: 999px 4px 4px 999px;
3489
+ /* lint-tokens-allow: 14px right inset matches the non-trigger card's inline padding */
3490
+ padding: var(--w6w-sp-1-5) 14px var(--w6w-sp-1-5) var(--w6w-sp-4);
3491
+ }
3492
+
3442
3493
  /* The ordinary (success) ports — bumped from the library's own 6px default
3443
3494
  (2026-08-30: "ports must have consistent size") to match the error port
3444
3495
  below exactly. `:not(.w6w-handle-multi)`: the multi-input handle is its
@@ -3643,7 +3694,7 @@ dialog.w6w-modal.w6w-modal-fullscreen .w6w-modal-header {
3643
3694
 
3644
3695
  /* Host-embedded ActionTestForm (studio's ConnectionTesterModal wraps it in its
3645
3696
  OWN full modal). The widget then fills that modal as a full-height flex column:
3646
- the params + saved-tests region scrolls, and the action bar is a bottom-pinned,
3697
+ the params / result / saved-tests cards scroll, and the action bar is a bottom-pinned,
3647
3698
  non-scrolling footer. These classes are only applied in `embedded` mode, so the
3648
3699
  inline / own-pop-out layout is untouched. */
3649
3700
  .w6w-tester-embedded-root {
@@ -3664,22 +3715,6 @@ dialog.w6w-modal.w6w-modal-fullscreen .w6w-modal-header {
3664
3715
  overflow: auto;
3665
3716
  }
3666
3717
 
3667
- .w6w-tester-embedded-cols {
3668
- display: flex;
3669
- gap: var(--w6w-sp-4);
3670
- align-items: flex-start;
3671
- }
3672
-
3673
- .w6w-tester-embedded-main {
3674
- flex: 1;
3675
- min-width: 0;
3676
- }
3677
-
3678
- .w6w-tester-embedded-rail {
3679
- width: 260px;
3680
- flex-shrink: 0;
3681
- }
3682
-
3683
3718
  /* The action bar as a pinned footer: kept out of the scroll region and separated
3684
3719
  with a top border so Run / Save / Delete stay visible however long the params. */
3685
3720
  .w6w-tester-actions-footer {
@@ -4892,3 +4927,1093 @@ dialog.w6w-modal.w6w-modal-fullscreen .w6w-modal-header {
4892
4927
  font-size: var(--w6w-fs-xs);
4893
4928
  white-space: nowrap;
4894
4929
  }
4930
+
4931
+ /* --- ReliabilityList / ReliabilityChart ---------------------------------- */
4932
+ /* The service-reliability board: "needs attention" cards, a calls x p95
4933
+ scatter and the services table. State colour throughout comes from the
4934
+ shared `--w6w-health-*` tokens via HealthStatusPill and UptimeStrip (and,
4935
+ for the scatter, read directly) — never from a colour written here.
4936
+ Every navigation site (card, service cell, scatter point) may be an `<a>`,
4937
+ a `<button>` or a plain element, so the shared rules reset all three. */
4938
+ .w6w-rel-section {
4939
+ margin-bottom: var(--w6w-sp-6);
4940
+ }
4941
+
4942
+ .w6w-rel-heading {
4943
+ margin: 0 0 var(--w6w-sp-2);
4944
+ display: flex;
4945
+ align-items: baseline;
4946
+ justify-content: space-between;
4947
+ gap: var(--w6w-sp-3);
4948
+ }
4949
+
4950
+ .w6w-rel-intro {
4951
+ margin: 0 0 var(--w6w-sp-2);
4952
+ }
4953
+
4954
+ .w6w-rel-card {
4955
+ background: var(--w6w-panel);
4956
+ border: 1px solid var(--w6w-border);
4957
+ border-radius: var(--w6w-radius);
4958
+ padding: var(--w6w-sp-4);
4959
+ }
4960
+
4961
+ .w6w-rel-card h4 {
4962
+ margin: 0 0 var(--w6w-sp-2);
4963
+ }
4964
+
4965
+ .w6w-rel-tag {
4966
+ display: inline-block;
4967
+ background: var(--w6w-panel-2);
4968
+ border: 1px solid var(--w6w-border);
4969
+ border-radius: 999px;
4970
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-2);
4971
+ font-size: var(--w6w-fs-xs);
4972
+ color: var(--w6w-muted);
4973
+ margin-right: var(--w6w-sp-1);
4974
+ }
4975
+
4976
+ .w6w-rel-group + .w6w-rel-group {
4977
+ margin-top: var(--w6w-sp-5);
4978
+ }
4979
+
4980
+ .w6w-rel-group-head {
4981
+ margin: 0 0 var(--w6w-sp-2);
4982
+ font-size: var(--w6w-fs-sm);
4983
+ }
4984
+
4985
+ /* The "N more — view all" line under a capped section. */
4986
+ .w6w-rel-more-note {
4987
+ margin: var(--w6w-sp-2) 0 0;
4988
+ }
4989
+
4990
+ /* --- "Needs attention" callout — a few dense cards, not table rows -------- */
4991
+ .w6w-rel-issues {
4992
+ display: grid;
4993
+ /* `auto-fit`, not `auto-fill`: with fewer cards than fit the row, `auto-fill`
4994
+ keeps empty width-reserving tracks and the cards stop short of the edge. */
4995
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
4996
+ gap: var(--w6w-sp-2);
4997
+ }
4998
+
4999
+ .w6w-rel-issue-card {
5000
+ display: flex;
5001
+ flex-direction: column;
5002
+ gap: var(--w6w-sp-2);
5003
+ padding: var(--w6w-sp-3);
5004
+ background: var(--w6w-panel);
5005
+ border: 1px solid var(--w6w-border);
5006
+ /* Same `--w6w-health-*` tokens as the pills inside, so the stripe cannot
5007
+ drift from the pill beside it. `down` on either signal escalates it. */
5008
+ border-left: 3px solid var(--w6w-health-degraded);
5009
+ border-radius: var(--w6w-radius);
5010
+ color: inherit;
5011
+ text-decoration: none;
5012
+ /* button reset (the card is a <button> when only `onOpen` is given) */
5013
+ font: inherit;
5014
+ text-align: left;
5015
+ width: 100%;
5016
+ cursor: pointer;
5017
+ }
5018
+
5019
+ div.w6w-rel-issue-card {
5020
+ cursor: default;
5021
+ }
5022
+
5023
+ .w6w-rel-issue-card:has(.w6w-health-pill-down) {
5024
+ border-left-color: var(--w6w-health-down);
5025
+ }
5026
+
5027
+ a.w6w-rel-issue-card:hover,
5028
+ a.w6w-rel-issue-card:focus-visible,
5029
+ button.w6w-rel-issue-card:hover,
5030
+ button.w6w-rel-issue-card:focus-visible {
5031
+ border-color: var(--w6w-accent);
5032
+ }
5033
+
5034
+ .w6w-rel-issue-head {
5035
+ display: flex;
5036
+ align-items: center;
5037
+ gap: var(--w6w-sp-2);
5038
+ }
5039
+
5040
+ .w6w-rel-issue-head-text {
5041
+ display: flex;
5042
+ flex-direction: column;
5043
+ gap: var(--w6w-sp-0-5);
5044
+ min-width: 0;
5045
+ }
5046
+
5047
+ .w6w-rel-issue-signals {
5048
+ display: flex;
5049
+ gap: var(--w6w-sp-4);
5050
+ }
5051
+
5052
+ .w6w-rel-issue-signal {
5053
+ display: flex;
5054
+ flex-direction: column;
5055
+ gap: var(--w6w-sp-0-5);
5056
+ }
5057
+
5058
+ /* --- Performance scatter — calls x p95, one point per API ----------------- */
5059
+ .w6w-rel-scatter svg {
5060
+ display: block;
5061
+ width: 100%;
5062
+ height: auto;
5063
+ }
5064
+
5065
+ /* SVG shapes have no fill unless one is set here; without it the plot
5066
+ renders as SVG's default opaque black regardless of theme. */
5067
+ .w6w-rel-scatter-plot-bg {
5068
+ fill: var(--w6w-panel-2);
5069
+ }
5070
+
5071
+ .w6w-rel-scatter-grid {
5072
+ stroke: var(--w6w-border);
5073
+ stroke-width: 1;
5074
+ }
5075
+
5076
+ .w6w-rel-scatter-axis-label {
5077
+ fill: var(--w6w-muted);
5078
+ font-size: var(--w6w-fs-xs);
5079
+ }
5080
+
5081
+ .w6w-rel-scatter-axis-title {
5082
+ fill: var(--w6w-muted);
5083
+ font-size: var(--w6w-fs-xs);
5084
+ }
5085
+
5086
+ /* The point's coloured ring — carries exec status. */
5087
+ .w6w-rel-scatter-ring {
5088
+ fill: var(--w6w-panel);
5089
+ stroke-width: 2;
5090
+ }
5091
+
5092
+ .w6w-rel-scatter-ring-ok {
5093
+ stroke: var(--w6w-health-ok);
5094
+ }
5095
+
5096
+ .w6w-rel-scatter-ring-degraded {
5097
+ stroke: var(--w6w-health-degraded);
5098
+ }
5099
+
5100
+ .w6w-rel-scatter-ring-down {
5101
+ stroke: var(--w6w-health-down);
5102
+ }
5103
+
5104
+ .w6w-rel-scatter-ring-unknown {
5105
+ stroke: var(--w6w-health-unknown);
5106
+ }
5107
+
5108
+ .w6w-rel-scatter-point-link {
5109
+ cursor: pointer;
5110
+ }
5111
+
5112
+ .w6w-rel-scatter-point-link:hover .w6w-rel-scatter-ring,
5113
+ .w6w-rel-scatter-point-link:focus-visible .w6w-rel-scatter-ring {
5114
+ stroke-width: 3;
5115
+ }
5116
+
5117
+ .w6w-rel-scatter-point {
5118
+ stroke: var(--w6w-panel);
5119
+ stroke-width: 1.5;
5120
+ fill-opacity: 0.85;
5121
+ }
5122
+
5123
+ .w6w-rel-scatter-point-ok {
5124
+ fill: var(--w6w-health-ok);
5125
+ }
5126
+
5127
+ .w6w-rel-scatter-point-degraded {
5128
+ fill: var(--w6w-health-degraded);
5129
+ }
5130
+
5131
+ .w6w-rel-scatter-point-down {
5132
+ fill: var(--w6w-health-down);
5133
+ }
5134
+
5135
+ .w6w-rel-scatter-point-unknown {
5136
+ fill: var(--w6w-health-unknown);
5137
+ }
5138
+
5139
+ .w6w-rel-scatter-note {
5140
+ margin: var(--w6w-sp-1) 0 0;
5141
+ }
5142
+
5143
+ /* --- The full roster — one real <table> ------------------------------------ */
5144
+ .w6w-rel-table-wrap {
5145
+ overflow-x: auto;
5146
+ }
5147
+
5148
+ .w6w-rel-table {
5149
+ width: 100%;
5150
+ border-collapse: collapse;
5151
+ }
5152
+
5153
+ .w6w-rel-table th {
5154
+ padding: var(--w6w-sp-2) var(--w6w-sp-3);
5155
+ text-align: left;
5156
+ font-size: var(--w6w-fs-xs);
5157
+ font-weight: var(--w6w-fw-semibold);
5158
+ color: var(--w6w-muted);
5159
+ border-bottom: 1px solid var(--w6w-border);
5160
+ white-space: nowrap;
5161
+ }
5162
+
5163
+ .w6w-rel-table td {
5164
+ padding: var(--w6w-sp-2-5) var(--w6w-sp-3);
5165
+ border-bottom: 1px solid var(--w6w-border);
5166
+ vertical-align: top;
5167
+ }
5168
+
5169
+ /* Inside a compact card there is no rule under the last row. */
5170
+ .w6w-rel-card .w6w-rel-table tbody tr:last-child td {
5171
+ border-bottom: none;
5172
+ }
5173
+
5174
+ .w6w-rel-table tbody tr:hover {
5175
+ background: var(--w6w-panel-2);
5176
+ }
5177
+
5178
+ /* A row's own stripe — same tokens and escalation as the issue card; both the
5179
+ tier and the state that select the token are decided server-side. */
5180
+ .w6w-rel-tr.w6w-rel-attention {
5181
+ box-shadow: inset 3px 0 0 var(--w6w-health-degraded);
5182
+ }
5183
+
5184
+ .w6w-rel-tr.w6w-rel-attention:has(.w6w-health-pill-down) {
5185
+ box-shadow: inset 3px 0 0 var(--w6w-health-down);
5186
+ }
5187
+
5188
+ .w6w-rel-tr[data-attention=recent] {
5189
+ box-shadow: inset 3px 0 0 var(--w6w-health-unknown);
5190
+ }
5191
+
5192
+ .w6w-rel-open {
5193
+ display: flex;
5194
+ align-items: center;
5195
+ gap: var(--w6w-sp-2);
5196
+ color: inherit;
5197
+ text-decoration: none;
5198
+ /* button reset (the cell is a <button> when only `onOpen` is given) */
5199
+ font: inherit;
5200
+ text-align: left;
5201
+ background: none;
5202
+ border: 0;
5203
+ padding: 0;
5204
+ }
5205
+
5206
+ a.w6w-rel-open,
5207
+ button.w6w-rel-open {
5208
+ cursor: pointer;
5209
+ }
5210
+
5211
+ .w6w-rel-td-service-text {
5212
+ display: flex;
5213
+ flex-direction: column;
5214
+ gap: var(--w6w-sp-0-5);
5215
+ min-width: 0;
5216
+ }
5217
+
5218
+ .w6w-rel-td-service strong {
5219
+ overflow-wrap: anywhere;
5220
+ }
5221
+
5222
+ a.w6w-rel-open:hover strong,
5223
+ a.w6w-rel-open:focus-visible strong,
5224
+ button.w6w-rel-open:hover strong,
5225
+ button.w6w-rel-open:focus-visible strong {
5226
+ color: var(--w6w-accent);
5227
+ }
5228
+
5229
+ .w6w-rel-td-uptime {
5230
+ min-width: 220px;
5231
+ }
5232
+
5233
+ .w6w-rel-td-uptime .w6w-uptime-strip {
5234
+ max-width: 260px;
5235
+ }
5236
+
5237
+ /* A single short value ("397 ms" / "—"); no caption, whose varying length
5238
+ destabilised this column's `auto` layout. */
5239
+ .w6w-rel-td-p95 {
5240
+ white-space: nowrap;
5241
+ }
5242
+
5243
+ /* Both signals stacked as one line each ("Ops: <pill>" / "API: <pill>") rather
5244
+ than two columns, so the table fits a smaller screen without scrolling. */
5245
+ .w6w-rel-td-status {
5246
+ display: flex;
5247
+ flex-direction: column;
5248
+ gap: var(--w6w-sp-1);
5249
+ min-width: 140px;
5250
+ }
5251
+
5252
+ .w6w-rel-status-row {
5253
+ display: flex;
5254
+ align-items: center;
5255
+ flex-wrap: wrap;
5256
+ gap: var(--w6w-sp-1-5);
5257
+ }
5258
+
5259
+ .w6w-rel-status-label {
5260
+ min-width: 28px;
5261
+ }
5262
+
5263
+ /* Within a status ROW the signal reads inline, beside its label — the issue
5264
+ card's own use of `.w6w-rel-signal` (label above pill) is unaffected. */
5265
+ .w6w-rel-status-row .w6w-rel-signal {
5266
+ flex-direction: row;
5267
+ align-items: center;
5268
+ flex-wrap: wrap;
5269
+ }
5270
+
5271
+ /* One labelled signal inside a state cell/card — label ABOVE its pill, so two
5272
+ labelled pills in a narrow column do not wrap unpredictably. */
5273
+ .w6w-rel-signal {
5274
+ display: flex;
5275
+ flex-direction: column;
5276
+ align-items: flex-start;
5277
+ gap: var(--w6w-sp-0-5);
5278
+ min-width: 0;
5279
+ }
5280
+
5281
+ .w6w-rel-vendor-msg {
5282
+ color: var(--w6w-muted);
5283
+ /* The API's own incident title — clamped, full text in the row's `title`, so
5284
+ one verbose status page cannot stretch a board row. */
5285
+ display: -webkit-box;
5286
+ -webkit-line-clamp: 2;
5287
+ -webkit-box-orient: vertical;
5288
+ overflow: hidden;
5289
+ overflow-wrap: anywhere;
5290
+ }
5291
+
5292
+ /* A service the account never called: no strip, just a note. */
5293
+ .w6w-rel-idle-note {
5294
+ font-size: var(--w6w-fs-xs);
5295
+ font-style: italic;
5296
+ color: var(--w6w-text);
5297
+ }
5298
+
5299
+ .w6w-rel-allclear {
5300
+ margin-bottom: var(--w6w-sp-4);
5301
+ }
5302
+
5303
+ .w6w-rel-allclear p {
5304
+ margin: 0 0 var(--w6w-sp-1-5);
5305
+ }
5306
+
5307
+ @media (max-width: 900px) {
5308
+ /* The table scrolls inside `.w6w-rel-table-wrap` rather than reflowing —
5309
+ 4 columns of pills and a strip cannot usefully stack. */
5310
+ .w6w-rel-table {
5311
+ min-width: 600px;
5312
+ }
5313
+ }
5314
+ /* "Show all services →" when only `onShowAll` is given: a <button> that reads as the link. */
5315
+ .w6w-rel-show-all {
5316
+ font: inherit;
5317
+ background: none;
5318
+ border: 0;
5319
+ padding: 0;
5320
+ color: inherit;
5321
+ cursor: pointer;
5322
+ }
5323
+
5324
+ .w6w-rel-show-all:hover,
5325
+ .w6w-rel-show-all:focus-visible {
5326
+ color: var(--w6w-accent);
5327
+ }
5328
+
5329
+ .w6w-callable-list {
5330
+ display: flex;
5331
+ flex-direction: column;
5332
+ gap: var(--w6w-sp-4);
5333
+ }
5334
+
5335
+ .w6w-callable-list-head {
5336
+ display: flex;
5337
+ justify-content: space-between;
5338
+ align-items: flex-start;
5339
+ gap: var(--w6w-sp-4);
5340
+ }
5341
+
5342
+ .w6w-callable-list-heading {
5343
+ display: flex;
5344
+ flex-direction: column;
5345
+ gap: var(--w6w-sp-1);
5346
+ min-width: 0;
5347
+ }
5348
+
5349
+ .w6w-callable-list-title {
5350
+ margin: 0;
5351
+ }
5352
+
5353
+ .w6w-callable-list-description {
5354
+ margin: 0;
5355
+ }
5356
+
5357
+ .w6w-callable-list-toggle {
5358
+ display: flex;
5359
+ align-items: center;
5360
+ gap: var(--w6w-sp-2);
5361
+ cursor: pointer;
5362
+ }
5363
+
5364
+ .w6w-callable-list-actions {
5365
+ display: flex;
5366
+ gap: var(--w6w-sp-2);
5367
+ flex-shrink: 0;
5368
+ white-space: nowrap;
5369
+ }
5370
+
5371
+ .w6w-callable-list-body {
5372
+ border: 1px solid var(--w6w-border);
5373
+ border-radius: 8px;
5374
+ background: var(--w6w-panel);
5375
+ overflow: hidden;
5376
+ }
5377
+
5378
+ .w6w-callable-list-main {
5379
+ display: flex;
5380
+ flex-direction: column;
5381
+ gap: var(--w6w-sp-0-5);
5382
+ min-width: 0;
5383
+ text-align: left;
5384
+ }
5385
+
5386
+ .w6w-callable-list-open {
5387
+ all: unset;
5388
+ cursor: pointer;
5389
+ display: block;
5390
+ width: 100%;
5391
+ }
5392
+
5393
+ .w6w-callable-list-trail {
5394
+ display: inline-flex;
5395
+ align-items: center;
5396
+ gap: var(--w6w-sp-2);
5397
+ }
5398
+
5399
+ .w6w-callable-list-badge {
5400
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-2);
5401
+ border-radius: 999px;
5402
+ border: 1px solid var(--w6w-border);
5403
+ color: var(--w6w-muted);
5404
+ font-size: var(--w6w-fs-xs);
5405
+ }
5406
+
5407
+ .w6w-callable-list-row-desc {
5408
+ display: block;
5409
+ }
5410
+
5411
+ /* The frame is the ONLY element of a DataTable that draws an outer border and a
5412
+ radius (T-3). `overflow: hidden` clips the cells at the rounded corners, so
5413
+ the table below never needs an outer edge of its own. */
5414
+ .w6w-data-table-frame {
5415
+ border: 1px solid var(--w6w-border);
5416
+ border-radius: var(--w6w-radius);
5417
+ background: var(--w6w-panel);
5418
+ overflow: hidden;
5419
+ }
5420
+
5421
+ /* No outer border here (T-3): the frame above already draws it. */
5422
+ .w6w-data-table {
5423
+ width: 100%;
5424
+ border-collapse: collapse;
5425
+ color: var(--w6w-text);
5426
+ }
5427
+
5428
+ /* Inner separators only (T-3): a right border on every cell but the last column
5429
+ and a bottom border on every row but the last. First column, first row, last
5430
+ column and last row therefore paint nothing on the outside — one border per
5431
+ outer edge, from the frame. */
5432
+ .w6w-data-table th,
5433
+ .w6w-data-table td {
5434
+ border-right: 1px solid var(--w6w-border);
5435
+ border-bottom: 1px solid var(--w6w-border);
5436
+ padding: var(--w6w-sp-2) var(--w6w-sp-3);
5437
+ text-align: left;
5438
+ vertical-align: middle;
5439
+ }
5440
+
5441
+ .w6w-data-table th:last-child,
5442
+ .w6w-data-table td:last-child {
5443
+ border-right: 0;
5444
+ }
5445
+
5446
+ .w6w-data-table tbody tr:last-child > td {
5447
+ border-bottom: 0;
5448
+ }
5449
+
5450
+ /* Header-only table (rows=[] + loading, e.g. a list still fetching): there is no
5451
+ `tbody tr:last-child` to strip, so the header's bottom border would sit right
5452
+ on top of the frame's own bottom edge and paint it twice. With no body row the
5453
+ header is the last row, so it paints no bottom border — the frame supplies it. */
5454
+ .w6w-data-table:not(:has(tbody tr)) th {
5455
+ border-bottom: 0;
5456
+ }
5457
+
5458
+ .w6w-data-table th {
5459
+ color: var(--w6w-muted);
5460
+ }
5461
+
5462
+ .w6w-data-table-row-clickable {
5463
+ cursor: pointer;
5464
+ }
5465
+
5466
+ .w6w-data-table-row-clickable:hover {
5467
+ background: var(--w6w-panel-2);
5468
+ }
5469
+
5470
+ .w6w-data-table-link {
5471
+ display: block;
5472
+ color: inherit;
5473
+ text-decoration: none;
5474
+ }
5475
+
5476
+ /* Connections (D-12u): ConnectionList, ConnectionHeader and the state tags they share. */
5477
+ .w6w-connection-list {
5478
+ display: flex;
5479
+ flex-direction: column;
5480
+ gap: var(--w6w-sp-3);
5481
+ }
5482
+
5483
+ .w6w-connection-list-head {
5484
+ display: flex;
5485
+ justify-content: space-between;
5486
+ align-items: flex-start;
5487
+ gap: var(--w6w-sp-4);
5488
+ }
5489
+
5490
+ .w6w-connection-list-heading {
5491
+ min-width: 0;
5492
+ }
5493
+
5494
+ .w6w-connection-list-actions {
5495
+ display: flex;
5496
+ gap: var(--w6w-sp-2);
5497
+ flex-shrink: 0;
5498
+ }
5499
+
5500
+ .w6w-connection-cell-name {
5501
+ display: inline-flex;
5502
+ align-items: center;
5503
+ gap: var(--w6w-sp-2);
5504
+ }
5505
+
5506
+ .w6w-connection-row-actions {
5507
+ display: flex;
5508
+ gap: var(--w6w-sp-1-5);
5509
+ flex-shrink: 0;
5510
+ }
5511
+
5512
+ .w6w-connection-name {
5513
+ margin-right: var(--w6w-sp-2);
5514
+ }
5515
+
5516
+ /* State tags (connected / needs attention / invalid). */
5517
+ .w6w-connection-tag {
5518
+ display: inline-block;
5519
+ background: var(--w6w-panel-2);
5520
+ border: 1px solid var(--w6w-border);
5521
+ border-radius: 999px;
5522
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-2);
5523
+ font-size: var(--w6w-fs-xs);
5524
+ margin-right: var(--w6w-sp-1);
5525
+ }
5526
+
5527
+ .w6w-connection-tag-warn {
5528
+ color: #ffb86b;
5529
+ border-color: #ffb86b;
5530
+ }
5531
+
5532
+ .w6w-connection-tag-danger {
5533
+ color: var(--w6w-danger);
5534
+ border-color: var(--w6w-danger);
5535
+ }
5536
+
5537
+ /* ConnectionHeader */
5538
+ .w6w-connection-header {
5539
+ display: flex;
5540
+ align-items: center;
5541
+ gap: var(--w6w-sp-3);
5542
+ }
5543
+
5544
+ .w6w-connection-header-main {
5545
+ flex: 1;
5546
+ min-width: 0;
5547
+ }
5548
+
5549
+ .w6w-connection-header-title {
5550
+ margin: 0;
5551
+ }
5552
+
5553
+ .w6w-connection-header-meta {
5554
+ margin: 0;
5555
+ }
5556
+
5557
+ .w6w-connection-header-actions {
5558
+ display: flex;
5559
+ gap: var(--w6w-sp-1-5);
5560
+ align-items: center;
5561
+ }
5562
+
5563
+ /* The id's copy button appears on hover/focus only. */
5564
+ .w6w-connection-id-copy.w6w-copyable {
5565
+ display: inline-flex;
5566
+ width: auto;
5567
+ min-width: 0;
5568
+ vertical-align: middle;
5569
+ }
5570
+
5571
+ .w6w-connection-id-copy .w6w-copyable-btn {
5572
+ opacity: 0;
5573
+ }
5574
+
5575
+ .w6w-connection-id-copy:hover .w6w-copyable-btn,
5576
+ .w6w-connection-id-copy:focus-within .w6w-copyable-btn {
5577
+ opacity: 1;
5578
+ }
5579
+
5580
+ .w6w-empty-state {
5581
+ position: relative;
5582
+ min-height: 10rem;
5583
+ background: var(--w6w-panel);
5584
+ color: var(--w6w-text);
5585
+ border: 1px solid var(--w6w-border);
5586
+ }
5587
+
5588
+ .w6w-empty-state-inner {
5589
+ position: absolute;
5590
+ top: 50%;
5591
+ left: 50%;
5592
+ transform: translate(-50%, -50%);
5593
+ display: flex;
5594
+ flex-direction: column;
5595
+ align-items: center;
5596
+ gap: var(--w6w-sp-2);
5597
+ text-align: center;
5598
+ }
5599
+
5600
+ .w6w-empty-state-body {
5601
+ color: var(--w6w-muted);
5602
+ }
5603
+
5604
+ .w6w-canvas-layer {
5605
+ position: absolute;
5606
+ top: 0;
5607
+ left: 0;
5608
+ width: 0;
5609
+ height: 0;
5610
+ overflow: visible;
5611
+ pointer-events: none;
5612
+ }
5613
+
5614
+ .w6w-canvas-section,
5615
+ .w6w-canvas-note {
5616
+ position: absolute;
5617
+ box-sizing: border-box;
5618
+ border: 1px solid var(--w6w-canvas-color, var(--w6w-border));
5619
+ border-radius: var(--w6w-radius, 6px);
5620
+ background: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-panel)) 14%, transparent);
5621
+ pointer-events: none;
5622
+ }
5623
+
5624
+ .w6w-canvas-note {
5625
+ border-color: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-border)) 55%, var(--w6w-panel));
5626
+ background: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-panel)) 32%, var(--w6w-panel));
5627
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
5628
+ }
5629
+
5630
+ .w6w-canvas-note.selected,
5631
+ .w6w-canvas-section.selected {
5632
+ outline: 2px solid var(--w6w-accent);
5633
+ outline-offset: 2px;
5634
+ }
5635
+
5636
+ .w6w-canvas-note-body {
5637
+ pointer-events: auto;
5638
+ color: var(--w6w-text);
5639
+ }
5640
+
5641
+ .w6w-canvas-section-title {
5642
+ position: absolute;
5643
+ max-width: 320px;
5644
+ overflow: hidden;
5645
+ padding: var(--w6w-sp-0-5) var(--w6w-sp-1-5);
5646
+ border-radius: 6px;
5647
+ color: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-text)) 55%, var(--w6w-text));
5648
+ font-size: var(--w6w-fs-sm);
5649
+ font-weight: var(--w6w-fw-semibold);
5650
+ text-overflow: ellipsis;
5651
+ white-space: nowrap;
5652
+ }
5653
+
5654
+ .w6w-canvas-section-title.editable {
5655
+ pointer-events: auto;
5656
+ cursor: grab;
5657
+ touch-action: none;
5658
+ }
5659
+
5660
+ .w6w-canvas-section-title.editable:hover {
5661
+ background: color-mix(in srgb, var(--w6w-canvas-color, var(--w6w-panel)) 18%, transparent);
5662
+ }
5663
+
5664
+ .w6w-canvas-note-body {
5665
+ box-sizing: border-box;
5666
+ height: 100%;
5667
+ overflow: auto;
5668
+ padding: var(--w6w-sp-3) var(--w6w-sp-3);
5669
+ font-size: var(--w6w-fs-sm);
5670
+ line-height: var(--w6w-lh-normal);
5671
+ overflow-wrap: anywhere;
5672
+ }
5673
+ .w6w-canvas-note-body h1,
5674
+ .w6w-canvas-note-body h2,
5675
+ .w6w-canvas-note-body h3,
5676
+ .w6w-canvas-note-body h4,
5677
+ .w6w-canvas-note-body h5,
5678
+ .w6w-canvas-note-body h6,
5679
+ .w6w-canvas-note-body p,
5680
+ .w6w-canvas-note-body ul,
5681
+ .w6w-canvas-note-body ol {
5682
+ margin: 0 0 var(--w6w-sp-1);
5683
+ }
5684
+ .w6w-canvas-note-body h1 {
5685
+ font-size: var(--w6w-fs-2xl);
5686
+ line-height: var(--w6w-lh-tight);
5687
+ }
5688
+ .w6w-canvas-note-body h2 {
5689
+ font-size: var(--w6w-fs-xl);
5690
+ line-height: var(--w6w-lh-tight);
5691
+ }
5692
+ .w6w-canvas-note-body h3 {
5693
+ font-size: var(--w6w-fs-lg);
5694
+ line-height: var(--w6w-lh-tight);
5695
+ }
5696
+ .w6w-canvas-note-body h4,
5697
+ .w6w-canvas-note-body h5,
5698
+ .w6w-canvas-note-body h6 {
5699
+ font-size: var(--w6w-fs-base);
5700
+ }
5701
+
5702
+ .w6w-canvas-note-editor {
5703
+ outline: none;
5704
+ cursor: text;
5705
+ }
5706
+ .w6w-canvas-note-editor > div,
5707
+ .w6w-canvas-note-editor > h1,
5708
+ .w6w-canvas-note-editor > h2,
5709
+ .w6w-canvas-note-editor > h3,
5710
+ .w6w-canvas-note-editor > h4,
5711
+ .w6w-canvas-note-editor > h5,
5712
+ .w6w-canvas-note-editor > h6 {
5713
+ margin: 0;
5714
+ }
5715
+
5716
+ .w6w-note-resize {
5717
+ position: absolute;
5718
+ right: var(--w6w-sp-0-5);
5719
+ bottom: var(--w6w-sp-0-5);
5720
+ width: 14px;
5721
+ height: 14px;
5722
+ cursor: nwse-resize;
5723
+ pointer-events: auto;
5724
+ touch-action: none;
5725
+ opacity: 0;
5726
+ background: linear-gradient(135deg, transparent 45%, var(--w6w-muted) 45% 52%, transparent 52% 70%, var(--w6w-muted) 70% 77%, transparent 77%);
5727
+ }
5728
+
5729
+ .w6w-canvas-note:hover .w6w-note-resize,
5730
+ .w6w-canvas-note.selected .w6w-note-resize,
5731
+ .w6w-canvas-section.selected .w6w-note-resize {
5732
+ opacity: 1;
5733
+ }
5734
+
5735
+ .w6w-canvas-note-empty {
5736
+ color: var(--w6w-muted);
5737
+ font-style: italic;
5738
+ }
5739
+
5740
+ .w6w-note-toolbar {
5741
+ position: absolute;
5742
+ display: flex;
5743
+ align-items: center;
5744
+ gap: var(--w6w-sp-0-5);
5745
+ padding: var(--w6w-sp-1);
5746
+ background: var(--w6w-panel);
5747
+ color: var(--w6w-text);
5748
+ border: 1px solid var(--w6w-border);
5749
+ border-radius: 10px;
5750
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
5751
+ font-size: var(--w6w-fs-sm);
5752
+ white-space: nowrap;
5753
+ pointer-events: auto;
5754
+ }
5755
+ .w6w-note-toolbar .w6w-icon-btn {
5756
+ gap: var(--w6w-sp-1);
5757
+ padding: var(--w6w-sp-1-5);
5758
+ color: var(--w6w-text);
5759
+ }
5760
+
5761
+ .w6w-note-toolbar-group {
5762
+ position: relative;
5763
+ display: inline-flex;
5764
+ }
5765
+
5766
+ .w6w-note-toolbar-sep {
5767
+ align-self: stretch;
5768
+ width: 1px;
5769
+ margin: var(--w6w-sp-0-5) var(--w6w-sp-0-5);
5770
+ background: var(--w6w-border);
5771
+ }
5772
+
5773
+ .w6w-note-grip {
5774
+ cursor: grab;
5775
+ touch-action: none;
5776
+ }
5777
+
5778
+ .w6w-note-grip:active {
5779
+ cursor: grabbing;
5780
+ }
5781
+
5782
+ .w6w-note-toolbar .w6w-section-title-input {
5783
+ flex: none;
5784
+ width: auto;
5785
+ margin: 0;
5786
+ padding: var(--w6w-sp-1) var(--w6w-sp-1-5);
5787
+ border: 1px solid transparent;
5788
+ border-radius: 6px;
5789
+ background: transparent;
5790
+ color: inherit;
5791
+ font: inherit;
5792
+ font-weight: var(--w6w-fw-semibold);
5793
+ }
5794
+
5795
+ .w6w-note-toolbar .w6w-section-title-input:hover {
5796
+ border-color: var(--w6w-border);
5797
+ }
5798
+
5799
+ .w6w-note-toolbar .w6w-section-title-input:focus {
5800
+ border-color: var(--w6w-accent);
5801
+ outline: none;
5802
+ }
5803
+
5804
+ .w6w-note-size-btn {
5805
+ font-weight: var(--w6w-fw-semibold);
5806
+ }
5807
+
5808
+ .w6w-note-delete:hover {
5809
+ color: var(--w6w-danger);
5810
+ }
5811
+
5812
+ .w6w-note-swatch {
5813
+ width: 16px;
5814
+ height: 16px;
5815
+ border-radius: 50%;
5816
+ background: var(--w6w-canvas-color);
5817
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
5818
+ }
5819
+
5820
+ .w6w-note-menu {
5821
+ position: absolute;
5822
+ top: calc(100% + var(--w6w-sp-2));
5823
+ left: 0;
5824
+ z-index: 1;
5825
+ display: flex;
5826
+ padding: var(--w6w-sp-1);
5827
+ background: var(--w6w-panel);
5828
+ border: 1px solid var(--w6w-border);
5829
+ border-radius: 10px;
5830
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
5831
+ }
5832
+
5833
+ .w6w-note-menu-colors {
5834
+ display: grid;
5835
+ grid-template-columns: repeat(5, 24px);
5836
+ gap: var(--w6w-sp-1-5);
5837
+ padding: var(--w6w-sp-2);
5838
+ }
5839
+
5840
+ .w6w-note-swatch-btn {
5841
+ position: relative;
5842
+ width: 24px;
5843
+ height: 24px;
5844
+ padding: 0;
5845
+ border: 2px solid transparent;
5846
+ border-radius: 50%;
5847
+ background: var(--w6w-canvas-color);
5848
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
5849
+ cursor: pointer;
5850
+ }
5851
+
5852
+ .w6w-note-swatch-btn.active {
5853
+ border-color: var(--w6w-panel);
5854
+ box-shadow: 0 0 0 2px var(--w6w-accent);
5855
+ }
5856
+
5857
+ .w6w-note-swatch-custom {
5858
+ overflow: hidden;
5859
+ background: conic-gradient(#f87171, #facc15, #4ade80, #60a5fa, #a78bfa, #f87171);
5860
+ }
5861
+ .w6w-note-swatch-custom input {
5862
+ position: absolute;
5863
+ inset: 0;
5864
+ width: 100%;
5865
+ height: 100%;
5866
+ opacity: 0;
5867
+ cursor: pointer;
5868
+ }
5869
+
5870
+ .w6w-note-menu-sizes {
5871
+ flex-direction: column;
5872
+ min-width: 150px;
5873
+ }
5874
+
5875
+ .w6w-note-menu-item {
5876
+ padding: var(--w6w-sp-1) var(--w6w-sp-2);
5877
+ border: 0;
5878
+ border-radius: 6px;
5879
+ background: transparent;
5880
+ color: inherit;
5881
+ text-align: left;
5882
+ font-weight: var(--w6w-fw-semibold);
5883
+ cursor: pointer;
5884
+ }
5885
+
5886
+ .w6w-note-menu-item:hover {
5887
+ background: var(--w6w-panel-2);
5888
+ }
5889
+
5890
+ .w6w-note-size-1 {
5891
+ font-size: var(--w6w-fs-xl);
5892
+ }
5893
+
5894
+ .w6w-note-size-2 {
5895
+ font-size: var(--w6w-fs-lg);
5896
+ }
5897
+
5898
+ .w6w-note-size-3 {
5899
+ font-size: var(--w6w-fs-base);
5900
+ }
5901
+
5902
+ .w6w-note-size-0 {
5903
+ font-size: var(--w6w-fs-sm);
5904
+ font-weight: var(--w6w-fw-regular);
5905
+ }
5906
+
5907
+ .w6w-flow-tools {
5908
+ display: flex;
5909
+ align-items: center;
5910
+ gap: var(--w6w-sp-1-5);
5911
+ }
5912
+
5913
+ .w6w-flow-tool {
5914
+ padding: var(--w6w-sp-2);
5915
+ background: var(--w6w-panel);
5916
+ color: var(--w6w-text);
5917
+ border: 1px solid var(--w6w-border);
5918
+ }
5919
+
5920
+ .w6w-flow-tool.active {
5921
+ border-color: var(--w6w-accent);
5922
+ color: var(--w6w-accent);
5923
+ background: color-mix(in srgb, var(--w6w-accent) 12%, var(--w6w-panel));
5924
+ }
5925
+
5926
+ .w6w-section-draw {
5927
+ position: absolute;
5928
+ inset: 0;
5929
+ z-index: 4;
5930
+ cursor: crosshair;
5931
+ touch-action: none;
5932
+ }
5933
+
5934
+ .w6w-section-draw-rect {
5935
+ position: absolute;
5936
+ box-sizing: border-box;
5937
+ border: 2px dashed var(--w6w-accent);
5938
+ border-radius: var(--w6w-radius, 6px);
5939
+ background: color-mix(in srgb, var(--w6w-accent) 10%, transparent);
5940
+ pointer-events: none;
5941
+ }
5942
+
5943
+ /* BudgetMeter — usage-vs-limit bar with a reserved segment.
5944
+ *
5945
+ * Token-only: every colour is a --w6w-* custom property, so a host restyles
5946
+ * the meter (including the over-limit state) by overriding tokens, never by
5947
+ * targeting a hex value here. */
5948
+ .w6w-budget-meter {
5949
+ display: flex;
5950
+ flex-direction: column;
5951
+ gap: var(--w6w-sp-1);
5952
+ }
5953
+
5954
+ .w6w-budget-meter-head {
5955
+ display: flex;
5956
+ align-items: baseline;
5957
+ justify-content: space-between;
5958
+ gap: var(--w6w-sp-2);
5959
+ color: var(--w6w-muted);
5960
+ }
5961
+
5962
+ .w6w-budget-meter-label {
5963
+ color: var(--w6w-text);
5964
+ }
5965
+
5966
+ .w6w-budget-meter-value {
5967
+ font-variant-numeric: tabular-nums;
5968
+ }
5969
+
5970
+ .w6w-budget-meter-track {
5971
+ display: flex;
5972
+ width: 100%;
5973
+ height: 8px;
5974
+ overflow: hidden;
5975
+ background: var(--w6w-panel-2);
5976
+ border: 1px solid var(--w6w-border);
5977
+ border-radius: var(--w6w-radius);
5978
+ }
5979
+
5980
+ .w6w-budget-meter-used {
5981
+ height: 100%;
5982
+ background: var(--w6w-accent);
5983
+ }
5984
+
5985
+ .w6w-budget-meter-reserved {
5986
+ height: 100%;
5987
+ background: var(--w6w-health-degraded);
5988
+ }
5989
+
5990
+ .w6w-budget-meter-over .w6w-budget-meter-used {
5991
+ background: var(--w6w-danger);
5992
+ }
5993
+
5994
+ .w6w-budget-meter-over .w6w-budget-meter-value {
5995
+ color: var(--w6w-danger);
5996
+ }
5997
+
5998
+ /* Markdown: the leading YAML frontmatter, collapsed above the rendered body. The body itself
5999
+ is unstyled here — the host styles it through the `className` it passes. */
6000
+ .w6w-md-frontmatter {
6001
+ margin-bottom: var(--w6w-sp-2);
6002
+ border: 1px solid var(--w6w-border);
6003
+ border-radius: 8px;
6004
+ padding: var(--w6w-sp-1-5) var(--w6w-sp-2-5);
6005
+ font-size: var(--w6w-fs-sm);
6006
+ }
6007
+
6008
+ .w6w-md-frontmatter > summary {
6009
+ cursor: pointer;
6010
+ color: var(--w6w-muted);
6011
+ }
6012
+
6013
+ .w6w-md-frontmatter > pre {
6014
+ margin: var(--w6w-sp-2) 0 0;
6015
+ overflow-x: auto;
6016
+ font-family: var(--w6w-font-mono);
6017
+ white-space: pre-wrap;
6018
+ overflow-wrap: anywhere;
6019
+ }