@apipass/design-system 3.3.0 → 4.1.0

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 (78) hide show
  1. package/dist/lib/embedded-styles.js +1 -1
  2. package/dist/lib/json-viewer.index.cjs +2 -0
  3. package/dist/lib/json-viewer.index.cjs.map +1 -0
  4. package/dist/lib/json-viewer.index.js +7 -0
  5. package/dist/lib/json-viewer.index.js.map +1 -0
  6. package/dist/lib/lib.index.cjs +1 -1
  7. package/dist/lib/lib.index.js +742 -744
  8. package/dist/lib/lib.index.js.map +1 -1
  9. package/dist/lib/style.css +1 -1
  10. package/dist/lib/ui/primitives/JsonViewer/JsonEditor.cjs +2 -0
  11. package/dist/lib/ui/primitives/JsonViewer/JsonEditor.cjs.map +1 -0
  12. package/dist/lib/ui/primitives/JsonViewer/JsonEditor.js +95 -0
  13. package/dist/lib/ui/primitives/JsonViewer/JsonEditor.js.map +1 -0
  14. package/dist/lib/ui/primitives/JsonViewer/JsonViewer.cjs +1 -1
  15. package/dist/lib/ui/primitives/JsonViewer/JsonViewer.cjs.map +1 -1
  16. package/dist/lib/ui/primitives/JsonViewer/JsonViewer.js +37 -88
  17. package/dist/lib/ui/primitives/JsonViewer/JsonViewer.js.map +1 -1
  18. package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.cjs +2 -0
  19. package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.cjs.map +1 -0
  20. package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.js +64 -0
  21. package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.js.map +1 -0
  22. package/dist/lib/ui/primitives/Menu/Menu.cjs +1 -1
  23. package/dist/lib/ui/primitives/Menu/Menu.cjs.map +1 -1
  24. package/dist/lib/ui/primitives/Menu/Menu.js +71 -51
  25. package/dist/lib/ui/primitives/Menu/Menu.js.map +1 -1
  26. package/dist/lib/ui/primitives/PermissionGate/PermissionGate.cjs.map +1 -1
  27. package/dist/lib/ui/primitives/PermissionGate/PermissionGate.js.map +1 -1
  28. package/dist/types/json-viewer.index.d.ts +2 -0
  29. package/dist/types/ui/primitives/JsonViewer/JsonEditor.d.ts +18 -0
  30. package/dist/types/ui/primitives/JsonViewer/json-code-mirror.d.ts +17 -0
  31. package/dist/types/ui/primitives/Menu/Menu.d.ts +1 -1
  32. package/dist/types/ui/primitives/PermissionGate/PermissionGate.d.ts +20 -0
  33. package/dist/types/ui/primitives/index.d.ts +0 -1
  34. package/package.json +34 -7
  35. package/dist/lib/vendor/@codemirror/lang-json/dist/index.cjs +0 -2
  36. package/dist/lib/vendor/@codemirror/lang-json/dist/index.cjs.map +0 -1
  37. package/dist/lib/vendor/@codemirror/lang-json/dist/index.js +0 -28
  38. package/dist/lib/vendor/@codemirror/lang-json/dist/index.js.map +0 -1
  39. package/dist/lib/vendor/@codemirror/language/dist/index.cjs +0 -2
  40. package/dist/lib/vendor/@codemirror/language/dist/index.cjs.map +0 -1
  41. package/dist/lib/vendor/@codemirror/language/dist/index.js +0 -791
  42. package/dist/lib/vendor/@codemirror/language/dist/index.js.map +0 -1
  43. package/dist/lib/vendor/@codemirror/state/dist/index.cjs +0 -6
  44. package/dist/lib/vendor/@codemirror/state/dist/index.cjs.map +0 -1
  45. package/dist/lib/vendor/@codemirror/state/dist/index.js +0 -2633
  46. package/dist/lib/vendor/@codemirror/state/dist/index.js.map +0 -1
  47. package/dist/lib/vendor/@codemirror/view/dist/index.cjs +0 -5
  48. package/dist/lib/vendor/@codemirror/view/dist/index.cjs.map +0 -1
  49. package/dist/lib/vendor/@codemirror/view/dist/index.js +0 -6068
  50. package/dist/lib/vendor/@codemirror/view/dist/index.js.map +0 -1
  51. package/dist/lib/vendor/@lezer/common/dist/index.cjs +0 -2
  52. package/dist/lib/vendor/@lezer/common/dist/index.cjs.map +0 -1
  53. package/dist/lib/vendor/@lezer/common/dist/index.js +0 -1392
  54. package/dist/lib/vendor/@lezer/common/dist/index.js.map +0 -1
  55. package/dist/lib/vendor/@lezer/highlight/dist/index.cjs +0 -2
  56. package/dist/lib/vendor/@lezer/highlight/dist/index.cjs.map +0 -1
  57. package/dist/lib/vendor/@lezer/highlight/dist/index.js +0 -638
  58. package/dist/lib/vendor/@lezer/highlight/dist/index.js.map +0 -1
  59. package/dist/lib/vendor/@lezer/json/dist/index.cjs +0 -2
  60. package/dist/lib/vendor/@lezer/json/dist/index.cjs.map +0 -1
  61. package/dist/lib/vendor/@lezer/json/dist/index.js +0 -35
  62. package/dist/lib/vendor/@lezer/json/dist/index.js.map +0 -1
  63. package/dist/lib/vendor/@lezer/lr/dist/index.cjs +0 -2
  64. package/dist/lib/vendor/@lezer/lr/dist/index.cjs.map +0 -1
  65. package/dist/lib/vendor/@lezer/lr/dist/index.js +0 -1269
  66. package/dist/lib/vendor/@lezer/lr/dist/index.js.map +0 -1
  67. package/dist/lib/vendor/@marijn/find-cluster-break/src/index.cjs +0 -2
  68. package/dist/lib/vendor/@marijn/find-cluster-break/src/index.cjs.map +0 -1
  69. package/dist/lib/vendor/@marijn/find-cluster-break/src/index.js +0 -70
  70. package/dist/lib/vendor/@marijn/find-cluster-break/src/index.js.map +0 -1
  71. package/dist/lib/vendor/style-mod/src/style-mod.cjs +0 -4
  72. package/dist/lib/vendor/style-mod/src/style-mod.cjs.map +0 -1
  73. package/dist/lib/vendor/style-mod/src/style-mod.js +0 -110
  74. package/dist/lib/vendor/style-mod/src/style-mod.js.map +0 -1
  75. package/dist/lib/vendor/w3c-keyname/index.cjs +0 -2
  76. package/dist/lib/vendor/w3c-keyname/index.cjs.map +0 -1
  77. package/dist/lib/vendor/w3c-keyname/index.js +0 -89
  78. package/dist/lib/vendor/w3c-keyname/index.js.map +0 -1
@@ -1,96 +1,116 @@
1
- import { jsx as t, jsxs as u, Fragment as i } from "react/jsx-runtime";
1
+ import { jsx as t, jsxs as m, Fragment as d } from "react/jsx-runtime";
2
2
  import { clsx as o } from "../../../vendor/clsx/dist/clsx.js";
3
- import { Menu as m, MenuTrigger as l, Popover as f, MenuItem as d, Separator as M } from "react-aria-components";
3
+ import u from "react";
4
+ import { PermissionGate as f } from "../PermissionGate/PermissionGate.js";
5
+ import { Menu as M, MenuTrigger as p, Popover as N, MenuItem as h, Separator as g } from "react-aria-components";
4
6
  /* empty css */
