@open-mercato/ui 0.6.1-develop.3256.1.fe3dec2464 → 0.6.1-develop.3260.1.dc719cac84

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.
Files changed (137) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/backend/CrudForm.js +46 -129
  3. package/dist/backend/CrudForm.js.map +3 -3
  4. package/dist/backend/DataTable.js +10 -3
  5. package/dist/backend/DataTable.js.map +2 -2
  6. package/dist/backend/EmptyState.js +1 -47
  7. package/dist/backend/EmptyState.js.map +2 -2
  8. package/dist/backend/FilterOverlay.js +31 -26
  9. package/dist/backend/FilterOverlay.js.map +2 -2
  10. package/dist/backend/FlashMessages.js +23 -25
  11. package/dist/backend/FlashMessages.js.map +2 -2
  12. package/dist/backend/JsonBuilder.js +4 -2
  13. package/dist/backend/JsonBuilder.js.map +2 -2
  14. package/dist/backend/LogList.js +49 -0
  15. package/dist/backend/LogList.js.map +7 -0
  16. package/dist/backend/crud/CollapsibleGroup.js +13 -3
  17. package/dist/backend/crud/CollapsibleGroup.js.map +2 -2
  18. package/dist/backend/detail/InlineEditors.js +80 -32
  19. package/dist/backend/detail/InlineEditors.js.map +2 -2
  20. package/dist/backend/inputs/ComboboxInput.js +60 -6
  21. package/dist/backend/inputs/ComboboxInput.js.map +2 -2
  22. package/dist/backend/inputs/DatePicker.js +6 -142
  23. package/dist/backend/inputs/DatePicker.js.map +2 -2
  24. package/dist/backend/inputs/DateTimePicker.js +6 -182
  25. package/dist/backend/inputs/DateTimePicker.js.map +2 -2
  26. package/dist/backend/inputs/TagsInput.js +16 -19
  27. package/dist/backend/inputs/TagsInput.js.map +2 -2
  28. package/dist/backend/inputs/TimeInput.js +1 -1
  29. package/dist/backend/inputs/TimeInput.js.map +2 -2
  30. package/dist/backend/inputs/TimePicker.js +83 -72
  31. package/dist/backend/inputs/TimePicker.js.map +2 -2
  32. package/dist/backend/utils/customFieldForms.js +2 -2
  33. package/dist/backend/utils/customFieldForms.js.map +1 -1
  34. package/dist/portal/components/PortalEmptyState.js +13 -9
  35. package/dist/portal/components/PortalEmptyState.js.map +2 -2
  36. package/dist/primitives/accordion.js +137 -0
  37. package/dist/primitives/accordion.js.map +7 -0
  38. package/dist/primitives/alert.js +180 -12
  39. package/dist/primitives/alert.js.map +2 -2
  40. package/dist/primitives/calendar.js +122 -32
  41. package/dist/primitives/calendar.js.map +2 -2
  42. package/dist/primitives/compact-select.js +47 -0
  43. package/dist/primitives/compact-select.js.map +7 -0
  44. package/dist/primitives/counter-input.js +174 -0
  45. package/dist/primitives/counter-input.js.map +7 -0
  46. package/dist/primitives/date-picker-helpers.js +79 -0
  47. package/dist/primitives/date-picker-helpers.js.map +7 -0
  48. package/dist/primitives/date-picker.js +216 -0
  49. package/dist/primitives/date-picker.js.map +7 -0
  50. package/dist/primitives/date-range-picker.js +239 -0
  51. package/dist/primitives/date-range-picker.js.map +7 -0
  52. package/dist/primitives/digit-input.js +157 -0
  53. package/dist/primitives/digit-input.js.map +7 -0
  54. package/dist/primitives/empty-state.js +93 -0
  55. package/dist/primitives/empty-state.js.map +7 -0
  56. package/dist/primitives/inline-input.js +29 -0
  57. package/dist/primitives/inline-input.js.map +7 -0
  58. package/dist/primitives/inline-select.js +41 -0
  59. package/dist/primitives/inline-select.js.map +7 -0
  60. package/dist/primitives/notification-stack.js +116 -0
  61. package/dist/primitives/notification-stack.js.map +7 -0
  62. package/dist/primitives/notification.js +62 -0
  63. package/dist/primitives/notification.js.map +7 -0
  64. package/dist/primitives/rich-editor.js +1230 -0
  65. package/dist/primitives/rich-editor.js.map +7 -0
  66. package/dist/primitives/select.js +1 -0
  67. package/dist/primitives/select.js.map +2 -2
  68. package/dist/primitives/skeleton.js +55 -0
  69. package/dist/primitives/skeleton.js.map +7 -0
  70. package/dist/primitives/tag-input.js +186 -0
  71. package/dist/primitives/tag-input.js.map +7 -0
  72. package/dist/primitives/tag.js +66 -13
  73. package/dist/primitives/tag.js.map +2 -2
  74. package/dist/primitives/time-picker.js +793 -0
  75. package/dist/primitives/time-picker.js.map +7 -0
  76. package/package.json +4 -3
  77. package/src/backend/CrudForm.tsx +61 -113
  78. package/src/backend/DataTable.tsx +17 -5
  79. package/src/backend/EmptyState.tsx +13 -63
  80. package/src/backend/FilterOverlay.tsx +38 -22
  81. package/src/backend/FlashMessages.tsx +23 -24
  82. package/src/backend/JsonBuilder.tsx +4 -2
  83. package/src/backend/LogList.tsx +109 -0
  84. package/src/backend/__tests__/CrudForm.datetime.test.tsx +12 -7
  85. package/src/backend/__tests__/FilterOverlay.dateRange.test.tsx +89 -0
  86. package/src/backend/__tests__/LogList.test.tsx +163 -0
  87. package/src/backend/crud/CollapsibleGroup.tsx +17 -3
  88. package/src/backend/detail/InlineEditors.tsx +78 -25
  89. package/src/backend/detail/__tests__/InlineEditors.test.tsx +81 -1
  90. package/src/backend/inputs/ComboboxInput.tsx +81 -9
  91. package/src/backend/inputs/DatePicker.tsx +28 -155
  92. package/src/backend/inputs/DateTimePicker.tsx +25 -193
  93. package/src/backend/inputs/TagsInput.tsx +10 -13
  94. package/src/backend/inputs/TimeInput.tsx +2 -1
  95. package/src/backend/inputs/TimePicker.tsx +99 -70
  96. package/src/backend/inputs/__tests__/ComboboxInput.test.tsx +133 -0
  97. package/src/backend/inputs/__tests__/TimePicker.test.tsx +2 -2
  98. package/src/backend/utils/__tests__/richTextSanitizer.test.ts +5 -2
  99. package/src/backend/utils/customFieldForms.ts +2 -2
  100. package/src/portal/components/PortalEmptyState.tsx +27 -22
  101. package/src/primitives/__tests__/accordion.test.tsx +197 -0
  102. package/src/primitives/__tests__/alert.test.tsx +204 -0
  103. package/src/primitives/__tests__/compact-select.test.tsx +98 -0
  104. package/src/primitives/__tests__/counter-input.test.tsx +165 -0
  105. package/src/primitives/__tests__/date-picker.test.tsx +221 -0
  106. package/src/primitives/__tests__/date-range-picker.test.tsx +173 -0
  107. package/src/primitives/__tests__/digit-input.test.tsx +168 -0
  108. package/src/primitives/__tests__/empty-state.test.tsx +154 -0
  109. package/src/primitives/__tests__/inline-input.test.tsx +100 -0
  110. package/src/primitives/__tests__/inline-select.test.tsx +103 -0
  111. package/src/primitives/__tests__/notification-stack.test.tsx +174 -0
  112. package/src/primitives/__tests__/notification.test.tsx +119 -0
  113. package/src/primitives/__tests__/rich-editor.test.tsx +411 -0
  114. package/src/primitives/__tests__/skeleton.test.tsx +76 -0
  115. package/src/primitives/__tests__/tag-input.test.tsx +198 -0
  116. package/src/primitives/__tests__/tag.test.tsx +123 -0
  117. package/src/primitives/__tests__/time-picker.test.tsx +392 -0
  118. package/src/primitives/accordion.tsx +225 -0
  119. package/src/primitives/alert.tsx +234 -24
  120. package/src/primitives/calendar.tsx +146 -38
  121. package/src/primitives/compact-select.tsx +59 -0
  122. package/src/primitives/counter-input.tsx +211 -0
  123. package/src/primitives/date-picker-helpers.ts +96 -0
  124. package/src/primitives/date-picker.tsx +290 -0
  125. package/src/primitives/date-range-picker.tsx +281 -0
  126. package/src/primitives/digit-input.tsx +208 -0
  127. package/src/primitives/empty-state.tsx +140 -0
  128. package/src/primitives/inline-input.tsx +55 -0
  129. package/src/primitives/inline-select.tsx +74 -0
  130. package/src/primitives/notification-stack.tsx +185 -0
  131. package/src/primitives/notification.tsx +136 -0
  132. package/src/primitives/rich-editor.tsx +1578 -0
  133. package/src/primitives/select.tsx +1 -0
  134. package/src/primitives/skeleton.tsx +70 -0
  135. package/src/primitives/tag-input.tsx +223 -0
  136. package/src/primitives/tag.tsx +69 -10
  137. package/src/primitives/time-picker.tsx +1059 -0
