@arcblock/ux 3.0.39 → 3.0.42

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.
@@ -1,20 +1,16 @@
1
- import { useRef } from 'react';
1
+ import { useRef, useEffect, useState } from 'react';
2
2
  import { Link } from 'react-router-dom';
3
3
  import { useCreation, useMemoizedFn } from 'ahooks';
4
- import { Box, BoxProps, Grid, useTheme } from '@mui/material';
4
+ import { Box, BoxProps, useTheme } from '@mui/material';
5
5
  import SubItemGroup from './sub-item-group';
6
6
  import { Item } from './nav-menu';
7
7
  import { styled } from '../Theme';
8
8
  import { useNavMenuContext } from './nav-menu-context';
9
9
  import { translate } from '../Locale/util';
10
10
  import { useLocaleContext } from '../Locale/context';
11
-
12
- import AIKitSvg from './images/ai-kit.svg?react';
11
+ // Arcblock Icons
13
12
  import NftStudioSvg from './images/nft-studio.svg?react';
14
13
  import CreatorStudioSvg from './images/creator-studio.svg?react';
15
- import AigneSvg from './images/aigne.svg?react';
16
- import ArcSphereSvg from './images/arcsphere.svg?react';
17
- import AistroSvg from './images/aistro.svg?react';
18
14
  import BlockletLauncherSvg from './images/blocklet-launcher.svg?react';
19
15
  import BlockletStoreSvg from './images/blocklet-store.svg?react';
20
16
  import Web3KitSvg from './images/web3-kit.svg?react';
@@ -24,10 +20,14 @@ import BlockletServerSvg from './images/blocklet-server.svg?react';
24
20
  import OCAPSvg from './images/OCAP.svg?react';
25
21
  import DidSvg from './images/did.svg?react';
26
22
  import DidWalletSvg from './images/did-wallet.svg?react';
27
- import DidNameServiceSvg from './images/did-name-service.svg?react';
28
23
  import VCSvg from './images/vc.svg?react';
29
- import DidConnectSvg from './images/did-connect.svg?react';
30
24
  import PaymentKitPng from './images/payment-kit.png';
25
+ // AIGNE Icons
26
+ import AigneSvg from './images/aigne.svg?react';
27
+ import ArcSphereSvg from './images/arcsphere.svg?react';
28
+ import AistroPng from './images/aistro.png';
29
+
30
+ const MIN_ITEM_CONTENT_WIDTH = 260;
31
31
 
