@malilion/block-ui-react 0.4.0 → 0.5.1

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.
Files changed (99) hide show
  1. package/dist/components/actions/BlockMenu/BlockMenu.d.ts.map +1 -1
  2. package/dist/components/actions/BlockMenu/BlockMenu.js +17 -117
  3. package/dist/components/actions/BlockMenu/BlockMenu.js.map +1 -1
  4. package/dist/components/actions/BlockMenu/BlockMenu.utils.d.ts +2 -0
  5. package/dist/components/actions/BlockMenu/BlockMenu.utils.d.ts.map +1 -1
  6. package/dist/components/actions/BlockMenu/BlockMenu.utils.js +5 -1
  7. package/dist/components/actions/BlockMenu/BlockMenu.utils.js.map +1 -1
  8. package/dist/components/actions/BlockMenu/MenuList.d.ts +28 -0
  9. package/dist/components/actions/BlockMenu/MenuList.d.ts.map +1 -0
  10. package/dist/components/actions/BlockMenu/MenuList.js +134 -0
  11. package/dist/components/actions/BlockMenu/MenuList.js.map +1 -0
  12. package/dist/components/actions/ContextMenu/ContextMenu.d.ts +8 -0
  13. package/dist/components/actions/ContextMenu/ContextMenu.d.ts.map +1 -0
  14. package/dist/components/actions/ContextMenu/ContextMenu.js +100 -0
  15. package/dist/components/actions/ContextMenu/ContextMenu.js.map +1 -0
  16. package/dist/components/actions/ContextMenu/ContextMenu.module.js +7 -0
  17. package/dist/components/actions/ContextMenu/ContextMenu.module.js.map +1 -0
  18. package/dist/components/actions/ContextMenu/ContextMenu.types.d.ts +15 -0
  19. package/dist/components/actions/ContextMenu/ContextMenu.types.d.ts.map +1 -0
  20. package/dist/components/actions/ContextMenu/index.d.ts +3 -0
  21. package/dist/components/actions/ContextMenu/index.d.ts.map +1 -0
  22. package/dist/components/actions/index.d.ts +1 -0
  23. package/dist/components/actions/index.d.ts.map +1 -1
  24. package/dist/components/crafting/RecipeBook/RecipeBook.js +2 -2
  25. package/dist/components/crafting/RecipeBook/RecipeBook.js.map +1 -1
  26. package/dist/components/display/Kbd/Kbd.d.ts +4 -0
  27. package/dist/components/display/Kbd/Kbd.d.ts.map +1 -0
  28. package/dist/components/display/Kbd/Kbd.js +33 -0
  29. package/dist/components/display/Kbd/Kbd.js.map +1 -0
  30. package/dist/components/display/Kbd/Kbd.module.js +13 -0
  31. package/dist/components/display/Kbd/Kbd.module.js.map +1 -0
  32. package/dist/components/display/Kbd/Kbd.types.d.ts +9 -0
  33. package/dist/components/display/Kbd/Kbd.types.d.ts.map +1 -0
  34. package/dist/components/display/Kbd/index.d.ts +3 -0
  35. package/dist/components/display/Kbd/index.d.ts.map +1 -0
  36. package/dist/components/display/Popover/Popover.d.ts +8 -0
  37. package/dist/components/display/Popover/Popover.d.ts.map +1 -0
  38. package/dist/components/display/Popover/Popover.js +101 -0
  39. package/dist/components/display/Popover/Popover.js.map +1 -0
  40. package/dist/components/display/Popover/Popover.module.js +15 -0
  41. package/dist/components/display/Popover/Popover.module.js.map +1 -0
  42. package/dist/components/display/Popover/Popover.types.d.ts +26 -0
  43. package/dist/components/display/Popover/Popover.types.d.ts.map +1 -0
  44. package/dist/components/display/Popover/index.d.ts +3 -0
  45. package/dist/components/display/Popover/index.d.ts.map +1 -0
  46. package/dist/components/display/SkillTree/SkillTree.js +2 -2
  47. package/dist/components/display/SkillTree/SkillTree.js.map +1 -1
  48. package/dist/components/display/index.d.ts +2 -0
  49. package/dist/components/display/index.d.ts.map +1 -1
  50. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.js +2 -2
  51. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.js.map +1 -1
  52. package/dist/components/inventory/InventorySlot/InventorySlot.js +2 -2
  53. package/dist/components/inventory/InventorySlot/InventorySlot.js.map +1 -1
  54. package/dist/components/layout/BlockContainer/BlockContainer.d.ts +4 -0
  55. package/dist/components/layout/BlockContainer/BlockContainer.d.ts.map +1 -0
  56. package/dist/components/layout/BlockContainer/BlockContainer.js +18 -0
  57. package/dist/components/layout/BlockContainer/BlockContainer.js.map +1 -0
  58. package/dist/components/layout/BlockContainer/BlockContainer.module.js +7 -0
  59. package/dist/components/layout/BlockContainer/BlockContainer.module.js.map +1 -0
  60. package/dist/components/layout/BlockContainer/BlockContainer.types.d.ts +11 -0
  61. package/dist/components/layout/BlockContainer/BlockContainer.types.d.ts.map +1 -0
  62. package/dist/components/layout/BlockContainer/index.d.ts +3 -0
  63. package/dist/components/layout/BlockContainer/index.d.ts.map +1 -0
  64. package/dist/components/layout/BlockGrid/BlockGrid.d.ts +4 -0
  65. package/dist/components/layout/BlockGrid/BlockGrid.d.ts.map +1 -0
  66. package/dist/components/layout/BlockGrid/BlockGrid.js +25 -0
  67. package/dist/components/layout/BlockGrid/BlockGrid.js.map +1 -0
  68. package/dist/components/layout/BlockGrid/BlockGrid.module.js +7 -0
  69. package/dist/components/layout/BlockGrid/BlockGrid.module.js.map +1 -0
  70. package/dist/components/layout/BlockGrid/BlockGrid.types.d.ts +16 -0
  71. package/dist/components/layout/BlockGrid/BlockGrid.types.d.ts.map +1 -0
  72. package/dist/components/layout/BlockGrid/index.d.ts +3 -0
  73. package/dist/components/layout/BlockGrid/index.d.ts.map +1 -0
  74. package/dist/components/layout/index.d.ts +2 -0
  75. package/dist/components/layout/index.d.ts.map +1 -1
  76. package/dist/components/navigation/BlockSidebar/BlockSidebar.js +3 -3
  77. package/dist/components/navigation/BlockSidebar/BlockSidebar.js.map +1 -1
  78. package/dist/components/navigation/BlockStepper/BlockStepper.d.ts +8 -0
  79. package/dist/components/navigation/BlockStepper/BlockStepper.d.ts.map +1 -0
  80. package/dist/components/navigation/BlockStepper/BlockStepper.js +66 -0
  81. package/dist/components/navigation/BlockStepper/BlockStepper.js.map +1 -0
  82. package/dist/components/navigation/BlockStepper/BlockStepper.module.js +23 -0
  83. package/dist/components/navigation/BlockStepper/BlockStepper.module.js.map +1 -0
  84. package/dist/components/navigation/BlockStepper/BlockStepper.types.d.ts +19 -0
  85. package/dist/components/navigation/BlockStepper/BlockStepper.types.d.ts.map +1 -0
  86. package/dist/components/navigation/BlockStepper/index.d.ts +3 -0
  87. package/dist/components/navigation/BlockStepper/index.d.ts.map +1 -0
  88. package/dist/components/navigation/Breadcrumb/Breadcrumb.js +2 -2
  89. package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -1
  90. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.js +3 -3
  91. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.js.map +1 -1
  92. package/dist/components/navigation/index.d.ts +1 -0
  93. package/dist/components/navigation/index.d.ts.map +1 -1
  94. package/dist/hooks/useAnchoredPosition.d.ts +3 -1
  95. package/dist/hooks/useAnchoredPosition.d.ts.map +1 -1
  96. package/dist/hooks/useAnchoredPosition.js.map +1 -1
  97. package/dist/index.js +7 -1
  98. package/dist/styles.css +281 -0
  99. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockContainer.types.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/BlockContainer/BlockContainer.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,mBAAoB,SAAQ,cAAc,CAAC,WAAW,CAAC;IACtE,uFAAuF;IACvF,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IAC1C,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oDAAoD;IACpD,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