5
- import { IconChevronDown as N } from "../../icons/IconChevronDown.js";
6
- import { Label as h, Description as p, Keyboard as g } from "../Fieldset/Fieldset.js";
7
- import { IconButton as x } from "../IconButton/IconButton.js";
8
- import { Button as v } from "../Button/Button.js";
9
- import { useOverlayPortalContainer as I } from "../../hooks/useOverlayPortal.js";
10
- import { TextHeading as S } from "../Text/Text.js";
11
- function T({ className: n, ...e }) {
12
- return /* @__PURE__ */ t(m, { className: o(n, "menu"), ...e });
7
+ import { IconChevronDown as v } from "../../icons/IconChevronDown.js";
8
+ import { Label as I, Description as x, Keyboard as y } from "../Fieldset/Fieldset.js";
9
+ import { IconButton as b } from "../IconButton/IconButton.js";
10
+ import { Button as B } from "../Button/Button.js";
11
+ import { useOverlayPortalContainer as C } from "../../hooks/useOverlayPortal.js";
12
+ import { TextHeading as P } from "../Text/Text.js";
13
+ let i = !1;
14
+ function c(n) {
15
+ i || u.Children.forEach(n, (e) => {
16
+ if (u.isValidElement(e)) {
17
+ if (e.type === u.Fragment) {
18
+ c(
19
+ e.props.children
20
+ );
21
+ return;
22
+ }
23
+ e.type === f && (i = !0, console.error(
24
+ "[design-system] Menu: PermissionGate não pode envolver um MenuItem — o react-aria descarta esse item e os seguintes, e o menu abre vazio quando ele é o primeiro. Mova o gate para dentro do MenuItem, em volta do conteúdo do item."
25
+ ));
26
+ }
27
+ });
28
+ }
29
+ function S({ className: n, ...e }) {
30
+ return c(
31
+ typeof e.children == "function" ? null : e.children
32
+ ), /* @__PURE__ */ t(M, { className: o(n, "menu"), ...e });
13
33
  }
14
- function b({ ...n }) {
15
- return /* @__PURE__ */ t(l, { ...n });
34
+ function T({ ...n }) {
35
+ return /* @__PURE__ */ t(p, { ...n });
16
36
  }
17
- function A({
37
+ function z({
18
38
  label: n,
19
39
  children: e,
20
40
  icon: r,
21
- placement: s,
22
- variant: a,
23
- ...c
41
+ placement: a,
42
+ variant: s,
43
+ ...l
24
44
  }) {
25
- return /* @__PURE__ */ u(b, { children: [
26
- r ? /* @__PURE__ */ t(x, { variant: a, "aria-label": n, children: r }) : /* @__PURE__ */ t(v, { variant: a, children: n }),
27
- /* @__PURE__ */ t(B, { placement: s, children: /* @__PURE__ */ t(T, { ...c, children: e }) })
45
+ return /* @__PURE__ */ m(T, { children: [
46
+ r ? /* @__PURE__ */ t(b, { variant: s, "aria-label": n, children: r }) : /* @__PURE__ */ t(B, { variant: s, children: n }),
47
+ /* @__PURE__ */ t($, { placement: a, children: /* @__PURE__ */ t(S, { ...l, children: e }) })
28
48
  ] });
29
49
  }
30
- function B({
50
+ function $({
31
51
  UNSTABLE_portalContainer: n,
32
52
  ...e
33
53
  }) {
34
- const r = I();
54
+ const r = C();
35
55
  return /* @__PURE__ */ t(
36
- f,
56
+ N,
37
57
  {
38
58
  ...e,
39
59
  UNSTABLE_portalContainer: n ?? r
40
60
  }
41
61
  );
42
62
  }
43
- function E({ className: n, ...e }) {
44
- const r = o(n, "menu-item"), s = e.textValue || (typeof e.children == "string" ? e.children : void 0);
45
- return /* @__PURE__ */ t(d, { ...e, className: r, textValue: s, children: ({ hasSubmenu: a }) => /* @__PURE__ */ u(i, { children: [
63
+ function K({ className: n, ...e }) {
64
+ const r = o(n, "menu-item"), a = e.textValue || (typeof e.children == "string" ? e.children : void 0);
65
+ return /* @__PURE__ */ t(h, { ...e, className: r, textValue: a, children: ({ hasSubmenu: s }) => /* @__PURE__ */ m(d, { children: [
46
66
  e.children,
47
- a && /* @__PURE__ */ t(N, {})
67
+ s && /* @__PURE__ */ t(v, {})
48
68
  ] }) });
49
69
  }
50
- function F({ className: n, ...e }) {
70
+ function U({ className: n, ...e }) {
51
71
  const r = o(n, "menu-header");
52
72
  return /* @__PURE__ */ t("div", { ...e, className: r });
53
73
  }
54
- function K({ className: n, ...e }) {
74
+ function W({ className: n, ...e }) {
55
75
  const r = o(n, "menu-section");
56
76
  return /* @__PURE__ */ t("div", { ...e, className: r });
57
77
  }
58
- function O({ className: n, ...e }) {
78
+ function _({ className: n, ...e }) {
59
79
  const r = o(n, "menu-heading");
60
- return /* @__PURE__ */ t(S, { ...e, className: r });
80
+ return /* @__PURE__ */ t(P, { ...e, className: r });
61
81
  }
62
- function U({ className: n, ...e }) {
82
+ function k({ className: n, ...e }) {
63
83
  const r = o(n, "menu-separator");
64
- return /* @__PURE__ */ t(M, { ...e, className: r });
84
+ return /* @__PURE__ */ t(g, { ...e, className: r });
65
85
  }
66
- function _({ className: n, ...e }) {
86
+ function J({ className: n, ...e }) {
67
87
  const r = o(n, "menu-label");
68
- return /* @__PURE__ */ t(h, { ...e, className: r });
88
+ return /* @__PURE__ */ t(I, { ...e, className: r });
69
89
  }
70
- function k({ className: n, ...e }) {
90
+ function Q({ className: n, ...e }) {
71
91
  const r = o(n, "menu-description");
72
- return /* @__PURE__ */ t(p, { ...e, className: r });
92
+ return /* @__PURE__ */ t(x, { ...e, className: r });
73
93
  }
74
- function q({
94
+ function R({
75
95
  children: n,
76
96
  className: e,
77
97
  ...r
78
98
  }) {
79
- const s = o(e, "menu-shortcut");
80
- return /* @__PURE__ */ t(g, { ...r, className: s, children: n });
99
+ const a = o(e, "menu-shortcut");
100
+ return /* @__PURE__ */ t(y, { ...r, className: a, children: n });
81
101
  }
82
102
  export {
83
- T as Menu,
84
- A as MenuButton,
85
- k as MenuDescription,
86
- F as MenuHeader,
87
- O as MenuHeading,
88
- E as MenuItem,
89
- _ as MenuLabel,
90
- B as MenuPopover,
91
- K as MenuSection,
92
- U as MenuSeparator,
93
- q as MenuShortcut,
94
- b as MenuTrigger
103
+ S as Menu,
104
+ z as MenuButton,
105
+ Q as MenuDescription,
106
+ U as MenuHeader,
107
+ _ as MenuHeading,
108
+ K as MenuItem,
109
+ J as MenuLabel,
110
+ $ as MenuPopover,
111
+ W as MenuSection,
112
+ k as MenuSeparator,
113
+ R as MenuShortcut,
114
+ T as MenuTrigger
95
115
  };
96
116
  //# sourceMappingURL=Menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.js","sources":["../../../../../src/ui/primitives/Menu/Menu.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useOverlayPortalContainer } from \"hooks\";\nimport { IconChevronDown } from \"icons\";\nimport {\n Button,\n ButtonProps,\n Description,\n DescriptionProps,\n IconButton,\n Keyboard,\n KeyboardProps,\n Label,\n LabelProps,\n TextHeading,\n type TextHeadingProps,\n} from \"primitives\";\nimport type React from \"react\";\nimport {\n Menu as RACMenu,\n MenuItem as RACMenuItem,\n MenuTrigger as RACMenuTrigger,\n Popover as RACPopover,\n Separator as RACSeparator,\n type MenuItemProps as RACMenuItemProps,\n type MenuProps as RACMenuProps,\n type MenuTriggerProps as RACMenuTriggerProps,\n type PopoverProps as RACPopoverProps,\n type SeparatorProps as RACSeparatorProps,\n} from \"react-aria-components\";\nimport \"./menu.css\";\n\nexport type MenuProps<T> = RACMenuProps<T>;\nexport function Menu<T extends object>({ className, ...props }: MenuProps<T>) {\n return <RACMenu className={clsx(className, \"menu\")} {...props} />;\n}\n\nexport type MenuTriggerProps = RACMenuTriggerProps;\nexport function MenuTrigger({ ...props }: MenuTriggerProps) {\n return <RACMenuTrigger {...props} />;\n}\n\nexport interface MenuButtonProps<T>\n extends RACMenuProps<T>,\n Omit<RACMenuTriggerProps, \"children\"> {\n label: string;\n variant?: ButtonProps[\"variant\"];\n placement?: MenuPopoverProps[\"placement\"];\n icon?: React.ReactNode;\n}\nexport function MenuButton<T extends object>({\n label,\n children,\n icon,\n placement,\n variant,\n ...props\n}: MenuButtonProps<T>) {\n return (\n <MenuTrigger>\n {icon ? (\n <IconButton variant={variant} aria-label={label}>\n {icon}\n </IconButton>\n ) : (\n <Button variant={variant}>{label}</Button>\n )}\n <MenuPopover placement={placement}>\n <Menu {...props}>{children}</Menu>\n </MenuPopover>\n </MenuTrigger>\n );\n}\n\nexport type MenuPopoverProps = RACPopoverProps;\nexport function MenuPopover({\n UNSTABLE_portalContainer,\n ...props\n}: MenuPopoverProps) {\n // Sem container explícito o menu faz portal no document.body — fora da shadow\n // root do MFE, sem CSS. Ver ui/hooks/useOverlayPortal.\n const portalContainer = useOverlayPortalContainer();\n return (\n <RACPopover\n {...props}\n UNSTABLE_portalContainer={UNSTABLE_portalContainer ?? portalContainer}\n />\n );\n}\n\nexport type MenuItemProps = RACMenuItemProps;\nexport function MenuItem({ className, ...props }: MenuItemProps) {\n const classNames = clsx(className, \"menu-item\");\n const textValue =\n props.textValue ||\n (typeof props.children === \"string\" ? props.children : undefined);\n return (\n <RACMenuItem {...props} className={classNames} textValue={textValue}>\n {({ hasSubmenu }) => (\n <>\n {props.children}\n {hasSubmenu && <IconChevronDown />}\n </>\n )}\n </RACMenuItem>\n );\n}\n\nexport type MenuHeaderProps = React.ComponentPropsWithoutRef<\"div\">;\nexport function MenuHeader({ className, ...props }: MenuHeaderProps) {\n const classNames = clsx(className, \"menu-header\");\n return <div {...props} className={classNames} />;\n}\n\nexport type MenuSectionProps = React.ComponentPropsWithoutRef<\"div\">;\nexport function MenuSection({ className, ...props }: MenuSectionProps) {\n const classNames = clsx(className, \"menu-section\");\n return <div {...props} className={classNames} />;\n}\n\nexport type MenuHeadingProps = TextHeadingProps;\nexport function MenuHeading({ className, ...props }: MenuHeadingProps) {\n const classNames = clsx(className, \"menu-heading\");\n return <TextHeading {...props} className={classNames} />;\n}\n\nexport type MenuSeparatorProps = RACSeparatorProps;\nexport function MenuSeparator({ className, ...props }: MenuSeparatorProps) {\n const classNames = clsx(className, \"menu-separator\");\n return <RACSeparator {...props} className={classNames} />;\n}\n\nexport type MenuLabelProps = LabelProps;\nexport function MenuLabel({ className, ...props }: MenuLabelProps) {\n const classNames = clsx(className, \"menu-label\");\n return <Label {...props} className={classNames} />;\n}\n\nexport type MenuDescriptionProps = DescriptionProps;\nexport function MenuDescription({ className, ...props }: MenuDescriptionProps) {\n const classNames = clsx(className, \"menu-description\");\n return <Description {...props} className={classNames} />;\n}\n\nexport type MenuShortcutProps = KeyboardProps;\nexport function MenuShortcut({\n children,\n className,\n ...props\n}: MenuShortcutProps) {\n const classNames = clsx(className, \"menu-shortcut\");\n return (\n <Keyboard {...props} className={classNames}>\n {children}\n </Keyboard>\n );\n}\n"],"names":["Menu","className","props","jsx","RACMenu","clsx","MenuTrigger","RACMenuTrigger","MenuButton","label","children","icon","placement","variant","IconButton","Button","MenuPopover","UNSTABLE_portalContainer","portalContainer","useOverlayPortalContainer","RACPopover","MenuItem","classNames","textValue","RACMenuItem","hasSubmenu","jsxs","Fragment","IconChevronDown","MenuHeader","MenuSection","MenuHeading","TextHeading","MenuSeparator","RACSeparator","MenuLabel","Label","MenuDescription","Description","MenuShortcut","Keyboard"],"mappings":"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"}
1
+ {"version":3,"file":"Menu.js","sources":["../../../../../src/ui/primitives/Menu/Menu.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useOverlayPortalContainer } from \"hooks\";\nimport { IconChevronDown } from \"icons\";\nimport {\n Button,\n ButtonProps,\n Description,\n DescriptionProps,\n IconButton,\n Keyboard,\n KeyboardProps,\n Label,\n LabelProps,\n TextHeading,\n type TextHeadingProps,\n} from \"primitives\";\nimport React from \"react\";\nimport { PermissionGate } from \"../PermissionGate/PermissionGate\";\nimport {\n Menu as RACMenu,\n MenuItem as RACMenuItem,\n MenuTrigger as RACMenuTrigger,\n Popover as RACPopover,\n Separator as RACSeparator,\n type MenuItemProps as RACMenuItemProps,\n type MenuProps as RACMenuProps,\n type MenuTriggerProps as RACMenuTriggerProps,\n type PopoverProps as RACPopoverProps,\n type SeparatorProps as RACSeparatorProps,\n} from \"react-aria-components\";\nimport \"./menu.css\";\n\n/**\n * Aviso de desenvolvimento: um `PermissionGate` EM VOLTA de um `MenuItem` quebra\n * o menu. O collection builder do react-aria-components só entende nós de\n * coleção (`MenuItem`, `MenuSeparator`, `MenuSection`); o `<span>` que o gate\n * renderiza no ramo negado entra na coleção com `node` nulo e arrebenta a lista\n * encadeada de chaves — o item envolvido e todos os seguintes desaparecem, e se\n * ele for o primeiro filho o menu abre VAZIO, levando embora também os itens\n * permitidos. Não há erro no console, e a forma errada passa despercebida em QA\n * feito com um usuário que tem todas as permissões, porque o ramo que envolve só\n * é renderizado quando a ação é negada.\n *\n * O gate deve ficar DENTRO do item, em volta do conteúdo — ali é seguro, porque\n * o conteúdo do item é renderizado no DOM real, fora da coleção. Mesmo padrão\n * das ações de linha do `DataTable`.\n *\n * O aviso é incondicional, e não atrás de `process.env.NODE_ENV`: o build da lib\n * (`vite.lib.config.ts`) substitui essa variável pelo literal `\"production\"`, o\n * que transformaria o guard em código morto justamente nos consumidores. Só\n * dispara uma vez por sessão, e só quando já existe um bug na árvore.\n */\nlet hasWarnedAboutGateAroundItem = false;\n\nfunction warnOnGateAroundItem(children: React.ReactNode) {\n if (hasWarnedAboutGateAroundItem) return;\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n if (child.type === React.Fragment) {\n warnOnGateAroundItem(\n (child.props as { children?: React.ReactNode }).children,\n );\n return;\n }\n if (child.type === PermissionGate) {\n hasWarnedAboutGateAroundItem = true;\n // eslint-disable-next-line no-console\n console.error(\n \"[design-system] Menu: PermissionGate não pode envolver um MenuItem — \" +\n \"o react-aria descarta esse item e os seguintes, e o menu abre vazio \" +\n \"quando ele é o primeiro. Mova o gate para dentro do MenuItem, em \" +\n \"volta do conteúdo do item.\",\n );\n }\n });\n}\n\nexport type MenuProps<T> = RACMenuProps<T>;\nexport function Menu<T extends object>({ className, ...props }: MenuProps<T>) {\n // children pode ser uma função nas coleções dinâmicas do react-aria.\n warnOnGateAroundItem(\n typeof props.children === \"function\" ? null : props.children,\n );\n return <RACMenu className={clsx(className, \"menu\")} {...props} />;\n}\n\nexport type MenuTriggerProps = RACMenuTriggerProps;\nexport function MenuTrigger({ ...props }: MenuTriggerProps) {\n return <RACMenuTrigger {...props} />;\n}\n\nexport interface MenuButtonProps<T>\n extends RACMenuProps<T>,\n Omit<RACMenuTriggerProps, \"children\"> {\n label: string;\n variant?: ButtonProps[\"variant\"];\n placement?: MenuPopoverProps[\"placement\"];\n icon?: React.ReactNode;\n}\nexport function MenuButton<T extends object>({\n label,\n children,\n icon,\n placement,\n variant,\n ...props\n}: MenuButtonProps<T>) {\n return (\n <MenuTrigger>\n {icon ? (\n <IconButton variant={variant} aria-label={label}>\n {icon}\n </IconButton>\n ) : (\n <Button variant={variant}>{label}</Button>\n )}\n <MenuPopover placement={placement}>\n <Menu {...props}>{children}</Menu>\n </MenuPopover>\n </MenuTrigger>\n );\n}\n\nexport type MenuPopoverProps = RACPopoverProps;\nexport function MenuPopover({\n UNSTABLE_portalContainer,\n ...props\n}: MenuPopoverProps) {\n // Sem container explícito o menu faz portal no document.body — fora da shadow\n // root do MFE, sem CSS. Ver ui/hooks/useOverlayPortal.\n const portalContainer = useOverlayPortalContainer();\n return (\n <RACPopover\n {...props}\n UNSTABLE_portalContainer={UNSTABLE_portalContainer ?? portalContainer}\n />\n );\n}\n\nexport type MenuItemProps = RACMenuItemProps;\nexport function MenuItem({ className, ...props }: MenuItemProps) {\n const classNames = clsx(className, \"menu-item\");\n const textValue =\n props.textValue ||\n (typeof props.children === \"string\" ? props.children : undefined);\n return (\n <RACMenuItem {...props} className={classNames} textValue={textValue}>\n {({ hasSubmenu }) => (\n <>\n {props.children}\n {hasSubmenu && <IconChevronDown />}\n </>\n )}\n </RACMenuItem>\n );\n}\n\nexport type MenuHeaderProps = React.ComponentPropsWithoutRef<\"div\">;\nexport function MenuHeader({ className, ...props }: MenuHeaderProps) {\n const classNames = clsx(className, \"menu-header\");\n return <div {...props} className={classNames} />;\n}\n\nexport type MenuSectionProps = React.ComponentPropsWithoutRef<\"div\">;\nexport function MenuSection({ className, ...props }: MenuSectionProps) {\n const classNames = clsx(className, \"menu-section\");\n return <div {...props} className={classNames} />;\n}\n\nexport type MenuHeadingProps = TextHeadingProps;\nexport function MenuHeading({ className, ...props }: MenuHeadingProps) {\n const classNames = clsx(className, \"menu-heading\");\n return <TextHeading {...props} className={classNames} />;\n}\n\nexport type MenuSeparatorProps = RACSeparatorProps;\nexport function MenuSeparator({ className, ...props }: MenuSeparatorProps) {\n const classNames = clsx(className, \"menu-separator\");\n return <RACSeparator {...props} className={classNames} />;\n}\n\nexport type MenuLabelProps = LabelProps;\nexport function MenuLabel({ className, ...props }: MenuLabelProps) {\n const classNames = clsx(className, \"menu-label\");\n return <Label {...props} className={classNames} />;\n}\n\nexport type MenuDescriptionProps = DescriptionProps;\nexport function MenuDescription({ className, ...props }: MenuDescriptionProps) {\n const classNames = clsx(className, \"menu-description\");\n return <Description {...props} className={classNames} />;\n}\n\nexport type MenuShortcutProps = KeyboardProps;\nexport function MenuShortcut({\n children,\n className,\n ...props\n}: MenuShortcutProps) {\n const classNames = clsx(className, \"menu-shortcut\");\n return (\n <Keyboard {...props} className={classNames}>\n {children}\n </Keyboard>\n );\n}\n"],"names":["hasWarnedAboutGateAroundItem","warnOnGateAroundItem","children","React","child","PermissionGate","Menu","className","props","jsx","RACMenu","clsx","MenuTrigger","RACMenuTrigger","MenuButton","label","icon","placement","variant","IconButton","Button","MenuPopover","UNSTABLE_portalContainer","portalContainer","useOverlayPortalContainer","RACPopover","MenuItem","classNames","textValue","RACMenuItem","hasSubmenu","jsxs","Fragment","IconChevronDown","MenuHeader","MenuSection","MenuHeading","TextHeading","MenuSeparator","RACSeparator","MenuLabel","Label","MenuDescription","Description","MenuShortcut","Keyboard"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionGate.cjs","sources":["../../../../../src/ui/primitives/PermissionGate/PermissionGate.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\nexport interface PermissionGateProps {\n /** Whether the current user has permission to perform this action. */\n isAllowed: boolean;\n /** Tooltip text shown when the action is not allowed. */\n noAccessLabel: string;\n /**\n * Either a React element or a render prop that receives `isAllowed`.\n * Use the render prop to avoid repeating the permission check inside the child.\n */\n children: React.ReactElement | ((isAllowed: boolean) => React.ReactElement);\n}\n\n/**\n * Wraps any interactive element with a tooltip that appears when `isAllowed` is false.\n *\n * When allowed, renders the trigger directly with no wrapper.\n * When not allowed, wraps in a DS Tooltip with hover trigger.\n * A `<span>` wrapper ensures disabled elements still receive pointer events.\n */\nexport function PermissionGate({\n isAllowed,\n noAccessLabel,\n children,\n}: PermissionGateProps) {\n const trigger =\n typeof children === \"function\" ? children(isAllowed) : children;\n\n if (isAllowed) {\n return trigger;\n }\n\n return (\n <Tooltip content={noAccessLabel} trigger=\"hover\" placement=\"top\" offset={4}>\n <span style={{ display: \"inline-flex\" }}>{trigger}</span>\n </Tooltip>\n );\n}\n"],"names":["PermissionGate","isAllowed","noAccessLabel","children","trigger","Tooltip","jsx"],"mappings":"yJAsBO,SAASA,EAAe,CAC7B,UAAAC,EACA,cAAAC,EACA,SAAAC,CACF,EAAwB,CACtB,MAAMC,EACJ,OAAOD,GAAa,WAAaA,EAASF,CAAS,EAAIE,EAEzD,OAAIF,EACKG,QAINC,UAAA,CAAQ,QAASH,EAAe,QAAQ,QAAQ,UAAU,MAAM,OAAQ,EACvE,SAAAI,MAAC,QAAK,MAAO,CAAE,QAAS,aAAA,EAAkB,WAAQ,EACpD,CAEJ"}
1
+ {"version":3,"file":"PermissionGate.cjs","sources":["../../../../../src/ui/primitives/PermissionGate/PermissionGate.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\nexport interface PermissionGateProps {\n /** Whether the current user has permission to perform this action. */\n isAllowed: boolean;\n /** Tooltip text shown when the action is not allowed. */\n noAccessLabel: string;\n /**\n * Either a React element or a render prop that receives `isAllowed`.\n * Use the render prop to avoid repeating the permission check inside the child.\n */\n children: React.ReactElement | ((isAllowed: boolean) => React.ReactElement);\n}\n\n/**\n * Wraps any interactive element with a tooltip that appears when `isAllowed` is false.\n *\n * When allowed, renders the trigger directly with no wrapper.\n * When not allowed, wraps in a DS Tooltip with hover trigger.\n * A `<span>` wrapper ensures disabled elements still receive pointer events.\n *\n * Dentro de coleções do react-aria-components (`Menu`, `ListBox`, `Table`,\n * `Tree`) o gate vai NO CONTEÚDO do nó, nunca em volta dele:\n *\n * ```tsx\n * // ERRADO — o react-aria descarta esse item e os seguintes, e o menu abre\n * // vazio se ele for o primeiro. Sem erro no console.\n * <PermissionGate …><MenuItem>…</MenuItem></PermissionGate>\n *\n * // CERTO\n * <MenuItem isDisabled={!allowed}>\n * <PermissionGate …><span>…</span></PermissionGate>\n * </MenuItem>\n * ```\n *\n * O collection builder só reconhece nós de coleção; o `<span>` do ramo negado\n * entra na coleção com `node` nulo e quebra a lista encadeada de chaves. Já o\n * conteúdo de um nó é renderizado no DOM real, fora da coleção, e por isso é\n * seguro — é onde o `DataTable` põe o gate nas ações de linha. O `Menu` avisa no\n * console em desenvolvimento se o gate aparecer em volta de um item.\n */\nexport function PermissionGate({\n isAllowed,\n noAccessLabel,\n children,\n}: PermissionGateProps) {\n const trigger =\n typeof children === \"function\" ? children(isAllowed) : children;\n\n if (isAllowed) {\n return trigger;\n }\n\n return (\n <Tooltip content={noAccessLabel} trigger=\"hover\" placement=\"top\" offset={4}>\n <span style={{ display: \"inline-flex\" }}>{trigger}</span>\n </Tooltip>\n );\n}\n"],"names":["PermissionGate","isAllowed","noAccessLabel","children","trigger","Tooltip","jsx"],"mappings":"yJA0CO,SAASA,EAAe,CAC7B,UAAAC,EACA,cAAAC,EACA,SAAAC,CACF,EAAwB,CACtB,MAAMC,EACJ,OAAOD,GAAa,WAAaA,EAASF,CAAS,EAAIE,EAEzD,OAAIF,EACKG,QAINC,UAAA,CAAQ,QAASH,EAAe,QAAQ,QAAQ,UAAU,MAAM,OAAQ,EACvE,SAAAI,MAAC,QAAK,MAAO,CAAE,QAAS,aAAA,EAAkB,WAAQ,EACpD,CAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionGate.js","sources":["../../../../../src/ui/primitives/PermissionGate/PermissionGate.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\nexport interface PermissionGateProps {\n /** Whether the current user has permission to perform this action. */\n isAllowed: boolean;\n /** Tooltip text shown when the action is not allowed. */\n noAccessLabel: string;\n /**\n * Either a React element or a render prop that receives `isAllowed`.\n * Use the render prop to avoid repeating the permission check inside the child.\n */\n children: React.ReactElement | ((isAllowed: boolean) => React.ReactElement);\n}\n\n/**\n * Wraps any interactive element with a tooltip that appears when `isAllowed` is false.\n *\n * When allowed, renders the trigger directly with no wrapper.\n * When not allowed, wraps in a DS Tooltip with hover trigger.\n * A `<span>` wrapper ensures disabled elements still receive pointer events.\n */\nexport function PermissionGate({\n isAllowed,\n noAccessLabel,\n children,\n}: PermissionGateProps) {\n const trigger =\n typeof children === \"function\" ? children(isAllowed) : children;\n\n if (isAllowed) {\n return trigger;\n }\n\n return (\n <Tooltip content={noAccessLabel} trigger=\"hover\" placement=\"top\" offset={4}>\n <span style={{ display: \"inline-flex\" }}>{trigger}</span>\n </Tooltip>\n );\n}\n"],"names":["PermissionGate","isAllowed","noAccessLabel","children","trigger","Tooltip","jsx"],"mappings":";;AAsBO,SAASA,EAAe;AAAA,EAC7B,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC;AACF,GAAwB;AACtB,QAAMC,IACJ,OAAOD,KAAa,aAAaA,EAASF,CAAS,IAAIE;AAEzD,SAAIF,IACKG,sBAINC,GAAA,EAAQ,SAASH,GAAe,SAAQ,SAAQ,WAAU,OAAM,QAAQ,GACvE,UAAA,gBAAAI,EAAC,UAAK,OAAO,EAAE,SAAS,cAAA,GAAkB,aAAQ,GACpD;AAEJ;"}
1
+ {"version":3,"file":"PermissionGate.js","sources":["../../../../../src/ui/primitives/PermissionGate/PermissionGate.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\nexport interface PermissionGateProps {\n /** Whether the current user has permission to perform this action. */\n isAllowed: boolean;\n /** Tooltip text shown when the action is not allowed. */\n noAccessLabel: string;\n /**\n * Either a React element or a render prop that receives `isAllowed`.\n * Use the render prop to avoid repeating the permission check inside the child.\n */\n children: React.ReactElement | ((isAllowed: boolean) => React.ReactElement);\n}\n\n/**\n * Wraps any interactive element with a tooltip that appears when `isAllowed` is false.\n *\n * When allowed, renders the trigger directly with no wrapper.\n * When not allowed, wraps in a DS Tooltip with hover trigger.\n * A `<span>` wrapper ensures disabled elements still receive pointer events.\n *\n * Dentro de coleções do react-aria-components (`Menu`, `ListBox`, `Table`,\n * `Tree`) o gate vai NO CONTEÚDO do nó, nunca em volta dele:\n *\n * ```tsx\n * // ERRADO — o react-aria descarta esse item e os seguintes, e o menu abre\n * // vazio se ele for o primeiro. Sem erro no console.\n * <PermissionGate …><MenuItem>…</MenuItem></PermissionGate>\n *\n * // CERTO\n * <MenuItem isDisabled={!allowed}>\n * <PermissionGate …><span>…</span></PermissionGate>\n * </MenuItem>\n * ```\n *\n * O collection builder só reconhece nós de coleção; o `<span>` do ramo negado\n * entra na coleção com `node` nulo e quebra a lista encadeada de chaves. Já o\n * conteúdo de um nó é renderizado no DOM real, fora da coleção, e por isso é\n * seguro — é onde o `DataTable` põe o gate nas ações de linha. O `Menu` avisa no\n * console em desenvolvimento se o gate aparecer em volta de um item.\n */\nexport function PermissionGate({\n isAllowed,\n noAccessLabel,\n children,\n}: PermissionGateProps) {\n const trigger =\n typeof children === \"function\" ? children(isAllowed) : children;\n\n if (isAllowed) {\n return trigger;\n }\n\n return (\n <Tooltip content={noAccessLabel} trigger=\"hover\" placement=\"top\" offset={4}>\n <span style={{ display: \"inline-flex\" }}>{trigger}</span>\n </Tooltip>\n );\n}\n"],"names":["PermissionGate","isAllowed","noAccessLabel","children","trigger","Tooltip","jsx"],"mappings":";;AA0CO,SAASA,EAAe;AAAA,EAC7B,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC;AACF,GAAwB;AACtB,QAAMC,IACJ,OAAOD,KAAa,aAAaA,EAASF,CAAS,IAAIE;AAEzD,SAAIF,IACKG,sBAINC,GAAA,EAAQ,SAASH,GAAe,SAAQ,SAAQ,WAAU,OAAM,QAAQ,GACvE,UAAA,gBAAAI,EAAC,UAAK,OAAO,EAAE,SAAS,cAAA,GAAkB,aAAQ,GACpD;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ export * from "./ui/primitives/JsonViewer/JsonViewer";
2
+ export * from "./ui/primitives/JsonViewer/JsonEditor";
@@ -0,0 +1,18 @@
1
+ import "./jsonviewer.css";
2
+ export interface JsonEditorProps {
3
+ value: string;
4
+ onChange?: (value: string) => void;
5
+ expandAllLabel: string;
6
+ className?: string;
7
+ height?: string | number;
8
+ isDisabled?: boolean;
9
+ isReadOnly?: boolean;
10
+ "aria-label"?: string;
11
+ }
12
+ /**
13
+ * Editable sibling of `JsonViewer`: same CodeMirror-based visual (syntax
14
+ * colors, gutter, scrollbar, border/background) but with typing enabled.
15
+ * `JsonViewer` stays read-only-only on purpose so its bundle keeps assuming
16
+ * a static document; this component owns the editable/controlled behavior.
17
+ */
18
+ export declare function JsonEditor({ value, onChange, expandAllLabel, className, height, isDisabled, isReadOnly, "aria-label": ariaLabel, }: JsonEditorProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { HighlightStyle } from "@codemirror/language";
2
+ export declare const jsonHighlightStyle: HighlightStyle;
3
+ export declare const jsonEditorTheme: import("@codemirror/state").Extension;
4
+ export declare const jsonEditorExtensions: import("@codemirror/state").Extension[];
5
+ export declare function serializeJson(value: unknown): string;
6
+ export declare function toCssSize(size: string | number): string;
7
+ /**
8
+ * Finds the fold range of every direct child (depth 1) of the root object/array
9
+ * by scanning the text itself for matching brackets. This mirrors what
10
+ * CodeMirror's `foldable()` would compute, but doesn't depend on the lezer
11
+ * parser having finished tokenizing the document — which for a multi-MB
12
+ * document is not guaranteed synchronously at mount time.
13
+ */
14
+ export declare function computeFirstLevelFoldRanges(text: string): {
15
+ from: number;
16
+ to: number;
17
+ }[];
@@ -1,5 +1,5 @@
1
1
  import { ButtonProps, DescriptionProps, KeyboardProps, LabelProps, type TextHeadingProps } from "primitives";
2
- import type React from "react";
2
+ import React from "react";
3
3
  import { type MenuItemProps as RACMenuItemProps, type MenuProps as RACMenuProps, type MenuTriggerProps as RACMenuTriggerProps, type PopoverProps as RACPopoverProps, type SeparatorProps as RACSeparatorProps } from "react-aria-components";
4
4
  import "./menu.css";
5
5
  export type MenuProps<T> = RACMenuProps<T>;
@@ -16,5 +16,25 @@ export interface PermissionGateProps {
16
16
  * When allowed, renders the trigger directly with no wrapper.
17
17
  * When not allowed, wraps in a DS Tooltip with hover trigger.
18
18
  * A `<span>` wrapper ensures disabled elements still receive pointer events.
19
+ *
20
+ * Dentro de coleções do react-aria-components (`Menu`, `ListBox`, `Table`,
21
+ * `Tree`) o gate vai NO CONTEÚDO do nó, nunca em volta dele:
22
+ *
23
+ * ```tsx
24
+ * // ERRADO — o react-aria descarta esse item e os seguintes, e o menu abre
25
+ * // vazio se ele for o primeiro. Sem erro no console.
26
+ * <PermissionGate …><MenuItem>…</MenuItem></PermissionGate>
27
+ *
28
+ * // CERTO
29
+ * <MenuItem isDisabled={!allowed}>
30
+ * <PermissionGate …><span>…</span></PermissionGate>
31
+ * </MenuItem>
32
+ * ```
33
+ *
34
+ * O collection builder só reconhece nós de coleção; o `<span>` do ramo negado
35
+ * entra na coleção com `node` nulo e quebra a lista encadeada de chaves. Já o
36
+ * conteúdo de um nó é renderizado no DOM real, fora da coleção, e por isso é
37
+ * seguro — é onde o `DataTable` põe o gate nas ações de linha. O `Menu` avisa no
38
+ * console em desenvolvimento se o gate aparecer em volta de um item.
19
39
  */
20
40
  export declare function PermissionGate({ isAllowed, noAccessLabel, children, }: PermissionGateProps): import("react/jsx-runtime").JSX.Element;
@@ -16,7 +16,6 @@ export * from "./Icon/Icon";
16
16
  export * from "./IconButton/IconButton";
17
17
  export * from "./Image/Image";
18
18
  export * from "./Input/Input";
19
- export * from "./JsonViewer/JsonViewer";
20
19
  export * from "./Link/Link";
21
20
  export * from "./ListBox/ListBox";
22
21
  export * from "./Logo/Logo";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apipass/design-system",
3
- "version": "3.3.0",
3
+ "version": "4.1.0",
4
4
  "type": "module",
5
5
  "description": "APIPass React Design System",
6
6
  "sideEffects": [
@@ -26,6 +26,11 @@
26
26
  "import": "./dist/lib/charts.index.js",
27
27
  "require": "./dist/lib/charts.index.cjs"
28
28
  },
29
+ "./json-viewer": {
30
+ "types": "./dist/types/json-viewer.index.d.ts",
31
+ "import": "./dist/lib/json-viewer.index.js",
32
+ "require": "./dist/lib/json-viewer.index.cjs"
33
+ },
29
34
  "./style.css": "./dist/lib/style.css",
30
35
  "./embedded-styles": {
31
36
  "types": "./dist/lib/embedded-styles.d.ts",
@@ -38,6 +43,9 @@
38
43
  "charts": [
39
44
  "./dist/types/charts.index.d.ts"
40
45
  ],
46
+ "json-viewer": [
47
+ "./dist/types/json-viewer.index.d.ts"
48
+ ],
41
49
  "icons": [
42
50
  "./dist/types/ui/icons/index.d.ts"
43
51
  ]
@@ -72,6 +80,11 @@
72
80
  ]
73
81
  },
74
82
  "peerDependencies": {
83
+ "@codemirror/lang-json": ">=6.0.0",
84
+ "@codemirror/language": ">=6.0.0",
85
+ "@codemirror/state": ">=6.0.0",
86
+ "@codemirror/view": ">=6.0.0",
87
+ "@lezer/highlight": ">=1.0.0",
75
88
  "@monaco-editor/react": ">=4.0.0",
76
89
  "echarts": ">=5.5.0",
77
90
  "react": ">=18.0.0",
@@ -79,6 +92,21 @@
79
92
  "react-dom": ">=18.0.0"
80
93
  },
81
94
  "peerDependenciesMeta": {
95
+ "@codemirror/lang-json": {
96
+ "optional": true
97
+ },
98
+ "@codemirror/language": {
99
+ "optional": true
100
+ },
101
+ "@codemirror/state": {
102
+ "optional": true
103
+ },
104
+ "@codemirror/view": {
105
+ "optional": true
106
+ },
107
+ "@lezer/highlight": {
108
+ "optional": true
109
+ },
82
110
  "@monaco-editor/react": {
83
111
  "optional": true
84
112
  },
@@ -87,19 +115,18 @@
87
115
  }
88
116
  },
89
117
  "dependencies": {
90
- "@codemirror/lang-json": "^6.0.2",
91
- "@codemirror/language": "^6.12.4",
92
- "@codemirror/state": "^6.7.1",
93
- "@codemirror/view": "^6.43.9",
94
118
  "@internationalized/date": "^3.10.0",
95
- "@lezer/highlight": "^1.2.3",
96
119
  "clsx": "^2.1.1",
97
- "codemirror": "^6.0.2",
98
120
  "react-grid-layout": "^1.5.3",
99
121
  "react-toastify": "^11.1.0"
100
122
  },
101
123
  "devDependencies": {
124
+ "@codemirror/lang-json": "^6.0.2",
125
+ "@codemirror/language": "^6.12.4",
126
+ "@codemirror/state": "^6.7.1",
127
+ "@codemirror/view": "^6.43.9",
102
128
  "@figma/code-connect": "^1.3.10",
129
+ "@lezer/highlight": "^1.2.3",
103
130
  "@monaco-editor/react": "^4.7.0",
104
131
  "@react-types/shared": "^3.23.0",
105
132
  "@storybook/addon-docs": "^10.3.4",
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../../../@lezer/json/dist/index.cjs"),e=require("../../language/dist/index.cjs"),n=e.LRLanguage.define({name:"json",parser:t.parser.configure({props:[e.indentNodeProp.add({Object:e.continuedIndent({except:/^\s*\}/}),Array:e.continuedIndent({except:/^\s*\]/})}),e.foldNodeProp.add({"Object Array":e.foldInside})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function o(){return new e.LanguageSupport(n)}exports.json=o;exports.jsonLanguage=n;
2
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../../node_modules/@codemirror/lang-json/dist/index.js"],"sourcesContent":["import { parser } from '@lezer/json';\nimport { LRLanguage, indentNodeProp, continuedIndent, foldNodeProp, foldInside, LanguageSupport } from '@codemirror/language';\n\n/**\nCalls\n[`JSON.parse`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)\non the document and, if that throws an error, reports it as a\nsingle diagnostic.\n*/\nconst jsonParseLinter = () => (view) => {\n try {\n JSON.parse(view.state.doc.toString());\n }\n catch (e) {\n if (!(e instanceof SyntaxError))\n throw e;\n const pos = getErrorPosition(e, view.state.doc);\n return [{\n from: pos,\n message: e.message,\n severity: 'error',\n to: pos\n }];\n }\n return [];\n};\nfunction getErrorPosition(error, doc) {\n let m;\n if (m = error.message.match(/at position (\\d+)/))\n return Math.min(+m[1], doc.length);\n if (m = error.message.match(/at line (\\d+) column (\\d+)/))\n return Math.min(doc.line(+m[1]).from + (+m[2]) - 1, doc.length);\n return 0;\n}\n\n/**\nA language provider that provides JSON parsing.\n*/\nconst jsonLanguage = /*@__PURE__*/LRLanguage.define({\n name: \"json\",\n parser: /*@__PURE__*/parser.configure({\n props: [\n /*@__PURE__*/indentNodeProp.add({\n Object: /*@__PURE__*/continuedIndent({ except: /^\\s*\\}/ }),\n Array: /*@__PURE__*/continuedIndent({ except: /^\\s*\\]/ })\n }),\n /*@__PURE__*/foldNodeProp.add({\n \"Object Array\": foldInside\n })\n ]\n }),\n languageData: {\n closeBrackets: { brackets: [\"[\", \"{\", '\"'] },\n indentOnInput: /^\\s*[\\}\\]]$/\n }\n});\n/**\nJSON language support.\n*/\nfunction json() {\n return new LanguageSupport(jsonLanguage);\n}\n\nexport { json, jsonLanguage, jsonParseLinter };\n"],"names":["jsonLanguage","LRLanguage","parser","indentNodeProp","continuedIndent","foldNodeProp","foldInside","json","LanguageSupport"],"mappings":"kLAsCMA,EAA4BC,EAAAA,WAAW,OAAO,CAChD,KAAM,OACN,OAAqBC,EAAAA,OAAO,UAAU,CAClC,MAAO,CACUC,EAAAA,eAAe,IAAI,CAC5B,OAAqBC,EAAAA,gBAAgB,CAAE,OAAQ,QAAQ,CAAE,EACzD,MAAoBA,EAAAA,gBAAgB,CAAE,OAAQ,QAAQ,CAAE,CACxE,CAAa,EACYC,EAAAA,aAAa,IAAI,CAC1B,eAAgBC,EAAAA,UAChC,CAAa,CACb,CACA,CAAK,EACD,aAAc,CACV,cAAe,CAAE,SAAU,CAAC,IAAK,IAAK,GAAG,CAAC,EAC1C,cAAe,aACvB,CACA,CAAC,EAID,SAASC,GAAO,CACZ,OAAO,IAAIC,EAAAA,gBAAgBR,CAAY,CAC3C","x_google_ignoreList":[0]}
@@ -1,28 +0,0 @@
1
- import { parser as n } from "../../../@lezer/json/dist/index.js";
2
- import { LanguageSupport as r, LRLanguage as o, indentNodeProp as a, foldNodeProp as t, continuedIndent as e, foldInside as d } from "../../language/dist/index.js";
3
- const p = /* @__PURE__ */ o.define({
4
- name: "json",
5
- parser: /* @__PURE__ */ n.configure({
6
- props: [
7
- /* @__PURE__ */ a.add({
8
- Object: /* @__PURE__ */ e({ except: /^\s*\}/ }),
9
- Array: /* @__PURE__ */ e({ except: /^\s*\]/ })
10
- }),
11
- /* @__PURE__ */ t.add({
12
- "Object Array": d
13
- })
14
- ]
15
- }),
16
- languageData: {
17
- closeBrackets: { brackets: ["[", "{", '"'] },
18
- indentOnInput: /^\s*[\}\]]$/
19
- }
20
- });
21
- function u() {
22
- return new r(p);
23
- }
24
- export {
25
- u as json,
26
- p as jsonLanguage
27
- };
28
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../node_modules/@codemirror/lang-json/dist/index.js"],"sourcesContent":["import { parser } from '@lezer/json';\nimport { LRLanguage, indentNodeProp, continuedIndent, foldNodeProp, foldInside, LanguageSupport } from '@codemirror/language';\n\n/**\nCalls\n[`JSON.parse`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)\non the document and, if that throws an error, reports it as a\nsingle diagnostic.\n*/\nconst jsonParseLinter = () => (view) => {\n try {\n JSON.parse(view.state.doc.toString());\n }\n catch (e) {\n if (!(e instanceof SyntaxError))\n throw e;\n const pos = getErrorPosition(e, view.state.doc);\n return [{\n from: pos,\n message: e.message,\n severity: 'error',\n to: pos\n }];\n }\n return [];\n};\nfunction getErrorPosition(error, doc) {\n let m;\n if (m = error.message.match(/at position (\\d+)/))\n return Math.min(+m[1], doc.length);\n if (m = error.message.match(/at line (\\d+) column (\\d+)/))\n return Math.min(doc.line(+m[1]).from + (+m[2]) - 1, doc.length);\n return 0;\n}\n\n/**\nA language provider that provides JSON parsing.\n*/\nconst jsonLanguage = /*@__PURE__*/LRLanguage.define({\n name: \"json\",\n parser: /*@__PURE__*/parser.configure({\n props: [\n /*@__PURE__*/indentNodeProp.add({\n Object: /*@__PURE__*/continuedIndent({ except: /^\\s*\\}/ }),\n Array: /*@__PURE__*/continuedIndent({ except: /^\\s*\\]/ })\n }),\n /*@__PURE__*/foldNodeProp.add({\n \"Object Array\": foldInside\n })\n ]\n }),\n languageData: {\n closeBrackets: { brackets: [\"[\", \"{\", '\"'] },\n indentOnInput: /^\\s*[\\}\\]]$/\n }\n});\n/**\nJSON language support.\n*/\nfunction json() {\n return new LanguageSupport(jsonLanguage);\n}\n\nexport { json, jsonLanguage, jsonParseLinter };\n"],"names":["jsonLanguage","LRLanguage","parser","indentNodeProp","continuedIndent","foldNodeProp","foldInside","json","LanguageSupport"],"mappings":";;AAsCK,MAACA,IAA4B,gBAAAC,EAAW,OAAO;AAAA,EAChD,MAAM;AAAA,EACN,QAAqB,gBAAAC,EAAO,UAAU;AAAA,IAClC,OAAO;AAAA,MACU,gBAAAC,EAAe,IAAI;AAAA,QAC5B,QAAqB,gBAAAC,EAAgB,EAAE,QAAQ,SAAQ,CAAE;AAAA,QACzD,OAAoB,gBAAAA,EAAgB,EAAE,QAAQ,SAAQ,CAAE;AAAA,MACxE,CAAa;AAAA,MACY,gBAAAC,EAAa,IAAI;AAAA,QAC1B,gBAAgBC;AAAA,MAChC,CAAa;AAAA,IACb;AAAA,EACA,CAAK;AAAA,EACD,cAAc;AAAA,IACV,eAAe,EAAE,UAAU,CAAC,KAAK,KAAK,GAAG,EAAC;AAAA,IAC1C,eAAe;AAAA,EACvB;AACA,CAAC;AAID,SAASC,IAAO;AACZ,SAAO,IAAIC,EAAgBR,CAAY;AAC3C;","x_google_ignoreList":[0]}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("../../../@lezer/common/dist/index.cjs"),f=require("../../state/dist/index.cjs"),h=require("../../view/dist/index.cjs"),P=require("../../../@lezer/highlight/dist/index.cjs"),H=require("../../../style-mod/src/style-mod.cjs");var E;const w=new u.NodeProp;function z(r){return f.Facet.define({combine:r?e=>e.concat(r):void 0})}const K=new u.NodeProp;class p{constructor(e,t,n=[],i=""){this.data=e,this.name=i,f.EditorState.prototype.hasOwnProperty("tree")||Object.defineProperty(f.EditorState.prototype,"tree",{get(){return g(this)}}),this.parser=t,this.extension=[m.of(this),f.EditorState.languageData.of((s,o,a)=>{let l=V(s,o,a),c=l.type.prop(w);if(!c)return[];let d=s.facet(c),k=l.type.prop(K);if(k){let C=l.resolve(o-l.from,a);for(let N of k)if(N.test(C,s)){let R=s.facet(N.facet);return N.type=="replace"?R:R.concat(d)}}return d})].concat(n)}isActiveAt(e,t,n=-1){return V(e,t,n).type.prop(w)==this.data}findRegions(e){let t=e.facet(m);if((t==null?void 0:t.data)==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let n=[],i=(s,o)=>{if(s.prop(w)==this.data){n.push({from:o,to:o+s.length});return}let a=s.prop(u.NodeProp.mounted);if(a){if(a.tree.prop(w)==this.data){if(a.overlay)for(let l of a.overlay)n.push({from:l.from+o,to:l.to+o});else n.push({from:o,to:o+s.length});return}else if(a.overlay){let l=n.length;if(i(a.tree,a.overlay[0].from+o),n.length>l)return}}for(let l=0;l<s.children.length;l++){let c=s.children[l];c instanceof u.Tree&&i(c,s.positions[l]+o)}};return i(g(e),0),n}get allowsNesting(){return!0}}p.setState=f.StateEffect.define();function V(r,e,t){let n=r.facet(m),i=g(r).topNode;if(!n||n.allowsNesting)for(let s=i;s;s=s.enter(e,t,u.IterMode.ExcludeBuffers|u.IterMode.EnterBracketed))s.type.isTop&&(i=s);return i}class S extends p{constructor(e,t,n){super(e,t,[],n),this.parser=t}static define(e){let t=z(e.languageData);return new S(t,e.parser.configure({props:[w.add(n=>n.isTop?t:void 0)]}),e.name)}configure(e,t){return new S(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function g(r){let e=r.field(p.state,!1);return e?e.tree:u.Tree.empty}class Q{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let n=this.cursorPos-this.string.length;return e<n||t>=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-n,t-n)}}let v=null;class b{constructor(e,t,n=[],i,s,o,a,l){this.parser=e,this.state=t,this.fragments=n,this.tree=i,this.treeLen=s,this.viewport=o,this.skipped=a,this.scheduleOn=l,this.parse=null,this.tempSkipped=[]}static create(e,t,n){return new b(e,t,[],u.Tree.empty,0,n,[],null)}startParse(){return this.parser.startParse(new Q(this.state.doc),this.fragments)}work(e,t){return t!=null&&t>=this.state.doc.length&&(t=void 0),this.tree!=u.Tree.empty&&this.isDone(t??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var n;if(typeof e=="number"){let i=Date.now()+e;e=()=>Date.now()>i}for(this.parse||(this.parse=this.startParse()),t!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&t<this.state.doc.length&&this.parse.stopAt(t);;){let i=this.parse.advance();if(i)if(this.fragments=this.withoutTempSkipped(u.TreeFragment.addTree(i,this.fragments,this.parse.stoppedAt!=null)),this.treeLen=(n=this.parse.stoppedAt)!==null&&n!==void 0?n:this.state.doc.length,this.tree=i,this.parse=null,this.treeLen<(t??this.state.doc.length))this.parse=this.startParse();else return!0;if(e())return!1}})}takeTree(){let e,t;this.parse&&(e=this.parse.parsedPos)>=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(t=this.parse.advance()););}),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(u.TreeFragment.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=v;v=this;try{return e()}finally{v=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=q(e,t.from,t.to);return e}changes(e,t){let{fragments:n,tree:i,treeLen:s,viewport:o,skipped:a}=this;if(this.takeTree(),!e.empty){let l=[];if(e.iterChangedRanges((c,d,k,C)=>l.push({fromA:c,toA:d,fromB:k,toB:C})),n=u.TreeFragment.applyChanges(n,l),i=u.Tree.empty,s=0,o={from:e.mapPos(o.from,-1),to:e.mapPos(o.to,1)},this.skipped.length){a=[];for(let c of this.skipped){let d=e.mapPos(c.from,1),k=e.mapPos(c.to,-1);d<k&&a.push({from:d,to:k})}}}return new b(this.parser,t,n,i,s,o,a,this.scheduleOn)}updateViewport(e){if(this.viewport.from==e.from&&this.viewport.to==e.to)return!1;this.viewport=e;let t=this.skipped.length;for(let n=0;n<this.skipped.length;n++){let{from:i,to:s}=this.skipped[n];i<e.to&&s>e.from&&(this.fragments=q(this.fragments,i,s),this.skipped.splice(n--,1))}return this.skipped.length>=t?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends u.Parser{createParse(t,n,i){let s=i[0].from,o=i[i.length-1].to;return{parsedPos:s,advance(){let l=v;if(l){for(let c of i)l.tempSkipped.push(c);e&&(l.scheduleOn=l.scheduleOn?Promise.all([l.scheduleOn,e]):e)}return this.parsedPos=o,new u.Tree(u.NodeType.none,[],[],o-s)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&t[0].from==0&&t[0].to>=e}static get(){return v}}function q(r,e,t){return u.TreeFragment.applyChanges(r,[{fromA:e,toA:t,fromB:e,toB:t}])}class y{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),n=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,n)||t.takeTree(),new y(t)}static init(e){let t=Math.min(3e3,e.doc.length),n=b.create(e.facet(m).parser,e,{from:0,to:t});return n.work(20,t)||n.takeTree(),new y(n)}}p.state=f.StateField.define({create:y.init,update(r,e){for(let t of e.effects)if(t.is(p.setState))return t.value;return e.startState.facet(m)!=e.state.facet(m)?y.init(e.state):r.apply(e)}});let X=r=>{let e=setTimeout(()=>r(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(X=r=>{let e=-1,t=setTimeout(()=>{e=requestIdleCallback(r,{timeout:400})},100);return()=>e<0?clearTimeout(t):cancelIdleCallback(e)});const O=typeof navigator<"u"&&(!((E=navigator.scheduling)===null||E===void 0)&&E.isInputPending)?()=>navigator.scheduling.isInputPending():null,ne=h.ViewPlugin.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(p.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(p.state);(t.tree!=t.context.tree||!t.context.isDone(e.doc.length))&&(this.working=X(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEnd<t&&(this.chunkEnd<0||this.view.hasFocus)&&(this.chunkEnd=t+3e4,this.chunkBudget=3e3),this.chunkBudget<=0)return;let{state:n,viewport:{to:i}}=this.view,s=n.field(p.state);if(s.tree==s.context.tree&&s.context.isDone(i+1e5))return;let o=Date.now()+Math.min(this.chunkBudget,100,e&&!O?Math.max(25,e.timeRemaining()-5):1e9),a=s.context.treeLen<i&&n.doc.length>i+1e3,l=s.context.work(()=>O&&O()||Date.now()>o,i+(a?0:1e5));this.chunkBudget-=Date.now()-t,(l||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:p.setState.of(new y(s.context))})),this.chunkBudget>0&&!(l&&!a)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(t=>h.logException(this.view.state,t)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),m=f.Facet.define({combine(r){return r.length?r[0]:null},enables:r=>[p.state,ne,h.EditorView.contentAttributes.compute([r],e=>{let t=e.facet(r);return t&&t.name?{"data-language":t.name}:{}})]});class ie{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}}const se=new u.NodeProp;function oe({except:r,units:e=1}={}){return t=>{let n=r&&r.test(t.textAfter);return t.baseIndent+(n?0:e*t.unit)}}const Y=f.Facet.define(),Z=new u.NodeProp;function ae(r){let e=r.firstChild,t=r.lastChild;return e&&e.to<t.from?{from:e.to,to:t.type.isError?r.to:t.from}:null}function le(r,e,t){let n=g(r);if(n.length<t)return null;let i=n.resolveStack(t,1),s=null;for(let o=i;o;o=o.next){let a=o.node;if(a.to<=t||a.from>t)continue;if(s&&a.from<e)break;let l=a.type.prop(Z);if(l&&(a.to<n.length-50||n.length==r.doc.length||!ce(a))){let c=l(a,r);c&&c.from<=t&&c.from>=e&&c.to>t&&(s=c)}}return s}function ce(r){let e=r.lastChild;return e&&e.to==r.to&&e.type.isError}function I(r,e,t){for(let n of r.facet(Y)){let i=n(r,e,t);if(i)return i}return le(r,e,t)}function _(r,e){let t=e.mapPos(r.from,1),n=e.mapPos(r.to,-1);return t>=n?void 0:{from:t,to:n}}const W=f.StateEffect.define({map:_}),x=f.StateEffect.define({map:_}),T=f.StateField.define({create(){return h.Decoration.none},update(r,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((n,i)=>r=j(r,n,i)),r=r.map(e.changes);let t=[];for(let n of e.effects)n.is(W)&&!he(r,n.value.from,n.value.to)?t.push(n.value):n.is(x)&&(r=r.update({filter:(i,s)=>n.value.from!=i||n.value.to!=s,filterFrom:n.value.from,filterTo:n.value.to}));if(t.length){let{preparePlaceholder:n}=e.state.facet(ee),i=t.map(s=>(n?h.Decoration.replace({widget:new de(n(e.state,s))}):$).range(s.from,s.to));r=r.update({add:i})}return e.selection&&(r=j(r,e.selection.main.head)),r},provide:r=>h.EditorView.decorations.from(r),toJSON(r,e){let t=[];return r.between(0,e.doc.length,(n,i)=>{t.push(n,i)}),t},fromJSON(r){if(!Array.isArray(r)||r.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let t=0;t<r.length;){let n=r[t++],i=r[t++];if(typeof n!="number"||typeof i!="number")throw new RangeError("Invalid JSON for fold state");e.push($.range(n,i))}return h.Decoration.set(e,!0)}});function j(r,e,t=e){let n=!1;return r.between(e,t,(i,s)=>{i<t&&s>e&&(n=!0)}),n?r.update({filterFrom:e,filterTo:t,filter:(i,s)=>i>=t||s<=e}):r}function L(r,e,t){var n;let i=null;return(n=r.field(T,!1))===null||n===void 0||n.between(e,t,(s,o)=>{(!i||i.from>s)&&(i={from:s,to:o})}),i}function he(r,e,t){let n=!1;return r.between(e,e,(i,s)=>{i==e&&s==t&&(n=!0)}),n}const ue=r=>{let e=r.state.field(T,!1);if(!e||!e.size)return!1;let t=[];return e.between(0,r.state.doc.length,(n,i)=>{t.push(x.of({from:n,to:i}))}),r.dispatch({effects:t}),!0},fe={placeholderDOM:null,preparePlaceholder:null,placeholderText:"…"},ee=f.Facet.define({combine(r){return f.combineConfig(r,fe)}});function te(r){return[T,me]}function re(r,e){let{state:t}=r,n=t.facet(ee),i=o=>{let a=r.lineBlockAt(r.posAtDOM(o.target)),l=L(r.state,a.from,a.to);l&&r.dispatch({effects:x.of(l)}),o.preventDefault()};if(n.placeholderDOM)return n.placeholderDOM(r,i,e);let s=document.createElement("span");return s.textContent=n.placeholderText,s.setAttribute("aria-label",t.phrase("folded code")),s.title=t.phrase("unfold"),s.className="cm-foldPlaceholder",s.onclick=i,s}const $=h.Decoration.replace({widget:new class extends h.WidgetType{toDOM(r){return re(r,null)}}});class de extends h.WidgetType{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return re(e,this.value)}}const pe={openText:"⌄",closedText:"›",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class F extends h.GutterMarker{constructor(e,t){super(),this.config=e,this.open=t}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let t=document.createElement("span");return t.textContent=this.open?this.config.openText:this.config.closedText,t.title=e.state.phrase(this.open?"Fold line":"Unfold line"),t}}function ge(r={}){let e={...pe,...r},t=new F(e,!0),n=new F(e,!1),i=h.ViewPlugin.fromClass(class{constructor(o){this.from=o.viewport.from,this.markers=this.buildMarkers(o)}update(o){(o.docChanged||o.viewportChanged||o.startState.facet(m)!=o.state.facet(m)||o.startState.field(T,!1)!=o.state.field(T,!1)||g(o.startState)!=g(o.state)||e.foldingChanged(o))&&(this.markers=this.buildMarkers(o.view))}buildMarkers(o){let a=new f.RangeSetBuilder;for(let l of o.viewportLineBlocks){let c=L(o.state,l.from,l.to)?n:I(o.state,l.from,l.to)?t:null;c&&a.add(l.from,l.from,c)}return a.finish()}}),{domEventHandlers:s}=e;return[i,h.gutter({class:"cm-foldGutter",markers(o){var a;return((a=o.plugin(i))===null||a===void 0?void 0:a.markers)||f.RangeSet.empty},initialSpacer(){return new F(e,!1)},domEventHandlers:{...s,click:(o,a,l)=>{if(s.click&&s.click(o,a,l))return!0;let c=L(o.state,a.from,a.to);if(c)return o.dispatch({effects:x.of(c)}),!0;let d=I(o.state,a.from,a.to);return d?(o.dispatch({effects:W.of(d)}),!0):!1}}}),te()]}const me=h.EditorView.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class D{constructor(e,t){this.specs=e;let n;function i(a){let l=H.StyleModule.newName();return(n||(n=Object.create(null)))["."+l]=a,l}const s=typeof t.all=="string"?t.all:t.all?i(t.all):void 0,o=t.scope;this.scope=o instanceof p?a=>a.prop(w)==o.data:o?a=>a==o:void 0,this.style=P.tagHighlighter(e.map(a=>({tag:a.tag,class:a.class||i(Object.assign({},a,{tag:null}))})),{all:s}).style,this.module=n?new H.StyleModule(n):null,this.themeType=t.themeType}static define(e,t){return new D(e,t||{})}}const B=f.Facet.define(),ke=f.Facet.define({combine(r){return r.length?[r[0]]:null}});function A(r){let e=r.facet(B);return e.length?e:r.facet(ke)}function we(r,e){let t=[Te],n;return r instanceof D&&(r.module&&t.push(h.EditorView.styleModule.of(r.module)),n=r.themeType),n?t.push(B.computeN([h.EditorView.darkTheme],i=>i.facet(h.EditorView.darkTheme)==(n=="dark")?[r]:[])):t.push(B.of(r)),t}class ye{constructor(e){this.markCache=Object.create(null),this.tree=g(e.state),this.decorations=this.buildDeco(e,A(e.state)),this.decoratedTo=e.viewport.to}update(e){let t=g(e.state),n=A(e.state),i=n!=A(e.startState),{viewport:s}=e.view,o=e.changes.mapPos(this.decoratedTo,1);t.length<s.to&&!i&&t.type==this.tree.type&&o>=s.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=o):(t!=this.tree||e.viewportChanged||i)&&(this.tree=t,this.decorations=this.buildDeco(e.view,n),this.decoratedTo=s.to)}buildDeco(e,t){if(!t||!this.tree.length)return h.Decoration.none;let n=new f.RangeSetBuilder;for(let{from:i,to:s}of e.visibleRanges)P.highlightTree(this.tree,t,(o,a,l)=>{n.add(o,a,this.markCache[l]||(this.markCache[l]=h.Decoration.mark({class:l})))},i,s);return n.finish()}}const Te=f.Prec.high(h.ViewPlugin.fromClass(ye,{decorations:r=>r.decorations})),ve=Object.create(null),G=[u.NodeType.none],U=[],J=Object.create(null),be=Object.create(null);for(let[r,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])be[r]=xe(ve,e);function M(r,e){U.indexOf(r)>-1||(U.push(r),console.warn(e))}function xe(r,e){let t=[];for(let a of e.split(" ")){let l=[];for(let c of a.split(".")){let d=r[c]||P.tags[c];d?typeof d=="function"?l.length?l=l.map(d):M(c,`Modifier ${c} used at start of tag`):l.length?M(c,`Tag ${c} used as modifier`):l=Array.isArray(d)?d:[d]:M(c,`Unknown highlighting tag ${c}`)}for(let c of l)t.push(c)}if(!t.length)return 0;let n=e.replace(/ /g,"_"),i=n+" "+t.map(a=>a.id),s=J[i];if(s)return s.id;let o=J[i]=u.NodeType.define({id:G.length,name:n,props:[P.styleTags({[n]:t})]});return G.push(o),o.id}h.Direction.RTL,h.Direction.LTR;exports.DocInput=Q;exports.HighlightStyle=D;exports.LRLanguage=S;exports.Language=p;exports.LanguageSupport=ie;exports.ParseContext=b;exports.codeFolding=te;exports.continuedIndent=oe;exports.defineLanguageFacet=z;exports.foldEffect=W;exports.foldGutter=ge;exports.foldInside=ae;exports.foldNodeProp=Z;exports.foldService=Y;exports.foldState=T;exports.foldable=I;exports.indentNodeProp=se;exports.language=m;exports.languageDataProp=w;exports.sublanguageProp=K;exports.syntaxHighlighting=we;exports.syntaxTree=g;exports.unfoldAll=ue;exports.unfoldEffect=x;
2
- //# sourceMappingURL=index.cjs.map