@qilin-agent/client-ui-primitives 0.0.0-stage → 3.1.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 +61 -0
- package/README.md +181 -2
- package/README.zh.md +182 -0
- package/lib/Button.module.css +79 -0
- package/lib/Checkbox.module.css +28 -0
- package/lib/ConnectionIndicator.module.css +123 -0
- package/lib/DiffBlock.module.css +109 -0
- package/lib/DisclosureRow.module.css +84 -0
- package/lib/FileTypeIcon.module.css +50 -0
- package/lib/HoverCard.module.css +70 -0
- package/lib/ImageLightbox.module.css +48 -0
- package/lib/ImagePreview.module.css +24 -0
- package/lib/Input.module.css +38 -0
- package/lib/JsonTree.module.css +345 -0
- package/lib/Menu.module.css +274 -0
- package/lib/MenuGroup.module.css +37 -0
- package/lib/MenuSurface.module.css +49 -0
- package/lib/Modal.module.css +103 -0
- package/lib/OnboardingSurface.module.css +29 -0
- package/lib/PathLabel.module.css +28 -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/SegmentedControl.module.css +76 -0
- package/lib/ShortcutKeys.module.css +33 -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/TextShimmer.module.css +88 -0
- package/lib/Toast.module.css +76 -0
- package/lib/Tooltip.module.css +52 -0
- package/lib/WebBlock.module.css +141 -0
- package/lib/index.js +10096 -0
- package/lib/markdown/CodeBlock.module.css +130 -0
- package/lib/markdown/JsonBlock.module.css +32 -0
- package/lib/markdown/MarkdownText.module.css +485 -0
- package/lib/markdown/mermaid.module.css +49 -0
- package/lib/types/Button.d.ts +18 -0
- package/lib/types/Checkbox.d.ts +20 -0
- package/lib/types/CodeFileIcon.d.ts +12 -0
- package/lib/types/ConnectionIndicator.d.ts +26 -0
- package/lib/types/DiffBlock.d.ts +52 -0
- package/lib/types/DisclosureRow.d.ts +36 -0
- package/lib/types/FileTypeIcon.d.ts +43 -0
- package/lib/types/FoldToggle.d.ts +20 -0
- package/lib/types/HoverCard.d.ts +32 -0
- package/lib/types/ImageLightbox.d.ts +27 -0
- package/lib/types/ImagePreview.d.ts +12 -0
- package/lib/types/Input.d.ts +12 -0
- package/lib/types/JsonTree.d.ts +59 -0
- package/lib/types/LinkIcon.d.ts +49 -0
- package/lib/types/Menu.d.ts +133 -0
- package/lib/types/MenuGroup.d.ts +22 -0
- package/lib/types/MenuSurface.d.ts +16 -0
- package/lib/types/Modal.d.ts +44 -0
- package/lib/types/OnboardingSurface.d.ts +11 -0
- package/lib/types/PathLabel.d.ts +13 -0
- package/lib/types/Pill.d.ts +13 -0
- package/lib/types/QilinSeal.d.ts +18 -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/SegmentedControl.d.ts +35 -0
- package/lib/types/ShortcutKeys.d.ts +11 -0
- package/lib/types/SiteGlyph.d.ts +25 -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 +66 -0
- package/lib/types/TextShimmer.d.ts +22 -0
- package/lib/types/Toast.d.ts +36 -0
- package/lib/types/Tooltip.d.ts +45 -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/darwin-desktop.d.ts +9 -0
- package/lib/types/file-size.d.ts +17 -0
- package/lib/types/focus.d.ts +9 -0
- package/lib/types/head-tail-cap.d.ts +23 -0
- package/lib/types/icons/index.d.ts +211 -0
- package/lib/types/icons/props.d.ts +9 -0
- package/lib/types/index.d.ts +84 -0
- package/lib/types/input-modality.d.ts +19 -0
- package/lib/types/keyboard-composition.d.ts +11 -0
- package/lib/types/markdown/CodeBlock.d.ts +30 -0
- package/lib/types/markdown/JsonBlock.d.ts +8 -0
- package/lib/types/markdown/MarkdownDelegate.d.ts +46 -0
- package/lib/types/markdown/MarkdownText.d.ts +54 -0
- package/lib/types/markdown/cjkFriendlyStrong.d.ts +9 -0
- package/lib/types/markdown/file-link.d.ts +13 -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/local-image-syntax.d.ts +10 -0
- package/lib/types/markdown/mathCompatibility.d.ts +11 -0
- package/lib/types/markdown/mermaid.d.ts +39 -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 +158 -0
- package/lib/types/markdown/useViewportHighlighting.d.ts +11 -0
- package/lib/types/overlay-top-margin.d.ts +8 -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/seal-geometry.d.ts +27 -0
- package/lib/types/seal-glyphs.d.ts +9 -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/useModalLayer.d.ts +27 -0
- package/lib/types/user-text.d.ts +37 -0
- package/lib/user-text.module.css +43 -0
- package/package.json +62 -3
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
.indicator {
|
|
2
|
+
flex: none;
|
|
3
|
+
display: inline-grid;
|
|
4
|
+
grid-template-columns: 14px max-content;
|
|
5
|
+
align-items: center;
|
|
6
|
+
column-gap: 4px;
|
|
7
|
+
height: 28px;
|
|
8
|
+
padding: 0 8px;
|
|
9
|
+
box-sizing: border-box;
|
|
10
|
+
border: 1px solid transparent;
|
|
11
|
+
border-radius: 13px;
|
|
12
|
+
font-family: inherit;
|
|
13
|
+
font-size: 12px;
|
|
14
|
+
font-weight: 500;
|
|
15
|
+
line-height: 18px;
|
|
16
|
+
white-space: nowrap;
|
|
17
|
+
transition:
|
|
18
|
+
background-color 160ms ease-out,
|
|
19
|
+
color 160ms ease-out,
|
|
20
|
+
border-color 160ms ease-out,
|
|
21
|
+
opacity 150ms ease-out;
|
|
22
|
+
animation: indicator-enter 150ms ease-out;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.leaving {
|
|
26
|
+
opacity: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@keyframes indicator-enter {
|
|
30
|
+
from {
|
|
31
|
+
opacity: 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.warning {
|
|
36
|
+
background: var(--qilin-alias-state-warn-tertiary);
|
|
37
|
+
color: var(--qilin-alias-state-warn-label);
|
|
38
|
+
border-color: color-mix(in srgb, var(--qilin-alias-state-warn-label) 20%, transparent);
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.warning:hover {
|
|
43
|
+
background: color-mix(
|
|
44
|
+
in srgb,
|
|
45
|
+
var(--qilin-alias-state-warn-tertiary),
|
|
46
|
+
var(--qilin-alias-state-warn-primary) 6%
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.warning:active {
|
|
51
|
+
background: color-mix(
|
|
52
|
+
in srgb,
|
|
53
|
+
var(--qilin-alias-state-warn-tertiary),
|
|
54
|
+
var(--qilin-alias-state-warn-primary) 10%
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.warning:focus-visible {
|
|
59
|
+
outline: var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color, var(--qilin-alias-state-business-primary));
|
|
60
|
+
outline-offset: 2px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.success {
|
|
64
|
+
background: var(--qilin-alias-state-success-tertiary);
|
|
65
|
+
color: var(--qilin-alias-state-success-primary);
|
|
66
|
+
border-color: color-mix(in srgb, var(--qilin-alias-state-success-primary) 20%, transparent);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.icon {
|
|
70
|
+
display: grid;
|
|
71
|
+
place-items: center;
|
|
72
|
+
width: 14px;
|
|
73
|
+
height: 14px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.label {
|
|
77
|
+
text-align: left;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.spinner {
|
|
81
|
+
animation: spinner-rotate 0.9s linear infinite;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@keyframes spinner-rotate {
|
|
85
|
+
to { transform: rotate(360deg); }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.dots {
|
|
89
|
+
display: inline-block;
|
|
90
|
+
width: 1em;
|
|
91
|
+
text-align: left;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.secondDot {
|
|
95
|
+
animation: reveal-second-dot 1.5s step-end infinite;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.thirdDot {
|
|
99
|
+
animation: reveal-third-dot 1.5s step-end infinite;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@keyframes reveal-second-dot {
|
|
103
|
+
0%, 33.32% { opacity: 0; }
|
|
104
|
+
33.33%, 100% { opacity: 1; }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@keyframes reveal-third-dot {
|
|
108
|
+
0%, 66.65% { opacity: 0; }
|
|
109
|
+
66.66%, 100% { opacity: 1; }
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@media (prefers-reduced-motion: reduce) {
|
|
113
|
+
.indicator,
|
|
114
|
+
.secondDot,
|
|
115
|
+
.thirdDot,
|
|
116
|
+
.spinner {
|
|
117
|
+
animation: none;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.indicator {
|
|
121
|
+
transition: none;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
.block {
|
|
2
|
+
--dsl-diff-radius: 12px;
|
|
3
|
+
--dsl-diff-line-height: 22px;
|
|
4
|
+
|
|
5
|
+
position: relative;
|
|
6
|
+
margin: 16px 0;
|
|
7
|
+
color: var(--qilin-alias-label-primary);
|
|
8
|
+
background: var(--qilin-alias-markdown-code-block);
|
|
9
|
+
border-radius: var(--dsl-diff-radius);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/* The copy control floats in the top-right corner over the body, so the card
|
|
13
|
+
has no empty banner row above its first diff line (the TUI diff card has no
|
|
14
|
+
banner either — only the footer). The block is position: relative, so this
|
|
15
|
+
anchors to the card. */
|
|
16
|
+
.copyButton {
|
|
17
|
+
position: absolute;
|
|
18
|
+
top: 8px;
|
|
19
|
+
right: 12px;
|
|
20
|
+
z-index: 1;
|
|
21
|
+
background-color: transparent;
|
|
22
|
+
border: none;
|
|
23
|
+
padding: 0;
|
|
24
|
+
margin: 0;
|
|
25
|
+
color: var(--qilin-alias-label-secondary);
|
|
26
|
+
cursor: pointer;
|
|
27
|
+
font: var(--qilin-font-xs-13);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.body {
|
|
31
|
+
padding: 12px 14px;
|
|
32
|
+
font: var(--qilin-font-markdown-code-block);
|
|
33
|
+
overflow-x: auto;
|
|
34
|
+
overflow-y: hidden;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* No wrapping, no word-break: a diff is read by its indentation. */
|
|
38
|
+
.line {
|
|
39
|
+
min-height: var(--dsl-diff-line-height);
|
|
40
|
+
white-space: pre;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* A file header: the path in the primary tone, set apart by weight. The copy
|
|
44
|
+
button floats over this first row's top-right corner, so reserve space at the
|
|
45
|
+
line's end for it — a long path scrolls under the button otherwise, and the
|
|
46
|
+
button's hit area would eat clicks on the path's tail. */
|
|
47
|
+
.path {
|
|
48
|
+
color: var(--qilin-alias-label-primary);
|
|
49
|
+
font-weight: 600;
|
|
50
|
+
padding-right: 56px;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* A same-file second hunk's separator (a scattered edit), in the dim tone. */
|
|
54
|
+
.gap {
|
|
55
|
+
color: var(--qilin-alias-label-tertiary);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* The diff's own meaning-carrying colors: removed on the error token, added on
|
|
59
|
+
the success token. A `- `/`+ ` prefix is drawn here so a copied line and the
|
|
60
|
+
shown line agree, and so the sign reads without relying on color alone. */
|
|
61
|
+
.del::before {
|
|
62
|
+
content: '- ';
|
|
63
|
+
color: var(--qilin-alias-state-error-primary);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.del {
|
|
67
|
+
color: var(--qilin-alias-state-error-primary);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.add::before {
|
|
71
|
+
content: '+ ';
|
|
72
|
+
color: var(--qilin-alias-state-success-primary);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.add {
|
|
76
|
+
color: var(--qilin-alias-state-success-primary);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.context {
|
|
80
|
+
color: var(--qilin-alias-label-secondary);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.context::before {
|
|
84
|
+
content: ' ';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.expand {
|
|
88
|
+
display: block;
|
|
89
|
+
width: 100%;
|
|
90
|
+
padding: 0;
|
|
91
|
+
border: none;
|
|
92
|
+
background-color: transparent;
|
|
93
|
+
color: var(--qilin-alias-label-tertiary);
|
|
94
|
+
cursor: pointer;
|
|
95
|
+
font: inherit;
|
|
96
|
+
text-align: left;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.expand:hover {
|
|
100
|
+
color: var(--qilin-alias-label-secondary);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* The change summary, dim under the body: `└ +A -R · N file(s)`, the same
|
|
104
|
+
footer the TUI transcript's diff card draws. */
|
|
105
|
+
.footer {
|
|
106
|
+
padding: 0 14px 12px;
|
|
107
|
+
font: var(--qilin-font-markdown-code-block);
|
|
108
|
+
color: var(--qilin-alias-label-tertiary);
|
|
109
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/* Shared disclosure header: [16px leading] gap 6 [title 13/24] at the default
|
|
2
|
+
size. The Settings font-size preference moves the row through the
|
|
3
|
+
body-published axis: title size follows the secondary tier
|
|
4
|
+
(--qilin-content-font-size-secondary: one step under the body — setting −1 at
|
|
5
|
+
≤14, setting −2 above), and the row height, leading box, and glyph edge
|
|
6
|
+
shift by the body px delta so the icon keeps its optical share of the
|
|
7
|
+
line. */
|
|
8
|
+
|
|
9
|
+
.root {
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
width: 100%;
|
|
13
|
+
min-width: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.row {
|
|
17
|
+
position: relative;
|
|
18
|
+
overflow: hidden;
|
|
19
|
+
display: flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
height: calc(24px + var(--qilin-content-font-delta, 0px));
|
|
22
|
+
min-width: 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.row[data-expandable] {
|
|
26
|
+
cursor: pointer;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.leading {
|
|
30
|
+
position: relative;
|
|
31
|
+
flex: none;
|
|
32
|
+
width: calc(16px + var(--qilin-content-font-delta, 0px));
|
|
33
|
+
height: calc(16px + var(--qilin-content-font-delta, 0px));
|
|
34
|
+
display: inline-flex;
|
|
35
|
+
align-items: center;
|
|
36
|
+
justify-content: center;
|
|
37
|
+
margin-right: 6px;
|
|
38
|
+
padding: 0;
|
|
39
|
+
border: none;
|
|
40
|
+
background: none;
|
|
41
|
+
color: var(--qilin-alias-label-tertiary);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Flow-row glyphs render at 14px inside the 16px box; the CSS edge overrides
|
|
45
|
+
each svg's own width/height attributes so every registered icon scales
|
|
46
|
+
without a per-callsite size prop. StateDot (its svg carries data-state)
|
|
47
|
+
stays at its fixed figma size — it is a status mark, not text furniture. */
|
|
48
|
+
.leading svg:not([data-state]) {
|
|
49
|
+
width: calc(14px + var(--qilin-content-font-delta, 0px));
|
|
50
|
+
height: calc(14px + var(--qilin-content-font-delta, 0px));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
button.leading {
|
|
54
|
+
cursor: pointer;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.iconIdle {
|
|
58
|
+
display: inline-flex;
|
|
59
|
+
opacity: 1;
|
|
60
|
+
transition: opacity 100ms ease;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.chevronHover {
|
|
64
|
+
position: absolute;
|
|
65
|
+
inset: 0;
|
|
66
|
+
margin: auto;
|
|
67
|
+
opacity: 0;
|
|
68
|
+
transition: opacity 100ms ease;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.row:hover .iconIdle {
|
|
72
|
+
opacity: 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.row:hover .chevronHover {
|
|
76
|
+
opacity: 1;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.title {
|
|
80
|
+
flex: none;
|
|
81
|
+
font-size: var(--qilin-content-font-size-secondary, 13px);
|
|
82
|
+
line-height: calc(24px + var(--qilin-content-font-delta, 0px));
|
|
83
|
+
color: var(--qilin-alias-label-secondary);
|
|
84
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
.icon {
|
|
2
|
+
/* The design platform has no violet token matching the supplied image/video artwork. */
|
|
3
|
+
--qilin-file-type-violet: rgb(139, 118, 246);
|
|
4
|
+
|
|
5
|
+
color: var(--qilin-file-type-icon-color, var(--qilin-file-type-default-color));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.code {
|
|
9
|
+
--qilin-file-type-default-color: var(--qilin-static-deepseek-500);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.excel {
|
|
13
|
+
--qilin-file-type-default-color: var(--qilin-static-green-500);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.folder {
|
|
17
|
+
--qilin-file-type-default-color: var(--qilin-static-amber-400);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.html {
|
|
21
|
+
--qilin-file-type-default-color: var(--qilin-static-deepseek-500);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.image {
|
|
25
|
+
--qilin-file-type-default-color: var(--qilin-file-type-violet);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.markdown {
|
|
29
|
+
--qilin-file-type-default-color: var(--qilin-static-deepseek-500);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.other {
|
|
33
|
+
--qilin-file-type-default-color: var(--qilin-static-neutral-bluish-300);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.pdf {
|
|
37
|
+
--qilin-file-type-default-color: var(--qilin-static-red-600);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.ppt {
|
|
41
|
+
--qilin-file-type-default-color: var(--qilin-static-amber-500);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.video {
|
|
45
|
+
--qilin-file-type-default-color: var(--qilin-file-type-violet);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.word {
|
|
49
|
+
--qilin-file-type-default-color: var(--qilin-static-deepseek-450);
|
|
50
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* Block, not inline-flex: consumers wrap full-width list rows and an
|
|
2
|
+
* inline wrapper would shrink them; the card still measures this rect. */
|
|
3
|
+
.root {
|
|
4
|
+
position: relative;
|
|
5
|
+
display: block;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* Preview card (figma session hover card): 244 wide, r12, pad 12/16, the
|
|
9
|
+
* menu card's elevation. Surface is #2C2C2E in both themes (figma value,
|
|
10
|
+
* light/dark identical), so a component-level variable, not a theme token.
|
|
11
|
+
* Hit-testable on purpose: resting the pointer on the card holds it open
|
|
12
|
+
* (HoverCard's grace close), which a `pointer-events: none` card cannot do. */
|
|
13
|
+
.card {
|
|
14
|
+
--qilin-hovercard-bg: #2C2C2E;
|
|
15
|
+
position: fixed;
|
|
16
|
+
z-index: 100;
|
|
17
|
+
box-sizing: border-box;
|
|
18
|
+
width: 244px;
|
|
19
|
+
padding: 12px 16px;
|
|
20
|
+
border-radius: 12px;
|
|
21
|
+
background: var(--qilin-hovercard-bg);
|
|
22
|
+
box-shadow: var(--qilin-shadow-lv3);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.copyable {
|
|
26
|
+
cursor: pointer;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.copyable:focus-visible {
|
|
30
|
+
outline: var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color, var(--qilin-alias-state-business-primary));
|
|
31
|
+
outline-offset: 2px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.feedback {
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
justify-content: center;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.copied {
|
|
41
|
+
color: #FFFFFF;
|
|
42
|
+
font-size: 14px;
|
|
43
|
+
line-height: 20px;
|
|
44
|
+
text-align: center;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.status {
|
|
48
|
+
position: absolute;
|
|
49
|
+
width: 1px;
|
|
50
|
+
height: 1px;
|
|
51
|
+
overflow: hidden;
|
|
52
|
+
clip: rect(0 0 0 0);
|
|
53
|
+
white-space: nowrap;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* An inline media anchor stays in the prose flow; the card it opens is a
|
|
57
|
+
* contained panel rather than the fixed-width session card above. */
|
|
58
|
+
.inline { display: inline; }
|
|
59
|
+
|
|
60
|
+
.media {
|
|
61
|
+
--qilin-scrollbar-thumb: var(--qilin-alias-scrollbar-bg-l2);
|
|
62
|
+
--qilin-scrollbar-thumb-hover: var(--qilin-alias-scrollbar-hover-l2);
|
|
63
|
+
overflow: auto;
|
|
64
|
+
padding: 8px;
|
|
65
|
+
border: 0;
|
|
66
|
+
color: var(--qilin-alias-label-primary);
|
|
67
|
+
background: var(--qilin-specific-menu);
|
|
68
|
+
backdrop-filter: var(--qilin-menu-backdrop-filter);
|
|
69
|
+
box-shadow: var(--qilin-elevation-panel);
|
|
70
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
.backdrop {
|
|
2
|
+
position: fixed;
|
|
3
|
+
inset: 0;
|
|
4
|
+
z-index: 1000;
|
|
5
|
+
display: grid;
|
|
6
|
+
place-items: center;
|
|
7
|
+
padding: 40px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* Same mask recipe as the Modal primitive and the settings dialog. A separate
|
|
11
|
+
layer, not a background on .backdrop: backdrop-filter there would blur the
|
|
12
|
+
previewed image and the close control along with the page. */
|
|
13
|
+
.mask {
|
|
14
|
+
position: absolute;
|
|
15
|
+
inset: 0;
|
|
16
|
+
background: var(--qilin-alias-bg-mask-1);
|
|
17
|
+
backdrop-filter: var(--qilin-mask-blur);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.image {
|
|
21
|
+
position: relative;
|
|
22
|
+
max-width: min(100%, 1600px);
|
|
23
|
+
max-height: calc(100vh - 80px);
|
|
24
|
+
object-fit: contain;
|
|
25
|
+
border-radius: 12px;
|
|
26
|
+
background: var(--qilin-specific-input-major);
|
|
27
|
+
border: 0;
|
|
28
|
+
box-shadow: var(--qilin-elevation-prominent);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.close {
|
|
32
|
+
position: fixed;
|
|
33
|
+
top: 20px;
|
|
34
|
+
right: 20px;
|
|
35
|
+
z-index: 1;
|
|
36
|
+
display: grid;
|
|
37
|
+
place-items: center;
|
|
38
|
+
width: 36px;
|
|
39
|
+
height: 36px;
|
|
40
|
+
border: 0.5px solid var(--qilin-alias-border-l2-darkmode-thin);
|
|
41
|
+
border-radius: 999px;
|
|
42
|
+
corner-shape: round;
|
|
43
|
+
background: var(--qilin-specific-input-major);
|
|
44
|
+
color: var(--qilin-alias-label-primary);
|
|
45
|
+
cursor: pointer;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.close:focus-visible { outline: var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color, var(--qilin-alias-state-business-primary)); outline-offset: 3px; }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
.frame {
|
|
2
|
+
position: relative;
|
|
3
|
+
display: grid;
|
|
4
|
+
place-items: center;
|
|
5
|
+
width: 100%;
|
|
6
|
+
height: 180px;
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
border-radius: 8px;
|
|
9
|
+
background: var(--qilin-alias-bg-base);
|
|
10
|
+
}
|
|
11
|
+
.image { width: 100%; height: 100%; min-height: 0; object-fit: contain; opacity: 0; }
|
|
12
|
+
.image[data-ready] { opacity: 1; }
|
|
13
|
+
.status {
|
|
14
|
+
position: absolute;
|
|
15
|
+
inset: 0;
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: center;
|
|
19
|
+
gap: 8px;
|
|
20
|
+
padding: 12px;
|
|
21
|
+
color: var(--qilin-alias-label-tertiary);
|
|
22
|
+
font-size: 12px;
|
|
23
|
+
line-height: 18px;
|
|
24
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
.wrap {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
gap: 6px;
|
|
5
|
+
height: 32px;
|
|
6
|
+
padding: 0 8px;
|
|
7
|
+
border: 0.5px solid var(--qilin-alias-border-l4);
|
|
8
|
+
border-radius: 8px;
|
|
9
|
+
background: var(--qilin-alias-bg-layer-1);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.wrap:focus-within {
|
|
13
|
+
border-color: var(--qilin-alias-state-business-primary);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.icon {
|
|
17
|
+
display: inline-flex;
|
|
18
|
+
width: 16px;
|
|
19
|
+
height: 16px;
|
|
20
|
+
align-items: center;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
color: var(--qilin-alias-label-tertiary);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.input {
|
|
26
|
+
flex: 1;
|
|
27
|
+
min-width: 0;
|
|
28
|
+
border: none;
|
|
29
|
+
outline: none;
|
|
30
|
+
background: transparent;
|
|
31
|
+
font-size: 14px;
|
|
32
|
+
line-height: 22px;
|
|
33
|
+
color: var(--qilin-alias-label-primary);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.input::placeholder {
|
|
37
|
+
color: var(--qilin-alias-label-dimmed);
|
|
38
|
+
}
|