@@ -0,0 +1,3 @@
1
+ export { BlockContainer } from "./BlockContainer";
2
+ export type { BlockContainerProps } from "./BlockContainer.types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/BlockContainer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { BlockGridProps } from "./BlockGrid.types";
2
+ /** Two-dimensional grid: fixed equal columns, or auto-fill with a minimum item width. */
3
+ export declare const BlockGrid: import("react").ForwardRefExoticComponent<BlockGridProps & import("react").RefAttributes<HTMLElement>>;
4
+ //# sourceMappingURL=BlockGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockGrid.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/BlockGrid/BlockGrid.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,yFAAyF;AACzF,eAAO,MAAM,SAAS,wGAgCpB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { cx } from "../../../utils/cx.js";
2
+ import BlockGrid_module_default from "./BlockGrid.module.js";
3
+ import { createElement, forwardRef } from "react";
4
+ //#region src/components/layout/BlockGrid/BlockGrid.tsx
5
+ /** Two-dimensional grid: fixed equal columns, or auto-fill with a minimum item width. */
6
+ var BlockGrid = forwardRef(function BlockGrid({ columns = 2, minItemWidth, gap = 4, stackOnMobile = true, as = "div", className, style, children, ...rest }, ref) {
7
+ const auto = minItemWidth !== void 0;
8
+ return createElement(as, {
9
+ ref,
10
+ "data-mode": auto ? "auto" : "fixed",
11
+ "data-stack-mobile": !auto && stackOnMobile || void 0,
12
+ className: cx(BlockGrid_module_default.grid, className),
13
+ style: {
14
+ "--block-grid-columns": Math.max(1, Math.floor(columns)),
15
+ "--block-grid-min": minItemWidth,
16
+ "--block-grid-gap": `var(--block-space-${gap})`,
17
+ ...style
18
+ },
19
+ ...rest
20
+ }, children);
21
+ });
22
+ //#endregion
23
+ export { BlockGrid };
24
+
25
+ //# sourceMappingURL=BlockGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockGrid.js","names":["styles"],"sources":["../../../../src/components/layout/BlockGrid/BlockGrid.tsx"],"sourcesContent":["import { createElement, forwardRef, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./BlockGrid.module.css\";\nimport type { BlockGridProps } from \"./BlockGrid.types\";\n\n/** Two-dimensional grid: fixed equal columns, or auto-fill with a minimum item width. */\nexport const BlockGrid = forwardRef<HTMLElement, BlockGridProps>(function BlockGrid(\n {\n columns = 2,\n minItemWidth,\n gap = 4,\n stackOnMobile = true,\n as = \"div\",\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const auto = minItemWidth !== undefined;\n return createElement(\n as,\n {\n ref,\n \"data-mode\": auto ? \"auto\" : \"fixed\",\n \"data-stack-mobile\": (!auto && stackOnMobile) || undefined,\n className: cx(styles.grid, className),\n style: {\n \"--block-grid-columns\": Math.max(1, Math.floor(columns)),\n \"--block-grid-min\": minItemWidth,\n \"--block-grid-gap\": `var(--block-space-${gap})`,\n ...style,\n } as CSSProperties,\n ...rest,\n },\n children,\n );\n});\n"],"mappings":";;;;;AAMA,IAAa,YAAY,WAAwC,SAAS,UACxE,EACE,UAAU,GACV,cACA,MAAM,GACN,gBAAgB,MAChB,KAAK,OACL,WACA,OACA,UACA,GAAG,QAEL,KACA;CACA,MAAM,OAAO,iBAAiB,KAAA;CAC9B,OAAO,cACL,IACA;EACE;EACA,aAAa,OAAO,SAAS;EAC7B,qBAAsB,CAAC,QAAQ,iBAAkB,KAAA;EACjD,WAAW,GAAGA,yBAAO,MAAM,SAAS;EACpC,OAAO;GACL,wBAAwB,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC;GACvD,oBAAoB;GACpB,oBAAoB,qBAAqB,IAAI;GAC7C,GAAG;EACL;EACA,GAAG;CACL,GACA,QACF;AACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ //#region src/components/layout/BlockGrid/BlockGrid.module.css
2
+ var grid = "block-grid-skICT";
3
+ var BlockGrid_module_default = { grid };
4
+ //#endregion
5
+ export { BlockGrid_module_default as default, grid };
6
+
7
+ //# sourceMappingURL=BlockGrid.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockGrid.module.js","names":[],"sources":["../../../../src/components/layout/BlockGrid/BlockGrid.module.css"],"sourcesContent":[".grid {\n display: grid;\n gap: var(--block-grid-gap);\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.grid[data-mode=\"fixed\"] {\n grid-template-columns: repeat(var(--block-grid-columns), minmax(0, 1fr));\n}\n\n.grid[data-mode=\"auto\"] {\n grid-template-columns: repeat(auto-fill, minmax(min(var(--block-grid-min), 100%), 1fr));\n}\n\n@media (max-width: 767.98px) {\n .grid[data-stack-mobile] {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { HTMLAttributes, ReactNode } from "react";
2
+ import type { BlockStackGap } from "../BlockStack/BlockStack.types";
3
+ export interface BlockGridProps extends HTMLAttributes<HTMLElement> {
4
+ /** Fixed number of equal columns. Ignored when `minItemWidth` is set. @default 2 */
5
+ columns?: number;
6
+ /** Fit as many columns as possible, each at least this wide (e.g. `"240px"`). */
7
+ minItemWidth?: string;
8
+ /** Spacing token step between cells. @default 4 */
9
+ gap?: BlockStackGap;
10
+ /** Collapse fixed columns to one below 768px. @default true */
11
+ stackOnMobile?: boolean;
12
+ /** Render as a different element. @default "div" */
13
+ as?: "div" | "section" | "ul" | "ol";
14
+ children?: ReactNode;
15
+ }
16
+ //# sourceMappingURL=BlockGrid.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockGrid.types.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/BlockGrid/BlockGrid.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,WAAW,CAAC;IACjE,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oDAAoD;IACpD,EAAE,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
@@ -0,0 +1,3 @@
1
+ export { BlockGrid } from "./BlockGrid";
2
+ export type { BlockGridProps } from "./BlockGrid.types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/BlockGrid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -2,4 +2,6 @@ export * from "./BlockPanel";
2
2
  export * from "./BlockStack";
3
3
  export * from "./BlockDivider";
4
4
  export * from "./Accordion";
5
+ export * from "./BlockGrid";
6
+ export * from "./BlockContainer";
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/layout/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/layout/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
@@ -3,7 +3,7 @@ import { useMediaQuery } from "../../../hooks/useMediaQuery.js";
3
3
  import BlockSidebar_module_default from "./BlockSidebar.module.js";
4
4
  import { SidebarContext, useSidebar } from "./context.js";
5
5
  import { forwardRef, useMemo } from "react";
6
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { media } from "@malilion/block-ui-tokens";
8
8
  //#region src/components/navigation/BlockSidebar/BlockSidebar.tsx