@@ -1,8 +1,9 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { X } from "lucide-react";
2
3
  import { cva } from "class-variance-authority";
3
4
  import { cn } from "@open-mercato/shared/lib/utils";
4
5
  const tagVariants = cva(
5
- "inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium",
6
+ "inline-flex items-center gap-1.5 border text-xs font-medium",
6
7
  {
7
8
  variants: {
8
9
  variant: {
@@ -13,9 +14,13 @@ const tagVariants = cva(
13
14
  info: "border-status-info-border bg-status-info-bg text-status-info-text",
14
15
  neutral: "border-status-neutral-border bg-status-neutral-bg text-status-neutral-text",
15
16
  brand: "border-brand-violet/30 bg-brand-violet/10 text-brand-violet"
17
+ },
18
+ shape: {
19
+ pill: "rounded-full px-2.5 py-0.5",
20
+ square: "rounded-md px-2 py-1"
16
21
  }
17
22
  },
18
- defaultVariants: { variant: "default" }
23
+ defaultVariants: { variant: "default", shape: "pill" }
19
24
  }
20
25
  );
21
26
  const dotColorMap = {
@@ -27,17 +32,65 @@ const dotColorMap = {
27
32
  neutral: "bg-status-neutral-icon",
28
33
  brand: "bg-brand-violet"
29
34
  };
30
- function Tag({ className, variant = "default", dot = false, children, ...props }) {
31
- return /* @__PURE__ */ jsxs("span", { className: cn(tagVariants({ variant }), className), ...props, children: [
32
- dot && /* @__PURE__ */ jsx(
33
- "span",
34
- {
35
- className: cn("inline-block size-1.5 rounded-full shrink-0", dotColorMap[variant]),
36
- "aria-hidden": "true"
37
- }
38
- ),
39
- children
40
- ] });
35
+ function Tag({
36
+ className,
37
+ variant = "default",
38
+ shape = "pill",
39
+ dot = false,
40
+ onRemove,
41
+ removeAriaLabel = "Remove",
42
+ disabled = false,
43
+ children,
44
+ ...props
45
+ }) {
46
+ return /* @__PURE__ */ jsxs(
47
+ "span",
48
+ {
49
+ className: cn(
50
+ tagVariants({ variant, shape }),
51
+ disabled && "opacity-60",
52
+ className
53
+ ),
54
+ "aria-disabled": disabled || void 0,
55
+ "data-slot": "tag",
56
+ "data-shape": shape,
57
+ ...props,
58
+ children: [
59
+ dot && /* @__PURE__ */ jsx(
60
+ "span",
61
+ {
62
+ className: cn("inline-block size-1.5 rounded-full shrink-0", dotColorMap[variant]),
63
+ "aria-hidden": "true"
64
+ }
65
+ ),
66
+ /* @__PURE__ */ jsx("span", { className: "min-w-0", children }),
67
+ onRemove ? /* @__PURE__ */ jsx(
68
+ "button",
69
+ {
70
+ type: "button",
71
+ disabled,
72
+ onClick: (event) => {
73
+ event.stopPropagation();
74
+ onRemove();
75
+ },
76
+ className: cn(
77
+ "inline-flex shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring/40 disabled:pointer-events-none disabled:opacity-60",
78
+ shape === "pill" ? "size-3" : "size-4"
79
+ ),
80
+ "aria-label": removeAriaLabel,
81
+ "data-slot": "tag-remove",
82
+ children: /* @__PURE__ */ jsx(
83
+ X,
84
+ {
85
+ className: shape === "pill" ? "size-2.5" : "size-3.5",
86
+ "aria-hidden": "true"
87
+ }
88
+ )
89
+ }
90
+ ) : null
91
+ ]
92
+ }
93
+ );
41
94
  }
42
95
  export {
43
96
  Tag
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/primitives/tag.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport { cva } from 'class-variance-authority'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nconst tagVariants = cva(\n 'inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium',\n {\n variants: {\n variant: {\n default: 'border-border bg-background text-muted-foreground',\n success: 'border-status-success-border bg-status-success-bg text-status-success-text',\n warning: 'border-status-warning-border bg-status-warning-bg text-status-warning-text',\n error: 'border-status-error-border bg-status-error-bg text-status-error-text',\n info: 'border-status-info-border bg-status-info-bg text-status-info-text',\n neutral: 'border-status-neutral-border bg-status-neutral-bg text-status-neutral-text',\n brand: 'border-brand-violet/30 bg-brand-violet/10 text-brand-violet',\n },\n },\n defaultVariants: { variant: 'default' },\n }\n)\n\nconst dotColorMap: Record<TagVariant, string> = {\n default: 'bg-muted-foreground',\n success: 'bg-status-success-icon',\n warning: 'bg-status-warning-icon',\n error: 'bg-status-error-icon',\n info: 'bg-status-info-icon',\n neutral: 'bg-status-neutral-icon',\n brand: 'bg-brand-violet',\n}\n\nexport type TagVariant = 'default' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'brand'\n\nexport type TagProps = React.HTMLAttributes<HTMLSpanElement> & {\n variant?: TagVariant\n dot?: boolean\n}\n\nexport function Tag({ className, variant = 'default', dot = false, children, ...props }: TagProps) {\n return (\n <span className={cn(tagVariants({ variant }), className)} {...props}>\n {dot && (\n <span\n className={cn('inline-block size-1.5 rounded-full shrink-0', dotColorMap[variant])}\n aria-hidden=\"true\"\n />\n )}\n {children}\n </span>\n )\n}\n\n/**\n * Helper type: modules define their own tag label \u2192 variant mapping.\n *\n * @example\n * const leadTagMap: TagMap<'customer' | 'hot' | 'inactive'> = {\n * customer: 'success',\n * hot: 'error',\n * inactive: 'neutral',\n * }\n *\n * <Tag variant={leadTagMap[tag.type]} dot>{tag.label}</Tag>\n */\nexport type TagMap<T extends string = string> = Record<T, TagVariant>\n"],
5
- "mappings": "AAyCI,SAEI,KAFJ;AAxCJ,SAAS,WAAW;AACpB,SAAS,UAAU;AAEnB,MAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAS;AAAA,QACT,MAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,SAAS,UAAU;AAAA,EACxC;AACF;AAEA,MAAM,cAA0C;AAAA,EAC9C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAS;AAAA,EACT,MAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAS;AACX;AASO,SAAS,IAAI,EAAE,WAAW,UAAU,WAAW,MAAM,OAAO,UAAU,GAAG,MAAM,GAAa;AACjG,SACE,qBAAC,UAAK,WAAW,GAAG,YAAY,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAI,GAAG,OAC3D;AAAA,WACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,+CAA+C,YAAY,OAAO,CAAC;AAAA,QACjF,eAAY;AAAA;AAAA,IACd;AAAA,IAED;AAAA,KACH;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nconst tagVariants = cva(\n 'inline-flex items-center gap-1.5 border text-xs font-medium',\n {\n variants: {\n variant: {\n default: 'border-border bg-background text-muted-foreground',\n success: 'border-status-success-border bg-status-success-bg text-status-success-text',\n warning: 'border-status-warning-border bg-status-warning-bg text-status-warning-text',\n error: 'border-status-error-border bg-status-error-bg text-status-error-text',\n info: 'border-status-info-border bg-status-info-bg text-status-info-text',\n neutral: 'border-status-neutral-border bg-status-neutral-bg text-status-neutral-text',\n brand: 'border-brand-violet/30 bg-brand-violet/10 text-brand-violet',\n },\n shape: {\n pill: 'rounded-full px-2.5 py-0.5',\n square: 'rounded-md px-2 py-1',\n },\n },\n defaultVariants: { variant: 'default', shape: 'pill' },\n }\n)\n\nconst dotColorMap: Record<TagVariant, string> = {\n default: 'bg-muted-foreground',\n success: 'bg-status-success-icon',\n warning: 'bg-status-warning-icon',\n error: 'bg-status-error-icon',\n info: 'bg-status-info-icon',\n neutral: 'bg-status-neutral-icon',\n brand: 'bg-brand-violet',\n}\n\nexport type TagVariant = 'default' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'brand'\n\nexport type TagShape = 'pill' | 'square'\n\nexport type TagProps = React.HTMLAttributes<HTMLSpanElement> &\n Pick<VariantProps<typeof tagVariants>, 'shape'> & {\n variant?: TagVariant\n dot?: boolean\n /**\n * Render an inline close (\"\u00D7\") button after the label. When provided, the button\n * fires `onRemove` on click and stops propagation so a click on the chip body is\n * not triggered. Matches Figma \"Dismiss Icon=On\" Tag variants.\n */\n onRemove?: () => void\n /** Accessible label for the close button. Defaults to `Remove`. */\n removeAriaLabel?: string\n /** Visually mute the chip and disable its close button. */\n disabled?: boolean\n }\n\nexport function Tag({\n className,\n variant = 'default',\n shape = 'pill',\n dot = false,\n onRemove,\n removeAriaLabel = 'Remove',\n disabled = false,\n children,\n ...props\n}: TagProps) {\n return (\n <span\n className={cn(\n tagVariants({ variant, shape }),\n disabled && 'opacity-60',\n className,\n )}\n aria-disabled={disabled || undefined}\n data-slot=\"tag\"\n data-shape={shape}\n {...props}\n >\n {dot && (\n <span\n className={cn('inline-block size-1.5 rounded-full shrink-0', dotColorMap[variant])}\n aria-hidden=\"true\"\n />\n )}\n <span className=\"min-w-0\">{children}</span>\n {onRemove ? (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring/40 disabled:pointer-events-none disabled:opacity-60',\n shape === 'pill' ? 'size-3' : 'size-4',\n )}\n aria-label={removeAriaLabel}\n data-slot=\"tag-remove\"\n >\n <X\n className={shape === 'pill' ? 'size-2.5' : 'size-3.5'}\n aria-hidden=\"true\"\n />\n </button>\n ) : null}\n </span>\n )\n}\n\n/**\n * Helper type: modules define their own tag label \u2192 variant mapping.\n *\n * @example\n * const leadTagMap: TagMap<'customer' | 'hot' | 'inactive'> = {\n * customer: 'success',\n * hot: 'error',\n * inactive: 'neutral',\n * }\n *\n * <Tag variant={leadTagMap[tag.type]} dot>{tag.label}</Tag>\n */\nexport type TagMap<T extends string = string> = Record<T, TagVariant>\n"],
5
+ "mappings": "AAqEI,SAYI,KAZJ;AApEJ,SAAS,SAAS;AAClB,SAAS,WAA8B;AACvC,SAAS,UAAU;AAEnB,MAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAS;AAAA,QACT,MAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,SAAS,WAAW,OAAO,OAAO;AAAA,EACvD;AACF;AAEA,MAAM,cAA0C;AAAA,EAC9C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAS;AAAA,EACT,MAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAS;AACX;AAsBO,SAAS,IAAI;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN;AAAA,EACA,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAa;AACX,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT,YAAY,EAAE,SAAS,MAAM,CAAC;AAAA,QAC9B,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,MACA,iBAAe,YAAY;AAAA,MAC3B,aAAU;AAAA,MACV,cAAY;AAAA,MACX,GAAG;AAAA,MAEH;AAAA,eACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,+CAA+C,YAAY,OAAO,CAAC;AAAA,YACjF,eAAY;AAAA;AAAA,QACd;AAAA,QAEF,oBAAC,UAAK,WAAU,WAAW,UAAS;AAAA,QACnC,WACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL;AAAA,YACA,SAAS,CAAC,UAAU;AAClB,oBAAM,gBAAgB;AACtB,uBAAS;AAAA,YACX;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA,UAAU,SAAS,WAAW;AAAA,YAChC;AAAA,YACA,cAAY;AAAA,YACZ,aAAU;AAAA,YAEV;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,UAAU,SAAS,aAAa;AAAA,gBAC3C,eAAY;AAAA;AAAA,YACd;AAAA;AAAA,QACF,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;",
6
6
  "names": []
7
7
  }