@semiont/react-ui 0.5.28 → 0.5.30

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 (113) hide show
  1. package/README.md +3 -3
  2. package/dist/{PdfAnnotationCanvas.client-C2IGG4SW.js → PdfAnnotationCanvas.client-LSH3PZPY.js} +4 -4
  3. package/dist/{ar-FABPTJVB.js → ar-AZBRADEB.js} +5 -1
  4. package/dist/{bn-LKP6BDMH.js → bn-CCEW6AOS.js} +5 -1
  5. package/dist/{chunk-VXASXU4K.js → chunk-3ZBKCWUZ.js} +1 -1
  6. package/dist/{chunk-2YHEE63S.js → chunk-G4VHL4UA.js} +31 -31
  7. package/dist/{chunk-2GOHTTHW.js → chunk-SDKFZLEX.js} +5 -1
  8. package/dist/{cs-YQYNWHRG.js → cs-HXPF2CTE.js} +5 -1
  9. package/dist/{da-QHZOYKRY.js → da-K5NTK7LH.js} +5 -1
  10. package/dist/{de-GKA7RD7J.js → de-GMRQEDZI.js} +5 -1
  11. package/dist/{el-45T257AL.js → el-EUB4CI4G.js} +5 -1
  12. package/dist/{en-RVW5EQ66.js → en-R5XA26NF.js} +2 -2
  13. package/dist/{es-AVER7RU4.js → es-Z32DAZ6W.js} +5 -1
  14. package/dist/{fa-K3VPK3O2.js → fa-G7HN6B32.js} +5 -1
  15. package/dist/{fi-5NEKF7EB.js → fi-3YBLZO7I.js} +5 -1
  16. package/dist/{fr-FUMNDLBZ.js → fr-VUBH7BBS.js} +5 -1
  17. package/dist/{he-3JGNA3PR.js → he-WQQEY26B.js} +5 -1
  18. package/dist/{hi-IJY375DF.js → hi-HJZ6W4JB.js} +5 -1
  19. package/dist/{id-LWHKJ7ZD.js → id-ZOGZ37MI.js} +5 -1
  20. package/dist/index.d.ts +157 -257
  21. package/dist/index.js +763 -1209
  22. package/dist/{it-EBVOV4RW.js → it-DT6UW66F.js} +5 -1
  23. package/dist/{ja-KWRIX2NF.js → ja-RUKQCOLO.js} +5 -1
  24. package/dist/{ko-L5CJMFDS.js → ko-ZH5ADKZM.js} +5 -1
  25. package/dist/{ms-LSNMJDR2.js → ms-Y2AFPZTU.js} +5 -1
  26. package/dist/{nl-ZB32MB7U.js → nl-OQEWIXNA.js} +5 -1
  27. package/dist/{no-4GTNY7M5.js → no-KPAYJZWY.js} +5 -1
  28. package/dist/{pl-LUHBLTHB.js → pl-WSXK2UUD.js} +5 -1
  29. package/dist/{pt-C4H3UNQ6.js → pt-NWRJRUCK.js} +5 -1
  30. package/dist/{ro-GGITS5V4.js → ro-3CGVMOC6.js} +5 -1
  31. package/dist/{sv-T56RTLBP.js → sv-HGSEBA7S.js} +5 -1
  32. package/dist/test-utils.js +16 -7
  33. package/dist/{th-22X2IWCB.js → th-NZ4G352Z.js} +5 -1
  34. package/dist/{tr-77TFG62H.js → tr-LGGS4DLW.js} +5 -1
  35. package/dist/{uk-MIIL6NXT.js → uk-AIX536L4.js} +5 -1
  36. package/dist/{vi-7JYOIGNV.js → vi-V6CVQZLQ.js} +5 -1
  37. package/dist/{zh-ID6DRYU4.js → zh-AGKPGI3L.js} +5 -1
  38. package/package.json +13 -13
  39. package/src/components/StatusDisplay.tsx +13 -13
  40. package/src/components/__tests__/StatusDisplay.test.tsx +9 -9
  41. package/src/components/modals/ComposeStep.tsx +19 -4
  42. package/src/components/modals/ConfigureGenerationStep.tsx +143 -15
  43. package/src/components/modals/ReferenceWizardModal.tsx +14 -9
  44. package/src/components/modals/ResourceGenerateModal.tsx +10 -5
  45. package/src/components/modals/__tests__/ConfigureGenerationStep.test.tsx +171 -8
  46. package/src/components/modals/__tests__/ReferenceWizardModal.test.tsx +25 -1
  47. package/src/components/modals/__tests__/ResourceGenerateModal.test.tsx +24 -1
  48. package/src/components/modals/__tests__/WizardFooter.test.tsx +3 -5
  49. package/src/components/resource/BrowseView.tsx +3 -3
  50. package/src/components/resource/DownloadFileLink.tsx +1 -1
  51. package/src/components/resource/__tests__/BrowseView.reference-hover.test.tsx +1 -1
  52. package/src/components/resource/__tests__/BrowseView.test.tsx +2 -2
  53. package/src/components/resource/__tests__/download-link.test.tsx +6 -6
  54. package/src/components/resource/panels/ReferenceEntry.tsx +2 -2
  55. package/src/components/resource/panels/ReferencesPanel.tsx +5 -1
  56. package/src/components/resource/panels/__tests__/ReferencesPanel.observable-flow.test.tsx +1 -1
  57. package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +51 -2
  58. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +1 -1
  59. package/src/features/auth/__tests__/SignInForm.a11y.test.tsx +12 -12
  60. package/src/features/auth/components/SignInForm.tsx +53 -53
  61. package/src/features/auth-welcome/state/__tests__/welcome-state-unit.test.ts +2 -2
  62. package/src/features/moderate-recent/__tests__/RecentDocumentsPage.test.tsx +2 -2
  63. package/src/features/resource-compose/components/ResourceComposePage.tsx +18 -3
  64. package/src/features/resource-discovery/__tests__/ResourceDiscoveryPage.test.tsx +1 -1
  65. package/src/features/resource-discovery/components/ResourceDiscoveryPage.tsx +2 -2
  66. package/src/features/resource-discovery/state/discover-state-unit.ts +1 -1
  67. package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +2 -2
  68. package/src/features/resource-viewer/__tests__/generation-options.test.ts +53 -0
  69. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +16 -25
  70. package/src/features/resource-viewer/generation-options.ts +29 -0
  71. package/src/styles/index.css +0 -1
  72. package/translations/ar.json +4 -0
  73. package/translations/bn.json +4 -0
  74. package/translations/cs.json +4 -0
  75. package/translations/da.json +4 -0
  76. package/translations/de.json +4 -0
  77. package/translations/el.json +4 -0
  78. package/translations/en.json +4 -0
  79. package/translations/es.json +4 -0
  80. package/translations/fa.json +4 -0
  81. package/translations/fi.json +4 -0
  82. package/translations/fr.json +4 -0
  83. package/translations/he.json +4 -0
  84. package/translations/hi.json +4 -0
  85. package/translations/id.json +4 -0
  86. package/translations/it.json +4 -0
  87. package/translations/ja.json +4 -0
  88. package/translations/ko.json +4 -0
  89. package/translations/ms.json +4 -0
  90. package/translations/nl.json +4 -0
  91. package/translations/no.json +4 -0
  92. package/translations/pl.json +4 -0
  93. package/translations/pt.json +4 -0
  94. package/translations/ro.json +4 -0
  95. package/translations/sv.json +4 -0
  96. package/translations/th.json +4 -0
  97. package/translations/tr.json +4 -0
  98. package/translations/uk.json +4 -0
  99. package/translations/vi.json +4 -0
  100. package/translations/zh.json +4 -0
  101. package/src/features/admin-exchange/__tests__/AdminExchangePage.test.tsx +0 -137
  102. package/src/features/admin-exchange/__tests__/ExportCard.test.tsx +0 -41
  103. package/src/features/admin-exchange/__tests__/ImportCard.test.tsx +0 -148
  104. package/src/features/admin-exchange/__tests__/ImportProgress.test.tsx +0 -117
  105. package/src/features/admin-exchange/components/AdminExchangePage.tsx +0 -117
  106. package/src/features/admin-exchange/components/ExportCard.tsx +0 -35
  107. package/src/features/admin-exchange/components/ImportCard.tsx +0 -183
  108. package/src/features/admin-exchange/components/ImportProgress.tsx +0 -80
  109. package/src/features/admin-exchange/state/__tests__/exchange-state-unit.test.ts +0 -185
  110. package/src/features/admin-exchange/state/exchange-state-unit.ts +0 -133
  111. package/src/features/moderation-linked-data/__tests__/LinkedDataPage.test.tsx +0 -118
  112. package/src/features/moderation-linked-data/components/LinkedDataPage.tsx +0 -118
  113. package/src/styles/features/exchange.css +0 -374