9
9
  /**
@@ -51,7 +51,7 @@ var SidebarItem = forwardRef(function SidebarItem({ icon, active = false, href,
51
51
  }
52
52
  onClick?.(event);
53
53
  };
54
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [
54
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
55
55
  icon ? /* @__PURE__ */ jsx("span", {
56
56
  className: BlockSidebar_module_default.icon,
57
57
  "aria-hidden": "true",
@@ -61,7 +61,7 @@ var SidebarItem = forwardRef(function SidebarItem({ icon, active = false, href,
61
61
  className: BlockSidebar_module_default.label,
62
62
  children
63
63
  }),
64
- badge !== void 0 && badge !== null ? /* @__PURE__ */ jsxs(Fragment, { children: [" ", /* @__PURE__ */ jsx("span", {
64
+ badge !== void 0 && badge !== null ? /* @__PURE__ */ jsxs(Fragment$1, { children: [" ", /* @__PURE__ */ jsx("span", {
65
65
  className: BlockSidebar_module_default.badge,
66
66
  children: badge
67
67
  })] }) : null
@@ -1 +1 @@
1
- {"version":3,"file":"BlockSidebar.js","names":["styles","_Fragment"],"sources":["../../../../src/components/navigation/BlockSidebar/BlockSidebar.tsx"],"sourcesContent":["import { media } from \"@malilion/block-ui-tokens\";\nimport { forwardRef, useMemo, type MouseEvent, type Ref } from \"react\";\nimport { useMediaQuery } from \"../../../hooks/useMediaQuery\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./BlockSidebar.module.css\";\nimport type { BlockSidebarProps, SidebarItemProps } from \"./BlockSidebar.types\";\nimport { SidebarContext, useSidebar } from \"./context\";\n\n/**\n * Main navigation rail. Collapses to icons on tablet and hides on mobile when\n * `responsive` (pair it with `HotbarNavigation`).\n */\nexport const BlockSidebar = forwardRef<HTMLElement, BlockSidebarProps>(function BlockSidebar(\n {\n header,\n footer,\n collapsed = false,\n responsive = true,\n label = \"Main\",\n className,\n children,\n ...rest\n },\n ref,\n) {\n const tablet = useMediaQuery(media.tablet);\n const isCollapsed = collapsed || (responsive && tablet);\n const context = useMemo(() => ({ collapsed: isCollapsed }), [isCollapsed]);\n\n return (\n <nav\n ref={ref}\n aria-label={label}\n data-collapsed={isCollapsed || undefined}\n data-responsive={responsive || undefined}\n className={cx(styles.sidebar, className)}\n {...rest}\n >\n {header ? <div className={styles.header}>{header}</div> : null}\n <SidebarContext.Provider value={context}>\n <ul className={styles.list}>{children}</ul>\n </SidebarContext.Provider>\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </nav>\n );\n});\n\n/** A sidebar entry. Renders `<a>` with `href`, otherwise `<button>`. */\nexport const SidebarItem = forwardRef<HTMLElement, SidebarItemProps>(function SidebarItem(\n {\n icon,\n active = false,\n href,\n onClick,\n badge,\n disabled = false,\n className,\n children,\n title,\n ...rest\n },\n ref,\n) {\n const { collapsed } = useSidebar();\n const tooltip = title ?? (collapsed && typeof children === \"string\" ? children : undefined);\n\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n const content = (\n <>\n {icon ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <span className={styles.label}>{children}</span>\n {badge !== undefined && badge !== null ? (\n <>\n {\" \"}\n <span className={styles.badge}>{badge}</span>\n </>\n ) : null}\n </>\n );\n\n const shared = {\n className: cx(styles.item, className),\n \"aria-current\": active ? (\"page\" as const) : undefined,\n \"aria-disabled\": disabled || undefined,\n \"data-active\": active || undefined,\n title: tooltip,\n onClick: handleClick,\n };\n\n return (\n <li className={styles.listItem}>\n {href !== undefined ? (\n <a\n ref={ref as Ref<HTMLAnchorElement>}\n href={disabled ? undefined : href}\n {...shared}\n {...rest}\n >\n {content}\n </a>\n ) : (\n <button ref={ref as Ref<HTMLButtonElement>} type=\"button\" {...shared}>\n {content}\n </button>\n )}\n </li>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,eAAe,WAA2C,SAAS,aAC9E,EACE,QACA,QACA,YAAY,OACZ,aAAa,MACb,QAAQ,QACR,WACA,UACA,GAAG,QAEL,KACA;CACA,MAAM,SAAS,cAAc,MAAM,MAAM;CACzC,MAAM,cAAc,aAAc,cAAc;CAChD,MAAM,UAAU,eAAe,EAAE,WAAW,YAAY,IAAI,CAAC,WAAW,CAAC;CAEzE,OACE,qBAAC,OAAD;EACO;EACL,cAAY;EACZ,kBAAgB,eAAe,KAAA;EAC/B,mBAAiB,cAAc,KAAA;EAC/B,WAAW,GAAGA,4BAAO,SAAS,SAAS;EACvC,GAAI;EANN,UAAA;GAQG,SAAS,oBAAC,OAAD;IAAK,WAAWA,4BAAO;IAAS,UAAA;GAAY,CAAA,IAAI;GAC1D,oBAAC,eAAe,UAAhB;IAAyB,OAAO;IAC9B,UAAA,oBAAC,MAAD;KAAI,WAAWA,4BAAO;KAAO;IAAa,CAAA;GACnB,CAAA;GACxB,SAAS,oBAAC,OAAD;IAAK,WAAWA,4BAAO;IAAS,UAAA;GAAY,CAAA,IAAI;EACvD;;AAET,CAAC;;AAGD,IAAa,cAAc,WAA0C,SAAS,YAC5E,EACE,MACA,SAAS,OACT,MACA,SACA,OACA,WAAW,OACX,WACA,UACA,OACA,GAAG,QAEL,KACA;CACA,MAAM,EAAE,cAAc,WAAW;CACjC,MAAM,UAAU,UAAU,aAAa,OAAO,aAAa,WAAW,WAAW,KAAA;CAEjF,MAAM,eAAe,UAAmC;EACtD,IAAI,UAAU;GACZ,MAAM,eAAe;GACrB;EACF;EACA,UAAU,KAAK;CACjB;CAEA,MAAM,UACJ,qBAAAC,UAAA,EAAA,UAAA;EACG,OACC,oBAAC,QAAD;GAAM,WAAWD,4BAAO;GAAM,eAAY;GACvC,UAAA;EACG,CAAA,IACJ;EACJ,oBAAC,QAAD;GAAM,WAAWA,4BAAO;GAAQ;EAAe,CAAA;EAC9C,UAAU,KAAA,KAAa,UAAU,OAChC,qBAAAC,UAAA,EAAA,UAAA,CACG,KACD,oBAAC,QAAD;GAAM,WAAWD,4BAAO;GAAQ,UAAA;EAAY,CAAA,CAC5C,EAAA,CAAA,IACA;CACJ,EAAA,CAAA;CAGJ,MAAM,SAAS;EACb,WAAW,GAAGA,4BAAO,MAAM,SAAS;EACpC,gBAAgB,SAAU,SAAmB,KAAA;EAC7C,iBAAiB,YAAY,KAAA;EAC7B,eAAe,UAAU,KAAA;EACzB,OAAO;EACP,SAAS;CACX;CAEA,OACE,oBAAC,MAAD;EAAI,WAAWA,4BAAO;EACnB,UAAA,SAAS,KAAA,IACR,oBAAC,KAAD;GACO;GACL,MAAM,WAAW,KAAA,IAAY;GAC7B,GAAI;GACJ,GAAI;GAEH,UAAA;EACA,CAAA,IAEH,oBAAC,UAAD;GAAa;GAA+B,MAAK;GAAS,GAAI;GAC3D,UAAA;EACK,CAAA;CAER,CAAA;AAER,CAAC"}
1
+ {"version":3,"file":"BlockSidebar.js","names":["styles","_Fragment"],"sources":["../../../../src/components/navigation/BlockSidebar/BlockSidebar.tsx"],"sourcesContent":["import { media } from \"@malilion/block-ui-tokens\";\nimport { forwardRef, useMemo, type MouseEvent, type Ref } from \"react\";\nimport { useMediaQuery } from \"../../../hooks/useMediaQuery\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./BlockSidebar.module.css\";\nimport type { BlockSidebarProps, SidebarItemProps } from \"./BlockSidebar.types\";\nimport { SidebarContext, useSidebar } from \"./context\";\n\n/**\n * Main navigation rail. Collapses to icons on tablet and hides on mobile when\n * `responsive` (pair it with `HotbarNavigation`).\n */\nexport const BlockSidebar = forwardRef<HTMLElement, BlockSidebarProps>(function BlockSidebar(\n {\n header,\n footer,\n collapsed = false,\n responsive = true,\n label = \"Main\",\n className,\n children,\n ...rest\n },\n ref,\n) {\n const tablet = useMediaQuery(media.tablet);\n const isCollapsed = collapsed || (responsive && tablet);\n const context = useMemo(() => ({ collapsed: isCollapsed }), [isCollapsed]);\n\n return (\n <nav\n ref={ref}\n aria-label={label}\n data-collapsed={isCollapsed || undefined}\n data-responsive={responsive || undefined}\n className={cx(styles.sidebar, className)}\n {...rest}\n >\n {header ? <div className={styles.header}>{header}</div> : null}\n <SidebarContext.Provider value={context}>\n <ul className={styles.list}>{children}</ul>\n </SidebarContext.Provider>\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </nav>\n );\n});\n\n/** A sidebar entry. Renders `<a>` with `href`, otherwise `<button>`. */\nexport const SidebarItem = forwardRef<HTMLElement, SidebarItemProps>(function SidebarItem(\n {\n icon,\n active = false,\n href,\n onClick,\n badge,\n disabled = false,\n className,\n children,\n title,\n ...rest\n },\n ref,\n) {\n const { collapsed } = useSidebar();\n const tooltip = title ?? (collapsed && typeof children === \"string\" ? children : undefined);\n\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n const content = (\n <>\n {icon ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <span className={styles.label}>{children}</span>\n {badge !== undefined && badge !== null ? (\n <>\n {\" \"}\n <span className={styles.badge}>{badge}</span>\n </>\n ) : null}\n </>\n );\n\n const shared = {\n className: cx(styles.item, className),\n \"aria-current\": active ? (\"page\" as const) : undefined,\n \"aria-disabled\": disabled || undefined,\n \"data-active\": active || undefined,\n title: tooltip,\n onClick: handleClick,\n };\n\n return (\n <li className={styles.listItem}>\n {href !== undefined ? (\n <a\n ref={ref as Ref<HTMLAnchorElement>}\n href={disabled ? undefined : href}\n {...shared}\n {...rest}\n >\n {content}\n </a>\n ) : (\n <button ref={ref as Ref<HTMLButtonElement>} type=\"button\" {...shared}>\n {content}\n </button>\n )}\n </li>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,eAAe,WAA2C,SAAS,aAC9E,EACE,QACA,QACA,YAAY,OACZ,aAAa,MACb,QAAQ,QACR,WACA,UACA,GAAG,QAEL,KACA;CACA,MAAM,SAAS,cAAc,MAAM,MAAM;CACzC,MAAM,cAAc,aAAc,cAAc;CAChD,MAAM,UAAU,eAAe,EAAE,WAAW,YAAY,IAAI,CAAC,WAAW,CAAC;CAEzE,OACE,qBAAC,OAAD;EACO;EACL,cAAY;EACZ,kBAAgB,eAAe,KAAA;EAC/B,mBAAiB,cAAc,KAAA;EAC/B,WAAW,GAAGA,4BAAO,SAAS,SAAS;EACvC,GAAI;EANN,UAAA;GAQG,SAAS,oBAAC,OAAD;IAAK,WAAWA,4BAAO;IAAS,UAAA;GAAY,CAAA,IAAI;GAC1D,oBAAC,eAAe,UAAhB;IAAyB,OAAO;IAC9B,UAAA,oBAAC,MAAD;KAAI,WAAWA,4BAAO;KAAO;IAAa,CAAA;GACnB,CAAA;GACxB,SAAS,oBAAC,OAAD;IAAK,WAAWA,4BAAO;IAAS,UAAA;GAAY,CAAA,IAAI;EACvD;;AAET,CAAC;;AAGD,IAAa,cAAc,WAA0C,SAAS,YAC5E,EACE,MACA,SAAS,OACT,MACA,SACA,OACA,WAAW,OACX,WACA,UACA,OACA,GAAG,QAEL,KACA;CACA,MAAM,EAAE,cAAc,WAAW;CACjC,MAAM,UAAU,UAAU,aAAa,OAAO,aAAa,WAAW,WAAW,KAAA;CAEjF,MAAM,eAAe,UAAmC;EACtD,IAAI,UAAU;GACZ,MAAM,eAAe;GACrB;EACF;EACA,UAAU,KAAK;CACjB;CAEA,MAAM,UACJ,qBAAAC,YAAA,EAAA,UAAA;EACG,OACC,oBAAC,QAAD;GAAM,WAAWD,4BAAO;GAAM,eAAY;GACvC,UAAA;EACG,CAAA,IACJ;EACJ,oBAAC,QAAD;GAAM,WAAWA,4BAAO;GAAQ;EAAe,CAAA;EAC9C,UAAU,KAAA,KAAa,UAAU,OAChC,qBAAAC,YAAA,EAAA,UAAA,CACG,KACD,oBAAC,QAAD;GAAM,WAAWD,4BAAO;GAAQ,UAAA;EAAY,CAAA,CAC5C,EAAA,CAAA,IACA;CACJ,EAAA,CAAA;CAGJ,MAAM,SAAS;EACb,WAAW,GAAGA,4BAAO,MAAM,SAAS;EACpC,gBAAgB,SAAU,SAAmB,KAAA;EAC7C,iBAAiB,YAAY,KAAA;EAC7B,eAAe,UAAU,KAAA;EACzB,OAAO;EACP,SAAS;CACX;CAEA,OACE,oBAAC,MAAD;EAAI,WAAWA,4BAAO;EACnB,UAAA,SAAS,KAAA,IACR,oBAAC,KAAD;GACO;GACL,MAAM,WAAW,KAAA,IAAY;GAC7B,GAAI;GACJ,GAAI;GAEH,UAAA;EACA,CAAA,IAEH,oBAAC,UAAD;GAAa;GAA+B,MAAK;GAAS,GAAI;GAC3D,UAAA;EACK,CAAA;CAER,CAAA;AAER,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BlockStepperProps } from "./BlockStepper.types";
2
+ /**
3
+ * Multi-step progress (create a world, set up a server). Completed steps show a
4
+ * check and can be revisited when `onStepClick` is set; the current step has
5
+ * `aria-current="step"`.
6
+ */
7
+ export declare const BlockStepper: import("react").ForwardRefExoticComponent<BlockStepperProps & import("react").RefAttributes<HTMLElement>>;
8
+ //# sourceMappingURL=BlockStepper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockStepper.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/BlockStepper/BlockStepper.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI9D;;;;GAIG;AACH,eAAO,MAAM,YAAY,2GAoEvB,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { cx } from "../../../utils/cx.js";
2
+ import BlockStepper_module_default from "./BlockStepper.module.js";
3
+ import { forwardRef } from "react";
4
+ import { CheckIcon } from "@malilion/block-ui-icons";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/navigation/BlockStepper/BlockStepper.tsx
7
+ /**
8
+ * Multi-step progress (create a world, set up a server). Completed steps show a
9
+ * check and can be revisited when `onStepClick` is set; the current step has
10
+ * `aria-current="step"`.
11
+ */
12
+ var BlockStepper = forwardRef(function BlockStepper({ steps, current, onStepClick, orientation = "horizontal", label = "Progress", className, ...rest }, ref) {
13
+ return /* @__PURE__ */ jsx("nav", {
14
+ ref,
15
+ "aria-label": label,
16
+ className: cx(BlockStepper_module_default.stepper, className),
17
+ "data-orientation": orientation,
18
+ ...rest,
19
+ children: /* @__PURE__ */ jsx("ol", {
20
+ className: BlockStepper_module_default.list,
21
+ children: steps.map((step, index) => {
22
+ const state = index < current ? "complete" : index === current ? "current" : "upcoming";
23
+ const marker = /* @__PURE__ */ jsx("span", {
24
+ className: BlockStepper_module_default.marker,
25
+ "aria-hidden": "true",
26
+ children: state === "complete" ? /* @__PURE__ */ jsx(CheckIcon, { size: 16 }) : step.icon ?? index + 1
27
+ });
28
+ const text = /* @__PURE__ */ jsxs("span", {
29
+ className: BlockStepper_module_default.text,
30
+ children: [
31
+ /* @__PURE__ */ jsx("span", {
32
+ className: BlockStepper_module_default.label,
33
+ children: step.label
34
+ }),
35
+ step.description ? /* @__PURE__ */ jsxs(Fragment$1, { children: [" ", /* @__PURE__ */ jsx("span", {
36
+ className: BlockStepper_module_default.description,
37
+ children: step.description
38
+ })] }) : null,
39
+ state === "complete" ? /* @__PURE__ */ jsx("span", {
40
+ className: "block-visually-hidden",
41
+ children: " (completed)"
42
+ }) : null
43
+ ]
44
+ });
45
+ return /* @__PURE__ */ jsx("li", {
46
+ className: BlockStepper_module_default.step,
47
+ "data-state": state,
48
+ "aria-current": state === "current" ? "step" : void 0,
49
+ children: state === "complete" && onStepClick ? /* @__PURE__ */ jsxs("button", {
50
+ type: "button",
51
+ className: BlockStepper_module_default.content,
52
+ onClick: () => onStepClick(index),
53
+ children: [marker, text]
54
+ }) : /* @__PURE__ */ jsxs("span", {
55
+ className: BlockStepper_module_default.content,
56
+ children: [marker, text]
57
+ })
58
+ }, step.id);
59
+ })
60
+ })
61
+ });
62
+ });
63
+ //#endregion
64
+ export { BlockStepper };
65
+
66
+ //# sourceMappingURL=BlockStepper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockStepper.js","names":["styles","_Fragment"],"sources":["../../../../src/components/navigation/BlockStepper/BlockStepper.tsx"],"sourcesContent":["import { CheckIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./BlockStepper.module.css\";\nimport type { BlockStepperProps } from \"./BlockStepper.types\";\n\ntype StepState = \"complete\" | \"current\" | \"upcoming\";\n\n/**\n * Multi-step progress (create a world, set up a server). Completed steps show a\n * check and can be revisited when `onStepClick` is set; the current step has\n * `aria-current=\"step\"`.\n */\nexport const BlockStepper = forwardRef<HTMLElement, BlockStepperProps>(function BlockStepper(\n {\n steps,\n current,\n onStepClick,\n orientation = \"horizontal\",\n label = \"Progress\",\n className,\n ...rest\n },\n ref,\n) {\n return (\n <nav\n ref={ref}\n aria-label={label}\n className={cx(styles.stepper, className)}\n data-orientation={orientation}\n {...rest}\n >\n <ol className={styles.list}>\n {steps.map((step, index) => {\n const state: StepState =\n index < current ? \"complete\" : index === current ? \"current\" : \"upcoming\";\n const marker = (\n <span className={styles.marker} aria-hidden=\"true\">\n {state === \"complete\" ? <CheckIcon size={16} /> : (step.icon ?? index + 1)}\n </span>\n );\n const text = (\n <span className={styles.text}>\n <span className={styles.label}>{step.label}</span>\n {/* The space keeps label and description apart for screen readers; flex hides it. */}\n {step.description ? (\n <>\n {\" \"}\n <span className={styles.description}>{step.description}</span>\n </>\n ) : null}\n {state === \"complete\" ? (\n <span className=\"block-visually-hidden\"> (completed)</span>\n ) : null}\n </span>\n );\n return (\n <li\n key={step.id}\n className={styles.step}\n data-state={state}\n aria-current={state === \"current\" ? \"step\" : undefined}\n >\n {state === \"complete\" && onStepClick ? (\n <button type=\"button\" className={styles.content} onClick={() => onStepClick(index)}>\n {marker}\n {text}\n </button>\n ) : (\n <span className={styles.content}>\n {marker}\n {text}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n});\n"],"mappings":";;;;;;;;;;;AAaA,IAAa,eAAe,WAA2C,SAAS,aAC9E,EACE,OACA,SACA,aACA,cAAc,cACd,QAAQ,YACR,WACA,GAAG,QAEL,KACA;CACA,OACE,oBAAC,OAAD;EACO;EACL,cAAY;EACZ,WAAW,GAAGA,4BAAO,SAAS,SAAS;EACvC,oBAAkB;EAClB,GAAI;EAEJ,UAAA,oBAAC,MAAD;GAAI,WAAWA,4BAAO;GACnB,UAAA,MAAM,KAAK,MAAM,UAAU;IAC1B,MAAM,QACJ,QAAQ,UAAU,aAAa,UAAU,UAAU,YAAY;IACjE,MAAM,SACJ,oBAAC,QAAD;KAAM,WAAWA,4BAAO;KAAQ,eAAY;KACzC,UAAA,UAAU,aAAa,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA,IAAK,KAAK,QAAQ,QAAQ;IACpE,CAAA;IAER,MAAM,OACJ,qBAAC,QAAD;KAAM,WAAWA,4BAAO;KAAxB,UAAA;MACE,oBAAC,QAAD;OAAM,WAAWA,4BAAO;OAAQ,UAAA,KAAK;MAAY,CAAA;MAEhD,KAAK,cACJ,qBAAAC,YAAA,EAAA,UAAA,CACG,KACD,oBAAC,QAAD;OAAM,WAAWD,4BAAO;OAAc,UAAA,KAAK;MAAkB,CAAA,CAC7D,EAAA,CAAA,IACA;MACH,UAAU,aACT,oBAAC,QAAD;OAAM,WAAU;OAAwB,UAAA;MAAkB,CAAA,IACxD;KACA;;IAER,OACE,oBAAC,MAAD;KAEE,WAAWA,4BAAO;KAClB,cAAY;KACZ,gBAAc,UAAU,YAAY,SAAS,KAAA;KAE5C,UAAA,UAAU,cAAc,cACvB,qBAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAO;MAAS,eAAe,YAAY,KAAK;MAAjF,UAAA,CACG,QACA,IACK;KAER,CAAA,IAAA,qBAAC,QAAD;MAAM,WAAWA,4BAAO;MAAxB,UAAA,CACG,QACA,IACG;;IAEN,GAhBG,KAAK,EAgBR;GAER,CAAC;EACC,CAAA;CACD,CAAA;AAET,CAAC"}
@@ -0,0 +1,23 @@
1
+ //#region src/components/navigation/BlockStepper/BlockStepper.module.css
2
+ var stepper = "block-stepper-AFyIV";
3
+ var list = "block-list-O8q0K";
4
+ var step = "block-step-yvErb";
5
+ var content = "block-content-BWfnF";
6
+ var marker = "block-marker-THwA7";
7
+ var text = "block-text-Fys8d";
8
+ var label = "block-label-loKfO";
9
+ var description = "block-description-TR0zD";
10
+ var BlockStepper_module_default = {
11
+ stepper,
12
+ list,
13
+ step,
14
+ content,
15
+ marker,
16
+ text,
17
+ label,
18
+ description
19
+ };
20
+ //#endregion
21
+ export { content, BlockStepper_module_default as default, description, label, list, marker, step, stepper, text };
22
+
23
+ //# sourceMappingURL=BlockStepper.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockStepper.module.js","names":[],"sources":["../../../../src/components/navigation/BlockStepper/BlockStepper.module.css"],"sourcesContent":[".stepper {\n width: 100%;\n}\n\n.list {\n display: flex;\n gap: var(--block-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.stepper[data-orientation=\"vertical\"] .list {\n flex-direction: column;\n}\n\n.step {\n position: relative;\n display: flex;\n flex: 1;\n min-width: 0;\n}\n\n/* Connector to the next step. */\n.stepper[data-orientation=\"horizontal\"] .step:not(:last-child)::after {\n content: \"\";\n position: absolute;\n top: 15px;\n left: calc(32px + var(--block-space-2));\n right: var(--block-space-2);\n height: 4px;\n background-color: var(--block-border);\n}\n\n.stepper[data-orientation=\"horizontal\"] .step[data-state=\"complete\"]::after {\n background-color: var(--block-emerald);\n}\n\n.stepper[data-orientation=\"vertical\"] .step:not(:last-child)::after {\n content: \"\";\n position: absolute;\n top: 36px;\n bottom: calc(-1 * var(--block-space-2) + 4px);\n left: 14px;\n width: 4px;\n background-color: var(--block-border);\n}\n\n.stepper[data-orientation=\"vertical\"] .step[data-state=\"complete\"]::after {\n background-color: var(--block-emerald);\n}\n\n.content {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: flex-start;\n gap: var(--block-space-2);\n padding: 0;\n font: inherit;\n text-align: left;\n color: inherit;\n background: none;\n border: 0;\n}\n\n.stepper[data-orientation=\"horizontal\"] .content {\n flex-direction: column;\n}\n\nbutton.content {\n cursor: pointer;\n}\n\nbutton.content:focus-visible {\n outline: 3px solid var(--block-focus);\n outline-offset: 2px;\n}\n\n.marker {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n font-family: var(--block-font-display);\n font-size: var(--block-font-size-sm);\n font-weight: var(--block-font-weight-bold);\n color: var(--block-text-muted);\n background-color: var(--block-slot);\n border: var(--block-border-width-thin) solid var(--block-border);\n box-shadow: var(--block-shadow-inset);\n}\n\n.step[data-state=\"current\"] .marker {\n color: var(--block-text);\n background-color: var(--block-surface-alt);\n border-color: var(--block-gold);\n box-shadow: var(--block-shadow-bevel);\n}\n\n.step[data-state=\"complete\"] .marker {\n color: var(--block-on-emerald);\n background-color: var(--block-emerald);\n border-color: var(--block-emerald-dark);\n}\n\n.text {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.label {\n font-family: var(--block-font-display);\n font-size: var(--block-font-size-xs);\n font-weight: var(--block-font-weight-bold);\n text-transform: uppercase;\n color: var(--block-text-muted);\n overflow-wrap: anywhere;\n}\n\n.step[data-state=\"current\"] .label,\n.step[data-state=\"complete\"] .label {\n color: var(--block-text);\n}\n\nbutton.content:hover .label {\n text-decoration: underline;\n}\n\n.description {\n font-size: var(--block-font-size-xs);\n color: var(--block-text-muted);\n}\n\n@media (max-width: 767.98px) {\n .stepper[data-orientation=\"horizontal\"] .description {\n display: none;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import type { HTMLAttributes, ReactNode } from "react";
2
+ export interface BlockStep {
3
+ id: string;
4
+ label: string;
5
+ description?: ReactNode;
6
+ icon?: ReactNode;
7
+ }
8
+ export interface BlockStepperProps extends HTMLAttributes<HTMLElement> {
9
+ steps: BlockStep[];
10
+ /** Index of the current step (0-based). Earlier steps are complete. */
11
+ current: number;
12
+ /** Makes completed steps buttons that jump back to them. */
13
+ onStepClick?: (index: number) => void;
14
+ /** @default "horizontal" */
15
+ orientation?: "horizontal" | "vertical";
16
+ /** Accessible name of the progress list. @default "Progress" */
17
+ label?: string;
18
+ }
19
+ //# sourceMappingURL=BlockStepper.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockStepper.types.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/BlockStepper/BlockStepper.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,WAAW,CAAC;IACpE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,4BAA4B;IAC5B,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,3 @@
1
+ export { BlockStepper } from "./BlockStepper";
2
+ export type { BlockStep, BlockStepperProps } from "./BlockStepper.types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/BlockStepper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -2,7 +2,7 @@ import { cx } from "../../../utils/cx.js";
2
2
  import Breadcrumb_module_default from "./Breadcrumb.module.js";
3
3
  import { forwardRef } from "react";
4
4
  import { ChevronRightIcon } from "@malilion/block-ui-icons";
5
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/components/navigation/Breadcrumb/Breadcrumb.tsx
7
7
  /** Breadcrumb trail. The last item is marked with `aria-current="page"`. */
8
8
  var Breadcrumb = forwardRef(function Breadcrumb({ items, separator, label = "Breadcrumb", className, ...rest }, ref) {
@@ -15,7 +15,7 @@ var Breadcrumb = forwardRef(function Breadcrumb({ items, separator, label = "Bre
15
15
  className: Breadcrumb_module_default.list,
16
16
  children: items.map((item, index) => {
17
17
  const current = index === items.length - 1;
18
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [item.icon ? /* @__PURE__ */ jsx("span", {
18
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [item.icon ? /* @__PURE__ */ jsx("span", {
19
19
  className: Breadcrumb_module_default.icon,
20
20
  "aria-hidden": "true",
21
21
  children: item.icon
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.js","names":["styles","_Fragment"],"sources":["../../../../src/components/navigation/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import { ChevronRightIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./Breadcrumb.module.css\";\nimport type { BreadcrumbProps } from \"./Breadcrumb.types\";\n\n/** Breadcrumb trail. The last item is marked with `aria-current=\"page\"`. */\nexport const Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(function Breadcrumb(\n { items, separator, label = \"Breadcrumb\", className, ...rest },\n ref,\n) {\n return (\n <nav ref={ref} aria-label={label} className={cx(styles.breadcrumb, className)} {...rest}>\n <ol className={styles.list}>\n {items.map((item, index) => {\n const current = index === items.length - 1;\n const content = (\n <>\n {item.icon ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {item.icon}\n </span>\n ) : null}\n <span>{item.label}</span>\n </>\n );\n return (\n <li key={index} className={styles.item}>\n {current ? (\n <span className={styles.current} aria-current=\"page\">\n {content}\n </span>\n ) : item.href !== undefined ? (\n <a href={item.href} onClick={item.onClick} className={styles.link}>\n {content}\n </a>\n ) : item.onClick ? (\n <button type=\"button\" onClick={item.onClick} className={styles.link}>\n {content}\n </button>\n ) : (\n <span className={styles.text}>{content}</span>\n )}\n {!current ? (\n <span className={styles.separator} aria-hidden=\"true\">\n {separator ?? <ChevronRightIcon size={16} />}\n </span>\n ) : null}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n});\n"],"mappings":";;;;;;;AAOA,IAAa,aAAa,WAAyC,SAAS,WAC1E,EAAE,OAAO,WAAW,QAAQ,cAAc,WAAW,GAAG,QACxD,KACA;CACA,OACE,oBAAC,OAAD;EAAU;EAAK,cAAY;EAAO,WAAW,GAAGA,0BAAO,YAAY,SAAS;EAAG,GAAI;EACjF,UAAA,oBAAC,MAAD;GAAI,WAAWA,0BAAO;GACnB,UAAA,MAAM,KAAK,MAAM,UAAU;IAC1B,MAAM,UAAU,UAAU,MAAM,SAAS;IACzC,MAAM,UACJ,qBAAAC,UAAA,EAAA,UAAA,CACG,KAAK,OACJ,oBAAC,QAAD;KAAM,WAAWD,0BAAO;KAAM,eAAY;KACvC,UAAA,KAAK;IACF,CAAA,IACJ,MACJ,oBAAC,QAAD,EAAA,UAAO,KAAK,MAAY,CAAA,CACxB,EAAA,CAAA;IAEJ,OACE,qBAAC,MAAD;KAAgB,WAAWA,0BAAO;KAAlC,UAAA,CACG,UACC,oBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAS,gBAAa;MAC3C,UAAA;KACG,CAAA,IACJ,KAAK,SAAS,KAAA,IAChB,oBAAC,KAAD;MAAG,MAAM,KAAK;MAAM,SAAS,KAAK;MAAS,WAAWA,0BAAO;MAC1D,UAAA;KACA,CAAA,IACD,KAAK,UACP,oBAAC,UAAD;MAAQ,MAAK;MAAS,SAAS,KAAK;MAAS,WAAWA,0BAAO;MAC5D,UAAA;KACK,CAAA,IAER,oBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAO,UAAA;KAAc,CAAA,GAE9C,CAAC,UACA,oBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAW,eAAY;MAC5C,UAAA,aAAa,oBAAC,kBAAD,EAAkB,MAAM,GAAK,CAAA;KACvC,CAAA,IACJ,IACF;IArBK,GAAA,KAqBL;GAER,CAAC;EACC,CAAA;CACD,CAAA;AAET,CAAC"}
1
+ {"version":3,"file":"Breadcrumb.js","names":["styles","_Fragment"],"sources":["../../../../src/components/navigation/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import { ChevronRightIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./Breadcrumb.module.css\";\nimport type { BreadcrumbProps } from \"./Breadcrumb.types\";\n\n/** Breadcrumb trail. The last item is marked with `aria-current=\"page\"`. */\nexport const Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(function Breadcrumb(\n { items, separator, label = \"Breadcrumb\", className, ...rest },\n ref,\n) {\n return (\n <nav ref={ref} aria-label={label} className={cx(styles.breadcrumb, className)} {...rest}>\n <ol className={styles.list}>\n {items.map((item, index) => {\n const current = index === items.length - 1;\n const content = (\n <>\n {item.icon ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {item.icon}\n </span>\n ) : null}\n <span>{item.label}</span>\n </>\n );\n return (\n <li key={index} className={styles.item}>\n {current ? (\n <span className={styles.current} aria-current=\"page\">\n {content}\n </span>\n ) : item.href !== undefined ? (\n <a href={item.href} onClick={item.onClick} className={styles.link}>\n {content}\n </a>\n ) : item.onClick ? (\n <button type=\"button\" onClick={item.onClick} className={styles.link}>\n {content}\n </button>\n ) : (\n <span className={styles.text}>{content}</span>\n )}\n {!current ? (\n <span className={styles.separator} aria-hidden=\"true\">\n {separator ?? <ChevronRightIcon size={16} />}\n </span>\n ) : null}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n});\n"],"mappings":";;;;;;;AAOA,IAAa,aAAa,WAAyC,SAAS,WAC1E,EAAE,OAAO,WAAW,QAAQ,cAAc,WAAW,GAAG,QACxD,KACA;CACA,OACE,oBAAC,OAAD;EAAU;EAAK,cAAY;EAAO,WAAW,GAAGA,0BAAO,YAAY,SAAS;EAAG,GAAI;EACjF,UAAA,oBAAC,MAAD;GAAI,WAAWA,0BAAO;GACnB,UAAA,MAAM,KAAK,MAAM,UAAU;IAC1B,MAAM,UAAU,UAAU,MAAM,SAAS;IACzC,MAAM,UACJ,qBAAAC,YAAA,EAAA,UAAA,CACG,KAAK,OACJ,oBAAC,QAAD;KAAM,WAAWD,0BAAO;KAAM,eAAY;KACvC,UAAA,KAAK;IACF,CAAA,IACJ,MACJ,oBAAC,QAAD,EAAA,UAAO,KAAK,MAAY,CAAA,CACxB,EAAA,CAAA;IAEJ,OACE,qBAAC,MAAD;KAAgB,WAAWA,0BAAO;KAAlC,UAAA,CACG,UACC,oBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAS,gBAAa;MAC3C,UAAA;KACG,CAAA,IACJ,KAAK,SAAS,KAAA,IAChB,oBAAC,KAAD;MAAG,MAAM,KAAK;MAAM,SAAS,KAAK;MAAS,WAAWA,0BAAO;MAC1D,UAAA;KACA,CAAA,IACD,KAAK,UACP,oBAAC,UAAD;MAAQ,MAAK;MAAS,SAAS,KAAK;MAAS,WAAWA,0BAAO;MAC5D,UAAA;KACK,CAAA,IAER,oBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAO,UAAA;KAAc,CAAA,GAE9C,CAAC,UACA,oBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAW,eAAY;MAC5C,UAAA,aAAa,oBAAC,kBAAD,EAAkB,MAAM,GAAK,CAAA;KACvC,CAAA,IACJ,IACF;IArBK,GAAA,KAqBL;GAER,CAAC;EACC,CAAA;CACD,CAAA;AAET,CAAC"}
@@ -2,7 +2,7 @@ import { cx } from "../../../utils/cx.js";
2
2
  import { useControllableState } from "../../../hooks/useControllableState.js";
3
3
  import HotbarNavigation_module_default from "./HotbarNavigation.module.js";
4
4
  import { forwardRef } from "react";
5
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/components/navigation/HotbarNavigation/HotbarNavigation.tsx
7
7
  /** Mobile bottom navigation styled as a hotbar (max 5 items). */
8
8
  var HotbarNavigation = forwardRef(function HotbarNavigation({ items, value, defaultValue, onValueChange, maxItems = 5, fixed = false, mobileOnly = false, label = "Quick navigation", className, ...rest }, ref) {
@@ -23,7 +23,7 @@ var HotbarNavigation = forwardRef(function HotbarNavigation({ items, value, defa
23
23
  className: HotbarNavigation_module_default.list,
24
24
  children: visible.map((item, index) => {
25
25
  const current = item.id === active;
26
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [
26
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
27
27
  /* @__PURE__ */ jsxs("span", {
28
28
  className: HotbarNavigation_module_default.slot,
29
29
  children: [
@@ -48,7 +48,7 @@ var HotbarNavigation = forwardRef(function HotbarNavigation({ items, value, defa
48
48
  className: HotbarNavigation_module_default.label,
49
49
  children: item.label
50
50
  }),
51
- item.badge !== void 0 && item.badge !== null ? /* @__PURE__ */ jsxs(Fragment, { children: [" ", /* @__PURE__ */ jsxs("span", {
51
+ item.badge !== void 0 && item.badge !== null ? /* @__PURE__ */ jsxs(Fragment$1, { children: [" ", /* @__PURE__ */ jsxs("span", {
52
52
  className: "block-visually-hidden",
53
53
  children: [
54
54
  "(",
@@ -1 +1 @@
1
- {"version":3,"file":"HotbarNavigation.js","names":["styles","_Fragment"],"sources":["../../../../src/components/navigation/HotbarNavigation/HotbarNavigation.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./HotbarNavigation.module.css\";\nimport type { HotbarNavigationProps } from \"./HotbarNavigation.types\";\n\n/** Mobile bottom navigation styled as a hotbar (max 5 items). */\nexport const HotbarNavigation = forwardRef<HTMLElement, HotbarNavigationProps>(\n function HotbarNavigation(\n {\n items,\n value,\n defaultValue,\n onValueChange,\n maxItems = 5,\n fixed = false,\n mobileOnly = false,\n label = \"Quick navigation\",\n className,\n ...rest\n },\n ref,\n ) {\n const visible = items.slice(0, maxItems);\n const [active, setActive] = useControllableState({\n value,\n defaultValue: defaultValue ?? visible[0]?.id ?? \"\",\n onChange: onValueChange,\n });\n\n return (\n <nav\n ref={ref}\n aria-label={label}\n data-fixed={fixed || undefined}\n data-mobile-only={mobileOnly || undefined}\n className={cx(styles.nav, className)}\n {...rest}\n >\n <ul className={styles.list}>\n {visible.map((item, index) => {\n const current = item.id === active;\n const content = (\n <>\n <span className={styles.slot}>\n <span className={styles.icon} aria-hidden=\"true\">\n {item.icon}\n </span>\n {item.badge !== undefined && item.badge !== null ? (\n <span className={styles.badge} aria-hidden=\"true\">\n {item.badge}\n </span>\n ) : null}\n <span className={styles.key} aria-hidden=\"true\">\n {index + 1}\n </span>\n </span>\n <span className={styles.label}>{item.label}</span>\n {item.badge !== undefined && item.badge !== null ? (\n <>\n {\" \"}\n <span className=\"block-visually-hidden\">({item.badge})</span>\n </>\n ) : null}\n </>\n );\n const shared = {\n className: styles.item,\n \"aria-current\": current ? (\"page\" as const) : undefined,\n \"data-active\": current || undefined,\n onClick: () => setActive(item.id),\n };\n return (\n <li key={item.id} className={styles.listItem}>\n {item.href !== undefined ? (\n <a href={item.href} {...shared}>\n {content}\n </a>\n ) : (\n <button type=\"button\" {...shared}>\n {content}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n },\n);\n"],"mappings":";;;;;;;AAOA,IAAa,mBAAmB,WAC9B,SAAS,iBACP,EACE,OACA,OACA,cACA,eACA,WAAW,GACX,QAAQ,OACR,aAAa,OACb,QAAQ,oBACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,UAAU,MAAM,MAAM,GAAG,QAAQ;CACvC,MAAM,CAAC,QAAQ,aAAa,qBAAqB;EAC/C;EACA,cAAc,gBAAgB,QAAQ,EAAE,EAAE,MAAM;EAChD,UAAU;CACZ,CAAC;CAED,OACE,oBAAC,OAAD;EACO;EACL,cAAY;EACZ,cAAY,SAAS,KAAA;EACrB,oBAAkB,cAAc,KAAA;EAChC,WAAW,GAAGA,gCAAO,KAAK,SAAS;EACnC,GAAI;EAEJ,UAAA,oBAAC,MAAD;GAAI,WAAWA,gCAAO;GACnB,UAAA,QAAQ,KAAK,MAAM,UAAU;IAC5B,MAAM,UAAU,KAAK,OAAO;IAC5B,MAAM,UACJ,qBAAAC,UAAA,EAAA,UAAA;KACE,qBAAC,QAAD;MAAM,WAAWD,gCAAO;MAAxB,UAAA;OACE,oBAAC,QAAD;QAAM,WAAWA,gCAAO;QAAM,eAAY;QACvC,UAAA,KAAK;OACF,CAAA;OACL,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,OAC1C,oBAAC,QAAD;QAAM,WAAWA,gCAAO;QAAO,eAAY;QACxC,UAAA,KAAK;OACF,CAAA,IACJ;OACJ,oBAAC,QAAD;QAAM,WAAWA,gCAAO;QAAK,eAAY;QACtC,UAAA,QAAQ;OACL,CAAA;MACF;;KACN,oBAAC,QAAD;MAAM,WAAWA,gCAAO;MAAQ,UAAA,KAAK;KAAY,CAAA;KAChD,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,OAC1C,qBAAAC,UAAA,EAAA,UAAA,CACG,KACD,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OAAwC;OAAE,KAAK;OAAM;MAAO;KAC5D,CAAA,CAAA,EAAA,CAAA,IACA;IACJ,EAAA,CAAA;IAEJ,MAAM,SAAS;KACb,WAAWD,gCAAO;KAClB,gBAAgB,UAAW,SAAmB,KAAA;KAC9C,eAAe,WAAW,KAAA;KAC1B,eAAe,UAAU,KAAK,EAAE;IAClC;IACA,OACE,oBAAC,MAAD;KAAkB,WAAWA,gCAAO;KACjC,UAAA,KAAK,SAAS,KAAA,IACb,oBAAC,KAAD;MAAG,MAAM,KAAK;MAAM,GAAI;MACrB,UAAA;KACA,CAAA,IAEH,oBAAC,UAAD;MAAQ,MAAK;MAAS,GAAI;MACvB,UAAA;KACK,CAAA;IAER,GAVK,KAAK,EAUV;GAER,CAAC;EACC,CAAA;CACD,CAAA;AAET,CACF"}
1
+ {"version":3,"file":"HotbarNavigation.js","names":["styles","_Fragment"],"sources":["../../../../src/components/navigation/HotbarNavigation/HotbarNavigation.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./HotbarNavigation.module.css\";\nimport type { HotbarNavigationProps } from \"./HotbarNavigation.types\";\n\n/** Mobile bottom navigation styled as a hotbar (max 5 items). */\nexport const HotbarNavigation = forwardRef<HTMLElement, HotbarNavigationProps>(\n function HotbarNavigation(\n {\n items,\n value,\n defaultValue,\n onValueChange,\n maxItems = 5,\n fixed = false,\n mobileOnly = false,\n label = \"Quick navigation\",\n className,\n ...rest\n },\n ref,\n ) {\n const visible = items.slice(0, maxItems);\n const [active, setActive] = useControllableState({\n value,\n defaultValue: defaultValue ?? visible[0]?.id ?? \"\",\n onChange: onValueChange,\n });\n\n return (\n <nav\n ref={ref}\n aria-label={label}\n data-fixed={fixed || undefined}\n data-mobile-only={mobileOnly || undefined}\n className={cx(styles.nav, className)}\n {...rest}\n >\n <ul className={styles.list}>\n {visible.map((item, index) => {\n const current = item.id === active;\n const content = (\n <>\n <span className={styles.slot}>\n <span className={styles.icon} aria-hidden=\"true\">\n {item.icon}\n </span>\n {item.badge !== undefined && item.badge !== null ? (\n <span className={styles.badge} aria-hidden=\"true\">\n {item.badge}\n </span>\n ) : null}\n <span className={styles.key} aria-hidden=\"true\">\n {index + 1}\n </span>\n </span>\n <span className={styles.label}>{item.label}</span>\n {item.badge !== undefined && item.badge !== null ? (\n <>\n {\" \"}\n <span className=\"block-visually-hidden\">({item.badge})</span>\n </>\n ) : null}\n </>\n );\n const shared = {\n className: styles.item,\n \"aria-current\": current ? (\"page\" as const) : undefined,\n \"data-active\": current || undefined,\n onClick: () => setActive(item.id),\n };\n return (\n <li key={item.id} className={styles.listItem}>\n {item.href !== undefined ? (\n <a href={item.href} {...shared}>\n {content}\n </a>\n ) : (\n <button type=\"button\" {...shared}>\n {content}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n },\n);\n"],"mappings":";;;;;;;AAOA,IAAa,mBAAmB,WAC9B,SAAS,iBACP,EACE,OACA,OACA,cACA,eACA,WAAW,GACX,QAAQ,OACR,aAAa,OACb,QAAQ,oBACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,UAAU,MAAM,MAAM,GAAG,QAAQ;CACvC,MAAM,CAAC,QAAQ,aAAa,qBAAqB;EAC/C;EACA,cAAc,gBAAgB,QAAQ,EAAE,EAAE,MAAM;EAChD,UAAU;CACZ,CAAC;CAED,OACE,oBAAC,OAAD;EACO;EACL,cAAY;EACZ,cAAY,SAAS,KAAA;EACrB,oBAAkB,cAAc,KAAA;EAChC,WAAW,GAAGA,gCAAO,KAAK,SAAS;EACnC,GAAI;EAEJ,UAAA,oBAAC,MAAD;GAAI,WAAWA,gCAAO;GACnB,UAAA,QAAQ,KAAK,MAAM,UAAU;IAC5B,MAAM,UAAU,KAAK,OAAO;IAC5B,MAAM,UACJ,qBAAAC,YAAA,EAAA,UAAA;KACE,qBAAC,QAAD;MAAM,WAAWD,gCAAO;MAAxB,UAAA;OACE,oBAAC,QAAD;QAAM,WAAWA,gCAAO;QAAM,eAAY;QACvC,UAAA,KAAK;OACF,CAAA;OACL,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,OAC1C,oBAAC,QAAD;QAAM,WAAWA,gCAAO;QAAO,eAAY;QACxC,UAAA,KAAK;OACF,CAAA,IACJ;OACJ,oBAAC,QAAD;QAAM,WAAWA,gCAAO;QAAK,eAAY;QACtC,UAAA,QAAQ;OACL,CAAA;MACF;;KACN,oBAAC,QAAD;MAAM,WAAWA,gCAAO;MAAQ,UAAA,KAAK;KAAY,CAAA;KAChD,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,OAC1C,qBAAAC,YAAA,EAAA,UAAA,CACG,KACD,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OAAwC;OAAE,KAAK;OAAM;MAAO;KAC5D,CAAA,CAAA,EAAA,CAAA,IACA;IACJ,EAAA,CAAA;IAEJ,MAAM,SAAS;KACb,WAAWD,gCAAO;KAClB,gBAAgB,UAAW,SAAmB,KAAA;KAC9C,eAAe,WAAW,KAAA;KAC1B,eAAe,UAAU,KAAK,EAAE;IAClC;IACA,OACE,oBAAC,MAAD;KAAkB,WAAWA,gCAAO;KACjC,UAAA,KAAK,SAAS,KAAA,IACb,oBAAC,KAAD;MAAG,MAAM,KAAK;MAAM,GAAI;MACrB,UAAA;KACA,CAAA,IAEH,oBAAC,UAAD;MAAQ,MAAK;MAAS,GAAI;MACvB,UAAA;KACK,CAAA;IAER,GAVK,KAAK,EAUV;GAER,CAAC;EACC,CAAA;CACD,CAAA;AAET,CACF"}
@@ -3,4 +3,5 @@ export * from "./BlockTabs";
3
3
  export * from "./Breadcrumb";
4
4
  export * from "./HotbarNavigation";
5
5
  export * from "./BlockPagination";
6
+ export * from "./BlockStepper";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC"}
@@ -9,7 +9,9 @@ export interface AnchoredPosition extends FloatingPosition {
9
9
  * its anchor while open, following scroll and resize. Returns `null` until
10
10
  * the first measurement.
11
11
  */
12
- export declare function useAnchoredPosition(anchorRef: RefObject<HTMLElement | null>, floatingRef: RefObject<HTMLElement | null>, open: boolean, { side, align, gap }: {
12
+ export declare function useAnchoredPosition(
13
+ /** The anchor element, or a virtual one (e.g. the pointer position) with `getBoundingClientRect`. */
14
+ anchorRef: RefObject<Pick<Element, "getBoundingClientRect"> | null>, floatingRef: RefObject<HTMLElement | null>, open: boolean, { side, align, gap }: {
13
15
  side: FloatingSide;
14
16
  align?: FloatingAlign;
15
17
  gap?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"useAnchoredPosition.d.ts","sourceRoot":"","sources":["../../src/hooks/useAnchoredPosition.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACtF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,sEAAsE;IACtE,KAAK,EAAE,aAAa,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,WAAW,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAC1C,IAAI,EAAE,OAAO,EACb,EAAE,IAAI,EAAE,KAAgB,EAAE,GAAO,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/F,gBAAgB,GAAG,IAAI,CA8CzB"}
1
+ {"version":3,"file":"useAnchoredPosition.d.ts","sourceRoot":"","sources":["../../src/hooks/useAnchoredPosition.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACtF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,sEAAsE;IACtE,KAAK,EAAE,aAAa,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB;AACjC,qGAAqG;AACrG,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,GAAG,IAAI,CAAC,EACnE,WAAW,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAC1C,IAAI,EAAE,OAAO,EACb,EAAE,IAAI,EAAE,KAAgB,EAAE,GAAO,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/F,gBAAgB,GAAG,IAAI,CA8CzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAnchoredPosition.js","names":[],"sources":["../../src/hooks/useAnchoredPosition.ts"],"sourcesContent":["import { useLayoutEffect, useState, type CSSProperties, type RefObject } from \"react\";\nimport {\n computePosition,\n type FloatingAlign,\n type FloatingPosition,\n type FloatingSide,\n} from \"../utils/position\";\n\nexport interface AnchoredPosition extends FloatingPosition {\n /** Custom properties for the floating element (`--block-float-*`). */\n style: CSSProperties;\n}\n\n/**\n * Keeps a `position: fixed` floating element (rendered in a portal) next to\n * its anchor while open, following scroll and resize. Returns `null` until\n * the first measurement.\n */\nexport function useAnchoredPosition(\n anchorRef: RefObject<HTMLElement | null>,\n floatingRef: RefObject<HTMLElement | null>,\n open: boolean,\n { side, align = \"center\", gap = 8 }: { side: FloatingSide; align?: FloatingAlign; gap?: number },\n): AnchoredPosition | null {\n const [position, setPosition] = useState<AnchoredPosition | null>(null);\n\n useLayoutEffect(() => {\n if (!open) return undefined;\n const update = () => {\n const anchor = anchorRef.current;\n const floating = floatingRef.current;\n if (!anchor || !floating) return;\n const anchorRect = anchor.getBoundingClientRect();\n const next = computePosition({\n anchor: anchorRect,\n floating: { width: floating.offsetWidth, height: floating.offsetHeight },\n viewport: { width: window.innerWidth, height: window.innerHeight },\n side,\n align,\n gap,\n });\n setPosition((previous) =>\n previous &&\n previous.x === next.x &&\n previous.y === next.y &&\n previous.side === next.side &&\n previous.arrow === next.arrow\n ? previous\n : {\n ...next,\n style: {\n \"--block-float-x\": `${next.x}px`,\n \"--block-float-y\": `${next.y}px`,\n \"--block-float-arrow\": `${next.arrow}px`,\n \"--block-float-anchor-width\": `${anchorRect.width}px`,\n } as CSSProperties,\n },\n );\n };\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [open, side, align, gap, anchorRef, floatingRef]);\n\n return open ? position : null;\n}\n"],"mappings":";;;;;;;;AAkBA,SAAgB,oBACd,WACA,aACA,MACA,EAAE,MAAM,QAAQ,UAAU,MAAM,KACP;CACzB,MAAM,CAAC,UAAU,eAAe,SAAkC,IAAI;CAEtE,sBAAsB;EACpB,IAAI,CAAC,MAAM,OAAO,KAAA;EAClB,MAAM,eAAe;GACnB,MAAM,SAAS,UAAU;GACzB,MAAM,WAAW,YAAY;GAC7B,IAAI,CAAC,UAAU,CAAC,UAAU;GAC1B,MAAM,aAAa,OAAO,sBAAsB;GAChD,MAAM,OAAO,gBAAgB;IAC3B,QAAQ;IACR,UAAU;KAAE,OAAO,SAAS;KAAa,QAAQ,SAAS;IAAa;IACvE,UAAU;KAAE,OAAO,OAAO;KAAY,QAAQ,OAAO;IAAY;IACjE;IACA;IACA;GACF,CAAC;GACD,aAAa,aACX,YACA,SAAS,MAAM,KAAK,KACpB,SAAS,MAAM,KAAK,KACpB,SAAS,SAAS,KAAK,QACvB,SAAS,UAAU,KAAK,QACpB,WACA;IACE,GAAG;IACH,OAAO;KACL,mBAAmB,GAAG,KAAK,EAAE;KAC7B,mBAAmB,GAAG,KAAK,EAAE;KAC7B,uBAAuB,GAAG,KAAK,MAAM;KACrC,8BAA8B,GAAG,WAAW,MAAM;IACpD;GACF,CACN;EACF;EACA,OAAO;EACP,OAAO,iBAAiB,UAAU,QAAQ,IAAI;EAC9C,OAAO,iBAAiB,UAAU,MAAM;EACxC,aAAa;GACX,OAAO,oBAAoB,UAAU,QAAQ,IAAI;GACjD,OAAO,oBAAoB,UAAU,MAAM;EAC7C;CACF,GAAG;EAAC;EAAM;EAAM;EAAO;EAAK;EAAW;CAAW,CAAC;CAEnD,OAAO,OAAO,WAAW;AAC3B"}
1
+ {"version":3,"file":"useAnchoredPosition.js","names":[],"sources":["../../src/hooks/useAnchoredPosition.ts"],"sourcesContent":["import { useLayoutEffect, useState, type CSSProperties, type RefObject } from \"react\";\nimport {\n computePosition,\n type FloatingAlign,\n type FloatingPosition,\n type FloatingSide,\n} from \"../utils/position\";\n\nexport interface AnchoredPosition extends FloatingPosition {\n /** Custom properties for the floating element (`--block-float-*`). */\n style: CSSProperties;\n}\n\n/**\n * Keeps a `position: fixed` floating element (rendered in a portal) next to\n * its anchor while open, following scroll and resize. Returns `null` until\n * the first measurement.\n */\nexport function useAnchoredPosition(\n /** The anchor element, or a virtual one (e.g. the pointer position) with `getBoundingClientRect`. */\n anchorRef: RefObject<Pick<Element, \"getBoundingClientRect\"> | null>,\n floatingRef: RefObject<HTMLElement | null>,\n open: boolean,\n { side, align = \"center\", gap = 8 }: { side: FloatingSide; align?: FloatingAlign; gap?: number },\n): AnchoredPosition | null {\n const [position, setPosition] = useState<AnchoredPosition | null>(null);\n\n useLayoutEffect(() => {\n if (!open) return undefined;\n const update = () => {\n const anchor = anchorRef.current;\n const floating = floatingRef.current;\n if (!anchor || !floating) return;\n const anchorRect = anchor.getBoundingClientRect();\n const next = computePosition({\n anchor: anchorRect,\n floating: { width: floating.offsetWidth, height: floating.offsetHeight },\n viewport: { width: window.innerWidth, height: window.innerHeight },\n side,\n align,\n gap,\n });\n setPosition((previous) =>\n previous &&\n previous.x === next.x &&\n previous.y === next.y &&\n previous.side === next.side &&\n previous.arrow === next.arrow\n ? previous\n : {\n ...next,\n style: {\n \"--block-float-x\": `${next.x}px`,\n \"--block-float-y\": `${next.y}px`,\n \"--block-float-arrow\": `${next.arrow}px`,\n \"--block-float-anchor-width\": `${anchorRect.width}px`,\n } as CSSProperties,\n },\n );\n };\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [open, side, align, gap, anchorRef, floatingRef]);\n\n return open ? position : null;\n}\n"],"mappings":";;;;;;;;AAkBA,SAAgB,oBAEd,WACA,aACA,MACA,EAAE,MAAM,QAAQ,UAAU,MAAM,KACP;CACzB,MAAM,CAAC,UAAU,eAAe,SAAkC,IAAI;CAEtE,sBAAsB;EACpB,IAAI,CAAC,MAAM,OAAO,KAAA;EAClB,MAAM,eAAe;GACnB,MAAM,SAAS,UAAU;GACzB,MAAM,WAAW,YAAY;GAC7B,IAAI,CAAC,UAAU,CAAC,UAAU;GAC1B,MAAM,aAAa,OAAO,sBAAsB;GAChD,MAAM,OAAO,gBAAgB;IAC3B,QAAQ;IACR,UAAU;KAAE,OAAO,SAAS;KAAa,QAAQ,SAAS;IAAa;IACvE,UAAU;KAAE,OAAO,OAAO;KAAY,QAAQ,OAAO;IAAY;IACjE;IACA;IACA;GACF,CAAC;GACD,aAAa,aACX,YACA,SAAS,MAAM,KAAK,KACpB,SAAS,MAAM,KAAK,KACpB,SAAS,SAAS,KAAK,QACvB,SAAS,UAAU,KAAK,QACpB,WACA;IACE,GAAG;IACH,OAAO;KACL,mBAAmB,GAAG,KAAK,EAAE;KAC7B,mBAAmB,GAAG,KAAK,EAAE;KAC7B,uBAAuB,GAAG,KAAK,MAAM;KACrC,8BAA8B,GAAG,WAAW,MAAM;IACpD;GACF,CACN;EACF;EACA,OAAO;EACP,OAAO,iBAAiB,UAAU,QAAQ,IAAI;EAC9C,OAAO,iBAAiB,UAAU,MAAM;EACxC,aAAa;GACX,OAAO,oBAAoB,UAAU,QAAQ,IAAI;GACjD,OAAO,oBAAoB,UAAU,MAAM;EAC7C;CACF,GAAG;EAAC;EAAM;EAAM;EAAO;EAAK;EAAW;CAAW,CAAC;CAEnD,OAAO,OAAO,WAAW;AAC3B"}
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@ import { BlockButton } from "./components/actions/BlockButton/BlockButton.js";
10
10
  import { blockButtonVariants } from "./components/actions/BlockButton/BlockButton.types.js";
11
11
  import { IconButton } from "./components/actions/IconButton/IconButton.js";
12
12
  import { BlockMenu } from "./components/actions/BlockMenu/BlockMenu.js";
13
+ import { ContextMenu } from "./components/actions/ContextMenu/ContextMenu.js";
13
14
  import { BlockInput } from "./components/forms/BlockInput/BlockInput.js";
14
15
  import { BlockTextarea } from "./components/forms/BlockTextarea/BlockTextarea.js";
15
16
  import { BlockSelect } from "./components/forms/BlockSelect/BlockSelect.js";
@@ -92,6 +93,8 @@ import { SkillTree } from "./components/display/SkillTree/SkillTree.js";
92
93
  import { initials } from "./components/display/Avatar/Avatar.utils.js";
93
94
  import { Avatar } from "./components/display/Avatar/Avatar.js";
94
95
  import { avatarStatuses } from "./components/display/Avatar/Avatar.types.js";
96
+ import { Popover } from "./components/display/Popover/Popover.js";
97
+ import { Kbd } from "./components/display/Kbd/Kbd.js";
95
98
  import { ChatWindow } from "./components/social/ChatWindow/ChatWindow.js";
96
99
  import { chatMessageTypes } from "./components/social/ChatWindow/ChatWindow.types.js";
97
100
  import { suggestCommands } from "./components/social/CommandConsole/CommandConsole.utils.js";
@@ -104,11 +107,14 @@ import { Breadcrumb } from "./components/navigation/Breadcrumb/Breadcrumb.js";
104
107
  import { HotbarNavigation } from "./components/navigation/HotbarNavigation/HotbarNavigation.js";
105
108
  import { getPaginationRange } from "./components/navigation/BlockPagination/BlockPagination.utils.js";
106
109
  import { BlockPagination } from "./components/navigation/BlockPagination/BlockPagination.js";
110
+ import { BlockStepper } from "./components/navigation/BlockStepper/BlockStepper.js";
107
111
  import { BlockStack } from "./components/layout/BlockStack/BlockStack.js";
108
112
  import { stackGaps } from "./components/layout/BlockStack/BlockStack.types.js";
109
113
  import { BlockDivider } from "./components/layout/BlockDivider/BlockDivider.js";
110
114
  import { dividerVariants } from "./components/layout/BlockDivider/BlockDivider.types.js";
111
115
  import { Accordion } from "./components/layout/Accordion/Accordion.js";
116
+ import { BlockGrid } from "./components/layout/BlockGrid/BlockGrid.js";
117
+ import { BlockContainer } from "./components/layout/BlockContainer/BlockContainer.js";
112
118
  import { alertVariants } from "./components/feedback/Alert/BlockAlert.types.js";
113
119
  import { useFocusTrap } from "./hooks/useFocusTrap.js";
114
120
  import { BlockModal } from "./components/feedback/Modal/BlockModal.js";
@@ -119,4 +125,4 @@ import { Drawer } from "./components/feedback/Drawer/Drawer.js";
119
125
  import { EmptyState } from "./components/feedback/EmptyState/EmptyState.js";
120
126
  import { Skeleton } from "./components/feedback/Skeleton/Skeleton.js";
121
127
  import { skeletonVariants } from "./components/feedback/Skeleton/Skeleton.types.js";
122
- export { Accordion, AchievementCard, Anvil, ArmorBar, Avatar, BiomeIndicator, BlockAlert, BlockBadge, BlockButton, BlockCard, BlockCheckbox, BlockDivider, BlockInput, BlockLoading, BlockMenu, BlockModal, BlockPagination, BlockPanel, BlockProgress, BlockRadio, BlockRadioGroup, BlockSelect, BlockSidebar, BlockSlider, BlockStack, BlockTable, BlockTabs, BlockTextarea, BlockToaster, BlockToggle, BlockTooltip, BlockUIProvider, BossBar, Breadcrumb, BrewingStand, ChatWindow, CommandConsole, ConfirmDialog, CoordinatesHUD, CraftingGrid, CraftingResult, CraftingSlot, CraftingTable, DEFAULT_TOAST_DURATION, DayNightIndicator, Drawer, DurabilityBar, EmptyState, EnchantingTable, Furnace, HealthBar, Hotbar, HotbarNavigation, HungerBar, IconButton, Inventory, InventoryGrid, InventorySection, InventorySlot, ItemStack, ItemTooltip, MiniMap, NumberInput, PlayerCard, PlayerHUD, QuestCard, RecipeBook, Scoreboard, ServerBrowser, ServerCard, SidebarItem, Skeleton, SkillTree, TradingUI, WeatherIndicator, WorldBrowser, WorldCard, XPBar, alertVariants, anvilCostState, avatarStatuses, badgeVariants, biomeTypes, blockButtonVariants, bossBarColors, bossBarSegments, brewingStates, browseServers, browseWorlds, cardMaterials, chatMessageTypes, clamp, compassName, consoleEntryKinds, cx, dayPhase, describeItemStack, describeMarker, dividerVariants, durabilityLevel, facings, filterRecipes, formatClock, formatNumber, furnaceStates, getBrewingState, getFurnaceState, getPaginationRange, initials, itemRarities, miniMapMarkerKinds, miniMapTerrain, normalizeRarity, pingQuality, progressVariants, ratio, skeletonVariants, skillState, stackGaps, suggestCommands, toast, tooltipPlacements, useBlockUI, useControllableState, useDigitHotkeys, useFocusTrap, useMediaQuery, usePortalContainer, useToasts, villagerLevels, weatherTypes };
128
+ export { Accordion, AchievementCard, Anvil, ArmorBar, Avatar, BiomeIndicator, BlockAlert, BlockBadge, BlockButton, BlockCard, BlockCheckbox, BlockContainer, BlockDivider, BlockGrid, BlockInput, BlockLoading, BlockMenu, BlockModal, BlockPagination, BlockPanel, BlockProgress, BlockRadio, BlockRadioGroup, BlockSelect, BlockSidebar, BlockSlider, BlockStack, BlockStepper, BlockTable, BlockTabs, BlockTextarea, BlockToaster, BlockToggle, BlockTooltip, BlockUIProvider, BossBar, Breadcrumb, BrewingStand, ChatWindow, CommandConsole, ConfirmDialog, ContextMenu, CoordinatesHUD, CraftingGrid, CraftingResult, CraftingSlot, CraftingTable, DEFAULT_TOAST_DURATION, DayNightIndicator, Drawer, DurabilityBar, EmptyState, EnchantingTable, Furnace, HealthBar, Hotbar, HotbarNavigation, HungerBar, IconButton, Inventory, InventoryGrid, InventorySection, InventorySlot, ItemStack, ItemTooltip, Kbd, MiniMap, NumberInput, PlayerCard, PlayerHUD, Popover, QuestCard, RecipeBook, Scoreboard, ServerBrowser, ServerCard, SidebarItem, Skeleton, SkillTree, TradingUI, WeatherIndicator, WorldBrowser, WorldCard, XPBar, alertVariants, anvilCostState, avatarStatuses, badgeVariants, biomeTypes, blockButtonVariants, bossBarColors, bossBarSegments, brewingStates, browseServers, browseWorlds, cardMaterials, chatMessageTypes, clamp, compassName, consoleEntryKinds, cx, dayPhase, describeItemStack, describeMarker, dividerVariants, durabilityLevel, facings, filterRecipes, formatClock, formatNumber, furnaceStates, getBrewingState, getFurnaceState, getPaginationRange, initials, itemRarities, miniMapMarkerKinds, miniMapTerrain, normalizeRarity, pingQuality, progressVariants, ratio, skeletonVariants, skillState, stackGaps, suggestCommands, toast, tooltipPlacements, useBlockUI, useControllableState, useDigitHotkeys, useFocusTrap, useMediaQuery, usePortalContainer, useToasts, villagerLevels, weatherTypes };