@lo-ink/ui 0.1.1 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"AppIcon.d.ts","sourceRoot":"","sources":["../src/AppIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1E,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,eAAe,CAAC;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;CACvE;AAED,wBAAgB,OAAO,CAAC,EACtB,GAAG,EACH,GAAQ,EACR,IAAe,EACf,QAAQ,EACR,UAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,YAAY,+BAad"}
1
+ {"version":3,"file":"AppIcon.d.ts","sourceRoot":"","sources":["../src/AppIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1E,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,eAAe,CAAC;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;CACvE;AAED,wBAAgB,OAAO,CAAC,EACtB,GAAG,EACH,GAAQ,EACR,IAAe,EACf,QAAQ,EACR,UAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,YAAY,+BAcd"}
package/dist/AppIcon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { classes } from "./utils.js";
3
3
  export function AppIcon({ src, alt = "", size = "medium", children, imageProps, className, ...props }) {
4
- return (_jsx("span", { ...props, className: classes("lo-ui-app-icon", `lo-ui-app-icon--${size}`, className), children: src ? _jsx("img", { ...imageProps, src: src, alt: alt }) : children }));
4
+ return (_jsx("span", { ...props, role: props.role ?? (!src && props["aria-label"] ? "img" : undefined), className: classes("lo-ui-app-icon", `lo-ui-app-icon--${size}`, className), children: src ? _jsx("img", { ...imageProps, src: src, alt: alt }) : children }));
5
5
  }
@@ -0,0 +1,4 @@
1
+ import { type DialogHTMLAttributes } from "react";
2
+ /** Native modal semantics; the caller controls showModal(), close() and cancellation. */
3
+ export declare const Dialog: import("react").ForwardRefExoticComponent<DialogHTMLAttributes<HTMLDialogElement> & import("react").RefAttributes<HTMLDialogElement>>;
4
+ //# sourceMappingURL=Dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../src/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAG9D,yFAAyF;AACzF,eAAO,MAAM,MAAM,uIAWjB,CAAC"}
package/dist/Dialog.js ADDED
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { classes } from "./utils.js";
4
+ /** Native modal semantics; the caller controls showModal(), close() and cancellation. */
5
+ export const Dialog = forwardRef(function Dialog({ className, ...props }, ref) {
6
+ return (_jsx("dialog", { ...props, ref: ref, className: classes("lo-ui-dialog", className) }));
7
+ });
@@ -1,9 +1,10 @@
1
1
  import type { HTMLAttributes, ReactNode } from "react";
2
2
  export interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
3
3
  title: ReactNode;
4
+ headingLevel?: 2 | 3 | 4 | 5 | 6;
4
5
  description?: ReactNode;
5
6
  icon?: ReactNode;
6
7
  action?: ReactNode;
7
8
  }
