@baron1996/klinecharts-runtime 0.9.20 → 0.9.21

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/README.md CHANGED
@@ -4,7 +4,7 @@ Browser editing runtime and standard annotation toolbar for deterministic KLineC
4
4
  ChartScene files.
5
5
 
6
6
  ```bash
7
- npm install --save-exact @baron1996/kline-scene-schema@0.9.20 @baron1996/klinecharts-runtime@0.9.20
7
+ npm install --save-exact @baron1996/kline-scene-schema@0.9.21 @baron1996/klinecharts-runtime@0.9.21
8
8
  ```
9
9
 
10
10
  ```ts
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /** Web Runtime npm 包版本;ChartScene runtimeVersion 是独立的数据契约版本。 */
2
- export declare const WEB_RUNTIME_PACKAGE_VERSION: "0.9.20";
2
+ export declare const WEB_RUNTIME_PACKAGE_VERSION: "0.9.21";
3
3
  export { SUPPORTED_OVERLAYS } from '@baron1996/klinecharts-adapter';
4
4
  export * from './cross-period/coordinator.js';
5
5
  export * from './drawing/capabilities.js';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /** Web Runtime npm 包版本;ChartScene runtimeVersion 是独立的数据契约版本。 */
2
- export const WEB_RUNTIME_PACKAGE_VERSION = '0.9.20';
2
+ export const WEB_RUNTIME_PACKAGE_VERSION = '0.9.21';
3
3
  export { SUPPORTED_OVERLAYS } from '@baron1996/klinecharts-adapter';
4
4
  export * from './cross-period/coordinator.js';
5
5
  export * from './drawing/capabilities.js';
@@ -1 +1 @@
1
- {"version":3,"file":"chart-workspace-toolbar-styles.d.ts","sourceRoot":"","sources":["../../src/toolbar/chart-workspace-toolbar-styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAoN1C,CAAC"}
1
+ {"version":3,"file":"chart-workspace-toolbar-styles.d.ts","sourceRoot":"","sources":["../../src/toolbar/chart-workspace-toolbar-styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAkP1C,CAAC"}
@@ -166,9 +166,37 @@ export const CHART_WORKSPACE_TOOLBAR_STYLES = String.raw `
166
166
  .baron-chart-workspace-popover__grid { display: grid; grid-template-columns: repeat(3, minmax(58px, 1fr)); gap: 5px; }
167
167
  .baron-chart-workspace-popover__grid .baron-chart-workspace-toolbar__button { width: 100%; border: 1px solid rgba(231, 233, 238, 1); }
168
168
  .baron-chart-workspace-popover__group + .baron-chart-workspace-popover__group { padding-top: 10px; margin-top: 10px; border-top: 1px solid rgba(233, 235, 239, 1); }
169
- .baron-chart-workspace-popover__row { display: grid; grid-template-columns: 76px minmax(120px, 1fr); align-items: center; gap: 10px; min-height: 34px; }
169
+ .baron-chart-workspace-popover__settings { display: grid; gap: 8px; }
170
+ .baron-chart-workspace-popover__row { display: grid; grid-template-columns: 56px minmax(152px, 1fr); align-items: center; gap: 12px; min-height: 32px; }
170
171
  .baron-chart-workspace-popover__label { color: rgba(102, 108, 122, 1); font-size: 11px; }
172
+ .baron-chart-workspace-popover__control { display: grid; min-width: 0; gap: 4px; }
171
173
  .baron-chart-workspace-popover__row .baron-chart-workspace-toolbar__select { width: 100%; max-width: none; background: rgba(247, 248, 250, 1); border: 1px solid rgba(226, 228, 233, 1); border-radius: 6px; }
