modern-idoc 0.11.7 → 0.11.9

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/dist/index.cjs CHANGED
@@ -1443,6 +1443,39 @@ function getDefaultBackgroundStyle() {
1443
1443
  };
1444
1444
  }
1445
1445
 
1446
+ function normalizeValues(values) {
1447
+ return (values ?? []).map((v) => normalizeNumber(v) ?? 0);
1448
+ }
1449
+ function normalizeChartSeries(series) {
1450
+ return clearUndef({
1451
+ name: series.name,
1452
+ values: normalizeValues(series.values),
1453
+ xValues: series.xValues ? normalizeValues(series.xValues) : void 0,
1454
+ color: series.color
1455
+ });
1456
+ }
1457
+ function normalizeChartAxis(axis) {
1458
+ return clearUndef({
1459
+ title: axis.title,
1460
+ min: normalizeNumber(axis.min),
1461
+ max: normalizeNumber(axis.max),
1462
+ visible: axis.visible
1463
+ });
1464
+ }
1465
+ function normalizeChart(chart) {
1466
+ return clearUndef({
1467
+ enabled: chart.enabled ?? true,
1468
+ type: chart.type ?? "column",
1469
+ grouping: chart.grouping,
1470
+ categories: chart.categories ?? [],
1471
+ series: (chart.series ?? []).map(normalizeChartSeries),
1472
+ title: chart.title,
1473
+ legend: chart.legend,
1474
+ categoryAxis: chart.categoryAxis ? normalizeChartAxis(chart.categoryAxis) : void 0,
1475
+ valueAxis: chart.valueAxis ? normalizeChartAxis(chart.valueAxis) : void 0
1476
+ });
1477
+ }
1478
+
1446
1479
  function normalizeConnection(connection) {
1447
1480
  return clearUndef({
1448
1481
  start: connection.start,
@@ -1494,12 +1527,51 @@ function getDefaultShadowStyle() {
1494
1527
  };
1495
1528
  }
1496
1529
 
1530
+ function normalizeFilter(filter) {
1531
+ return clearUndef({
1532
+ blur: filter.blur,
1533
+ brightness: filter.brightness,
1534
+ contrast: filter.contrast,
1535
+ grayscale: filter.grayscale,
1536
+ hueRotate: filter.hueRotate,
1537
+ invert: filter.invert,
1538
+ opacity: filter.opacity,
1539
+ saturate: filter.saturate,
1540
+ sepia: filter.sepia,
1541
+ duotone: filter.duotone ? [normalizeColor(filter.duotone[0]), normalizeColor(filter.duotone[1])] : void 0,
1542
+ biLevel: filter.biLevel,
1543
+ colorChange: filter.colorChange ? { from: normalizeColor(filter.colorChange.from), to: normalizeColor(filter.colorChange.to) } : void 0
1544
+ });
1545
+ }
1546
+ function stringifyFilter(filter) {
1547
+ const parts = [];
1548
+ if (filter.blur !== void 0)
1549
+ parts.push(`blur(${filter.blur}px)`);
1550
+ if (filter.brightness !== void 0)
1551
+ parts.push(`brightness(${filter.brightness})`);
1552
+ if (filter.contrast !== void 0)
1553
+ parts.push(`contrast(${filter.contrast})`);
1554
+ if (filter.grayscale !== void 0)
1555
+ parts.push(`grayscale(${filter.grayscale})`);
1556
+ if (filter.hueRotate !== void 0)
1557
+ parts.push(`hue-rotate(${filter.hueRotate}deg)`);
1558
+ if (filter.invert !== void 0)
1559
+ parts.push(`invert(${filter.invert})`);
1560
+ if (filter.opacity !== void 0)
1561
+ parts.push(`opacity(${filter.opacity})`);
1562
+ if (filter.saturate !== void 0)
1563
+ parts.push(`saturate(${filter.saturate})`);
1564
+ if (filter.sepia !== void 0)
1565
+ parts.push(`sepia(${filter.sepia})`);
1566
+ return parts.join(" ");
1567
+ }
1497
1568
  const effectFields = [
1498
1569
  "fill",
1499
1570
  "outline",
1500
1571
  "shadow",
1501
1572
  "transform",
1502
- "transformOrigin"
1573
+ "transformOrigin",
1574
+ "filter"
1503
1575
  ];
1504
1576
  function normalizeEffectV0(effect) {
1505
1577
  const _effect = pick(effect, effectFields);
@@ -1541,7 +1613,8 @@ function normalizeEffect(effect) {
1541
1613
  outline: isNone(_effect.outline) ? void 0 : normalizeOutline(_effect.outline),
1542
1614
  shadow: isNone(_effect.shadow) ? void 0 : normalizeShadow(_effect.shadow),
1543
1615
  transform: isNone(_effect.transform) ? void 0 : _effect.transform,
1544
- transformOrigin: _effect.transformOrigin
1616
+ transformOrigin: _effect.transformOrigin,
1617
+ filter: _effect.filter ? normalizeFilter(_effect.filter) : void 0
1545
1618
  });
1546
1619
  }
1547
1620
 
@@ -1551,10 +1624,11 @@ function normalizeForeground(foreground) {
1551
1624
  ...normalizeFill(foreground)
1552
1625
  };
1553
1626
  } else {
1554
- return {
1627
+ return clearUndef({
1555
1628
  ...normalizeFill(foreground),
1556
- ...pick(foreground, ["fillWithShape"])
1557
- };
1629
+ ...pick(foreground, ["fillWithShape"]),
1630
+ effects: foreground.effects?.map(normalizeEffect)
1631
+ });
1558
1632
  }
1559
1633
  }
1560
1634
 
@@ -2004,6 +2078,7 @@ function normalizeElement(element) {
2004
2078
  audio: isNone(element.audio) ? void 0 : normalizeAudio(element.audio),
2005
2079
  connection: isNone(element.connection) ? void 0 : normalizeConnection(element.connection),
2006
2080
  table: isNone(element.table) ? void 0 : normalizeTable(element.table),
2081
+ chart: isNone(element.chart) ? void 0 : normalizeChart(element.chart),
2007
2082
  ...normalizeEffect(element),
2008
2083
  children: element.children?.map((child) => normalizeElement(child))
2009
2084
  });
@@ -2114,6 +2189,7 @@ exports.nanoid = nanoid;
2114
2189
  exports.normalizeAudio = normalizeAudio;
2115
2190
  exports.normalizeBackground = normalizeBackground;
2116
2191
  exports.normalizeCRLF = normalizeCRLF;
2192
+ exports.normalizeChart = normalizeChart;
2117
2193
  exports.normalizeColor = normalizeColor;
2118
2194
  exports.normalizeColorFill = normalizeColorFill;
2119
2195
  exports.normalizeConnection = normalizeConnection;
@@ -2121,6 +2197,7 @@ exports.normalizeDocument = normalizeDocument;
2121
2197
  exports.normalizeEffect = normalizeEffect;
2122
2198
  exports.normalizeElement = normalizeElement;
2123
2199
  exports.normalizeFill = normalizeFill;
2200
+ exports.normalizeFilter = normalizeFilter;
2124
2201
  exports.normalizeFlatDocument = normalizeFlatDocument;
2125
2202
  exports.normalizeForeground = normalizeForeground;
2126
2203
  exports.normalizeGradient = normalizeGradient;
@@ -2149,5 +2226,6 @@ exports.propertyOffsetSet = propertyOffsetSet;
2149
2226
  exports.round = round;
2150
2227
  exports.setNestedValue = setNestedValue;
2151
2228
  exports.setObjectValueByPath = setObjectValueByPath;
2229
+ exports.stringifyFilter = stringifyFilter;
2152
2230
  exports.stringifyGradient = stringifyGradient;
2153
2231
  exports.textContentToString = textContentToString;
package/dist/index.d.cts CHANGED
@@ -334,6 +334,55 @@ interface NormalizedBackgroundStyle {
334
334
  }
335
335
  declare function getDefaultBackgroundStyle(): NormalizedBackgroundStyle;
336
336
 
337
+ type ChartType = 'column' | 'bar' | 'line' | 'area' | 'pie' | 'doughnut' | 'scatter' | 'radar' | (string & {});
338
+ /** 分组方式(柱/条/面/线) */
339
+ type ChartGrouping = 'clustered' | 'stacked' | 'percentStacked' | 'standard';
340
+ type ChartLegend = false | 'top' | 'bottom' | 'left' | 'right';
341
+ interface ChartSeriesObject {
342
+ name?: string;
343
+ /** 数值序列(与 chart.categories 对齐) */
344
+ values: number[];
345
+ /** scatter 用:与 values 配对的 x 值 */
346
+ xValues?: number[];
347
+ color?: string;
348
+ }
349
+ interface ChartAxis {
350
+ title?: string;
351
+ min?: number;
352
+ max?: number;
353
+ /** 是否显示 */
354
+ visible?: boolean;
355
+ }
356
+ interface ChartObject extends Partial<Toggleable> {
357
+ type?: ChartType;
358
+ grouping?: ChartGrouping;
359
+ /** 分类标签(共享),如 ["一月","二月"] */
360
+ categories?: string[];
361
+ series?: ChartSeriesObject[];
362
+ title?: string;
363
+ legend?: ChartLegend;
364
+ categoryAxis?: ChartAxis;
365
+ valueAxis?: ChartAxis;
366
+ }
367
+ type Chart = ChartObject;
368
+ interface NormalizedChartSeries {
369
+ name?: string;
370
+ values: number[];
371
+ xValues?: number[];
372
+ color?: string;
373
+ }
374
+ interface NormalizedChart extends Toggleable {
375
+ type: ChartType;
376
+ grouping?: ChartGrouping;
377
+ categories: string[];
378
+ series: NormalizedChartSeries[];
379
+ title?: string;
380
+ legend?: ChartLegend;
381
+ categoryAxis?: ChartAxis;
382
+ valueAxis?: ChartAxis;
383
+ }
384
+ declare function normalizeChart(chart: Chart): NormalizedChart;
385
+
337
386
  type ConnectionMode = 'straight' | 'orthogonal' | 'curved';