8
- export declare function EmptyState({ title, description, icon, action, className, ...props }: EmptyStateProps): import("react").JSX.Element;
9
+ export declare function EmptyState({ title, headingLevel, description, icon, action, className, ...props }: EmptyStateProps): import("react").JSX.Element;
9
10
  //# sourceMappingURL=EmptyState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../src/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,cAAc,CAAC,cAAc,CAAC,EAC9B,OAAO,CACR;IACC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,MAAM,EACN,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,+BAejB"}
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../src/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,cAAc,CAAC,cAAc,CAAC,EAC9B,OAAO,CACR;IACC,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,YAAgB,EAChB,WAAW,EACX,IAAI,EACJ,MAAM,EACN,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,+BAgBjB"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { classes } from "./utils.js";
3
- export function EmptyState({ title, description, icon, action, className, ...props }) {
4
- return (_jsxs("div", { ...props, className: classes("lo-ui-empty-state", className), children: [icon && (_jsx("div", { className: "lo-ui-empty-state__icon", "aria-hidden": "true", children: icon })), _jsx("h2", { className: "lo-ui-empty-state__title", children: title }), description && (_jsx("p", { className: "lo-ui-empty-state__description", children: description })), action && _jsx("div", { className: "lo-ui-empty-state__action", children: action })] }));
3
+ export function EmptyState({ title, headingLevel = 2, description, icon, action, className, ...props }) {
4
+ const Tag = `h${headingLevel}`;
5
+ return (_jsxs("div", { ...props, className: classes("lo-ui-empty-state", className), children: [icon && (_jsx("div", { className: "lo-ui-empty-state__icon", "aria-hidden": "true", children: icon })), _jsx(Tag, { className: "lo-ui-empty-state__title", children: title }), description && (_jsx("p", { className: "lo-ui-empty-state__description", children: description })), action && _jsx("div", { className: "lo-ui-empty-state__action", children: action })] }));
5
6
  }
package/dist/List.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import { type HTMLAttributes, type ReactNode } from "react";
2
2
  export interface ListProps extends HTMLAttributes<HTMLUListElement> {
3
3
  label?: ReactNode;
4
+ headingLevel?: 2 | 3 | 4 | 5 | 6;
4
5
  }
5
- export declare function List({ label, children, className, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...props }: ListProps): import("react").JSX.Element;
6
+ export declare function List({ label, headingLevel, children, className, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...props }: ListProps): import("react").JSX.Element;
6
7
  export interface CellProps extends Omit<HTMLAttributes<HTMLLIElement>, "title"> {
7
8
  title: ReactNode;
8
9
  subtitle?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../src/List.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG/E,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,gBAAgB,CAAC;IACjE,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,EACnB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,GAAG,KAAK,EACT,EAAE,SAAS,+BAsBX;AAED,MAAM,WAAW,SAAU,SAAQ,IAAI,CACrC,cAAc,CAAC,aAAa,CAAC,EAC7B,OAAO,CACR;IACC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,IAAI,qGA6Df,CAAC"}
1
+ {"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../src/List.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG/E,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,gBAAgB,CAAC;IACjE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAClC;AAED,wBAAgB,IAAI,CAAC,EACnB,KAAK,EACL,YAAgB,EAChB,QAAQ,EACR,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,GAAG,KAAK,EACT,EAAE,SAAS,+BAuBX;AAED,MAAM,WAAW,SAAU,SAAQ,IAAI,CACrC,cAAc,CAAC,aAAa,CAAC,EAC7B,OAAO,CACR;IACC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,IAAI,qGA6Df,CAAC"}
package/dist/List.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { forwardRef, useId } from "react";
3
3
  import { classes } from "./utils.js";
4
- export function List({ label, children, className, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...props }) {
4
+ export function List({ label, headingLevel = 2, children, className, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...props }) {
5
+ const Tag = `h${headingLevel}`;
5
6
  const generatedId = useId();
6
7
  const labelId = label ? `${generatedId}-label` : undefined;
7
8
  const effectiveLabelledBy = ariaLabelledBy ?? (ariaLabel === undefined ? labelId : undefined);
8
- return (_jsxs("section", { className: "lo-ui-list-section", children: [label && (_jsx("h2", { className: "lo-ui-list-label", id: labelId, children: label })), _jsx("ul", { ...props, "aria-label": ariaLabel, "aria-labelledby": effectiveLabelledBy, className: classes("lo-ui-list", className), children: children })] }));
9
+ return (_jsxs("section", { className: "lo-ui-list-section", children: [label && (_jsx(Tag, { className: "lo-ui-list-label", id: labelId, children: label })), _jsx("ul", { ...props, "aria-label": ariaLabel, "aria-labelledby": effectiveLabelledBy, className: classes("lo-ui-list", className), children: children })] }));
9
10
  }
10
11
  export const Cell = forwardRef(function Cell({ title, subtitle, leading, trailing, trailingAction, onPress, disabled = false, className, ...props }, ref) {
11
12
  const content = (_jsxs(_Fragment, { children: [leading && _jsx("span", { className: "lo-ui-cell__leading", children: leading }), _jsxs("span", { className: "lo-ui-cell__body", children: [_jsx("span", { className: "lo-ui-cell__title", children: title }), subtitle && _jsx("span", { className: "lo-ui-cell__subtitle", children: subtitle })] }), trailing && _jsx("span", { className: "lo-ui-cell__trailing", children: trailing }), onPress && !trailing && !trailingAction && (_jsx("svg", { className: "lo-ui-cell__chevron", viewBox: "0 0 20 20", "aria-hidden": "true", children: _jsx("path", { d: "m7.5 4 6 6-6 6" }) }))] }));
@@ -0,0 +1,3 @@
1
+ import type { ProgressHTMLAttributes } from "react";
2
+ export declare function Progress({ className, ...props }: ProgressHTMLAttributes<HTMLProgressElement>): import("react").JSX.Element;
3
+ //# sourceMappingURL=Progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Progress.d.ts","sourceRoot":"","sources":["../src/Progress.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAGpD,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,sBAAsB,CAAC,mBAAmB,CAAC,+BAI7C"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { classes } from "./utils.js";
3
+ export function Progress({ className, ...props }) {
4
+ return (_jsx("progress", { ...props, className: classes("lo-ui-progress", className) }));
5
+ }
@@ -0,0 +1,7 @@
1
+ import type { HTMLAttributes } from "react";
2
+ import type { SpacingToken } from "@lo-ink/design-tokens";
3
+ export interface SurfaceProps extends HTMLAttributes<HTMLElement> {
4
+ padding?: SpacingToken;
5
+ }
6
+ export declare function Surface({ padding, className, style, ...props }: SurfaceProps): import("react").JSX.Element;
7
+ //# sourceMappingURL=Surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Surface.d.ts","sourceRoot":"","sources":["../src/Surface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC/D,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AACD,wBAAgB,OAAO,CAAC,EACtB,OAAW,EACX,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,YAAY,+BAad"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { classes } from "./utils.js";
3
+ export function Surface({ padding = 4, className, style, ...props }) {
4
+ return (_jsx("section", { ...props, className: classes("lo-ui-surface", className), style: {
5
+ "--lo-surface-padding": `var(--lo-space-${padding})`,
6
+ ...style,
7
+ } }));
8
+ }
@@ -0,0 +1,8 @@
1
+ import { type ReactNode, type TextareaHTMLAttributes } from "react";
2
+ export interface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
3
+ label: ReactNode;
4
+ description?: ReactNode;
5
+ error?: ReactNode;
6
+ }
7
+ export declare const TextArea: import("react").ForwardRefExoticComponent<TextAreaProps & import("react").RefAttributes<HTMLTextAreaElement>>;
8
+ //# sourceMappingURL=TextArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextArea.d.ts","sourceRoot":"","sources":["../src/TextArea.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC5B,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,aAAc,SAAQ,sBAAsB,CAAC,mBAAmB,CAAC;IAChF,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AACD,eAAO,MAAM,QAAQ,+GA8CpB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef, useId, } from "react";
3
+ import { classes } from "./utils.js";
4
+ export const TextArea = forwardRef(function TextArea({ label, description, error, id: providedId, className, "aria-describedby": describedBy, ...props }, ref) {
5
+ const generatedId = useId();
6
+ const id = providedId ?? generatedId;
7
+ const descriptionId = description ? `${id}-description` : undefined;
8
+ const errorId = error ? `${id}-error` : undefined;
9
+ return (_jsxs("div", { className: classes("lo-ui-field", className), children: [_jsx("label", { className: "lo-ui-field__label", htmlFor: id, children: label }), _jsx("textarea", { ...props, ref: ref, id: id, "aria-invalid": error ? true : props["aria-invalid"], "aria-describedby": [describedBy, descriptionId, errorId].filter(Boolean).join(" ") ||
10
+ undefined, className: "lo-ui-field__input lo-ui-textarea" }), description && (_jsx("div", { className: "lo-ui-field__description", id: descriptionId, children: description })), error && (_jsx("div", { className: "lo-ui-field__error", id: errorId, children: error }))] }));
11
+ });
@@ -4,6 +4,7 @@ export interface TextFieldProps extends Omit<InputHTMLAttributes<HTMLInputElemen
4
4
  description?: ReactNode;
5
5
  error?: ReactNode;
6
6
  inputClassName?: string;
7
+ labelHidden?: boolean;
7
8
  }
8
9
  export declare const TextField: import("react").ForwardRefExoticComponent<TextFieldProps & import("react").RefAttributes<HTMLInputElement>>;
9
10
  //# sourceMappingURL=TextField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../src/TextField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,CACP;IACC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,SAAS,6GAgDrB,CAAC"}
1
+ {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../src/TextField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,CACP;IACC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,SAAS,6GAuDrB,CAAC"}
package/dist/TextField.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { forwardRef, useId, } from "react";
3
3
  import { classes } from "./utils.js";
4
- export const TextField = forwardRef(function TextField({ label, description, error, id: providedId, className, inputClassName, "aria-describedby": ariaDescribedBy, ...props }, ref) {
4
+ export const TextField = forwardRef(function TextField({ label, description, error, id: providedId, className, inputClassName, labelHidden = false, "aria-describedby": ariaDescribedBy, ...props }, ref) {
5
5
  const generatedId = useId();
6
6
  const id = providedId ?? generatedId;
7
7
  const descriptionId = description ? `${id}-description` : undefined;
@@ -9,5 +9,5 @@ export const TextField = forwardRef(function TextField({ label, description, err
9
9
  const describedBy = [ariaDescribedBy, descriptionId, errorId]
10
10
  .filter(Boolean)
11
11
  .join(" ");
12
- return (_jsxs("div", { className: classes("lo-ui-field", className), children: [_jsx("label", { className: "lo-ui-field__label", htmlFor: id, children: label }), _jsx("input", { ...props, ref: ref, id: id, "aria-invalid": error ? true : props["aria-invalid"], "aria-describedby": describedBy || undefined, className: classes("lo-ui-field__input", inputClassName) }), description && (_jsx("div", { className: "lo-ui-field__description", id: descriptionId, children: description })), error && (_jsx("div", { className: "lo-ui-field__error", id: errorId, children: error }))] }));
12
+ return (_jsxs("div", { className: classes("lo-ui-field", labelHidden && "lo-ui-field--label-hidden", className), children: [_jsx("label", { className: "lo-ui-field__label", htmlFor: id, children: label }), _jsx("input", { ...props, ref: ref, id: id, "aria-invalid": error ? true : props["aria-invalid"], "aria-describedby": describedBy || undefined, className: classes("lo-ui-field__input", inputClassName) }), description && (_jsx("div", { className: "lo-ui-field__description", id: descriptionId, children: description })), error && (_jsx("div", { className: "lo-ui-field__error", id: errorId, children: error }))] }));
13
13
  });
@@ -1,8 +1,14 @@
1
- import type { HTMLAttributes } from "react";
2
- export interface TextProps extends HTMLAttributes<HTMLParagraphElement> {
3
- tone?: "primary" | "secondary" | "danger";
4
- size?: "caption" | "label" | "body";
1
+ import { type HTMLAttributes } from "react";
2
+ export interface TextProps extends HTMLAttributes<HTMLElement> {
3
+ as?: "p" | "span" | "strong" | "code" | "pre";
4
+ tone?: "primary" | "secondary" | "danger" | "success";
5
+ weight?: "regular" | "medium" | "bold";
6
+ family?: "ui" | "display" | "mono";
7
+ size?: "caption" | "label" | "body" | "title" | "display";
5
8
  }
6
- export declare function Text({ tone, size, className, ...props }: TextProps): import("react").JSX.Element;
7
- export declare function Heading({ className, ...props }: HTMLAttributes<HTMLHeadingElement>): import("react").JSX.Element;
9
+ export declare function Text({ as: Tag, tone, weight, family, size, className, ...props }: TextProps): import("react").JSX.Element;
10
+ export interface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {
11
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
12
+ }
13
+ export declare const Heading: import("react").ForwardRefExoticComponent<HeadingProps & import("react").RefAttributes<HTMLHeadingElement>>;
8
14
  //# sourceMappingURL=Typography.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Typography.d.ts","sourceRoot":"","sources":["../src/Typography.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,oBAAoB,CAAC;IACrE,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1C,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;CACrC;AAED,wBAAgB,IAAI,CAAC,EACnB,IAAgB,EAChB,IAAa,EACb,SAAS,EACT,GAAG,KAAK,EACT,EAAE,SAAS,+BAYX;AAED,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,kBAAkB,CAAC,+BAEpC"}
1
+ {"version":3,"file":"Typography.d.ts","sourceRoot":"","sources":["../src/Typography.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAGxD,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC5D,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAC9C,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtD,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,MAAM,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC;IACnC,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CAC3D;AAED,wBAAgB,IAAI,CAAC,EACnB,EAAE,EAAE,GAAS,EACb,IAAgB,EAChB,MAAM,EACN,MAAM,EACN,IAAa,EACb,SAAS,EACT,GAAG,KAAK,EACT,EAAE,SAAS,+BAcX;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,kBAAkB,CAAC;IACtE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC/B;AAED,eAAO,MAAM,OAAO,6GAWnB,CAAC"}
@@ -1,8 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
2
3
  import { classes } from "./utils.js";
3
- export function Text({ tone = "primary", size = "body", className, ...props }) {
4
- return (_jsx("p", { ...props, className: classes("lo-ui-text", `lo-ui-text--${tone}`, `lo-ui-text--${size}`, className) }));
5
- }
6
- export function Heading({ className, ...props }) {
7
- return _jsx("h1", { ...props, className: classes("lo-ui-heading", className) });
4
+ export function Text({ as: Tag = "p", tone = "primary", weight, family, size = "body", className, ...props }) {
5
+ return (_jsx(Tag, { ...props, className: classes("lo-ui-text", `lo-ui-text--${tone}`, `lo-ui-text--${size}`, weight && `lo-ui-text--weight-${weight}`, family && `lo-ui-text--family-${family}`, className) }));
8
6
  }
7
+ export const Heading = forwardRef(function Heading({ level = 1, className, ...props }, ref) {
8
+ const Tag = `h${level}`;
9
+ return (_jsx(Tag, { ...props, ref: ref, className: classes("lo-ui-heading", className) }));
10
+ });
package/dist/index.d.ts CHANGED
@@ -5,5 +5,9 @@ export { Inline, Stack } from "./Layout.js";
5
5
  export { Cell, List, type CellProps, type ListProps } from "./List.js";
6
6
  export { Checkbox, Switch, type SelectionControlProps, } from "./SelectionControl.js";
7
7
  export { TextField, type TextFieldProps } from "./TextField.js";
8
- export { Heading, Text, type TextProps } from "./Typography.js";
8
+ export { Heading, Text, type HeadingProps, type TextProps, } from "./Typography.js";
9
+ export { TextArea, type TextAreaProps } from "./TextArea.js";
10
+ export { Surface, type SurfaceProps } from "./Surface.js";
11
+ export { Dialog } from "./Dialog.js";
12
+ export { Progress } from "./Progress.js";
9
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,OAAO,EACP,IAAI,EACJ,KAAK,YAAY,EACjB,KAAK,SAAS,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -5,4 +5,8 @@ export { Inline, Stack } from "./Layout.js";
5
5
  export { Cell, List } from "./List.js";
6
6
  export { Checkbox, Switch, } from "./SelectionControl.js";
7
7
  export { TextField } from "./TextField.js";
8
- export { Heading, Text } from "./Typography.js";
8
+ export { Heading, Text, } from "./Typography.js";
9
+ export { TextArea } from "./TextArea.js";
10
+ export { Surface } from "./Surface.js";
11
+ export { Dialog } from "./Dialog.js";
12
+ export { Progress } from "./Progress.js";
package/dist/styles.css CHANGED
@@ -13,12 +13,16 @@
13
13
  box-sizing: border-box;
14
14
  }
15
15
 
16
- :where(.lo-ui-root button, .lo-ui-root input) {
16
+ :where(.lo-ui-root button, .lo-ui-root input, .lo-ui-root textarea) {
17
17
  font: inherit;
18
18
  -webkit-tap-highlight-color: transparent;
19
19
  }
20
20
 
21
- :where(.lo-ui-root button, .lo-ui-root input):focus-visible {
21
+ :where(
22
+ .lo-ui-root button,
23
+ .lo-ui-root input,
24
+ .lo-ui-root textarea
25
+ ):focus-visible {
22
26
  outline: 3px solid var(--lo-color-focus);
23
27
  outline-offset: 2px;
24
28
  }
@@ -27,7 +31,12 @@
27
31
  min-height: var(--lo-size-control);
28
32
  padding: 0 var(--lo-space-5);
29
33
  border: 1px solid transparent;
30
- border-radius: var(--lo-radius-md);
34
+ border-radius: var(--lo-radius-full);
35
+ min-width: 0;
36
+ max-width: 100%;
37
+ white-space: normal;
38
+ overflow-wrap: anywhere;
39
+ text-align: center;
31
40
  display: inline-flex;
32
41
  align-items: center;
33
42
  justify-content: center;
@@ -62,7 +71,7 @@
62
71
 
63
72
  .lo-ui-button--primary {
64
73
  color: var(--lo-color-accent-contrast);
65
- background: var(--lo-color-accent);
74
+ background: var(--lo-color-accent-fill);
66
75
  }
67
76
 
68
77
  .lo-ui-button--primary:hover:not(:disabled) {
@@ -70,12 +79,19 @@
70
79
  }
71
80
 
72
81
  .lo-ui-button--secondary {
73
- color: var(--lo-color-text);
74
- background: var(--lo-color-surface);
75
- border-color: var(--lo-color-border);
82
+ color: var(--lo-color-accent-text);
83
+ background: var(--lo-color-accent-soft);
84
+ border-color: transparent;
85
+ }
86
+
87
+ .lo-ui-button--secondary:hover:not(:disabled) {
88
+ background: color-mix(
89
+ in srgb,
90
+ var(--lo-color-accent) 20%,
91
+ var(--lo-color-surface)
92
+ );
76
93
  }
77
94
 
78
- .lo-ui-button--secondary:hover:not(:disabled),
79
95
  .lo-ui-button--quiet:hover:not(:disabled) {
80
96
  background: var(--lo-color-accent-soft);
81
97
  }
@@ -91,7 +107,7 @@
91
107
  }
92
108
 
93
109
  .lo-ui-button--quiet {
94
- color: var(--lo-color-accent);
110
+ color: var(--lo-color-accent-text);
95
111
  background: transparent;
96
112
  }
97
113
 
@@ -135,7 +151,7 @@
135
151
  padding: 10px var(--lo-space-3);
136
152
  color: var(--lo-color-text);
137
153
  background: var(--lo-color-surface);
138
- border: 1px solid var(--lo-color-border);
154
+ border: 1px solid var(--lo-color-control-border);
139
155
  border-radius: var(--lo-radius-md);
140
156
  font-size: 16px;
141
157
  transition:
@@ -209,7 +225,8 @@
209
225
  justify-content: center;
210
226
  }
211
227
 
212
- .lo-ui-selection--control-only .lo-ui-selection__copy {
228
+ .lo-ui-selection--control-only .lo-ui-selection__copy,
229
+ .lo-ui-field--label-hidden .lo-ui-field__label {
213
230
  position: absolute;
214
231
  width: 1px;
215
232
  height: 1px;
@@ -228,7 +245,7 @@
228
245
  padding: 2px;
229
246
  border: 0;
230
247
  border-radius: var(--lo-radius-full);
231
- background: var(--lo-color-border);
248
+ background: var(--lo-color-control-border);
232
249
  cursor: pointer;
233
250
  transition: background-color var(--lo-motion-fast) var(--lo-ease-out);
234
251
  }
@@ -245,7 +262,7 @@
245
262
  }
246
263
 
247
264
  .lo-ui-switch:checked {
248
- background: var(--lo-color-accent);
265
+ background: var(--lo-color-accent-fill);
249
266
  }
250
267
 
251
268
  .lo-ui-switch:checked::after {
@@ -265,7 +282,7 @@
265
282
  margin: 0;
266
283
  display: grid;
267
284
  place-items: center;
268
- border: 1.5px solid var(--lo-color-border);
285
+ border: 1.5px solid var(--lo-color-control-border);
269
286
  border-radius: 7px;
270
287
  background: var(--lo-color-surface);
271
288
  cursor: pointer;
@@ -282,8 +299,13 @@
282
299
  }
283
300
 
284
301
  .lo-ui-checkbox:checked {
285
- background: var(--lo-color-accent);
286
- border-color: var(--lo-color-accent);
302
+ background: var(--lo-color-accent-fill);
303
+ border-color: var(--lo-color-accent-fill);
304
+ }
305
+
306
+ .lo-ui-checkbox:disabled {
307
+ cursor: default;
308
+ opacity: 0.5;
287
309
  }
288
310
 
289
311
  .lo-ui-checkbox:checked::after {
@@ -384,6 +406,7 @@
384
406
 
385
407
  .lo-ui-cell__title {
386
408
  font-size: var(--lo-font-size-body);
409
+ font-weight: var(--lo-font-weight-medium);
387
410
  }
388
411
 
389
412
  .lo-ui-cell__subtitle {
@@ -424,19 +447,24 @@
424
447
  place-items: center;
425
448
  border-radius: 11px;
426
449
  color: var(--lo-color-accent-contrast);
427
- background: var(--lo-color-accent);
450
+ background: var(--lo-color-accent-fill);
451
+ font-size: 18px;
452
+ font-weight: var(--lo-font-weight-medium);
453
+ line-height: 1;
428
454
  }
429
455
 
430
456
  .lo-ui-app-icon--small {
431
457
  width: 32px;
432
458
  height: 32px;
433
459
  border-radius: 8px;
460
+ font-size: 14px;
434
461
  }
435
462
 
436
463
  .lo-ui-app-icon--large {
437
464
  width: 64px;
438
465
  height: 64px;
439
466
  border-radius: 16px;
467
+ font-size: 26px;
440
468
  }
441
469
 
442
470
  .lo-ui-app-icon > img {
@@ -452,28 +480,25 @@
452
480
  }
453
481
 
454
482
  .lo-ui-empty-state {
455
- min-height: 240px;
456
- padding: var(--lo-space-8) var(--lo-space-6);
483
+ padding: 30px 15px;
457
484
  display: flex;
458
485
  flex-direction: column;
459
486
  align-items: center;
460
487
  justify-content: center;
461
- gap: var(--lo-space-2);
488
+ gap: 10px;
462
489
  text-align: center;
463
- border: 1px dashed var(--lo-color-border);
464
- border-radius: var(--lo-radius-lg);
490
+ border: 1px solid color-mix(in srgb, var(--lo-color-accent) 4%, transparent);
491
+ border-radius: calc(var(--lo-radius-lg) + 2px);
465
492
  background: var(--lo-color-surface);
466
493
  }
467
494
 
468
495
  .lo-ui-empty-state__icon {
469
496
  width: 52px;
470
497
  height: 52px;
471
- margin-bottom: var(--lo-space-2);
498
+ margin-bottom: 5px;
472
499
  display: grid;
473
500
  place-items: center;
474
- border-radius: var(--lo-radius-md);
475
- color: var(--lo-color-accent);
476
- background: var(--lo-color-accent-soft);
501
+ color: var(--lo-color-accent-text);
477
502
  }
478
503
 
479
504
  .lo-ui-empty-state__icon > svg {
@@ -489,18 +514,20 @@
489
514
  }
490
515
 
491
516
  .lo-ui-empty-state__title {
492
- font-size: var(--lo-font-size-body);
517
+ font-family: var(--lo-font-family);
518
+ color: var(--lo-color-text);
519
+ font-size: 26px;
493
520
  line-height: var(--lo-line-height-tight);
494
521
  }
495
522
 
496
523
  .lo-ui-empty-state__description {
497
524
  max-width: 36ch;
498
525
  color: var(--lo-color-text-secondary);
499
- font-size: var(--lo-font-size-label);
526
+ font-size: var(--lo-font-size-body);
500
527
  }
501
528
 
502
529
  .lo-ui-empty-state__action {
503
- margin-top: var(--lo-space-3);
530
+ margin-top: 5px;
504
531
  }
505
532
 
506
533
  .lo-ui-stack,
@@ -519,11 +546,15 @@
519
546
  }
520
547
 
521
548
  .lo-ui-heading {
549
+ font-family: var(--lo-font-family);
550
+ color: var(--lo-color-text);
551
+ font-weight: var(--lo-font-weight-bold);
522
552
  font-size: var(--lo-font-size-title);
523
553
  line-height: var(--lo-line-height-tight);
524
554
  }
525
555
 
526
556
  .lo-ui-text {
557
+ color: var(--lo-color-text);
527
558
  line-height: var(--lo-line-height-body);
528
559
  }
529
560
 
@@ -558,3 +589,129 @@
558
589
  animation: none;
559
590
  }
560
591
  }
592
+
593
+ .lo-ui-surface {
594
+ min-width: 0;
595
+ padding: var(--lo-surface-padding);
596
+ border: 1px solid var(--lo-color-border);
597
+ border-radius: var(--lo-radius-lg);
598
+ background: var(--lo-color-surface);
599
+ color: var(--lo-color-text);
600
+ }
601
+ .lo-ui-dialog {
602
+ box-sizing: border-box;
603
+ width: min(560px, calc(100% - 32px));
604
+ max-height: calc(100dvh - 32px);
605
+ overflow-y: auto;
606
+ padding: var(--lo-space-5);
607
+ border: 1px solid var(--lo-color-border);
608
+ border-radius: var(--lo-radius-lg);
609
+ color: var(--lo-color-text);
610
+ background: var(--lo-color-surface);
611
+ }
612
+ .lo-ui-dialog::backdrop {
613
+ background: #12162466;
614
+ }
615
+ .lo-ui-textarea {
616
+ resize: vertical;
617
+ line-height: var(--lo-line-height-body);
618
+ }
619
+ .lo-ui-field__input[type="file"] {
620
+ padding: var(--lo-space-2);
621
+ }
622
+ .lo-ui-field__input::file-selector-button {
623
+ font: inherit;
624
+ color: var(--lo-color-accent-text);
625
+ background: var(--lo-color-accent-soft);
626
+ border: 0;
627
+ border-radius: var(--lo-radius-full);
628
+ padding: var(--lo-space-2) var(--lo-space-3);
629
+ margin-right: var(--lo-space-2);
630
+ cursor: pointer;
631
+ }
632
+ .lo-ui-progress {
633
+ display: block;
634
+ appearance: none;
635
+ border: 0;
636
+ width: 100%;
637
+ height: 10px;
638
+ border-radius: var(--lo-radius-full);
639
+ overflow: hidden;
640
+ background: var(--lo-color-border);
641
+ color: var(--lo-color-accent);
642
+ }
643
+ .lo-ui-progress::-webkit-progress-bar {
644
+ background: var(--lo-color-border);
645
+ }
646
+ .lo-ui-progress::-webkit-progress-value {
647
+ background: var(--lo-color-accent);
648
+ border-radius: var(--lo-radius-full);
649
+ }
650
+ .lo-ui-progress::-moz-progress-bar {
651
+ background: var(--lo-color-accent);
652
+ border-radius: var(--lo-radius-full);
653
+ }
654
+
655
+ :where(.lo-ui-root code, .lo-ui-root pre) {
656
+ font-family: var(--lo-font-family-mono);
657
+ }
658
+
659
+ .lo-ui-app-icon:has(> img) {
660
+ background: transparent;
661
+ }
662
+ .lo-ui-progress:indeterminate {
663
+ background-image: linear-gradient(
664
+ 90deg,
665
+ var(--lo-color-border) 0% 30%,
666
+ var(--lo-color-accent) 30% 50%,
667
+ var(--lo-color-border) 50% 100%
668
+ );
669
+ background-size: 200% 100%;
670
+ animation: lo-ui-progress-pending 1.4s linear infinite;
671
+ }
672
+ .lo-ui-progress:indeterminate::-webkit-progress-bar {
673
+ background: transparent;
674
+ }
675
+ @keyframes lo-ui-progress-pending {
676
+ from {
677
+ background-position: 100% 0;
678
+ }
679
+ to {
680
+ background-position: 0% 0;
681
+ }
682
+ }
683
+ @media (prefers-reduced-motion: reduce) {
684
+ .lo-ui-progress:indeterminate {
685
+ animation: none;
686
+ background-position: 50% 0;
687
+ }
688
+ }
689
+
690
+ .lo-ui-text--title {
691
+ font-size: 26px;
692
+ }
693
+ .lo-ui-text--display {
694
+ font-size: 40px;
695
+ line-height: var(--lo-line-height-tight);
696
+ }
697
+ .lo-ui-text--success {
698
+ color: var(--lo-color-success);
699
+ }
700
+ .lo-ui-text--weight-regular {
701
+ font-weight: var(--lo-font-weight-regular);
702
+ }
703
+ .lo-ui-text--weight-medium {
704
+ font-weight: var(--lo-font-weight-medium);
705
+ }
706
+ .lo-ui-text--weight-bold {
707
+ font-weight: var(--lo-font-weight-bold);
708
+ }
709
+ .lo-ui-text--family-ui {
710
+ font-family: var(--lo-font-family);
711
+ }
712
+ .lo-ui-text--family-display {
713
+ font-family: var(--lo-font-family-display);
714
+ }
715
+ .lo-ui-text--family-mono {
716
+ font-family: var(--lo-font-family-mono);
717
+ }