@osdk/react-devtools 0.12.0 → 0.12.1-main-e3a6fa4fb529f640175ebec3bec4c55bc8854f9c

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.
@@ -21,8 +21,10 @@ export { MonitoringPanel, SafeMonitoringPanel } from "./components/MonitoringPan
21
21
  export { OsdkAppErrorBoundary } from "./components/OsdkAppErrorBoundary.js";
22
22
  export { OsdkDevTools } from "./components/OsdkDevTools.js";
23
23
  export { useComputeMetrics, useComputeRecording, useComputeRequests } from "./hooks/useComputeSelectors.js";
24
+ export { useClientMetrics } from "./hooks/useClientMetrics.js";
24
25
  export { useMetrics } from "./hooks/useMetrics.js";
25
26
  export { usePersistedState } from "./hooks/usePersistedState.js";
27
+ export { getClientMetrics, MIN_SAMPLES } from "./metrics/clientMetrics.js";
26
28
  export { ComputeStore } from "./store/ComputeStore.js";
27
29
  export { MonitorStore } from "./store/MonitorStore.js";
28
30
  export { componentContextCapture } from "./utils/ComponentContextCapture.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["BubbleChart","MonitorErrorBoundary","MonitoringPanel","SafeMonitoringPanel","OsdkAppErrorBoundary","OsdkDevTools","useComputeMetrics","useComputeRecording","useComputeRequests","useMetrics","usePersistedState","ComputeStore","MonitorStore","componentContextCapture","ComputeMonitor"],"sources":["index.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport \"./register.js\";\n\nexport { BubbleChart } from \"./components/BubbleChart.js\";\nexport { MonitorErrorBoundary } from \"./components/MonitorErrorBoundary.js\";\nexport type { MonitorErrorBoundaryProps } from \"./components/MonitorErrorBoundary.js\";\nexport {\n MonitoringPanel,\n SafeMonitoringPanel,\n} from \"./components/MonitoringPanel.js\";\nexport type { MonitoringPanelProps } from \"./components/MonitoringPanel.js\";\nexport { OsdkAppErrorBoundary } from \"./components/OsdkAppErrorBoundary.js\";\nexport type { OsdkAppErrorBoundaryProps } from \"./components/OsdkAppErrorBoundary.js\";\nexport { OsdkDevTools } from \"./components/OsdkDevTools.js\";\n\nexport {\n useComputeMetrics,\n useComputeRecording,\n useComputeRequests,\n} from \"./hooks/useComputeSelectors.js\";\nexport { useMetrics } from \"./hooks/useMetrics.js\";\nexport { usePersistedState } from \"./hooks/usePersistedState.js\";\n\nexport type { Fiber } from \"./fiber/types.js\";\nexport { ComputeStore } from \"./store/ComputeStore.js\";\nexport { MonitorStore } from \"./store/MonitorStore.js\";\nexport { componentContextCapture } from \"./utils/ComponentContextCapture.js\";\nexport type {\n ComponentContext,\n ComponentContextCapture,\n} from \"./utils/ComponentContextCapture.js\";\nexport type { ComponentQueryRegistry } from \"./utils/ComponentQueryRegistry.js\";\nexport { ComputeMonitor } from \"./utils/ComputeMonitor.js\";\n\nexport type {\n AggregateMetrics,\n MetricRates,\n MetricsSnapshot,\n Operation,\n OperationMetadata,\n OperationType,\n PanelPosition,\n TimeSeriesData,\n} from \"./types/index.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,eAAe;AAEtB,SAASA,WAAW,QAAQ,6BAA6B;AACzD,SAASC,oBAAoB,QAAQ,sCAAsC;AAE3E,SACEC,eAAe,EACfC,mBAAmB,QACd,iCAAiC;AAExC,SAASC,oBAAoB,QAAQ,sCAAsC;AAE3E,SAASC,YAAY,QAAQ,8BAA8B;AAE3D,SACEC,iBAAiB,EACjBC,mBAAmB,EACnBC,kBAAkB,QACb,gCAAgC;AACvC,SAASC,UAAU,QAAQ,uBAAuB;AAClD,SAASC,iBAAiB,QAAQ,8BAA8B;AAGhE,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,uBAAuB,QAAQ,oCAAoC;AAM5E,SAASC,cAAc,QAAQ,2BAA2B","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["BubbleChart","MonitorErrorBoundary","MonitoringPanel","SafeMonitoringPanel","OsdkAppErrorBoundary","OsdkDevTools","useComputeMetrics","useComputeRecording","useComputeRequests","useClientMetrics","useMetrics","usePersistedState","getClientMetrics","MIN_SAMPLES","ComputeStore","MonitorStore","componentContextCapture","ComputeMonitor"],"sources":["index.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport \"./register.js\";\n\nexport { BubbleChart } from \"./components/BubbleChart.js\";\nexport { MonitorErrorBoundary } from \"./components/MonitorErrorBoundary.js\";\nexport type { MonitorErrorBoundaryProps } from \"./components/MonitorErrorBoundary.js\";\nexport {\n MonitoringPanel,\n SafeMonitoringPanel,\n} from \"./components/MonitoringPanel.js\";\nexport type { MonitoringPanelProps } from \"./components/MonitoringPanel.js\";\nexport { OsdkAppErrorBoundary } from \"./components/OsdkAppErrorBoundary.js\";\nexport type { OsdkAppErrorBoundaryProps } from \"./components/OsdkAppErrorBoundary.js\";\nexport { OsdkDevTools } from \"./components/OsdkDevTools.js\";\n\nexport {\n useComputeMetrics,\n useComputeRecording,\n useComputeRequests,\n} from \"./hooks/useComputeSelectors.js\";\nexport { useClientMetrics } from \"./hooks/useClientMetrics.js\";\nexport { useMetrics } from \"./hooks/useMetrics.js\";\nexport { usePersistedState } from \"./hooks/usePersistedState.js\";\n\nexport { getClientMetrics, MIN_SAMPLES } from \"./metrics/clientMetrics.js\";\nexport type { ClientMetrics, Metric } from \"./metrics/clientMetrics.js\";\n\nexport type { Fiber } from \"./fiber/types.js\";\nexport { ComputeStore } from \"./store/ComputeStore.js\";\nexport { MonitorStore } from \"./store/MonitorStore.js\";\nexport { componentContextCapture } from \"./utils/ComponentContextCapture.js\";\nexport type {\n ComponentContext,\n ComponentContextCapture,\n} from \"./utils/ComponentContextCapture.js\";\nexport type { ComponentQueryRegistry } from \"./utils/ComponentQueryRegistry.js\";\nexport { ComputeMonitor } from \"./utils/ComputeMonitor.js\";\n\nexport type {\n AggregateMetrics,\n MetricRates,\n MetricsSnapshot,\n Operation,\n OperationMetadata,\n OperationType,\n PanelPosition,\n TimeSeriesData,\n} from \"./types/index.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,eAAe;AAEtB,SAASA,WAAW,QAAQ,6BAA6B;AACzD,SAASC,oBAAoB,QAAQ,sCAAsC;AAE3E,SACEC,eAAe,EACfC,mBAAmB,QACd,iCAAiC;AAExC,SAASC,oBAAoB,QAAQ,sCAAsC;AAE3E,SAASC,YAAY,QAAQ,8BAA8B;AAE3D,SACEC,iBAAiB,EACjBC,mBAAmB,EACnBC,kBAAkB,QACb,gCAAgC;AACvC,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASC,UAAU,QAAQ,uBAAuB;AAClD,SAASC,iBAAiB,QAAQ,8BAA8B;AAEhE,SAASC,gBAAgB,EAAEC,WAAW,QAAQ,4BAA4B;AAI1E,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,uBAAuB,QAAQ,oCAAoC;AAM5E,SAASC,cAAc,QAAQ,2BAA2B","ignoreList":[]}
