@rvx/ui 0.4.4 → 0.4.6

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,4 +1,5 @@
1
1
  export type SizeContext = "content" | "group" | "control";
2
2
  export type AriaLive = "off" | "polite" | "assertive";
3
3
  export type AriaRelevant = "additions" | "removals" | "text" | "all" | "additions removals" | "additions text" | "removals text";
4
+ export type AriaCurrent = "page" | "step" | "location" | boolean;
4
5
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.tsx"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE1D,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC;AACtD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,eAAe,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.tsx"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE1D,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC;AACtD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,eAAe,CAAC;AACjI,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ClassValue, Content, Expression, StyleValue } from "rvx";
2
+ import { Action } from "../common/events.js";
3
+ import { AriaCurrent } from "../common/types.js";
4
+ export declare function NavBar(props: {
5
+ class?: ClassValue;
6
+ style?: StyleValue;
7
+ inlineSize?: Expression<string | undefined>;
8
+ start?: Content;
9
+ center?: Content;
10
+ end?: Content;
11
+ }): unknown;
12
+ export declare function NavBarButton(props: {
13
+ class?: ClassValue;
14
+ style?: StyleValue;
15
+ children?: unknown;
16
+ disabled?: Expression<boolean | undefined>;
17
+ action?: Action;
18
+ title?: Expression<string | undefined>;
19
+ current?: Expression<AriaCurrent | undefined>;
20
+ "aria-expanded"?: Expression<boolean | undefined>;
21
+ "aria-haspopup"?: Expression<string | undefined>;
22
+ "aria-controls"?: Expression<string | undefined>;
23
+ }): unknown;
24
+ //# sourceMappingURL=nav-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-bar.d.ts","sourceRoot":"","sources":["../../src/components/nav-bar.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAY,UAAU,EAAE,MAAM,KAAK,CAAC;AAG5E,OAAO,EAAE,MAAM,EAA4B,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,wBAAgB,MAAM,CAAC,KAAK,EAAE;IAC7B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACd,WAyBA;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IACnC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAE9C,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAClD,eAAe,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,eAAe,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACjD,WAoCA"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "rvx/jsx-runtime";
2
+ import styles from "@rvx/ui/theme/components/nav-bar.module.css";
3
+ import { get, map } from "rvx";
4
+ import { isPending } from "rvx/async";
5
+ import { optionalString } from "rvx/convert";
6
+ import { handleActionEvent, isKey } from "../common/events.js";
7
+ import { Row } from "./row.js";
8
+ export function NavBar(props) {
9
+ return _jsx("nav", { class: [
10
+ styles.nav,
11
+ props.class,
12
+ ], style: [
13
+ props.style,
14
+ {
15
+ "--nav-bar-inline-size": props.inlineSize,
16
+ }
17
+ ], children: _jsxs("div", { class: styles.grid, children: [_jsx("div", { class: styles.start, children: props.start }), _jsx("div", { class: styles.center, children: props.center }), _jsx("div", { class: styles.end, children: props.end })] }) });
18
+ }
19
+ export function NavBarButton(props) {
20
+ const disabled = () => isPending() || get(props.disabled);
21
+ function action(event) {
22
+ if (disabled() || !props.action) {
23
+ return;
24
+ }
25
+ handleActionEvent(event, props.action);
26
+ }
27
+ return _jsx("button", { type: "button", disabled: disabled, class: [
28
+ props.class,
29
+ styles.item,
30
+ map(props.current, current => current ? styles.current : undefined),
31
+ ], style: props.style, title: props.title, "aria-current": optionalString(props.current), "aria-expanded": optionalString(props["aria-expanded"]), "aria-haspopup": props["aria-haspopup"], "aria-controls": props["aria-controls"], "on:click": action, "on:keydown": event => {
32
+ if (isKey(event, "enter") || isKey(event, " ")) {
33
+ action(event);
34
+ }
35
+ }, children: _jsx(Row, { class: styles.item_content, align: "center", children: props.children }) });
36
+ }
37
+ //# sourceMappingURL=nav-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-bar.js","sourceRoot":"","sources":["../../src/components/nav-bar.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,MAAM,6CAA6C,CAAC;AACjE,OAAO,EAAmC,GAAG,EAAE,GAAG,EAAc,MAAM,KAAK,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAU,iBAAiB,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,UAAU,MAAM,CAAC,KAOtB;IACA,OAAO,cACN,KAAK,EAAE;YACN,MAAM,CAAC,GAAG;YACV,KAAK,CAAC,KAAK;SACX,EACD,KAAK,EAAE;YACN,KAAK,CAAC,KAAK;YACX;gBACC,uBAAuB,EAAE,KAAK,CAAC,UAAU;aACzC;SACD,YAED,eAAK,KAAK,EAAE,MAAM,CAAC,IAAI,aACtB,cAAK,KAAK,EAAE,MAAM,CAAC,KAAK,YACtB,KAAK,CAAC,KAAK,GACP,EACN,cAAK,KAAK,EAAE,MAAM,CAAC,MAAM,YACvB,KAAK,CAAC,MAAM,GACR,EACN,cAAK,KAAK,EAAE,MAAM,CAAC,GAAG,YACpB,KAAK,CAAC,GAAG,GACL,IACD,GACD,CAAC;AACR,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAY5B;IACA,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE1D,SAAS,MAAM,CAAC,KAAY;QAC3B,IAAI,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO;QACR,CAAC;QACD,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,iBACN,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE;YACN,KAAK,CAAC,KAAK;YACX,MAAM,CAAC,IAAI;YACX,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;SACnE,EACD,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,KAAK,EAAE,KAAK,CAAC,KAAK,kBACJ,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,mBAC5B,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,mBACtC,KAAK,CAAC,eAAe,CAAC,mBACtB,KAAK,CAAC,eAAe,CAAC,cAE3B,MAAM,gBACJ,KAAK,CAAC,EAAE;YACnB,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;QACF,CAAC,YAED,KAAC,GAAG,IAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAC,QAAQ,YAC7C,KAAK,CAAC,QAAQ,GACV,GACE,CAAC;AACX,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import "@rvx/ui/theme/global.css";
2
+ import "@rvx/ui/theme/types.d.ts";
2
3
  export * from "./common/context.js";