174
+ .baron-chart-workspace-popover__segmented {
175
+ display: inline-flex;
176
+ width: 100%;
177
+ padding: 2px;
178
+ background: rgba(244, 246, 249, 1);
179
+ border: 1px solid rgba(226, 228, 233, 1);
180
+ border-radius: 999px;
181
+ }
182
+ .baron-chart-workspace-popover__segmented .baron-chart-workspace-popover__segment {
183
+ flex: 1 1 0;
184
+ min-width: 0;
185
+ height: 26px;
186
+ padding: 0 10px;
187
+ border-radius: 999px;
188
+ font-size: 11px;
189
+ transition: color 120ms ease, background-color 120ms ease, box-shadow 120ms ease;
190
+ }
191
+ .baron-chart-workspace-popover__segmented .baron-chart-workspace-popover__segment:hover:not(:disabled) {
192
+ color: rgba(41, 98, 255, 1);
193
+ background: rgba(41, 98, 255, .06);
194
+ }
195
+ .baron-chart-workspace-popover__segmented .baron-chart-workspace-popover__segment[aria-pressed="true"] {
196
+ color: rgba(41, 98, 255, 1);
197
+ background: rgba(255, 255, 255, 1);
198
+ box-shadow: 0 1px 3px rgba(20, 23, 31, .14);
199
+ }
172
200
  .baron-chart-workspace-popover__text-form { display: flex; gap: 6px; }
