@hanzo/ui 8.0.7 → 8.0.8
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/ThemeToggleNext-7727UR5W.js +4 -0
- package/dist/ThemeToggleNext-7727UR5W.js.map +1 -0
- package/dist/ThemeToggleNext-ICB5KL5J.cjs +19 -0
- package/dist/ThemeToggleNext-ICB5KL5J.cjs.map +1 -0
- package/dist/billing.cjs +15 -0
- package/dist/billing.cjs.map +1 -0
- package/{types → dist}/billing.d.ts +0 -1
- package/dist/billing.js +4 -0
- package/dist/billing.js.map +1 -0
- package/dist/canvas.cjs +15 -0
- package/dist/canvas.cjs.map +1 -0
- package/dist/canvas.d.ts +1 -0
- package/dist/canvas.js +4 -0
- package/dist/canvas.js.map +1 -0
- package/{types → dist}/cd/layout.d.ts +0 -1
- package/{types → dist}/cd/status.d.ts +0 -1
- package/{types → dist}/cd/time.d.ts +0 -1
- package/{types → dist}/cd/types.d.ts +0 -1
- package/dist/chunk-42CU5GSF.js +98 -0
- package/dist/chunk-42CU5GSF.js.map +1 -0
- package/dist/chunk-GDGVXU7W.js +1999 -0
- package/dist/chunk-GDGVXU7W.js.map +1 -0
- package/dist/chunk-HSPMQQVJ.cjs +2066 -0
- package/dist/chunk-HSPMQQVJ.cjs.map +1 -0
- package/dist/chunk-YBXVUV7P.cjs +103 -0
- package/dist/chunk-YBXVUV7P.cjs.map +1 -0
- package/dist/dashboard.cjs +15 -0
- package/dist/dashboard.cjs.map +1 -0
- package/dist/dashboard.d.ts +1 -0
- package/dist/dashboard.js +4 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/data.cjs +15 -0
- package/dist/data.cjs.map +1 -0
- package/dist/data.d.ts +1 -0
- package/dist/data.js +4 -0
- package/dist/data.js.map +1 -0
- package/dist/gitops.cjs +15 -0
- package/dist/gitops.cjs.map +1 -0
- package/dist/gitops.d.ts +1 -0
- package/dist/gitops.js +4 -0
- package/dist/gitops.js.map +1 -0
- package/dist/index.cjs +291 -0
- package/dist/index.cjs.map +1 -0
- package/{types → dist}/index.d.ts +0 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/network.cjs +15 -0
- package/dist/network.cjs.map +1 -0
- package/{types → dist}/network.d.ts +0 -1
- package/dist/network.js +4 -0
- package/dist/network.js.map +1 -0
- package/dist/primitives/bases/data/index.cjs +15 -0
- package/dist/primitives/bases/data/index.cjs.map +1 -0
- package/dist/primitives/bases/data/index.d.ts +1 -0
- package/dist/primitives/bases/data/index.js +4 -0
- package/dist/primitives/bases/data/index.js.map +1 -0
- package/{types → dist}/product/AppHeader.d.ts +0 -1
- package/{types → dist}/product/BrandMark.d.ts +0 -1
- package/{types → dist}/product/Charts.d.ts +0 -1
- package/{types → dist}/product/ComboBox.d.ts +0 -1
- package/{types → dist}/product/DataTable.d.ts +0 -1
- package/{types → dist}/product/Donut.d.ts +0 -1
- package/{types → dist}/product/EmptyState.d.ts +0 -1
- package/{types → dist}/product/FadeIn.d.ts +0 -1
- package/{types → dist}/product/Field.d.ts +0 -1
- package/{types → dist}/product/HanzoMark.d.ts +0 -1
- package/{types → dist}/product/Metric.d.ts +0 -1
- package/{types → dist}/product/OrgSwitcher.d.ts +0 -1
- package/{types → dist}/product/PageHeader.d.ts +0 -1
- package/{types → dist}/product/PrimaryButton.d.ts +0 -1
- package/{types → dist}/product/ProductIcon.d.ts +0 -1
- package/{types → dist}/product/ProviderLogo.d.ts +0 -1
- package/{types → dist}/product/Reorder.d.ts +0 -1
- package/{types → dist}/product/SelectMenu.d.ts +6 -8
- package/{types → dist}/product/SlideOver.d.ts +0 -1
- package/{types → dist}/product/StatusTag.d.ts +0 -1
- package/{types → dist}/product/ThemeToggle.d.ts +0 -1
- package/{types → dist}/product/ThemeToggleNext.d.ts +0 -1
- package/{types → dist}/product/Toast.d.ts +0 -1
- package/{types → dist}/product/color.d.ts +0 -1
- package/{types → dist}/product/combobox/filter.d.ts +0 -1
- package/dist/product/index.cjs +278 -0
- package/dist/product/index.cjs.map +1 -0
- package/{types → dist}/product/index.d.ts +0 -1
- package/dist/product/index.js +5 -0
- package/dist/product/index.js.map +1 -0
- package/{types → dist}/product/menu/ContextMenu.d.ts +3 -6
- package/dist/product/menu/DropdownMenu.d.ts +29 -0
- package/dist/product/menu/FloatingMenu.d.ts +36 -0
- package/{types → dist}/product/menu/index.d.ts +1 -1
- package/{types → dist}/product/menu/items.d.ts +0 -1
- package/{types → dist}/product/menu/portal-theme.d.ts +0 -1
- package/{types → dist}/product/menu/roving.d.ts +0 -1
- package/{types → dist}/product/scope.d.ts +0 -1
- package/{types → dist}/product/surfaces.data.d.ts +0 -1
- package/dist/usage.cjs +15 -0
- package/dist/usage.cjs.map +1 -0
- package/dist/usage.d.ts +1 -0
- package/dist/usage.js +4 -0
- package/dist/usage.js.map +1 -0
- package/dist/wallet.cjs +15 -0
- package/dist/wallet.cjs.map +1 -0
- package/{types → dist}/wallet.d.ts +0 -1
- package/dist/wallet.js +4 -0
- package/dist/wallet.js.map +1 -0
- package/package.json +54 -32
- package/src/billing.ts +0 -9
- package/src/canvas.ts +0 -11
- package/src/cd/layout.ts +0 -184
- package/src/cd/status.ts +0 -158
- package/src/cd/time.ts +0 -52
- package/src/cd/types.ts +0 -318
- package/src/dashboard.ts +0 -8
- package/src/data.ts +0 -12
- package/src/gitops.ts +0 -5
- package/src/gui-env.d.ts +0 -27
- package/src/index.ts +0 -22
- package/src/network.ts +0 -11
- package/src/primitives/bases/data/index.ts +0 -13
- package/src/product/AppHeader.tsx +0 -183
- package/src/product/BrandMark.tsx +0 -27
- package/src/product/Charts.tsx +0 -471
- package/src/product/ComboBox.tsx +0 -127
- package/src/product/DataTable.tsx +0 -99
- package/src/product/Donut.tsx +0 -83
- package/src/product/EmptyState.tsx +0 -129
- package/src/product/FadeIn.tsx +0 -38
- package/src/product/Field.tsx +0 -160
- package/src/product/HanzoMark.tsx +0 -31
- package/src/product/Metric.tsx +0 -253
- package/src/product/OrgSwitcher.tsx +0 -332
- package/src/product/PageHeader.tsx +0 -31
- package/src/product/PrimaryButton.tsx +0 -17
- package/src/product/ProductIcon.tsx +0 -61
- package/src/product/ProviderLogo.tsx +0 -137
- package/src/product/Reorder.test.ts +0 -41
- package/src/product/Reorder.tsx +0 -110
- package/src/product/SelectMenu.tsx +0 -80
- package/src/product/SlideOver.tsx +0 -197
- package/src/product/StatusTag.tsx +0 -49
- package/src/product/ThemeToggle.tsx +0 -135
- package/src/product/ThemeToggleNext.tsx +0 -27
- package/src/product/Toast.tsx +0 -166
- package/src/product/color.ts +0 -17
- package/src/product/combobox/filter.test.ts +0 -51
- package/src/product/combobox/filter.ts +0 -39
- package/src/product/index.ts +0 -76
- package/src/product/menu/ContextMenu.tsx +0 -114
- package/src/product/menu/DropdownMenu.tsx +0 -76
- package/src/product/menu/index.ts +0 -15
- package/src/product/menu/items.tsx +0 -230
- package/src/product/menu/portal-theme.tsx +0 -33
- package/src/product/menu/roving.ts +0 -34
- package/src/product/scope.test.ts +0 -92
- package/src/product/scope.ts +0 -123
- package/src/product/surfaces.data.ts +0 -42
- package/src/usage.ts +0 -8
- package/src/wallet.ts +0 -11
- package/types/billing.d.ts.map +0 -1
- package/types/canvas.d.ts +0 -2
- package/types/canvas.d.ts.map +0 -1
- package/types/cd/layout.d.ts.map +0 -1
- package/types/cd/status.d.ts.map +0 -1
- package/types/cd/time.d.ts.map +0 -1
- package/types/cd/types.d.ts.map +0 -1
- package/types/dashboard.d.ts +0 -2
- package/types/dashboard.d.ts.map +0 -1
- package/types/data.d.ts +0 -2
- package/types/data.d.ts.map +0 -1
- package/types/gitops.d.ts +0 -2
- package/types/gitops.d.ts.map +0 -1
- package/types/index.d.ts.map +0 -1
- package/types/network.d.ts.map +0 -1
- package/types/primitives/bases/data/index.d.ts +0 -2
- package/types/primitives/bases/data/index.d.ts.map +0 -1
- package/types/product/AppHeader.d.ts.map +0 -1
- package/types/product/BrandMark.d.ts.map +0 -1
- package/types/product/Charts.d.ts.map +0 -1
- package/types/product/ComboBox.d.ts.map +0 -1
- package/types/product/DataTable.d.ts.map +0 -1
- package/types/product/Donut.d.ts.map +0 -1
- package/types/product/EmptyState.d.ts.map +0 -1
- package/types/product/FadeIn.d.ts.map +0 -1
- package/types/product/Field.d.ts.map +0 -1
- package/types/product/HanzoMark.d.ts.map +0 -1
- package/types/product/Metric.d.ts.map +0 -1
- package/types/product/OrgSwitcher.d.ts.map +0 -1
- package/types/product/PageHeader.d.ts.map +0 -1
- package/types/product/PrimaryButton.d.ts.map +0 -1
- package/types/product/ProductIcon.d.ts.map +0 -1
- package/types/product/ProviderLogo.d.ts.map +0 -1
- package/types/product/Reorder.d.ts.map +0 -1
- package/types/product/SelectMenu.d.ts.map +0 -1
- package/types/product/SlideOver.d.ts.map +0 -1
- package/types/product/StatusTag.d.ts.map +0 -1
- package/types/product/ThemeToggle.d.ts.map +0 -1
- package/types/product/ThemeToggleNext.d.ts.map +0 -1
- package/types/product/Toast.d.ts.map +0 -1
- package/types/product/color.d.ts.map +0 -1
- package/types/product/combobox/filter.d.ts.map +0 -1
- package/types/product/index.d.ts.map +0 -1
- package/types/product/menu/ContextMenu.d.ts.map +0 -1
- package/types/product/menu/DropdownMenu.d.ts +0 -34
- package/types/product/menu/DropdownMenu.d.ts.map +0 -1
- package/types/product/menu/index.d.ts.map +0 -1
- package/types/product/menu/items.d.ts.map +0 -1
- package/types/product/menu/portal-theme.d.ts.map +0 -1
- package/types/product/menu/roving.d.ts.map +0 -1
- package/types/product/scope.d.ts.map +0 -1
- package/types/product/surfaces.data.d.ts.map +0 -1
- package/types/usage.d.ts +0 -2
- package/types/usage.d.ts.map +0 -1
- package/types/wallet.d.ts.map +0 -1
- /package/{src → dist}/styles/hanzo-motion.css +0 -0
package/src/cd/types.ts
DELETED
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @hanzo/ui/cd — the Hanzo CD (continuous-delivery) data contract.
|
|
3
|
-
*
|
|
4
|
-
* This is the FE↔BE handshake for the `/v1/gitops` API. Every component in this
|
|
5
|
-
* module is presentational and data-prop-driven: a host console fetches these
|
|
6
|
-
* rows (via the injected `GitopsClient`) and hands them to the views. The shapes
|
|
7
|
-
* live in ONE place so the pure folds (status → tone, tree → graph, diff → hunks)
|
|
8
|
-
* are unit-tested in isolation and the visual components never reach into a data
|
|
9
|
-
* layer.
|
|
10
|
-
*
|
|
11
|
-
* The vocabulary mirrors a GitOps engine's model (health/sync verdicts, the
|
|
12
|
-
* owner-reference resource graph, operation phases) so a backend that projects a
|
|
13
|
-
* cluster's live state maps onto it directly, but the names are engine-neutral.
|
|
14
|
-
*
|
|
15
|
-
* Attribution: the information design of these views is a derivative port of the
|
|
16
|
-
* Argo CD web UI (Apache-2.0). See ./NOTICE.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
20
|
-
// Status vocabularies — small, glanceable, closed unions.
|
|
21
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* A resource/application health verdict. `Unknown` is honest — a missing signal
|
|
25
|
-
* is never guessed up to `Healthy`.
|
|
26
|
-
*/
|
|
27
|
-
export type HealthStatus =
|
|
28
|
-
| 'Healthy'
|
|
29
|
-
| 'Progressing'
|
|
30
|
-
| 'Degraded'
|
|
31
|
-
| 'Suspended'
|
|
32
|
-
| 'Missing'
|
|
33
|
-
| 'Unknown'
|
|
34
|
-
|
|
35
|
-
/** Whether live state matches the desired (Git) state. */
|
|
36
|
-
export type SyncStatus = 'Synced' | 'OutOfSync' | 'Unknown'
|
|
37
|
-
|
|
38
|
-
/** The phase of an in-flight sync/rollback operation. */
|
|
39
|
-
export type OperationPhase =
|
|
40
|
-
| 'Running'
|
|
41
|
-
| 'Terminating'
|
|
42
|
-
| 'Failed'
|
|
43
|
-
| 'Error'
|
|
44
|
-
| 'Succeeded'
|
|
45
|
-
| 'Pending'
|
|
46
|
-
|
|
47
|
-
/** A pod's lifecycle phase (drives the pod-status dot). */
|
|
48
|
-
export type PodPhase = 'Pending' | 'Running' | 'Succeeded' | 'Failed' | 'Unknown'
|
|
49
|
-
|
|
50
|
-
/** Per-resource result code within a sync operation. */
|
|
51
|
-
export type SyncResultCode = 'Synced' | 'Pruned' | 'SyncFailed' | 'Unknown'
|
|
52
|
-
|
|
53
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
54
|
-
// Resource graph — the owner-reference tree of live cluster objects.
|
|
55
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
56
|
-
|
|
57
|
-
/** A group/version/kind/namespace/name coordinate for a cluster object. */
|
|
58
|
-
export interface ResourceRef {
|
|
59
|
-
/** Stable unique id (k8s uid, or a synthesized `group/kind/ns/name`). */
|
|
60
|
-
uid: string
|
|
61
|
-
group: string
|
|
62
|
-
version: string
|
|
63
|
-
kind: string
|
|
64
|
-
namespace: string
|
|
65
|
-
name: string
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** A labelled datum shown as a chip on a node / in the summary (e.g. `Revision: 3`). */
|
|
69
|
-
export interface InfoItem {
|
|
70
|
-
name: string
|
|
71
|
-
value: string
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/** Ingress/service surface of a networked resource (Service, Ingress). */
|
|
75
|
-
export interface ResourceNetworking {
|
|
76
|
-
/** Objects this resource routes to (Service → Pods, Ingress → Service). */
|
|
77
|
-
targetRefs?: ResourceRef[]
|
|
78
|
-
labels?: Record<string, string>
|
|
79
|
-
/** Externally reachable URLs (a domain's live site). */
|
|
80
|
-
externalURLs?: string[]
|
|
81
|
-
ingress?: { hostname?: string; ip?: string }[]
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* One node of the live resource graph. Ownership is expressed by `parentRefs`
|
|
86
|
-
* (an object may have several owners); the graph is the transitive closure of
|
|
87
|
-
* those edges rooted at the application. Pure data — no React, no back-refs.
|
|
88
|
-
*/
|
|
89
|
-
export interface ResourceNode extends ResourceRef {
|
|
90
|
-
/** The object(s) that own this one — the edges of the graph. */
|
|
91
|
-
parentRefs?: ResourceRef[]
|
|
92
|
-
/** Health verdict for this object, when the engine computes one. */
|
|
93
|
-
health?: { status: HealthStatus; message?: string }
|
|
94
|
-
/** Sync verdict for this object (managed objects only). */
|
|
95
|
-
status?: SyncStatus
|
|
96
|
-
/** Glanceable facts shown as chips (revision, replicas, image tag, …). */
|
|
97
|
-
info?: InfoItem[]
|
|
98
|
-
networkingInfo?: ResourceNetworking
|
|
99
|
-
images?: string[]
|
|
100
|
-
createdAt?: string
|
|
101
|
-
/** True for hook/sync-operation objects; `resourceVersion` for freshness. */
|
|
102
|
-
hook?: boolean
|
|
103
|
-
resourceVersion?: string
|
|
104
|
-
/** Present on Pod nodes — drives pod-specific rendering. */
|
|
105
|
-
podInfo?: PodInfo
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/** Extra facts a Pod node carries (containers, phase, restarts, node/host). */
|
|
109
|
-
export interface PodInfo {
|
|
110
|
-
phase: PodPhase
|
|
111
|
-
/** Reason string when the phase alone is ambiguous (CrashLoopBackOff, …). */
|
|
112
|
-
reason?: string
|
|
113
|
-
ready?: string // e.g. "2/3"
|
|
114
|
-
restarts?: number
|
|
115
|
-
node?: string
|
|
116
|
-
age?: string
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* The full resource graph for an application: the managed nodes plus any
|
|
121
|
-
* orphaned objects (live in the app's namespace but not owned by it).
|
|
122
|
-
*/
|
|
123
|
-
export interface ResourceTree {
|
|
124
|
-
nodes: ResourceNode[]
|
|
125
|
-
orphanedNodes?: ResourceNode[]
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
129
|
-
// Application — the deployable unit the list shows and the detail drills into.
|
|
130
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
131
|
-
|
|
132
|
-
/** Where an application's desired state comes from (a Git repo path @ revision). */
|
|
133
|
-
export interface AppSource {
|
|
134
|
-
repoURL: string
|
|
135
|
-
path?: string
|
|
136
|
-
targetRevision?: string
|
|
137
|
-
chart?: string
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/** The destination cluster + namespace an application deploys to. */
|
|
141
|
-
export interface AppDestination {
|
|
142
|
-
server?: string
|
|
143
|
-
name?: string
|
|
144
|
-
namespace: string
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/** Revision metadata resolved from the source repo (for the status panel). */
|
|
148
|
-
export interface RevisionMetadata {
|
|
149
|
-
revision: string
|
|
150
|
-
author?: string
|
|
151
|
-
date?: string
|
|
152
|
-
message?: string
|
|
153
|
-
tags?: string[]
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* A summary of one application — the shape the list/tiles render. Enough to draw
|
|
158
|
-
* a row without fetching the tree.
|
|
159
|
-
*/
|
|
160
|
-
export interface AppSummary {
|
|
161
|
-
name: string
|
|
162
|
-
namespace?: string
|
|
163
|
-
project?: string
|
|
164
|
-
health: HealthStatus
|
|
165
|
-
sync: SyncStatus
|
|
166
|
-
/** Short revision (sha/tag) currently reconciled. */
|
|
167
|
-
revision?: string
|
|
168
|
-
source?: AppSource
|
|
169
|
-
destination?: AppDestination
|
|
170
|
-
/** Epoch ms of the last successful sync (rendered relative). */
|
|
171
|
-
lastSyncedAt?: number
|
|
172
|
-
/** Phase of an in-flight operation, when one is running. */
|
|
173
|
-
operationPhase?: OperationPhase
|
|
174
|
-
/** Rollup counts of managed resources by health, for the tile mini-bar. */
|
|
175
|
-
resourceCounts?: Partial<Record<HealthStatus, number>>
|
|
176
|
-
labels?: Record<string, string>
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/** A single sync/deploy in the history (for the rollback list). */
|
|
180
|
-
export interface DeployRevision {
|
|
181
|
-
/** Monotonic history id — the handle passed to `rollback`. */
|
|
182
|
-
id: number
|
|
183
|
-
revision: string
|
|
184
|
-
deployedAt?: number
|
|
185
|
-
source?: AppSource
|
|
186
|
-
metadata?: RevisionMetadata
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/** The result of (or progress of) the most recent sync/rollback operation. */
|
|
190
|
-
export interface OperationState {
|
|
191
|
-
phase: OperationPhase
|
|
192
|
-
message?: string
|
|
193
|
-
startedAt?: number
|
|
194
|
-
finishedAt?: number
|
|
195
|
-
/** The revision the operation targeted. */
|
|
196
|
-
revision?: string
|
|
197
|
-
/** Per-resource results (kind/name → code + message). */
|
|
198
|
-
syncResult?: {
|
|
199
|
-
ref: ResourceRef
|
|
200
|
-
result: SyncResultCode
|
|
201
|
-
message?: string
|
|
202
|
-
hookPhase?: string
|
|
203
|
-
}[]
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* The full application detail — everything the status panel + controls need
|
|
208
|
-
* beyond the tree. Returned by `getApp`.
|
|
209
|
-
*/
|
|
210
|
-
export interface AppDetail extends AppSummary {
|
|
211
|
-
/** Resolved metadata for the reconciled revision. */
|
|
212
|
-
revisionMetadata?: RevisionMetadata
|
|
213
|
-
/** Deploy/rollout history, newest last (matches engine ordering). */
|
|
214
|
-
history?: DeployRevision[]
|
|
215
|
-
/** In-flight or last-completed operation. */
|
|
216
|
-
operationState?: OperationState
|
|
217
|
-
/** Free-form conditions/warnings surfaced by the engine. */
|
|
218
|
-
conditions?: { type: string; message: string; lastTransitionTime?: string }[]
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
222
|
-
// Node detail — manifest + events + logs for the drawer.
|
|
223
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
224
|
-
|
|
225
|
-
/** A k8s-style event row shown in the node drawer's Events tab. */
|
|
226
|
-
export interface ResourceEvent {
|
|
227
|
-
reason: string
|
|
228
|
-
message: string
|
|
229
|
-
type?: 'Normal' | 'Warning'
|
|
230
|
-
count?: number
|
|
231
|
-
firstSeen?: string
|
|
232
|
-
lastSeen?: string
|
|
233
|
-
source?: string
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/** One log line (optionally tagged with its container + a parsed timestamp). */
|
|
237
|
-
export interface LogEntry {
|
|
238
|
-
content: string
|
|
239
|
-
timestamp?: string
|
|
240
|
-
container?: string
|
|
241
|
-
/** True for stderr — rendered in the warn tone. */
|
|
242
|
-
err?: boolean
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Everything the node drawer needs for a single resource: the live manifest
|
|
247
|
-
* (YAML), recent events, a recent-logs snapshot (pods), and the desired/live
|
|
248
|
-
* pair for the inline diff. Returned by `getResource`.
|
|
249
|
-
*/
|
|
250
|
-
export interface ResourceDetail {
|
|
251
|
-
ref: ResourceRef
|
|
252
|
-
health?: { status: HealthStatus; message?: string }
|
|
253
|
-
syncStatus?: SyncStatus
|
|
254
|
-
/** Live manifest as YAML (or JSON) text. */
|
|
255
|
-
liveManifest?: string
|
|
256
|
-
/** Desired manifest as YAML text — enables the drawer's inline diff. */
|
|
257
|
-
desiredManifest?: string
|
|
258
|
-
events?: ResourceEvent[]
|
|
259
|
-
/** Recent log lines for a pod/container (a snapshot; streaming is optional). */
|
|
260
|
-
logs?: LogEntry[]
|
|
261
|
-
/** Container names, when the resource is a Pod (drives the log selector). */
|
|
262
|
-
containers?: string[]
|
|
263
|
-
info?: InfoItem[]
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
267
|
-
// Diff — desired vs live for the whole application.
|
|
268
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
269
|
-
|
|
270
|
-
/** One resource's desired/live manifest pair for the application diff view. */
|
|
271
|
-
export interface ResourceDiff {
|
|
272
|
-
ref: ResourceRef
|
|
273
|
-
/** Sync verdict for this resource (drives the section pill). */
|
|
274
|
-
status?: SyncStatus
|
|
275
|
-
desired?: string
|
|
276
|
-
live?: string
|
|
277
|
-
/** True when the resource is unmanaged/hook (rendered muted). */
|
|
278
|
-
hook?: boolean
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/** The full application diff payload. Returned by `getDiff`. */
|
|
282
|
-
export interface AppDiff {
|
|
283
|
-
items: ResourceDiff[]
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
287
|
-
// Mutations — sync + rollback request bodies.
|
|
288
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
289
|
-
|
|
290
|
-
/** Body for `POST /v1/gitops/{name}/sync`. */
|
|
291
|
-
export interface SyncRequest {
|
|
292
|
-
/** Target revision; omit to sync to the source's configured revision. */
|
|
293
|
-
revision?: string
|
|
294
|
-
/** Prune resources that no longer exist in the desired state. */
|
|
295
|
-
prune?: boolean
|
|
296
|
-
/** Server-side dry-run (compute the plan without applying). */
|
|
297
|
-
dryRun?: boolean
|
|
298
|
-
/** Restrict the sync to specific resources (default: all). */
|
|
299
|
-
resources?: ResourceRef[]
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/** Body for `POST /v1/gitops/{name}/rollback`. */
|
|
303
|
-
export interface RollbackRequest {
|
|
304
|
-
/** The history id (from `DeployRevision.id`) to roll back to. */
|
|
305
|
-
id: number
|
|
306
|
-
prune?: boolean
|
|
307
|
-
dryRun?: boolean
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/** The response to a sync/rollback — the operation the engine kicked off. */
|
|
311
|
-
export interface OperationResponse {
|
|
312
|
-
operationState: OperationState
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/** The apps-list response: `GET /v1/gitops`. */
|
|
316
|
-
export interface AppListResponse {
|
|
317
|
-
items: AppSummary[]
|
|
318
|
-
}
|
package/src/dashboard.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// @hanzo/ui/dashboard — the console dashboard kit (landing + deploy pipeline +
|
|
2
|
-
// composable overview primitives + charts/motion layer), re-exported from its
|
|
3
|
-
// home package @hanzo/dashboard. Thin subpath:
|
|
4
|
-
//
|
|
5
|
-
// import { ... } from '@hanzo/ui/dashboard'
|
|
6
|
-
//
|
|
7
|
-
// Optional peer — only pulled when the subpath is used.
|
|
8
|
-
export * from '@hanzo/dashboard'
|
package/src/data.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// @hanzo/ui/data — the metadata-driven record layer.
|
|
2
|
-
//
|
|
3
|
-
// RecordsView, DataTable, BoardView, RecordDetail/RecordForm, the typed field
|
|
4
|
-
// editors (select/relation/calendar/file/JSON/boolean…), the field registry, the
|
|
5
|
-
// pure sort/filter/search/group/view logic, and the tokens. The source of truth
|
|
6
|
-
// is @hanzo/data (pkg/data) — this is the canonical @hanzo/ui entry point for it,
|
|
7
|
-
// so an app depends on ONE package (@hanzo/ui) for both the product layer and the
|
|
8
|
-
// record layer. Do NOT re-implement anything here; add it upstream in @hanzo/data
|
|
9
|
-
// and it flows through.
|
|
10
|
-
//
|
|
11
|
-
// import { RecordsView, DataTable, registerField } from '@hanzo/ui/data'
|
|
12
|
-
export * from '@hanzo/data'
|
package/src/gitops.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
// @hanzo/ui/gitops — the CD/GitOps surface, re-exported from its home package
|
|
2
|
-
// @hanzo/gitops (an Apache-2.0 clean-room port of the Argo CD UI). Kept as a thin
|
|
3
|
-
// subpath so a console can `import { GitopsAppList, GitopsAppTree, GitopsNodeInfo,
|
|
4
|
-
// HealthBadge, ... } from '@hanzo/ui/gitops'` while the code lives in one place.
|
|
5
|
-
export * from '@hanzo/gitops'
|
package/src/gui-env.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Registers this package's @hanzo/gui config with the type system so the
|
|
3
|
-
* shorthand style props (bg / px / py / items / justify / gap / rounded …) that
|
|
4
|
-
* the components author against resolve to their concrete types DURING THIS
|
|
5
|
-
* PACKAGE'S OWN COMPILATION.
|
|
6
|
-
*
|
|
7
|
-
* Because the resolution happens here, the emitted `.d.ts` (see
|
|
8
|
-
* `tsconfig.build.json`) bakes in the concrete prop types — a consumer type-checks
|
|
9
|
-
* against the compiled declarations and never has to re-declare this augmentation
|
|
10
|
-
* (nor descend into our `.tsx` internals). Ambient + type-only; never emitted.
|
|
11
|
-
*
|
|
12
|
-
* `GuiCustomConfig` is the extension point declared by @hanzogui/web and re-declared
|
|
13
|
-
* by @hanzogui/core; `InferGuiConfig<typeof defaultConfig>` (the return type of
|
|
14
|
-
* `createGui(defaultConfig)`) is the exact config the components are written for.
|
|
15
|
-
*/
|
|
16
|
-
import type { createGui } from '@hanzo/gui'
|
|
17
|
-
import type { defaultConfig } from '@hanzogui/config/v5'
|
|
18
|
-
|
|
19
|
-
type Conf = ReturnType<typeof createGui<typeof defaultConfig>>
|
|
20
|
-
|
|
21
|
-
declare module '@hanzogui/web' {
|
|
22
|
-
interface GuiCustomConfig extends Conf {}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
declare module '@hanzogui/core' {
|
|
26
|
-
interface GuiCustomConfig extends Conf {}
|
|
27
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
// @hanzo/ui — the one Hanzo component library, on @hanzo/gui.
|
|
2
|
-
//
|
|
3
|
-
// import { PageHeader, Sparkline, EmptyState, tokens } from '@hanzo/ui' // product + tokens
|
|
4
|
-
// import { RecordsView, DataTable, registerField } from '@hanzo/ui/data' // metadata record layer
|
|
5
|
-
//
|
|
6
|
-
// Two orthogonal concerns, ONE package, zero duplication:
|
|
7
|
-
// • the product/app component layer (this barrel — charts, metrics, headers,
|
|
8
|
-
// status tags, empty states, combobox, slide-over, toasts, reorder, fields), and
|
|
9
|
-
// • the metadata-driven record layer (the `./data` subpath — RecordsView and the
|
|
10
|
-
// typed field editors, whose source of truth is @hanzo/data).
|
|
11
|
-
// Both cross-platform (web + native + desktop), presentational, host-agnostic
|
|
12
|
-
// (data + effects injected), clean-room. The two layers each own a `DataTable`
|
|
13
|
-
// (product = generic typed <T> list; data = field-driven record grid); keeping the
|
|
14
|
-
// record layer on the `./data` subpath keeps each name unambiguous.
|
|
15
|
-
|
|
16
|
-
// Product/app component layer.
|
|
17
|
-
export * from './product'
|
|
18
|
-
|
|
19
|
-
// Design tokens — the calm, dark-first zinc-on-black identity (surface, text,
|
|
20
|
-
// accent, tag tones). One source of truth (@hanzo/data's theme), surfaced here
|
|
21
|
-
// for convenience so `import { tokens } from '@hanzo/ui'` works.
|
|
22
|
-
export { tokens, TAG_TONES, tagTone, type TagTone } from '@hanzo/data'
|
package/src/network.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// @hanzo/ui/network — the ONE network selector, re-exported from its home module
|
|
2
|
-
// @hanzo/ui-shadcn/network. `NetworkSwitcher` renders the selected environment
|
|
3
|
-
// and a menu of configured networks + a custom-endpoint form, backed by the
|
|
4
|
-
// shared selected-network store; `configureNetworks` swaps the network set so a
|
|
5
|
-
// downstream brand can white-label it. Thin subpath:
|
|
6
|
-
//
|
|
7
|
-
// import { NetworkSwitcher, useNetwork, configureNetworks, HANZO_NETWORKS,
|
|
8
|
-
// type Network } from '@hanzo/ui/network'
|
|
9
|
-
//
|
|
10
|
-
// Optional peer — only pulled when the subpath is used.
|
|
11
|
-
export * from '@hanzo/ui-shadcn/network'
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// @hanzo/ui/primitives/bases/data — the Hanzo Base data-app layer.
|
|
2
|
-
//
|
|
3
|
-
// Source of truth: the `@hanzo/data` workspace package (~/work/hanzo/hanzoai/ui/
|
|
4
|
-
// pkg/data). This file is a passthrough re-export so consumers of @hanzo/ui can
|
|
5
|
-
// pull the metadata-driven record views (RecordsView, DataTable, BoardView,
|
|
6
|
-
// RecordDetail, field editors) without depending on @hanzo/data directly — the
|
|
7
|
-
// same convention the `gui` base uses for `hanzogui`. Subpath resolution makes
|
|
8
|
-
// `@hanzo/ui/primitives/bases/data` equivalent to `@hanzo/data`.
|
|
9
|
-
//
|
|
10
|
-
// Do NOT re-implement components here. Add them upstream in pkg/data and let them
|
|
11
|
-
// flow through this re-export.
|
|
12
|
-
|
|
13
|
-
export * from '@hanzo/data'
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* AppHeader — the shared shell header every Hanzo surface renders: the brand
|
|
5
|
-
* mark top-left (from @hanzo/logo, white-label via `wordmark`/`brand`), an
|
|
6
|
-
* org/project slot (usually `<OrgSwitcher/>`), an app switcher listing the
|
|
7
|
-
* Hanzo surfaces (modeled on the console's AppLauncher), and an identity menu
|
|
8
|
-
* (Profile · Theme · Team settings · Billing · Sign out).
|
|
9
|
-
*
|
|
10
|
-
* Host-agnostic: every action is an injected handler; a row renders only when
|
|
11
|
-
* its handler is provided (honest — no dead menu items). Mobile-first: fluid
|
|
12
|
-
* flex + truncation, the wordmark collapse is the brand motion itself.
|
|
13
|
-
*/
|
|
14
|
-
import { useState, type ReactNode } from 'react'
|
|
15
|
-
import { Button, Popover, Separator, Text, XStack, YStack } from '@hanzo/gui'
|
|
16
|
-
import { AppWindow, Bot, CreditCard, Grip, LayoutGrid, LogOut, MessageCircle, Settings2, Sparkles, UserRound, Users } from '@hanzogui/lucide-icons-2'
|
|
17
|
-
|
|
18
|
-
import { BrandMark } from './BrandMark'
|
|
19
|
-
import { ThemeToggle } from './ThemeToggle'
|
|
20
|
-
import { otherSurfaces, type Surface, type SurfaceId } from './surfaces.data'
|
|
21
|
-
|
|
22
|
-
/** The per-surface glyph — keyed by `Surface.id`, so each surface reads distinctly. */
|
|
23
|
-
const SURFACE_ICON = {
|
|
24
|
-
ai: Sparkles,
|
|
25
|
-
console: LayoutGrid,
|
|
26
|
-
app: AppWindow,
|
|
27
|
-
chat: MessageCircle,
|
|
28
|
-
bot: Bot,
|
|
29
|
-
team: Users,
|
|
30
|
-
billing: CreditCard,
|
|
31
|
-
} as const satisfies Record<SurfaceId, unknown>
|
|
32
|
-
|
|
33
|
-
const openHref = (href: string) => {
|
|
34
|
-
if (typeof window !== 'undefined') window.open(href, '_blank', 'noopener')
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function MenuRow({ icon, label, onPress }: { icon: ReactNode; label: string; onPress: () => void }) {
|
|
38
|
-
return (
|
|
39
|
-
<XStack onPress={onPress} cursor="pointer" items="center" gap="$2.5" px="$2" py="$2" rounded="$3" hoverStyle={{ bg: '$color5' }}>
|
|
40
|
-
{icon}
|
|
41
|
-
<Text fontSize="$2" color="$color12">
|
|
42
|
-
{label}
|
|
43
|
-
</Text>
|
|
44
|
-
</XStack>
|
|
45
|
-
)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export type AppHeaderProps = {
|
|
49
|
-
/** Brand slot — defaults to the animated `<BrandMark/>`. */
|
|
50
|
-
brand?: ReactNode
|
|
51
|
-
/** White-label wordmark for the default brand mark. */
|
|
52
|
-
wordmark?: string
|
|
53
|
-
/** Brand press (usually "go home"). */
|
|
54
|
-
onBrand?: () => void
|
|
55
|
-
/** Org/project slot — usually `<OrgSwitcher/>` (+ a project switcher). */
|
|
56
|
-
org?: ReactNode
|
|
57
|
-
/** Free slot between the org slot and the right cluster. */
|
|
58
|
-
children?: ReactNode
|
|
59
|
-
/** The surface this header renders on — omitted from the switcher (no self-link). */
|
|
60
|
-
current?: SurfaceId
|
|
61
|
-
/** App-switcher surfaces; defaults to every surface but `current`. [] hides it. */
|
|
62
|
-
surfaces?: Surface[]
|
|
63
|
-
/** Open a surface — default `window.open` (new tab). */
|
|
64
|
-
open?: (surface: Surface) => void
|
|
65
|
-
/** Identity-menu trigger label (the signed-in user's name/email). */
|
|
66
|
-
user?: string
|
|
67
|
-
/** Replace the whole identity menu content. */
|
|
68
|
-
menu?: ReactNode
|
|
69
|
-
/** Theme row content — default `<ThemeToggle/>`; null hides the row. */
|
|
70
|
-
theme?: ReactNode
|
|
71
|
-
onProfile?: () => void
|
|
72
|
-
onTeam?: () => void
|
|
73
|
-
onBilling?: () => void
|
|
74
|
-
onSignOut?: () => void
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export function AppHeader({
|
|
78
|
-
brand,
|
|
79
|
-
wordmark = 'Hanzo',
|
|
80
|
-
onBrand,
|
|
81
|
-
org,
|
|
82
|
-
children,
|
|
83
|
-
current,
|
|
84
|
-
surfaces,
|
|
85
|
-
open,
|
|
86
|
-
user,
|
|
87
|
-
menu,
|
|
88
|
-
theme,
|
|
89
|
-
onProfile,
|
|
90
|
-
onTeam,
|
|
91
|
-
onBilling,
|
|
92
|
-
onSignOut,
|
|
93
|
-
}: AppHeaderProps) {
|
|
94
|
-
const [appsOpen, setAppsOpen] = useState(false)
|
|
95
|
-
const [menuOpen, setMenuOpen] = useState(false)
|
|
96
|
-
const items = surfaces ?? otherSurfaces(current)
|
|
97
|
-
const launch = (s: Surface) => {
|
|
98
|
-
setAppsOpen(false)
|
|
99
|
-
if (open) open(s)
|
|
100
|
-
else openHref(s.href)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return (
|
|
104
|
-
<XStack items="center" gap="$2" px="$3" height={52} borderBottomWidth={1} borderColor="$borderColor" bg="$background">
|
|
105
|
-
<XStack items="center" cursor={onBrand ? 'pointer' : undefined} onPress={onBrand}>
|
|
106
|
-
{brand ?? <BrandMark wordmark={wordmark} />}
|
|
107
|
-
</XStack>
|
|
108
|
-
|
|
109
|
-
{org ? (
|
|
110
|
-
<XStack items="center" minW={0}>
|
|
111
|
-
{org}
|
|
112
|
-
</XStack>
|
|
113
|
-
) : null}
|
|
114
|
-
|
|
115
|
-
<XStack flex={1} items="center" minW={0}>
|
|
116
|
-
{children}
|
|
117
|
-
</XStack>
|
|
118
|
-
|
|
119
|
-
{items.length > 0 ? (
|
|
120
|
-
<Popover open={appsOpen} onOpenChange={setAppsOpen} placement="bottom-end">
|
|
121
|
-
<Popover.Trigger asChild>
|
|
122
|
-
<Button size="$2" chromeless icon={<Grip size={16} />} aria-label="Apps" />
|
|
123
|
-
</Popover.Trigger>
|
|
124
|
-
<Popover.Content bordered elevate p="$2" width={230} bg="$color2" borderColor="$borderColor">
|
|
125
|
-
<YStack gap="$1">
|
|
126
|
-
{items.map((s) => {
|
|
127
|
-
const Icon = SURFACE_ICON[s.id]
|
|
128
|
-
return (
|
|
129
|
-
<XStack key={s.id} onPress={() => launch(s)} cursor="pointer" items="center" gap="$2.5" px="$2" py="$2" rounded="$3" hoverStyle={{ bg: '$color5' }}>
|
|
130
|
-
<Icon size={16} />
|
|
131
|
-
<Text flex={1} fontSize="$2" fontWeight="600" color="$color12">
|
|
132
|
-
{s.label}
|
|
133
|
-
</Text>
|
|
134
|
-
{s.hint ? (
|
|
135
|
-
<Text fontSize="$1" color="$color10">
|
|
136
|
-
{s.hint}
|
|
137
|
-
</Text>
|
|
138
|
-
) : null}
|
|
139
|
-
</XStack>
|
|
140
|
-
)
|
|
141
|
-
})}
|
|
142
|
-
</YStack>
|
|
143
|
-
</Popover.Content>
|
|
144
|
-
</Popover>
|
|
145
|
-
) : null}
|
|
146
|
-
|
|
147
|
-
<Popover open={menuOpen} onOpenChange={setMenuOpen} placement="bottom-end">
|
|
148
|
-
<Popover.Trigger asChild>
|
|
149
|
-
<Button size="$2" chromeless icon={<UserRound size={16} />} aria-label="Account">
|
|
150
|
-
{user ? (
|
|
151
|
-
<Text fontSize="$2" color="$color12" numberOfLines={1} maxW={140}>
|
|
152
|
-
{user}
|
|
153
|
-
</Text>
|
|
154
|
-
) : null}
|
|
155
|
-
</Button>
|
|
156
|
-
</Popover.Trigger>
|
|
157
|
-
<Popover.Content bordered elevate p="$2" width={220} bg="$color2" borderColor="$borderColor">
|
|
158
|
-
{menu ?? (
|
|
159
|
-
<YStack gap="$1">
|
|
160
|
-
{onProfile ? <MenuRow icon={<UserRound size={15} />} label="Profile" onPress={() => (setMenuOpen(false), onProfile())} /> : null}
|
|
161
|
-
{theme !== null ? (
|
|
162
|
-
<XStack items="center" gap="$2.5" px="$2" py="$1" rounded="$3">
|
|
163
|
-
<Text flex={1} fontSize="$2" color="$color12">
|
|
164
|
-
Theme
|
|
165
|
-
</Text>
|
|
166
|
-
{theme ?? <ThemeToggle />}
|
|
167
|
-
</XStack>
|
|
168
|
-
) : null}
|
|
169
|
-
{onTeam ? <MenuRow icon={<Settings2 size={15} />} label="Team settings" onPress={() => (setMenuOpen(false), onTeam())} /> : null}
|
|
170
|
-
{onBilling ? <MenuRow icon={<CreditCard size={15} />} label="Billing" onPress={() => (setMenuOpen(false), onBilling())} /> : null}
|
|
171
|
-
{onSignOut ? (
|
|
172
|
-
<>
|
|
173
|
-
<Separator borderColor="$borderColor" my="$1" />
|
|
174
|
-
<MenuRow icon={<LogOut size={15} />} label="Sign out" onPress={() => (setMenuOpen(false), onSignOut())} />
|
|
175
|
-
</>
|
|
176
|
-
) : null}
|
|
177
|
-
</YStack>
|
|
178
|
-
)}
|
|
179
|
-
</Popover.Content>
|
|
180
|
-
</Popover>
|
|
181
|
-
</XStack>
|
|
182
|
-
)
|
|
183
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* BrandMark — the canonical brand lockup for an app header, from @hanzo/logo
|
|
5
|
-
* (the ONE home of the mark geometry + motion). Animated by default: intro
|
|
6
|
-
* flip + idle breathing + a wordmark that slides in, holds, then collapses
|
|
7
|
-
* (returns on hover). Pure CSS, reduced-motion-safe; the mark inherits
|
|
8
|
-
* `currentColor` so it themes for free. White-label via `wordmark`.
|
|
9
|
-
*/
|
|
10
|
-
import { HanzoLogo } from '@hanzo/logo/react'
|
|
11
|
-
|
|
12
|
-
import { HanzoMark } from './HanzoMark'
|
|
13
|
-
|
|
14
|
-
export function BrandMark({
|
|
15
|
-
size = 20,
|
|
16
|
-
wordmark = 'Hanzo',
|
|
17
|
-
animated = true,
|
|
18
|
-
}: {
|
|
19
|
-
size?: number
|
|
20
|
-
/** Wordmark text (white-label): "Hanzo", "Lux", "Zoo", … */
|
|
21
|
-
wordmark?: string
|
|
22
|
-
/** false = the static mark alone (no motion shell, no wordmark). */
|
|
23
|
-
animated?: boolean
|
|
24
|
-
}) {
|
|
25
|
-
if (!animated) return <HanzoMark size={size} />
|
|
26
|
-
return <HanzoLogo animated size={size} wordmark={wordmark} />
|
|
27
|
-
}
|