3
4
  export * from "./common/coupling.js";
4
5
  export * from "./common/events.js";
@@ -23,7 +24,7 @@ export * from "./components/heading.js";
23
24
  export * from "./components/label.js";
24
25
  export * from "./components/layer.js";
25
26
  export * from "./components/link.js";
26
- export * from "./components/nav-list.js";
27
+ export * from "./components/nav-bar.js";
27
28
  export * from "./components/notifications.js";
28
29
  export * from "./components/page.js";
29
30
  export * from "./components/placeholder.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,0BAA0B,CAAC;AAElC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,0BAA0B,CAAC;AAElC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import "@rvx/ui/theme/global.css";
2
+ import "@rvx/ui/theme/types.d.ts";
2
3
  export * from "./common/context.js";
3
4
  export * from "./common/coupling.js";
4
5
  export * from "./common/events.js";
@@ -23,7 +24,7 @@ export * from "./components/heading.js";
23
24
  export * from "./components/label.js";
24
25
  export * from "./components/layer.js";
25
26
  export * from "./components/link.js";
26
- export * from "./components/nav-list.js";
27
+ export * from "./components/nav-bar.js";
27
28
  export * from "./components/notifications.js";
28
29
  export * from "./components/page.js";
29
30
  export * from "./components/placeholder.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,0BAA0B,CAAC;AAElC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,0BAA0B,CAAC;AAElC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "rvx"
13
13
  ],
14
14
  "license": "MIT",
15
- "version": "0.4.4",
15
+ "version": "0.4.6",
16
16
  "type": "module",
17
17
  "main": "./dist/index.js",
18
18
  "sideEffects": false,
@@ -3,3 +3,4 @@ export type SizeContext = "content" | "group" | "control";
3
3
 
4
4
  export type AriaLive = "off" | "polite" | "assertive";
5
5
  export type AriaRelevant = "additions" | "removals" | "text" | "all" | "additions removals" | "additions text" | "removals text";