@@ -1,118 +0,0 @@
1
- /**
2
- * Tests for LinkedDataPage component
3
- */
4
-
5
- import { describe, it, expect, vi } from 'vitest';
6
- import { render, screen } from '@testing-library/react';
7
- import { LinkedDataPage } from '../components/LinkedDataPage';
8
- import type { LinkedDataPageProps } from '../components/LinkedDataPage';
9
-
10
- const createProps = (overrides?: Partial<LinkedDataPageProps>): LinkedDataPageProps => ({
11
- onExport: vi.fn(),
12
- isExporting: false,
13
- onFileSelected: vi.fn(),
14
- onImport: vi.fn(),
15
- onCancelImport: vi.fn(),
16
- selectedFile: null,
17
- preview: null,
18
- isImporting: false,
19
- importPhase: null,
20
- theme: 'light',
21
- activePanel: null,
22
- translations: {
23
- title: 'Export & Import',
24
- subtitle: 'Exchange knowledge as JSON-LD Linked Data',
25
- export: {
26
- title: 'Export',
27
- description: 'Export your knowledge base as JSON-LD',
28
- exportButton: 'Export as JSON-LD',
29
- exporting: 'Exporting…',
30
- },
31
- import: {
32
- title: 'Import',
33
- description: 'Import from JSON-LD',
34
- dropzoneLabel: 'Drop a file here',
35
- dropzoneActive: 'Drop to upload',
36
- detectedFormat: 'Format',
37
- statsPreview: 'Preview',
38
- importButton: 'Import',
39
- importing: 'Importing…',
40
- importConfirmTitle: 'Confirm',
41
- importConfirmMessage: 'This will create new resources.',
42
- confirmImport: 'Proceed',
43
- cancelImport: 'Cancel',
44
- },
45
- progress: {
46
- phaseStarted: 'Starting…',
47
- phaseComplete: 'Complete',
48
- phaseError: 'Failed',
49
- statsEventsReplayed: 'Events replayed',
50
- statsResourcesCreated: 'Resources created',
51
- statsAnnotationsCreated: 'Annotations created',
52
- statsEntityTypesAdded: 'Entity types added',
53
- },
54
- },
55
- ToolbarPanels: () => <div data-testid="toolbar-panels" />,
56
- Toolbar: () => <div data-testid="toolbar" />,
57
- ...overrides,
58
- });
59
-
60
- describe('LinkedDataPage', () => {
61
- it('renders page title and subtitle', () => {
62
- render(<LinkedDataPage {...createProps()} />);
63
- expect(screen.getByText('Export & Import')).toBeInTheDocument();
64
- expect(screen.getByText('Exchange knowledge as JSON-LD Linked Data')).toBeInTheDocument();
65
- });
66
-
67
- it('renders ExportCard', () => {
68
- render(<LinkedDataPage {...createProps()} />);
69
- expect(screen.getByRole('heading', { name: 'Export' })).toBeInTheDocument();
70
- expect(screen.getByText('Export as JSON-LD')).toBeInTheDocument();
71
- });
72
-
73
- it('renders ImportCard', () => {
74
- render(<LinkedDataPage {...createProps()} />);
75
- expect(screen.getByRole('heading', { name: 'Import' })).toBeInTheDocument();
76
- expect(screen.getByText('Import from JSON-LD')).toBeInTheDocument();
77
- });
78
-
79
- it('renders toolbar components', () => {
80
- render(<LinkedDataPage {...createProps()} />);
81
- expect(screen.getByTestId('toolbar-panels')).toBeInTheDocument();
82
- expect(screen.getByTestId('toolbar')).toBeInTheDocument();
83
- });
84
-
85
- it('does not render ImportProgress when importPhase is null', () => {
86
- const { container } = render(<LinkedDataPage {...createProps()} />);
87
- expect(container.querySelector('.semiont-exchange__progress')).not.toBeInTheDocument();
88
- });
89
-
90
- it('renders ImportProgress when importPhase is set', () => {
91
- render(<LinkedDataPage {...createProps({ importPhase: 'started' })} />);
92
- expect(screen.getByText('Starting…')).toBeInTheDocument();
93
- });
94
-
95
- it('renders ImportProgress with result on completion', () => {
96
- render(<LinkedDataPage {...createProps({
97
- importPhase: 'complete',
98
- importResult: { stats: { resourcesCreated: 5, annotationsCreated: 12, entityTypesAdded: 3 } },
99
- })} />);
100
- expect(screen.getByText('Complete')).toBeInTheDocument();
101
- expect(screen.getByText('5')).toBeInTheDocument();
102
- expect(screen.getByText('Resources created')).toBeInTheDocument();
103
- expect(screen.getByText('12')).toBeInTheDocument();
104
- expect(screen.getByText('Annotations created')).toBeInTheDocument();
105
- expect(screen.getByText('3')).toBeInTheDocument();
106
- expect(screen.getByText('Entity types added')).toBeInTheDocument();
107
- });
108
-
109
- it('applies panel-open class when common panel is active', () => {
110
- const { container } = render(<LinkedDataPage {...createProps({ activePanel: 'user' })} />);
111
- expect(container.querySelector('.semiont-page--panel-open')).toBeInTheDocument();
112
- });
113
-
114
- it('does not apply panel-open class when no panel is active', () => {
115
- const { container } = render(<LinkedDataPage {...createProps({ activePanel: null })} />);
116
- expect(container.querySelector('.semiont-page--panel-open')).not.toBeInTheDocument();
117
- });
118
- });
@@ -1,118 +0,0 @@
1
- /**
2
- * LinkedDataPage — JSON-LD Export/Import moderation page
3
- *
4
- * Pure React component. All state and handlers passed as props.
5
- * Reuses ExportCard, ImportCard, and ImportProgress from admin-exchange.
6
- */
7
-
8
- import React from 'react';
9
- import { COMMON_PANELS, type ToolbarPanelType } from '../../../state/shell-state-unit';
10
- import { ExportCard, type ExportCardTranslations } from '../../admin-exchange/components/ExportCard';
11
- import { ImportCard, type ImportCardProps, type ImportCardTranslations } from '../../admin-exchange/components/ImportCard';
12
- import { ImportProgress, type ImportProgressTranslations } from '../../admin-exchange/components/ImportProgress';
13
-
14
- export interface LinkedDataPageTranslations {
15
- title: string;
16
- subtitle: string;
17
- export: ExportCardTranslations;
18
- import: ImportCardTranslations;
19
- progress: ImportProgressTranslations;
20
- }
21
-
22
- export interface LinkedDataPageProps {
23
- // Export
24
- onExport: () => void;
25
- isExporting: boolean;
26
-
27
- // Import
28
- onFileSelected: (file: File) => void;
29
- onImport: () => void;
30
- onCancelImport: () => void;
31
- selectedFile: File | null;
32
- preview: ImportCardProps['preview'];
33
- isImporting: boolean;
34
-
35
- // Progress
36
- importPhase: string | null;
37
- importMessage?: string | undefined;
38
- importResult?: Record<string, unknown> | undefined;
39
-
40
- // UI state
41
- theme: 'light' | 'dark' | 'system';
42
- activePanel: string | null;
43
-
44
- // Translations
45
- translations: LinkedDataPageTranslations;
46
-
47
- // Component dependencies
48
- ToolbarPanels: React.ComponentType<any>;
49
- Toolbar: React.ComponentType<any>;
50
- }
51
-
52
- export function LinkedDataPage({
53
- onExport,
54
- isExporting,
55
- onFileSelected,
56
- onImport,
57
- onCancelImport,
58
- selectedFile,
59
- preview,
60
- isImporting,
61
- importPhase,
62
- importMessage,
63
- importResult,
64
- theme,
65
- activePanel,
66
- translations: t,
67
- ToolbarPanels,
68
- Toolbar,
69
- }: LinkedDataPageProps) {
70
- return (
71
- <div className={`semiont-page${activePanel && COMMON_PANELS.includes(activePanel as ToolbarPanelType) ? ' semiont-page--panel-open' : ''}`}>
72
- <div className="semiont-page__content">
73
- <div className="semiont-page__header">
74
- <h1 className="semiont-page__title">{t.title}</h1>
75
- <p className="semiont-page__subtitle">{t.subtitle}</p>
76
- </div>
77
-
78
- <div className="semiont-exchange__cards">
79
- <ExportCard
80
- onExport={onExport}
81
- isExporting={isExporting}
82
- translations={t.export}
83
- />
84
-
85
- <ImportCard
86
- onFileSelected={onFileSelected}
87
- onImport={onImport}
88
- onCancel={onCancelImport}
89
- selectedFile={selectedFile}
90
- preview={preview}
91
- isImporting={isImporting}
92
- translations={t.import}
93
- />
94
- </div>
95
-
96
- {importPhase && (
97
- <ImportProgress
98
- phase={importPhase}
99
- message={importMessage}
100
- result={importResult}
101
- translations={t.progress}
102
- />
103
- )}
104
- </div>
105
-
106
- <div className="semiont-page__sidebar">
107
- <ToolbarPanels
108
- activePanel={activePanel}
109
- theme={theme}
110
- />
111
- <Toolbar
112
- context="simple"
113
- activePanel={activePanel}
114
- />
115
- </div>
116
- </div>
117
- );
118
- }
@@ -1,374 +0,0 @@
1
- /**
2
- * Exchange (Import/Export) Feature Styles
3
- */
4
-
5
- /* Cards layout */
6
- .semiont-exchange__cards {
7
- display: grid;
8
- grid-template-columns: 1fr 1fr;
9
- gap: 1.5rem;
10
- margin-bottom: 1.5rem;
11
- }
12
-
13
- @media (max-width: 768px) {
14
- .semiont-exchange__cards {
15
- grid-template-columns: 1fr;
16
- }
17
- }
18
-
19
- /* Form fields */
20
- .semiont-exchange__field {
21
- margin-bottom: 1rem;
22
- }
23
-
24
- .semiont-exchange__label {
25
- display: block;
26
- font-size: 0.875rem;
27
- font-weight: 500;
28
- color: var(--semiont-color-gray-700);
29
- margin-bottom: 0.375rem;
30
- }
31
-
32
- [data-theme="dark"] .semiont-exchange__label {
33
- color: var(--semiont-color-gray-300);
34
- }
35
-
36
- .semiont-exchange__checkbox-label {
37
- display: flex;
38
- align-items: center;
39
- gap: 0.5rem;
40
- font-size: 0.875rem;
41
- color: var(--semiont-color-gray-700);
42
- cursor: pointer;
43
- }
44
-
45
- [data-theme="dark"] .semiont-exchange__checkbox-label {
46
- color: var(--semiont-color-gray-300);
47
- }
48
-
49
- /* Buttons */
50
- .semiont-exchange__button {
51
- display: inline-flex;
52
- align-items: center;
53
- justify-content: center;
54
- padding: 0.5rem 1rem;
55
- font-size: 0.875rem;
56
- font-weight: 500;
57
- border-radius: 0.375rem;
58
- border: 1px solid transparent;
59
- cursor: pointer;
60
- transition: background-color var(--semiont-duration-fast),
61
- border-color var(--semiont-duration-fast);
62
- }
63
-
64
- .semiont-exchange__button:focus-visible {
65
- outline: 2px solid var(--semiont-color-primary-500);
66
- outline-offset: 2px;
67
- }
68
-
69
- .semiont-exchange__button:disabled {
70
- opacity: 0.5;
71
- cursor: not-allowed;
72
- }
73
-
74
- .semiont-exchange__button--primary {
75
- background-color: var(--semiont-color-blue-600);
76
- color: var(--semiont-color-white);
77
- }
78
-
79
- .semiont-exchange__button--primary:focus-visible {
80
- outline: 2px solid var(--semiont-color-blue-400);
81
- outline-offset: 2px;
82
- }
83
-
84
- .semiont-exchange__button--primary:hover:not(:disabled) {
85
- background-color: var(--semiont-color-blue-700);
86
- }
87
-
88
- [data-theme="dark"] .semiont-exchange__button--primary {
89
- background-color: var(--semiont-color-blue-500);
90
- }
91
-
92
- [data-theme="dark"] .semiont-exchange__button--primary:focus-visible {
93
- outline: 2px solid var(--semiont-color-blue-300);
94
- outline-offset: 2px;
95
- }
96
-
97
- [data-theme="dark"] .semiont-exchange__button--primary:hover:not(:disabled) {
98
- background-color: var(--semiont-color-blue-400);
99
- }
100
-
101
- .semiont-exchange__button--secondary {
102
- background-color: transparent;
103
- color: var(--semiont-color-gray-700);
104
- border-color: var(--semiont-color-gray-300);
105
- }
106
-
107
- .semiont-exchange__button--secondary:focus-visible {
108
- outline: 2px solid var(--semiont-color-primary-500);
109
- outline-offset: 2px;
110
- }
111
-
112
- .semiont-exchange__button--secondary:hover:not(:disabled) {
113
- background-color: var(--semiont-color-gray-100);
114
- }
115
-
116
- [data-theme="dark"] .semiont-exchange__button--secondary {
117
- color: var(--semiont-color-gray-300);
118
- border-color: var(--semiont-color-gray-600);
119
- }
120
-
121
- [data-theme="dark"] .semiont-exchange__button--secondary:focus-visible {
122
- outline: 2px solid var(--semiont-color-primary-400);
123
- outline-offset: 2px;
124
- }
125
-
126
- [data-theme="dark"] .semiont-exchange__button--secondary:hover:not(:disabled) {
127
- background-color: var(--semiont-color-gray-800);
128
- }
129
-
130
- /* Actions row */
131
- .semiont-exchange__actions {
132
- display: flex;
133
- gap: 0.75rem;
134
- margin-top: 1rem;
135
- }
136
-
137
- /* Dropzone */
138
- .semiont-exchange__dropzone {
139
- border: 2px dashed var(--semiont-color-gray-300);
140
- border-radius: 0.5rem;
141
- padding: 2rem;
142
- text-align: center;
143
- cursor: pointer;
144
- transition: border-color var(--semiont-duration-fast),
145
- background-color var(--semiont-duration-fast);
146
- margin-bottom: 1rem;
147
- }
148
-
149
- .semiont-exchange__dropzone:hover {
150
- border-color: var(--semiont-color-blue-400);
151
- background-color: var(--semiont-color-blue-50);
152
- }
153
-
154
- .semiont-exchange__dropzone--active {
155
- border-color: var(--semiont-color-blue-500);
156
- background-color: var(--semiont-color-blue-50);
157
- }
158
-
159
- [data-theme="dark"] .semiont-exchange__dropzone {
160
- border-color: var(--semiont-color-gray-600);
161
- }
162
-
163
- [data-theme="dark"] .semiont-exchange__dropzone:hover {
164
- border-color: var(--semiont-color-blue-500);
165
- background-color: rgba(59, 130, 246, 0.1);
166
- }
167
-
168
- [data-theme="dark"] .semiont-exchange__dropzone--active {
169
- border-color: var(--semiont-color-blue-400);
170
- background-color: rgba(59, 130, 246, 0.1);
171
- }
172
-
173
- .semiont-exchange__dropzone-text {
174
- font-size: 0.875rem;
175
- color: var(--semiont-color-gray-500);
176
- }
177
-
178
- [data-theme="dark"] .semiont-exchange__dropzone-text {
179
- color: var(--semiont-color-gray-400);
180
- }
181
-
182
- .semiont-exchange__file-info {
183
- margin-top: 0.5rem;
184
- font-size: 0.75rem;
185
- color: var(--semiont-color-gray-600);
186
- font-family: var(--semiont-font-mono);
187
- }
188
-
189
- [data-theme="dark"] .semiont-exchange__file-info {
190
- color: var(--semiont-color-gray-400);
191
- }
192
-
193
- /* Preview */
194
- .semiont-exchange__preview {
195
- background-color: var(--semiont-color-gray-50);
196
- border: 1px solid var(--semiont-color-gray-200);
197
- border-radius: 0.375rem;
198
- padding: 0.75rem;
199
- margin-bottom: 1rem;
200
- }
201
-
202
- [data-theme="dark"] .semiont-exchange__preview {
203
- background-color: var(--semiont-color-gray-800);
204
- border-color: var(--semiont-color-gray-700);
205
- }
206
-
207
- .semiont-exchange__preview-row {
208
- display: flex;
209
- justify-content: space-between;
210
- align-items: center;
211
- padding: 0.25rem 0;
212
- font-size: 0.8125rem;
213
- }
214
-
215
- .semiont-exchange__preview-row + .semiont-exchange__preview-row {
216
- border-top: 1px solid var(--semiont-color-gray-200);
217
- }
218
-
219
- [data-theme="dark"] .semiont-exchange__preview-row + .semiont-exchange__preview-row {
220
- border-color: var(--semiont-color-gray-700);
221
- }
222
-
223
- .semiont-exchange__preview-label {
224
- color: var(--semiont-color-gray-500);
225
- }
226
-
227
- [data-theme="dark"] .semiont-exchange__preview-label {
228
- color: var(--semiont-color-gray-400);
229
- }
230
-
231
- .semiont-exchange__preview-value {
232
- font-weight: 500;
233
- color: var(--semiont-color-gray-900);
234
- }
235
-
236
- [data-theme="dark"] .semiont-exchange__preview-value {
237
- color: var(--semiont-color-gray-100);
238
- }
239
-
240
- /* Confirmation dialog */
241
- .semiont-exchange__confirm {
242
- background-color: var(--semiont-color-orange-50);
243
- border: 1px solid var(--semiont-color-orange-200);
244
- border-radius: 0.375rem;
245
- padding: 1rem;
246
- margin-top: 1rem;
247
- }
248
-
249
- [data-theme="dark"] .semiont-exchange__confirm {
250
- background-color: rgba(251, 146, 60, 0.1);
251
- border-color: var(--semiont-color-orange-700);
252
- }
253
-
254
- .semiont-exchange__confirm-title {
255
- font-weight: 600;
256
- font-size: 0.875rem;
257
- color: var(--semiont-color-orange-800);
258
- margin-bottom: 0.25rem;
259
- }
260
-
261
- [data-theme="dark"] .semiont-exchange__confirm-title {
262
- color: var(--semiont-color-orange-300);
263
- }
264
-
265
- .semiont-exchange__confirm-message {
266
- font-size: 0.8125rem;
267
- color: var(--semiont-color-orange-700);
268
- margin-bottom: 0.75rem;
269
- }
270
-
271
- [data-theme="dark"] .semiont-exchange__confirm-message {
272
- color: var(--semiont-color-orange-400);
273
- }
274
-
275
- .semiont-exchange__confirm-actions {
276
- display: flex;
277
- gap: 0.5rem;
278
- }
279
-
280
- /* Progress */
281
- .semiont-exchange__progress {
282
- background-color: var(--semiont-bg-primary);
283
- border: 1px solid var(--semiont-color-gray-200);
284
- border-radius: 0.5rem;
285
- padding: 1.5rem;
286
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
287
- }
288
-
289
- [data-theme="dark"] .semiont-exchange__progress {
290
- background-color: var(--semiont-bg-secondary);
291
- border-color: var(--semiont-color-gray-700);
292
- }
293
-
294
- .semiont-exchange__phase-label {
295
- font-size: 1rem;
296
- font-weight: 600;
297
- color: var(--semiont-color-blue-600);
298
- }
299
-
300
- [data-theme="dark"] .semiont-exchange__phase-label {
301
- color: var(--semiont-color-blue-400);
302
- }
303
-
304
- .semiont-exchange__phase-label--complete {
305
- color: var(--semiont-color-green-600);
306
- }
307
-
308
- [data-theme="dark"] .semiont-exchange__phase-label--complete {
309
- color: var(--semiont-color-green-400);
310
- }
311
-
312
- .semiont-exchange__phase-label--error {
313
- color: var(--semiont-color-red-600);
314
- }
315
-
316
- [data-theme="dark"] .semiont-exchange__phase-label--error {
317
- color: var(--semiont-color-red-400);
318
- }
319
-
320
- .semiont-exchange__progress-message {
321
- font-size: 0.8125rem;
322
- color: var(--semiont-color-gray-600);
323
- margin-top: 0.5rem;
324
- }
325
-
326
- [data-theme="dark"] .semiont-exchange__progress-message {
327
- color: var(--semiont-color-gray-400);
328
- }
329
-
330
- /* Result stats */
331
- .semiont-exchange__result {
332
- display: flex;
333
- gap: 1.5rem;
334
- flex-wrap: wrap;
335
- margin-top: 1rem;
336
- }
337
-
338
- .semiont-exchange__result-stat {
339
- display: flex;
340
- flex-direction: column;
341
- align-items: center;
342
- }
343
-
344
- .semiont-exchange__result-value {
345
- font-size: 1.5rem;
346
- font-weight: 700;
347
- color: var(--semiont-color-gray-900);
348
- }
349
-
350
- [data-theme="dark"] .semiont-exchange__result-value {
351
- color: var(--semiont-color-white);
352
- }
353
-
354
- .semiont-exchange__result-label {
355
- font-size: 0.75rem;
356
- color: var(--semiont-color-gray-500);
357
- text-transform: uppercase;
358
- letter-spacing: 0.05em;
359
- }
360
-
361
- [data-theme="dark"] .semiont-exchange__result-label {
362
- color: var(--semiont-color-gray-400);
363
- }
364
-
365
- /* Error message */
366
- .semiont-exchange__error-message {
367
- font-size: 0.875rem;
368
- color: var(--semiont-color-red-600);
369
- margin-top: 0.5rem;
370
- }
371
-
372
- [data-theme="dark"] .semiont-exchange__error-message {
373
- color: var(--semiont-color-red-400);
374
- }