astryx-dracula 0.5.0 → 0.6.2
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/BRAND.md +3 -3
- package/README.md +7 -4
- package/USAGE.md +49 -49
- package/astryx-dracula.d.ts +2 -2
- package/astryx-dracula.js +25 -9
- package/astryx-dracula.variants.d.ts +2 -2
- package/astryx.integration.mjs +1 -1
- package/icons.mjs +21 -17
- package/icons.tsx +69 -62
- package/package.json +125 -120
- package/shared/auth-chrome-config.ts +6 -6
- package/shared/auth-chrome.tsx +143 -144
- package/shared/auth-copy.ts +14 -14
- package/shared/chaptered-doc-config.ts +48 -51
- package/shared/chaptered-doc.tsx +267 -289
- package/shared/chart-hues.ts +25 -10
- package/shared/chart-labels.tsx +31 -30
- package/shared/chart-legend.tsx +55 -56
- package/shared/chart-panel-style.ts +3 -3
- package/shared/data-bar.tsx +97 -102
- package/shared/format-money.ts +1 -1
- package/shared/gallery-image.ts +6 -6
- package/shared/login-demo.ts +1 -1
- package/shared/metric-card.tsx +101 -105
- package/shared/metric-delta.tsx +28 -27
- package/shared/order-desk.tsx +205 -216
- package/shared/revenue-chart.tsx +145 -165
- package/shared/scene-castle.tsx +206 -291
- package/shared/scene-frame.tsx +33 -32
- package/shared/scene-hues.ts +17 -17
- package/shared/scene-tile.tsx +88 -92
- package/shared/settings-data.ts +119 -125
- package/shared/settings-rows.tsx +122 -159
- package/shared/sparkline.tsx +75 -88
- package/shared/sso-icons.tsx +10 -22
- package/shared/stars.tsx +16 -25
- package/templates/ai-chat-landing.template.mjs +5 -4
- package/templates/ai-chat-landing.tsx +473 -460
- package/templates/ai-chat.template.mjs +5 -4
- package/templates/ai-chat.tsx +543 -612
- package/templates/blank.template.mjs +5 -4
- package/templates/blank.tsx +18 -14
- package/templates/centered-hero.template.mjs +5 -4
- package/templates/centered-hero.tsx +55 -68
- package/templates/classic-gallery.template.mjs +5 -4
- package/templates/classic-gallery.tsx +97 -104
- package/templates/contact-form.template.mjs +5 -4
- package/templates/contact-form.tsx +247 -282
- package/templates/dashboard-portfolio.template.mjs +5 -4
- package/templates/dashboard-portfolio.tsx +717 -548
- package/templates/dashboard.template.mjs +5 -4
- package/templates/dashboard.tsx +596 -567
- package/templates/detail-page.template.mjs +5 -4
- package/templates/detail-page.tsx +546 -603
- package/templates/documentation-design.template.mjs +5 -4
- package/templates/documentation-design.tsx +231 -243
- package/templates/documentation-technical.template.mjs +5 -4
- package/templates/documentation-technical.tsx +236 -239
- package/templates/documentation.template.mjs +5 -4
- package/templates/documentation.tsx +267 -279
- package/templates/editor.template.mjs +5 -4
- package/templates/editor.tsx +844 -877
- package/templates/file-explorer.template.mjs +5 -4
- package/templates/file-explorer.tsx +566 -590
- package/templates/form-two-column.template.mjs +5 -4
- package/templates/form-two-column.tsx +195 -210
- package/templates/gallery-hero.template.mjs +5 -4
- package/templates/gallery-hero.tsx +93 -114
- package/templates/ide.template.mjs +5 -4
- package/templates/ide.tsx +407 -453
- package/templates/incident-console.template.mjs +5 -4
- package/templates/incident-console.tsx +593 -575
- package/templates/kanban-board.template.mjs +5 -4
- package/templates/kanban-board.tsx +665 -683
- package/templates/library.template.mjs +5 -4
- package/templates/library.tsx +409 -430
- package/templates/login-card.template.mjs +5 -4
- package/templates/login-card.tsx +63 -72
- package/templates/login-split.template.mjs +5 -4
- package/templates/login-split.tsx +192 -193
- package/templates/login-sso.template.mjs +5 -4
- package/templates/login-sso.tsx +257 -258
- package/templates/login.template.mjs +5 -4
- package/templates/login.tsx +53 -49
- package/templates/messaging-shell.template.mjs +5 -4
- package/templates/messaging-shell.tsx +556 -574
- package/templates/mixed-gallery.template.mjs +5 -4
- package/templates/mixed-gallery.tsx +60 -58
- package/templates/payment-form.template.mjs +5 -4
- package/templates/payment-form.tsx +882 -991
- package/templates/product-detail.template.mjs +5 -4
- package/templates/product-detail.tsx +261 -272
- package/templates/product-gallery.template.mjs +5 -4
- package/templates/product-gallery.tsx +126 -137
- package/templates/product-tour.template.mjs +5 -4
- package/templates/product-tour.tsx +741 -773
- package/templates/settings-dialog.template.mjs +5 -4
- package/templates/settings-dialog.tsx +688 -717
- package/templates/settings-sidebar.template.mjs +5 -4
- package/templates/settings-sidebar.tsx +762 -807
- package/templates/settings.template.mjs +5 -4
- package/templates/settings.tsx +289 -304
- package/templates/shell-nav.template.mjs +5 -4
- package/templates/shell-nav.tsx +212 -219
- package/templates/shell-side-nav.template.mjs +5 -4
- package/templates/shell-side-nav.tsx +135 -157
- package/templates/shell-top-nav.template.mjs +5 -4
- package/templates/shell-top-nav.tsx +182 -203
- package/templates/side-gallery.template.mjs +5 -4
- package/templates/side-gallery.tsx +85 -90
- package/templates/table-grouped.template.mjs +5 -4
- package/templates/table-grouped.tsx +1000 -1053
- package/templates/table-page-chart.template.mjs +5 -4
- package/templates/table-page-chart.tsx +400 -398
- package/templates/table-page-heatmap-status.template.mjs +5 -4
- package/templates/table-page-heatmap-status.tsx +483 -512
- package/templates/table-page-shoe-store-heatmap.template.mjs +5 -4
- package/templates/table-page-shoe-store-heatmap.tsx +748 -746
- package/templates/table-page.template.mjs +5 -4
- package/templates/table-page.tsx +396 -405
- package/templates/table.template.mjs +5 -4
- package/templates/table.tsx +92 -93
- package/templates/tech-report.template.mjs +5 -4
- package/templates/tech-report.tsx +1316 -1304
- package/templates/theme-showcase.template.mjs +5 -4
- package/templates/theme-showcase.tsx +871 -951
- package/theme.css +35 -77
- package/theme.css.d.ts +9 -0
- package/tokens.css +373 -380
package/shared/order-desk.tsx
CHANGED
|
@@ -2,26 +2,27 @@
|
|
|
2
2
|
// table-page-shoe-store-heatmap (Midnight Kicks) templates. The two pages are
|
|
3
3
|
// one archetype — revenue line over the order log — differing only in catalogue,
|
|
4
4
|
// rows, and chart scale, so the frame/columns live here once.
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
import { Button } from "@astryxdesign/core/Button";
|
|
7
|
+
import { Icon } from "@astryxdesign/core/Icon";
|
|
8
|
+
import { IconButton } from "@astryxdesign/core/IconButton";
|
|
6
9
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
} from
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {Token} from
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import
|
|
22
|
-
import {
|
|
23
|
-
import {RevenueChart, ProductSwatch} from 'astryx-dracula/shared/revenue-chart';
|
|
24
|
-
import type {SceneHue} from 'astryx-dracula/shared/scene-hues';
|
|
10
|
+
HStack,
|
|
11
|
+
Layout,
|
|
12
|
+
LayoutContent,
|
|
13
|
+
LayoutHeader,
|
|
14
|
+
StackItem,
|
|
15
|
+
VStack,
|
|
16
|
+
} from "@astryxdesign/core/Layout";
|
|
17
|
+
import { Link } from "@astryxdesign/core/Link";
|
|
18
|
+
import type { TableColumn } from "@astryxdesign/core/Table";
|
|
19
|
+
import { pixel, proportional, Table } from "@astryxdesign/core/Table";
|
|
20
|
+
import { Heading, Text } from "@astryxdesign/core/Text";
|
|
21
|
+
import { Token } from "@astryxdesign/core/Token";
|
|
22
|
+
import { ProductSwatch, RevenueChart } from "astryx-dracula/shared/revenue-chart";
|
|
23
|
+
import type { SceneHue } from "astryx-dracula/shared/scene-hues";
|
|
24
|
+
import { Download, Filter, Plus } from "lucide-react";
|
|
25
|
+
import type { CSSProperties } from "react";
|
|
25
26
|
|
|
26
27
|
// Anchor for the page wrapper.
|
|
27
28
|
//
|
|
@@ -43,231 +44,219 @@ import type {SceneHue} from 'astryx-dracula/shared/scene-hues';
|
|
|
43
44
|
// The wrapper exists to give the Layout's `height: 100%` (Layout.tsx:58-63)
|
|
44
45
|
// something definite to resolve against when the host is content-sized, which
|
|
45
46
|
// is the case whenever a template ships standalone.
|
|
46
|
-
const pageStyle: CSSProperties = {height:
|
|
47
|
+
const pageStyle: CSSProperties = { height: "100dvh" };
|
|
47
48
|
|
|
48
49
|
export interface OrderDeskProduct {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
50
|
+
name: string;
|
|
51
|
+
category: string;
|
|
52
|
+
/**
|
|
53
|
+
* Per-product art tint, painted by `ProductSwatch`. Same remit as
|
|
54
|
+
* `SceneTile.hue` — an art treatment, not a data series — so it takes the
|
|
55
|
+
* same `SceneHue` union rather than a free-form string. Typing the boundary
|
|
56
|
+
* HERE is what makes the compile-error list the real list: typed only at the
|
|
57
|
+
* consumer, a raw string flows through untyped and the error never fires.
|
|
58
|
+
*/
|
|
59
|
+
accent: SceneHue;
|
|
60
|
+
price: number;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
export interface OrderDeskRow extends Record<string, unknown> {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
id: string;
|
|
65
|
+
customer: string;
|
|
66
|
+
email: string;
|
|
67
|
+
product: string;
|
|
68
|
+
category: string;
|
|
69
|
+
imageIndex: number;
|
|
70
|
+
amount: number;
|
|
71
|
+
status: "completed" | "processing" | "shipped" | "refunded";
|
|
72
|
+
date: string;
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
export interface RevenueDatum {
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
date: string;
|
|
77
|
+
revenue: number;
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
// Vocabulary, not a hue choice: orange is attention and constants only
|
|
80
81
|
// (principle 3), and an order being picked is routine in-flight work, not
|
|
81
82
|
// attention. In-progress/activity is cyan (info). refunded stays red — that
|
|
82
83
|
// is a real negative.
|
|
83
|
-
const STATUS_TOKEN_COLOR: Record<
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
shipped: 'cyan',
|
|
89
|
-
processing: 'cyan',
|
|
90
|
-
refunded: 'red',
|
|
84
|
+
const STATUS_TOKEN_COLOR: Record<OrderDeskRow["status"], "green" | "cyan" | "red"> = {
|
|
85
|
+
completed: "green",
|
|
86
|
+
shipped: "cyan",
|
|
87
|
+
processing: "cyan",
|
|
88
|
+
refunded: "red",
|
|
91
89
|
};
|
|
92
90
|
|
|
93
|
-
const STATUS_LABEL: Record<OrderDeskRow[
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
const STATUS_LABEL: Record<OrderDeskRow["status"], string> = {
|
|
92
|
+
completed: "Completed",
|
|
93
|
+
shipped: "Shipped",
|
|
94
|
+
processing: "Processing",
|
|
95
|
+
refunded: "Refunded",
|
|
98
96
|
};
|
|
99
97
|
|
|
100
98
|
function columnsFor(selfHash: string, products: OrderDeskProduct[]): TableColumn<OrderDeskRow>[] {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
),
|
|
186
|
-
},
|
|
187
|
-
];
|
|
99
|
+
return [
|
|
100
|
+
{
|
|
101
|
+
key: "id",
|
|
102
|
+
header: "Order",
|
|
103
|
+
width: pixel(96),
|
|
104
|
+
renderCell: (item: OrderDeskRow) => (
|
|
105
|
+
<Link href={selfHash} isStandalone>
|
|
106
|
+
{item.id}
|
|
107
|
+
</Link>
|
|
108
|
+
),
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
key: "product",
|
|
112
|
+
header: "Product",
|
|
113
|
+
width: proportional(3, { minWidth: 160 }),
|
|
114
|
+
renderCell: (item: OrderDeskRow) => (
|
|
115
|
+
<HStack gap={3} vAlign="center">
|
|
116
|
+
<ProductSwatch accent={products[item.imageIndex].accent} label={item.product} />
|
|
117
|
+
<StackItem size="fill">
|
|
118
|
+
<VStack gap={0}>
|
|
119
|
+
<Text type="body" maxLines={1}>
|
|
120
|
+
{item.product}
|
|
121
|
+
</Text>
|
|
122
|
+
<Text type="supporting" color="secondary" maxLines={1}>
|
|
123
|
+
{item.category}
|
|
124
|
+
</Text>
|
|
125
|
+
</VStack>
|
|
126
|
+
</StackItem>
|
|
127
|
+
</HStack>
|
|
128
|
+
),
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
key: "amount",
|
|
132
|
+
header: "Amount",
|
|
133
|
+
width: pixel(88),
|
|
134
|
+
renderCell: (item: OrderDeskRow) => (
|
|
135
|
+
<Text type="body" hasTabularNumbers maxLines={1}>
|
|
136
|
+
${item.amount}
|
|
137
|
+
</Text>
|
|
138
|
+
),
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
key: "customer",
|
|
142
|
+
header: "Customer",
|
|
143
|
+
width: proportional(2, { minWidth: 120 }),
|
|
144
|
+
renderCell: (item: OrderDeskRow) => (
|
|
145
|
+
<Text type="body" maxLines={1}>
|
|
146
|
+
{item.customer}
|
|
147
|
+
</Text>
|
|
148
|
+
),
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
key: "email",
|
|
152
|
+
header: "Email",
|
|
153
|
+
width: proportional(2, { minWidth: 120 }),
|
|
154
|
+
renderCell: (item: OrderDeskRow) => (
|
|
155
|
+
<Text type="body" maxLines={1}>
|
|
156
|
+
{item.email}
|
|
157
|
+
</Text>
|
|
158
|
+
),
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
key: "status",
|
|
162
|
+
header: "Status",
|
|
163
|
+
width: pixel(120),
|
|
164
|
+
renderCell: (item: OrderDeskRow) => (
|
|
165
|
+
<Token
|
|
166
|
+
size="sm"
|
|
167
|
+
color={STATUS_TOKEN_COLOR[item.status]}
|
|
168
|
+
label={STATUS_LABEL[item.status]}
|
|
169
|
+
/>
|
|
170
|
+
),
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
key: "date",
|
|
174
|
+
header: "Date",
|
|
175
|
+
width: pixel(112),
|
|
176
|
+
renderCell: (item: OrderDeskRow) => (
|
|
177
|
+
<Text type="body" hasTabularNumbers maxLines={1}>
|
|
178
|
+
{item.date}
|
|
179
|
+
</Text>
|
|
180
|
+
),
|
|
181
|
+
},
|
|
182
|
+
];
|
|
188
183
|
}
|
|
189
184
|
|
|
190
185
|
export function OrderDesk({
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
186
|
+
title,
|
|
187
|
+
selfHash,
|
|
188
|
+
products,
|
|
189
|
+
orders,
|
|
190
|
+
revenueData,
|
|
191
|
+
chartMax,
|
|
192
|
+
gridTicks,
|
|
198
193
|
}: {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
194
|
+
title: string;
|
|
195
|
+
selfHash: string;
|
|
196
|
+
products: OrderDeskProduct[];
|
|
197
|
+
orders: OrderDeskRow[];
|
|
198
|
+
revenueData: RevenueDatum[];
|
|
199
|
+
chartMax: number;
|
|
200
|
+
gridTicks: number[];
|
|
206
201
|
}) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
202
|
+
return (
|
|
203
|
+
// The anchor lives on a page-owned wrapper, never on the Layout. A bare
|
|
204
|
+
// `height="fill"` resolves against `min-height: 100%`, which collapses when
|
|
205
|
+
// the host is content-sized — and templates ship standalone, so that is the
|
|
206
|
+
// common case. Putting the height on the Layout instead would trade
|
|
207
|
+
// a soft failure (the document scrolls) for a hard one (content clipped,
|
|
208
|
+
// because `LayoutContent` is `overflow: auto` with a definite height).
|
|
209
|
+
<div style={pageStyle}>
|
|
210
|
+
<Layout
|
|
211
|
+
height="fill"
|
|
212
|
+
header={
|
|
213
|
+
<LayoutHeader hasDivider padding={6}>
|
|
214
|
+
<HStack gap={2} vAlign="center">
|
|
215
|
+
<StackItem size="fill">
|
|
216
|
+
{/* maxLines={1}, not wrap="wrap": at 390 the 35px display-2 title
|
|
222
217
|
wraps 2-3 lines in a 342px header (measured: 136px tall for
|
|
223
218
|
"Midnight Kicks", 180px for an 18-char title). Wrapping the
|
|
224
219
|
row measured IDENTICAL header heights in both configurations
|
|
225
220
|
— the controls already fit, the title is what is tall. And
|
|
226
221
|
maxLines wires core's useTruncation, so the full value stays
|
|
227
222
|
reachable in a Tooltip (SC 1.4.10, "truncation must reveal"). */}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
</VStack>
|
|
268
|
-
</LayoutContent>
|
|
269
|
-
}
|
|
270
|
-
/>
|
|
271
|
-
</div>
|
|
272
|
-
);
|
|
223
|
+
<Heading level={1} type="display-2" maxLines={1}>
|
|
224
|
+
{title}
|
|
225
|
+
</Heading>
|
|
226
|
+
</StackItem>
|
|
227
|
+
<IconButton
|
|
228
|
+
label="Filter"
|
|
229
|
+
icon={<Icon icon={Filter} size="sm" />}
|
|
230
|
+
variant="ghost"
|
|
231
|
+
tooltip="Filter"
|
|
232
|
+
/>
|
|
233
|
+
<IconButton
|
|
234
|
+
label="Export"
|
|
235
|
+
icon={<Icon icon={Download} size="sm" />}
|
|
236
|
+
variant="ghost"
|
|
237
|
+
tooltip="Export"
|
|
238
|
+
/>
|
|
239
|
+
<Button label="New order" variant="primary" icon={<Icon icon={Plus} size="sm" />} />
|
|
240
|
+
</HStack>
|
|
241
|
+
</LayoutHeader>
|
|
242
|
+
}
|
|
243
|
+
content={
|
|
244
|
+
<LayoutContent padding={3}>
|
|
245
|
+
<VStack gap={4}>
|
|
246
|
+
<RevenueChart data={revenueData} chartMax={chartMax} gridTicks={gridTicks} />
|
|
247
|
+
<Table<OrderDeskRow>
|
|
248
|
+
data={orders}
|
|
249
|
+
columns={columnsFor(selfHash, products)}
|
|
250
|
+
idKey="id"
|
|
251
|
+
density="balanced"
|
|
252
|
+
dividers="rows"
|
|
253
|
+
textOverflow="truncate"
|
|
254
|
+
hasHover
|
|
255
|
+
/>
|
|
256
|
+
</VStack>
|
|
257
|
+
</LayoutContent>
|
|
258
|
+
}
|
|
259
|
+
/>
|
|
260
|
+
</div>
|
|
261
|
+
);
|
|
273
262
|
}
|