6
+ export type AriaCurrent = "page" | "step" | "location" | boolean;
@@ -0,0 +1,91 @@
1
+ import styles from "@rvx/ui/theme/components/nav-bar.module.css";
2
+ import { ClassValue, Content, Expression, get, map, StyleValue } from "rvx";
3
+ import { isPending } from "rvx/async";
4
+ import { optionalString } from "rvx/convert";
5
+ import { Action, handleActionEvent, isKey } from "../common/events.js";
6
+ import { AriaCurrent } from "../common/types.js";
7
+ import { Row } from "./row.js";
8
+
9
+ export function NavBar(props: {
10
+ class?: ClassValue;
11
+ style?: StyleValue;
12
+ inlineSize?: Expression<string | undefined>;
13
+ start?: Content;
14
+ center?: Content;
15
+ end?: Content;
16
+ }) {
17
+ return <nav
18
+ class={[
19
+ styles.nav,
20
+ props.class,
21
+ ]}
22
+ style={[
23
+ props.style,
24
+ {
25
+ "--nav-bar-inline-size": props.inlineSize,
26
+ }
27
+ ]}
28
+ >
29
+ <div class={styles.grid}>
30
+ <div class={styles.start}>
31
+ {props.start}
32
+ </div>
33
+ <div class={styles.center}>
34
+ {props.center}
35
+ </div>
36
+ <div class={styles.end}>
37
+ {props.end}
38
+ </div>
39
+ </div>
40
+ </nav>;
41
+ }
42
+
43
+ export function NavBarButton(props: {
44
+ class?: ClassValue;
45
+ style?: StyleValue;
46
+ children?: unknown;
47
+ disabled?: Expression<boolean | undefined>;
48
+ action?: Action;
49
+ title?: Expression<string | undefined>;
50
+ current?: Expression<AriaCurrent | undefined>;
51
+
52
+ "aria-expanded"?: Expression<boolean | undefined>;
53
+ "aria-haspopup"?: Expression<string | undefined>;
54
+ "aria-controls"?: Expression<string | undefined>;
55
+ }) {
56
+ const disabled = () => isPending() || get(props.disabled);
57
+
58
+ function action(event: Event) {
59
+ if (disabled() || !props.action) {
60
+ return;
61
+ }
62
+ handleActionEvent(event, props.action);
63
+ }
64
+
65
+ return <button
66
+ type="button"
67
+ disabled={disabled}
68
+ class={[
69
+ props.class,
70
+ styles.item,
71
+ map(props.current, current => current ? styles.current : undefined),
72
+ ]}
73
+ style={props.style}
74
+ title={props.title}
75
+ aria-current={optionalString(props.current)}
76
+ aria-expanded={optionalString(props["aria-expanded"])}
77
+ aria-haspopup={props["aria-haspopup"]}
78
+ aria-controls={props["aria-controls"]}
79
+
80
+ on:click={action}
81
+ on:keydown={event => {
82
+ if (isKey(event, "enter") || isKey(event, " ")) {
83
+ action(event);
84
+ }
85
+ }}
86
+ >
87
+ <Row class={styles.item_content} align="center">
88
+ {props.children}
89
+ </Row>
90
+ </button>;
91
+ }
package/src/index.tsx CHANGED
@@ -1,5 +1,5 @@
1
- /// <reference types="@rvx/ui/theme/types.d.ts" />
2
1
  import "@rvx/ui/theme/global.css";
2
+ import "@rvx/ui/theme/types.d.ts";
3
3
 
4
4
  export * from "./common/context.js";
5
5
  export * from "./common/coupling.js";
@@ -25,7 +25,7 @@ export * from "./components/heading.js";
25
25
  export * from "./components/label.js";
26
26
  export * from "./components/layer.js";
27
27
  export * from "./components/link.js";
28
- export * from "./components/nav-list.js";
28
+ export * from "./components/nav-bar.js";
29
29
  export * from "./components/notifications.js";
30
30
  export * from "./components/page.js";
31
31
  export * from "./components/placeholder.js";
@@ -85,6 +85,7 @@
85
85
  }
86
86
 
87
87
  .item {
88
+ text-align: left;
88
89
  --button-bg: var(--button-item-bg);
89
90
  --button-fg: var(--button-item-fg);
90
91
  --button-active: var(--button-item-active);
@@ -28,6 +28,9 @@
28
28
  border-start-end-radius: 0;
29
29
  border-end-end-radius: 0;
30
30
  }
31
+ & > * {
32
+ margin-inline-start: calc((var(--space-scale) - 1) * var(--separator));
33
+ }
31
34
  }
32
35
 
33
36
  .column {
@@ -48,4 +51,7 @@
48
51
  border-end-start-radius: 0;
49
52
  border-end-end-radius: 0;
50
53
  }
54
+ & > * {
55
+ margin-block-start: calc((var(--space-scale) - 1) * var(--separator));
56
+ }
51
57
  }
