@qeetrix/react 0.0.2 → 0.0.4
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 +116 -1
- package/README.md +99 -0
- package/dist/button/button.d.ts +6 -2
- package/dist/button/button.js +5 -1
- package/dist/css/avatar.css +6 -0
- package/dist/css/badge.css +6 -0
- package/dist/css/button.css +81 -6
- package/dist/css/checkbox.css +9 -0
- package/dist/css/dialog.css +7 -0
- package/dist/css/drawer.css +6 -0
- package/dist/css/experimental/alert.css +89 -0
- package/dist/css/experimental/app-shell.css +258 -0
- package/dist/css/experimental/breadcrumb.css +67 -0
- package/dist/css/experimental/copy-button.css +13 -0
- package/dist/css/experimental/empty-state.css +63 -0
- package/dist/css/experimental/otp-input.css +84 -0
- package/dist/css/experimental/page-header.css +110 -0
- package/dist/css/experimental/password-input.css +21 -0
- package/dist/css/experimental/sidebar.css +234 -0
- package/dist/css/experimental/stat.css +115 -0
- package/dist/css/experimental/top-bar.css +299 -0
- package/dist/css/input.css +10 -0
- package/dist/css/menu.css +17 -0
- package/dist/css/progress.css +14 -0
- package/dist/css/scroll-area.css +7 -0
- package/dist/css/select.css +16 -0
- package/dist/css/separator.css +7 -0
- package/dist/css/skeleton.css +6 -0
- package/dist/css/slider.css +22 -0
- package/dist/css/switch.css +33 -0
- package/dist/css/tabs.css +11 -0
- package/dist/css/toast.css +7 -0
- package/dist/css/toggle.css +13 -0
- package/dist/css/tooltip.css +6 -0
- package/dist/dialog/dialog.d.ts +4 -1
- package/dist/dialog/dialog.js +4 -3
- package/dist/drawer/drawer.d.ts +4 -1
- package/dist/drawer/drawer.js +5 -4
- package/dist/experimental/alert/alert.d.ts +29 -0
- package/dist/experimental/alert/alert.js +72 -0
- package/dist/experimental/alert/index.d.ts +2 -0
- package/dist/experimental/app-shell/app-shell.d.ts +60 -0
- package/dist/experimental/app-shell/app-shell.js +224 -0
- package/dist/experimental/app-shell/index.d.ts +2 -0
- package/dist/experimental/breadcrumb/breadcrumb.d.ts +27 -0
- package/dist/experimental/breadcrumb/breadcrumb.js +48 -0
- package/dist/experimental/breadcrumb/index.d.ts +2 -0
- package/dist/experimental/copy-button/copy-button.d.ts +27 -0
- package/dist/experimental/copy-button/copy-button.js +61 -0
- package/dist/experimental/copy-button/index.d.ts +2 -0
- package/dist/experimental/empty-state/data-state.d.ts +23 -0
- package/dist/experimental/empty-state/data-state.js +40 -0
- package/dist/experimental/empty-state/empty-state.d.ts +26 -0
- package/dist/experimental/empty-state/empty-state.js +46 -0
- package/dist/experimental/empty-state/index.d.ts +3 -0
- package/dist/experimental/index.d.ts +24 -0
- package/dist/experimental/index.js +13 -0
- package/dist/experimental/otp-input/index.d.ts +2 -0
- package/dist/experimental/otp-input/otp-input.d.ts +27 -0
- package/dist/experimental/otp-input/otp-input.js +39 -0
- package/dist/experimental/page-header/index.d.ts +2 -0
- package/dist/experimental/page-header/page-header.d.ts +32 -0
- package/dist/experimental/page-header/page-header.js +73 -0
- package/dist/experimental/password-input/index.d.ts +2 -0
- package/dist/experimental/password-input/password-input.d.ts +26 -0
- package/dist/experimental/password-input/password-input.js +103 -0
- package/dist/experimental/sidebar/index.d.ts +2 -0
- package/dist/experimental/sidebar/sidebar.d.ts +64 -0
- package/dist/experimental/sidebar/sidebar.js +200 -0
- package/dist/experimental/stat/index.d.ts +2 -0
- package/dist/experimental/stat/stat.d.ts +31 -0
- package/dist/experimental/stat/stat.js +90 -0
- package/dist/experimental/top-bar/index.d.ts +2 -0
- package/dist/experimental/top-bar/top-bar.d.ts +60 -0
- package/dist/experimental/top-bar/top-bar.js +162 -0
- package/dist/field/field.d.ts +4 -1
- package/dist/field/field.js +6 -5
- package/dist/format/format.d.ts +12 -0
- package/dist/format/format.js +50 -0
- package/dist/format/index.d.ts +2 -0
- package/dist/format/index.js +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +3 -1
- package/dist/internal/media.js +15 -0
- package/dist/internal/messages.d.ts +75 -0
- package/dist/internal/messages.js +44 -5
- package/dist/link/link.d.ts +7 -1
- package/dist/link/link.js +3 -2
- package/dist/locales/hi.d.ts +8 -0
- package/dist/locales/hi.js +60 -0
- package/dist/progress/progress.d.ts +2 -2
- package/dist/progress/progress.js +7 -2
- package/dist/provider/index.d.ts +3 -0
- package/dist/provider/index.js +1 -0
- package/dist/provider/provider.d.ts +46 -0
- package/dist/provider/provider.js +90 -0
- package/dist/slider/slider.d.ts +5 -2
- package/dist/slider/slider.js +10 -3
- package/dist/styles.css +1704 -104
- package/dist/text-field/text-field.d.ts +2 -2
- package/dist/text-field/text-field.js +4 -2
- package/dist/toast/toast.d.ts +4 -1
- package/dist/toast/toast.js +7 -6
- package/package.json +18 -2
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cx } from "../internal/cx.js";
|
|
3
|
+
import { useLocale } from "../provider/provider.js";
|
|
3
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
5
|
import { Meter } from "@base-ui/react/meter";
|
|
5
6
|
import { Progress } from "@base-ui/react/progress";
|
|
@@ -8,9 +9,11 @@ import { Progress } from "@base-ui/react/progress";
|
|
|
8
9
|
* A task advancing, such as an upload (06-component-specs.md, increment 6). `value={null}` is
|
|
9
10
|
* indeterminate: a segment slides along the track, and fades instead under reduced motion.
|
|
10
11
|
*/
|
|
11
|
-
function Progress$1({ label, showValue, className, ...props }) {
|
|
12
|
+
function Progress$1({ label, showValue, locale, className, ...props }) {
|
|
13
|
+
const providerLocale = useLocale();
|
|
12
14
|
return /* @__PURE__ */ jsxs(Progress.Root, {
|
|
13
15
|
...props,
|
|
16
|
+
locale: locale ?? providerLocale,
|
|
14
17
|
className: cx("qx-progress", className),
|
|
15
18
|
"data-slot": "progress",
|
|
16
19
|
children: [(label != null || showValue) && /* @__PURE__ */ jsxs("div", {
|
|
@@ -31,9 +34,11 @@ function Progress$1({ label, showValue, className, ...props }) {
|
|
|
31
34
|
});
|
|
32
35
|
}
|
|
33
36
|
/** A measurement within a range, such as storage used. It looks like Progress; it isn't a task. */
|
|
34
|
-
function Meter$1({ label, showValue, tone = "brand", className, ...props }) {
|
|
37
|
+
function Meter$1({ label, showValue, tone = "brand", locale, className, ...props }) {
|
|
38
|
+
const providerLocale = useLocale();
|
|
35
39
|
return /* @__PURE__ */ jsxs(Meter.Root, {
|
|
36
40
|
...props,
|
|
41
|
+
locale: locale ?? providerLocale,
|
|
37
42
|
className: cx("qx-progress", className),
|
|
38
43
|
"data-slot": "meter",
|
|
39
44
|
"data-tone": tone,
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { QeetrixMessages, QeetrixMessagesInput } from "../internal/messages.js";
|
|
2
|
+
import { ColorScheme, ColorSchemeState, Direction, QeetrixProvider, QeetrixProviderProps, ResolvedColorScheme, useColorScheme, useLocale } from "./provider.js";
|
|
3
|
+
export { type ColorScheme, type ColorSchemeState, type Direction, type QeetrixMessages, type QeetrixMessagesInput, QeetrixProvider, type QeetrixProviderProps, type ResolvedColorScheme, useColorScheme, useLocale };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { QeetrixProvider, useColorScheme, useLocale } from "./provider.js";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { QeetrixMessagesInput } from "../internal/messages.js";
|
|
2
|
+
import { ReactElement, ReactNode } from "react";
|
|
3
|
+
export type Direction = "ltr" | "rtl";
|
|
4
|
+
export type ColorScheme = "light" | "dark" | "system";
|
|
5
|
+
export type ResolvedColorScheme = "light" | "dark";
|
|
6
|
+
export interface QeetrixProviderProps {
|
|
7
|
+
/** A BCP 47 locale for formatting, e.g. `hi-IN`. Default `en-IN`, or the enclosing provider's. */
|
|
8
|
+
locale?: string;
|
|
9
|
+
/**
|
|
10
|
+
* The reading direction, for arrow keys, submenus, sliders and drawers. Default `ltr`, or the
|
|
11
|
+
* enclosing provider's. Set `dir` on `<html>` too: this doesn't render an element.
|
|
12
|
+
*/
|
|
13
|
+
direction?: Direction;
|
|
14
|
+
/** A locale pack (`@qeetrix/react/locales/hi`) or any subset of the strings. */
|
|
15
|
+
messages?: QeetrixMessagesInput;
|
|
16
|
+
/**
|
|
17
|
+
* The colour scheme, controlled. With this or `defaultColorScheme`, the provider sets
|
|
18
|
+
* `data-qx-color-scheme` on `<html>`, following the operating system while it's `system`.
|
|
19
|
+
*/
|
|
20
|
+
colorScheme?: ColorScheme;
|
|
21
|
+
/** The colour scheme when uncontrolled. */
|
|
22
|
+
defaultColorScheme?: ColorScheme;
|
|
23
|
+
/** Called when `setColorScheme` asks for a change: persist it, e.g. in a cookie. */
|
|
24
|
+
onColorSchemeChange?: (colorScheme: ColorScheme) => void;
|
|
25
|
+
children?: ReactNode;
|
|
26
|
+
}
|
|
27
|
+
export interface ColorSchemeState {
|
|
28
|
+
/** The chosen scheme, `system` included. */
|
|
29
|
+
colorScheme: ColorScheme;
|
|
30
|
+
/** What's showing: `light` or `dark`. */
|
|
31
|
+
resolvedColorScheme: ResolvedColorScheme;
|
|
32
|
+
/** Choose a scheme. */
|
|
33
|
+
setColorScheme: (colorScheme: ColorScheme) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* App-wide settings for Qeetrix components: locale, direction and strings. Nest one to change a
|
|
37
|
+
* section; it inherits whatever it doesn't set.
|
|
38
|
+
*/
|
|
39
|
+
export declare function QeetrixProvider({ locale, direction, messages: strings, colorScheme, defaultColorScheme, onColorSchemeChange, children }: QeetrixProviderProps): ReactElement;
|
|
40
|
+
/**
|
|
41
|
+
* The colour scheme, and a way to change it, from the QeetrixProvider that manages it (one with
|
|
42
|
+
* `colorScheme` or `defaultColorScheme`).
|
|
43
|
+
*/
|
|
44
|
+
export declare function useColorScheme(): ColorSchemeState;
|
|
45
|
+
/** The locale set by the nearest QeetrixProvider; `en-IN` without one. */
|
|
46
|
+
export declare function useLocale(): string;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { DEFAULT_LOCALE, messages } from "../internal/messages.js";
|
|
3
|
+
import { useMediaQuery } from "../internal/media.js";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
import { createContext, use, useEffect, useState } from "react";
|
|
6
|
+
import { DirectionProvider } from "@base-ui/react/direction-provider";
|
|
7
|
+
// src/provider/provider.tsx
|
|
8
|
+
const SettingsContext = createContext({
|
|
9
|
+
locale: DEFAULT_LOCALE,
|
|
10
|
+
messages: {}
|
|
11
|
+
});
|
|
12
|
+
const ColorSchemeContext = createContext({
|
|
13
|
+
colorScheme: "light",
|
|
14
|
+
resolvedColorScheme: "light",
|
|
15
|
+
setColorScheme: () => {}
|
|
16
|
+
});
|
|
17
|
+
function ColorSchemeRoot({ colorScheme, defaultColorScheme, onColorSchemeChange, children }) {
|
|
18
|
+
const [own, setOwn] = useState(defaultColorScheme ?? "system");
|
|
19
|
+
const scheme = colorScheme ?? own;
|
|
20
|
+
const prefersDark = useMediaQuery("(prefers-color-scheme: dark)", false);
|
|
21
|
+
const resolved = scheme === "system" ? prefersDark ? "dark" : "light" : scheme;
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
document.documentElement.dataset.qxColorScheme = resolved;
|
|
24
|
+
}, [resolved]);
|
|
25
|
+
const setColorScheme = (next) => {
|
|
26
|
+
if (colorScheme === void 0) setOwn(next);
|
|
27
|
+
onColorSchemeChange?.(next);
|
|
28
|
+
};
|
|
29
|
+
return /* @__PURE__ */ jsx(ColorSchemeContext, {
|
|
30
|
+
value: {
|
|
31
|
+
colorScheme: scheme,
|
|
32
|
+
resolvedColorScheme: resolved,
|
|
33
|
+
setColorScheme
|
|
34
|
+
},
|
|
35
|
+
children
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function merge(outer, inner) {
|
|
39
|
+
const out = { ...outer };
|
|
40
|
+
for (const [group, strings] of Object.entries(inner)) out[group] = {
|
|
41
|
+
...out[group],
|
|
42
|
+
...strings
|
|
43
|
+
};
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* App-wide settings for Qeetrix components: locale, direction and strings. Nest one to change a
|
|
48
|
+
* section; it inherits whatever it doesn't set.
|
|
49
|
+
*/
|
|
50
|
+
function QeetrixProvider({ locale, direction, messages: strings, colorScheme, defaultColorScheme, onColorSchemeChange, children }) {
|
|
51
|
+
const outer = use(SettingsContext);
|
|
52
|
+
const settings = {
|
|
53
|
+
locale: locale ?? outer.locale,
|
|
54
|
+
messages: strings ? merge(outer.messages, strings) : outer.messages
|
|
55
|
+
};
|
|
56
|
+
const directed = direction ? /* @__PURE__ */ jsx(DirectionProvider, {
|
|
57
|
+
direction,
|
|
58
|
+
children
|
|
59
|
+
}) : children;
|
|
60
|
+
return /* @__PURE__ */ jsx(SettingsContext, {
|
|
61
|
+
value: settings,
|
|
62
|
+
children: colorScheme !== void 0 || defaultColorScheme !== void 0 ? /* @__PURE__ */ jsx(ColorSchemeRoot, {
|
|
63
|
+
colorScheme,
|
|
64
|
+
defaultColorScheme,
|
|
65
|
+
onColorSchemeChange,
|
|
66
|
+
children: directed
|
|
67
|
+
}) : directed
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The colour scheme, and a way to change it, from the QeetrixProvider that manages it (one with
|
|
72
|
+
* `colorScheme` or `defaultColorScheme`).
|
|
73
|
+
*/
|
|
74
|
+
function useColorScheme() {
|
|
75
|
+
return use(ColorSchemeContext);
|
|
76
|
+
}
|
|
77
|
+
/** The locale set by the nearest QeetrixProvider; `en-IN` without one. */
|
|
78
|
+
function useLocale() {
|
|
79
|
+
return use(SettingsContext).locale;
|
|
80
|
+
}
|
|
81
|
+
/** A component's strings: its own prop, then the provider, then the English defaults. */
|
|
82
|
+
function useMessages(group, own) {
|
|
83
|
+
const provided = use(SettingsContext).messages[group];
|
|
84
|
+
return {
|
|
85
|
+
...messages[group],
|
|
86
|
+
...provided,
|
|
87
|
+
...own
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export { QeetrixProvider, useColorScheme, useLocale, useMessages };
|
package/dist/slider/slider.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { QeetrixMessages } from "../internal/messages.js";
|
|
1
2
|
import { CSSProperties, ReactElement, ReactNode } from "react";
|
|
2
3
|
import { Slider } from "@base-ui/react/slider";
|
|
3
4
|
export interface SliderProps<Value extends number | readonly number[] = number> extends Omit<Slider.Root.Props<Value>, "className" | "style" | "children"> {
|
|
4
5
|
/** The visible label. Without one, give the slider an `aria-label`. */
|
|
5
6
|
label?: ReactNode;
|
|
6
|
-
/** Show the formatted value at the end of the header. */
|
|
7
|
+
/** Show the formatted value at the end of the header, in `locale` (default: QeetrixProvider's). */
|
|
7
8
|
showValue?: boolean;
|
|
9
|
+
/** A range's thumb names, over QeetrixProvider's and the English defaults. */
|
|
10
|
+
messages?: Partial<QeetrixMessages["slider"]>;
|
|
8
11
|
/** Placement only. */
|
|
9
12
|
className?: string;
|
|
10
13
|
style?: CSSProperties;
|
|
@@ -13,5 +16,5 @@ export interface SliderProps<Value extends number | readonly number[] = number>
|
|
|
13
16
|
* A number, or a range, on a continuous scale (06-component-specs.md, increment 5). An array value
|
|
14
17
|
* renders one thumb per value. Arrow keys step, Page Up and Down take `largeStep`, Home and End jump.
|
|
15
18
|
*/
|
|
16
|
-
declare function Slider$1<Value extends number | readonly number[] = number>({ label, showValue, className, value, defaultValue, ...props }: SliderProps<Value>): ReactElement;
|
|
19
|
+
declare function Slider$1<Value extends number | readonly number[] = number>({ label, showValue, messages, "aria-label": ariaLabel, locale, className, value, defaultValue, ...props }: SliderProps<Value>): ReactElement;
|
|
17
20
|
export { Slider$1 as Slider };
|
package/dist/slider/slider.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cx } from "../internal/cx.js";
|
|
3
|
-
import {
|
|
3
|
+
import { useLocale, useMessages } from "../provider/provider.js";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
import { Slider } from "@base-ui/react/slider";
|
|
6
6
|
// src/slider/slider.tsx
|
|
@@ -8,14 +8,18 @@ import { Slider } from "@base-ui/react/slider";
|
|
|
8
8
|
* A number, or a range, on a continuous scale (06-component-specs.md, increment 5). An array value
|
|
9
9
|
* renders one thumb per value. Arrow keys step, Page Up and Down take `largeStep`, Home and End jump.
|
|
10
10
|
*/
|
|
11
|
-
function Slider$1({ label, showValue, className, value, defaultValue, ...props }) {
|
|
11
|
+
function Slider$1({ label, showValue, messages, "aria-label": ariaLabel, locale, className, value, defaultValue, ...props }) {
|
|
12
|
+
const strings = useMessages("slider", messages);
|
|
13
|
+
const providerLocale = useLocale();
|
|
12
14
|
const initial = value ?? defaultValue;
|
|
13
15
|
const thumbs = Array.isArray(initial) ? initial.length : 1;
|
|
14
16
|
const range = thumbs > 1;
|
|
15
17
|
return /* @__PURE__ */ jsxs(Slider.Root, {
|
|
16
18
|
...props,
|
|
19
|
+
"aria-label": ariaLabel,
|
|
17
20
|
value,
|
|
18
21
|
defaultValue,
|
|
22
|
+
locale: locale ?? providerLocale,
|
|
19
23
|
className: cx("qx-slider", className),
|
|
20
24
|
"data-slot": "slider",
|
|
21
25
|
children: [(label != null || showValue) && /* @__PURE__ */ jsxs("div", {
|
|
@@ -40,7 +44,10 @@ function Slider$1({ label, showValue, className, value, defaultValue, ...props }
|
|
|
40
44
|
"data-slot": "slider-indicator"
|
|
41
45
|
}), Array.from({ length: thumbs }, (_, index) => /* @__PURE__ */ jsx(Slider.Thumb, {
|
|
42
46
|
index,
|
|
43
|
-
getAriaLabel: range ? (i) =>
|
|
47
|
+
getAriaLabel: range ? (i) => {
|
|
48
|
+
const bound = i === 0 ? strings.minimum : strings.maximum;
|
|
49
|
+
return ariaLabel ? `${ariaLabel}, ${bound}` : bound;
|
|
50
|
+
} : ariaLabel ? () => ariaLabel : null,
|
|
44
51
|
className: "qx-slider-thumb",
|
|
45
52
|
"data-slot": "slider-thumb"
|
|
46
53
|
}, index))]
|