@fragments-sdk/cli 0.5.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +996 -79
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-ICAIQ57V.js → chunk-6JBGU74P.js} +5 -3
- package/dist/chunk-6JBGU74P.js.map +1 -0
- package/dist/chunk-7OPWMLOE.js +1625 -0
- package/dist/chunk-7OPWMLOE.js.map +1 -0
- package/dist/{chunk-2H2JAA3U.js → chunk-CVXKXVOY.js} +3 -3
- package/dist/{chunk-2H2JAA3U.js.map → chunk-CVXKXVOY.js.map} +1 -1
- package/dist/{chunk-IOJE35DZ.js → chunk-NWQ4CJOQ.js} +3 -3
- package/dist/{chunk-2DJH4F4P.js → chunk-RVRTRESS.js} +3 -3
- package/dist/{chunk-V7YLRR4C.js → chunk-TJ34N7C7.js} +41 -4
- package/dist/{chunk-V7YLRR4C.js.map → chunk-TJ34N7C7.js.map} +1 -1
- package/dist/{chunk-XNWDI6UT.js → chunk-XHUDJNN3.js} +5 -5
- package/dist/{core-DKHB7FYV.js → core-W2HYIQW6.js} +4 -4
- package/dist/{generate-KL24VZVD.js → generate-LMTISDIJ.js} +5 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/{init-NION5S3M.js → init-7CHRKQ7P.js} +5 -5
- package/dist/mcp-bin.js +8 -220
- package/dist/mcp-bin.js.map +1 -1
- package/dist/scan-WY23TJCP.js +12 -0
- package/dist/{service-RWUMZ3EW.js → service-T2L7VLTE.js} +5 -5
- package/dist/static-viewer-GBR7YNF3.js +12 -0
- package/dist/{test-ECPEXFDN.js → test-OJRXNDO2.js} +4 -4
- package/dist/{tokens-ITADYVPF.js → tokens-3BWDESVM.js} +6 -6
- package/dist/viewer-SUFOISZM.js +1822 -0
- package/dist/viewer-SUFOISZM.js.map +1 -0
- package/package.json +6 -5
- package/src/bin.ts +31 -0
- package/src/build.ts +147 -13
- package/src/cli-commands.ts +18 -0
- package/src/commands/__tests__/a11y-scoring.test.ts +278 -0
- package/src/commands/a11y-report.ts +625 -0
- package/src/commands/a11y.ts +168 -14
- package/src/commands/build.ts +16 -0
- package/src/commands/graph.ts +274 -0
- package/src/core/auto-props.ts +464 -0
- package/src/core/composition.ts +64 -1
- package/src/core/graph-extractor.test.ts +542 -0
- package/src/core/graph-extractor.ts +601 -0
- package/src/core/importAnalyzer.ts +5 -0
- package/src/core/schema.ts +2 -0
- package/src/core/types.ts +3 -1
- package/src/index.ts +4 -0
- package/src/mcp/server.ts +13 -220
- package/src/theme/__tests__/component-contrast.test.ts +338 -0
- package/src/theme/__tests__/contrast-validation.test.ts +326 -0
- package/src/theme/contrast.test.ts +331 -0
- package/src/theme/contrast.ts +246 -0
- package/src/theme/generator.ts +213 -1
- package/src/theme/index.ts +16 -0
- package/src/theme/types.ts +51 -0
- package/src/viewer/__tests__/a11y-fixes.test.ts +358 -0
- package/src/viewer/__tests__/viewer-integration.test.ts +2 -7
- package/src/viewer/components/AccessibilityPanel.tsx +493 -433
- package/src/viewer/components/ActionCapture.tsx +1 -1
- package/src/viewer/components/ActionsPanel.tsx +142 -183
- package/src/viewer/components/App.tsx +276 -183
- package/src/viewer/components/BottomPanel.tsx +40 -80
- package/src/viewer/components/CodePanel.tsx +9 -87
- package/src/viewer/components/CommandPalette.tsx +117 -74
- package/src/viewer/components/ComponentGraph.tsx +143 -126
- package/src/viewer/components/ComponentHeader.tsx +46 -43
- package/src/viewer/components/ContractPanel.tsx +124 -117
- package/src/viewer/components/ErrorBoundary.tsx +47 -35
- package/src/viewer/components/FigmaEmbed.tsx +18 -13
- package/src/viewer/components/FragmentEditor.tsx +126 -63
- package/src/viewer/components/HealthDashboard.tsx +146 -171
- package/src/viewer/components/HmrStatusIndicator.tsx +31 -41
- package/src/viewer/components/Icons.tsx +151 -98
- package/src/viewer/components/InteractionsPanel.tsx +317 -264
- package/src/viewer/components/IsolatedPreviewFrame.tsx +52 -27
- package/src/viewer/components/IsolatedRender.tsx +12 -6
- package/src/viewer/components/KeyboardShortcutsHelp.tsx +34 -70
- package/src/viewer/components/LandingPage.tsx +285 -305
- package/src/viewer/components/Layout.tsx +12 -10
- package/src/viewer/components/LeftSidebar.tsx +103 -155
- package/src/viewer/components/MultiViewportPreview.tsx +254 -63
- package/src/viewer/components/PreviewArea.tsx +113 -44
- package/src/viewer/components/PreviewFrameHost.tsx +36 -6
- package/src/viewer/components/PreviewPane.tsx +2 -3
- package/src/viewer/components/PreviewToolbar.tsx +109 -105
- package/src/viewer/components/PropsEditor.tsx +154 -74
- package/src/viewer/components/PropsTable.tsx +95 -82
- package/src/viewer/components/RelationsSection.tsx +71 -40
- package/src/viewer/components/ResizablePanel.tsx +158 -55
- package/src/viewer/components/RightSidebar.tsx +46 -56
- package/src/viewer/components/ScreenshotButton.tsx +12 -12
- package/src/viewer/components/SkeletonLoader.tsx +99 -83
- package/src/viewer/components/StoryRenderer.tsx +4 -11
- package/src/viewer/components/Toast.tsx +3 -67
- package/src/viewer/components/TokenStylePanel.tsx +136 -118
- package/src/viewer/components/UsageSection.tsx +26 -26
- package/src/viewer/components/VariantMatrix.tsx +140 -47
- package/src/viewer/components/VariantTabs.tsx +24 -68
- package/src/viewer/components/ViewportSelector.tsx +121 -114
- package/src/viewer/constants/ui.ts +23 -22
- package/src/viewer/entry.tsx +8 -3
- package/src/viewer/index.ts +3 -6
- package/src/viewer/preview-frame.html +43 -18
- package/src/viewer/server.ts +7 -16
- package/src/viewer/styles/globals.css +46 -85
- package/src/viewer/utils/a11y-fixes.ts +53 -30
- package/dist/chunk-ICAIQ57V.js.map +0 -1
- package/dist/chunk-U4GQ2JTD.js +0 -832
- package/dist/chunk-U4GQ2JTD.js.map +0 -1
- package/dist/scan-ESEXV7LF.js +0 -12
- package/dist/static-viewer-O37MJ5B6.js +0 -12
- package/dist/viewer-YDGFDTK5.js +0 -11104
- package/dist/viewer-YDGFDTK5.js.map +0 -1
- package/src/viewer/postcss.config.js +0 -6
- package/src/viewer/tailwind.config.js +0 -37
- /package/dist/{chunk-IOJE35DZ.js.map → chunk-NWQ4CJOQ.js.map} +0 -0
- /package/dist/{chunk-2DJH4F4P.js.map → chunk-RVRTRESS.js.map} +0 -0
- /package/dist/{chunk-XNWDI6UT.js.map → chunk-XHUDJNN3.js.map} +0 -0
- /package/dist/{core-DKHB7FYV.js.map → core-W2HYIQW6.js.map} +0 -0
- /package/dist/{generate-KL24VZVD.js.map → generate-LMTISDIJ.js.map} +0 -0
- /package/dist/{init-NION5S3M.js.map → init-7CHRKQ7P.js.map} +0 -0
- /package/dist/{scan-ESEXV7LF.js.map → scan-WY23TJCP.js.map} +0 -0
- /package/dist/{service-RWUMZ3EW.js.map → service-T2L7VLTE.js.map} +0 -0
- /package/dist/{static-viewer-O37MJ5B6.js.map → static-viewer-GBR7YNF3.js.map} +0 -0
- /package/dist/{test-ECPEXFDN.js.map → test-OJRXNDO2.js.map} +0 -0
- /package/dist/{tokens-ITADYVPF.js.map → tokens-3BWDESVM.js.map} +0 -0
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { memo, useRef, useEffect, useState, useCallback } from 'react';
|
|
12
|
-
import clsx from 'clsx';
|
|
13
12
|
import { usePreviewBridge, type ParentMessage } from '../hooks/usePreviewBridge.js';
|
|
14
13
|
|
|
15
14
|
/** Maximum number of retry attempts */
|
|
@@ -74,6 +73,7 @@ export const IsolatedPreviewFrame = memo(function IsolatedPreviewFrame({
|
|
|
74
73
|
const { isReady, isRendering, lastError, contentSize, render, setTheme, clearError } = usePreviewBridge(iframeRef);
|
|
75
74
|
const lastRenderRef = useRef<string>('');
|
|
76
75
|
const isFirstLoad = useRef(true);
|
|
76
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
77
77
|
|
|
78
78
|
// Build the preview URL
|
|
79
79
|
const previewUrl = '/fragments/preview/';
|
|
@@ -150,7 +150,6 @@ export const IsolatedPreviewFrame = memo(function IsolatedPreviewFrame({
|
|
|
150
150
|
|
|
151
151
|
return (
|
|
152
152
|
<div
|
|
153
|
-
className={clsx('isolated-preview-frame group', className)}
|
|
154
153
|
style={{
|
|
155
154
|
position: 'relative',
|
|
156
155
|
width: frameWidth,
|
|
@@ -159,25 +158,38 @@ export const IsolatedPreviewFrame = memo(function IsolatedPreviewFrame({
|
|
|
159
158
|
...background,
|
|
160
159
|
...style,
|
|
161
160
|
}}
|
|
161
|
+
onMouseEnter={() => setIsHovered(true)}
|
|
162
|
+
onMouseLeave={() => setIsHovered(false)}
|
|
162
163
|
>
|
|
163
164
|
{/* Skeleton loading overlay (initial load) */}
|
|
164
165
|
<div
|
|
165
|
-
|
|
166
|
-
'absolute
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
166
|
+
style={{
|
|
167
|
+
position: 'absolute',
|
|
168
|
+
inset: 0,
|
|
169
|
+
zIndex: 10,
|
|
170
|
+
transition: 'opacity 150ms',
|
|
171
|
+
opacity: showSkeleton ? 1 : 0,
|
|
172
|
+
pointerEvents: showSkeleton ? 'auto' : 'none',
|
|
173
|
+
background: 'rgba(255, 255, 255, 0.95)',
|
|
174
|
+
}}
|
|
170
175
|
>
|
|
171
176
|
<PreviewSkeleton />
|
|
172
177
|
</div>
|
|
173
178
|
|
|
174
179
|
{/* Spinner overlay (subsequent renders) */}
|
|
175
180
|
<div
|
|
176
|
-
|
|
177
|
-
'absolute
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
+
style={{
|
|
182
|
+
position: 'absolute',
|
|
183
|
+
inset: 0,
|
|
184
|
+
zIndex: 10,
|
|
185
|
+
display: 'flex',
|
|
186
|
+
alignItems: 'center',
|
|
187
|
+
justifyContent: 'center',
|
|
188
|
+
transition: 'opacity 150ms',
|
|
189
|
+
opacity: showSpinner ? 1 : 0,
|
|
190
|
+
pointerEvents: showSpinner ? 'auto' : 'none',
|
|
191
|
+
background: 'rgba(255, 255, 255, 0.8)',
|
|
192
|
+
}}
|
|
181
193
|
>
|
|
182
194
|
<div style={{ display: 'flex', alignItems: 'center', gap: 8, color: '#6b7280', fontSize: 14 }}>
|
|
183
195
|
<LoadingSpinner />
|
|
@@ -187,11 +199,19 @@ export const IsolatedPreviewFrame = memo(function IsolatedPreviewFrame({
|
|
|
187
199
|
|
|
188
200
|
{/* Error overlay */}
|
|
189
201
|
<div
|
|
190
|
-
|
|
191
|
-
'absolute
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
202
|
+
style={{
|
|
203
|
+
position: 'absolute',
|
|
204
|
+
inset: 0,
|
|
205
|
+
zIndex: 10,
|
|
206
|
+
display: 'flex',
|
|
207
|
+
alignItems: 'center',
|
|
208
|
+
justifyContent: 'center',
|
|
209
|
+
padding: '16px',
|
|
210
|
+
transition: 'opacity 150ms',
|
|
211
|
+
opacity: frameError && !isLoading ? 1 : 0,
|
|
212
|
+
pointerEvents: frameError && !isLoading ? 'auto' : 'none',
|
|
213
|
+
background: 'rgba(254, 242, 242, 0.95)',
|
|
214
|
+
}}
|
|
195
215
|
>
|
|
196
216
|
<div
|
|
197
217
|
style={{
|
|
@@ -236,16 +256,14 @@ export const IsolatedPreviewFrame = memo(function IsolatedPreviewFrame({
|
|
|
236
256
|
title={`Preview: ${variantName}`}
|
|
237
257
|
onLoad={handleLoad}
|
|
238
258
|
onError={handleError}
|
|
239
|
-
className={clsx(
|
|
240
|
-
'transition-opacity duration-150',
|
|
241
|
-
showContent ? 'opacity-100' : 'opacity-0'
|
|
242
|
-
)}
|
|
243
259
|
style={{
|
|
244
260
|
width: '100%',
|
|
245
261
|
height: '100%',
|
|
246
262
|
border: 'none',
|
|
247
263
|
display: 'block',
|
|
248
264
|
background: 'transparent',
|
|
265
|
+
transition: 'opacity 150ms',
|
|
266
|
+
opacity: showContent ? 1 : 0,
|
|
249
267
|
}}
|
|
250
268
|
// Security attributes
|
|
251
269
|
sandbox="allow-scripts allow-same-origin"
|
|
@@ -254,9 +272,15 @@ export const IsolatedPreviewFrame = memo(function IsolatedPreviewFrame({
|
|
|
254
272
|
{/* Size indicator */}
|
|
255
273
|
{showSizeIndicator && contentSize && (
|
|
256
274
|
<div
|
|
257
|
-
className="absolute bottom-1 right-1 px-1.5 py-0.5 rounded font-mono
|
|
258
|
-
opacity-0 group-hover:opacity-100 transition-opacity duration-150"
|
|
259
275
|
style={{
|
|
276
|
+
position: 'absolute',
|
|
277
|
+
bottom: '4px',
|
|
278
|
+
right: '4px',
|
|
279
|
+
padding: '2px 6px',
|
|
280
|
+
borderRadius: '4px',
|
|
281
|
+
fontFamily: 'monospace',
|
|
282
|
+
opacity: isHovered ? 1 : 0,
|
|
283
|
+
transition: 'opacity 150ms',
|
|
260
284
|
background: 'rgba(0, 0, 0, 0.5)',
|
|
261
285
|
color: 'white',
|
|
262
286
|
fontSize: 10,
|
|
@@ -274,10 +298,11 @@ export const IsolatedPreviewFrame = memo(function IsolatedPreviewFrame({
|
|
|
274
298
|
*/
|
|
275
299
|
function PreviewSkeleton() {
|
|
276
300
|
return (
|
|
277
|
-
<div
|
|
278
|
-
<
|
|
279
|
-
<div
|
|
280
|
-
<div
|
|
301
|
+
<div style={{ padding: '16px' }}>
|
|
302
|
+
<style>{`@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }`}</style>
|
|
303
|
+
<div style={{ height: '16px', background: 'var(--bg-secondary, #e5e7eb)', borderRadius: '4px', width: '33%', marginBottom: '12px', animation: 'pulse 2s ease-in-out infinite' }} />
|
|
304
|
+
<div style={{ height: '32px', background: 'var(--bg-secondary, #e5e7eb)', borderRadius: '4px', marginBottom: '8px', animation: 'pulse 2s ease-in-out infinite' }} />
|
|
305
|
+
<div style={{ height: '16px', background: 'var(--bg-secondary, #e5e7eb)', borderRadius: '4px', width: '66%', animation: 'pulse 2s ease-in-out infinite' }} />
|
|
281
306
|
</div>
|
|
282
307
|
);
|
|
283
308
|
}
|
|
@@ -59,7 +59,7 @@ export function IsolatedRender({ segments }: IsolatedRenderProps) {
|
|
|
59
59
|
// Apply theme
|
|
60
60
|
useEffect(() => {
|
|
61
61
|
document.documentElement.setAttribute("data-theme", params.theme);
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
// Signal ready after a short delay for fonts and styles to settle
|
|
64
64
|
const timer = setTimeout(() => {
|
|
65
65
|
setReady(true);
|
|
@@ -71,9 +71,9 @@ export function IsolatedRender({ segments }: IsolatedRenderProps) {
|
|
|
71
71
|
// Error state - missing component or variant
|
|
72
72
|
if (!params.component || !params.variant) {
|
|
73
73
|
return (
|
|
74
|
-
<div
|
|
74
|
+
<div style={{ padding: '16px', color: '#ef4444', fontFamily: 'monospace', fontSize: '14px' }}>
|
|
75
75
|
Error: Missing component or variant parameter
|
|
76
|
-
<pre
|
|
76
|
+
<pre style={{ marginTop: '8px', fontSize: '12px' }}>
|
|
77
77
|
Required: ?component=ComponentName&variant=VariantName
|
|
78
78
|
</pre>
|
|
79
79
|
</div>
|
|
@@ -83,7 +83,7 @@ export function IsolatedRender({ segments }: IsolatedRenderProps) {
|
|
|
83
83
|
// Error state - component/variant not found
|
|
84
84
|
if (!match) {
|
|
85
85
|
return (
|
|
86
|
-
<div
|
|
86
|
+
<div style={{ padding: '16px', color: '#ef4444', fontFamily: 'monospace', fontSize: '14px' }}>
|
|
87
87
|
Error: Component "{params.component}" variant "{params.variant}" not
|
|
88
88
|
found
|
|
89
89
|
</div>
|
|
@@ -95,8 +95,14 @@ export function IsolatedRender({ segments }: IsolatedRenderProps) {
|
|
|
95
95
|
<div
|
|
96
96
|
id="isolated-render"
|
|
97
97
|
data-ready={ready}
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
style={{
|
|
99
|
+
minHeight: '100vh',
|
|
100
|
+
padding: '32px',
|
|
101
|
+
display: 'flex',
|
|
102
|
+
alignItems: 'center',
|
|
103
|
+
justifyContent: 'center',
|
|
104
|
+
...getBackgroundStyle(params.background),
|
|
105
|
+
}}
|
|
100
106
|
>
|
|
101
107
|
<div
|
|
102
108
|
style={{
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* Keyboard Shortcuts Help Modal
|
|
3
3
|
*
|
|
4
4
|
* Displays all available keyboard shortcuts in a modal overlay.
|
|
5
|
+
* Uses Fragments UI Dialog compound component.
|
|
5
6
|
*/
|
|
6
7
|
|
|
7
|
-
import {
|
|
8
|
+
import { Dialog, Stack, Text, Badge } from '@fragments/ui';
|
|
8
9
|
import { SHORTCUTS } from "../hooks/useKeyboardShortcuts.js";
|
|
9
|
-
import { CloseIcon } from "./Icons.js";
|
|
10
10
|
|
|
11
11
|
interface KeyboardShortcutsHelpProps {
|
|
12
12
|
isOpen: boolean;
|
|
@@ -14,75 +14,39 @@ interface KeyboardShortcutsHelpProps {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export function KeyboardShortcutsHelp({ isOpen, onClose }: KeyboardShortcutsHelpProps) {
|
|
17
|
-
// Close on escape
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
if (!isOpen) return;
|
|
20
|
-
|
|
21
|
-
const handleEscape = (e: KeyboardEvent) => {
|
|
22
|
-
if (e.key === "Escape") {
|
|
23
|
-
onClose();
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
document.addEventListener("keydown", handleEscape);
|
|
28
|
-
return () => document.removeEventListener("keydown", handleEscape);
|
|
29
|
-
}, [isOpen, onClose]);
|
|
30
|
-
|
|
31
|
-
if (!isOpen) return null;
|
|
32
|
-
|
|
33
17
|
return (
|
|
34
|
-
<
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
<span className="text-xs text-tertiary mx-1">or</span>
|
|
67
|
-
)}
|
|
68
|
-
<kbd className="px-2 py-1 text-xs font-mono bg-[--bg-secondary] border border-[--border] rounded text-primary">
|
|
69
|
-
{key}
|
|
70
|
-
</kbd>
|
|
71
|
-
</span>
|
|
72
|
-
))}
|
|
73
|
-
</div>
|
|
74
|
-
</div>
|
|
75
|
-
))}
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
{/* Footer */}
|
|
79
|
-
<div className="px-5 py-3 border-t border-[--border] bg-[--bg-secondary] rounded-b-xl">
|
|
80
|
-
<p className="text-xs text-tertiary text-center">
|
|
81
|
-
Press <kbd className="px-1.5 py-0.5 text-xs font-mono bg-[--bg-primary] border border-[--border] rounded">?</kbd> to toggle this help
|
|
82
|
-
</p>
|
|
83
|
-
</div>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
18
|
+
<Dialog open={isOpen} onOpenChange={(open: boolean) => { if (!open) onClose(); }}>
|
|
19
|
+
<Dialog.Content size="md">
|
|
20
|
+
<Dialog.Header>
|
|
21
|
+
<Dialog.Title>Keyboard Shortcuts</Dialog.Title>
|
|
22
|
+
<Dialog.Close />
|
|
23
|
+
</Dialog.Header>
|
|
24
|
+
<Dialog.Body>
|
|
25
|
+
<Stack direction="column" gap="sm">
|
|
26
|
+
{SHORTCUTS.map((shortcut, index) => (
|
|
27
|
+
<Stack key={index} direction="row" align="center" justify="between">
|
|
28
|
+
<Text size="sm" color="secondary">{shortcut.description}</Text>
|
|
29
|
+
<Stack direction="row" align="center" gap="xs">
|
|
30
|
+
{shortcut.keys.map((key, keyIndex) => (
|
|
31
|
+
<span key={keyIndex} style={{ display: 'flex', alignItems: 'center' }}>
|
|
32
|
+
{keyIndex > 0 && (
|
|
33
|
+
<Text size="xs" color="tertiary" style={{ margin: '0 4px' }}>or</Text>
|
|
34
|
+
)}
|
|
35
|
+
<Badge variant="default" size="sm">{key}</Badge>
|
|
36
|
+
</span>
|
|
37
|
+
))}
|
|
38
|
+
</Stack>
|
|
39
|
+
</Stack>
|
|
40
|
+
))}
|
|
41
|
+
</Stack>
|
|
42
|
+
</Dialog.Body>
|
|
43
|
+
<Dialog.Footer>
|
|
44
|
+
<Text size="xs" color="tertiary" style={{ textAlign: 'center', width: '100%' }}>
|
|
45
|
+
Press <Badge variant="default" size="sm">?</Badge> to toggle this help
|
|
46
|
+
</Text>
|
|
47
|
+
</Dialog.Footer>
|
|
48
|
+
</Dialog.Content>
|
|
49
|
+
</Dialog>
|
|
86
50
|
);
|
|
87
51
|
}
|
|
88
52
|
|