@@ -0,0 +1,85 @@
1
+
2
+ .nav {
3
+ background-color: var(--bg-alt);
4
+ display: flex;
5
+ flex-direction: row;
6
+ justify-content: center;
7
+ }
8
+
9
+ .grid {
10
+ flex-grow: 1;
11
+ max-inline-size: var(--nav-bar-inline-size);
12
+ margin-inline: var(--page-padding-inline);
13
+
14
+ display: grid;
15
+ grid-template-columns: 1fr auto 1fr;
16
+ gap: var(--group-column-gap);
17
+ }
18
+
19
+ .start,
20
+ .center,
21
+ .end {
22
+ display: flex;
23
+ flex-direction: row;
24
+ gap: var(--group-column-gap);
25
+ }
26
+
27
+ .start {
28
+ justify-content: start;
29
+ }
30
+
31
+ .end {
32
+ justify-content: end;
33
+ }
34
+
35
+ .item {
36
+ display: flex;
37
+ flex-direction: row;
38
+ align-items: stretch;
39
+
40
+ font-family: inherit;
41
+ font-size: inherit;
42
+ font-weight: 600;
43
+ line-height: 1;
44
+
45
+ cursor: pointer;
46
+ outline: none;
47
+
48
+ padding: 0;
49
+ border: none;
50
+
51
+ background-color: transparent;
52
+ color: var(--fg-secondary);
53
+
54
+ &[disabled] {
55
+ cursor: default;
56
+ filter: var(--control-disabled);
57
+ }
58
+ }
59
+
60
+ .item_content {
61
+ padding-block: var(--content-padding-block) calc(var(--content-padding-block) - var(--content-border));
62
+
63
+ border-block-end: var(--content-border) solid transparent;
64
+
65
+ transition: background-color var(--transition-color),
66
+ margin var(--transition-color),
67
+ padding var(--transition-color);
68
+
69
+ .item:hover:not(:active):not([disabled]) > &,
70
+ .item:focus-visible:not(:active):not([disabled]) > & {
71
+ background-color: var(--bg-active);
72
+ }
73
+
74
+ .item:hover:not([disabled]) > &,
75
+ .item:focus-visible:not([disabled]) > & {
76
+ margin-inline: calc(var(--group-column-gap) / -2);
77
+ padding-inline: calc(var(--group-column-gap) / 2);
78
+ z-index: 1;
79
+ }
80
+
81
+ .current > & {
82
+ color: var(--fg);
83
+ border-block-end-color: var(--accent);
84
+ }
85
+ }
@@ -18,7 +18,7 @@
18
18
  cursor: pointer;
19
19
  outline: none;
20
20
 
21
- padding-block: var(--control-padding-block);
21
+ padding-block: calc(var(--control-padding-block) + var(--control-border)) var(--control-padding-block);
22
22
  padding-inline: calc(var(--control-padding-inline) + var(--control-border));
23
23
 
24
24
  background-color: transparent;