@@ -0,0 +1,87 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export const MIN_SAMPLES = {
18
+ cacheHitRate: 20,
19
+ latency: 5,
20
+ requestsSaved: 1,
21
+ optimisticCoverage: 3,
22
+ rollbackRate: 3
23
+ };
24
+ function metric(value, sampleCount, group, unit) {
25
+ const enough = sampleCount >= MIN_SAMPLES[group];
26
+ const safeValue = Number.isFinite(value) ? value : 0;
27
+ return {
28
+ value: enough ? safeValue : undefined,
29
+ sampleCount,
30
+ unit
31
+ };
32
+ }
33
+ export function getClientMetrics(snapshot) {
34
+ const a = snapshot.aggregates;
35
+ const hits = a.cacheHits;
36
+ const misses = a.cacheMisses;
37
+ const revals = a.revalidations;
38
+ const dedups = a.deduplications;
39
+ const actions = a.actionCount;
40
+ const optimisticActions = a.optimisticActionCount;
41
+ const rollbacks = a.rollbackActionCount;
42
+ const requestTotal = hits + misses + revals;
43
+ const cacheHitRate = metric(requestTotal > 0 ? (hits + revals) / requestTotal : 0, requestTotal, "cacheHitRate");
44
+ const requestsSavedCount = hits + revals + dedups;
45
+ const requestsSaved = metric(requestsSavedCount, requestsSavedCount, "requestsSaved", "requests");
46
+ const avgNetworkMs = metric(a.networkResponseTime / Math.max(misses, 1), misses, "latency", "ms");
47
+
48
+ // Derived from two other metrics, so it stays undefined until both of those
49
+ // have enough samples to be meaningful.
50
+ const timeSaved = requestsSaved.value !== undefined && avgNetworkMs.value !== undefined ? requestsSaved.value * avgNetworkMs.value : undefined;
51
+ const estimatedTimeSavedMs = {
52
+ value: timeSaved !== undefined && Number.isFinite(timeSaved) ? timeSaved : undefined,
53
+ sampleCount: requestsSavedCount,
54
+ unit: "ms"
55
+ };
56
+ const avgResponseMs = metric(requestTotal > 0 ? a.totalResponseTime / requestTotal : 0, requestTotal, "latency", "ms");
57
+ const avgCachedMs = metric(a.cachedResponseTime / Math.max(hits, 1), hits, "latency", "ms");
58
+ const optimisticCoverage = metric(actions > 0 ? optimisticActions / actions : 0, actions, "optimisticCoverage");
59
+ const avgPerceivedSpeedupMs = metric(a.totalPerceivedSpeedup / Math.max(optimisticActions, 1), optimisticActions, "latency", "ms");
60
+ const rollbackRate = metric(actions > 0 ? rollbacks / actions : 0, actions, "rollbackRate");
61
+ return {
62
+ cacheHitRate,
63
+ requestsSaved,
64
+ estimatedTimeSavedMs,
65
+ avgResponseMs,
66
+ avgCachedMs,
67
+ avgNetworkMs,
68
+ optimisticCoverage,
69
+ avgPerceivedSpeedupMs,
70
+ rollbackRate
71
+ };
72
+ }
73
+
74
+ /** Format a metric as a display string, or "N/A" until it has a value. */
75
+ export function formatMetric(m) {
76
+ if (m.value === undefined) {
77
+ return "N/A";
78
+ }
79
+ if (m.unit === "requests") {
80
+ return `${Math.round(m.value)}`;
81
+ }
82
+ if (m.unit === "ms") {
83
+ return `${Math.round(m.value)} ms`;
84
+ }
85
+ return `${Math.round(m.value * 100)}%`;
86
+ }
87
+ //# sourceMappingURL=clientMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clientMetrics.js","names":["MIN_SAMPLES","cacheHitRate","latency","requestsSaved","optimisticCoverage","rollbackRate","metric","value","sampleCount","group","unit","enough","safeValue","Number","isFinite","undefined","getClientMetrics","snapshot","a","aggregates","hits","cacheHits","misses","cacheMisses","revals","revalidations","dedups","deduplications","actions","actionCount","optimisticActions","optimisticActionCount","rollbacks","rollbackActionCount","requestTotal","requestsSavedCount","avgNetworkMs","networkResponseTime","Math","max","timeSaved","estimatedTimeSavedMs","avgResponseMs","totalResponseTime","avgCachedMs","cachedResponseTime","avgPerceivedSpeedupMs","totalPerceivedSpeedup","formatMetric","m","round"],"sources":["clientMetrics.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { MetricsSnapshot } from \"../types/index.js\";\n\nexport interface Metric {\n /** The computed value, or undefined until enough samples have accrued. */\n value: number | undefined;\n sampleCount: number;\n unit?: string;\n}\n\nexport interface ClientMetrics {\n cacheHitRate: Metric;\n requestsSaved: Metric;\n estimatedTimeSavedMs: Metric;\n avgResponseMs: Metric;\n avgCachedMs: Metric;\n avgNetworkMs: Metric;\n optimisticCoverage: Metric;\n avgPerceivedSpeedupMs: Metric;\n rollbackRate: Metric;\n}\n\nexport const MIN_SAMPLES = {\n cacheHitRate: 20,\n latency: 5,\n requestsSaved: 1,\n optimisticCoverage: 3,\n rollbackRate: 3,\n} as const;\n\ntype MinSamplesGroup = keyof typeof MIN_SAMPLES;\n\nfunction metric(\n value: number,\n sampleCount: number,\n group: MinSamplesGroup,\n unit?: string\n): Metric {\n const enough = sampleCount >= MIN_SAMPLES[group];\n const safeValue = Number.isFinite(value) ? value : 0;\n return {\n value: enough ? safeValue : undefined,\n sampleCount,\n unit,\n };\n}\n\nexport function getClientMetrics(snapshot: MetricsSnapshot): ClientMetrics {\n const a = snapshot.aggregates;\n const hits = a.cacheHits;\n const misses = a.cacheMisses;\n const revals = a.revalidations;\n const dedups = a.deduplications;\n const actions = a.actionCount;\n const optimisticActions = a.optimisticActionCount;\n const rollbacks = a.rollbackActionCount;\n\n const requestTotal = hits + misses + revals;\n\n const cacheHitRate = metric(\n requestTotal > 0 ? (hits + revals) / requestTotal : 0,\n requestTotal,\n \"cacheHitRate\"\n );\n\n const requestsSavedCount = hits + revals + dedups;\n const requestsSaved = metric(\n requestsSavedCount,\n requestsSavedCount,\n \"requestsSaved\",\n \"requests\"\n );\n\n const avgNetworkMs = metric(\n a.networkResponseTime / Math.max(misses, 1),\n misses,\n \"latency\",\n \"ms\"\n );\n\n // Derived from two other metrics, so it stays undefined until both of those\n // have enough samples to be meaningful.\n const timeSaved =\n requestsSaved.value !== undefined && avgNetworkMs.value !== undefined\n ? requestsSaved.value * avgNetworkMs.value\n : undefined;\n const estimatedTimeSavedMs: Metric = {\n value:\n timeSaved !== undefined && Number.isFinite(timeSaved)\n ? timeSaved\n : undefined,\n sampleCount: requestsSavedCount,\n unit: \"ms\",\n };\n\n const avgResponseMs = metric(\n requestTotal > 0 ? a.totalResponseTime / requestTotal : 0,\n requestTotal,\n \"latency\",\n \"ms\"\n );\n\n const avgCachedMs = metric(\n a.cachedResponseTime / Math.max(hits, 1),\n hits,\n \"latency\",\n \"ms\"\n );\n\n const optimisticCoverage = metric(\n actions > 0 ? optimisticActions / actions : 0,\n actions,\n \"optimisticCoverage\"\n );\n\n const avgPerceivedSpeedupMs = metric(\n a.totalPerceivedSpeedup / Math.max(optimisticActions, 1),\n optimisticActions,\n \"latency\",\n \"ms\"\n );\n\n const rollbackRate = metric(\n actions > 0 ? rollbacks / actions : 0,\n actions,\n \"rollbackRate\"\n );\n\n return {\n cacheHitRate,\n requestsSaved,\n estimatedTimeSavedMs,\n avgResponseMs,\n avgCachedMs,\n avgNetworkMs,\n optimisticCoverage,\n avgPerceivedSpeedupMs,\n rollbackRate,\n };\n}\n\n/** Format a metric as a display string, or \"N/A\" until it has a value. */\nexport function formatMetric(m: Metric): string {\n if (m.value === undefined) {\n return \"N/A\";\n }\n if (m.unit === \"requests\") {\n return `${Math.round(m.value)}`;\n }\n if (m.unit === \"ms\") {\n return `${Math.round(m.value)} ms`;\n }\n return `${Math.round(m.value * 100)}%`;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -18635,71 +18635,56 @@ a > .bp6-dark .bp6-tooltip .bp6-running-text code{
18635
18635
 