32
32
  const translations = {
33
33
  en: {
@@ -36,6 +36,8 @@ const translations = {
36
36
  components: 'Components',
37
37
  computeStorage: 'Compute/Storage',
38
38
  identity: 'Identity',
39
+ frameworkTools: 'Framework & tools',
40
+ modelsAdapters: 'Models adapters',
39
41
  },
40
42
  products: {
41
43
  nftStudio: {
@@ -45,7 +47,7 @@ const translations = {
45
47
  description: 'All-in-one creator tool',
46
48
  },
47
49
  aigne: {
48
- description: 'Your AI assistant',
50
+ description: 'The Agentic Ecosystem for AI Apps',
49
51
  },
50
52
  arcsphere: {
51
53
  description: 'AI native browser',
@@ -98,6 +100,30 @@ const translations = {
98
100
  didConnect: {
99
101
  description: 'Passwordless login',
100
102
  },
103
+ aigneCodeSmith: {
104
+ description: 'Review and improve your code with AI',
105
+ },
106
+ aigneDocSmith: {
107
+ description: 'Generate and update docs with AI',
108
+ },
109
+ aigneWebSmith: {
110
+ description: 'Build and deploy AI-powered web apps',
111
+ },
112
+ aigneCLI: {
113
+ description: 'Develop agents from the command line',
114
+ },
115
+ aigneObservability: {
116
+ description: 'Understand and inspect agent behavior',
117
+ },
118
+ aigneStudio: {
119
+ description: 'Create agents visually, no code needed',
120
+ },
121
+ aigneFramework: {
122
+ description: 'The functional core of agentic AI',
123
+ },
124
+ aigneHub: {
125
+ description: 'One API. Any Model',
126
+ },
101
127
  },
102
128
  },
103
129
  zh: {
@@ -106,6 +132,8 @@ const translations = {
106
132
  components: '组件',
107
133
  computeStorage: '计算/存储',
108
134
  identity: '身份',
135
+ frameworkTools: '框架与工具',
136
+ modelsAdapters: '模型适配器',
109
137
  },
110
138
  products: {
111
139
  nftStudio: {
@@ -115,7 +143,7 @@ const translations = {
115
143
  description: '一体化创作工具',
116
144
  },
117
145
  aigne: {
118
- description: '您的人工智能助手',
146
+ description: 'AI 应用的代理生态系统',
119
147
  },
120
148
  arcsphere: {
121
149
  description: 'AI 原生浏览器',
@@ -168,13 +196,35 @@ const translations = {
168
196
  didConnect: {
169
197
  description: '无密码登录',
170
198
  },
199
+ aigneCodeSmith: {
200
+ description: '使用 AI 审查并优化你的代码',
201
+ },
202
+ aigneDocSmith: {
203
+ description: '用 AI 生成和更新项目文档',
204
+ },
205
+ aigneWebSmith: {
206
+ description: '构建并部署 AI 驱动的 Web 应用',
207
+ },
208
+ aigneCLI: {
209
+ description: '通过命令行开发 Agent',
210
+ },
211
+ aigneObservability: {
212
+ description: '理解并分析 Agent 的行为',
213
+ },
214
+ aigneStudio: {
215
+ description: '零代码构建 Agent',
216
+ },
217
+ aigneFramework: {
218
+ description: 'Agent AI 的功能核心框架',
219
+ },
220
+ aigneHub: {
221
+ description: '一套 API,连接所有模型',
222
+ },
171
223
  },
172
224
  },
173
225
  };
174
226
 
175
227
  const Wrapper = styled(Box)`
176
- width: 80vw;
177
- max-width: 900px;
178
228
  padding: 8px;
179
229
  background: ${({ theme }) => theme.palette.grey[100]};
180
230
  border-radius: 8px;
@@ -197,259 +247,385 @@ const Wrapper = styled(Box)`
197
247
  }
198
248
  `;
199
249
 
200
- export interface ProductsProps extends BoxProps {
201
- isOpen?: boolean;
250
+ const GridBox = styled(Box, { shouldForwardProp: (prop) => prop !== 'maxContent' })<{ maxContent: number }>(
251
+ ({ theme, maxContent }) => ({
252
+ display: 'grid',
253
+ gap: theme.spacing(1),
254
+ gridTemplateColumns: `repeat(1, ${maxContent}px)`,
255
+
256
+ [theme.breakpoints.up('md')]: {
257
+ gridTemplateColumns: `repeat(2, ${maxContent}px)`,
258
+ },
259
+
260
+ [theme.breakpoints.up('lg')]: {
261
+ gridTemplateColumns: `repeat(3, ${maxContent}px)`,
262
+ },
263
+ })
264
+ );
265
+
266
+ interface IconWrapperProps {
267
+ color?: string;
268
+ backgroundColor?: string;
269
+ children: React.ReactNode;
270
+ }
271
+ function IconWrapper({ color = 'black', backgroundColor = 'transparent', children }: IconWrapperProps) {
272
+ return (
273
+ <Box
274
+ component="span"
275
+ sx={{
276
+ display: 'inline-flex',
277
+ alignItems: 'center',
278
+ justifyContent: 'center',
279
+ color,
280
+ backgroundColor,
281
+ borderRadius: '4px',
282
+ }}>
283
+ {children}
284
+ </Box>
285
+ );
286
+ }
287
+
288
+ function DIDIcon({ color = 'black', backgroundColor = 'transparent' }: { color?: string; backgroundColor?: string }) {
289
+ return (
290
+ <IconWrapper color={color} backgroundColor={backgroundColor}>
291
+ <DidSvg style={{ width: '100%' }} />
292
+ </IconWrapper>
293
+ );
202
294
  }
203
295
 
204
- // FIXME: @lixl39505 isOpen 没有用,是否要移除?
205
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
206
- export default function Products({ className, isOpen = undefined, ...rest }: ProductsProps) {
296
+ function AigneIcon({ color = 'black', backgroundColor = 'transparent' }: { color?: string; backgroundColor?: string }) {
297
+ return (
298
+ <IconWrapper color={color} backgroundColor={backgroundColor}>
299
+ <AigneSvg style={{ width: '100%', height: '100%' }} />
300
+ </IconWrapper>
301
+ );
302
+ }
303
+
304
+ // 智能 Link 组件,根据 URL origin 决定是否在新标签页打开
305
+ interface SmartLinkProps {
306
+ to: string;
307
+ children: React.ReactNode;
308
+ className?: string;
309
+ }
310
+ function SmartLink({ to, children, className = '' }: SmartLinkProps) {
311
+ const isExternal = () => {
312
+ try {
313
+ const url = new URL(to);
314
+ return url.origin !== window.location.origin;
315
+ } catch {
316
+ // 如果 to 不是有效的 URL,则认为是内部链接
317
+ return false;
318
+ }
319
+ };
320
+
321
+ if (isExternal()) {
322
+ return (
323
+ <Link to={to} target="_blank" rel="noreferrer noopener" className={className}>
324
+ {children}
325
+ </Link>
326
+ );
327
+ }
328
+
329
+ return (
330
+ <Link to={to} className={className}>
331
+ {children}
332
+ </Link>
333
+ );
334
+ }
335
+
336
+ export type ProductsType = 'AIGNE' | 'ARCBLOCK';
337
+ export interface ProductsProps extends BoxProps {
338
+ type: ProductsType;
339
+ }
340
+ export default function Products({ className = '', type, ...rest }: ProductsProps) {
207
341
  const { mode } = useNavMenuContext();
208
- const { palette } = useTheme();
209
- const wrapperRef = useRef<HTMLDivElement>(null);
342
+ const theme = useTheme();
210
343
  const { locale = 'en' } = useLocaleContext() || {};
344
+ const wrapperRef = useRef<HTMLDivElement>(null);
345
+
346
+ const { palette } = theme;
211
347
  const t = useMemoizedFn((key, data = {}) => translate(translations, key, locale, 'en', data));
348
+
349
+ // 添加状态来存储最大内容宽度
350
+ const [maxContentWidth, setMaxContentWidth] = useState(MIN_ITEM_CONTENT_WIDTH);
351
+
352
+ // 计算 item 最大宽度
353
+ const calculateMaxContentWidth = useMemoizedFn(() => {
354
+ if (!wrapperRef.current) return;
355
+
356
+ const contentElements = wrapperRef.current.querySelectorAll('.navmenu-item__content');
357
+ let maxWidth = MIN_ITEM_CONTENT_WIDTH; // 默认最小宽度
358
+
359
+ contentElements.forEach((element) => {
360
+ const curWidth = element.getBoundingClientRect().width + 64; // 增加 icon 以及 padding 的宽度
361
+ if (curWidth > maxWidth) {
362
+ maxWidth = curWidth;
363
+ }
364
+ });
365
+
366
+ setMaxContentWidth(maxWidth);
367
+ });
368
+
369
+ // 监听主题、语言、类型变化时重新计算最大宽度
370
+ useEffect(() => {
371
+ calculateMaxContentWidth();
372
+ }, [theme, locale, type, calculateMaxContentWidth]);
373
+
374
+ // 监听 navmenu-item__content 元素宽度变化
375
+ useEffect(() => {
376
+ if (!wrapperRef.current) return;
377
+
378
+ const itemContent = wrapperRef.current.querySelector('.navmenu-item__content');
379
+ if (!itemContent) return;
380
+
381
+ const resizeObserver = new ResizeObserver(() => {
382
+ calculateMaxContentWidth();
383
+ });
384
+
385
+ // 监听 item 内容宽度变化(字体改变引起)
386
+ resizeObserver.observe(itemContent);
387
+
388
+ // eslint-disable-next-line consistent-return
389
+ return () => {
390
+ resizeObserver.disconnect();
391
+ };
392
+ }, [calculateMaxContentWidth]);
393
+
212
394
  const groups = useCreation(() => {
213
- return [
214
- {
215
- type: 'Group',
216
- label: t('groups.applications'),
217
- children: [
218
- {
219
- label: (
220
- <Link to={`https://www.nftstudio.rocks/${locale}`} target="_blank" rel="noreferrer noopener">
221
- NFT Studio
222
- </Link>
223
- ),
224
- description: t('products.nftStudio.description'),
225
- icon: <NftStudioSvg />,
226
- },
227
- {
228
- label: (
229
- <Link
230
- to={`https://www.arcblock.io/content/collections/${locale}/creator-studio`}
231
- target="_blank"
232
- rel="noreferrer noopener">
233
- Creator Studio
234
- </Link>
235
- ),
236
- description: t('products.creatorStudio.description'),
237
- icon: <CreatorStudioSvg />,
238
- },
239
- {
240
- label: (
241
- <Link to={`https://www.aistro.io/${locale}`} target="_blank" rel="noreferrer noopener">
242
- Aistro
243
- </Link>
244
- ),
245
- description: t('products.aistro.description'),
246
- icon: <AistroSvg />,
247
- },
248
- {
249
- label: (
250
- <Link to="https://www.aigne.io/" target="_blank" rel="noreferrer noopener">
251
- AIGNE
252
- </Link>
253
- ),
254
- description: t('products.aigne.description'),
255
- icon: <AigneSvg style={{ filter: palette.mode === 'dark' ? 'invert(1)' : 'none' }} />,
256
- },
257
- {
258
- label: (
259
- <Link to={`https://www.arcsphere.io/${locale}`} target="_blank" rel="noreferrer noopener">
260
- ArcSphere
261
- </Link>
262
- ),
263
- description: t('products.arcsphere.description'),
264
- icon: <ArcSphereSvg />,
265
- },
266
- ],
267
- },
268
- {
269
- type: 'Group',
270
- label: t('groups.components'),
271
- children: [
272
- {
273
- label: (
274
- <Link to={`https://launcher.arcblock.io/${locale}`} target="_blank" rel="noreferrer noopener">
275
- Blocklet Launcher
276
- </Link>
277
- ),
278
- description: t('products.blockletLauncher.description'),
279
- icon: <BlockletLauncherSvg />,
280
- },
281
- {
282
- label: (
283
- <Link to={`https://www.aikit.rocks/${locale}`} target="_blank" rel="noreferrer noopener">
284
- AI Kit
285
- </Link>
286
- ),
287
- description: t('products.aiKit.description'),
288
- icon: <AIKitSvg />,
289
- },
290
- {
291
- label: (
292
- <Link to={`https://www.blocklet.io/${locale}/payment-kit`} target="_blank" rel="noreferrer noopener">
293
- Payment Kit
294
- </Link>
295
- ),
296
- description: t('products.paymentKit.description'),
297
- icon: <img src={PaymentKitPng} alt="Payment Kit" />,
298
- },
299
- {
300
- label: (
301
- <Link to={`https://store.blocklet.dev/?locale=${locale}`} target="_blank" rel="noreferrer noopener">
302
- Blocklet Store
303
- </Link>
304
- ),
305
- description: t('products.blockletStore.description'),
306
- icon: <BlockletStoreSvg />,
307
- },
308
- {
309
- label: (
310
- <Link to={`https://www.web3kit.rocks/${locale}`} target="_blank" rel="noreferrer noopener">
311
- Web3 Kit
312
- </Link>
313
- ),
314
- description: t('products.web3Kit.description'),
315
- icon: <Web3KitSvg />,
316
- },
317
- ],
318
- },
319
- {
320
- type: 'Group',
321
- label: t('groups.computeStorage'),
322
- children: [
323
- {
324
- label: (
325
- <Link
326
- to={`https://www.arcblock.io/content/collections/${locale}/blocklet`}
327
- target="_blank"
328
- rel="noreferrer noopener">
329
- Blocklet Framework
330
- </Link>
331
- ),
332
- description: t('products.blockletFramework.description'),
333
- icon: <BlockletFrameworkSvg />,
334
- },
335
- {
336
- label: (
337
- <Link to={`https://www.didspaces.com/${locale}`} target="_blank" rel="noreferrer noopener">
338
- DID Spaces
339
- </Link>
340
- ),
341
- description: t('products.didSpaces.description'),
342
- icon: <DidSvg />,
343
- },
344
- {
345
- label: (
346
- <Link to="https://main.abtnetwork.io/" target="_blank" rel="noreferrer noopener">
347
- ABT Network
348
- </Link>
349
- ),
350
- description: t('products.abtNetwork.description'),
351
- icon: <AbtNetworkSvg />,
352
- },
353
- {
354
- label: (
355
- <Link to={`https://www.blocklet.io/${locale}/blocklet-server`} target="_blank" rel="noreferrer noopener">
356
- Blocklet Server
357
- </Link>
358
- ),
359
- description: t('products.blockletServer.description'),
360
- icon: <BlockletServerSvg />,
361
- },
362
- {
363
- label: (
364
- <Link
365
- to={`https://www.arcblock.io/content/collections/${locale}/ocap`}
366
- target="_blank"
367
- rel="noreferrer noopener">
368
- ОСАР
369
- </Link>
370
- ),
371
- description: t('products.ocap.description'),
372
- icon: <OCAPSvg />,
373
- },
374
- ],
375
- },
376
- {
377
- type: 'Group',
378
- label: t('groups.identity'),
379
- children: [
380
- {
381
- label: (
382
- <Link
383
- to={`https://www.arcblock.io/content/collections/${locale}/did`}
384
- target="_blank"
385
- rel="noreferrer noopener">
386
- DID
387
- </Link>
388
- ),
389
- description: t('products.did.description'),
390
- icon: <DidSvg />,
391
- },
392
- {
393
- label: (
394
- <Link to={`https://www.didwallet.io/${locale}`} target="_blank" rel="noreferrer noopener">
395
- DID Wallet
396
- </Link>
397
- ),
398
- description: t('products.didWallet.description'),
399
- icon: <DidWalletSvg />,
400
- },
401
- {
402
- label: (
403
- <Link to={`https://www.didnames.io/${locale}`} target="_blank" rel="noreferrer noopener">
404
- DID Names
405
- </Link>
406
- ),
407
- description: t('products.didNameService.description'),
408
- icon: <DidNameServiceSvg />,
409
- },
410
- {
411
- label: (
412
- <Link
413
- to={`https://www.arcblock.io/content/collections/${locale}/verifiable-credential`}
414
- target="_blank"
415
- rel="noreferrer noopener">
416
- VC
417
- </Link>
418
- ),
419
- description: t('products.vc.description'),
420
- icon: <VCSvg />,
421
- },
422
- {
423
- label: (
424
- <Link to={`https://www.didconnect.io/${locale}`} target="_blank" rel="noreferrer noopener">
425
- DID Connect
426
- </Link>
427
- ),
428
- description: t('products.didConnect.description'),
429
- icon: <DidConnectSvg />,
430
- },
431
- ],
432
- },
433
- ];
395
+ if (type === 'ARCBLOCK') {
396
+ return [
397
+ {
398
+ type: 'Group',
399
+ label: t('groups.applications'),
400
+ children: [
401
+ {
402
+ label: <SmartLink to={`https://www.nftstudio.rocks/${locale}`}>NFT Studio</SmartLink>,
403
+ description: t('products.nftStudio.description'),
404
+ icon: <NftStudioSvg />,
405
+ },
406
+ {
407
+ label: (
408
+ <Link
409
+ to={`https://www.arcblock.io/content/collections/${locale}/creator-studio`}
410
+ target="_blank"
411
+ rel="noreferrer noopener">
412
+ Creator Studio
413
+ </Link>
414
+ ),
415
+ description: t('products.creatorStudio.description'),
416
+ icon: <CreatorStudioSvg />,
417
+ },
418
+ {
419
+ label: <SmartLink to="https://www.aigne.io/">AIGNE</SmartLink>,
420
+ description: t('products.aigne.description'),
421
+ icon: <AigneIcon color={palette.mode === 'dark' ? 'white' : 'black'} />,
422
+ },
423
+ {
424
+ label: <SmartLink to={`https://www.arcsphere.io/${locale}`}>ArcSphere</SmartLink>,
425
+ description: t('products.arcsphere.description'),
426
+ icon: <ArcSphereSvg />,
427
+ },
428
+ ],
429
+ },
430
+ {
431
+ type: 'Group',
432
+ label: t('groups.components'),
433
+ children: [
434
+ {
435
+ label: <SmartLink to={`https://launcher.arcblock.io/${locale}`}>Blocklet Launcher</SmartLink>,
436
+ description: t('products.blockletLauncher.description'),
437
+ icon: <BlockletLauncherSvg />,
438
+ },
439
+ {
440
+ label: <SmartLink to={`https://www.blocklet.io/${locale}/payment-kit`}>Payment Kit</SmartLink>,
441
+ description: t('products.paymentKit.description'),
442
+ icon: <img src={PaymentKitPng} alt="Payment Kit" />,
443
+ },
444
+ {
445
+ label: <SmartLink to={`https://store.blocklet.dev/?locale=${locale}`}>Blocklet Store</SmartLink>,
446
+ description: t('products.blockletStore.description'),
447
+ icon: <BlockletStoreSvg />,
448
+ },
449
+ {
450
+ label: <SmartLink to={`https://www.web3kit.rocks/${locale}`}>Web3 Kit</SmartLink>,
451
+ description: t('products.web3Kit.description'),
452
+ icon: <Web3KitSvg />,
453
+ },
454
+ ],
455
+ },
456
+ {
457
+ type: 'Group',
458
+ label: t('groups.computeStorage'),
459
+ children: [
460
+ {
461
+ label: (
462
+ <Link
463
+ to={`https://www.arcblock.io/content/collections/${locale}/blocklet`}
464
+ target="_blank"
465
+ rel="noreferrer noopener">
466
+ Blocklet Framework
467
+ </Link>
468
+ ),
469
+ description: t('products.blockletFramework.description'),
470
+ icon: <BlockletFrameworkSvg />,
471
+ },
472
+ {
473
+ label: (
474
+ <Link to={`https://www.didspaces.com/${locale}`} target="_blank" rel="noreferrer noopener">
475
+ DID Spaces
476
+ </Link>
477
+ ),
478
+ description: t('products.didSpaces.description'),
479
+ icon: <DIDIcon color="#876bf4" />,
480
+ },
481
+ {
482
+ label: (
483
+ <Link to="https://main.abtnetwork.io/" target="_blank" rel="noreferrer noopener">
484
+ ABT Network
485
+ </Link>
486
+ ),
487
+ description: t('products.abtNetwork.description'),
488
+ icon: <AbtNetworkSvg />,
489
+ },
490
+ {
491
+ label: <SmartLink to={`https://www.blocklet.io/${locale}/blocklet-server`}>Blocklet Server</SmartLink>,
492
+ description: t('products.blockletServer.description'),
493
+ icon: <BlockletServerSvg />,
494
+ },
495
+ {
496
+ label: <SmartLink to={`https://www.arcblock.io/content/collections/${locale}/ocap`}>ОСАР</SmartLink>,
497
+ description: t('products.ocap.description'),
498
+ icon: <OCAPSvg />,
499
+ },
500
+ ],
501
+ },
502
+ {
503
+ type: 'Group',
504
+ label: t('groups.identity'),
505
+ children: [
506
+ {
507
+ label: <SmartLink to={`https://www.arcblock.io/content/collections/${locale}/did`}>DID</SmartLink>,
508
+ description: t('products.did.description'),
509
+ icon: <DIDIcon color="#5b96f3" />,
510
+ },
511
+ {
512
+ label: <SmartLink to={`https://www.didwallet.io/${locale}`}>DID Wallet</SmartLink>,
513
+ description: t('products.didWallet.description'),
514
+ icon: <DidWalletSvg />,
515
+ },
516
+ {
517
+ label: (
518
+ <Link to={`https://www.didnames.io/${locale}`} target="_blank" rel="noreferrer noopener">
519
+ DID Names
520
+ </Link>
521
+ ),
522
+ description: t('products.didNameService.description'),
523
+ icon: <DIDIcon color="#678ab0" />,
524
+ },
525
+ {
526
+ label: (
527
+ <SmartLink to={`https://www.arcblock.io/content/collections/${locale}/verifiable-credential`}>
528
+ VC
529
+ </SmartLink>
530
+ ),
531
+ description: t('products.vc.description'),
532
+ icon: <VCSvg />,
533
+ },
534
+ {
535
+ label: <SmartLink to={`https://www.didconnect.io/${locale}`}>DID Connect</SmartLink>,
536
+ description: t('products.didConnect.description'),
537
+ icon: <DIDIcon color="#5bbec5" />,
538
+ },
539
+ ],
540
+ },
541
+ ];
542
+ }
543
+
544
+ if (type === 'AIGNE') {
545
+ return [
546
+ {
547
+ type: 'Group',
548
+ label: t('groups.applications'),
549
+ children: [
550
+ {
551
+ label: <SmartLink to={`https://www.arcsphere.io/${locale}`}>ArcSphere</SmartLink>,
552
+ description: t('products.arcsphere.description'),
553
+ icon: <ArcSphereSvg />,
554
+ },
555
+ {
556
+ label: <SmartLink to={`https://www.aistro.io/${locale}`}>Aistro</SmartLink>,
557
+ description: t('products.aistro.description'),
558
+ icon: <img src={AistroPng} alt="Aistro" />,
559
+ },
560
+ {
561
+ label: <SmartLink to="https://www.aigne.io/doc-smith">AIGNE CodeSmith</SmartLink>,
562
+ description: t('products.aigneCodeSmith.description'),
563
+ icon: <AigneIcon color="#56a596" backgroundColor="#e9fcf6" />,
564
+ },
565
+ {
566
+ label: <SmartLink to="https://www.aigne.io/code-smith">AIGNE DocSmith</SmartLink>,
567
+ description: t('products.aigneDocSmith.description'),
568
+ icon: <AigneIcon color="#e46f38" backgroundColor="#f7e0d7" />,
569
+ },
570
+ {
571
+ label: <SmartLink to="https://www.aigne.io/web-smith">AIGNE WebSmith</SmartLink>,
572
+ description: t('products.aigneWebSmith.description'),
573
+ icon: <AigneIcon color="#7c45eb" backgroundColor="#f0e9ff" />,
574
+ },
575
+ ],
576
+ },
577
+ {
578
+ type: 'Group',
579
+ label: t('groups.frameworkTools'),
580
+ children: [
581
+ {
582
+ label: <SmartLink to="https://www.aigne.io/cli">AIGNE CLI</SmartLink>,
583
+ description: t('products.aigneCLI.description'),
584
+ icon: <AigneIcon color="#d05d4e" backgroundColor="#faeaea" />,
585
+ },
586
+ {
587
+ label: <SmartLink to="https://www.aigne.io/observability">AIGNE Observability</SmartLink>,
588
+ description: t('products.aigneObservability.description'),
589
+ icon: <AigneIcon color="#6ba456" backgroundColor="#edfae8" />,
590
+ },
591
+ {
592
+ label: <SmartLink to="https://www.aigne.io/studio">AIGNE Studio</SmartLink>,
593
+ description: t('products.aigneStudio.description'),
594
+ icon: <AigneIcon color="#676cbf" backgroundColor="#edeeff" />,
595
+ },
596
+ {
597
+ label: <SmartLink to="https://www.aigne.io/framework">AIGNE Framework</SmartLink>,
598
+ description: t('products.aigneFramework.description'),
599
+ icon: <AigneIcon color="#5086d0" backgroundColor="#eef4ff" />,
600
+ },
601
+ ],
602
+ },
603
+ {
604
+ type: 'Group',
605
+ label: t('groups.modelsAdapters'),
606
+ children: [
607
+ {
608
+ label: <SmartLink to="https://www.aigne.io/hub">AIGNE Hub</SmartLink>,
609
+ description: t('products.aigneHub.description'),
610
+ icon: <AigneIcon color="#e4930b" backgroundColor="#fbf4d4" />,
611
+ },
612
+ ],
613
+ },
614
+ ];
615
+ }
616
+
617
+ return [];
434
618
  }, [t, locale, palette]);
435
619
 
436
620
  return (
437
- <Wrapper ref={wrapperRef} className={`is-${mode} ${className}`} {...rest}>
621
+ <Wrapper ref={wrapperRef} className={`nav-menu-products is-${mode} ${className}`} {...rest}>
438
622
  {groups.map((group) => (
439
623
  <SubItemGroup key={group.label} label={group.label}>
440
- <Grid container columnSpacing={1} rowSpacing={1}>
624
+ <GridBox maxContent={maxContentWidth}>
441
625
  {group.children.map((item) => (
442
- <Grid
443
- key={item.description}
444
- size={{
445
- xs: 12,
446
- md: 6,
447
- lg: 4,
448
- }}>
449
- <Item variant="panel" style={{ padding: '8px' }} {...item} />
450
- </Grid>
626
+ <Item variant="panel" style={{ padding: '8px' }} {...item} />
451
627
  ))}
452
- </Grid>
628
+ </GridBox>
453
629
  </SubItemGroup>
454
630
  ))}
455
631
  </Wrapper>