@mastra/playground-ui 31.0.0-alpha.3 → 31.0.0-alpha.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 31.0.0-alpha.5
4
+
5
+ ### Patch Changes
6
+
7
+ - Improved studio load time by only bundling the CodeMirror and Shiki languages the editor actually uses, and removed a redundant TypeScript pass from the playground-ui build. ([#17406](https://github.com/mastra-ai/mastra/pull/17406))
8
+
9
+ - Improved RadioGroup styling with neutral selected states, cleaner focus outlines, and surface-aware disabled states. ([#17401](https://github.com/mastra-ai/mastra/pull/17401))
10
+
11
+ - Removed the unused `ElementSelect` export from `@mastra/playground-ui`. Use the `Select` primitives instead. ([#17417](https://github.com/mastra-ai/mastra/pull/17417))
12
+
13
+ ```tsx
14
+ // Before
15
+ import { ElementSelect } from '@mastra/playground-ui';
16
+
17
+ <ElementSelect name="status" value={status} onChange={setStatus} options={['Draft', 'Published']} />;
18
+
19
+ // After
20
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@mastra/playground-ui';
21
+
22
+ <Select name="status" value={status} onValueChange={setStatus}>
23
+ <SelectTrigger>
24
+ <SelectValue placeholder="Select..." />
25
+ </SelectTrigger>
26
+ <SelectContent>
27
+ <SelectItem value="draft">Draft</SelectItem>
28
+ <SelectItem value="published">Published</SelectItem>
29
+ </SelectContent>
30
+ </Select>;
31
+ ```
32
+
33
+ - Improved Checkbox styling with neutral selected states, cleaner focus outlines, and smoother state transitions. ([#17400](https://github.com/mastra-ai/mastra/pull/17400))
34
+
35
+ - Updated dependencies [[`a18775a`](https://github.com/mastra-ai/mastra/commit/a18775a693172546ee2378d39b67d4e32895b251), [`1baf2d1`](https://github.com/mastra-ai/mastra/commit/1baf2d152c6881338ff8f114633d5316fe13dd15), [`309f7c9`](https://github.com/mastra-ai/mastra/commit/309f7c9899ee6870a07a16690a091c6ba7af4e1e), [`66d65f5`](https://github.com/mastra-ai/mastra/commit/66d65f58e4b1f862c7f7928866a4426f8de9d583)]:
36
+ - @mastra/core@1.38.0-alpha.5
37
+ - @mastra/client-js@1.22.0-alpha.5
38
+ - @mastra/react@0.4.3-alpha.5
39
+
40
+ ## 31.0.0-alpha.4
41
+
42
+ ### Patch Changes
43
+
44
+ - Updated dependencies [[`50ed00c`](https://github.com/mastra-ai/mastra/commit/50ed00caa914a85969b33de83f26b48e328ef641), [`9283971`](https://github.com/mastra-ai/mastra/commit/928397157009b4aef4d5fdf3a0a273cb371beb55), [`0bf2d93`](https://github.com/mastra-ai/mastra/commit/0bf2d932d20e2936f2d9abb8c0a86e24fbc97ec6), [`94dfef6`](https://github.com/mastra-ai/mastra/commit/94dfef6e2bf19a88467ea3940afcbce88a433f0f), [`a122f79`](https://github.com/mastra-ai/mastra/commit/a122f79427ae225ec79c7b2ed46278da48d04b17), [`4c02027`](https://github.com/mastra-ai/mastra/commit/4c020277235eaa6b1dc957c90ad0639eef213992), [`6855012`](https://github.com/mastra-ai/mastra/commit/685501247cc4717506f3e89beed03509d63a5370), [`7fef31c`](https://github.com/mastra-ai/mastra/commit/7fef31c0d2a6d362a43a647a8a4f6ab893758a23), [`7fef31c`](https://github.com/mastra-ai/mastra/commit/7fef31c0d2a6d362a43a647a8a4f6ab893758a23), [`7fef31c`](https://github.com/mastra-ai/mastra/commit/7fef31c0d2a6d362a43a647a8a4f6ab893758a23)]:
45
+ - @mastra/core@1.38.0-alpha.4
46
+ - @mastra/client-js@1.22.0-alpha.4
47
+ - @mastra/react@0.4.3-alpha.4
48
+
3
49
  ## 31.0.0-alpha.3
4
50
 
5
51
  ### Minor Changes
package/dist/index.cjs.js CHANGED
@@ -9,7 +9,6 @@ const tooltip = require('@base-ui/react/tooltip');
9
9
  const langJson = require('@codemirror/lang-json');
10
10
  const langMarkdown = require('@codemirror/lang-markdown');
11
11
  const language = require('@codemirror/language');
12
- const languageData = require('@codemirror/language-data');
13
12
  const state = require('@codemirror/state');
14
13
  const view = require('@codemirror/view');
15
14
  const highlight$1 = require('@lezer/highlight');
@@ -3745,6 +3744,66 @@ const Button = React.forwardRef(
3745
3744
  );
3746
3745
  Button.displayName = "Button";
3747
3746
 
3747
+ function legacy(parser) {
3748
+ return new language.LanguageSupport(language.StreamLanguage.define(parser));
3749
+ }
3750
+ const codeLanguages = [
3751
+ language.LanguageDescription.of({
3752
+ name: "JavaScript",
3753
+ alias: ["ecmascript", "js", "node"],
3754
+ extensions: ["js", "mjs", "cjs"],
3755
+ load() {
3756
+ return import('@codemirror/lang-javascript').then((m) => m.javascript());
3757
+ }
3758
+ }),
3759
+ language.LanguageDescription.of({
3760
+ name: "JSON",
3761
+ alias: ["json5"],
3762
+ extensions: ["json", "map"],
3763
+ load() {
3764
+ return import('@codemirror/lang-json').then((m) => m.json());
3765
+ }
3766
+ }),
3767
+ language.LanguageDescription.of({
3768
+ name: "JSX",
3769
+ extensions: ["jsx"],
3770
+ load() {
3771
+ return import('@codemirror/lang-javascript').then((m) => m.javascript({ jsx: true }));
3772
+ }
3773
+ }),
3774
+ language.LanguageDescription.of({
3775
+ name: "Markdown",
3776
+ extensions: ["md", "markdown", "mkd"],
3777
+ load() {
3778
+ return import('@codemirror/lang-markdown').then((m) => m.markdown());
3779
+ }
3780
+ }),
3781
+ language.LanguageDescription.of({
3782
+ name: "TSX",
3783
+ extensions: ["tsx"],
3784
+ load() {
3785
+ return import('@codemirror/lang-javascript').then((m) => m.javascript({ jsx: true, typescript: true }));
3786
+ }
3787
+ }),
3788
+ language.LanguageDescription.of({
3789
+ name: "TypeScript",
3790
+ alias: ["ts"],
3791
+ extensions: ["ts", "mts", "cts"],
3792
+ load() {
3793
+ return import('@codemirror/lang-javascript').then((m) => m.javascript({ typescript: true }));
3794
+ }
3795
+ }),
3796
+ language.LanguageDescription.of({
3797
+ name: "Shell",
3798
+ alias: ["bash", "sh", "zsh"],
3799
+ extensions: ["sh", "ksh", "bash"],
3800
+ filename: /^PKGBUILD$/,
3801
+ load() {
3802
+ return import('@codemirror/legacy-modes/mode/shell').then((m) => legacy(m.shell));
3803
+ }
3804
+ })
3805
+ ];
3806
+
3748
3807
  function flattenSchemaToVariables(schema, maxDepth = 5) {
3749
3808
  if (!schema?.properties) {
3750
3809
  return [];
@@ -4273,7 +4332,7 @@ const CodeEditor = React.forwardRef(
4273
4332
  if (language === "json") {
4274
4333
  exts.push(langJson.jsonLanguage);
4275
4334
  } else if (language === "markdown") {
4276
- exts.push(langMarkdown.markdown({ base: langMarkdown.markdownLanguage, codeLanguages: languageData.languages }));
4335
+ exts.push(langMarkdown.markdown({ base: langMarkdown.markdownLanguage, codeLanguages }));
4277
4336
  exts.push(view.EditorView.lineWrapping);
4278
4337
  }
4279
4338
  if (highlightVariables && language === "markdown") {
@@ -4316,11 +4375,59 @@ const CodeEditor = React.forwardRef(
4316
4375
  );
4317
4376
  }
4318
4377
  );
4378
+
4379
+ const langAliases = {
4380
+ js: "javascript",
4381
+ javascript: "javascript",
4382
+ mjs: "javascript",
4383
+ cjs: "javascript",
4384
+ node: "javascript",
4385
+ ts: "typescript",
4386
+ typescript: "typescript",
4387
+ mts: "typescript",
4388
+ cts: "typescript",
4389
+ tsx: "tsx",
4390
+ jsx: "jsx",
4391
+ json: "json",
4392
+ json5: "json",
4393
+ md: "markdown",
4394
+ markdown: "markdown",
4395
+ sh: "bash",
4396
+ bash: "bash",
4397
+ shell: "bash",
4398
+ zsh: "bash"
4399
+ };
4400
+ let highlighterPromise = null;
4401
+ function getHighlighter() {
4402
+ if (!highlighterPromise) {
4403
+ highlighterPromise = (async () => {
4404
+ const [{ createHighlighterCore }, { createJavaScriptRegexEngine }] = await Promise.all([
4405
+ import('shiki/core'),
4406
+ import('shiki/engine/javascript')
4407
+ ]);
4408
+ return createHighlighterCore({
4409
+ themes: [import('shiki/themes/github-light.mjs'), import('shiki/themes/github-dark.mjs')],
4410
+ langs: [
4411
+ import('shiki/langs/javascript.mjs'),
4412
+ import('shiki/langs/typescript.mjs'),
4413
+ import('shiki/langs/tsx.mjs'),
4414
+ import('shiki/langs/jsx.mjs'),
4415
+ import('shiki/langs/json.mjs'),
4416
+ import('shiki/langs/bash.mjs'),
4417
+ import('shiki/langs/markdown.mjs')
4418
+ ],
4419
+ engine: createJavaScriptRegexEngine()
4420
+ });
4421
+ })();
4422
+ }
4423
+ return highlighterPromise;
4424
+ }
4319
4425
  async function highlight(code, language) {
4320
- const { codeToTokens, bundledLanguages } = await import('shiki');
4321
- if (!(language in bundledLanguages)) return null;
4322
- const { tokens } = await codeToTokens(code, {
4323
- lang: language,
4426
+ const lang = langAliases[language?.toLowerCase()];
4427
+ if (!lang) return null;
4428
+ const highlighter = await getHighlighter();
4429
+ const { tokens } = highlighter.codeToTokens(code, {
4430
+ lang,
4324
4431
  defaultColor: false,
4325
4432
  themes: {
4326
4433
  light: "github-light",
@@ -6173,28 +6280,38 @@ const Checkbox = React__namespace.forwardRef(
6173
6280
  ref,
6174
6281
  checked: isCheckedIndeterminate ? false : checked,
6175
6282
  indeterminate: indeterminate ?? isCheckedIndeterminate,
6283
+ "data-slot": "checkbox",
6176
6284
  className: cn(
6177
- "peer h-4 w-4 shrink-0 rounded-sm border border-neutral3",
6178
- "flex items-center justify-center",
6179
- "shadow-sm",
6285
+ "peer flex h-4 w-4 shrink-0 cursor-pointer items-center justify-center rounded-[0.3125rem]",
6286
+ "border border-neutral6/[0.06] bg-neutral6/[0.12] text-surface1 outline-hidden",
6180
6287
  transitions.all,
6181
- "hover:border-neutral5 hover:shadow-md",
6182
- formElementFocus,
6183
- // Base UI's Checkbox.Root is a `<span>`, so `:disabled` never matches — target `data-disabled`.
6184
- "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:hover:border-neutral3 data-[disabled]:hover:shadow-sm",
6185
- "data-[checked]:bg-accent1 data-[checked]:border-accent1 data-[checked]:text-surface1",
6186
- "data-[indeterminate]:bg-accent1 data-[indeterminate]:border-accent1 data-[indeterminate]:text-surface1",
6187
- "data-[checked]:shadow-glow-accent1 data-[indeterminate]:shadow-glow-accent1",
6288
+ "hover:border-neutral6/[0.12] hover:bg-neutral6/[0.16]",
6289
+ "active:scale-95 active:border-neutral6/[0.18] active:bg-neutral6/[0.18]",
6290
+ "focus-visible:border-neutral5/50 focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2 focus-visible:outline-neutral5/55",
6291
+ "data-[checked]:border-neutral6 data-[checked]:bg-neutral6 data-[checked]:text-surface1",
6292
+ "data-[indeterminate]:border-neutral6 data-[indeterminate]:bg-neutral6 data-[indeterminate]:text-surface1",
6293
+ "data-[checked]:hover:border-neutral5 data-[checked]:hover:bg-neutral5",
6294
+ "data-[indeterminate]:hover:border-neutral5 data-[indeterminate]:hover:bg-neutral5",
6295
+ "data-[checked]:active:border-neutral4 data-[checked]:active:bg-neutral4",
6296
+ "data-[indeterminate]:active:border-neutral4 data-[indeterminate]:active:bg-neutral4",
6297
+ // Base UI's Checkbox.Root is a `<span>`, so `:disabled` never matches; target `data-disabled`.
6298
+ "data-[disabled]:cursor-not-allowed data-[disabled]:border-neutral6/[0.38] data-[disabled]:bg-neutral6/[0.38] data-[disabled]:hover:border-neutral6/[0.38] data-[disabled]:hover:bg-neutral6/[0.38] data-[disabled]:active:scale-100",
6299
+ "data-[disabled]:data-[checked]:border-neutral6/[0.38] data-[disabled]:data-[checked]:bg-neutral6/[0.38] data-[disabled]:data-[checked]:text-neutral6",
6300
+ "data-[disabled]:data-[indeterminate]:border-neutral6/[0.38] data-[disabled]:data-[indeterminate]:bg-neutral6/[0.38] data-[disabled]:data-[indeterminate]:text-neutral6",
6188
6301
  className
6189
6302
  ),
6190
6303
  ...props,
6191
6304
  children: /* @__PURE__ */ jsxRuntime.jsx(
6192
6305
  checkbox.Checkbox.Indicator,
6193
6306
  {
6307
+ keepMounted: true,
6194
6308
  className: cn(
6195
6309
  "group/checkbox-indicator flex items-center justify-center text-current",
6196
- "data-[checked]:animate-in data-[checked]:zoom-in-50 data-[checked]:duration-150",
6197
- "data-[indeterminate]:animate-in data-[indeterminate]:zoom-in-50 data-[indeterminate]:duration-150"
6310
+ "opacity-0 scale-75 transition-[opacity,transform] duration-200 ease-out-custom",
6311
+ "data-[checked]:opacity-100 data-[checked]:scale-100",
6312
+ "data-[indeterminate]:opacity-100 data-[indeterminate]:scale-100",
6313
+ "data-[starting-style]:opacity-0 data-[starting-style]:scale-75",
6314
+ "data-[ending-style]:opacity-0 data-[ending-style]:scale-75"
6198
6315
  ),
6199
6316
  children: /* @__PURE__ */ jsxRuntime.jsx(CheckboxIndicatorIcon, {})
6200
6317
  }
@@ -6206,8 +6323,30 @@ const Checkbox = React__namespace.forwardRef(
6206
6323
  Checkbox.displayName = "Checkbox";
6207
6324
  function CheckboxIndicatorIcon() {
6208
6325
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6209
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3.5 w-3.5 stroke-3 group-data-[indeterminate]/checkbox-indicator:hidden" }),
6210
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { className: "hidden h-3.5 w-3.5 stroke-3 group-data-[indeterminate]/checkbox-indicator:block" })
6326
+ /* @__PURE__ */ jsxRuntime.jsx(
6327
+ lucideReact.Check,
6328
+ {
6329
+ className: cn(
6330
+ "size-3 scale-95 stroke-[3.25] transition-[stroke-dashoffset,transform] duration-200 ease-out-custom",
6331
+ // Lucide's check path is ~22.6 units long. Use a longer dash so the
6332
+ // final checked mark is never clipped.
6333
+ "[stroke-dasharray:28] [stroke-dashoffset:28]",
6334
+ "group-data-[checked]/checkbox-indicator:[stroke-dashoffset:0]",
6335
+ "group-data-[checked]/checkbox-indicator:scale-100",
6336
+ "group-data-[indeterminate]/checkbox-indicator:hidden"
6337
+ )
6338
+ }
6339
+ ),
6340
+ /* @__PURE__ */ jsxRuntime.jsx(
6341
+ lucideReact.Minus,
6342
+ {
6343
+ className: cn(
6344
+ "hidden size-3 scale-95 stroke-[3.25] transition-transform duration-200 ease-out-custom",
6345
+ "group-data-[indeterminate]/checkbox-indicator:block",
6346
+ "group-data-[indeterminate]/checkbox-indicator:scale-100"
6347
+ )
6348
+ }
6349
+ )
6211
6350
  ] });
6212
6351
  }
6213
6352
 
@@ -8732,7 +8871,7 @@ const ButtonsGroupText = React__namespace.forwardRef(
8732
8871
  ButtonsGroupText.displayName = "ButtonsGroupText";
8733
8872
 
8734
8873
  const RadioGroup = React__namespace.forwardRef(({ className, ...props }, ref) => {
8735
- return /* @__PURE__ */ jsxRuntime.jsx(radioGroup.RadioGroup, { ref, className: cn("grid gap-2", className), ...props });
8874
+ return /* @__PURE__ */ jsxRuntime.jsx(radioGroup.RadioGroup, { ref, "data-slot": "radio-group", className: cn("grid gap-2", className), ...props });
8736
8875
  });
8737
8876
  RadioGroup.displayName = "RadioGroup";
8738
8877
  const RadioGroupItem = React__namespace.forwardRef(({ className, ...props }, ref) => {
@@ -8740,31 +8879,36 @@ const RadioGroupItem = React__namespace.forwardRef(({ className, ...props }, ref
8740
8879
  radio.Radio.Root,
8741
8880
  {
8742
8881
  ref,
8882
+ "data-slot": "radio-group-item",
8743
8883
  className: cn(
8744
- // Base UI's Radio.Root renders a `<span>` (inline) — unlike Radix's
8745
- // `<button>`. `flex` + `shrink-0` make the sizing/centering classes
8746
- // take effect and keep the control square inside flex rows.
8747
- "flex shrink-0 items-center justify-center",
8748
- "aspect-square h-4 w-4 rounded-full border border-neutral3 text-neutral6",
8749
- "shadow-sm",
8884
+ "flex h-4 w-4 shrink-0 cursor-pointer items-center justify-center rounded-full",
8885
+ "border border-neutral6/[0.06] bg-neutral6/[0.12] text-surface1 outline-hidden",
8750
8886
  transitions.all,
8751
- "hover:border-neutral5 hover:shadow-md",
8752
- formElementFocus,
8753
- // Base UI's Radio.Root is a `<span>`, so `:disabled` never matches — target `data-disabled`.
8754
- "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:hover:border-neutral3 data-[disabled]:hover:shadow-sm",
8887
+ "hover:border-neutral6/[0.12] hover:bg-neutral6/[0.16]",
8888
+ "active:scale-95 active:border-neutral6/[0.18] active:bg-neutral6/[0.18]",
8889
+ "focus-visible:border-neutral5/50 focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2 focus-visible:outline-neutral5/55",
8755
8890
  // Base UI exposes `data-checked`/`data-unchecked` instead of Radix's `data-state`.
8756
- "data-[checked]:border-accent1 data-[checked]:shadow-glow-accent1",
8891
+ "data-[checked]:border-neutral6 data-[checked]:bg-neutral6 data-[checked]:text-surface1",
8892
+ "data-[checked]:hover:border-neutral5 data-[checked]:hover:bg-neutral5",
8893
+ "data-[checked]:active:border-neutral4 data-[checked]:active:bg-neutral4",
8894
+ // Base UI's Radio.Root is a `<span>`, so `:disabled` never matches; target `data-disabled`.
8895
+ "data-[disabled]:cursor-not-allowed data-[disabled]:border-neutral6/[0.38] data-[disabled]:bg-neutral6/[0.38] data-[disabled]:hover:border-neutral6/[0.38] data-[disabled]:hover:bg-neutral6/[0.38] data-[disabled]:active:scale-100",
8896
+ "data-[disabled]:data-[checked]:border-neutral6/[0.38] data-[disabled]:data-[checked]:bg-neutral6/[0.38] data-[disabled]:data-[checked]:text-neutral6",
8757
8897
  className
8758
8898
  ),
8759
8899
  ...props,
8760
8900
  children: /* @__PURE__ */ jsxRuntime.jsx(
8761
8901
  radio.Radio.Indicator,
8762
8902
  {
8903
+ keepMounted: true,
8763
8904
  className: cn(
8764
- "flex items-center justify-center",
8765
- "data-[checked]:animate-in data-[checked]:zoom-in-50 data-[checked]:duration-150"
8905
+ "flex items-center justify-center text-current",
8906
+ "scale-50 opacity-0 transition-[opacity,scale] duration-200 ease-out-custom",
8907
+ "data-[checked]:scale-100 data-[checked]:opacity-100",
8908
+ "data-[starting-style]:scale-50 data-[starting-style]:opacity-0",
8909
+ "data-[ending-style]:scale-50 data-[ending-style]:opacity-0"
8766
8910
  ),
8767
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Circle, { className: "h-2 w-2 fill-accent1 text-accent1" })
8911
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-1.5 rounded-full bg-current" })
8768
8912
  }
8769
8913
  )
8770
8914
  }
@@ -11925,13 +12069,6 @@ function SectionCard({
11925
12069
  );
11926
12070
  }
11927
12071
 
11928
- function ElementSelect({ name, onChange, value, options, placeholder }) {
11929
- return /* @__PURE__ */ jsxRuntime.jsxs(Select, { name, onValueChange: onChange, value, children: [
11930
- /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, { placeholder: placeholder || "Select..." }) }),
11931
- /* @__PURE__ */ jsxRuntime.jsx(SelectContent, { children: (options || []).map((option, idx) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: `${idx}`, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2 [&>svg]:w-[1.2em] [&>svg]:h-[1.2em] [&>svg]:text-neutral3", children: option }) }, option)) })
11932
- ] });
11933
- }
11934
-
11935
12072
  function SettingsRow({ label, description, htmlFor, className, children }) {
11936
12073
  return /* @__PURE__ */ jsxRuntime.jsxs(
11937
12074
  "div",
@@ -22403,7 +22540,6 @@ exports.DrawerTrigger = DrawerTrigger;
22403
22540
  exports.DrawerViewport = DrawerViewport;
22404
22541
  exports.DropdownMenu = DropdownMenu;
22405
22542
  exports.EXTENSION_TO_MIME = EXTENSION_TO_MIME;
22406
- exports.ElementSelect = ElementSelect;
22407
22543
  exports.EmptyState = EmptyState;
22408
22544
  exports.Entity = Entity;
22409
22545
  exports.EntityContent = EntityContent;
@@ -22668,6 +22804,7 @@ exports.clearSavedLogsFilters = clearSavedLogsFilters;
22668
22804
  exports.clearSavedMetricsFilters = clearSavedMetricsFilters;
22669
22805
  exports.clearSavedTraceFilters = clearSavedTraceFilters;
22670
22806
  exports.cn = cn;
22807
+ exports.codeLanguages = codeLanguages;
22671
22808
  exports.comboboxStyles = comboboxStyles;
22672
22809
  exports.countLeafRules = countLeafRules;
22673
22810
  exports.createDefaultRule = createDefaultRule;