diff --git a/packages/stage-ui/package.json b/packages/stage-ui/package.json index 12277036a..d04451584 100644 --- a/packages/stage-ui/package.json +++ b/packages/stage-ui/package.json @@ -54,6 +54,7 @@ "@pixiv/three-vrm-animation": "^3.4.1", "@pixiv/three-vrm-core": "^3.4.1", "@proj-airi/ccc": "workspace:^", + "@proj-airi/chromatic": "^0.0.7", "@proj-airi/drizzle-duckdb-wasm": "catalog:", "@proj-airi/font-cjkfonts-allseto": "workspace:^", "@proj-airi/font-xiaolai": "workspace:^", diff --git a/packages/stage-ui/src/components/Gadgets/TimeSeriesChart.story.vue b/packages/stage-ui/src/components/Gadgets/TimeSeriesChart.story.vue new file mode 100644 index 000000000..41e5683a1 --- /dev/null +++ b/packages/stage-ui/src/components/Gadgets/TimeSeriesChart.story.vue @@ -0,0 +1,459 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Minimal Chart + + + + Clean, minimal visualization + + + + + + + Line Only + + + + Line without fill areas + + + + + + + Custom Style + + + + Purple theme with thick line + + + + + + + + + + + System Monitoring Dashboard + + + + + + + Primary Metrics + + + + + + + + + + + Secondary Metrics + + + + + + + + + + + + + + + + + + Voice Activity Detection + + + + + + + + Anomaly Detection + + + + + + + + diff --git a/packages/stage-ui/src/components/Gadgets/TimeSeriesChart.vue b/packages/stage-ui/src/components/Gadgets/TimeSeriesChart.vue new file mode 100644 index 000000000..a0aab716d --- /dev/null +++ b/packages/stage-ui/src/components/Gadgets/TimeSeriesChart.vue @@ -0,0 +1,345 @@ + + + + + + + {{ title }} + + + {{ subtitle }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ formatValue ? formatValue(currentValue) : `${(currentValue * 100).toFixed(precision)}${unit}` }} + + + + + + + + {{ activeLabel }} + + + + + + + + + + {{ activeLegendLabel }} + + + + {{ inactiveLegendLabel }} + + + {{ thresholdLabel }}: {{ (threshold * 100).toFixed(0) }}% + + + + + diff --git a/packages/stage-ui/src/components/Gadgets/index.ts b/packages/stage-ui/src/components/Gadgets/index.ts index 386d56ef3..66f97a1f9 100644 --- a/packages/stage-ui/src/components/Gadgets/index.ts +++ b/packages/stage-ui/src/components/Gadgets/index.ts @@ -3,3 +3,4 @@ export { default as AudioSpectrumVisualizer } from './AudioSpectrumVisualizer.vu export { default as LevelMeter } from './LevelMeter.vue' export { default as TestDummyMarker } from './TestDummyMarker.vue' export { default as ThresholdMeter } from './ThresholdMeter.vue' +export { default as TimeSeriesChart } from './TimeSeriesChart.vue' diff --git a/packages/stage-ui/src/constants/index.ts b/packages/stage-ui/src/constants/index.ts index cedbadabd..035643f4b 100644 --- a/packages/stage-ui/src/constants/index.ts +++ b/packages/stage-ui/src/constants/index.ts @@ -1,4 +1,6 @@ export const llmInferenceEndToken = '<|llm_inference_end|>' export * from './emotions' +export * from './inject' export * from './prompts/system-v2' +export * from './theme' diff --git a/packages/stage-ui/src/constants/inject.ts b/packages/stage-ui/src/constants/inject.ts new file mode 100644 index 000000000..a35abbf96 --- /dev/null +++ b/packages/stage-ui/src/constants/inject.ts @@ -0,0 +1,3 @@ +import type { InjectionKey } from 'vue' + +export const chromaticHue: InjectionKey = Symbol('@proj-airi/chromatic-hue') diff --git a/packages/stage-ui/src/constants/theme.ts b/packages/stage-ui/src/constants/theme.ts new file mode 100644 index 000000000..815f724e5 --- /dev/null +++ b/packages/stage-ui/src/constants/theme.ts @@ -0,0 +1 @@ +export const chromaticHueDefault = 220.44 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee8834ce8..d23e2511b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -990,6 +990,9 @@ importers: '@proj-airi/ccc': specifier: workspace:^ version: link:../ccc + '@proj-airi/chromatic': + specifier: ^0.0.7 + version: 0.0.7 '@proj-airi/drizzle-duckdb-wasm': specifier: 'catalog:' version: 0.4.28(drizzle-orm@0.44.2(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(web-worker@1.5.0) @@ -4234,6 +4237,9 @@ packages: '@polka/url@1.0.0-next.24': resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + '@proj-airi/chromatic@0.0.7': + resolution: {integrity: sha512-4uxJhnbdJ6vRWeivuVy4z20cTwHbH+armAHqZNJozaspCtwCyN1AMkvJmj6+4BuuQO1iwQ6KvSHrNcNUGkOtZg==} + '@proj-airi/drizzle-duckdb-wasm@0.4.28': resolution: {integrity: sha512-1Y+7YdFbVgY9vUUAzm+a5QfSLnJkyhqxTENqZQbFmfCRn3rQO4KPLvu/l6HBg7GtLtlIYVIIOG37QiRexuofGw==} peerDependencies: @@ -5769,6 +5775,9 @@ packages: '@xsai/shared@0.3.0-beta.5': resolution: {integrity: sha512-0vDW0fkEcFhfd3uG2OEMkoqq/ghh62KJUokMUwaAPKLNcVNAVcFRoslH9lKjdHJziSZ/b59f5rpUEjU3DHooZQ==} + '@xsai/shared@0.3.0-beta.6': + resolution: {integrity: sha512-EeqkD4+ijKKbxr9Jy9kRnJOcPBErWL8TK2wOdxwhVQuh7VbrYQwaheGjOz9g5OWwM6A0vCje/+TyHz+tURhhqw==} + '@xsai/stream-text@0.3.0-beta.5': resolution: {integrity: sha512-o0SxwzCA2F1zKcONZJX7qrk+PnKhzldV0jRqQ+NdBzaFLmg/clfqeENlbuwmfIrV5ck0BfPEMTo4gNBfxhsGSQ==} @@ -14880,6 +14889,10 @@ snapshots: '@polka/url@1.0.0-next.24': {} + '@proj-airi/chromatic@0.0.7': + dependencies: + culori: 4.0.2 + '@proj-airi/drizzle-duckdb-wasm@0.4.28(drizzle-orm@0.44.2(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(web-worker@1.5.0)': dependencies: '@date-fns/tz': 1.2.0 @@ -16826,7 +16839,7 @@ snapshots: '@xsai-ext/shared-providers@0.2.2': dependencies: - '@xsai/shared': 0.3.0-beta.5 + '@xsai/shared': 0.3.0-beta.6 '@xsai-ext/shared-providers@0.3.0-beta.5': dependencies: @@ -16880,6 +16893,8 @@ snapshots: '@xsai/shared@0.3.0-beta.5': {} + '@xsai/shared@0.3.0-beta.6': {} + '@xsai/stream-text@0.3.0-beta.5': dependencies: '@xsai/shared-chat': 0.3.0-beta.5
+ Clean, minimal visualization +
+ Line without fill areas +
+ Purple theme with thick line +