Retire Cloud and Team as products of their own

The platform is what they were, so the menus name it once and the column
under it lists what the platform actually offers.

Co-authored-by: Hanzo Dev <[email protected]>
This commit is contained in:
2026-09-07 22:57:40 -07:00
co-authored by Hanzo Dev
parent e233a1e78f
commit 954d41e603
29 changed files with 176 additions and 590 deletions
+3 -3
View File
@@ -1,7 +1,6 @@
import {
type ThemeName,
Button,
Card,
H2,
Paragraph,
Text,
@@ -72,7 +71,8 @@ export function BrandTokensDemo() {
<XStack gap="$4" flexWrap="wrap">
{BRANDS.map((b) => (
<Theme key={b} name={b as ThemeName}>
<Card
<YStack
position="relative"
backgroundColor="$color2"
borderWidth={1}
borderColor="$borderColor"
@@ -104,7 +104,7 @@ export function BrandTokensDemo() {
</Text>
</YStack>
<Button>Themed button</Button>
</Card>
</YStack>
</Theme>
))}
</XStack>
File diff suppressed because one or more lines are too long
+4 -3
View File
@@ -1,5 +1,5 @@
import { TitleBar } from '@hanzogui/tauri'
import { Button, Card, H1, Paragraph, Text, Theme, XStack, YStack } from '@hanzo/gui'
import { Button, H1, Paragraph, Text, Theme, XStack, YStack } from '@hanzo/gui'
import type { BrandName } from '@hanzogui/themes'
const brands: BrandName[] = ['hanzo', 'lux', 'zoo', 'pars']
@@ -24,7 +24,8 @@ export function App() {
</Paragraph>
</YStack>
<Card
<YStack
position="relative"
backgroundColor="$color2"
borderColor="$borderColor"
borderWidth={1}
@@ -50,7 +51,7 @@ export function App() {
</Theme>
))}
</XStack>
</Card>
</YStack>
</YStack>
</YStack>
)
+17 -7
View File
@@ -1,6 +1,6 @@
import { useState } from 'react'
import { ChevronRight } from '@hanzogui/lucide-icons-2'
import { Avatar, Card, H5, Paragraph, XStack, YStack } from '@hanzo/gui'
import { Avatar, H5, Paragraph, XStack, YStack } from '@hanzo/gui'
import { Link } from '~/components/Link'
import { ThemeTintAlt } from '@hanzogui/logo'
@@ -10,7 +10,10 @@ export function AvatarCard({ title, subtitle, img, link, colorOffset, ...props }
return (
<ThemeTintAlt offset={colorOffset}>
<Link asChild href={link}>
<Card
<YStack
bg="$background"
position="relative"
rounded="$true"
render="a"
transition="quickest"
flex={1}
@@ -23,7 +26,7 @@ export function AvatarCard({ title, subtitle, img, link, colorOffset, ...props }
onMouseLeave={() => setHovered(false)}
{...props}
>
<Card.Header>
<YStack z={10} mb="auto" p="$true">
<XStack justify="space-between">
<YStack gap="$2.5">
<H5 size="$6" color="$color9" fontFamily="$pixel">
@@ -39,12 +42,19 @@ export function AvatarCard({ title, subtitle, img, link, colorOffset, ...props }
<Avatar.Fallback bg="$color6" borderColor="$color8" />
</Avatar>
</XStack>
</Card.Header>
</YStack>
<Card.Footer transition="quicker" x={isHovered ? 5 : 0}>
<XStack
z={5}
mt="auto"
mb={0}
p="$true"
transition="quicker"
x={isHovered ? 5 : 0}
>
<ChevronRight size="$1" position="absolute" b="$4" r="$4" color="$color11" />
</Card.Footer>
</Card>
</XStack>
</YStack>
</Link>
</ThemeTintAlt>
)
+17 -7
View File
@@ -1,14 +1,17 @@
import { ThemeTintAlt } from '@hanzogui/logo'
import { ChevronRight } from '@hanzogui/lucide-icons-2'
import { useState } from 'react'
import { Avatar, Card, H5, Paragraph, View, XStack, YStack } from '@hanzo/gui'
import { Avatar, H5, Paragraph, View, XStack, YStack } from '@hanzo/gui'
export function LogoCard({ title, subtitle, img, icon, link, colorOffset, ...props }) {
const [isHovered, setHovered] = useState(false)
return (
<ThemeTintAlt offset={colorOffset}>
<Card
<YStack
bg="$background"
position="relative"
rounded="$true"
render="a"
transition="quickest"
flex={1}
@@ -23,7 +26,7 @@ export function LogoCard({ title, subtitle, img, icon, link, colorOffset, ...pro
{...(props as any)}
href={link}
>
<Card.Header>
<YStack z={10} mb="auto" p="$true">
<XStack justify="space-between">
<YStack gap="$2.5">
<H5 size="$6" color="$color9" fontFamily="$pixel">
@@ -52,12 +55,19 @@ export function LogoCard({ title, subtitle, img, icon, link, colorOffset, ...pro
</Avatar>
)}
</XStack>
</Card.Header>
</YStack>
<Card.Footer transition="quicker" x={isHovered ? 5 : 0}>
<XStack
z={5}
mt="auto"
mb={0}
p="$true"
transition="quicker"
x={isHovered ? 5 : 0}
>
<ChevronRight size="$1" position="absolute" b="$4" r="$4" color="$color11" />
</Card.Footer>
</Card>
</XStack>
</YStack>
</ThemeTintAlt>
)
}
@@ -1,115 +0,0 @@
---
title: Card
description: Sizable, themeable cards with a flexible API.
name: card
component: Card
package: card
demoName: Card
---
<HeroContainer>
<CardDemo />
</HeroContainer>
```tsx hero template=Card
```
<Highlights
features={[
`Sizable with a size prop that passes to Card children.`,
`Themeable helper props like elevate.`,
`Background component that handles positioning.`,
]}
/>
## Installation
Card is already installed in `hanzogui`, or you can install it independently:
```bash
npm install @hanzogui/card
```
## Anatomy
```tsx
import { Card } from '@hanzo/gui' // or '@hanzogui/card'
export default () => (
<Card>
<Card.Header />
<Card.Footer />
{/* any other components */}
<Card.Background />
</Card>
)
```
## API Reference
### Card
Frame of the card, extends [ThemeableStack props](/docs/components/stacks#themeablestack), adding:
<PropsTable
data={[
{
name: 'size',
type: 'SizeTokens',
required: false,
description: `Passes size down to all sub-components when set for padding, arrow, borderRadius.`,
},
{
name: 'unstyled',
required: false,
type: `boolean`,
description: `Removes all default Gui styles.`,
},
]}
/>
### Card.Header
Extends [ThemeableStack](/docs/components/stacks#themeablestack), adding:
<PropsTable
data={[
{
name: 'unstyled',
required: false,
type: `boolean`,
description: `Removes all default Gui styles.`,
},
]}
/>
### Card.Footer
Extends [ThemeableStack](/docs/components/stacks#themeablestack), adding:
<PropsTable
data={[
{
name: 'unstyled',
required: false,
type: `boolean`,
description: `Removes all default Gui styles.`,
},
]}
/>
### Card.Background
Extends [YStack](/docs/components/stacks), set to `fullscreen` and zIndex below Header/Footer.
<PropsTable
data={[
{
name: 'unstyled',
required: false,
type: `boolean`,
description: `Removes all default Gui styles.`,
},
]}
/>
@@ -1,115 +0,0 @@
---
title: Card
description: Sizable, themeable cards with a flexible API
name: card
component: Card
package: card
demoName: Card
---
<HeroContainer>
<CardDemo />
</HeroContainer>
```tsx hero template=Card
```
<Highlights
features={[
`Sizable with a size prop that passes to Card children.`,
`Themeable helper props like elevate.`,
`Background component that handles positioning.`,
]}
/>
## Installation
Card is already installed in `hanzogui`, or you can install it independently:
```bash
npm install @hanzogui/card
```
## Anatomy
```tsx
import { Card } from '@hanzo/gui' // or '@hanzogui/card'
export default () => (
<Card>
<Card.Header />
<Card.Footer />
{/* any other components */}
<Card.Background />
</Card>
)
```
## API Reference
### Card
Frame of the card, extends [ThemeableStack props](/docs/components/stacks#themeablestack), adding:
<PropsTable
data={[
{
name: 'size',
type: 'SizeTokens',
required: false,
description: `Passes size down to all sub-components when set for padding, arrow, borderRadius.`,
},
{
name: 'unstyled',
required: false,
type: `boolean`,
description: `Removes all default Gui styles.`,
},
]}
/>
### Card.Header
Extends [ThemeableStack](/docs/components/stacks#themeablestack), adding:
<PropsTable
data={[
{
name: 'unstyled',
required: false,
type: `boolean`,
description: `Removes all default Gui styles.`,
},
]}
/>
### Card.Footer
Extends [ThemeableStack](/docs/components/stacks#themeablestack), adding:
<PropsTable
data={[
{
name: 'unstyled',
required: false,
type: `boolean`,
description: `Removes all default Gui styles.`,
},
]}
/>
### Card.Background
Extends [YStack](/docs/components/stacks), set to `fullscreen` and `zIndex` below Header/Footer.
<PropsTable
data={[
{
name: 'unstyled',
required: false,
type: `boolean`,
description: `Removes all default Gui styles.`,
},
]}
/>
@@ -191,7 +191,6 @@ export const docsRoutes = [
label: 'Content',
pages: [
{ title: 'Avatar', route: '/ui/avatar' },
{ title: 'Card', route: '/ui/card' },
{ title: 'Image', route: '/ui/image' },
{ title: 'ListItem', route: '/ui/list-item' },
],
@@ -16,7 +16,6 @@ import type { ImageProps, XStackProps } from '@hanzo/gui'
import {
Adapt,
Button,
Card,
H1,
H2,
H3,
@@ -841,7 +840,10 @@ const componentsIn = {
<>
<ThemeTint>
<Link asChild href="/docs/intro/installation">
<Card
<YStack
bg="$background"
position="relative"
rounded="$true"
render="a"
transition="quickest"
animateOnly={['transform']}
@@ -851,32 +853,38 @@ const componentsIn = {
hoverStyle={{ y: -2, bg: '$backgroundHover' }}
pressStyle={{ y: 2, bg: '$color2' }}
>
<Card.Header gap="$2">
<YStack z={10} mb="auto" p="$true" gap="$2">
<H4 size="$4" color="$color8">
Install
</H4>
<Paragraph size="$6" color="$color9">
Set up an app.
</Paragraph>
</Card.Header>
</YStack>
<Card.Footer>
<XStack z={5} mt="auto" mb={0} p="$true">
<ChevronRight position="absolute" b="$4" r="$4" color="$color11" />
</Card.Footer>
</Card>
</XStack>
</YStack>
</Link>
<Card flex={1} flexBasis="auto">
<Card.Header gap="$2">
<YStack
bg="$background"
position="relative"
rounded="$true"
flex={1}
flexBasis="auto"
>
<YStack z={10} mb="auto" p="$true" gap="$2">
<H4 size="$4" color="$color9">
Quick start
</H4>
<Paragraph size="$4" color="$color11">
Choose from a few starters:
</Paragraph>
</Card.Header>
</YStack>
<Card.Footer p="$6" pt={0}>
<XStack z={5} mt="auto" mb={0} p="$6" pt={0}>
<XStack position="relative" items="center" gap="$4" flex={1}>
<Code flex={1} bg="$color4" p="$3" rounded="$4" size="$5">
npm create hanzogui@latest
@@ -898,8 +906,8 @@ const componentsIn = {
Copy
</Button>
</XStack>
</Card.Footer>
</Card>
</XStack>
</YStack>
</ThemeTint>
</>
</XStack>
@@ -1,4 +1,4 @@
import { Card, Paragraph, SizableText, Text, XStack, YStack } from '@hanzo/gui'
import { Paragraph, SizableText, Text, XStack, YStack } from '@hanzo/gui'
import { CheckCircle } from '~/components/CheckCircle'
import { ContainerLarge } from '~/components/Containers'
@@ -21,14 +21,22 @@ const Features = ({ items, ...props }: any) => {
return (
<YStack gap="$4" {...props}>
{items.map((feature, i) => (
<Card key={i} p="$6" elevation="$1" $sm={{ p: '$4' }}>
<YStack
key={i}
bg="$background"
position="relative"
rounded="$true"
p="$6"
elevation="$1"
$sm={{ p: '$4' }}
>
<XStack render="li">
<Text color="$green9">
<CheckCircle />
</Text>
<Paragraph color="$gray11">{feature}</Paragraph>
</XStack>
</Card>
</YStack>
))}
</YStack>
)
@@ -6,7 +6,6 @@ import { memo, useEffect, useRef, useState } from 'react'
import type { Heading, TextProps } from '@hanzo/gui'
import {
Button,
Card,
H1,
H2,
H3,
@@ -155,7 +154,9 @@ const OverlayCard = () => {
// {/* TODO elevation not overriding? */}
return (
<Card
<YStack
bg="$background"
position="relative"
borderWidth={1}
borderColor="$borderColor"
rounded="$6"
@@ -184,7 +185,7 @@ const OverlayCard = () => {
</Button>
</Link>
</YStack>
</Card>
</YStack>
)
}
@@ -1,5 +1,5 @@
import type { CardProps } from '@hanzo/gui'
import { Card, H4, Paragraph, XStack, YStack } from '@hanzo/gui'
import type { YStackProps } from '@hanzo/gui'
import { H4, Paragraph, XStack, YStack } from '@hanzo/gui'
import { useDemoProps } from '../hooks/useDemoProps'
export const Overview1 = () => {
@@ -57,7 +57,7 @@ export type OverviewCardTypes = {
badgeAfter?: string
badgeState?: 'success' | 'failure' | 'indifferent'
alternative?: boolean
} & CardProps
} & YStackProps
export const OverviewCard = ({
title,
@@ -71,7 +71,9 @@ export const OverviewCard = ({
const demoProps = useDemoProps()
return (
<Card
<YStack
position="relative"
rounded="$true"
backgroundColor="transparent"
{...props}
{...(alternative && {
@@ -80,7 +82,10 @@ export const OverviewCard = ({
p: 10,
})}
>
<Card.Header
<YStack
z={10}
mb="auto"
p="$true"
flex={1}
flexBasis="auto"
justify="space-between"
@@ -119,7 +124,7 @@ export const OverviewCard = ({
)}
{badgeAfter && <Paragraph>{badgeAfter}</Paragraph>}
</XStack>
</Card.Header>
</Card>
</YStack>
</YStack>
)
}
@@ -1,13 +1,4 @@
import {
Button,
Card,
Input,
Switch,
TextArea,
XStack,
YStack,
SizableText,
} from '@hanzo/gui'
import { Button, Input, Switch, TextArea, XStack, YStack, SizableText } from '@hanzo/gui'
import type { ReactNode } from 'react'
export type PreviewComponent = {
@@ -31,8 +22,17 @@ export const components: PreviewComponent[] = [
{
name: 'Card',
component: () => (
<Card borderWidth={1} borderColor="$borderColor" p="$4" width={300} elevation="$2">
<Card.Header p="$3">
<YStack
bg="$background"
position="relative"
rounded="$true"
borderWidth={1}
borderColor="$borderColor"
p="$4"
width={300}
elevation="$2"
>
<YStack z={10} mb="auto" p="$3">
<XStack justify="space-between" items="center">
<YStack gap="$1">
<SizableText size="$5" fontWeight="600">
@@ -43,16 +43,16 @@ export const components: PreviewComponent[] = [
</SizableText>
</YStack>
</XStack>
</Card.Header>
<Card.Footer p="$3">
</YStack>
<XStack z={5} mt="auto" mb={0} p="$3">
<XStack gap="$3" justify="flex-end">
<Button size="$3">Cancel</Button>
<Button size="$3" theme="blue">
Save
</Button>
</XStack>
</Card.Footer>
</Card>
</XStack>
</YStack>
),
},
{
@@ -18,7 +18,6 @@ import { timer } from '@hanzogui/timer'
import React from 'react'
import {
Button,
Card,
H1,
H2,
H3,
@@ -48,7 +47,8 @@ if (shouldProfile) {
}
// styled components with variants
const StyledCard = styled(Card, {
const StyledCard = styled(YStack, {
position: 'relative',
padding: '$4',
borderRadius: '$4',
backgroundColor: '$background',
@@ -1,5 +1,5 @@
import React from 'react'
import { Button, Card, Square, Theme, YStack, Text } from '@hanzo/gui'
import { Button, Square, Theme, YStack, Text } from '@hanzo/gui'
import { TEST_IDS } from '../constants/test-ids'
@@ -8,7 +8,13 @@ export function ThemeChange() {
<>
<Inner level={0}>
<Inner level={1}>
<Card width={100} height={100} />
<YStack
backgroundColor="$background"
position="relative"
borderRadius="$true"
width={100}
height={100}
/>
</Inner>
</Inner>
</>
@@ -1,15 +1,4 @@
import {
Button,
Card,
H2,
H3,
H4,
Paragraph,
Text,
Theme,
XStack,
YStack,
} from '@hanzo/gui'
import { Button, H2, H3, H4, Paragraph, Text, Theme, XStack, YStack } from '@hanzo/gui'
import { TEST_IDS } from '../constants/test-ids'
@@ -182,14 +171,22 @@ export function V5ThemeBuilderOutput() {
</Paragraph>
<XStack gap="$3" flexWrap="wrap">
<Theme name="yellow">
<Card padding="$3" backgroundColor="$background" minWidth={140}>
<YStack
position="relative"
borderRadius="$true"
padding="$3"
backgroundColor="$background"
minWidth={140}
>
<Button testID="button-yellow" size="$3">
Yellow
</Button>
</Card>
</YStack>
</Theme>
<Theme name="red">
<Card
<YStack
position="relative"
borderRadius="$true"
testID="card-red"
padding="$3"
backgroundColor="$background"
@@ -198,10 +195,12 @@ export function V5ThemeBuilderOutput() {
<Button testID="button-red" size="$3">
Red
</Button>
</Card>
</YStack>
</Theme>
<Theme name="green">
<Card
<YStack
position="relative"
borderRadius="$true"
testID="card-green"
padding="$3"
backgroundColor="$background"
@@ -210,10 +209,12 @@ export function V5ThemeBuilderOutput() {
<Button testID="button-green" size="$3">
Green
</Button>
</Card>
</YStack>
</Theme>
<Theme name="blue">
<Card
<YStack
position="relative"
borderRadius="$true"
testID="card-blue"
padding="$3"
backgroundColor="$background"
@@ -222,7 +223,7 @@ export function V5ThemeBuilderOutput() {
<Button testID="button-blue" size="$3">
Blue
</Button>
</Card>
</YStack>
</Theme>
</XStack>
</YStack>
-52
View File
@@ -1,52 +0,0 @@
{
"name": "@hanzogui/card",
"version": "8.3.5",
"source": "src/index.ts",
"files": [
"src",
"types",
"dist"
],
"type": "module",
"sideEffects": false,
"main": "./dist/cjs/index.js",
"module": "./dist/esm/index.js",
"types": "./types/index.d.ts",
"exports": {
"./package.json": "./package.json",
".": {
"types": "./types/index.d.ts",
"react-native": "./dist/esm/index.js",
"browser": "./dist/esm/index.js",
"module": "./dist/esm/index.js",
"import": "./dist/esm/index.js",
"require": "./dist/cjs/index.js",
"default": "./dist/esm/index.js"
}
},
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "hanzogui-build --skip-native",
"watch": "hanzogui-build --watch",
"clean": "hanzogui-build clean",
"clean:build": "hanzogui-build clean:build"
},
"dependencies": {
"@hanzogui/core": "workspace:*",
"@hanzogui/create-context": "workspace:*",
"@hanzogui/helpers": "workspace:*",
"@hanzogui/stacks": "workspace:*",
"@hanzogui/web": "workspace:*"
},
"devDependencies": {
"@hanzogui/build": "workspace:*",
"react": "19.2.8",
"react-native": "^0.87.1"
},
"peerDependencies": {
"react": ">=19.2.8"
},
"module:jsx": "dist/jsx"
}
-110
View File
@@ -1,110 +0,0 @@
import { YStack } from '@hanzogui/stacks'
import type { GetProps, SizeTokens } from '@hanzogui/web'
import { createStyledContext, styled, withStaticProperties } from '@hanzogui/web'
const CardContext = createStyledContext({
size: '$true' as SizeTokens,
})
export const CardFrame = styled(YStack, {
name: 'Card',
context: CardContext,
variants: {
unstyled: {
false: {
size: '$true',
backgroundColor: '$background',
position: 'relative',
},
},
size: {
'...size': (val, { tokens }) => {
return {
borderRadius: tokens.radius[val] ?? val,
}
},
},
} as const,
defaultVariants: {
unstyled: process.env.GUI_HEADLESS === '1',
},
})
export const CardHeader = styled(YStack, {
name: 'CardHeader',
context: CardContext,
variants: {
unstyled: {
false: {
zIndex: 10,
backgroundColor: 'transparent',
marginBottom: 'auto',
},
},
size: {
'...size': (val, { tokens }) => {
return {
padding: tokens.space[val] ?? val,
}
},
},
} as const,
defaultVariants: {
unstyled: process.env.GUI_HEADLESS === '1',
},
})
export const CardFooter = styled(CardHeader, {
name: 'CardFooter',
variants: {
unstyled: {
false: {
zIndex: 5,
flexDirection: 'row',
marginTop: 'auto',
marginBottom: 0,
},
},
} as const,
defaultVariants: {
unstyled: process.env.GUI_HEADLESS === '1',
},
})
export const CardBackground = styled(YStack, {
name: 'CardBackground',
variants: {
unstyled: {
false: {
zIndex: 0,
fullscreen: true,
overflow: 'hidden',
pointerEvents: 'none',
padding: 0,
},
},
} as const,
defaultVariants: {
unstyled: process.env.GUI_HEADLESS === '1',
},
})
export type CardHeaderProps = GetProps<typeof CardHeader>
export type CardFooterProps = GetProps<typeof CardFooter>
export type CardProps = GetProps<typeof CardFrame>
export const Card = withStaticProperties(CardFrame, {
Header: CardHeader,
Footer: CardFooter,
Background: CardBackground,
})
-1
View File
@@ -1 +0,0 @@
export * from './Card.tsx'
-21
View File
@@ -1,21 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"noEmit": false,
"composite": false,
"incremental": false,
"rootDir": "src",
"rewriteRelativeImportExtensions": true,
"sourceMap": true,
"inlineSourceMap": false,
"paths": {},
"module": "commonjs",
"moduleResolution": "bundler",
"outDir": "dist/cjs",
"declaration": true,
"declarationMap": false,
"declarationDir": "dist/cjs/.types"
},
"include": ["src"],
"exclude": ["src/**/*.test.*", "src/**/__tests__/**", "src/**/*.stories.*"]
}
-21
View File
@@ -1,21 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"noEmit": false,
"composite": false,
"incremental": false,
"rootDir": "src",
"rewriteRelativeImportExtensions": true,
"sourceMap": true,
"inlineSourceMap": false,
"paths": {},
"module": "esnext",
"moduleResolution": "bundler",
"outDir": "dist/esm",
"declaration": true,
"declarationMap": true,
"declarationDir": "types"
},
"include": ["src"],
"exclude": ["src/**/*.test.*", "src/**/__tests__/**", "src/**/*.stories.*"]
}
-25
View File
@@ -1,25 +0,0 @@
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"composite": true
},
"references": [
{
"path": "../../core/create-context"
},
{
"path": "../../core/helpers"
},
{
"path": "../../core/web"
},
{
"path": "../stacks"
}
],
"exclude": [
"types",
"dist",
"**/__tests__"
]
}
-1
View File
@@ -76,7 +76,6 @@
"@hanzogui/animate-presence": "workspace:*",
"@hanzogui/avatar": "workspace:*",
"@hanzogui/button": "workspace:*",
"@hanzogui/card": "workspace:*",
"@hanzogui/checkbox": "workspace:*",
"@hanzogui/collapsible": "workspace:*",
"@hanzogui/component-helpers": "workspace:*",
-1
View File
@@ -8,7 +8,6 @@ export * from '@hanzogui/animate'
export * from '@hanzogui/animate-presence'
export * from '@hanzogui/avatar'
export * from '@hanzogui/button'
export * from '@hanzogui/card'
export * from '@hanzogui/checkbox'
export * from '@hanzogui/collapsible'
export * from '@hanzogui/compose-refs'
-3
View File
@@ -80,9 +80,6 @@
{
"path": "../button"
},
{
"path": "../card"
},
{
"path": "../checkbox"
},
+4 -1
View File
@@ -422,7 +422,10 @@ test('the public menu explains; the launcher opens', () => {
// Every flagship has one, and it is a hanzo.ai page — never the app host
// again under a second name.
const flagships = ['chat', 'app', 'team', 'studio', 'bot', 'cloud', 'base']
// Cloud and Team are what the platform does rather than products beside it,
// so neither is in this list any more and Platform is the page that explains
// all three.
const flagships = ['chat', 'app', 'studio', 'bot', 'base', 'platform']
for (const id of flagships) {
const at = reg.indexOf(` id: '${id}',`)
assert.ok(at > 0, `${id} is in the registry`)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@hanzogui/shell",
"version": "8.3.15",
"version": "8.3.16",
"description": "Unified Hanzo shell — HanzoHeader (the one public bar: Hanzo mega-menu, ⌘K search, the canonical CTA pill, IAM identity), OrgHeader (the signed-in bar), UserOrgDropdown (the one org switcher), Masquerade, AskHanzo (the visitor chat), MeetHanzoMenu, ProductsMegaMenu, HanzoFooter, HanzoPreFooterCTA, HanzoAppLauncher + the canonical surface registry",
"repository": {
"type": "git",
+8 -20
View File
@@ -363,15 +363,6 @@ export const HANZO_PRODUCTS: HanzoProduct[] = [
// `sees(stage)` before drawing it — and dropping the flag instead takes a
// finished product out of the mega-menu and the footer for everybody.
},
{
id: 'cloud',
glyph: 'cloud',
label: 'Hanzo Cloud',
href: U.cloud,
page: `${U.ai}/cloud`,
tagline: 'Run the platform',
boundary: PRODUCT_BOUNDARIES.cloud,
},
{
id: 'dev',
glyph: 'code',
@@ -418,15 +409,6 @@ export const HANZO_PRODUCTS: HanzoProduct[] = [
boundary: PRODUCT_BOUNDARIES.platform,
flagship: true,
},
{
id: 'team',
glyph: 'users',
label: 'Hanzo Team',
href: U.team,
page: `${U.ai}/team`,
tagline: 'People and AI together',
boundary: PRODUCT_BOUNDARIES.team,
},
{
id: 'bot',
glyph: 'bot',
@@ -580,7 +562,10 @@ export const MEET_HANZO_GROUPS: MeetHanzoGroup[] = [
{ id: 'agents', label: 'Managed agents', href: U.agents, glyph: 'cpu' },
{ id: 'mcp', label: 'MCP tools', href: U.mcp, glyph: 'plug' },
{ id: 'api', label: 'API platform', href: U.api, glyph: 'gateway' },
{ id: 'cloud', label: 'All cloud products', href: U.cloud, glyph: 'cloud' },
{ id: 'gateway', label: 'Gateway', href: U.gateway, glyph: 'gateway' },
{ id: 'keys', label: 'API keys', href: U.keys, glyph: 'plug' },
{ id: 'base', label: 'Base', href: U.base, glyph: 'layers' },
{ id: 'status', label: 'Status', href: U.status, glyph: 'pulse' },
],
},
{
@@ -1012,7 +997,10 @@ export const HANZO_FOOTER_COLUMNS: FooterColumn[] = [
{ id: 'agents', label: 'Managed agents', href: U.agents },
{ id: 'mcp', label: 'MCP tools', href: U.mcp },
{ id: 'api', label: 'API platform', href: U.api },
{ id: 'cloud', label: 'All cloud products', href: U.cloud },
{ id: 'gateway', label: 'Gateway', href: U.gateway },
{ id: 'keys', label: 'API keys', href: U.keys },
{ id: 'base', label: 'Base', href: U.base },
{ id: 'status', label: 'Status', href: U.status },
],
},
{
-3
View File
@@ -311,9 +311,6 @@
{
"path": "pkgs/ui/button"
},
{
"path": "pkgs/ui/card"
},
{
"path": "pkgs/ui/checkbox-headless"
},