@handamade/psi-react 0.4.1 → 0.6.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 +1 -1
- package/dist/Dialog/Dialog.d.ts +24 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -0
- package/dist/Field/Field.d.ts +36 -0
- package/dist/Field/Field.d.ts.map +1 -0
- package/dist/Input/Input.d.ts +4 -2
- package/dist/Input/Input.d.ts.map +1 -1
- package/dist/Select/Select.d.ts +4 -2
- package/dist/Select/Select.d.ts.map +1 -1
- package/dist/a11y-meta.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +560 -435
- package/dist/manifest.json +190 -4
- package/dist/patterns.json +139 -0
- package/dist/styles.css +1 -1
- package/docs/AspectRatio.md +2 -0
- package/docs/Button.md +2 -0
- package/docs/Card.md +2 -0
- package/docs/Checkbox.md +2 -0
- package/docs/Dialog.md +43 -0
- package/docs/Field.md +42 -0
- package/docs/IconButton.md +2 -0
- package/docs/Input.md +5 -3
- package/docs/NavBar.md +2 -0
- package/docs/Select.md +5 -3
- package/docs/Switch.md +2 -0
- package/docs/Tag.md +2 -0
- package/docs/Tooltip.md +2 -0
- package/llms.txt +5 -3
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @handamade/psi-react
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
13 React 19 components consuming @handamade/psi-tokens. Zero runtime dependencies, CSS Modules, full TypeScript support.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DialogHTMLAttributes, ReactNode, Ref } from "react";
|
|
2
|
+
type Width = 400 | 560 | 720;
|
|
3
|
+
export interface DialogProps extends Omit<DialogHTMLAttributes<HTMLDialogElement>, "title" | "onClose" | "open"> {
|
|
4
|
+
/** Controlled open state; syncs to showModal()/close(). */
|
|
5
|
+
open: boolean;
|
|
6
|
+
/** Called on every dismissal attempt with its source; the consumer flips `open`. */
|
|
7
|
+
onClose: (reason: "esc" | "backdrop" | "close-button") => void;
|
|
8
|
+
/** Heading; renders an <h2> wired to aria-labelledby. Without it, pass aria-label. */
|
|
9
|
+
title?: ReactNode;
|
|
10
|
+
/** Action row (Buttons — one accent per group, danger for destructive). */
|
|
11
|
+
footer?: ReactNode;
|
|
12
|
+
/** Panel width in px (400 | 560 | 720). @default 560 */
|
|
13
|
+
width?: Width;
|
|
14
|
+
/** false = no close button, Esc and backdrop swallowed — footer is the only exit. @default true */
|
|
15
|
+
dismissible?: boolean;
|
|
16
|
+
/** Forwarded ref to the underlying <dialog> element. */
|
|
17
|
+
ref?: Ref<HTMLDialogElement>;
|
|
18
|
+
}
|
|
19
|
+
/** Modal dialog on the native <dialog> top layer: focus trap, aria-modal and
|
|
20
|
+
* focus restore come from the platform; title/footer slots, Esc/backdrop/
|
|
21
|
+
* close-button dismissal via onClose(reason) (D50). */
|
|
22
|
+
export declare function Dialog({ open, onClose, title, footer, width, dismissible, className, children, ref, ...rest }: DialogProps): import("react").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=Dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/Dialog/Dialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAc,SAAS,EAAE,GAAG,EAAkB,MAAM,OAAO,CAAC;AAK9F,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE7B,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACnF,2DAA2D;IAC3D,IAAI,EAAE,OAAO,CAAC;IACd,oFAAoF;IACpF,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,cAAc,KAAK,IAAI,CAAC;IAC/D,sFAAsF;IACtF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,wDAAwD;IACxD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mGAAmG;IACnG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wDAAwD;IACxD,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;CAC9B;AAQD;;uDAEuD;AACvD,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,EACN,KAAW,EACX,WAAkB,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,EACH,GAAG,IAAI,EACR,EAAE,WAAW,+BAuEb"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode, Ref } from "react";
|
|
2
|
+
/** Wiring a Field provides to its control (Input/Select consume it; D49). */
|
|
3
|
+
export interface FieldContextValue {
|
|
4
|
+
/** Generated (or htmlFor-overridden) id the label points at. */
|
|
5
|
+
id: string;
|
|
6
|
+
/** id of the rendered message line, if any — joins aria-describedby. */
|
|
7
|
+
describedBy?: string;
|
|
8
|
+
/** True when the Field carries an error. */
|
|
9
|
+
invalid: boolean;
|
|
10
|
+
/** Mirrors Field's required prop into the control. */
|
|
11
|
+
required: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const FieldContext: import("react").Context<FieldContextValue | null>;
|
|
14
|
+
export interface FieldProps extends HTMLAttributes<HTMLElement> {
|
|
15
|
+
/** Label content; renders a <label> (or <legend> in group mode). */
|
|
16
|
+
label?: ReactNode;
|
|
17
|
+
/** Helper line under the control; replaced by error when error is set. */
|
|
18
|
+
description?: ReactNode;
|
|
19
|
+
/** Error content; when truthy it replaces the description and switches the
|
|
20
|
+
* field (and a wrapped Input/Select) into error state. */
|
|
21
|
+
error?: ReactNode;
|
|
22
|
+
/** Renders the required marker and flows `required` to the control. @default false */
|
|
23
|
+
required?: boolean;
|
|
24
|
+
/** Group mode: fieldset/legend wrapping several self-labeled controls
|
|
25
|
+
* (Checkbox/Switch); the message describes the whole group. @default false */
|
|
26
|
+
group?: boolean;
|
|
27
|
+
/** Override the generated control id (pair it with the same id on the control). */
|
|
28
|
+
htmlFor?: string;
|
|
29
|
+
/** Forwarded ref to the root element. */
|
|
30
|
+
ref?: Ref<HTMLDivElement | HTMLFieldSetElement>;
|
|
31
|
+
}
|
|
32
|
+
/** Labeled form-row wrapper: label above, control, one message line below —
|
|
33
|
+
* description normally, error when set (aria-live). Auto-wires
|
|
34
|
+
* id/aria-describedby/aria-invalid into Input and Select (D49). */
|
|
35
|
+
export declare function Field({ label, description, error, required, group, htmlFor, className, children, ref, ...rest }: FieldProps): import("react").JSX.Element;
|
|
36
|
+
//# sourceMappingURL=Field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/Field/Field.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5D,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,mDAAgD,CAAC;AAE1E,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC7D,oEAAoE;IACpE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;8DAC0D;IAC1D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;kFAC8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,GAAG,mBAAmB,CAAC,CAAC;CACjD;AAED;;mEAEmE;AACnE,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAgB,EAChB,KAAa,EACb,OAAO,EACP,SAAS,EACT,QAAQ,EACR,GAAG,EACH,GAAG,IAAI,EACR,EAAE,UAAU,+BAwDZ"}
|
package/dist/Input/Input.d.ts
CHANGED
|
@@ -3,12 +3,14 @@ type Size = 24 | 32 | 40 | 48;
|
|
|
3
3
|
export interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
|
|
4
4
|
/** Height in px (24 | 32 | 40 | 48). @default 32 */
|
|
5
5
|
size?: Size;
|
|
6
|
-
/** Show error styling. @default false */
|
|
6
|
+
/** Show error styling. Inside a Field, the Field's error also lights this. @default false */
|
|
7
7
|
error?: boolean;
|
|
8
8
|
/** Forwarded ref to the underlying `<input>` element. */
|
|
9
9
|
ref?: Ref<HTMLInputElement>;
|
|
10
10
|
}
|
|
11
|
-
/** Single-line text input with pixel-true heights (24–48) and an error state.
|
|
11
|
+
/** Single-line text input with pixel-true heights (24–48) and an error state.
|
|
12
|
+
* Inside a Field, id/aria-describedby/aria-invalid/required are wired
|
|
13
|
+
* automatically (D49). */
|
|
12
14
|
export declare function Input({ size, error, className, ref, ...rest }: InputProps): import("react").JSX.Element;
|
|
13
15
|
export {};
|
|
14
16
|
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../src/Input/Input.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../src/Input/Input.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAItD,KAAK,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAE9B,MAAM,WAAW,UAAW,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IACvE,oDAAoD;IACpD,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,6FAA6F;IAC7F,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yDAAyD;IACzD,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AASD;;0BAE0B;AAC1B,wBAAgB,KAAK,CAAC,EAAE,IAAS,EAAE,KAAa,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,UAAU,+BAqBtF"}
|
package/dist/Select/Select.d.ts
CHANGED
|
@@ -8,12 +8,14 @@ export interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {
|
|
|
8
8
|
* @default 32
|
|
9
9
|
*/
|
|
10
10
|
size?: Size;
|
|
11
|
-
/** Show error styling. @default false */
|
|
11
|
+
/** Show error styling. Inside a Field, the Field's error also lights this. @default false */
|
|
12
12
|
error?: boolean;
|
|
13
13
|
/** Forwarded ref to the underlying `<select>` element. */
|
|
14
14
|
ref?: Ref<HTMLSelectElement>;
|
|
15
15
|
}
|
|
16
|
-
/** Styled native `<select>` with pixel-true heights (24–48) and an error state.
|
|
16
|
+
/** Styled native `<select>` with pixel-true heights (24–48) and an error state.
|
|
17
|
+
* Inside a Field, id/aria-describedby/aria-invalid/required are wired
|
|
18
|
+
* automatically (D49). */
|
|
17
19
|
export declare function Select({ size, error, className, ref, children, ...rest }: SelectProps): import("react").JSX.Element;
|
|
18
20
|
export {};
|
|
19
21
|
//# sourceMappingURL=Select.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../src/Select/Select.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../src/Select/Select.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIvD,KAAK,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAE9B,MAAM,WAAW,WAAY,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC1E;;;;;OAKG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,6FAA6F;IAC7F,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;CAC9B;AASD;;0BAE0B;AAC1B,wBAAgB,MAAM,CAAC,EACrB,IAAS,EACT,KAAa,EACb,SAAS,EACT,GAAG,EACH,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,WAAW,+BA4Bb"}
|
package/dist/a11y-meta.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a11y-meta.d.ts","sourceRoot":"","sources":["../src/a11y-meta.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"a11y-meta.d.ts","sourceRoot":"","sources":["../src/a11y-meta.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA4D9C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,10 @@ export { NavBar } from "./NavBar/NavBar.js";
|
|
|
8
8
|
export type { NavBarProps } from "./NavBar/NavBar.js";
|
|
9
9
|
export { AspectRatio } from "./AspectRatio/AspectRatio.js";
|
|
10
10
|
export type { AspectRatioProps } from "./AspectRatio/AspectRatio.js";
|
|
11
|
+
export { Field } from "./Field/Field.js";
|
|
12
|
+
export type { FieldProps } from "./Field/Field.js";
|
|
13
|
+
export { Dialog } from "./Dialog/Dialog.js";
|
|
14
|
+
export type { DialogProps } from "./Dialog/Dialog.js";
|
|
11
15
|
export { Input } from "./Input/Input.js";
|
|
12
16
|
export type { InputProps } from "./Input/Input.js";
|
|
13
17
|
export { Select } from "./Select/Select.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,KAAK,EACL,aAAa,GACd,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,KAAK,EACL,aAAa,GACd,MAAM,kBAAkB,CAAC"}
|