@ltm-blueverse/alpha-semantic-hub 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.
Files changed (146) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1674 -0
  3. package/explorer/README.md +282 -0
  4. package/explorer/src/App.css +0 -0
  5. package/explorer/src/App.tsx +2035 -0
  6. package/explorer/src/ErrorBoundary.tsx +112 -0
  7. package/explorer/src/ExploreWorkspaceTabs.tsx +29 -0
  8. package/explorer/src/assets/hero.png +0 -0
  9. package/explorer/src/assets/react.svg +1 -0
  10. package/explorer/src/assets/vite.svg +1 -0
  11. package/explorer/src/explorerCapabilities.ts +24 -0
  12. package/explorer/src/index.css +71 -0
  13. package/explorer/src/main.tsx +7 -0
  14. package/explorer/src/store/edgePairKeys.d.ts +2 -0
  15. package/explorer/src/store/edgePairKeys.js +7 -0
  16. package/explorer/src/store/graphStore.ts +183 -0
  17. package/explorer/src/store/registryStore.ts +78 -0
  18. package/explorer/src/types.d.ts +16 -0
  19. package/explorer/src/ui/primitives.css +414 -0
  20. package/explorer/src/ui/primitives.tsx +170 -0
  21. package/explorer/src/workspaces/DecisionWorkspace/DecisionWorkspace.tsx +279 -0
  22. package/explorer/src/workspaces/DiffMergeWorkspace/DiffMergeWorkspace.tsx +121 -0
  23. package/explorer/src/workspaces/EnrichWorkspace/EntityResolutionTab.tsx +454 -0
  24. package/explorer/src/workspaces/EnrichWorkspace/RegistryTab.tsx +285 -0
  25. package/explorer/src/workspaces/GraphWorkspace/GraphCanvas.tsx +2673 -0
  26. package/explorer/src/workspaces/GraphWorkspace/GraphInspectorPanel.tsx +771 -0
  27. package/explorer/src/workspaces/GraphWorkspace/GraphLoadingOverlay.tsx +410 -0
  28. package/explorer/src/workspaces/GraphWorkspace/GraphWorkspace.tsx +3584 -0
  29. package/explorer/src/workspaces/GraphWorkspace/MarkdownContentViewer.tsx +705 -0
  30. package/explorer/src/workspaces/GraphWorkspace/SigmaSceneAdapter.tsx +55 -0
  31. package/explorer/src/workspaces/GraphWorkspace/TimelinePanel.tsx +193 -0
  32. package/explorer/src/workspaces/GraphWorkspace/behaviors/clickSelectionBehavior.ts +29 -0
  33. package/explorer/src/workspaces/GraphWorkspace/behaviors/fitViewBehavior.ts +15 -0
  34. package/explorer/src/workspaces/GraphWorkspace/behaviors/focusCameraBehavior.ts +25 -0
  35. package/explorer/src/workspaces/GraphWorkspace/behaviors/hoverActivationBehavior.ts +15 -0
  36. package/explorer/src/workspaces/GraphWorkspace/behaviors/pathHighlightBehavior.ts +52 -0
  37. package/explorer/src/workspaces/GraphWorkspace/behaviors/searchFocusBehavior.ts +36 -0
  38. package/explorer/src/workspaces/GraphWorkspace/behaviors/types.ts +41 -0
  39. package/explorer/src/workspaces/GraphWorkspace/behaviors/viewModeSwitchBehavior.ts +29 -0
  40. package/explorer/src/workspaces/GraphWorkspace/graphAnalytics.ts +779 -0
  41. package/explorer/src/workspaces/GraphWorkspace/graphColorLegend.ts +36 -0
  42. package/explorer/src/workspaces/GraphWorkspace/graphConfig.ts +102 -0
  43. package/explorer/src/workspaces/GraphWorkspace/graphEntityShape.ts +34 -0
  44. package/explorer/src/workspaces/GraphWorkspace/graphLoading.ts +84 -0
  45. package/explorer/src/workspaces/GraphWorkspace/graphSceneLayers.ts +775 -0
  46. package/explorer/src/workspaces/GraphWorkspace/graphSceneState.ts +2753 -0
  47. package/explorer/src/workspaces/GraphWorkspace/graphStructureLayer.ts +335 -0
  48. package/explorer/src/workspaces/GraphWorkspace/graphTheme.ts +1078 -0
  49. package/explorer/src/workspaces/GraphWorkspace/graphViewCopy.ts +41 -0
  50. package/explorer/src/workspaces/GraphWorkspace/localGraphTransition.ts +9 -0
  51. package/explorer/src/workspaces/GraphWorkspace/markdownEditorState.ts +114 -0
  52. package/explorer/src/workspaces/GraphWorkspace/markdownResourceClient.ts +103 -0
  53. package/explorer/src/workspaces/GraphWorkspace/markdownUrlSafety.ts +29 -0
  54. package/explorer/src/workspaces/GraphWorkspace/nodeMarkdownSync.ts +81 -0
  55. package/explorer/src/workspaces/GraphWorkspace/pluginRegistryPredicates.ts +24 -0
  56. package/explorer/src/workspaces/GraphWorkspace/plugins/explorationEffectsPlugin.tsx +353 -0
  57. package/explorer/src/workspaces/GraphWorkspace/plugins/explorationEffectsPluginPhaseC.tsx +522 -0
  58. package/explorer/src/workspaces/GraphWorkspace/plugins/index.ts +16 -0
  59. package/explorer/src/workspaces/GraphWorkspace/plugins/legendPlugin.tsx +120 -0
  60. package/explorer/src/workspaces/GraphWorkspace/plugins/neighborhoodPanelPlugin.tsx +231 -0
  61. package/explorer/src/workspaces/GraphWorkspace/plugins/temporalOverlayPlugin.tsx +142 -0
  62. package/explorer/src/workspaces/GraphWorkspace/plugins/types.ts +106 -0
  63. package/explorer/src/workspaces/GraphWorkspace/realtimeGraphAttributes.ts +50 -0
  64. package/explorer/src/workspaces/GraphWorkspace/scene.ts +79 -0
  65. package/explorer/src/workspaces/GraphWorkspace/sigmaNativeRendering.ts +421 -0
  66. package/explorer/src/workspaces/GraphWorkspace/smallGraphLayout.ts +135 -0
  67. package/explorer/src/workspaces/GraphWorkspace/temporalLifecyclePredicates.ts +31 -0
  68. package/explorer/src/workspaces/GraphWorkspace/temporalScrubberBounds.ts +46 -0
  69. package/explorer/src/workspaces/GraphWorkspace/temporalSnapshotGuards.ts +113 -0
  70. package/explorer/src/workspaces/GraphWorkspace/types.ts +395 -0
  71. package/explorer/src/workspaces/GraphWorkspace/useLoadGraph.ts +746 -0
  72. package/explorer/src/workspaces/GraphWorkspace/useMarkdownEditor.ts +177 -0
  73. package/explorer/src/workspaces/ImportExportWorkspace/ImportExportWorkspace.tsx +196 -0
  74. package/explorer/src/workspaces/LineageWorkspace/LineageDiagram.tsx +177 -0
  75. package/explorer/src/workspaces/ManageWorkspace/KGOverviewTab.tsx +291 -0
  76. package/explorer/src/workspaces/ManageWorkspace/OntologySummaryTab.tsx +346 -0
  77. package/explorer/src/workspaces/MemoryWorkspace.tsx +464 -0
  78. package/explorer/src/workspaces/OntologyWorkspace/AlignmentsTab.tsx +437 -0
  79. package/explorer/src/workspaces/OntologyWorkspace/HealthTab.tsx +214 -0
  80. package/explorer/src/workspaces/OntologyWorkspace/OntologyEditor.tsx +770 -0
  81. package/explorer/src/workspaces/OntologyWorkspace/OntologyLoader.tsx +913 -0
  82. package/explorer/src/workspaces/OntologyWorkspace/OntologyManager.tsx +930 -0
  83. package/explorer/src/workspaces/OntologyWorkspace/OntologySearch.tsx +590 -0
  84. package/explorer/src/workspaces/OntologyWorkspace/ProposalReview.tsx +429 -0
  85. package/explorer/src/workspaces/OntologyWorkspace/SKOSVocabularyManager.tsx +696 -0
  86. package/explorer/src/workspaces/OntologyWorkspace/ShaclStudio.tsx +363 -0
  87. package/explorer/src/workspaces/OntologyWorkspace/VersionsTab.tsx +546 -0
  88. package/explorer/src/workspaces/OntologyWorkspace/api.ts +164 -0
  89. package/explorer/src/workspaces/OntologyWorkspace/index.tsx +101 -0
  90. package/explorer/src/workspaces/OntologyWorkspace/ontologyEditorModel.ts +87 -0
  91. package/explorer/src/workspaces/OntologyWorkspace/ontologyUrlState.ts +94 -0
  92. package/explorer/src/workspaces/OntologyWorkspace/types.ts +119 -0
  93. package/explorer/src/workspaces/ReasoningWorkspace.tsx +243 -0
  94. package/explorer/src/workspaces/SparqlWorkspace/SparqlWorkspace.tsx +271 -0
  95. package/explorer/src/workspaces/VocabularyWorkspace/ConceptTree.tsx +97 -0
  96. package/explorer/src/workspaces/VocabularyWorkspace/ImportDropzone.tsx +95 -0
  97. package/explorer/src/workspaces/VocabularyWorkspace/PropertyPanel.tsx +116 -0
  98. package/explorer/src/workspaces/VocabularyWorkspace/Sidebar.tsx +112 -0
  99. package/explorer/src/workspaces/VocabularyWorkspace/VocabularyWorkspace.tsx +70 -0
  100. package/explorer/src/workspaces/VocabularyWorkspace/queries.ts +52 -0
  101. package/explorer/src/workspaces/VocabularyWorkspace/types.ts +24 -0
  102. package/package.json +31 -0
  103. package/plugins/.claude-plugin/README.md +262 -0
  104. package/plugins/.claude-plugin/marketplace.json +20 -0
  105. package/plugins/.claude-plugin/plugin.json +33 -0
  106. package/plugins/.cline-plugin/README.md +32 -0
  107. package/plugins/.cline-plugin/marketplace.json +17 -0
  108. package/plugins/.cline-plugin/plugin.json +35 -0
  109. package/plugins/.codex-plugin/marketplace.json +21 -0
  110. package/plugins/.codex-plugin/plugin.json +35 -0
  111. package/plugins/.continue-plugin/README.md +34 -0
  112. package/plugins/.continue-plugin/marketplace.json +17 -0
  113. package/plugins/.continue-plugin/plugin.json +33 -0
  114. package/plugins/.cursor-plugin/marketplace.json +18 -0
  115. package/plugins/.cursor-plugin/plugin.json +32 -0
  116. package/plugins/.openclaw-plugin/README.md +62 -0
  117. package/plugins/.openclaw-plugin/marketplace.json +18 -0
  118. package/plugins/.openclaw-plugin/plugin.json +46 -0
  119. package/plugins/.pi-plugin/README.md +35 -0
  120. package/plugins/.vscode-plugin/README.md +48 -0
  121. package/plugins/.vscode-plugin/marketplace.json +17 -0
  122. package/plugins/.vscode-plugin/plugin.json +35 -0
  123. package/plugins/.windsurf-plugin/README.md +39 -0
  124. package/plugins/.windsurf-plugin/marketplace.json +17 -0
  125. package/plugins/.windsurf-plugin/plugin.json +35 -0
  126. package/plugins/agents/decision-advisor.md +126 -0
  127. package/plugins/agents/explainability.md +129 -0
  128. package/plugins/agents/kg-assistant.md +73 -0
  129. package/plugins/hooks/hooks.json +12 -0
  130. package/plugins/skills/causal/SKILL.md +74 -0
  131. package/plugins/skills/change/SKILL.md +80 -0
  132. package/plugins/skills/decision/SKILL.md +197 -0
  133. package/plugins/skills/deduplicate/SKILL.md +41 -0
  134. package/plugins/skills/embed/SKILL.md +230 -0
  135. package/plugins/skills/explain/SKILL.md +44 -0
  136. package/plugins/skills/export/SKILL.md +67 -0
  137. package/plugins/skills/extract/SKILL.md +93 -0
  138. package/plugins/skills/ingest/SKILL.md +38 -0
  139. package/plugins/skills/ontology/SKILL.md +89 -0
  140. package/plugins/skills/policy/SKILL.md +66 -0
  141. package/plugins/skills/provenance/SKILL.md +70 -0
  142. package/plugins/skills/query/SKILL.md +84 -0
  143. package/plugins/skills/reason/SKILL.md +201 -0
  144. package/plugins/skills/temporal/SKILL.md +164 -0
  145. package/plugins/skills/validate/SKILL.md +228 -0
  146. package/plugins/skills/visualize/SKILL.md +249 -0
