+ {charts?.map((chart, i) => {
+ return (
+
+
+
+
+
+ );
+ })}
+
+ );
+};
+
+export default Charts;
diff --git a/packages/vchart-aurora-theme/demo/src/createServiceWorker.js b/packages/vchart-aurora-theme/demo/src/createServiceWorker.js
new file mode 100644
index 0000000..5445ef5
--- /dev/null
+++ b/packages/vchart-aurora-theme/demo/src/createServiceWorker.js
@@ -0,0 +1,52 @@
+// In production, we register a service worker to serve assets from local cache.
+
+// This lets the app load faster on subsequent visits in production, and gives
+// it offline capabilities. However, it also means that developers (and users)
+// will only see deployed updates on the "N+1" visit to a page, since previously
+// cached resources are updated in the background.
+
+// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
+// This link also includes instructions on opting out of this behavior.
+
+export default function register() {
+ if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
+ window.addEventListener('load', () => {
+ const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
+ navigator.serviceWorker
+ .register(swUrl)
+ .then(registration => {
+ // eslint-disable-next-line no-param-reassign
+ registration.onupdatefound = () => {
+ const installingWorker = registration.installing;
+ installingWorker.onstatechange = () => {
+ if (installingWorker.state === 'installed') {
+ if (navigator.serviceWorker.controller) {
+ // At this point, the old content will have been purged and
+ // the fresh content will have been added to the cache.
+ // It's the perfect time to display a "New content is
+ // available; please refresh." message in your web app.
+ console.log('New content is available; please refresh.'); // eslint-disable-line no-console
+ } else {
+ // At this point, everything has been precached.
+ // It's the perfect time to display a
+ // "Content is cached for offline use." message.
+ console.log('Content is cached for offline use.'); // eslint-disable-line no-console
+ }
+ }
+ };
+ };
+ })
+ .catch(error => {
+ console.error('Error during service worker registration:', error);
+ });
+ });
+ }
+}
+
+export function unregister() {
+ if ('serviceWorker' in navigator) {
+ navigator.serviceWorker.ready.then(registration => {
+ registration.unregister();
+ });
+ }
+}
diff --git a/packages/vchart-aurora-theme/demo/src/font.css b/packages/vchart-aurora-theme/demo/src/font.css
new file mode 100644
index 0000000..2946fa4
--- /dev/null
+++ b/packages/vchart-aurora-theme/demo/src/font.css
@@ -0,0 +1,31 @@
+@font-face {
+ font-family: 'DouyinNumber';
+ src: url('https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-ljuhpssh/ljhwZthlaukjlkulzlp/DouyinNumberABC/DouyinNumberABC-Medium.otf');
+ font-weight: 400;
+ font-style: normal;
+ font-display: block;
+}
+
+@font-face {
+ font-family: 'DouyinNumber';
+ src: url('https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-ljuhpssh/ljhwZthlaukjlkulzlp/DouyinNumberABC/DouyinNumberABC-Bold.otf');
+ font-weight: 500;
+ font-style: normal;
+ font-display: block;
+}
+
+@font-face {
+ font-family: 'DouyinNumber';
+ src: url('https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-ljuhpssh/ljhwZthlaukjlkulzlp/DouyinNumberABC/DouyinNumberABC-Bold.otf');
+ font-weight: 600;
+ font-style: normal;
+ font-display: block;
+}
+
+@font-face {
+ font-family: 'DouyinNumber';
+ src: url('https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-ljuhpssh/ljhwZthlaukjlkulzlp/DouyinNumberABC/DouyinNumberABC-ExtraBold.otf');
+ font-weight: 700;
+ font-style: normal;
+ font-display: block;
+}
diff --git a/packages/vchart-aurora-theme/demo/src/frame.jsx b/packages/vchart-aurora-theme/demo/src/frame.jsx
new file mode 100644
index 0000000..aa54635
--- /dev/null
+++ b/packages/vchart-aurora-theme/demo/src/frame.jsx
@@ -0,0 +1,74 @@
+import React, { useState } from 'react';
+import { Nav, Avatar } from '@douyinfe/semi-ui';
+import { IconSemiLogo, IconFeishuLogo, IconHelpCircle, IconBell } from '@douyinfe/semi-icons';
+import styles from './index.module.scss';
+import Charts from './charts.jsx';
+import { chartCategories, getChartsByCategory } from './chart-list';
+
+const Frame = () => {
+ const [selectedKey, setSelectedKey] = useState('bar');
+
+ const currentCharts = getChartsByCategory(selectedKey);
+
+ const getCategoryTitle = key => {
+ const category = chartCategories.find(c => c.key === key);
+ return category ? category.title : '图表展示';
+ };
+
+ return (
+