@estiva-app/ui 0.17.0 → 0.19.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.
package/README.md CHANGED
@@ -67,20 +67,28 @@ export default {
67
67
 
68
68
  The UI Guardrails' rules ship with the package, as an ESLint plugin, so an app
69
69
  gets a new rule with a version bump. Each rule names the component to use
70
- instead. Today there is one: `estiva/no-raw-element`, which refuses a raw
71
- interactive element (`<a>`, `<input>`, `<form>`, `<dialog>`…) and names the part to
72
- use, or says the package has none yet.
70
+ instead. There are two:
71
+
72
+ - `estiva/no-raw-element` refuses a raw interactive element (`<a>`, `<input>`,
73
+ `<form>`, `<dialog>`…) and names the part to use, or says the package has none yet.
74
+ - `estiva/no-rebuilt-behaviour` refuses behaviour a part already owns, written by
75
+ hand: a Base UI import, `createPortal`, a click or key listener on the whole
76
+ page, arrow keys compared by hand, a hand-written `role` (`option`, `menu`,
77
+ `dialog`, `alert`…), `tabIndex` 0 or more on a box, and a scrolling box
78
+ (`overflow-auto`, behind any variant). `OWNED_BEHAVIOURS` lists each behaviour,
79
+ the Base UI parts that do it, and the components that own it. It cannot find a
80
+ box that should scroll and does not: that has no class to read.
73
81
 
74
82
  ```js
75
83
  // eslint.config.js — alongside your own rules
76
84
  import estiva from '@estiva-app/ui/eslint'
77
85
  export default [
78
86
  // …your config, with a parser that reads TSX
79
- { files: ['src/**/*.tsx'], ignores: ['**/*.test.tsx'], ...estiva.configs.recommended },
87
+ { files: ['src/**/*.{ts,tsx}'], ignores: ['**/*.test.{ts,tsx}'], ...estiva.configs.recommended },
80
88
  ]
81
89
  ```
82
90
 
83
- A place that keeps a raw element on purpose says why, on the line above:
91
+ A place that keeps one on purpose says why, on the line above:
84
92
 
85
93
  ```tsx
86
94
  // @estiva-escape: the reason, at least ten characters
@@ -1,3 +1,4 @@
1
+ import type { ReactNode } from 'react';
1
2
  /**
2
3
  * A 16px square that fills with the accent when checked — Peek's Checkbox
3
4
  * (2026-09-01), verbatim; on Base UI Checkbox since stage 1 of the migration
@@ -27,6 +28,12 @@
27
28
  * Read state panel's, where it was written by hand (UIG-7, 16 September). The
28
29
  * words keep their colour when the box is disabled (Katerina: "no need").
29
30
  *
31
+ * With `row`, the whole row is the target: an optional `leading` picture, the
32
+ * words, the box at the end, and the row fills on hover and while checked — a
33
+ * list you tick several from. The class list is Peek's "Add to Open work" rows,
34
+ * which drew it by hand as a `role="option"` in a list that was not one (UIG-8,
35
+ * Katerina's pick B, 16 September: the same pixels, on the package part).
36
+ *
30
37
  * Inside a busy `Form` it is disabled, and looks it (`formBusy.ts`).
31
38
  */
32
39
  export interface CheckboxProps {
@@ -38,10 +45,18 @@ export interface CheckboxProps {
38
45
  * they name it, so no `aria-label` is needed. `className` stays on the box.
39
46
  */
40
47
  label?: string;
48
+ /**
49
+ * The whole row is the target: `leading`, then the words, then the box at
50
+ * the end; the row fills on hover and while checked. For a list you tick
51
+ * several from. Needs `label` and `onChange`; without `onChange` it is ignored.
52
+ */
53
+ row?: boolean;
54
+ /** In a `row`, a picture before the words: an icon, a status. */
55
+ leading?: ReactNode;
41
56
  'aria-label'?: string;
42
57
  /** Set by a `Field` with `required`; a caller inside one owes nothing. */
43
58
  'aria-required'?: boolean | 'true' | 'false';
44
59
  className?: string;
45
60
  }
46
- export declare function Checkbox({ checked, onChange, disabled: ownDisabled, label, className, ...aria }: CheckboxProps): import("react").JSX.Element;
61
+ export declare function Checkbox({ checked, onChange, disabled: ownDisabled, label, row, leading, className, ...aria }: CheckboxProps): import("react").JSX.Element;
47
62
  //# sourceMappingURL=Checkbox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../src/Checkbox.tsx"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAiBD,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,+BA6CtH"}
1
+ {"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../src/Checkbox.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,iEAAiE;IACjE,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAmBD,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,+BAyDpI"}
@@ -1 +1 @@
1
- {"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../src/CommandPalette.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../src/CommandPalette.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAA;AAwDd,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAA;IACb,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qEAAqE;IACrE,QAAQ,EAAE,SAAS,CAAA;CACpB;AAYD,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAe,EAAE,QAAQ,EAAE,EAAE,mBAAmB,+BAgDlH;AAID;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,gDAAgD;IAChD,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAmCD,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iDAAiD;IACjD,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,0HAA0H;IAC1H,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,0GAA0G;IAC1G,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,iBAAiB,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,qGAAqG;IACrG,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kGAAkG;IAClG,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAID,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,yBAAyB,+BA2MxJ;AAYD,MAAM,WAAW,uBAAuB;IACtC,6DAA6D;IAC7D,IAAI,EAAE,kBAAkB,CAAA;IACxB,uEAAuE;IACvE,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,kHAAkH;IAClH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oHAAoH;IACpH,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qCAAqC;IACrC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAUD,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,uBAAuB,+BAmGvI;AAMD,MAAM,WAAW,0BAA0B;IACzC,kDAAkD;IAClD,QAAQ,EAAE,SAAS,CAAA;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;CACrB;AAED,wFAAwF;AACxF,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,IAAQ,EAAE,EAAE,0BAA0B,+BAYvF;AAED,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,yBAAyB,+BAsBjF;AAED,MAAM,WAAW,wBAAwB;IACvC,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE,wBAAwB,+BAEzE"}
package/dist/Form.d.ts CHANGED
@@ -22,13 +22,28 @@ import { type FormHTMLAttributes, type ReactNode } from 'react';
22
22
  * When `busy` ends, focus goes to the first invalid field, else to what sent
23
23
  * the form, else to the first control. That is `CommandPalette`'s order
24
24
  * too, so the two read the same (UIG-29).
25
+ *
26
+ * The keys are ours, the same in every form (Katerina, 16 September): Enter in
27
+ * a one-line field sends; Enter in a text area is a new line; Enter in a list
28
+ * or a people picker picks; Ctrl+Enter (Cmd+Enter) sends from anywhere inside.
29
+ * The form sends on Enter itself rather than leaving it to the browser, whose
30
+ * implicit submission depends on whether the form has a submit button and how
31
+ * many fields it holds. `enterSends={false}` keeps Enter in a one-line field
32
+ * from sending, for a form where only Ctrl+Enter may send (`CommandPalette`).
33
+ * Every way of sending goes through the form's submit, so Base UI's field
34
+ * check runs for each.
25
35
  */
26
36
  export interface FormProps extends Omit<FormHTMLAttributes<HTMLFormElement>, 'onSubmit' | 'children' | 'noValidate'> {
27
37
  /** Enter in a field, or a submit button. The page's own submit is already prevented. */
28
38
  onSubmit: () => void | Promise<void>;
29
39
  /** While sending: every field and button inside is switched off, and focus waits on the form. */
30
40
  busy?: boolean;
41
+ /**
42
+ * Whether Enter in a one-line field sends. On by default. Off where only
43
+ * Ctrl+Enter may send — a form inside `CommandPalette`. Ctrl+Enter sends either way.
44
+ */
45
+ enterSends?: boolean;
31
46
  children: ReactNode;
32
47
  }
33
- export declare function Form({ onSubmit, busy: ownBusy, className, children, ...props }: FormProps): import("react").JSX.Element;
48
+ export declare function Form({ onSubmit, busy: ownBusy, enterSends, className, children, ...props }: FormProps): import("react").JSX.Element;
34
49
  //# sourceMappingURL=Form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../src/Form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAMxF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IAClH,wFAAwF;IACxF,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,iGAAiG;IACjG,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,SAAS,CAAA;CACpB;AAQD,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,+BAoEjG"}
1
+ {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../src/Form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,kBAAkB,EAAsB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAM5G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IAClH,wFAAwF;IACxF,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,iGAAiG;IACjG,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,SAAS,CAAA;CACpB;AAqBD,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAe,EAAE,UAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,+BAoGpH"}
@@ -27,6 +27,12 @@ import type { ReactNode, Ref, UIEventHandler } from 'react';
27
27
  * the thin scrollbar both apps had styled by hand in their `index.css`, drawn
28
28
  * once here instead.
29
29
  *
30
+ * The bar sits above the content (`z-10`). A sticky row inside — a date line
31
+ * in a conversation, `sticky top-0 z-10` — is at the same level, and the bar
32
+ * comes after the content in the page, so it paints on top. Without it the
33
+ * row hid the bar wherever it crossed it: a gap in the thumb, in Peek's topic
34
+ * and direct-message lists (UIG-8, 16 September).
35
+ *
30
36
  * `orientation` says which way the region scrolls; a table that is wider
31
37
  * than its box scrolls `horizontal`, a list `vertical` (the default), a board
32
38
  * `both`. A vertical region keeps its content no wider than itself, so a
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollArea.d.ts","sourceRoot":"","sources":["../src/ScrollArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAI3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAA;IAChD,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAA;IACjC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;IACzC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAKD,wBAAgB,UAAU,CAAC,EAAE,WAAwB,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,eAAe,+BA4CxJ"}
1
+ {"version":3,"file":"ScrollArea.d.ts","sourceRoot":"","sources":["../src/ScrollArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAI3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAA;IAChD,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAA;IACjC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;IACzC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAKD,wBAAgB,UAAU,CAAC,EAAE,WAAwB,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,eAAe,+BA4CxJ"}
@@ -1,5 +1,6 @@
1
1
  import type { ESLint, Linter } from 'eslint';
2
2
  export { ESCAPE_MARKER, MIN_REASON, SETTINGS_KEY, isEscaped, type EstivaSettings } from './escape';
3
+ export { OWNED_BEHAVIOURS, type OwnedBehaviour } from './no-rebuilt-behaviour';
3
4
  /** The name the configs register the plugin under, so every rule id is `estiva/<rule>`. */
4
5
  export declare const PLUGIN_KEY = "estiva";
5
6
  declare const plugin: {
@@ -13,6 +14,7 @@ declare const plugin: {
13
14
  'component-has-a-page': import("eslint").Rule.RuleModule;
14
15
  'component-has-a-story': import("eslint").Rule.RuleModule;
15
16
  'no-raw-element': import("eslint").Rule.RuleModule;
17
+ 'no-rebuilt-behaviour': import("eslint").Rule.RuleModule;
16
18
  };
17
19
  configs: {
18
20
  recommended: Linter.Config;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eslint/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAM5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAIlG,2FAA2F;AAC3F,eAAO,MAAM,UAAU,WAAW,CAAA;AA+BlC,QAAA,MAAM,MAAM;;;;;;;;;;;;aAGK;QAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAA;KAAE;CACrE,CAAA;AAEzB,qFAAqF;AACrF,eAAO,MAAM,YAAY,UAA+D,CAAA;AACxF,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,UAAmE,CAAA;AA0BhG,eAAe,MAAM,CAAA;AAErB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACpC;;;OAGG;IACH,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,GAAE,SAAS,MAAM,EAAiB,GAAG,SAAS,CAmB1G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eslint/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAO5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAClG,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAI9E,2FAA2F;AAC3F,eAAO,MAAM,UAAU,WAAW,CAAA;AAiClC,QAAA,MAAM,MAAM;;;;;;;;;;;;;aAGK;QAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAA;KAAE;CACrE,CAAA;AAEzB,qFAAqF;AACrF,eAAO,MAAM,YAAY,UAA+D,CAAA;AACxF,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,UAAmE,CAAA;AA6BhG,eAAe,MAAM,CAAA;AAErB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACpC;;;OAGG;IACH,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,GAAE,SAAS,MAAM,EAAiB,GAAG,SAAS,CAmB1G"}