package/theme/global.css CHANGED
@@ -67,10 +67,12 @@ body {
67
67
  --bg: rgb(24 24 24);
68
68
  --bg-alt: rgb(32 32 32);
69
69
  --bg-selection: rgb(64 150 255 / .5);
70
+ --bg-active: rgb(48 48 48);
70
71
 
71
72
  --fg: white;
72
73
  --accent: rgb(64 160 255);
73
74
  --fg-danger: rgb(255 64 64);
75
+ --fg-secondary: rgb(255 255 255 / .6);
74
76
 
75
77
  --secondary-filter: opacity(.6);
76
78
 
@@ -95,10 +97,12 @@ body {
95
97
  --bg: white;
96
98
  --bg-alt: rgb(250 250 250);
97
99
  --bg-selection: rgb(0 127 255 / .3);
100
+ --bg-active: rgb(232 232 232);
98
101
 
99
102
  --fg: rgb(42 42 42);
100
103
  --accent: rgb(0 127 255);
101
104
  --fg-danger: rgb(255 64 64);
105
+ --fg-secondary: rgb(42 42 42 / .6);
102
106
 
103
107
  --secondary-filter: opacity(.65);
104
108
 
@@ -1,19 +0,0 @@
1
- import { ClassValue, Expression, StyleValue } from "rvx";
2
- import { Action } from "../common/events.js";
3
- export declare function NavList(props: {
4
- role?: Expression<string | false | undefined>;
5
- class?: ClassValue;
6
- style?: StyleValue;
7
- id?: Expression<string | undefined>;
8
- children?: unknown;
9
- }): unknown;
10
- export declare function NavListButton(props: {
11
- current?: Expression<boolean | undefined>;
12
- disabled?: Expression<boolean | undefined>;
13
- class?: ClassValue;
14
- style?: StyleValue;
15
- id?: Expression<string | undefined>;
16
- action?: Action;
17
- children?: unknown;
18
- }): unknown;
19
- //# sourceMappingURL=nav-list.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nav-list.d.ts","sourceRoot":"","sources":["../../src/components/nav-list.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAY,UAAU,EAAE,MAAM,KAAK,CAAC;AAGnE,OAAO,EAAE,MAAM,EAA4B,MAAM,qBAAqB,CAAC;AAEvE,wBAAgB,OAAO,CAAC,KAAK,EAAE;IAM9B,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;IAE9C,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAeV;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAIpC,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAE1C,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CA8BV"}
@@ -1,34 +0,0 @@
1
- import { jsx as _jsx } from "rvx/jsx-runtime";
2
- import styles from "@rvx/ui/theme/components/nav-list.module.css";
3
- import { get, map } from "rvx";
4
- import { isPending } from "rvx/async";
5
- import { optionalString } from "rvx/convert";
6
- import { handleActionEvent, isKey } from "../common/events.js";
7
- export function NavList(props) {
8
- return _jsx("div", { class: [
9
- styles.nav_list,
10
- props.class,
11
- ], style: [
12
- { "--nav-list-depth": String(0) },
13
- props.style,
14
- ], id: props.id, role: map(props.role, role => role ?? "navigation"), children: props.children });
15
- }
16
- export function NavListButton(props) {
17
- const disabled = () => isPending() || get(props.disabled);
18
- function action(event) {
19
- if (disabled() || !props.action) {
20
- return;
21
- }
22
- handleActionEvent(event, props.action);
23
- }
24
- return _jsx("button", { type: "button", disabled: disabled, class: [
25
- styles.item,
26
- map(props.current, current => current && styles.item_current),
27
- props.class,
28
- ], style: props.style, id: props.id, "on:click": action, "on:keydown": event => {
29
- if (isKey(event, "enter") || isKey(event, " ")) {
30
- action(event);
31
- }
32
- }, "aria-current": optionalString(props.current), children: props.children });
33
- }
34
- //# sourceMappingURL=nav-list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nav-list.js","sourceRoot":"","sources":["../../src/components/nav-list.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,MAAM,8CAA8C,CAAC;AAClE,OAAO,EAA0B,GAAG,EAAE,GAAG,EAAc,MAAM,KAAK,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAU,iBAAiB,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEvE,MAAM,UAAU,OAAO,CAAC,KAYvB;IACA,OAAO,cACN,KAAK,EAAE;YACN,MAAM,CAAC,QAAQ;YACf,KAAK,CAAC,KAAK;SACX,EACD,KAAK,EAAE;YACN,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;YACjC,KAAK,CAAC,KAAK;SACX,EACD,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,YAAY,CAAC,YAElD,KAAK,CAAC,QAAQ,GACV,CAAC;AACR,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAY7B;IACA,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE1D,SAAS,MAAM,CAAC,KAAY;QAC3B,IAAI,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO;QACR,CAAC;QACD,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,iBACN,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE;YACN,MAAM,CAAC,IAAI;YACX,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC;YAC7D,KAAK,CAAC,KAAK;SACX,EACD,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,EAAE,EAAE,KAAK,CAAC,EAAE,cACF,MAAM,gBACJ,KAAK,CAAC,EAAE;YACnB,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;QACF,CAAC,kBACa,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,YAE1C,KAAK,CAAC,QAAQ,GACP,CAAC;AACX,CAAC"}
@@ -1,78 +0,0 @@
1
- import styles from "@rvx/ui/theme/components/nav-list.module.css";
2
- import { ClassValue, Expression, get, map, StyleValue } from "rvx";
3
- import { isPending } from "rvx/async";
4
- import { optionalString } from "rvx/convert";
5
- import { Action, handleActionEvent, isKey } from "../common/events.js";
6
-
7
- export function NavList(props: {
8
- /**
9
- * The element role or `false` to disable.
10
- *
11
- * @default "navigation"
12
- */
13
- role?: Expression<string | false | undefined>;
14
-
15
- class?: ClassValue;
16
- style?: StyleValue;
17
- id?: Expression<string | undefined>;
18
- children?: unknown;
19
- }): unknown {
20
- return <div
21
- class={[
22
- styles.nav_list,
23
- props.class,
24
- ]}
25
- style={[
26
- { "--nav-list-depth": String(0) },
27
- props.style,
28
- ]}
29
- id={props.id}
30
- role={map(props.role, role => role ?? "navigation")}
31
- >
32
- {props.children}
33
- </div>;
34
- }
35
-
36
- export function NavListButton(props: {
37
- /**
38
- * True if this is the currently selected item.
39
- */
40
- current?: Expression<boolean | undefined>;
41
-
42
- disabled?: Expression<boolean | undefined>;
43
- class?: ClassValue;
44
- style?: StyleValue;
45
- id?: Expression<string | undefined>;
46
- action?: Action;
47
- children?: unknown;
48
- }): unknown {
49
- const disabled = () => isPending() || get(props.disabled);
50
-
51
- function action(event: Event) {
52
- if (disabled() || !props.action) {
53
- return;
54
- }
55
- handleActionEvent(event, props.action);
56
- }
57
-
58
- return <button
59
- type="button"
60
- disabled={disabled}
61
- class={[
62
- styles.item,
63
- map(props.current, current => current && styles.item_current),
64
- props.class,
65
- ]}
66
- style={props.style}
67
- id={props.id}
68
- on:click={action}
69
- on:keydown={event => {
70
- if (isKey(event, "enter") || isKey(event, " ")) {
71
- action(event);
72
- }
73
- }}
74
- aria-current={optionalString(props.current)}
75
- >
76
- {props.children}
77
- </button>;
78
- }
@@ -1,76 +0,0 @@
1
-
2
- .nav_list {
3
- display: flex;
4
- flex-direction: column;
5
- position: relative;
6
- z-index: 0;
7
- }
8
-
9
- .item {
10
- font-family: inherit;
11
- font-size: inherit;
12
- font-weight: 600;
13
- line-height: 1;
14
- text-align: left;
15
-
16
- background-color: var(--nav-list-item-bg);
17
- color: var(--nav-list-item-fg);
18
- border: var(--nav-list-item-border) solid var(--control-border);
19
- border-radius: var(--control-radius);
20
-
21
- cursor: pointer;
22
-
23
- outline: none;
24
- padding-block: var(--control-padding-block);
25
- padding-inline: var(--control-padding-inline);
26
-
27
- transition: var(--transition-color) background-color,
28
- var(--transition-color) border-color;
29
-
30
- &[disabled] {
31
- cursor: default;
32
- filter: var(--control-disabled);
33
- }
34
-
35
- &:hover:not(:active):not([disabled]),
36
- &:focus-visible {
37
- color: var(--nav-list-item-fg-hover);
38
- background-color: var(--nav-list-item-bg-hover);
39
- }
40
-
41
- &:active {
42
- color: var(--nav-list-item-fg-active);
43
- background-color: var(--nav-list-item-bg-active);
44
- }
45
- }
46
-
47
- .item_current {
48
- color: var(--nav-list-item-fg-current);
49
- background-color: var(--nav-list-item-bg-current);
50
- box-shadow: var(--control-shadow);
51
- z-index: 1;
52
- }
53
-
54
- :global(.rvx-dark) {
55
- --nav-list-item-bg: transparent;
56
- --nav-list-item-bg-hover: rgb(255 255 255 / .1);
57
- --nav-list-item-bg-active: rgb(255 255 255 / .08);
58
- --nav-list-item-bg-current: rgb(255 255 255 / .1);
59
- --nav-list-item-fg: rgb(172 172 172);
60
- --nav-list-item-fg-hover: var(--fg);
61
- --nav-list-item-fg-active: var(--fg);
62
- --nav-list-item-fg-current: var(--fg);
63
- --nav-list-item-border: transparent;
64
- }
65
-
66
- :global(.rvx-light) {
67
- --nav-list-item-bg: transparent;
68
- --nav-list-item-bg-hover: rgb(0 0 0 / .075);
69
- --nav-list-item-bg-active: rgb(0 0 0 / .125);
70
- --nav-list-item-bg-current: rgb(0 0 0 / .125);
71
- --nav-list-item-fg: rgb(72 72 72);
72
- --nav-list-item-fg-hover: var(--fg);
73
- --nav-list-item-fg-active: var(--fg);
74
- --nav-list-item-fg-current: var(--fg);
75
- --nav-list-item-border: transparent;
76
- }