338
387
  interface ConnectionAnchor {
339
388
  id: string;
@@ -434,6 +483,62 @@ interface NormalizedShadowStyle {
434
483
  }
435
484
  declare function getDefaultShadowStyle(): NormalizedShadowStyle;
436
485
 
486
+ /**
487
+ * 滤镜/调色。字段与语义对齐 CSS filter 函数(可经 stringifyFilter 无损转成 CSS filter 字符串),
488
+ * 并扩展若干 CSS 无等价、但 OOXML a:blip 支持的项(duotone / biLevel / colorChange)。
489
+ */
490
+ interface Filter {
491
+ /** filter: blur(Npx) */
492
+ blur?: number;
493
+ /** filter: brightness(N),1 = 原值 */
494
+ brightness?: number;
495
+ /** filter: contrast(N),1 = 原值 */
496
+ contrast?: number;
497
+ /** filter: grayscale(0~1) */
498
+ grayscale?: number;
499
+ /** filter: hue-rotate(Ndeg) */
500
+ hueRotate?: number;
501
+ /** filter: invert(0~1) */
502
+ invert?: number;
503
+ /** filter: opacity(0~1) */
504
+ opacity?: number;
505
+ /** filter: saturate(N),1 = 原值 */
506
+ saturate?: number;
507
+ /** filter: sepia(0~1) */
508
+ sepia?: number;
509
+ /** 双色调,[暗, 亮] 两色映射(OOXML a:duotone,无 CSS 等价) */
510
+ duotone?: [Color, Color];
511
+ /** 黑白阈值 0~1(OOXML a:biLevel,无直接 CSS 等价) */
512
+ biLevel?: number;
513
+ /** 颜色替换(OOXML a:clrChange,无 CSS 等价) */
514
+ colorChange?: {
515
+ from: Color;
516
+ to: Color;
517
+ };
518
+ }
519
+ interface NormalizedFilter {
520
+ blur?: number;
521
+ brightness?: number;
522
+ contrast?: number;
523
+ grayscale?: number;
524
+ hueRotate?: number;
525
+ invert?: number;
526
+ opacity?: number;
527
+ saturate?: number;
528
+ sepia?: number;
529
+ duotone?: [NormalizedColor, NormalizedColor];
530
+ biLevel?: number;
531
+ colorChange?: {
532
+ from: NormalizedColor;
533
+ to: NormalizedColor;
534
+ };
535
+ }
536
+ declare function normalizeFilter(filter: Filter): NormalizedFilter;
537
+ /**
538
+ * 把 Filter 转成 CSS filter 字符串(仅含有 CSS 等价的项)。
539
+ * duotone / biLevel / colorChange 无 CSS filter 形式,自动跳过。
540
+ */
541
+ declare function stringifyFilter(filter: NormalizedFilter): string;
437
542
  interface _EffectV0 {
438
543
  transformOrigin?: string;
439
544
  rotate?: number;
@@ -457,6 +562,8 @@ interface Effect {
457
562
  shadow?: WithNone<Shadow>;
458
563
  transform?: WithStyleNone<string>;
459
564
  transformOrigin?: string;
565
+ /** 滤镜/调色(灰度/双色调/亮度/对比度等),多用于图片元素的整图调色 */
566
+ filter?: Filter;
460
567
  }
461
568
  interface NormalizedEffect {
462
569
  fill?: NormalizedFill;
@@ -464,15 +571,24 @@ interface NormalizedEffect {
464
571
  shadow?: NormalizedShadow;
465
572
  transform?: string;
466
573
  transformOrigin?: string;
574
+ filter?: NormalizedFilter;
467
575
  }
468
576
  declare const effectFields: (keyof Effect)[];
469
577
  declare function normalizeEffect(effect: _EffectV0 & Effect): NormalizedEffect;
470
578
 
471
579
  interface NormalizedBaseForeground {
472
580
  fillWithShape?: boolean;
581
+ /**
582
+ * 图片效果叠层(对应 bige 的"图片样式"),每层为通用 Effect,按数组顺序叠加。
583
+ * 多重描边 = 多个层(每层一条 outline);位移重影 = transform: translate()。
584
+ * 渲染端按需把 `图片 + effects` 烘焙到运行时 canvas,不入数据。
585
+ */
586
+ effects?: NormalizedEffect[];
473
587
  }
474
588
  type NormalizedForeground = NormalizedBaseForeground & NormalizedFill;
475
- type ForegroundObject = Partial<NormalizedBaseForeground> & FillObject;
589
+ type ForegroundObject = Partial<Omit<NormalizedBaseForeground, 'effects'>> & FillObject & {
590
+ effects?: Effect[];
591
+ };
476
592
  type Foreground = string | ForegroundObject;
477
593
  declare function normalizeForeground(foreground: Foreground): NormalizedForeground | undefined;
478
594
 
@@ -552,7 +668,7 @@ type Position = 'static' | 'relative' | 'absolute';
552
668
  type BorderStyle = WithStyleNone<'dashed' | 'solid'>;
553
669
  type BoxSizing = 'border-box' | 'content-box';
554
670
  type PointerEvents = 'auto' | 'none';
555
- type ListStyleType = WithStyleNone<'disc'>;
671
+ type ListStyleType = WithStyleNone<'disc' | 'circle' | 'square' | 'decimal' | 'decimal-leading-zero' | 'lower-alpha' | 'upper-alpha' | 'lower-roman' | 'upper-roman' | 'lower-greek' | 'cjk-decimal' | 'trad-chinese-informal' | 'simp-chinese-informal' | 'japanese-informal' | 'hiragana' | 'katakana' | (string & {})>;
556
672
  type ListStyleImage = WithStyleNone<string>;
557
673
  type ListStyleColormap = WithStyleNone<Record<string, string>>;
558
674
  type ListStyleSize = StyleUnit | `${number}rem` | 'cover';
@@ -836,6 +952,7 @@ interface Element<T = Meta> extends Effect, Omit<Node<T>, 'children'> {
836
952
  audio?: WithNone<Audio>;
837
953
  connection?: WithNone<Connection>;
838
954
  table?: WithNone<Table>;
955
+ chart?: WithNone<Chart>;
839
956
  children?: Element[];
840
957
  }
841
958
  interface NormalizedElement<T = Meta> extends NormalizedEffect, Omit<Node<T>, 'children'> {
@@ -849,6 +966,7 @@ interface NormalizedElement<T = Meta> extends NormalizedEffect, Omit<Node<T>, 'c
849
966
  audio?: NormalizedAudio;
850
967
  connection?: NormalizedConnection;
851
968
  table?: NormalizedTable;
969
+ chart?: NormalizedChart;
852
970
  children?: NormalizedElement[];
853
971
  }
854
972
  declare function normalizeElement<T = Meta>(element: Element<T>): NormalizedElement<T>;
@@ -989,5 +1107,5 @@ declare class Reactivable extends Observable implements PropertyAccessor {
989
1107
  destroy(): void;
990
1108
  }
991
1109
 
992
- export { EventEmitter, Observable, RawWeakMap, Reactivable, clearUndef, colorFillFields, defaultColor, defineProperty, effectFields, flatDocumentToDocument, getDeclarations, getDefaultBackgroundStyle, getDefaultElementStyle, getDefaultHighlightStyle, getDefaultLayoutStyle, getDefaultListStyleStyle, getDefaultOutlineStyle, getDefaultShadowStyle, getDefaultStyle, getDefaultTextInlineStyle, getDefaultTextLineStyle, getDefaultTextStyle, getDefaultTransformStyle, getNestedValue, getObjectValueByPath, getPropertyDescriptor, gradientFillFields, hasCRLF, idGenerator, imageFillFiedls, isCRLF, isColor, isColorFill, isColorFillObject, isEqualObject, isFragmentObject, isGradient, isGradientFill, isGradientFillObject, isImageFill, isImageFillObject, isNone, isParagraphObject, isPresetFill, isPresetFillObject, nanoid, normalizeAudio, normalizeBackground, normalizeCRLF, normalizeColor, normalizeColorFill, normalizeConnection, normalizeDocument, normalizeEffect, normalizeElement, normalizeFill, normalizeFlatDocument, normalizeForeground, normalizeGradient, normalizeGradientFill, normalizeImageFill, normalizeNumber, normalizeOutline, normalizePresetFill, normalizeShadow, normalizeShape, normalizeStyle, normalizeTable, normalizeText, normalizeTextContent, normalizeTextDeformation, normalizeVideo, parseColor, parseGradient, pick, presetFillFiedls, property, property2, propertyOffsetFallback, propertyOffsetGet, propertyOffsetSet, round, setNestedValue, setObjectValueByPath, stringifyGradient, textContentToString };
993
- export type { Align, AngularNode, Audio, Background, BackgroundObject, BackgroundSize, BorderStyle, BoxShadow, BoxSizing, CmykColor, CmykaColor, Color, ColorFill, ColorFillObject, ColorStop, ColorStopNode, Connection, ConnectionAnchor, ConnectionMode, DefaultRadialNode, Direction, DirectionalNode, Display, Document, Effect, Element, EmNode, EventListener, EventListenerOptions, EventListenerValue, ExtentKeywordNode, Fill, FillObject, FillRule, FlatDocument, FlatElement, FlatTextContent, FlexDirection, FlexWrap, FontKerning, FontStyle, FontWeight, Foreground, ForegroundObject, FragmentObject, FullStyle, GradientFill, GradientFillObject, GradientNode, HeadEnd, Hex8Color, HexNode, HighlightColormap, HighlightImage, HighlightLine, HighlightReferImage, HighlightSize, HighlightThickness, HslColor, HslaColor, HsvColor, HsvaColor, HwbColor, HwbaColor, IdGenerator, ImageFill, ImageFillCropRect, ImageFillObject, ImageFillStretchRect, ImageFillTile, Justify, LabColor, LabaColor, LchColor, LchaColor, LineCap, LineEndSize, LineEndType, LineJoin, LinearGradient, LinearGradientNode, LinearGradientWithType, ListStyleColormap, ListStyleImage, ListStylePosition, ListStyleSize, ListStyleType, LiteralNode, Meta, Node, None, NormalizedAudio, NormalizedBackground, NormalizedBackgroundStyle, NormalizedBaseBackground, NormalizedBaseForeground, NormalizedBaseOutline, NormalizedColor, NormalizedColorFill, NormalizedConnection, NormalizedDocument, NormalizedEffect, NormalizedElement, NormalizedElementStyle, NormalizedFill, NormalizedFlatDocument, NormalizedFlatElement, NormalizedForeground, NormalizedFragment, NormalizedGradientFill, NormalizedHighlight, NormalizedHighlightStyle, NormalizedImageFill, NormalizedLayoutStyle, NormalizedListStyle, NormalizedListStyleStyle, NormalizedOutline, NormalizedOutlineStyle, NormalizedParagraph, NormalizedPresetFill, NormalizedShadow, NormalizedShadowStyle, NormalizedShape, NormalizedStyle, NormalizedTable, NormalizedTableCell, NormalizedTableColumn, NormalizedTableRow, NormalizedText, NormalizedTextContent, NormalizedTextDeformation, NormalizedTextDrawStyle, NormalizedTextInlineStyle, NormalizedTextLineStyle, NormalizedTextStyle, NormalizedTransformStyle, NormalizedVideo, ObjectColor, ObservableEvents, Outline, OutlineObject, OutlineStyle, Overflow, ParagraphObject, PercentNode, PointerEvents, Position, PositionKeywordNode, PositionNode, PresetFill, PresetFillObject, PropertyAccessor, PropertyDeclaration, PxNode, RadialGradient, RadialGradientNode, RadialGradientWithType, ReactivableEvents, RepeatingLinearGradientNode, RepeatingRadialGradientNode, RgbColor, RgbNode, RgbaColor, RgbaNode, SVGPathData, Shadow, ShadowObject, Shape, ShapeConnectionPoint, ShapeNode, ShapePath, ShapePathStyle, StrokeLinecap, StrokeLinejoin, Style, StyleObject, StyleUnit, Table, TableCellObject, TableColumnObject, TableObject, TableRowObject, TailEnd, Text, TextAlign, TextContent, TextDecoration, TextDeformation, TextObject, TextOrientation, TextTransform, TextWrap, Toggleable, Uint32Color, VerticalAlign, Video, Visibility, WithNone, WithStyleNone, WritingMode, XyzColor, XyzaColor, _EffectV0 };
1110
+ export { EventEmitter, Observable, RawWeakMap, Reactivable, clearUndef, colorFillFields, defaultColor, defineProperty, effectFields, flatDocumentToDocument, getDeclarations, getDefaultBackgroundStyle, getDefaultElementStyle, getDefaultHighlightStyle, getDefaultLayoutStyle, getDefaultListStyleStyle, getDefaultOutlineStyle, getDefaultShadowStyle, getDefaultStyle, getDefaultTextInlineStyle, getDefaultTextLineStyle, getDefaultTextStyle, getDefaultTransformStyle, getNestedValue, getObjectValueByPath, getPropertyDescriptor, gradientFillFields, hasCRLF, idGenerator, imageFillFiedls, isCRLF, isColor, isColorFill, isColorFillObject, isEqualObject, isFragmentObject, isGradient, isGradientFill, isGradientFillObject, isImageFill, isImageFillObject, isNone, isParagraphObject, isPresetFill, isPresetFillObject, nanoid, normalizeAudio, normalizeBackground, normalizeCRLF, normalizeChart, normalizeColor, normalizeColorFill, normalizeConnection, normalizeDocument, normalizeEffect, normalizeElement, normalizeFill, normalizeFilter, normalizeFlatDocument, normalizeForeground, normalizeGradient, normalizeGradientFill, normalizeImageFill, normalizeNumber, normalizeOutline, normalizePresetFill, normalizeShadow, normalizeShape, normalizeStyle, normalizeTable, normalizeText, normalizeTextContent, normalizeTextDeformation, normalizeVideo, parseColor, parseGradient, pick, presetFillFiedls, property, property2, propertyOffsetFallback, propertyOffsetGet, propertyOffsetSet, round, setNestedValue, setObjectValueByPath, stringifyFilter, stringifyGradient, textContentToString };
1111
+ export type { Align, AngularNode, Audio, Background, BackgroundObject, BackgroundSize, BorderStyle, BoxShadow, BoxSizing, Chart, ChartAxis, ChartGrouping, ChartLegend, ChartObject, ChartSeriesObject, ChartType, CmykColor, CmykaColor, Color, ColorFill, ColorFillObject, ColorStop, ColorStopNode, Connection, ConnectionAnchor, ConnectionMode, DefaultRadialNode, Direction, DirectionalNode, Display, Document, Effect, Element, EmNode, EventListener, EventListenerOptions, EventListenerValue, ExtentKeywordNode, Fill, FillObject, FillRule, Filter, FlatDocument, FlatElement, FlatTextContent, FlexDirection, FlexWrap, FontKerning, FontStyle, FontWeight, Foreground, ForegroundObject, FragmentObject, FullStyle, GradientFill, GradientFillObject, GradientNode, HeadEnd, Hex8Color, HexNode, HighlightColormap, HighlightImage, HighlightLine, HighlightReferImage, HighlightSize, HighlightThickness, HslColor, HslaColor, HsvColor, HsvaColor, HwbColor, HwbaColor, IdGenerator, ImageFill, ImageFillCropRect, ImageFillObject, ImageFillStretchRect, ImageFillTile, Justify, LabColor, LabaColor, LchColor, LchaColor, LineCap, LineEndSize, LineEndType, LineJoin, LinearGradient, LinearGradientNode, LinearGradientWithType, ListStyleColormap, ListStyleImage, ListStylePosition, ListStyleSize, ListStyleType, LiteralNode, Meta, Node, None, NormalizedAudio, NormalizedBackground, NormalizedBackgroundStyle, NormalizedBaseBackground, NormalizedBaseForeground, NormalizedBaseOutline, NormalizedChart, NormalizedChartSeries, NormalizedColor, NormalizedColorFill, NormalizedConnection, NormalizedDocument, NormalizedEffect, NormalizedElement, NormalizedElementStyle, NormalizedFill, NormalizedFilter, NormalizedFlatDocument, NormalizedFlatElement, NormalizedForeground, NormalizedFragment, NormalizedGradientFill, NormalizedHighlight, NormalizedHighlightStyle, NormalizedImageFill, NormalizedLayoutStyle, NormalizedListStyle, NormalizedListStyleStyle, NormalizedOutline, NormalizedOutlineStyle, NormalizedParagraph, NormalizedPresetFill, NormalizedShadow, NormalizedShadowStyle, NormalizedShape, NormalizedStyle, NormalizedTable, NormalizedTableCell, NormalizedTableColumn, NormalizedTableRow, NormalizedText, NormalizedTextContent, NormalizedTextDeformation, NormalizedTextDrawStyle, NormalizedTextInlineStyle, NormalizedTextLineStyle, NormalizedTextStyle, NormalizedTransformStyle, NormalizedVideo, ObjectColor, ObservableEvents, Outline, OutlineObject, OutlineStyle, Overflow, ParagraphObject, PercentNode, PointerEvents, Position, PositionKeywordNode, PositionNode, PresetFill, PresetFillObject, PropertyAccessor, PropertyDeclaration, PxNode, RadialGradient, RadialGradientNode, RadialGradientWithType, ReactivableEvents, RepeatingLinearGradientNode, RepeatingRadialGradientNode, RgbColor, RgbNode, RgbaColor, RgbaNode, SVGPathData, Shadow, ShadowObject, Shape, ShapeConnectionPoint, ShapeNode, ShapePath, ShapePathStyle, StrokeLinecap, StrokeLinejoin, Style, StyleObject, StyleUnit, Table, TableCellObject, TableColumnObject, TableObject, TableRowObject, TailEnd, Text, TextAlign, TextContent, TextDecoration, TextDeformation, TextObject, TextOrientation, TextTransform, TextWrap, Toggleable, Uint32Color, VerticalAlign, Video, Visibility, WithNone, WithStyleNone, WritingMode, XyzColor, XyzaColor, _EffectV0 };
package/dist/index.d.mts CHANGED
@@ -334,6 +334,55 @@ interface NormalizedBackgroundStyle {
334
334
  }
335
335
  declare function getDefaultBackgroundStyle(): NormalizedBackgroundStyle;
336
336
 
337
+ type ChartType = 'column' | 'bar' | 'line' | 'area' | 'pie' | 'doughnut' | 'scatter' | 'radar' | (string & {});
338
+ /** 分组方式(柱/条/面/线) */
339
+ type ChartGrouping = 'clustered' | 'stacked' | 'percentStacked' | 'standard';
340
+ type ChartLegend = false | 'top' | 'bottom' | 'left' | 'right';
341
+ interface ChartSeriesObject {
342
+ name?: string;
343
+ /** 数值序列(与 chart.categories 对齐) */
344
+ values: number[];
345
+ /** scatter 用:与 values 配对的 x 值 */
346
+ xValues?: number[];
347
+ color?: string;
348
+ }
349
+ interface ChartAxis {
350
+ title?: string;
351
+ min?: number;
352
+ max?: number;
353
+ /** 是否显示 */
354
+ visible?: boolean;
355
+ }
356
+ interface ChartObject extends Partial<Toggleable> {
357
+ type?: ChartType;
358
+ grouping?: ChartGrouping;
359
+ /** 分类标签(共享),如 ["一月","二月"] */
360
+ categories?: string[];
361
+ series?: ChartSeriesObject[];
362
+ title?: string;
363
+ legend?: ChartLegend;
364
+ categoryAxis?: ChartAxis;
365
+ valueAxis?: ChartAxis;
366
+ }
367
+ type Chart = ChartObject;
368
+ interface NormalizedChartSeries {
369
+ name?: string;
370
+ values: number[];
371
+ xValues?: number[];
372
+ color?: string;
373
+ }
374
+ interface NormalizedChart extends Toggleable {
375
+ type: ChartType;
376
+ grouping?: ChartGrouping;
377
+ categories: string[];
378
+ series: NormalizedChartSeries[];
379
+ title?: string;
380
+ legend?: ChartLegend;
381
+ categoryAxis?: ChartAxis;
382
+ valueAxis?: ChartAxis;
383
+ }
384
+ declare function normalizeChart(chart: Chart): NormalizedChart;
385
+
337
386
  type ConnectionMode = 'straight' | 'orthogonal' | 'curved';
338
387
  interface ConnectionAnchor {
339
388
  id: string;
@@ -434,6 +483,62 @@ interface NormalizedShadowStyle {
434
483
  }
435
484
  declare function getDefaultShadowStyle(): NormalizedShadowStyle;
436
485
 
486
+ /**
487
+ * 滤镜/调色。字段与语义对齐 CSS filter 函数(可经 stringifyFilter 无损转成 CSS filter 字符串),
488
+ * 并扩展若干 CSS 无等价、但 OOXML a:blip 支持的项(duotone / biLevel / colorChange)。
489
+ */
490
+ interface Filter {
491
+ /** filter: blur(Npx) */
492
+ blur?: number;
493
+ /** filter: brightness(N),1 = 原值 */
494
+ brightness?: number;
495
+ /** filter: contrast(N),1 = 原值 */
496
+ contrast?: number;
497
+ /** filter: grayscale(0~1) */
498
+ grayscale?: number;
499
+ /** filter: hue-rotate(Ndeg) */
500
+ hueRotate?: number;
501
+ /** filter: invert(0~1) */
502
+ invert?: number;
503
+ /** filter: opacity(0~1) */
504
+ opacity?: number;
505
+ /** filter: saturate(N),1 = 原值 */
506
+ saturate?: number;
507
+ /** filter: sepia(0~1) */
508
+ sepia?: number;
509
+ /** 双色调,[暗, 亮] 两色映射(OOXML a:duotone,无 CSS 等价) */
510
+ duotone?: [Color, Color];
511
+ /** 黑白阈值 0~1(OOXML a:biLevel,无直接 CSS 等价) */
512
+ biLevel?: number;
513
+ /** 颜色替换(OOXML a:clrChange,无 CSS 等价) */
514
+ colorChange?: {
515
+ from: Color;
516
+ to: Color;
517
+ };
518
+ }
519
+ interface NormalizedFilter {
520
+ blur?: number;
521
+ brightness?: number;
522
+ contrast?: number;
523
+ grayscale?: number;
524
+ hueRotate?: number;
525
+ invert?: number;
526
+ opacity?: number;
527
+ saturate?: number;
528
+ sepia?: number;
529
+ duotone?: [NormalizedColor, NormalizedColor];
530
+ biLevel?: number;
531
+ colorChange?: {
532
+ from: NormalizedColor;
533
+ to: NormalizedColor;
534
+ };
535
+ }
536
+ declare function normalizeFilter(filter: Filter): NormalizedFilter;
537
+ /**
538
+ * 把 Filter 转成 CSS filter 字符串(仅含有 CSS 等价的项)。
539
+ * duotone / biLevel / colorChange 无 CSS filter 形式,自动跳过。
540
+ */
541
+ declare function stringifyFilter(filter: NormalizedFilter): string;
437
542
  interface _EffectV0 {
438
543
  transformOrigin?: string;
439
544
  rotate?: number;
@@ -457,6 +562,8 @@ interface Effect {
457
562
  shadow?: WithNone<Shadow>;
458
563
  transform?: WithStyleNone<string>;
459
564
  transformOrigin?: string;
565
+ /** 滤镜/调色(灰度/双色调/亮度/对比度等),多用于图片元素的整图调色 */
566
+ filter?: Filter;
460
567
  }
461
568
  interface NormalizedEffect {
462
569
  fill?: NormalizedFill;
@@ -464,15 +571,24 @@ interface NormalizedEffect {
464
571
  shadow?: NormalizedShadow;
465
572
  transform?: string;
466
573
  transformOrigin?: string;
574
+ filter?: NormalizedFilter;
467
575
  }
468
576
  declare const effectFields: (keyof Effect)[];
469
577
  declare function normalizeEffect(effect: _EffectV0 & Effect): NormalizedEffect;
470
578
 
471
579
  interface NormalizedBaseForeground {
472
580
  fillWithShape?: boolean;
581
+ /**
582
+ * 图片效果叠层(对应 bige 的"图片样式"),每层为通用 Effect,按数组顺序叠加。
583
+ * 多重描边 = 多个层(每层一条 outline);位移重影 = transform: translate()。
584
+ * 渲染端按需把 `图片 + effects` 烘焙到运行时 canvas,不入数据。
585
+ */
586
+ effects?: NormalizedEffect[];
473
587
  }
474
588
  type NormalizedForeground = NormalizedBaseForeground & NormalizedFill;
475
- type ForegroundObject = Partial<NormalizedBaseForeground> & FillObject;
589
+ type ForegroundObject = Partial<Omit<NormalizedBaseForeground, 'effects'>> & FillObject & {
590
+ effects?: Effect[];
591
+ };
476
592
  type Foreground = string | ForegroundObject;
477
593
  declare function normalizeForeground(foreground: Foreground): NormalizedForeground | undefined;
478
594
 
@@ -552,7 +668,7 @@ type Position = 'static' | 'relative' | 'absolute';
552
668
  type BorderStyle = WithStyleNone<'dashed' | 'solid'>;
553
669
  type BoxSizing = 'border-box' | 'content-box';
554
670
  type PointerEvents = 'auto' | 'none';
555
- type ListStyleType = WithStyleNone<'disc'>;
671
+ type ListStyleType = WithStyleNone<'disc' | 'circle' | 'square' | 'decimal' | 'decimal-leading-zero' | 'lower-alpha' | 'upper-alpha' | 'lower-roman' | 'upper-roman' | 'lower-greek' | 'cjk-decimal' | 'trad-chinese-informal' | 'simp-chinese-informal' | 'japanese-informal' | 'hiragana' | 'katakana' | (string & {})>;
556
672
  type ListStyleImage = WithStyleNone<string>;
557
673
  type ListStyleColormap = WithStyleNone<Record<string, string>>;
558
674
  type ListStyleSize = StyleUnit | `${number}rem` | 'cover';
@@ -836,6 +952,7 @@ interface Element<T = Meta> extends Effect, Omit<Node<T>, 'children'> {
836
952
  audio?: WithNone<Audio>;
837
953
  connection?: WithNone<Connection>;
838
954
  table?: WithNone<Table>;
955
+ chart?: WithNone<Chart>;
839
956
  children?: Element[];
840
957
  }
841
958
  interface NormalizedElement<T = Meta> extends NormalizedEffect, Omit<Node<T>, 'children'> {
@@ -849,6 +966,7 @@ interface NormalizedElement<T = Meta> extends NormalizedEffect, Omit<Node<T>, 'c
849
966
  audio?: NormalizedAudio;
850
967
  connection?: NormalizedConnection;
851
968
  table?: NormalizedTable;
969
+ chart?: NormalizedChart;
852
970
  children?: NormalizedElement[];
853
971
  }
854
972
  declare function normalizeElement<T = Meta>(element: Element<T>): NormalizedElement<T>;
@@ -989,5 +1107,5 @@ declare class Reactivable extends Observable implements PropertyAccessor {
989
1107
  destroy(): void;
990
1108
  }
991
1109
 
992
- export { EventEmitter, Observable, RawWeakMap, Reactivable, clearUndef, colorFillFields, defaultColor, defineProperty, effectFields, flatDocumentToDocument, getDeclarations, getDefaultBackgroundStyle, getDefaultElementStyle, getDefaultHighlightStyle, getDefaultLayoutStyle, getDefaultListStyleStyle, getDefaultOutlineStyle, getDefaultShadowStyle, getDefaultStyle, getDefaultTextInlineStyle, getDefaultTextLineStyle, getDefaultTextStyle, getDefaultTransformStyle, getNestedValue, getObjectValueByPath, getPropertyDescriptor, gradientFillFields, hasCRLF, idGenerator, imageFillFiedls, isCRLF, isColor, isColorFill, isColorFillObject, isEqualObject, isFragmentObject, isGradient, isGradientFill, isGradientFillObject, isImageFill, isImageFillObject, isNone, isParagraphObject, isPresetFill, isPresetFillObject, nanoid, normalizeAudio, normalizeBackground, normalizeCRLF, normalizeColor, normalizeColorFill, normalizeConnection, normalizeDocument, normalizeEffect, normalizeElement, normalizeFill, normalizeFlatDocument, normalizeForeground, normalizeGradient, normalizeGradientFill, normalizeImageFill, normalizeNumber, normalizeOutline, normalizePresetFill, normalizeShadow, normalizeShape, normalizeStyle, normalizeTable, normalizeText, normalizeTextContent, normalizeTextDeformation, normalizeVideo, parseColor, parseGradient, pick, presetFillFiedls, property, property2, propertyOffsetFallback, propertyOffsetGet, propertyOffsetSet, round, setNestedValue, setObjectValueByPath, stringifyGradient, textContentToString };
993
- export type { Align, AngularNode, Audio, Background, BackgroundObject, BackgroundSize, BorderStyle, BoxShadow, BoxSizing, CmykColor, CmykaColor, Color, ColorFill, ColorFillObject, ColorStop, ColorStopNode, Connection, ConnectionAnchor, ConnectionMode, DefaultRadialNode, Direction, DirectionalNode, Display, Document, Effect, Element, EmNode, EventListener, EventListenerOptions, EventListenerValue, ExtentKeywordNode, Fill, FillObject, FillRule, FlatDocument, FlatElement, FlatTextContent, FlexDirection, FlexWrap, FontKerning, FontStyle, FontWeight, Foreground, ForegroundObject, FragmentObject, FullStyle, GradientFill, GradientFillObject, GradientNode, HeadEnd, Hex8Color, HexNode, HighlightColormap, HighlightImage, HighlightLine, HighlightReferImage, HighlightSize, HighlightThickness, HslColor, HslaColor, HsvColor, HsvaColor, HwbColor, HwbaColor, IdGenerator, ImageFill, ImageFillCropRect, ImageFillObject, ImageFillStretchRect, ImageFillTile, Justify, LabColor, LabaColor, LchColor, LchaColor, LineCap, LineEndSize, LineEndType, LineJoin, LinearGradient, LinearGradientNode, LinearGradientWithType, ListStyleColormap, ListStyleImage, ListStylePosition, ListStyleSize, ListStyleType, LiteralNode, Meta, Node, None, NormalizedAudio, NormalizedBackground, NormalizedBackgroundStyle, NormalizedBaseBackground, NormalizedBaseForeground, NormalizedBaseOutline, NormalizedColor, NormalizedColorFill, NormalizedConnection, NormalizedDocument, NormalizedEffect, NormalizedElement, NormalizedElementStyle, NormalizedFill, NormalizedFlatDocument, NormalizedFlatElement, NormalizedForeground, NormalizedFragment, NormalizedGradientFill, NormalizedHighlight, NormalizedHighlightStyle, NormalizedImageFill, NormalizedLayoutStyle, NormalizedListStyle, NormalizedListStyleStyle, NormalizedOutline, NormalizedOutlineStyle, NormalizedParagraph, NormalizedPresetFill, NormalizedShadow, NormalizedShadowStyle, NormalizedShape, NormalizedStyle, NormalizedTable, NormalizedTableCell, NormalizedTableColumn, NormalizedTableRow, NormalizedText, NormalizedTextContent, NormalizedTextDeformation, NormalizedTextDrawStyle, NormalizedTextInlineStyle, NormalizedTextLineStyle, NormalizedTextStyle, NormalizedTransformStyle, NormalizedVideo, ObjectColor, ObservableEvents, Outline, OutlineObject, OutlineStyle, Overflow, ParagraphObject, PercentNode, PointerEvents, Position, PositionKeywordNode, PositionNode, PresetFill, PresetFillObject, PropertyAccessor, PropertyDeclaration, PxNode, RadialGradient, RadialGradientNode, RadialGradientWithType, ReactivableEvents, RepeatingLinearGradientNode, RepeatingRadialGradientNode, RgbColor, RgbNode, RgbaColor, RgbaNode, SVGPathData, Shadow, ShadowObject, Shape, ShapeConnectionPoint, ShapeNode, ShapePath, ShapePathStyle, StrokeLinecap, StrokeLinejoin, Style, StyleObject, StyleUnit, Table, TableCellObject, TableColumnObject, TableObject, TableRowObject, TailEnd, Text, TextAlign, TextContent, TextDecoration, TextDeformation, TextObject, TextOrientation, TextTransform, TextWrap, Toggleable, Uint32Color, VerticalAlign, Video, Visibility, WithNone, WithStyleNone, WritingMode, XyzColor, XyzaColor, _EffectV0 };
1110
+ export { EventEmitter, Observable, RawWeakMap, Reactivable, clearUndef, colorFillFields, defaultColor, defineProperty, effectFields, flatDocumentToDocument, getDeclarations, getDefaultBackgroundStyle, getDefaultElementStyle, getDefaultHighlightStyle, getDefaultLayoutStyle, getDefaultListStyleStyle, getDefaultOutlineStyle, getDefaultShadowStyle, getDefaultStyle, getDefaultTextInlineStyle, getDefaultTextLineStyle, getDefaultTextStyle, getDefaultTransformStyle, getNestedValue, getObjectValueByPath, getPropertyDescriptor, gradientFillFields, hasCRLF, idGenerator, imageFillFiedls, isCRLF, isColor, isColorFill, isColorFillObject, isEqualObject, isFragmentObject, isGradient, isGradientFill, isGradientFillObject, isImageFill, isImageFillObject, isNone, isParagraphObject, isPresetFill, isPresetFillObject, nanoid, normalizeAudio, normalizeBackground, normalizeCRLF, normalizeChart, normalizeColor, normalizeColorFill, normalizeConnection, normalizeDocument, normalizeEffect, normalizeElement, normalizeFill, normalizeFilter, normalizeFlatDocument, normalizeForeground, normalizeGradient, normalizeGradientFill, normalizeImageFill, normalizeNumber, normalizeOutline, normalizePresetFill, normalizeShadow, normalizeShape, normalizeStyle, normalizeTable, normalizeText, normalizeTextContent, normalizeTextDeformation, normalizeVideo, parseColor, parseGradient, pick, presetFillFiedls, property, property2, propertyOffsetFallback, propertyOffsetGet, propertyOffsetSet, round, setNestedValue, setObjectValueByPath, stringifyFilter, stringifyGradient, textContentToString };
1111
+ export type { Align, AngularNode, Audio, Background, BackgroundObject, BackgroundSize, BorderStyle, BoxShadow, BoxSizing, Chart, ChartAxis, ChartGrouping, ChartLegend, ChartObject, ChartSeriesObject, ChartType, CmykColor, CmykaColor, Color, ColorFill, ColorFillObject, ColorStop, ColorStopNode, Connection, ConnectionAnchor, ConnectionMode, DefaultRadialNode, Direction, DirectionalNode, Display, Document, Effect, Element, EmNode, EventListener, EventListenerOptions, EventListenerValue, ExtentKeywordNode, Fill, FillObject, FillRule, Filter, FlatDocument, FlatElement, FlatTextContent, FlexDirection, FlexWrap, FontKerning, FontStyle, FontWeight, Foreground, ForegroundObject, FragmentObject, FullStyle, GradientFill, GradientFillObject, GradientNode, HeadEnd, Hex8Color, HexNode, HighlightColormap, HighlightImage, HighlightLine, HighlightReferImage, HighlightSize, HighlightThickness, HslColor, HslaColor, HsvColor, HsvaColor, HwbColor, HwbaColor, IdGenerator, ImageFill, ImageFillCropRect, ImageFillObject, ImageFillStretchRect, ImageFillTile, Justify, LabColor, LabaColor, LchColor, LchaColor, LineCap, LineEndSize, LineEndType, LineJoin, LinearGradient, LinearGradientNode, LinearGradientWithType, ListStyleColormap, ListStyleImage, ListStylePosition, ListStyleSize, ListStyleType, LiteralNode, Meta, Node, None, NormalizedAudio, NormalizedBackground, NormalizedBackgroundStyle, NormalizedBaseBackground, NormalizedBaseForeground, NormalizedBaseOutline, NormalizedChart, NormalizedChartSeries, NormalizedColor, NormalizedColorFill, NormalizedConnection, NormalizedDocument, NormalizedEffect, NormalizedElement, NormalizedElementStyle, NormalizedFill, NormalizedFilter, NormalizedFlatDocument, NormalizedFlatElement, NormalizedForeground, NormalizedFragment, NormalizedGradientFill, NormalizedHighlight, NormalizedHighlightStyle, NormalizedImageFill, NormalizedLayoutStyle, NormalizedListStyle, NormalizedListStyleStyle, NormalizedOutline, NormalizedOutlineStyle, NormalizedParagraph, NormalizedPresetFill, NormalizedShadow, NormalizedShadowStyle, NormalizedShape, NormalizedStyle, NormalizedTable, NormalizedTableCell, NormalizedTableColumn, NormalizedTableRow, NormalizedText, NormalizedTextContent, NormalizedTextDeformation, NormalizedTextDrawStyle, NormalizedTextInlineStyle, NormalizedTextLineStyle, NormalizedTextStyle, NormalizedTransformStyle, NormalizedVideo, ObjectColor, ObservableEvents, Outline, OutlineObject, OutlineStyle, Overflow, ParagraphObject, PercentNode, PointerEvents, Position, PositionKeywordNode, PositionNode, PresetFill, PresetFillObject, PropertyAccessor, PropertyDeclaration, PxNode, RadialGradient, RadialGradientNode, RadialGradientWithType, ReactivableEvents, RepeatingLinearGradientNode, RepeatingRadialGradientNode, RgbColor, RgbNode, RgbaColor, RgbaNode, SVGPathData, Shadow, ShadowObject, Shape, ShapeConnectionPoint, ShapeNode, ShapePath, ShapePathStyle, StrokeLinecap, StrokeLinejoin, Style, StyleObject, StyleUnit, Table, TableCellObject, TableColumnObject, TableObject, TableRowObject, TailEnd, Text, TextAlign, TextContent, TextDecoration, TextDeformation, TextObject, TextOrientation, TextTransform, TextWrap, Toggleable, Uint32Color, VerticalAlign, Video, Visibility, WithNone, WithStyleNone, WritingMode, XyzColor, XyzaColor, _EffectV0 };
package/dist/index.d.ts CHANGED
@@ -334,6 +334,55 @@ interface NormalizedBackgroundStyle {
334
334
  }
335
335
  declare function getDefaultBackgroundStyle(): NormalizedBackgroundStyle;
336
336
 
337
+ type ChartType = 'column' | 'bar' | 'line' | 'area' | 'pie' | 'doughnut' | 'scatter' | 'radar' | (string & {});
338
+ /** 分组方式(柱/条/面/线) */
339
+ type ChartGrouping = 'clustered' | 'stacked' | 'percentStacked' | 'standard';
340
+ type ChartLegend = false | 'top' | 'bottom' | 'left' | 'right';
341
+ interface ChartSeriesObject {
342
+ name?: string;
343
+ /** 数值序列(与 chart.categories 对齐) */
344
+ values: number[];
345
+ /** scatter 用:与 values 配对的 x 值 */
346
+ xValues?: number[];
347
+ color?: string;
348
+ }
349
+ interface ChartAxis {
350
+ title?: string;
351
+ min?: number;
352
+ max?: number;
353
+ /** 是否显示 */
354
+ visible?: boolean;
355
+ }
356
+ interface ChartObject extends Partial<Toggleable> {
357
+ type?: ChartType;
358
+ grouping?: ChartGrouping;
359
+ /** 分类标签(共享),如 ["一月","二月"] */
360
+ categories?: string[];
361
+ series?: ChartSeriesObject[];
362
+ title?: string;
363
+ legend?: ChartLegend;
364
+ categoryAxis?: ChartAxis;
365
+ valueAxis?: ChartAxis;
366
+ }
367
+ type Chart = ChartObject;
368
+ interface NormalizedChartSeries {
369
+ name?: string;
370
+ values: number[];
371
+ xValues?: number[];
372
+ color?: string;
373
+ }
374
+ interface NormalizedChart extends Toggleable {
375
+ type: ChartType;
376
+ grouping?: ChartGrouping;
377
+ categories: string[];
378
+ series: NormalizedChartSeries[];
379
+ title?: string;
380
+ legend?: ChartLegend;
381
+ categoryAxis?: ChartAxis;
382
+ valueAxis?: ChartAxis;
383
+ }
384
+ declare function normalizeChart(chart: Chart): NormalizedChart;
385
+
337
386
  type ConnectionMode = 'straight' | 'orthogonal' | 'curved';
338
387
  interface ConnectionAnchor {
339
388
  id: string;
@@ -434,6 +483,62 @@ interface NormalizedShadowStyle {
434
483
  }
435
484
  declare function getDefaultShadowStyle(): NormalizedShadowStyle;
436
485
 
486
+ /**
487
+ * 滤镜/调色。字段与语义对齐 CSS filter 函数(可经 stringifyFilter 无损转成 CSS filter 字符串),
488
+ * 并扩展若干 CSS 无等价、但 OOXML a:blip 支持的项(duotone / biLevel / colorChange)。
489
+ */
490
+ interface Filter {
491
+ /** filter: blur(Npx) */
492
+ blur?: number;
493
+ /** filter: brightness(N),1 = 原值 */
494
+ brightness?: number;
495
+ /** filter: contrast(N),1 = 原值 */
496
+ contrast?: number;
497
+ /** filter: grayscale(0~1) */
498
+ grayscale?: number;
499
+ /** filter: hue-rotate(Ndeg) */
500
+ hueRotate?: number;
501
+ /** filter: invert(0~1) */
502
+ invert?: number;
503
+ /** filter: opacity(0~1) */
504
+ opacity?: number;
505
+ /** filter: saturate(N),1 = 原值 */
506
+ saturate?: number;
507
+ /** filter: sepia(0~1) */
508
+ sepia?: number;
509
+ /** 双色调,[暗, 亮] 两色映射(OOXML a:duotone,无 CSS 等价) */
510
+ duotone?: [Color, Color];
511
+ /** 黑白阈值 0~1(OOXML a:biLevel,无直接 CSS 等价) */
512
+ biLevel?: number;
513
+ /** 颜色替换(OOXML a:clrChange,无 CSS 等价) */
514
+ colorChange?: {
515
+ from: Color;
516
+ to: Color;
517
+ };
518
+ }
519
+ interface NormalizedFilter {
520
+ blur?: number;
521
+ brightness?: number;
522
+ contrast?: number;
523
+ grayscale?: number;
524
+ hueRotate?: number;
525
+ invert?: number;
526
+ opacity?: number;
527
+ saturate?: number;
528
+ sepia?: number;
529
+ duotone?: [NormalizedColor, NormalizedColor];
530
+ biLevel?: number;
531
+ colorChange?: {
532
+ from: NormalizedColor;
533
+ to: NormalizedColor;
534
+ };
535
+ }
536
+ declare function normalizeFilter(filter: Filter): NormalizedFilter;
537
+ /**
538
+ * 把 Filter 转成 CSS filter 字符串(仅含有 CSS 等价的项)。
539
+ * duotone / biLevel / colorChange 无 CSS filter 形式,自动跳过。
540
+ */
541
+ declare function stringifyFilter(filter: NormalizedFilter): string;
437
542
  interface _EffectV0 {
438
543
  transformOrigin?: string;
439
544
  rotate?: number;
@@ -457,6 +562,8 @@ interface Effect {
457
562
  shadow?: WithNone<Shadow>;
458
563
  transform?: WithStyleNone<string>;
459
564
  transformOrigin?: string;
565
+ /** 滤镜/调色(灰度/双色调/亮度/对比度等),多用于图片元素的整图调色 */
566
+ filter?: Filter;
460
567
  }
461
568
  interface NormalizedEffect {
462
569
  fill?: NormalizedFill;
@@ -464,15 +571,24 @@ interface NormalizedEffect {
464
571
  shadow?: NormalizedShadow;
465
572
  transform?: string;
466
573
  transformOrigin?: string;
574
+ filter?: NormalizedFilter;
467
575
  }
468
576
  declare const effectFields: (keyof Effect)[];
469
577
  declare function normalizeEffect(effect: _EffectV0 & Effect): NormalizedEffect;
470
578
 
471
579
  interface NormalizedBaseForeground {
472
580
  fillWithShape?: boolean;
581
+ /**
582
+ * 图片效果叠层(对应 bige 的"图片样式"),每层为通用 Effect,按数组顺序叠加。
583
+ * 多重描边 = 多个层(每层一条 outline);位移重影 = transform: translate()。
584
+ * 渲染端按需把 `图片 + effects` 烘焙到运行时 canvas,不入数据。
585
+ */
586
+ effects?: NormalizedEffect[];
473
587
  }
474
588
  type NormalizedForeground = NormalizedBaseForeground & NormalizedFill;
475
- type ForegroundObject = Partial<NormalizedBaseForeground> & FillObject;
589
+ type ForegroundObject = Partial<Omit<NormalizedBaseForeground, 'effects'>> & FillObject & {
590
+ effects?: Effect[];
591
+ };
476
592
  type Foreground = string | ForegroundObject;
477
593
  declare function normalizeForeground(foreground: Foreground): NormalizedForeground | undefined;
478
594
 
@@ -552,7 +668,7 @@ type Position = 'static' | 'relative' | 'absolute';
552
668
  type BorderStyle = WithStyleNone<'dashed' | 'solid'>;
553
669
  type BoxSizing = 'border-box' | 'content-box';
554
670
  type PointerEvents = 'auto' | 'none';
555
- type ListStyleType = WithStyleNone<'disc'>;
671
+ type ListStyleType = WithStyleNone<'disc' | 'circle' | 'square' | 'decimal' | 'decimal-leading-zero' | 'lower-alpha' | 'upper-alpha' | 'lower-roman' | 'upper-roman' | 'lower-greek' | 'cjk-decimal' | 'trad-chinese-informal' | 'simp-chinese-informal' | 'japanese-informal' | 'hiragana' | 'katakana' | (string & {})>;
556
672
  type ListStyleImage = WithStyleNone<string>;
557
673
  type ListStyleColormap = WithStyleNone<Record<string, string>>;
558
674
  type ListStyleSize = StyleUnit | `${number}rem` | 'cover';
@@ -836,6 +952,7 @@ interface Element<T = Meta> extends Effect, Omit<Node<T>, 'children'> {
836
952
  audio?: WithNone<Audio>;
837
953
  connection?: WithNone<Connection>;
838
954
  table?: WithNone<Table>;
955
+ chart?: WithNone<Chart>;
839
956
  children?: Element[];
840
957
  }
841
958
  interface NormalizedElement<T = Meta> extends NormalizedEffect, Omit<Node<T>, 'children'> {
@@ -849,6 +966,7 @@ interface NormalizedElement<T = Meta> extends NormalizedEffect, Omit<Node<T>, 'c
849
966
  audio?: NormalizedAudio;
850
967
  connection?: NormalizedConnection;
851
968
  table?: NormalizedTable;
969
+ chart?: NormalizedChart;
852
970
  children?: NormalizedElement[];
853
971
  }
854
972
  declare function normalizeElement<T = Meta>(element: Element<T>): NormalizedElement<T>;
@@ -989,5 +1107,5 @@ declare class Reactivable extends Observable implements PropertyAccessor {
989
1107
  destroy(): void;
990
1108
  }
991
1109
 
992
- export { EventEmitter, Observable, RawWeakMap, Reactivable, clearUndef, colorFillFields, defaultColor, defineProperty, effectFields, flatDocumentToDocument, getDeclarations, getDefaultBackgroundStyle, getDefaultElementStyle, getDefaultHighlightStyle, getDefaultLayoutStyle, getDefaultListStyleStyle, getDefaultOutlineStyle, getDefaultShadowStyle, getDefaultStyle, getDefaultTextInlineStyle, getDefaultTextLineStyle, getDefaultTextStyle, getDefaultTransformStyle, getNestedValue, getObjectValueByPath, getPropertyDescriptor, gradientFillFields, hasCRLF, idGenerator, imageFillFiedls, isCRLF, isColor, isColorFill, isColorFillObject, isEqualObject, isFragmentObject, isGradient, isGradientFill, isGradientFillObject, isImageFill, isImageFillObject, isNone, isParagraphObject, isPresetFill, isPresetFillObject, nanoid, normalizeAudio, normalizeBackground, normalizeCRLF, normalizeColor, normalizeColorFill, normalizeConnection, normalizeDocument, normalizeEffect, normalizeElement, normalizeFill, normalizeFlatDocument, normalizeForeground, normalizeGradient, normalizeGradientFill, normalizeImageFill, normalizeNumber, normalizeOutline, normalizePresetFill, normalizeShadow, normalizeShape, normalizeStyle, normalizeTable, normalizeText, normalizeTextContent, normalizeTextDeformation, normalizeVideo, parseColor, parseGradient, pick, presetFillFiedls, property, property2, propertyOffsetFallback, propertyOffsetGet, propertyOffsetSet, round, setNestedValue, setObjectValueByPath, stringifyGradient, textContentToString };
993
- export type { Align, AngularNode, Audio, Background, BackgroundObject, BackgroundSize, BorderStyle, BoxShadow, BoxSizing, CmykColor, CmykaColor, Color, ColorFill, ColorFillObject, ColorStop, ColorStopNode, Connection, ConnectionAnchor, ConnectionMode, DefaultRadialNode, Direction, DirectionalNode, Display, Document, Effect, Element, EmNode, EventListener, EventListenerOptions, EventListenerValue, ExtentKeywordNode, Fill, FillObject, FillRule, FlatDocument, FlatElement, FlatTextContent, FlexDirection, FlexWrap, FontKerning, FontStyle, FontWeight, Foreground, ForegroundObject, FragmentObject, FullStyle, GradientFill, GradientFillObject, GradientNode, HeadEnd, Hex8Color, HexNode, HighlightColormap, HighlightImage, HighlightLine, HighlightReferImage, HighlightSize, HighlightThickness, HslColor, HslaColor, HsvColor, HsvaColor, HwbColor, HwbaColor, IdGenerator, ImageFill, ImageFillCropRect, ImageFillObject, ImageFillStretchRect, ImageFillTile, Justify, LabColor, LabaColor, LchColor, LchaColor, LineCap, LineEndSize, LineEndType, LineJoin, LinearGradient, LinearGradientNode, LinearGradientWithType, ListStyleColormap, ListStyleImage, ListStylePosition, ListStyleSize, ListStyleType, LiteralNode, Meta, Node, None, NormalizedAudio, NormalizedBackground, NormalizedBackgroundStyle, NormalizedBaseBackground, NormalizedBaseForeground, NormalizedBaseOutline, NormalizedColor, NormalizedColorFill, NormalizedConnection, NormalizedDocument, NormalizedEffect, NormalizedElement, NormalizedElementStyle, NormalizedFill, NormalizedFlatDocument, NormalizedFlatElement, NormalizedForeground, NormalizedFragment, NormalizedGradientFill, NormalizedHighlight, NormalizedHighlightStyle, NormalizedImageFill, NormalizedLayoutStyle, NormalizedListStyle, NormalizedListStyleStyle, NormalizedOutline, NormalizedOutlineStyle, NormalizedParagraph, NormalizedPresetFill, NormalizedShadow, NormalizedShadowStyle, NormalizedShape, NormalizedStyle, NormalizedTable, NormalizedTableCell, NormalizedTableColumn, NormalizedTableRow, NormalizedText, NormalizedTextContent, NormalizedTextDeformation, NormalizedTextDrawStyle, NormalizedTextInlineStyle, NormalizedTextLineStyle, NormalizedTextStyle, NormalizedTransformStyle, NormalizedVideo, ObjectColor, ObservableEvents, Outline, OutlineObject, OutlineStyle, Overflow, ParagraphObject, PercentNode, PointerEvents, Position, PositionKeywordNode, PositionNode, PresetFill, PresetFillObject, PropertyAccessor, PropertyDeclaration, PxNode, RadialGradient, RadialGradientNode, RadialGradientWithType, ReactivableEvents, RepeatingLinearGradientNode, RepeatingRadialGradientNode, RgbColor, RgbNode, RgbaColor, RgbaNode, SVGPathData, Shadow, ShadowObject, Shape, ShapeConnectionPoint, ShapeNode, ShapePath, ShapePathStyle, StrokeLinecap, StrokeLinejoin, Style, StyleObject, StyleUnit, Table, TableCellObject, TableColumnObject, TableObject, TableRowObject, TailEnd, Text, TextAlign, TextContent, TextDecoration, TextDeformation, TextObject, TextOrientation, TextTransform, TextWrap, Toggleable, Uint32Color, VerticalAlign, Video, Visibility, WithNone, WithStyleNone, WritingMode, XyzColor, XyzaColor, _EffectV0 };
1110
+ export { EventEmitter, Observable, RawWeakMap, Reactivable, clearUndef, colorFillFields, defaultColor, defineProperty, effectFields, flatDocumentToDocument, getDeclarations, getDefaultBackgroundStyle, getDefaultElementStyle, getDefaultHighlightStyle, getDefaultLayoutStyle, getDefaultListStyleStyle, getDefaultOutlineStyle, getDefaultShadowStyle, getDefaultStyle, getDefaultTextInlineStyle, getDefaultTextLineStyle, getDefaultTextStyle, getDefaultTransformStyle, getNestedValue, getObjectValueByPath, getPropertyDescriptor, gradientFillFields, hasCRLF, idGenerator, imageFillFiedls, isCRLF, isColor, isColorFill, isColorFillObject, isEqualObject, isFragmentObject, isGradient, isGradientFill, isGradientFillObject, isImageFill, isImageFillObject, isNone, isParagraphObject, isPresetFill, isPresetFillObject, nanoid, normalizeAudio, normalizeBackground, normalizeCRLF, normalizeChart, normalizeColor, normalizeColorFill, normalizeConnection, normalizeDocument, normalizeEffect, normalizeElement, normalizeFill, normalizeFilter, normalizeFlatDocument, normalizeForeground, normalizeGradient, normalizeGradientFill, normalizeImageFill, normalizeNumber, normalizeOutline, normalizePresetFill, normalizeShadow, normalizeShape, normalizeStyle, normalizeTable, normalizeText, normalizeTextContent, normalizeTextDeformation, normalizeVideo, parseColor, parseGradient, pick, presetFillFiedls, property, property2, propertyOffsetFallback, propertyOffsetGet, propertyOffsetSet, round, setNestedValue, setObjectValueByPath, stringifyFilter, stringifyGradient, textContentToString };
1111
+ export type { Align, AngularNode, Audio, Background, BackgroundObject, BackgroundSize, BorderStyle, BoxShadow, BoxSizing, Chart, ChartAxis, ChartGrouping, ChartLegend, ChartObject, ChartSeriesObject, ChartType, CmykColor, CmykaColor, Color, ColorFill, ColorFillObject, ColorStop, ColorStopNode, Connection, ConnectionAnchor, ConnectionMode, DefaultRadialNode, Direction, DirectionalNode, Display, Document, Effect, Element, EmNode, EventListener, EventListenerOptions, EventListenerValue, ExtentKeywordNode, Fill, FillObject, FillRule, Filter, FlatDocument, FlatElement, FlatTextContent, FlexDirection, FlexWrap, FontKerning, FontStyle, FontWeight, Foreground, ForegroundObject, FragmentObject, FullStyle, GradientFill, GradientFillObject, GradientNode, HeadEnd, Hex8Color, HexNode, HighlightColormap, HighlightImage, HighlightLine, HighlightReferImage, HighlightSize, HighlightThickness, HslColor, HslaColor, HsvColor, HsvaColor, HwbColor, HwbaColor, IdGenerator, ImageFill, ImageFillCropRect, ImageFillObject, ImageFillStretchRect, ImageFillTile, Justify, LabColor, LabaColor, LchColor, LchaColor, LineCap, LineEndSize, LineEndType, LineJoin, LinearGradient, LinearGradientNode, LinearGradientWithType, ListStyleColormap, ListStyleImage, ListStylePosition, ListStyleSize, ListStyleType, LiteralNode, Meta, Node, None, NormalizedAudio, NormalizedBackground, NormalizedBackgroundStyle, NormalizedBaseBackground, NormalizedBaseForeground, NormalizedBaseOutline, NormalizedChart, NormalizedChartSeries, NormalizedColor, NormalizedColorFill, NormalizedConnection, NormalizedDocument, NormalizedEffect, NormalizedElement, NormalizedElementStyle, NormalizedFill, NormalizedFilter, NormalizedFlatDocument, NormalizedFlatElement, NormalizedForeground, NormalizedFragment, NormalizedGradientFill, NormalizedHighlight, NormalizedHighlightStyle, NormalizedImageFill, NormalizedLayoutStyle, NormalizedListStyle, NormalizedListStyleStyle, NormalizedOutline, NormalizedOutlineStyle, NormalizedParagraph, NormalizedPresetFill, NormalizedShadow, NormalizedShadowStyle, NormalizedShape, NormalizedStyle, NormalizedTable, NormalizedTableCell, NormalizedTableColumn, NormalizedTableRow, NormalizedText, NormalizedTextContent, NormalizedTextDeformation, NormalizedTextDrawStyle, NormalizedTextInlineStyle, NormalizedTextLineStyle, NormalizedTextStyle, NormalizedTransformStyle, NormalizedVideo, ObjectColor, ObservableEvents, Outline, OutlineObject, OutlineStyle, Overflow, ParagraphObject, PercentNode, PointerEvents, Position, PositionKeywordNode, PositionNode, PresetFill, PresetFillObject, PropertyAccessor, PropertyDeclaration, PxNode, RadialGradient, RadialGradientNode, RadialGradientWithType, ReactivableEvents, RepeatingLinearGradientNode, RepeatingRadialGradientNode, RgbColor, RgbNode, RgbaColor, RgbaNode, SVGPathData, Shadow, ShadowObject, Shape, ShapeConnectionPoint, ShapeNode, ShapePath, ShapePathStyle, StrokeLinecap, StrokeLinejoin, Style, StyleObject, StyleUnit, Table, TableCellObject, TableColumnObject, TableObject, TableRowObject, TailEnd, Text, TextAlign, TextContent, TextDecoration, TextDeformation, TextObject, TextOrientation, TextTransform, TextWrap, Toggleable, Uint32Color, VerticalAlign, Video, Visibility, WithNone, WithStyleNone, WritingMode, XyzColor, XyzaColor, _EffectV0 };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.modernIdoc={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){return typeof e==`string`?{src:e}:e}var n={grad:.9,turn:360,rad:360/(2*Math.PI)},r=function(e){return typeof e==`string`?e.length>0:typeof e==`number`},i=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=10**t),Math.round(n*e)/n+0},a=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=1),e>n?n:e>t?e:t},o=function(e){return(e=isFinite(e)?e%360:0)>0?e:e+360},s=function(e){return{r:a(e.r,0,255),g:a(e.g,0,255),b:a(e.b,0,255),a:a(e.a)}},c=function(e){return{r:i(e.r),g:i(e.g),b:i(e.b),a:i(e.a,3)}},l=/^#([0-9a-f]{3,8})$/i,u=function(e){var t=e.toString(16);return t.length<2?`0`+t:t},d=function(e){var t=e.r,n=e.g,r=e.b,i=e.a,a=Math.max(t,n,r),o=a-Math.min(t,n,r),s=o?a===t?(n-r)/o:a===n?2+(r-t)/o:4+(t-n)/o:0;return{h:60*(s<0?s+6:s),s:a?o/a*100:0,v:a/255*100,a:i}},f=function(e){var t=e.h,n=e.s,r=e.v,i=e.a;t=t/360*6,n/=100,r/=100;var a=Math.floor(t),o=r*(1-n),s=r*(1-(t-a)*n),c=r*(1-(1-t+a)*n),l=a%6;return{r:255*[r,s,o,o,c,r][l],g:255*[c,r,r,s,o,o][l],b:255*[o,o,c,r,r,s][l],a:i}},ee=function(e){return{h:o(e.h),s:a(e.s,0,100),l:a(e.l,0,100),a:a(e.a)}},p=function(e){return{h:i(e.h),s:i(e.s),l:i(e.l),a:i(e.a,3)}},m=function(e){return f((n=(t=e).s,{h:t.h,s:(n*=((r=t.l)<50?r:100-r)/100)>0?2*n/(r+n)*100:0,v:r+n,a:t.a}));var t,n,r},h=function(e){return{h:(t=d(e)).h,s:(i=(200-(n=t.s))*(r=t.v)/100)>0&&i<200?n*r/100/(i<=100?i:200-i)*100:0,l:i/2,a:t.a};var t,n,r,i},g=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,te=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,_=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,ne=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,re={string:[[function(e){var t=l.exec(e);return t?(e=t[1]).length<=4?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:e.length===4?i(parseInt(e[3]+e[3],16)/255,2):1}:e.length===6||e.length===8?{r:parseInt(e.substr(0,2),16),g:parseInt(e.substr(2,2),16),b:parseInt(e.substr(4,2),16),a:e.length===8?i(parseInt(e.substr(6,2),16)/255,2):1}:null:null},`hex`],[function(e){var t=_.exec(e)||ne.exec(e);return t?t[2]!==t[4]||t[4]!==t[6]?null:s({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:t[7]===void 0?1:Number(t[7])/(t[8]?100:1)}):null},`rgb`],[function(e){var t=g.exec(e)||te.exec(e);if(!t)return null;var r,i;return m(ee({h:(r=t[1],i=t[2],i===void 0&&(i=`deg`),Number(r)*(n[i]||1)),s:Number(t[3]),l:Number(t[4]),a:t[5]===void 0?1:Number(t[5])/(t[6]?100:1)}))},`hsl`]],object:[[function(e){var t=e.r,n=e.g,i=e.b,a=e.a,o=a===void 0?1:a;return r(t)&&r(n)&&r(i)?s({r:Number(t),g:Number(n),b:Number(i),a:Number(o)}):null},`rgb`],[function(e){var t=e.h,n=e.s,i=e.l,a=e.a,o=a===void 0?1:a;return!r(t)||!r(n)||!r(i)?null:m(ee({h:Number(t),s:Number(n),l:Number(i),a:Number(o)}))},`hsl`],[function(e){var t=e.h,n=e.s,i=e.v,s=e.a,c=s===void 0?1:s;return!r(t)||!r(n)||!r(i)?null:f(function(e){return{h:o(e.h),s:a(e.s,0,100),v:a(e.v,0,100),a:a(e.a)}}({h:Number(t),s:Number(n),v:Number(i),a:Number(c)}))},`hsv`]]},ie=function(e,t){for(var n=0;n<t.length;n++){var r=t[n][0](e);if(r)return[r,t[n][1]]}return[null,void 0]},ae=function(e){return typeof e==`string`?ie(e.trim(),re.string):typeof e==`object`&&e?ie(e,re.object):[null,void 0]},v=function(e,t){var n=h(e);return{h:n.h,s:a(n.s+100*t,0,100),l:n.l,a:n.a}},y=function(e){return(299*e.r+587*e.g+114*e.b)/1e3/255},b=function(e,t){var n=h(e);return{h:n.h,s:n.s,l:a(n.l+100*t,0,100),a:n.a}},x=function(){function e(e){this.parsed=ae(e)[0],this.rgba=this.parsed||{r:0,g:0,b:0,a:1}}return e.prototype.isValid=function(){return this.parsed!==null},e.prototype.brightness=function(){return i(y(this.rgba),2)},e.prototype.isDark=function(){return y(this.rgba)<.5},e.prototype.isLight=function(){return y(this.rgba)>=.5},e.prototype.toHex=function(){return e=c(this.rgba),t=e.r,n=e.g,r=e.b,o=(a=e.a)<1?u(i(255*a)):``,`#`+u(t)+u(n)+u(r)+o;var e,t,n,r,a,o},e.prototype.toRgb=function(){return c(this.rgba)},e.prototype.toRgbString=function(){return e=c(this.rgba),t=e.r,n=e.g,r=e.b,(i=e.a)<1?`rgba(`+t+`, `+n+`, `+r+`, `+i+`)`:`rgb(`+t+`, `+n+`, `+r+`)`;var e,t,n,r,i},e.prototype.toHsl=function(){return p(h(this.rgba))},e.prototype.toHslString=function(){return e=p(h(this.rgba)),t=e.h,n=e.s,r=e.l,(i=e.a)<1?`hsla(`+t+`, `+n+`%, `+r+`%, `+i+`)`:`hsl(`+t+`, `+n+`%, `+r+`%)`;var e,t,n,r,i},e.prototype.toHsv=function(){return e=d(this.rgba),{h:i(e.h),s:i(e.s),v:i(e.v),a:i(e.a,3)};var e},e.prototype.invert=function(){return S({r:255-(e=this.rgba).r,g:255-e.g,b:255-e.b,a:e.a});var e},e.prototype.saturate=function(e){return e===void 0&&(e=.1),S(v(this.rgba,e))},e.prototype.desaturate=function(e){return e===void 0&&(e=.1),S(v(this.rgba,-e))},e.prototype.grayscale=function(){return S(v(this.rgba,-1))},e.prototype.lighten=function(e){return e===void 0&&(e=.1),S(b(this.rgba,e))},e.prototype.darken=function(e){return e===void 0&&(e=.1),S(b(this.rgba,-e))},e.prototype.rotate=function(e){return e===void 0&&(e=15),this.hue(this.hue()+e)},e.prototype.alpha=function(e){return typeof e==`number`?S({r:(t=this.rgba).r,g:t.g,b:t.b,a:e}):i(this.rgba.a,3);var t},e.prototype.hue=function(e){var t=h(this.rgba);return typeof e==`number`?S({h:e,s:t.s,l:t.l,a:t.a}):i(t.h)},e.prototype.isEqual=function(e){return this.toHex()===S(e).toHex()},e}(),S=function(e){return e instanceof x?e:new x(e)},oe=class{eventListeners=new Map;addEventListener(e,t,n){let r={value:t,options:n},i=this.eventListeners.get(e);return i?Array.isArray(i)?i.push(r):this.eventListeners.set(e,[i,r]):this.eventListeners.set(e,r),this}removeEventListener(e,t,n){if(!t)return this.eventListeners.delete(e),this;let r=this.eventListeners.get(e);if(!r)return this;if(Array.isArray(r)){let i=[];for(let e=0,a=r.length;e<a;e++){let a=r[e];(a.value!==t||typeof n==`object`&&n?.once&&(typeof a.options==`boolean`||!a.options?.once))&&i.push(a)}i.length?this.eventListeners.set(e,i.length===1?i[0]:i):this.eventListeners.delete(e)}else r.value===t&&(typeof n==`boolean`||!n?.once||typeof r.options==`boolean`||r.options?.once)&&this.eventListeners.delete(e);return this}removeAllListeners(){return this.eventListeners.clear(),this}hasEventListener(e){return this.eventListeners.has(e)}dispatchEvent(e,...t){let n=this.eventListeners.get(e);if(n){if(Array.isArray(n))for(let r=n.length,i=0;i<r;i++){let r=n[i];typeof r.options==`object`&&r.options?.once&&this.off(e,r.value,r.options),r.value.apply(this,t)}else typeof n.options==`object`&&n.options?.once&&this.off(e,n.value,n.options),n.value.apply(this,t);return!0}else return!1}on(e,t,n){return this.addEventListener(e,t,n)}once(e,t){return this.addEventListener(e,t,{once:!0})}off(e,t,n){return this.removeEventListener(e,t,n)}emit(e,...t){this.dispatchEvent(e,...t)}};function C(e){return e==null||e===``||e===`none`}function w(e,t=0,n=10**t){return Math.round(n*e)/n+0}function T(e,t){if(typeof e==`number`)return Number.isFinite(e)?e:t;if(typeof e==`string`){let n=Number.parseFloat(e);return Number.isFinite(n)?n:t}return t}function E(e,t=!1){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return t?e.map(e=>E(e,t)):e;let n={};for(let r in e){let i=e[r];i!=null&&(t?n[r]=E(i,t):n[r]=i)}return n}function D(e,t){let n={};return t.forEach(t=>{t in e&&(n[t]=e[t])}),n}function O(e,t){if(e===t)return!0;if(e&&t&&typeof e==`object`&&typeof t==`object`){let n=Array.from(new Set([...Object.keys(e),...Object.keys(t)]));return!n.length||n.every(n=>e[n]===t[n])}return!1}function k(e,t,n){let r=t.length-1;if(r<0)return e===void 0?n:e;for(let i=0;i<r;i++){if(e==null)return n;e=e[t[i]]}return e==null||e[t[r]]===void 0?n:e[t[r]]}function A(e,t,n){let r=t.length-1;for(let n=0;n<r;n++)typeof e[t[n]]!=`object`&&(e[t[n]]={}),e=e[t[n]];e[t[r]]=n}function se(e,t,n){return e==null||!t||typeof t!=`string`?n:e[t]===void 0?(t=t.replace(/\[(\w+)\]/g,`.$1`),t=t.replace(/^\./,``),k(e,t.split(`.`),n)):e[t]}function ce(e,t,n){if(!(typeof e!=`object`||!t))return t=t.replace(/\[(\w+)\]/g,`.$1`),t=t.replace(/^\./,``),A(e,t.split(`.`),n)}var le=class{_eventListeners={};on(e,t){let n=this._eventListeners[e];n===void 0&&(n=[],this._eventListeners[e]=n);let r=n.indexOf(t);return r>-1&&n.splice(r,1),n.push(t),this}once(e,t){let n=(...r)=>{this.off(e,n),t.apply(this,r)};return this.on(e,n),this}off(e,t){let n=this._eventListeners[e];if(n!==void 0){let e=n.indexOf(t);e>-1&&n.splice(e,1)}return this}emit(e,...t){let n=this._eventListeners[e];if(n!==void 0){let e=n.length;if(e>0)for(let r=0;r<e;r++)n[r].apply(this,t)}return this}removeAllListeners(){return this._eventListeners={},this}hasEventListener(e){return!!this._eventListeners[e]}destroy(){this.removeAllListeners()}},ue=class{_map=new WeakMap;_toRaw(e){if(e&&typeof e==`object`){let t=e.__v_raw;t&&(e=this._toRaw(t))}return e}delete(e){return this._map.delete(this._toRaw(e))}get(e){return this._map.get(this._toRaw(e))}has(e){return this._map.has(this._toRaw(e))}set(e,t){return this._map.set(this._toRaw(e),this._toRaw(t)),this}},de=Symbol.for(`declarations`),j=Symbol.for(`inited`);function M(e){let t;if(Object.hasOwn(e,de))t=e[de];else{let n=Object.getPrototypeOf(e);t={...n?M(n):{}},e[de]=t}return t}function N(e,t,n,r){let{alias:i,internalKey:a}=r,o=e[t];i?ce(e,i,n):e[a]=n,e.onUpdateProperty?.(t,n??F(e,t,r),o)}function P(e,t,n){let{alias:r,internalKey:i}=n,a;return a=r?se(e,r):e[i],a??=F(e,t,n),a}function F(e,t,n){let{default:r,fallback:i}=n,a;if(r!==void 0&&!e[j]?.[t]){e[j]||(e[j]={}),e[j][t]=!0;let n=typeof r==`function`?r():r;n!==void 0&&(e[t]=n,a=n)}return a===void 0&&i!==void 0&&(a=typeof i==`function`?i():i),a}function I(e,t){function n(){return this.getProperty?this.getProperty(e):P(this,e,t)}function r(n){this.setProperty?this.setProperty(e,n):N(this,e,n,t)}return{get:n,set:r}}function fe(e,t,n={}){let r={...n,internalKey:Symbol.for(t)},i=M(e);i[t]=r;let{get:a,set:o}=I(t,r);Object.defineProperty(e.prototype,t,{get(){return a.call(this)},set(e){o.call(this,e)},configurable:!0,enumerable:!0})}function pe(e){return function(t,n){if(typeof n!=`string`)throw TypeError(`Failed to @property decorator, prop name cannot be a symbol`);fe(t.constructor,n,e)}}function me(e={}){return function(t,n){let r=n.name;if(typeof r!=`string`)throw TypeError(`Failed to @property decorator, prop name cannot be a symbol`);let i={...e,internalKey:Symbol.for(r)},a=I(r,i);return{init(e){let t=M(this.constructor);return t[r]=i,a.set.call(this,e),e},get(){return a.get.call(this)},set(e){a.set.call(this,e)}}}}var he=class extends le{_propertyAccessor;_properties={};_updatedProperties={};_changedProperties=new Set;_updatingPromise=Promise.resolve();_updating=!1;constructor(e){super(),this.setProperties(e)}isDirty(e){return e?!!this._updatedProperties[e]:Object.keys(this._updatedProperties).length>0}offsetGetProperty(e){return this._properties[e]}offsetSetProperty(e,t){this._properties[e]=t}offsetGetProperties(e){let t=this._properties,n=Object.keys(t),r={};for(let i,a,o=0;o<n.length;o++)i=n[o],a=t[i],a!==void 0&&(!e||e.includes(i))&&(a&&typeof a==`object`?`toJSON`in a?r[i]=a.toJSON():Array.isArray(a)?r[i]=[...a]:r[i]={...a}:r[i]=a);return r}offsetSetProperties(e){if(e&&typeof e==`object`){let t=Object.keys(e);for(let n,r=0;r<t.length;r++)n=t[r],this.offsetSetProperty(n,e[n])}return this}getProperty(e){let t=this.getPropertyDeclaration(e);if(t){if(t.internal||t.alias)return P(this,e,t);{let n=this._propertyAccessor,r;return r=n&&n.getProperty?n.getProperty(e):this.offsetGetProperty(e),r??F(this,e,t)}}}setProperty(e,t){let n=this.getPropertyDeclaration(e);if(n)if(n.internal||n.alias)N(this,e,t,n);else{let r=this.getProperty(e);this._propertyAccessor?.setProperty?.(e,t),this.offsetSetProperty(e,t),this.onUpdateProperty?.(e,t??F(this,e,n),r)}}getProperties(e){let t={},n=this.getPropertyDeclarations(),r=Object.keys(n);for(let i=0,a=r.length;i<a;i++){let a=r[i],o=n[a];o.internal||o.alias||(!e||e.includes(a))&&(t[a]=this.getProperty(a))}return t}setProperties(e){if(e&&typeof e==`object`)for(let t in e)this.setProperty(t,e[t]);return this}resetProperties(){let e=this.getPropertyDeclarations(),t=Object.keys(e);for(let n=0,r=t.length;n<r;n++){let r=t[n],i=e[r];this.setProperty(r,typeof i.default==`function`?i.default():i.default)}return this}getPropertyDeclarations(){return M(this.constructor)}getPropertyDeclaration(e){return this.getPropertyDeclarations()[e]}setPropertyAccessor(e){let t=this.getPropertyDeclarations(),n=[];if(e&&e.getProperty&&e.setProperty){let r=Object.keys(t);for(let i=0,a=r.length;i<a;i++){let a=r[i],o=t[a];if(o.internal||o.alias)continue;let s=this.offsetGetProperty(a),c=e.getProperty(a);c!==void 0&&!Object.is(s,c)&&(this.offsetSetProperty(a,c),n.push({key:a,newValue:c,oldValue:s}))}}this._propertyAccessor=e;for(let e=0,t=n.length;e<t;e++){let{key:t,newValue:r,oldValue:i}=n[e];this.requestUpdate(t,r,i)}return this}async _nextTick(){return`requestAnimationFrame`in globalThis?new Promise(e=>globalThis.requestAnimationFrame(e)):Promise.resolve()}async _enqueueUpdate(){this._updating=!0;try{await this._updatingPromise}catch(e){Promise.reject(e)}await this._nextTick(),this._updating&&=(this.onUpdate(),!1)}onUpdate(){this._update(this._updatedProperties),this._updatedProperties={}}onUpdateProperty(e,t,n){Object.is(t,n)||this.requestUpdate(e,t,n)}requestUpdate(e,t,n){e!==void 0&&(this._updatedProperties[e]=n,this._changedProperties.add(e),this._updateProperty(e,t,n),this.emit(`updateProperty`,e,t,n)),this._updating||(this._updatingPromise=this._enqueueUpdate())}_update(e){}_updateProperty(e,t,n){}toJSON(){return this.offsetGetProperties()}clone(){return new this.constructor(this.toJSON())}destroy(){this.emit(`destroy`),super.destroy()}};function ge(e){let t;return t=typeof e==`number`?{r:e>>24&255,g:e>>16&255,b:e>>8&255,a:(e&255)/255}:e,S(t)}function _e(e){return{r:w(e.r),g:w(e.g),b:w(e.b),a:w(e.a,3)}}function L(e){let t=e.toString(16);return t.length<2?`0${t}`:t}var R=`#000000FF`;function z(e){return ge(e).isValid()}function B(e,t=!1){let n=ge(e);if(!n.isValid()){if(typeof e==`string`)return e;let n=`Failed to normalizeColor ${e}`;if(t)throw Error(n);return console.warn(n),R}let{r,g:i,b:a,a:o}=_e(n.rgba);return`#${L(r)}${L(i)}${L(a)}${L(w(o*255))}`}var V=V||{};V.parse=(function(){let e={linearGradient:/^(-(webkit|o|ms|moz)-)?(linear-gradient)/i,repeatingLinearGradient:/^(-(webkit|o|ms|moz)-)?(repeating-linear-gradient)/i,radialGradient:/^(-(webkit|o|ms|moz)-)?(radial-gradient)/i,repeatingRadialGradient:/^(-(webkit|o|ms|moz)-)?(repeating-radial-gradient)/i,sideOrCorner:/^to (left (top|bottom)|right (top|bottom)|top (left|right)|bottom (left|right)|left|right|top|bottom)/i,extentKeywords:/^(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/,positionKeywords:/^(left|center|right|top|bottom)/i,pixelValue:/^(-?((\d*\.\d+)|(\d+\.?)))px/,percentageValue:/^(-?((\d*\.\d+)|(\d+\.?)))%/,emValue:/^(-?((\d*\.\d+)|(\d+\.?)))em/,angleValue:/^(-?((\d*\.\d+)|(\d+\.?)))deg/,radianValue:/^(-?((\d*\.\d+)|(\d+\.?)))rad/,startCall:/^\(/,endCall:/^\)/,comma:/^,/,hexColor:/^#([0-9a-f]+)/i,literalColor:/^([a-z]+)/i,rgbColor:/^rgb/i,rgbaColor:/^rgba/i,varColor:/^var/i,calcValue:/^calc/i,variableName:/^(--[a-z0-9-,\s#]+)/i,number:/^((\d*\.\d+)|(\d+\.?))/,hslColor:/^hsl/i,hslaColor:/^hsla/i},t=``;function n(e){let n=Error(`${t}: ${e}`);throw n.source=t,n}function r(){let e=i();return t.length>0&&n(`Invalid input not EOF`),e}function i(){return _(a)}function a(){return o(`linear-gradient`,e.linearGradient,c)||o(`repeating-linear-gradient`,e.repeatingLinearGradient,c)||o(`radial-gradient`,e.radialGradient,d)||o(`repeating-radial-gradient`,e.repeatingRadialGradient,d)}function o(t,r,i){return s(r,r=>{let a=i();return a&&(k(e.comma)||n(`Missing comma before color stops`)),{type:t,orientation:a,colorStops:_(ne)}})}function s(t,r){let i=k(t);if(i){k(e.startCall)||n(`Missing (`);let t=r(i);return k(e.endCall)||n(`Missing )`),t}}function c(){let t=l();if(t)return t;let n=O(`position-keyword`,e.positionKeywords,1);return n?{type:`directional`,value:n.value}:u()}function l(){return O(`directional`,e.sideOrCorner,1)}function u(){return O(`angular`,e.angleValue,1)||O(`angular`,e.radianValue,1)}function d(){let n,r=f(),i;return r&&(n=[],n.push(r),i=t,k(e.comma)&&(r=f(),r?n.push(r):t=i)),n}function f(){let e=ee()||p();if(e)e.at=h();else{let t=m();if(t){e=t;let n=h();n&&(e.at=n)}else{let t=h();if(t)e={type:`default-radial`,at:t};else{let t=g();t&&(e={type:`default-radial`,at:t})}}}return e}function ee(){let e=O(`shape`,/^(circle)/i,0);return e&&(e.style=D()||m()),e}function p(){let e=O(`shape`,/^(ellipse)/i,0);return e&&(e.style=g()||w()||m()),e}function m(){return O(`extent-keyword`,e.extentKeywords,1)}function h(){if(O(`position`,/^at/,0)){let e=g();return e||n(`Missing positioning value`),e}}function g(){let e=te();if(e.x||e.y)return{type:`position`,value:e}}function te(){return{x:w(),y:w()}}function _(t){let r=t(),i=[];if(r)for(i.push(r);k(e.comma);)r=t(),r?i.push(r):n(`One extra comma`);return i}function ne(){let e=re();return e||n(`Expected color definition`),e.length=w(),e}function re(){return ae()||S()||x()||y()||v()||b()||ie()}function ie(){return O(`literal`,e.literalColor,0)}function ae(){return O(`hex`,e.hexColor,1)}function v(){return s(e.rgbColor,()=>({type:`rgb`,value:_(C)}))}function y(){return s(e.rgbaColor,()=>({type:`rgba`,value:_(C)}))}function b(){return s(e.varColor,()=>({type:`var`,value:oe()}))}function x(){return s(e.hslColor,()=>{k(e.percentageValue)&&n(`HSL hue value must be a number in degrees (0-360) or normalized (-360 to 360), not a percentage`);let t=C();k(e.comma);let r=k(e.percentageValue),i=r?r[1]:null;k(e.comma),r=k(e.percentageValue);let a=r?r[1]:null;return(!i||!a)&&n(`Expected percentage value for saturation and lightness in HSL`),{type:`hsl`,value:[t,i,a]}})}function S(){return s(e.hslaColor,()=>{let t=C();k(e.comma);let r=k(e.percentageValue),i=r?r[1]:null;k(e.comma),r=k(e.percentageValue);let a=r?r[1]:null;k(e.comma);let o=C();return(!i||!a)&&n(`Expected percentage value for saturation and lightness in HSLA`),{type:`hsla`,value:[t,i,a,o]}})}function oe(){return k(e.variableName)[1]}function C(){return k(e.number)[1]}function w(){return O(`%`,e.percentageValue,1)||T()||E()||D()}function T(){return O(`position-keyword`,e.positionKeywords,1)}function E(){return s(e.calcValue,()=>{let e=1,r=0;for(;e>0&&r<t.length;){let n=t.charAt(r);n===`(`?e++:n===`)`&&e--,r++}e>0&&n(`Missing closing parenthesis in calc() expression`);let i=t.substring(0,r-1);return A(r-1),{type:`calc`,value:i}})}function D(){return O(`px`,e.pixelValue,1)||O(`em`,e.emValue,1)}function O(e,t,n){let r=k(t);if(r)return{type:e,value:r[n]}}function k(e){let n,r;return r=/^\s+/.exec(t),r&&A(r[0].length),n=e.exec(t),n&&A(n[0].length),n}function A(e){t=t.substr(e)}return function(e){return t=e.toString().trim(),t.endsWith(`;`)&&(t=t.slice(0,-1)),r()}})();var ve=V.parse.bind(V),H=H||{};H.stringify=(function(){var e={"visit_linear-gradient":function(t){return e.visit_gradient(t)},"visit_repeating-linear-gradient":function(t){return e.visit_gradient(t)},"visit_radial-gradient":function(t){return e.visit_gradient(t)},"visit_repeating-radial-gradient":function(t){return e.visit_gradient(t)},visit_gradient:function(t){var n=e.visit(t.orientation);return n&&(n+=`, `),t.type+`(`+n+e.visit(t.colorStops)+`)`},visit_shape:function(t){var n=t.value,r=e.visit(t.at),i=e.visit(t.style);return i&&(n+=` `+i),r&&(n+=` at `+r),n},"visit_default-radial":function(t){var n=``,r=e.visit(t.at);return r&&(n+=r),n},"visit_extent-keyword":function(t){var n=t.value,r=e.visit(t.at);return r&&(n+=` at `+r),n},"visit_position-keyword":function(e){return e.value},visit_position:function(t){return e.visit(t.value.x)+` `+e.visit(t.value.y)},"visit_%":function(e){return e.value+`%`},visit_em:function(e){return e.value+`em`},visit_px:function(e){return e.value+`px`},visit_calc:function(e){return`calc(`+e.value+`)`},visit_literal:function(t){return e.visit_color(t.value,t)},visit_hex:function(t){return e.visit_color(`#`+t.value,t)},visit_rgb:function(t){return e.visit_color(`rgb(`+t.value.join(`, `)+`)`,t)},visit_rgba:function(t){return e.visit_color(`rgba(`+t.value.join(`, `)+`)`,t)},visit_hsl:function(t){return e.visit_color(`hsl(`+t.value[0]+`, `+t.value[1]+`%, `+t.value[2]+`%)`,t)},visit_hsla:function(t){return e.visit_color(`hsla(`+t.value[0]+`, `+t.value[1]+`%, `+t.value[2]+`%, `+t.value[3]+`)`,t)},visit_var:function(t){return e.visit_color(`var(`+t.value+`)`,t)},visit_color:function(t,n){var r=t,i=e.visit(n.length);return i&&(r+=` `+i),r},visit_angular:function(e){return e.value+`deg`},visit_directional:function(e){return`to `+e.value},visit_array:function(t){var n=``,r=t.length;return t.forEach(function(t,i){n+=e.visit(t),i<r-1&&(n+=`, `)}),n},visit_object:function(t){return t.width&&t.height?e.visit(t.width)+` `+e.visit(t.height):``},visit:function(t){if(!t)return``;if(t instanceof Array)return e.visit_array(t);if(typeof t==`object`&&!t.type)return e.visit_object(t);if(t.type){var n=e[`visit_`+t.type];if(n)return n(t);throw Error(`Missing visitor visit_`+t.type)}else throw Error(`Invalid node.`)}};return function(t){return e.visit(t)}})();var ye=H.stringify.bind(H);function be(e){let t=e.length-1;return e.map((e,n)=>{let r=e.value,i=w(n/t,3),a=`#00000000`;switch(e.type){case`rgb`:a=B({r:Number(r[0]??0),g:Number(r[1]??0),b:Number(r[2]??0)});break;case`rgba`:a=B({r:Number(r[0]??0),g:Number(r[1]??0),b:Number(r[2]??0),a:Number(r[3]??0)});break;case`literal`:a=B(e.value);break;case`hex`:a=B(`#${e.value}`);break}switch(e.length?.type){case`%`:i=Number(e.length.value)/100;break;case`px`:break;case`em`:break}return{offset:i,color:a}})}function xe(e){let t=0;switch(e.orientation?.type){case`angular`:t=Number(e.orientation.value);break;case`directional`:break}return{type:`linear-gradient`,angle:t,stops:be(e.colorStops)}}function Se(e){return e.orientation?.map(e=>{switch(e?.type){default:return null}}),{type:`radial-gradient`,stops:be(e.colorStops)}}function U(e){return e.startsWith(`linear-gradient(`)||e.startsWith(`radial-gradient(`)}function Ce(e){return ve(e).map(e=>{switch(e?.type){case`linear-gradient`:return xe(e);case`repeating-linear-gradient`:return{...xe(e),repeat:!0};case`radial-gradient`:return Se(e);case`repeating-radial-gradient`:return{...Se(e),repeat:!0};default:return}}).filter(Boolean)}var W=[`color`];function we(e){let t;return t=typeof e==`string`?{color:e}:{...e},t.color&&=B(t.color),D(t,W)}var G=[`linearGradient`,`radialGradient`,`rotateWithShape`];function Te(e){let t;if(t=typeof e==`string`?{image:e}:{...e},t.image){let{type:e,...n}=Ce(t.image)[0]??{};switch(e){case`radial-gradient`:return{radialGradient:n};case`linear-gradient`:return{linearGradient:n}}}return D(t,G)}var K=[`image`,`cropRect`,`stretchRect`,`tile`,`dpi`,`opacity`,`rotateWithShape`];function Ee(e){let t;return t=typeof e==`string`?{image:e}:{...e},D(t,K)}var q=[`preset`,`foregroundColor`,`backgroundColor`];function De(e){let t;return t=typeof e==`string`?{preset:e}:{...e},C(t.foregroundColor)?delete t.foregroundColor:t.foregroundColor=B(t.foregroundColor),C(t.backgroundColor)?delete t.backgroundColor:t.backgroundColor=B(t.backgroundColor),D(t,q)}function Oe(e){return!C(e.color)}function ke(e){return typeof e==`string`?z(e):Oe(e)}function Ae(e){return!C(e.image)&&U(e.image)||!!e.linearGradient||!!e.radialGradient}function je(e){return typeof e==`string`?U(e):Ae(e)}function Me(e){return!C(e.image)&&!U(e.image)}function Ne(e){return typeof e==`string`?!z(e)&&!U(e):Me(e)}function Pe(e){return!C(e.preset)}function Fe(e){return typeof e==`string`?!1:Pe(e)}function J(e){let t={enabled:e&&typeof e==`object`?e.enabled??!0:!0};return ke(e)&&Object.assign(t,we(e)),je(e)&&Object.assign(t,Te(e)),Ne(e)&&Object.assign(t,Ee(e)),Fe(e)&&Object.assign(t,De(e)),D(E(t),Array.from(new Set([`enabled`,...W,...K,...G,...q])))}function Ie(e){return typeof e==`string`?{...J(e)}:{...J(e),...D(e,[`fillWithShape`])}}function Le(){return{backgroundImage:`none`,backgroundSize:`auto, auto`,backgroundColor:`none`,backgroundColormap:`none`}}function Re(e){return E({start:e.start,end:e.end,mode:e.mode??`straight`})}function Y(e){return typeof e==`string`?{...J(e)}:{...J(e),...D(e,[`width`,`style`,`lineCap`,`lineJoin`,`headEnd`,`tailEnd`])}}function ze(){return{outlineWidth:0,outlineOffset:0,outlineColor:`none`,outlineStyle:`none`}}function Be(e){return typeof e==`string`?{enabled:!0,color:B(e)}:{...e,enabled:e.enabled??!0,color:C(e.color)?R:B(e.color)}}function Ve(){return{boxShadow:`none`}}var He=[`fill`,`outline`,`shadow`,`transform`,`transformOrigin`];function Ue(e){let t=D(e,He),{rotate:n,scaleX:r,scaleY:i,skewX:a,skewY:o,translateX:s,translateY:c}=e,l=[];return(s||c)&&l.push(`translate(${s||0}, ${c||0})`),n&&l.push(`rotate(${n}deg)`),(r||i)&&l.push(`scale(${r??1}, ${i??1})`),a&&l.push(`skewX(${a}deg)`),o&&l.push(`skewY(${o}deg)`),l.length>0&&(t.transform=l.join(` `)),(e.textStrokeWidth||e.textStrokeColor)&&(t.outline={color:e.textStrokeColor,width:e.textStrokeWidth}),e.color&&(t.fill={color:e.color}),(e.shadowOffsetX||e.shadowOffsetY||e.shadowBlur||e.shadowColor)&&(t.shadow={offsetX:e.shadowOffsetX,offsetY:e.shadowOffsetY,blur:e.shadowBlur,color:e.shadowColor}),t}function X(e){let t=Ue(e);return E({fill:C(t.fill)?void 0:J(t.fill),outline:C(t.outline)?void 0:Y(t.outline),shadow:C(t.shadow)?void 0:Be(t.shadow),transform:C(t.transform)?void 0:t.transform,transformOrigin:t.transformOrigin})}function We(e){return typeof e==`string`?{...J(e)}:{...J(e),...D(e,[`fillWithShape`])}}var Ge=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`,Ke=(e=21)=>{let t=``,n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+=Ge[n[e]&63];return t},qe=()=>Ke(10),Je=qe;function Ye(e){return typeof e==`string`?e.startsWith(`<svg`)?{enabled:!0,svg:e}:{enabled:!0,paths:[{data:e}]}:Array.isArray(e)?{enabled:!0,paths:e.map(e=>typeof e==`string`?{data:e}:e)}:e}function Xe(){return{overflow:`visible`,direction:void 0,display:void 0,boxSizing:void 0,width:void 0,height:void 0,maxHeight:void 0,maxWidth:void 0,minHeight:void 0,minWidth:void 0,position:void 0,left:0,top:0,right:void 0,bottom:void 0,borderTop:void 0,borderLeft:void 0,borderRight:void 0,borderBottom:void 0,borderWidth:0,border:void 0,flex:void 0,flexBasis:void 0,flexDirection:void 0,flexGrow:void 0,flexShrink:void 0,flexWrap:void 0,justifyContent:void 0,gap:void 0,alignContent:void 0,alignItems:void 0,alignSelf:void 0,marginTop:void 0,marginLeft:void 0,marginRight:void 0,marginBottom:void 0,margin:void 0,paddingTop:void 0,paddingLeft:void 0,paddingRight:void 0,paddingBottom:void 0,padding:void 0}}function Ze(){return{rotate:0,scaleX:1,scaleY:1,skewX:0,skewY:0,translateX:0,translateY:0,transform:`none`,transformOrigin:`center`}}function Qe(){return{...Xe(),...Ze(),...Ve(),...Le(),...ze(),borderRadius:0,borderColor:`none`,borderStyle:`solid`,visibility:`visible`,filter:`none`,opacity:1,pointerEvents:`auto`,maskImage:`none`}}function $e(){return{highlight:{},highlightImage:`none`,highlightReferImage:`none`,highlightColormap:`none`,highlightLine:`none`,highlightSize:`cover`,highlightThickness:`100%`}}function et(){return{listStyle:{},listStyleType:`none`,listStyleImage:`none`,listStyleColormap:`none`,listStyleSize:`cover`,listStylePosition:`outside`}}function tt(){return{...$e(),color:`#000000`,verticalAlign:`baseline`,letterSpacing:0,wordSpacing:0,fontSize:14,fontWeight:`normal`,fontFamily:``,fontStyle:`normal`,fontKerning:`normal`,textTransform:`none`,textOrientation:`mixed`,textDecoration:`none`}}function nt(){return{...et(),writingMode:`horizontal-tb`,textWrap:`wrap`,textAlign:`start`,textIndent:0,lineHeight:1.2}}function rt(){return{...nt(),...tt(),textStrokeWidth:0,textStrokeColor:`none`}}var it=[`textIndent`,`lineHeight`,`letterSpacing`,`wordSpacing`,`fontSize`,`textStrokeWidth`,`borderRadius`,`opacity`,`rotate`,`scaleX`,`scaleY`,`skewX`,`skewY`,`translateX`,`translateY`,`borderWidth`,`flex`,`flexGrow`,`flexShrink`];function Z(e){let t=E({...e,color:C(e.color)?void 0:B(e.color),backgroundColor:C(e.backgroundColor)?void 0:B(e.backgroundColor),borderColor:C(e.borderColor)?void 0:B(e.borderColor),outlineColor:C(e.outlineColor)?void 0:B(e.outlineColor),shadowColor:C(e.shadowColor)?void 0:B(e.shadowColor),textStrokeColor:C(e.textStrokeColor)?void 0:B(e.textStrokeColor)});for(let e of it)if(e in t){let n=T(t[e]);n===void 0?delete t[e]:t[e]=n}return t}function at(){return{...Qe(),...rt()}}function ot(e){return E({width:T(e.width)})}function st(e){return E({height:T(e.height)})}function ct(e){return E({row:T(e.row)??0,col:T(e.col)??0,rowSpan:T(e.rowSpan),colSpan:T(e.colSpan),children:(e.children??[]).map(e=>$(e)),background:C(e.background)?void 0:Ie(e.background),style:C(e.style)?void 0:Z(e.style)})}function lt(e){return E({enabled:e.enabled??!0,columns:(e.columns??[]).map(ot),rows:(e.rows??[]).map(st),cells:(e.cells??[]).map(ct)})}var ut=/\r\n|\n\r|\n|\r/,dt=RegExp(`${ut.source}|<br\\/>`,`g`),ft=RegExp(`^(${ut.source})$`),pt=`
2
- `;function mt(e){return ut.test(e)}function ht(e){return ft.test(e)}function gt(e){return e.replace(dt,pt)}function Q(e){let t=[];function n(){return t[t.length-1]}function r(e,n,r){let i=e?Z(e):{},a=n?J(n):void 0,o=r?Y(r):void 0,s=E({...i,fill:a,outline:o,fragments:[]});return t[t.length-1]?.fragments.length===0?t[t.length-1]=s:t.push(s),s}function i(e=``,t,i,a){let o=t?Z(t):{},s=i?J(i):void 0,c=a?Y(a):void 0;Array.from(e).forEach(e=>{if(ht(e)){let{fragments:e,fill:t,outline:i,...a}=n()||r();e.length||e.push(E({...o,fill:s,outline:c,content:pt})),r(a,t,i)}else{let t=n()||r(),i=t.fragments[t.fragments.length-1];if(i){let{content:t,fill:n,outline:r,...a}=i;if(O(s,n)&&O(c,r)&&O(o,a)){i.content=`${t}${e}`;return}}t.fragments.push(E({...o,fill:s,outline:c,content:e}))}})}(Array.isArray(e)?e:[e]).forEach(e=>{if(typeof e==`string`)r(),i(e);else if(vt(e)){let{content:t,fill:n,outline:a,...o}=e;r(o,n,a),i(t)}else if(_t(e)){let{fragments:t,fill:n,outline:a,...o}=e;r(o,n,a),t.forEach(e=>{let{content:t,fill:n,outline:r,...a}=e;i(t,a,n,r)})}else Array.isArray(e)?(r(),e.forEach(e=>{if(typeof e==`string`)i(e);else if(vt(e)){let{content:t,fill:n,outline:r,...a}=e;i(t,a,n,r)}})):console.warn(`Failed to parse text content`,e)});let a=n();return a&&!a.fragments.length&&a.fragments.push({content:``}),t}function _t(e){return e&&typeof e==`object`&&`fragments`in e&&Array.isArray(e.fragments)}function vt(e){return e&&typeof e==`object`&&`content`in e&&typeof e.content==`string`}function yt(e){return E({type:e.type,intensities:e.intensities,maxFontSize:e.maxFontSize??100})}function bt(e){return typeof e==`string`||Array.isArray(e)?{enabled:!0,content:Q(e)}:E({enabled:e.enabled??!0,content:Q(e.content??``),style:e.style?Z(e.style):void 0,deformation:e.deformation?yt(e.deformation):void 0,measureDom:e.measureDom,fonts:e.fonts,...X(e),effects:e.effects?e.effects.map(e=>X(e)):void 0})}function xt(e){return Q(e).map(e=>{let t=gt(e.fragments.flatMap(e=>e.content).join(``));return ht(t)?``:t}).join(pt)}function St(e){return typeof e==`string`?{src:e}:e}function $(e){return E({id:e.id??Je(),style:C(e.style)?void 0:Z(e.style),text:C(e.text)?void 0:bt(e.text),background:C(e.background)?void 0:Ie(e.background),shape:C(e.shape)?void 0:Ye(e.shape),foreground:C(e.foreground)?void 0:We(e.foreground),video:C(e.video)?void 0:St(e.video),audio:C(e.audio)?void 0:t(e.audio),connection:C(e.connection)?void 0:Re(e.connection),table:C(e.table)?void 0:lt(e.table),...X(e),children:e.children?.map(e=>$(e))})}function Ct(e){return $(e)}function wt(e){let t={};for(let n in e.children){let r=$(e.children[n]);delete r.children,t[n]=r}return{...e,children:t}}function Tt(e){let{children:t,...n}=e;function r(e){let{parentId:t,childrenIds:n,...r}=e;return{...r,children:[]}}let i={},a=[],o={...n,children:a};function s(e){if(!t[e]||i[e])return;let n=t[e],o=r(n);i[e]=o;let c=n.parentId;if(c){s(c);let n=t[c],r=i[c];if(!r)return;n?.childrenIds&&r?.children&&(r.children[n.childrenIds.indexOf(e)]=o)}else a.push(o)}for(let e in t)s(e);return o}e.EventEmitter=oe,e.Observable=le,e.RawWeakMap=ue,e.Reactivable=he,e.clearUndef=E,e.colorFillFields=W,e.defaultColor=R,e.defineProperty=fe,e.effectFields=He,e.flatDocumentToDocument=Tt,e.getDeclarations=M,e.getDefaultBackgroundStyle=Le,e.getDefaultElementStyle=Qe,e.getDefaultHighlightStyle=$e,e.getDefaultLayoutStyle=Xe,e.getDefaultListStyleStyle=et,e.getDefaultOutlineStyle=ze,e.getDefaultShadowStyle=Ve,e.getDefaultStyle=at,e.getDefaultTextInlineStyle=tt,e.getDefaultTextLineStyle=nt,e.getDefaultTextStyle=rt,e.getDefaultTransformStyle=Ze,e.getNestedValue=k,e.getObjectValueByPath=se,e.getPropertyDescriptor=I,e.gradientFillFields=G,e.hasCRLF=mt,e.idGenerator=Je,e.imageFillFiedls=K,e.isCRLF=ht,e.isColor=z,e.isColorFill=ke,e.isColorFillObject=Oe,e.isEqualObject=O,e.isFragmentObject=vt,e.isGradient=U,e.isGradientFill=je,e.isGradientFillObject=Ae,e.isImageFill=Ne,e.isImageFillObject=Me,e.isNone=C,e.isParagraphObject=_t,e.isPresetFill=Fe,e.isPresetFillObject=Pe,e.nanoid=qe,e.normalizeAudio=t,e.normalizeBackground=Ie,e.normalizeCRLF=gt,e.normalizeColor=B,e.normalizeColorFill=we,e.normalizeConnection=Re,e.normalizeDocument=Ct,e.normalizeEffect=X,e.normalizeElement=$,e.normalizeFill=J,e.normalizeFlatDocument=wt,e.normalizeForeground=We,e.normalizeGradient=Ce,e.normalizeGradientFill=Te,e.normalizeImageFill=Ee,e.normalizeNumber=T,e.normalizeOutline=Y,e.normalizePresetFill=De,e.normalizeShadow=Be,e.normalizeShape=Ye,e.normalizeStyle=Z,e.normalizeTable=lt,e.normalizeText=bt,e.normalizeTextContent=Q,e.normalizeTextDeformation=yt,e.normalizeVideo=St,e.parseColor=ge,e.parseGradient=ve,e.pick=D,e.presetFillFiedls=q,e.property=pe,e.property2=me,e.propertyOffsetFallback=F,e.propertyOffsetGet=P,e.propertyOffsetSet=N,e.round=w,e.setNestedValue=A,e.setObjectValueByPath=ce,e.stringifyGradient=ye,e.textContentToString=xt});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.modernIdoc={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){return typeof e==`string`?{src:e}:e}var n={grad:.9,turn:360,rad:360/(2*Math.PI)},r=function(e){return typeof e==`string`?e.length>0:typeof e==`number`},i=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=10**t),Math.round(n*e)/n+0},a=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=1),e>n?n:e>t?e:t},o=function(e){return(e=isFinite(e)?e%360:0)>0?e:e+360},s=function(e){return{r:a(e.r,0,255),g:a(e.g,0,255),b:a(e.b,0,255),a:a(e.a)}},c=function(e){return{r:i(e.r),g:i(e.g),b:i(e.b),a:i(e.a,3)}},l=/^#([0-9a-f]{3,8})$/i,u=function(e){var t=e.toString(16);return t.length<2?`0`+t:t},d=function(e){var t=e.r,n=e.g,r=e.b,i=e.a,a=Math.max(t,n,r),o=a-Math.min(t,n,r),s=o?a===t?(n-r)/o:a===n?2+(r-t)/o:4+(t-n)/o:0;return{h:60*(s<0?s+6:s),s:a?o/a*100:0,v:a/255*100,a:i}},f=function(e){var t=e.h,n=e.s,r=e.v,i=e.a;t=t/360*6,n/=100,r/=100;var a=Math.floor(t),o=r*(1-n),s=r*(1-(t-a)*n),c=r*(1-(1-t+a)*n),l=a%6;return{r:255*[r,s,o,o,c,r][l],g:255*[c,r,r,s,o,o][l],b:255*[o,o,c,r,r,s][l],a:i}},p=function(e){return{h:o(e.h),s:a(e.s,0,100),l:a(e.l,0,100),a:a(e.a)}},ee=function(e){return{h:i(e.h),s:i(e.s),l:i(e.l),a:i(e.a,3)}},m=function(e){return f((n=(t=e).s,{h:t.h,s:(n*=((r=t.l)<50?r:100-r)/100)>0?2*n/(r+n)*100:0,v:r+n,a:t.a}));var t,n,r},h=function(e){return{h:(t=d(e)).h,s:(i=(200-(n=t.s))*(r=t.v)/100)>0&&i<200?n*r/100/(i<=100?i:200-i)*100:0,l:i/2,a:t.a};var t,n,r,i},g=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,te=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,_=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,ne=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,v={string:[[function(e){var t=l.exec(e);return t?(e=t[1]).length<=4?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:e.length===4?i(parseInt(e[3]+e[3],16)/255,2):1}:e.length===6||e.length===8?{r:parseInt(e.substr(0,2),16),g:parseInt(e.substr(2,2),16),b:parseInt(e.substr(4,2),16),a:e.length===8?i(parseInt(e.substr(6,2),16)/255,2):1}:null:null},`hex`],[function(e){var t=_.exec(e)||ne.exec(e);return t?t[2]!==t[4]||t[4]!==t[6]?null:s({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:t[7]===void 0?1:Number(t[7])/(t[8]?100:1)}):null},`rgb`],[function(e){var t=g.exec(e)||te.exec(e);if(!t)return null;var r,i;return m(p({h:(r=t[1],i=t[2],i===void 0&&(i=`deg`),Number(r)*(n[i]||1)),s:Number(t[3]),l:Number(t[4]),a:t[5]===void 0?1:Number(t[5])/(t[6]?100:1)}))},`hsl`]],object:[[function(e){var t=e.r,n=e.g,i=e.b,a=e.a,o=a===void 0?1:a;return r(t)&&r(n)&&r(i)?s({r:Number(t),g:Number(n),b:Number(i),a:Number(o)}):null},`rgb`],[function(e){var t=e.h,n=e.s,i=e.l,a=e.a,o=a===void 0?1:a;return!r(t)||!r(n)||!r(i)?null:m(p({h:Number(t),s:Number(n),l:Number(i),a:Number(o)}))},`hsl`],[function(e){var t=e.h,n=e.s,i=e.v,s=e.a,c=s===void 0?1:s;return!r(t)||!r(n)||!r(i)?null:f(function(e){return{h:o(e.h),s:a(e.s,0,100),v:a(e.v,0,100),a:a(e.a)}}({h:Number(t),s:Number(n),v:Number(i),a:Number(c)}))},`hsv`]]},y=function(e,t){for(var n=0;n<t.length;n++){var r=t[n][0](e);if(r)return[r,t[n][1]]}return[null,void 0]},re=function(e){return typeof e==`string`?y(e.trim(),v.string):typeof e==`object`&&e?y(e,v.object):[null,void 0]},b=function(e,t){var n=h(e);return{h:n.h,s:a(n.s+100*t,0,100),l:n.l,a:n.a}},x=function(e){return(299*e.r+587*e.g+114*e.b)/1e3/255},ie=function(e,t){var n=h(e);return{h:n.h,s:n.s,l:a(n.l+100*t,0,100),a:n.a}},S=function(){function e(e){this.parsed=re(e)[0],this.rgba=this.parsed||{r:0,g:0,b:0,a:1}}return e.prototype.isValid=function(){return this.parsed!==null},e.prototype.brightness=function(){return i(x(this.rgba),2)},e.prototype.isDark=function(){return x(this.rgba)<.5},e.prototype.isLight=function(){return x(this.rgba)>=.5},e.prototype.toHex=function(){return e=c(this.rgba),t=e.r,n=e.g,r=e.b,o=(a=e.a)<1?u(i(255*a)):``,`#`+u(t)+u(n)+u(r)+o;var e,t,n,r,a,o},e.prototype.toRgb=function(){return c(this.rgba)},e.prototype.toRgbString=function(){return e=c(this.rgba),t=e.r,n=e.g,r=e.b,(i=e.a)<1?`rgba(`+t+`, `+n+`, `+r+`, `+i+`)`:`rgb(`+t+`, `+n+`, `+r+`)`;var e,t,n,r,i},e.prototype.toHsl=function(){return ee(h(this.rgba))},e.prototype.toHslString=function(){return e=ee(h(this.rgba)),t=e.h,n=e.s,r=e.l,(i=e.a)<1?`hsla(`+t+`, `+n+`%, `+r+`%, `+i+`)`:`hsl(`+t+`, `+n+`%, `+r+`%)`;var e,t,n,r,i},e.prototype.toHsv=function(){return e=d(this.rgba),{h:i(e.h),s:i(e.s),v:i(e.v),a:i(e.a,3)};var e},e.prototype.invert=function(){return C({r:255-(e=this.rgba).r,g:255-e.g,b:255-e.b,a:e.a});var e},e.prototype.saturate=function(e){return e===void 0&&(e=.1),C(b(this.rgba,e))},e.prototype.desaturate=function(e){return e===void 0&&(e=.1),C(b(this.rgba,-e))},e.prototype.grayscale=function(){return C(b(this.rgba,-1))},e.prototype.lighten=function(e){return e===void 0&&(e=.1),C(ie(this.rgba,e))},e.prototype.darken=function(e){return e===void 0&&(e=.1),C(ie(this.rgba,-e))},e.prototype.rotate=function(e){return e===void 0&&(e=15),this.hue(this.hue()+e)},e.prototype.alpha=function(e){return typeof e==`number`?C({r:(t=this.rgba).r,g:t.g,b:t.b,a:e}):i(this.rgba.a,3);var t},e.prototype.hue=function(e){var t=h(this.rgba);return typeof e==`number`?C({h:e,s:t.s,l:t.l,a:t.a}):i(t.h)},e.prototype.isEqual=function(e){return this.toHex()===C(e).toHex()},e}(),C=function(e){return e instanceof S?e:new S(e)},ae=class{eventListeners=new Map;addEventListener(e,t,n){let r={value:t,options:n},i=this.eventListeners.get(e);return i?Array.isArray(i)?i.push(r):this.eventListeners.set(e,[i,r]):this.eventListeners.set(e,r),this}removeEventListener(e,t,n){if(!t)return this.eventListeners.delete(e),this;let r=this.eventListeners.get(e);if(!r)return this;if(Array.isArray(r)){let i=[];for(let e=0,a=r.length;e<a;e++){let a=r[e];(a.value!==t||typeof n==`object`&&n?.once&&(typeof a.options==`boolean`||!a.options?.once))&&i.push(a)}i.length?this.eventListeners.set(e,i.length===1?i[0]:i):this.eventListeners.delete(e)}else r.value===t&&(typeof n==`boolean`||!n?.once||typeof r.options==`boolean`||r.options?.once)&&this.eventListeners.delete(e);return this}removeAllListeners(){return this.eventListeners.clear(),this}hasEventListener(e){return this.eventListeners.has(e)}dispatchEvent(e,...t){let n=this.eventListeners.get(e);if(n){if(Array.isArray(n))for(let r=n.length,i=0;i<r;i++){let r=n[i];typeof r.options==`object`&&r.options?.once&&this.off(e,r.value,r.options),r.value.apply(this,t)}else typeof n.options==`object`&&n.options?.once&&this.off(e,n.value,n.options),n.value.apply(this,t);return!0}else return!1}on(e,t,n){return this.addEventListener(e,t,n)}once(e,t){return this.addEventListener(e,t,{once:!0})}off(e,t,n){return this.removeEventListener(e,t,n)}emit(e,...t){this.dispatchEvent(e,...t)}};function w(e){return e==null||e===``||e===`none`}function T(e,t=0,n=10**t){return Math.round(n*e)/n+0}function E(e,t){if(typeof e==`number`)return Number.isFinite(e)?e:t;if(typeof e==`string`){let n=Number.parseFloat(e);return Number.isFinite(n)?n:t}return t}function D(e,t=!1){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return t?e.map(e=>D(e,t)):e;let n={};for(let r in e){let i=e[r];i!=null&&(t?n[r]=D(i,t):n[r]=i)}return n}function O(e,t){let n={};return t.forEach(t=>{t in e&&(n[t]=e[t])}),n}function k(e,t){if(e===t)return!0;if(e&&t&&typeof e==`object`&&typeof t==`object`){let n=Array.from(new Set([...Object.keys(e),...Object.keys(t)]));return!n.length||n.every(n=>e[n]===t[n])}return!1}function A(e,t,n){let r=t.length-1;if(r<0)return e===void 0?n:e;for(let i=0;i<r;i++){if(e==null)return n;e=e[t[i]]}return e==null||e[t[r]]===void 0?n:e[t[r]]}function j(e,t,n){let r=t.length-1;for(let n=0;n<r;n++)typeof e[t[n]]!=`object`&&(e[t[n]]={}),e=e[t[n]];e[t[r]]=n}function oe(e,t,n){return e==null||!t||typeof t!=`string`?n:e[t]===void 0?(t=t.replace(/\[(\w+)\]/g,`.$1`),t=t.replace(/^\./,``),A(e,t.split(`.`),n)):e[t]}function se(e,t,n){if(!(typeof e!=`object`||!t))return t=t.replace(/\[(\w+)\]/g,`.$1`),t=t.replace(/^\./,``),j(e,t.split(`.`),n)}var ce=class{_eventListeners={};on(e,t){let n=this._eventListeners[e];n===void 0&&(n=[],this._eventListeners[e]=n);let r=n.indexOf(t);return r>-1&&n.splice(r,1),n.push(t),this}once(e,t){let n=(...r)=>{this.off(e,n),t.apply(this,r)};return this.on(e,n),this}off(e,t){let n=this._eventListeners[e];if(n!==void 0){let e=n.indexOf(t);e>-1&&n.splice(e,1)}return this}emit(e,...t){let n=this._eventListeners[e];if(n!==void 0){let e=n.length;if(e>0)for(let r=0;r<e;r++)n[r].apply(this,t)}return this}removeAllListeners(){return this._eventListeners={},this}hasEventListener(e){return!!this._eventListeners[e]}destroy(){this.removeAllListeners()}},le=class{_map=new WeakMap;_toRaw(e){if(e&&typeof e==`object`){let t=e.__v_raw;t&&(e=this._toRaw(t))}return e}delete(e){return this._map.delete(this._toRaw(e))}get(e){return this._map.get(this._toRaw(e))}has(e){return this._map.has(this._toRaw(e))}set(e,t){return this._map.set(this._toRaw(e),this._toRaw(t)),this}},ue=Symbol.for(`declarations`),M=Symbol.for(`inited`);function N(e){let t;if(Object.hasOwn(e,ue))t=e[ue];else{let n=Object.getPrototypeOf(e);t={...n?N(n):{}},e[ue]=t}return t}function P(e,t,n,r){let{alias:i,internalKey:a}=r,o=e[t];i?se(e,i,n):e[a]=n,e.onUpdateProperty?.(t,n??I(e,t,r),o)}function F(e,t,n){let{alias:r,internalKey:i}=n,a;return a=r?oe(e,r):e[i],a??=I(e,t,n),a}function I(e,t,n){let{default:r,fallback:i}=n,a;if(r!==void 0&&!e[M]?.[t]){e[M]||(e[M]={}),e[M][t]=!0;let n=typeof r==`function`?r():r;n!==void 0&&(e[t]=n,a=n)}return a===void 0&&i!==void 0&&(a=typeof i==`function`?i():i),a}function de(e,t){function n(){return this.getProperty?this.getProperty(e):F(this,e,t)}function r(n){this.setProperty?this.setProperty(e,n):P(this,e,n,t)}return{get:n,set:r}}function fe(e,t,n={}){let r={...n,internalKey:Symbol.for(t)},i=N(e);i[t]=r;let{get:a,set:o}=de(t,r);Object.defineProperty(e.prototype,t,{get(){return a.call(this)},set(e){o.call(this,e)},configurable:!0,enumerable:!0})}function pe(e){return function(t,n){if(typeof n!=`string`)throw TypeError(`Failed to @property decorator, prop name cannot be a symbol`);fe(t.constructor,n,e)}}function me(e={}){return function(t,n){let r=n.name;if(typeof r!=`string`)throw TypeError(`Failed to @property decorator, prop name cannot be a symbol`);let i={...e,internalKey:Symbol.for(r)},a=de(r,i);return{init(e){let t=N(this.constructor);return t[r]=i,a.set.call(this,e),e},get(){return a.get.call(this)},set(e){a.set.call(this,e)}}}}var he=class extends ce{_propertyAccessor;_properties={};_updatedProperties={};_changedProperties=new Set;_updatingPromise=Promise.resolve();_updating=!1;constructor(e){super(),this.setProperties(e)}isDirty(e){return e?!!this._updatedProperties[e]:Object.keys(this._updatedProperties).length>0}offsetGetProperty(e){return this._properties[e]}offsetSetProperty(e,t){this._properties[e]=t}offsetGetProperties(e){let t=this._properties,n=Object.keys(t),r={};for(let i,a,o=0;o<n.length;o++)i=n[o],a=t[i],a!==void 0&&(!e||e.includes(i))&&(a&&typeof a==`object`?`toJSON`in a?r[i]=a.toJSON():Array.isArray(a)?r[i]=[...a]:r[i]={...a}:r[i]=a);return r}offsetSetProperties(e){if(e&&typeof e==`object`){let t=Object.keys(e);for(let n,r=0;r<t.length;r++)n=t[r],this.offsetSetProperty(n,e[n])}return this}getProperty(e){let t=this.getPropertyDeclaration(e);if(t){if(t.internal||t.alias)return F(this,e,t);{let n=this._propertyAccessor,r;return r=n&&n.getProperty?n.getProperty(e):this.offsetGetProperty(e),r??I(this,e,t)}}}setProperty(e,t){let n=this.getPropertyDeclaration(e);if(n)if(n.internal||n.alias)P(this,e,t,n);else{let r=this.getProperty(e);this._propertyAccessor?.setProperty?.(e,t),this.offsetSetProperty(e,t),this.onUpdateProperty?.(e,t??I(this,e,n),r)}}getProperties(e){let t={},n=this.getPropertyDeclarations(),r=Object.keys(n);for(let i=0,a=r.length;i<a;i++){let a=r[i],o=n[a];o.internal||o.alias||(!e||e.includes(a))&&(t[a]=this.getProperty(a))}return t}setProperties(e){if(e&&typeof e==`object`)for(let t in e)this.setProperty(t,e[t]);return this}resetProperties(){let e=this.getPropertyDeclarations(),t=Object.keys(e);for(let n=0,r=t.length;n<r;n++){let r=t[n],i=e[r];this.setProperty(r,typeof i.default==`function`?i.default():i.default)}return this}getPropertyDeclarations(){return N(this.constructor)}getPropertyDeclaration(e){return this.getPropertyDeclarations()[e]}setPropertyAccessor(e){let t=this.getPropertyDeclarations(),n=[];if(e&&e.getProperty&&e.setProperty){let r=Object.keys(t);for(let i=0,a=r.length;i<a;i++){let a=r[i],o=t[a];if(o.internal||o.alias)continue;let s=this.offsetGetProperty(a),c=e.getProperty(a);c!==void 0&&!Object.is(s,c)&&(this.offsetSetProperty(a,c),n.push({key:a,newValue:c,oldValue:s}))}}this._propertyAccessor=e;for(let e=0,t=n.length;e<t;e++){let{key:t,newValue:r,oldValue:i}=n[e];this.requestUpdate(t,r,i)}return this}async _nextTick(){return`requestAnimationFrame`in globalThis?new Promise(e=>globalThis.requestAnimationFrame(e)):Promise.resolve()}async _enqueueUpdate(){this._updating=!0;try{await this._updatingPromise}catch(e){Promise.reject(e)}await this._nextTick(),this._updating&&=(this.onUpdate(),!1)}onUpdate(){this._update(this._updatedProperties),this._updatedProperties={}}onUpdateProperty(e,t,n){Object.is(t,n)||this.requestUpdate(e,t,n)}requestUpdate(e,t,n){e!==void 0&&(this._updatedProperties[e]=n,this._changedProperties.add(e),this._updateProperty(e,t,n),this.emit(`updateProperty`,e,t,n)),this._updating||(this._updatingPromise=this._enqueueUpdate())}_update(e){}_updateProperty(e,t,n){}toJSON(){return this.offsetGetProperties()}clone(){return new this.constructor(this.toJSON())}destroy(){this.emit(`destroy`),super.destroy()}};function ge(e){let t;return t=typeof e==`number`?{r:e>>24&255,g:e>>16&255,b:e>>8&255,a:(e&255)/255}:e,C(t)}function _e(e){return{r:T(e.r),g:T(e.g),b:T(e.b),a:T(e.a,3)}}function L(e){let t=e.toString(16);return t.length<2?`0${t}`:t}var ve=`#000000FF`;function R(e){return ge(e).isValid()}function z(e,t=!1){let n=ge(e);if(!n.isValid()){if(typeof e==`string`)return e;let n=`Failed to normalizeColor ${e}`;if(t)throw Error(n);return console.warn(n),ve}let{r,g:i,b:a,a:o}=_e(n.rgba);return`#${L(r)}${L(i)}${L(a)}${L(T(o*255))}`}var B=B||{};B.parse=(function(){let e={linearGradient:/^(-(webkit|o|ms|moz)-)?(linear-gradient)/i,repeatingLinearGradient:/^(-(webkit|o|ms|moz)-)?(repeating-linear-gradient)/i,radialGradient:/^(-(webkit|o|ms|moz)-)?(radial-gradient)/i,repeatingRadialGradient:/^(-(webkit|o|ms|moz)-)?(repeating-radial-gradient)/i,sideOrCorner:/^to (left (top|bottom)|right (top|bottom)|top (left|right)|bottom (left|right)|left|right|top|bottom)/i,extentKeywords:/^(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/,positionKeywords:/^(left|center|right|top|bottom)/i,pixelValue:/^(-?((\d*\.\d+)|(\d+\.?)))px/,percentageValue:/^(-?((\d*\.\d+)|(\d+\.?)))%/,emValue:/^(-?((\d*\.\d+)|(\d+\.?)))em/,angleValue:/^(-?((\d*\.\d+)|(\d+\.?)))deg/,radianValue:/^(-?((\d*\.\d+)|(\d+\.?)))rad/,startCall:/^\(/,endCall:/^\)/,comma:/^,/,hexColor:/^#([0-9a-f]+)/i,literalColor:/^([a-z]+)/i,rgbColor:/^rgb/i,rgbaColor:/^rgba/i,varColor:/^var/i,calcValue:/^calc/i,variableName:/^(--[a-z0-9-,\s#]+)/i,number:/^((\d*\.\d+)|(\d+\.?))/,hslColor:/^hsl/i,hslaColor:/^hsla/i},t=``;function n(e){let n=Error(`${t}: ${e}`);throw n.source=t,n}function r(){let e=i();return t.length>0&&n(`Invalid input not EOF`),e}function i(){return _(a)}function a(){return o(`linear-gradient`,e.linearGradient,c)||o(`repeating-linear-gradient`,e.repeatingLinearGradient,c)||o(`radial-gradient`,e.radialGradient,d)||o(`repeating-radial-gradient`,e.repeatingRadialGradient,d)}function o(t,r,i){return s(r,r=>{let a=i();return a&&(A(e.comma)||n(`Missing comma before color stops`)),{type:t,orientation:a,colorStops:_(ne)}})}function s(t,r){let i=A(t);if(i){A(e.startCall)||n(`Missing (`);let t=r(i);return A(e.endCall)||n(`Missing )`),t}}function c(){let t=l();if(t)return t;let n=k(`position-keyword`,e.positionKeywords,1);return n?{type:`directional`,value:n.value}:u()}function l(){return k(`directional`,e.sideOrCorner,1)}function u(){return k(`angular`,e.angleValue,1)||k(`angular`,e.radianValue,1)}function d(){let n,r=f(),i;return r&&(n=[],n.push(r),i=t,A(e.comma)&&(r=f(),r?n.push(r):t=i)),n}function f(){let e=p()||ee();if(e)e.at=h();else{let t=m();if(t){e=t;let n=h();n&&(e.at=n)}else{let t=h();if(t)e={type:`default-radial`,at:t};else{let t=g();t&&(e={type:`default-radial`,at:t})}}}return e}function p(){let e=k(`shape`,/^(circle)/i,0);return e&&(e.style=O()||m()),e}function ee(){let e=k(`shape`,/^(ellipse)/i,0);return e&&(e.style=g()||T()||m()),e}function m(){return k(`extent-keyword`,e.extentKeywords,1)}function h(){if(k(`position`,/^at/,0)){let e=g();return e||n(`Missing positioning value`),e}}function g(){let e=te();if(e.x||e.y)return{type:`position`,value:e}}function te(){return{x:T(),y:T()}}function _(t){let r=t(),i=[];if(r)for(i.push(r);A(e.comma);)r=t(),r?i.push(r):n(`One extra comma`);return i}function ne(){let e=v();return e||n(`Expected color definition`),e.length=T(),e}function v(){return re()||C()||S()||x()||b()||ie()||y()}function y(){return k(`literal`,e.literalColor,0)}function re(){return k(`hex`,e.hexColor,1)}function b(){return s(e.rgbColor,()=>({type:`rgb`,value:_(w)}))}function x(){return s(e.rgbaColor,()=>({type:`rgba`,value:_(w)}))}function ie(){return s(e.varColor,()=>({type:`var`,value:ae()}))}function S(){return s(e.hslColor,()=>{A(e.percentageValue)&&n(`HSL hue value must be a number in degrees (0-360) or normalized (-360 to 360), not a percentage`);let t=w();A(e.comma);let r=A(e.percentageValue),i=r?r[1]:null;A(e.comma),r=A(e.percentageValue);let a=r?r[1]:null;return(!i||!a)&&n(`Expected percentage value for saturation and lightness in HSL`),{type:`hsl`,value:[t,i,a]}})}function C(){return s(e.hslaColor,()=>{let t=w();A(e.comma);let r=A(e.percentageValue),i=r?r[1]:null;A(e.comma),r=A(e.percentageValue);let a=r?r[1]:null;A(e.comma);let o=w();return(!i||!a)&&n(`Expected percentage value for saturation and lightness in HSLA`),{type:`hsla`,value:[t,i,a,o]}})}function ae(){return A(e.variableName)[1]}function w(){return A(e.number)[1]}function T(){return k(`%`,e.percentageValue,1)||E()||D()||O()}function E(){return k(`position-keyword`,e.positionKeywords,1)}function D(){return s(e.calcValue,()=>{let e=1,r=0;for(;e>0&&r<t.length;){let n=t.charAt(r);n===`(`?e++:n===`)`&&e--,r++}e>0&&n(`Missing closing parenthesis in calc() expression`);let i=t.substring(0,r-1);return j(r-1),{type:`calc`,value:i}})}function O(){return k(`px`,e.pixelValue,1)||k(`em`,e.emValue,1)}function k(e,t,n){let r=A(t);if(r)return{type:e,value:r[n]}}function A(e){let n,r;return r=/^\s+/.exec(t),r&&j(r[0].length),n=e.exec(t),n&&j(n[0].length),n}function j(e){t=t.substr(e)}return function(e){return t=e.toString().trim(),t.endsWith(`;`)&&(t=t.slice(0,-1)),r()}})();var ye=B.parse.bind(B),V=V||{};V.stringify=(function(){var e={"visit_linear-gradient":function(t){return e.visit_gradient(t)},"visit_repeating-linear-gradient":function(t){return e.visit_gradient(t)},"visit_radial-gradient":function(t){return e.visit_gradient(t)},"visit_repeating-radial-gradient":function(t){return e.visit_gradient(t)},visit_gradient:function(t){var n=e.visit(t.orientation);return n&&(n+=`, `),t.type+`(`+n+e.visit(t.colorStops)+`)`},visit_shape:function(t){var n=t.value,r=e.visit(t.at),i=e.visit(t.style);return i&&(n+=` `+i),r&&(n+=` at `+r),n},"visit_default-radial":function(t){var n=``,r=e.visit(t.at);return r&&(n+=r),n},"visit_extent-keyword":function(t){var n=t.value,r=e.visit(t.at);return r&&(n+=` at `+r),n},"visit_position-keyword":function(e){return e.value},visit_position:function(t){return e.visit(t.value.x)+` `+e.visit(t.value.y)},"visit_%":function(e){return e.value+`%`},visit_em:function(e){return e.value+`em`},visit_px:function(e){return e.value+`px`},visit_calc:function(e){return`calc(`+e.value+`)`},visit_literal:function(t){return e.visit_color(t.value,t)},visit_hex:function(t){return e.visit_color(`#`+t.value,t)},visit_rgb:function(t){return e.visit_color(`rgb(`+t.value.join(`, `)+`)`,t)},visit_rgba:function(t){return e.visit_color(`rgba(`+t.value.join(`, `)+`)`,t)},visit_hsl:function(t){return e.visit_color(`hsl(`+t.value[0]+`, `+t.value[1]+`%, `+t.value[2]+`%)`,t)},visit_hsla:function(t){return e.visit_color(`hsla(`+t.value[0]+`, `+t.value[1]+`%, `+t.value[2]+`%, `+t.value[3]+`)`,t)},visit_var:function(t){return e.visit_color(`var(`+t.value+`)`,t)},visit_color:function(t,n){var r=t,i=e.visit(n.length);return i&&(r+=` `+i),r},visit_angular:function(e){return e.value+`deg`},visit_directional:function(e){return`to `+e.value},visit_array:function(t){var n=``,r=t.length;return t.forEach(function(t,i){n+=e.visit(t),i<r-1&&(n+=`, `)}),n},visit_object:function(t){return t.width&&t.height?e.visit(t.width)+` `+e.visit(t.height):``},visit:function(t){if(!t)return``;if(t instanceof Array)return e.visit_array(t);if(typeof t==`object`&&!t.type)return e.visit_object(t);if(t.type){var n=e[`visit_`+t.type];if(n)return n(t);throw Error(`Missing visitor visit_`+t.type)}else throw Error(`Invalid node.`)}};return function(t){return e.visit(t)}})();var be=V.stringify.bind(V);function xe(e){let t=e.length-1;return e.map((e,n)=>{let r=e.value,i=T(n/t,3),a=`#00000000`;switch(e.type){case`rgb`:a=z({r:Number(r[0]??0),g:Number(r[1]??0),b:Number(r[2]??0)});break;case`rgba`:a=z({r:Number(r[0]??0),g:Number(r[1]??0),b:Number(r[2]??0),a:Number(r[3]??0)});break;case`literal`:a=z(e.value);break;case`hex`:a=z(`#${e.value}`);break}switch(e.length?.type){case`%`:i=Number(e.length.value)/100;break;case`px`:break;case`em`:break}return{offset:i,color:a}})}function Se(e){let t=0;switch(e.orientation?.type){case`angular`:t=Number(e.orientation.value);break;case`directional`:break}return{type:`linear-gradient`,angle:t,stops:xe(e.colorStops)}}function Ce(e){return e.orientation?.map(e=>{switch(e?.type){default:return null}}),{type:`radial-gradient`,stops:xe(e.colorStops)}}function H(e){return e.startsWith(`linear-gradient(`)||e.startsWith(`radial-gradient(`)}function we(e){return ye(e).map(e=>{switch(e?.type){case`linear-gradient`:return Se(e);case`repeating-linear-gradient`:return{...Se(e),repeat:!0};case`radial-gradient`:return Ce(e);case`repeating-radial-gradient`:return{...Ce(e),repeat:!0};default:return}}).filter(Boolean)}var U=[`color`];function Te(e){let t;return t=typeof e==`string`?{color:e}:{...e},t.color&&=z(t.color),O(t,U)}var W=[`linearGradient`,`radialGradient`,`rotateWithShape`];function Ee(e){let t;if(t=typeof e==`string`?{image:e}:{...e},t.image){let{type:e,...n}=we(t.image)[0]??{};switch(e){case`radial-gradient`:return{radialGradient:n};case`linear-gradient`:return{linearGradient:n}}}return O(t,W)}var G=[`image`,`cropRect`,`stretchRect`,`tile`,`dpi`,`opacity`,`rotateWithShape`];function De(e){let t;return t=typeof e==`string`?{image:e}:{...e},O(t,G)}var K=[`preset`,`foregroundColor`,`backgroundColor`];function Oe(e){let t;return t=typeof e==`string`?{preset:e}:{...e},w(t.foregroundColor)?delete t.foregroundColor:t.foregroundColor=z(t.foregroundColor),w(t.backgroundColor)?delete t.backgroundColor:t.backgroundColor=z(t.backgroundColor),O(t,K)}function ke(e){return!w(e.color)}function Ae(e){return typeof e==`string`?R(e):ke(e)}function je(e){return!w(e.image)&&H(e.image)||!!e.linearGradient||!!e.radialGradient}function Me(e){return typeof e==`string`?H(e):je(e)}function Ne(e){return!w(e.image)&&!H(e.image)}function Pe(e){return typeof e==`string`?!R(e)&&!H(e):Ne(e)}function Fe(e){return!w(e.preset)}function Ie(e){return typeof e==`string`?!1:Fe(e)}function q(e){let t={enabled:e&&typeof e==`object`?e.enabled??!0:!0};return Ae(e)&&Object.assign(t,Te(e)),Me(e)&&Object.assign(t,Ee(e)),Pe(e)&&Object.assign(t,De(e)),Ie(e)&&Object.assign(t,Oe(e)),O(D(t),Array.from(new Set([`enabled`,...U,...G,...W,...K])))}function J(e){return typeof e==`string`?{...q(e)}:{...q(e),...O(e,[`fillWithShape`])}}function Le(){return{backgroundImage:`none`,backgroundSize:`auto, auto`,backgroundColor:`none`,backgroundColormap:`none`}}function Re(e){return(e??[]).map(e=>E(e)??0)}function ze(e){return D({name:e.name,values:Re(e.values),xValues:e.xValues?Re(e.xValues):void 0,color:e.color})}function Be(e){return D({title:e.title,min:E(e.min),max:E(e.max),visible:e.visible})}function Ve(e){return D({enabled:e.enabled??!0,type:e.type??`column`,grouping:e.grouping,categories:e.categories??[],series:(e.series??[]).map(ze),title:e.title,legend:e.legend,categoryAxis:e.categoryAxis?Be(e.categoryAxis):void 0,valueAxis:e.valueAxis?Be(e.valueAxis):void 0})}function He(e){return D({start:e.start,end:e.end,mode:e.mode??`straight`})}function Y(e){return typeof e==`string`?{...q(e)}:{...q(e),...O(e,[`width`,`style`,`lineCap`,`lineJoin`,`headEnd`,`tailEnd`])}}function Ue(){return{outlineWidth:0,outlineOffset:0,outlineColor:`none`,outlineStyle:`none`}}function We(e){return typeof e==`string`?{enabled:!0,color:z(e)}:{...e,enabled:e.enabled??!0,color:w(e.color)?ve:z(e.color)}}function Ge(){return{boxShadow:`none`}}function Ke(e){return D({blur:e.blur,brightness:e.brightness,contrast:e.contrast,grayscale:e.grayscale,hueRotate:e.hueRotate,invert:e.invert,opacity:e.opacity,saturate:e.saturate,sepia:e.sepia,duotone:e.duotone?[z(e.duotone[0]),z(e.duotone[1])]:void 0,biLevel:e.biLevel,colorChange:e.colorChange?{from:z(e.colorChange.from),to:z(e.colorChange.to)}:void 0})}function qe(e){let t=[];return e.blur!==void 0&&t.push(`blur(${e.blur}px)`),e.brightness!==void 0&&t.push(`brightness(${e.brightness})`),e.contrast!==void 0&&t.push(`contrast(${e.contrast})`),e.grayscale!==void 0&&t.push(`grayscale(${e.grayscale})`),e.hueRotate!==void 0&&t.push(`hue-rotate(${e.hueRotate}deg)`),e.invert!==void 0&&t.push(`invert(${e.invert})`),e.opacity!==void 0&&t.push(`opacity(${e.opacity})`),e.saturate!==void 0&&t.push(`saturate(${e.saturate})`),e.sepia!==void 0&&t.push(`sepia(${e.sepia})`),t.join(` `)}var Je=[`fill`,`outline`,`shadow`,`transform`,`transformOrigin`,`filter`];function Ye(e){let t=O(e,Je),{rotate:n,scaleX:r,scaleY:i,skewX:a,skewY:o,translateX:s,translateY:c}=e,l=[];return(s||c)&&l.push(`translate(${s||0}, ${c||0})`),n&&l.push(`rotate(${n}deg)`),(r||i)&&l.push(`scale(${r??1}, ${i??1})`),a&&l.push(`skewX(${a}deg)`),o&&l.push(`skewY(${o}deg)`),l.length>0&&(t.transform=l.join(` `)),(e.textStrokeWidth||e.textStrokeColor)&&(t.outline={color:e.textStrokeColor,width:e.textStrokeWidth}),e.color&&(t.fill={color:e.color}),(e.shadowOffsetX||e.shadowOffsetY||e.shadowBlur||e.shadowColor)&&(t.shadow={offsetX:e.shadowOffsetX,offsetY:e.shadowOffsetY,blur:e.shadowBlur,color:e.shadowColor}),t}function X(e){let t=Ye(e);return D({fill:w(t.fill)?void 0:q(t.fill),outline:w(t.outline)?void 0:Y(t.outline),shadow:w(t.shadow)?void 0:We(t.shadow),transform:w(t.transform)?void 0:t.transform,transformOrigin:t.transformOrigin,filter:t.filter?Ke(t.filter):void 0})}function Xe(e){return typeof e==`string`?{...q(e)}:D({...q(e),...O(e,[`fillWithShape`]),effects:e.effects?.map(X)})}var Ze=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`,Qe=(e=21)=>{let t=``,n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+=Ze[n[e]&63];return t},$e=()=>Qe(10),et=$e;function tt(e){return typeof e==`string`?e.startsWith(`<svg`)?{enabled:!0,svg:e}:{enabled:!0,paths:[{data:e}]}:Array.isArray(e)?{enabled:!0,paths:e.map(e=>typeof e==`string`?{data:e}:e)}:e}function nt(){return{overflow:`visible`,direction:void 0,display:void 0,boxSizing:void 0,width:void 0,height:void 0,maxHeight:void 0,maxWidth:void 0,minHeight:void 0,minWidth:void 0,position:void 0,left:0,top:0,right:void 0,bottom:void 0,borderTop:void 0,borderLeft:void 0,borderRight:void 0,borderBottom:void 0,borderWidth:0,border:void 0,flex:void 0,flexBasis:void 0,flexDirection:void 0,flexGrow:void 0,flexShrink:void 0,flexWrap:void 0,justifyContent:void 0,gap:void 0,alignContent:void 0,alignItems:void 0,alignSelf:void 0,marginTop:void 0,marginLeft:void 0,marginRight:void 0,marginBottom:void 0,margin:void 0,paddingTop:void 0,paddingLeft:void 0,paddingRight:void 0,paddingBottom:void 0,padding:void 0}}function rt(){return{rotate:0,scaleX:1,scaleY:1,skewX:0,skewY:0,translateX:0,translateY:0,transform:`none`,transformOrigin:`center`}}function it(){return{...nt(),...rt(),...Ge(),...Le(),...Ue(),borderRadius:0,borderColor:`none`,borderStyle:`solid`,visibility:`visible`,filter:`none`,opacity:1,pointerEvents:`auto`,maskImage:`none`}}function at(){return{highlight:{},highlightImage:`none`,highlightReferImage:`none`,highlightColormap:`none`,highlightLine:`none`,highlightSize:`cover`,highlightThickness:`100%`}}function ot(){return{listStyle:{},listStyleType:`none`,listStyleImage:`none`,listStyleColormap:`none`,listStyleSize:`cover`,listStylePosition:`outside`}}function st(){return{...at(),color:`#000000`,verticalAlign:`baseline`,letterSpacing:0,wordSpacing:0,fontSize:14,fontWeight:`normal`,fontFamily:``,fontStyle:`normal`,fontKerning:`normal`,textTransform:`none`,textOrientation:`mixed`,textDecoration:`none`}}function ct(){return{...ot(),writingMode:`horizontal-tb`,textWrap:`wrap`,textAlign:`start`,textIndent:0,lineHeight:1.2}}function lt(){return{...ct(),...st(),textStrokeWidth:0,textStrokeColor:`none`}}var ut=[`textIndent`,`lineHeight`,`letterSpacing`,`wordSpacing`,`fontSize`,`textStrokeWidth`,`borderRadius`,`opacity`,`rotate`,`scaleX`,`scaleY`,`skewX`,`skewY`,`translateX`,`translateY`,`borderWidth`,`flex`,`flexGrow`,`flexShrink`];function Z(e){let t=D({...e,color:w(e.color)?void 0:z(e.color),backgroundColor:w(e.backgroundColor)?void 0:z(e.backgroundColor),borderColor:w(e.borderColor)?void 0:z(e.borderColor),outlineColor:w(e.outlineColor)?void 0:z(e.outlineColor),shadowColor:w(e.shadowColor)?void 0:z(e.shadowColor),textStrokeColor:w(e.textStrokeColor)?void 0:z(e.textStrokeColor)});for(let e of ut)if(e in t){let n=E(t[e]);n===void 0?delete t[e]:t[e]=n}return t}function dt(){return{...it(),...lt()}}function ft(e){return D({width:E(e.width)})}function pt(e){return D({height:E(e.height)})}function mt(e){return D({row:E(e.row)??0,col:E(e.col)??0,rowSpan:E(e.rowSpan),colSpan:E(e.colSpan),children:(e.children??[]).map(e=>$(e)),background:w(e.background)?void 0:J(e.background),style:w(e.style)?void 0:Z(e.style)})}function ht(e){return D({enabled:e.enabled??!0,columns:(e.columns??[]).map(ft),rows:(e.rows??[]).map(pt),cells:(e.cells??[]).map(mt)})}var gt=/\r\n|\n\r|\n|\r/,_t=RegExp(`${gt.source}|<br\\/>`,`g`),vt=RegExp(`^(${gt.source})$`),yt=`
2
+ `;function bt(e){return gt.test(e)}function xt(e){return vt.test(e)}function St(e){return e.replace(_t,yt)}function Q(e){let t=[];function n(){return t[t.length-1]}function r(e,n,r){let i=e?Z(e):{},a=n?q(n):void 0,o=r?Y(r):void 0,s=D({...i,fill:a,outline:o,fragments:[]});return t[t.length-1]?.fragments.length===0?t[t.length-1]=s:t.push(s),s}function i(e=``,t,i,a){let o=t?Z(t):{},s=i?q(i):void 0,c=a?Y(a):void 0;Array.from(e).forEach(e=>{if(xt(e)){let{fragments:e,fill:t,outline:i,...a}=n()||r();e.length||e.push(D({...o,fill:s,outline:c,content:yt})),r(a,t,i)}else{let t=n()||r(),i=t.fragments[t.fragments.length-1];if(i){let{content:t,fill:n,outline:r,...a}=i;if(k(s,n)&&k(c,r)&&k(o,a)){i.content=`${t}${e}`;return}}t.fragments.push(D({...o,fill:s,outline:c,content:e}))}})}(Array.isArray(e)?e:[e]).forEach(e=>{if(typeof e==`string`)r(),i(e);else if(wt(e)){let{content:t,fill:n,outline:a,...o}=e;r(o,n,a),i(t)}else if(Ct(e)){let{fragments:t,fill:n,outline:a,...o}=e;r(o,n,a),t.forEach(e=>{let{content:t,fill:n,outline:r,...a}=e;i(t,a,n,r)})}else Array.isArray(e)?(r(),e.forEach(e=>{if(typeof e==`string`)i(e);else if(wt(e)){let{content:t,fill:n,outline:r,...a}=e;i(t,a,n,r)}})):console.warn(`Failed to parse text content`,e)});let a=n();return a&&!a.fragments.length&&a.fragments.push({content:``}),t}function Ct(e){return e&&typeof e==`object`&&`fragments`in e&&Array.isArray(e.fragments)}function wt(e){return e&&typeof e==`object`&&`content`in e&&typeof e.content==`string`}function Tt(e){return D({type:e.type,intensities:e.intensities,maxFontSize:e.maxFontSize??100})}function Et(e){return typeof e==`string`||Array.isArray(e)?{enabled:!0,content:Q(e)}:D({enabled:e.enabled??!0,content:Q(e.content??``),style:e.style?Z(e.style):void 0,deformation:e.deformation?Tt(e.deformation):void 0,measureDom:e.measureDom,fonts:e.fonts,...X(e),effects:e.effects?e.effects.map(e=>X(e)):void 0})}function Dt(e){return Q(e).map(e=>{let t=St(e.fragments.flatMap(e=>e.content).join(``));return xt(t)?``:t}).join(yt)}function Ot(e){return typeof e==`string`?{src:e}:e}function $(e){return D({id:e.id??et(),style:w(e.style)?void 0:Z(e.style),text:w(e.text)?void 0:Et(e.text),background:w(e.background)?void 0:J(e.background),shape:w(e.shape)?void 0:tt(e.shape),foreground:w(e.foreground)?void 0:Xe(e.foreground),video:w(e.video)?void 0:Ot(e.video),audio:w(e.audio)?void 0:t(e.audio),connection:w(e.connection)?void 0:He(e.connection),table:w(e.table)?void 0:ht(e.table),chart:w(e.chart)?void 0:Ve(e.chart),...X(e),children:e.children?.map(e=>$(e))})}function kt(e){return $(e)}function At(e){let t={};for(let n in e.children){let r=$(e.children[n]);delete r.children,t[n]=r}return{...e,children:t}}function jt(e){let{children:t,...n}=e;function r(e){let{parentId:t,childrenIds:n,...r}=e;return{...r,children:[]}}let i={},a=[],o={...n,children:a};function s(e){if(!t[e]||i[e])return;let n=t[e],o=r(n);i[e]=o;let c=n.parentId;if(c){s(c);let n=t[c],r=i[c];if(!r)return;n?.childrenIds&&r?.children&&(r.children[n.childrenIds.indexOf(e)]=o)}else a.push(o)}for(let e in t)s(e);return o}e.EventEmitter=ae,e.Observable=ce,e.RawWeakMap=le,e.Reactivable=he,e.clearUndef=D,e.colorFillFields=U,e.defaultColor=ve,e.defineProperty=fe,e.effectFields=Je,e.flatDocumentToDocument=jt,e.getDeclarations=N,e.getDefaultBackgroundStyle=Le,e.getDefaultElementStyle=it,e.getDefaultHighlightStyle=at,e.getDefaultLayoutStyle=nt,e.getDefaultListStyleStyle=ot,e.getDefaultOutlineStyle=Ue,e.getDefaultShadowStyle=Ge,e.getDefaultStyle=dt,e.getDefaultTextInlineStyle=st,e.getDefaultTextLineStyle=ct,e.getDefaultTextStyle=lt,e.getDefaultTransformStyle=rt,e.getNestedValue=A,e.getObjectValueByPath=oe,e.getPropertyDescriptor=de,e.gradientFillFields=W,e.hasCRLF=bt,e.idGenerator=et,e.imageFillFiedls=G,e.isCRLF=xt,e.isColor=R,e.isColorFill=Ae,e.isColorFillObject=ke,e.isEqualObject=k,e.isFragmentObject=wt,e.isGradient=H,e.isGradientFill=Me,e.isGradientFillObject=je,e.isImageFill=Pe,e.isImageFillObject=Ne,e.isNone=w,e.isParagraphObject=Ct,e.isPresetFill=Ie,e.isPresetFillObject=Fe,e.nanoid=$e,e.normalizeAudio=t,e.normalizeBackground=J,e.normalizeCRLF=St,e.normalizeChart=Ve,e.normalizeColor=z,e.normalizeColorFill=Te,e.normalizeConnection=He,e.normalizeDocument=kt,e.normalizeEffect=X,e.normalizeElement=$,e.normalizeFill=q,e.normalizeFilter=Ke,e.normalizeFlatDocument=At,e.normalizeForeground=Xe,e.normalizeGradient=we,e.normalizeGradientFill=Ee,e.normalizeImageFill=De,e.normalizeNumber=E,e.normalizeOutline=Y,e.normalizePresetFill=Oe,e.normalizeShadow=We,e.normalizeShape=tt,e.normalizeStyle=Z,e.normalizeTable=ht,e.normalizeText=Et,e.normalizeTextContent=Q,e.normalizeTextDeformation=Tt,e.normalizeVideo=Ot,e.parseColor=ge,e.parseGradient=ye,e.pick=O,e.presetFillFiedls=K,e.property=pe,e.property2=me,e.propertyOffsetFallback=I,e.propertyOffsetGet=F,e.propertyOffsetSet=P,e.round=T,e.setNestedValue=j,e.setObjectValueByPath=se,e.stringifyFilter=qe,e.stringifyGradient=be,e.textContentToString=Dt});
package/dist/index.mjs CHANGED
@@ -1441,6 +1441,39 @@ function getDefaultBackgroundStyle() {
1441
1441
  };
1442
1442
  }
1443
1443
 
1444
+ function normalizeValues(values) {
1445
+ return (values ?? []).map((v) => normalizeNumber(v) ?? 0);
1446
+ }
1447
+ function normalizeChartSeries(series) {
1448
+ return clearUndef({
1449
+ name: series.name,
1450
+ values: normalizeValues(series.values),
1451
+ xValues: series.xValues ? normalizeValues(series.xValues) : void 0,
1452
+ color: series.color
1453
+ });
1454
+ }
1455
+ function normalizeChartAxis(axis) {
1456
+ return clearUndef({
1457
+ title: axis.title,
1458
+ min: normalizeNumber(axis.min),
1459
+ max: normalizeNumber(axis.max),
1460
+ visible: axis.visible
1461
+ });
1462
+ }
1463
+ function normalizeChart(chart) {
1464
+ return clearUndef({
1465
+ enabled: chart.enabled ?? true,
1466
+ type: chart.type ?? "column",
1467
+ grouping: chart.grouping,
1468
+ categories: chart.categories ?? [],
1469
+ series: (chart.series ?? []).map(normalizeChartSeries),
1470
+ title: chart.title,
1471
+ legend: chart.legend,
1472
+ categoryAxis: chart.categoryAxis ? normalizeChartAxis(chart.categoryAxis) : void 0,
1473
+ valueAxis: chart.valueAxis ? normalizeChartAxis(chart.valueAxis) : void 0
1474
+ });
1475
+ }
1476
+
1444
1477
  function normalizeConnection(connection) {
1445
1478
  return clearUndef({
1446
1479
  start: connection.start,
@@ -1492,12 +1525,51 @@ function getDefaultShadowStyle() {
1492
1525
  };
1493
1526
  }
1494
1527
 
1528
+ function normalizeFilter(filter) {
1529
+ return clearUndef({
1530
+ blur: filter.blur,
1531
+ brightness: filter.brightness,
1532
+ contrast: filter.contrast,
1533
+ grayscale: filter.grayscale,
1534
+ hueRotate: filter.hueRotate,
1535
+ invert: filter.invert,
1536
+ opacity: filter.opacity,
1537
+ saturate: filter.saturate,
1538
+ sepia: filter.sepia,
1539
+ duotone: filter.duotone ? [normalizeColor(filter.duotone[0]), normalizeColor(filter.duotone[1])] : void 0,
1540
+ biLevel: filter.biLevel,
1541
+ colorChange: filter.colorChange ? { from: normalizeColor(filter.colorChange.from), to: normalizeColor(filter.colorChange.to) } : void 0
1542
+ });
1543
+ }
1544
+ function stringifyFilter(filter) {
1545
+ const parts = [];
1546
+ if (filter.blur !== void 0)
1547
+ parts.push(`blur(${filter.blur}px)`);
1548
+ if (filter.brightness !== void 0)
1549
+ parts.push(`brightness(${filter.brightness})`);
1550
+ if (filter.contrast !== void 0)
1551
+ parts.push(`contrast(${filter.contrast})`);
1552
+ if (filter.grayscale !== void 0)
1553
+ parts.push(`grayscale(${filter.grayscale})`);
1554
+ if (filter.hueRotate !== void 0)
1555
+ parts.push(`hue-rotate(${filter.hueRotate}deg)`);
1556
+ if (filter.invert !== void 0)
1557
+ parts.push(`invert(${filter.invert})`);
1558
+ if (filter.opacity !== void 0)
1559
+ parts.push(`opacity(${filter.opacity})`);
1560
+ if (filter.saturate !== void 0)
1561
+ parts.push(`saturate(${filter.saturate})`);
1562
+ if (filter.sepia !== void 0)
1563
+ parts.push(`sepia(${filter.sepia})`);
1564
+ return parts.join(" ");
1565
+ }
1495
1566
  const effectFields = [
1496
1567
  "fill",
1497
1568
  "outline",
1498
1569
  "shadow",
1499
1570
  "transform",
1500
- "transformOrigin"
1571
+ "transformOrigin",
1572
+ "filter"
1501
1573
  ];
1502
1574
  function normalizeEffectV0(effect) {
1503
1575
  const _effect = pick(effect, effectFields);
@@ -1539,7 +1611,8 @@ function normalizeEffect(effect) {
1539
1611
  outline: isNone(_effect.outline) ? void 0 : normalizeOutline(_effect.outline),
1540
1612
  shadow: isNone(_effect.shadow) ? void 0 : normalizeShadow(_effect.shadow),
1541
1613
  transform: isNone(_effect.transform) ? void 0 : _effect.transform,
1542
- transformOrigin: _effect.transformOrigin
1614
+ transformOrigin: _effect.transformOrigin,
1615
+ filter: _effect.filter ? normalizeFilter(_effect.filter) : void 0
1543
1616
  });
1544
1617
  }
1545
1618
 
@@ -1549,10 +1622,11 @@ function normalizeForeground(foreground) {
1549
1622
  ...normalizeFill(foreground)
1550
1623
  };
1551
1624
  } else {
1552
- return {
1625
+ return clearUndef({
1553
1626
  ...normalizeFill(foreground),
1554
- ...pick(foreground, ["fillWithShape"])
1555
- };
1627
+ ...pick(foreground, ["fillWithShape"]),
1628
+ effects: foreground.effects?.map(normalizeEffect)
1629
+ });
1556
1630
  }
1557
1631
  }
1558
1632
 
@@ -2002,6 +2076,7 @@ function normalizeElement(element) {
2002
2076
  audio: isNone(element.audio) ? void 0 : normalizeAudio(element.audio),
2003
2077
  connection: isNone(element.connection) ? void 0 : normalizeConnection(element.connection),
2004
2078
  table: isNone(element.table) ? void 0 : normalizeTable(element.table),
2079
+ chart: isNone(element.chart) ? void 0 : normalizeChart(element.chart),
2005
2080
  ...normalizeEffect(element),
2006
2081
  children: element.children?.map((child) => normalizeElement(child))
2007
2082
  });
@@ -2063,4 +2138,4 @@ function flatDocumentToDocument(flatDoc) {
2063
2138
  return doc;
2064
2139
  }
2065
2140
 
2066
- export { EventEmitter, Observable, RawWeakMap, Reactivable, clearUndef, colorFillFields, defaultColor, defineProperty, effectFields, flatDocumentToDocument, getDeclarations, getDefaultBackgroundStyle, getDefaultElementStyle, getDefaultHighlightStyle, getDefaultLayoutStyle, getDefaultListStyleStyle, getDefaultOutlineStyle, getDefaultShadowStyle, getDefaultStyle, getDefaultTextInlineStyle, getDefaultTextLineStyle, getDefaultTextStyle, getDefaultTransformStyle, getNestedValue, getObjectValueByPath, getPropertyDescriptor, gradientFillFields, hasCRLF, idGenerator, imageFillFiedls, isCRLF, isColor, isColorFill, isColorFillObject, isEqualObject, isFragmentObject, isGradient, isGradientFill, isGradientFillObject, isImageFill, isImageFillObject, isNone, isParagraphObject, isPresetFill, isPresetFillObject, nanoid, normalizeAudio, normalizeBackground, normalizeCRLF, normalizeColor, normalizeColorFill, normalizeConnection, normalizeDocument, normalizeEffect, normalizeElement, normalizeFill, normalizeFlatDocument, normalizeForeground, normalizeGradient, normalizeGradientFill, normalizeImageFill, normalizeNumber, normalizeOutline, normalizePresetFill, normalizeShadow, normalizeShape, normalizeStyle, normalizeTable, normalizeText, normalizeTextContent, normalizeTextDeformation, normalizeVideo, parseColor, parseGradient, pick, presetFillFiedls, property, property2, propertyOffsetFallback, propertyOffsetGet, propertyOffsetSet, round, setNestedValue, setObjectValueByPath, stringifyGradient, textContentToString };
2141
+ export { EventEmitter, Observable, RawWeakMap, Reactivable, clearUndef, colorFillFields, defaultColor, defineProperty, effectFields, flatDocumentToDocument, getDeclarations, getDefaultBackgroundStyle, getDefaultElementStyle, getDefaultHighlightStyle, getDefaultLayoutStyle, getDefaultListStyleStyle, getDefaultOutlineStyle, getDefaultShadowStyle, getDefaultStyle, getDefaultTextInlineStyle, getDefaultTextLineStyle, getDefaultTextStyle, getDefaultTransformStyle, getNestedValue, getObjectValueByPath, getPropertyDescriptor, gradientFillFields, hasCRLF, idGenerator, imageFillFiedls, isCRLF, isColor, isColorFill, isColorFillObject, isEqualObject, isFragmentObject, isGradient, isGradientFill, isGradientFillObject, isImageFill, isImageFillObject, isNone, isParagraphObject, isPresetFill, isPresetFillObject, nanoid, normalizeAudio, normalizeBackground, normalizeCRLF, normalizeChart, normalizeColor, normalizeColorFill, normalizeConnection, normalizeDocument, normalizeEffect, normalizeElement, normalizeFill, normalizeFilter, normalizeFlatDocument, normalizeForeground, normalizeGradient, normalizeGradientFill, normalizeImageFill, normalizeNumber, normalizeOutline, normalizePresetFill, normalizeShadow, normalizeShape, normalizeStyle, normalizeTable, normalizeText, normalizeTextContent, normalizeTextDeformation, normalizeVideo, parseColor, parseGradient, pick, presetFillFiedls, property, property2, propertyOffsetFallback, propertyOffsetGet, propertyOffsetSet, round, setNestedValue, setObjectValueByPath, stringifyFilter, stringifyGradient, textContentToString };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "modern-idoc",
3
3
  "type": "module",
4
- "version": "0.11.7",
4
+ "version": "0.11.9",
5
5
  "packageManager": "pnpm@10.18.1",
6
6
  "description": "Intermediate document for modern codec libs",
7
7
  "author": "wxm",