@x1a0f3n9/dsh-client-ui-primitives 0.1.5-rc.3
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.
- package/LICENSE +21 -0
- package/README.i18n.yaml +6 -0
- package/README.md +164 -0
- package/README.zh.md +164 -0
- package/lib/Button.module.css +79 -0
- package/lib/ConnectionIndicator.module.css +107 -0
- package/lib/DiffBlock.module.css +101 -0
- package/lib/DisclosureRow.module.css +84 -0
- package/lib/FileTypeIcon.module.css +50 -0
- package/lib/HoverCard.module.css +54 -0
- package/lib/Input.module.css +38 -0
- package/lib/JsonTree.module.css +222 -0
- package/lib/Menu.module.css +248 -0
- package/lib/Modal.module.css +103 -0
- package/lib/OnboardingSurface.module.css +29 -0
- package/lib/Pill.module.css +27 -0
- package/lib/ReadBlock.module.css +111 -0
- package/lib/RiskConfirmation.module.css +73 -0
- package/lib/SearchBlock.module.css +112 -0
- package/lib/StateDot.module.css +73 -0
- package/lib/Switch.module.css +50 -0
- package/lib/Tag.module.css +57 -0
- package/lib/TerminalBlock.module.css +205 -0
- package/lib/Toast.module.css +72 -0
- package/lib/Tooltip.module.css +42 -0
- package/lib/WebBlock.module.css +141 -0
- package/lib/index.js +8030 -0
- package/lib/markdown/CodeBlock.module.css +130 -0
- package/lib/markdown/JsonBlock.module.css +32 -0
- package/lib/markdown/MarkdownText.module.css +321 -0
- package/lib/types/BrandWordmark.d.ts +15 -0
- package/lib/types/Button.d.ts +18 -0
- package/lib/types/CodeFileIcon.d.ts +12 -0
- package/lib/types/ConnectionIndicator.d.ts +25 -0
- package/lib/types/DiffBlock.d.ts +53 -0
- package/lib/types/DisclosureRow.d.ts +29 -0
- package/lib/types/FileTypeIcon.d.ts +43 -0
- package/lib/types/FishLogo.d.ts +16 -0
- package/lib/types/FoldToggle.d.ts +20 -0
- package/lib/types/HoverCard.d.ts +24 -0
- package/lib/types/Input.d.ts +11 -0
- package/lib/types/JsonTree.d.ts +48 -0
- package/lib/types/LinkIcon.d.ts +38 -0
- package/lib/types/Menu.d.ts +85 -0
- package/lib/types/Modal.d.ts +35 -0
- package/lib/types/OnboardingSurface.d.ts +11 -0
- package/lib/types/Pill.d.ts +13 -0
- package/lib/types/ReadBlock.d.ts +47 -0
- package/lib/types/ReferenceIcon.d.ts +16 -0
- package/lib/types/RiskConfirmation.d.ts +20 -0
- package/lib/types/SearchBlock.d.ts +72 -0
- package/lib/types/StateDot.d.ts +18 -0
- package/lib/types/Switch.d.ts +20 -0
- package/lib/types/Tag.d.ts +32 -0
- package/lib/types/TerminalBlock.d.ts +61 -0
- package/lib/types/Toast.d.ts +32 -0
- package/lib/types/Tooltip.d.ts +34 -0
- package/lib/types/WebBlock.d.ts +61 -0
- package/lib/types/ansi.d.ts +17 -0
- package/lib/types/clipboard.d.ts +9 -0
- package/lib/types/code-file-icon-artwork.d.ts +54 -0
- package/lib/types/code-file-types.d.ts +30 -0
- package/lib/types/file-size.d.ts +8 -0
- package/lib/types/head-tail-cap.d.ts +23 -0
- package/lib/types/icons/index.d.ts +194 -0
- package/lib/types/icons/props.d.ts +9 -0
- package/lib/types/index.d.ts +66 -0
- package/lib/types/markdown/CodeBlock.d.ts +28 -0
- package/lib/types/markdown/JsonBlock.d.ts +8 -0
- package/lib/types/markdown/MarkdownText.d.ts +42 -0
- package/lib/types/markdown/cjkFriendlyStrong.d.ts +9 -0
- package/lib/types/markdown/highlight.d.ts +142 -0
- package/lib/types/markdown/incremental.d.ts +80 -0
- package/lib/types/markdown/katex.d.ts +27 -0
- package/lib/types/markdown/mathCompatibility.d.ts +11 -0
- package/lib/types/markdown/parse.d.ts +25 -0
- package/lib/types/markdown/plain-text.d.ts +22 -0
- package/lib/types/markdown/render.d.ts +138 -0
- package/lib/types/markdown/useViewportHighlighting.d.ts +11 -0
- package/lib/types/pointer-grace.d.ts +22 -0
- package/lib/types/rank-by-name.d.ts +22 -0
- package/lib/types/relative-time.d.ts +23 -0
- package/lib/types/use-copy-feedback.d.ts +14 -0
- package/lib/types/useAnchoredMaxHeight.d.ts +11 -0
- package/lib/types/useAnchoredPosition.d.ts +34 -0
- package/lib/types/useDismissOnOutsidePointer.d.ts +11 -0
- package/lib/types/user-text.d.ts +39 -0
- package/lib/user-text.module.css +43 -0
- package/package.json +58 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
.block {
|
|
2
|
+
--dsl-terminal-radius: 12px;
|
|
3
|
+
--dsl-terminal-line-height: 22px;
|
|
4
|
+
/* Rebindable by consumers (CodeBlock's --dsl-code-block-content-font
|
|
5
|
+
pattern): a surface wanting the smaller code size rebinds this together
|
|
6
|
+
with --dsl-terminal-line-height on its own container. */
|
|
7
|
+
--dsl-terminal-font: var(--dsw-font-markdown-code-block);
|
|
8
|
+
/* The card's own left inset, holding the run-state dot in a column of its own
|
|
9
|
+
so it never competes with the commands for horizontal space. */
|
|
10
|
+
--dsl-terminal-gutter: 30px;
|
|
11
|
+
|
|
12
|
+
position: relative;
|
|
13
|
+
margin: 16px 0;
|
|
14
|
+
/* The gutter is the card's OWN padding, not a margin: every consumer rewrites
|
|
15
|
+
`margin` wholesale (each render site sets its own indent), which silently
|
|
16
|
+
cancelled the reservation and let the dot fall outside the card into a
|
|
17
|
+
container that clips it. Owning the reservation here keeps the invariant
|
|
18
|
+
with the component that depends on it. */
|
|
19
|
+
padding-left: var(--dsl-terminal-gutter);
|
|
20
|
+
color: var(--dsw-alias-label-primary);
|
|
21
|
+
background: var(--dsw-alias-markdown-code-block);
|
|
22
|
+
border-radius: var(--dsl-terminal-radius);
|
|
23
|
+
/* Clip the banner to the card's own radius: when a consumer adds a border,
|
|
24
|
+
the banner's equal corner radius no longer nests inside it and leaves a
|
|
25
|
+
notch at the corner. Nothing inside renders out of the box. */
|
|
26
|
+
overflow: hidden;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* The status pill and copy control top-align to the FIRST prompt row (their
|
|
30
|
+
heights are capped to the prompt line, so on a multi-line command they sit
|
|
31
|
+
with the first command instead of floating mid-banner). */
|
|
32
|
+
.header {
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: flex-start;
|
|
35
|
+
gap: 12px;
|
|
36
|
+
/* Pulled back across the card's gutter padding so the banner spans the FULL
|
|
37
|
+
surface, then re-inset by the same amount so the prompt text and the dot
|
|
38
|
+
keep their positions. The banner shares the card's own surface (no banner
|
|
39
|
+
token): the l2 divider below is the section boundary. */
|
|
40
|
+
margin-left: calc(-1 * var(--dsl-terminal-gutter));
|
|
41
|
+
padding: 9px 14px 9px var(--dsl-terminal-gutter);
|
|
42
|
+
border-top-left-radius: var(--dsl-terminal-radius);
|
|
43
|
+
border-top-right-radius: var(--dsl-terminal-radius);
|
|
44
|
+
/* A long multi-line command scrolls inside the banner (same cap as the
|
|
45
|
+
IN/OUT card's sections) instead of pushing the output off screen. */
|
|
46
|
+
max-height: 150px;
|
|
47
|
+
overflow-y: auto;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Banner scrollbar floats off the card edge like the output's. */
|
|
51
|
+
.header::-webkit-scrollbar-thumb {
|
|
52
|
+
border: 2px solid transparent;
|
|
53
|
+
background-clip: padding-box;
|
|
54
|
+
border-radius: 6px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.header::-webkit-scrollbar-track {
|
|
58
|
+
margin: 6px;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Full-width l2 hairline between the command banner and the body — the same
|
|
62
|
+
divider the IN/OUT card draws between its sections. A running card is
|
|
63
|
+
banner-only, so it draws none. */
|
|
64
|
+
.block:not([data-running]) .header {
|
|
65
|
+
border-bottom: 0.5px solid var(--dsw-alias-border-l2);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* One row per command line. The prompt column is the only element allowed to
|
|
69
|
+
shrink; the status pill and the copy control keep their intrinsic width. */
|
|
70
|
+
.prompt {
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-direction: column;
|
|
73
|
+
min-width: 0;
|
|
74
|
+
flex: 1;
|
|
75
|
+
font: var(--dsl-terminal-font);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.promptLine {
|
|
79
|
+
position: relative;
|
|
80
|
+
display: flex;
|
|
81
|
+
align-items: baseline;
|
|
82
|
+
gap: 8px;
|
|
83
|
+
min-width: 0;
|
|
84
|
+
line-height: var(--dsl-terminal-line-height);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* Out of flow inside the card's own gutter padding, so the reservation and the
|
|
88
|
+
dot move together and no consumer margin can pull them apart; the dot neither
|
|
89
|
+
indents its command nor depends on the command's text metrics to line up.
|
|
90
|
+
Centered against the row's line box, not the code font's baseline. */
|
|
91
|
+
.runState {
|
|
92
|
+
position: absolute;
|
|
93
|
+
left: calc(-1 * var(--dsl-terminal-gutter) + 8px);
|
|
94
|
+
top: 50%;
|
|
95
|
+
transform: translateY(-50%);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* The dot is aria-hidden; this is its text label for assistive technology. */
|
|
99
|
+
.runStateLabel {
|
|
100
|
+
position: absolute;
|
|
101
|
+
width: 1px;
|
|
102
|
+
height: 1px;
|
|
103
|
+
overflow: hidden;
|
|
104
|
+
clip-path: inset(50%);
|
|
105
|
+
white-space: nowrap;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.cwd {
|
|
109
|
+
flex: none;
|
|
110
|
+
color: var(--dsw-alias-label-tertiary);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* `pre`, not `nowrap`: the prompt row renders the command verbatim, and
|
|
114
|
+
`nowrap` collapses the repeated spaces, tabs, and alignment of an indented
|
|
115
|
+
continuation. Both hold the single row and the ellipsis. */
|
|
116
|
+
.command {
|
|
117
|
+
min-width: 0;
|
|
118
|
+
color: var(--dsw-alias-label-primary);
|
|
119
|
+
overflow: hidden;
|
|
120
|
+
text-overflow: ellipsis;
|
|
121
|
+
white-space: pre;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* Capped to the prompt's line height (Pill's own 24px height would exceed a
|
|
125
|
+
smaller-font prompt row and stretch the banner). Sticky against the
|
|
126
|
+
banner's own scroll so the pill and the copy control stay in reach while a
|
|
127
|
+
long command scrolls underneath. */
|
|
128
|
+
.status {
|
|
129
|
+
flex: none;
|
|
130
|
+
position: sticky;
|
|
131
|
+
top: 0;
|
|
132
|
+
height: var(--dsl-terminal-line-height);
|
|
133
|
+
color: var(--dsw-alias-state-error-primary);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.copyButton {
|
|
137
|
+
flex: none;
|
|
138
|
+
position: sticky;
|
|
139
|
+
top: 0;
|
|
140
|
+
/* Card surface, not transparent: the control is sticky over the banner's
|
|
141
|
+
own scroll, so scrolled command text must not bleed through it. */
|
|
142
|
+
background-color: var(--dsw-alias-markdown-code-block);
|
|
143
|
+
border: none;
|
|
144
|
+
padding: 0;
|
|
145
|
+
margin: 0;
|
|
146
|
+
color: var(--dsw-alias-label-secondary);
|
|
147
|
+
cursor: pointer;
|
|
148
|
+
font: var(--dsw-font-xs-13);
|
|
149
|
+
line-height: var(--dsl-terminal-line-height);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* Vertical scrolling lives on the OUTPUT, not the card root: a root scroller
|
|
153
|
+
would run its scrollbar over the banner (and the copy control), while here
|
|
154
|
+
the banner stays pinned and the bar sits inside the output's right padding.
|
|
155
|
+
Unset, the max-height is none and the auto overflow never engages. */
|
|
156
|
+
.output {
|
|
157
|
+
max-height: var(--dsl-terminal-output-max-height, none);
|
|
158
|
+
padding: 12px 14px 12px 0;
|
|
159
|
+
font: var(--dsl-terminal-font);
|
|
160
|
+
overflow-x: auto;
|
|
161
|
+
overflow-y: auto;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* Both output scrollbars (vertical cap, horizontal pre overflow) float 2px
|
|
165
|
+
off the card edge: a transparent border clips the thumb inward so it never
|
|
166
|
+
hugs the rounded corner. */
|
|
167
|
+
.output::-webkit-scrollbar-thumb {
|
|
168
|
+
border: 2px solid transparent;
|
|
169
|
+
background-clip: padding-box;
|
|
170
|
+
border-radius: 6px;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* Track end-margins keep the thumb's travel out of the card's rounded
|
|
174
|
+
corners in both directions. */
|
|
175
|
+
.output::-webkit-scrollbar-track {
|
|
176
|
+
margin: 6px;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* No wrapping, no word-break: alignment is the payload of terminal output. */
|
|
180
|
+
.line {
|
|
181
|
+
min-height: var(--dsl-terminal-line-height);
|
|
182
|
+
white-space: pre;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.expand {
|
|
186
|
+
display: block;
|
|
187
|
+
width: 100%;
|
|
188
|
+
padding: 0;
|
|
189
|
+
border: none;
|
|
190
|
+
background-color: transparent;
|
|
191
|
+
color: var(--dsw-alias-label-tertiary);
|
|
192
|
+
cursor: pointer;
|
|
193
|
+
font: inherit;
|
|
194
|
+
text-align: left;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.expand:hover {
|
|
198
|
+
color: var(--dsw-alias-label-secondary);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.empty {
|
|
202
|
+
padding: 12px 14px 12px 0;
|
|
203
|
+
font: var(--dsl-terminal-font);
|
|
204
|
+
color: var(--dsw-alias-label-tertiary);
|
|
205
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/* The fade delay comes from the component as `--dsh-toast-hold`, so one value
|
|
2
|
+
drives both the unmount timer and this animation; the fallback matches the
|
|
3
|
+
component's own default. The fade DURATION still has to agree with FADE_MS
|
|
4
|
+
in Toast.tsx, which no owner varies. */
|
|
5
|
+
|
|
6
|
+
.toast {
|
|
7
|
+
position: fixed;
|
|
8
|
+
top: 40px;
|
|
9
|
+
left: 50%;
|
|
10
|
+
/* Above the 1000 the image lightbox backdrop uses: a failure reported while
|
|
11
|
+
a preview is open must stay readable. */
|
|
12
|
+
z-index: 1100;
|
|
13
|
+
/* Announcements never intercept clicks. */
|
|
14
|
+
pointer-events: none;
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
gap: 10px;
|
|
18
|
+
/* Fixed boxes with `left` set shrink-to-fit against the space RIGHT of
|
|
19
|
+
`left` (the -50% translate happens after sizing), so an anchored banner
|
|
20
|
+
near the window edge would wrap early. max-content sizes the box from
|
|
21
|
+
its text alone, capped by the max-width below. */
|
|
22
|
+
width: max-content;
|
|
23
|
+
max-width: min(640px, calc(100vw - 48px));
|
|
24
|
+
padding: 12px 16px;
|
|
25
|
+
border-radius: 14px;
|
|
26
|
+
background: var(--dsw-alias-button-contrast-fill);
|
|
27
|
+
color: var(--dsw-alias-label-primary-inverted);
|
|
28
|
+
font-size: 14px;
|
|
29
|
+
line-height: 22px;
|
|
30
|
+
box-shadow: var(--dsw-shadow-lv3);
|
|
31
|
+
transform: translateX(-50%);
|
|
32
|
+
animation:
|
|
33
|
+
dsh-toast-in 160ms ease-out,
|
|
34
|
+
dsh-toast-fade 1000ms ease var(--dsh-toast-hold, 3000ms) forwards;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.icon {
|
|
38
|
+
display: grid;
|
|
39
|
+
place-items: center;
|
|
40
|
+
flex: none;
|
|
41
|
+
color: var(--dsw-alias-state-warn-label);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.text {
|
|
45
|
+
min-width: 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@keyframes dsh-toast-in {
|
|
49
|
+
from {
|
|
50
|
+
opacity: 0;
|
|
51
|
+
transform: translate(-50%, -6px);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
to {
|
|
55
|
+
opacity: 1;
|
|
56
|
+
transform: translate(-50%, 0);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@keyframes dsh-toast-fade {
|
|
61
|
+
to {
|
|
62
|
+
opacity: 0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* Reduced motion drops the slide-in; the delayed fade (an opacity change,
|
|
67
|
+
not movement) still ends the banner before the timed unmount. */
|
|
68
|
+
@media (prefers-reduced-motion: reduce) {
|
|
69
|
+
.toast {
|
|
70
|
+
animation: dsh-toast-fade 1000ms ease var(--dsh-toast-hold, 3000ms) forwards;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
.bubble {
|
|
2
|
+
position: fixed;
|
|
3
|
+
z-index: 100;
|
|
4
|
+
/* Fixed-position shrink-to-fit measures only the space from `left` to the
|
|
5
|
+
viewport edge, so anchors near the right edge would wrap early;
|
|
6
|
+
max-content sizes by the label alone, capped at half the viewport. */
|
|
7
|
+
width: max-content;
|
|
8
|
+
max-width: 50vw;
|
|
9
|
+
padding: 3px 7px;
|
|
10
|
+
border-radius: 8px;
|
|
11
|
+
background: var(--dsw-alias-tooltip-bg);
|
|
12
|
+
color: var(--dsw-static-neutral-bluish-00);
|
|
13
|
+
font-size: 13px;
|
|
14
|
+
line-height: 20px;
|
|
15
|
+
white-space: pre-line;
|
|
16
|
+
/* Unbreakable tokens (URLs, paths) must not push past max-width. */
|
|
17
|
+
overflow-wrap: break-word;
|
|
18
|
+
pointer-events: none;
|
|
19
|
+
animation: tooltip-in 150ms var(--ds-ease-in-out);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.bubble[data-side='right'] {
|
|
23
|
+
transform: translateY(-50%);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.bubble[data-side='bottom'] {
|
|
27
|
+
transform: translateX(-50%);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.bubble[data-side='top'] {
|
|
31
|
+
transform: translate(-50%, -100%);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@keyframes tooltip-in {
|
|
35
|
+
from { opacity: 0; }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@media (prefers-reduced-motion: reduce) {
|
|
39
|
+
.bubble {
|
|
40
|
+
animation: none;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
.block {
|
|
2
|
+
--dsl-web-radius: 12px;
|
|
3
|
+
|
|
4
|
+
margin: 16px 0;
|
|
5
|
+
padding: 12px 14px;
|
|
6
|
+
color: var(--dsw-alias-label-primary);
|
|
7
|
+
background: var(--dsw-alias-markdown-code-block);
|
|
8
|
+
border-radius: var(--dsl-web-radius);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* The provider answer reads as body prose above the citation list; its own
|
|
12
|
+
MarkdownText margins are trimmed so the list sits tight under it. */
|
|
13
|
+
.answer {
|
|
14
|
+
margin-bottom: 8px;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.answer > :global(div) > :first-child {
|
|
18
|
+
margin-top: 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.answer > :global(div) > :last-child {
|
|
22
|
+
margin-bottom: 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* The citation list: ordered so each source reads as a numbered reference. The
|
|
26
|
+
whole list — the sources the tool returned, matching what the model saw —
|
|
27
|
+
renders here; a max-height caps the card so a long list scrolls in place
|
|
28
|
+
rather than growing the card unbounded. The height is a design constant of the
|
|
29
|
+
card's geometry, not a deployment choice, so it lives here rather than a plugin
|
|
30
|
+
config field.
|
|
31
|
+
|
|
32
|
+
`overflow-y` makes this a scroll container, which also clips inline-start
|
|
33
|
+
overflow: a marker wider than `padding-left` loses its leading digits with no
|
|
34
|
+
way to scroll them back. Markers are right-aligned to the content edge, so the
|
|
35
|
+
padding must fit the widest one the list can produce. `searchMaxResults` is an
|
|
36
|
+
unbounded positive integer, so the padding is sized in `em` — against this
|
|
37
|
+
element's own font, the one a marker inherits — to hold a three-digit marker
|
|
38
|
+
(`999. ` measures 2.35em in the app font stack) plus the gap the one-digit
|
|
39
|
+
case already had. */
|
|
40
|
+
.sources {
|
|
41
|
+
margin: 0;
|
|
42
|
+
padding-left: 2.5em;
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
gap: 10px;
|
|
46
|
+
max-height: 320px;
|
|
47
|
+
overflow-y: auto;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.source {
|
|
51
|
+
min-width: 0;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.sourceLink {
|
|
55
|
+
color: var(--dsw-alias-link);
|
|
56
|
+
font-size: 14px;
|
|
57
|
+
font-weight: 500;
|
|
58
|
+
line-height: 20px;
|
|
59
|
+
word-break: break-word;
|
|
60
|
+
text-decoration: none;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Leading URL glyph inside source and fetch links; rides the link color.
|
|
64
|
+
1.1em follows each link's own font size. */
|
|
65
|
+
.linkIcon {
|
|
66
|
+
width: 1.1em;
|
|
67
|
+
height: 1.1em;
|
|
68
|
+
vertical-align: -0.25em;
|
|
69
|
+
margin-right: 5px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.sourceLink:hover,
|
|
73
|
+
.sourceLink:focus-visible {
|
|
74
|
+
text-decoration: underline dotted;
|
|
75
|
+
text-underline-offset: 3px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.snippet {
|
|
79
|
+
margin-top: 2px;
|
|
80
|
+
color: var(--dsw-alias-label-secondary);
|
|
81
|
+
font-size: 13px;
|
|
82
|
+
line-height: 19px;
|
|
83
|
+
word-break: break-word;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.published {
|
|
87
|
+
margin-top: 2px;
|
|
88
|
+
color: var(--dsw-alias-label-tertiary);
|
|
89
|
+
font: var(--dsw-font-xs-13);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.truncated {
|
|
93
|
+
margin-top: 8px;
|
|
94
|
+
color: var(--dsw-alias-label-tertiary);
|
|
95
|
+
font: var(--dsw-font-xs-13);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.empty {
|
|
99
|
+
color: var(--dsw-alias-label-secondary);
|
|
100
|
+
font: var(--dsw-font-xs-13);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* The fetch card is a compact summary: the URL over a status/truncation row. */
|
|
104
|
+
.fetch {
|
|
105
|
+
display: flex;
|
|
106
|
+
flex-direction: column;
|
|
107
|
+
gap: 6px;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.fetchUrl {
|
|
111
|
+
color: var(--dsw-alias-link);
|
|
112
|
+
font-family: var(--ds-font-family-code);
|
|
113
|
+
font-size: 13px;
|
|
114
|
+
font-weight: 500;
|
|
115
|
+
line-height: 19px;
|
|
116
|
+
word-break: break-all;
|
|
117
|
+
text-decoration: none;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.fetchUrl:hover,
|
|
121
|
+
.fetchUrl:focus-visible {
|
|
122
|
+
text-decoration: underline dotted;
|
|
123
|
+
text-underline-offset: 3px;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.fetchMeta {
|
|
127
|
+
display: flex;
|
|
128
|
+
align-items: baseline;
|
|
129
|
+
gap: 12px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.status {
|
|
133
|
+
color: var(--dsw-alias-label-secondary);
|
|
134
|
+
font: var(--dsw-font-xs-13);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* The fetch card's truncation note sits inline beside the status, so it drops
|
|
138
|
+
the search card's top margin. */
|
|
139
|
+
.fetch .truncated {
|
|
140
|
+
margin-top: 0;
|
|
141
|
+
}
|