18636
18636
  .MonitoringPanel-module__content___ZVPMCH4O {
18637
18637
  flex: 1;
18638
- overflow: auto;
18638
+ min-height: 0;
18639
18639
  display: flex;
18640
18640
  flex-direction: column;
18641
18641
  pointer-events: auto;
18642
18642
  }
18643
18643
 
18644
+ .MonitoringPanel-module__notice___W3C3JBnI {
18645
+ width: auto;
18646
+ }
18647
+
18644
18648
  .MonitoringPanel-module__tabs___bqn6HDbz {
18649
+ flex: 1;
18650
+ min-width: 0;
18651
+ min-height: 0;
18645
18652
  display: flex;
18646
- gap: 0;
18653
+ flex-direction: column;
18654
+ background: var(--dt-bg-elevated);
18655
+ }
18656
+ .MonitoringPanel-module__tabs___bqn6HDbz .bp6-tab-list {
18657
+ flex-shrink: 0;
18658
+ padding: 4px 12px 0;
18647
18659
  border-bottom: 1px solid var(--dt-border-default);
18648
- background: transparent;
18649
18660
  overflow-x: auto;
18661
+ overflow-y: hidden;
18662
+ scrollbar-width: none;
18650
18663
  }
18651
- .MonitoringPanel-module__tabs___bqn6HDbz::-webkit-scrollbar {
18664
+ .MonitoringPanel-module__tabs___bqn6HDbz .bp6-tab-list::-webkit-scrollbar {
18665
+ display: none;
18666
+ }
18667
+
18668
+ .MonitoringPanel-module__tabPanel___fRtsspWk {
18669
+ flex: 1;
18670
+ min-height: 0;
18671
+ margin-top: 0;
18672
+ overflow: auto;
18673
+ }
18674
+ .MonitoringPanel-module__tabPanel___fRtsspWk::-webkit-scrollbar {
18652
18675
  width: 6px;
18653
18676
  }
18654
- .MonitoringPanel-module__tabs___bqn6HDbz::-webkit-scrollbar-track {
18677
+ .MonitoringPanel-module__tabPanel___fRtsspWk::-webkit-scrollbar-track {
18655
18678
  background: var(--dt-scrollbar-track);
18656
18679
  border-radius: 3px;
18657
18680
  }
18658
- .MonitoringPanel-module__tabs___bqn6HDbz::-webkit-scrollbar-thumb {
18681
+ .MonitoringPanel-module__tabPanel___fRtsspWk::-webkit-scrollbar-thumb {
18659
18682
  background: var(--dt-scrollbar-thumb);
18660
18683
  border-radius: 3px;
18661
18684
  }
18662
- .MonitoringPanel-module__tabs___bqn6HDbz::-webkit-scrollbar-thumb:hover {
18685
+ .MonitoringPanel-module__tabPanel___fRtsspWk::-webkit-scrollbar-thumb:hover {
18663
18686
  background: var(--dt-scrollbar-thumb-hover);
18664
18687
  }
18665
- .MonitoringPanel-module__tabs___bqn6HDbz {
18666
- padding: 0 12px;
18667
- flex-shrink: 0;
18668
- pointer-events: auto;
18669
- }
18670
-
18671
- .MonitoringPanel-module__tabButton___cjPGg0FS {
18672
- background: transparent;
18673
- border: none;
18674
- border-bottom: 2px solid transparent;
18675
- color: var(--dt-text-tertiary);
18676
- font-size: 11px;
18677
- font-weight: 600;
18678
- letter-spacing: 0.05em;
18679
- text-transform: uppercase;
18680
- padding: 8px 12px 6px;
18681
- margin-bottom: -1px;
18682
- cursor: pointer;
18683
- transition: color 0.12s ease-out, border-color 0.12s ease-out;
18684
- white-space: nowrap;
18685
- flex-shrink: 0;
18686
- }
18687
- .MonitoringPanel-module__tabButton___cjPGg0FS:hover {
18688
- color: var(--dt-text-secondary);
18689
- }
18690
-
18691
- .MonitoringPanel-module__tabButtonActive___gEhlfE4y {
18692
- color: var(--dt-blue);
18693
- border-bottom-color: var(--dt-blue);
18694
- }
18695
-
18696
- .MonitoringPanel-module__tabContentVisible___llXLpVeb {
18697
- display: contents;
18698
- }
18699
-
18700
- .MonitoringPanel-module__tabContentHidden___Hm4ckAQm {
18701
- display: none;
18702
- }
18703
18688
 
18704
18689
  .MonitoringPanel-module__metricsGrid___Ui5kYWKE {
18705
18690
  display: flex;