173
201
  .baron-chart-workspace-popover__text-form input {
174
202
  width: 180px;
@@ -204,10 +232,12 @@ export const CHART_WORKSPACE_TOOLBAR_STYLES = String.raw `
204
232
  .baron-chart-workspace-toolbar--top { height: 42px; padding: 0 4px; }
205
233
  .baron-chart-workspace-toolbar__timezone { padding-left: 3px; }
206
234
  .baron-chart-workspace-toolbar__select { max-width: 112px; }
235
+ .baron-chart-workspace-popover__row { grid-template-columns: 50px minmax(146px, 1fr); gap: 8px; }
207
236
  }
208
237
 
209
238
  @media (prefers-reduced-motion: reduce) {
210
239
  .baron-chart-workspace-toolbar__button,
211
- .baron-chart-workspace-popover { transition: none; }
240
+ .baron-chart-workspace-popover,
241
+ .baron-chart-workspace-popover__segmented .baron-chart-workspace-popover__segment { transition: none; }
212
242
  }
213
243
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"chart-workspace-toolbar.d.ts","sourceRoot":"","sources":["../../src/toolbar/chart-workspace-toolbar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,gCAAgC,EAChC,wBAAwB,EACxB,8BAA8B,EAC9B,0BAA0B,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAaxF,KAAK,qBAAqB,GAAG,wBAAwB,GACpD,0BAA0B,GAC1B,8BAA8B,GAC9B,gCAAgC,CAAC;AAElC,MAAM,WAAW,8BAA8B;IAC9C,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC5C,uDAAuD;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACzD,8BAA8B;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC/D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,8BAA8B,EAAE,CAAC;IAC5E,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAClC,MAAM,EAAE,8BAA8B,KAClC,IAAI,CAAC;IACV,QAAQ,CAAC,gBAAgB,CAAC,EAAE,WAAW,CAAC;IACxC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,kBAAkB,CACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;QACN,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACtC,GACC,IAAI,CAAC;IACR,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC;CAChB;AAiTD;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,4BAAiC,GACxC,qBAAqB,CA0jBvB"}
1
+ {"version":3,"file":"chart-workspace-toolbar.d.ts","sourceRoot":"","sources":["../../src/toolbar/chart-workspace-toolbar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,gCAAgC,EAChC,wBAAwB,EACxB,8BAA8B,EAC9B,0BAA0B,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAaxF,KAAK,qBAAqB,GAAG,wBAAwB,GACpD,0BAA0B,GAC1B,8BAA8B,GAC9B,gCAAgC,CAAC;AAElC,MAAM,WAAW,8BAA8B;IAC9C,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC5C,uDAAuD;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACzD,8BAA8B;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC/D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,8BAA8B,EAAE,CAAC;IAC5E,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAClC,MAAM,EAAE,8BAA8B,KAClC,IAAI,CAAC;IACV,QAAQ,CAAC,gBAAgB,CAAC,EAAE,WAAW,CAAC;IACxC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,kBAAkB,CACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;QACN,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACtC,GACC,IAAI,CAAC;IACR,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC;CAChB;AAyVD;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,4BAAiC,GACxC,qBAAqB,CA2jBvB"}
@@ -44,6 +44,31 @@ function createSection(label, end = false) {
44
44
  section.setAttribute('aria-label', label);
45
45
  return section;
46
46
  }
47
+ function createSettingsRow(labelText, settingName) {
48
+ const row = document.createElement('div');
49
+ row.className = 'baron-chart-workspace-popover__row';
50
+ row.dataset.settingName = settingName;
51
+ const label = document.createElement('span');
52
+ label.className = 'baron-chart-workspace-popover__label';
53
+ label.textContent = labelText;
54
+ const control = document.createElement('div');
55
+ control.className = 'baron-chart-workspace-popover__control';
56
+ row.append(label, control);
57
+ return { row, control };
58
+ }
59
+ function createSegmentedControl(label, action) {
60
+ const control = document.createElement('div');
61
+ control.className = 'baron-chart-workspace-popover__segmented';
62
+ control.dataset.action = action;
63
+ control.setAttribute('role', 'group');
64
+ control.setAttribute('aria-label', label);
65
+ return control;
66
+ }
67
+ function selectSegment(buttons, activeValue) {
68
+ for (const [value, button] of buttons) {
69
+ button.setAttribute('aria-pressed', String(value === activeValue));
70
+ }
71
+ }
47
72
  function createPopover(button, id, cleanupCallbacks) {
48
73
  const element = document.createElement('div');
49
74
  element.id = id;
@@ -403,71 +428,66 @@ export function createChartWorkspaceToolbar(containers, runtime, options = {}) {
403
428
  endSection.append(settingsButton);
404
429
  const settingsPopover = createPopover(settingsButton, `baron-workspace-settings-${toolbarId}`, cleanupCallbacks);
405
430
  openPopovers.push(settingsPopover);
431
+ const settingsList = document.createElement('div');
432
+ settingsList.className = 'baron-chart-workspace-popover__settings';
406
433
  if ((options.settingsHostActions?.length ?? 0) > 0) {
407
- const group = document.createElement('div');
408
- group.className = 'baron-chart-workspace-popover__group';
409
- const title = document.createElement('div');
410
- title.className = 'baron-chart-workspace-popover__title';
411
- title.textContent = '宿主设置';
412
- const grid = document.createElement('div');
413
- grid.className = 'baron-chart-workspace-popover__grid';
434
+ const { row, control } = createSettingsRow('复权', 'adjustment');
435
+ const segmented = createSegmentedControl('复权', 'host-settings');
414
436
  for (const action of options.settingsHostActions ?? []) {
415
- const control = hostActionControls.get(action.actionId);
416
- grid.append(control.button);
417
- group.append(control.error);
437
+ const hostControl = hostActionControls.get(action.actionId);
438
+ hostControl.button.classList.add('baron-chart-workspace-popover__segment');
439
+ segmented.append(hostControl.button);
440
+ control.append(hostControl.error);
418
441
  }
419
- group.prepend(title, grid);
420
- settingsPopover.element.append(group);
442
+ control.prepend(segmented);
443
+ settingsList.append(row);
421
444
  }
422
- const chartSettingsGroup = document.createElement('div');
423
- chartSettingsGroup.className = 'baron-chart-workspace-popover__group';
424
- const chartSettingsTitle = document.createElement('div');
425
- chartSettingsTitle.className = 'baron-chart-workspace-popover__title';
426
- chartSettingsTitle.textContent = '图表显示';
427
- chartSettingsGroup.append(chartSettingsTitle);
428
445
  if (descriptor.valueAxis.mutable) {
429
- const row = document.createElement('label');
430
- row.className = 'baron-chart-workspace-popover__row';
431
- const label = document.createElement('span');
432
- label.className = 'baron-chart-workspace-popover__label';
433
- label.textContent = '价格轴';
434
- const select = document.createElement('select');
435
- select.className = 'baron-chart-workspace-toolbar__select';
436
- select.dataset.action = 'price-scale';
446
+ const { row, control } = createSettingsRow('价格轴', 'price-scale');
447
+ const segmented = createSegmentedControl('价格轴', 'price-scale');
448
+ const scaleButtons = new Map();
437
449
  for (const scale of descriptor.valueAxis.supportedScales) {
438
- const option = document.createElement('option');
439
- option.value = scale;
440
- option.textContent = scale === 'linear' ? '线性' : '对数';
441
- select.append(option);
450
+ const label = scale === 'linear' ? '线性' : '对数';
451
+ const button = createButton({
452
+ label: `${label}价格轴`,
453
+ text: label,
454
+ className: 'baron-chart-workspace-popover__segment',
455
+ });
456
+ button.dataset.priceScale = scale;
457
+ button.setAttribute('aria-pressed', String(scale === descriptor.valueAxis.activeScale));
458
+ scaleButtons.set(scale, button);
459
+ segmented.append(button);
442
460
  }
443
- select.value = descriptor.valueAxis.activeScale;
444
461
  let committedScale = descriptor.valueAxis.activeScale;
445
- const changeScale = async () => {
446
- try {
447
- await runtime.setValueAxisScale(select.value);
448
- committedScale = select.value;
449
- }
450
- catch (error) {
451
- select.value = committedScale;
452
- throw error;
453
- }
454
- };
455
- select.addEventListener('change', changeScale);
456
- cleanupCallbacks.push(() => select.removeEventListener('change', changeScale));
457
- dataControls.push(select);
458
- row.append(label, select);
459
- chartSettingsGroup.append(row);
462
+ for (const [scale, button] of scaleButtons) {
463
+ const changeScale = async () => {
464
+ if (scale === committedScale) {
465
+ return;
466
+ }
467
+ try {
468
+ await runtime.setValueAxisScale(scale);
469
+ committedScale = scale;
470
+ selectSegment(scaleButtons, committedScale);
471
+ }
472
+ catch (error) {
473
+ selectSegment(scaleButtons, committedScale);
474
+ throw error;
475
+ }
476
+ };
477
+ button.addEventListener('click', changeScale);
478
+ cleanupCallbacks.push(() => button.removeEventListener('click', changeScale));
479
+ dataControls.push(button);
480
+ }
481
+ control.append(segmented);
482
+ settingsList.append(row);
460
483
  }
461
484
  if (descriptor.mainSeriesPresentation !== null) {
462
485
  const mainSeries = descriptor.mainSeriesPresentation;
463
- const row = document.createElement('label');
464
- row.className = 'baron-chart-workspace-popover__row';
465
- const label = document.createElement('span');
466
- label.className = 'baron-chart-workspace-popover__label';
467
- label.textContent = '主序列';
486
+ const { row, control } = createSettingsRow('主序列', 'main-series');
468
487
  const select = document.createElement('select');
469
488
  select.className = 'baron-chart-workspace-toolbar__select';
470
489
  select.dataset.action = 'main-series';
490
+ select.setAttribute('aria-label', '主序列');
471
491
  for (const presentation of mainSeries.presentations) {
472
492
  const option = document.createElement('option');
473
493
  option.value = presentation.type;
@@ -485,10 +505,10 @@ export function createChartWorkspaceToolbar(containers, runtime, options = {}) {
485
505
  select.addEventListener('change', changeMainSeries);
486
506
  cleanupCallbacks.push(() => select.removeEventListener('change', changeMainSeries));
487
507
  dataControls.push(select);
488
- row.append(label, select);
489
- chartSettingsGroup.append(row);
508
+ control.append(select);
509
+ settingsList.append(row);
490
510
  }
491
- settingsPopover.element.append(chartSettingsGroup);
511
+ settingsPopover.element.append(settingsList);
492
512
  if (options.fullscreenControl !== 'hidden') {
493
513
  const fullscreenTarget = options.fullscreenTarget ?? containers.top.parentElement;
494
514
  const fullscreenButton = createButton({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baron1996/klinecharts-runtime",
3
- "version": "0.9.20",
3
+ "version": "0.9.21",
4
4
  "description": "Web runtime for deterministic KLineCharts scenes.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -39,8 +39,8 @@
39
39
  "typecheck": "tsc -p tsconfig.json --noEmit"
40
40
  },
41
41
  "dependencies": {
42
- "@baron1996/kline-scene-schema": "0.9.20",
43
- "@baron1996/klinecharts-adapter": "0.9.20",
42
+ "@baron1996/kline-scene-schema": "0.9.21",
43
+ "@baron1996/klinecharts-adapter": "0.9.21",
44
44
  "@js-temporal/polyfill": "0.5.1"
45
45
  }
46
46
  }