@@ -0,0 +1,285 @@
1
+ /**
2
+ * src/workspaces/EnrichWorkspace/RegistryTab.tsx
3
+ *
4
+ * Document Registry — a live, filterable chronological audit log of every
5
+ * KG / Ontology mutation that occurred in this session.
6
+ */
7
+ import { useState } from "react";
8
+ import { ClipboardList, Filter, Trash2, ChevronDown, ChevronRight } from "lucide-react";
9
+ import { useRegistry, clearRegistry, type RegistryEntryOp } from "../../store/registryStore";
10
+
11
+ const OP_META: Record<
12
+ RegistryEntryOp,
13
+ { label: string; color: string; bg: string; border: string }
14
+ > = {
15
+ import: { label: "IMPORT", color: "#ff2d4b", bg: "rgba(255,45,75,0.12)", border: "rgba(255,45,75,0.28)" },
16
+ export: { label: "EXPORT", color: "#c99aa3", bg: "rgba(143,168,198,0.08)", border: "rgba(143,168,198,0.18)" },
17
+ merge: { label: "MERGE", color: "#ff7a45", bg: "rgba(242,182,109,0.12)", border: "rgba(242,182,109,0.28)" },
18
+ "add-node": { label: "ADD NODE", color: "#4cc38a", bg: "rgba(76,195,138,0.12)", border: "rgba(76,195,138,0.28)" },
19
+ "update-node": { label: "UPDATE NODE", color: "#ff8fa0", bg: "rgba(121,192,255,0.10)", border: "rgba(121,192,255,0.24)" },
20
+ "add-edge": { label: "ADD EDGE", color: "#4cc38a", bg: "rgba(76,195,138,0.10)", border: "rgba(76,195,138,0.22)" },
21
+ delete: { label: "DELETE", color: "#ff7b72", bg: "rgba(255,123,114,0.12)", border: "rgba(255,123,114,0.28)" },
22
+ infer: { label: "INFER", color: "#d2a8ff", bg: "rgba(210,168,255,0.12)", border: "rgba(210,168,255,0.28)" },
23
+ "vocab-import": { label: "VOCAB", color: "#ff8fa0", bg: "rgba(121,192,255,0.12)", border: "rgba(121,192,255,0.28)" },
24
+ };
25
+
26
+ const ALL_OPS: (RegistryEntryOp | "all")[] = [
27
+ "all", "import", "export", "merge", "add-node", "update-node", "add-edge", "infer", "delete", "vocab-import",
28
+ ];
29
+
30
+ function formatTimestamp(date: Date): string {
31
+ return date.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit", second: "2-digit" });
32
+ }
33
+
34
+ function formatDate(date: Date): string {
35
+ return date.toLocaleDateString(undefined, { month: "short", day: "numeric" });
36
+ }
37
+
38
+ function EntryRow({ entry }: { entry: ReturnType<typeof useRegistry>[number] }) {
39
+ const [expanded, setExpanded] = useState(false);
40
+ const meta = OP_META[entry.op];
41
+ const hasDetail = entry.detail && Object.keys(entry.detail).length > 0;
42
+
43
+ return (
44
+ <div style={entryCardStyle}>
45
+ <div style={{ display: "flex", alignItems: "flex-start", gap: 12 }}>
46
+ {/* Op Badge */}
47
+ <span
48
+ style={{
49
+ flexShrink: 0,
50
+ display: "inline-block",
51
+ padding: "3px 8px",
52
+ borderRadius: 999,
53
+ fontSize: 10,
54
+ fontWeight: 800,
55
+ letterSpacing: "0.07em",
56
+ color: meta.color,
57
+ background: meta.bg,
58
+ border: `1px solid ${meta.border}`,
59
+ marginTop: 1,
60
+ }}
61
+ >
62
+ {meta.label}
63
+ </span>
64
+
65
+ {/* Content */}
66
+ <div style={{ flex: 1, minWidth: 0 }}>
67
+ <div style={{ color: "#ffeaed", fontSize: 13, fontWeight: 500, wordBreak: "break-word" }}>
68
+ {entry.summary}
69
+ </div>
70
+ <div style={{ color: "#b08b93", fontSize: 11, marginTop: 3 }}>
71
+ {formatDate(entry.timestamp)} · {formatTimestamp(entry.timestamp)}
72
+ </div>
73
+ </div>
74
+
75
+ {/* Expand toggle */}
76
+ {hasDetail ? (
77
+ <button
78
+ onClick={() => setExpanded((v) => !v)}
79
+ title={expanded ? "Collapse details" : "Expand details"}
80
+ style={expandBtnStyle}
81
+ >
82
+ {expanded ? <ChevronDown size={14} /> : <ChevronRight size={14} />}
83
+ </button>
84
+ ) : null}
85
+ </div>
86
+
87
+ {/* Expanded detail */}
88
+ {expanded && hasDetail ? (
89
+ <pre style={detailPreStyle}>
90
+ {JSON.stringify(entry.detail, null, 2)}
91
+ </pre>
92
+ ) : null}
93
+ </div>
94
+ );
95
+ }
96
+
97
+ export function RegistryTab() {
98
+ const entries = useRegistry();
99
+ const [activeFilter, setActiveFilter] = useState<RegistryEntryOp | "all">("all");
100
+
101
+ const filtered = activeFilter === "all"
102
+ ? entries
103
+ : entries.filter((e) => e.op === activeFilter);
104
+
105
+ return (
106
+ <div style={shellStyle}>
107
+ {/* Header */}
108
+ <div style={headerStyle}>
109
+ <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
110
+ <ClipboardList size={18} color="#ff2d4b" />
111
+ <div>
112
+ <div style={{ color: "#fff0f2", fontSize: 16, fontWeight: 700 }}>Document Registry</div>
113
+ <div style={{ color: "#b08b93", fontSize: 12 }}>
114
+ Audit log of all KG and Ontology mutations this session
115
+ </div>
116
+ </div>
117
+ </div>
118
+ <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
119
+ <span style={{ color: "#c99aa3", fontSize: 12 }}>
120
+ {entries.length} event{entries.length !== 1 ? "s" : ""}
121
+ </span>
122
+ {entries.length > 0 ? (
123
+ <button
124
+ onClick={clearRegistry}
125
+ title="Clear all events"
126
+ style={clearBtnStyle}
127
+ >
128
+ <Trash2 size={13} />
129
+ <span>Clear</span>
130
+ </button>
131
+ ) : null}
132
+ </div>
133
+ </div>
134
+
135
+ {/* Filter pills */}
136
+ <div style={filterBarStyle}>
137
+ <Filter size={13} color="#c99aa3" />
138
+ <div style={{ display: "flex", gap: 6, flexWrap: "wrap" }}>
139
+ {ALL_OPS.map((op) => {
140
+ const isActive = op === activeFilter;
141
+ const meta = op === "all" ? null : OP_META[op as RegistryEntryOp];
142
+ return (
143
+ <button
144
+ key={op}
145
+ onClick={() => setActiveFilter(op as typeof activeFilter)}
146
+ style={{
147
+ padding: "4px 10px",
148
+ borderRadius: 999,
149
+ fontSize: 11,
150
+ fontWeight: 600,
151
+ cursor: "pointer",
152
+ border: isActive
153
+ ? `1px solid ${meta?.border ?? "rgba(255,107,129,0.35)"}`
154
+ : "1px solid rgba(255,255,255,0.06)",
155
+ background: isActive
156
+ ? (meta?.bg ?? "rgba(255,45,75,0.14)")
157
+ : "transparent",
158
+ color: isActive
159
+ ? (meta?.color ?? "#8ed3ff")
160
+ : "#b08b93",
161
+ transition: "all 140ms ease",
162
+ }}
163
+ >
164
+ {op === "all" ? "All" : (meta?.label ?? op)}
165
+ </button>
166
+ );
167
+ })}
168
+ </div>
169
+ </div>
170
+
171
+ {/* Feed */}
172
+ <div style={feedStyle}>
173
+ {filtered.length === 0 ? (
174
+ <div style={emptyStateStyle}>
175
+ <ClipboardList size={36} color="rgba(255,107,129,0.15)" />
176
+ <div style={{ color: "#b08b93", fontSize: 14, marginTop: 12, fontWeight: 500 }}>
177
+ No events recorded yet
178
+ </div>
179
+ <div style={{ color: "#9c7a82", fontSize: 12, marginTop: 4, textAlign: "center", maxWidth: 300 }}>
180
+ Import a file, run reasoning, or merge entities to see activity appear here.
181
+ </div>
182
+ </div>
183
+ ) : (
184
+ filtered.map((entry) => <EntryRow key={entry.id} entry={entry} />)
185
+ )}
186
+ </div>
187
+ </div>
188
+ );
189
+ }
190
+
191
+ /* ─── styles ─────────────────────────────────────────────────────── */
192
+
193
+ const shellStyle: React.CSSProperties = {
194
+ display: "flex",
195
+ flexDirection: "column",
196
+ width: "100%",
197
+ height: "100%",
198
+ background: "#0a0508",
199
+ overflow: "hidden",
200
+ };
201
+
202
+ const headerStyle: React.CSSProperties = {
203
+ display: "flex",
204
+ alignItems: "center",
205
+ justifyContent: "space-between",
206
+ padding: "20px 24px 16px",
207
+ borderBottom: "1px solid rgba(255,45,75,0.1)",
208
+ flexShrink: 0,
209
+ };
210
+
211
+ const filterBarStyle: React.CSSProperties = {
212
+ display: "flex",
213
+ alignItems: "center",
214
+ gap: 10,
215
+ padding: "12px 24px",
216
+ borderBottom: "1px solid rgba(255,255,255,0.05)",
217
+ flexShrink: 0,
218
+ };
219
+
220
+ const feedStyle: React.CSSProperties = {
221
+ flex: 1,
222
+ overflowY: "auto",
223
+ padding: "16px 24px",
224
+ display: "flex",
225
+ flexDirection: "column",
226
+ gap: 8,
227
+ };
228
+
229
+ const entryCardStyle: React.CSSProperties = {
230
+ padding: "12px 14px",
231
+ borderRadius: 12,
232
+ background: "linear-gradient(135deg, rgba(13,17,23,0.6), rgba(22,27,34,0.4))",
233
+ border: "1px solid rgba(255,255,255,0.06)",
234
+ boxShadow: "inset 0 1px 0 rgba(255,255,255,0.03)",
235
+ };
236
+
237
+ const expandBtnStyle: React.CSSProperties = {
238
+ flexShrink: 0,
239
+ background: "transparent",
240
+ border: "none",
241
+ color: "#b08b93",
242
+ cursor: "pointer",
243
+ padding: 4,
244
+ borderRadius: 6,
245
+ display: "flex",
246
+ alignItems: "center",
247
+ };
248
+
249
+ const detailPreStyle: React.CSSProperties = {
250
+ marginTop: 10,
251
+ padding: "10px 12px",
252
+ borderRadius: 8,
253
+ background: "rgba(0,0,0,0.28)",
254
+ border: "1px solid rgba(255,255,255,0.06)",
255
+ color: "#ff8fa0",
256
+ fontSize: 11,
257
+ fontFamily: "'JetBrains Mono', monospace",
258
+ overflowX: "auto",
259
+ whiteSpace: "pre-wrap",
260
+ wordBreak: "break-all",
261
+ };
262
+
263
+ const clearBtnStyle: React.CSSProperties = {
264
+ display: "inline-flex",
265
+ alignItems: "center",
266
+ gap: 5,
267
+ padding: "5px 10px",
268
+ borderRadius: 8,
269
+ border: "1px solid rgba(255,123,114,0.22)",
270
+ background: "rgba(255,123,114,0.06)",
271
+ color: "#ff7b72",
272
+ fontSize: 12,
273
+ fontWeight: 600,
274
+ cursor: "pointer",
275
+ };
276
+
277
+ const emptyStateStyle: React.CSSProperties = {
278
+ flex: 1,
279
+ display: "flex",
280
+ flexDirection: "column",
281
+ alignItems: "center",
282
+ justifyContent: "center",
283
+ padding: 40,
284
+ minHeight: 280,
285
+ };